www.mooseframework.org
ComputeStrainBase.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 "ComputeStrainBase.h"
11 #include "MooseMesh.h"
12 #include "Assembly.h"
13 
15 
16 InputParameters
18 {
19  InputParameters params = Material::validParams();
20  params.addRequiredCoupledVar(
21  "displacements",
22  "The displacements appropriate for the simulation geometry and coordinate system");
23  params.addParam<std::string>("base_name",
24  "Optional parameter that allows the user to define "
25  "multiple mechanics material systems on the same "
26  "block, i.e. for multiple phases");
27  params.addParam<bool>(
28  "volumetric_locking_correction", false, "Flag to correct volumetric locking");
29  params.addParam<std::vector<MaterialPropertyName>>(
30  "eigenstrain_names", "List of eigenstrains to be applied in this strain calculation");
31  params.addParam<MaterialPropertyName>("global_strain",
32  "Optional material property holding a global strain "
33  "tensor applied to the mesh as a whole");
34  params.suppressParameter<bool>("use_displaced_mesh");
35  return params;
36 }
37 
38 ComputeStrainBase::ComputeStrainBase(const InputParameters & parameters)
39  : DerivativeMaterialInterface<Material>(parameters),
40  _ndisp(coupledComponents("displacements")),
41  _disp(3),
42  _grad_disp(3),
43  _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""),
44  _mechanical_strain(declareProperty<RankTwoTensor>(_base_name + "mechanical_strain")),
45  _total_strain(declareProperty<RankTwoTensor>(_base_name + "total_strain")),
46  _eigenstrain_names(getParam<std::vector<MaterialPropertyName>>("eigenstrain_names")),
47  _eigenstrains(_eigenstrain_names.size()),
48  _global_strain(isParamValid("global_strain")
49  ? &getMaterialProperty<RankTwoTensor>(_base_name + "global_strain")
50  : nullptr),
51  _volumetric_locking_correction(getParam<bool>("volumetric_locking_correction") &&
52  !isBoundaryMaterial()),
53  _current_elem_volume(_assembly.elemVolume())
54 {
55  for (unsigned int i = 0; i < _eigenstrains.size(); ++i)
56  {
58  _eigenstrains[i] = &getMaterialProperty<RankTwoTensor>(_eigenstrain_names[i]);
59  }
60 
62  paramError("volumetric_locking_correction", "has to be set to false for 1-D problems.");
63 
64  if (getParam<bool>("use_displaced_mesh"))
65  paramError("use_displaced_mesh", "The strain calculator needs to run on the undisplaced mesh.");
66 
67  // Generate warning when volumetric locking correction is used with second order elements
68  if (_mesh.hasSecondOrderElements() && _volumetric_locking_correction)
69  mooseWarning("Volumetric locking correction is not required for second order elements. Using "
70  "volumetric locking with second order elements could cause zigzag patterns in "
71  "stresses and strains.");
72 }
73 
74 void
76 {
78  // fetch coupled variables and gradients (as stateful properties if necessary)
79  for (unsigned int i = 0; i < _ndisp; ++i)
80  {
81  _disp[i] = &coupledValue("displacements", i);
82  _grad_disp[i] = &coupledGradient("displacements", i);
83  }
84 
85  // set unused dimensions to zero
86  for (unsigned i = _ndisp; i < 3; ++i)
87  {
88  _disp[i] = &_zero;
89  _grad_disp[i] = &_grad_zero;
90  }
91 }
92 
93 void
95 {
96  // Checking for consistency between mesh size and length of the provided displacements vector
97  if (_ndisp != _mesh.dimension())
98  paramError(
99  "displacements",
100  "The number of variables supplied in 'displacements' must match the mesh dimension.");
101 }
102 
103 void
105 {
106  _mechanical_strain[_qp].zero();
107  _total_strain[_qp].zero();
108 }
ComputeStrainBase::ComputeStrainBase
ComputeStrainBase(const InputParameters &parameters)
Definition: ComputeStrainBase.C:38
ComputeStrainBase::displacementIntegrityCheck
virtual void displacementIntegrityCheck()
Definition: ComputeStrainBase.C:94
ComputeStrainBase::_disp
std::vector< const VariableValue * > _disp
Definition: ComputeStrainBase.h:41
defineLegacyParams
defineLegacyParams(ComputeStrainBase)
ComputeStrainBase.h
ComputeStrainBase
ComputeStrainBase is the base class for strain tensors.
Definition: ComputeStrainBase.h:26
ComputeStrainBase::_base_name
const std::string _base_name
Definition: ComputeStrainBase.h:44
ComputeStrainBase::_ndisp
unsigned int _ndisp
Coupled displacement variables.
Definition: ComputeStrainBase.h:40
ComputeStrainBase::_mechanical_strain
MaterialProperty< RankTwoTensor > & _mechanical_strain
Definition: ComputeStrainBase.h:46
ComputeStrainBase::initialSetup
void initialSetup() override
Definition: ComputeStrainBase.C:75
validParams
InputParameters validParams()
ComputeStrainBase::validParams
static InputParameters validParams()
Definition: ComputeStrainBase.C:17
ComputeStrainBase::_eigenstrain_names
std::vector< MaterialPropertyName > _eigenstrain_names
Definition: ComputeStrainBase.h:50
ComputeStrainBase::_eigenstrains
std::vector< const MaterialProperty< RankTwoTensor > * > _eigenstrains
Definition: ComputeStrainBase.h:51
RankTwoTensorTempl
Definition: ACGrGrElasticDrivingForce.h:17
ComputeStrainBase::_total_strain
MaterialProperty< RankTwoTensor > & _total_strain
Definition: ComputeStrainBase.h:48
ComputeStrainBase::_volumetric_locking_correction
const bool _volumetric_locking_correction
Definition: ComputeStrainBase.h:55
ComputeStrainBase::_grad_disp
std::vector< const VariableGradient * > _grad_disp
Definition: ComputeStrainBase.h:42
ComputeStrainBase::initQpStatefulProperties
virtual void initQpStatefulProperties() override
Definition: ComputeStrainBase.C:104