11 #include "RankFourTensor.h"
12 #include "libmesh/utility.h"
22 MooseEnum mc_interpolation_scheme(
"outer_tip=0 inner_tip=1 lode_zero=2 inner_edge=3 native=4",
24 params.addParam<MooseEnum>(
25 "mc_interpolation_scheme",
26 mc_interpolation_scheme,
27 "Scheme by which the Drucker-Prager cohesion, friction angle and dilation angle are set from "
28 "the Mohr-Coulomb parameters mc_cohesion, mc_friction_angle and mc_dilation_angle. Consider "
29 "the DP and MC yield surfaces on the deviatoric (octahedral) plane. Outer_tip: the DP "
30 "circle touches the outer tips of the MC hex. Inner_tip: the DP circle touches the inner "
31 "tips of the MC hex. Lode_zero: the DP circle intersects the MC hex at lode angle=0. "
32 "Inner_edge: the DP circle is the largest circle that wholly fits inside the MC hex. "
33 "Native: The DP cohesion, friction angle and dilation angle are set equal to the mc_ "
34 "parameters entered.");
35 params.addRequiredParam<UserObjectName>(
37 "A TensorMechanicsHardening UserObject that defines hardening of the "
38 "Mohr-Coulomb cohesion. Physically this should not be negative.");
39 params.addRequiredParam<UserObjectName>(
41 "A TensorMechanicsHardening UserObject that defines hardening of the "
42 "Mohr-Coulomb friction angle (in radians). Physically this should be "
43 "between 0 and Pi/2.");
44 params.addRequiredParam<UserObjectName>(
46 "A TensorMechanicsHardening UserObject that defines hardening of the "
47 "Mohr-Coulomb dilation angle (in radians). Usually the dilation angle "
48 "is not greater than the friction angle, and it is between 0 and Pi/2.");
49 params.addClassDescription(
50 "Non-associative Drucker Prager plasticity with no smoothing of the cone tip.");
55 const InputParameters & parameters)
60 _mc_interpolation_scheme(getParam<MooseEnum>(
"mc_interpolation_scheme")),
61 _zero_cohesion_hardening(_mc_cohesion.modelName().compare(
"Constant") == 0),
62 _zero_phi_hardening(_mc_phi.modelName().compare(
"Constant") == 0),
63 _zero_psi_hardening(_mc_psi.modelName().compare(
"Constant") == 0)
67 mooseError(
"TensorMechanicsPlasticDruckerPrager: MC friction and dilation angles must lie in "
70 mooseError(
"TensorMechanicsPlasticDruckerPrager: MC friction angle must not be less than MC "
73 mooseError(
"TensorMechanicsPlasticDruckerPrager: MC cohesion should not be negative");
85 return std::sqrt(stress.secondInvariant()) + stress.trace() * bbb - aaa;
91 return 0.5 * stress.dsecondInvariant() / std::sqrt(stress.secondInvariant()) +
92 stress.dtrace() * bbb;
111 return stress.trace() * dbbb - daaa;
119 return df_dsig(stress, bbb_flow);
127 dr_dstress = 0.5 * stress.d2secondInvariant() / std::sqrt(stress.secondInvariant());
128 dr_dstress += -0.5 * 0.5 * stress.dsecondInvariant().outerProduct(stress.dsecondInvariant()) /
129 std::pow(stress.secondInvariant(), 1.5);
139 return stress.dtrace() * dbbb;
145 return "DruckerPrager";
195 dbbb = 2.0 / std::sqrt(3.0) * (ds / (3.0 - s) + s * ds / Utility::pow<2>(3.0 - s));
198 dbbb = 2.0 / std::sqrt(3.0) * (ds / (3.0 + s) - s * ds / Utility::pow<2>(3.0 + s));
204 dbbb = ds / std::sqrt(9.0 + 3.0 * Utility::pow<2>(s)) -
205 3 * s * s * ds /
std::pow(9.0 + 3.0 * Utility::pow<2>(s), 1.5);
213 dbbb = ds / c - s * dc / Utility::pow<2>(c);
237 daaa = 2.0 * std::sqrt(3.0) *
238 (dC * cosphi / (3.0 - sinphi) + C * dcosphi / (3.0 - sinphi) +
239 C * cosphi * dsinphi / Utility::pow<2>(3.0 - sinphi));
240 dbbb = 2.0 / std::sqrt(3.0) *
241 (dsinphi / (3.0 - sinphi) + sinphi * dsinphi / Utility::pow<2>(3.0 - sinphi));
244 daaa = 2.0 * std::sqrt(3.0) *
245 (dC * cosphi / (3.0 + sinphi) + C * dcosphi / (3.0 + sinphi) -
246 C * cosphi * dsinphi / Utility::pow<2>(3.0 + sinphi));
247 dbbb = 2.0 / std::sqrt(3.0) *
248 (dsinphi / (3.0 + sinphi) - sinphi * dsinphi / Utility::pow<2>(3.0 + sinphi));
251 daaa = dC * cosphi + C * dcosphi;
252 dbbb = dsinphi / 3.0;
255 daaa = 3.0 * dC * cosphi / std::sqrt(9.0 + 3.0 * Utility::pow<2>(sinphi)) +
256 3.0 * C * dcosphi / std::sqrt(9.0 + 3.0 * Utility::pow<2>(sinphi)) -
257 3.0 * C * cosphi * 3.0 * sinphi * dsinphi /
258 std::pow(9.0 + 3.0 * Utility::pow<2>(sinphi), 1.5);
259 dbbb = dsinphi / std::sqrt(9.0 + 3.0 * Utility::pow<2>(sinphi)) -
260 3.0 * sinphi * sinphi * dsinphi /
std::pow(9.0 + 3.0 * Utility::pow<2>(sinphi), 1.5);
264 dbbb = dsinphi / cosphi - sinphi * dcosphi / Utility::pow<2>(cosphi);
278 aaa = 2.0 * std::sqrt(3.0) * C * cosphi / (3.0 - sinphi);
279 bbb = 2.0 * sinphi / std::sqrt(3.0) / (3.0 - sinphi);
282 aaa = 2.0 * std::sqrt(3.0) * C * cosphi / (3.0 + sinphi);
283 bbb = 2.0 * sinphi / std::sqrt(3.0) / (3.0 + sinphi);
290 aaa = 3.0 * C * cosphi / std::sqrt(9.0 + 3.0 * Utility::pow<2>(sinphi));
291 bbb = sinphi / std::sqrt(9.0 + 3.0 * Utility::pow<2>(sinphi));
295 bbb = sinphi / cosphi;
307 bbb = 2.0 * s / std::sqrt(3.0) / (3.0 - s);
310 bbb = 2.0 * s / std::sqrt(3.0) / (3.0 + s);
316 bbb = s / std::sqrt(9.0 + 3.0 * Utility::pow<2>(s));