12 #include "libmesh/utility.h" 16 TensorMechanicsPlasticTensile,
26 "A SolidMechanicsHardening UserObject that defines hardening of the tensile strength");
28 "tensile_edge_smoother",
30 "tensile_edge_smoother>=0 & tensile_edge_smoother<=30",
31 "Smoothing parameter: the edges of the cone are smoothed by the given amount.");
32 MooseEnum tip_scheme(
"hyperbolic cap",
"hyperbolic");
34 "tip_scheme", tip_scheme,
"Scheme by which the pyramid's tip will be smoothed.");
36 "tensile_tip_smoother>=0",
37 "For the 'hyperbolic' tip_scheme, the pyramid vertex " 38 "will be smoothed by the given amount. For the 'cap' " 39 "tip_scheme, additional smoothing will occur. Typical " 40 "value is 0.1*tensile_strength");
44 "For the 'cap' tip_scheme, smoothing is performed in the stress_mean > cap_start region");
48 "For the 'cap' tip_scheme, this controls how quickly the cap " 49 "degenerates to a hemisphere: small values mean a slow " 50 "degeneration to a hemisphere (and zero means the 'cap' will " 51 "be totally inactive). Typical value is 1/tensile_strength");
53 "If the second invariant of stress is less than " 54 "this amount, the Lode angle is assumed to be zero. " 55 "This is to guard against precision-loss problems, " 56 "and this parameter should be set small. Default = " 57 "0.00001*((yield_Function_tolerance)^2)");
59 "Associative tensile plasticity with hardening/softening, and tensile_strength = 1");
67 _tip_scheme(getParam<
MooseEnum>(
"tip_scheme")),
68 _small_smoother2(Utility::
pow<2>(getParam<
Real>(
"tensile_tip_smoother"))),
69 _cap_start(getParam<
Real>(
"cap_start")),
70 _cap_rate(getParam<
Real>(
"cap_rate")),
71 _tt(getParam<
Real>(
"tensile_edge_smoother") *
libMesh::
pi / 180.0),
72 _sin3tt(
std::
sin(3.0 * _tt)),
73 _lode_cutoff(parameters.isParamValid(
"tensile_lode_cutoff")
74 ? getParam<
Real>(
"tensile_lode_cutoff")
75 : 1.0e-5 * Utility::
pow<2>(_f_tol))
79 mooseError(
"tensile_lode_cutoff must not be negative");
80 _ccc = (-std::cos(3.0 *
_tt) * (std::cos(
_tt) - std::sin(
_tt) / std::sqrt(3.0)) -
81 3.0 *
_sin3tt * (std::sin(
_tt) + std::cos(
_tt) / std::sqrt(3.0))) /
82 (18.0 * Utility::pow<3>(std::cos(3.0 *
_tt)));
83 _bbb = (std::sin(6.0 *
_tt) * (std::cos(
_tt) - std::sin(
_tt) / std::sqrt(3.0)) -
84 6.0 * std::cos(6.0 *
_tt) * (std::sin(
_tt) + std::cos(
_tt) / std::sqrt(3.0))) /
85 (18.0 * Utility::pow<3>(std::cos(3.0 *
_tt)));
98 std::vector<Real> eigvals;
100 return mean_stress + std::sqrt(
smooth(stress) + Utility::pow<2>(eigvals[2] - mean_stress)) -
108 return mean_stress + std::sqrt(
smooth(stress) + sibar2 * Utility::pow<2>(kk)) -
123 std::vector<Real> eigvals;
124 std::vector<RankTwoTensor> deigvals;
126 Real denom = std::sqrt(
smooth(stress) + Utility::pow<2>(eigvals[2] - mean_stress));
127 return dmean_stress + (0.5 *
dsmooth(stress) * dmean_stress +
128 (eigvals[2] - mean_stress) * (deigvals[2] - dmean_stress)) /
138 Real denom = std::sqrt(
smooth(stress) + sibar2 * Utility::pow<2>(kk));
139 return dmean_stress + (0.5 *
dsmooth(stress) * dmean_stress +
140 0.5 * dsibar2 * Utility::pow<2>(kk) + sibar2 * kk * dkk) /
169 std::vector<Real> eigvals;
170 std::vector<RankTwoTensor> deigvals;
171 std::vector<RankFourTensor> d2eigvals;
175 Real denom = std::sqrt(
smooth(stress) + Utility::pow<2>(eigvals[2] - mean_stress));
176 Real denom3 = Utility::pow<3>(denom);
179 0.5 *
dsmooth(stress) * dmean_stress + (eigvals[2] - mean_stress) * numer_part;
182 RankFourTensor dr_dstress = (eigvals[2] - mean_stress) * d2eigvals[2] / denom;
183 for (
unsigned i = 0; i < 3; ++i)
184 for (
unsigned j = 0;
j < 3; ++
j)
185 for (
unsigned k = 0;
k < 3; ++
k)
186 for (
unsigned l = 0; l < 3; ++l)
188 dr_dstress(i,
j,
k, l) +=
189 0.5 * d2smooth_over_denom * dmean_stress(i,
j) * dmean_stress(
k, l);
190 dr_dstress(i,
j,
k, l) += numer_part(i,
j) * numer_part(
k, l) / denom;
191 dr_dstress(i,
j,
k, l) -= numer_full(i,
j) * numer_full(
k, l) / denom3;
202 for (
unsigned i = 0; i < 3; ++i)
203 for (
unsigned j = 0;
j < 3; ++
j)
204 for (
unsigned k = 0;
k < 3; ++
k)
205 for (
unsigned l = 0; l < 3; ++l)
206 d2kk(i,
j,
k, l) += 2.0 *
_ccc * dsin3Lode(i,
j) * dsin3Lode(
k, l);
212 Real denom = std::sqrt(
smooth(stress) + sibar2 * Utility::pow<2>(kk));
213 Real denom3 = Utility::pow<3>(denom);
216 0.5 *
dsmooth(stress) * dmean_stress + 0.5 * dsibar2 * kk * kk + sibar2 * kk * dkk;
218 RankFourTensor dr_dstress = (0.5 * d2sibar2 * Utility::pow<2>(kk) + sibar2 * kk * d2kk) / denom;
219 for (
unsigned i = 0; i < 3; ++i)
220 for (
unsigned j = 0;
j < 3; ++
j)
221 for (
unsigned k = 0;
k < 3; ++
k)
222 for (
unsigned l = 0; l < 3; ++l)
224 dr_dstress(i,
j,
k, l) +=
225 0.5 * d2smooth_over_denom * dmean_stress(i,
j) * dmean_stress(
k, l);
226 dr_dstress(i,
j,
k, l) +=
227 (dsibar2(i,
j) * dkk(
k, l) * kk + dkk(i,
j) * dsibar2(
k, l) * kk +
228 sibar2 * dkk(i,
j) * dkk(
k, l)) /
230 dr_dstress(i,
j,
k, l) -= numer_full(i,
j) * numer_full(
k, l) / denom3;
265 smoother2 += Utility::pow<2>(p);
284 dsmoother2 += 2.0 * p * dp_dx;
292 Real d2smoother2 = 0;
306 d2smoother2 += 2.0 * Utility::pow<2>(dp_dx) + 2.0 * p * d2p_dx2;
Real yieldFunction(const RankTwoTensor &stress, Real intnl) const override
The following functions are what you should override when building single-plasticity models...
RankTwoTensorTempl< Real > dsecondInvariant() const
RankFourTensorTempl< Real > d2secondInvariant() const
registerMooseObject("SolidMechanicsApp", SolidMechanicsPlasticTensile)
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sin(_arg) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tan
void symmetricEigenvalues(std::vector< Real > &eigvals) const
FiniteStrainTensile implements rate-independent associative tensile failure with hardening/softening ...
Real sin3Lode(const Real &r0, const Real &r0_value) const
RankFourTensor dflowPotential_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of the flow potential with respect to stress.
void dsymmetricEigenvalues(std::vector< Real > &eigvals, std::vector< RankTwoTensorTempl< Real >> &deigvals) const
Real dyieldFunction_dintnl(const RankTwoTensor &stress, Real intnl) const override
The derivative of yield function with respect to the internal parameter.
Real secondInvariant() const
MooseEnum _tip_scheme
The yield function is modified to f = s_m + sqrt(a + s_bar^2 K^2) - tensile_strength where "a" depend...
RankTwoTensorTempl< Real > dtrace() const
virtual Real dtensile_strength(const Real internal_param) const
d(tensile strength)/d(internal_param) as a function of residual value, rate, and internal_param ...
Real _bbb
Abbo et al's B parameter.
RankTwoTensor dyieldFunction_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of yield function with respect to stress.
The following methods are specializations for using the Parallel::packed_range_* routines for a vecto...
Real _sin3tt
sin(3*_tt) - useful for making comparisons with Lode angle
virtual Real value(Real intnl) const
SolidMechanicsPlasticTensile(const InputParameters ¶meters)
RankTwoTensorTempl< Real > dsin3Lode(const Real &r0) const
virtual Real tensile_strength(const Real internal_param) const
tensile strength as a function of residual value, rate, and internal_param
Real _small_smoother2
Square of tip smoothing parameter to smooth the cone at mean_stress = T.
static InputParameters validParams()
Real _cap_rate
dictates how quickly the 'cap' degenerates to a hemisphere - see doco for _tip_scheme ...
const std::vector< double > x
Real _lode_cutoff
if secondInvariant < _lode_cutoff then set Lode angle to zero. This is to guard against precision-los...
void d2symmetricEigenvalues(std::vector< RankFourTensorTempl< Real >> &deriv) const
RankTwoTensor flowPotential(const RankTwoTensor &stress, Real intnl) const override
The flow potential.
static InputParameters validParams()
RankFourTensorTempl< Real > d2sin3Lode(const Real &r0) const
const SolidMechanicsHardeningModel & _strength
Real _tt
edge smoothing parameter, in radians
Real _aaa
Abbo et al's A parameter.
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
virtual Real derivative(Real intnl) const
virtual Real d2smooth(const RankTwoTensor &stress) const
returns the d^2a/dstress_mean^2 - see doco for _tip_scheme
Hardening Model base class.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
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
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
Real _ccc
Abbo et al's C parameter.
virtual Real smooth(const RankTwoTensor &stress) const
returns the 'a' parameter - see doco for _tip_scheme
Plastic Model base class The virtual functions written below must be over-ridden in derived classes t...
registerMooseObjectRenamed("SolidMechanicsApp", TensorMechanicsPlasticTensile, "01/01/2025 00:00", SolidMechanicsPlasticTensile)
static const std::string k
Real _cap_start
smoothing parameter dictating when the 'cap' will start - see doco for _tip_scheme ...
virtual std::string modelName() const override
virtual Real dsmooth(const RankTwoTensor &stress) const
returns the da/dstress_mean - see doco for _tip_scheme