Flutter Check

Flutter Check#

In this section a flutter check is going to be studied. The simulation set-up in Loads Kernel was already shown in detail in a previous notebook. Hence, the focus will be more in the results and post processing. At the end, the Loads Kernel are compared with the MSC Nastran results.

Simulation Set-up#

It is assumed that the notebook concerning the simulation set-up was studied before. The only comments regarding the code script are focus on the differences with the other simulations.

To analyze flutter, horizontal level flight (nZ=1) FL000 at trim conditions was selected. Again the mass configuration M3 was chosen. The same conditions were written two times because two different methods were used to analyse flutter. For every self.trimcase, a corresponding self.simcase is required. A time simulation is triggered if the simcase contains at least ‘dt’ and ‘t_final’. In the DC-3 case, for the flutter check the KE-method and the PK-method were used. In order to perform those two simulations, the ‘flutter’ field was set to True and the method chosen.

class jcl:

    def __init__(self):
        
        self.trimcase = [{'desc': 'CC.M3.OVCFL000.KE-Method', # Descriptive string of the maneuver case
                          # Kind of trim condition, blank for trim about all three axes, for more trim conditions see
                          # trim_conditions.py
                          'maneuver': '',
                          # Subcase ID number, for Nastran in acending order
                          'subcase': 1,
                          # Setting of the operational point
                          # The flight speed is given by the Mach number
                          'Ma': tas2Ma(70.0, 0.0),
                          # Aero key
                          'aero': 'VC',
                          # Atmo key
                          'altitude': 'FL000',
                          # Mass key
                          'mass': 'M3',
                          # Load factor Nz
                          'Nz': 1.0,
                          # Velocities and accelerations given in ISO 9300 coordinate system (right-handed, forward-right-down)
                          # Roll rate in rad/s
                          'p': 0.0 / 180.0 * np.pi,
                          # Pitch rate in rad/s
                          'q': 0.0 / 180.0 * np.pi,
                          # Yaw rate in rad/s
                          'r': 0.0,
                          # Roll acceleration in rad/s^2
                          'pdot': 0.0 ,
                          # Pitch acceleration in rad/s^2
                          'qdot': 0.0,
                          # Yaw acceleration in rad/s^2
                          'rdot': 0.0,
                          },
                         {'desc': 'CC.M3.OVCFL000.PK-Method', # Descriptive string of the maneuver case
                          # Kind of trim condition, blank for trim about all three axes, for more trim conditions see
                          # trim_conditions.py
                          'maneuver': '',
                          # Subcase ID number, for Nastran in acending order
                          'subcase': 2,
                          # Setting of the operational point
                          # The flight speed is given by the Mach number
                          'Ma': tas2Ma(70.0, 0.0),
                          # Aero key
                          'aero': 'VC',
                          # Atmo key
                          'altitude': 'FL000',
                          # Mass key
                          'mass': 'M3',
                          # Load factor Nz
                          'Nz': 1.0,
                          # Velocities and accelerations given in ISO 9300 coordinate system (right-handed, forward-right-down)
                          # Roll rate in rad/s
                          'p': 0.0 / 180.0 * np.pi,
                          # Pitch rate in rad/s
                          'q': 0.0 / 180.0 * np.pi,
                          # Yaw rate in rad/s
                          'r': 0.0,
                          # Roll acceleration in rad/s^2
                          'pdot': 0.0 ,
                          # Pitch acceleration in rad/s^2
                          'qdot': 0.0,
                          # Yaw acceleration in rad/s^2
                          'rdot': 0.0,
                          }]
     
        self.simcase = [{# True or False, enables 1-cosine gust according to CS-25
                         'gust': False,
                         # True or False, enables continuous turbulence excitation
                         'turbulence': False,
                         # True or False, calculates limit turbulence according to CS-25
                         'limit_turbulence': False,
                         # True or False, enables playback of control surface signals via efcs
                         'cs_signal': False,
                         # True or False, enables a generic controller e.g. to maintain p, q and r
                         'controller': False,
                         # True or False, enables a generic landing gear
                         'landinggear': False,
                         # True or False, enables calculation of rigid and elastic derivatives
                         'derivatives': False,
                         # True or False, enables flutter check with k, ke or pk method
                         'flutter': True,
                         # flutter parameters for k and ke method
                         'flutter_para': {'method': 'ke', 'k_red': np.linspace(3.0, 0.001, 100)},
                         },
                        {# True or False, enables 1-cosine gust according to CS-25
                         'gust': False,
                         # True or False, enables continuous turbulence excitation
                         'turbulence': False,
                         # True or False, calculates limit turbulence according to CS-25
                         'limit_turbulence': False,
                         # True or False, enables playback of control surface signals via efcs
                         'cs_signal': False,
                         # True or False, enables a generic controller e.g. to maintain p, q and r
                         'controller': False,
                         # True or False, enables a generic landing gear
                         'landinggear': False,
                         # True or False, enables calculation of rigid and elastic derivatives
                         'derivatives': False,
                         # True or False, enables flutter check with k, ke or pk method
                         'flutter': True,
                         # flutter parameters for pk method
                         'flutter_para': {'method': 'pk', 'Vtas': np.linspace(20.0, 300.0, 20)}, 'tracking': 'MAC*PCC',
                         },
                        ]

