Example 7: Demonstration of domain reduction method

Model Description

This example demonstrates the use of the domain reduction method (DRM) in MASTODON. DRM was developed by Bielak et al. (2003) to improve the computational efficiency in source-to-site wave propagation problems. Problems involving fault rupture scenarios require large computational domains spanning many kilometers. If a structure of a width in the order of 40 m is to be designed to withstand the seismic waves generated from this fault rupture, it would be inefficient to simulate the entire fault rupture scenario for every small change in the structure's properties. To overcome this, DRM splits the problem into parts: (i) free-field response of the soil to the fault rupture is computed first, (ii) seismic forces along the DRM element layer is then transferred from the large model is part (i) to a much smaller computational domain containing just the structure and a part of the soil around it.

In this example, rupture of a horizontal earthquake fault is modeled in a 1000 m x 500 m homogenous linear elastic soil domain Figure 1 (a). The region within the gray DRM element layer is the smaller soil domain, which for this demonstration is assumed to have the exact same material properties as the larger soil domain Figure 1 (d). This method requires the forces along the inner and outer boundary of the DRM element layer to be transferred from (a) to (d). To compute these forces, two intermediate models are required which are shown in Figure 1 (b) and Figure 1 (c). In the next few paragraphs, details of the input files corresponding to each model are described.

Figure 1: Illustration showing the larger model (a), the two intermediate models (b and c) and the smaller model (d) required for the domain reduction method. The white line in (a) is the horizontal earthquake fault and the gray region is the DRM element layer.

Modeling in MASTODON

The input file corresponding to Figure 1 (a) is shown below. Here, the earthquake fault rupture is modeled using the SeismicSource block within DiracKernels. The fault, which extends between 300 m and 700 m is divided into 501 point sources and the locations of these point sources are provided through the position_functions. To model wave propagation in an infinite half-space, absorbing boundaries are placed at the left, right and bottom boundaries using the NonReflectingBC block within the BCs block. Please refer to the GettingStarted for details on the other objects used in this input file that are required for simulating wave propagation. The resulting displacements in the soil are stored in the exodus output file and this is used as input for the two intermediate models.

[Mesh<<<{"href": "../syntax/Mesh/index.html"}>>>]
  type = GeneratedMesh
  dim = 2
  nx = 100
  ny = 50
  xmin = 0.0
  xmax = 1000.0
  ymin = 0.0
  ymax = 500.0
[]

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

