12#include "libmesh/utility.h"
16 TensorMechanicsPlasticDruckerPrager,
24 MooseEnum mc_interpolation_scheme(
"outer_tip=0 inner_tip=1 lode_zero=2 inner_edge=3 native=4",
27 "mc_interpolation_scheme",
28 mc_interpolation_scheme,
29 "Scheme by which the Drucker-Prager cohesion, friction angle and dilation angle are set from "
30 "the Mohr-Coulomb parameters mc_cohesion, mc_friction_angle and mc_dilation_angle. Consider "
31 "the DP and MC yield surfaces on the deviatoric (octahedral) plane. Outer_tip: the DP "
32 "circle touches the outer tips of the MC hex. Inner_tip: the DP circle touches the inner "
33 "tips of the MC hex. Lode_zero: the DP circle intersects the MC hex at lode angle=0. "
34 "Inner_edge: the DP circle is the largest circle that wholly fits inside the MC hex. "
35 "Native: The DP cohesion, friction angle and dilation angle are set equal to the mc_ "
36 "parameters entered.");
39 "A SolidMechanicsHardening UserObject that defines hardening of the "
40 "Mohr-Coulomb cohesion. Physically this should not be negative.");
43 "A SolidMechanicsHardening UserObject that defines hardening of the "
44 "Mohr-Coulomb friction angle (in radians). Physically this should be "
45 "between 0 and Pi/2.");
48 "A SolidMechanicsHardening UserObject that defines hardening of the "
49 "Mohr-Coulomb dilation angle (in radians). Usually the dilation angle "
50 "is not greater than the friction angle, and it is between 0 and Pi/2.");
52 "Non-associative Drucker Prager plasticity with no smoothing of the cone tip.");
62 _mc_interpolation_scheme(getParam<
MooseEnum>(
"mc_interpolation_scheme")),
63 _zero_cohesion_hardening(_mc_cohesion.modelName().compare(
"Constant") == 0),
64 _zero_phi_hardening(_mc_phi.modelName().compare(
"Constant") == 0),
65 _zero_psi_hardening(_mc_psi.modelName().compare(
"Constant") == 0)
69 mooseError(
"SolidMechanicsPlasticDruckerPrager: MC friction and dilation angles must lie in "
72 mooseError(
"SolidMechanicsPlasticDruckerPrager: MC friction angle must not be less than MC "
75 mooseError(
"SolidMechanicsPlasticDruckerPrager: MC cohesion should not be negative");
113 return stress.
trace() * dbbb - daaa;
121 return df_dsig(stress, bbb_flow);
141 return stress.
dtrace() * dbbb;
147 return "DruckerPrager";
197 dbbb = 2.0 / std::sqrt(3.0) * (ds / (3.0 - s) + s * ds / Utility::pow<2>(3.0 - s));
200 dbbb = 2.0 / std::sqrt(3.0) * (ds / (3.0 + s) - s * ds / Utility::pow<2>(3.0 + s));
206 dbbb = ds / std::sqrt(9.0 + 3.0 * Utility::pow<2>(s)) -
207 3 * s * s * ds / std::pow(9.0 + 3.0 * Utility::pow<2>(s), 1.5);
215 dbbb = ds /
c - s * dc / Utility::pow<2>(
c);
239 daaa = 2.0 * std::sqrt(3.0) *
240 (dC * cosphi / (3.0 - sinphi) + C * dcosphi / (3.0 - sinphi) +
241 C * cosphi * dsinphi / Utility::pow<2>(3.0 - sinphi));
242 dbbb = 2.0 / std::sqrt(3.0) *
243 (dsinphi / (3.0 - sinphi) + sinphi * dsinphi / Utility::pow<2>(3.0 - sinphi));
246 daaa = 2.0 * std::sqrt(3.0) *
247 (dC * cosphi / (3.0 + sinphi) + C * dcosphi / (3.0 + sinphi) -
248 C * cosphi * dsinphi / Utility::pow<2>(3.0 + sinphi));
249 dbbb = 2.0 / std::sqrt(3.0) *
250 (dsinphi / (3.0 + sinphi) - sinphi * dsinphi / Utility::pow<2>(3.0 + sinphi));
253 daaa = dC * cosphi + C * dcosphi;
254 dbbb = dsinphi / 3.0;
257 daaa = 3.0 * dC * cosphi / std::sqrt(9.0 + 3.0 * Utility::pow<2>(sinphi)) +
258 3.0 * C * dcosphi / std::sqrt(9.0 + 3.0 * Utility::pow<2>(sinphi)) -
259 3.0 * C * cosphi * 3.0 * sinphi * dsinphi /
260 std::pow(9.0 + 3.0 * Utility::pow<2>(sinphi), 1.5);
261 dbbb = dsinphi / std::sqrt(9.0 + 3.0 * Utility::pow<2>(sinphi)) -
262 3.0 * sinphi * sinphi * dsinphi / std::pow(9.0 + 3.0 * Utility::pow<2>(sinphi), 1.5);
266 dbbb = dsinphi / cosphi - sinphi * dcosphi / Utility::pow<2>(cosphi);
280 aaa = 2.0 * std::sqrt(3.0) * C * cosphi / (3.0 - sinphi);
281 bbb = 2.0 * sinphi / std::sqrt(3.0) / (3.0 - sinphi);
284 aaa = 2.0 * std::sqrt(3.0) * C * cosphi / (3.0 + sinphi);
285 bbb = 2.0 * sinphi / std::sqrt(3.0) / (3.0 + sinphi);
292 aaa = 3.0 * C * cosphi / std::sqrt(9.0 + 3.0 * Utility::pow<2>(sinphi));
293 bbb = sinphi / std::sqrt(9.0 + 3.0 * Utility::pow<2>(sinphi));
297 bbb = sinphi / cosphi;
309 bbb = 2.0 * s / std::sqrt(3.0) / (3.0 - s);
312 bbb = 2.0 * s / std::sqrt(3.0) / (3.0 + s);
318 bbb = s / std::sqrt(9.0 + 3.0 * Utility::pow<2>(s));
registerMooseObjectRenamed("SolidMechanicsApp", TensorMechanicsPlasticDruckerPrager, "01/01/2025 00:00", SolidMechanicsPlasticDruckerPrager)
registerMooseObject("SolidMechanicsApp", SolidMechanicsPlasticDruckerPrager)
void mooseError(Args &&... args) const
T secondInvariant() const
RankTwoTensorTempl< T > dsecondInvariant() const
RankTwoTensorTempl< T > dtrace() const
RankFourTensorTempl< T > d2secondInvariant() const
Hardening Model base class.
virtual Real derivative(Real intnl) const
virtual Real value(Real intnl) const
Rate-independent non-associative Drucker Prager with hardening/softening.
virtual RankTwoTensor dyieldFunction_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of yield function with respect to stress.
SolidMechanicsPlasticDruckerPrager(const InputParameters ¶meters)
void initializeAandB(Real intnl, Real &aaa, Real &bbb) const
Returns the Drucker-Prager parameters A nice reference on the different relationships between Drucker...
void onlyB(Real intnl, int fd, Real &bbb) const
Calculate bbb or bbb_flow.
const SolidMechanicsHardeningModel & _mc_phi
Hardening model for tan(phi)
virtual RankTwoTensor df_dsig(const RankTwoTensor &stress, Real bbb) const
Function that's used in dyieldFunction_dstress and flowPotential.
void dbothAB(Real intnl, Real &daaa, Real &dbbb) const
Calculates d(aaa)/d(intnl) and d(bbb)/d(intnl) as a function of the internal parameter intnl.
virtual RankTwoTensor dflowPotential_dintnl(const RankTwoTensor &stress, Real intnl) const override
The derivative of the flow potential with respect to the internal parameter.
virtual RankFourTensor dflowPotential_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of the flow potential with respect to stress.
void bothAB(Real intnl, Real &aaa, Real &bbb) const
Calculates aaa and bbb as a function of the internal parameter intnl.
void donlyB(Real intnl, int fd, Real &dbbb) const
Calculate d(bbb)/d(intnl) or d(bbb_flow)/d(intnl)
static InputParameters validParams()
const bool _zero_phi_hardening
True if there is no hardening of friction angle.
virtual Real yieldFunction(const RankTwoTensor &stress, Real intnl) const override
The following functions are what you should override when building single-plasticity models.
virtual RankTwoTensor flowPotential(const RankTwoTensor &stress, Real intnl) const override
The flow potential.
void initializeB(Real intnl, int fd, Real &bbb) const
Returns the Drucker-Prager parameters A nice reference on the different relationships between Drucker...
const MooseEnum _mc_interpolation_scheme
The parameters aaa and bbb are chosen to closely match the Mohr-Coulomb yield surface.
virtual std::string modelName() const override
const bool _zero_cohesion_hardening
True if there is no hardening of cohesion.
virtual Real dyieldFunction_dintnl(const RankTwoTensor &stress, Real intnl) const override
The derivative of yield function with respect to the internal parameter.
const SolidMechanicsHardeningModel & _mc_psi
Hardening model for tan(psi)
const bool _zero_psi_hardening
True if there is no hardening of dilation angle.
const SolidMechanicsHardeningModel & _mc_cohesion
Hardening model for cohesion.
Plastic Model base class The virtual functions written below must be over-ridden in derived classes t...
static InputParameters validParams()