20 "Class for calculating the residual and the Jacobian for Form II " 21 "of the horizon-stabilized peridynamic correspondence model under finite strain assumptions");
25 "An integer corresponding to the variable this kernel acts on (0 for x, 1 for y, 2 for z)");
46 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
47 for (
unsigned int i = 0; i < _nnodes; ++i)
48 _local_re(i) += (i == 0 ? -1 : 1) *
_multi[nd] * _horizon_radius[nd] / _origin_vec.norm() *
52 _origin_vec * _node_vol[1 - nd] * _bond_status;
58 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
61 std::vector<dof_id_type> ivardofs(_nnodes);
63 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
64 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
67 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
69 std::vector<dof_id_type> dg_neighbors =
70 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
75 for (
unsigned int nb = 0; nb < dg_neighbors.size(); ++nb)
76 if (neighbors[dg_neighbors[nb]] != _current_elem->node_id(1 - nd) &&
77 _bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb]])) > 0.5)
79 ivardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])
80 ->dof_number(_sys.number(), _var.number(), 0);
81 origin_vec_nb = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb]]) -
82 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
83 node_vol_nb = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb]]);
85 for (
unsigned int i = 0; i < _nnodes; ++i)
86 _local_re(i) = (i == 0 ? -1 : 1) *
_multi[nd] * _horizon_radius[nd] /
87 origin_vec_nb.
norm() *
91 origin_vec_nb * node_vol_nb * _bond_status;
94 addResiduals(_assembly, _local_re, ivardofs, _var.scalingFactor());
98 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
99 for (
unsigned int i = 0; i < _save_in.size(); ++i)
101 std::vector<dof_id_type> save_in_dofs(_nnodes);
102 save_in_dofs[0] = _current_elem->node_ptr(nd)->dof_number(
103 _save_in[i]->sys().number(), _save_in[i]->number(), 0);
105 _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])
106 ->dof_number(_save_in[i]->sys().number(), _save_in[i]->number(), 0);
108 _save_in[i]->sys().solution().add_vector(_local_re, save_in_dofs);
118 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
120 std::vector<dof_id_type> ivardofs(_nnodes);
121 ivardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), _var.number(), 0);
122 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
123 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
126 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
128 std::vector<dof_id_type> dg_neighbors =
129 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
139 for (
unsigned int nb = 0; nb < dg_neighbors.size(); ++nb)
140 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb]])) > 0.5)
142 ivardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])
143 ->dof_number(_sys.number(), _var.number(), 0);
144 origin_vec_nb = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb]]) -
145 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
146 node_vol_nb = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb]]);
148 for (
unsigned int i = 0; i < _nnodes; ++i)
149 for (
unsigned int j = 0;
j < _nnodes; ++
j)
150 _local_ke(i,
j) = (i == 0 ? -1 : 1) * (
j == 0 ? 1 : 0) *
_multi[nd] *
151 _horizon_radius[nd] / origin_vec_nb.
norm() *
153 node_vol_nb * _bond_status;
155 addJacobian(_assembly, _local_ke, ivardofs, ivardofs, _var.scalingFactor());
165 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
171 std::vector<dof_id_type> ivardofs(_nnodes), jvardofs(_nnodes);
172 ivardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), _var.number(), 0);
173 jvardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), _var.number(), 0);
174 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
175 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
178 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
180 std::vector<dof_id_type> dg_neighbors =
181 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
186 for (
unsigned int nb1 = 0; nb1 < dg_neighbors.size(); ++nb1)
187 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb1]])) > 0.5)
189 ivardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb1]])
190 ->dof_number(_sys.number(), _var.number(), 0);
191 origin_vec_nb1 = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb1]]) -
192 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
193 node_vol_nb1 = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb1]]);
199 for (
unsigned int nb2 = 0; nb2 < dg_neighbors.size(); ++nb2)
200 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb2]])) > 0.5)
202 ivardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb2]])
203 ->dof_number(_sys.number(), _var.number(), 0);
204 vol_nb2 = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb2]]);
206 origin_vec_nb2 = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb2]]) -
207 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
210 for (
unsigned int i = 0; i < _dim; ++i)
212 _horizon_radius[nd] / origin_vec_nb2.
norm() * origin_vec_nb2(i) * vol_nb2;
214 dFdUk *=
_shape2[nd].inverse();
218 for (
unsigned int i = 0; i < 3; ++i)
219 for (
unsigned int j = 0;
j < 3; ++
j)
220 dJdU += detF * invF(
j, i) * dFdUk(i,
j);
223 dSdU = dSdFhat * dFdUk *
_dgrad_old[nd].inverse();
227 for (
unsigned int i = 0; i < 3; ++i)
228 for (
unsigned int J = 0; J < 3; ++J)
229 for (
unsigned int k = 0;
k < 3; ++
k)
230 for (
unsigned int L = 0; L < 3; ++L)
231 dinvFTdU(i, J) += -invF(J,
k) * invF(L, i) * dFdUk(
k, L);
237 for (
unsigned int i = 0; i < _nnodes; ++i)
238 for (
unsigned int j = 0;
j < _nnodes; ++
j)
239 _local_ke(i,
j) = (i == 0 ? -1 : 1) * (
j == 0 ? 0 : 1) *
_multi[nd] *
240 _horizon_radius[nd] / origin_vec_nb1.
norm() *
242 origin_vec_nb1 * node_vol_nb1 * _bond_status;
244 addJacobian(_assembly, _local_ke, ivardofs, jvardofs, _var.scalingFactor());
246 if (_has_diag_save_in)
248 unsigned int rows = _nnodes;
249 DenseVector<Real> diag(rows);
250 for (
unsigned int i = 0; i < rows; ++i)
251 diag(i) = _local_ke(i, i);
253 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
254 for (
unsigned int i = 0; i < _diag_save_in.size(); ++i)
256 std::vector<dof_id_type> diag_save_in_dofs(2);
257 diag_save_in_dofs[0] = _current_elem->node_ptr(nd)->dof_number(
258 _diag_save_in[i]->sys().number(), _diag_save_in[i]->number(), 0);
259 diag_save_in_dofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb2]])
260 ->dof_number(_diag_save_in[i]->sys().number(),
261 _diag_save_in[i]->number(),
264 _diag_save_in[i]->sys().solution().add_vector(diag, diag_save_in_dofs);
274 unsigned int jvar_num,
unsigned int coupled_component)
278 std::vector<RankTwoTensor> dSdT(_nnodes);
279 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
284 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
286 std::vector<dof_id_type> ivardofs(_nnodes), jvardofs(_nnodes);
287 ivardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), _var.number(), 0);
288 jvardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), jvar_num, 0);
289 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
290 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
293 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
295 std::vector<dof_id_type> dg_neighbors =
296 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
301 for (
unsigned int nb = 0; nb < dg_neighbors.size(); ++nb)
302 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb]])) > 0.5)
304 ivardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])
305 ->dof_number(_sys.number(), _var.number(), 0);
307 _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])->dof_number(_sys.number(), jvar_num, 0);
308 origin_vec_nb = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb]]) -
309 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
310 node_vol_nb = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb]]);
312 for (
unsigned int i = 0; i < _nnodes; ++i)
313 for (
unsigned int j = 0;
j < _nnodes; ++
j)
314 _local_ke(i,
j) = (i == 0 ? -1 : 1) * (
j == 0 ? 1 : 0) *
_multi[nd] *
315 _horizon_radius[nd] / origin_vec_nb.
norm() *
317 node_vol_nb * _bond_status;
319 addJacobian(_assembly, _local_ke, ivardofs, jvardofs, _var.scalingFactor());
328 std::vector<RankTwoTensor> dSdE33(_nnodes);
329 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
331 for (
unsigned int i = 0; i < 3; ++i)
332 for (
unsigned int j = 0;
j < 3; ++
j)
335 dSdE33[nd] =
_dgrad[nd].det() * dSdE33[nd] *
_dgrad[nd].inverse().transpose();
338 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
340 std::vector<dof_id_type> ivardofs(_nnodes), jvardofs(_nnodes);
341 ivardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), _var.number(), 0);
342 jvardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), jvar_num, 0);
343 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
344 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
347 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
349 std::vector<dof_id_type> dg_neighbors =
350 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
355 for (
unsigned int nb = 0; nb < dg_neighbors.size(); ++nb)
356 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb]])) > 0.5)
358 ivardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])
359 ->dof_number(_sys.number(), _var.number(), 0);
361 _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])->dof_number(_sys.number(), jvar_num, 0);
362 origin_vec_nb = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb]]) -
363 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
364 node_vol_nb = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb]]);
366 for (
unsigned int i = 0; i < _nnodes; ++i)
367 for (
unsigned int j = 0;
j < _nnodes; ++
j)
368 _local_ke(i,
j) = (i == 0 ? -1 : 1) * (
j == 0 ? 1 : 0) *
_multi[nd] *
369 _horizon_radius[nd] / origin_vec_nb.
norm() *
371 origin_vec_nb * node_vol_nb * _bond_status;
373 addJacobian(_assembly, _local_ke, ivardofs, jvardofs, _var.scalingFactor());
380 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
382 std::vector<dof_id_type> ivardofs(_nnodes), jvardofs(_nnodes);
383 ivardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), _var.number(), 0);
384 jvardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), jvar_num, 0);
385 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
386 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
389 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
391 std::vector<dof_id_type> dg_neighbors =
392 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
402 for (
unsigned int nb = 0; nb < dg_neighbors.size(); ++nb)
403 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb]])) > 0.5)
405 ivardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])
406 ->dof_number(_sys.number(), _var.number(), 0);
408 _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])->dof_number(_sys.number(), jvar_num, 0);
409 origin_vec_nb = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb]]) -
410 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
411 node_vol_nb = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb]]);
413 for (
unsigned int i = 0; i < _nnodes; ++i)
414 for (
unsigned int j = 0;
j < _nnodes; ++
j)
415 _local_ke(i,
j) = (i == 0 ? -1 : 1) * (
j == 0 ? 1 : 0) *
_multi[nd] *
416 _horizon_radius[nd] / origin_vec_nb.
norm() *
418 node_vol_nb * _bond_status;
420 addJacobian(_assembly, _local_ke, ivardofs, jvardofs, _var.scalingFactor());
429 unsigned int jvar_num,
unsigned int coupled_component)
441 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
448 std::vector<dof_id_type> ivardofs(_nnodes), jvardofs(_nnodes);
449 ivardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), _var.number(), 0);
450 jvardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), jvar_num, 0);
451 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
452 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
455 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
457 std::vector<dof_id_type> dg_neighbors =
458 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
463 for (
unsigned int nb1 = 0; nb1 < dg_neighbors.size(); ++nb1)
464 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb1]])) > 0.5)
466 ivardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb1]])
467 ->dof_number(_sys.number(), _var.number(), 0);
468 origin_vec_nb1 = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb1]]) -
469 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
470 node_vol_nb1 = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb1]]);
476 for (
unsigned int nb2 = 0; nb2 < dg_neighbors.size(); ++nb2)
477 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb2]])) >
480 jvardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb2]])
481 ->dof_number(_sys.number(), jvar_num, 0);
482 vol_nb2 = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb2]]);
484 origin_vec_nb2 = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb2]]) -
485 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
488 for (
unsigned int i = 0; i < _dim; ++i)
489 dFdUk(coupled_component, i) =
490 _horizon_radius[nd] / origin_vec_nb2.
norm() * origin_vec_nb2(i) * vol_nb2;
492 dFdUk *=
_shape2[nd].inverse();
496 for (
unsigned int i = 0; i < 3; ++i)
497 for (
unsigned int j = 0;
j < 3; ++
j)
498 dJdU += detF * invF(
j, i) * dFdUk(i,
j);
501 dSdU = dSdFhat * dFdUk *
_dgrad_old[nd].inverse();
505 for (
unsigned int i = 0; i < 3; ++i)
506 for (
unsigned int J = 0; J < 3; ++J)
507 for (
unsigned int k = 0;
k < 3; ++
k)
508 for (
unsigned int L = 0; L < 3; ++L)
509 dinvFTdU(i, J) += -invF(J,
k) * invF(L, i) * dFdUk(
k, L);
515 for (
unsigned int i = 0; i < _nnodes; ++i)
516 for (
unsigned int j = 0;
j < _nnodes; ++
j)
517 _local_ke(i,
j) = (i == 0 ? -1 : 1) * (
j == 0 ? 0 : 1) *
_multi[nd] *
518 _horizon_radius[nd] / origin_vec_nb1.
norm() *
520 origin_vec_nb1 * node_vol_nb1 * _bond_status;
522 addJacobian(_assembly, _local_ke, ivardofs, jvardofs, _var.scalingFactor());
RankFourTensor computeDSDFhat(unsigned int nd)
Function to compute derivative of stress with respect to derived deformation gradient.
Base kernel class for finite strain correspondence models.
const bool _temp_coupled
Temperature variable.
auto norm() const -> decltype(std::norm(Real()))
RankTwoTensor computeDinvFTDU(unsigned int component, unsigned int nd)
Function to compute derivative of deformation gradient inverse with respect to displacements.
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
const MaterialProperty< RankTwoTensor > & _dgrad_old
Material point based material property.
virtual RankTwoTensor computeDSDU(unsigned int component, unsigned int nd) override
Function to compute derivative of stress with respect to displacements for small strain problems...
Real computeDJDU(unsigned int component, unsigned int nd)
Function to compute derivative of determinant of deformation gradient with respect to displacements...
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
static const std::string k
void ErrorVector unsigned int
static InputParameters validParams()
const MaterialProperty< RankTwoTensor > & _dgrad