In order to obtain the results the following ‘launch.py’ file is run. The results can be found in the folder ‘DC-3_results’.

from loadskernel import program_flow

# Here you launch the Loads Kernel with your job
k = program_flow.Kernel('jcl_dc3_flutter', pre=True, main=True, post=True, test=False,
                        path_input='./DC3_model/JCLs',
                        path_output='./DC3_results')
k.run()
INFO: This is the log for process 0.
INFO: Starting Loads Kernel with job: jcl_dc3_flutter
INFO: User voss_ar on escher (Linux-4.18.0-553.22.1.el8_10.x86_64-x86_64-with-glibc2.28)
INFO: pre:  True
INFO: main: True
INFO: post: True
INFO: test: False
INFO: --> Reading parameters from JCL.
INFO: --> Starting preprocessing.
INFO: Building structural model...
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/structure_only.bdf
INFO: Found include(s):
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/export_FUS.csv
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/left-wing/left-wing.GRID_LREFAX_5400001
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/left-wing/left-wing.RBE2_LREFAX_5400001
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/left-wing/left-wing.CORD2R_LREFAX
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/left-wing/left-wing.MAT_ZR
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/left-wing/export_left-wing.csv
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/right-wing/right-wing.GRID_LREFAX_6400001
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/right-wing/right-wing.RBE2_LREFAX_6400001
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/right-wing/right-wing.CORD2R_LREFAX
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/right-wing/right-wing.MAT_ZR
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/right-wing//export_right-wing.csv
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/left-ht/left-ht.GRID_LREFAX_3330001
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/left-ht/left-ht.RBE2_LREFAX_3330001
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/left-ht/left-ht.CORD2R_LREFAX
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/left-ht/left-ht.MAT_ZR
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/left-ht/export_left-ht.csv
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/right-ht/right-ht.GRID_LREFAX_3340001
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/right-ht/right-ht.RBE2_LREFAX_3340001
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/right-ht/right-ht.CORD2R_LREFAX
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/right-ht/right-ht.MAT_ZR
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/right-ht/export_right-ht.csv
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/vt/vt.GRID_LREFAX_3320001
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/vt/vt.RBE2_LREFAX_3320001
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/vt/vt.CORD2R_LREFAX
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/vt/vt.MAT_ZR
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/vt/export_vt.csv
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/export_left-nacell.csv
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/../fem/export_right-nacell.csv
INFO: The structural model consists of 278 grid points (1668 DoFs) and 7 coordinate systems.
WARNING: No Monitoring Stations are created!
INFO: Building atmo model...
INFO: Building aero model...
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/aero/vt/vt.CAERO1
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/aero/left-ht/left-ht.CAERO1
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/aero/right-ht/right-ht.CAERO1
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/aero/left-wing/left-wing.CAERO1
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/aero/right-wing/right-wing.CAERO1
INFO: Constructing aero panels from CAERO cards
INFO:  - from corner points and aero panels, constructing aerogrid
INFO: Read W2GJ data from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/w2gj_list.DMI_merge
INFO: Splining (rigid body) of 6336 DOFs to 6336 DOFs...
INFO: Splining (rigid body) of 6336 DOFs to 6336 DOFs...
INFO: Splining (rigid body) of 6336 DOFs to 6 DOFs...
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/aero/vt/vt.AESURF
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/aero/left-ht/left-ht.AESURF
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/aero/right-ht/right-ht.AESURF
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/aero/left-wing/left-wing.AESURF
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/aero/right-wing/right-wing.AESURF
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/aero/vt/vt.AELIST
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/aero/left-ht/left-ht.AELIST
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/aero/right-ht/right-ht.AELIST
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/aero/left-wing/left-wing.AELIST
INFO: Read from file: /scratch/LoadsKernel/doc/tutorials/DC3_model/aero/right-wing/right-wing.AELIST
INFO: Splining (rigid body) of 6336 DOFs to 6 DOFs...
INFO: Splining (rigid body) of 6336 DOFs to 6 DOFs...
INFO: Splining (rigid body) of 6336 DOFs to 6 DOFs...
INFO: Splining (rigid body) of 6336 DOFs to 6 DOFs...
INFO: Splining (rigid body) of 6336 DOFs to 6 DOFs...
INFO: Calculating steady AIC matrices (1056 panels, k=0.0) for 1 Mach number(s)...
INFO: done in 0.63 [sec].
INFO: Calculating unsteady AIC matrices (1056 panels, k=[0.001, 0.1, 0.3, 0.6, 1.0, 1.5, 2.0, 3.0] (Nastran Definition!))             for 1 Mach number(s)...
INFO: done in 44.70 [sec].
INFO: The aerodynamic model consists of 1056 panels and 5 control surfaces.
INFO: Coupling aerogrid directly. Doing cleanup/thin out of strcgrid to avoid singularities                     (safety first!)
INFO: The spline model consists of 272 grid points.
INFO: Searching nearest neighbour of 1056 dependent nodes in 272 independent nodes...
INFO: Splining (rigid body) of 6336 DOFs to 1668 DOFs...
INFO: Building stiffness and mass model...
INFO: Reading matrix KGG from /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/SOL103_structure_only.mtx.h5
INFO: Reading matrix GM from /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/SOL103_structure_only.mtx.h5
INFO: Read USET from OP2-file /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/uset.op2 ...
Table  USET    , bytes =       6935 [         0 to       6936]
INFO: Extracting bit positions from USET to determine DoFs
INFO: Prepare stiffness matrices for independent and free DoFs (f-set)
INFO: Mass configuration 1 of 1: M3 
INFO: Reading matrix MGG from /scratch/LoadsKernel/doc/tutorials/DC3_model/fem/SOL103_M3.mtx.h5
INFO: Calculate center of gravity, mass and inertia (GRDPNT)...
INFO: Splining (rigid body) of 1668 DOFs to 6 DOFs...
INFO: Splining (rigid body) of 1668 DOFs to 6 DOFs...
INFO: Mass: 11883.983000000002
INFO: CG at: [8.62280419e+00 5.43474355e-08 3.11704131e-01]
INFO: Inertia: 
[[ 6.93201323e+04 -3.80956656e-04  1.17729353e+04]
 [-3.80956654e-04  1.40925492e+05 -1.74794555e-04]
 [ 1.17729353e+04 -1.74794555e-04  1.97104534e+05]]
