User-Defined Response Spectrum#

../../../../../_images/response_spectrum_analysis.png

Defining a response spectrum from an explicit period-acceleration table and reading spectral member forces:

  • Create the fixed-column model and seismic mass combinations

  • Define modal analysis and import masses from generated combinations

  • Create a user-defined response spectrum table

  • Assign the spectrum to response spectrum analysis in the X direction

  • Run response spectrum analysis and read member internal forces

Keywords:
spectral analysis response spectrum user-defined period acceleration member internal forces
from math import inf

from dlubal.api import rfem, common

# -------------------------------------------------------
# This example demonstrates response spectrum analysis with an explicitly defined period-acceleration table.
# It defines the same fixed-column model, modal mass import,
# spectral analysis settings, and result retrieval workflow.
# -------------------------------------------------------

def define_structure() -> list:
    """Define a single fixed column (IPE 550)."""

    return [

            # Material
            rfem.structure_core.Material(
                no=1,
                name='S235',
            ),

            # CrossSection
            rfem.structure_core.CrossSection(
                no=1,
                name='IPE 550',
                material=1,
            ),

            # Nodes
            rfem.structure_core.Node(
                no=1,
                coordinate_2=-2,
            ),
            rfem.structure_core.Node(
                no=2,
                coordinate_2=-2,
                coordinate_3=-4,
            ),

            # Line
            rfem.structure_core.Line(
                no=1,
                definition_nodes=[1, 2],
            ),

            # Member
            rfem.structure_core.Member(
                no=1,
                line=1,
                cross_section_start=1,
            ),

            # Support
            rfem.types_for_nodes.NodalSupport(
                no=1,
                user_defined_name_enabled=True,
                name="Fixed",
                nodes=[1],
                spring=common.Vector3d(x=inf, y=inf, z=inf),
                rotational_restraint=common.Vector3d(x=inf, y=inf, z=inf),
            )
    ]

def define_loading() -> list:
    """Define load cases, static analysis settings, and seismic mass combinations."""

    return [
        # Load Case | LC1
        rfem.loading.LoadCase(
            no=1,
            name="Static | Self-weight",
            static_analysis_settings=1,
        ),
        # Nodal Loads | LC1
        rfem.loads.NodalLoad(   # Force
            no=1,
            nodes=[2],
            force_magnitude=1000,
            load_direction=rfem.loads.NodalLoad.LOAD_DIRECTION_GLOBAL_Z_OR_USER_DEFINED_W_TRUE_LENGTH,
            load_case=1,
        ),
        rfem.loads.NodalLoad(   # Mass
            no=2,
            load_type=rfem.loads.NodalLoad.LOAD_TYPE_MASS,
            nodes=[2],
            individual_mass_components=True,
            mass=common.Vector3d(x=100, y=100, z=100),
            mass_moment_of_inertia=common.Vector3d(x=100, y=100, z=100),
            load_case=1,
        ),

        # Static Analysis Settings
        rfem.loading.StaticAnalysisSettings(
            no=1,
            analysis_type=rfem.loading.StaticAnalysisSettings.ANALYSIS_TYPE_GEOMETRICALLY_LINEAR,
            mass_conversion_enabled=True,
        ),
        rfem.loading.StaticAnalysisSettings(
            no=2,
            analysis_type=rfem.loading.StaticAnalysisSettings.ANALYSIS_TYPE_SECOND_ORDER_P_DELTA,
            mass_conversion_enabled=True,
            consider_favorable_effect_due_to_tension_in_members=True,
        ),

        # --- Combinatoric for Seismic Mass ---

        # Combination Wizard
        rfem.loading.CombinationWizard(
            no=1,
            generate_combinations=rfem.loading.CombinationWizard.GENERATE_COMBINATIONS_LOAD_COMBINATIONS,
            consider_imperfection_case=True,
            static_analysis_settings=2,
        ),
        rfem.loading.CombinationWizard(
            no=2,
            generate_combinations=rfem.loading.CombinationWizard.GENERATE_COMBINATIONS_RESULT_COMBINATIONS,
        ),

        # Design Situations
        rfem.loading.DesignSituation(
            no=1,
            name="Seismic/Mass Combination - psi-E,i",
            design_situation_type=rfem.loading.DesignSituation.DesignSituationType.DESIGN_SITUATION_TYPE_SEISMIC_MASS,
            combination_wizard=1,
        ),
        rfem.loading.DesignSituation(
            no=2,
            name="ULS (EQU) - Seismic",
            design_situation_type= rfem.loading.DesignSituation.DesignSituationType.DESIGN_SITUATION_TYPE_EQU_SEISMIC,
            combination_wizard=2,
        ),
    ]

