12 #include "libmesh/utility.h" 16 TensorMechanicsPlasticDruckerPragerHyperbolic,
24 params.
addParam<
bool>(
"use_custom_returnMap",
26 "Whether to use the custom returnMap " 27 "algorithm. Set to true if you are using " 28 "isotropic elasticity.");
29 params.
addParam<
bool>(
"use_custom_cto",
31 "Whether to use the custom consistent tangent " 32 "operator computations. Set to true if you are " 33 "using isotropic elasticity.");
38 "The cone vertex at J2=0 is smoothed. The maximum mean " 39 "stress possible, which is Cohesion*Cot(friction_angle) for " 40 "smoother=0, becomes (Cohesion - " 41 "smoother/3)*Cot(friction_angle). This is a non-hardening " 47 "Maximum iterations to use in the custom return map function");
49 "Non-associative Drucker Prager plasticity with hyperbolic smoothing of the cone tip.");
56 _smoother2(Utility::
pow<2>(getParam<
Real>(
"smoother"))),
57 _use_custom_returnMap(getParam<bool>(
"use_custom_returnMap")),
58 _use_custom_cto(getParam<bool>(
"use_custom_cto")),
59 _max_iters(getParam<unsigned>(
"max_iterations"))
94 return "DruckerPragerHyperbolic";
101 Real ep_plastic_tolerance,
103 Real & returned_intnl,
104 std::vector<Real> & dpm,
106 std::vector<Real> & yf,
107 bool & trial_stress_inadmissible)
const 113 ep_plastic_tolerance,
119 trial_stress_inadmissible);
128 trial_stress_inadmissible =
false;
132 trial_stress_inadmissible =
true;
133 const Real mu = E_ijkl(0, 1, 0, 1);
134 const Real lambda = E_ijkl(0, 0, 0, 0) - 2.0 *
mu;
135 const Real bulky = 3.0 * lambda + 2.0 *
mu;
136 const Real Tr_trial = trial_stress.
trace();
153 unsigned int iter = 0;
156 bothAB(intnl_old + dpm[0], aaa, bbb);
157 dbothAB(intnl_old + dpm[0], daaa, dbbb);
160 ll = aaa - bbb * (Tr_trial - dpm[0] * bulky * 3 * bbb_flow);
161 dll = daaa - dbbb * (Tr_trial - dpm[0] * bulky * 3 * bbb_flow) +
162 bbb * bulky * 3 * (bbb_flow + dpm[0] * dbbb_flow);
163 residual = bbb * (Tr_trial - dpm[0] * bulky * 3 * bbb_flow) - aaa +
164 std::sqrt(J2trial / Utility::pow<2>(1 + dpm[0] *
mu / ll) +
_smoother2);
165 jac = dbbb * (Tr_trial - dpm[0] * bulky * 3 * bbb_flow) -
166 bbb * bulky * 3 * (bbb_flow + dpm[0] * dbbb_flow) - daaa +
167 0.5 * J2trial * (-2.0) * (
mu / ll - dpm[0] *
mu * dll / ll / ll) /
168 Utility::pow<3>(1 + dpm[0] *
mu / ll) /
169 std::sqrt(J2trial / Utility::pow<2>(1.0 + dpm[0] *
mu / ll) +
_smoother2);
170 dpm[0] += -residual / jac;
178 returned_intnl = intnl_old + dpm[0];
180 bothAB(returned_intnl, aaa, bbb);
182 ll = aaa - bbb * (Tr_trial - dpm[0] * bulky * 3.0 * bbb_flow);
190 const Real returned_trace_over_3 = (aaa - ll) / bbb / 3.0;
191 for (
unsigned i = 0; i < 3; ++i)
193 returned_stress(i, i) += returned_trace_over_3;
194 rij(i, i) += bbb_flow;
197 delta_dp = rij * dpm[0];
209 const std::vector<Real> & cumulative_pm)
const 213 trial_stress, intnl_old, stress, intnl, E_ijkl, cumulative_pm);
215 const Real mu = E_ijkl(0, 1, 0, 1);
216 const Real la = E_ijkl(0, 0, 0, 0) - 2.0 *
mu;
217 const Real bulky = 3.0 * la + 2.0 *
mu;
224 const Real bbb_flow_mod = bbb_flow + cumulative_pm[0] * dbbb_flow;
229 const Real one_over_h =
231 3.0 * bbb * bbb_flow_mod * bulky);
240 E_ijkl - one_over_h * rmod_timesE.
outerProduct(df_dsig_timesE);
250 (dr_dsig_timesE - one_over_h * rmod_timesE.
outerProduct(df_dsig_E_dr_dsig));
262 return s_inv * coeff_ep;
RankFourTensorTempl< Real > outerProduct(const RankTwoTensorTempl< Real > &b) const
virtual RankTwoTensor df_dsig(const RankTwoTensor &stress, Real bbb) const override
Function that's used in dyieldFunction_dstress and flowPotential.
Rate-independent non-associative Drucker Prager with hardening/softening.
const bool _use_custom_cto
Whether to use the custom consistent tangent operator calculation.
RankTwoTensorTempl< Real > dsecondInvariant() const
SolidMechanicsPlasticDruckerPragerHyperbolic(const InputParameters ¶meters)
RankFourTensorTempl< Real > d2secondInvariant() const
registerMooseObject("SolidMechanicsApp", SolidMechanicsPlasticDruckerPragerHyperbolic)
initIdentitySymmetricFour
virtual bool useCustomReturnMap() const override
Returns false. You will want to override this in your derived class if you write a custom returnMap f...
void donlyB(Real intnl, int fd, Real &dbbb) const
Calculate d(bbb)/d(intnl) or d(bbb_flow)/d(intnl)
void bothAB(Real intnl, Real &aaa, Real &bbb) const
Calculates aaa and bbb as a function of the internal parameter intnl.
virtual RankFourTensor consistentTangentOperator(const RankTwoTensor &trial_stress, Real intnl_old, const RankTwoTensor &stress, Real intnl, const RankFourTensor &E_ijkl, const std::vector< Real > &cumulative_pm) const
Calculates a custom consistent tangent operator.
Real secondInvariant() const
RankTwoTensorTempl< Real > dtrace() const
Real yieldFunction(const RankTwoTensor &stress, Real intnl) const override
The following functions are what you should override when building single-plasticity models...
void onlyB(Real intnl, int fd, Real &bbb) const
Calculate bbb or bbb_flow.
Rate-independent non-associative Drucker Prager with hardening/softening.
RankTwoTensorTempl< Real > deviatoric() const
const unsigned _max_iters
max iters for custom return map loop
static const std::string mu
virtual bool returnMap(const RankTwoTensor &trial_stress, Real intnl_old, const RankFourTensor &E_ijkl, Real ep_plastic_tolerance, RankTwoTensor &returned_stress, Real &returned_intnl, std::vector< Real > &dpm, RankTwoTensor &delta_dp, std::vector< Real > &yf, bool &trial_stress_inadmissible) const
Performs a custom return-map.
static InputParameters validParams()
registerMooseObjectRenamed("SolidMechanicsApp", TensorMechanicsPlasticDruckerPragerHyperbolic, "01/01/2025 00:00", SolidMechanicsPlasticDruckerPragerHyperbolic)
virtual bool returnMap(const RankTwoTensor &trial_stress, Real intnl_old, const RankFourTensor &E_ijkl, Real ep_plastic_tolerance, RankTwoTensor &returned_stress, Real &returned_intnl, std::vector< Real > &dpm, RankTwoTensor &delta_dp, std::vector< Real > &yf, bool &trial_stress_inadmissible) const override
Performs a custom return-map.
const Real _smoother2
smoothing parameter for the cone's tip
const Real _f_tol
Tolerance on yield function.
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...
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
RankFourTensor dflowPotential_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of the flow potential with respect to stress.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual std::string modelName() const override
const bool _use_custom_returnMap
whether to use the custom returnMap function
virtual bool useCustomCTO() const override
Returns false. You will want to override this in your derived class if you write a custom consistent ...
virtual RankFourTensor consistentTangentOperator(const RankTwoTensor &trial_stress, Real intnl_old, const RankTwoTensor &stress, Real intnl, const RankFourTensor &E_ijkl, const std::vector< Real > &cumulative_pm) const override
Calculates a custom consistent tangent operator.
virtual Real dyieldFunction_dintnl(const RankTwoTensor &stress, Real intnl) const override
The derivative of yield function with respect to the internal parameter.
RankFourTensorTempl< T > invSymm() const
MooseUnits pow(const MooseUnits &, int)
static InputParameters validParams()