12 #include "libmesh/quadrature.h"
16 template <ComputeStage compute_stage>
21 params.addClassDescription(
22 "Compute a strain increment and rotation increment for finite strains in 2D geometries.");
24 MooseEnum outOfPlaneDirection(
"x y z",
"z");
25 params.addParam<MooseEnum>(
26 "out_of_plane_direction", outOfPlaneDirection,
"The direction of the out-of-plane strain.");
30 template <ComputeStage compute_stage>
33 _out_of_plane_direction(getParam<MooseEnum>(
"out_of_plane_direction"))
37 template <ComputeStage compute_stage>
41 for (
unsigned int i = 0; i < 3; ++i)
43 if (_out_of_plane_direction == i)
45 _disp[i] = &adZeroValue();
46 _grad_disp[i] = &adZeroGradient();
50 _disp[i] = &adCoupledValue(
"displacements", i);
51 _grad_disp[i] = &adCoupledGradient(
"displacements", i);
54 if (_fe_problem.isTransient() && i != _out_of_plane_direction)
55 _grad_disp_old[i] = &coupledGradientOld(
"displacements", i);
57 _grad_disp_old[i] = &_grad_zero;
61 template <ComputeStage compute_stage>
65 ADRankTwoTensor ave_Fhat;
67 for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
70 ADRankTwoTensor A((*_grad_disp[0])[_qp],
71 (*_grad_disp[1])[_qp],
72 (*_grad_disp[2])[_qp]);
74 (*_grad_disp_old[1])[_qp],
75 (*_grad_disp_old[2])[_qp]);
79 A(_out_of_plane_direction, _out_of_plane_direction) = computeOutOfPlaneGradDisp();
80 Fbar(_out_of_plane_direction, _out_of_plane_direction) = computeOutOfPlaneGradDispOld();
87 _Fhat[_qp] = A * Fbar.inverse();
88 _Fhat[_qp].addIa(1.0);
91 if (_volumetric_locking_correction)
92 ave_Fhat += _Fhat[_qp] * _JxW[_qp] * _coord[_qp];
95 if (_volumetric_locking_correction)
96 ave_Fhat /= _current_elem_volume;
98 for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
101 if (_volumetric_locking_correction)
102 _Fhat[_qp] *= std::cbrt(ave_Fhat.det() / _Fhat[_qp].det());
108 template <ComputeStage compute_stage>
112 if (_out_of_plane_direction != 2 && _ndisp != 3)
113 mooseError(
"For 2D simulations where the out-of-plane direction is x or y the number of "
114 "supplied displacements must be three.");
115 else if (_out_of_plane_direction == 2 && _ndisp != 2)
116 mooseError(
"For 2D simulations where the out-of-plane direction is z the number of supplied "
117 "displacements must be two.");