21 "Class for calculating the off-diagonal Jacobian corresponding to " 22 "coupling between displacements (or temperature) and the scalar out-of-plane strain for " 23 "the generalized plane strain using the OSPD formulation");
26 "Scalar variable for strain in the out-of-plane direction");
34 _bond_local_dfdE(getMaterialProperty<
Real>(
"bond_local_dfdE")),
35 _bond_nonlocal_dfdE(getMaterialProperty<
Real>(
"bond_nonlocal_dfdE")),
36 _alpha(getMaterialProperty<
Real>(
"thermal_expansion_coeff")),
38 _scalar_out_of_plane_strain_var_num(coupledScalar(
"scalar_out_of_plane_strain"))
42 mooseError(
"GeneralizedPlaneStrain only works for two dimensional case!");
52 if (_var.number() ==
_disp_var[0]->number())
53 if (_use_full_jacobian)
57 else if (_var.number() ==
_disp_var[1]->number())
58 if (_use_full_jacobian)
69 unsigned int jvar_num)
71 prepareMatrixTag(_assembly, _var.number(), jvar_num,
_ken);
72 prepareMatrixTag(_assembly, jvar_num, _var.number(),
_kne);
77 for (
unsigned int i = 0; i < _nnodes; ++i)
78 for (
unsigned int j = 0;
j < jvar.order(); ++
j)
83 std::vector<RankTwoTensor> shape(_nnodes), dgrad(_nnodes);
86 if (_bond_status > 0.5)
88 for (
unsigned int nd = 0; nd < _nnodes; nd++)
91 shape[nd](2, 2) = dgrad[nd](2, 2) = 1.0;
93 std::vector<dof_id_type> ivardofs(_nnodes);
95 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
96 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
98 Real vol_nb, weight_nb;
101 for (
unsigned int nb = 0; nb < neighbors.size(); nb++)
102 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[nb])) > 0.5)
105 _pdmesh.nodePtr(neighbors[nb])->dof_number(_sys.number(), _var.number(), 0);
106 vol_nb = _pdmesh.getNodeVolume(neighbors[nb]);
109 origin_vec_nb = _pdmesh.getNodeCoord(neighbors[nb]) -
110 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
112 for (
unsigned int k = 0;
k < _dim;
k++)
113 current_vec_nb(
k) = origin_vec_nb(
k) +
114 _disp_var[
k]->getNodalValue(*_pdmesh.nodePtr(neighbors[nb])) -
115 _disp_var[
k]->getNodalValue(*_current_elem->node_ptr(nd));
117 weight_nb = _horizon_radius[nd] / origin_vec_nb.
norm();
119 for (
unsigned int k = 0;
k < _dim;
k++)
120 for (
unsigned int l = 0; l < _dim; l++)
122 shape[nd](
k, l) += weight_nb * origin_vec_nb(
k) * origin_vec_nb(l) * vol_nb;
123 dgrad[nd](
k, l) += weight_nb * current_vec_nb(
k) * origin_vec_nb(l) * vol_nb;
129 _local_ke(0, 0) = (nd == 0 ? -1 : 1) * current_vec_nb(
component) / current_vec_nb.
norm() *
131 _local_ke(1, 0) = (nd == 0 ? 1 : -1) * current_vec_nb(
component) / current_vec_nb.
norm() *
134 addJacobian(_assembly, _local_ke, ivardofs, jvar.dofIndices(), _var.scalingFactor());
138 if (shape[nd].det() == 0.)
139 mooseError(
"Singular shape tensor is detected in GeneralizedPlaneStrainOffDiagOSPD! Use " 140 "SingularShapeTensorEliminatorUserObjectPD to avoid singular shape tensor");
142 shape[nd] = shape[nd].inverse();
143 dgrad[nd] = dgrad[nd] * shape[nd];
149 -_node_vol[1] * _horizon_radius[0] / _origin_vec.norm() *
150 (
_Cijkl[0](2, 2, 0, 0) * (_origin_vec(0) * shape[0](0, 0) + _origin_vec(1) * shape[0](1, 0)) *
152 _Cijkl[0](2, 2, 1, 1) * (_origin_vec(0) * shape[0](0, 1) + _origin_vec(1) * shape[0](1, 1)) *
155 _node_vol[0] * _horizon_radius[1] / _origin_vec.norm() *
156 (
_Cijkl[0](2, 2, 0, 0) * (_origin_vec(0) * shape[1](0, 0) + _origin_vec(1) * shape[1](1, 0)) *
158 _Cijkl[0](2, 2, 1, 1) * (_origin_vec(0) * shape[1](0, 1) + _origin_vec(1) * shape[1](1, 1)) *
162 _kne(0, 0) += (dEidUi * _node_vol[0] - dEjdUj * _node_vol[1]) * _bond_status;
163 _kne(0, 1) += (dEjdUj * _node_vol[1] - dEidUi * _node_vol[0]) * _bond_status;
165 accumulateTaggedLocalMatrix(_assembly, _var.number(), jvar_num,
_ken);
166 accumulateTaggedLocalMatrix(_assembly, jvar_num, _var.number(),
_kne);
171 unsigned int jvar_num)
173 prepareMatrixTag(_assembly, _var.number(), jvar_num,
_ken);
174 prepareMatrixTag(_assembly, jvar_num, _var.number(),
_kne);
178 for (
unsigned int i = 0; i < _nnodes; ++i)
179 for (
unsigned int j = 0;
j < jvar.order(); ++
j)
187 accumulateTaggedLocalMatrix(_assembly, _var.number(), jvar_num,
_ken);
188 accumulateTaggedLocalMatrix(_assembly, jvar_num, _var.number(),
_kne);
195 prepareMatrixTag(_assembly, jvar_num, _var.number(),
_kne);
198 std::vector<unsigned int> active_neighbors(_nnodes, 0);
199 for (
unsigned int nd = 0; nd < _nnodes; nd++)
201 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
202 for (
unsigned int nb = 0; nb < bonds.size(); ++nb)
203 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[nb])) > 0.5)
204 active_neighbors[nd]++;
206 if (active_neighbors[nd] == 0)
207 active_neighbors[nd] = 1;
214 _node_vol[0] / active_neighbors[0] * _bond_status;
217 _node_vol[1] / active_neighbors[1] * _bond_status;
219 accumulateTaggedLocalMatrix(_assembly, jvar_num, _var.number(),
_kne);
void computeTempOffDiagJacobianScalar(unsigned int jvar_num)
Function to compute off disgonal Jacobian for coupling between temperature and scalar variable...
const MaterialProperty< Real > & _bond_nonlocal_dfdE
GeneralizedPlaneStrainOffDiagOSPD(const InputParameters ¶meters)
const bool _temp_coupled
Temperature variable.
Base kernel class for peridynamic solid mechanics models.
static InputParameters validParams()
auto norm() const -> decltype(std::norm(Real()))
const MaterialProperty< Real > & _alpha
void mooseError(Args &&... args)
unsigned int number() const
static InputParameters validParams()
static const std::string component
RealGradient _current_unit_vec
Unit vector of bond in current configuration.
DenseMatrix< Number > _kne
const MaterialProperty< Real > & _bond_local_dfdE
Bond based material properties.
std::vector< MooseVariable * > _disp_var
displacement variables
const MaterialProperty< RankFourTensor > & _Cijkl
Material point based material property.
virtual void prepare() override
void computeDispPartialOffDiagJacobianScalar(unsigned int component, unsigned int jvar_num)
Function to compute partial off diagonal Jacobian for coupling between displacements and scalar varia...
const unsigned int _scalar_out_of_plane_strain_var_num
The variable number of the scalar out-of-plane strain variable.
DenseMatrix< Number > _ken
std::vector< dof_id_type > _ivardofs
Current variable dof numbers for nodes i and j.
void computeDispFullOffDiagJacobianScalar(unsigned int component, unsigned int jvar_num)
Function to compute the full off diagonal Jacobian for coupling between displacements and scalar vari...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
virtual void computeOffDiagJacobianScalar(unsigned int jvar_num) override
registerMooseObject("PeridynamicsApp", GeneralizedPlaneStrainOffDiagOSPD)
MooseVariable * _temp_var
Kernel class for coupled off diagonal Jacobian entries of ordinary state-based peridynamic generalize...
static const std::string k