www.mooseframework.org
GeneralizedPlaneStrainOffDiagNOSPD.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<MechanicsBaseNOSPD>();
23  params.addClassDescription(
24  "Class for calculating off-diagonal Jacobian corresponding to "
25  "coupling between displacements (or temperature) with scalar out-of-plane strain for "
26  "generalized plane strain using SNOSPD 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  : MechanicsBaseNOSPD(parameters),
37  _scalar_out_of_plane_strain_var_num(coupledScalar("scalar_out_of_plane_strain"))
38 {
39  // Consistency check
40  if (_disp_var.size() != 2)
41  mooseError("GeneralizedPlaneStrain only works for two dimensional models!");
42 }
43 
44 void
46 {
48  {
49  prepare();
50 
51  if (_var.number() == _disp_var[0]->number())
52  if (_use_full_jacobian)
54  else
56  else if (_var.number() == _disp_var[1]->number())
57  if (_use_full_jacobian)
59  else
61  else if (_temp_coupled ? _var.number() == _temp_var->number() : 0)
63  }
64 }
65 
66 void
68  unsigned int jvar_num)
69 {
70  // off-diagonal jacobian entries on the column and row corresponding to
71  // scalar_out_of_plane_strain for coupling with displacements
72 
73  DenseMatrix<Number> & ken = _assembly.jacobianBlock(_var.number(), jvar_num);
74  DenseMatrix<Number> & kne = _assembly.jacobianBlock(jvar_num, _var.number());
75  MooseVariableScalar & jvar = _sys.getScalarVariable(_tid, jvar_num);
76 
77  // fill in the column corresponding to the scalar variable
78  std::vector<RankTwoTensor> dSdE33(_nnodes);
79  for (unsigned int nd = 0; nd < _nnodes; ++nd)
80  for (unsigned int i = 0; i < 3; ++i)
81  for (unsigned int j = 0; j < 3; ++j)
82  dSdE33[nd](i, j) = _Jacobian_mult[nd](i, j, 2, 2);
83 
84  for (_i = 0; _i < _test.size(); ++_i)
85  for (_j = 0; _j < jvar.order(); ++_j)
86  ken(_i, _j) += (_i == _j ? -1 : 1) *
87  (_multi[0] * (dSdE33[0] * _shape2[0].inverse()).row(component) +
88  _multi[1] * (dSdE33[1] * _shape2[1].inverse()).row(component)) *
89  _origin_vec_ij * _bond_status_ij;
90 
91  kne(0, 0) += computeDSDU(component, 0)(2, 2) * _vols_ij[0] * _dg_vol_frac_ij[0] *
92  _bond_status_ij; // node i
93  kne(0, 1) += computeDSDU(component, 1)(2, 2) * _vols_ij[1] * _dg_vol_frac_ij[1] *
94  _bond_status_ij; // node j
95 }
96 
97 void
99  unsigned int jvar_num)
100 {
101  // LOCAL contribution
102 
103  // off-diagonal jacobian entries on the column and row corresponding to
104  // scalar_out_of_plane_strain for coupling with displacements
105  DenseMatrix<Number> & ken = _assembly.jacobianBlock(_var.number(), jvar_num);
106  DenseMatrix<Number> & kne = _assembly.jacobianBlock(jvar_num, _var.number());
107  MooseVariableScalar & jvar = _sys.getScalarVariable(_tid, jvar_num);
108 
109  // fill in the column corresponding to the scalar variable
110  std::vector<RankTwoTensor> dSdE33(_nnodes);
111  for (unsigned int nd = 0; nd < _nnodes; ++nd)
112  for (unsigned int i = 0; i < 3; ++i)
113  for (unsigned int j = 0; j < 3; ++j)
114  dSdE33[nd](i, j) = _Jacobian_mult[nd](i, j, 2, 2);
115 
116  for (_i = 0; _i < _test.size(); ++_i)
117  for (_j = 0; _j < jvar.order(); ++_j)
118  ken(_i, _j) += (_i == _j ? -1 : 1) *
119  (_multi[0] * (dSdE33[0] * _shape2[0].inverse()).row(component) +
120  _multi[1] * (dSdE33[1] * _shape2[1].inverse()).row(component)) *
121  _origin_vec_ij * _bond_status_ij;
122 
123  // fill in the row corresponding to the scalar variable
124  kne(0, 0) += computeDSDU(component, 0)(2, 2) * _vols_ij[0] * _dg_vol_frac_ij[0] *
125  _bond_status_ij; // node i
126  kne(0, 1) += computeDSDU(component, 1)(2, 2) * _vols_ij[1] * _dg_vol_frac_ij[1] *
127  _bond_status_ij; // node j
128 
129  // NONLOCAL contribution
130 
131  // fill in the row corresponding to the scalar variable
132  for (unsigned int cur_nd = 0; cur_nd < _nnodes; ++cur_nd)
133  {
134  // calculation of jacobian contribution to current_node's neighbors
135  // NOT including the contribution to nodes i and j, which is considered as local off-diagonal
136  std::vector<dof_id_type> ivardofs(_nnodes);
137  ivardofs[0] = _current_elem->node_ptr(cur_nd)->dof_number(_sys.number(), _var.number(), 0);
138  std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(cur_nd));
139  unsigned int nb =
140  std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - cur_nd)) -
141  neighbors.begin();
142  std::vector<dof_id_type> dg_neighbors =
143  _pdmesh.getDefGradNeighbors(_current_elem->node_id(cur_nd), nb);
144  std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(cur_nd));
145  for (unsigned int k = 0; k < dg_neighbors.size(); ++k)
146  {
147  Node * node_k = _pdmesh.nodePtr(neighbors[dg_neighbors[k]]);
148  ivardofs[1] = node_k->dof_number(_sys.number(), _var.number(), 0);
149  Real vol_k = _pdmesh.getPDNodeVolume(neighbors[dg_neighbors[k]]);
150 
151  // obtain bond k's origin vector
152  RealGradient origin_vec_ijk = *node_k - *_pdmesh.nodePtr(_current_elem->node_id(cur_nd));
153 
154  RankTwoTensor dFdUk;
155  dFdUk.zero();
156  for (unsigned int j = 0; j < _dim; ++j)
157  dFdUk(component, j) =
158  _horiz_rad[cur_nd] / origin_vec_ijk.norm() * origin_vec_ijk(j) * vol_k;
159 
160  dFdUk *= _shape2[cur_nd].inverse();
161 
162  RankTwoTensor dPdUk = _Jacobian_mult[cur_nd] * 0.5 * (dFdUk.transpose() + dFdUk);
163 
164  // bond status for bond k
165  Real bond_status_ijk =
166  _bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[k]]));
167 
168  _local_ke.resize(ken.n(), ken.m());
169  _local_ke.zero();
170  _local_ke(0, 1) = dPdUk(2, 2) * _dg_vol_frac_ij[cur_nd] * _vols_ij[cur_nd] * _bond_status_ij *
171  bond_status_ijk;
172 
173  _assembly.cacheJacobianBlock(_local_ke, jvar.dofIndices(), ivardofs, _var.scalingFactor());
174  }
175  }
176 }
177 
178 void
180 {
181  // off-diagonal jacobian entries on the row corresponding to scalar_out_of_plane_strain for
182  // coupling with temperature
183  DenseMatrix<Number> & kne = _assembly.jacobianBlock(jvar_num, _var.number());
184 
185  // one-way coupling between the scalar_out_of_plane_strain and temperature. fill in the row
186  // corresponding to the scalar_out_of_plane_strain
187  std::vector<RankTwoTensor> dSdT(_nnodes);
188  for (unsigned int nd = 0; nd < _nnodes; ++nd)
189  for (unsigned int es = 0; es < _deigenstrain_dT.size(); ++es)
190  dSdT[nd] = -_Jacobian_mult[nd] * (*_deigenstrain_dT[es])[nd];
191 
192  kne(0, 0) += dSdT[0](2, 2) * _dg_vol_frac_ij[0] * _vols_ij[0] * _bond_status_ij; // node i
193  kne(0, 1) += dSdT[1](2, 2) * _dg_vol_frac_ij[1] * _vols_ij[1] * _bond_status_ij; // node j
194 }
MechanicsBaseNOSPD
Base kernel class for bond-associated correspondence material models.
Definition: MechanicsBaseNOSPD.h:22
GeneralizedPlaneStrainOffDiagNOSPD::computeTempOffDiagJacobianScalar
void computeTempOffDiagJacobianScalar(unsigned int jvar_num)
Function to compute off disgonal Jacobian for coupling between temperature and scalar variable.
Definition: GeneralizedPlaneStrainOffDiagNOSPD.C:179
MechanicsBasePD::_temp_var
MooseVariable * _temp_var
Definition: MechanicsBasePD.h:54
MechanicsBasePD::_temp_coupled
const bool _temp_coupled
Temperature variable.
Definition: MechanicsBasePD.h:53
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
GeneralizedPlaneStrainOffDiagNOSPD::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: GeneralizedPlaneStrainOffDiagNOSPD.C:98
PeridynamicsMesh.h
GeneralizedPlaneStrainOffDiagNOSPD.h
GeneralizedPlaneStrainOffDiagNOSPD::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: GeneralizedPlaneStrainOffDiagNOSPD.C:67
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
validParams< GeneralizedPlaneStrainOffDiagNOSPD >
InputParameters validParams< GeneralizedPlaneStrainOffDiagNOSPD >()
Definition: GeneralizedPlaneStrainOffDiagNOSPD.C:20
MaterialTensorCalculatorTools::component
Real component(const SymmTensor &symm_tensor, unsigned int index)
Definition: MaterialTensorCalculatorTools.C:16
GeneralizedPlaneStrainOffDiagNOSPD::GeneralizedPlaneStrainOffDiagNOSPD
GeneralizedPlaneStrainOffDiagNOSPD(const InputParameters &parameters)
Definition: GeneralizedPlaneStrainOffDiagNOSPD.C:34
validParams< MechanicsBaseNOSPD >
InputParameters validParams< MechanicsBaseNOSPD >()
Definition: MechanicsBaseNOSPD.C:16
MechanicsBasePD::prepare
virtual void prepare() override
Definition: MechanicsBasePD.C:53
RankTwoTensorTempl< Real >
registerMooseObject
registerMooseObject("PeridynamicsApp", GeneralizedPlaneStrainOffDiagNOSPD)
MechanicsBaseNOSPD::_deigenstrain_dT
std::vector< const MaterialProperty< RankTwoTensor > * > _deigenstrain_dT
Definition: MechanicsBaseNOSPD.h:46
GeneralizedPlaneStrainOffDiagNOSPD::computeOffDiagJacobianScalar
virtual void computeOffDiagJacobianScalar(unsigned int jvar_num) override
Definition: GeneralizedPlaneStrainOffDiagNOSPD.C:45
GeneralizedPlaneStrainOffDiagNOSPD::_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: GeneralizedPlaneStrainOffDiagNOSPD.h:55
GeneralizedPlaneStrainOffDiagNOSPD
Kernel class for coupled off diagonal Jacobian entries of non-ordinary state-based peridynamic genera...
Definition: GeneralizedPlaneStrainOffDiagNOSPD.h:23
MechanicsBasePD::_disp_var
std::vector< MooseVariable * > _disp_var
displacement variables
Definition: MechanicsBasePD.h:50