www.mooseframework.org
Compute2DSmallStrain.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 "Compute2DSmallStrain.h"
11 
12 #include "libmesh/quadrature.h"
13 
16 {
18  params.addClassDescription("Compute a small strain in a plane strain configuration.");
19 
20  MooseEnum outOfPlaneDirection("x y z", "z");
21  params.addParam<MooseEnum>(
22  "out_of_plane_direction", outOfPlaneDirection, "The direction of the out-of-plane strain.");
23  return params;
24 }
25 
27  : ComputeSmallStrain(parameters),
28  _out_of_plane_direction(getParam<MooseEnum>("out_of_plane_direction"))
29 {
30 }
31 
32 void
34 {
36  for (unsigned int i = 0; i < 3; ++i)
37  {
38  if (_out_of_plane_direction == i)
39  {
40  _disp[i] = &_zero;
41  _grad_disp[i] = &_grad_zero;
42  }
43  else
44  {
45  _disp[i] = &coupledValue("displacements", i);
46  _grad_disp[i] = &coupledGradient("displacements", i);
47  }
48  }
49 }
50 
51 void
53 {
54  const auto o0 = _out_of_plane_direction;
55  const auto o1 = (_out_of_plane_direction + 1) % 3;
56  const auto o2 = (_out_of_plane_direction + 2) % 3;
57 
58  Real volumetric_strain = 0.0;
59  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
60  {
62  _total_strain[_qp](o1, o1) = (*_grad_disp[o1])[_qp](o1);
63  _total_strain[_qp](o2, o2) = (*_grad_disp[o2])[_qp](o2);
64  _total_strain[_qp](o1, o2) = ((*_grad_disp[o1])[_qp](o2) + (*_grad_disp[o2])[_qp](o1)) / 2.0;
65  _total_strain[_qp](o2, o1) = _total_strain[_qp](o1, o2); // force the symmetrical strain tensor
66 
68  volumetric_strain += _total_strain[_qp].trace() * _JxW[_qp] * _coord[_qp];
69  }
70 
72  volumetric_strain /= _current_elem_volume;
73 
74  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
75  {
77  {
78  const Real correction = (volumetric_strain - _total_strain[_qp].trace()) / 3.0;
79  _total_strain[_qp](0, 0) += correction;
80  _total_strain[_qp](1, 1) += correction;
81  _total_strain[_qp](2, 2) += correction;
82  }
83 
85 
86  // Remove the eigenstrains
87  for (const auto es : _eigenstrains)
88  _mechanical_strain[_qp] -= (*es)[_qp];
89  }
90 }
91 
92 void
94 {
95  if (_out_of_plane_direction != 2 && _ndisp != 3)
96  mooseError("For 2D simulations where the out-of-plane direction is x or y the number of "
97  "supplied displacements must be three.");
98  else if (_out_of_plane_direction == 2 && _ndisp != 2)
99  mooseError("For 2D simulations where the out-of-plane direction is z the number of supplied "
100  "displacements must be two.");
101 }
const Real & _current_elem_volume
const unsigned int _out_of_plane_direction
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
const VariableGradient & _grad_zero
virtual void computeProperties() override
const MooseArray< Real > & _JxW
virtual Real computeOutOfPlaneStrain()=0
std::vector< const VariableValue * > _disp
Displacement variables.
virtual const VariableGradient & coupledGradient(const std::string &var_name, unsigned int comp=0) const
static InputParameters validParams()
virtual const VariableValue & coupledValue(const std::string &var_name, unsigned int comp=0) const
MaterialProperty< RankTwoTensor > & _mechanical_strain
unsigned int _ndisp
Coupled displacement variables.
void initialSetup() override
static InputParameters validParams()
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
const bool _volumetric_locking_correction
virtual void displacementIntegrityCheck() override
const MooseArray< Real > & _coord
Compute2DSmallStrain(const InputParameters &parameters)
MaterialProperty< RankTwoTensor > & _total_strain
std::vector< const MaterialProperty< RankTwoTensor > * > _eigenstrains
ComputeSmallStrain defines a strain tensor, assuming small strains.
std::vector< const VariableGradient * > _grad_disp
Gradient of displacements.