Example 9: Soil-structure interaction analysis of an undamped rigid structure on undamped linear soil

commentnote:Units of this example

Tons, Kilo Newtons, meters, and seconds.

Model description

This example demonstrates a fully-coupled soil-structure interaction (SSI) analysis of an undamped simplified beam element structure that is representative of a nuclear power plant. The soil domain is uniform throughout with plan dimensions 75 X 75 and a depth of 29.47 . The soil behavior is assumed to be linear with a shear modulus 46282.5 , density 1.7 , and Poisson's ratio 0.3. The foundation is assumed to be rigid with plan dimensions 13.8 X 13.8 and a thickness of 1.4 . The foundation is embedded in the soil domain such that its top surface is flush with the top of the soil. The rigid structure is 10 tall with a lumped mass of 166 at the top. Rigidity of the foundation and the structure is simulated by using a large value for the stiffness and the moment of inertia (if applicable). Both the foundation and the structure have a density 2.7 . More details can be found in Bolisetti et al. (2018).

Input ground motion

The bottom surface of the soil domain is subjected to an Ormsby wavelet as an acceleration input. An Ormsby wavelet is defined by four parameters: low cutoff frequency , low frequency , high frequency , and high cutoff frequency . The Ormsby wavelet has a constant Fourier amplitude between -, and it tapers to zero amplitudes at and . In the time domain, the Wavelet inherently has an amplitude of unity, but it can be scaled to any desired value. In this example, and are 0, 0.2, 20, and 25 , respectively. The Wavelet has an amplitude of 0.5 in the time domain and is centered at 1 . Figure 1 presents the acceleration time history of the Ormsby wavelet used. More information on this Wavelet is provided in Appendix B of Bolisetti (2014).

Figure 1: Ormsby wavelet input ground motion used for the analysis.

Finite element mesh generation

The three-dimensional finite element mesh is generated using Cubit 15.5b. The procedure for generating the mesh is briefly described as follows:

  • The soil domain is first generated using the Create volumes option.

  • The foundation is also created using the same option and it is positioned such that its top surface is flush with the soil surface. This can be achieved using the move command.

  • A groove is made in the soil domain to accommodate the foundation using the Webcut > Tool option. Then, the common surfaces between the soil and the foundation are merged using the merge all command. Now, the foundation and the soil are in continuum.

  • The vertical structure is connected to the foundation through rigid horizontal beams so that rotations of this vertical structure are now constrained by the rigidity of the horizontal beams.

  • The vertical structure is represented by longitudinally connected beams whose total length is equal to required length of the structure.

The soil domain is meshed using 2m cubic elements which capture frequencies less than about 50 Hz. While this results in a somewhat coarser mesh, the computational burden will still be manageable. The foundation and soil share a continuous mesh and the foundation-soil interface is therefore tied, and does not allow any sliding or separation. Rigid foundation meshing should be less of a concern in relation to the flexible soil meshing. While each horizontal connector beam is meshed into a single element, the vertical beam is meshed into five elements. In total, the model has 21,685 elements with 24,358 nodes. This model is presented in Figure 2.

Figure 2: Cubit model for SSI analysis.

Modeling in MASTODON

This example consists of three individual analysis efforts for: (i) fixed-base structure without soil domain; (ii) site response analysis in the absence of the structure; (iii) soil structure interaction

Fixed-base structure analysis

The input file for simulating the individual structural response is presented below. The vertical beam representing the structure has a mass lumped at the top, in addition to having a density along its length. The horizontal beams connected to the rigid foundation are massless and they simulate a rigid connection with the foundation. The rigidity of both the vertical and the horizontal beams is achieved by setting properties such as area, moment of inertia, and Young's modulus to very large values. The rigidity of the foundation is achieved by setting its Young's modulus to a large value. The Ormsby wavelet is applied at the bottom of the rigid foundation and the response at the top of the structure is recorded. Figure 3 presents the 1%-damped acceleration response spectra at the top of the structure. It is observed that, since the structure is rigid, its response spectra exactly matches with that of the input Ormsby wavelet.

[Mesh<<<{"href": "../syntax/Mesh/index.html"}>>>]
  type = FileMesh
  file = STR_2D_3.e
[]

[Variables<<<{"href": "../syntax/Variables/index.html"}>>>]
  [./disp_x]
  [../]
  [./disp_y]
  [../]
  [./disp_z]
  [../]
  [./rot_x]
    block = '2 3'
  [../]
  [./rot_y]
    block = '2 3'
  [../]
  [./rot_z]
    block = '2 3'
  [../]
[]

[AuxVariables<<<{"href": "../syntax/AuxVariables/index.html"}>>>]
  [./vel_x]
  [../]
  [./vel_y]
  [../]
  [./vel_z]
  [../]
  [./accel_x]
  [../]
  [./accel_y]
  [../]
  [./accel_z]
  [../]
  [./rot_vel_x]
    block = '2 3'
  [../]
  [./rot_vel_y]
    block = '2 3'
  [../]
  [./rot_vel_z]
    block = '2 3'
  [../]
  [./rot_accel_x]
    block = '2 3'
  [../]
  [./rot_accel_y]
    block = '2 3'
  [../]
  [./rot_accel_z]
    block = '2 3'
  [../]
[]

[Physics<<<{"href": "../syntax/Physics/index.html"}>>>/SolidMechanics<<<{"href": "../syntax/Physics/SolidMechanics/index.html"}>>>/LineElement<<<{"href": "../syntax/Physics/SolidMechanics/LineElement/index.html"}>>>/QuasiStatic<<<{"href": "../syntax/Physics/SolidMechanics/LineElement/QuasiStatic/index.html"}>>>]
    displacements<<<{"description": "The nonlinear displacement variables for the problem"}>>> = 'disp_x disp_y disp_z'
    rotations<<<{"description": "The rotations appropriate for the simulation geometry and coordinate system"}>>> = 'rot_x rot_y rot_z'

    # dynamic simulation using consistent mass/inertia matrix
    dynamic_nodal_translational_inertia<<<{"description": "If set to true, nodal mass matrix is used for the inertial force calculation."}>>> = true

    velocities<<<{"description": "Translational velocity variables"}>>> = 'vel_x vel_y vel_z'
    accelerations<<<{"description": "Translational acceleration variables"}>>> = 'accel_x accel_y accel_z'
    rotational_velocities<<<{"description": "Rotational velocity variables"}>>> = 'rot_vel_x rot_vel_y rot_vel_z'
    rotational_accelerations<<<{"description": "Rotational acceleration variables"}>>> = 'rot_accel_x rot_accel_y rot_accel_z'

    beta<<<{"description": "beta parameter for Newmark Time integration"}>>> = 0.25 # Newmark time integration parameter
    gamma<<<{"description": "gamma parameter for Newmark Time integration"}>>> = 0.5 # Newmark time integration parameter

    [./block_2]
      block<<<{"description": "The list of ids of the blocks (subdomain) that the stress divergence, inertia kernels and materials will be applied to"}>>> = 2
      area<<<{"description": "Cross-section area of the beam. Can be supplied as either a number or a variable name."}>>> = 130.06
      Iy<<<{"description": "Second moment of area of the beam about y axis. Can be supplied as either a number or a variable name."}>>> = 24166.729
      Iz<<<{"description": "Second moment of area of the beam about z axis. Can be supplied as either a number or a variable name."}>>> = 24166.729
      y_orientation<<<{"description": "Orientation of the y direction along which Iyy is provided. This should be perpendicular to the axis of the beam."}>>> = '0.0 1.0 0.0'

      nodal_mass<<<{"description": "Mass associated with the node"}>>> = 0.1
      boundary<<<{"description": "The list of boundary IDs from the mesh where the nodal mass/inertia will be applied."}>>> = 1
    [../]
  [./block_3]
    block<<<{"description": "The list of ids of the blocks (subdomain) that the stress divergence, inertia kernels and materials will be applied to"}>>> = 3

    nodal_mass<<<{"description": "Mass associated with the node"}>>> = 166.0
    area<<<{"description": "Cross-section area of the beam. Can be supplied as either a number or a variable name."}>>> = 500
    Iy<<<{"description": "Second moment of area of the beam about y axis. Can be supplied as either a number or a variable name."}>>> = 1e3
    Iz<<<{"description": "Second moment of area of the beam about z axis. Can be supplied as either a number or a variable name."}>>> = 1e3
    y_orientation<<<{"description": "Orientation of the y direction along which Iyy is provided. This should be perpendicular to the axis of the beam."}>>> = '1.0 0.0 0.0'
    density<<<{"description": "Name of Material Property or a constant real number defining the density of the beam."}>>> = 2.7

    boundary<<<{"description": "The list of boundary IDs from the mesh where the nodal mass/inertia will be applied."}>>> = 1000
  [../]
