www.mooseframework.org
GeneralizedPlaneStrainOffDiagOSPD.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 "MooseVariableScalar.h"
12 #include "PeridynamicsMesh.h"
13 #include "RankTwoTensor.h"
14 #include "RankFourTensor.h"
15 
17 
18 template <>
19 InputParameters
21 {
22  InputParameters params = validParams<MechanicsBasePD>();
23  params.addClassDescription(
24  "Class for calculating off-diagonal Jacobian corresponding to "
25  "coupling between displacements (or temperature) and scalar out-of-plane strain for "
26  "generalized plane strain using OSPD formulation");
27 
28  params.addCoupledVar("scalar_out_of_plane_strain",
29  "Scalar variable for strain in the out-of-plane direction");
30 
31  return params;
32 }
33 
35  const InputParameters & parameters)
36  : MechanicsBasePD(parameters),
37  _bond_dfdE_ij(getMaterialProperty<Real>("bond_dfdE_ij")),
38  _bond_dfdE_i_j(getMaterialProperty<Real>("bond_dfdE_i_j")),
39  _alpha(getMaterialProperty<Real>("thermal_expansion_coeff")),
40  _Cijkl(getMaterialProperty<RankFourTensor>("elasticity_tensor")),
41  _scalar_out_of_plane_strain_var_num(coupledScalar("scalar_out_of_plane_strain"))
42 {
43  // Consistency check
44  if (_disp_var.size() != 2)
45  mooseError("GeneralizedPlaneStrain only works for two dimensional case!");
46 }
47 
48 void
50 {
52  {
53  prepare();
54 
55  if (_var.number() == _disp_var[0]->number())
56  if (_use_full_jacobian)
58  else
60  else if (_var.number() == _disp_var[1]->number())
61  if (_use_full_jacobian)
63  else
65  else if (_temp_coupled ? _var.number() == _temp_var->number() : 0)
67  }
68 }
69 
70 void
72  unsigned int jvar_num)
73 {
74 
75  DenseMatrix<Number> & ken = _assembly.jacobianBlock(_var.number(), jvar_num);
76  DenseMatrix<Number> & kne = _assembly.jacobianBlock(jvar_num, _var.number());
77  MooseVariableScalar & jvar = _sys.getScalarVariable(_tid, jvar_num);
78 
79  // LOCAL jacobian contribution
80  // fill in the column corresponding to the scalar variable from bond ij
81  for (_i = 0; _i < _test.size(); _i++)
82  for (_j = 0; _j < jvar.order(); _j++)
83  ken(_i, _j) +=
84  (_i == _j ? -1 : 1) * _cur_ori_ij(component) * _bond_dfdE_ij[0] * _bond_status_ij;
85 
86  // NONLOCAL jacobian contribution
87  std::vector<dof_id_type> ivardofs(_nnodes), neighbors(_nnodes), bonds(_nnodes);
88  // for off-diagonal low components
89  RankTwoTensor delta(RankTwoTensor::initIdentity);
90  std::vector<RankTwoTensor> shape(_nnodes), dgrad(_nnodes);
91 
92  for (unsigned int cur_nd = 0; cur_nd < _nnodes; cur_nd++)
93  {
94  if (_dim == 2)
95  shape[cur_nd](2, 2) = dgrad[cur_nd](2, 2) = 1.0;
96 
97  // calculation of jacobian contribution to current node's neighbors
98  ivardofs[cur_nd] = _ivardofs_ij[cur_nd];
99  neighbors = _pdmesh.getNeighbors(_current_elem->node_id(cur_nd));
100  bonds = _pdmesh.getBonds(_current_elem->node_id(cur_nd));
101  for (unsigned int k = 0; k < neighbors.size(); k++)
102  {
103  Node * node_k = _pdmesh.nodePtr(neighbors[k]);
104  ivardofs[1 - cur_nd] = node_k->dof_number(_sys.number(), _var.number(), 0);
105  Real vol_k = _pdmesh.getPDNodeVolume(neighbors[k]);
106 
107  // obtain bond k's origin length and current orientation
108  RealGradient origin_ori_k = *node_k - *_pdmesh.nodePtr(_current_elem->node_id(cur_nd));
109 
110  RealGradient current_ori_k(_dim);
111  for (unsigned int j = 0; j < _dim; j++)
112  current_ori_k(j) = origin_ori_k(j) + _disp_var[j]->getNodalValue(*node_k) -
113  _disp_var[j]->getNodalValue(*_current_elem->node_ptr(cur_nd));
114 
115  Real origin_len_k = origin_ori_k.norm();
116  Real current_len_k = current_ori_k.norm();
117 
118  // bond status for bond k
119  Real bond_status_k = _bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[k]));
120 
121  // prepare shape tensor and deformation gradient tensor for current node
122  for (unsigned int m = 0; m < _dim; m++)
123  for (unsigned int n = 0; n < _dim; n++)
124  {
125  shape[cur_nd](m, n) += vol_k * _horiz_rad[cur_nd] / origin_len_k * origin_ori_k(m) *
126  origin_ori_k(n) * bond_status_k;
127  dgrad[cur_nd](m, n) += vol_k * _horiz_rad[cur_nd] / origin_len_k * current_ori_k(m) *
128  origin_ori_k(n) * bond_status_k;
129  }
130 
131  // cache the nonlocal jacobian contribution
132  _local_ke.resize(ken.m(), ken.n());
133  _local_ke.zero();
134  _local_ke(0, 0) = (cur_nd == 0 ? -1 : 1) * current_ori_k(component) / current_len_k *
135  _bond_dfdE_i_j[cur_nd] / origin_len_k * vol_k * bond_status_k *
136  _bond_status_ij;
137  _local_ke(1, 0) = (cur_nd == 0 ? 1 : -1) * current_ori_k(component) / current_len_k *
138  _bond_dfdE_i_j[cur_nd] / origin_len_k * vol_k * bond_status_k *
139  _bond_status_ij;
140 
141  _assembly.cacheJacobianBlock(_local_ke, ivardofs, jvar.dofIndices(), _var.scalingFactor());
142  }
143 
144  // finalize the shape tensor and deformation gradient tensor for node_i
145  if (MooseUtils::absoluteFuzzyEqual(shape[cur_nd].det(), 0.0))
146  {
147  shape[cur_nd] = delta;
148  dgrad[cur_nd] = delta;
149  }
150  else
151  {
152  // inverse the shape tensor at node i
153  shape[cur_nd] = shape[cur_nd].inverse();
154  // calculate the deformation gradient tensor at node i
155  dgrad[cur_nd] = dgrad[cur_nd] * shape[cur_nd];
156  }
157  }
158 
159  // off-diagonal jacobian entries on the row
160  Real dEidUi = -_vols_ij[1] * _horiz_rad[0] / _origin_vec_ij.norm() *
161  (_Cijkl[0](2, 2, 0, 0) *
162  (_origin_vec_ij(0) * shape[0](0, 0) + _origin_vec_ij(1) * shape[0](1, 0)) *
163  dgrad[0](component, 0) +
164  _Cijkl[0](2, 2, 1, 1) *
165  (_origin_vec_ij(0) * shape[0](0, 1) + _origin_vec_ij(1) * shape[0](1, 1)) *
166  dgrad[0](component, 1));
167  Real dEjdUj = _vols_ij[0] * _horiz_rad[1] / _origin_vec_ij.norm() *
168  (_Cijkl[0](2, 2, 0, 0) *
169  (_origin_vec_ij(0) * shape[1](0, 0) + _origin_vec_ij(1) * shape[1](1, 0)) *
170  dgrad[1](component, 0) +
171  _Cijkl[0](2, 2, 1, 1) *
172  (_origin_vec_ij(0) * shape[1](0, 1) + _origin_vec_ij(1) * shape[1](1, 1)) *
173  dgrad[1](component, 1));
174 
175  // fill in the row corresponding to the scalar variable
176  kne(0, 0) += (dEidUi * _vols_ij[0] - dEjdUj * _vols_ij[1]) * _bond_status_ij; // node i
177  kne(0, 1) += (dEjdUj * _vols_ij[1] - dEidUi * _vols_ij[0]) * _bond_status_ij; // node j
178 }
179 
180 void
182  unsigned int jvar_num)
183 {
184  DenseMatrix<Number> & ken = _assembly.jacobianBlock(_var.number(), jvar_num);
185  DenseMatrix<Number> & kne = _assembly.jacobianBlock(jvar_num, _var.number());
186  MooseVariableScalar & jvar = _sys.getScalarVariable(_tid, jvar_num);
187 
188  // fill in the column corresponding to the scalar variable from bond ij
189  for (_i = 0; _i < _test.size(); _i++)
190  for (_j = 0; _j < jvar.order(); _j++)
191  {
192  ken(_i, _j) +=
193  (_i == _j ? -1 : 1) * _cur_ori_ij(component) * _bond_dfdE_ij[0] * _bond_status_ij;
194  kne(_j, _i) +=
195  (_i == _j ? -1 : 1) * _cur_ori_ij(component) * _bond_dfdE_ij[0] * _bond_status_ij;
196  }
197 }
198 
199 void
201 {
202  // off-diagonal jacobian entries on the row
203 
204  DenseMatrix<Number> & kne = _assembly.jacobianBlock(jvar_num, _var.number());
205 
206  // number of neighbors for node i and j
207  unsigned int nn_i = _pdmesh.getNeighbors(_current_elem->node_id(0)).size();
208  unsigned int nn_j = _pdmesh.getNeighbors(_current_elem->node_id(1)).size();
209 
210  // one-way coupling between the strain_zz and temperature. fill in the row corresponding to the
211  // scalar variable strain_zz
212  kne(0, 0) += -_alpha[0] *
213  (_Cijkl[0](2, 2, 0, 0) + _Cijkl[0](2, 2, 1, 1) + _Cijkl[0](2, 2, 2, 2)) *
214  _vols_ij[0] / nn_i; // node i
215  kne(0, 1) += -_alpha[0] *
216  (_Cijkl[0](2, 2, 0, 0) + _Cijkl[0](2, 2, 1, 1) + _Cijkl[0](2, 2, 2, 2)) *
217  _vols_ij[1] / nn_j; // node j
218 }
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
validParams< GeneralizedPlaneStrainOffDiagOSPD >
InputParameters validParams< GeneralizedPlaneStrainOffDiagOSPD >()
Definition: GeneralizedPlaneStrainOffDiagOSPD.C:20
GeneralizedPlaneStrainOffDiagOSPD::_alpha
const MaterialProperty< Real > & _alpha
Definition: GeneralizedPlaneStrainOffDiagOSPD.h:57
GeneralizedPlaneStrainOffDiagOSPD
Kernel class for coupled off diagonal Jacobian entries of ordinary state-based peridynamic generalize...
Definition: GeneralizedPlaneStrainOffDiagOSPD.h:23
GeneralizedPlaneStrainOffDiagOSPD::_Cijkl
const MaterialProperty< RankFourTensor > & _Cijkl
Material point based material property.
Definition: GeneralizedPlaneStrainOffDiagOSPD.h:61
libMesh::RealGradient
VectorValue< Real > RealGradient
Definition: GrainForceAndTorqueInterface.h:17
GeneralizedPlaneStrainOffDiagOSPD::computeDispFullOffDiagJacobianScalar
void computeDispFullOffDiagJacobianScalar(unsigned int component, unsigned int jvar_num)
Function to compute the full off diagonal Jacobian for coupling between displacements and scalar vari...
Definition: GeneralizedPlaneStrainOffDiagOSPD.C:71
GeneralizedPlaneStrainOffDiagOSPD::computeDispPartialOffDiagJacobianScalar
void computeDispPartialOffDiagJacobianScalar(unsigned int component, unsigned int jvar_num)
Function to compute partial off diagonal Jacobian for coupling between displacements and scalar varia...
Definition: GeneralizedPlaneStrainOffDiagOSPD.C:181
GeneralizedPlaneStrainOffDiagOSPD::_bond_dfdE_ij
const MaterialProperty< Real > & _bond_dfdE_ij
Bond based material properties.
Definition: GeneralizedPlaneStrainOffDiagOSPD.h:55
PeridynamicsMesh.h
registerMooseObject
registerMooseObject("PeridynamicsApp", GeneralizedPlaneStrainOffDiagOSPD)
GeneralizedPlaneStrainOffDiagOSPD::computeOffDiagJacobianScalar
virtual void computeOffDiagJacobianScalar(unsigned int jvar_num) override
Definition: GeneralizedPlaneStrainOffDiagOSPD.C:49
GeneralizedPlaneStrainOffDiagOSPD.h
MechanicsBasePD::_ivardofs_ij
std::vector< dof_id_type > _ivardofs_ij
Current variable dof numbers for nodes i and j.
Definition: MechanicsBasePD.h:69
MaterialTensorCalculatorTools::component
Real component(const SymmTensor &symm_tensor, unsigned int index)
Definition: MaterialTensorCalculatorTools.C:16
validParams< MechanicsBasePD >
InputParameters validParams< MechanicsBasePD >()
Definition: MechanicsBasePD.C:15
RankFourTensorTempl< Real >
MechanicsBasePD::prepare
virtual void prepare() override
Definition: MechanicsBasePD.C:53
MechanicsBasePD
Base kernel class for peridynamic solid mechanics models.
Definition: MechanicsBasePD.h:23
RankTwoTensorTempl< Real >
GeneralizedPlaneStrainOffDiagOSPD::computeTempOffDiagJacobianScalar
void computeTempOffDiagJacobianScalar(unsigned int jvar_num)
Function to compute off disgonal Jacobian for coupling between temperature and scalar variable.
Definition: GeneralizedPlaneStrainOffDiagOSPD.C:200
GeneralizedPlaneStrainOffDiagOSPD::GeneralizedPlaneStrainOffDiagOSPD
GeneralizedPlaneStrainOffDiagOSPD(const InputParameters &parameters)
Definition: GeneralizedPlaneStrainOffDiagOSPD.C:34
GeneralizedPlaneStrainOffDiagOSPD::_scalar_out_of_plane_strain_var_num
const unsigned int _scalar_out_of_plane_strain_var_num
The variable number of the scalar out-of-plane strain variable.
Definition: GeneralizedPlaneStrainOffDiagOSPD.h:64
GeneralizedPlaneStrainOffDiagOSPD::_bond_dfdE_i_j
const MaterialProperty< Real > & _bond_dfdE_i_j
Definition: GeneralizedPlaneStrainOffDiagOSPD.h:56
MechanicsBasePD::_disp_var
std::vector< MooseVariable * > _disp_var
displacement variables
Definition: MechanicsBasePD.h:50