def define_response_spectra() -> list:
    """Define response spectrum input data for this example."""

    return [
        rfem.dynamic_loads.ResponseSpectrum(
                    no=1,
                    definition_type=rfem.dynamic_loads.ResponseSpectrum.DEFINITION_TYPE_USER_DEFINED,
                    user_defined_response_spectrum_step_enabled=False,
                    is_g_factor_mode=False,
                    user_defined_spectrum_sorted=True,
                    user_defined_response_spectrum=rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumTable(
                        rows=[
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.01,
                                frequency=100,
                                acceleration=0.656605903803096,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0105976624867607,
                                frequency=94.3604310147889,
                                acceleration=0.66092327655578,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0112310450183295,
                                frequency=89.0389094129673,
                                acceleration=0.657110266479791,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0119022824477872,
                                frequency=84.0174986929434,
                                acceleration=0.662093343230203,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0126136372203744,
                                frequency=79.279273894506,
                                acceleration=0.654180348237426,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0133675069991971,
                                frequency=74.8082645522508,
                                acceleration=0.646566781122378,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0141664327466902,
                                frequency=70.5894008661874,
                                acceleration=0.64254232634491,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0150131072890817,
                                frequency=66.6084629080916,
                                acceleration=0.641243746214186,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0159103843927215,
                                frequency=62.852032692401,
                                acceleration=0.64131866835365,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0168612883828688,
                                frequency=59.3074489501056,
                                acceleration=0.642517565223951,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0178690243373583,
                                frequency=55.9627644531955,
                                acceleration=0.643746302209134,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0189369888895036,
                                frequency=52.8067057458264,
                                acceleration=0.645043808643179,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0200687816766497,
                                frequency=49.828635146473,
                                acceleration=0.646660248803552,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0212682174729621,
                                frequency=47.0185148929985,
                                acceleration=0.648530464784104,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0225393390473479,
                                frequency=44.3668733097861,
                                acceleration=0.650599970123782,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.023886430789846,
                                frequency=41.8647728828995,
                                acceleration=0.652916429253375,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0253140331524157,
                                frequency=39.5037801356664,
                                acceleration=0.655590514546596,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0268269579527973,
                                frequency=37.2759372031494,
                                acceleration=0.658633823948147,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0284303045930266,
                                frequency=35.1737350096938,
                                acceleration=0.66220375566779,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0301294772472699,
                                frequency=33.1900879591468,
                                acceleration=0.666989922266043,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0319302030769103,
                                frequency=31.3183100524384,
                                acceleration=0.672921635086162,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0338385515342823,
                                frequency=29.5520923520289,
                                acceleration=0.680584724870461,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0358609548201183,
                                frequency=27.8854817172629,
                                acceleration=0.695998462271315,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0380042295636588,
                                frequency=26.3128607389594,
                                acceleration=0.714506985852458,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.040275599798503,
                                frequency=24.8289288056033,
                                acceleration=0.652214213957231,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0426827213116382,
                                frequency=23.4286842373223,
                                acceleration=0.741230236532439,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.045233707447721,
                                frequency=22.1074074274313,
                                acceleration=0.774128385911946,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0479371564555822,
                                frequency=20.8606449347196,
                                acceleration=0.796933150213707,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0508021804691302,
                                frequency=19.6841944728661,
                                acceleration=0.731192632356969,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0538384362203349,
                                frequency=18.5740907463857,
                                acceleration=0.808835035087792,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0570561575878102,
                                frequency=17.5265920853676,
                                acceleration=0.86029436614097,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0604661900907044,
                                frequency=16.5381678339567,
                                acceleration=1.06187461125309,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.06408002744416,
                                frequency=15.6054864500707,
                                acceleration=1.32040560255106,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0679098502995571,
                                frequency=14.7254042762412,
                                acceleration=1.43178915827442,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0719685673001152,
                                frequency=13.8949549437314,
                                acceleration=1.44742556943507,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0762698585902344,
                                frequency=13.1113393742156,
                                acceleration=1.61240930137014,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0808282219252272,
                                frequency=12.3719163453216,
                                acceleration=1.35170601662785,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.085659021536855,
                                frequency=11.6741935882346,
                                acceleration=1.76894100975983,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0907785399193756,
                                frequency=11.015819387359,
                                acceleration=2.13754237755253,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.0962040327106476,
                                frequency=10.3945746537226,
                                acceleration=2.1666357018168,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.101953786853273,
                                frequency=9.80836544540667,
                                acceleration=1.83494560824973,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.108047182231813,
                                frequency=9.25521590979135,
                                acceleration=1.90973916568205,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.114504756993828,
                                frequency=8.73326162382843,
                                acceleration=1.96416753683066,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.121348276774914,
                                frequency=8.24074330989366,
                                acceleration=2.14831431617915,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.128600808061057,
                                frequency=7.77600090603804,
                                acceleration=1.66191346344679,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.136286795935577,
                                frequency=7.33746797065138,
                                acceleration=1.72589720619236,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.144432146472728,
                                frequency=6.92366640267872,
                                acceleration=1.94247321137085,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.153064314055636,
                                frequency=6.53320145959377,
                                acceleration=1.86949002039812,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.162212393912917,
                                frequency=6.16475705633716,
                                acceleration=2.02592136802549,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.171907220185857,
                                frequency=5.81709132937436,
                                acceleration=2.07508545205056,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.182181469856697,
                                frequency=5.48903245092156,
                                acceleration=2.23405370468598,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.193069772888325,
                                frequency=5.17947467923121,
                                acceleration=2.01737630433634,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.204608828946601,
                                frequency=4.88737463162443,
                                acceleration=1.64705527354652,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.216837531098744,
                                frequency=4.61174776770826,
                                acceleration=1.2653307822713,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.229797096904696,
                                frequency=4.35166507092442,
                                acceleration=1.10184936819571,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.243531207343341,
                                frequency=4.1062499172443,
                                acceleration=1.27073977006108,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.258086154041808,
                                frequency=3.87467512045613,
                                acceleration=1.24360196976571,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.273510995304121,
                                frequency=3.6561601440852,
                                acceleration=1.356308253982,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.289857721465107,
                                frequency=3.44996847054972,
                                acceleration=1.35624703318046,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.30718143012687,
                                frequency=3.25540511868503,
                                acceleration=1.11368796962008,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.325540511868503,
                                frequency=3.0718143012687,
                                acceleration=0.877420947925401,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.344996847054972,
                                frequency=2.89857721465107,
                                acceleration=0.841937016251686,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.36561601440852,
                                frequency=2.73510995304121,
                                acceleration=0.904502546941983,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.387467512045613,
                                frequency=2.58086154041807,
                                acceleration=0.895488062460219,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.41062499172443,
                                frequency=2.43531207343341,
                                acceleration=0.833165761214148,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.435166507092442,
                                frequency=2.29797096904696,
                                acceleration=0.580210850033802,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.461174776770826,
                                frequency=2.16837531098743,
                                acceleration=0.716646571965481,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.488737463162442,
                                frequency=2.04608828946601,
                                acceleration=0.699712564071971,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.517947467923121,
                                frequency=1.93069772888325,
                                acceleration=0.822902166663566,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.548903245092156,
                                frequency=1.82181469856697,
                                acceleration=0.857780868152097,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.581709132937436,
                                frequency=1.71907220185857,
                                acceleration=0.640369680805775,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.616475705633716,
                                frequency=1.62212393912917,
                                acceleration=0.651432592172579,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.653320145959377,
                                frequency=1.53064314055636,
                                acceleration=0.659994124025585,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.692366640267873,
                                frequency=1.44432146472728,
                                acceleration=0.656032593206471,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.733746797065138,
                                frequency=1.36286795935577,
                                acceleration=0.570982122073242,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.777600090603804,
                                frequency=1.28600808061057,
                                acceleration=0.504631067503287,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.824074330989366,
                                frequency=1.21348276774914,
                                acceleration=0.466416334080943,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.873326162382843,
                                frequency=1.14504756993828,
                                acceleration=0.534258764775932,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.925521590979135,
                                frequency=1.08047182231813,
                                acceleration=0.487800634801015,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=0.980836544540667,
                                frequency=1.01953786853273,
                                acceleration=0.367169620705585,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=1.03945746537226,
                                frequency=0.962040327106476,
                                acceleration=0.271705635427412,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=1.1015819387359,
                                frequency=0.907785399193756,
                                acceleration=0.228467091171362,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=1.16741935882346,
                                frequency=0.856590215368549,
                                acceleration=0.271331941976728,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=1.23719163453216,
                                frequency=0.808282219252271,
                                acceleration=0.295927446302859,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=1.31113393742156,
                                frequency=0.762698585902344,
                                acceleration=0.275714129792586,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=1.38949549437314,
                                frequency=0.719685673001152,
                                acceleration=0.241661652499416,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=1.47254042762412,
                                frequency=0.679098502995571,
                                acceleration=0.171049262720463,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=1.56054864500707,
                                frequency=0.6408002744416,
                                acceleration=0.114998925752491,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=1.65381678339567,
                                frequency=0.604661900907044,
                                acceleration=0.108529447881312,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=1.75265920853676,
                                frequency=0.570561575878102,
                                acceleration=0.102628798272411,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=1.85740907463857,
                                frequency=0.538384362203349,
                                acceleration=0.0814940784280727,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=1.96841944728661,
                                frequency=0.508021804691302,
                                acceleration=0.0818810305870071,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=2.08606449347196,
                                frequency=0.479371564555821,
                                acceleration=0.0787187300324552,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=2.21074074274313,
                                frequency=0.45233707447721,
                                acceleration=0.0717093128845836,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=2.34286842373223,
                                frequency=0.426827213116382,
                                acceleration=0.0691832280198381,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=2.48289288056033,
                                frequency=0.40275599798503,
                                acceleration=0.0831605923939237,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=2.63128607389594,
                                frequency=0.380042295636588,
                                acceleration=0.0951177469108803,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=2.78854817172629,
                                frequency=0.358609548201183,
                                acceleration=0.0957332385643017,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=2.95520923520289,
                                frequency=0.338385515342823,
                                acceleration=0.101823699767083,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=3.13183100524384,
                                frequency=0.319302030769103,
                                acceleration=0.0946442452035732,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=3.31900879591468,
                                frequency=0.301294772472699,
                                acceleration=0.0774100781312275,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=3.51737350096938,
                                frequency=0.284303045930266,
                                acceleration=0.0691136036678381,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=3.72759372031494,
                                frequency=0.268269579527972,
                                acceleration=0.0572777418280648,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=3.95037801356664,
                                frequency=0.253140331524157,
                                acceleration=0.0480207250683518,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=4.18647728828995,
                                frequency=0.23886430789846,
                                acceleration=0.0373267484803801,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=4.43668733097861,
                                frequency=0.225393390473479,
                                acceleration=0.0300433007674112,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=4.70185148929986,
                                frequency=0.212682174729621,
                                acceleration=0.023533965974664,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=4.98286351464731,
                                frequency=0.200687816766497,
                                acceleration=0.0189182730223804,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=5.28067057458264,
                                frequency=0.189369888895036,
                                acceleration=0.0152673245106631,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=5.59627644531955,
                                frequency=0.178690243373583,
                                acceleration=0.0125105502041483,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=5.93074489501056,
                                frequency=0.168612883828688,
                                acceleration=0.0107566280278884,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=6.2852032692401,
                                frequency=0.159103843927215,
                                acceleration=0.0093102308523988,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=6.66084629080916,
                                frequency=0.150131072890817,
                                acceleration=0.0081373844109471,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=7.05894008661875,
                                frequency=0.141664327466902,
                                acceleration=0.00718304587208839,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=7.48082645522509,
                                frequency=0.133675069991971,
                                acceleration=0.00639887569752263,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=7.9279273894506,
                                frequency=0.126136372203744,
                                acceleration=0.00574268404269218,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=8.40174986929434,
                                frequency=0.119022824477871,
                                acceleration=0.00518125654985289,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=8.90389094129674,
                                frequency=0.112310450183295,
                                acceleration=0.00469036392409435,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=9.43604310147889,
                                frequency=0.105976624867607,
                                acceleration=0.004253376139653,
                            ),
                            rfem.dynamic_loads.ResponseSpectrum.UserDefinedResponseSpectrumRow(
                                period=10,
                                frequency=0.1,
                                acceleration=0.00385942201020568,
                            ),
                        ]
                    ),
                ),
    ]

