www.mooseframework.org
Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
FiniteStrainMechanicsNOSPD Class Reference

Kernel class for bond-associated correspondence material model for finite strain. More...

#include <FiniteStrainMechanicsNOSPD.h>

Inheritance diagram for FiniteStrainMechanicsNOSPD:
[legend]

Public Member Functions

 FiniteStrainMechanicsNOSPD (const InputParameters &parameters)
 
virtual void computeOffDiagJacobian (MooseVariableFEBase &jvar) override
 
virtual void initialSetup () override
 
virtual void prepare () override
 

Protected Member Functions

virtual void computeLocalResidual () override
 
virtual void computeLocalJacobian () override
 
virtual void computeNonlocalJacobian () override
 
virtual void computeLocalOffDiagJacobian (unsigned int coupled_component) override
 Function to compute local contribution to the off-diagonal Jacobian at the current nodes. More...
 
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. More...
 
virtual RankTwoTensor computeDSDU (unsigned int component, unsigned int nd) override
 Function to compute derivative of stress with respect to displacements. More...
 
RankFourTensor computeDSDFhat (unsigned int nd)
 Function to compute derivative of stress with respect to derived deformation gradient. More...
 
Real computeDJDU (unsigned int component, unsigned int nd)
 Function to compute derivative of determinant of deformation gradient with respect to displacements. More...
 
RankTwoTensor computeDinvFTDU (unsigned int component, unsigned int nd)
 Function to compute derivative of deformation gradient inverse with respect to displacements. More...
 

Protected Attributes

const unsigned int _component
 The index of displacement component. More...
 
std::vector< MooseVariable * > _disp_var
 displacement variables More...
 
unsigned int _ndisp
 number of displacement components More...
 
const std::vector< RealGradient > * _orientation
 Vector of bond in current configuration. More...
 
std::vector< dof_id_type > _ivardofs_ij
 Current variable dof numbers for nodes i and j. More...
 
RealGradient _cur_ori_ij
 Vector of bond in current configuration. More...
 
Real _cur_len_ij
 Current bond length. More...
 
const MaterialProperty< RankTwoTensor > & _dgrad_old
 Material point based material property. More...
 
const MaterialProperty< RankTwoTensor > & _E_inc
 
const MaterialProperty< RankTwoTensor > & _R_inc
 
const MaterialProperty< Real > & _multi
 Material point based material properties. More...
 
const MaterialProperty< RankTwoTensor > & _stress
 
const MaterialProperty< RankTwoTensor > & _shape2
 
const MaterialProperty< RankTwoTensor > & _dgrad
 
const MaterialProperty< RankTwoTensor > & _ddgraddu
 
const MaterialProperty< RankTwoTensor > & _ddgraddv
 
const MaterialProperty< RankTwoTensor > & _ddgraddw
 
const MaterialProperty< RankFourTensor > & _Jacobian_mult
 
const std::vector< MaterialPropertyName > _eigenstrain_names
 
std::vector< const MaterialProperty< RankTwoTensor > * > _deigenstrain_dT
 
const bool _temp_coupled
 Temperature variable. More...
 
MooseVariable * _temp_var
 
const bool _out_of_plane_strain_coupled
 Parameters for out-of-plane strain in weak plane stress formulation. More...
 
MooseVariable * _out_of_plane_strain_var
 

Detailed Description

Kernel class for bond-associated correspondence material model for finite strain.

Definition at line 22 of file FiniteStrainMechanicsNOSPD.h.

Constructor & Destructor Documentation

◆ FiniteStrainMechanicsNOSPD()

FiniteStrainMechanicsNOSPD::FiniteStrainMechanicsNOSPD ( const InputParameters &  parameters)

Definition at line 32 of file FiniteStrainMechanicsNOSPD.C.

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 }

Member Function Documentation

◆ computeDinvFTDU()

RankTwoTensor FiniteStrainMechanicsNOSPD::computeDinvFTDU ( unsigned int  component,
unsigned int  nd 
)
protected

Function to compute derivative of deformation gradient inverse with respect to displacements.

Parameters
componentThe index of displacement component
ndThe local index of element node (either 1 or 2 for Edge2 element)
Returns
The calculated derivative

Definition at line 380 of file FiniteStrainMechanicsNOSPD.C.

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 }

Referenced by computeLocalJacobian(), and computeLocalOffDiagJacobian().

◆ computeDJDU()

