13 #include "libmesh/quadrature.h"
21 InputParameters params = validParams<ShapeElementUserObject>();
22 params.addClassDescription(
"Userobject for calculating force and torque acting on a grain");
23 params.addParam<MaterialPropertyName>(
"force_density",
"force_density",
"Force density material");
24 params.addParam<UserObjectName>(
"grain_data",
"center of mass of grains");
25 params.addCoupledVar(
"c",
"Concentration field");
26 params.addCoupledVar(
"etas",
"Array of coupled order parameters");
31 : DerivativeMaterialInterface<ShapeElementUserObject>(parameters),
33 _c_name(getVar(
"c", 0)->
name()),
35 _dF_name(getParam<MaterialPropertyName>(
"force_density")),
36 _dF(getMaterialPropertyByName<std::vector<
RealGradient>>(_dF_name)),
37 _dFdc(getMaterialPropertyByName<std::vector<
RealGradient>>(
38 derivativePropertyNameFirst(_dF_name, _c_name))),
39 _op_num(coupledComponents(
"etas")),
45 for (
unsigned int i = 0; i <
_op_num; ++i)
49 _dFdgradeta[i] = &getMaterialPropertyByName<std::vector<Real>>(
64 if (_fe_problem.currentlyComputingJacobian())
70 for (
unsigned int i = 0; i <
_op_num; ++i)
81 for (
unsigned int j = 0; j <
_op_num; ++j)
82 if (i == op_to_grains[j])
85 for (
_qp = 0;
_qp < _qrule->n_points(); ++
_qp)
89 _JxW[
_qp] * _coord[
_qp] * (_current_elem->centroid() - centroid).cross(
_dF[
_qp][j]);
107 for (
unsigned int j = 0; j <
_op_num; ++j)
108 if (i == op_to_grains[j])
111 for (
_qp = 0;
_qp < _qrule->n_points(); ++
_qp)
114 const Real factor = _JxW[
_qp] * _coord[
_qp] * _phi[_j][
_qp];
116 factor * (_current_elem->centroid() - centroid).cross(
_dFdc[
_qp][j]);
124 compute_torque_jacobian_c(0);
126 compute_torque_jacobian_c(1);
128 compute_torque_jacobian_c(2);
132 for (
unsigned int i = 0; i <
_op_num; ++i)
135 for (
unsigned int k = 0; k <
_op_num; ++k)
136 if (j == op_to_grains[k])
139 for (
_qp = 0;
_qp < _qrule->n_points(); ++
_qp)
144 factor * (_current_elem->centroid() - centroid).cross(_grad_phi[_j][
_qp]);
146 factor * _grad_phi[_j][
_qp](0);
148 factor * _grad_phi[_j][
_qp](1);
150 factor * _grad_phi[_j][
_qp](2);
152 compute_torque_jacobian_eta(0);
154 compute_torque_jacobian_eta(1);
156 compute_torque_jacobian_eta(2);
175 if (_fe_problem.currentlyComputingJacobian())
178 for (
unsigned int i = 0; i <
_op_num; ++i)
187 for (
unsigned int i = 0; i <
_ncomp; ++i)
189 if (_fe_problem.currentlyComputingJacobian())
193 for (
unsigned int i = 0; i <
_op_num; ++i)
199 const std::vector<RealGradient> &
205 const std::vector<RealGradient> &
211 const std::vector<Real> &
216 const std::vector<std::vector<Real>> &