11 #include "RankTwoTensor.h"
12 #include "MooseMesh.h"
17 template <ComputeStage compute_stage>
22 params.addRequiredCoupledVar(
24 "The displacements appropriate for the simulation geometry and coordinate system");
25 params.addParam<std::string>(
"base_name",
26 "Optional parameter that allows the user to define "
27 "multiple mechanics material systems on the same "
28 "block, i.e. for multiple phases");
29 params.addParam<
bool>(
30 "volumetric_locking_correction",
false,
"Flag to correct volumetric locking");
31 params.addParam<std::vector<MaterialPropertyName>>(
32 "eigenstrain_names",
"List of eigenstrains to be applied in this strain calculation");
33 params.addParam<MaterialPropertyName>(
"global_strain",
34 "Optional material property holding a global strain "
35 "tensor applied to the mesh as a whole");
36 params.suppressParameter<
bool>(
"use_displaced_mesh");
40 template <ComputeStage compute_stage>
42 : ADMaterial<compute_stage>(parameters),
43 _ndisp(coupledComponents(
"displacements")),
46 _base_name(isParamValid(
"base_name") ? getParam<std::string>(
"base_name") +
"_" :
""),
47 _mechanical_strain(declareADProperty<
RankTwoTensor>(_base_name +
"mechanical_strain")),
48 _total_strain(declareADProperty<
RankTwoTensor>(_base_name +
"total_strain")),
49 _eigenstrain_names(getParam<std::vector<MaterialPropertyName>>(
"eigenstrain_names")),
50 _eigenstrains(_eigenstrain_names.size()),
51 _global_strain(isParamValid(
"global_strain")
52 ? &getADMaterialProperty<
RankTwoTensor>(_base_name +
"global_strain")
54 _volumetric_locking_correction(getParam<bool>(
"volumetric_locking_correction") &&
55 !this->isBoundaryMaterial()),
56 _current_elem_volume(_assembly.elemVolume())
65 paramError(
"volumetric_locking_correction",
"has to be set to false for 1-D problems.");
67 if (getParam<bool>(
"use_displaced_mesh"))
68 paramError(
"use_displaced_mesh",
"The strain calculator needs to run on the undisplaced mesh.");
71 template <ComputeStage compute_stage>
75 displacementIntegrityCheck();
77 for (
unsigned int i = 0; i < _ndisp; ++i)
79 _disp[i] = &adCoupledValue(
"displacements", i);
80 _grad_disp[i] = &adCoupledGradient(
"displacements", i);
84 for (
unsigned i = _ndisp; i < 3; ++i)
86 _disp[i] = &adZeroValue();
87 _grad_disp[i] = &adZeroGradient();
91 template <ComputeStage compute_stage>
96 if (_ndisp != _mesh.dimension())
99 "The number of variables supplied in 'displacements' must match the mesh dimension.");
102 template <ComputeStage compute_stage>
106 _mechanical_strain[_qp].zero();
107 _total_strain[_qp].zero();