Line data Source code
1 : //* This file is part of the MOOSE framework
2 : //* https://www.mooseframework.org
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 :
10 : #include "TensorMechanicsPlasticOrthotropic.h"
11 : #include "RankFourTensor.h"
12 : #include "libmesh/utility.h"
13 :
14 : registerMooseObject("TensorMechanicsApp", TensorMechanicsPlasticOrthotropic);
15 :
16 : InputParameters
17 12 : TensorMechanicsPlasticOrthotropic::validParams()
18 : {
19 12 : InputParameters params = TensorMechanicsPlasticIsotropicSD::validParams();
20 24 : params.addRequiredParam<std::vector<Real>>("c1", "The six coefficients of L prime");
21 24 : params.addRequiredParam<std::vector<Real>>("c2", "The six coefficients of L prime prime");
22 12 : params.addClassDescription("Orthotropic plasticity for pressure sensitive materials and also "
23 : "models the strength differential effect");
24 12 : return params;
25 0 : }
26 :
27 6 : TensorMechanicsPlasticOrthotropic::TensorMechanicsPlasticOrthotropic(
28 6 : const InputParameters & parameters)
29 : : TensorMechanicsPlasticIsotropicSD(parameters),
30 6 : _c1(getParam<std::vector<Real>>("c1")),
31 24 : _c2(getParam<std::vector<Real>>("c2"))
32 : {
33 6 : _c = 1.0;
34 6 : _l1(0, 0, 0, 0) = (_c1[1] + _c1[2]) / 3.0;
35 6 : _l1(0, 0, 1, 1) = -_c1[2] / 3.0;
36 6 : _l1(0, 0, 2, 2) = -_c1[1] / 3.0;
37 6 : _l1(1, 1, 0, 0) = -_c1[2] / 3.0;
38 6 : _l1(1, 1, 1, 1) = (_c1[0] + _c1[2]) / 3.0;
39 6 : _l1(1, 1, 2, 2) = -_c1[0] / 3.0;
40 6 : _l1(2, 2, 0, 0) = -_c1[1] / 3.0;
41 6 : _l1(2, 2, 1, 1) = -_c1[0] / 3.0;
42 6 : _l1(2, 2, 2, 2) = (_c1[0] + _c1[1]) / 3.0;
43 6 : _l1(0, 1, 1, 0) = _c1[5] / 2.0;
44 6 : _l1(0, 1, 0, 1) = _c1[5] / 2.0;
45 6 : _l1(1, 0, 1, 0) = _c1[5] / 2.0;
46 6 : _l1(1, 0, 0, 1) = _c1[5] / 2.0;
47 6 : _l1(0, 2, 0, 2) = _c1[4] / 2.0;
48 6 : _l1(0, 2, 2, 0) = _c1[4] / 2.0;
49 6 : _l1(2, 0, 2, 0) = _c1[4] / 2.0;
50 6 : _l1(2, 0, 0, 2) = _c1[4] / 2.0;
51 6 : _l1(1, 2, 2, 1) = _c1[3] / 2.0;
52 6 : _l1(1, 2, 1, 2) = _c1[3] / 2.0;
53 6 : _l1(2, 1, 1, 2) = _c1[3] / 2.0;
54 6 : _l1(2, 1, 2, 1) = _c1[3] / 2.0;
55 :
56 6 : _l2(0, 0, 0, 0) = (_c2[1] + _c2[2]) / 3.0;
57 6 : _l2(0, 0, 1, 1) = -_c2[2] / 3.0;
58 6 : _l2(0, 0, 2, 2) = -_c2[1] / 3.0;
59 6 : _l2(1, 1, 0, 0) = -_c2[2] / 3.0;
60 6 : _l2(1, 1, 1, 1) = (_c2[0] + _c2[2]) / 3.0;
61 6 : _l2(1, 1, 2, 2) = -_c2[0] / 3.0;
62 6 : _l2(2, 2, 0, 0) = -_c2[1] / 3.0;
63 6 : _l2(2, 2, 1, 1) = -_c2[0] / 3.0;
64 6 : _l2(2, 2, 2, 2) = (_c2[0] + _c2[1]) / 3.0;
65 6 : _l2(0, 1, 1, 0) = _c2[5] / 2.0;
66 6 : _l2(0, 1, 0, 1) = _c2[5] / 2.0;
67 6 : _l2(1, 0, 1, 0) = _c2[5] / 2.0;
68 6 : _l2(1, 0, 0, 1) = _c2[5] / 2.0;
69 6 : _l2(0, 2, 0, 2) = _c2[4] / 2.0;
70 6 : _l2(0, 2, 2, 0) = _c2[4] / 2.0;
71 6 : _l2(2, 0, 2, 0) = _c2[4] / 2.0;
72 6 : _l2(2, 0, 0, 2) = _c2[4] / 2.0;
73 6 : _l2(1, 2, 2, 1) = _c2[3] / 2.0;
74 6 : _l2(1, 2, 1, 2) = _c2[3] / 2.0;
75 6 : _l2(2, 1, 1, 2) = _c2[3] / 2.0;
76 6 : _l2(2, 1, 2, 1) = _c2[3] / 2.0;
77 6 : }
78 :
79 : Real
80 4480 : TensorMechanicsPlasticOrthotropic::yieldFunction(const RankTwoTensor & stress, Real intnl) const
81 : {
82 4480 : const RankTwoTensor j2prime = _l1 * stress;
83 4480 : const RankTwoTensor j3prime = _l2 * stress;
84 4480 : return _b * stress.trace() +
85 4480 : std::pow(std::pow(-j2prime.generalSecondInvariant(), 3.0 / 2.0) - j3prime.det(),
86 : 1.0 / 3.0) -
87 4480 : yieldStrength(intnl);
88 : }
89 :
90 : RankTwoTensor
91 3456 : TensorMechanicsPlasticOrthotropic::dyieldFunction_dstress(const RankTwoTensor & stress,
92 : Real /*intnl*/) const
93 : {
94 3456 : const RankTwoTensor j2prime = _l1 * stress;
95 3456 : const RankTwoTensor j3prime = _l2 * stress;
96 3456 : const Real j2 = -j2prime.generalSecondInvariant();
97 3456 : const Real j3 = j3prime.det();
98 3456 : return _b * dI_sigma() + dphi_dj2(j2, j3) * _l1.innerProductTranspose(dj2_dSkl(j2prime)) +
99 3456 : dphi_dj3(j2, j3) * _l2.innerProductTranspose(j3prime.ddet());
100 : }
101 :
102 : RankFourTensor
103 864 : TensorMechanicsPlasticOrthotropic::dflowPotential_dstress(const RankTwoTensor & stress,
104 : Real /*intnl*/) const
105 : {
106 864 : if (_associative)
107 : {
108 864 : const RankTwoTensor j2prime = _l1 * stress;
109 864 : const RankTwoTensor j3prime = _l2 * stress;
110 864 : const RankTwoTensor dj2 = dj2_dSkl(j2prime);
111 864 : const RankTwoTensor dj3 = j3prime.ddet();
112 864 : const Real j2 = -j2prime.generalSecondInvariant();
113 864 : const Real j3 = j3prime.det();
114 : const RankFourTensor dr =
115 864 : dfj2_dj2(j2, j3) *
116 864 : _l1.innerProductTranspose(dj2).outerProduct(_l1.innerProductTranspose(dj2)) +
117 864 : dfj2_dj3(j2, j3) *
118 1728 : _l1.innerProductTranspose(dj2).outerProduct(_l2.innerProductTranspose(dj3)) +
119 864 : dfj3_dj2(j2, j3) *
120 1728 : _l2.innerProductTranspose(dj3).outerProduct(_l1.innerProductTranspose(dj2)) +
121 864 : dfj3_dj3(j2, j3) *
122 1728 : _l2.innerProductTranspose(dj3).outerProduct(_l2.innerProductTranspose(dj3));
123 864 : const RankTwoTensor r = _b * dI_sigma() +
124 864 : dphi_dj2(j2, j3) * _l1.innerProductTranspose(dj2_dSkl(j2prime)) +
125 864 : dphi_dj3(j2, j3) * _l2.innerProductTranspose(j3prime.ddet());
126 864 : const Real norm = r.L2norm();
127 1728 : return dr / norm - (r / Utility::pow<3>(norm)).outerProduct(dr.innerProductTranspose(r));
128 : }
129 : else
130 0 : return TensorMechanicsPlasticJ2::dflowPotential_dstress(stress, 0);
131 : }
132 :
133 : RankTwoTensor
134 2592 : TensorMechanicsPlasticOrthotropic::flowPotential(const RankTwoTensor & stress, Real intnl) const
135 : {
136 2592 : if (_associative)
137 : {
138 2592 : const RankTwoTensor a = dyieldFunction_dstress(stress, intnl);
139 2592 : return a / a.L2norm();
140 : }
141 : else
142 0 : return TensorMechanicsPlasticJ2::dyieldFunction_dstress(stress, intnl);
143 : }
|