Panel flutter with the piston theory#
The supersonic flutter of plates, cylindrical panels and stiffened panels
is analysed with the aerodynamic load of the linear piston theory, a
pressure on \(w\) proportional to the slope of \(w\) along the flow, with the
parameter \(\beta\), plus, for a flow along the axis of a cylinder, a
curvature correction proportional to \(w\), with the parameter \(\gamma\). The
flow is along \(x\) or \(y\), the attribute flow.
Aerodynamic matrices#
The aerodynamic stiffness matrix \(\boldsymbol{K}_A\) and the aerodynamic damping matrix are calculated by:
Shell.calc_kA()andShell.calc_cA(), for one domain;StiffPanelBay.calc_kA()andStiffPanelBay.calc_cA(), the sum over the panels of the skin of a bay, the stiffeners not contributing;in a
MultiDomainassembly, by adding the matrices of the domains exposed to the flow,calc_kA(size=size, row0=p.row_start, col0=p.col_start), aststiff2d_1stiff_flutter()does for the skin.
The parameters beta and gamma are given directly, or calculated
from the Mach number Mach, the air density rho_air, the air speed
and the radius, see Shell.calc_kA() and
StiffPanelBay.calc_kA(); the piston theory requires Mach \(\ge
1\). The matrix \(\boldsymbol{K}_A\) is unsymmetric and is never symmetrized.
Flutter analysis#
\(\boldsymbol{K}_A\) is added to the stiffness matrix of a frequency analysis,
solved with structsolve.freq(), which handles unsymmetric matrices,
where \(\boldsymbol{K}_G\) is the geometric stiffness of an optional prestress and
\(\lambda^2 = -\omega^2\). Increasing \(\beta\), two natural frequencies
approach each other and coalesce at the flutter onset, where the
eigenvalues become complex. The sign conventions of \(\boldsymbol{K}_A\) and the
damping are given in Shell.calc_kA() and Shell.calc_cA().
The examples are Panel flutter analysis, for one domain with and without
prestress, and the panel with a T-stiffener of
Panels with a T-stiffener modeled as multi-domain assemblies. The aerodynamic matrix of a
StiffPanelBay is the sum of those of its panels, and does not
change when the skin is divided into panels:
@pytest.mark.parametrize('flow', ['x', 'y'])
def test_calc_kA_matches_single_shell(flow):
r"""Splitting the skin into panels must not change kA
With `w = 0` along the four edges the boundary terms of `\int N_i
N_{k,x} dx` vanish and the matrix is skew-symmetric.
"""
bay = _bay()
bay.flow = flow
bay.beta = 1.3
kA = bay.calc_kA(silent=True)
s = _shell(bay)
s.flow = flow
s.beta = 1.3
s.gamma = 0.
kA_s = s.calc_kA(finalize=False)
assert kA.shape == (bay.get_size(), bay.get_size())
assert abs(kA - kA_s).max() <= 1e-8*abs(kA_s).max()
assert abs(kA + kA.T).max() <= 1e-12*abs(kA).max()