12 #include "libmesh/utility.h" 16 TensorMechanicsPlasticWeakPlaneShear,
26 "A SolidMechanicsHardening UserObject that defines hardening of the cohesion. " 27 "Physically the cohesion should not be negative.");
29 "A SolidMechanicsHardening UserObject that defines " 30 "hardening of tan(friction angle). Physically the " 31 "friction angle should be between 0 and 90deg.");
34 "A SolidMechanicsHardening UserObject that defines hardening of the " 35 "tan(dilation angle). Usually the dilation angle is not greater than " 36 "the friction angle, and it is between 0 and 90deg.");
37 MooseEnum tip_scheme(
"hyperbolic cap",
"hyperbolic");
39 "tip_scheme", tip_scheme,
"Scheme by which the cone's tip will be smoothed.");
43 "For the 'hyperbolic' tip_scheme, the cone vertex at shear-stress " 44 "= 0 will be smoothed by the given amount. For the 'cap' " 45 "tip_scheme, additional smoothing will occur. Typical value is " 50 "For the 'cap' tip_scheme, smoothing is performed in the stress_zz > cap_start region");
54 "For the 'cap' tip_scheme, this controls how quickly the cap " 55 "degenerates to a hemisphere: small values mean a slow " 56 "degeneration to a hemisphere (and zero means the 'cap' will " 57 "be totally inactive). Typical value is 1/cohesion");
58 params.
addClassDescription(
"Non-associative finite-strain weak-plane shear perfect plasticity. " 59 "Here cohesion = 1, tan(phi) = 1 = tan(psi)");
70 _tip_scheme(getParam<
MooseEnum>(
"tip_scheme")),
71 _small_smoother2(Utility::
pow<2>(getParam<
Real>(
"smoother"))),
72 _cap_start(getParam<
Real>(
"cap_start")),
73 _cap_rate(getParam<
Real>(
"cap_rate"))
78 mooseError(
"Weak-Plane-Shear friction and dilation angles must lie in [0, Pi/2]");
81 "Weak-Plane-Shear friction angle must not be less than Weak-Plane-Shear dilation angle");
83 mooseError(
"Weak-Plane-Shear cohesion must not be negative");
90 return std::sqrt(Utility::pow<2>((stress(0, 2) + stress(2, 0)) / 2.0) +
91 Utility::pow<2>((stress(1, 2) + stress(2, 1)) / 2.0) +
smooth(stress)) +
97 Real _tan_phi_or_psi)
const 101 Real tau = std::sqrt(Utility::pow<2>((stress(0, 2) + stress(2, 0)) / 2.0) +
102 Utility::pow<2>((stress(1, 2) + stress(2, 1)) / 2.0) +
smooth(stress));
113 deriv(0, 2) =
deriv(2, 0) = 0.25 * (stress(0, 2) + stress(2, 0)) / tau;
114 deriv(1, 2) =
deriv(2, 1) = 0.25 * (stress(1, 2) + stress(2, 1)) / tau;
117 deriv(2, 2) += _tan_phi_or_psi;
146 Real tau = std::sqrt(Utility::pow<2>((stress(0, 2) + stress(2, 0)) / 2.0) +
147 Utility::pow<2>((stress(1, 2) + stress(2, 1)) / 2.0) +
smooth(stress));
153 dtau(0, 2) = dtau(2, 0) = 0.25 * (stress(0, 2) + stress(2, 0)) / tau;
154 dtau(1, 2) = dtau(2, 1) = 0.25 * (stress(1, 2) + stress(2, 1)) / tau;
155 dtau(2, 2) = 0.5 *
dsmooth(stress) / tau;
157 for (
unsigned i = 0; i < 3; ++i)
158 for (
unsigned j = 0;
j < 3; ++
j)
159 for (
unsigned k = 0;
k < 3; ++
k)
160 for (
unsigned l = 0; l < 3; ++l)
161 dr_dstress(i,
j,
k, l) = -dtau(i,
j) * dtau(
k, l) / tau;
164 dr_dstress(0, 2, 0, 2) += 0.25 / tau;
165 dr_dstress(0, 2, 2, 0) += 0.25 / tau;
166 dr_dstress(2, 0, 0, 2) += 0.25 / tau;
167 dr_dstress(2, 0, 2, 0) += 0.25 / tau;
168 dr_dstress(1, 2, 1, 2) += 0.25 / tau;
169 dr_dstress(1, 2, 2, 1) += 0.25 / tau;
170 dr_dstress(2, 1, 1, 2) += 0.25 / tau;
171 dr_dstress(2, 1, 2, 1) += 0.25 / tau;
172 dr_dstress(2, 2, 2, 2) += 0.5 *
d2smooth(stress) / tau;
232 smoother2 += Utility::pow<2>(p);
249 p =
x * (1 - exp_cap_rate_x);
250 dp_dx = (1 - exp_cap_rate_x) +
x *
_cap_rate * exp_cap_rate_x;
252 dsmoother2 += 2 * p * dp_dx;
260 Real d2smoother2 = 0;
270 p =
x * (1.0 - exp_cap_rate_x);
271 dp_dx = (1.0 - exp_cap_rate_x) +
x *
_cap_rate * exp_cap_rate_x;
272 d2p_dx2 = 2.0 *
_cap_rate * exp_cap_rate_x -
x * Utility::pow<2>(
_cap_rate) * exp_cap_rate_x;
274 d2smoother2 += 2.0 * Utility::pow<2>(dp_dx) + 2.0 * p * d2p_dx2;
284 std::vector<bool> & act,
287 act.assign(1,
false);
288 returned_stress = stress;
303 std::vector<Real>
norm(3, 0.0);
304 const Real tau = std::sqrt(Utility::pow<2>((stress(0, 2) + stress(2, 0)) / 2.0) +
305 Utility::pow<2>((stress(1, 2) + stress(2, 1)) / 2.0));
308 norm[0] = 0.25 * (stress(0, 2) + stress(2, 0)) / tau;
309 norm[1] = 0.25 * (stress(1, 2) + stress(2, 1)) / tau;
313 returned_stress(2, 2) =
cohesion(intnl) / tanphi;
325 Real alpha =
f[0] / (Eijkl(0, 2, 0, 2) + Eijkl(2, 2, 2, 2) * tanpsi * tanphi);
327 if (1 -
alpha * Eijkl(0, 2, 0, 2) / tau >= 0)
330 returned_stress(2, 2) = stress(2, 2) -
alpha * Eijkl(2, 2, 2, 2) *
norm[2];
331 returned_stress(0, 2) = returned_stress(2, 0) =
332 stress(0, 2) -
alpha * 2.0 * Eijkl(0, 2, 0, 2) *
norm[0];
333 returned_stress(1, 2) = returned_stress(2, 1) =
334 stress(1, 2) -
alpha * 2.0 * Eijkl(1, 2, 1, 2) *
norm[1];
339 returned_stress(2, 2) =
cohesion(intnl) / tanphi;
340 returned_stress(0, 2) = returned_stress(2, 0) = returned_stress(1, 2) = returned_stress(2, 1) =
343 returned_stress(0, 0) =
344 stress(0, 0) - Eijkl(0, 0, 2, 2) * (stress(2, 2) - returned_stress(2, 2)) / Eijkl(2, 2, 2, 2);
345 returned_stress(1, 1) =
346 stress(1, 1) - Eijkl(1, 1, 2, 2) * (stress(2, 2) - returned_stress(2, 2)) / Eijkl(2, 2, 2, 2);
354 return "WeakPlaneShear";
virtual Real tan_phi(const Real internal_param) const
tan_phi as a function of internal parameter
virtual void activeConstraints(const std::vector< Real > &f, const RankTwoTensor &stress, Real intnl, const RankFourTensor &Eijkl, std::vector< bool > &act, RankTwoTensor &returned_stress) const override
The active yield surfaces, given a vector of yield functions.
Real _cap_rate
dictates how quickly the 'cap' degenerates to a hemisphere - see doco for _tip_scheme ...
Real _small_smoother2
smoothing parameter for the cone's tip - see doco for _tip_scheme
const SolidMechanicsHardeningModel & _tan_psi
Hardening model for tan(psi)
const SolidMechanicsHardeningModel & _cohesion
Hardening model for cohesion.
virtual Real dtan_psi(const Real internal_param) const
d(tan_psi)/d(internal_param);
const SolidMechanicsHardeningModel & _tan_phi
Hardening model for tan(phi)
virtual Real tan_psi(const Real internal_param) const
tan_psi as a function of internal parameter
Real yieldFunction(const RankTwoTensor &stress, Real intnl) const override
The following functions are what you should override when building single-plasticity models...
RankTwoTensor flowPotential(const RankTwoTensor &stress, Real intnl) const override
The flow potential.
virtual Real d2smooth(const RankTwoTensor &stress) const
returns the d^2a/dstress(2,2)^2 - see doco for _tip_scheme
virtual Real value(Real intnl) const
RankTwoTensor df_dsig(const RankTwoTensor &stress, Real _tan_phi_or_psi) const
Function that's used in dyieldFunction_dstress and flowPotential.
RankFourTensor dflowPotential_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of the flow potential with respect to stress.
virtual Real cohesion(const Real internal_param) const
cohesion as a function of internal parameter
static InputParameters validParams()
SolidMechanicsPlasticWeakPlaneShear(const InputParameters ¶meters)
Real deriv(unsigned n, unsigned alpha, unsigned beta, Real x)
const std::vector< double > x
Real f(Real x)
Test function for Brents method.
virtual std::string modelName() const override
static InputParameters validParams()
Real _cap_start
smoothing parameter dictating when the 'cap' will start - see doco for _tip_scheme ...
virtual Real dsmooth(const RankTwoTensor &stress) const
returns the da/dstress(2,2) - see doco for _tip_scheme
const Real _f_tol
Tolerance on yield function.
RankTwoTensor dflowPotential_dintnl(const RankTwoTensor &stress, Real intnl) const override
The derivative of the flow potential with respect to the internal parameter.
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
virtual Real derivative(Real intnl) const
Hardening Model base class.
RankTwoTensor dyieldFunction_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of yield function with respect to stress.
virtual Real dtan_phi(const Real internal_param) const
d(tan_phi)/d(internal_param);
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static const std::string alpha
void mooseError(Args &&... args) const
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
Real dyieldFunction_dintnl(const RankTwoTensor &stress, Real intnl) const override
The derivative of yield function with respect to the internal parameter.
registerMooseObjectRenamed("SolidMechanicsApp", TensorMechanicsPlasticWeakPlaneShear, "01/01/2025 00:00", SolidMechanicsPlasticWeakPlaneShear)
virtual Real dcohesion(const Real internal_param) const
d(cohesion)/d(internal_param)
Plastic Model base class The virtual functions written below must be over-ridden in derived classes t...
virtual Real smooth(const RankTwoTensor &stress) const
returns the 'a' parameter - see doco for _tip_scheme
static const std::string k
MooseEnum _tip_scheme
The yield function is modified to f = sqrt(s_xz^2 + s_yz^2 + a) + s_zz*_tan_phi - _cohesion where "a"...
registerMooseObject("SolidMechanicsApp", SolidMechanicsPlasticWeakPlaneShear)
Rate-independent associative weak-plane tensile failure with hardening/softening. ...