12 #include "libmesh/utility.h"
19 return MooseEnum(
"TaylorExpansion EigenSolution",
"TaylorExpansion");
27 params.addClassDescription(
28 "Class for computing nodal quantities for residual and jacobian calculation "
29 "for Self-stabilized Non-Ordinary State-based PeriDynamic (SNOSPD) "
30 "correspondence model under finite strain assumptions");
32 params.addParam<MooseEnum>(
"decomposition_method",
34 "Methods to calculate the strain and rotation increments");
42 _strain_increment(declareProperty<
RankTwoTensor>(
"strain_increment")),
43 _rotation_increment(declareProperty<
RankTwoTensor>(
"rotation_increment")),
44 _deformation_gradient_old(getMaterialPropertyOld<
RankTwoTensor>(
"deformation_gradient")),
45 _mechanical_strain_old(getMaterialPropertyOld<
RankTwoTensor>(
"mechanical_strain")),
46 _total_strain_old(getMaterialPropertyOld<
RankTwoTensor>(
"total_strain")),
47 _eigenstrains_old(_eigenstrain_names.size()),
49 _decomposition_method(getParam<MooseEnum>(
"decomposition_method").getEnum<
DecompMethod>())
112 RankTwoTensor Cinv_I = A * A.transpose() - A - A.transpose();
115 total_strain_increment = -Cinv_I * 0.5 + Cinv_I * Cinv_I * 0.25;
117 const Real a[3] = {invFhat(1, 2) - invFhat(2, 1),
118 invFhat(2, 0) - invFhat(0, 2),
119 invFhat(0, 1) - invFhat(1, 0)};
121 Real q = (a[0] * a[0] + a[1] * a[1] + a[2] * a[2]) / 4.0;
122 Real trFhatinv_1 = invFhat.trace() - 1.0;
123 const Real p = trFhatinv_1 * trFhatinv_1 / 4.0;
127 std::sqrt(p + 3.0 * Utility::pow<2>(p) * (1.0 - (p + q)) / Utility::pow<2>(p + q) -
128 2.0 * Utility::pow<3>(p) * (1.0 - (p + q)) / Utility::pow<3>(p + q));
133 C2 = (1.0 - C1) / (4.0 * q);
136 C2 = 0.125 + q * 0.03125 * (Utility::pow<2>(p) - 12.0 * (p - 1.0)) / Utility::pow<2>(p) +
137 Utility::pow<2>(q) * (p - 2.0) * (Utility::pow<2>(p) - 10.0 * p + 32.0) /
140 (1104.0 - 992.0 * p + 376.0 * Utility::pow<2>(p) - 72.0 * Utility::pow<3>(p) +
141 5.0 * Utility::pow<4>(p)) /
142 (512.0 * Utility::pow<4>(p));
144 0.5 * std::sqrt((p * q * (3.0 - q) + Utility::pow<3>(p) + Utility::pow<2>(q)) /
145 Utility::pow<3>(p + q));
151 for (
unsigned int i = 0; i < 3; ++i)
152 for (
unsigned int j = 0; j < 3; ++j)
153 R_incr(i, j) += C2 * a[i] * a[j];
155 R_incr(0, 1) += C3 * a[2];
156 R_incr(0, 2) -= C3 * a[1];
157 R_incr(1, 0) -= C3 * a[2];
158 R_incr(1, 2) += C3 * a[0];
159 R_incr(2, 0) += C3 * a[1];
160 R_incr(2, 1) -= C3 * a[0];
162 rotation_increment = R_incr.transpose();
167 std::vector<Real> e_value(3);
171 Chat.symmetricEigenvaluesEigenvectors(e_value, e_vector);
173 const Real lambda1 = std::sqrt(e_value[0]);
174 const Real lambda2 = std::sqrt(e_value[1]);
175 const Real lambda3 = std::sqrt(e_value[2]);
177 N1.vectorOuterProduct(e_vector.column(0), e_vector.column(0));
178 N2.vectorOuterProduct(e_vector.column(1), e_vector.column(1));
179 N3.vectorOuterProduct(e_vector.column(2), e_vector.column(2));
181 RankTwoTensor Uhat = N1 * lambda1 + N2 * lambda2 + N3 * lambda3;
184 rotation_increment =
_Fhat[_qp] * invUhat;
186 total_strain_increment =
187 N1 * std::log(lambda1) + N2 * std::log(lambda2) + N3 * std::log(lambda3);
192 mooseError(
"ComputeFiniteStrainNOSPD Error: Invalid decomposition type! Please specify : "
193 "TaylorExpansion or "