https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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{
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
41void
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
63void
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
96void
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
181void
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}
registerMooseObject("PeridynamicsApp", GeneralizedPlaneStrainOffDiagNOSPD)
void mooseError(Args &&... args)
Kernel class for coupled off diagonal Jacobian entries of Form I of horizon stabilized peridynamic ge...
void computeTempOffDiagJacobianScalar(unsigned int jvar_num)
Function to compute off disgonal Jacobian for coupling between temperature and scalar variable.
virtual void computeOffDiagJacobianScalar(unsigned int jvar_num) override
const unsigned int _scalar_out_of_plane_strain_var_num
The variable number of the scalar out-of-plane strain 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...
GeneralizedPlaneStrainOffDiagNOSPD(const InputParameters &parameters)
void computeDispPartialOffDiagJacobianScalar(unsigned int component, unsigned int jvar_num)
Function to compute partial off diagonal Jacobian for coupling between displacements and scalar varia...
void addClassDescription(const std::string &doc_string)
void addCoupledVar(const std::string &name, const std::string &doc_string)
Base kernel class for bond-associated correspondence material models.
const MaterialProperty< RankTwoTensor > & _shape2
std::vector< const MaterialProperty< RankTwoTensor > * > _deigenstrain_dT
const MaterialProperty< Real > & _multi
Material point based material properties.
virtual RankTwoTensor computeDSDU(unsigned int component, unsigned int nd)
Function to compute derivative of stress with respect to displacements for small strain problems.
const MaterialProperty< RankFourTensor > & _Jacobian_mult
static InputParameters validParams()
virtual void prepare() override
MooseVariable * _temp_var
const bool _temp_coupled
Temperature variable.
std::vector< MooseVariable * > _disp_var
displacement variables
virtual const std::vector< dof_id_type > & dofIndices() const
libMesh::Order order() const
unsigned int number() const
RankTwoTensorTempl< T > inverse() const
RankTwoTensorTempl< T > transpose() const
unsigned int n() const
unsigned int m() const