www.mooseframework.org
ADComputeStrainBase.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #include "ADComputeStrainBase.h"
11 #include "RankTwoTensor.h"
12 #include "MooseMesh.h"
13 #include "Assembly.h"
14 
16 
17 template <ComputeStage compute_stage>
18 InputParameters
20 {
21  InputParameters params = ADMaterial<compute_stage>::validParams();
22  params.addRequiredCoupledVar(
23  "displacements",
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");
37  return params;
38 }
39 
40 template <ComputeStage compute_stage>
42  : ADMaterial<compute_stage>(parameters),
43  _ndisp(coupledComponents("displacements")),
44  _disp(3),
45  _grad_disp(3),
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")
53  : nullptr),
54  _volumetric_locking_correction(getParam<bool>("volumetric_locking_correction") &&
55  !this->isBoundaryMaterial()),
56  _current_elem_volume(_assembly.elemVolume())
57 {
58  for (unsigned int i = 0; i < _eigenstrains.size(); ++i)
59  {
61  _eigenstrains[i] = &getADMaterialProperty<RankTwoTensor>(_eigenstrain_names[i]);
62  }
63 
65  paramError("volumetric_locking_correction", "has to be set to false for 1-D problems.");
66 
67  if (getParam<bool>("use_displaced_mesh"))
68  paramError("use_displaced_mesh", "The strain calculator needs to run on the undisplaced mesh.");
69 }
70 
71 template <ComputeStage compute_stage>
72 void
74 {
75  displacementIntegrityCheck();
76  // fetch coupled variables and gradients (as stateful properties if necessary)
77  for (unsigned int i = 0; i < _ndisp; ++i)
78  {
79  _disp[i] = &adCoupledValue("displacements", i);
80  _grad_disp[i] = &adCoupledGradient("displacements", i);
81  }
82 
83  // set unused dimensions to zero
84  for (unsigned i = _ndisp; i < 3; ++i)
85  {
86  _disp[i] = &adZeroValue();
87  _grad_disp[i] = &adZeroGradient();
88  }
89 }
90 
91 template <ComputeStage compute_stage>
92 void
94 {
95  // Checking for consistency between mesh size and length of the provided displacements vector
96  if (_ndisp != _mesh.dimension())
97  paramError(
98  "displacements",
99  "The number of variables supplied in 'displacements' must match the mesh dimension.");
100 }
101 
102 template <ComputeStage compute_stage>
103 void
105 {
106  _mechanical_strain[_qp].zero();
107  _total_strain[_qp].zero();
108 }
109 
110 // explicit instantiation is required for AD base classes
ADComputeStrainBase::initQpStatefulProperties
virtual void initQpStatefulProperties() override
Definition: ADComputeStrainBase.C:104
ADComputeStrainBase::initialSetup
void initialSetup() override
Definition: ADComputeStrainBase.C:73
ADComputeStrainBase::_base_name
const std::string _base_name
Definition: ADComputeStrainBase.h:60
ADComputeStrainBase::_eigenstrains
std::vector< const ADMaterialProperty(RankTwoTensor) * > _eigenstrains
Definition: ADComputeStrainBase.h:66
validParams
InputParameters validParams()
ADComputeStrainBase::_eigenstrain_names
std::vector< MaterialPropertyName > _eigenstrain_names
Definition: ADComputeStrainBase.h:65
ADComputeStrainBase
ADADComputeStrainBase is the base class for strain tensors.
Definition: ADComputeStrainBase.h:30
ADComputeStrainBase::displacementIntegrityCheck
virtual void displacementIntegrityCheck()
Definition: ADComputeStrainBase.C:93
RankTwoTensorTempl< Real >
ADComputeStrainBase::ADComputeStrainBase
ADComputeStrainBase(const InputParameters &parameters)
Definition: ADComputeStrainBase.C:41
ADComputeStrainBase::validParams
static InputParameters validParams()
Definition: ADComputeStrainBase.C:19
defineADLegacyParams
defineADLegacyParams(ADComputeStrainBase)
ADComputeStrainBase::_ndisp
const unsigned int _ndisp
Coupled displacement variables.
Definition: ADComputeStrainBase.h:56
ADComputeStrainBase::_volumetric_locking_correction
const bool _volumetric_locking_correction
Definition: ADComputeStrainBase.h:70
ADComputeStrainBase.h
adBaseClass
adBaseClass(ADComputeStrainBase)