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 "SymmetricRankTwoTensor.h"
13 #include "MooseMesh.h"
14 #include "Assembly.h"
15 
16 template <typename R2>
19 {
21  params.addRequiredCoupledVar(
22  "displacements",
23  "The displacements appropriate for the simulation geometry and coordinate system");
24  params.addParam<std::string>("base_name",
25  "Optional parameter that allows the user to define "
26  "multiple mechanics material systems on the same "
27  "block, i.e. for multiple phases");
28  params.addParam<bool>(
29  "volumetric_locking_correction", false, "Flag to correct volumetric locking");
30  params.addParam<std::vector<MaterialPropertyName>>(
31  "eigenstrain_names", {}, "List of eigenstrains to be applied in this strain calculation");
32  params.addParam<MaterialPropertyName>("global_strain",
33  "Optional material property holding a global strain "
34  "tensor applied to the mesh as a whole");
35  params.suppressParameter<bool>("use_displaced_mesh");
36  return params;
37 }
38 
39 template <typename R2>
41  : Material(parameters),
42  _ndisp(coupledComponents("displacements")),
43  _disp(adCoupledValues("displacements")),
44  _grad_disp(adCoupledGradients("displacements")),
45  _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""),
46  _mechanical_strain(declareADProperty<R2>(_base_name + "mechanical_strain")),
47  _total_strain(declareADProperty<R2>(_base_name + "total_strain")),
48  _eigenstrain_names(getParam<std::vector<MaterialPropertyName>>("eigenstrain_names")),
49  _eigenstrains(_eigenstrain_names.size()),
50  _global_strain(isParamValid("global_strain")
51  ? &getADMaterialProperty<R2>(_base_name + "global_strain")
52  : nullptr),
53  _volumetric_locking_correction(getParam<bool>("volumetric_locking_correction") &&
54  !this->isBoundaryMaterial()),
55  _current_elem_volume(_assembly.elemVolume())
56 {
57  // set unused dimensions to zero
58  for (unsigned i = _ndisp; i < 3; ++i)
59  {
60  _disp.push_back(&_ad_zero);
61  _grad_disp.push_back(&_ad_grad_zero);
62  }
63 
64  for (unsigned int i = 0; i < _eigenstrains.size(); ++i)
65  {
67  _eigenstrains[i] = &getADMaterialProperty<R2>(_eigenstrain_names[i]);
68  }
69 
71  paramError("volumetric_locking_correction", "has to be set to false for 1-D problems.");
72 
73  if (getParam<bool>("use_displaced_mesh"))
74  paramError("use_displaced_mesh", "The strain calculator needs to run on the undisplaced mesh.");
75 }
76 
77 template <typename R2>
78 void
80 {
81  displacementIntegrityCheck();
82 }
83 
84 template <typename R2>
85 void
87 {
88  // Checking for consistency between mesh size and length of the provided displacements vector
89  if (_ndisp != _mesh.dimension())
90  paramError(
91  "displacements",
92  "The number of variables supplied in 'displacements' must match the mesh dimension.");
93 }
94 
95 template <typename R2>
96 void
98 {
99  _mechanical_strain[_qp].zero();
100  _total_strain[_qp].zero();
101 }
102 
const unsigned int _ndisp
Coupled displacement variables.
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
const MooseArray< ADRealVectorValue > & _ad_grad_zero
void suppressParameter(const std::string &name)
const MooseArray< DualReal > & _ad_zero
virtual void initQpStatefulProperties() override
ADComputeStrainBase is the base class for strain tensors.
std::vector< const ADVariableGradient * > _grad_disp
Gradient of displacements.
static InputParameters validParams()
static InputParameters validParams()
std::vector< const ADMaterialProperty< R2 > * > _eigenstrains
void paramError(const std::string &param, Args... args) const
void addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
ADComputeStrainBaseTempl(const InputParameters &parameters)
const std::string _base_name
Base name of the material system.
std::vector< const ADVariableValue * > _disp
Displacement variables.
virtual void displacementIntegrityCheck()
std::vector< MaterialPropertyName > _eigenstrain_names