https://mooseframework.inl.gov
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 
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];
71  RankFourTensor Tp1;
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 
93  RankFourTensor Tp2;
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 
109 Real
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 
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 }
RankFourTensor computeDSDFhat(unsigned int nd)
Function to compute derivative of stress with respect to derived deformation gradient.
RankTwoTensor computeDinvFTDU(unsigned int component, unsigned int nd)
Function to compute derivative of deformation gradient inverse with respect to displacements.
const MaterialProperty< RankTwoTensor > & _ddgraddu
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
const MaterialProperty< RankFourTensor > & _Jacobian_mult
static const std::string component
Definition: NS.h:153
MechanicsFiniteStrainBaseNOSPD(const InputParameters &parameters)
void inverse(const std::vector< std::vector< Real >> &m, std::vector< std::vector< Real >> &m_inv)
const MaterialProperty< RankTwoTensor > & _dgrad_old
Material point based material property.
virtual RankTwoTensor computeDSDU(unsigned int component, unsigned int nd) override
Function to compute derivative of stress with respect to displacements for small strain problems...
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
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void addClassDescription(const std::string &doc_string)
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
const MaterialProperty< RankTwoTensor > & _ddgraddw
const MaterialProperty< RankTwoTensor > & _ddgraddv
static const std::string k
Definition: NS.h:130
const MaterialProperty< RankTwoTensor > & _R_inc
Base kernel class for bond-associated correspondence material models.
const MaterialProperty< RankTwoTensor > & _dgrad