https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
15registerMooseObjectRenamed("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
83Real
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) *
120 _l1.innerProductTranspose(dj2).outerProduct(_l1.innerProductTranspose(dj2)) +
121 dfj2_dj3(j2, j3) *
122 _l1.innerProductTranspose(dj2).outerProduct(_l2.innerProductTranspose(dj3)) +
123 dfj3_dj2(j2, j3) *
124 _l2.innerProductTranspose(dj3).outerProduct(_l1.innerProductTranspose(dj2)) +
125 dfj3_dj3(j2, j3) *
126 _l2.innerProductTranspose(dj3).outerProduct(_l2.innerProductTranspose(dj3));
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}
registerMooseObjectRenamed("SolidMechanicsApp", TensorMechanicsPlasticOrthotropic, "01/01/2025 00:00", SolidMechanicsPlasticOrthotropic)
registerMooseObject("SolidMechanicsApp", SolidMechanicsPlasticOrthotropic)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
RankTwoTensorTempl< T > innerProductTranspose(const RankTwoTensorTempl< T > &) const
RankTwoTensorTempl< T > ddet() const
T generalSecondInvariant() 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
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 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.
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.
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}
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.
Orthotropic plasticity model from Yoon (2013) the name of the paper is "Asymmetric yield function bas...
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)
RankFourTensor _l1
Transformation tensor from the stress tensor to the deviatoric stress tensor for 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.
Real yieldFunction(const RankTwoTensor &stress, Real intnl) const override
Yield_function = a[b*I1 + (J2^{3/2} - c*J3)^{1/3}] - yield_strength.
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.
RankTwoTensor flowPotential(const RankTwoTensor &stress, Real intnl) const override
Receives the flag for associative or non-associative and calculates the flow potential accordingly.
const std::vector< Real > _c2
The six coefficients of L prime prime.