20 "Class for calculating the residual and the Jacobian for Form II " 21 "of the horizon-stabilized peridynamic correspondence model under small strain assumptions");
25 "An integer corresponding to the variable this kernel acts on (0 for x, 1 for y, 2 for z)");
45 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
46 for (
unsigned int i = 0; i < _nnodes; ++i)
47 _local_re(i) += (i == 0 ? -1 : 1) *
_multi[nd] * _horizon_radius[nd] / _origin_vec.norm() *
49 _node_vol[1 - nd] * _bond_status;
55 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
58 std::vector<dof_id_type> ivardofs(_nnodes);
60 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
61 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
64 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
66 std::vector<dof_id_type> dg_neighbors =
67 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
72 for (
unsigned int nb = 0; nb < dg_neighbors.size(); ++nb)
73 if (neighbors[dg_neighbors[nb]] != _current_elem->node_id(1 - nd) &&
74 _bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb]])) > 0.5)
76 ivardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])
77 ->dof_number(_sys.number(), _var.number(), 0);
78 origin_vec_nb = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb]]) -
79 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
80 node_vol_nb = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb]]);
82 for (
unsigned int i = 0; i < _nnodes; ++i)
83 _local_re(i) = (i == 0 ? -1 : 1) *
_multi[nd] * _horizon_radius[nd] /
84 origin_vec_nb.
norm() *
86 node_vol_nb * _bond_status;
89 addResiduals(_assembly, _local_re, ivardofs, _var.scalingFactor());
93 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
94 for (
unsigned int i = 0; i < _save_in.size(); ++i)
96 std::vector<dof_id_type> save_in_dofs(_nnodes);
97 save_in_dofs[0] = _current_elem->node_ptr(nd)->dof_number(
98 _save_in[i]->sys().number(), _save_in[i]->number(), 0);
100 _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])
101 ->dof_number(_save_in[i]->sys().number(), _save_in[i]->number(), 0);
103 _save_in[i]->sys().solution().add_vector(_local_re, save_in_dofs);
113 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
115 std::vector<dof_id_type> ivardofs(_nnodes);
116 ivardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), _var.number(), 0);
117 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
118 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
121 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
123 std::vector<dof_id_type> dg_neighbors =
124 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
129 for (
unsigned int nb = 0; nb < dg_neighbors.size(); ++nb)
130 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb]])) > 0.5)
132 ivardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])
133 ->dof_number(_sys.number(), _var.number(), 0);
134 origin_vec_nb = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb]]) -
135 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
136 node_vol_nb = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb]]);
138 for (
unsigned int i = 0; i < _nnodes; ++i)
139 for (
unsigned int j = 0;
j < _nnodes; ++
j)
141 (i == 0 ? -1 : 1) * (
j == 0 ? 1 : 0) *
_multi[nd] * _horizon_radius[nd] /
142 origin_vec_nb.
norm() *
144 origin_vec_nb * node_vol_nb * _bond_status;
146 addJacobian(_assembly, _local_ke, ivardofs, ivardofs, _var.scalingFactor());
156 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
159 std::vector<dof_id_type> ivardofs(_nnodes), jvardofs(_nnodes);
160 ivardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), _var.number(), 0);
161 jvardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), _var.number(), 0);
162 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
163 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
166 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
168 std::vector<dof_id_type> dg_neighbors =
169 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
174 for (
unsigned int nb1 = 0; nb1 < dg_neighbors.size(); ++nb1)
175 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb1]])) > 0.5)
177 ivardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb1]])
178 ->dof_number(_sys.number(), _var.number(), 0);
179 origin_vec_nb1 = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb1]]) -
180 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
181 node_vol_nb1 = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb1]]);
187 for (
unsigned int nb2 = 0; nb2 < dg_neighbors.size(); ++nb2)
188 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb2]])) > 0.5)
190 jvardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb2]])
191 ->dof_number(_sys.number(), _var.number(), 0);
192 vol_nb2 = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb2]]);
194 origin_vec_nb2 = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb2]]) -
195 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
198 for (
unsigned int i = 0; i < _dim; ++i)
200 _horizon_radius[nd] / origin_vec_nb2.
norm() * origin_vec_nb2(i) * vol_nb2;
202 dFdUk *=
_shape2[nd].inverse();
205 for (
unsigned int i = 0; i < _nnodes; ++i)
206 for (
unsigned int j = 0;
j < _nnodes; ++
j)
207 _local_ke(i,
j) = (i == 0 ? -1 : 1) * (
j == 0 ? 0 : 1) *
_multi[nd] *
208 _horizon_radius[nd] / origin_vec_nb1.
norm() *
210 origin_vec_nb1 * node_vol_nb1 * _bond_status;
212 addJacobian(_assembly, _local_ke, ivardofs, jvardofs, _var.scalingFactor());
214 if (_has_diag_save_in)
216 unsigned int rows = _nnodes;
217 DenseVector<Real> diag(rows);
218 for (
unsigned int i = 0; i < rows; ++i)
219 diag(i) = _local_ke(i, i);
221 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
222 for (
unsigned int i = 0; i < _diag_save_in.size(); ++i)
224 std::vector<dof_id_type> diag_save_in_dofs(2);
225 diag_save_in_dofs[0] = _current_elem->node_ptr(nd)->dof_number(
226 _diag_save_in[i]->sys().number(), _diag_save_in[i]->number(), 0);
227 diag_save_in_dofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb2]])
228 ->dof_number(_diag_save_in[i]->sys().number(),
229 _diag_save_in[i]->number(),
232 _diag_save_in[i]->sys().solution().add_vector(diag, diag_save_in_dofs);
242 unsigned int jvar_num,
unsigned int coupled_component)
246 std::vector<RankTwoTensor> dSdT(_nnodes);
247 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
251 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
253 std::vector<dof_id_type> ivardofs(_nnodes), jvardofs(_nnodes);
254 ivardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), _var.number(), 0);
255 jvardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), jvar_num, 0);
256 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
257 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
260 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
262 std::vector<dof_id_type> dg_neighbors =
263 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
268 for (
unsigned int nb = 0; nb < dg_neighbors.size(); ++nb)
269 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb]])) > 0.5)
271 ivardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])
272 ->dof_number(_sys.number(), _var.number(), 0);
274 _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])->dof_number(_sys.number(), jvar_num, 0);
275 origin_vec_nb = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb]]) -
276 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
277 node_vol_nb = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb]]);
279 for (
unsigned int i = 0; i < _nnodes; ++i)
280 for (
unsigned int j = 0;
j < _nnodes; ++
j)
281 _local_ke(i,
j) = (i == 0 ? -1 : 1) * (
j == 0 ? 1 : 0) *
_multi[nd] *
282 _horizon_radius[nd] / origin_vec_nb.
norm() *
284 node_vol_nb * _bond_status;
286 addJacobian(_assembly, _local_ke, ivardofs, jvardofs, _var.scalingFactor());
295 std::vector<RankTwoTensor> dSdE33(_nnodes);
296 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
297 for (
unsigned int i = 0; i < 3; ++i)
298 for (
unsigned int j = 0;
j < 3; ++
j)
301 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
303 std::vector<dof_id_type> ivardofs(_nnodes), jvardofs(_nnodes);
304 ivardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), _var.number(), 0);
305 jvardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), jvar_num, 0);
306 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
307 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
310 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
312 std::vector<dof_id_type> dg_neighbors =
313 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
318 for (
unsigned int nb = 0; nb < dg_neighbors.size(); ++nb)
319 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb]])) > 0.5)
321 ivardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])
322 ->dof_number(_sys.number(), _var.number(), 0);
324 _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])->dof_number(_sys.number(), jvar_num, 0);
325 origin_vec_nb = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb]]) -
326 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
327 node_vol_nb = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb]]);
329 for (
unsigned int i = 0; i < _nnodes; ++i)
330 for (
unsigned int j = 0;
j < _nnodes; ++
j)
331 _local_ke(i,
j) = (i == 0 ? -1 : 1) * (
j == 0 ? 1 : 0) *
_multi[nd] *
332 _horizon_radius[nd] / origin_vec_nb.
norm() *
334 origin_vec_nb * node_vol_nb * _bond_status;
336 addJacobian(_assembly, _local_ke, ivardofs, jvardofs, _var.scalingFactor());
343 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
345 std::vector<dof_id_type> ivardofs(_nnodes), jvardofs(_nnodes);
346 ivardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), _var.number(), 0);
347 jvardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), jvar_num, 0);
348 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
349 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
352 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
354 std::vector<dof_id_type> dg_neighbors =
355 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
360 for (
unsigned int nb = 0; nb < dg_neighbors.size(); ++nb)
361 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb]])) > 0.5)
363 ivardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])
364 ->dof_number(_sys.number(), _var.number(), 0);
366 _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])->dof_number(_sys.number(), jvar_num, 0);
367 origin_vec_nb = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb]]) -
368 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
369 node_vol_nb = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb]]);
371 for (
unsigned int i = 0; i < _nnodes; ++i)
372 for (
unsigned int j = 0;
j < _nnodes; ++
j)
374 (i == 0 ? -1 : 1) * (
j == 0 ? 1 : 0) *
_multi[nd] * _horizon_radius[nd] /
375 origin_vec_nb.
norm() *
377 origin_vec_nb * node_vol_nb * _bond_status;
379 addJacobian(_assembly, _local_ke, ivardofs, jvardofs, _var.scalingFactor());
388 unsigned int jvar_num,
unsigned int coupled_component)
400 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
404 std::vector<dof_id_type> ivardofs(_nnodes), jvardofs(_nnodes);
405 ivardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), _var.number(), 0);
406 jvardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), jvar_num, 0);
407 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
408 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
411 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
413 std::vector<dof_id_type> dg_neighbors =
414 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
419 for (
unsigned int nb1 = 0; nb1 < dg_neighbors.size(); ++nb1)
420 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb1]])) > 0.5)
422 ivardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb1]])
423 ->dof_number(_sys.number(), _var.number(), 0);
424 origin_vec_nb1 = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb1]]) -
425 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
426 node_vol_nb1 = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb1]]);
432 for (
unsigned int nb2 = 0; nb2 < dg_neighbors.size(); ++nb2)
433 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb2]])) >
436 jvardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb2]])
437 ->dof_number(_sys.number(), jvar_num, 0);
438 vol_nb2 = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb2]]);
440 origin_vec_nb2 = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb2]]) -
441 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
444 for (
unsigned int i = 0; i < _dim; ++i)
445 dFdUk(coupled_component, i) =
446 _horizon_radius[nd] / origin_vec_nb2.
norm() * origin_vec_nb2(i) * vol_nb2;
448 dFdUk *=
_shape2[nd].inverse();
451 for (
unsigned int i = 0; i < _nnodes; ++i)
452 for (
unsigned int j = 0;
j < _nnodes; ++
j)
453 _local_ke(i,
j) = (i == 0 ? -1 : 1) * (
j == 0 ? 0 : 1) *
_multi[nd] *
454 _horizon_radius[nd] / origin_vec_nb1.
norm() *
456 origin_vec_nb1 * node_vol_nb1 * _bond_status;
458 addJacobian(_assembly, _local_ke, ivardofs, jvardofs, _var.scalingFactor());
const bool _temp_coupled
Temperature variable.
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
unsigned int number() const
const MaterialProperty< RankTwoTensor > & _stress
const bool _out_of_plane_strain_coupled
Parameters for out-of-plane strain in weak plane stress formulation.
std::vector< const MaterialProperty< RankTwoTensor > * > _deigenstrain_dT
static InputParameters validParams()
MooseVariable * _out_of_plane_strain_var
std::vector< dof_id_type > _ivardofs
Current variable dof numbers for nodes i and j.
const MaterialProperty< RankTwoTensor > & _shape2
const MaterialProperty< Real > & _multi
Material point based material properties.
RankTwoTensorTempl< Real > transpose() const
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")
MooseVariable * _temp_var
void ErrorVector unsigned int
Base kernel class for bond-associated correspondence material models.