https://mooseframework.inl.gov
GeneralizedPlaneStrainOffDiagNOSPD.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
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 
15 
18 {
20  params.addClassDescription(
21  "Class for calculating the off-diagonal Jacobian of the coupling between displacements (or "
22  "temperature) with scalar out-of-plane strain for the generalized plane strain using the "
23  "H1NOSPD formulation");
24 
25  params.addCoupledVar("scalar_out_of_plane_strain",
26  "Scalar variable for strain in the out-of-plane direction");
27 
28  return params;
29 }
30 
32  const InputParameters & parameters)
33  : MechanicsBaseNOSPD(parameters),
34  _scalar_out_of_plane_strain_var_num(coupledScalar("scalar_out_of_plane_strain"))
35 {
36  // Consistency check
37  if (_disp_var.size() != 2)
38  mooseError("GeneralizedPlaneStrain only works for two dimensional models!");
39 }
40 
41 void
43 {
45  {
46  prepare();
47 
48  if (_var.number() == _disp_var[0]->number())
49  if (_use_full_jacobian)
51  else
53  else if (_var.number() == _disp_var[1]->number())
54  if (_use_full_jacobian)
56  else
58  else if (_temp_coupled ? _var.number() == _temp_var->number() : 0)
60  }
61 }
62 
63 void
65  unsigned int jvar_num)
66 {
67  // off-diagonal jacobian entries on the column and row corresponding to
68  // scalar_out_of_plane_strain for coupling with displacements
69 
70  prepareMatrixTag(_assembly, _var.number(), jvar_num, _ken);
71  prepareMatrixTag(_assembly, jvar_num, _var.number(), _kne);
72  MooseVariableScalar & jvar = _sys.getScalarVariable(_tid, jvar_num);
73 
74  // fill in the column corresponding to the scalar variable
75  std::vector<RankTwoTensor> dSdE33(_nnodes);
76  for (unsigned int nd = 0; nd < _nnodes; ++nd)
77  for (unsigned int i = 0; i < 3; ++i)
78  for (unsigned int j = 0; j < 3; ++j)
79  dSdE33[nd](i, j) = _Jacobian_mult[nd](i, j, 2, 2);
80 
81  for (unsigned int i = 0; i < _nnodes; ++i)
82  for (unsigned int j = 0; j < jvar.order(); ++j)
83  _ken(i, j) += (i == j ? -1 : 1) *
84  (_multi[0] * (dSdE33[0] * _shape2[0].inverse()).row(component) +
85  _multi[1] * (dSdE33[1] * _shape2[1].inverse()).row(component)) *
86  _origin_vec * _bond_status;
87 
88  _kne(0, 0) +=
89  computeDSDU(component, 0)(2, 2) * _node_vol[0] * _dg_vol_frac[0] * _bond_status; // node i
90  _kne(0, 1) +=
91  computeDSDU(component, 1)(2, 2) * _node_vol[1] * _dg_vol_frac[1] * _bond_status; // node j
92  accumulateTaggedLocalMatrix(_assembly, _var.number(), jvar_num, _ken);
93  accumulateTaggedLocalMatrix(_assembly, jvar_num, _var.number(), _kne);
94 }
95 
96 void
98  unsigned int jvar_num)
99 {
100  // LOCAL contribution
101 
102  // off-diagonal jacobian entries on the column and row corresponding to
103  // scalar_out_of_plane_strain for coupling with displacements
104  prepareMatrixTag(_assembly, _var.number(), jvar_num, _ken);
105  prepareMatrixTag(_assembly, jvar_num, _var.number(), _kne);
106  MooseVariableScalar & jvar = _sys.getScalarVariable(_tid, jvar_num);
107 
108  // fill in the column corresponding to the scalar variable
109  std::vector<RankTwoTensor> dSdE33(_nnodes);
110  for (unsigned int nd = 0; nd < _nnodes; ++nd)
111  for (unsigned int i = 0; i < 3; ++i)
112  for (unsigned int j = 0; j < 3; ++j)
113  dSdE33[nd](i, j) = _Jacobian_mult[nd](i, j, 2, 2);
114 
115  for (unsigned int i = 0; i < _nnodes; ++i)
116  for (unsigned int j = 0; j < jvar.order(); ++j)
117  _ken(i, j) += (i == j ? -1 : 1) *
118  (_multi[0] * (dSdE33[0] * _shape2[0].inverse()).row(component) +
119  _multi[1] * (dSdE33[1] * _shape2[1].inverse()).row(component)) *
120  _origin_vec * _bond_status;
121 
122  // fill in the row corresponding to the scalar variable
123  _kne(0, 0) +=
124  computeDSDU(component, 0)(2, 2) * _node_vol[0] * _dg_vol_frac[0] * _bond_status; // node i
125  _kne(0, 1) +=
126  computeDSDU(component, 1)(2, 2) * _node_vol[1] * _dg_vol_frac[1] * _bond_status; // node j
127 
128  accumulateTaggedLocalMatrix(_assembly, _var.number(), jvar_num, _ken);
129  accumulateTaggedLocalMatrix(_assembly, jvar_num, _var.number(), _kne);
130 
131  // NONLOCAL contribution
132 
133  // fill in the row corresponding to the scalar variable
134  for (unsigned int nd = 0; nd < _nnodes; ++nd)
135  {
136  // calculation of jacobian contribution to current_node's neighbors
137  // NOT including the contribution to nodes i and j, which is considered as local off-diagonal
138  std::vector<dof_id_type> ivardofs(_nnodes);
139  ivardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), _var.number(), 0);
140  std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
141  std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
142 
143  dof_id_type nb_index =
144  std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
145  neighbors.begin();
146  std::vector<dof_id_type> dg_neighbors =
147  _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
148 
149  Real vol_nb;
150  RealGradient origin_vec_nb;
151  RankTwoTensor dFdUk, dPdUk;
152 
153  for (unsigned int nb = 0; nb < dg_neighbors.size(); ++nb)
154  if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb]])) > 0.5)
155  {
156  Node * dgneighbor_nb = _pdmesh.nodePtr(neighbors[dg_neighbors[nb]]);
157  ivardofs[1] = dgneighbor_nb->dof_number(_sys.number(), _var.number(), 0);
158  vol_nb = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb]]);
159 
160  // obtain bond nb's origin vector
161  origin_vec_nb = _pdmesh.getNodeCoord(dgneighbor_nb->id()) -
162  _pdmesh.getNodeCoord(_current_elem->node_id(nd));
163 
164  dFdUk.zero();
165  for (unsigned int i = 0; i < _dim; ++i)
166  dFdUk(component, i) =
167  _horizon_radius[nd] / origin_vec_nb.norm() * origin_vec_nb(i) * vol_nb;
168 
169  dFdUk *= _shape2[nd].inverse();
170  dPdUk = _Jacobian_mult[nd] * 0.5 * (dFdUk.transpose() + dFdUk);
171 
172  _local_ke.resize(_ken.n(), _ken.m());
173  _local_ke.zero();
174  _local_ke(0, 1) = dPdUk(2, 2) * _dg_vol_frac[nd] * _node_vol[nd] * _bond_status;
175 
176  addJacobian(_assembly, _local_ke, jvar.dofIndices(), ivardofs, _var.scalingFactor());
177  }
178  }
179 }
180 
181 void
183 {
184  // off-diagonal jacobian entries on the row corresponding to scalar_out_of_plane_strain for
185  // coupling with temperature
186  prepareMatrixTag(_assembly, jvar_num, _var.number(), _kne);
187 
188  // one-way coupling between the scalar_out_of_plane_strain and temperature. fill in the row
189  // corresponding to the scalar_out_of_plane_strain
190  std::vector<RankTwoTensor> dSdT(_nnodes);
191  for (unsigned int nd = 0; nd < _nnodes; ++nd)
192  for (unsigned int es = 0; es < _deigenstrain_dT.size(); ++es)
193  dSdT[nd] = -_Jacobian_mult[nd] * (*_deigenstrain_dT[es])[nd];
194 
195  _kne(0, 0) += dSdT[0](2, 2) * _dg_vol_frac[0] * _node_vol[0] * _bond_status; // node i
196  _kne(0, 1) += dSdT[1](2, 2) * _dg_vol_frac[1] * _node_vol[1] * _bond_status; // node j
197  accumulateTaggedLocalMatrix(_assembly, jvar_num, _var.number(), _kne);
198 }
const bool _temp_coupled
Temperature variable.
void computeDispFullOffDiagJacobianScalar(unsigned int component, unsigned int jvar_num)
Function to compute the full off diagonal Jacobian for coupling between displacements and scalar vari...
virtual void computeOffDiagJacobianScalar(unsigned int jvar_num) override
virtual RankTwoTensor computeDSDU(unsigned int component, unsigned int nd)
Function to compute derivative of stress with respect to displacements for small strain problems...
auto norm() const -> decltype(std::norm(Real()))
const MaterialProperty< RankFourTensor > & _Jacobian_mult
void mooseError(Args &&... args)
unsigned int number() const
static const std::string component
Definition: NS.h:153
unsigned int m() const
void inverse(const std::vector< std::vector< Real >> &m, std::vector< std::vector< Real >> &m_inv)
virtual void resize(const std::size_t size) override final
void computeDispPartialOffDiagJacobianScalar(unsigned int component, unsigned int jvar_num)
Function to compute partial off diagonal Jacobian for coupling between displacements and scalar varia...
std::vector< const MaterialProperty< RankTwoTensor > * > _deigenstrain_dT
Kernel class for coupled off diagonal Jacobian entries of Form I of horizon stabilized peridynamic ge...
std::vector< MooseVariable * > _disp_var
displacement variables
static InputParameters validParams()
virtual void prepare() override
const MaterialProperty< RankTwoTensor > & _shape2
void addCoupledVar(const std::string &name, const std::string &doc_string)
const MaterialProperty< Real > & _multi
Material point based material properties.
registerMooseObject("PeridynamicsApp", GeneralizedPlaneStrainOffDiagNOSPD)
RankTwoTensorTempl< Real > transpose() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
GeneralizedPlaneStrainOffDiagNOSPD(const InputParameters &parameters)
void computeTempOffDiagJacobianScalar(unsigned int jvar_num)
Function to compute off disgonal Jacobian for coupling between temperature and scalar variable...
void addClassDescription(const std::string &doc_string)
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
unsigned int n() const
MooseVariable * _temp_var
const unsigned int _scalar_out_of_plane_strain_var_num
The variable number of the scalar out-of-plane strain variable.
Base kernel class for bond-associated correspondence material models.
uint8_t dof_id_type