13 #include "libmesh/quadrature.h"
14 #include "libmesh/utility.h"
19 return MooseEnum(
"TaylorExpansion EigenSolution",
"TaylorExpansion");
30 params.addClassDescription(
31 "Compute a strain increment and rotation increment for finite strains.");
32 params.addParam<MooseEnum>(
"decomposition_method",
34 "Methods to calculate the strain and rotation increments");
40 _Fhat(_fe_problem.getMaxQps()),
41 _decomposition_method(getParam<MooseEnum>(
"decomposition_method").getEnum<
DecompMethod>())
49 Real ave_dfgrd_det = 0.0;
50 for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
70 _Fhat[_qp] = A * Fbar.inverse();
71 _Fhat[_qp].addIa(1.0);
76 ave_Fhat +=
_Fhat[_qp] * _JxW[_qp] * _coord[_qp];
91 for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
96 _Fhat[_qp] *= std::cbrt(ave_Fhat.det() /
_Fhat[_qp].det());
152 RankTwoTensor Cinv_I = A * A.transpose() - A - A.transpose();
155 total_strain_increment = -Cinv_I * 0.5 + Cinv_I * Cinv_I * 0.25;
157 const Real a[3] = {invFhat(1, 2) - invFhat(2, 1),
158 invFhat(2, 0) - invFhat(0, 2),
159 invFhat(0, 1) - invFhat(1, 0)};
161 Real q = (a[0] * a[0] + a[1] * a[1] + a[2] * a[2]) / 4.0;
162 Real trFhatinv_1 = invFhat.trace() - 1.0;
163 const Real p = trFhatinv_1 * trFhatinv_1 / 4.0;
166 const Real C1_squared = p +
167 3.0 * Utility::pow<2>(p) * (1.0 - (p + q)) / Utility::pow<2>(p + q) -
168 2.0 * Utility::pow<3>(p) * (1.0 - (p + q)) / Utility::pow<3>(p + q);
169 mooseAssert(C1_squared >= 0.0,
170 "Cannot take square root of a negative number. This may happen when elements "
171 "become heavily distorted.");
172 const Real C1 = std::sqrt(C1_squared);
177 C2 = (1.0 - C1) / (4.0 * q);
180 C2 = 0.125 + q * 0.03125 * (Utility::pow<2>(p) - 12.0 * (p - 1.0)) / Utility::pow<2>(p) +
181 Utility::pow<2>(q) * (p - 2.0) * (Utility::pow<2>(p) - 10.0 * p + 32.0) /
184 (1104.0 - 992.0 * p + 376.0 * Utility::pow<2>(p) - 72.0 * Utility::pow<3>(p) +
185 5.0 * Utility::pow<4>(p)) /
186 (512.0 * Utility::pow<4>(p));
189 (p * q * (3.0 - q) + Utility::pow<3>(p) + Utility::pow<2>(q)) / Utility::pow<3>(p + q);
190 mooseAssert(C3_test >= 0.0,
191 "Cannot take square root of a negative number. This may happen when elements "
192 "become heavily distorted.");
193 const Real C3 = 0.5 * std::sqrt(C3_test);
199 for (
unsigned int i = 0; i < 3; ++i)
200 for (
unsigned int j = 0; j < 3; ++j)
201 R_incr(i, j) += C2 * a[i] * a[j];
203 R_incr(0, 1) += C3 * a[2];
204 R_incr(0, 2) -= C3 * a[1];
205 R_incr(1, 0) -= C3 * a[2];
206 R_incr(1, 2) += C3 * a[0];
207 R_incr(2, 0) += C3 * a[1];
208 R_incr(2, 1) -= C3 * a[0];
210 rotation_increment = R_incr.transpose();
216 std::vector<Real> e_value(3);
220 Chat.symmetricEigenvaluesEigenvectors(e_value, e_vector);
222 const Real lambda1 = std::sqrt(e_value[0]);
223 const Real lambda2 = std::sqrt(e_value[1]);
224 const Real lambda3 = std::sqrt(e_value[2]);
226 N1.vectorOuterProduct(e_vector.column(0), e_vector.column(0));
227 N2.vectorOuterProduct(e_vector.column(1), e_vector.column(1));
228 N3.vectorOuterProduct(e_vector.column(2), e_vector.column(2));
230 const RankTwoTensor Uhat = N1 * lambda1 + N2 * lambda2 + N3 * lambda3;
233 rotation_increment =
_Fhat[_qp] * invUhat;
235 total_strain_increment =
236 N1 * std::log(lambda1) + N2 * std::log(lambda2) + N3 * std::log(lambda3);
241 mooseError(
"ComputeFiniteStrain Error: Pass valid decomposition type: TaylorExpansion or "