23 "large_kinematics",
false,
"Use large displacement kinematics in the kernel.");
24 params.
addParam<
bool>(
"stabilize_strain",
false,
"Average the volumetric strains");
25 MooseEnum F_bar_mode(
"total incremental",
"total");
29 "What deformation gradient F-bar averages over (only used when `stabilize_strain = true`). " 30 "'total' (default) averages the full F at each qp and rescales each qp's F by " 31 "cbrt(det(F_avg)/det(F_ust)). 'incremental' averages the incremental F " 32 "(F_ust * F_ust_old^{-1}) at each qp and rescales by cbrt(det(f_avg)/det(f_ust)); this is " 33 "bit-for-bit compatible with the OLD `ComputeFiniteStrain` + `volumetric_locking_correction " 35 "true` formulation. Set to 'incremental' when cross-checking against the old kernel system.");
37 "publish_rotation_increment",
39 "If true, publish `rotation_increment = exp(vorticity_increment)` (Rodrigues) for " 40 "downstream consumers that rotate by it (e.g. `ComputeMultiPlasticityStress` with " 41 "`perform_finite_strain_rotations = true`). Default false keeps `rotation_increment = I` " 42 "(the historical behavior -- the Lagrangian objective-rate machinery applies rotation " 43 "externally). Enable when wrapping plasticity that needs its internal stress state to " 44 "track the rotated Cauchy stress between steps, in tandem with `rotate_old_stress = true` " 45 "on the objective rate.");
49 "alpha >= 0.5 & alpha <= 1.0",
50 "Generalized midpoint weight for the deformation gradient. 1.0 = backward Euler (default), " 51 "0.5 = midpoint rule (matches Abaqus/Implicit).");
52 MooseEnum kinematic_approximation(
"linear quadratic rashid_approximate rashid_eigen",
"linear");
54 "kinematic_approximation",
55 kinematic_approximation,
56 "Approximation to the increment in the spatial velocity gradient: 'linear' (default; " 57 "dL = I - f^{-1}), 'quadratic' (one more Taylor term), 'rashid_approximate' (Rashid's " 58 "symmetric+skew formulas), or 'rashid_eigen' (exact log f via polar decomposition + " 59 "matrix logs). Only affects large_kinematics; small kinematics is always linear.");
60 params.
addParam<std::vector<MaterialPropertyName>>(
61 "eigenstrain_names", {},
"List of eigenstrains to account for");
62 params.
addParam<std::vector<MaterialPropertyName>>(
63 "homogenization_gradient_names",
65 "List of homogenization gradients to add to the displacement gradient");
67 params.
addParam<std::string>(
"base_name",
"Material property base name");
79 _ndisp(coupledComponents(
"displacements")),
80 _disp(coupledValues(
"displacements")),
81 _grad_disp(coupledGradients(
"displacements")),
82 _base_name(isParamValid(
"base_name") ? getParam<
std::string>(
"base_name") +
"_" :
""),
83 _large_kinematics(getParam<bool>(
"large_kinematics")),
84 _stabilize_strain(getParam<bool>(
"stabilize_strain")),
86 _publish_rotation_increment(getParam<bool>(
"publish_rotation_increment")),
87 _alpha(getParam<
Real>(
"alpha")),
88 _kinematic_approximation(
90 _eigenstrain_names(getParam<
std::vector<MaterialPropertyName>>(
"eigenstrain_names")),
91 _eigenstrains(_eigenstrain_names.size()),
92 _eigenstrains_old(_eigenstrain_names.size()),
93 _total_strain(declareProperty<
RankTwoTensor>(_base_name +
"total_strain")),
94 _total_strain_old(getMaterialPropertyOld<
RankTwoTensor>(_base_name +
"total_strain")),
95 _mechanical_strain(declareProperty<
RankTwoTensor>(_base_name +
"mechanical_strain")),
96 _mechanical_strain_old(getMaterialPropertyOld<
RankTwoTensor>(_base_name +
"mechanical_strain")),
97 _rotated_mechanical_strain(
98 declareProperty<
RankTwoTensor>(_base_name +
"rotated_mechanical_strain")),
99 _rotated_mechanical_strain_old(
100 getMaterialPropertyOld<
RankTwoTensor>(_base_name +
"rotated_mechanical_strain")),
101 _strain_increment(declareProperty<
RankTwoTensor>(_base_name +
"strain_increment")),
102 _deformation_gradient_increment(
103 declareProperty<
RankTwoTensor>(_base_name +
"spatial_deformation_gradient_increment")),
104 _vorticity_increment(declareProperty<
RankTwoTensor>(_base_name +
"vorticity_increment")),
105 _F_ust(declareProperty<
RankTwoTensor>(_base_name +
"unstabilized_deformation_gradient")),
107 getMaterialPropertyOld<
RankTwoTensor>(_base_name +
"unstabilized_deformation_gradient")),
108 _F_actual(declareProperty<
RankTwoTensor>(_base_name +
"actual_deformation_gradient")),
109 _F_avg(declareProperty<
RankTwoTensor>(_base_name +
"average_deformation_gradient")),
110 _F(declareProperty<
RankTwoTensor>(_base_name +
"deformation_gradient")),
111 _F_old(getMaterialPropertyOld<
RankTwoTensor>(_base_name +
"deformation_gradient")),
112 _F_inv(declareProperty<
RankTwoTensor>(_base_name +
"inverse_deformation_gradient")),
113 _f_inv(declareProperty<
RankTwoTensor>(_base_name +
"inverse_incremental_deformation_gradient")),
115 declareProperty<
RankTwoTensor>(_base_name +
"inverse_unstabilized_deformation_gradient")),
116 _F_ust_det(declareProperty<
Real>(_base_name +
"det_unstabilized_deformation_gradient")),
117 _d_deformation_gradient_increment_d_F(declareProperty<
RankFourTensor>(
118 _base_name +
"d_spatial_deformation_gradient_increment_d_deformation_gradient")),
120 _base_name +
"d_vorticity_increment_d_deformation_gradient")),
122 declareProperty<
RankFourTensor>(_base_name +
"d_deformation_gradient_d_grad_displacement")),
123 _rotation(declareProperty<
RankTwoTensor>(_base_name +
"rotation")),
124 _stretch(declareProperty<
RankTwoTensor>(_base_name +
"stretch")),
126 declareProperty<
RankFourTensor>(_base_name +
"d_rotation_d_deformation_gradient")),
127 _d_F_stab_d_F_ust(declareProperty<
RankFourTensor>(_base_name +
"d_F_stab_d_F_unstabilized")),
128 _d_F_stab_d_F_avg(declareProperty<
RankFourTensor>(_base_name +
"d_F_stab_d_F_average")),
129 _homogenization_gradient_names(
130 getParam<
std::vector<MaterialPropertyName>>(
"homogenization_gradient_names")),
131 _homogenization_contributions(_homogenization_gradient_names.size()),
132 _rotation_increment(declareProperty<
RankTwoTensor>(_base_name +
"rotation_increment"))
153 mooseError(
"ComputeLagrangianStrainBase cannot accommodate more than one " 154 "homogenization gradient");
174 _total_strain[_qp].zero();
175 _mechanical_strain[_qp].zero();
176 _rotated_mechanical_strain[_qp].zero();
177 _F[_qp].setToIdentity();
178 _F_ust[_qp].setToIdentity();
179 _rotation[_qp].setToIdentity();
187 computeDeformationGradient();
189 for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
190 computeQpProperties();
202 for (
auto contribution : _homogenization_contributions)
204 _F[_qp] += (*contribution)[_qp];
205 _F_ust[_qp] += (*contribution)[_qp];
214 if (_large_kinematics && isPropertyActive(_F_ust_inv.id()))
216 _F_ust_inv[_qp] = _F_ust[_qp].inverse();
217 _F_ust_det[_qp] = _F_ust[_qp].det();
226 const bool need_jacobian = _fe_problem.currentlyComputingJacobian() ||
227 _fe_problem.currentlyComputingResidualAndJacobian();
234 if (_large_kinematics)
236 _F_inv[_qp] = _F[_qp].inverse();
246 if (_stabilize_strain && _F_bar_mode == FBarMode::Incremental)
247 _f_inv[_qp] = _F_ust_old[_qp] * _F_inv[_qp];
249 _f_inv[_qp] = _F_old[_qp] * _F_inv[_qp];
258 computeQpLargeKinematicIncrement(
259 _f_inv[_qp], dd, dw, d_dL_d_f_inv, d_dw_d_f_inv, need_jacobian);
264 usingTensorIndices(p_, q_, m_, n_);
265 const RankFourTensor d_f_inv_d_F = -_f_inv[_qp].template times<p_, m_, n_, q_>(_F_inv[_qp]);
266 _d_deformation_gradient_increment_d_F[_qp] = d_dL_d_f_inv * d_f_inv_d_F;
267 _d_vorticity_increment_d_F[_qp] = d_dw_d_f_inv * d_f_inv_d_F;
270 setQpIncrementalStrains(dd, dw);
277 if (isPropertyActive(_rotation.id()) || isPropertyActive(_stretch.id()))
278 computeQpPolarDecomposition(need_jacobian);
291 usingTensorIndices(i_, j_, k_, l_);
293 _d_vorticity_increment_d_F[_qp] =
297 _d_rotation_d_F[_qp].zero();
299 _rotation[_qp].setToIdentity();
300 _stretch[_qp].setToIdentity();
317 const auto sqrt_C = MathUtils::sqrt(
C);
318 _stretch[_qp] = sqrt_C.get();
320 _rotation[_qp] =
F * U_inv;
327 const RankTwoTensor Y = _stretch[_qp].trace() * I - _stretch[_qp];
330 usingTensorIndices(i_, j_, k_, l_);
331 _d_rotation_d_F[_qp] =
332 (O.template times<i_, k_, l_, j_>(
Y) -
Z.template times<i_, l_, k_, j_>(
Z)) /
Y.det();
344 switch (_kinematic_approximation)
346 case KinematicApproximation::Linear:
347 computeLinearIncrement(f_inv, dd, dw, d_dL_d_f_inv, d_dw_d_f_inv, need_jacobian);
349 case KinematicApproximation::Quadratic:
350 computeQuadraticIncrement(f_inv, dd, dw, d_dL_d_f_inv, d_dw_d_f_inv, need_jacobian);
352 case KinematicApproximation::RashidApproximate:
353 computeRashidApproximateIncrement(f_inv, dd, dw, d_dL_d_f_inv, d_dw_d_f_inv, need_jacobian);
355 case KinematicApproximation::RashidEigen:
356 computeRashidEigenIncrement(f_inv, dd, dw, d_dL_d_f_inv, d_dw_d_f_inv, need_jacobian);
374 _strain_increment[_qp] = dd;
375 _vorticity_increment[_qp] = dw;
378 _deformation_gradient_increment[_qp] = dd + dw;
381 _total_strain[_qp] = _total_strain_old[_qp] + _strain_increment[_qp];
386 subtractQpEigenstrainIncrement(_strain_increment[_qp]);
389 _mechanical_strain[_qp] = _mechanical_strain_old[_qp] + _strain_increment[_qp];
398 if (_large_kinematics)
400 const Real theta2 = 0.5 * dw.doubleContraction(dw);
401 const Real theta = std::sqrt(theta2);
403 const Real small_theta = 1.0e-7;
404 if (theta < small_theta)
406 f = 1.0 - theta2 / 6.0;
407 g = 0.5 - theta2 / 24.0;
411 f = std::sin(theta) / theta;
412 g = (1.0 - std::cos(theta)) / theta2;
420 _rotated_mechanical_strain[_qp] =
421 r_hat * (_rotated_mechanical_strain_old[_qp] + _strain_increment[_qp]) * r_hat.
transpose();
434 _rotation_increment[_qp] = (_publish_rotation_increment && _large_kinematics)
435 ? computeQpRotationIncrement(_f_inv[_qp], dw)
446 bool need_jacobian)
const 458 usingTensorIndices(i_, j_, m_, n_);
470 bool need_jacobian)
const 482 usingTensorIndices(i_, j_, m_, n_);
485 I2.template times<i_, m_, n_, j_>(
X) +
X.template times<i_, m_, j_, n_>(I2);
488 d_dw_d_f_inv = 0.5 * (d_dL_d_f_inv - d_dL_d_f_inv.
transposeIj());
498 bool need_jacobian)
const 505 usingTensorIndices(i_, j_, m_, n_);
513 dd = -0.5 *
A + 0.25 *
A *
A;
518 for (
unsigned int i = 0; i < 3; ++i)
521 for (
unsigned int j = 0;
j < 3; ++
j)
522 for (
unsigned int k = 0;
k < 3; ++
k)
533 const Real Q = std::min(Q_raw, 1.0 - 1.0e-12);
538 const Real small_Q = 1.0e-12;
542 for (
unsigned int i = 0; i < 3; ++i)
543 for (
unsigned int j = 0;
j < 3; ++
j)
546 for (
unsigned int k = 0;
k < 3; ++
k)
552 d_dw_d_f_inv = -0.5 * (I4 - I2.template times<j_, m_, i_, n_>(I2));
556 const Real sin_theta = std::sqrt(Q);
557 const Real cos_theta = std::sqrt(1.0 - Q);
558 const Real theta = std::asin(sin_theta);
559 const Real coeff = -theta / (2.0 * sin_theta);
561 for (
unsigned int i = 0; i < 3; ++i)
562 for (
unsigned int j = 0;
j < 3; ++
j)
565 for (
unsigned int k = 0;
k < 3; ++
k)
567 dw(i,
j) = coeff *
v;
587 (theta * cos_theta - sin_theta) / (8.0 * sin_theta * sin_theta * sin_theta * cos_theta);
588 for (
unsigned int i = 0; i < 3; ++i)
589 for (
unsigned int j = 0;
j < 3; ++
j)
592 for (
unsigned int k = 0;
k < 3; ++
k)
594 for (
unsigned int m = 0; m < 3; ++m)
595 for (
unsigned int n = 0; n < 3; ++n)
597 Real eps_alpha = 0.0;
598 for (
unsigned int k = 0;
k < 3; ++
k)
600 const Real dc_dfinv = dc_pref * eps_alpha;
602 for (
unsigned int k = 0;
k < 3; ++
k)
604 d_dw_d_f_inv(i,
j, m, n) = dc_dfinv * E_ij + coeff * dE_dfinv;
619 I2.template times<i_, m_, j_, n_>(
X) +
X.template times<i_, n_, j_, m_>(I2);
620 const RankFourTensor d_Xt_dX = I2.template times<j_, m_, i_, n_>(I2);
625 I2.template times<i_, m_, n_, j_>(
A) +
A.template times<i_, m_, j_, n_>(I2);
628 const RankFourTensor d_dd_dfinv = -0.5 * dA_dfinv + 0.25 * d_AA_dfinv;
629 d_dL_d_f_inv = d_dd_dfinv + d_dw_d_f_inv;
639 bool need_jacobian)
const 650 usingTensorIndices(a_, b_, m_, n_);
656 const auto sqrt_cprime = MathUtils::sqrt(cprime);
665 const RankTwoTensor dd_spatial = -0.5 * MathUtils::log(cprime).get();
670 const Real sin2 = std::max(1.0 - cos_theta * cos_theta, 0.0);
671 const Real sin_theta = std::sqrt(sin2);
672 const Real theta = std::acos(cos_theta);
681 const Real small_sin = 1.0e-7;
684 usingTensorIndices(i_, j_, k_, l_);
685 if (std::abs(sin_theta) < small_sin)
690 const RankFourTensor swap_ij = I2.template times<j_, m_, i_, n_>(I2);
696 const Real phi = theta / (2.0 * sin_theta);
700 const Real psi = (theta * cos_theta - sin_theta) / (4.0 * sin_theta * sin2);
701 const RankFourTensor swap_ij = I2.template times<j_, m_, i_, n_>(I2);
704 const RankFourTensor dphi_outer_A =
A.template times<i_, j_, m_, n_>(I2);
724 I2.template times<a_, n_, m_, b_>(f_inv) + I2.template times<b_, n_, m_, a_>(f_inv);
725 const RankFourTensor d_dd_spatial_d_finv = -0.5 * (dlog_cprime * d_cprime_d_finv);
733 (O.template times<i_, k_, l_, j_>(
Y) -
Z.template times<i_, l_, k_, j_>(
Z)) /
Y.det();
735 d_dw_d_f_inv = -(d_logr_d_r * d_r_d_finv);
742 usingTensorIndices(i2_, j2_, m2_, n2_, p2_);
746 const RankFourTensor T1 =
M.template times<p2_, j2_, i2_, p2_, m2_, n2_>(d_r_d_finv);
748 const RankFourTensor mid = r.template times<i2_, p2_, p2_, j2_, m2_, n2_>(d_dd_spatial_d_finv);
749 const RankFourTensor T2 = r.template times<j2_, p2_, i2_, p2_, m2_, n2_>(mid);
751 const RankFourTensor T3 =
N.template times<i2_, p2_, j2_, p2_, m2_, n2_>(d_r_d_finv);
753 d_dL_d_f_inv = d_dd_d_finv + d_dw_d_f_inv;
761 for (
auto i :
make_range(_eigenstrain_names.size()))
762 strain -= (*_eigenstrains[i])[_qp] - (*_eigenstrains_old[i])[_qp];
774 _F_ust[_qp].setToIdentity();
775 const bool include_old = _alpha != 1.0 && _fe_problem.isTransient();
778 G::addGradOp(_F_ust[_qp],
784 G::addGradOp(_F_ust[_qp],
786 (1.0 - _alpha) * (*_grad_disp_old[
component])[_qp],
787 (1.0 - _alpha) * (*_disp_old[
component])[_qp],
798 _F_actual[_qp].setToIdentity();
800 G::addGradOp(_F_actual[_qp],
812 for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
814 computeQpUnstabilizedDeformationGradient();
815 computeQpActualDeformationGradient();
816 _F[_qp] = _F_ust[_qp];
819 usingTensorIndices(i_, j_, k_, l_);
826 const bool need_jacobian = _fe_problem.currentlyComputingJacobian() ||
827 _fe_problem.currentlyComputingResidualAndJacobian();
830 if (_stabilize_strain)
839 const bool incremental = (_F_bar_mode == FBarMode::Incremental);
840 if (incremental && !_large_kinematics)
841 mooseError(
"`F_bar_mode = incremental` requires `large_kinematics = true`. The " 842 "incremental F-bar formulation is the multiplicative correction to the " 843 "incremental F, which is only defined for large kinematics. Use " 844 "`F_bar_mode = total` (the default) with small kinematics.");
846 [
this](
unsigned int qp) {
return _F_ust[qp]; }, _JxW, _coord);
850 {
return _F_ust[qp] * _F_ust_old[qp].inverse(); },
855 _F_avg.set().setAllValues(F_avg);
858 const auto & avg_for_chain = incremental ? f_avg : F_avg;
860 for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
862 if (_large_kinematics)
874 const Real det_ust_local =
875 incremental ? _F_ust[_qp].det() / _F_ust_old[_qp].det() : _F[_qp].det();
876 const Real gamma =
std::pow(avg_for_chain.det() / det_ust_local, 1.0 / 3.0);
879 const auto Fust_invT = _F_ust[_qp].inverse().transpose();
880 const auto avg_invT = avg_for_chain.inverse().transpose();
881 _d_F_stab_d_F_ust[_qp] =
883 (gamma / 3.0) * _F_ust[_qp].template times<i_, j_, k_, l_>(Fust_invT);
884 _d_F_stab_d_F_avg[_qp] =
885 (gamma / 3.0) * _F_ust[_qp].template times<i_, j_, k_, l_>(avg_invT);
896 const auto outer = I2.template times<i_, j_, k_, l_>(I2);
898 _d_F_stab_d_F_avg[_qp] = (1.0 / 3.0) * outer;
900 _F[_qp] += (F_avg.trace() - _F[_qp].trace()) * I2 / 3.0;
904 else if (need_jacobian)
907 for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
910 _d_F_stab_d_F_avg[_qp].zero();
924 if (_kinematic_approximation == KinematicApproximation::RashidApproximate)
927 f_inv(1, 2) - f_inv(2, 1), f_inv(2, 0) - f_inv(0, 2), f_inv(0, 1) - f_inv(1, 0)};
928 const Real q = (
a[0] *
a[0] +
a[1] *
a[1] +
a[2] *
a[2]) / 4.0;
929 const Real trFhatinv_1 = f_inv.
trace() - 1.0;
930 const Real p = trFhatinv_1 * trFhatinv_1 / 4.0;
931 const Real C1_squared =
p +
932 3.0 * Utility::pow<2>(
p) * (1.0 - (
p + q)) / Utility::pow<2>(
p + q) -
933 2.0 * Utility::pow<3>(
p) * (1.0 - (
p + q)) / Utility::pow<3>(
p + q);
934 if (C1_squared <= 0.0)
936 "Cannot take square root of a number less than or equal to zero in the calculation of " 937 "C1 for the Rashid approximation for the rotation tensor.");
938 const Real C1 = std::sqrt(C1_squared);
941 C2 = (1.0 - C1) / (4.0 * q);
943 C2 = 0.125 + q * 0.03125 * (Utility::pow<2>(
p) - 12.0 * (
p - 1.0)) / Utility::pow<2>(
p) +
944 Utility::pow<2>(q) * (
p - 2.0) * (Utility::pow<2>(
p) - 10.0 *
p + 32.0) /
947 (1104.0 - 992.0 *
p + 376.0 * Utility::pow<2>(
p) - 72.0 * Utility::pow<3>(
p) +
948 5.0 * Utility::pow<4>(
p)) /
949 (512.0 * Utility::pow<4>(
p));
951 (
p * q * (3.0 - q) + Utility::pow<3>(
p) + Utility::pow<2>(q)) / Utility::pow<3>(
p + q);
954 "Cannot take square root of a number less than or equal to zero in the calculation of " 955 "C3_test for the Rashid approximation for the rotation tensor.");
956 const Real C3 = 0.5 * std::sqrt(C3_test);
959 for (
unsigned int i = 0; i < 3; ++i)
960 for (
unsigned int j = 0;
j < 3; ++
j)
961 R_incr(i,
j) += C2 *
a[i] *
a[
j];
962 R_incr(0, 1) += C3 *
a[2];
963 R_incr(0, 2) -= C3 *
a[1];
964 R_incr(1, 0) -= C3 *
a[2];
965 R_incr(1, 2) += C3 *
a[0];
966 R_incr(2, 0) += C3 *
a[1];
967 R_incr(2, 1) -= C3 *
a[0];
975 const Real theta = std::sqrt(theta2);
977 const Real small_theta = 1.0e-7;
978 if (theta < small_theta)
980 f = 1.0 - theta2 / 6.0;
981 g = 0.5 - theta2 / 24.0;
985 f = std::sin(theta) / theta;
986 g = (1.0 - std::cos(theta)) / theta2;
RankTwoTensorTempl< Real > inverse() const
int eps(unsigned int i, unsigned int j)
FEProblemBase & _fe_problem
std::vector< const VariableGradient * > _grad_disp_old
Old displacement gradients for the generalized midpoint rule.
virtual void computeQpUnstabilizedDeformationGradient()
Calculate the unstabilized (alpha-weighted) deformation gradient at the quadrature point...
static RankFourTensorTempl< Real > IdentityFour()
void computeRashidEigenIncrement(const RankTwoTensor &f_inv, RankTwoTensor &dd, RankTwoTensor &dw, RankFourTensor &d_dL_d_f_inv, RankFourTensor &d_dw_d_f_inv, bool need_jacobian) const
"Exact" via polar decomposition of f^{-1} + matrix logs.
void mooseError(Args &&... args)
static const std::string component
Add-on class that provides the functionality to issue guarantees for declared material properties...
void issueGuarantee(const MaterialPropertyName &prop_name, Guarantee guarantee)
static InputParameters baseParams()
static RankTwoTensorTempl Identity()
static const std::string F
std::vector< const MaterialProperty< RankTwoTensor > * > _homogenization_contributions
Actual homogenization contributions.
virtual void computeDeformationGradient()
Calculate the unstabilized and optionally the stabilized deformation gradients.
std::vector< MaterialPropertyName > _homogenization_gradient_names
Names of any extra homogenization gradients.
virtual void computeProperties() override
std::vector< const MaterialProperty< RankTwoTensor > * > _eigenstrains_old
void setQpIncrementalStrains(const RankTwoTensor &dd, const RankTwoTensor &dw)
Update strain / vorticity / mechanical-strain bookkeeping from already-split (dd, dw) tensors...
std::vector< const VariableValue * > _disp_old
Old displacement values for the generalized midpoint rule.
static InputParameters validParams()
Real f(Real x)
Test function for Brents method.
std::vector< const VariableGradient *> coupledGradientsOld(const std::string &var_name) const
std::vector< const MaterialProperty< RankTwoTensor > * > _eigenstrains
void addIa(const Real &a)
Real doubleContraction(const RankTwoTensorTempl< Real > &a) const
std::vector< MaterialPropertyName > _eigenstrain_names
void computeLinearIncrement(const RankTwoTensor &f_inv, RankTwoTensor &dd, RankTwoTensor &dw, RankFourTensor &d_dL_d_f_inv, RankFourTensor &d_dw_d_f_inv, bool need_jacobian) const
Linear approximation: dL = I - f^{-1}.
virtual void initQpStatefulProperties() override
const bool _large_kinematics
If true the equilibrium conditions is calculated with large deformations.
virtual void subtractQpEigenstrainIncrement(RankTwoTensor &strain)
Subtract the eigenstrain increment to subtract from the total strain.
void computeQpPolarDecomposition(bool need_jacobian)
Compute and publish the polar decomposition of _F_actual at the current qp.
RankTwoTensor computeQpRotationIncrement(const RankTwoTensor &f_inv, const RankTwoTensor &dw) const
Rotation increment matched to the active _kinematic_approximation, suitable for publishing as _rotati...
RankTwoTensorTempl< Real > transpose() const
RankFourTensorTempl< T > transposeIj() const
virtual void computeQpActualDeformationGradient()
Calculate the actual deformation gradient at n+1 (no alpha weighting, no F-bar)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const std::string _base_name
Material system base name.
KinematicApproximation
Approximation used to convert the inverse incremental deformation gradient f^{-1} into the increment ...
static const std::string alpha
IntRange< T > make_range(T beg, T end)
void computeQuadraticIncrement(const RankTwoTensor &f_inv, RankTwoTensor &dd, RankTwoTensor &dw, RankFourTensor &d_dL_d_f_inv, RankFourTensor &d_dw_d_f_inv, bool need_jacobian) const
Quadratic approximation: dL = (I - f^{-1}) + 0.5 (I - f^{-1})^2.
void mooseError(Args &&... args) const
Calculate strains to use the MOOSE materials with the Lagrangian kernels.
auto elementAverage(const Functor &f, const MooseArray< Real > &JxW, const MooseArray< Real > &coord)
FBarMode
What F gets F-bar volumetric correction applied to.
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
void computeRashidApproximateIncrement(const RankTwoTensor &f_inv, RankTwoTensor &dd, RankTwoTensor &dw, RankFourTensor &d_dL_d_f_inv, RankFourTensor &d_dw_d_f_inv, bool need_jacobian) const
Rashid's approximate symmetric+skew formulas.
virtual void computeQpIncrementalStrains(const RankTwoTensor &dL)
Calculate the strains based on the spatial velocity gradient.
virtual bool isTransient() const override
T clamp(const T &x, T2 lowerlimit, T2 upperlimit)
void computeQpLargeKinematicIncrement(const RankTwoTensor &f_inv, RankTwoTensor &dd, RankTwoTensor &dw, RankFourTensor &d_dL_d_f_inv, RankFourTensor &d_dw_d_f_inv, bool need_jacobian)
Dispatcher: compute (Deltad, Deltaw, d(Deltal)/d(f^{-1}), d(Deltaw)/d(f^{-1})) for the active kinemat...
MooseUnits pow(const MooseUnits &, int)
static const std::string k
static const std::string C
std::vector< const VariableValue *> coupledValuesOld(const std::string &var_name) const
ComputeLagrangianStrainBase(const InputParameters ¶meters)
virtual void computeQpProperties() override