www.mooseframework.org
TensorMechanicsPlasticOrthotropic.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 #include "libmesh/utility.h"
9 
10 template <>
11 InputParameters
13 {
14  InputParameters params = validParams<TensorMechanicsPlasticIsotropicSD>();
15  params.addRequiredParam<std::vector<Real>>("c1", "The six coefficients of L prime");
16  params.addRequiredParam<std::vector<Real>>("c2", "The six coefficients of L prime prime");
17  params.addClassDescription("Orthotropic plasticity for pressure sensitive materials and also "
18  "models the strength differential effect");
19  return params;
20 }
21 
23  const InputParameters & parameters)
25  _c1(getParam<std::vector<Real>>("c1")),
26  _c2(getParam<std::vector<Real>>("c2"))
27 {
28  _c = 1.0;
29  _l1(0, 0, 0, 0) = (_c1[1] + _c1[2]) / 3.0;
30  _l1(0, 0, 1, 1) = -_c1[2] / 3.0;
31  _l1(0, 0, 2, 2) = -_c1[1] / 3.0;
32  _l1(1, 1, 0, 0) = -_c1[2] / 3.0;
33  _l1(1, 1, 1, 1) = (_c1[0] + _c1[2]) / 3.0;
34  _l1(1, 1, 2, 2) = -_c1[0] / 3.0;
35  _l1(2, 2, 0, 0) = -_c1[1] / 3.0;
36  _l1(2, 2, 1, 1) = -_c1[0] / 3.0;
37  _l1(2, 2, 2, 2) = (_c1[0] + _c1[1]) / 3.0;
38  _l1(0, 1, 1, 0) = _c1[5] / 2.0;
39  _l1(0, 1, 0, 1) = _c1[5] / 2.0;
40  _l1(1, 0, 1, 0) = _c1[5] / 2.0;
41  _l1(1, 0, 0, 1) = _c1[5] / 2.0;
42  _l1(0, 2, 0, 2) = _c1[4] / 2.0;
43  _l1(0, 2, 2, 0) = _c1[4] / 2.0;
44  _l1(2, 0, 2, 0) = _c1[4] / 2.0;
45  _l1(2, 0, 0, 2) = _c1[4] / 2.0;
46  _l1(1, 2, 2, 1) = _c1[3] / 2.0;
47  _l1(1, 2, 1, 2) = _c1[3] / 2.0;
48  _l1(2, 1, 1, 2) = _c1[3] / 2.0;
49  _l1(2, 1, 2, 1) = _c1[3] / 2.0;
50 
51  _l2(0, 0, 0, 0) = (_c2[1] + _c2[2]) / 3.0;
52  _l2(0, 0, 1, 1) = -_c2[2] / 3.0;
53  _l2(0, 0, 2, 2) = -_c2[1] / 3.0;
54  _l2(1, 1, 0, 0) = -_c2[2] / 3.0;
55  _l2(1, 1, 1, 1) = (_c2[0] + _c2[2]) / 3.0;
56  _l2(1, 1, 2, 2) = -_c2[0] / 3.0;
57  _l2(2, 2, 0, 0) = -_c2[1] / 3.0;
58  _l2(2, 2, 1, 1) = -_c2[0] / 3.0;
59  _l2(2, 2, 2, 2) = (_c2[0] + _c2[1]) / 3.0;
60  _l2(0, 1, 1, 0) = _c2[5] / 2.0;
61  _l2(0, 1, 0, 1) = _c2[5] / 2.0;
62  _l2(1, 0, 1, 0) = _c2[5] / 2.0;
63  _l2(1, 0, 0, 1) = _c2[5] / 2.0;
64  _l2(0, 2, 0, 2) = _c2[4] / 2.0;
65  _l2(0, 2, 2, 0) = _c2[4] / 2.0;
66  _l2(2, 0, 2, 0) = _c2[4] / 2.0;
67  _l2(2, 0, 0, 2) = _c2[4] / 2.0;
68  _l2(1, 2, 2, 1) = _c2[3] / 2.0;
69  _l2(1, 2, 1, 2) = _c2[3] / 2.0;
70  _l2(2, 1, 1, 2) = _c2[3] / 2.0;
71  _l2(2, 1, 2, 1) = _c2[3] / 2.0;
72 }
73 
74 Real
75 TensorMechanicsPlasticOrthotropic::yieldFunction(const RankTwoTensor & stress, Real intnl) const
76 {
77  const RankTwoTensor j2prime = _l1 * stress;
78  const RankTwoTensor j3prime = _l2 * stress;
79  return _b * stress.trace() +
80  std::pow(std::pow(-j2prime.generalSecondInvariant(), 3.0 / 2.0) - j3prime.det(),
81  1.0 / 3.0) -
82  yieldStrength(intnl);
83 }
84 
85 RankTwoTensor
87  Real /*intnl*/) const
88 {
89  const RankTwoTensor j2prime = _l1 * stress;
90  const RankTwoTensor j3prime = _l2 * stress;
91  const Real j2 = -j2prime.generalSecondInvariant();
92  const Real j3 = j3prime.det();
93  return _b * dI_sigma() + dphi_dj2(j2, j3) * _l1.innerProductTranspose(dj2_dSkl(j2prime)) +
94  dphi_dj3(j2, j3) * _l2.innerProductTranspose(j3prime.ddet());
95 }
96 
97 RankFourTensor
99  Real /*intnl*/) const
100 {
101  if (_associative)
102  {
103  const RankTwoTensor j2prime = _l1 * stress;
104  const RankTwoTensor j3prime = _l2 * stress;
105  const RankTwoTensor dj2 = dj2_dSkl(j2prime);
106  const RankTwoTensor dj3 = j3prime.ddet();
107  const Real j2 = -j2prime.generalSecondInvariant();
108  const Real j3 = j3prime.det();
109  const RankFourTensor dr =
110  dfj2_dj2(j2, j3) *
111  _l1.innerProductTranspose(dj2).outerProduct(_l1.innerProductTranspose(dj2)) +
112  dfj2_dj3(j2, j3) *
113  _l1.innerProductTranspose(dj2).outerProduct(_l2.innerProductTranspose(dj3)) +
114  dfj3_dj2(j2, j3) *
115  _l2.innerProductTranspose(dj3).outerProduct(_l1.innerProductTranspose(dj2)) +
116  dfj3_dj3(j2, j3) *
117  _l2.innerProductTranspose(dj3).outerProduct(_l2.innerProductTranspose(dj3));
118  const RankTwoTensor r = _b * dI_sigma() +
119  dphi_dj2(j2, j3) * _l1.innerProductTranspose(dj2_dSkl(j2prime)) +
120  dphi_dj3(j2, j3) * _l2.innerProductTranspose(j3prime.ddet());
121  const Real norm = r.L2norm();
122  return dr / norm - (r / Utility::pow<3>(norm)).outerProduct(dr.innerProductTranspose(r));
123  }
124  else
126 }
127 
128 RankTwoTensor
129 TensorMechanicsPlasticOrthotropic::flowPotential(const RankTwoTensor & stress, Real intnl) const
130 {
131  if (_associative)
132  {
133  const RankTwoTensor a = dyieldFunction_dstress(stress, intnl);
134  return a / a.L2norm();
135  }
136  else
138 }
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
IsotropicSD plasticity model from Yoon (2013) the name of the paper is "Asymmetric yield function bas...
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 dfj2_dj2(const Real j2, const Real j3) const
derivative of dphi_dJ2 with respect to J2
RankFourTensor _l1
Transformation tensor from the stress tensor to the deviatoric stress tensor for J2.
TensorMechanicsPlasticOrthotropic(const InputParameters &parameters)
RankTwoTensor dyieldFunction_dstress(const RankTwoTensor &stress, Real intnl) const override
Tensor derivative of the yield_function with respect to the stress tensor.
Real yieldFunction(const RankTwoTensor &stress, Real intnl) const override
Yield_function = a[b*I1 + (J2^{3/2} - c*J3)^{1/3}] - yield_strength.
virtual Real yieldStrength(Real intnl) const
YieldStrength.
Real dphi_dj3(const Real j2, const Real j3) const
derivative of phi with respect to J3
virtual RankTwoTensor dyieldFunction_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of yield function with respect to stress.
const std::vector< Real > _c1
The six coefficients of L prime.
RankFourTensor _l2
Transformation tensor from the stress tensor to the deviatoric stress tensor for J3.
InputParameters validParams< TensorMechanicsPlasticOrthotropic >()
Real dfj3_dj2(const Real j2, const Real j3) const
derivative of dphi_dJ3 with respect to J2
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}
const std::vector< Real > _c2
The six coefficients of L prime prime.
RankTwoTensor flowPotential(const RankTwoTensor &stress, Real intnl) const override
Receives the flag for associative or non-associative and calculates the flow potential accordingly...
virtual RankFourTensor dflowPotential_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of the flow potential with respect to stress.
const Real _b
A constant to model the influence of pressure.
InputParameters validParams< TensorMechanicsPlasticIsotropicSD >()
Real dfj2_dj3(const Real j2, const Real j3) const
derivative of dphi_dJ2 with respect to J3
const bool _associative
Flag for flow-rule, true if not specified.