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));
RankFourTensorTempl< Real > outerProduct(const RankTwoTensorTempl< Real > &b) const
RankTwoTensorTempl< Real > dsecondInvariant() const
RankFourTensorTempl< Real > d2secondInvariant() const
SolidMechanicsPlasticDruckerPrager(const InputParameters ¶meters)
const bool _zero_cohesion_hardening
True if there is no hardening of cohesion.
const SolidMechanicsHardeningModel & _mc_psi
Hardening model for tan(psi)
void donlyB(Real intnl, int fd, Real &dbbb) const
Calculate d(bbb)/d(intnl) or d(bbb_flow)/d(intnl)
virtual RankTwoTensor df_dsig(const RankTwoTensor &stress, Real bbb) const
Function that's used in dyieldFunction_dstress and flowPotential.
void bothAB(Real intnl, Real &aaa, Real &bbb) const
Calculates aaa and bbb as a function of the internal parameter intnl.
void initializeB(Real intnl, int fd, Real &bbb) const
Returns the Drucker-Prager parameters A nice reference on the different relationships between Drucker...
Real secondInvariant() const
const bool _zero_phi_hardening
True if there is no hardening of friction angle.
RankTwoTensorTempl< Real > dtrace() const
const MooseEnum _mc_interpolation_scheme
The parameters aaa and bbb are chosen to closely match the Mohr-Coulomb yield surface.
virtual Real value(Real intnl) const
registerMooseObject("SolidMechanicsApp", SolidMechanicsPlasticDruckerPrager)
void onlyB(Real intnl, int fd, Real &bbb) const
Calculate bbb or bbb_flow.
Rate-independent non-associative Drucker Prager with hardening/softening.
registerMooseObjectRenamed("SolidMechanicsApp", TensorMechanicsPlasticDruckerPrager, "01/01/2025 00:00", SolidMechanicsPlasticDruckerPrager)
static InputParameters validParams()
const bool _zero_psi_hardening
True if there is no hardening of dilation angle.
virtual RankFourTensor dflowPotential_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of the flow potential with respect to stress.
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 Real derivative(Real intnl) const
Hardening Model base class.
virtual Real yieldFunction(const RankTwoTensor &stress, Real intnl) const override
The following functions are what you should override when building single-plasticity models...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const SolidMechanicsHardeningModel & _mc_cohesion
Hardening model for cohesion.
virtual RankTwoTensor dflowPotential_dintnl(const RankTwoTensor &stress, Real intnl) const override
The derivative of the flow potential with respect to the internal parameter.
void mooseError(Args &&... args) const
virtual RankTwoTensor dyieldFunction_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of yield function with respect to stress.
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_phi
Hardening model for tan(phi)
Plastic Model base class The virtual functions written below must be over-ridden in derived classes t...
MooseUnits pow(const MooseUnits &, int)
void initializeAandB(Real intnl, Real &aaa, Real &bbb) const
Returns the Drucker-Prager parameters A nice reference on the different relationships between Drucker...
virtual RankTwoTensor flowPotential(const RankTwoTensor &stress, Real intnl) const override
The flow potential.
static const std::string C
static InputParameters validParams()
virtual std::string modelName() const override