Example 10b: Cantilever example demonstrating central difference time integration using HEX20 elements
Model Description
This example demonstrates the central difference time integration using HEX20 elements in MASTODON. A 2 x 2 x 20 cantilever is modeled with the bottom surface fixed along x, y & z directions. A uniform normal pressure of 1 is applied to the top surface along the axis of the model. The resulting stress time-history and displacement time-history are then obtained at co-ordinate locations (0, 0, 10) and (0, 0, 20), respectively and compared with results from ABAQUS/Standard (since HEX20 elements are unavailable in ABAQUS/Explicit).
Figure 1 demonstrates the overall dimensions and boundary conditions of the model.

Figure 1: Input model in MASTODON
Modeling in MASTODON
[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"}>>>
nx<<<{"description": "Number of elements in the X direction"}>>> = 1
ny<<<{"description": "Number of elements in the Y direction"}>>> = 1
nz<<<{"description": "Number of elements in the Z direction"}>>> = 10
xmin<<<{"description": "Lower X Coordinate of the generated mesh"}>>> = -1
ymin<<<{"description": "Lower Y Coordinate of the generated mesh"}>>> = -1
zmin<<<{"description": "Lower Z Coordinate of the generated mesh"}>>> = 0.0
xmax<<<{"description": "Upper X Coordinate of the generated mesh"}>>> = 1
ymax<<<{"description": "Upper Y Coordinate of the generated mesh"}>>> = 1
zmax<<<{"description": "Upper Z Coordinate of the generated mesh"}>>> = 20.0
dim<<<{"description": "The dimension of the mesh to be generated"}>>> = 3
elem_type<<<{"description": "The type of element from libMesh to generate (default: linear element for requested dimension)"}>>> = HEX20
[]
[]
[Variables<<<{"href": "../syntax/Variables/index.html"}>>>]
[./disp_x]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = SECOND
[../]
[./disp_y]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = SECOND
[../]
[./disp_z]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = SECOND
[../]
[]
[AuxVariables<<<{"href": "../syntax/AuxVariables/index.html"}>>>]
[./vel_x]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = SECOND
[../]
[./vel_y]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = SECOND
[../]
[./vel_z]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = SECOND
[../]
[./accel_x]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = SECOND
[../]
[./accel_y]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = SECOND
[../]
[./accel_z]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = SECOND
[../]
[./stress_zz]
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"}>>> = MONOMIAL
[../]
[./layer_id]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = CONSTANT
family<<<{"description": "Specifies the family of FE shape functions to use for this variable"}>>> = MONOMIAL
[../]
[]
[Kernels<<<{"href": "../syntax/Kernels/index.html"}>>>]
[./DynamicTensorMechanics<<<{"href": "../syntax/Kernels/DynamicTensorMechanics/index.html"}>>>]
displacements<<<{"description": "The nonlinear displacement variables for the problem"}>>> = 'disp_x disp_y disp_z'
stiffness_damping_coefficient<<<{"description": "Name of material property or a constant real number defining stiffness Rayleigh parameter (zeta)."}>>> = 0
[../]
[./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
[../]
[./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
[../]
[./inertia_z]
type = InertialForce<<<{"description": "Calculates the residual for the inertial force ($M \\cdot acceleration$) and the contribution of mass dependent Rayleigh damping and HHT time integration scheme ($\\eta \\cdot M \\cdot ((1+\\alpha)velq2-\\alpha \\cdot vel-old) $)", "href": "../source/kernels/InertialForce.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_z
[../]
[]
[AuxKernels<<<{"href": "../syntax/AuxKernels/index.html"}>>>]
[./accel_x]
type = TestNewmarkTI<<<{"description": "Assigns the velocity/acceleration calculated by time integrator to the velocity/acceleration auxvariable.", "href": "../source/auxkernels/TestNewmarkTI.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = accel_x
displacement<<<{"description": "The variable whose first/second derivative needs to be copied to the provided auxvariable."}>>> = disp_x
first<<<{"description": "Set to true to copy the first derivative to the auxvariable. If false, the second derivative is copied."}>>> = false
[../]
[./vel_x]
type = TestNewmarkTI<<<{"description": "Assigns the velocity/acceleration calculated by time integrator to the velocity/acceleration auxvariable.", "href": "../source/auxkernels/TestNewmarkTI.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = vel_x
displacement<<<{"description": "The variable whose first/second derivative needs to be copied to the provided auxvariable."}>>> = disp_x
[../]
[./accel_y]
type = TestNewmarkTI<<<{"description": "Assigns the velocity/acceleration calculated by time integrator to the velocity/acceleration auxvariable.", "href": "../source/auxkernels/TestNewmarkTI.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = accel_y
displacement<<<{"description": "The variable whose first/second derivative needs to be copied to the provided auxvariable."}>>> = disp_y
first<<<{"description": "Set to true to copy the first derivative to the auxvariable. If false, the second derivative is copied."}>>> = false
[../]
[./vel_y]
type = TestNewmarkTI<<<{"description": "Assigns the velocity/acceleration calculated by time integrator to the velocity/acceleration auxvariable.", "href": "../source/auxkernels/TestNewmarkTI.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = vel_y
displacement<<<{"description": "The variable whose first/second derivative needs to be copied to the provided auxvariable."}>>> = disp_y
[../]
[./accel_z]
type = TestNewmarkTI<<<{"description": "Assigns the velocity/acceleration calculated by time integrator to the velocity/acceleration auxvariable.", "href": "../source/auxkernels/TestNewmarkTI.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = accel_z
displacement<<<{"description": "The variable whose first/second derivative needs to be copied to the provided auxvariable."}>>> = disp_z
first<<<{"description": "Set to true to copy the first derivative to the auxvariable. If false, the second derivative is copied."}>>> = false
[../]
[./vel_z]
type = TestNewmarkTI<<<{"description": "Assigns the velocity/acceleration calculated by time integrator to the velocity/acceleration auxvariable.", "href": "../source/auxkernels/TestNewmarkTI.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = vel_z
displacement<<<{"description": "The variable whose first/second derivative needs to be copied to the provided auxvariable."}>>> = disp_z
[../]
[./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
[../]
[]
[Materials<<<{"href": "../syntax/Materials/index.html"}>>>]
[./elasticity_tensor_block]
youngs_modulus<<<{"description": "Young's modulus of the material."}>>> = 119751.528 # kip/ft^2
poissons_ratio<<<{"description": "Poisson's ratio for the material."}>>> = 0.3
type = ComputeIsotropicElasticityTensor<<<{"description": "Compute a constant isotropic elasticity tensor.", "href": "../source/materials/ComputeIsotropicElasticityTensor.html"}>>>
[../]
[./den_block]
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"}>>> = density
prop_values<<<{"description": "The values associated with the named properties"}>>> = 0.00367 # kip s^2/ft^4
[../]
[./strain]
type = ComputeSmallStrain<<<{"description": "Compute a small strain.", "href": "../source/materials/ComputeSmallStrain.html"}>>>
displacements<<<{"description": "The displacements appropriate for the simulation geometry and coordinate system"}>>> = 'disp_x disp_y disp_z'
implicit<<<{"description": "Determines whether this object is calculated using an implicit or explicit form"}>>> = false
[../]
[./stress]
type = ComputeLinearElasticStress<<<{"description": "Compute stress using elasticity for small strains", "href": "../source/materials/ComputeLinearElasticStress.html"}>>>
[../]
[]
[BCs<<<{"href": "../syntax/BCs/index.html"}>>>]
[./press]
type = Pressure<<<{"description": "Applies a pressure on a given boundary in a given direction", "href": "../source/bcs/Pressure.html"}>>>
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'front'
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_z
component<<<{"description": "The component for the pressure"}>>> = 2
factor<<<{"description": "The magnitude to use in computing the pressure"}>>> = 1 # kip/ft^2
[../]
[./disp_x]
type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../source/bcs/DirichletBC.html"}>>>
displacements<<<{"description": "The displacements"}>>> = 'disp_x disp_y disp_z'
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"}>>> = 'back'
value<<<{"description": "Value of the BC"}>>> = 0
[../]
[./disp_y]
type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../source/bcs/DirichletBC.html"}>>>
displacements<<<{"description": "The displacements"}>>> = 'disp_x disp_y disp_z'
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'back'
value<<<{"description": "Value of the BC"}>>> = 0
[../]
[./disp_z]
type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../source/bcs/DirichletBC.html"}>>>
displacements<<<{"description": "The displacements"}>>> = 'disp_x disp_y disp_z'
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_z
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'back'
value<<<{"description": "Value of the BC"}>>> = 0
[../]
[]
[Preconditioning<<<{"href": "../syntax/Preconditioning/index.html"}>>>]
[./smp]
type = SMP<<<{"description": "Single matrix preconditioner (SMP) builds a preconditioner using user defined off-diagonal parts of the Jacobian.", "href": "../source/preconditioners/SingleMatrixPreconditioner.html"}>>>
full<<<{"description": "Set to true if you want the full set of couplings between variables simply for convenience so you don't have to set every off_diag_row and off_diag_column combination."}>>> = true
[../]
[]
[Executioner<<<{"href": "../syntax/Executioner/index.html"}>>>]
type = Transient
start_time = 0
end_time = 2e-2
timestep_tolerance = 1e-06
[./TimeIntegrator<<<{"href": "../syntax/Executioner/TimeIntegrator/index.html"}>>>]
type = CentralDifference
[]
[./TimeStepper<<<{"href": "../syntax/Executioner/TimeStepper/index.html"}>>>]
type = PostprocessorDT
postprocessor = time_step
dt = 1e-5
[../]
[]
[Postprocessors<<<{"href": "../syntax/Postprocessors/index.html"}>>>]
[./_dt]
type = TimestepSize<<<{"description": "Reports the timestep size", "href": "../source/postprocessors/TimestepSize.html"}>>>
[../]
[./time_step]
type = CriticalTimeStep<<<{"description": "Computes and reports the critical time step for the explicit solver.", "href": "../source/postprocessors/CriticalTimeStep.html"}>>>
factor<<<{"description": "Factor to mulitply to the critical time step."}>>> = 0.9
[../]
[./dispx_20]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = disp_x
point<<<{"description": "The physical point where the solution will be evaluated."}>>> = '0.0 0.0 20'
[../]
[./dispy_20]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = disp_y
point<<<{"description": "The physical point where the solution will be evaluated."}>>> = '0.0 0.0 20'
[../]
[./dispz_20]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = disp_z
point<<<{"description": "The physical point where the solution will be evaluated."}>>> = '0.0 0.0 20'
[../]
[./stress_zz_5]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = stress_zz
point<<<{"description": "The physical point where the solution will be evaluated."}>>> = '0.0 0.0 5'
[../]
[./stress_zz_10]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = stress_zz
point<<<{"description": "The physical point where the solution will be evaluated."}>>> = '0.0 0.0 10'
[../]
[./stress_zz_15]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = stress_zz
point<<<{"description": "The physical point where the solution will be evaluated."}>>> = '0.0 0.0 15'
[../]
[./stress_zz_20]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = stress_zz
point<<<{"description": "The physical point where the solution will be evaluated."}>>> = '0.0 0.0 20'
[../]
[]
[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
[./console]
type = Console<<<{"description": "Object for screen output.", "href": "../source/outputs/Console.html"}>>>
max_rows<<<{"description": "The maximum number of postprocessor/scalar values displayed on screen during a timestep (set to 0 for unlimited)"}>>> = 1
[../]
[]
(examples/ex10b/MASTODON_Explicit_HEX20.i)The automated meshing option provided by MASTODON is used to create the geometry and specify the element type (see the documentation of GeneratedMeshGenerator in syntax for detailed information).
[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"}>>>
nx<<<{"description": "Number of elements in the X direction"}>>> = 1
ny<<<{"description": "Number of elements in the Y direction"}>>> = 1
nz<<<{"description": "Number of elements in the Z direction"}>>> = 10
xmin<<<{"description": "Lower X Coordinate of the generated mesh"}>>> = -1
ymin<<<{"description": "Lower Y Coordinate of the generated mesh"}>>> = -1
zmin<<<{"description": "Lower Z Coordinate of the generated mesh"}>>> = 0.0
xmax<<<{"description": "Upper X Coordinate of the generated mesh"}>>> = 1
ymax<<<{"description": "Upper Y Coordinate of the generated mesh"}>>> = 1
zmax<<<{"description": "Upper Z Coordinate of the generated mesh"}>>> = 20.0
dim<<<{"description": "The dimension of the mesh to be generated"}>>> = 3
elem_type<<<{"description": "The type of element from libMesh to generate (default: linear element for requested dimension)"}>>> = HEX20
[]
[]
(examples/ex10b/MASTODON_Explicit_HEX20.i)The displacement variables are defined in the Variables
block. The accelerations, velocities and stresses are defined as auxiliary variables in the AuxVariables
block. HEX20 elements use second order polynomials as shape functions and hence it is necessary to specify the order=SECOND
for the displacements, accelerations and velocities. Stresses are specified to be of order=FIRST
since they are one order lower than displacement.
[Variables<<<{"href": "../syntax/Variables/index.html"}>>>]
[./disp_x]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = SECOND
[../]
[./disp_y]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = SECOND
[../]
[./disp_z]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = SECOND
[../]
[]
[AuxVariables<<<{"href": "../syntax/AuxVariables/index.html"}>>>]
[./vel_x]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = SECOND
[../]
[./vel_y]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = SECOND
[../]
[./vel_z]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = SECOND
[../]
[./accel_x]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = SECOND
[../]
[./accel_y]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = SECOND
[../]
[./accel_z]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = SECOND
[../]
[./stress_zz]
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"}>>> = MONOMIAL
[../]
[./layer_id]
order<<<{"description": "Specifies the order of the FE shape function to use for this variable (additional orders not listed are allowed)"}>>> = CONSTANT
family<<<{"description": "Specifies the family of FE shape functions to use for this variable"}>>> = MONOMIAL
[../]
[]
(examples/ex10b/MASTODON_Explicit_HEX20.i)The rest of the input file is identical to that of Example10a
.
Results
The stress time-history and displacement time-history are obtained at locations (0, 0, 10) and (0, 0, 20) respectively and compared with results from ABAQUS/Standard (as shown in Figure 2 and Figure 3).

Figure 2: Stress-zz Time-history at (0, 0, 10)

Figure 3: Disp-z Time-history at (0, 0, 20)