Ground motion simulation with application to Monte Carlo analysis of FSI

Problem Statement

The goal is to stochastically simulate ground motions using Magintude (M), Distance (R), and Shear Wave Velocity (Vs30). Other input parameters that cannot currently be generated stochastically are Distance Type (Joyner-Boore or Epicentral) and Style of Faulting (Strike-Slip, Thrust Fault, Normal Fault). This example is a model of a cylindrical tank filled with fluid and will utilize Monte Carlo Sampling from the Stochastic Tools Module in MOOSE and the Fluid-Structure Interaction Module for the solve.

Figure 1: Schematic of the Tank and its dimensions.

GroundMotionSim Function

The GroundMotionSim Function object in MASTODON takes simple geophysical inputs and generates realistic ground motions that can then be applied to the model. Listing 1 below shows an example function block with inputs. The function is defined by 6 inputs, 3 of which can be stochastically generated. The stochastically compatible inputs are Magnitude (M), Distance (R), and Shear Wave Velocity at a depth of 30m (Vs30). The remaining two variables, are Style of Faulting (F), Distance type (R_type) and random seed (n). There are 3 distinct fault types that can be used in this function: Strike-Slip, Thrust Fault, and Normal Fault denoted as 'SS','TF', and 'NF', respectively, with the default being 'SS'. R_type indicates whether the distance provided in R is Joyner-Boore Distance or Epicentral Distance, denoted as 'Rjb' (default) or 'Repi'. The n variable is a random seed used to ensure consistent ground motions with the same set of input parameters. Part of how the function generates the ground motions uses randomly generated phase angles, so the same set of input parameters can yield slightly different ground motions if the seed is not set, although the frequency domains are equivalent. A generated ground motion based on the set of inputs in Listing 1 are shown in Figure 2.

Listing 1:

[Functions<<<{"href": "../syntax/Functions/index.html"}>>>]
  [groundmotion]
    type = GroundMotionSim<<<{"description": "Calculates a ground acceleration history using a ground motion model written in a python script", "href": "../source/functions/GroundMotionSim.html"}>>>
    M<<<{"description": "Magnitude of Event"}>>> = 7.1
    R<<<{"description": "Joyner-Boore or Epicentral Distance"}>>> = 10
    Vs30<<<{"description": "Shear Wave Velocity at 30m"}>>> = 300
    n<<<{"description": "Random Seed"}>>> = 0
  []
[]
(test/tests/functions/ground_motion_sim/ground_motion_sim.i)

Figure 2: Time series of a sample ground motion

Application using Monte Carlo Simulation

Now that we have a basic understanding of the function, we can stochastically generate ground motions and use these motions for seismic uncertainty quantification. The variables M, R, and Vs30 will be generated from normal distributions, using 20 samples. We will use Strike-Slip ('SS') for the Style of Faulting (F), Joyner-Boore Distance ('Rjb') for R_type and use random seed (n) 0. The input variable distributions from the generated samples are shown in Figure 5,Figure 6, and Figure 7. The quanitites of interest will be the Peak Pressure, Peak Wave Height, and Peak Acceleration (at bottom of tank). We can show how the changes in our input parameters affect these quanities.

[StochasticTools<<<{"href": "../syntax/StochasticTools/index.html"}>>>]
[]

[Distributions<<<{"href": "../syntax/Distributions/index.html"}>>>]
  [M_uniform]
    type = Normal<<<{"description": "Normal distribution", "href": "../source/distributions/Normal.html"}>>>
    mean<<<{"description": "Mean (or expectation) of the distribution."}>>> = 4
    standard_deviation<<<{"description": "Standard deviation of the distribution "}>>> = 1
  []
  [R_uniform]
    type = Normal<<<{"description": "Normal distribution", "href": "../source/distributions/Normal.html"}>>>
    mean<<<{"description": "Mean (or expectation) of the distribution."}>>> = 25
    standard_deviation<<<{"description": "Standard deviation of the distribution "}>>> = 5.5
  []
  [V_uniform]
    type = Normal<<<{"description": "Normal distribution", "href": "../source/distributions/Normal.html"}>>>
    mean<<<{"description": "Mean (or expectation) of the distribution."}>>> = 475
    standard_deviation<<<{"description": "Standard deviation of the distribution "}>>> = 65
  []
