StepLinearUVLM¶
- class sharpy.solvers.steplinearuvlm.StepLinearUVLM[source]¶
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
sharpy.utils.constants.vortex_radius_defvortex_radius_wake_indfloatDistance between points below which induction is not computed in the wake convection
sharpy.utils.constants.vortex_radius_defcfl1boolIf it is
True, it assumes that the discretisation complies with CFL=1TrueThe 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.0- initialise(data, custom_settings=None)[source]¶
Initialises 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
- pack_input_vector()[source]¶
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
- static pack_state_vector(aero_tstep, aero_tstep_m1, dt, integr_order)[source]¶
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
- run(aero_tstep, structure_tstep, convect_wake=False, dt=None, t=None, unsteady_contribution=False)[source]¶
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 system- Return type
PreSharpy
- If
- unpack_ss_vectors(y_n, x_n, u_n, aero_tstep)[source]¶
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