In [2]:
import pandas as pd
import numpy as np
import matplotlib as plt
from IPython.display import Image

Agard 445.6

This validation case consideres the transonic flutter analysis of the weakend, Agard 445.6 model 3 as presented in Yates (1987) Agard standard aeroelastic configurations for dynamic response. For validation purposes, the study presents numerical results from the High Speed Aerodynamic solver (HiSA) using a modal structural method and compares it to published numerical results as well as experimental measurements.

Additional literature resources include:

  • Chwalowski (2011) Preliminary computational analysis of the HIRENASD configuration in preparation for the aeroelastic prediction workshop
  • Pahlavanloo (2007) Dynamic Aeroelastic Simulation of the AGARD 445.6 Wing using Edge
  • Lee-Rausch & Batina (1993) Calculation of Agard 445.6 flutter using Navier-Stokes aerodynamics

Material properties

It is assumed the fluid can be treated as an ideal gas and uses the following material properties

In [3]:
mP = pd.read_csv('./input/matProp.csv')
mP
Out[3]:
Gas constant Specific heat ratio
0 287.058 1.4

Initial conditions

The experimental study evaluated the flutter threshold and is summarised in the table below. To numerical determine the onset of flutter the velocity and temperature is fixed for each control point and a pressure sweep is perform. Each simulation conducted during the pressure sweep consists of a steady analysis assuming a rigid or fixed structure to initialisation of the flow field as well as transient simulation that allows for structural deformation. Since a symmetric airfoil is considered and the tests are performed at a zero angle of attack a static aeroelastic analysis is not required.

In [20]:
iCI = pd.read_csv('./input/intialCond.csv')
iCI
Out[20]:
Mach Velocity Dynamic Pressure Density
0 0.499 172.5 6375 0.42770
1 0.678 231.4 5542 0.20818
2 0.901 296.7 4277 0.09945
3 0.954 307.4 2903 0.06338
4 0.957 311.0 2955 0.06338
5 0.960 309.0 2936 0.06338
6 1.072 344.7 3166 0.05514
7 1.141 364.3 5044 0.07833

Grid

For the porpose of the analysis a cut-cell Cartesian mesh is generated using cfMesh. The model uses a symmetric NACA 65A004 profile. The wing is swept 45 degrees at the quater line chord, has a span of 0.762 m and a taper ratio of 0.66. For the purpose of this study inviscid flow is assumed and the boundary layer is therefore not resolved.

In [8]:
from IPython.display import Image, HTML, display
from glob import glob
imagesList=''.join( ["<img style='width: 310px; margin: 10px; float: left; border: 0px solid black;' src='%s' />" % str(s) 
                 for s in sorted(glob('screenShot/mesh/mesh*.png')) ])
display(HTML(imagesList))

The modal data was taken from Yates (1987) which were normalised to a unit modal mass in lbf-in-s$^2$ or 175.1268 kg and the frequencies of the 1, 2 and 3 modes are respectively 9.5992, 38.1650 and 48.3482 Hz.

In [13]:
rV = pd.read_csv('./input/refValues.csv')
rV
Out[13]:
Length Area Centre of rotation
0 0.3048 0.3048 0.07585

The modeshapes are interpolated on to the surface patch of the wing and are shown below.

In [19]:
from IPython.display import Image, HTML, display
from glob import glob
imagesList=''.join( ["<img style='width: 230px; margin: -10px; float: left; border: 0px solid black;' src='%s' />" % str(s) 
                 for s in sorted(glob('screenShot/results/mode*.png')) ])
display(HTML(imagesList))

Running

A number of scripts are provided to set up the case and run the simulation. To generate the mesh navigate to the case directory, agard445, and execute the scripts ./cleanMesh and ./setupMesh. The setupMesh script execute the follow commands

surfaceFeatureEdges Extract the feature edges for cfMesh
cartesianMesh Creates a cut-cell Cartesian mesh using the cfMesh utility
createPatch Renames the boundary patches and sets the patch types

To generate the mode shapes and interpolate them onto the wing surface patch from the experimental data the genModeShape script is provided.

Next, to setup and run the batch of simulations for the Mach number and pressure sweeps the following bash and python scripts are provided.

runs Test matrix with input conditions
~removeDirs Delete the simulation directories listed in the test matrix
setupDir Setup the simulation directories listed in the test matrix
submitRuns Submit and run the simulations on either a local workstation or the network cluster
runSimFixed Located in the simulation directory, this script runs the steady or static simulation to initialise the flow field.
runSimTransient Located in the simulation directory, this script copies the initialised flow field and execute the transient analysis.
plotRes Plots the convergence of the residual
procResults Extract the damping ratios and compute the flutter threshold

Results

For an angle-of-attack of 0$^\circ$ and M=0.96, the pressure contour for the static, Euler analysis is shown below. The figure on the left is taken from Rausch and Batina (1993) and on the right the pressures computed using HiSA is plotted.

In [1]:
from IPython.display import Image, HTML, display
from glob import glob
imagesList=''.join( ["<img style='width: 310px; margin: 10px; float: left; border: 0px solid black;' src='%s' />" % str(s) 
                 for s in sorted(glob('screenShot/results/press*.png')) ])
display(HTML(imagesList))
In [ ]:
 

From the aeroelastic simulations the flutter boundary may be computed and compared to measurements as well as numerical results presented in literature. The flutter boundary or stability limit follows the zero aerodynamic damping line; at higher dynamic pressures the system becomes unstable.

In [5]:
from IPython.display import Image, HTML, display
from glob import glob
imagesList=''.join( ["<img style='width: 550px; margin: 10px; float: left; border: 0px solid black;' src='%s' />" % str(s) 
                 for s in sorted(glob('screenShot/results/flutter.png')) ])
display(HTML(imagesList))
In [65]:
from IPython.core.display import HTML

def css_styling():
    styles = open("./styles/custom.css", "r").read()
    return HTML(styles)
css_styling()
Out[65]: