Example 12c: Experimental validation of fluid-structure interaction simulations

commentnote:Units of this example

Giga kilograms, Giga Newtons, meters, and seconds were used for the modeling. However, the post-processed results maybe presented in different units.

This example compares the results of fluid-structure interaction simulations with experimental results.

Model description

The tank is cylindrical with height 2 , thickness 7.9 , and radius 0.76 . The fluid inside the tank is water with height 1.62 . Steel has an elastic modulus of 200 and a Poisson's ratio of 0.27. Water has a density of 1E-6 and a speed of sound of 1466.47 . This tank with water is subjected to an earthquake acceleration in the x-direction and rotational acceleration about the y-direction. Figure 1 presents a schematic of the tank and its dimensions.

Figure 1: Schematic of the tank and its dimensions.

Input motion

The bottom of the tank is subjected to an earthquake acceleration in the x-direction and rotational acceleration about the y-direction. The peak lateral and rotational accelerations are 0.13 and 0.28 . The length of the input motion is about 11 . Figure 4 and Figure 5 present plots of the input motion.

Figure 4: Lateral acceleration input along x-direction.

Figure 5: Rotational acceleration input about y-direction.

Finite element mesh generation

The three-dimensional finite element mesh is generated using Cubit 15.5b. The following Cubit input file presents the script to generate the mesh. Figure 2 presents the finite-element mesh used for this example. Note that for applying the rotational acceleration about the y-direction, nodes were created along the x-direction. Then, lateral acceleration in the z-direction is applied at these nodes to replicate application of rotational accelerations.

reset
create cylinder radius 0.7679 height 2.0
volume 1 move z 1.0
create cylinder radius 0.76 height 1.9301
volume 2 move z 1.00955
subtract volume 2 from volume 1
create cylinder radius 0.76 height 1.62
volume 4 move z 0.8545
merge all

webcut volume 3  with sheet extended from surface 10
webcut volume 3  with sheet extended from surface 12 
webcut volume 7  with sheet extended from surface 8
merge all
merge surface 10 with surface 30 force
merge surface 18 with surface 27 force
webcut volume 3  with sheet extended from surface 9
merge all
merge surface 33 with surface 15 force

create vertex 0.7679 0 0 on surface 13
create vertex 0.61432 0 0 on surface 17
create vertex 0.46074 0 0 on surface 17
create vertex 0.30716 0 0 on surface 17
create vertex 0.15358 0 0 on surface 17
create vertex 0 0 0 on surface 17
create vertex -0.61432 0 0 on surface 17
create vertex -0.46074 0 0 on surface 17
create vertex -0.30716 0 0 on surface 17
create vertex -0.15358 0 0 on surface 17
create vertex -0.7679 0 0 on surface 13

create curve vertex 35 31
create curve vertex 31 32
create curve vertex 32 33
create curve vertex 33 34
create curve vertex 34 30
create curve vertex 30 29
create curve vertex 29 28
create curve vertex 28 27
create curve vertex 27 26
create curve vertex 26 25

imprint surface 17 with curve 25
imprint surface 17 with curve 26
imprint surface 17 with curve 27
imprint surface 17 with curve 28
imprint surface 17 with curve 29
imprint surface 17 with curve 30
imprint surface 17 with curve 31
imprint surface 17 with curve 32
imprint surface 17 with curve 33
imprint surface 17 with curve 34

delete curve 28 34 27 25 29 26 32 30 33 31

surface 14 scheme hole rad_intervals 2
surface 14 size 0.1
mesh surface 14

volume 3 int 1
mesh volume 3

volume 9 int 4
mesh volume 9

volume 8 int 25
mesh volume 8

volume 7 int 1
mesh volume 7

mesh volume 5
mesh volume 6
mesh volume 4

block 1 add volume 3 5 6 7 8 9
block 2 add volume 4

sideset 2 add surface 38 37
sideset 2 name "Bottom"

sideset 4 add surface 12
sideset 4 name "Fluid_top"

nodeset 11 add node 4465
nodeset 11 name "N1"
nodeset 12 add node 4977
nodeset 12 name "N2"
nodeset 13 add node 5009
nodeset 13 name "N3"
nodeset 14 add node 5008
nodeset 14 name "N4"
nodeset 15 add node 5007
nodeset 15 name "N5"
nodeset 16 add node 5006
nodeset 16 name "N6"
nodeset 17 add node 5005
nodeset 17 name "N7"
nodeset 18 add node 5004
nodeset 18 name "N8"
nodeset 19 add node 5003
nodeset 19 name "N9"
nodeset 20 add node 5002
nodeset 20 name "N10"
nodeset 21 add node 4513
nodeset 21 name "N11"
(examples/ex12c/FSI_ex12c.jou)

Figure 2: Finite-element mesh of the tank.

Modeling using MOOSE modules

The tank with water is modeled using the capabilities of the Fluid-Structure Interaction Module and the Solid Mechanics Module. In particular, the tank is modeled using the following kernels in the Solid Mechanics Module:

The fluid is modeled using the following kernels in the Fluid-Structure Interaction Module:

  • AcousticInertia kernel for the double time derivative of the fluid pressure

  • Diffusion kernel for the Laplacian of the fluid pressure

Fluid-structure interaction between the tank and the fluid is modeled using the StructureAcousticInterface interface kernel. This kernel enforces displacement and stress/pressure continuity between the tank and the fluid. The input file for executing the model is presented below. As mentioned before, lateral accelerations in the z-direction are applied at several nodes along the x-direction to replicate application of rotational accelerations about y-axis.