[]

[Samplers<<<{"href": "../syntax/Samplers/index.html"}>>>]
  [sample]
    type = MonteCarlo<<<{"description": "Monte Carlo Sampler.", "href": "../source/samplers/MonteCarloSampler.html"}>>>
    num_rows<<<{"description": "The number of rows per matrix to generate."}>>> = 20
    distributions<<<{"description": "The distribution names to be sampled, the number of distributions provided defines the number of columns per matrix."}>>> = 'M_uniform R_uniform V_uniform'
    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."}>>> = PRE_MULTIAPP_SETUP
  []
[]

[MultiApps<<<{"href": "../syntax/MultiApps/index.html"}>>>]
  [runner]
    type = SamplerFullSolveMultiApp<<<{"description": "Creates a full-solve type sub-application for each row of each Sampler matrix.", "href": "../source/multiapps/SamplerFullSolveMultiApp.html"}>>>
    input_files<<<{"description": "The input file for each App.  If this parameter only contains one input file it will be used for all of the Apps.  When using 'positions_from_file' it is also admissable to provide one input_file per file."}>>> = 'TankUQ_mod.i'
    sampler<<<{"description": "The Sampler object to utilize for creating MultiApps."}>>> = sample
    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_BEGIN'
    mode<<<{"description": "The operation mode, 'normal' creates one sub-application for each row in the Sampler and 'batch-reset' and 'batch-restore' creates N sub-applications, where N is the minimum of 'num_rows' in the Sampler and floor(number of processes / min_procs_per_app). To run the rows in the Sampler, 'batch-reset' will destroy and re-create sub-apps as needed, whereas the 'batch-restore' will backup and restore sub-apps to the initial state prior to execution, without destruction."}>>> = batch-reset
  []
[]

[Transfers<<<{"href": "../syntax/Transfers/index.html"}>>>]
  [results]
    type = SamplerReporterTransfer<<<{"description": "Transfers data from Reporters on the sub-application to a StochasticReporter on the main application.", "href": "../source/transfers/SamplerReporterTransfer.html"}>>>
    from_multi_app<<<{"description": "The name of the MultiApp to receive data from"}>>> = runner
    sampler<<<{"description": "A the Sampler object that Transfer is associated.."}>>> = sample
    stochastic_reporter<<<{"description": "The name of the StochasticReporter object to transfer values to."}>>> = results
    from_reporter<<<{"description": "The name(s) of the Reporter(s) on the sub-app to transfer from."}>>> = 'PeakPressure/value PeakWaveHeight/value PeakAcc/value PeakDisp/value'
  []
[]

[Controls<<<{"href": "../syntax/Controls/index.html"}>>>]
  [cmdline]
    type = MultiAppSamplerControl<<<{"description": "Control for modifying the command line arguments of MultiApps.", "href": "../source/controls/MultiAppSamplerControl.html"}>>>
    multi_app<<<{"description": "The name of the MultiApp to control."}>>> = runner
    sampler<<<{"description": "The Sampler object to utilize for altering the command line options of the MultiApp."}>>> = sample
    param_names<<<{"description": "The names of the command line parameters to set via the sampled data."}>>> = 'Functions/groundmotion/M Functions/groundmotion/R Functions/groundmotion/Vs30'
  []
[]

[Reporters<<<{"href": "../syntax/Reporters/index.html"}>>>]
  [results]
    type = StochasticReporter<<<{"description": "Storage container for stochastic simulation results coming from Reporters.", "href": "../source/reporters/StochasticReporter.html"}>>>
    parallel_type<<<{"description": "This parameter will determine how the stochastic data is gathered. It is common for outputting purposes that this parameter be set to ROOT, otherwise, many files will be produced showing the values on each processor. However, if there are lot of samples, gathering on root may be memory restrictive."}>>> = ROOT
  []
[]

