11 #include "libmesh/quadrature.h"
17 template <ComputeStage compute_stage>
22 params.addClassDescription(
"Compute a small strain.");
26 template <ComputeStage compute_stage>
32 template <ComputeStage compute_stage>
36 ADReal volumetric_strain = 0.0;
38 for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
41 ADRankTwoTensor grad_tensor(
42 (*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]);
44 _total_strain[_qp] = (grad_tensor + grad_tensor.transpose()) / 2.0;
46 if (_volumetric_locking_correction)
47 volumetric_strain += _total_strain[_qp].trace() * _JxW[_qp] * _coord[_qp];
50 if (_volumetric_locking_correction)
51 volumetric_strain /= _current_elem_volume;
53 for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
55 if (_volumetric_locking_correction)
57 ADReal correction = (volumetric_strain - _total_strain[_qp].trace()) / 3.0;
58 _total_strain[_qp](0, 0) += correction;
59 _total_strain[_qp](1, 1) += correction;
60 _total_strain[_qp](2, 2) += correction;
64 _total_strain[_qp] += (*_global_strain)[_qp];
66 _mechanical_strain[_qp] = _total_strain[_qp];
69 for (
auto es : _eigenstrains)
70 _mechanical_strain[_qp] -= (*es)[_qp];
73 copyDualNumbersToValues();