Real FiniteStrainMechanicsNOSPD::computeDJDU ( unsigned int  component,
unsigned int  nd 
)
protected

Function to compute derivative of determinant of deformation gradient with respect to displacements.

Parameters
componentThe index of displacement component
ndThe local index of element node (either 1 or 2 for Edge2 element)
Returns
The calculated derivative

Definition at line 356 of file FiniteStrainMechanicsNOSPD.C.

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 }

Referenced by computeLocalJacobian(), and computeLocalOffDiagJacobian().

◆ computeDSDFhat()

RankFourTensor FiniteStrainMechanicsNOSPD::computeDSDFhat ( unsigned int  nd)
protected

Function to compute derivative of stress with respect to derived deformation gradient.

Parameters
ndThe local index of element node (either 1 or 2 for Edge2 element)
Returns
The calculated derivative

Definition at line 307 of file FiniteStrainMechanicsNOSPD.C.

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 }

Referenced by computeDSDU(), computeNonlocalJacobian(), and computePDNonlocalOffDiagJacobian().

◆ computeDSDU()

RankTwoTensor FiniteStrainMechanicsNOSPD::computeDSDU ( unsigned int  component,
unsigned int  nd 
)
overrideprotectedvirtual

Function to compute derivative of stress with respect to displacements.

Parameters
componentThe index of displacement component
ndThe local index of element node (either 1 or 2 for Edge2 element)
Returns
The calculated derivative

Reimplemented from MechanicsBaseNOSPD.

Definition at line 282 of file FiniteStrainMechanicsNOSPD.C.

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 }

Referenced by computeLocalJacobian(), and computeLocalOffDiagJacobian().

◆ computeLocalJacobian()

void FiniteStrainMechanicsNOSPD::computeLocalJacobian ( )
overrideprotectedvirtual

Definition at line 64 of file FiniteStrainMechanicsNOSPD.C.

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 }

◆ computeLocalOffDiagJacobian()

void FiniteStrainMechanicsNOSPD::computeLocalOffDiagJacobian ( unsigned int  )
overrideprotectedvirtual

Function to compute local contribution to the off-diagonal Jacobian at the current nodes.

Parameters
coupled_componentThe coupled variable number

Reimplemented from MechanicsBasePD.

Definition at line 169 of file FiniteStrainMechanicsNOSPD.C.

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 }

◆ computeLocalResidual()

void FiniteStrainMechanicsNOSPD::computeLocalResidual ( )
overrideprotectedvirtual

Definition at line 42 of file FiniteStrainMechanicsNOSPD.C.

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 }

◆ computeNonlocalJacobian()

void FiniteStrainMechanicsNOSPD::computeNonlocalJacobian ( )
overrideprotectedvirtual

Definition at line 81 of file FiniteStrainMechanicsNOSPD.C.

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 }

◆ computeOffDiagJacobian()

void MechanicsBasePD::computeOffDiagJacobian ( MooseVariableFEBase &  jvar)
overridevirtualinherited

Definition at line 71 of file MechanicsBasePD.C.

72 {
73  prepare();
74 
75  if (jvar.number() == _var.number())
76  computeJacobian();
77  else
78  {
79  unsigned int coupled_component = 0;
80  bool active = false;
81 
82  for (unsigned int i = 0; i < _dim; ++i)
83  if (jvar.number() == _disp_var[i]->number())
84  {
85  coupled_component = i;
86  active = true;
87  }
88 
89  if (_temp_coupled && jvar.number() == _temp_var->number())
90  {
91  coupled_component = 3;
92  active = true;
93  }
94 
95  if (_out_of_plane_strain_coupled && jvar.number() == _out_of_plane_strain_var->number())
96  {
97  coupled_component = 4;
98  active = true;
99  }
100 
101  if (active)
102  {
103  DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), jvar.number());
104  _local_ke.resize(ke.m(), ke.n());
105  _local_ke.zero();
106 
107  computeLocalOffDiagJacobian(coupled_component);
108 
109  ke += _local_ke;
110 
111  if (_use_full_jacobian)
112  computePDNonlocalOffDiagJacobian(jvar.number(), coupled_component);
113  }
114  }
115 }

◆ computePDNonlocalOffDiagJacobian()

void FiniteStrainMechanicsNOSPD::computePDNonlocalOffDiagJacobian ( unsigned int  ,
unsigned int   
)
overrideprotectedvirtual

Function to compute nonlocal contribution to the off-diagonal Jacobian at the current nodes.