def define_modal_analysis_settings() -> list:
    """Modal analysis settings and the corresponding modal load case."""

    return [
        # Modal Analysis Settings
        rfem.loading.ModalAnalysisSettings(
            no=1,
            name='User-defined | Modes=10',
            user_defined_name_enabled=True,
            acting_masses_about_axis_x_enabled=True,
            acting_masses_about_axis_y_enabled=True,
            acting_masses_about_axis_z_enabled=True,
            acting_masses_in_direction_z_enabled=True,
            activate_minimum_initial_prestress=False,
            solution_method=rfem.loading.ModalAnalysisSettings.SOLUTION_METHOD_LANCZOS,
            number_of_modes=10,
            minimum_initial_strain=0.00001,
        ),
        # Modal Load Cases
        rfem.loading.LoadCase(
            no=2,
            analysis_type=rfem.loading.LoadCase.ANALYSIS_TYPE_MODAL_ANALYSIS,
            name="Modal Analysis ALL 10",
            modal_analysis_settings=1,
        ),
    ]

def define_spectral_analysis_settings() -> list:
    """Spectral analysis settings (SRSS + Scaled Sum 30%) and the RSA load case."""

    return [

        # Spectral Analysis Settings
        rfem.loading.SpectralAnalysisSettings(
            no=1,
            user_defined_name_enabled=True,
            name='SRSS | Scaled Sum 30.00 %',
            assigned_to='LC 3',
            combination_rule_for_periodic_responses=rfem.loading.SpectralAnalysisSettings.COMBINATION_RULE_FOR_DIRECTIONAL_COMPONENTS_SRSS,
            use_equivalent_linear_combination=False,
            combination_rule_for_directional_components=rfem.loading.SpectralAnalysisSettings.COMBINATION_RULE_FOR_DIRECTIONAL_COMPONENTS_SCALED_SUM,
            combination_rule_for_directional_components_value=0.3,
        ),
        # Spectral Load Cases
        rfem.loading.LoadCase(
            no=3,
            analysis_type=rfem.loading.LoadCase.ANALYSIS_TYPE_RESPONSE_SPECTRUM_ANALYSIS,
            name="RSA Direction X",
            spectral_analysis_settings=1,
            response_spectrum_is_enabled_in_direction_x=True,
            response_spectrum_in_direction_x=1,
            response_spectrum_and_equivalent_load_consider_accidental_torsion=True,
            response_spectrum_and_equivalent_load_eccentricity_for_y_direction_relative=0.01,
            import_modal_analysis_from=2,
            response_spectrum_save_results_of_all_selected_modes=True,
        ),
    ]

