Step 4a - Volumetric locking
Keep the postprocessing modifications from the previous question, set the "poissons_ratio" of the cantilevers to
0.49
. Then add and modify the following parameters
"uniform_refine" in the
[Mesh]
block"volumetric_locking_correction" in the solid mechanics quasi-static physics block
"elem_type" in the
GeneratedMeshGenerator
blocksFor convenience all those parameters may be listed under
[GlobalParams]
instead. Compare first order QUAD4 elements to second order QUAD8 elements, compare the cantilever deflection with and without volumetric locking correction (with QUAD4 elements), and compare the result for different levels of uniform refinement (1, 2, 3, 4).
#
# We study the effects of volumetric locking
# https://mooseframework.inl.gov/modules/solid_mechanics/tutorials/introduction/answer04b.html
#
[GlobalParams<<<{"href": "../../../../syntax/GlobalParams/index.html"}>>>]
displacements = 'disp_x disp_y'
# elem_type applies to the GeneratedMeshGenerator blocks
elem_type = QUAD4
# volumetric_locking_correction applies to the SolidMechanics QuasiStatic Physics
volumetric_locking_correction = false
# uniform_refine applies to the final mesh
uniform_refine = 0
[]
[Mesh<<<{"href": "../../../../syntax/Mesh/index.html"}>>>]
[generated1]
type = GeneratedMeshGenerator<<<{"description": "Create a line, square, or cube mesh with uniformly spaced or biased elements.", "href": "../../../../source/meshgenerators/GeneratedMeshGenerator.html"}>>>
dim<<<{"description": "The dimension of the mesh to be generated"}>>> = 2
nx<<<{"description": "Number of elements in the X direction"}>>> = 5
ny<<<{"description": "Number of elements in the Y direction"}>>> = 15
xmin<<<{"description": "Lower X Coordinate of the generated mesh"}>>> = -0.6
xmax<<<{"description": "Upper X Coordinate of the generated mesh"}>>> = -0.1
ymax<<<{"description": "Upper Y Coordinate of the generated mesh"}>>> = 5
bias_y<<<{"description": "The amount by which to grow (or shrink) the cells in the y-direction."}>>> = 0.9
boundary_name_prefix<<<{"description": "If provided, prefix the built in boundary names with this string"}>>> = pillar1
[]
[generated2]
type = GeneratedMeshGenerator<<<{"description": "Create a line, square, or cube mesh with uniformly spaced or biased elements.", "href": "../../../../source/meshgenerators/GeneratedMeshGenerator.html"}>>>
dim<<<{"description": "The dimension of the mesh to be generated"}>>> = 2
nx<<<{"description": "Number of elements in the X direction"}>>> = 4
ny<<<{"description": "Number of elements in the Y direction"}>>> = 15
xmin<<<{"description": "Lower X Coordinate of the generated mesh"}>>> = 0.1
xmax<<<{"description": "Upper X Coordinate of the generated mesh"}>>> = 0.6
ymax<<<{"description": "Upper Y Coordinate of the generated mesh"}>>> = 5
bias_y<<<{"description": "The amount by which to grow (or shrink) the cells in the y-direction."}>>> = 0.9
boundary_name_prefix<<<{"description": "If provided, prefix the built in boundary names with this string"}>>> = pillar2
boundary_id_offset<<<{"description": "This offset is added to the generated boundary IDs"}>>> = 4
[]
[collect_meshes]
type = MeshCollectionGenerator<<<{"description": "Collects multiple meshes into a single (unconnected) mesh.", "href": "../../../../source/meshgenerators/MeshCollectionGenerator.html"}>>>
inputs<<<{"description": "The input MeshGenerators."}>>> = 'generated1 generated2'
[]
[]
[Physics<<<{"href": "../../../../syntax/Physics/index.html"}>>>/SolidMechanics<<<{"href": "../../../../syntax/Physics/SolidMechanics/index.html"}>>>/QuasiStatic<<<{"href": "../../../../syntax/Physics/SolidMechanics/QuasiStatic/index.html"}>>>]
[all]
add_variables<<<{"description": "Add the displacement variables"}>>> = true
strain<<<{"description": "Strain formulation"}>>> = FINITE
[]
[]
[BCs<<<{"href": "../../../../syntax/BCs/index.html"}>>>]
[bottom_x]
type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../../../../source/bcs/DirichletBC.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'pillar1_bottom pillar2_bottom'
value<<<{"description": "Value of the BC"}>>> = 0
[]
[bottom_y]
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"}>>> = 'pillar1_bottom pillar2_bottom'
value<<<{"description": "Value of the BC"}>>> = 0
[]
[Pressure<<<{"href": "../../../../syntax/BCs/Pressure/index.html"}>>>]
[sides]
boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = 'pillar1_left pillar2_right'
function<<<{"description": "The function that describes the pressure"}>>> = 1e4*t
[]
[]
[]
[Materials<<<{"href": "../../../../syntax/Materials/index.html"}>>>]
[elasticity]
type = ComputeIsotropicElasticityTensor<<<{"description": "Compute a constant isotropic elasticity tensor.", "href": "../../../../source/materials/ComputeIsotropicElasticityTensor.html"}>>>
youngs_modulus<<<{"description": "Young's modulus of the material."}>>> = 1e9
# near incopmpressible material
poissons_ratio<<<{"description": "Poisson's ratio for the material."}>>> = 0.49
[]
[stress]
type = ComputeFiniteStrainElasticStress<<<{"description": "Compute stress using elasticity for finite strains", "href": "../../../../source/materials/ComputeFiniteStrainElasticStress.html"}>>>
[]
[]
[Postprocessors<<<{"href": "../../../../syntax/Postprocessors/index.html"}>>>]
[x_deflection]
type = NodalExtremeValue<<<{"description": "Finds either the min or max elemental value of a variable over the domain.", "href": "../../../../source/postprocessors/NodalExtremeValue.html"}>>>
value_type<<<{"description": "Type of extreme value to return. 'max' returns the maximum value. 'min' returns the minimum value. 'max_abs' returns the maximum of the absolute value."}>>> = max
variable<<<{"description": "The name of the variable that this postprocessor operates on"}>>> = disp_x
[]
[]
[Executioner<<<{"href": "../../../../syntax/Executioner/index.html"}>>>]
type = Transient
solve_type = NEWTON
line_search = none
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
end_time = 5
dt = 0.5
[Predictor<<<{"href": "../../../../syntax/Executioner/Predictor/index.html"}>>>]
type = SimplePredictor
scale = 1
[]
[]
[Outputs<<<{"href": "../../../../syntax/Outputs/index.html"}>>>]
exodus<<<{"description": "Output the results using the default settings for Exodus output."}>>> = true
csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
(moose/modules/solid_mechanics/tutorials/introduction/mech_step04a.i)We can run the various combinations of first/second order elements, active/deactivated volumetric locking correction, and levels of refinement and plot the resulting data.
Note that you can override input file parameters from the command line! That means you can run all the cases plotted below using these commands:
../../solid_mechanics-opt -i mech_step04a.i GlobalParams/elem_type=QUAD4
../../solid_mechanics-opt -i mech_step04a.i GlobalParams/elem_type=QUAD4 GlobalParams/volumetric_locking_correction=true
mpirun -n 4 ../../solid_mechanics-opt -i mech_step04a.i GlobalParams/elem_type=QUAD4 GlobalParams/volumetric_locking_correction=true GlobalParams/uniform_refine=1
mpirun -n 4 ../../solid_mechanics-opt -i mech_step04a.i GlobalParams/elem_type=QUAD8
mpirun -n 8 ../../solid_mechanics-opt -i mech_step04a.i GlobalParams/elem_type=QUAD4 GlobalParams/volumetric_locking_correction=true GlobalParams/uniform_refine=4
mpirun -n 8 ../../solid_mechanics-opt -i mech_step04a.i GlobalParams/elem_type=QUAD8 GlobalParams/uniform_refine=2
The point here is to make you aware that volumetric locking can occur in first order elements with certain material properties. It can be alleviated through
Refinement
Use of higher order elements (QUAD8)
Use of volumetric locking correction
Users are encouraged to carefully check their results through convergence studies.