Parameters
jvar_numThe number of the first coupled variable
coupled_componentThe component number of the second coupled variable

Reimplemented from MechanicsBasePD.

Definition at line 204 of file FiniteStrainMechanicsNOSPD.C.

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 }

◆ initialSetup()

void MechanicsBasePD::initialSetup ( )
overridevirtualinherited

Definition at line 47 of file MechanicsBasePD.C.

48 {
49  _orientation = &_assembly.getFE(FEType(), 1)->get_dxyzdxi();
50 }

◆ prepare()

void MechanicsBasePD::prepare ( )
overridevirtualinherited

Definition at line 53 of file MechanicsBasePD.C.

54 {
56 
57  _ivardofs_ij.resize(_nnodes);
58 
59  for (unsigned int i = 0; i < _nnodes; ++i)
60  _ivardofs_ij[i] = _current_elem->node_ptr(i)->dof_number(_sys.number(), _var.number(), 0);
61 
62  for (unsigned int i = 0; i < _dim; ++i)
63  _cur_ori_ij(i) = _origin_vec_ij(i) + _disp_var[i]->getNodalValue(*_current_elem->node_ptr(1)) -
64  _disp_var[i]->getNodalValue(*_current_elem->node_ptr(0));
65 
66  _cur_len_ij = _cur_ori_ij.norm();
68 }

Referenced by MechanicsBasePD::computeOffDiagJacobian(), GeneralizedPlaneStrainOffDiagNOSPD::computeOffDiagJacobianScalar(), and GeneralizedPlaneStrainOffDiagOSPD::computeOffDiagJacobianScalar().

Member Data Documentation

◆ _component

const unsigned int FiniteStrainMechanicsNOSPD::_component
protected

◆ _cur_len_ij

Real MechanicsBasePD::_cur_len_ij
protectedinherited

◆ _cur_ori_ij

RealGradient MechanicsBasePD::_cur_ori_ij
protectedinherited

◆ _ddgraddu

const MaterialProperty<RankTwoTensor>& MechanicsBaseNOSPD::_ddgraddu
protectedinherited

◆ _ddgraddv

const MaterialProperty<RankTwoTensor>& MechanicsBaseNOSPD::_ddgraddv
protectedinherited

◆ _ddgraddw

const MaterialProperty<RankTwoTensor>& MechanicsBaseNOSPD::_ddgraddw
protectedinherited

◆ _deigenstrain_dT

std::vector<const MaterialProperty<RankTwoTensor> *> MechanicsBaseNOSPD::_deigenstrain_dT
protectedinherited

◆ _dgrad

const MaterialProperty<RankTwoTensor>& MechanicsBaseNOSPD::_dgrad
protectedinherited

◆ _dgrad_old

const MaterialProperty<RankTwoTensor>& FiniteStrainMechanicsNOSPD::_dgrad_old
protected

Material point based material property.

Definition at line 63 of file FiniteStrainMechanicsNOSPD.h.

Referenced by computeDSDFhat(), computeDSDU(), computeNonlocalJacobian(), and computePDNonlocalOffDiagJacobian().

◆ _disp_var

std::vector<MooseVariable *> MechanicsBasePD::_disp_var
protectedinherited

◆ _E_inc

const MaterialProperty<RankTwoTensor>& FiniteStrainMechanicsNOSPD::_E_inc
protected

Definition at line 64 of file FiniteStrainMechanicsNOSPD.h.

Referenced by computeDSDFhat().

◆ _eigenstrain_names

const std::vector<MaterialPropertyName> MechanicsBaseNOSPD::_eigenstrain_names
protectedinherited

Definition at line 45 of file MechanicsBaseNOSPD.h.

Referenced by MechanicsBaseNOSPD::MechanicsBaseNOSPD().

◆ _ivardofs_ij

std::vector<dof_id_type> MechanicsBasePD::_ivardofs_ij
protectedinherited

◆ _Jacobian_mult

const MaterialProperty<RankFourTensor>& MechanicsBaseNOSPD::_Jacobian_mult
protectedinherited

◆ _multi

const MaterialProperty<Real>& MechanicsBaseNOSPD::_multi
protectedinherited

◆ _ndisp

unsigned int MechanicsBasePD::_ndisp
protectedinherited

number of displacement components

Definition at line 58 of file MechanicsBasePD.h.

Referenced by MechanicsBasePD::MechanicsBasePD().

◆ _orientation

