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));
66 dof_id_type nb_index =
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);
72 RealGradient origin_vec_nb;
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));
125 dof_id_type nb_index =
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);
136 RealGradient origin_vec_nb;
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)
169 Real detF =
_dgrad[nd].det();
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));
177 dof_id_type nb_index =
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);
183 RealGradient origin_vec_nb1;
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]]);
196 RealGradient origin_vec_nb2;
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;
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);
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)
282 _dgrad[nd].inverse().transpose();
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));
292 dof_id_type nb_index =
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);
298 RealGradient origin_vec_nb;
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));
346 dof_id_type nb_index =
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);
352 RealGradient origin_vec_nb;
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));
388 dof_id_type nb_index =
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);
399 RealGradient origin_vec_nb;
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)
445 Real detF =
_dgrad[nd].det();
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));
454 dof_id_type nb_index =
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);
460 RealGradient origin_vec_nb1;
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]]);
473 RealGradient origin_vec_nb2;
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;
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);
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());