www.mooseframework.org
TensorMechanicsPlasticIsotropicSD.C
Go to the documentation of this file.
1 /****************************************************************/
2 /* MOOSE - Multiphysics Object Oriented Simulation Environment */
3 /* */
4 /* All contents are licensed under LGPL V2.1 */
5 /* See LICENSE for full restrictions */
6 /****************************************************************/
8 
9 template <>
10 InputParameters
12 {
13  InputParameters params = validParams<TensorMechanicsPlasticJ2>();
14  params.addRequiredParam<Real>("b", "A constant to model the influence of pressure");
15  params.addParam<Real>(
16  "c", 0.0, "A constant to model the influence of strength differential effect");
17  params.addParam<bool>("associative", true, "Flag for flow-rule, true if not specified");
18  params.addClassDescription("IsotropicSD plasticity for pressure sensitive materials and also "
19  "models the strength differential effect");
20  return params;
21 }
22 
24  const InputParameters & parameters)
25  : TensorMechanicsPlasticJ2(parameters),
26  _b(getParam<Real>("b")),
27  _c(getParam<Real>("c")),
28  _associative(getParam<bool>("associative"))
29 {
30  _a = 1.0 / (_b + std::pow(1.0 / std::sqrt(27.0) - _c / 27.0, 1.0 / 3.0));
31  for (unsigned i = 0; i < 3; ++i)
32  for (unsigned j = 0; j < 3; ++j)
33  for (unsigned k = 0; k < 3; ++k)
34  for (unsigned l = 0; l < 3; ++l)
35  _h(i, j, k, l) = ((i == k) * (j == l) - 1.0 / 3.0 * (i == j) * (k == l));
36 }
37 
38 Real
39 TensorMechanicsPlasticIsotropicSD::dphi_dj2(const Real j2, const Real j3) const
40 {
41  return std::pow(j2, 1.0 / 2.0) / (2 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 2.0 / 3.0));
42 }
43 
44 Real
45 TensorMechanicsPlasticIsotropicSD::dphi_dj3(const Real j2, const Real j3) const
46 {
47  return -_c / (3 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 2.0 / 3.0));
48 }
49 
50 Real
51 TensorMechanicsPlasticIsotropicSD::dfj2_dj2(const Real j2, const Real j3) const
52 {
53  return std::pow(j2, -1.0 / 2.0) / (4 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 2.0 / 3.0)) -
54  j2 / (2 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 5.0 / 3.0));
55 }
56 
57 Real
58 TensorMechanicsPlasticIsotropicSD::dfj2_dj3(const Real j2, const Real j3) const
59 {
60  return _c * std::pow(j2, 1.0 / 2.0) /
61  (3 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 5.0 / 3.0));
62 }
63 
64 Real
65 TensorMechanicsPlasticIsotropicSD::dfj3_dj2(const Real j2, const Real j3) const
66 {
67  return _c * std::pow(j2, 1.0 / 2.0) /
68  (3 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 5.0 / 3.0));
69 }
70 
71 Real
72 TensorMechanicsPlasticIsotropicSD::dfj3_dj3(const Real j2, const Real j3) const
73 {
74  return -_c * _c * 2.0 / (9 * std::pow(std::pow(j2, 3.0 / 2.0) - _c * j3, 5.0 / 3.0));
75 }
76 
77 RankTwoTensor
79 {
80  return RankTwoTensor(RankTwoTensor::initIdentity);
81 }
82 
83 RankTwoTensor
84 TensorMechanicsPlasticIsotropicSD::dj2_dSkl(const RankTwoTensor & stress) const
85 {
86  RankTwoTensor a;
87  const Real trace = stress.trace();
88  for (unsigned i = 0; i < 3; ++i)
89  for (unsigned j = 0; j < 3; ++j)
90  a(i, j) = (trace - stress(i, j)) * -1 * (i == j) + stress(i, j) * (i != j);
91 
92  return a;
93 }
94 
95 Real
96 TensorMechanicsPlasticIsotropicSD::yieldFunction(const RankTwoTensor & stress, Real intnl) const
97 {
98  return _a * (_b * stress.trace() +
99  std::pow(std::pow(stress.secondInvariant(), 1.5) - _c * stress.thirdInvariant(),
100  1.0 / 3.0)) -
101  yieldStrength(intnl);
102 }
103 
104 RankTwoTensor
106  Real /*intnl*/) const
107 {
108  const RankTwoTensor sDev = stress.deviatoric();
109  const Real j2 = stress.secondInvariant();
110  const Real j3 = stress.thirdInvariant();
111  return _a * (_b * dI_sigma() + dphi_dj2(j2, j3) * _h.innerProductTranspose(dj2_dSkl(sDev)) +
112  dphi_dj3(j2, j3) * _h.innerProductTranspose(sDev.ddet()));
113 }
114 
115 RankFourTensor
117  Real /*intnl*/) const
118 {
119  if (_associative)
120  {
121  const RankTwoTensor sDev = stress.deviatoric();
122  const RankTwoTensor dj2 = dj2_dSkl(sDev);
123  const RankTwoTensor dj3 = sDev.ddet();
124  const Real j2 = stress.secondInvariant();
125  const Real j3 = stress.thirdInvariant();
126  return _a * (dfj2_dj2(j2, j3) *
127  _h.innerProductTranspose(dj2).outerProduct(_h.innerProductTranspose(dj2)) +
128  dfj2_dj3(j2, j3) *
129  _h.innerProductTranspose(dj2).outerProduct(_h.innerProductTranspose(dj3)) +
130  dfj3_dj2(j2, j3) *
131  _h.innerProductTranspose(dj3).outerProduct(_h.innerProductTranspose(dj2)) +
132  dfj3_dj3(j2, j3) *
133  _h.innerProductTranspose(dj3).outerProduct(_h.innerProductTranspose(dj3)));
134  }
135  else
137 }
138 
139 RankTwoTensor
140 TensorMechanicsPlasticIsotropicSD::flowPotential(const RankTwoTensor & stress, Real intnl) const
141 {
142  if (_associative)
143  return dyieldFunction_dstress(stress, intnl);
144  else
146 }
RankTwoTensor dI_sigma() const
derivative of the trace with respect to sigma rank two tensor
Real _c
A constant to model the influence of strength differential effect.
RankTwoTensor dj2_dSkl(const RankTwoTensor &stress) const
derivative of the second invariant with respect to the stress deviatoric tensor
InputParameters validParams< TensorMechanicsPlasticJ2 >()
Real dfj2_dj2(const Real j2, const Real j3) const
derivative of dphi_dJ2 with respect to J2
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...
TensorMechanicsPlasticIsotropicSD(const InputParameters &parameters)
J2 plasticity, associative, with hardning.
virtual Real yieldStrength(Real intnl) const
YieldStrength.
Real dphi_dj3(const Real j2, const Real j3) const
derivative of phi with respect to J3
InputParameters validParams< TensorMechanicsPlasticIsotropicSD >()
virtual RankTwoTensor dyieldFunction_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of yield function with respect to stress.
Real dfj3_dj2(const Real j2, const Real j3) const
derivative of dphi_dJ3 with respect to J2
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.
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
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}
Real _a
A constant used in the constructor that depends on _b and _c.
virtual RankFourTensor dflowPotential_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of the flow potential with respect to stress.
Real yieldFunction(const RankTwoTensor &stress, Real intnl) const override
Yield_function = a[b*I1 + (J2^{3/2} - c*J3)^{1/3}] - yield_strength.
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
RankTwoTensor flowPotential(const RankTwoTensor &stress, Real intnl) const override
Receives the flag for associative or non-associative and calculates the flow potential accordingly...
const bool _associative
Flag for flow-rule, true if not specified.