11 #include "libmesh/quadrature.h"
17 template <ComputeStage compute_stage>
22 params.addClassDescription(
23 "Compute a strain increment and rotation increment for small strains.");
27 template <ComputeStage compute_stage>
29 const InputParameters & parameters)
34 template <ComputeStage compute_stage>
38 ADReal volumetric_strain = 0.0;
39 for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
41 ADRankTwoTensor total_strain_increment;
42 computeTotalStrainIncrement(total_strain_increment);
44 _strain_increment[_qp] = total_strain_increment;
46 if (_volumetric_locking_correction)
47 volumetric_strain += total_strain_increment.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 const auto correction = (volumetric_strain - _strain_increment[_qp].trace()) / 3.0;
58 _strain_increment[_qp](0, 0) += correction;
59 _strain_increment[_qp](1, 1) += correction;
60 _strain_increment[_qp](2, 2) += correction;
63 _total_strain[_qp] = _strain_increment[_qp] + _total_strain_old[_qp];
66 subtractEigenstrainIncrementFromStrain(_strain_increment[_qp]);
70 _strain_rate[_qp] = _strain_increment[_qp] / _dt;
72 _strain_rate[_qp].zero();
75 _mechanical_strain[_qp] = _strain_increment[_qp] + _mechanical_strain_old[_qp];
78 _rotation_increment[_qp].setToIdentity();
81 copyDualNumbersToValues();
84 template <ComputeStage compute_stage>
87 ADRankTwoTensor & total_strain_increment)
91 (*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]);
93 (*_grad_disp_old[1])[_qp],
94 (*_grad_disp_old[2])[_qp]);
98 total_strain_increment = 0.5 * (A + A.transpose());