[AuxVariables<<<{"href": "../syntax/AuxVariables/index.html"}>>>]
  [./vel_x]
  [../]
  [./accel_x]
  [../]
  [./vel_y]
  [../]
  [./accel_y]
  [../]
  [./layer]
    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'
    block<<<{"description": "The list of ids of the blocks (subdomain) that the stress divergence kernels will be applied to"}>>> = 0
    stiffness_damping_coefficient<<<{"description": "Name of material property or a constant real number defining stiffness Rayleigh parameter (zeta)."}>>> = 0.00006366
  [../]
  [./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"}>>> = 0
    eta<<<{"description": "Name of material property or a constant real number defining the eta parameter for the Rayleigh damping."}>>> = 7.854
  [../]
  [./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"}>>> = 0
    eta<<<{"description": "Name of material property or a constant real number defining the eta parameter for the Rayleigh damping."}>>> = 7.854
  [../]
[]

[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"}>>>
     interfaces<<<{"description": "A list of layer interface locations to apply across the domain in the specified direction."}>>> = '550.0'
     direction<<<{"description": "The direction to apply layering."}>>> = '0 1 0'
     variable<<<{"description": "The name of the variable that this object applies to"}>>> = layer
     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
  [../]
[]

[DiracKernels<<<{"href": "../syntax/DiracKernels/index.html"}>>>]
  [./SeismicSource<<<{"href": "../syntax/DiracKernels/SeismicSource/index.html"}>>>]
   [./one_source]
    displacements<<<{"description": "The vector of displacement variables."}>>> = 'disp_x disp_y'
    slip<<<{"description": "The function describing slip as a function of time."}>>> = y_force
    strike<<<{"description": "The strike angle of the fault in degrees."}>>> = 0.0 # strike angle =0, x aligned with North
    dip<<<{"description": "The dip angle of the fault in degrees."}>>> = 0.0 # dip angle = 0, angle fault makes with horizontal
    rake<<<{"description": "The rake angle of the fault in degrees."}>>> = 90.0 # rake angle = pi/2, gives slip direction
    shear_modulus<<<{"description": "The shear modulus of the soil around the seismic source."}>>> = 1.996e7
    area<<<{"description": "The area over which slip is distributed."}>>> = 1.0
    number<<<{"description": "The number of point sources. This number should be same as number of entries in the function files describing the position of the point source."}>>> = 501
    position_function<<<{"description": "The vector of function names that describes the x, y and z coordinates of the source. Only the x positionfunction is required for 1 dimensional problems, x and ypositions are required for 2 dimensional problems and x, y and z positions are required for 3D problems. The firstcolumn in these functions gives source number (startingwith 1) and the second column contains the coordinate."}>>> = 'x_pos y_pos'
   [../]
  [../]
[]

[BCs<<<{"href": "../syntax/BCs/index.html"}>>>]
[./NonReflectingBC<<<{"href": "../syntax/BCs/NonReflectingBC/index.html"}>>>]
   [./back]
     displacements<<<{"description": "The vector of displacement variables. The size of this vector must be same as the number of dimensions."}>>> = 'disp_x disp_y'
     velocities<<<{"description": "The vector of velocity variables that are coupled to the displacement variables. The size of this vector must be same as that of displacements."}>>> = 'vel_x vel_y'
     accelerations<<<{"description": "The vector of acceleration variables that are coupled to the displacement variables. The size of this vector must be same as that of displacements."}>>> = 'accel_x accel_y'
     beta<<<{"description": "The beta parameter for Newmark time integration."}>>> = 0.25
     gamma<<<{"description": "The gamma parameter for Newmark time integration."}>>> = 0.5
     boundary<<<{"description": "The list of boundary IDs from the mesh where this boundary condition will be applied"}>>> = 'left right bottom'
     shear_wave_speed<<<{"description": "shear wave speed of the material."}>>> = 1000.0
     density<<<{"description": "Density of the material."}>>> = 1700.0
     p_wave_speed<<<{"description": "P-wave speed of the material."}>>>=1870.829
   [../]
 [../]
[]

[Functions<<<{"href": "../syntax/Functions/index.html"}>>>]
  [./y_force]
    type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../source/functions/PiecewiseLinear.html"}>>>
    data_file<<<{"description": "File holding CSV data"}>>> = 'slip_displacement_6_5_hz.csv'
    format<<<{"description": "Format of csv data file that is in either in columns or rows"}>>> = 'columns'
  [../]
  [./x_pos]
    type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../source/functions/PiecewiseLinear.html"}>>>
    data_file<<<{"description": "File holding CSV data"}>>> = 'x_position.csv'
    format<<<{"description": "Format of csv data file that is in either in columns or rows"}>>> = 'columns'
  [../]
  [./y_pos]
    type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../source/functions/PiecewiseLinear.html"}>>>
    data_file<<<{"description": "File holding CSV data"}>>> = 'y_position.csv'
    format<<<{"description": "Format of csv data file that is in either in columns or rows"}>>> = 'columns'
  [../]
[]

[Materials<<<{"href": "../syntax/Materials/index.html"}>>>]
  [./linear]
    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
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 0
    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'
    shear_modulus<<<{"description": "Vector of shear modulus values that map one-to-one with the number 'layer_ids' parameter."}>>> = '1.7e9'
    density<<<{"description": "Vector of density values that map one-to-one with the number 'layer_ids' parameter."}>>> = '1700.0'
    poissons_ratio<<<{"description": "Vector of Poisson's ratio values that map one-to-one with the number 'layer_ids' parameter."}>>> = '0.3'
  [../]
  [./strain_1]
    type = ComputeSmallStrain<<<{"description": "Compute a small strain.", "href": "../source/materials/ComputeSmallStrain.html"}>>>
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '0'
    displacements<<<{"description": "The displacements appropriate for the simulation geometry and coordinate system"}>>> = 'disp_x disp_y'
  [../]

  [./stress_1]
    type = ComputeLinearElasticStress<<<{"description": "Compute stress using elasticity for small strains", "href": "../source/materials/ComputeLinearElasticStress.html"}>>>
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '0'
  [../]
[]

[Postprocessors<<<{"href": "../syntax/Postprocessors/index.html"}>>>]
  [./dt]
    type = TimestepSize<<<{"description": "Reports the timestep size", "href": "../source/postprocessors/TimestepSize.html"}>>>
  [../]
  [./node_x_50]
    type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../source/postprocessors/PointValue.html"}>>>
    point<<<{"description": "The physical point where the solution will be evaluated."}>>> = '500.0 500.0 0.0'
    variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = vel_x
  [../]
  [./node_y_50]
    type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../source/postprocessors/PointValue.html"}>>>
    point<<<{"description": "The physical point where the solution will be evaluated."}>>> = '500.0 500.0 0.0'
    variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = vel_y
  [../]
[]

[Executioner<<<{"href": "../syntax/Executioner/index.html"}>>>]
  type = Transient
  solve_type = 'NEWTON'
  nl_abs_tol = 1e-8
  start_time = 0.0
  end_time = 1.0
  dt = 0.01
  timestep_tolerance = 1e-6
  petsc_options_iname = '-ksp_gmres_restart -pc_type -pc_hypre_type -pc_hypre_boomeramg_max_iter'
  petsc_options_value = '201                hypre     boomeramg      4'
  line_search = 'none'
[]

[Outputs<<<{"href": "../syntax/Mastodon/Outputs/index.html"}>>>]
  file_base<<<{"description": "Common file base name to be utilized with all output objects"}>>> = output/big_model_out
  exodus<<<{"description": "Output the results using the default settings for Exodus output."}>>> = true
  csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
(examples/ex07/big_model.i)

The input file corresponding to Figure 1 (b) is shown below. To generate the mesh corresponding to this model within MASTODON, first a rectangular mesh is created using the GeneratedMeshGenerator object. Then, a new subdomain/block, which includes everything within the inner boundary of the DRM layer, is created using the SubdomainBoundingBoxGenerator object within the Mesh block. This block of elements is then deleted using the BlockDeletionGenerator object that is also located with the Mesh block, leaving only the mesh corresponding to the DRM element layer. New nodesets containing the nodes on the inner and outer boundaries of the DRM layer are created using the ExtraNodesetGenerator object located within the Mesh block. Both the inner and outer boundaries are split into 3 sections - left, bottom and right, for simplicity.

[Mesh<<<{"href": "../syntax/Mesh/index.html"}>>>]
  [./generate]
    type = GeneratedMeshGenerator<<<{"description": "Create a line, square, or cube mesh with uniformly spaced or biased elements.", "href": "../source/meshgenerators/GeneratedMeshGenerator.html"}>>>
    dim<<<{"description": "The dimension of the mesh to be generated"}>>> = 2
    xmin<<<{"description": "Lower X Coordinate of the generated mesh"}>>> = 450.0
    xmax<<<{"description": "Upper X Coordinate of the generated mesh"}>>> = 550.0
    ymin<<<{"description": "Lower Y Coordinate of the generated mesh"}>>> = 450.0
    ymax<<<{"description": "Upper Y Coordinate of the generated mesh"}>>> = 500.0
    nx<<<{"description": "Number of elements in the X direction"}>>> = 10
    ny<<<{"description": "Number of elements in the Y direction"}>>> = 5
  [../]
  [./SubdomainBoundingBox]
    type = SubdomainBoundingBox
    input = generate
    block_id = 1
    bottom_left = '460.0 460.0 0.0'
    top_right = '540.0 500.0 0.0'
  [../]
  [./ed0]
    type = BlockDeletionGenerator<<<{"description": "Mesh generator which removes elements from the specified subdomains", "href": "../source/meshgenerators/BlockDeletionGenerator.html"}>>>
    input<<<{"description": "The mesh we want to modify"}>>> = SubdomainBoundingBoxGenerator
    block_id<<<{"description": "The block to be deleted."}>>> = 1
  [../]
  [./outer_1] # outer-left boundary
    type = ParsedAddSidesetGenerator
    input = ed0
    combinatorial_geometry = 'x > 449.9 & x < 450.1 & y > 449.9'
    new_sideset_name = outer_1
    normal = '-1.0 0.0 0.0'
  [../]
  [./outer_2] # outer-bottom boundary
    type = ParsedAddSidesetGenerator
    input = outer_1
    combinatorial_geometry = 'x > 459.1 & x < 541.0 & y > 449.9 & y < 450.1'
    new_sideset_name = outer_2
    normal = '0.0 -1.0 0.0'
  [../]
  [./outer_3] # outer-right boundary
    type = ParsedAddSidesetGenerator
    input = outer_2
    combinatorial_geometry = 'x > 549.1 & x < 550.1 & y > 449.9'
    new_sideset_name = outer_3
    normal = '1.0 0.0 0.0'
  [../]
  [./inner_1] # inner-left boundary
    type = ParsedAddSidesetGenerator
    input = outer_3
    combinatorial_geometry = 'x > 459.9 & x < 460.1 & y > 459.9'
    new_sideset_name = inner_1
    normal = '1.0 0.0 0.0'
  [../]
  [./inner_2] # inner-bottom boundary
    type = ParsedAddSidesetGenerator
    input = inner_1
    combinatorial_geometry = 'x > 469.1 & x < 530.1 & y > 459.9 & y < 460.1'
    new_sideset_name = inner_2
    normal = '0.0 1.0 0.0'
  [../]
  [./inner_3] # inner-right boundary
    type = ParsedAddSidesetGenerator
    input = inner_2
    combinatorial_geometry = 'x > 539.9 & x < 540.1 & y > 459.9'
    new_sideset_name = inner_3
    normal = '-1.0 0.0 0.0'
  [../]
[]

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

[AuxVariables<<<{"href": "../syntax/AuxVariables/index.html"}>>>]
  [./vel_x]
  [../]
  [./accel_x]
  [../]
  [./vel_y]
  [../]
  [./accel_y]
  [../]
  [./layer]
  [../]
  [./resid_x]
  [../]
  [./resid_y]
  [../]
[]

[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"}>>> = 0
    save_in<<<{"description": "The displacement residuals"}>>> = 'resid_x resid_y'
    stiffness_damping_coefficient<<<{"description": "Name of material property or a constant real number defining stiffness Rayleigh parameter (zeta)."}>>> = 0.00006366
  [../]
  [./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
    save_in<<<{"description": "The name of auxiliary variables to save this Kernel's residual contributions to.  Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)"}>>> = resid_x
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 0
    eta<<<{"description": "Name of material property or a constant real number defining the eta parameter for the Rayleigh damping."}>>> = 7.854
  [../]
  [./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
    save_in<<<{"description": "The name of auxiliary variables to save this Kernel's residual contributions to.  Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)"}>>> = resid_y
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 0
    eta<<<{"description": "Name of material property or a constant real number defining the eta parameter for the Rayleigh damping."}>>> = 7.854
  [../]
[]

[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"}>>>
     interfaces<<<{"description": "A list of layer interface locations to apply across the domain in the specified direction."}>>> = '550.0'
     direction<<<{"description": "The direction to apply layering."}>>> = '0 1 0'
     variable<<<{"description": "The name of the variable that this object applies to"}>>> = layer
     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
  [../]
[]

[UserObjects<<<{"href": "../syntax/UserObjects/index.html"}>>>]
   [./solution_disp_x]
     type = SolutionUserObject<<<{"description": "Reads a variable from a mesh in one simulation to another", "href": "../source/userobjects/SolutionUserObject.html"}>>>
     mesh<<<{"description": "The name of the mesh file (must be xda/xdr or exodusII file)."}>>> = output/big_model_out.e
     system_variables<<<{"description": "The name of the nodal and elemental variables from the file you want to use for values"}>>> = disp_x
   [../]
   [./solution_disp_y]
     type = SolutionUserObject<<<{"description": "Reads a variable from a mesh in one simulation to another", "href": "../source/userobjects/SolutionUserObject.html"}>>>
     mesh<<<{"description": "The name of the mesh file (must be xda/xdr or exodusII file)."}>>> = output/big_model_out.e
     system_variables<<<{"description": "The name of the nodal and elemental variables from the file you want to use for values"}>>> = disp_y
   [../]
[]

[Functions<<<{"href": "../syntax/Functions/index.html"}>>>]
   [./soln_dispx_fn]
     type = SolutionFunction<<<{"description": "Function for reading a solution from file.", "href": "../source/functions/SolutionFunction.html"}>>>
     solution<<<{"description": "The SolutionUserObject to extract data from."}>>> = solution_disp_x
   [../]
   [./soln_dispy_fn]
     type = SolutionFunction<<<{"description": "Function for reading a solution from file.", "href": "../source/functions/SolutionFunction.html"}>>>
     solution<<<{"description": "The SolutionUserObject to extract data from."}>>> = solution_disp_y
   [../]
[]

[BCs<<<{"href": "../syntax/BCs/index.html"}>>>]
  [./disp_inner_1x]
    type = FunctionDirichletBC<<<{"description": "Imposes the essential boundary condition $u=g(t,\\vec{x})$, where $g$ is a (possibly) time and space-dependent MOOSE Function.", "href": "../source/bcs/FunctionDirichletBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = inner_1
    function<<<{"description": "The forcing function."}>>> = soln_dispx_fn
  [../]
  [./disp_inner_2x]
    type = FunctionDirichletBC<<<{"description": "Imposes the essential boundary condition $u=g(t,\\vec{x})$, where $g$ is a (possibly) time and space-dependent MOOSE Function.", "href": "../source/bcs/FunctionDirichletBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = inner_2
    function<<<{"description": "The forcing function."}>>> = soln_dispx_fn
  [../]
  [./disp_inner_3x]
    type = FunctionDirichletBC<<<{"description": "Imposes the essential boundary condition $u=g(t,\\vec{x})$, where $g$ is a (possibly) time and space-dependent MOOSE Function.", "href": "../source/bcs/FunctionDirichletBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = inner_3
    function<<<{"description": "The forcing function."}>>> = soln_dispx_fn
  [../]
  [./disp_outer_1x]
    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_x
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = outer_1
    value<<<{"description": "Value of the BC"}>>> = 0.0
  [../]
  [./disp_outer_2x]
    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_x
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = outer_2
    value<<<{"description": "Value of the BC"}>>> = 0.0
  [../]
  [./disp_outer_3x]
    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_x
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = outer_3
    value<<<{"description": "Value of the BC"}>>> = 0.0
  [../]
  [./disp_inner_1y]
    type = FunctionDirichletBC<<<{"description": "Imposes the essential boundary condition $u=g(t,\\vec{x})$, where $g$ is a (possibly) time and space-dependent MOOSE Function.", "href": "../source/bcs/FunctionDirichletBC.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"}>>> = inner_1
    function<<<{"description": "The forcing function."}>>> = soln_dispy_fn
  [../]
  [./disp_inner_2y]
    type = FunctionDirichletBC<<<{"description": "Imposes the essential boundary condition $u=g(t,\\vec{x})$, where $g$ is a (possibly) time and space-dependent MOOSE Function.", "href": "../source/bcs/FunctionDirichletBC.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"}>>> = inner_2
    function<<<{"description": "The forcing function."}>>> = soln_dispy_fn
  [../]
  [./disp_inner_3y]
    type = FunctionDirichletBC<<<{"description": "Imposes the essential boundary condition $u=g(t,\\vec{x})$, where $g$ is a (possibly) time and space-dependent MOOSE Function.", "href": "../source/bcs/FunctionDirichletBC.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"}>>> = inner_3
    function<<<{"description": "The forcing function."}>>> = soln_dispy_fn
  [../]
  [./disp_outer_1y]
    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"}>>> = outer_1
    value<<<{"description": "Value of the BC"}>>> = 0.0
  [../]
  [./disp_outer_2y]
    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"}>>> = outer_2
    value<<<{"description": "Value of the BC"}>>> = 0.0
  [../]
  [./disp_outer_3y]
    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"}>>> = outer_3
    value<<<{"description": "Value of the BC"}>>> = 0.0
  [../]
[]

[Materials<<<{"href": "../syntax/Materials/index.html"}>>>]
  [./linear]
    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
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 0
    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'
    shear_modulus<<<{"description": "Vector of shear modulus values that map one-to-one with the number 'layer_ids' parameter."}>>> = '1.7e9'
    density<<<{"description": "Vector of density values that map one-to-one with the number 'layer_ids' parameter."}>>> = '1700.0'
    poissons_ratio<<<{"description": "Vector of Poisson's ratio values that map one-to-one with the number 'layer_ids' parameter."}>>> = '0.3'
  [../]
  [./strain_1]
    type = ComputeSmallStrain<<<{"description": "Compute a small strain.", "href": "../source/materials/ComputeSmallStrain.html"}>>>
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '0'
    displacements<<<{"description": "The displacements appropriate for the simulation geometry and coordinate system"}>>> = 'disp_x disp_y'
  [../]

  [./stress_1]
    type = ComputeLinearElasticStress<<<{"description": "Compute stress using elasticity for small strains", "href": "../source/materials/ComputeLinearElasticStress.html"}>>>
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '0'
  [../]
[]

[Executioner<<<{"href": "../syntax/Executioner/index.html"}>>>]
  type = Transient
  solve_type = 'PJFNK'
  nl_abs_tol = 1e-8
  start_time = 0.0
  end_time = 1.0
  dt = 0.01
  timestep_tolerance = 1e-6
  petsc_options_iname = '-ksp_gmres_restart -pc_type -pc_hypre_type -pc_hypre_boomeramg_max_iter'
  petsc_options_value = '201                hypre     boomeramg      4'
  line_search = 'none'
[]

[Postprocessors<<<{"href": "../syntax/Postprocessors/index.html"}>>>]
  [./dt]
    type = TimestepSize<<<{"description": "Reports the timestep size", "href": "../source/postprocessors/TimestepSize.html"}>>>
  [../]
[]

[Outputs<<<{"href": "../syntax/Mastodon/Outputs/index.html"}>>>]
  file_base<<<{"description": "Common file base name to be utilized with all output objects"}>>> = output/DRM_layer_2d_outer_out
  exodus<<<{"description": "Output the results using the default settings for Exodus output."}>>> = true
  csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
(examples/ex07/fixed_outer.i)
commentnote

The three new boundaries corresponding to the inner/outer boundaries of the DRM layer should not have any overlapping nodes.

In Figure 1 (b), the aim is to compute the seismic forces at the outer boundary of the DRM layer. To accomplish this task, the outer boundary is fixed using the DirichletBC object and the displacement from the larger model is transferred to the inner boundary. The resulting reaction forces at the outer boundary are the seismic forces that need to be transferred to same boundary in the smaller model (Figure 1 (d)). The transfer of displacements from model (a) to model (b) is achieved using the SolutionUserObject and the SolutionFunction, which extract the displacement variables from the exodus file corresponding to the larger model and transfers it into a function of space and time, which is then prescribed at the inner boundaries using the FunctionDirichletBC object. The resid_x and resid_y AuxVariables in this input file are used to store the residuals from the kernels and these residuals are essentially the reaction forces at the outer boundaries. These variables are stored in the output exodus file and will be used as input to the smaller model.

The other intermediate model (Figure 1 (c)) is very similar to the one described above but with the inner boundaries being fixed and the displacement from the larger model being transferred to the outer boundaries. One difference here is that the displacements from larger model has to be scaled by a factor of -1.0 (refer to the SolutionFunction object within the Functions block) before being applied to the outer boundaries. The reaction forces at the inner boundary are again stored in the resid_x and resid_y variables and these are transferred to the smaller model as seismic forces along the inner boundary. The input file for this model is shown below.

[Mesh<<<{"href": "../syntax/Mesh/index.html"}>>>]
  [./generate]
    type = GeneratedMeshGenerator<<<{"description": "Create a line, square, or cube mesh with uniformly spaced or biased elements.", "href": "../source/meshgenerators/GeneratedMeshGenerator.html"}>>>
    dim<<<{"description": "The dimension of the mesh to be generated"}>>> = 2
    xmin<<<{"description": "Lower X Coordinate of the generated mesh"}>>> = 450.0
    xmax<<<{"description": "Upper X Coordinate of the generated mesh"}>>> = 550.0
    ymin<<<{"description": "Lower Y Coordinate of the generated mesh"}>>> = 450.0
    ymax<<<{"description": "Upper Y Coordinate of the generated mesh"}>>> = 500.0
    nx<<<{"description": "Number of elements in the X direction"}>>> = 10
    ny<<<{"description": "Number of elements in the Y direction"}>>> = 5
  [../]
  [./SubdomainBoundingBox]
    type = SubdomainBoundingBox
    input = generate
    block_id = 1
    bottom_left = '460.0 460.0 0.0'
    top_right = '540.0 500.0 0.0'
  [../]
  [./ed0]
    type = BlockDeletionGenerator<<<{"description": "Mesh generator which removes elements from the specified subdomains", "href": "../source/meshgenerators/BlockDeletionGenerator.html"}>>>
    input<<<{"description": "The mesh we want to modify"}>>> = SubdomainBoundingBoxGenerator
    block_id<<<{"description": "The block to be deleted."}>>> = 1
  [../]
  [./outer_1] # outer-left boundary
    type = ParsedAddSidesetGenerator
    input = ed0
    combinatorial_geometry = 'x > 449.9 & x < 450.1 & y > 449.9'
    new_sideset_name = outer_1
    normal = '-1.0 0.0 0.0'
  [../]
  [./outer_2] # outer-bottom boundary
    type = ParsedAddSidesetGenerator
    input = outer_1
    combinatorial_geometry = 'x > 459.1 & x < 541.0 & y > 449.9 & y < 450.1'
    new_sideset_name = outer_2
    normal = '0.0 -1.0 0.0'
  [../]
  [./outer_3] # outer-right boundary
    type = ParsedAddSidesetGenerator
    input = outer_2
    combinatorial_geometry = 'x > 549.1 & x < 550.1 & y > 449.9'
    new_sideset_name = outer_3
    normal = '1.0 0.0 0.0'
  [../]
  [./inner_1] # inner-left boundary
    type = ParsedAddSidesetGenerator
    input = outer_3
    combinatorial_geometry = 'x > 459.9 & x < 460.1 & y > 459.9'
    new_sideset_name = inner_1
    normal = '1.0 0.0 0.0'
  [../]
  [./inner_2] # inner-bottom boundary
    type = ParsedAddSidesetGenerator
    input = inner_1
    combinatorial_geometry = 'x > 469.1 & x < 530.1 & y > 459.9 & y < 460.1'
    new_sideset_name = inner_2
    normal = '0.0 1.0 0.0'
  [../]
  [./inner_3] # inner-right boundary
    type = ParsedAddSidesetGenerator
    input = inner_2
    combinatorial_geometry = 'x > 539.9 & x < 540.1 & y > 459.9'
    new_sideset_name = inner_3
    normal = '-1.0 0.0 0.0'
  [../]
[]

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

[AuxVariables<<<{"href": "../syntax/AuxVariables/index.html"}>>>]
  [./vel_x]
  [../]
  [./accel_x]
  [../]
  [./vel_y]
  [../]
  [./accel_y]
  [../]
  [./layer]
  [../]
  [./resid_x]
  [../]
  [./resid_y]
  [../]
[]

[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"}>>> = 0
    save_in<<<{"description": "The displacement residuals"}>>> = 'resid_x resid_y'
    stiffness_damping_coefficient<<<{"description": "Name of material property or a constant real number defining stiffness Rayleigh parameter (zeta)."}>>> = 0.00006366
  [../]
  [./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
    save_in<<<{"description": "The name of auxiliary variables to save this Kernel's residual contributions to.  Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)"}>>> = resid_x
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 0
    eta<<<{"description": "Name of material property or a constant real number defining the eta parameter for the Rayleigh damping."}>>> = 7.854
  [../]
  [./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
    save_in<<<{"description": "The name of auxiliary variables to save this Kernel's residual contributions to.  Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)"}>>> = resid_y
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 0
    eta<<<{"description": "Name of material property or a constant real number defining the eta parameter for the Rayleigh damping."}>>> = 7.854
  [../]
[]

[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"}>>>
     interfaces<<<{"description": "A list of layer interface locations to apply across the domain in the specified direction."}>>> = '550.0'
     direction<<<{"description": "The direction to apply layering."}>>> = '0 1 0'
     variable<<<{"description": "The name of the variable that this object applies to"}>>> = layer
     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
  [../]
[]

[UserObjects<<<{"href": "../syntax/UserObjects/index.html"}>>>]
   [./solution_disp_x]
     type = SolutionUserObject<<<{"description": "Reads a variable from a mesh in one simulation to another", "href": "../source/userobjects/SolutionUserObject.html"}>>>
     mesh<<<{"description": "The name of the mesh file (must be xda/xdr or exodusII file)."}>>> = output/big_model_out.e
     system_variables<<<{"description": "The name of the nodal and elemental variables from the file you want to use for values"}>>> = disp_x
   [../]
   [./solution_disp_y]
     type = SolutionUserObject<<<{"description": "Reads a variable from a mesh in one simulation to another", "href": "../source/userobjects/SolutionUserObject.html"}>>>
     mesh<<<{"description": "The name of the mesh file (must be xda/xdr or exodusII file)."}>>> = output/big_model_out.e
     system_variables<<<{"description": "The name of the nodal and elemental variables from the file you want to use for values"}>>> = disp_y
   [../]
[]

[Functions<<<{"href": "../syntax/Functions/index.html"}>>>]
   [./soln_dispx_fn]
     type = SolutionFunction<<<{"description": "Function for reading a solution from file.", "href": "../source/functions/SolutionFunction.html"}>>>
     solution<<<{"description": "The SolutionUserObject to extract data from."}>>> = solution_disp_x
   [../]
   [./soln_dispy_fn]
     type = SolutionFunction<<<{"description": "Function for reading a solution from file.", "href": "../source/functions/SolutionFunction.html"}>>>
     solution<<<{"description": "The SolutionUserObject to extract data from."}>>> = solution_disp_y
   [../]
[]

[BCs<<<{"href": "../syntax/BCs/index.html"}>>>]
  [./disp_inner_1x]
    type = FunctionDirichletBC<<<{"description": "Imposes the essential boundary condition $u=g(t,\\vec{x})$, where $g$ is a (possibly) time and space-dependent MOOSE Function.", "href": "../source/bcs/FunctionDirichletBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = inner_1
    function<<<{"description": "The forcing function."}>>> = soln_dispx_fn
  [../]
  [./disp_inner_2x]
    type = FunctionDirichletBC<<<{"description": "Imposes the essential boundary condition $u=g(t,\\vec{x})$, where $g$ is a (possibly) time and space-dependent MOOSE Function.", "href": "../source/bcs/FunctionDirichletBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = inner_2
    function<<<{"description": "The forcing function."}>>> = soln_dispx_fn
  [../]
  [./disp_inner_3x]
    type = FunctionDirichletBC<<<{"description": "Imposes the essential boundary condition $u=g(t,\\vec{x})$, where $g$ is a (possibly) time and space-dependent MOOSE Function.", "href": "../source/bcs/FunctionDirichletBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = inner_3
    function<<<{"description": "The forcing function."}>>> = soln_dispx_fn
  [../]
  [./disp_outer_1x]
    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_x
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = outer_1
    value<<<{"description": "Value of the BC"}>>> = 0.0
  [../]
  [./disp_outer_2x]
    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_x
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = outer_2
    value<<<{"description": "Value of the BC"}>>> = 0.0
  [../]
  [./disp_outer_3x]
    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_x
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = outer_3
    value<<<{"description": "Value of the BC"}>>> = 0.0
  [../]
  [./disp_inner_1y]
    type = FunctionDirichletBC<<<{"description": "Imposes the essential boundary condition $u=g(t,\\vec{x})$, where $g$ is a (possibly) time and space-dependent MOOSE Function.", "href": "../source/bcs/FunctionDirichletBC.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"}>>> = inner_1
    function<<<{"description": "The forcing function."}>>> = soln_dispy_fn
  [../]
  [./disp_inner_2y]
    type = FunctionDirichletBC<<<{"description": "Imposes the essential boundary condition $u=g(t,\\vec{x})$, where $g$ is a (possibly) time and space-dependent MOOSE Function.", "href": "../source/bcs/FunctionDirichletBC.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"}>>> = inner_2
    function<<<{"description": "The forcing function."}>>> = soln_dispy_fn
  [../]
  [./disp_inner_3y]
    type = FunctionDirichletBC<<<{"description": "Imposes the essential boundary condition $u=g(t,\\vec{x})$, where $g$ is a (possibly) time and space-dependent MOOSE Function.", "href": "../source/bcs/FunctionDirichletBC.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"}>>> = inner_3
    function<<<{"description": "The forcing function."}>>> = soln_dispy_fn
  [../]
  [./disp_outer_1y]
    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"}>>> = outer_1
    value<<<{"description": "Value of the BC"}>>> = 0.0
  [../]
  [./disp_outer_2y]
    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"}>>> = outer_2
    value<<<{"description": "Value of the BC"}>>> = 0.0
  [../]
  [./disp_outer_3y]
    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"}>>> = outer_3
    value<<<{"description": "Value of the BC"}>>> = 0.0
  [../]
[]

[Materials<<<{"href": "../syntax/Materials/index.html"}>>>]
  [./linear]
    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
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 0
    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'
    shear_modulus<<<{"description": "Vector of shear modulus values that map one-to-one with the number 'layer_ids' parameter."}>>> = '1.7e9'
    density<<<{"description": "Vector of density values that map one-to-one with the number 'layer_ids' parameter."}>>> = '1700.0'
    poissons_ratio<<<{"description": "Vector of Poisson's ratio values that map one-to-one with the number 'layer_ids' parameter."}>>> = '0.3'
  [../]
  [./strain_1]
    type = ComputeSmallStrain<<<{"description": "Compute a small strain.", "href": "../source/materials/ComputeSmallStrain.html"}>>>
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '0'
    displacements<<<{"description": "The displacements appropriate for the simulation geometry and coordinate system"}>>> = 'disp_x disp_y'
  [../]

  [./stress_1]
    type = ComputeLinearElasticStress<<<{"description": "Compute stress using elasticity for small strains", "href": "../source/materials/ComputeLinearElasticStress.html"}>>>
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '0'
  [../]
[]

[Executioner<<<{"href": "../syntax/Executioner/index.html"}>>>]
  type = Transient
  solve_type = 'PJFNK'
  nl_abs_tol = 1e-8
  start_time = 0.0
  end_time = 1.0
  dt = 0.01
  timestep_tolerance = 1e-6
  petsc_options_iname = '-ksp_gmres_restart -pc_type -pc_hypre_type -pc_hypre_boomeramg_max_iter'
  petsc_options_value = '201                hypre     boomeramg      4'
  line_search = 'none'
[]

[Postprocessors<<<{"href": "../syntax/Postprocessors/index.html"}>>>]
  [./dt]
    type = TimestepSize<<<{"description": "Reports the timestep size", "href": "../source/postprocessors/TimestepSize.html"}>>>
  [../]
[]

[Outputs<<<{"href": "../syntax/Mastodon/Outputs/index.html"}>>>]
  file_base<<<{"description": "Common file base name to be utilized with all output objects"}>>> = output/DRM_layer_2d_outer_out
  exodus<<<{"description": "Output the results using the default settings for Exodus output."}>>> = true
  csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
(examples/ex07/fixed_outer.i)

The smaller model shown in Figure 1 (d) has three distinct sections, the region within the DRM layer, the DRM layer, and the region outside it. The region within the DRM layer is the region of interest. The region outside the DRM layer is added to remove any additional waves generated due to addition of new features (e.g., structure, local topography) to the smaller soil domain, which are absent in the larger soil domain. As mentioned above, for this demonstration, the region within the DRM layer is modeled to be exactly same as that in the larger soil domain. So, no additional waves would be generated in this demonstration. Therefore, the response of the region outside the DRM layer would be identically zero throughout the simulation. But absorbing boundary conditions are placed at the left, right and bottom boundaries of the smaller soil domain to absorb any waves that may be radiating out of this domain in a more general scenario. As in the two intermediate models discussed above, the SolutionUserObject and SolutionFunction are used to extract the reaction forces from the exodus files corresponding to the intermediate models, and these forces are applied at the corresponding DRM layer boundaries using the UserForcingFunctionNodalKernel object within the NodalKernels block. The input file for the smaller model is shown below.

[Mesh<<<{"href": "../syntax/Mesh/index.html"}>>>]
  [./generate]
    type = GeneratedMeshGenerator<<<{"description": "Create a line, square, or cube mesh with uniformly spaced or biased elements.", "href": "../source/meshgenerators/GeneratedMeshGenerator.html"}>>>
    dim<<<{"description": "The dimension of the mesh to be generated"}>>> = 2
    xmin<<<{"description": "Lower X Coordinate of the generated mesh"}>>> = 400.0
    xmax<<<{"description": "Upper X Coordinate of the generated mesh"}>>> = 600.0
    ymin<<<{"description": "Lower Y Coordinate of the generated mesh"}>>> = 400.0
    ymax<<<{"description": "Upper Y Coordinate of the generated mesh"}>>> = 500.0
    nx<<<{"description": "Number of elements in the X direction"}>>> = 20
    ny<<<{"description": "Number of elements in the Y direction"}>>> = 10
  [../]
  [./outer_1]
    type = ParsedAddSidesetGenerator
    input = generate
    combinatorial_geometry = 'x > 449.9 & x < 450.1 & y > 449.9'
    new_sideset_name = outer_1
    normal = '-1.0 0.0 0.0'
  [../]
  [./outer_2]
    type = ParsedAddSidesetGenerator
    input = outer_1
    combinatorial_geometry = 'x > 459.1 & x < 541.0 & y > 449.9 & y < 450.1'
    new_sideset_name = outer_2
    normal = '0.0 -1.0 0.0'
  [../]
  [./outer_3]
    type = ParsedAddSidesetGenerator
    input = outer_2
    combinatorial_geometry = 'x > 549.1 & x < 550.1 & y > 449.9'
    new_sideset_name = outer_3
    normal = '1.0 0.0 0.0'
  [../]
  [./inner_1]
    type = ParsedAddSidesetGenerator
    input = outer_3
    combinatorial_geometry = 'x > 459.9 & x < 460.1 & y > 459.9'
    new_sideset_name = inner_1
    normal = '1.0 0.0 0.0'
  [../]
  [./inner_2]
    type = ParsedAddSidesetGenerator
    input = inner_1
    combinatorial_geometry = 'x > 469.1 & x < 530.1 & y > 459.9 & y < 460.1'
    new_sideset_name = inner_2
    normal = '0.0 1.0 0.0'
  [../]
  [./inner_3]
    type = ParsedAddSidesetGenerator
    input = inner_2
    combinatorial_geometry = 'x > 539.9 & x < 540.1 & y > 459.9'
    new_sideset_name = inner_3
    normal = '-1.0 0.0 0.0'
  [../]
[]

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

[AuxVariables<<<{"href": "../syntax/AuxVariables/index.html"}>>>]
  [./vel_x]
  [../]
  [./accel_x]
  [../]
  [./vel_y]
  [../]
  [./accel_y]
  [../]
  [./layer]
  [../]
  [./resid_x]
  [../]
  [./resid_y]
  [../]
[]

[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"}>>> = 0
    save_in<<<{"description": "The displacement residuals"}>>> = 'resid_x resid_y'
    stiffness_damping_coefficient<<<{"description": "Name of material property or a constant real number defining stiffness Rayleigh parameter (zeta)."}>>> = 0.00006366
  [../]
  [./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
    save_in<<<{"description": "The name of auxiliary variables to save this Kernel's residual contributions to.  Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)"}>>> = resid_x
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 0
    eta<<<{"description": "Name of material property or a constant real number defining the eta parameter for the Rayleigh damping."}>>> = 7.854
  [../]
  [./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
    save_in<<<{"description": "The name of auxiliary variables to save this Kernel's residual contributions to.  Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)"}>>> = resid_y
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 0
    eta<<<{"description": "Name of material property or a constant real number defining the eta parameter for the Rayleigh damping."}>>> = 7.854
  [../]
[]

[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"}>>>
     interfaces<<<{"description": "A list of layer interface locations to apply across the domain in the specified direction."}>>> = '550.0'
     direction<<<{"description": "The direction to apply layering."}>>> = '0 1 0'
     variable<<<{"description": "The name of the variable that this object applies to"}>>> = layer
     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
  [../]
[]

[UserObjects<<<{"href": "../syntax/UserObjects/index.html"}>>>]
   [./solution_uo_outer_react_x]
     type = SolutionUserObject<<<{"description": "Reads a variable from a mesh in one simulation to another", "href": "../source/userobjects/SolutionUserObject.html"}>>>
     mesh<<<{"description": "The name of the mesh file (must be xda/xdr or exodusII file)."}>>> = output/DRM_layer_2d_outer_out.e
     system_variables<<<{"description": "The name of the nodal and elemental variables from the file you want to use for values"}>>> = resid_x
   [../]
   [./solution_uo_outer_react_y]
     type = SolutionUserObject<<<{"description": "Reads a variable from a mesh in one simulation to another", "href": "../source/userobjects/SolutionUserObject.html"}>>>
     mesh<<<{"description": "The name of the mesh file (must be xda/xdr or exodusII file)."}>>> = output/DRM_layer_2d_outer_out.e
     system_variables<<<{"description": "The name of the nodal and elemental variables from the file you want to use for values"}>>> = resid_y
   [../]
   [./solution_uo_inner_react_x]
     type = SolutionUserObject<<<{"description": "Reads a variable from a mesh in one simulation to another", "href": "../source/userobjects/SolutionUserObject.html"}>>>
     mesh<<<{"description": "The name of the mesh file (must be xda/xdr or exodusII file)."}>>> = output/DRM_layer_2d_inner_out.e
     system_variables<<<{"description": "The name of the nodal and elemental variables from the file you want to use for values"}>>> = resid_x
   [../]
   [./solution_uo_inner_react_y]
     type = SolutionUserObject<<<{"description": "Reads a variable from a mesh in one simulation to another", "href": "../source/userobjects/SolutionUserObject.html"}>>>
     mesh<<<{"description": "The name of the mesh file (must be xda/xdr or exodusII file)."}>>> = output/DRM_layer_2d_inner_out.e
     system_variables<<<{"description": "The name of the nodal and elemental variables from the file you want to use for values"}>>> = resid_y
   [../]
[]

[Functions<<<{"href": "../syntax/Functions/index.html"}>>>]
   [./react_x_outer_fn]
     type = SolutionFunction<<<{"description": "Function for reading a solution from file.", "href": "../source/functions/SolutionFunction.html"}>>>
     solution<<<{"description": "The SolutionUserObject to extract data from."}>>> = solution_uo_outer_react_x
   [../]
   [./react_y_outer_fn]
     type = SolutionFunction<<<{"description": "Function for reading a solution from file.", "href": "../source/functions/SolutionFunction.html"}>>>
     solution<<<{"description": "The SolutionUserObject to extract data from."}>>> = solution_uo_outer_react_y
   [../]
   [./react_x_inner_fn]
     type = SolutionFunction<<<{"description": "Function for reading a solution from file.", "href": "../source/functions/SolutionFunction.html"}>>>
     solution<<<{"description": "The SolutionUserObject to extract data from."}>>> = solution_uo_inner_react_x
   [../]
   [./react_y_inner_fn]
     type = SolutionFunction<<<{"description": "Function for reading a solution from file.", "href": "../source/functions/SolutionFunction.html"}>>>
     solution<<<{"description": "The SolutionUserObject to extract data from."}>>> = solution_uo_inner_react_y
   [../]
[]

[NodalKernels<<<{"href": "../syntax/NodalKernels/index.html"}>>>]
  [./xforce_inner_1]
    type = UserForcingFunctionNodalKernel<<<{"description": "Residual contribution to an ODE from a source function acting at nodes.", "href": "../source/nodalkernels/UserForcingFunctionNodalKernel.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    function<<<{"description": "The forcing function"}>>> = react_x_inner_fn
    boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = inner_1
  [../]
  [./xforce_inner_2]
    type = UserForcingFunctionNodalKernel<<<{"description": "Residual contribution to an ODE from a source function acting at nodes.", "href": "../source/nodalkernels/UserForcingFunctionNodalKernel.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    function<<<{"description": "The forcing function"}>>> = react_x_inner_fn
    boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = inner_2
  [../]
  [./xforce_inner_3]
    type = UserForcingFunctionNodalKernel<<<{"description": "Residual contribution to an ODE from a source function acting at nodes.", "href": "../source/nodalkernels/UserForcingFunctionNodalKernel.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    function<<<{"description": "The forcing function"}>>> = react_x_inner_fn
    boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = inner_3
  [../]
  [./yforce_inner_1]
    type = UserForcingFunctionNodalKernel<<<{"description": "Residual contribution to an ODE from a source function acting at nodes.", "href": "../source/nodalkernels/UserForcingFunctionNodalKernel.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
    function<<<{"description": "The forcing function"}>>> = react_y_inner_fn
    boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = inner_1
  [../]
  [./yforce_inner_2]
    type = UserForcingFunctionNodalKernel<<<{"description": "Residual contribution to an ODE from a source function acting at nodes.", "href": "../source/nodalkernels/UserForcingFunctionNodalKernel.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
    function<<<{"description": "The forcing function"}>>> = react_y_inner_fn
    boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = inner_2
  [../]
  [./yforce_inner_3]
    type = UserForcingFunctionNodalKernel<<<{"description": "Residual contribution to an ODE from a source function acting at nodes.", "href": "../source/nodalkernels/UserForcingFunctionNodalKernel.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
    function<<<{"description": "The forcing function"}>>> = react_y_inner_fn
    boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = inner_3
  [../]
  [./xforce_outer_1]
    type = UserForcingFunctionNodalKernel<<<{"description": "Residual contribution to an ODE from a source function acting at nodes.", "href": "../source/nodalkernels/UserForcingFunctionNodalKernel.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    function<<<{"description": "The forcing function"}>>> = react_x_outer_fn
    boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = outer_1
  [../]
  [./xforce_outer_2]
    type = UserForcingFunctionNodalKernel<<<{"description": "Residual contribution to an ODE from a source function acting at nodes.", "href": "../source/nodalkernels/UserForcingFunctionNodalKernel.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    function<<<{"description": "The forcing function"}>>> = react_x_outer_fn
    boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = outer_2
  [../]
  [./xforce_outer_3]
    type = UserForcingFunctionNodalKernel<<<{"description": "Residual contribution to an ODE from a source function acting at nodes.", "href": "../source/nodalkernels/UserForcingFunctionNodalKernel.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    function<<<{"description": "The forcing function"}>>> = react_x_outer_fn
    boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = outer_3
  [../]
  [./yforce_outer_1]
    type = UserForcingFunctionNodalKernel<<<{"description": "Residual contribution to an ODE from a source function acting at nodes.", "href": "../source/nodalkernels/UserForcingFunctionNodalKernel.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
    function<<<{"description": "The forcing function"}>>> = react_y_outer_fn
    boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = outer_1
  [../]
  [./yforce_outer_2]
    type = UserForcingFunctionNodalKernel<<<{"description": "Residual contribution to an ODE from a source function acting at nodes.", "href": "../source/nodalkernels/UserForcingFunctionNodalKernel.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
    function<<<{"description": "The forcing function"}>>> = react_y_outer_fn
    boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = outer_2
  [../]
  [./yforce_outer_3]
    type = UserForcingFunctionNodalKernel<<<{"description": "Residual contribution to an ODE from a source function acting at nodes.", "href": "../source/nodalkernels/UserForcingFunctionNodalKernel.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
    function<<<{"description": "The forcing function"}>>> = react_y_outer_fn
    boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = outer_3
  [../]
[]

[BCs<<<{"href": "../syntax/BCs/index.html"}>>>]
[./NonReflectingBC<<<{"href": "../syntax/BCs/NonReflectingBC/index.html"}>>>]
   [./back]
     displacements<<<{"description": "The vector of displacement variables. The size of this vector must be same as the number of dimensions."}>>> = 'disp_x disp_y'
     velocities<<<{"description": "The vector of velocity variables that are coupled to the displacement variables. The size of this vector must be same as that of displacements."}>>> = 'vel_x vel_y'
     accelerations<<<{"description": "The vector of acceleration variables that are coupled to the displacement variables. The size of this vector must be same as that of displacements."}>>> = 'accel_x accel_y'
     beta<<<{"description": "The beta parameter for Newmark time integration."}>>> = 0.25
     gamma<<<{"description": "The gamma parameter for Newmark time integration."}>>> = 0.5
     boundary<<<{"description": "The list of boundary IDs from the mesh where this boundary condition will be applied"}>>> = 'left right bottom'
     shear_wave_speed<<<{"description": "shear wave speed of the material."}>>> = 1000.0
     density<<<{"description": "Density of the material."}>>> = 1700.0
     p_wave_speed<<<{"description": "P-wave speed of the material."}>>>=1870.829
   [../]
 [../]
[]

[Materials<<<{"href": "../syntax/Materials/index.html"}>>>]
  [./linear]
    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
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 0
    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'
    shear_modulus<<<{"description": "Vector of shear modulus values that map one-to-one with the number 'layer_ids' parameter."}>>> = '1.7e9'
    density<<<{"description": "Vector of density values that map one-to-one with the number 'layer_ids' parameter."}>>> = '1700.0'
    poissons_ratio<<<{"description": "Vector of Poisson's ratio values that map one-to-one with the number 'layer_ids' parameter."}>>> = '0.3'
  [../]
  [./strain_1]
    type = ComputeSmallStrain<<<{"description": "Compute a small strain.", "href": "../source/materials/ComputeSmallStrain.html"}>>>
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '0'
    displacements<<<{"description": "The displacements appropriate for the simulation geometry and coordinate system"}>>> = 'disp_x disp_y'
  [../]

  [./stress_1]
    type = ComputeLinearElasticStress<<<{"description": "Compute stress using elasticity for small strains", "href": "../source/materials/ComputeLinearElasticStress.html"}>>>
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = '0'
  [../]
[]

[Executioner<<<{"href": "../syntax/Executioner/index.html"}>>>]
  type = Transient
  solve_type = 'PJFNK'
  nl_abs_tol = 1e-8
  start_time = 0.0
  end_time = 1.0
  dt = 0.01
  timestep_tolerance = 1e-6
  petsc_options_iname = '-ksp_gmres_restart -pc_type -pc_hypre_type -pc_hypre_boomeramg_max_iter'
  petsc_options_value = '201                hypre     boomeramg      4'
  line_search = 'none'
[]

[Postprocessors<<<{"href": "../syntax/Postprocessors/index.html"}>>>]
  [./dt]
    type = TimestepSize<<<{"description": "Reports the timestep size", "href": "../source/postprocessors/TimestepSize.html"}>>>
  [../]
  [./node_x_50]
    type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../source/postprocessors/PointValue.html"}>>>
    point<<<{"description": "The physical point where the solution will be evaluated."}>>> = '500.0 500.0 0.0'
    variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = vel_x
  [../]
  [./node_y_50]
    type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../source/postprocessors/PointValue.html"}>>>
    point<<<{"description": "The physical point where the solution will be evaluated."}>>> = '500.0 500.0 0.0'
    variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = vel_y
  [../]
[]

[Outputs<<<{"href": "../syntax/Mastodon/Outputs/index.html"}>>>]
  file_base<<<{"description": "Common file base name to be utilized with all output objects"}>>> = output/small_model_out
  exodus<<<{"description": "Output the results using the default settings for Exodus output."}>>> = true
  csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
(examples/ex07/small_model.i)

Results

As expected for a horizontal fault rupture, the waves resulting from the central portion of the fault form a vertically propagating wavefront. The shear wavefront generated in this scenario is presented in the left panel of Figure 2. This results in the region directly above the fault having nearly zero vertical velocity.

Next, to confirm that DRM is working as expected, the horizontal velocity time histories at (X = 500 m, Y = 500 m) from both the large and smaller model are plotted in the right panel of Figure 2. Since the region within the DRM layer has the exact same properties in both the larger and smaller soil domains, the velocities at any point within this region have to match exactly between the large the small models. As seen from the right panel of Figure 2, the velocities from both models are identical as expected.

Figure 2: The left panel presents a snapshot showing the vertical propagation of shear wavefront in the larger model. The contours in this figure represent the magnitude of velocity and the white line represents the earthquake fault. The right panel presents a comparison between velocity time histories at a point from the large and small models.

Examples of problems that have been solved using DRM in MASTODON can be found in Veeraraghavan et al. (2017) and Veeraraghavan and Coleman (2019).

References

  1. J. Bielak, K. Loukakis, Y. Hisada, and C. Yoshimura. Domain reduction method for three-dimensional earthquake modeling in localized regions, Part I: Theory. Bulletin of the Seismological Society of America, 93(2):817–824, 2003.[BibTeX]
  2. S. Veeraraghavan, J. Bielak, and J. Coleman. Effect of inclined waves on deeply embedded nuclear facilities. Transactions, 24th International Conference on Structural Mechanics in Reactor Technology (SMiRT 24), Busan, South Korea, August 2017, 2017.[BibTeX]
  3. S. Veeraraghavan and J. Coleman. Effect of non-vertically propagating earthquake waves and nonlinear soil-structure interaction on nuclear facility response. Transactions, 25th International Conference on Structural Mechanics in Reactor Technology (SMiRT 25), Charlotte, North Carolina, August 2019, 2019.[BibTeX]