76 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
80 Real detF =
_dgrad[nd].det();
82 std::vector<dof_id_type> ivardofs(_nnodes);
83 ivardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), _var.number(), 0);
84 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
85 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
87 dof_id_type nb_index =
88 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
90 std::vector<dof_id_type> dg_neighbors =
91 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
94 RealGradient origin_vec_nb;
97 for (
unsigned int nb = 0; nb < dg_neighbors.size(); ++nb)
98 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb]])) > 0.5)
100 ivardofs[1] = _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])
101 ->dof_number(_sys.number(), _var.number(), 0);
102 vol_nb = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb]]);
104 origin_vec_nb = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb]]) -
105 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
108 for (
unsigned int i = 0; i < _dim; ++i)
110 _horizon_radius[nd] / origin_vec_nb.norm() * origin_vec_nb(i) * vol_nb;
116 for (
unsigned int i = 0; i < 3; ++i)
117 for (
unsigned int j = 0; j < 3; ++j)
118 dJdU += detF * invF(j, i) * dFdUk(i, j);
125 for (
unsigned int i = 0; i < 3; ++i)
126 for (
unsigned int J = 0; J < 3; ++J)
127 for (
unsigned int k = 0; k < 3; ++k)
128 for (
unsigned int L = 0; L < 3; ++L)
129 dinvFTdU(i, J) += -invF(J, k) * invF(L, i) * dFdUk(k, L);
135 for (
unsigned int i = 0; i < _nnodes; ++i)
136 for (
unsigned int j = 0; j < _nnodes; ++j)
137 _local_ke(i, j) = (i == 0 ? -1 : 1) * (j == 0 ? 0 : 1) *
_multi[nd] *
141 addJacobian(_assembly, _local_ke,
_ivardofs, ivardofs, _var.scalingFactor());
143 if (_has_diag_save_in)
145 unsigned int rows = _nnodes;
146 DenseVector<Real> diag(rows);
147 for (
unsigned int i = 0; i < rows; ++i)
148 diag(i) = _local_ke(i, i);
150 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
151 for (
unsigned int i = 0; i < _diag_save_in.size(); ++i)
153 std::vector<dof_id_type> diag_save_in_dofs(2);
154 diag_save_in_dofs[0] = _current_elem->node_ptr(nd)->dof_number(
155 _diag_save_in[i]->sys().number(), _diag_save_in[i]->number(), 0);
156 diag_save_in_dofs[1] =
157 _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])
158 ->dof_number(_diag_save_in[i]->sys().number(), _diag_save_in[i]->number(), 0);
160 _diag_save_in[i]->sys().solution().add_vector(diag, diag_save_in_dofs);
169 unsigned int jvar_num,
unsigned int coupled_component)
174 std::vector<RankTwoTensor> dSdT(_nnodes);
175 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
178 _dgrad[nd].inverse().transpose();
180 for (
unsigned int i = 0; i < _nnodes; ++i)
181 for (
unsigned int j = 0; j < _nnodes; ++j)
182 _local_ke(i, j) += (i == 0 ? -1 : 1) *
_multi[j] *
190 std::vector<RankTwoTensor> dSdE33(_nnodes);
191 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
193 for (
unsigned int i = 0; i < 3; ++i)
194 for (
unsigned int j = 0; j < 3; ++j)
197 dSdE33[nd] =
_dgrad[nd].det() * dSdE33[nd] *
_dgrad[nd].inverse().transpose();
200 for (
unsigned int i = 0; i < _nnodes; ++i)
201 for (
unsigned int j = 0; j < _nnodes; ++j)
202 _local_ke(i, j) += (i == 0 ? -1 : 1) *
_multi[j] *
208 std::vector<RankTwoTensor> dPxdUy(_nnodes);
209 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
215 for (
unsigned int i = 0; i < _nnodes; ++i)
216 for (
unsigned int j = 0; j < _nnodes; ++j)
217 _local_ke(i, j) += (i == 0 ? -1 : 1) *
_multi[j] *
225 unsigned int jvar_num,
unsigned int coupled_component)
237 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
241 Real detF =
_dgrad[nd].det();
243 std::vector<dof_id_type> jvardofs(_nnodes);
244 jvardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), jvar_num, 0);
245 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
246 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
248 dof_id_type nb_index =
249 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
251 std::vector<dof_id_type> dg_neighbors =
252 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
255 RealGradient origin_vec_nb;
258 for (
unsigned int nb = 0; nb < dg_neighbors.size(); ++nb)
259 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb]])) > 0.5)
262 _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])->dof_number(_sys.number(), jvar_num, 0);
263 vol_nb = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb]]);
265 origin_vec_nb = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb]]) -
266 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
269 for (
unsigned int i = 0; i < _dim; ++i)
270 dFdUk(coupled_component, i) =
271 _horizon_radius[nd] / origin_vec_nb.norm() * origin_vec_nb(i) * vol_nb;
277 for (
unsigned int i = 0; i < 3; ++i)
278 for (
unsigned int j = 0; j < 3; ++j)
279 dJdU += detF * invF(j, i) * dFdUk(i, j);
286 for (
unsigned int i = 0; i < 3; ++i)
287 for (
unsigned int J = 0; J < 3; ++J)
288 for (
unsigned int k = 0; k < 3; ++k)
289 for (
unsigned int L = 0; L < 3; ++L)
290 dinvFTdU(i, J) += -invF(J, k) * invF(L, i) * dFdUk(k, L);
296 for (
unsigned int i = 0; i < _nnodes; ++i)
297 for (
unsigned int j = 0; j < _nnodes; ++j)
298 _local_ke(i, j) = (i == 0 ? -1 : 1) * (j == 0 ? 0 : 1) *
_multi[nd] *
302 addJacobian(_assembly, _local_ke,
_ivardofs, jvardofs, _var.scalingFactor());