11 #include "MooseVariableScalar.h"
13 #include "RankTwoTensor.h"
14 #include "RankFourTensor.h"
23 params.addClassDescription(
24 "Class for calculating off-diagonal Jacobian corresponding to "
25 "coupling between displacements (or temperature) with scalar out-of-plane strain for "
26 "generalized plane strain using SNOSPD formulation");
28 params.addCoupledVar(
"scalar_out_of_plane_strain",
29 "Scalar variable for strain in the out-of-plane direction");
35 const InputParameters & parameters)
37 _scalar_out_of_plane_strain_var_num(coupledScalar(
"scalar_out_of_plane_strain"))
41 mooseError(
"GeneralizedPlaneStrain only works for two dimensional models!");
51 if (_var.number() ==
_disp_var[0]->number())
52 if (_use_full_jacobian)
56 else if (_var.number() ==
_disp_var[1]->number())
57 if (_use_full_jacobian)
68 unsigned int jvar_num)
73 DenseMatrix<Number> & ken = _assembly.jacobianBlock(_var.number(), jvar_num);
74 DenseMatrix<Number> & kne = _assembly.jacobianBlock(jvar_num, _var.number());
75 MooseVariableScalar & jvar = _sys.getScalarVariable(_tid, jvar_num);
78 std::vector<RankTwoTensor> dSdE33(_nnodes);
79 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
80 for (
unsigned int i = 0; i < 3; ++i)
81 for (
unsigned int j = 0; j < 3; ++j)
84 for (_i = 0; _i < _test.size(); ++_i)
85 for (_j = 0; _j < jvar.order(); ++_j)
86 ken(_i, _j) += (_i == _j ? -1 : 1) *
89 _origin_vec_ij * _bond_status_ij;
99 unsigned int jvar_num)
105 DenseMatrix<Number> & ken = _assembly.jacobianBlock(_var.number(), jvar_num);
106 DenseMatrix<Number> & kne = _assembly.jacobianBlock(jvar_num, _var.number());
107 MooseVariableScalar & jvar = _sys.getScalarVariable(_tid, jvar_num);
110 std::vector<RankTwoTensor> dSdE33(_nnodes);
111 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
112 for (
unsigned int i = 0; i < 3; ++i)
113 for (
unsigned int j = 0; j < 3; ++j)
116 for (_i = 0; _i < _test.size(); ++_i)
117 for (_j = 0; _j < jvar.order(); ++_j)
118 ken(_i, _j) += (_i == _j ? -1 : 1) *
121 _origin_vec_ij * _bond_status_ij;
132 for (
unsigned int cur_nd = 0; cur_nd < _nnodes; ++cur_nd)
136 std::vector<dof_id_type> ivardofs(_nnodes);
137 ivardofs[0] = _current_elem->node_ptr(cur_nd)->dof_number(_sys.number(), _var.number(), 0);
138 std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(_current_elem->node_id(cur_nd));
140 std::find(neighbors.begin(), neighbors.end(), _current_elem->node_id(1 - cur_nd)) -
142 std::vector<dof_id_type> dg_neighbors =
143 _pdmesh.getDefGradNeighbors(_current_elem->node_id(cur_nd), nb);
144 std::vector<dof_id_type> bonds = _pdmesh.getBonds(_current_elem->node_id(cur_nd));
145 for (
unsigned int k = 0; k < dg_neighbors.size(); ++k)
147 Node * node_k = _pdmesh.nodePtr(neighbors[dg_neighbors[k]]);
148 ivardofs[1] = node_k->dof_number(_sys.number(), _var.number(), 0);
149 Real vol_k = _pdmesh.getPDNodeVolume(neighbors[dg_neighbors[k]]);
152 RealGradient origin_vec_ijk = *node_k - *_pdmesh.nodePtr(_current_elem->node_id(cur_nd));
156 for (
unsigned int j = 0; j < _dim; ++j)
158 _horiz_rad[cur_nd] / origin_vec_ijk.norm() * origin_vec_ijk(j) * vol_k;
160 dFdUk *=
_shape2[cur_nd].inverse();
165 Real bond_status_ijk =
166 _bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[k]]));
168 _local_ke.resize(ken.n(), ken.m());
170 _local_ke(0, 1) = dPdUk(2, 2) * _dg_vol_frac_ij[cur_nd] * _vols_ij[cur_nd] * _bond_status_ij *
173 _assembly.cacheJacobianBlock(_local_ke, jvar.dofIndices(), ivardofs, _var.scalingFactor());
183 DenseMatrix<Number> & kne = _assembly.jacobianBlock(jvar_num, _var.number());
187 std::vector<RankTwoTensor> dSdT(_nnodes);
188 for (
unsigned int nd = 0; nd < _nnodes; ++nd)
192 kne(0, 0) += dSdT[0](2, 2) * _dg_vol_frac_ij[0] * _vols_ij[0] * _bond_status_ij;
193 kne(0, 1) += dSdT[1](2, 2) * _dg_vol_frac_ij[1] * _vols_ij[1] * _bond_status_ij;