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");
26 "Scalar variable for strain in the out-of-plane direction");
34 _scalar_out_of_plane_strain_var_num(coupledScalar(
"scalar_out_of_plane_strain"))
38 mooseError(
"GeneralizedPlaneStrain only works for two dimensional models!");
48 if (_var.number() ==
_disp_var[0]->number())
49 if (_use_full_jacobian)
53 else if (_var.number() ==
_disp_var[1]->number())
54 if (_use_full_jacobian)
65 unsigned int jvar_num)
70 prepareMatrixTag(_assembly, _var.number(), jvar_num,
_ken);
71 prepareMatrixTag(_assembly, jvar_num, _var.number(),
_kne);
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)
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) *
86 _origin_vec * _bond_status;
92 accumulateTaggedLocalMatrix(_assembly, _var.number(), jvar_num,
_ken);
93 accumulateTaggedLocalMatrix(_assembly, jvar_num, _var.number(),
_kne);
98 unsigned int jvar_num)
104 prepareMatrixTag(_assembly, _var.number(), jvar_num,
_ken);
105 prepareMatrixTag(_assembly, jvar_num, _var.number(),
_kne);
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)
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) *
120 _origin_vec * _bond_status;
128 accumulateTaggedLocalMatrix(_assembly, _var.number(), jvar_num,
_ken);
129 accumulateTaggedLocalMatrix(_assembly, jvar_num, _var.number(),
_kne);
134 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
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));
144 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
146 std::vector<dof_id_type> dg_neighbors =
147 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
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)
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]]);
161 origin_vec_nb = _pdmesh.getNodeCoord(dgneighbor_nb->id()) -
162 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
165 for (
unsigned int i = 0; i < _dim; ++i)
167 _horizon_radius[nd] / origin_vec_nb.
norm() * origin_vec_nb(i) * vol_nb;
169 dFdUk *=
_shape2[nd].inverse();
174 _local_ke(0, 1) = dPdUk(2, 2) * _dg_vol_frac[nd] * _node_vol[nd] * _bond_status;
176 addJacobian(_assembly, _local_ke, jvar.dofIndices(), ivardofs, _var.scalingFactor());
186 prepareMatrixTag(_assembly, jvar_num, _var.number(),
_kne);
190 std::vector<RankTwoTensor> dSdT(_nnodes);
191 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
195 _kne(0, 0) += dSdT[0](2, 2) * _dg_vol_frac[0] * _node_vol[0] * _bond_status;
196 _kne(0, 1) += dSdT[1](2, 2) * _dg_vol_frac[1] * _node_vol[1] * _bond_status;
197 accumulateTaggedLocalMatrix(_assembly, jvar_num, _var.number(),
_kne);
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
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
DenseMatrix< Number > _kne
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
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
DenseMatrix< Number > _ken
GeneralizedPlaneStrainOffDiagNOSPD(const InputParameters ¶meters)
void computeTempOffDiagJacobianScalar(unsigned int jvar_num)
Function to compute off disgonal Jacobian for coupling between temperature and scalar variable...
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
MooseVariable * _temp_var
static InputParameters validParams()
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.