[VectorPostprocessors<<<{"href": "../syntax/VectorPostprocessors/index.html"}>>>]
  [data]
    type = SamplerData<<<{"description": "Tool for extracting Sampler object data and storing in VectorPostprocessor vectors.", "href": "../source/vectorpostprocessors/SamplerData.html"}>>>
    sampler<<<{"description": "The sample from which to extract distribution data."}>>> = sample
    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'
  []
[]

[Executioner<<<{"href": "../syntax/Executioner/index.html"}>>>]
  type = Steady
[]

[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
  [out]
    type = JSON<<<{"description": "Output for Reporter values using JSON format.", "href": "../source/outputs/JSONOutput.html"}>>>
  []
[]
(examples/ex15/monte_carlo.i)
[Mesh<<<{"href": "../syntax/Mesh/index.html"}>>>]
  [file]
    type = FileMeshGenerator<<<{"description": "Read a mesh from a file.", "href": "../source/meshgenerators/FileMeshGenerator.html"}>>>
    file<<<{"description": "The filename to read."}>>> = Vessel_NoIsolator_Coarse.e
  []
  [interface1]
    type = SideSetsBetweenSubdomainsGenerator<<<{"description": "MeshGenerator that creates a sideset composed of the nodes located between two or more subdomains.", "href": "../source/meshgenerators/SideSetsBetweenSubdomainsGenerator.html"}>>>
    input<<<{"description": "The mesh we want to modify"}>>> = file
    primary_block<<<{"description": "The primary set of blocks for which to draw a sideset between"}>>> = '2'
    paired_block<<<{"description": "The paired set of blocks for which to draw a sideset between"}>>> = '1'
    new_boundary<<<{"description": "The list of boundary names to create on the supplied subdomain"}>>> = 'Interface'
  []
[]

[GlobalParams<<<{"href": "../syntax/GlobalParams/index.html"}>>>]
[]

[Variables<<<{"href": "../syntax/Variables/index.html"}>>>]
  [p]
   block = 2
  []
  [disp_x]
    block = 1
  []
  [disp_y]
    block = 1
  []
  [disp_z]
    block = 1
  []
[]

[AuxVariables<<<{"href": "../syntax/AuxVariables/index.html"}>>>]
  [Wave1]
    block = 2
  []
  [vel_x]
    order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = FIRST
    family<<<{"description": "Specifies the family of FE shape functions to use for this variable"}>>> = LAGRANGE
    block = 1
  []
  [accel_x]
    order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = FIRST
    family<<<{"description": "Specifies the family of FE shape functions to use for this variable"}>>> = LAGRANGE
    block = 1
  []
  [vel_y]
    order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = FIRST
    family<<<{"description": "Specifies the family of FE shape functions to use for this variable"}>>> = LAGRANGE
    block = 1
  []
  [accel_y]
    order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = FIRST
    family<<<{"description": "Specifies the family of FE shape functions to use for this variable"}>>> = LAGRANGE
    block = 1
  []
  [vel_z]
    order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = FIRST
    family<<<{"description": "Specifies the family of FE shape functions to use for this variable"}>>> = LAGRANGE
    block = 1
  []
  [accel_z]
    order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = FIRST
    family<<<{"description": "Specifies the family of FE shape functions to use for this variable"}>>> = LAGRANGE
    block = 1
  []
  [stress_xx]
    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
    block = 1
  []
  [stress_yy]
    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
    block = 1
  []
  [stress_xy]
    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
    block = 1
  []
  [stress_zz]
    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
    block = 1
  []
  [stress_yz]
    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
    block = 1
  []
  [stress_xz]
    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
    block = 1
  []
[]

[Kernels<<<{"href": "../syntax/Kernels/index.html"}>>>]
  [diffusion]
    type = Diffusion<<<{"description": "The Laplacian operator ($-\\nabla \\cdot \\nabla u$), with the weak form of $(\\nabla \\phi_i, \\nabla u_h)$.", "href": "../source/kernels/Diffusion.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = 'p'
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
  []
  [inertia]
    type = AcousticInertia<<<{"description": "Calculates the residual for the inertial force which is the double time derivative of pressure.", "href": "../source/kernels/AcousticInertia.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = p
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
  []
  [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
  []
  [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
    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
    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
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
  []
[]

[AuxKernels<<<{"href": "../syntax/AuxKernels/index.html"}>>>]
  [waves]
    type = WaveHeightAuxKernel<<<{"description": "Calculates the wave heights given pressures.", "href": "../source/auxkernels/WaveHeightAuxKernel.html"}>>>
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = 'Wave1'
    pressure<<<{"description": "pressure variable"}>>> = p
    density<<<{"description": "fluid density"}>>> = 1e-6
    gravity<<<{"description": "acceleration due to gravity"}>>> = 9.81
    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"}>>> = 2
  []
  [accel_x]
    type = TestNewmarkTI<<<{"description": "Assigns the velocity/acceleration calculated by time integrator to the velocity/acceleration auxvariable.", "href": "../source/auxkernels/TestNewmarkTI.html"}>>>
    displacement<<<{"description": "The variable whose first/second derivative needs to be copied to the provided auxvariable."}>>> = disp_x
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = accel_x
    first<<<{"description": "Set to true to copy the first derivative to the auxvariable. If false, the second derivative is copied."}>>> = false
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
  []
  [vel_x]
    type = TestNewmarkTI<<<{"description": "Assigns the velocity/acceleration calculated by time integrator to the velocity/acceleration auxvariable.", "href": "../source/auxkernels/TestNewmarkTI.html"}>>>
    displacement<<<{"description": "The variable whose first/second derivative needs to be copied to the provided auxvariable."}>>> = disp_x
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = vel_x
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
  []
  [accel_y]
    type = TestNewmarkTI<<<{"description": "Assigns the velocity/acceleration calculated by time integrator to the velocity/acceleration auxvariable.", "href": "../source/auxkernels/TestNewmarkTI.html"}>>>
    displacement<<<{"description": "The variable whose first/second derivative needs to be copied to the provided auxvariable."}>>> = disp_y
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = accel_y
    first<<<{"description": "Set to true to copy the first derivative to the auxvariable. If false, the second derivative is copied."}>>> = false
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
  []
  [vel_y]
    type = TestNewmarkTI<<<{"description": "Assigns the velocity/acceleration calculated by time integrator to the velocity/acceleration auxvariable.", "href": "../source/auxkernels/TestNewmarkTI.html"}>>>
    displacement<<<{"description": "The variable whose first/second derivative needs to be copied to the provided auxvariable."}>>> = disp_y
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = vel_y
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
  []
  [accel_z]
    type = TestNewmarkTI<<<{"description": "Assigns the velocity/acceleration calculated by time integrator to the velocity/acceleration auxvariable.", "href": "../source/auxkernels/TestNewmarkTI.html"}>>>
    displacement<<<{"description": "The variable whose first/second derivative needs to be copied to the provided auxvariable."}>>> = disp_z
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = accel_z
    first<<<{"description": "Set to true to copy the first derivative to the auxvariable. If false, the second derivative is copied."}>>> = false
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
  []
  [vel_z]
    type = TestNewmarkTI<<<{"description": "Assigns the velocity/acceleration calculated by time integrator to the velocity/acceleration auxvariable.", "href": "../source/auxkernels/TestNewmarkTI.html"}>>>
    displacement<<<{"description": "The variable whose first/second derivative needs to be copied to the provided auxvariable."}>>> = disp_z
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = vel_z
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
  []
  [stress_xx]
    type = RankTwoAux<<<{"description": "Access a component of a RankTwoTensor", "href": "../source/auxkernels/RankTwoAux.html"}>>>
    rank_two_tensor<<<{"description": "The rank two material tensor name"}>>> = stress
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = stress_xx
    index_i<<<{"description": "The index i of ij for the tensor to output (0, 1, 2)"}>>> = 0
    index_j<<<{"description": "The index j of ij for the tensor to output (0, 1, 2)"}>>> = 0
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
  []
  [stress_yy]
    type = RankTwoAux<<<{"description": "Access a component of a RankTwoTensor", "href": "../source/auxkernels/RankTwoAux.html"}>>>
    rank_two_tensor<<<{"description": "The rank two material tensor name"}>>> = stress
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = stress_yy
    index_i<<<{"description": "The index i of ij for the tensor to output (0, 1, 2)"}>>> = 1
    index_j<<<{"description": "The index j of ij for the tensor to output (0, 1, 2)"}>>> = 1
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
  []
  [stress_xy]
    type = RankTwoAux<<<{"description": "Access a component of a RankTwoTensor", "href": "../source/auxkernels/RankTwoAux.html"}>>>
    rank_two_tensor<<<{"description": "The rank two material tensor name"}>>> = stress
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = stress_xy
    index_i<<<{"description": "The index i of ij for the tensor to output (0, 1, 2)"}>>> = 0
    index_j<<<{"description": "The index j of ij for the tensor to output (0, 1, 2)"}>>> = 1
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
  []
  [stress_zz]
    type = RankTwoAux<<<{"description": "Access a component of a RankTwoTensor", "href": "../source/auxkernels/RankTwoAux.html"}>>>
    rank_two_tensor<<<{"description": "The rank two material tensor name"}>>> = stress
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = stress_zz
    index_i<<<{"description": "The index i of ij for the tensor to output (0, 1, 2)"}>>> = 2
    index_j<<<{"description": "The index j of ij for the tensor to output (0, 1, 2)"}>>> = 2
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
  []
  [stress_yz]
    type = RankTwoAux<<<{"description": "Access a component of a RankTwoTensor", "href": "../source/auxkernels/RankTwoAux.html"}>>>
    rank_two_tensor<<<{"description": "The rank two material tensor name"}>>> = stress
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = stress_yz
    index_i<<<{"description": "The index i of ij for the tensor to output (0, 1, 2)"}>>> = 1
    index_j<<<{"description": "The index j of ij for the tensor to output (0, 1, 2)"}>>> = 2
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
  []
  [stress_xz]
    type = RankTwoAux<<<{"description": "Access a component of a RankTwoTensor", "href": "../source/auxkernels/RankTwoAux.html"}>>>
    rank_two_tensor<<<{"description": "The rank two material tensor name"}>>> = stress
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = stress_xz
    index_i<<<{"description": "The index i of ij for the tensor to output (0, 1, 2)"}>>> = 0
    index_j<<<{"description": "The index j of ij for the tensor to output (0, 1, 2)"}>>> = 2
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
  []
[]

[InterfaceKernels<<<{"href": "../syntax/InterfaceKernels/index.html"}>>>]
  [interface1]
    type = StructureAcousticInterface<<<{"description": "Enforces displacement and stress/pressure continuity between the fluid and structural domains. Element is always the structure and neighbor is always the fluid.", "href": "../source/interfacekernels/StructureAcousticInterface.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = p
    neighbor_var<<<{"description": "The variable on the other side of the interface."}>>> = disp_x
    boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = 'Interface'
    D<<<{"description": "Fluid density."}>>> = 1e-6
    component<<<{"description": "The desired component of displacement."}>>> = 0
  []
  [interface2]
    type = StructureAcousticInterface<<<{"description": "Enforces displacement and stress/pressure continuity between the fluid and structural domains. Element is always the structure and neighbor is always the fluid.", "href": "../source/interfacekernels/StructureAcousticInterface.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = p
    neighbor_var<<<{"description": "The variable on the other side of the interface."}>>> = disp_y
    boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = 'Interface'
    D<<<{"description": "Fluid density."}>>> = 1e-6
    component<<<{"description": "The desired component of displacement."}>>> = 1
  []
  [interface3]
    type = StructureAcousticInterface<<<{"description": "Enforces displacement and stress/pressure continuity between the fluid and structural domains. Element is always the structure and neighbor is always the fluid.", "href": "../source/interfacekernels/StructureAcousticInterface.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = p
    neighbor_var<<<{"description": "The variable on the other side of the interface."}>>> = disp_z
    boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = 'Interface'
    D<<<{"description": "Fluid density."}>>> = 1e-6
    component<<<{"description": "The desired component of displacement."}>>> = 2
  []
[]

[BCs<<<{"href": "../syntax/BCs/index.html"}>>>]
  [top_accel1]
    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."}>>> = groundmotion
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'Top'
  []
  [disp_x2]
    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"}>>> = 'Top'
    value<<<{"description": "Value of the BC"}>>> = 0.0
  []
  [disp_x3]
    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"}>>> = 'Top'
    value<<<{"description": "Value of the BC"}>>> = 0.0
  []
  [free]
    type = FluidFreeSurfaceBC<<<{"description": "Applies a mixed Dirichlet-Neumann BC on the fluid surface.", "href": "../source/bcs/FluidFreeSurfaceBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = p
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'Fluid_top'
    alpha<<<{"description": "Inverse of the acceleration due to gravity."}>>> = '0.1'
  []
[]

[Functions<<<{"href": "../syntax/Functions/index.html"}>>>]
  [groundmotion]
    type = GroundMotionSim<<<{"description": "Calculates a ground acceleration history using a ground motion model written in a python script", "href": "../source/functions/GroundMotionSim.html"}>>>
    M<<<{"description": "Magnitude of Event"}>>> = 0
    R<<<{"description": "Joyner-Boore or Epicentral Distance"}>>> = 0
    Vs30<<<{"description": "Shear Wave Velocity at 30m"}>>> = 0
    F<<<{"description": "Style of Faulting"}>>> = 'SS'
    n<<<{"description": "Random Seed"}>>> = 0
    execute_on = INITIAL
  []
[]

[Materials<<<{"href": "../syntax/Materials/index.html"}>>>]
  [density]
    type = GenericConstantMaterial<<<{"description": "Declares material properties based on names and values prescribed by input parameters.", "href": "../source/materials/GenericConstantMaterial.html"}>>>
    prop_names<<<{"description": "The names of the properties this material will have"}>>> = inv_co_sq
    prop_values<<<{"description": "The values associated with the named properties"}>>> = 4.65e-7
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 2
  []
  [density0]
    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"}>>> = 7.85e-6
  []
  [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."}>>> = 2e2
    poissons_ratio<<<{"description": "Poisson's ratio for the material."}>>> = 0.27
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
  []
  [strain]
    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 disp_z'
  []
  [stress]
    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
  []
[]

[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_iname = '-pc_type -pc_factor_mat_solver_package'
  petsc_options_value = 'lu       superlu_dist'
  start_time = 0.0
  end_time = 10.0
  dt = 0.005
  dtmin = 0.001
  nl_abs_tol = 1e-14
  nl_rel_tol = 1e-14
  l_tol = 1e-14
  l_max_its = 25
  timestep_tolerance = 1e-8
  automatic_scaling = true
  [TimeIntegrator<<<{"href": "../syntax/Executioner/TimeIntegrator/index.html"}>>>]
    type = NewmarkBeta
  []
[]

[Controls<<<{"href": "../syntax/Controls/index.html"}>>>]
  [stochastic]
    type = SamplerReceiver<<<{"description": "Control for receiving data from a Sampler via SamplerParameterTransfer.", "href": "../source/controls/SamplerReceiver.html"}>>>
  []
[]

[Postprocessors<<<{"href": "../syntax/Postprocessors/index.html"}>>>]
  [PSide]
    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."}>>> = '2.412779 -0.425438 0.050000'
    variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = p
  []
  [Wave]
    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."}>>> = '2.450000 0.000000 5.050000'
    variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = Wave1
  []
  [DispBottom]
    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."}>>> = '2.462019 0.434120 0.000'
    variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = disp_x
  []
  [AccBottom]
    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."}>>> = '2.462019 0.434120 0.000'
    variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = accel_x
  []
  [PeakDisp]
    type = TimeExtremeValue<<<{"description": "A postprocessor for reporting the extreme value of another postprocessor over time.", "href": "../source/postprocessors/TimeExtremeValue.html"}>>>
    postprocessor<<<{"description": "The name of the postprocessor used for reporting time extreme values"}>>> = DispBottom
    output_type<<<{"description": "Output to return. 'extreme_value' returns the extreme_value. 'time' returns the time at which the extreme_value occurred."}>>> = extreme_value
  []
  [PeakAcc]
    type = TimeExtremeValue<<<{"description": "A postprocessor for reporting the extreme value of another postprocessor over time.", "href": "../source/postprocessors/TimeExtremeValue.html"}>>>
    postprocessor<<<{"description": "The name of the postprocessor used for reporting time extreme values"}>>> = AccBottom
    output_type<<<{"description": "Output to return. 'extreme_value' returns the extreme_value. 'time' returns the time at which the extreme_value occurred."}>>> = extreme_value
  []
  [PeakPressure]
    type = TimeExtremeValue<<<{"description": "A postprocessor for reporting the extreme value of another postprocessor over time.", "href": "../source/postprocessors/TimeExtremeValue.html"}>>>
    postprocessor<<<{"description": "The name of the postprocessor used for reporting time extreme values"}>>> = PSide
    output_type<<<{"description": "Output to return. 'extreme_value' returns the extreme_value. 'time' returns the time at which the extreme_value occurred."}>>> = extreme_value
  []
  [PeakWaveHeight]
    type = TimeExtremeValue<<<{"description": "A postprocessor for reporting the extreme value of another postprocessor over time.", "href": "../source/postprocessors/TimeExtremeValue.html"}>>>
    postprocessor<<<{"description": "The name of the postprocessor used for reporting time extreme values"}>>> = Wave
    output_type<<<{"description": "Output to return. 'extreme_value' returns the extreme_value. 'time' returns the time at which the extreme_value occurred."}>>> = extreme_value
  []
  [AppliedAcc]
     type = FunctionValuePostprocessor<<<{"description": "Computes the value of a supplied function at a single point (scalable)", "href": "../source/postprocessors/FunctionValuePostprocessor.html"}>>>
     function<<<{"description": "The function which supplies the postprocessor value."}>>> = groundmotion
  []

[]
[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."}>>> = '578'
    block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = 1
  []
  [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.005
    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"}>>>]
  [accout]
    type = CSV<<<{"description": "Output for postprocessors, vector postprocessors, and scalar variables using comma seperated values (CSV).", "href": "../source/outputs/CSV.html"}>>>
    show<<<{"description": "A list of the variables and postprocessors that should be output to the Exodus file (may include Variables, ScalarVariables, and Postprocessor names)."}>>> = 'AppliedAcc PSide Wave DispBottom AccBottom'
  []
  [out]
    type = CSV<<<{"description": "Output for postprocessors, vector postprocessors, and scalar variables using comma seperated values (CSV).", "href": "../source/outputs/CSV.html"}>>>
    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
  []
[]
(examples/ex15/TankUQ_mod.i)

Figure 5: Input distribution of Magnitudes.

Figure 6: Input distribution of Distances.

Figure 7: Input distribution of Vs30.

Results: Sensitivity and Uncertainty

The pairplot in Figure 3 shown below shows the relationships between the input parameters and the responses. From this, we can see that higher magnitudes and shorter Rjb distances lead to higher responses, as expected.

Figure 3: Pairplot

The 3D plots show how the interactions of the input parameters are related to the responses

Figure 8: 3D Peak Acceleration plot

Figure 9: 3D Peak Displacement plot

Figure 10: 3D Peak Pressure plot

Figure 11: 3D Peak Wave Height plot

We can plot the Sample Indices against the response values to see how well the algorithm explored the sample space.

Figure 12: Peak Acc Sample Indices

Figure 13: Peak Disp Sample Indices

Figure 14: Peak Pressure Sample Indices

Figure 15: Peak Wave Height Sample Indices

We can also utilize the ResponseSpectraCalculator from the VectorPostprocessors to visualize the response spectra induced by the applied motion over all simulations. The spectra were recorded at the red circle in Figure 1.

Figure 4: Response Spectra