12 #include "libmesh/utility.h"
22 params.addClassDescription(
"Capped weak-plane plasticity stress calculator");
23 params.addRequiredParam<UserObjectName>(
25 "A TensorMechanicsHardening UserObject that defines hardening of the cohesion. "
26 "Physically the cohesion should not be negative.");
27 params.addRequiredParam<UserObjectName>(
"tan_friction_angle",
28 "A TensorMechanicsHardening UserObject that defines "
29 "hardening of tan(friction angle). Physically the "
30 "friction angle should be between 0 and 90deg.");
31 params.addRequiredParam<UserObjectName>(
33 "A TensorMechanicsHardening UserObject that defines hardening of the "
34 "tan(dilation angle). Usually the dilation angle is not greater than "
35 "the friction angle, and it is between 0 and 90deg.");
36 params.addRequiredParam<UserObjectName>(
38 "A TensorMechanicsHardening UserObject that defines hardening of the "
39 "weak-plane tensile strength. In physical situations this is positive "
40 "(and always must be greater than negative compressive-strength.");
41 params.addRequiredParam<UserObjectName>(
"compressive_strength",
42 "A TensorMechanicsHardening UserObject that defines "
43 "hardening of the weak-plane compressive strength. In "
44 "physical situations this is positive.");
45 params.addRequiredRangeCheckedParam<Real>(
48 "The cone vertex at shear-stress = 0 will be smoothed by "
49 "the given amount. Typical value is 0.1*cohesion");
50 params.addParam<
bool>(
"perfect_guess",
52 "Provide a guess to the Newton-Raphson procedure "
53 "that is the result from perfect plasticity. With "
54 "severe hardening/softening this may be "
66 _small_smoother2(Utility::
pow<2>(getParam<Real>(
"tip_smoother"))),
67 _perfect_guess(getParam<bool>(
"perfect_guess")),
76 mooseError(
"CappedWeakPlaneStressUpdate: Weak-plane friction and dilation angles must lie in "
79 mooseError(
"CappedWeakPlaneStressUpdate: Weak-plane friction angle must not be less than "
82 mooseError(
"CappedWeakPlaneStressUpdate: Weak-plane cohesion must not be negative");
84 mooseError(
"CappedWeakPlaneStressUpdate: Weak plane tensile strength plus compressive "
85 "strength must be greater than smoothing_tol");
104 const std::vector<Real> & ,
105 const std::vector<Real> & yf,
125 q = std::sqrt(Utility::pow<2>(stress(0, 2)) + Utility::pow<2>(stress(1, 2)));
131 Epp = Eijkl(2, 2, 2, 2);
132 Eqq = Eijkl(0, 2, 0, 2);
140 const std::vector<Real> & ,
145 stress = stress_trial;
149 stress(0, 0) -= Eijkl(2, 2, 0, 0) * gaE /
_Epp * smoothed_q.
dg[0];
150 stress(1, 1) -= Eijkl(2, 2, 1, 1) * gaE /
_Epp * smoothed_q.
dg[0];
152 stress(2, 0) = stress(2, 1) = stress(0, 2) = stress(1, 2) = 0.0;
165 const std::vector<Real> & intnl,
166 std::vector<std::vector<Real>> & dintnl)
const
170 dintnl[0][1] = -1.0 /
_Eqq;
171 dintnl[1][0] = -1.0 /
_Epp;
186 bool compute_full_tangent_operator,
190 if (!compute_full_tangent_operator)
193 const Real Ezzzz = Eijkl(2, 2, 2, 2);
194 const Real Ezxzx = Eijkl(2, 0, 2, 0);
196 const Real dintnl0_dq = -1.0 / Ezxzx;
197 const Real dintnl0_dqt = 1.0 / Ezxzx;
198 const Real dintnl1_dp = -1.0 / Ezzzz;
199 const Real dintnl1_dpt = 1.0 / Ezzzz;
200 const Real dintnl1_dq =
202 const Real dintnl1_dqt =
207 const Real dpt_depii = Eijkl(2, 2, i, i);
208 cto(2, 2, i, i) =
_dp_dpt * dpt_depii;
209 const Real poisson_effect =
210 Eijkl(2, 2, 0, 0) / Ezzzz *
214 gaE * smoothed_q.
d2g_di[0][1] *
217 cto(0, 0, i, i) -= poisson_effect;
218 cto(1, 1, i, i) -= poisson_effect;
226 const Real poisson_effect =
227 -Eijkl(2, 2, 0, 0) / Ezzzz *
230 gaE * smoothed_q.
d2g_di[0][0] * (dintnl0_dqt + dintnl0_dq *
_dq_dqt) +
233 const Real dqt_dep20 = (q_trial == 0.0 ? 1.0 :
_in_trial02 / q_trial) * Eijkl(2, 0, 2, 0);
234 cto(2, 2, 2, 0) = cto(2, 2, 0, 2) =
_dp_dqt * dqt_dep20;
235 cto(0, 0, 2, 0) = cto(0, 0, 0, 2) = cto(1, 1, 2, 0) = cto(1, 1, 0, 2) =
236 poisson_effect * dqt_dep20;
240 cto(0, 2, 0, 2) = cto(2, 0, 0, 2) = cto(0, 2, 2, 0) = cto(2, 0, 2, 0) =
241 Eijkl(2, 0, 2, 0) * q / q_trial +
243 cto(1, 2, 0, 2) = cto(2, 1, 0, 2) = cto(1, 2, 2, 0) = cto(2, 1, 2, 0) =
247 const Real dqt_dep21 = (q_trial == 0.0 ? 1.0 :
_in_trial12 / q_trial) * Eijkl(2, 1, 2, 1);
248 cto(2, 2, 2, 1) = cto(2, 2, 1, 2) =
_dp_dqt * dqt_dep21;
249 cto(0, 0, 2, 1) = cto(0, 0, 1, 2) = cto(1, 1, 2, 1) = cto(1, 1, 1, 2) =
250 poisson_effect * dqt_dep21;
254 cto(0, 2, 1, 2) = cto(2, 0, 1, 2) = cto(0, 2, 2, 1) = cto(2, 0, 2, 1) =
256 cto(1, 2, 1, 2) = cto(2, 1, 1, 2) = cto(1, 2, 2, 1) = cto(2, 1, 2, 1) =
257 Eijkl(2, 1, 2, 1) * q / q_trial +
265 const std::vector<Real> & intnl,
266 std::vector<Real> & yf)
const
272 yf[1] = std::numeric_limits<Real>::lowest();
277 yf[2] = std::numeric_limits<Real>::lowest();
285 const std::vector<Real> & intnl,
286 std::vector<yieldAndFlow> & all_q)
const
292 all_q[1].f = std::numeric_limits<Real>::lowest();
296 all_q[2].f = std::numeric_limits<Real>::lowest();
303 all_q[1].df[0] = 1.0;
304 all_q[2].df[0] = -1.0;
308 all_q[0].df[1] = 1.0;
311 all_q[1].df[1] = 0.0;
312 all_q[2].df[1] = 0.0;
317 all_q[1].df_di[0] = 0.0;
318 all_q[2].df_di[0] = 0.0;
320 all_q[0].df_di[1] = 0.0;
327 all_q[1].dg[0] = 1.0;
328 all_q[2].dg[0] = -1.0;
331 all_q[0].dg[1] = 1.0;
334 all_q[1].dg[1] = 0.0;
335 all_q[2].dg[1] = 0.0;
340 all_q[1].d2g_di[0][0] = 0.0;
341 all_q[2].d2g_di[0][0] = 0.0;
343 all_q[0].d2g_di[0][1] = 0.0;
344 all_q[1].d2g_di[0][1] = 0.0;
345 all_q[2].d2g_di[0][1] = 0.0;
347 all_q[0].d2g_di[1][0] = 0.0;
348 all_q[1].d2g_di[1][0] = 0.0;
349 all_q[2].d2g_di[1][0] = 0.0;
351 all_q[0].d2g_di[1][1] = 0.0;
352 all_q[1].d2g_di[1][1] = 0.0;
353 all_q[2].d2g_di[1][1] = 0.0;
357 all_q[0].d2g[0][0] = 0.0;
358 all_q[1].d2g[0][0] = 0.0;
359 all_q[2].d2g[0][0] = 0.0;
361 all_q[0].d2g[0][1] = 0.0;
362 all_q[1].d2g[0][1] = 0.0;
363 all_q[2].d2g[0][1] = 0.0;
365 all_q[0].d2g[1][0] = 0.0;
366 all_q[1].d2g[1][0] = 0.0;
367 all_q[2].d2g[1][0] = 0.0;
370 all_q[0].d2g[1][1] = 0.0;
373 all_q[1].d2g[1][1] = 0.0;
374 all_q[2].d2g[1][1] = 0.0;
380 const std::vector<Real> & intnl_old,
384 std::vector<Real> & intnl)
const
400 const Real q_at_T = coh - tens * tanphi;
401 const Real q_at_C = coh + comp * tanphi;
403 if ((p_trial >= tens) && (q_trial <= q_at_T))
410 else if ((p_trial <= -comp) && (q_trial <= q_at_C))
421 const Real ga = (q_trial + p_trial * tanphi - coh) / (
_Eqq +
_Epp * tanphi * tanpsi);
422 if (ga <= 0 && p_trial <= tens && p_trial >= -comp)
432 q = q_trial -
_Eqq * ga;
433 if (q <= 0.0 && q_at_T <= 0.0)
439 gaE = (p_trial - p) / tanpsi;
441 else if (q <= q_at_T)
446 gaE = (p_trial - p) / tanpsi;
448 else if (q >= q_at_C)
453 if (p - p_trial <
_Epp * tanpsi * (q_trial - q) /
_Eqq)
458 gaE = (p - p_trial) / tanpsi;
463 p = p_trial -
_Epp * ga * tanpsi;
477 const std::vector<Real> & intnl_old,
478 std::vector<Real> & intnl)
const
480 intnl[0] = intnl_old[0] + (q_trial - q) /
_Eqq;
482 intnl[1] = intnl_old[1] + (p_trial - p) /
_Epp - (q_trial - q) * tanpsi /
_Eqq;
503 const Real q = std::sqrt(Utility::pow<2>(stress(2, 0)) + Utility::pow<2>(stress(2, 1)));
506 deriv(2, 0) = deriv(0, 2) = 0.5 * stress(2, 0) / q;
507 deriv(2, 1) = deriv(1, 2) = 0.5 * stress(2, 1) / q;
512 deriv(2, 0) = deriv(0, 2) = 0.5;
513 deriv(2, 1) = deriv(1, 2) = 0.5;
523 const Real q = std::sqrt(Utility::pow<2>(stress(2, 0)) + Utility::pow<2>(stress(2, 1)));
528 dq(2, 0) = dq(0, 2) = 0.25 * (stress(2, 0) + stress(0, 2)) / q;
529 dq(2, 1) = dq(1, 2) = 0.25 * (stress(2, 1) + stress(1, 2)) / q;
535 d2(i, j, k, l) = -dq(i, j) * dq(k, l) / q;
537 d2(0, 2, 0, 2) += 0.25 / q;
538 d2(0, 2, 2, 0) += 0.25 / q;
539 d2(2, 0, 0, 2) += 0.25 / q;
540 d2(2, 0, 2, 0) += 0.25 / q;
541 d2(1, 2, 1, 2) += 0.25 / q;
542 d2(1, 2, 2, 1) += 0.25 / q;
543 d2(2, 1, 1, 2) += 0.25 / q;
544 d2(2, 1, 2, 1) += 0.25 / q;