20 params.addClassDescription(
21 "Class for calculating residual and Jacobian for the Self-stabilized "
22 "Non-Ordinary State-based PeriDynamic (SNOSPD) formulation under finite "
23 "strain assumptions");
25 params.addRequiredParam<
unsigned int>(
27 "An integer corresponding to the variable this kernel acts on (0 for x, 1 for y, 2 for z)");
34 _dgrad_old(getMaterialPropertyOld<
RankTwoTensor>(
"deformation_gradient")),
35 _E_inc(getMaterialProperty<
RankTwoTensor>(
"strain_increment")),
36 _R_inc(getMaterialProperty<
RankTwoTensor>(
"rotation_increment")),
37 _component(getParam<unsigned int>(
"component"))
51 std::vector<Real> nodal_force_comp(_nnodes);
52 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
53 nodal_force_comp[nd] =
_multi[nd] *
57 (nd == 0 ? 1 : -1) * _origin_vec_ij;
59 _local_re(0) = -(nodal_force_comp[0] - nodal_force_comp[1]) * _bond_status_ij;
60 _local_re(1) = -_local_re(0);
67 std::vector<RankTwoTensor> dPxdUx(_nnodes);
68 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
73 for (_i = 0; _i < _test.size(); ++_i)
74 for (_j = 0; _j < _phi.size(); ++_j)
75 _local_ke(_i, _j) += (_i == 0 ? -1 : 1) *
_multi[_j] *
84 for (
unsigned int cur_nd = 0; cur_nd < _nnodes; ++cur_nd)
88 Real detF =
_dgrad[cur_nd].det();
90 std::vector<dof_id_type> dof(_nnodes);
91 dof[0] = _current_elem->node_ptr(cur_nd)->dof_number(_sys.number(), _var.number(), 0);
92 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(cur_nd));
94 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - cur_nd)) -
96 std::vector<dof_id_type> dg_neighbors =
97 _pdmesh.getDefGradNeighbors(_current_elem->node_id(cur_nd), nb);
98 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(cur_nd));
99 for (
unsigned int k = 0; k < dg_neighbors.size(); ++k)
101 Node * node_k = _pdmesh.nodePtr(neighbors[dg_neighbors[k]]);
102 dof[1] = node_k->dof_number(_sys.number(), _var.number(), 0);
103 Real vol_k = _pdmesh.getPDNodeVolume(neighbors[dg_neighbors[k]]);
106 RealGradient origin_vec_ijk = *node_k - *_pdmesh.nodePtr(_current_elem->node_id(cur_nd));
110 for (
unsigned int j = 0; j < _dim; ++j)
112 _horiz_rad[cur_nd] / origin_vec_ijk.norm() * origin_vec_ijk(j) * vol_k;
114 dFdUk *=
_shape2[cur_nd].inverse();
119 for (
unsigned int i = 0; i < 3; ++i)
120 for (
unsigned int J = 0; J < 3; ++J)
121 dJdU += detF * invF(J, i) * dFdUk(i, J);
129 for (
unsigned int i = 0; i < 3; ++i)
130 for (
unsigned int J = 0; J < 3; ++J)
131 for (
unsigned int k = 0; k < 3; ++k)
132 for (
unsigned int L = 0; L < 3; ++L)
133 dinvFTdU(i, J) += -invF(J, k) * invF(L, i) * dFdUk(k, L);
136 dPxdUkx = dJdU *
_stress[cur_nd] * invF.transpose() + detF * dSdU * invF.transpose() +
137 detF *
_stress[cur_nd] * dinvFTdU;
140 Real bond_status_ijk =
141 _bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[k]]));
143 _local_ke.resize(_test.size(), _phi.size());
145 for (_i = 0; _i < _test.size(); ++_i)
146 for (_j = 0; _j < _phi.size(); ++_j)
147 _local_ke(_i, _j) = (_i == 0 ? -1 : 1) * (_j == 0 ? 0 : 1) *
_multi[cur_nd] *
149 _origin_vec_ij * _bond_status_ij * bond_status_ijk;
151 _assembly.cacheJacobianBlock(_local_ke,
_ivardofs_ij, dof, _var.scalingFactor());
153 if (_has_diag_save_in)
155 unsigned int rows = _test.size();
156 DenseVector<Real> diag(rows);
157 for (
unsigned int i = 0; i < rows; ++i)
158 diag(i) = _local_ke(i, i);
160 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
161 for (
unsigned int i = 0; i < _diag_save_in.size(); ++i)
162 _diag_save_in[i]->sys().solution().add_vector(diag, _diag_save_in[i]->dofIndices());
172 if (coupled_component == 3)
174 std::vector<RankTwoTensor> dSdT(_nnodes);
175 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
178 _dgrad[nd].inverse().transpose();
180 for (_i = 0; _i < _test.size(); ++_i)
181 for (_j = 0; _j < _phi.size(); ++_j)
182 _local_ke(_i, _j) += (_i == 0 ? -1 : 1) *
_multi[_j] *
188 std::vector<RankTwoTensor> dPxdUy(_nnodes);
189 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
195 for (_i = 0; _i < _test.size(); ++_i)
196 for (_j = 0; _j < _phi.size(); ++_j)
197 _local_ke(_i, _j) += (_i == 0 ? -1 : 1) *
_multi[_j] *
205 unsigned int coupled_component)
207 if (coupled_component != 3 && coupled_component != 4)
209 for (
unsigned int cur_nd = 0; cur_nd < _nnodes; ++cur_nd)
213 Real detF =
_dgrad[cur_nd].det();
215 std::vector<dof_id_type> jvardofs_ijk(_nnodes);
216 jvardofs_ijk[0] = _current_elem->node_ptr(cur_nd)->dof_number(_sys.number(), jvar_num, 0);
217 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(cur_nd));
219 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - cur_nd)) -
221 std::vector<dof_id_type> dg_neighbors =
222 _pdmesh.getDefGradNeighbors(_current_elem->node_id(cur_nd), nb);
223 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(cur_nd));
224 for (
unsigned int k = 0; k < dg_neighbors.size(); ++k)
226 Node * node_k = _pdmesh.nodePtr(neighbors[dg_neighbors[k]]);
227 jvardofs_ijk[1] = node_k->dof_number(_sys.number(), jvar_num, 0);
228 Real vol_k = _pdmesh.getPDNodeVolume(neighbors[dg_neighbors[k]]);
231 RealGradient origin_vec_ijk = *node_k - *_pdmesh.nodePtr(_current_elem->node_id(cur_nd));
235 for (
unsigned int j = 0; j < _dim; ++j)
236 dFdUk(coupled_component, j) =
237 _horiz_rad[cur_nd] / origin_vec_ijk.norm() * origin_vec_ijk(j) * vol_k;
239 dFdUk *=
_shape2[cur_nd].inverse();
244 for (
unsigned int i = 0; i < 3; ++i)
245 for (
unsigned int J = 0; J < 3; ++J)
246 dJdU += detF * invF(J, i) * dFdUk(i, J);
254 for (
unsigned int i = 0; i < 3; ++i)
255 for (
unsigned int J = 0; J < 3; ++J)
256 for (
unsigned int k = 0; k < 3; ++k)
257 for (
unsigned int L = 0; L < 3; ++L)
258 dinvFTdU(i, J) += -invF(J, k) * invF(L, i) * dFdUk(k, L);
261 dPxdUky = dJdU *
_stress[cur_nd] * invF.transpose() + detF * dSdU * invF.transpose() +
262 detF *
_stress[cur_nd] * dinvFTdU;
265 Real bond_status_ijk =
266 _bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[k]]));
269 for (_i = 0; _i < _test.size(); ++_i)
270 for (_j = 0; _j < _phi.size(); ++_j)
271 _local_ke(_i, _j) = (_i == 0 ? -1 : 1) * (_j == 0 ? 0 : 1) *
_multi[cur_nd] *
273 _origin_vec_ij * _bond_status_ij * bond_status_ijk;
275 _assembly.cacheJacobianBlock(_local_ke,
_ivardofs_ij, jvardofs_ijk, _var.scalingFactor());
301 dSdU = DSDFhat * Tp3;
319 for (
unsigned int i = 0; i < 3; ++i)
320 for (
unsigned int j = 0; j < 3; ++j)
321 for (
unsigned int k = 0; k < 3; ++k)
322 for (
unsigned int l = 0; l < 3; ++l)
323 for (
unsigned int m = 0; m < 3; ++m)
324 for (
unsigned int n = 0; n < 3; ++n)
325 for (
unsigned int r = 0; r < 3; ++r)
328 (
_R_inc[nd](j, n) * (0.5 * I(k, m) * I(i, l) - I(m, l) *
_R_inc[nd](i, k) +
330 _R_inc[nd](i, m) * (0.5 * I(k, n) * I(j, l) - I(n, l) *
_R_inc[nd](j, k) +
342 for (
unsigned int k = 0; k < 3; ++k)
343 for (
unsigned int l = 0; l < 3; ++l)
344 for (
unsigned int m = 0; m < 3; ++m)
345 for (
unsigned int n = 0; n < 3; ++n)
346 Tp2(k, l, m, n) += -invFhat(k, m) * invFhat(n, l);
364 Real detF =
_dgrad[nd].det();
365 for (
unsigned int i = 0; i < 3; ++i)
366 for (
unsigned int J = 0; J < 3; ++J)
369 dJdU += detF * invF(J, i) *
_ddgraddu[nd](i, J);
371 dJdU += detF * invF(J, i) *
_ddgraddv[nd](i, J);
373 dJdU += detF * invF(J, i) *
_ddgraddw[nd](i, J);
451 dinvFTdU /=
_dgrad[nd].det();
452 for (
unsigned int i = 0; i < 3; ++i)
453 for (
unsigned int J = 0; J < 3; ++J)
454 for (
unsigned int k = 0; k < 3; ++k)
455 for (
unsigned int L = 0; L < 3; ++L)
458 dinvFTdU(i, J) -= invF(i, J) * invF(L, k) *
_ddgraddu[nd](k, L);
460 dinvFTdU(i, J) -= invF(i, J) * invF(L, k) *
_ddgraddv[nd](k, L);
462 dinvFTdU(i, J) -= invF(i, J) * invF(L, k) *
_ddgraddw[nd](k, L);