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;
99 RealGradient origin_vec_nb, current_vec_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)) *
151 dgrad[0](component, 0) +
152 _Cijkl[0](2, 2, 1, 1) * (_origin_vec(0) * shape[0](0, 1) + _origin_vec(1) * shape[0](1, 1)) *
153 dgrad[0](component, 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)) *
157 dgrad[1](component, 0) +
158 _Cijkl[0](2, 2, 1, 1) * (_origin_vec(0) * shape[1](0, 1) + _origin_vec(1) * shape[1](1, 1)) *
159 dgrad[1](component, 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);
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);