www.mooseframework.org
WeakPlaneStressNOSPD.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 
10 #include "WeakPlaneStressNOSPD.h"
11 #include "MooseVariable.h"
12 #include "PeridynamicsMesh.h"
13 
14 registerMooseObject("PeridynamicsApp", WeakPlaneStressNOSPD);
15 
16 template <>
17 InputParameters
19 {
20  InputParameters params = validParams<MechanicsBaseNOSPD>();
21  params.addClassDescription("Class for calculating residual and Jacobian for peridynamic plane "
22  "stress model using weak formulation");
23 
24  return params;
25 }
26 
27 WeakPlaneStressNOSPD::WeakPlaneStressNOSPD(const InputParameters & parameters)
28  : MechanicsBaseNOSPD(parameters)
29 {
30 }
31 
32 void
34 {
35  _local_re(0) = _stress[0](2, 2) * _dg_vol_frac_ij[0] * _vols_ij[0] * _bond_status_ij;
36  _local_re(1) = _stress[1](2, 2) * _dg_vol_frac_ij[1] * _vols_ij[1] * _bond_status_ij;
37 }
38 
39 void
41 {
42  for (_i = 0; _i < _test.size(); _i++)
43  for (_j = 0; _j < _phi.size(); _j++)
44  _local_ke(_i, _j) += (_i == _j ? 1 : 0) * _Jacobian_mult[_i](2, 2, 2, 2) *
45  _dg_vol_frac_ij[_i] * _vols_ij[_i] * _bond_status_ij;
46 }
47 
48 void
50 {
51  _local_ke.zero();
52  if (coupled_component == 3) // off-diagonal Jacobian with respect to coupled temperature variable
53  {
54  std::vector<RankTwoTensor> dSdT(_nnodes);
55  for (unsigned int nd = 0; nd < _nnodes; nd++)
56  for (unsigned int es = 0; es < _deigenstrain_dT.size(); es++)
57  dSdT[nd] = -_Jacobian_mult[nd] * (*_deigenstrain_dT[es])[nd];
58 
59  for (_i = 0; _i < _test.size(); _i++)
60  for (_j = 0; _j < _phi.size(); _j++)
61  _local_ke(_i, _j) += (_i == _j ? 1 : 0) * dSdT[_i](2, 2) * _dg_vol_frac_ij[_i] *
62  _vols_ij[_i] * _bond_status_ij;
63  }
64  else // off-diagonal Jacobian with respect to coupled displacement variables
65  {
66  // dSidUi and dSjdUj are considered as local off-diagonal Jacobian
67  // contributions to their neighbors are considered as nonlocal off-diagonal
68  for (_i = 0; _i < _test.size(); _i++)
69  for (_j = 0; _j < _phi.size(); _j++)
70  _local_ke(_i, _j) += (_i == _j ? 1 : 0) * computeDSDU(coupled_component, _j)(2, 2) *
71  _dg_vol_frac_ij[_j] * _vols_ij[_j] * _bond_status_ij;
72  }
73 }
74 
75 void
77  unsigned int coupled_component)
78 {
79  if (coupled_component != 3)
80  {
81  for (unsigned int cur_nd = 0; cur_nd < _nnodes; cur_nd++)
82  {
83  // calculation of jacobian contribution to current_node's neighbors
84  // NOT including the contribution to nodes i and j, which is considered as local off-diagonal
85  std::vector<dof_id_type> jvardofs_ijk(_nnodes);
86  jvardofs_ijk[0] = _current_elem->node_ptr(cur_nd)->dof_number(_sys.number(), jvar_num, 0);
87  std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(cur_nd));
88  unsigned int nb =
89  std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - cur_nd)) -
90  neighbors.begin();
91  std::vector<dof_id_type> dg_neighbors =
92  _pdmesh.getDefGradNeighbors(_current_elem->node_id(cur_nd), nb);
93  std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(cur_nd));
94  for (unsigned int k = 0; k < dg_neighbors.size(); k++)
95  {
96  const Node * node_k = _pdmesh.nodePtr(neighbors[dg_neighbors[k]]);
97  jvardofs_ijk[1] = node_k->dof_number(_sys.number(), jvar_num, 0);
98  const Real vol_k = _pdmesh.getPDNodeVolume(neighbors[dg_neighbors[k]]);
99 
100  // obtain bond k's origin vector
101  const RealGradient origin_vec_ijk =
102  *node_k - *_pdmesh.nodePtr(_current_elem->node_id(cur_nd));
103 
104  RankTwoTensor dFdUk;
105  dFdUk.zero();
106  for (unsigned int j = 0; j < _dim; j++)
107  dFdUk(coupled_component, j) =
108  _horiz_rad[cur_nd] / origin_vec_ijk.norm() * origin_vec_ijk(j) * vol_k;
109 
110  dFdUk *= _shape2[cur_nd].inverse();
111 
112  RankTwoTensor dPdUk =
113  _Jacobian_mult[cur_nd] * 0.5 *
114  (dFdUk.transpose() * _dgrad[cur_nd] + _dgrad[cur_nd].transpose() * dFdUk);
115 
116  // bond status for bond k
117  Real bond_status_ijk =
118  _bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[k]]));
119 
120  _local_ke.zero();
121  _local_ke(cur_nd, 1) = dPdUk(2, 2) * _dg_vol_frac_ij[cur_nd] * _vols_ij[cur_nd] *
122  _bond_status_ij * bond_status_ijk;
123 
124  _assembly.cacheJacobianBlock(_local_ke, _ivardofs_ij, jvardofs_ijk, _var.scalingFactor());
125  }
126  }
127  }
128 }
validParams< WeakPlaneStressNOSPD >
InputParameters validParams< WeakPlaneStressNOSPD >()
Definition: WeakPlaneStressNOSPD.C:18
MechanicsBaseNOSPD
Base kernel class for bond-associated correspondence material models.
Definition: MechanicsBaseNOSPD.h:22
MechanicsBaseNOSPD::_dgrad
const MaterialProperty< RankTwoTensor > & _dgrad
Definition: MechanicsBaseNOSPD.h:40
registerMooseObject
registerMooseObject("PeridynamicsApp", WeakPlaneStressNOSPD)
WeakPlaneStressNOSPD::computeLocalResidual
virtual void computeLocalResidual() override
Definition: WeakPlaneStressNOSPD.C:33
MechanicsBaseNOSPD::_shape2
const MaterialProperty< RankTwoTensor > & _shape2
Definition: MechanicsBaseNOSPD.h:39
libMesh::RealGradient
VectorValue< Real > RealGradient
Definition: GrainForceAndTorqueInterface.h:17
MechanicsBaseNOSPD::_Jacobian_mult
const MaterialProperty< RankFourTensor > & _Jacobian_mult
Definition: MechanicsBaseNOSPD.h:44
MechanicsBaseNOSPD::_stress
const MaterialProperty< RankTwoTensor > & _stress
Definition: MechanicsBaseNOSPD.h:38
WeakPlaneStressNOSPD::computeLocalOffDiagJacobian
virtual void computeLocalOffDiagJacobian(unsigned int coupled_component) override
Function to compute local contribution to the off-diagonal Jacobian at the current nodes.
Definition: WeakPlaneStressNOSPD.C:49
WeakPlaneStressNOSPD::computeLocalJacobian
virtual void computeLocalJacobian() override
Definition: WeakPlaneStressNOSPD.C:40
PeridynamicsMesh.h
MechanicsBaseNOSPD::computeDSDU
virtual RankTwoTensor computeDSDU(unsigned int component, unsigned int nd)
Function to compute derivative of stress with respect to displacements.
Definition: MechanicsBaseNOSPD.C:49
MechanicsBasePD::_ivardofs_ij
std::vector< dof_id_type > _ivardofs_ij
Current variable dof numbers for nodes i and j.
Definition: MechanicsBasePD.h:69
WeakPlaneStressNOSPD.h
WeakPlaneStressNOSPD
Kernel class for weak plane stress formulation based on bond-associated correspondence material model...
Definition: WeakPlaneStressNOSPD.h:23
validParams< MechanicsBaseNOSPD >
InputParameters validParams< MechanicsBaseNOSPD >()
Definition: MechanicsBaseNOSPD.C:16
RankTwoTensorTempl< Real >
MechanicsBaseNOSPD::_deigenstrain_dT
std::vector< const MaterialProperty< RankTwoTensor > * > _deigenstrain_dT
Definition: MechanicsBaseNOSPD.h:46
WeakPlaneStressNOSPD::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: WeakPlaneStressNOSPD.C:76
WeakPlaneStressNOSPD::WeakPlaneStressNOSPD
WeakPlaneStressNOSPD(const InputParameters &parameters)
Definition: WeakPlaneStressNOSPD.C:27