https://mooseframework.inl.gov
Loading...
Searching...
No Matches
SolidMechanicsPlasticIsotropicSD.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
11
13registerMooseObjectRenamed("SolidMechanicsApp",
14 TensorMechanicsPlasticIsotropicSD,
15 "01/01/2025 00:00",
17
20{
22 params.addRequiredParam<Real>("b", "A constant to model the influence of pressure");
23 params.addParam<Real>(
24 "c", 0.0, "A constant to model the influence of strength differential effect");
25 params.addParam<bool>("associative", true, "Flag for flow-rule, true if not specified");
26 params.addClassDescription("IsotropicSD plasticity for pressure sensitive materials and also "
27 "models the strength differential effect");
28 return params;
29}
30
32 const InputParameters & parameters)
33 : SolidMechanicsPlasticJ2(parameters),
34 _b(getParam<Real>("b")),
35 _c(getParam<Real>("c")),
36 _associative(getParam<bool>("associative"))
37{
38 _a = 1.0 / (_b + std::pow(1.0 / std::sqrt(27.0) - _c / 27.0, 1.0 / 3.0));
39 for (unsigned i = 0; i < 3; ++i)
40 for (unsigned j = 0; j < 3; ++j)
41 for (unsigned k = 0; k < 3; ++k)
42 for (unsigned l = 0; l < 3; ++l)
43 _h(i, j, k, l) = ((i == k) * (j == l) - 1.0 / 3.0 * (i == j) * (k == l));
44}
45
46Real
47SolidMechanicsPlasticIsotropicSD::dphi_dj2(const Real j2, const Real j3) const
48{
49 return std::pow(j2, 1.0 / 2.0) / (2 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 2.0 / 3.0));
50}
51
52Real
53SolidMechanicsPlasticIsotropicSD::dphi_dj3(const Real j2, const Real j3) const
54{
55 return -_c / (3 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 2.0 / 3.0));
56}
57
58Real
59SolidMechanicsPlasticIsotropicSD::dfj2_dj2(const Real j2, const Real j3) const
60{
61 return std::pow(j2, -1.0 / 2.0) / (4 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 2.0 / 3.0)) -
62 j2 / (2 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 5.0 / 3.0));
63}
64
65Real
66SolidMechanicsPlasticIsotropicSD::dfj2_dj3(const Real j2, const Real j3) const
67{
68 return _c * std::pow(j2, 1.0 / 2.0) /
69 (3 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 5.0 / 3.0));
70}
71
72Real
73SolidMechanicsPlasticIsotropicSD::dfj3_dj2(const Real j2, const Real j3) const
74{
75 return _c * std::pow(j2, 1.0 / 2.0) /
76 (3 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 5.0 / 3.0));
77}
78
79Real
80SolidMechanicsPlasticIsotropicSD::dfj3_dj3(const Real j2, const Real j3) const
81{
82 return -_c * _c * 2.0 / (9 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 5.0 / 3.0));
83}
84
90
93{
95 const Real trace = stress.trace();
96 for (unsigned i = 0; i < 3; ++i)
97 for (unsigned j = 0; j < 3; ++j)
98 a(i, j) = (trace - stress(i, j)) * -1 * (i == j) + stress(i, j) * (i != j);
99
100 return a;
101}
102
103Real
105{
106 return _a * (_b * stress.trace() +
107 std::pow(std::pow(stress.secondInvariant(), 1.5) - _c * stress.thirdInvariant(),
108 1.0 / 3.0)) -
109 yieldStrength(intnl);
110}
111
114 Real /*intnl*/) const
115{
116 const RankTwoTensor sDev = stress.deviatoric();
117 const Real j2 = stress.secondInvariant();
118 const Real j3 = stress.thirdInvariant();
119 return _a * (_b * dI_sigma() + dphi_dj2(j2, j3) * _h.innerProductTranspose(dj2_dSkl(sDev)) +
120 dphi_dj3(j2, j3) * _h.innerProductTranspose(sDev.ddet()));
121}
122
125 Real /*intnl*/) const
126{
127 if (_associative)
128 {
129 const RankTwoTensor sDev = stress.deviatoric();
130 const RankTwoTensor dj2 = dj2_dSkl(sDev);
131 const RankTwoTensor dj3 = sDev.ddet();
132 const Real j2 = stress.secondInvariant();
133 const Real j3 = stress.thirdInvariant();
134 return _a * (dfj2_dj2(j2, j3) *
135 _h.innerProductTranspose(dj2).outerProduct(_h.innerProductTranspose(dj2)) +
136 dfj2_dj3(j2, j3) *
137 _h.innerProductTranspose(dj2).outerProduct(_h.innerProductTranspose(dj3)) +
138 dfj3_dj2(j2, j3) *
139 _h.innerProductTranspose(dj3).outerProduct(_h.innerProductTranspose(dj2)) +
140 dfj3_dj3(j2, j3) *
141 _h.innerProductTranspose(dj3).outerProduct(_h.innerProductTranspose(dj3)));
142 }
143 else
145}
146
149{
150 if (_associative)
151 return dyieldFunction_dstress(stress, intnl);
152 else
154}
registerMooseObjectRenamed("SolidMechanicsApp", TensorMechanicsPlasticIsotropicSD, "01/01/2025 00:00", SolidMechanicsPlasticIsotropicSD)
registerMooseObject("SolidMechanicsApp", SolidMechanicsPlasticIsotropicSD)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
RankTwoTensorTempl< T > innerProductTranspose(const RankTwoTensorTempl< T > &) const
RankTwoTensorTempl< T > ddet() const
T thirdInvariant() const
T secondInvariant() const
RankTwoTensorTempl< T > deviatoric() const
IsotropicSD plasticity model from Yoon (2013) the name of the paper is "Asymmetric yield function bas...
const Real _b
A constant to model the influence of pressure.
Real dfj2_dj3(const Real j2, const Real j3) const
derivative of dphi_dJ2 with respect to J3
SolidMechanicsPlasticIsotropicSD(const InputParameters &parameters)
Real dphi_dj3(const Real j2, const Real j3) const
derivative of phi with respect to J3
RankTwoTensor dj2_dSkl(const RankTwoTensor &stress) const
derivative of the second invariant with respect to the stress deviatoric tensor
Real dfj2_dj2(const Real j2, const Real j3) const
derivative of dphi_dJ2 with respect to J2
Real yieldFunction(const RankTwoTensor &stress, Real intnl) const override
Yield_function = a[b*I1 + (J2^{3/2} - c*J3)^{1/3}] - yield_strength.
Real _a
A constant used in the constructor that depends on _b and _c.
RankFourTensor dflowPotential_dstress(const RankTwoTensor &stress, Real intnl) const override
Tensor derivative of the tensor derivative of the yield_function with respect to the stress tensor.
Real dfj3_dj2(const Real j2, const Real j3) const
derivative of dphi_dJ3 with respect to J2
const bool _associative
Flag for flow-rule, true if not specified.
RankFourTensor _h
Comes from transforming the stress tensor to the deviatoric stress tensor.
RankTwoTensor dyieldFunction_dstress(const RankTwoTensor &stress, Real intnl) const override
Tensor derivative of the yield_function with respect to the stress tensor.
RankTwoTensor dI_sigma() const
derivative of the trace with respect to sigma rank two tensor
RankTwoTensor flowPotential(const RankTwoTensor &stress, Real intnl) const override
Receives the flag for associative or non-associative and calculates the flow potential accordingly.
Real _c
A constant to model the influence of strength differential effect.
Real dfj3_dj3(const Real j2, const Real j3) const
derivative of dphi_dJ3 with respect to J3
Real dphi_dj2(const Real j2, const Real j3) const
derivative of phi with respect to J2, phi is b*I1 + (J2^{3/2} - c*J3)^{1/3}
J2 plasticity, associative, with hardning.
virtual RankTwoTensor dyieldFunction_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of yield function with respect to stress.
virtual RankFourTensor dflowPotential_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of the flow potential with respect to stress.
virtual Real yieldStrength(Real intnl) const
YieldStrength.
static InputParameters validParams()