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));
63 dof_id_type nb_index =
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);
69 RealGradient origin_vec_nb;
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));
120 dof_id_type nb_index =
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);
126 RealGradient origin_vec_nb;
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));
165 dof_id_type nb_index =
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);
171 RealGradient origin_vec_nb1;
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]]);
184 RealGradient origin_vec_nb2;
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;
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));
259 dof_id_type nb_index =
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);
265 RealGradient origin_vec_nb;
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));
309 dof_id_type nb_index =
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);
315 RealGradient origin_vec_nb;
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));
351 dof_id_type nb_index =
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);
357 RealGradient origin_vec_nb;
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));
410 dof_id_type nb_index =
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);
416 RealGradient origin_vec_nb1;
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]]);
429 RealGradient origin_vec_nb2;
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;
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());