[]

[Kernels<<<{"href": "../syntax/Kernels/index.html"}>>>]
  [./DynamicTensorMechanics<<<{"href": "../syntax/Kernels/DynamicTensorMechanics/index.html"}>>>]
    displacements<<<{"description": "The nonlinear displacement variables for the problem"}>>> = 'disp_x disp_y'
    block<<<{"description": "The list of ids of the blocks (subdomain) that the stress divergence kernels will be applied to"}>>> = '1'
  [../]
  [./inertia_x1]
    type = InertialForce<<<{"description": "Calculates the residual for the inertial force ($M \\cdot acceleration$) and the contribution of mass dependent Rayleigh damping and HHT time  integration scheme ($\\eta \\cdot M \\cdot ((1+\\alpha)velq2-\\alpha \\cdot vel-old) $)", "href": "../source/kernels/InertialForce.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    velocity<<<{"description": "velocity variable"}>>> = vel_x
    acceleration<<<{"description": "acceleration variable"}>>> = accel_x
    beta<<<{"description": "beta parameter for Newmark Time integration"}>>> = 0.25
    gamma<<<{"description": "gamma parameter for Newmark Time integration"}>>> = 0.5
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
  [../]
  [./inertia_y1]
    type = InertialForce<<<{"description": "Calculates the residual for the inertial force ($M \\cdot acceleration$) and the contribution of mass dependent Rayleigh damping and HHT time  integration scheme ($\\eta \\cdot M \\cdot ((1+\\alpha)velq2-\\alpha \\cdot vel-old) $)", "href": "../source/kernels/InertialForce.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
    velocity<<<{"description": "velocity variable"}>>> = vel_y
    acceleration<<<{"description": "acceleration variable"}>>> = accel_y
    beta<<<{"description": "beta parameter for Newmark Time integration"}>>> = 0.25
    gamma<<<{"description": "gamma parameter for Newmark Time integration"}>>> = 0.5
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
  [../]
  [./inertia_z1]
    type = InertialForce<<<{"description": "Calculates the residual for the inertial force ($M \\cdot acceleration$) and the contribution of mass dependent Rayleigh damping and HHT time  integration scheme ($\\eta \\cdot M \\cdot ((1+\\alpha)velq2-\\alpha \\cdot vel-old) $)", "href": "../source/kernels/InertialForce.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_z
    velocity<<<{"description": "velocity variable"}>>> = vel_z
    acceleration<<<{"description": "acceleration variable"}>>> = accel_z
    beta<<<{"description": "beta parameter for Newmark Time integration"}>>> = 0.25
    gamma<<<{"description": "gamma parameter for Newmark Time integration"}>>> = 0.5
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
  [../]
  [./gravity]
    type = Gravity<<<{"description": "Apply gravity. Value is in units of acceleration.", "href": "../source/kernels/Gravity.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
    value<<<{"description": "Value multiplied against the residual, e.g. gravitational acceleration"}>>> = -9.81
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
  [../]
[]

[AuxKernels<<<{"href": "../syntax/AuxKernels/index.html"}>>>]
  [./accel_x]
    type = NewmarkAccelAux<<<{"description": "Computes the current acceleration using the Newmark method.", "href": "../source/auxkernels/NewmarkAccelAux.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = accel_x
    displacement<<<{"description": "displacement variable"}>>> = disp_x
    velocity<<<{"description": "velocity variable"}>>> = vel_x
    beta<<<{"description": "beta parameter for Newmark method"}>>> = 0.25
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
  [../]
  [./vel_x]
    type = NewmarkVelAux<<<{"description": "Calculates the current velocity using Newmark method.", "href": "../source/auxkernels/NewmarkVelAux.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = vel_x
    acceleration<<<{"description": "acceleration variable"}>>> = accel_x
    gamma<<<{"description": "gamma parameter for Newmark method"}>>> = 0.5
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
  [../]
  [./accel_y]
    type = NewmarkAccelAux<<<{"description": "Computes the current acceleration using the Newmark method.", "href": "../source/auxkernels/NewmarkAccelAux.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = accel_y
    displacement<<<{"description": "displacement variable"}>>> = disp_y
    velocity<<<{"description": "velocity variable"}>>> = vel_y
    beta<<<{"description": "beta parameter for Newmark method"}>>> = 0.25
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
  [../]
  [./vel_y]
    type = NewmarkVelAux<<<{"description": "Calculates the current velocity using Newmark method.", "href": "../source/auxkernels/NewmarkVelAux.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = vel_y
    acceleration<<<{"description": "acceleration variable"}>>> = accel_y
    gamma<<<{"description": "gamma parameter for Newmark method"}>>> = 0.5
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
  [../]
  [./accel_z]
    type = NewmarkAccelAux<<<{"description": "Computes the current acceleration using the Newmark method.", "href": "../source/auxkernels/NewmarkAccelAux.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = accel_z
    displacement<<<{"description": "displacement variable"}>>> = disp_z
    velocity<<<{"description": "velocity variable"}>>> = vel_z
    beta<<<{"description": "beta parameter for Newmark method"}>>> = 0.25
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
  [../]
  [./vel_z]
    type = NewmarkVelAux<<<{"description": "Calculates the current velocity using Newmark method.", "href": "../source/auxkernels/NewmarkVelAux.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = vel_z
    acceleration<<<{"description": "acceleration variable"}>>> = accel_z
    gamma<<<{"description": "gamma parameter for Newmark method"}>>> = 0.5
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
  [../]
[]

[Materials<<<{"href": "../syntax/Materials/index.html"}>>>]
  [./elasticity_base]
    type = ComputeIsotropicElasticityTensor<<<{"description": "Compute a constant isotropic elasticity tensor.", "href": "../source/materials/ComputeIsotropicElasticityTensor.html"}>>>
    youngs_modulus<<<{"description": "Young's modulus of the material."}>>> = 1e11
    poissons_ratio<<<{"description": "Poisson's ratio for the material."}>>> = 0
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
  [../]
  [./stress_beam2]
    type = ComputeFiniteStrainElasticStress<<<{"description": "Compute stress using elasticity for finite strains", "href": "../source/materials/ComputeFiniteStrainElasticStress.html"}>>>
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
  [../]
  [./strain_15]
    type = ComputeFiniteStrain<<<{"description": "Compute a strain increment and rotation increment for finite strains.", "href": "../source/materials/ComputeFiniteStrain.html"}>>>
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
    displacements<<<{"description": "The displacements appropriate for the simulation geometry and coordinate system"}>>> = 'disp_x disp_y'
  [../]
  [./density]
    type = GenericConstantMaterial<<<{"description": "Declares material properties based on names and values prescribed by input parameters.", "href": "../source/materials/GenericConstantMaterial.html"}>>>
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
    prop_names<<<{"description": "The names of the properties this material will have"}>>> = density
    prop_values<<<{"description": "The values associated with the named properties"}>>> =  2.7
  [../]
  [./elasticity_beam_rigid]
    type = ComputeElasticityBeam<<<{"description": "Computes the equivalent of the elasticity tensor for the beam element, which are vectors of material translational and flexural stiffness.", "href": "../source/materials/ComputeElasticityBeam.html"}>>>
    youngs_modulus<<<{"description": "Young's modulus of the material. Can be supplied as either a number or a variable name."}>>> = 1e10
    poissons_ratio<<<{"description": "Poisson's ratio of the material. Can be supplied as either a number or a variable name."}>>> = 0.3
    shear_coefficient<<<{"description": "Scale factor for the shear modulus. Can be supplied as either a number or a variable name."}>>> = 0.85
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '2 3'
  [../]
  [./stress_beam]
    type = ComputeBeamResultants<<<{"description": "Compute forces and moments using elasticity", "href": "../source/materials/ComputeBeamResultants.html"}>>>
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '2 3'
  [../]
[]

[BCs<<<{"href": "../syntax/BCs/index.html"}>>>]
  [./disp_x]
    type = PresetAcceleration<<<{"description": "Prescribe acceleration on a given boundary in a given direction", "href": "../source/bcs/PresetAcceleration.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    velocity<<<{"description": "The velocity variable."}>>> = vel_x
    acceleration<<<{"description": "The acceleration variable."}>>> = accel_x
    beta<<<{"description": "beta parameter for Newmark time integration."}>>> = 0.25
    function<<<{"description": "Function describing the velocity."}>>> = accel_bottom
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'NY_ns'
  [../]
  [./disp_y]
    type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../source/bcs/DirichletBC.html"}>>>
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'NY'
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
    value<<<{"description": "Value of the BC"}>>> = 0.0
  [../]
  [./disp_z]
    type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../source/bcs/DirichletBC.html"}>>>
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'NY'
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_z
    value<<<{"description": "Value of the BC"}>>> = 0.0
  [../]
[]

[Functions<<<{"href": "../syntax/Functions/index.html"}>>>]
  [./accel_bottom]
    type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../source/functions/PiecewiseLinear.html"}>>>
    data_file<<<{"description": "File holding CSV data"}>>> = Ormsby_USE1.csv
    format<<<{"description": "Format of csv data file that is in either in columns or rows"}>>> = 'columns'
    scale_factor<<<{"description": "Scale factor to be applied to the output values"}>>> = 1
  [../]
[]

[Preconditioning<<<{"href": "../syntax/Preconditioning/index.html"}>>>]
  [./smp]
    type = SMP<<<{"description": "Single matrix preconditioner (SMP) builds a preconditioner using user defined off-diagonal parts of the Jacobian.", "href": "../source/preconditioners/SingleMatrixPreconditioner.html"}>>>
    full<<<{"description": "Set to true if you want the full set of couplings between variables simply for convenience so you don't have to set every off_diag_row and off_diag_column combination."}>>> = true
  [../]
[]

[Executioner<<<{"href": "../syntax/Executioner/index.html"}>>>]
  type = Transient
  solve_type = 'NEWTON'
  petsc_options = '-snes_ksp_ew'
  petsc_options_iname = '-ksp_gmres_restart -pc_type -pc_hypre_type -pc_hypre_boomeramg_max_iter'
  petsc_options_value = '201                hypre    boomeramg      4'
  start_time = 0.0
  end_time = 4.0
  dt = 0.001
  dtmin = 0.0001
  nl_abs_tol = 1e-3
  nl_rel_tol = 1e-9
  l_tol = 1e-9
  l_max_its = 50
  timestep_tolerance = 1e-8
[]

[VectorPostprocessors<<<{"href": "../syntax/VectorPostprocessors/index.html"}>>>]
  [./accel_hist]
    type = ResponseHistoryBuilder<<<{"description": "Calculates response histories for a given node and variable(s).", "href": "../source/vectorpostprocessors/ResponseHistoryBuilder.html"}>>>
    variables<<<{"description": "Variable name for which the response history is requested."}>>> = 'accel_x'
    nodes<<<{"description": "Node number(s) at which the response history is needed."}>>> = '79 109'
    outputs<<<{"description": "Vector of output names where you would like to restrict the output of variables(s) associated with this object"}>>> = out
  [../]
  [./accel_spec]
    type = ResponseSpectraCalculator<<<{"description": "Calculate the response spectrum at the requested nodes or points.", "href": "../source/vectorpostprocessors/ResponseSpectraCalculator.html"}>>>
    vectorpostprocessor<<<{"description": "Name of the ResponseHistoryBuilder vectorpostprocessor, for which response spectra are calculated."}>>> = accel_hist
    regularize_dt<<<{"description": "dt for response spectra calculation. The acceleration response will be regularized to this dt prior to the response spectrum calculation."}>>> = 0.001
    damping_ratio<<<{"description": "Damping ratio for response spectra calculation."}>>> = 0.01
    start_frequency<<<{"description": "Start frequency for the response spectra calculation."}>>> = 0.1
    end_frequency<<<{"description": "End frequency for the response spectra calculation."}>>> = 1000
    outputs<<<{"description": "Vector of output names where you would like to restrict the output of variables(s) associated with this object"}>>> = out
  [../]
[]

[Outputs<<<{"href": "../syntax/Mastodon/Outputs/index.html"}>>>]
  csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
  exodus<<<{"description": "Output the results using the default settings for Exodus output."}>>> = true
  perf_graph<<<{"description": "Enable printing of the performance graph to the screen (Console)"}>>> = true
  print_linear_residuals<<<{"description": "Enable printing of linear residuals to the screen (Console)"}>>> = true
  [./out]
  execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'FINAL'
  type = CSV<<<{"description": "Output for postprocessors, vector postprocessors, and scalar variables using comma seperated values (CSV).", "href": "../source/outputs/CSV.html"}>>>
  file_base<<<{"description": "The desired solution output name without an extension. If not provided, MOOSE sets it with Outputs/file_base when available. Otherwise, MOOSE uses input file name and this object name for a master input or uses master file_base, the subapp name and this object name for a subapp input to set it."}>>> = Str_Final_NoDamp
  [../]
  [./out2]
    type = Exodus<<<{"description": "Object for output data in the Exodus format", "href": "../source/outputs/Exodus.html"}>>>
    file_base<<<{"description": "The desired solution output name without an extension. If not provided, MOOSE sets it with Outputs/file_base when available. Otherwise, MOOSE uses input file name and this object name for a master input or uses master file_base, the subapp name and this object name for a subapp input to set it."}>>> = Exod_Str_Final_NoDamp
    interval = 10
  [../]
[]
(examples/ex09/Structure_Response.i)

Figure 3: Acceleration response spectra of the fixed base structure subjected to the Ormsby wavelet.

Site response analysis

The input file for simulating the individual soil response is presented below. The uniform soil domain has a shear wave velocity of . Although the soil is uniform throughout, the UniformLayerAuxKernel is used to define the soil layers. This is necessary when using the ComputeIsotropicElasticityTensorSoil material. Alternatively, if the ComputeIsotropicElasticityTensor is used for a uniform soil, the UniformLayerAuxKernel is not necessary. In addition, periodic boundary conditions are applied to the two opposite faces of the soil domain, which are perpendicular to the Z-axis to ensure that they move together. This is achieved using the Periodic option in the boundary conditions. The Ormsby Wavelet is applied at the bottom of the soil block and the response is recorded at the top. The 1% damped acceleration response spectrum at the top of the soil is presented below. The periods at which the response spectrum peaks are the fundamental periods of the soil domain. The periods inferred from this figure are very similar to those predicted by the theoretical solution , where is the depth of soil and is the index of the period of interest.

[Mesh<<<{"href": "../syntax/Mesh/index.html"}>>>]
  type = GeneratedMesh
  nx = 1
  ny = 1
  nz = 15
  xmin = 0
  ymin = 0
  zmin = 0.0
  xmax = 1
  ymax = 1
  zmax = 29.47
  dim = 3
[]

[GlobalParams<<<{"href": "../syntax/GlobalParams/index.html"}>>>]
  displacements = 'disp_x disp_y disp_z'
[]

[Variables<<<{"href": "../syntax/Variables/index.html"}>>>]
  [./disp_x]
  [../]
  [./disp_y]
  [../]
  [./disp_z]
  [../]
[]

[AuxVariables<<<{"href": "../syntax/AuxVariables/index.html"}>>>]
  [./vel_x]
  [../]
  [./accel_x]
  [../]
  [./vel_y]
  [../]
  [./accel_y]
  [../]
  [./vel_z]
  [../]
  [./accel_z]
  [../]
  [./layer_id]
    order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = CONSTANT
    family<<<{"description": "Specifies the family of FE shape functions to use for this variable"}>>> = MONOMIAL
  [../]
[]

[Kernels<<<{"href": "../syntax/Kernels/index.html"}>>>]
  [./DynamicTensorMechanics<<<{"href": "../syntax/Kernels/DynamicTensorMechanics/index.html"}>>>]
    displacements<<<{"description": "The nonlinear displacement variables for the problem"}>>> = 'disp_x disp_y disp_z'
  [../]
  [./inertia_x]
    type = InertialForce<<<{"description": "Calculates the residual for the inertial force ($M \\cdot acceleration$) and the contribution of mass dependent Rayleigh damping and HHT time  integration scheme ($\\eta \\cdot M \\cdot ((1+\\alpha)velq2-\\alpha \\cdot vel-old) $)", "href": "../source/kernels/InertialForce.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    velocity<<<{"description": "velocity variable"}>>> = vel_x
    acceleration<<<{"description": "acceleration variable"}>>> = accel_x
    beta<<<{"description": "beta parameter for Newmark Time integration"}>>> = 0.25
    gamma<<<{"description": "gamma parameter for Newmark Time integration"}>>> = 0.5
  [../]
  [./inertia_y]
    type = InertialForce<<<{"description": "Calculates the residual for the inertial force ($M \\cdot acceleration$) and the contribution of mass dependent Rayleigh damping and HHT time  integration scheme ($\\eta \\cdot M \\cdot ((1+\\alpha)velq2-\\alpha \\cdot vel-old) $)", "href": "../source/kernels/InertialForce.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
    velocity<<<{"description": "velocity variable"}>>> = vel_y
    acceleration<<<{"description": "acceleration variable"}>>> = accel_y
    beta<<<{"description": "beta parameter for Newmark Time integration"}>>> = 0.25
    gamma<<<{"description": "gamma parameter for Newmark Time integration"}>>> = 0.5
  [../]
  [./inertia_z]
    type = InertialForce<<<{"description": "Calculates the residual for the inertial force ($M \\cdot acceleration$) and the contribution of mass dependent Rayleigh damping and HHT time  integration scheme ($\\eta \\cdot M \\cdot ((1+\\alpha)velq2-\\alpha \\cdot vel-old) $)", "href": "../source/kernels/InertialForce.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_z
    velocity<<<{"description": "velocity variable"}>>> = vel_z
    acceleration<<<{"description": "acceleration variable"}>>> = accel_z
    beta<<<{"description": "beta parameter for Newmark Time integration"}>>> = 0.25
    gamma<<<{"description": "gamma parameter for Newmark Time integration"}>>> = 0.5
  [../]
[]

[AuxKernels<<<{"href": "../syntax/AuxKernels/index.html"}>>>]
  [./accel_x]
    type = NewmarkAccelAux<<<{"description": "Computes the current acceleration using the Newmark method.", "href": "../source/auxkernels/NewmarkAccelAux.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = accel_x
    displacement<<<{"description": "displacement variable"}>>> = disp_x
    velocity<<<{"description": "velocity variable"}>>> = vel_x
    beta<<<{"description": "beta parameter for Newmark method"}>>> = 0.25
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_end
  [../]
  [./vel_x]
    type = NewmarkVelAux<<<{"description": "Calculates the current velocity using Newmark method.", "href": "../source/auxkernels/NewmarkVelAux.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = vel_x
    acceleration<<<{"description": "acceleration variable"}>>> = accel_x
    gamma<<<{"description": "gamma parameter for Newmark method"}>>> = 0.5
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_end
  [../]
  [./accel_y]
    type = NewmarkAccelAux<<<{"description": "Computes the current acceleration using the Newmark method.", "href": "../source/auxkernels/NewmarkAccelAux.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = accel_y
    displacement<<<{"description": "displacement variable"}>>> = disp_y
    velocity<<<{"description": "velocity variable"}>>> = vel_y
    beta<<<{"description": "beta parameter for Newmark method"}>>> = 0.25
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_end
  [../]
  [./vel_y]
    type = NewmarkVelAux<<<{"description": "Calculates the current velocity using Newmark method.", "href": "../source/auxkernels/NewmarkVelAux.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = vel_y
    acceleration<<<{"description": "acceleration variable"}>>> = accel_y
    gamma<<<{"description": "gamma parameter for Newmark method"}>>> = 0.5
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_end
  [../]
  [./accel_z]
    type = NewmarkAccelAux<<<{"description": "Computes the current acceleration using the Newmark method.", "href": "../source/auxkernels/NewmarkAccelAux.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = accel_z
    displacement<<<{"description": "displacement variable"}>>> = disp_z
    velocity<<<{"description": "velocity variable"}>>> = vel_z
    beta<<<{"description": "beta parameter for Newmark method"}>>> = 0.25
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_end
  [../]
  [./vel_z]
    type = NewmarkVelAux<<<{"description": "Calculates the current velocity using Newmark method.", "href": "../source/auxkernels/NewmarkVelAux.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = vel_z
    acceleration<<<{"description": "acceleration variable"}>>> = accel_z
    gamma<<<{"description": "gamma parameter for Newmark method"}>>> = 0.5
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_end
  [../]
  [./layer_id]
    type = UniformLayerAuxKernel<<<{"description": "Computes an AuxVariable for representing a layered structure in an arbitrary direction.", "href": "../source/auxkernels/UniformLayerAuxKernel.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = layer_id
    interfaces<<<{"description": "A list of layer interface locations to apply across the domain in the specified direction."}>>> = '29.8'
    direction<<<{"description": "The direction to apply layering."}>>> = '0.0 0.0 1.0'
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = initial
  [../]
[]

[BCs<<<{"href": "../syntax/BCs/index.html"}>>>]
  [./bottom_z]
    type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../source/bcs/DirichletBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_z
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'back'
    value<<<{"description": "Value of the BC"}>>> = 0.0
  [../]
  [./bottom_y]
    type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../source/bcs/DirichletBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'back'
    value<<<{"description": "Value of the BC"}>>> = 0.0
  [../]
  [./bottom_accel]
    type = PresetAcceleration<<<{"description": "Prescribe acceleration on a given boundary in a given direction", "href": "../source/bcs/PresetAcceleration.html"}>>>
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'back'
    function<<<{"description": "Function describing the velocity."}>>> = accel_bottom
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = 'disp_x'
    beta<<<{"description": "beta parameter for Newmark time integration."}>>> = 0.25
    acceleration<<<{"description": "The acceleration variable."}>>> = 'accel_x'
    velocity<<<{"description": "The velocity variable."}>>> = 'vel_x'
  [../]
  [./Periodic<<<{"href": "../syntax/BCs/Periodic/index.html"}>>>]
    [./y_dir]
      variable<<<{"description": "Variable for the periodic boundary condition"}>>> = 'disp_x disp_y disp_z'
      primary<<<{"description": "Boundary ID associated with the primary boundary."}>>> = 'bottom'
      secondary<<<{"description": "Boundary ID associated with the secondary boundary."}>>> = 'top'
      translation<<<{"description": "Vector that translates coordinates on the primary boundary to coordinates on the secondary boundary."}>>> = '0.0 1.0 0.0'
    [../]
    [./x_dir]
      variable<<<{"description": "Variable for the periodic boundary condition"}>>> = 'disp_x disp_y disp_z'
      primary<<<{"description": "Boundary ID associated with the primary boundary."}>>> = 'left'
      secondary<<<{"description": "Boundary ID associated with the secondary boundary."}>>> = 'right'
      translation<<<{"description": "Vector that translates coordinates on the primary boundary to coordinates on the secondary boundary."}>>> = '1.0 0.0 0.0'
    [../]
  [../]
[]

[Functions<<<{"href": "../syntax/Functions/index.html"}>>>]
  [./accel_bottom]
    type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../source/functions/PiecewiseLinear.html"}>>>
    data_file<<<{"description": "File holding CSV data"}>>> = Ormsby_USE1.csv
    scale_factor<<<{"description": "Scale factor to be applied to the output values"}>>> = 1.0
    format<<<{"description": "Format of csv data file that is in either in columns or rows"}>>> = 'columns'
  [../]
  [./initial_zz]
    type = ParsedFunction<<<{"description": "Function created by parsing a string", "href": "../source/functions/MooseParsedFunction.html"}>>>
    value<<<{"description": "The user defined function."}>>> = '-1.7 * 9.81 * (29.47 - z)'
  [../]
  [./initial_xx]
    type = ParsedFunction<<<{"description": "Function created by parsing a string", "href": "../source/functions/MooseParsedFunction.html"}>>>
    value<<<{"description": "The user defined function."}>>> = '-1.7 * 9.81 * (29.47 - z) * 0.3/0.7'
  [../]
[]

[Materials<<<{"href": "../syntax/Materials/index.html"}>>>]
  [./elastic_soil]
    type = ComputeIsotropicElasticityTensorSoil<<<{"description": "Compute an isotropic elasticity tensor for a layered soil material when shear modulus or elastic modulus, poisson's ratio and density are provided as input for each layer.", "href": "../source/materials/ComputeIsotropicElasticityTensorSoil.html"}>>>
    layer_variable<<<{"description": "The variable providing the soil layer identification."}>>> = layer_id
    layer_ids<<<{"description": "Vector of layer ids that map one-to-one with the 'shear_modulus' or 'elastic_modulus', 'poissons_ratio' and 'density' input parameters."}>>> = '0'
    poissons_ratio<<<{"description": "Vector of Poisson's ratio values that map one-to-one with the number 'layer_ids' parameter."}>>> = '0.3'
    density<<<{"description": "Vector of density values that map one-to-one with the number 'layer_ids' parameter."}>>> = '1.7'
    shear_modulus<<<{"description": "Vector of shear modulus values that map one-to-one with the number 'layer_ids' parameter."}>>> = '46282.5'
  [../]
  [./stress_beam2]
    type = ComputeFiniteStrainElasticStress<<<{"description": "Compute stress using elasticity for finite strains", "href": "../source/materials/ComputeFiniteStrainElasticStress.html"}>>>
  [../]
  [./strain_15]
    type = ComputeFiniteStrain<<<{"description": "Compute a strain increment and rotation increment for finite strains.", "href": "../source/materials/ComputeFiniteStrain.html"}>>>
    displacements<<<{"description": "The displacements appropriate for the simulation geometry and coordinate system"}>>> = 'disp_x disp_y disp_z'
  [../]
[]

[Preconditioning<<<{"href": "../syntax/Preconditioning/index.html"}>>>]
  [./andy]
    type = SMP<<<{"description": "Single matrix preconditioner (SMP) builds a preconditioner using user defined off-diagonal parts of the Jacobian.", "href": "../source/preconditioners/SingleMatrixPreconditioner.html"}>>>
    full<<<{"description": "Set to true if you want the full set of couplings between variables simply for convenience so you don't have to set every off_diag_row and off_diag_column combination."}>>> = true
  [../]
[]

[Executioner<<<{"href": "../syntax/Executioner/index.html"}>>>]
  type = Transient
  solve_type = 'NEWTON'
  petsc_options = '-snes_ksp_ew'
  petsc_options_iname = '-ksp_gmres_restart -pc_type -pc_hypre_type -pc_hypre_boomeramg_max_iter'
  petsc_options_value = '201                hypre    boomeramg      4'
  start_time = 0.0
  end_time = 4.0
  dt = 0.001
  dtmin = 0.0001
  nl_abs_tol = 1e-4
  nl_rel_tol = 1e-5
  l_tol = 1e-5
  l_max_its = 25
  timestep_tolerance = 1e-8
[]

[VectorPostprocessors<<<{"href": "../syntax/VectorPostprocessors/index.html"}>>>]
  [./accel_hist]
    type = ResponseHistoryBuilder<<<{"description": "Calculates response histories for a given node and variable(s).", "href": "../source/vectorpostprocessors/ResponseHistoryBuilder.html"}>>>
    variables<<<{"description": "Variable name for which the response history is requested."}>>> = 'accel_x'
    nodes<<<{"description": "Node number(s) at which the response history is needed."}>>> = '3 63'
  [../]
  [./accel_spec]
    type = ResponseSpectraCalculator<<<{"description": "Calculate the response spectrum at the requested nodes or points.", "href": "../source/vectorpostprocessors/ResponseSpectraCalculator.html"}>>>
    vectorpostprocessor<<<{"description": "Name of the ResponseHistoryBuilder vectorpostprocessor, for which response spectra are calculated."}>>> = accel_hist
    regularize_dt<<<{"description": "dt for response spectra calculation. The acceleration response will be regularized to this dt prior to the response spectrum calculation."}>>> = 0.001
    damping_ratio<<<{"description": "Damping ratio for response spectra calculation."}>>> = 0.01
    start_frequency<<<{"description": "Start frequency for the response spectra calculation."}>>> = 0.1
    end_frequency<<<{"description": "End frequency for the response spectra calculation."}>>> = 1000
    outputs<<<{"description": "Vector of output names where you would like to restrict the output of variables(s) associated with this object"}>>> = out
  [../]
[]

[Outputs<<<{"href": "../syntax/Mastodon/Outputs/index.html"}>>>]
  csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
  exodus<<<{"description": "Output the results using the default settings for Exodus output."}>>> = true
  perf_graph<<<{"description": "Enable printing of the performance graph to the screen (Console)"}>>> = true
  print_linear_residuals<<<{"description": "Enable printing of linear residuals to the screen (Console)"}>>> = true
  [./out]
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'FINAL'
    type = CSV<<<{"description": "Output for postprocessors, vector postprocessors, and scalar variables using comma seperated values (CSV).", "href": "../source/outputs/CSV.html"}>>>
    file_base<<<{"description": "The desired solution output name without an extension. If not provided, MOOSE sets it with Outputs/file_base when available. Otherwise, MOOSE uses input file name and this object name for a master input or uses master file_base, the subapp name and this object name for a subapp input to set it."}>>> = Soil_Final_NoDamp
  [../]
  [./out2]
    type = Exodus<<<{"description": "Object for output data in the Exodus format", "href": "../source/outputs/Exodus.html"}>>>
    file_base<<<{"description": "The desired solution output name without an extension. If not provided, MOOSE sets it with Outputs/file_base when available. Otherwise, MOOSE uses input file name and this object name for a master input or uses master file_base, the subapp name and this object name for a subapp input to set it."}>>> = Exod_Soil_Final_NoDamp
    interval = 10
  [../]
[]
(examples/ex09/Soil_Response.i)

Figure 4: Acceleration response spectra of the soil subjected to the Ormsby wavelet.

Soil-structure interaction analysis

The input file for simulating the SSI response is presented below. The amplification ratio of the structural response spectra at 10m height from the free-field soil is computed. Free-field soil is the soil region unaffected by the structural response, which, in this case, is a corner node on the surface of the soil domain. Figure 5 presents the amplification ratio as a function of the period.

[Mesh<<<{"href": "../syntax/Mesh/index.html"}>>>]
  type = FileMesh
  file = Full_3D_Str_red.e
[]

[Variables<<<{"href": "../syntax/Variables/index.html"}>>>]
  [./disp_x]
  [../]
  [./disp_y]
  [../]
  [./disp_z]
  [../]
  [./rot_x]
    block = '3 4 6'
  [../]
  [./rot_y]
    block = '3 4 6'
  [../]
  [./rot_z]
    block = '3 4 6'
  [../]
[]

[AuxVariables<<<{"href": "../syntax/AuxVariables/index.html"}>>>]
  [./stress_x]
  [../]
  [./stress_y]
  [../]
  [./stress_z]
  [../]
  [./vel_x]
  [../]
  [./vel_y]
  [../]
  [./vel_z]
  [../]
  [./accel_x]
  [../]
  [./accel_y]
  [../]
  [./accel_z]
  [../]
  [./rot_vel_x]
    block = '3 4 6'
  [../]
  [./rot_vel_y]
    block = '3 4 6'
  [../]
  [./rot_vel_z]
    block = '3 4 6'
  [../]
  [./rot_accel_x]
    block = '3 4 6'
  [../]
  [./rot_accel_y]
    block = '3 4 6'
  [../]
  [./rot_accel_z]
    block = '3 4 6'
  [../]
  [./layer_id]
    order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = CONSTANT
    family<<<{"description": "Specifies the family of FE shape functions to use for this variable"}>>> = MONOMIAL
  [../]
[]

[Physics<<<{"href": "../syntax/Physics/index.html"}>>>/SolidMechanics<<<{"href": "../syntax/Physics/SolidMechanics/index.html"}>>>/LineElement<<<{"href": "../syntax/Physics/SolidMechanics/LineElement/index.html"}>>>/QuasiStatic<<<{"href": "../syntax/Physics/SolidMechanics/LineElement/QuasiStatic/index.html"}>>>]
  displacements<<<{"description": "The nonlinear displacement variables for the problem"}>>> = 'disp_x disp_y disp_z'
  rotations<<<{"description": "The rotations appropriate for the simulation geometry and coordinate system"}>>> = 'rot_x rot_y rot_z'

  # dynamic simulation using consistent mass/inertia matrix
  dynamic_nodal_translational_inertia<<<{"description": "If set to true, nodal mass matrix is used for the inertial force calculation."}>>> = true

  velocities<<<{"description": "Translational velocity variables"}>>> = 'vel_x vel_y vel_z'
  accelerations<<<{"description": "Translational acceleration variables"}>>> = 'accel_x accel_y accel_z'
  rotational_velocities<<<{"description": "Rotational velocity variables"}>>> = 'rot_vel_x rot_vel_y rot_vel_z'
  rotational_accelerations<<<{"description": "Rotational acceleration variables"}>>> = 'rot_accel_x rot_accel_y rot_accel_z'

  beta<<<{"description": "beta parameter for Newmark Time integration"}>>> = 0.25 # Newmark time integration parameter
  gamma<<<{"description": "gamma parameter for Newmark Time integration"}>>> = 0.5 # Newmark time integration parameter

  [./block_3]
    block<<<{"description": "The list of ids of the blocks (subdomain) that the stress divergence, inertia kernels and materials will be applied to"}>>> = 3
    area<<<{"description": "Cross-section area of the beam. Can be supplied as either a number or a variable name."}>>> = 500
    Iy<<<{"description": "Second moment of area of the beam about y axis. Can be supplied as either a number or a variable name."}>>> = 1e3
    Iz<<<{"description": "Second moment of area of the beam about z axis. Can be supplied as either a number or a variable name."}>>> = 1e3
    y_orientation<<<{"description": "Orientation of the y direction along which Iyy is provided. This should be perpendicular to the axis of the beam."}>>> = '0.0 1.0 0.0'
    nodal_mass<<<{"description": "Mass associated with the node"}>>> = 0.1
    boundary<<<{"description": "The list of boundary IDs from the mesh where the nodal mass/inertia will be applied."}>>> = 'B0'
  [../]
  [./block_4]
    block<<<{"description": "The list of ids of the blocks (subdomain) that the stress divergence, inertia kernels and materials will be applied to"}>>> = 4
    area<<<{"description": "Cross-section area of the beam. Can be supplied as either a number or a variable name."}>>> = 500
    Iy<<<{"description": "Second moment of area of the beam about y axis. Can be supplied as either a number or a variable name."}>>> = 1e3
    Iz<<<{"description": "Second moment of area of the beam about z axis. Can be supplied as either a number or a variable name."}>>> = 1e3
    y_orientation<<<{"description": "Orientation of the y direction along which Iyy is provided. This should be perpendicular to the axis of the beam."}>>> = '1.0 0.0 0.0'
    nodal_mass<<<{"description": "Mass associated with the node"}>>> = 0.1
    boundary<<<{"description": "The list of boundary IDs from the mesh where the nodal mass/inertia will be applied."}>>> = 'B0'
  [../]
  [./block_6]
    block<<<{"description": "The list of ids of the blocks (subdomain) that the stress divergence, inertia kernels and materials will be applied to"}>>> = 6
    area<<<{"description": "Cross-section area of the beam. Can be supplied as either a number or a variable name."}>>> = 500
    Iy<<<{"description": "Second moment of area of the beam about y axis. Can be supplied as either a number or a variable name."}>>> = 1e3
    Iz<<<{"description": "Second moment of area of the beam about z axis. Can be supplied as either a number or a variable name."}>>> = 1e3
    y_orientation<<<{"description": "Orientation of the y direction along which Iyy is provided. This should be perpendicular to the axis of the beam."}>>> = '0.0 1.0 0.0'
    nodal_mass<<<{"description": "Mass associated with the node"}>>> = 166.0
    density<<<{"description": "Name of Material Property or a constant real number defining the density of the beam."}>>> = 2.7
    boundary<<<{"description": "The list of boundary IDs from the mesh where the nodal mass/inertia will be applied."}>>> = 'B1'
  [../]
[]

[Kernels<<<{"href": "../syntax/Kernels/index.html"}>>>]
  [./DynamicTensorMechanics<<<{"href": "../syntax/Kernels/DynamicTensorMechanics/index.html"}>>>]
    displacements<<<{"description": "The nonlinear displacement variables for the problem"}>>> = 'disp_x disp_y disp_z'
    block<<<{"description": "The list of ids of the blocks (subdomain) that the stress divergence kernels will be applied to"}>>> = '1 2'
  [../]
  [./inertia_x]
    type = InertialForce<<<{"description": "Calculates the residual for the inertial force ($M \\cdot acceleration$) and the contribution of mass dependent Rayleigh damping and HHT time  integration scheme ($\\eta \\cdot M \\cdot ((1+\\alpha)velq2-\\alpha \\cdot vel-old) $)", "href": "../source/kernels/InertialForce.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    velocity<<<{"description": "velocity variable"}>>> = vel_x
    acceleration<<<{"description": "acceleration variable"}>>> = accel_x
    beta<<<{"description": "beta parameter for Newmark Time integration"}>>> = 0.25
    gamma<<<{"description": "gamma parameter for Newmark Time integration"}>>> = 0.5
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1 2'
  [../]
  [./inertia_y]
    type = InertialForce<<<{"description": "Calculates the residual for the inertial force ($M \\cdot acceleration$) and the contribution of mass dependent Rayleigh damping and HHT time  integration scheme ($\\eta \\cdot M \\cdot ((1+\\alpha)velq2-\\alpha \\cdot vel-old) $)", "href": "../source/kernels/InertialForce.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
    velocity<<<{"description": "velocity variable"}>>> = vel_y
    acceleration<<<{"description": "acceleration variable"}>>> = accel_y
    beta<<<{"description": "beta parameter for Newmark Time integration"}>>> = 0.25
    gamma<<<{"description": "gamma parameter for Newmark Time integration"}>>> = 0.5
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1 2'
  [../]
  [./inertia_z]
    type = InertialForce<<<{"description": "Calculates the residual for the inertial force ($M \\cdot acceleration$) and the contribution of mass dependent Rayleigh damping and HHT time  integration scheme ($\\eta \\cdot M \\cdot ((1+\\alpha)velq2-\\alpha \\cdot vel-old) $)", "href": "../source/kernels/InertialForce.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_z
    velocity<<<{"description": "velocity variable"}>>> = vel_z
    acceleration<<<{"description": "acceleration variable"}>>> = accel_z
    beta<<<{"description": "beta parameter for Newmark Time integration"}>>> = 0.25
    gamma<<<{"description": "gamma parameter for Newmark Time integration"}>>> = 0.5
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1 2'
  [../]
[]

[AuxKernels<<<{"href": "../syntax/AuxKernels/index.html"}>>>]
  [./accel_x]
    type = NewmarkAccelAux<<<{"description": "Computes the current acceleration using the Newmark method.", "href": "../source/auxkernels/NewmarkAccelAux.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = accel_x
    displacement<<<{"description": "displacement variable"}>>> = disp_x
    velocity<<<{"description": "velocity variable"}>>> = vel_x
    beta<<<{"description": "beta parameter for Newmark method"}>>> = 0.25
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
  [../]
  [./vel_x]
    type = NewmarkVelAux<<<{"description": "Calculates the current velocity using Newmark method.", "href": "../source/auxkernels/NewmarkVelAux.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = vel_x
    acceleration<<<{"description": "acceleration variable"}>>> = accel_x
    gamma<<<{"description": "gamma parameter for Newmark method"}>>> = 0.5
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
  [../]
  [./accel_y]
    type = NewmarkAccelAux<<<{"description": "Computes the current acceleration using the Newmark method.", "href": "../source/auxkernels/NewmarkAccelAux.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = accel_y
    displacement<<<{"description": "displacement variable"}>>> = disp_y
    velocity<<<{"description": "velocity variable"}>>> = vel_y
    beta<<<{"description": "beta parameter for Newmark method"}>>> = 0.25
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
  [../]
  [./vel_y]
    type = NewmarkVelAux<<<{"description": "Calculates the current velocity using Newmark method.", "href": "../source/auxkernels/NewmarkVelAux.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = vel_y
    acceleration<<<{"description": "acceleration variable"}>>> = accel_y
    gamma<<<{"description": "gamma parameter for Newmark method"}>>> = 0.5
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
  [../]
  [./layer_id]
    type = UniformLayerAuxKernel<<<{"description": "Computes an AuxVariable for representing a layered structure in an arbitrary direction.", "href": "../source/auxkernels/UniformLayerAuxKernel.html"}>>>
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = layer_id
    interfaces<<<{"description": "A list of layer interface locations to apply across the domain in the specified direction."}>>> = '29.6'
    direction<<<{"description": "The direction to apply layering."}>>> = '0.0 0.0 1.0'
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = initial
  [../]
[]

[Materials<<<{"href": "../syntax/Materials/index.html"}>>>]
  [./elastic_soil]
    type = ComputeIsotropicElasticityTensorSoil<<<{"description": "Compute an isotropic elasticity tensor for a layered soil material when shear modulus or elastic modulus, poisson's ratio and density are provided as input for each layer.", "href": "../source/materials/ComputeIsotropicElasticityTensorSoil.html"}>>>
    layer_variable<<<{"description": "The variable providing the soil layer identification."}>>> = layer_id
    layer_ids<<<{"description": "Vector of layer ids that map one-to-one with the 'shear_modulus' or 'elastic_modulus', 'poissons_ratio' and 'density' input parameters."}>>> = '0'
    poissons_ratio<<<{"description": "Vector of Poisson's ratio values that map one-to-one with the number 'layer_ids' parameter."}>>> = '0.3'
    density<<<{"description": "Vector of density values that map one-to-one with the number 'layer_ids' parameter."}>>> = '1.7'
    shear_modulus<<<{"description": "Vector of shear modulus values that map one-to-one with the number 'layer_ids' parameter."}>>> = '46282.5'
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1'
  [../]
  [./elasticity_base]
    type = ComputeIsotropicElasticityTensor<<<{"description": "Compute a constant isotropic elasticity tensor.", "href": "../source/materials/ComputeIsotropicElasticityTensor.html"}>>>
    youngs_modulus<<<{"description": "Young's modulus of the material."}>>> = 1e10
    poissons_ratio<<<{"description": "Poisson's ratio for the material."}>>> = 0
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '2'
  [../]
  [./stress_beam2]
    type = ComputeFiniteStrainElasticStress<<<{"description": "Compute stress using elasticity for finite strains", "href": "../source/materials/ComputeFiniteStrainElasticStress.html"}>>>
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1 2'
  [../]
  [./strain_15]
    type = ComputeFiniteStrain<<<{"description": "Compute a strain increment and rotation increment for finite strains.", "href": "../source/materials/ComputeFiniteStrain.html"}>>>
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '1 2'
    displacements<<<{"description": "The displacements appropriate for the simulation geometry and coordinate system"}>>> = 'disp_x disp_y disp_z'
  [../]
  [./density]
    type = GenericConstantMaterial<<<{"description": "Declares material properties based on names and values prescribed by input parameters.", "href": "../source/materials/GenericConstantMaterial.html"}>>>
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '2'
    prop_names<<<{"description": "The names of the properties this material will have"}>>> = density
    prop_values<<<{"description": "The values associated with the named properties"}>>> =  2.7
  [../]
  [./elasticity_beam_rigid]
    type = ComputeElasticityBeam<<<{"description": "Computes the equivalent of the elasticity tensor for the beam element, which are vectors of material translational and flexural stiffness.", "href": "../source/materials/ComputeElasticityBeam.html"}>>>
    youngs_modulus<<<{"description": "Young's modulus of the material. Can be supplied as either a number or a variable name."}>>> = 1e10
    poissons_ratio<<<{"description": "Poisson's ratio of the material. Can be supplied as either a number or a variable name."}>>> = 0.3
    shear_coefficient<<<{"description": "Scale factor for the shear modulus. Can be supplied as either a number or a variable name."}>>> = 0.85
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '3 4 6'
  [../]
  [./stress_beam]
    type = ComputeBeamResultants<<<{"description": "Compute forces and moments using elasticity", "href": "../source/materials/ComputeBeamResultants.html"}>>>
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '3 4 6'
  [../]
[]

[BCs<<<{"href": "../syntax/BCs/index.html"}>>>]
  [./disp_x]
    type = PresetAcceleration<<<{"description": "Prescribe acceleration on a given boundary in a given direction", "href": "../source/bcs/PresetAcceleration.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    velocity<<<{"description": "The velocity variable."}>>> = vel_x
    acceleration<<<{"description": "The acceleration variable."}>>> = accel_x
    beta<<<{"description": "beta parameter for Newmark time integration."}>>> = 0.25
    function<<<{"description": "Function describing the velocity."}>>> = accel_bottom
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'NZ'
  [../]
  [./disp_y]
    type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../source/bcs/DirichletBC.html"}>>>
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'NZ'
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
    value<<<{"description": "Value of the BC"}>>> = 0.0
  [../]
  [./disp_z]
    type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../source/bcs/DirichletBC.html"}>>>
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'NZ'
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_z
    value<<<{"description": "Value of the BC"}>>> = 0.0
  [../]
  [./Periodic<<<{"href": "../syntax/BCs/Periodic/index.html"}>>>]
    [./x_dir]
      variable<<<{"description": "Variable for the periodic boundary condition"}>>> = 'disp_x disp_y disp_z'
      primary<<<{"description": "Boundary ID associated with the primary boundary."}>>> = 'NX'
      secondary<<<{"description": "Boundary ID associated with the secondary boundary."}>>> = 'PX'
      translation<<<{"description": "Vector that translates coordinates on the primary boundary to coordinates on the secondary boundary."}>>> = '75.0 0.0 0.0'
    [../]
    [./y_dir]
      variable<<<{"description": "Variable for the periodic boundary condition"}>>> = 'disp_x disp_y disp_z'
      primary<<<{"description": "Boundary ID associated with the primary boundary."}>>> = 'NY'
      secondary<<<{"description": "Boundary ID associated with the secondary boundary."}>>> = 'PY'
      translation<<<{"description": "Vector that translates coordinates on the primary boundary to coordinates on the secondary boundary."}>>> = '0.0 75.0 0.0'
    [../]
  [../]
[]

[Functions<<<{"href": "../syntax/Functions/index.html"}>>>]
  [./accel_bottom]
    type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../source/functions/PiecewiseLinear.html"}>>>
    data_file<<<{"description": "File holding CSV data"}>>> = Ormsby_USE1.csv
    format<<<{"description": "Format of csv data file that is in either in columns or rows"}>>> = 'columns'
    scale_factor<<<{"description": "Scale factor to be applied to the output values"}>>> = 1
  [../]
[]

[Preconditioning<<<{"href": "../syntax/Preconditioning/index.html"}>>>]
  [./smp]
    type = SMP<<<{"description": "Single matrix preconditioner (SMP) builds a preconditioner using user defined off-diagonal parts of the Jacobian.", "href": "../source/preconditioners/SingleMatrixPreconditioner.html"}>>>
    full<<<{"description": "Set to true if you want the full set of couplings between variables simply for convenience so you don't have to set every off_diag_row and off_diag_column combination."}>>> = true
  [../]
[]

[Executioner<<<{"href": "../syntax/Executioner/index.html"}>>>]
  type = Transient
  solve_type = NEWTON
  nl_abs_tol = 1e-7
  nl_rel_tol = 1e-7
  l_tol = 1e-7
  l_max_its = 12
  start_time = 0.0
  end_time = 3.0
  dt = 0.001
  timestep_tolerance = 1e-6
  petsc_options_iname = '-pc_type -pc_factor_mat_solver_package'
  petsc_options_value = 'lu       superlu_dist'
[]

[VectorPostprocessors<<<{"href": "../syntax/VectorPostprocessors/index.html"}>>>]
  [./accel_hist]
    type = ResponseHistoryBuilder<<<{"description": "Calculates response histories for a given node and variable(s).", "href": "../source/vectorpostprocessors/ResponseHistoryBuilder.html"}>>>
    variables<<<{"description": "Variable name for which the response history is requested."}>>> = 'accel_x'
    nodes<<<{"description": "Node number(s) at which the response history is needed."}>>> =  '23935 2331 104 5'
    outputs<<<{"description": "Vector of output names where you would like to restrict the output of variables(s) associated with this object"}>>> = out
  [../]
  [./accel_spec]
    type = ResponseSpectraCalculator<<<{"description": "Calculate the response spectrum at the requested nodes or points.", "href": "../source/vectorpostprocessors/ResponseSpectraCalculator.html"}>>>
    vectorpostprocessor<<<{"description": "Name of the ResponseHistoryBuilder vectorpostprocessor, for which response spectra are calculated."}>>> = accel_hist
    regularize_dt<<<{"description": "dt for response spectra calculation. The acceleration response will be regularized to this dt prior to the response spectrum calculation."}>>> = 0.001
    damping_ratio<<<{"description": "Damping ratio for response spectra calculation."}>>> = 0.01
    start_frequency<<<{"description": "Start frequency for the response spectra calculation."}>>> = 0.1
    end_frequency<<<{"description": "End frequency for the response spectra calculation."}>>> = 1000
    outputs<<<{"description": "Vector of output names where you would like to restrict the output of variables(s) associated with this object"}>>> = out
  [../]
[]

[Outputs<<<{"href": "../syntax/Mastodon/Outputs/index.html"}>>>]
  csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
  exodus<<<{"description": "Output the results using the default settings for Exodus output."}>>> = true
  perf_graph<<<{"description": "Enable printing of the performance graph to the screen (Console)"}>>> = true
  print_linear_residuals<<<{"description": "Enable printing of linear residuals to the screen (Console)"}>>> = true
  [./out]
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'FINAL'
    type = CSV<<<{"description": "Output for postprocessors, vector postprocessors, and scalar variables using comma seperated values (CSV).", "href": "../source/outputs/CSV.html"}>>>
    file_base<<<{"description": "The desired solution output name without an extension. If not provided, MOOSE sets it with Outputs/file_base when available. Otherwise, MOOSE uses input file name and this object name for a master input or uses master file_base, the subapp name and this object name for a subapp input to set it."}>>> = SSI_NoDamp_RigidStr
  [../]
  [./out2]
    type = Exodus<<<{"description": "Object for output data in the Exodus format", "href": "../source/outputs/Exodus.html"}>>>
    file_base<<<{"description": "The desired solution output name without an extension. If not provided, MOOSE sets it with Outputs/file_base when available. Otherwise, MOOSE uses input file name and this object name for a master input or uses master file_base, the subapp name and this object name for a subapp input to set it."}>>> = Exod_SSI_NoDamp_RigidStr
    interval = 10
  [../]
[]
(examples/ex09/SSI_Response.i)

Figure 5: Amplification ratio of the structural response spectra from the free-field soil in SSI analysis. This is computed using MASTODON.

Figure 6 presents the free-field soil acceleration response (1% damped) from the SSI analysis, compared to that obtained from the site response analysis. It is seen that these to spectra are very similar. The subtle differences are likely due to the coarse mesh size and small domain extent for the soil-structure interaction problem.

Figure 6: Free-field response spectra from the SSI analysis and the individual soil analysis.

References

  1. C. Bolisetti. Site response, soil-structure interaction and structure-soil-structure interaction for performance assessment of buildings and nuclear structures. PhD dissertation, State University of New York, 2014.[BibTeX]
  2. C. Bolisetti, A. S. Whittaker, and J. L. Coleman. Linear and nonlinear soil-structure interaction analysis of buildings and safety-related nuclear structures. Soil Dynamics and Earthquake Engineering, 107:218–233, 2018.[BibTeX]