StepLinearUVLM¶
Time domain aerodynamic solver that uses a linear UVLM formulation to be used with the
solvers.DynamicCoupledsolver.To use this solver, the
solver_id = StepLinearUVLMmust be given as the name for theaero_solveris the case of an aeroelastic solver, where the setting below would be parsed throughaero_solver_settings.Notes
The
integr_ordervariable refers to the finite differencing scheme used to calculate the bound circulation derivative with respect to time \(\dot{\mathbf{\Gamma}}\). A first order scheme is used whenintegr_order == 1\[\dot{\mathbf{\Gamma}}^{n+1} = \frac{\mathbf{\Gamma}^{n+1}-\mathbf{\Gamma}^n}{\Delta t}\]If
integr_order == 2a higher order scheme is used (but it isn’t exactly second order accurate [1]).\[\dot{\mathbf{\Gamma}}^{n+1} = \frac{3\mathbf{\Gamma}^{n+1}-4\mathbf{\Gamma}^n + \mathbf{\Gamma}^{n-1}} {2\Delta t}\]If
track_bodyisTrue, the UVLM is projected onto a frameUthat is:- Coincident with
Gat the linearisation timestep. - Thence, rotates by the same quantity as the FoR
A.
It is similar to a stability axes and is recommended any time rigid body dynamics are included.
See also
sharpy.sharpy.linear.assembler.linearuvlm.LinearUVLMReferences
[1] Maraniello, S., & Palacios, R.. State-Space Realizations and Internal Balancing in Potential-Flow Aerodynamics with Arbitrary Kinematics. AIAA Journal, 57(6), 1–14. 2019. https://doi.org/10.2514/1.J058153
The settings that this solver accepts are given by a dictionary, with the following key-value pairs:
Name Type Description Default dtfloatTime step 0.1integr_orderintIntegration order of the circulation derivative. Either 1or2.2ScalingDictdictDictionary of scaling factors to achieve normalised UVLM realisation. {}remove_predictorboolRemove the predictor term from the UVLM equations Trueuse_sparseboolAssemble UVLM plant matrix in sparse format TruedensityfloatAir density 1.225track_bodyboolUVLM inputs and outputs projected to coincide with lattice at linearisation Truetrack_body_numberintFrame of reference number to follow. If -1trackAframe.-1velocity_field_generatorstrName of the velocity field generator to be used in the simulation SteadyVelocityFieldvelocity_field_inputdictDictionary of settings for the velocity field generator {}vortex_radiusfloatDistance between points below which induction is not computed <sphinx.ext.autodoc.importer._MockObject object at 0x7f8a285df828>The settings that
ScalingDictaccepts are the following:Name Type Description Default lengthfloatReference length to be used for UVLM scaling 1.0speedfloatReference speed to be used for UVLM scaling 1.0densityfloatReference density to be used for UVLM scaling 1.0Initialises the Linear UVLM aerodynamic solver and the chosen velocity generator.
Settings are parsed into the standard SHARPy settings format for solvers. It then checks whether there is any previous information about the linearised system (in order for a solution to be restarted without overwriting the linearisation).
If a linearised system does not exist, a linear UVLM system is created linearising about the current time step.
The reference values for the input and output are transformed into column vectors \(\mathbf{u}\) and \(\mathbf{y}\), respectively.
The information pertaining to the linear system is stored in a dictionary
self.data.aero.linearwithin the maindatavariable.Parameters: - data (PreSharpy) – class containing the problem information
- custom_settings (dict) – custom settings dictionary
Transform a SHARPy AeroTimestep instance into a column vector containing the input to the linear UVLM system.
\[[\zeta,\, \dot{\zeta}, u_{ext}] \longrightarrow \mathbf{u}\]If the
track_bodyoption is on, the function projects all the input into a frame that:- is equal to the FoR G at time 0 (linearisation point)
- rotates as the body frame specified in the
track_body_number
Returns: Input vector Return type: np.ndarray
Transform SHARPy Aerotimestep format into column vector containing the state information.
The state vector is of a different form depending on the order of integration chosen. If a second order scheme is chosen, the state includes the bound circulation at the previous timestep, hence the timestep information for the previous timestep shall be parsed.
The transformation is of the form:
If
integr_order==1:\[\mathbf{x}_n = [\mathbf{\Gamma}^T_n,\, \mathbf{\Gamma_w}_n^T,\, \Delta t \,\mathbf{\dot{\Gamma}}_n^T]^T\]Else, if
integr_order==2:\[\mathbf{x}_n = [\mathbf{\Gamma}_n^T,\, \mathbf{\Gamma_w}_n^T,\, \Delta t \,\mathbf{\dot{\Gamma}}_n^T,\, \mathbf{\Gamma}_{n-1}^T]^T\]
For the second order integration scheme, if the previous timestep information is not parsed, a first order stencil is employed to estimate the bound circulation at the previous timestep:
\[\mathbf{\Gamma}^{n-1} = \mathbf{\Gamma}^n - \Delta t \mathbf{\dot{\Gamma}}^n\]Parameters: - aero_tstep (AeroTimeStepInfo) – Aerodynamic timestep information at the current timestep
n. - aero_tstep_m1 (AeroTimeStepInfo) –
Returns: State vector
Return type: np.ndarray
Solve the linear aerodynamic UVLM model at the current time step
n. The step increment is solved as:\[\begin{split}\mathbf{x}^n &= \mathbf{A\,x}^{n-1} + \mathbf{B\,u}^n \\ \mathbf{y}^n &= \mathbf{C\,x}^n + \mathbf{D\,u}^n\end{split}\]A change of state is possible in order to solve the system without the predictor term. In which case the system is solved by:
\[\begin{split}\mathbf{h}^n &= \mathbf{A\,h}^{n-1} + \mathbf{B\,u}^{n-1} \\ \mathbf{y}^n &= \mathbf{C\,h}^n + \mathbf{D\,u}^n\end{split}\]Variations are taken with respect to initial reference state. The state and input vectors for the linear UVLM system are of the form:
- If
integr_order==1: - \[\mathbf{x}_n = [\delta\mathbf{\Gamma}^T_n,\, \delta\mathbf{\Gamma_w}_n^T,\, \Delta t \,\delta\mathbf{\dot{\Gamma}}_n^T]^T\]
- Else, if
integr_order==2: - \[\mathbf{x}_n = [\delta\mathbf{\Gamma}_n^T,\, \delta\mathbf{\Gamma_w}_n^T,\, \Delta t \,\delta\mathbf{\dot{\Gamma}}_n^T,\, \delta\mathbf{\Gamma}_{n-1}^T]^T\]
- And the input vector:
- \[\mathbf{u}_n = [\delta\mathbf{\zeta}_n^T,\, \delta\dot{\mathbf{\zeta}}_n^T,\,\delta\mathbf{u_{ext}}^T_n]^T\]
where the subscript
nrefers to the time step.The linear UVLM system is then solved as detailed in
sharpy.linear.src.linuvlm.Dynamic.solve_step(). The output is a column vector containing the aerodynamic forces at the panel vertices.To Do: option for impulsive start?
Parameters: - aero_tstep (AeroTimeStepInfo) – object containing the aerodynamic data at the current time step
- structure_tstep (StructTimeStepInfo) – object containing the structural data at the current time step
- convect_wake (bool) – for backward compatibility only. The linear UVLM assumes a frozen wake geometry
- dt (float) – time increment
- t (float) – current time
- unsteady_contribution (bool) – (backward compatibily). Unsteady aerodynamic effects are always included
Returns: updated
self.dataclass with the new forces and circulation terms of the systemReturn type: PreSharpy
- If
Transform column vectors used in the state space formulation into SHARPy format
The column vectors are transformed into lists with one entry per aerodynamic surface. Each entry contains a matrix with the quantities at each grid vertex.
\[\mathbf{y}_n \longrightarrow \mathbf{f}_{aero}\]\[\mathbf{x}_n \longrightarrow \mathbf{\Gamma}_n,\, \mathbf{\Gamma_w}_n,\, \mathbf{\dot{\Gamma}}_n\]If the
track_bodyoption is on, the output forces are projected from the linearization frame, to the G frame. Note that the linearisation frame is:- equal to the FoR G at time 0 (linearisation point)
- rotates as the body frame specified in the
track_body_number
Parameters: - y_n (np.ndarray) – Column output vector of linear UVLM system
- x_n (np.ndarray) – Column state vector of linear UVLM system
- u_n (np.ndarray) – Column input vector of linear UVLM system
- aero_tstep (AeroTimeStepInfo) – aerodynamic timestep information class instance
Returns: Tuple containing:
- forces (list):
Aerodynamic forces in a list with
n_surfentries. Each entry is a(6, M+1, N+1)matrix, where the first 3 indices correspond to the components inx,yandz. The latter 3 are zero.- gamma (list):
Bound circulation list with
n_surfentries. Circulation is stored in an(M+1, N+1)matrix, corresponding to the panel vertices.- gamma_dot (list):
Bound circulation derivative list with
n_surfentries. Circulation derivative is stored in an(M+1, N+1)matrix, corresponding to the panel vertices.- gamma_star (list):
Wake (free) circulation list with
n_surfentries. Wake circulation is stored in an(M_star+1, N+1)matrix, corresponding to the panel vertices of the wake.
Return type: tuple
- Coincident with