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() and Shell.calc_cA(), for one domain;

  • StiffPanelBay.calc_kA() and StiffPanelBay.calc_cA(), the sum over the panels of the skin of a bay, the stiffeners not contributing;

  • in a MultiDomain assembly, by adding the matrices of the domains exposed to the flow, calc_kA(size=size, row0=p.row_start, col0=p.col_start), as tstiff2d_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,

\[\left(\boldsymbol{K}_C + \boldsymbol{K}_G + \boldsymbol{K}_A + \lambda^2 \boldsymbol{M}\right) \boldsymbol{c} = \boldsymbol{0}\]

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()