INFO: Prepare mass matrices for independent and free DoFs (f-set)
INFO: Modal analysis for first 27 modes...
INFO: Found 27 modes with the following frequencies [Hz]:
INFO: [           nan            nan            nan 3.00707577e-06
 8.23055551e-06 2.31672329e-05 3.13716140e+00 4.68251648e+00
 7.20798842e+00 7.88159198e+00 8.33703334e+00 8.49130434e+00
 9.88499185e+00 1.25695152e+01 1.53520000e+01 1.70224904e+01
 1.71353125e+01 1.84415883e+01 2.53323405e+01 2.53529787e+01
 2.68433852e+01 2.81886245e+01 3.20724571e+01 3.24562324e+01
 3.51081211e+01 3.52877859e+01 3.71484020e+01]
INFO: From these 27 modes, the following 21 modes are selected: [ 7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27]
INFO: Working on f-set
INFO: Damping: modal damping of 0.02
INFO: Working on h-set
INFO: Splining (rigid body) of 1668 DOFs to 6 DOFs...
INFO: Damping: modal damping of 0.02
INFO: Splining (rigid body) of 1668 DOFs to 6 DOFs...
INFO: Splining (rigid body) of 6 DOFs to 6 DOFs...
INFO: Splining (rigid body) of 6 DOFs to 6 DOFs...
INFO: Splining (rigid body) of 6 DOFs to 6 DOFs...
INFO: Splining (rigid body) of 6 DOFs to 6 DOFs...
INFO: --> Saving model data.
INFO: --> Done in 0:00:48 [h:mm:ss].
INFO: --> Starting Main in sequential mode for 2 trimcase(s).
INFO: 
INFO: ========================================
INFO: trimcase: CC.M3.OVCFL000.KE-Method
INFO: subcase: 1
INFO: (case 1 of 2)
INFO: ========================================
INFO: Setting trim conditions to "default"
INFO: Init model equations of type "Steady"
INFO: Init EFCS "efcs_dc3"
INFO: Running trim for 27 variables...
INFO: The solution converged.
INFO: Init model equations of type "KEMethod"
INFO: Init EFCS "efcs_dc3"
INFO: building systems
INFO: calculating eigenvalues
INFO: Flutter analysis finished.
INFO: calculating forces & moments on structural set (force summation method)...
INFO: apply euler angles...
INFO: calculating cutting forces & moments...
INFO: gathering information on monitoring stations from response(s)...
INFO: searching min/max in time data at 1 monitoring stations and gathering loads (dyn2stat)...
INFO: --> Saving response(s).
INFO: 
INFO: ========================================
INFO: trimcase: CC.M3.OVCFL000.PK-Method
INFO: subcase: 2
INFO: (case 2 of 2)
INFO: ========================================
INFO: Setting trim conditions to "default"
INFO: Init model equations of type "Steady"
INFO: Init EFCS "efcs_dc3"
INFO: Running trim for 27 variables...
INFO: The solution converged.
INFO: Init model equations of type "PKMethodSchwochow"
INFO: Init EFCS "efcs_dc3"
INFO: building systems
INFO: starting p-k iterations to match k_red with Vtas and omega
INFO: Flutter analysis finished.
INFO: calculating forces & moments on structural set (force summation method)...
INFO: apply euler angles...
INFO: calculating cutting forces & moments...
INFO: gathering information on monitoring stations from response(s)...
INFO: searching min/max in time data at 1 monitoring stations and gathering loads (dyn2stat)...
INFO: --> Saving response(s).
INFO: --> Saving monstation(s).
INFO: --> Saving dyn2stat.
INFO: --> Done in 0:00:16 [h:mm:ss].
INFO: --> Opening response(s).
INFO: --> Loading monstations(s).
INFO: --> Loading dyn2stat.
INFO: --> Drawing some standard plots.
INFO: jcl.loadplots not specified in the JCL - no automatic plotting of load envelopes possible.
INFO: start plotting flutter curves...
INFO: plots saved as ./DC3_results/fluttercurves_jcl_dc3_flutter.pdf
INFO: start plotting eigenvalues and -vectors...
INFO: skip plotting of eigenvalues and -vectors for CC.M3.OVCFL000.KE-Method
INFO: plots saved as ./DC3_results/eigenvalues_jcl_dc3_flutter.pdf
INFO: Loads Kernel finished.
INFO: 
INFO:        (  )
INFO:       (    )
INFO: 
INFO:               (   )
INFO:              (     )
INFO: 
INFO:          _|_
INFO:  ---------O---------
INFO: 
INFO:
_images/e8fdac60a4d680381125d7ff592aee3fa1246f673536c20d4fd028de268305d8.png _images/90f903552d90c699e5d655ed054d14c549f2ac0bf43c2b6310ce1cab5727d935.png