[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."}>>> = Model_2.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"}>>>]
  [bottom_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."}>>> = accel_bottom
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'Bottom'
  []
  [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"}>>> = 'Bottom'
    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"}>>> = 'N6'
    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'
  []
  [Nod1]
    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_z
    velocity<<<{"description": "The velocity variable."}>>> = vel_z
    acceleration<<<{"description": "The acceleration variable."}>>> = accel_z
    beta<<<{"description": "beta parameter for Newmark time integration."}>>> = 0.25
    function<<<{"description": "Function describing the velocity."}>>> = Node1
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'N1'
  []
  [Nod2]
    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_z
    velocity<<<{"description": "The velocity variable."}>>> = vel_z
    acceleration<<<{"description": "The acceleration variable."}>>> = accel_z
    beta<<<{"description": "beta parameter for Newmark time integration."}>>> = 0.25
    function<<<{"description": "Function describing the velocity."}>>> = Node2
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'N2'
  []
  [Nod3]
    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_z
    velocity<<<{"description": "The velocity variable."}>>> = vel_z
    acceleration<<<{"description": "The acceleration variable."}>>> = accel_z
    beta<<<{"description": "beta parameter for Newmark time integration."}>>> = 0.25
    function<<<{"description": "Function describing the velocity."}>>> = Node3
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'N3'
  []
  [Nod4]
    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_z
    velocity<<<{"description": "The velocity variable."}>>> = vel_z
    acceleration<<<{"description": "The acceleration variable."}>>> = accel_z
    beta<<<{"description": "beta parameter for Newmark time integration."}>>> = 0.25
    function<<<{"description": "Function describing the velocity."}>>> = Node4
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'N4'
  []
  [Nod5]
    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_z
    velocity<<<{"description": "The velocity variable."}>>> = vel_z
    acceleration<<<{"description": "The acceleration variable."}>>> = accel_z
    beta<<<{"description": "beta parameter for Newmark time integration."}>>> = 0.25
    function<<<{"description": "Function describing the velocity."}>>> = Node5
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'N5'
  []
  [Nod7]
    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_z
    velocity<<<{"description": "The velocity variable."}>>> = vel_z
    acceleration<<<{"description": "The acceleration variable."}>>> = accel_z
    beta<<<{"description": "beta parameter for Newmark time integration."}>>> = 0.25
    function<<<{"description": "Function describing the velocity."}>>> = Node7
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'N7'
  []
  [Nod8]
    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_z
    velocity<<<{"description": "The velocity variable."}>>> = vel_z
    acceleration<<<{"description": "The acceleration variable."}>>> = accel_z
    beta<<<{"description": "beta parameter for Newmark time integration."}>>> = 0.25
    function<<<{"description": "Function describing the velocity."}>>> = Node8
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'N8'
  []
  [Nod9]
    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_z
    velocity<<<{"description": "The velocity variable."}>>> = vel_z
    acceleration<<<{"description": "The acceleration variable."}>>> = accel_z
    beta<<<{"description": "beta parameter for Newmark time integration."}>>> = 0.25
    function<<<{"description": "Function describing the velocity."}>>> = Node9
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'N9'
  []
  [Nod10]
    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_z
    velocity<<<{"description": "The velocity variable."}>>> = vel_z
    acceleration<<<{"description": "The acceleration variable."}>>> = accel_z
    beta<<<{"description": "beta parameter for Newmark time integration."}>>> = 0.25
    function<<<{"description": "Function describing the velocity."}>>> = Node10
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'N10'
  []
  [Nod11]
    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_z
    velocity<<<{"description": "The velocity variable."}>>> = vel_z
    acceleration<<<{"description": "The acceleration variable."}>>> = accel_z
    beta<<<{"description": "beta parameter for Newmark time integration."}>>> = 0.25
    function<<<{"description": "Function describing the velocity."}>>> = Node11
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'N11'
  []
[]

[Functions<<<{"href": "../syntax/Functions/index.html"}>>>]
  [accel_bottom]
    type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../source/functions/PiecewiseLinear.html"}>>>
    data_file<<<{"description": "File holding CSV data"}>>> = Case1_Lat.csv
    scale_factor<<<{"description": "Scale factor to be applied to the output values"}>>> = 1.0
    format<<<{"description": "Format of csv data file that is in either in columns or rows"}>>> = 'columns'
  []
  [Node1]
    type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../source/functions/PiecewiseLinear.html"}>>>
    data_file<<<{"description": "File holding CSV data"}>>> = Case1_N1.csv
    scale_factor<<<{"description": "Scale factor to be applied to the output values"}>>> = 1.0
    format<<<{"description": "Format of csv data file that is in either in columns or rows"}>>> = 'columns'
  []
  [Node2]
    type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../source/functions/PiecewiseLinear.html"}>>>
    data_file<<<{"description": "File holding CSV data"}>>> = Case1_N2.csv
    scale_factor<<<{"description": "Scale factor to be applied to the output values"}>>> = 1.0
    format<<<{"description": "Format of csv data file that is in either in columns or rows"}>>> = 'columns'
  []
  [Node3]
    type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../source/functions/PiecewiseLinear.html"}>>>
    data_file<<<{"description": "File holding CSV data"}>>> = Case1_N3.csv
    scale_factor<<<{"description": "Scale factor to be applied to the output values"}>>> = 1.0
    format<<<{"description": "Format of csv data file that is in either in columns or rows"}>>> = 'columns'
  []
  [Node4]
    type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../source/functions/PiecewiseLinear.html"}>>>
    data_file<<<{"description": "File holding CSV data"}>>> = Case1_N4.csv
    scale_factor<<<{"description": "Scale factor to be applied to the output values"}>>> = 1.0
    format<<<{"description": "Format of csv data file that is in either in columns or rows"}>>> = 'columns'
  []
  [Node5]
    type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../source/functions/PiecewiseLinear.html"}>>>
    data_file<<<{"description": "File holding CSV data"}>>> = Case1_N5.csv
    scale_factor<<<{"description": "Scale factor to be applied to the output values"}>>> = 1.0
    format<<<{"description": "Format of csv data file that is in either in columns or rows"}>>> = 'columns'
  []
  [Node7]
    type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../source/functions/PiecewiseLinear.html"}>>>
    data_file<<<{"description": "File holding CSV data"}>>> = Case1_N7.csv
    scale_factor<<<{"description": "Scale factor to be applied to the output values"}>>> = 1.0
    format<<<{"description": "Format of csv data file that is in either in columns or rows"}>>> = 'columns'
  []
  [Node8]
    type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../source/functions/PiecewiseLinear.html"}>>>
    data_file<<<{"description": "File holding CSV data"}>>> = Case1_N8.csv
    scale_factor<<<{"description": "Scale factor to be applied to the output values"}>>> = 1.0
    format<<<{"description": "Format of csv data file that is in either in columns or rows"}>>> = 'columns'
  []
  [Node9]
    type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../source/functions/PiecewiseLinear.html"}>>>
    data_file<<<{"description": "File holding CSV data"}>>> = Case1_N9.csv
    scale_factor<<<{"description": "Scale factor to be applied to the output values"}>>> = 1.0
    format<<<{"description": "Format of csv data file that is in either in columns or rows"}>>> = 'columns'
  []
  [Node10]
    type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../source/functions/PiecewiseLinear.html"}>>>
    data_file<<<{"description": "File holding CSV data"}>>> = Case1_N10.csv
    scale_factor<<<{"description": "Scale factor to be applied to the output values"}>>> = 1.0
    format<<<{"description": "Format of csv data file that is in either in columns or rows"}>>> = 'columns'
  []
  [Node11]
    type = PiecewiseLinear<<<{"description": "Linearly interpolates between pairs of x-y data", "href": "../source/functions/PiecewiseLinear.html"}>>>
    data_file<<<{"description": "File holding CSV data"}>>> = Case1_N11.csv
    scale_factor<<<{"description": "Scale factor to be applied to the output values"}>>> = 1.0
    format<<<{"description": "Format of csv data file that is in either in columns or rows"}>>> = 'columns'
  []
[]

[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 = 11.0
  dt = 0.0025
  dtmin = 0.00001
  nl_abs_tol = 1e-10 # 1e-3
  nl_rel_tol = 1e-10 # 1e-3
  l_tol = 1e-10 # 1e-3
  l_max_its = 25
  timestep_tolerance = 1e-8
  automatic_scaling = true
  [TimeIntegrator<<<{"href": "../syntax/Executioner/TimeIntegrator/index.html"}>>>]
    type = NewmarkBeta
  []
[]

[Postprocessors<<<{"href": "../syntax/Postprocessors/index.html"}>>>]
  [PBottom]
    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."}>>> = '-0.76 0.0 0.3445'
    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."}>>> = '0.6372078659 0.2070413862 1.6645'
    variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = Wave1
  []
[]

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

Results: Pressures on the tank and wave heights over the fluid

Pressures acting on the tank wall as a function of time are recorded at the circular red dot as illustrated in Figure 1. Wave heights as the function of time are also recorded at the triangular red dot as illustrated in Figure 1. Figure 6 and Figure 7 present the pressures and wave heights, respectively.

Figure 6: Pressures recorded at the circular dot as illustrated in Figure 1.

Figure 7: Wave heights recorded at the triangular dot as illustrated in Figure 1.

Results: Comparison to experimental results

Figure 3 presents the peak pressure and peak wave height in comparison to experimental results. It is observed that the modeled results match quite well with experimental results from Mir et al. (2021).

Figure 3: Comparison of the modeled results to experimental results from Mir et al. (2021).

References

  1. F. U. H. Mir, C. C. Yu, and A. S. Whittaker. Experimental and numerical studies of seismic fluid‐structure interaction in a base‐supported cylindrical vessel. Earthquake Engineering and Structural Dynamics, 50(5):1395–1413, 2021.[BibTeX]