# -------------------------------------------------------
# MAIN SCRIPT
# -------------------------------------------------------

with rfem.Application() as rfem_app:

    rfem_app.close_all_models(save_changes=False)
    rfem_app.create_model(name='User-Defined Response Spectrum')

    # Set global model settings:
    base_data: rfem.BaseData = rfem_app.get_base_data()

    # Activate add-ons
    base_data.addons.modal_analysis_active = True
    base_data.addons.response_spectrum_analysis_active = True
    base_data.combinations_settings.combination_wizard_active = True
    base_data.combinations_settings.result_combinations_active = True
    base_data.combinations_settings.result_combinations_parentheses_active = True
    base_data.combinations_settings.result_combinations_consider_sub_results = True
    # Set standard
    base_data.standards.combination_wizard_standard = rfem.BaseData.Standards.COMBINATION_WIZARD_NATIONAL_ANNEX_AND_EDITION_EN_1990_DIN_2012_08_STANDARD
    base_data.standards.load_wizard_standard = rfem.BaseData.Standards.LOAD_WIZARD_NATIONAL_ANNEX_AND_EDITION_EN_1991_DIN_2019_04_STANDARD
    base_data.standards.dynamic_analysis_standard = rfem.BaseData.Standards.DYNAMIC_ANALYSIS_NATIONAL_ANNEX_AND_EDITION_EN_1998_1_DIN_2023_11_STANDARD
    # Adjust general settings
    base_data.general_settings.gravitational_acceleration = 9.81

    rfem_app.set_base_data(base_data=base_data)
    rfem_app.delete_all_objects()

    # Build model structure and loading
    rfem_app.create_object_list(
        define_structure() +
        define_loading()
    )

    # Define analysis settings
    rfem_app.create_object_list(
        define_modal_analysis_settings() +
        define_spectral_analysis_settings()
    )

    # Import masses from combinations to modal load cases
    rfem_app.generate_combinations()
    lc_list = rfem_app.get_object_list(
        objs=[rfem.loading.LoadCase()]
    )
    for lc in lc_list:
        if lc.analysis_type is rfem.loading.LoadCase.ANALYSIS_TYPE_MODAL_ANALYSIS:
            lc.import_masses_from.no = 1
            lc.import_masses_from.object_type = rfem.ObjectType.OBJECT_TYPE_LOAD_COMBINATION
    rfem_app.update_object_list(lc_list)

    # Create response spectrum data
    rfem_app.create_object_list(
        objs=define_response_spectra()
    )

    # Retrieve results
    rfem_app.calculate_all(skip_warnings=True)

    results = rfem_app.get_results(
        results_type=rfem.results.ResultsType.SPECTRAL_ANALYSIS_MEMBERS_INTERNAL_FORCES
    )
    print(f"\nSpectral Analysis | Members Internal Forces:\n{results.data}")