https://mooseframework.inl.gov
SolidMechanicsPlasticOrthotropic.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 #include "RankFourTensor.h"
12 #include "libmesh/utility.h"
13 
15 registerMooseObjectRenamed("SolidMechanicsApp",
16  TensorMechanicsPlasticOrthotropic,
17  "01/01/2025 00:00",
19 
22 {
24  params.addRequiredParam<std::vector<Real>>("c1", "The six coefficients of L prime");
25  params.addRequiredParam<std::vector<Real>>("c2", "The six coefficients of L prime prime");
26  params.addClassDescription("Orthotropic plasticity for pressure sensitive materials and also "
27  "models the strength differential effect");
28  return params;
29 }
30 
32  const InputParameters & parameters)
34  _c1(getParam<std::vector<Real>>("c1")),
35  _c2(getParam<std::vector<Real>>("c2"))
36 {
37  _c = 1.0;
38  _l1(0, 0, 0, 0) = (_c1[1] + _c1[2]) / 3.0;
39  _l1(0, 0, 1, 1) = -_c1[2] / 3.0;
40  _l1(0, 0, 2, 2) = -_c1[1] / 3.0;
41  _l1(1, 1, 0, 0) = -_c1[2] / 3.0;
42  _l1(1, 1, 1, 1) = (_c1[0] + _c1[2]) / 3.0;
43  _l1(1, 1, 2, 2) = -_c1[0] / 3.0;
44  _l1(2, 2, 0, 0) = -_c1[1] / 3.0;
45  _l1(2, 2, 1, 1) = -_c1[0] / 3.0;
46  _l1(2, 2, 2, 2) = (_c1[0] + _c1[1]) / 3.0;
47  _l1(0, 1, 1, 0) = _c1[5] / 2.0;
48  _l1(0, 1, 0, 1) = _c1[5] / 2.0;
49  _l1(1, 0, 1, 0) = _c1[5] / 2.0;
50  _l1(1, 0, 0, 1) = _c1[5] / 2.0;
51  _l1(0, 2, 0, 2) = _c1[4] / 2.0;
52  _l1(0, 2, 2, 0) = _c1[4] / 2.0;
53  _l1(2, 0, 2, 0) = _c1[4] / 2.0;
54  _l1(2, 0, 0, 2) = _c1[4] / 2.0;
55  _l1(1, 2, 2, 1) = _c1[3] / 2.0;
56  _l1(1, 2, 1, 2) = _c1[3] / 2.0;
57  _l1(2, 1, 1, 2) = _c1[3] / 2.0;
58  _l1(2, 1, 2, 1) = _c1[3] / 2.0;
59 
60  _l2(0, 0, 0, 0) = (_c2[1] + _c2[2]) / 3.0;
61  _l2(0, 0, 1, 1) = -_c2[2] / 3.0;
62  _l2(0, 0, 2, 2) = -_c2[1] / 3.0;
63  _l2(1, 1, 0, 0) = -_c2[2] / 3.0;
64  _l2(1, 1, 1, 1) = (_c2[0] + _c2[2]) / 3.0;
65  _l2(1, 1, 2, 2) = -_c2[0] / 3.0;
66  _l2(2, 2, 0, 0) = -_c2[1] / 3.0;
67  _l2(2, 2, 1, 1) = -_c2[0] / 3.0;
68  _l2(2, 2, 2, 2) = (_c2[0] + _c2[1]) / 3.0;
69  _l2(0, 1, 1, 0) = _c2[5] / 2.0;
70  _l2(0, 1, 0, 1) = _c2[5] / 2.0;
71  _l2(1, 0, 1, 0) = _c2[5] / 2.0;
72  _l2(1, 0, 0, 1) = _c2[5] / 2.0;
73  _l2(0, 2, 0, 2) = _c2[4] / 2.0;
74  _l2(0, 2, 2, 0) = _c2[4] / 2.0;
75  _l2(2, 0, 2, 0) = _c2[4] / 2.0;
76  _l2(2, 0, 0, 2) = _c2[4] / 2.0;
77  _l2(1, 2, 2, 1) = _c2[3] / 2.0;
78  _l2(1, 2, 1, 2) = _c2[3] / 2.0;
79  _l2(2, 1, 1, 2) = _c2[3] / 2.0;
80  _l2(2, 1, 2, 1) = _c2[3] / 2.0;
81 }
82 
83 Real
85 {
86  const RankTwoTensor j2prime = _l1 * stress;
87  const RankTwoTensor j3prime = _l2 * stress;
88  return _b * stress.trace() +
89  std::pow(std::pow(-j2prime.generalSecondInvariant(), 3.0 / 2.0) - j3prime.det(),
90  1.0 / 3.0) -
91  yieldStrength(intnl);
92 }
93 
96  Real /*intnl*/) const
97 {
98  const RankTwoTensor j2prime = _l1 * stress;
99  const RankTwoTensor j3prime = _l2 * stress;
100  const Real j2 = -j2prime.generalSecondInvariant();
101  const Real j3 = j3prime.det();
102  return _b * dI_sigma() + dphi_dj2(j2, j3) * _l1.innerProductTranspose(dj2_dSkl(j2prime)) +
103  dphi_dj3(j2, j3) * _l2.innerProductTranspose(j3prime.ddet());
104 }
105 
108  Real /*intnl*/) const
109 {
110  if (_associative)
111  {
112  const RankTwoTensor j2prime = _l1 * stress;
113  const RankTwoTensor j3prime = _l2 * stress;
114  const RankTwoTensor dj2 = dj2_dSkl(j2prime);
115  const RankTwoTensor dj3 = j3prime.ddet();
116  const Real j2 = -j2prime.generalSecondInvariant();
117  const Real j3 = j3prime.det();
118  const RankFourTensor dr =
119  dfj2_dj2(j2, j3) *
121  dfj2_dj3(j2, j3) *
123  dfj3_dj2(j2, j3) *
125  dfj3_dj3(j2, j3) *
127  const RankTwoTensor r = _b * dI_sigma() +
128  dphi_dj2(j2, j3) * _l1.innerProductTranspose(dj2_dSkl(j2prime)) +
129  dphi_dj3(j2, j3) * _l2.innerProductTranspose(j3prime.ddet());
130  const Real norm = r.L2norm();
131  return dr / norm - (r / Utility::pow<3>(norm)).outerProduct(dr.innerProductTranspose(r));
132  }
133  else
135 }
136 
139 {
140  if (_associative)
141  {
142  const RankTwoTensor a = dyieldFunction_dstress(stress, intnl);
143  return a / a.L2norm();
144  }
145  else
147 }
RankFourTensorTempl< Real > outerProduct(const RankTwoTensorTempl< Real > &b) const
Real dfj3_dj2(const Real j2, const Real j3) const
derivative of dphi_dJ3 with respect to J2
Real dfj2_dj3(const Real j2, const Real j3) const
derivative of dphi_dJ2 with respect to J3
Real generalSecondInvariant() const
RankFourTensor _l1
Transformation tensor from the stress tensor to the deviatoric stress tensor for J2.
Real dfj3_dj3(const Real j2, const Real j3) const
derivative of dphi_dJ3 with respect to J3
RankTwoTensorTempl< T > innerProductTranspose(const RankTwoTensorTempl< T > &) const
const bool _associative
Flag for flow-rule, true if not specified.
const Real _b
A constant to model the influence of pressure.
RankTwoTensor dyieldFunction_dstress(const RankTwoTensor &stress, Real intnl) const override
Tensor derivative of the yield_function with respect to the stress tensor.
SolidMechanicsPlasticOrthotropic(const InputParameters &parameters)
RankTwoTensor dI_sigma() const
derivative of the trace with respect to sigma rank two tensor
void addRequiredParam(const std::string &name, const std::string &doc_string)
RankTwoTensor dj2_dSkl(const RankTwoTensor &stress) const
derivative of the second invariant with respect to the stress deviatoric tensor
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}
virtual RankFourTensor dflowPotential_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of the flow potential with respect to stress.
Real dphi_dj3(const Real j2, const Real j3) const
derivative of phi with respect to J3
Orthotropic plasticity model from Yoon (2013) the name of the paper is "Asymmetric yield function bas...
RankTwoTensor flowPotential(const RankTwoTensor &stress, Real intnl) const override
Receives the flag for associative or non-associative and calculates the flow potential accordingly...
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 _c
A constant to model the influence of strength differential effect.
RankFourTensor _l2
Transformation tensor from the stress tensor to the deviatoric stress tensor for J3.
auto norm(const T &a) -> decltype(std::abs(a))
virtual Real yieldStrength(Real intnl) const
YieldStrength.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual RankTwoTensor dyieldFunction_dstress(const RankTwoTensor &stress, Real intnl) const override
The derivative of yield function with respect to stress.
RankTwoTensorTempl< Real > ddet() const
IsotropicSD plasticity model from Yoon (2013) the name of the paper is "Asymmetric yield function bas...
void addClassDescription(const std::string &doc_string)
registerMooseObject("SolidMechanicsApp", SolidMechanicsPlasticOrthotropic)
registerMooseObjectRenamed("SolidMechanicsApp", TensorMechanicsPlasticOrthotropic, "01/01/2025 00:00", SolidMechanicsPlasticOrthotropic)
Real dfj2_dj2(const Real j2, const Real j3) const
derivative of dphi_dJ2 with respect to J2
MooseUnits pow(const MooseUnits &, int)
const std::vector< Real > _c1
The six coefficients of L prime.
const std::vector< Real > _c2
The six coefficients of L prime prime.
Real yieldFunction(const RankTwoTensor &stress, Real intnl) const override
Yield_function = a[b*I1 + (J2^{3/2} - c*J3)^{1/3}] - yield_strength.