50 unsigned int coupled_component)
55 std::vector<RankTwoTensor> dSdT(_nnodes);
56 for (
unsigned int nd = 0; nd < _nnodes; nd++)
60 for (
unsigned int i = 0; i < _nnodes; ++i)
61 for (
unsigned int j = 0; j < _nnodes; ++j)
63 (i == j ? 1 : 0) * dSdT[i](2, 2) *
_weights[i] * _node_vol[i] * _bond_status;
69 for (
unsigned int i = 0; i < _nnodes; ++i)
70 for (
unsigned int j = 0; j < _nnodes; ++j)
71 _local_ke(i, j) += (i == j ? 1 : 0) *
computeDSDU(coupled_component, j)(2, 2) *
72 _weights[j] * _node_vol[j] * _bond_status;
78 unsigned int coupled_component)
86 for (
unsigned int nd = 0; nd < _nnodes; nd++)
91 std::vector<dof_id_type> jvardofs(_nnodes);
92 jvardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), jvar_num, 0);
93 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
94 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
96 dof_id_type nb_index =
97 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
99 std::vector<dof_id_type> dg_neighbors =
100 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
102 Real vol_nb, weight_nb;
103 RealGradient origin_vec_nb;
106 for (
unsigned int nb = 0; nb < dg_neighbors.size(); nb++)
107 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb]])) > 0.5)
110 _pdmesh.nodePtr(neighbors[dg_neighbors[nb]])->dof_number(_sys.number(), jvar_num, 0);
111 vol_nb = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb]]);
113 origin_vec_nb = _pdmesh.getNodeCoord(neighbors[dg_neighbors[nb]]) -
114 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
116 weight_nb = _horizon_radius[nd] / origin_vec_nb.norm();
119 for (
unsigned int i = 0; i < _dim; ++i)
120 dFdUk(coupled_component, i) = weight_nb * origin_vec_nb(i) * vol_nb;
128 _local_ke(nd, 1) = dPdUk(2, 2) *
_weights[nd] * _node_vol[nd] * _bond_status;
130 addJacobian(_assembly, _local_ke,
_ivardofs, jvardofs, _var.scalingFactor());