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)