20 params.addClassDescription(
"Capped Drucker-Prager plasticity stress calculator for the Cosserat "
21 "situation where the host medium (ie, the limit where all Cosserat "
22 "effects are zero) is isotropic. Note that the return-map flow rule "
23 "uses an isotropic elasticity tensor built with the 'host' properties "
24 "defined by the user.");
25 params.addRequiredRangeCheckedParam<Real>(
"host_youngs_modulus",
26 "host_youngs_modulus>0",
27 "Young's modulus for the isotropic host medium");
28 params.addRequiredRangeCheckedParam<Real>(
"host_poissons_ratio",
29 "host_poissons_ratio>=0 & host_poissons_ratio<0.5",
30 "Poisson's ratio for the isotropic host medium");
35 const InputParameters & parameters)
37 _shear(getParam<Real>(
"host_youngs_modulus") /
38 (2.0 * (1.0 + getParam<Real>(
"host_poissons_ratio"))))
40 const Real young = getParam<Real>(
"host_youngs_modulus");
41 const Real poisson = getParam<Real>(
"host_poissons_ratio");
42 const Real lambda = young * poisson / ((1.0 + poisson) * (1.0 - 2.0 * poisson));
43 _Ehost.fillFromInputVector({lambda,
_shear}, RankFourTensor::symmetric_isotropic);
60 const std::vector<Real> & ,
69 const Real p_trial = stress_trial.trace();
73 symm_stress += q_ok /
_in_q_trial * 0.5 * (stress_trial + stress_trial.transpose());
74 stress = symm_stress + 0.5 * (stress_trial - stress_trial.transpose());
88 bool compute_full_tangent_operator,
91 if (!compute_full_tangent_operator)
103 cto(i, j, k, l) = 0.5 * (Eijkl(i, j, k, l) + Eijkl(j, i, k, l));
104 EAijkl(i, j, k, l) = 0.5 * (Eijkl(i, j, k, l) - Eijkl(j, i, k, l));
109 : (0.5 * (stress + stress.transpose()) -
110 stress.trace() *
RankTwoTensor(RankTwoTensor::initIdentity) / 3.0) /
112 const RankTwoTensor E_s_over_q = Eijkl.innerProductTranspose(s_over_q);
114 RankTwoTensor(RankTwoTensor::initIdentity).initialContraction(Eijkl);
121 cto(i, j, k, l) -= (i == j) * (1.0 / 3.0) *
122 (Ekl(k, l) * (1.0 -
_dp_dpt) + 0.5 * E_s_over_q(k, l) * (-
_dp_dqt));
124 s_over_q(i, j) * (Ekl(k, l) * (-
_dq_dpt) + 0.5 * E_s_over_q(k, l) * (1.0 -
_dq_dqt));
127 if (smoothed_q.
dg[1] != 0.0)
133 inv = inv.transposeMajor().invSymm();
135 catch (
const MooseException & e)
139 mooseWarning(
"CappedDruckerPragerCosseratStressUpdate: Cannot invert 1+T in consistent "
140 "tangent operator computation at quadpoint ",
143 _current_elem->id());
146 cto = (cto.transposeMajor() * inv).transposeMajor();