www.mooseframework.org
FiniteStrainMechanicsNOSPD.C
Go to the documentation of this file.
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 
11 #include "PeridynamicsMesh.h"
12 
14 
15 template <>
16 InputParameters
18 {
19  InputParameters params = validParams<MechanicsBaseNOSPD>();
20  params.addClassDescription(
21  "Class for calculating residual and Jacobian for the Self-stabilized "
22  "Non-Ordinary State-based PeriDynamic (SNOSPD) formulation under finite "
23  "strain assumptions");
24 
25  params.addRequiredParam<unsigned int>(
26  "component",
27  "An integer corresponding to the variable this kernel acts on (0 for x, 1 for y, 2 for z)");
28 
29  return params;
30 }
31 
32 FiniteStrainMechanicsNOSPD::FiniteStrainMechanicsNOSPD(const InputParameters & parameters)
33  : MechanicsBaseNOSPD(parameters),
34  _dgrad_old(getMaterialPropertyOld<RankTwoTensor>("deformation_gradient")),
35  _E_inc(getMaterialProperty<RankTwoTensor>("strain_increment")),
36  _R_inc(getMaterialProperty<RankTwoTensor>("rotation_increment")),
37  _component(getParam<unsigned int>("component"))
38 {
39 }
40 
41 void
43 {
44  // For finite strain formulation, the _stress tensor gotten from material class is the
45  // Cauchy stress (Sigma). the first Piola-Kirchhoff stress (P) is then obtained as
46  // P = J * Sigma * inv(F)^T.
47  // Nodal force states are based on the first Piola-Kirchhoff stress tensors (P).
48  // i.e., T = (J * Sigma * inv(F)^T) * inv(Shape) * xi * multi.
49  // Cauchy stress is calculated as Sigma_n+1 = Sigma_n + R * (C * dt * D) * R^T
50 
51  std::vector<Real> nodal_force_comp(_nnodes);
52  for (unsigned int nd = 0; nd < _nnodes; ++nd)
53  nodal_force_comp[nd] = _multi[nd] *
54  ((_dgrad[nd].det() * _stress[nd] * _dgrad[nd].inverse().transpose()) *
55  _shape2[nd].inverse())
56  .row(_component) *
57  (nd == 0 ? 1 : -1) * _origin_vec_ij;
58 
59  _local_re(0) = -(nodal_force_comp[0] - nodal_force_comp[1]) * _bond_status_ij;
60  _local_re(1) = -_local_re(0);
61 }
62 
63 void
65 {
66  // excludes dTi/dUj and dTj/dUi contribution which was considered as nonlocal contribution
67  std::vector<RankTwoTensor> dPxdUx(_nnodes);
68  for (unsigned int nd = 0; nd < _nnodes; ++nd)
69  dPxdUx[nd] = computeDJDU(_component, nd) * _stress[nd] * _dgrad[nd].inverse().transpose() +
70  _dgrad[nd].det() * computeDSDU(_component, nd) * _dgrad[nd].inverse().transpose() +
71  _dgrad[nd].det() * _stress[nd] * computeDinvFTDU(_component, nd);
72 
73  for (_i = 0; _i < _test.size(); ++_i)
74  for (_j = 0; _j < _phi.size(); ++_j)
75  _local_ke(_i, _j) += (_i == 0 ? -1 : 1) * _multi[_j] *
76  (dPxdUx[_j] * _shape2[_j].inverse()).row(_component) * _origin_vec_ij *
77  _bond_status_ij;
78 }
79 
80 void
82 {
83  // includes dTi/dUj and dTj/dUi contributions
84  for (unsigned int cur_nd = 0; cur_nd < _nnodes; ++cur_nd)
85  {
86  RankFourTensor dSdFhat = computeDSDFhat(cur_nd);
87  RankTwoTensor invF = _dgrad[cur_nd].inverse();
88  Real detF = _dgrad[cur_nd].det();
89  // calculation of jacobian contribution to current_node's neighbors
90  std::vector<dof_id_type> dof(_nnodes);
91  dof[0] = _current_elem->node_ptr(cur_nd)->dof_number(_sys.number(), _var.number(), 0);
92  std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(cur_nd));
93  unsigned int nb =
94  std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - cur_nd)) -
95  neighbors.begin();
96  std::vector<dof_id_type> dg_neighbors =
97  _pdmesh.getDefGradNeighbors(_current_elem->node_id(cur_nd), nb);
98  std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(cur_nd));
99  for (unsigned int k = 0; k < dg_neighbors.size(); ++k)
100  {
101  Node * node_k = _pdmesh.nodePtr(neighbors[dg_neighbors[k]]);
102  dof[1] = node_k->dof_number(_sys.number(), _var.number(), 0);
103  Real vol_k = _pdmesh.getPDNodeVolume(neighbors[dg_neighbors[k]]);
104 
105  // obtain bond ik's origin vector
106  RealGradient origin_vec_ijk = *node_k - *_pdmesh.nodePtr(_current_elem->node_id(cur_nd));
107 
108  RankTwoTensor dFdUk;
109  dFdUk.zero();
110  for (unsigned int j = 0; j < _dim; ++j)
111  dFdUk(_component, j) =
112  _horiz_rad[cur_nd] / origin_vec_ijk.norm() * origin_vec_ijk(j) * vol_k;
113 
114  dFdUk *= _shape2[cur_nd].inverse();
115 
116  RankTwoTensor dPxdUkx;
117  // calculate dJ/du
118  Real dJdU = 0.0;
119  for (unsigned int i = 0; i < 3; ++i)
120  for (unsigned int J = 0; J < 3; ++J)
121  dJdU += detF * invF(J, i) * dFdUk(i, J);
122 
123  // calculate dS/du
124  RankTwoTensor dSdU = dSdFhat * dFdUk * _dgrad_old[cur_nd].inverse();
125 
126  // calculate dinv(F)Tdu
127  RankTwoTensor dinvFTdU;
128  dinvFTdU.zero();
129  for (unsigned int i = 0; i < 3; ++i)
130  for (unsigned int J = 0; J < 3; ++J)
131  for (unsigned int k = 0; k < 3; ++k)
132  for (unsigned int L = 0; L < 3; ++L)
133  dinvFTdU(i, J) += -invF(J, k) * invF(L, i) * dFdUk(k, L);
134 
135  // calculate the derivative of first Piola-Kirchhoff stress w.r.t displacements
136  dPxdUkx = dJdU * _stress[cur_nd] * invF.transpose() + detF * dSdU * invF.transpose() +
137  detF * _stress[cur_nd] * dinvFTdU;
138 
139  // bond status for bond k
140  Real bond_status_ijk =
141  _bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[k]]));
142 
143  _local_ke.resize(_test.size(), _phi.size());
144  _local_ke.zero();
145  for (_i = 0; _i < _test.size(); ++_i)
146  for (_j = 0; _j < _phi.size(); ++_j)
147  _local_ke(_i, _j) = (_i == 0 ? -1 : 1) * (_j == 0 ? 0 : 1) * _multi[cur_nd] *
148  (dPxdUkx * _shape2[cur_nd].inverse()).row(_component) *
149  _origin_vec_ij * _bond_status_ij * bond_status_ijk;
150 
151  _assembly.cacheJacobianBlock(_local_ke, _ivardofs_ij, dof, _var.scalingFactor());
152 
153  if (_has_diag_save_in)
154  {
155  unsigned int rows = _test.size();
156  DenseVector<Real> diag(rows);
157  for (unsigned int i = 0; i < rows; ++i)
158  diag(i) = _local_ke(i, i);
159 
160  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
161  for (unsigned int i = 0; i < _diag_save_in.size(); ++i)
162  _diag_save_in[i]->sys().solution().add_vector(diag, _diag_save_in[i]->dofIndices());
163  }
164  }
165  }
166 }
167 
168 void
170 {
171  _local_ke.zero();
172  if (coupled_component == 3)
173  {
174  std::vector<RankTwoTensor> dSdT(_nnodes);
175  for (unsigned int nd = 0; nd < _nnodes; ++nd)
176  for (unsigned int es = 0; es < _deigenstrain_dT.size(); ++es)
177  dSdT[nd] = -_dgrad[nd].det() * _Jacobian_mult[nd] * (*_deigenstrain_dT[es])[nd] *
178  _dgrad[nd].inverse().transpose();
179 
180  for (_i = 0; _i < _test.size(); ++_i)
181  for (_j = 0; _j < _phi.size(); ++_j)
182  _local_ke(_i, _j) += (_i == 0 ? -1 : 1) * _multi[_j] *
183  (dSdT[_j] * _shape2[_j].inverse()).row(_component) * _origin_vec_ij *
184  _bond_status_ij;
185  }
186  else
187  {
188  std::vector<RankTwoTensor> dPxdUy(_nnodes);
189  for (unsigned int nd = 0; nd < _nnodes; ++nd)
190  dPxdUy[nd] =
191  computeDJDU(coupled_component, nd) * _stress[nd] * _dgrad[nd].inverse().transpose() +
192  _dgrad[nd].det() * computeDSDU(coupled_component, nd) * _dgrad[nd].inverse().transpose() +
193  _dgrad[nd].det() * _stress[nd] * computeDinvFTDU(coupled_component, nd);
194 
195  for (_i = 0; _i < _test.size(); ++_i)
196  for (_j = 0; _j < _phi.size(); ++_j)
197  _local_ke(_i, _j) += (_i == 0 ? -1 : 1) * _multi[_j] *
198  (dPxdUy[_j] * _shape2[_j].inverse()).row(_component) * _origin_vec_ij *
199  _bond_status_ij;
200  }
201 }
202 
203 void
205  unsigned int coupled_component)
206 {
207  if (coupled_component != 3 && coupled_component != 4)
208  {
209  for (unsigned int cur_nd = 0; cur_nd < _nnodes; ++cur_nd)
210  {
211  RankFourTensor dSdFhat = computeDSDFhat(cur_nd);
212  RankTwoTensor invF = _dgrad[cur_nd].inverse();
213  Real detF = _dgrad[cur_nd].det();
214  // calculation of jacobian contribution to current_node's neighbors
215  std::vector<dof_id_type> jvardofs_ijk(_nnodes);
216  jvardofs_ijk[0] = _current_elem->node_ptr(cur_nd)->dof_number(_sys.number(), jvar_num, 0);
217  std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(cur_nd));
218  unsigned int nb =
219  std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - cur_nd)) -
220  neighbors.begin();
221  std::vector<dof_id_type> dg_neighbors =
222  _pdmesh.getDefGradNeighbors(_current_elem->node_id(cur_nd), nb);
223  std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(cur_nd));
224  for (unsigned int k = 0; k < dg_neighbors.size(); ++k)
225  {
226  Node * node_k = _pdmesh.nodePtr(neighbors[dg_neighbors[k]]);
227  jvardofs_ijk[1] = node_k->dof_number(_sys.number(), jvar_num, 0);
228  Real vol_k = _pdmesh.getPDNodeVolume(neighbors[dg_neighbors[k]]);
229 
230  // obtain bond k's origin vector
231  RealGradient origin_vec_ijk = *node_k - *_pdmesh.nodePtr(_current_elem->node_id(cur_nd));
232 
233  RankTwoTensor dFdUk;
234  dFdUk.zero();
235  for (unsigned int j = 0; j < _dim; ++j)
236  dFdUk(coupled_component, j) =
237  _horiz_rad[cur_nd] / origin_vec_ijk.norm() * origin_vec_ijk(j) * vol_k;
238 
239  dFdUk *= _shape2[cur_nd].inverse();
240 
241  RankTwoTensor dPxdUky;
242  // calculate dJ/du
243  Real dJdU = 0.0;
244  for (unsigned int i = 0; i < 3; ++i)
245  for (unsigned int J = 0; J < 3; ++J)
246  dJdU += detF * invF(J, i) * dFdUk(i, J);
247 
248  // calculate dS/du
249  RankTwoTensor dSdU = dSdFhat * dFdUk * _dgrad_old[cur_nd].inverse();
250 
251  // calculate dinv(F)Tdu
252  RankTwoTensor dinvFTdU;
253  dinvFTdU.zero();
254  for (unsigned int i = 0; i < 3; ++i)
255  for (unsigned int J = 0; J < 3; ++J)
256  for (unsigned int k = 0; k < 3; ++k)
257  for (unsigned int L = 0; L < 3; ++L)
258  dinvFTdU(i, J) += -invF(J, k) * invF(L, i) * dFdUk(k, L);
259 
260  // calculate the derivative of first Piola-Kirchhoff stress w.r.t displacements
261  dPxdUky = dJdU * _stress[cur_nd] * invF.transpose() + detF * dSdU * invF.transpose() +
262  detF * _stress[cur_nd] * dinvFTdU;
263 
264  // bond status for bond k
265  Real bond_status_ijk =
266  _bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[k]]));
267 
268  _local_ke.zero();
269  for (_i = 0; _i < _test.size(); ++_i)
270  for (_j = 0; _j < _phi.size(); ++_j)
271  _local_ke(_i, _j) = (_i == 0 ? -1 : 1) * (_j == 0 ? 0 : 1) * _multi[cur_nd] *
272  (dPxdUky * _shape2[cur_nd].inverse()).row(_component) *
273  _origin_vec_ij * _bond_status_ij * bond_status_ijk;
274 
275  _assembly.cacheJacobianBlock(_local_ke, _ivardofs_ij, jvardofs_ijk, _var.scalingFactor());
276  }
277  }
278  }
279 }
280 
283 {
284  // compute the derivative of stress w.r.t the solution components for finite strain
285  RankTwoTensor dSdU;
286 
287  // fetch the derivative of stress w.r.t the Fhat
288  RankFourTensor DSDFhat = computeDSDFhat(nd);
289 
290  // third calculate derivative of Fhat w.r.t solution components
291  RankTwoTensor Tp3;
292  if (component == 0)
293  Tp3 = _dgrad_old[nd].inverse() * _ddgraddu[nd];
294  else if (component == 1)
295  Tp3 = _dgrad_old[nd].inverse() * _ddgraddv[nd];
296  else if (component == 2)
297  Tp3 = _dgrad_old[nd].inverse() * _ddgraddw[nd];
298 
299  // assemble the fetched and calculated quantities to form the derivative of Cauchy stress w.r.t
300  // solution components
301  dSdU = DSDFhat * Tp3;
302 
303  return dSdU;
304 }
305 
308 {
309  // compute the derivative of stress w.r.t the Fhat for finite strain
310  RankTwoTensor I(RankTwoTensor::initIdentity);
311  RankFourTensor dSdFhat;
312  dSdFhat.zero();
313 
314  // first calculate the derivative of incremental Cauchy stress w.r.t the inverse of Fhat
315  // Reference: M. M. Rashid (1993), Incremental Kinematics for finite element applications, IJNME
316  RankTwoTensor S_inc = _Jacobian_mult[nd] * _E_inc[nd];
317  RankFourTensor Tp1;
318  Tp1.zero();
319  for (unsigned int i = 0; i < 3; ++i)
320  for (unsigned int j = 0; j < 3; ++j)
321  for (unsigned int k = 0; k < 3; ++k)
322  for (unsigned int l = 0; l < 3; ++l)
323  for (unsigned int m = 0; m < 3; ++m)
324  for (unsigned int n = 0; n < 3; ++n)
325  for (unsigned int r = 0; r < 3; ++r)
326  Tp1(i, j, k, l) +=
327  S_inc(m, n) *
328  (_R_inc[nd](j, n) * (0.5 * I(k, m) * I(i, l) - I(m, l) * _R_inc[nd](i, k) +
329  0.5 * _R_inc[nd](i, k) * _R_inc[nd](m, l)) +
330  _R_inc[nd](i, m) * (0.5 * I(k, n) * I(j, l) - I(n, l) * _R_inc[nd](j, k) +
331  0.5 * _R_inc[nd](j, k) * _R_inc[nd](n, l))) -
332  _R_inc[nd](l, m) * _R_inc[nd](i, n) * _R_inc[nd](j, r) *
333  _Jacobian_mult[nd](n, r, m, k);
334 
335  // second calculate derivative of inverse of Fhat w.r.t Fhat
336  // d(inv(Fhat)_kl)/dFhat_mn = - inv(Fhat)_km * inv(Fhat)_nl
337  // the bases are gk, gl, gm, gn, indictates the inverse rather than the inverse transpose
338 
339  RankFourTensor Tp2;
340  Tp2.zero();
341  RankTwoTensor invFhat = (_dgrad[nd] * _dgrad_old[nd].inverse()).inverse();
342  for (unsigned int k = 0; k < 3; ++k)
343  for (unsigned int l = 0; l < 3; ++l)
344  for (unsigned int m = 0; m < 3; ++m)
345  for (unsigned int n = 0; n < 3; ++n)
346  Tp2(k, l, m, n) += -invFhat(k, m) * invFhat(n, l);
347 
348  // assemble two calculated quantities to form the derivative of Cauchy stress w.r.t
349  // Fhat
350  dSdFhat = Tp1 * Tp2;
351 
352  return dSdFhat;
353 }
354 
355 Real
357 {
358  // for finite formulation, compute the derivative of determinant of deformation gradient w.r.t the
359  // solution components
360  // dJ / du = dJ / dF_iJ * dF_iJ / du = J * inv(F)_Ji * dF_iJ / du
361 
362  Real dJdU = 0.0;
363  RankTwoTensor invF = _dgrad[nd].inverse();
364  Real detF = _dgrad[nd].det();
365  for (unsigned int i = 0; i < 3; ++i)
366  for (unsigned int J = 0; J < 3; ++J)
367  {
368  if (component == 0)
369  dJdU += detF * invF(J, i) * _ddgraddu[nd](i, J);
370  else if (component == 1)
371  dJdU += detF * invF(J, i) * _ddgraddv[nd](i, J);
372  else if (component == 2)
373  dJdU += detF * invF(J, i) * _ddgraddw[nd](i, J);
374  }
375 
376  return dJdU;
377 }
378 
381 {
382  // for finite formulation, compute the derivative of transpose of inverse of deformation gradient
383  // w.r.t the solution components
384  // d(inv(F)_Ji)/du = d(inv(F)_Ji)/dF_kL * dF_kL/du = - inv(F)_Jk * inv(F)_Li * dF_kL/du
385  // the bases are gi, GJ, gk, GL, indictates the inverse transpose rather than the inverse
386 
387  // RankTwoTensor dinvFTdU;
388  // dinvFTdU.zero();
389  // RankTwoTensor invF = _dgrad[nd].inverse();
390  // for (unsigned int i = 0; i < 3; ++i)
391  // for (unsigned int J = 0; J < 3; ++J)
392  // for (unsigned int k = 0; k < 3; ++k)
393  // for (unsigned int L = 0; L < 3; ++L)
394  // {
395  // if (component == 0)
396  // dinvFTdU(i, J) += -invF(J, k) * invF(L, i) * _ddgraddu[nd](k, L);
397  // else if (component == 1)
398  // dinvFTdU(i, J) += -invF(J, k) * invF(L, i) * _ddgraddv[nd](k, L);
399  // else if (component == 2)
400  // dinvFTdU(i, J) += -invF(J, k) * invF(L, i) * _ddgraddw[nd](k, L);
401  // }
402 
403  RankTwoTensor dinvFTdU;
404  dinvFTdU.zero();
405  RankTwoTensor invF = _dgrad[nd].inverse();
406  if (component == 0)
407  {
408  dinvFTdU(0, 1) =
409  _ddgraddu[nd](0, 2) * _dgrad[nd](2, 1) - _ddgraddu[nd](0, 1) * _dgrad[nd](2, 2);
410  dinvFTdU(0, 2) =
411  _ddgraddu[nd](0, 1) * _dgrad[nd](1, 2) - _ddgraddu[nd](0, 2) * _dgrad[nd](1, 1);
412  dinvFTdU(1, 1) =
413  _ddgraddu[nd](0, 0) * _dgrad[nd](2, 2) - _ddgraddu[nd](0, 2) * _dgrad[nd](2, 0);
414  dinvFTdU(1, 2) =
415  _ddgraddu[nd](0, 2) * _dgrad[nd](1, 0) - _ddgraddu[nd](0, 0) * _dgrad[nd](1, 2);
416  dinvFTdU(2, 1) =
417  _ddgraddu[nd](0, 1) * _dgrad[nd](2, 0) - _ddgraddu[nd](0, 0) * _dgrad[nd](2, 1);
418  dinvFTdU(2, 2) =
419  _ddgraddu[nd](0, 0) * _dgrad[nd](1, 1) - _ddgraddu[nd](0, 1) * _dgrad[nd](1, 0);
420  }
421  else if (component == 1)
422  {
423  dinvFTdU(0, 0) =
424  _ddgraddv[nd](1, 1) * _dgrad[nd](2, 2) - _ddgraddv[nd](1, 2) * _dgrad[nd](2, 1);
425  dinvFTdU(0, 2) =
426  _ddgraddv[nd](1, 2) * _dgrad[nd](0, 1) - _ddgraddv[nd](0, 2) * _dgrad[nd](1, 1);
427  dinvFTdU(1, 0) =
428  _ddgraddv[nd](1, 2) * _dgrad[nd](2, 0) - _ddgraddv[nd](1, 0) * _dgrad[nd](2, 2);
429  dinvFTdU(1, 2) =
430  _ddgraddv[nd](1, 0) * _dgrad[nd](0, 2) - _ddgraddv[nd](1, 2) * _dgrad[nd](0, 0);
431  dinvFTdU(2, 0) =
432  _ddgraddv[nd](1, 0) * _dgrad[nd](2, 1) - _ddgraddv[nd](1, 1) * _dgrad[nd](2, 0);
433  dinvFTdU(2, 2) =
434  _ddgraddv[nd](1, 1) * _dgrad[nd](0, 0) - _ddgraddv[nd](1, 0) * _dgrad[nd](0, 1);
435  }
436  else if (component == 2)
437  {
438  dinvFTdU(0, 0) =
439  _ddgraddw[nd](2, 2) * _dgrad[nd](1, 1) - _ddgraddw[nd](2, 1) * _dgrad[nd](1, 2);
440  dinvFTdU(0, 1) =
441  _ddgraddw[nd](2, 1) * _dgrad[nd](0, 2) - _ddgraddw[nd](2, 2) * _dgrad[nd](0, 1);
442  dinvFTdU(1, 0) =
443  _ddgraddw[nd](2, 0) * _dgrad[nd](1, 2) - _ddgraddw[nd](2, 2) * _dgrad[nd](1, 0);
444  dinvFTdU(1, 1) =
445  _ddgraddw[nd](2, 2) * _dgrad[nd](0, 0) - _ddgraddw[nd](2, 0) * _dgrad[nd](0, 2);
446  dinvFTdU(2, 0) =
447  _ddgraddw[nd](2, 1) * _dgrad[nd](1, 0) - _ddgraddw[nd](2, 0) * _dgrad[nd](1, 1);
448  dinvFTdU(2, 1) =
449  _ddgraddw[nd](2, 0) * _dgrad[nd](0, 1) - _ddgraddw[nd](2, 1) * _dgrad[nd](0, 0);
450  }
451  dinvFTdU /= _dgrad[nd].det();
452  for (unsigned int i = 0; i < 3; ++i)
453  for (unsigned int J = 0; J < 3; ++J)
454  for (unsigned int k = 0; k < 3; ++k)
455  for (unsigned int L = 0; L < 3; ++L)
456  {
457  if (component == 0)
458  dinvFTdU(i, J) -= invF(i, J) * invF(L, k) * _ddgraddu[nd](k, L);
459  else if (component == 1)
460  dinvFTdU(i, J) -= invF(i, J) * invF(L, k) * _ddgraddv[nd](k, L);
461  else if (component == 2)
462  dinvFTdU(i, J) -= invF(i, J) * invF(L, k) * _ddgraddw[nd](k, L);
463  }
464 
465  return dinvFTdU;
466 }
FiniteStrainMechanicsNOSPD::computeDJDU
Real computeDJDU(unsigned int component, unsigned int nd)
Function to compute derivative of determinant of deformation gradient with respect to displacements.
Definition: FiniteStrainMechanicsNOSPD.C:356
MechanicsBaseNOSPD
Base kernel class for bond-associated correspondence material models.
Definition: MechanicsBaseNOSPD.h:22
FiniteStrainMechanicsNOSPD::_E_inc
const MaterialProperty< RankTwoTensor > & _E_inc
Definition: FiniteStrainMechanicsNOSPD.h:64
MechanicsBaseNOSPD::_dgrad
const MaterialProperty< RankTwoTensor > & _dgrad
Definition: MechanicsBaseNOSPD.h:40
MechanicsBaseNOSPD::_shape2
const MaterialProperty< RankTwoTensor > & _shape2
Definition: MechanicsBaseNOSPD.h:39
libMesh::RealGradient
VectorValue< Real > RealGradient
Definition: GrainForceAndTorqueInterface.h:17
registerMooseObject
registerMooseObject("PeridynamicsApp", FiniteStrainMechanicsNOSPD)
MechanicsBaseNOSPD::_multi
const MaterialProperty< Real > & _multi
Material point based material properties.
Definition: MechanicsBaseNOSPD.h:37
MechanicsBaseNOSPD::_Jacobian_mult
const MaterialProperty< RankFourTensor > & _Jacobian_mult
Definition: MechanicsBaseNOSPD.h:44
MechanicsBaseNOSPD::_stress
const MaterialProperty< RankTwoTensor > & _stress
Definition: MechanicsBaseNOSPD.h:38
MechanicsBaseNOSPD::_ddgraddw
const MaterialProperty< RankTwoTensor > & _ddgraddw
Definition: MechanicsBaseNOSPD.h:43
MechanicsBaseNOSPD::_ddgraddu
const MaterialProperty< RankTwoTensor > & _ddgraddu
Definition: MechanicsBaseNOSPD.h:41
FiniteStrainMechanicsNOSPD.h
FiniteStrainMechanicsNOSPD::computeLocalResidual
virtual void computeLocalResidual() override
Definition: FiniteStrainMechanicsNOSPD.C:42
MechanicsBaseNOSPD::_ddgraddv
const MaterialProperty< RankTwoTensor > & _ddgraddv
Definition: MechanicsBaseNOSPD.h:42
FiniteStrainMechanicsNOSPD::computeDSDFhat
RankFourTensor computeDSDFhat(unsigned int nd)
Function to compute derivative of stress with respect to derived deformation gradient.
Definition: FiniteStrainMechanicsNOSPD.C:307
PeridynamicsMesh.h
FiniteStrainMechanicsNOSPD::computeLocalOffDiagJacobian
virtual void computeLocalOffDiagJacobian(unsigned int coupled_component) override
Function to compute local contribution to the off-diagonal Jacobian at the current nodes.
Definition: FiniteStrainMechanicsNOSPD.C:169
FiniteStrainMechanicsNOSPD::computePDNonlocalOffDiagJacobian
virtual void computePDNonlocalOffDiagJacobian(unsigned int jvar_num, unsigned int coupled_component) override
Function to compute nonlocal contribution to the off-diagonal Jacobian at the current nodes.
Definition: FiniteStrainMechanicsNOSPD.C:204
validParams< FiniteStrainMechanicsNOSPD >
InputParameters validParams< FiniteStrainMechanicsNOSPD >()
Definition: FiniteStrainMechanicsNOSPD.C:17
MechanicsBasePD::_ivardofs_ij
std::vector< dof_id_type > _ivardofs_ij
Current variable dof numbers for nodes i and j.
Definition: MechanicsBasePD.h:69
FiniteStrainMechanicsNOSPD::computeNonlocalJacobian
virtual void computeNonlocalJacobian() override
Definition: FiniteStrainMechanicsNOSPD.C:81
FiniteStrainMechanicsNOSPD::_component
const unsigned int _component
The index of displacement component.
Definition: FiniteStrainMechanicsNOSPD.h:69
MaterialTensorCalculatorTools::component
Real component(const SymmTensor &symm_tensor, unsigned int index)
Definition: MaterialTensorCalculatorTools.C:16
FiniteStrainMechanicsNOSPD::FiniteStrainMechanicsNOSPD
FiniteStrainMechanicsNOSPD(const InputParameters &parameters)
Definition: FiniteStrainMechanicsNOSPD.C:32
validParams< MechanicsBaseNOSPD >
InputParameters validParams< MechanicsBaseNOSPD >()
Definition: MechanicsBaseNOSPD.C:16
RankFourTensorTempl< Real >
FiniteStrainMechanicsNOSPD::computeLocalJacobian
virtual void computeLocalJacobian() override
Definition: FiniteStrainMechanicsNOSPD.C:64
FiniteStrainMechanicsNOSPD::computeDSDU
virtual RankTwoTensor computeDSDU(unsigned int component, unsigned int nd) override
Function to compute derivative of stress with respect to displacements.
Definition: FiniteStrainMechanicsNOSPD.C:282
RankTwoTensorTempl< Real >
FiniteStrainMechanicsNOSPD::_dgrad_old
const MaterialProperty< RankTwoTensor > & _dgrad_old
Material point based material property.
Definition: FiniteStrainMechanicsNOSPD.h:63
FiniteStrainMechanicsNOSPD::computeDinvFTDU
RankTwoTensor computeDinvFTDU(unsigned int component, unsigned int nd)
Function to compute derivative of deformation gradient inverse with respect to displacements.
Definition: FiniteStrainMechanicsNOSPD.C:380
MechanicsBaseNOSPD::_deigenstrain_dT
std::vector< const MaterialProperty< RankTwoTensor > * > _deigenstrain_dT
Definition: MechanicsBaseNOSPD.h:46
FiniteStrainMechanicsNOSPD
Kernel class for bond-associated correspondence material model for finite strain.
Definition: FiniteStrainMechanicsNOSPD.h:22
FiniteStrainMechanicsNOSPD::_R_inc
const MaterialProperty< RankTwoTensor > & _R_inc
Definition: FiniteStrainMechanicsNOSPD.h:65