https://mooseframework.inl.gov
Loading...
Searching...
No Matches
MechanicsFiniteStrainBaseNOSPD.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
14{
16 params.addClassDescription("Base class for kernels of the stabilized non-ordinary "
17 "state-based peridynamic correspondence models");
18
19 params.addParam<std::vector<MaterialPropertyName>>(
20 "eigenstrain_names",
21 {},
22 "List of eigenstrains to be coupled in non-ordinary state-based mechanics kernels");
23
24 return params;
25}
26
28 : MechanicsBaseNOSPD(parameters),
29 _dgrad_old(getMaterialPropertyOld<RankTwoTensor>("deformation_gradient")),
30 _E_inc(getMaterialProperty<RankTwoTensor>("strain_increment")),
31 _R_inc(getMaterialProperty<RankTwoTensor>("rotation_increment"))
32{
33}
34
36MechanicsFiniteStrainBaseNOSPD::computeDSDU(unsigned int component, unsigned int nd)
37{
38 // compute the derivative of stress w.r.t the solution components for finite strain
39 RankTwoTensor dSdU;
40
41 // fetch the derivative of stress w.r.t the Fhat
42 RankFourTensor DSDFhat = computeDSDFhat(nd);
43
44 // third calculate derivative of Fhat w.r.t solution components
45 RankTwoTensor Tp3;
46 if (component == 0)
47 Tp3 = _dgrad_old[nd].inverse() * _ddgraddu[nd];
48 else if (component == 1)
49 Tp3 = _dgrad_old[nd].inverse() * _ddgraddv[nd];
50 else if (component == 2)
51 Tp3 = _dgrad_old[nd].inverse() * _ddgraddw[nd];
52
53 // assemble the fetched and calculated quantities to form the derivative of Cauchy stress w.r.t
54 // solution components
55 dSdU = DSDFhat * Tp3;
56
57 return dSdU;
58}
59
62{
63 // compute the derivative of stress w.r.t the Fhat for finite strain
65 RankFourTensor dSdFhat;
66 dSdFhat.zero();
67
68 // first calculate the derivative of incremental Cauchy stress w.r.t the inverse of Fhat
69 // Reference: M. M. Rashid (1993), Incremental Kinematics for finite element applications, IJNME
70 RankTwoTensor S_inc = _Jacobian_mult[nd] * _E_inc[nd];
72 Tp1.zero();
73 for (unsigned int i = 0; i < 3; ++i)
74 for (unsigned int j = 0; j < 3; ++j)
75 for (unsigned int k = 0; k < 3; ++k)
76 for (unsigned int l = 0; l < 3; ++l)
77 for (unsigned int m = 0; m < 3; ++m)
78 for (unsigned int n = 0; n < 3; ++n)
79 for (unsigned int r = 0; r < 3; ++r)
80 Tp1(i, j, k, l) +=
81 S_inc(m, n) *
82 (_R_inc[nd](j, n) * (0.5 * I(k, m) * I(i, l) - I(m, l) * _R_inc[nd](i, k) +
83 0.5 * _R_inc[nd](i, k) * _R_inc[nd](m, l)) +
84 _R_inc[nd](i, m) * (0.5 * I(k, n) * I(j, l) - I(n, l) * _R_inc[nd](j, k) +
85 0.5 * _R_inc[nd](j, k) * _R_inc[nd](n, l))) -
86 _R_inc[nd](l, m) * _R_inc[nd](i, n) * _R_inc[nd](j, r) *
87 _Jacobian_mult[nd](n, r, m, k);
88
89 // second calculate derivative of inverse of Fhat w.r.t Fhat
90 // d(inv(Fhat)_kl)/dFhat_mn = - inv(Fhat)_km * inv(Fhat)_nl
91 // the bases are gk, gl, gm, gn, indictates the inverse rather than the inverse transpose
92
94 Tp2.zero();
95 RankTwoTensor invFhat = (_dgrad[nd] * _dgrad_old[nd].inverse()).inverse();
96 for (unsigned int k = 0; k < 3; ++k)
97 for (unsigned int l = 0; l < 3; ++l)
98 for (unsigned int m = 0; m < 3; ++m)
99 for (unsigned int n = 0; n < 3; ++n)
100 Tp2(k, l, m, n) += -invFhat(k, m) * invFhat(n, l);
101
102 // assemble two calculated quantities to form the derivative of Cauchy stress w.r.t
103 // Fhat
104 dSdFhat = Tp1 * Tp2;
105
106 return dSdFhat;
107}
108
109Real
110MechanicsFiniteStrainBaseNOSPD::computeDJDU(unsigned int component, unsigned int nd)
111{
112 // for finite formulation, compute the derivative of determinant of deformation gradient w.r.t the
113 // solution components
114 // dJ / du = dJ / dF_ij * dF_ij / du = J * inv(F)_ji * dF_ij / du
115
116 Real dJdU = 0.0;
117 RankTwoTensor invF = _dgrad[nd].inverse();
118 Real detF = _dgrad[nd].det();
119 for (unsigned int i = 0; i < 3; ++i)
120 for (unsigned int j = 0; j < 3; ++j)
121 {
122 if (component == 0)
123 dJdU += detF * invF(j, i) * _ddgraddu[nd](i, j);
124 else if (component == 1)
125 dJdU += detF * invF(j, i) * _ddgraddv[nd](i, j);
126 else if (component == 2)
127 dJdU += detF * invF(j, i) * _ddgraddw[nd](i, j);
128 }
129
130 return dJdU;
131}
132
134MechanicsFiniteStrainBaseNOSPD::computeDinvFTDU(unsigned int component, unsigned int nd)
135{
136 // for finite formulation, compute the derivative of transpose of inverse of deformation gradient
137 // w.r.t the solution components
138 // d(inv(F)_ji)/du = d(inv(F)_ji)/dF_kl * dF_kl/du = - inv(F)_jk * inv(F)_li * dF_kl/du
139 // the bases are gi, gj, gk, gl, indictates the inverse transpose rather than the inverse
140
141 RankTwoTensor dinvFTdU;
142 dinvFTdU.zero();
143 RankTwoTensor invF = _dgrad[nd].inverse();
144 if (component == 0)
145 {
146 dinvFTdU(0, 1) =
147 _ddgraddu[nd](0, 2) * _dgrad[nd](2, 1) - _ddgraddu[nd](0, 1) * _dgrad[nd](2, 2);
148 dinvFTdU(0, 2) =
149 _ddgraddu[nd](0, 1) * _dgrad[nd](1, 2) - _ddgraddu[nd](0, 2) * _dgrad[nd](1, 1);
150 dinvFTdU(1, 1) =
151 _ddgraddu[nd](0, 0) * _dgrad[nd](2, 2) - _ddgraddu[nd](0, 2) * _dgrad[nd](2, 0);
152 dinvFTdU(1, 2) =
153 _ddgraddu[nd](0, 2) * _dgrad[nd](1, 0) - _ddgraddu[nd](0, 0) * _dgrad[nd](1, 2);
154 dinvFTdU(2, 1) =
155 _ddgraddu[nd](0, 1) * _dgrad[nd](2, 0) - _ddgraddu[nd](0, 0) * _dgrad[nd](2, 1);
156 dinvFTdU(2, 2) =
157 _ddgraddu[nd](0, 0) * _dgrad[nd](1, 1) - _ddgraddu[nd](0, 1) * _dgrad[nd](1, 0);
158 }
159 else if (component == 1)
160 {
161 dinvFTdU(0, 0) =
162 _ddgraddv[nd](1, 1) * _dgrad[nd](2, 2) - _ddgraddv[nd](1, 2) * _dgrad[nd](2, 1);
163 dinvFTdU(0, 2) =
164 _ddgraddv[nd](1, 2) * _dgrad[nd](0, 1) - _ddgraddv[nd](0, 2) * _dgrad[nd](1, 1);
165 dinvFTdU(1, 0) =
166 _ddgraddv[nd](1, 2) * _dgrad[nd](2, 0) - _ddgraddv[nd](1, 0) * _dgrad[nd](2, 2);
167 dinvFTdU(1, 2) =
168 _ddgraddv[nd](1, 0) * _dgrad[nd](0, 2) - _ddgraddv[nd](1, 2) * _dgrad[nd](0, 0);
169 dinvFTdU(2, 0) =
170 _ddgraddv[nd](1, 0) * _dgrad[nd](2, 1) - _ddgraddv[nd](1, 1) * _dgrad[nd](2, 0);
171 dinvFTdU(2, 2) =
172 _ddgraddv[nd](1, 1) * _dgrad[nd](0, 0) - _ddgraddv[nd](1, 0) * _dgrad[nd](0, 1);
173 }
174 else if (component == 2)
175 {
176 dinvFTdU(0, 0) =
177 _ddgraddw[nd](2, 2) * _dgrad[nd](1, 1) - _ddgraddw[nd](2, 1) * _dgrad[nd](1, 2);
178 dinvFTdU(0, 1) =
179 _ddgraddw[nd](2, 1) * _dgrad[nd](0, 2) - _ddgraddw[nd](2, 2) * _dgrad[nd](0, 1);
180 dinvFTdU(1, 0) =
181 _ddgraddw[nd](2, 0) * _dgrad[nd](1, 2) - _ddgraddw[nd](2, 2) * _dgrad[nd](1, 0);
182 dinvFTdU(1, 1) =
183 _ddgraddw[nd](2, 2) * _dgrad[nd](0, 0) - _ddgraddw[nd](2, 0) * _dgrad[nd](0, 2);
184 dinvFTdU(2, 0) =
185 _ddgraddw[nd](2, 1) * _dgrad[nd](1, 0) - _ddgraddw[nd](2, 0) * _dgrad[nd](1, 1);
186 dinvFTdU(2, 1) =
187 _ddgraddw[nd](2, 0) * _dgrad[nd](0, 1) - _ddgraddw[nd](2, 1) * _dgrad[nd](0, 0);
188 }
189
190 dinvFTdU /= _dgrad[nd].det();
191 for (unsigned int i = 0; i < 3; ++i)
192 for (unsigned int j = 0; j < 3; ++j)
193 for (unsigned int k = 0; k < 3; ++k)
194 for (unsigned int l = 0; l < 3; ++l)
195 {
196 if (component == 0)
197 dinvFTdU(i, j) -= invF(i, j) * invF(l, k) * _ddgraddu[nd](k, l);
198 else if (component == 1)
199 dinvFTdU(i, j) -= invF(i, j) * invF(l, k) * _ddgraddv[nd](k, l);
200 else if (component == 2)
201 dinvFTdU(i, j) -= invF(i, j) * invF(l, k) * _ddgraddw[nd](k, l);
202 }
203
204 return dinvFTdU;
205}
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
Base kernel class for bond-associated correspondence material models.
const MaterialProperty< RankTwoTensor > & _ddgraddu
const MaterialProperty< RankTwoTensor > & _ddgraddw
const MaterialProperty< RankFourTensor > & _Jacobian_mult
const MaterialProperty< RankTwoTensor > & _dgrad
const MaterialProperty< RankTwoTensor > & _ddgraddv
static InputParameters validParams()
Real computeDJDU(unsigned int component, unsigned int nd)
Function to compute derivative of determinant of deformation gradient with respect to displacements.
const MaterialProperty< RankTwoTensor > & _E_inc
RankTwoTensor computeDinvFTDU(unsigned int component, unsigned int nd)
Function to compute derivative of deformation gradient inverse with respect to displacements.
MechanicsFiniteStrainBaseNOSPD(const InputParameters &parameters)
RankFourTensor computeDSDFhat(unsigned int nd)
Function to compute derivative of stress with respect to derived deformation gradient.
virtual RankTwoTensor computeDSDU(unsigned int component, unsigned int nd) override
Function to compute derivative of stress with respect to displacements for small strain problems.
const MaterialProperty< RankTwoTensor > & _dgrad_old
Material point based material property.
const MaterialProperty< RankTwoTensor > & _R_inc
RankTwoTensorTempl< T > inverse() const