65 unsigned int jvar_num)
70 prepareMatrixTag(_assembly, _var.number(), jvar_num,
_ken);
71 prepareMatrixTag(_assembly, jvar_num, _var.number(),
_kne);
75 std::vector<RankTwoTensor> dSdE33(_nnodes);
76 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
77 for (
unsigned int i = 0; i < 3; ++i)
78 for (
unsigned int j = 0; j < 3; ++j)
81 for (
unsigned int i = 0; i < _nnodes; ++i)
82 for (
unsigned int j = 0; j < jvar.
order(); ++j)
83 _ken(i, j) += (i == j ? -1 : 1) *
84 (
_multi[0] * (dSdE33[0] *
_shape2[0].inverse()).row(component) +
85 _multi[1] * (dSdE33[1] *
_shape2[1].inverse()).row(component)) *
86 _origin_vec * _bond_status;
89 computeDSDU(component, 0)(2, 2) * _node_vol[0] * _dg_vol_frac[0] * _bond_status;
91 computeDSDU(component, 1)(2, 2) * _node_vol[1] * _dg_vol_frac[1] * _bond_status;
92 accumulateTaggedLocalMatrix(_assembly, _var.number(), jvar_num,
_ken);
93 accumulateTaggedLocalMatrix(_assembly, jvar_num, _var.number(),
_kne);
98 unsigned int jvar_num)
104 prepareMatrixTag(_assembly, _var.number(), jvar_num,
_ken);
105 prepareMatrixTag(_assembly, jvar_num, _var.number(),
_kne);
109 std::vector<RankTwoTensor> dSdE33(_nnodes);
110 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
111 for (
unsigned int i = 0; i < 3; ++i)
112 for (
unsigned int j = 0; j < 3; ++j)
115 for (
unsigned int i = 0; i < _nnodes; ++i)
116 for (
unsigned int j = 0; j < jvar.
order(); ++j)
117 _ken(i, j) += (i == j ? -1 : 1) *
118 (
_multi[0] * (dSdE33[0] *
_shape2[0].inverse()).row(component) +
119 _multi[1] * (dSdE33[1] *
_shape2[1].inverse()).row(component)) *
120 _origin_vec * _bond_status;
124 computeDSDU(component, 0)(2, 2) * _node_vol[0] * _dg_vol_frac[0] * _bond_status;
126 computeDSDU(component, 1)(2, 2) * _node_vol[1] * _dg_vol_frac[1] * _bond_status;
128 accumulateTaggedLocalMatrix(_assembly, _var.number(), jvar_num,
_ken);
129 accumulateTaggedLocalMatrix(_assembly, jvar_num, _var.number(),
_kne);
134 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
138 std::vector<dof_id_type> ivardofs(_nnodes);
139 ivardofs[0] = _current_elem->node_ptr(nd)->dof_number(_sys.number(), _var.number(), 0);
140 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(nd));
141 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(nd));
143 dof_id_type nb_index =
144 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - nd)) -
146 std::vector<dof_id_type> dg_neighbors =
147 _pdmesh.getBondDeformationGradientNeighbors(_current_elem->node_id(nd), nb_index);
150 RealGradient origin_vec_nb;
153 for (
unsigned int nb = 0; nb < dg_neighbors.size(); ++nb)
154 if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[nb]])) > 0.5)
156 Node * dgneighbor_nb = _pdmesh.nodePtr(neighbors[dg_neighbors[nb]]);
157 ivardofs[1] = dgneighbor_nb->dof_number(_sys.number(), _var.number(), 0);
158 vol_nb = _pdmesh.getNodeVolume(neighbors[dg_neighbors[nb]]);
161 origin_vec_nb = _pdmesh.getNodeCoord(dgneighbor_nb->id()) -
162 _pdmesh.getNodeCoord(_current_elem->node_id(nd));
165 for (
unsigned int i = 0; i < _dim; ++i)
166 dFdUk(component, i) =
167 _horizon_radius[nd] / origin_vec_nb.norm() * origin_vec_nb(i) * vol_nb;
174 _local_ke(0, 1) = dPdUk(2, 2) * _dg_vol_frac[nd] * _node_vol[nd] * _bond_status;
176 addJacobian(_assembly, _local_ke, jvar.
dofIndices(), ivardofs, _var.scalingFactor());
186 prepareMatrixTag(_assembly, jvar_num, _var.number(),
_kne);
190 std::vector<RankTwoTensor> dSdT(_nnodes);
191 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
195 _kne(0, 0) += dSdT[0](2, 2) * _dg_vol_frac[0] * _node_vol[0] * _bond_status;
196 _kne(0, 1) += dSdT[1](2, 2) * _dg_vol_frac[1] * _node_vol[1] * _bond_status;
197 accumulateTaggedLocalMatrix(_assembly, jvar_num, _var.number(),
_kne);