const std::vector<RealGradient>* MechanicsBasePD::_orientation
protectedinherited

Vector of bond in current configuration.

Definition at line 66 of file MechanicsBasePD.h.

Referenced by MechanicsBasePD::initialSetup().

◆ _out_of_plane_strain_coupled

const bool MechanicsBasePD::_out_of_plane_strain_coupled
protectedinherited

Parameters for out-of-plane strain in weak plane stress formulation.

Definition at line 61 of file MechanicsBasePD.h.

Referenced by MechanicsBasePD::computeOffDiagJacobian().

◆ _out_of_plane_strain_var

MooseVariable* MechanicsBasePD::_out_of_plane_strain_var
protectedinherited

Definition at line 62 of file MechanicsBasePD.h.

Referenced by MechanicsBasePD::computeOffDiagJacobian().

◆ _R_inc

const MaterialProperty<RankTwoTensor>& FiniteStrainMechanicsNOSPD::_R_inc
protected

Definition at line 65 of file FiniteStrainMechanicsNOSPD.h.

Referenced by computeDSDFhat().

◆ _shape2

const MaterialProperty<RankTwoTensor>& MechanicsBaseNOSPD::_shape2
protectedinherited

◆ _stress

const MaterialProperty<RankTwoTensor>& MechanicsBaseNOSPD::_stress
protectedinherited

◆ _temp_coupled

const bool MechanicsBasePD::_temp_coupled
protectedinherited

◆ _temp_var

MooseVariable* MechanicsBasePD::_temp_var
protectedinherited

The documentation for this class was generated from the following files:
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::MechanicsBaseNOSPD
MechanicsBaseNOSPD(const InputParameters &parameters)
Definition: MechanicsBaseNOSPD.C:29
FiniteStrainMechanicsNOSPD::_E_inc
const MaterialProperty< RankTwoTensor > & _E_inc
Definition: FiniteStrainMechanicsNOSPD.h:64
MechanicsBasePD::_cur_ori_ij
RealGradient _cur_ori_ij
Vector of bond in current configuration.
Definition: MechanicsBasePD.h:72
MechanicsBasePD::_temp_var
MooseVariable * _temp_var
Definition: MechanicsBasePD.h:54
MechanicsBasePD::_temp_coupled
const bool _temp_coupled
Temperature variable.
Definition: MechanicsBasePD.h:53
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
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
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
MechanicsBasePD::_orientation
const std::vector< RealGradient > * _orientation
Vector of bond in current configuration.
Definition: MechanicsBasePD.h:66
MechanicsBasePD::computeLocalOffDiagJacobian
virtual void computeLocalOffDiagJacobian(unsigned int)
Function to compute local contribution to the off-diagonal Jacobian at the current nodes.
Definition: MechanicsBasePD.h:35
MechanicsBasePD::_out_of_plane_strain_var
MooseVariable * _out_of_plane_strain_var
Definition: MechanicsBasePD.h:62
PeridynamicsKernelBase::prepare
virtual void prepare()
Function to precalculate data which will be used in the derived classes.
Definition: PeridynamicsKernelBase.C:43
MechanicsBasePD::_out_of_plane_strain_coupled
const bool _out_of_plane_strain_coupled
Parameters for out-of-plane strain in weak plane stress formulation.
Definition: MechanicsBasePD.h:61
MechanicsBasePD::_ivardofs_ij
std::vector< dof_id_type > _ivardofs_ij
Current variable dof numbers for nodes i and j.
Definition: MechanicsBasePD.h:69
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
MechanicsBasePD::computePDNonlocalOffDiagJacobian
virtual void computePDNonlocalOffDiagJacobian(unsigned int, unsigned int)
Function to compute nonlocal contribution to the off-diagonal Jacobian at the current nodes.
Definition: MechanicsBasePD.h:42
RankFourTensorTempl
Definition: ACGrGrElasticDrivingForce.h:20
MechanicsBasePD::prepare
virtual void prepare() override
Definition: MechanicsBasePD.C:53
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::_R_inc
const MaterialProperty< RankTwoTensor > & _R_inc
Definition: FiniteStrainMechanicsNOSPD.h:65
MechanicsBasePD::_cur_len_ij
Real _cur_len_ij
Current bond length.
Definition: MechanicsBasePD.h:75
MechanicsBasePD::_disp_var
std::vector< MooseVariable * > _disp_var
displacement variables
Definition: MechanicsBasePD.h:50