https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Compute2DSmallStrain.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
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
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
32void
34{
36 for (unsigned int i = 0; i < 3; ++i)
37 {
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
51void
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
92void
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}
void mooseError(Args &&... args)
virtual void displacementIntegrityCheck() override
const unsigned int _out_of_plane_direction
virtual void computeProperties() override
static InputParameters validParams()
Compute2DSmallStrain(const InputParameters &parameters)
virtual Real computeOutOfPlaneStrain()=0
ComputeSmallStrain defines a strain tensor, assuming small strains.
static InputParameters validParams()
std::vector< const VariableGradient * > _grad_disp
Gradient of displacements.
std::vector< const VariableValue * > _disp
Displacement variables.
MaterialProperty< RankTwoTensor > & _mechanical_strain
const Real & _current_elem_volume
unsigned int _ndisp
Coupled displacement variables.
std::vector< const MaterialProperty< RankTwoTensor > * > _eigenstrains
MaterialProperty< RankTwoTensor > & _total_strain
const bool _volumetric_locking_correction
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)