Panels with a T-stiffener modeled as multi-domain assemblies#

A flat or curved panel with one T-stiffener is modeled with 2D domains for the skin, the base and the flange of the stiffener, following Castro and Donadon (2017) [castro2017Multidomain]. A debonding defect of length defect_a is included at the middle of the panel, where the base is not connected to the skin.

The connections are imposed exactly with the default conn_method='null-space', see Exact connections with the null-space method, or with penalty stiffnesses with conn_method='penalty'.

Linear buckling, with constant stress resultants or with the pre-buckling stress state from a static analysis, using tstiff2d_1stiff_compression():

def test_tstiff2d_1stiff_compression():
    print('Testing assembly function: tstiff2d_1stiff_compression')
    b = 1.
    bb = b/5.
    bf = bb/2.
    ys = b/2.
    assy, eigvals, eigvecs = tstiff2d_1stiff_compression(
        b=b,
        bb=bb,
        bf=bf,
        a=3.,
        ys=ys,
        defect_a=0.6,
        rho=1.3e3,
        plyt=0.125e-3,
        laminaprop=(142.5e9, 8.7e9, 0.28, 5.1e9, 5.1e9, 5.1e9),
        stack_skin=[0, 45, -45, 90, -45, 45, 0],
        stack_base=[0, 90, 0]*4,
        stack_flange=[0, 90, 0]*8,
        m=8, n=7,
        mb=7, nb=6,
        mf=8, nf=6,
        run_static_case=False,
        Nxx_skin=-1.,
        Nxx_base=-1.,
        Nxx_flange=-1.,
        num_eigvalues=10, conn_method='penalty'
        )
    assert np.isclose(eigvals[0], 142.68, rtol=0.001)

    assy, c, eigvals, eigvecs = tstiff2d_1stiff_compression(
        b=b,
        bb=bb,
        bf=bf,
        a=3.,
        ys=ys,
        defect_a=0.6,
        rho=1.3e3,
        plyt=0.125e-3,
        laminaprop=(142.5e9, 8.7e9, 0.28, 5.1e9, 5.1e9, 5.1e9),
        stack_skin=[0, 45, -45, 90, -45, 45, 0],
        stack_base=[0, 90, 0]*4,
        stack_flange=[0, 90, 0]*8,
        m=8, n=7,
        mb=7, nb=6,
        mf=8, nf=6,
        run_static_case=True,
        Nxx_skin=-1.,
        Nxx_base=-1.,
        Nxx_flange=-1.,
        num_eigvalues=10, conn_method='penalty'
        )
    assert np.isclose(eigvals[0], 114.86, rtol=0.001)

Frequency analysis, using tstiff2d_1stiff_freq():

def test_tstiff2d_1stiff_freq():
    print('Testing assembly function: tstiff2d_1stiff_freq')
    b = 1.
    bb = b/5.
    bf = bb/2.
    ys = b/2.
    assy, eigvals, eigvecs = tstiff2d_1stiff_freq(
        b=b,
        bb=bb,
        bf=bf,
        a=3.,
        ys=ys,
        defect_a=0.1,
        rho=1.3e3,
        plyt=0.125e-3,
        laminaprop=(142.5e9, 8.7e9, 0.28, 5.1e9, 5.1e9, 5.1e9),
        stack_skin=[0, 45, -45, 90, -45, 45, 0],
        stack_base=[0, 90, 0]*4,
        stack_flange=[0, 90, 0]*8,
        m=6, n=7,
        mb=5, nb=6,
        mf=6, nf=7,
        num_eigvalues=10, conn_method='penalty'
        )
    omegan = (-eigvals[0])**0.5
    #NOTE the reference values of this module were changed in 2025 to match
    #      the skin-base connection 'SB' with a hard-coded penalty
    #      kt = 2e5, which is a N/mm**3 value and about 6e-7 of the
    #      penalty given by calc_kt_kr() in these SI units, so the base was
    #      practically disconnected from the skin. Once the default penalty
    #      was restored, the values of 2024 came back
    assert np.isclose(omegan, 48.2733, atol=0.001, rtol=0.001)

Flutter analysis with the piston theory, using tstiff2d_1stiff_flutter():

def test_tstiff2d_1stiff_flutter():
    print('Testing assembly function: tstiff2d_1stiff_flutter')
    b = 1.
    bb = b/5.
    bf = bb/2.
    ys = b/2.
    assy, eigvals, eigvecs = tstiff2d_1stiff_flutter(
        b=b,
        bb=bb,
        bf=bf,
        a=3.,
        ys=ys,
        defect_a=0.1,
        rho=1.3e3,
        plyt=0.125e-3,
        laminaprop=(142.5e9, 8.7e9, 0.28, 5.1e9, 5.1e9, 5.1e9),
        stack_skin=[0, 45, -45, 90, -45, 45, 0],
        stack_base=[0, 90, 0]*4,
        stack_flange=[0, 90, 0]*8,
        m=6, n=7,
        mb=5, nb=6,
        mf=6, nf=7,
        air_speed=2*343.,
        rho_air=1.2,
        Mach=2,
        speed_sound=343.,
        run_static_case=False,
        num_eigvalues=10, conn_method='penalty'
        )
    omegan = (-eigvals[0])**0.5
    print(eigvals)
    assert np.isclose(omegan, 446.12+0.j, rtol=0.001)