Results#

To conduct the flutter check, both the Loads Kernel or MSC Nastran was used. The flutter calculation was executed at FL000, where Equivalent Airspeed (EAS) is equal to True Airspeed (TAS), and the M3 mass configuration was adopted. The following figure illustrates the results of the flutter check conducted using Loads Kernel and the pk-method. The figure comprises two plots: one displaying the frequency of the modes as a function of velocity, and the other depicting the damping of the modes relative to velocity.

In the damping plot, the evolution of each eigenmode’s damping with velocity is portrayed. Initially, at low velocities, all eigenmodes exhibit negative damping, indicating stability. However, at a velocity of about 205 m/s, eigenmode 7 with a vacuum frequency of 9.88 Hz becomes unstable, marking the flutter speed Vflutter=205 m/s, equivalent to Ma=0.60. This mode represents the symmetrical pure torsion mode, maintaining a constant frequency across velocities. Subsequently, at 255 m/s, eigenmodes 19 with a vacuum frequency around 35 Hz also become unstable. The diagram shows that modes 13 and 19 approach each other at around 200 m/s and are possibly swapped. Both modes corresponds to a high-order symmetrical bending and torsion coupling mode and the frequency drops to 22 Hz at the onset of instability.

DC3

Flutter results Loads Kernel.

Examining the MSC Nastran results, it is evident that the flutter speed and mechanism is very similar. Indeed, Loads Kernel Release 2025.01 contains an update of the flutter solution sequence, leading to numerically similar and remarkably consistent results in comparison to MSC Nastran for a range of test cases.

DC3

Flutter results MSC Nastran.

It’s worth noting that both flutter speeds obtained lie outside the flight envelope (VNE=119.72 m/s), yet they remain within the subsonic regime (Ma<0.6), as intended.

For additional information about the meanuver load results please refer to [2].