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 const InputParameters & parameters)
32 : DerivativeMaterialInterface<ShapeElementUserObject>(parameters),
34 _c_name(getVar(
"c", 0)->
name()),
36 _dF_name(getParam<MaterialPropertyName>(
"force_density")),
37 _dF(getMaterialPropertyByName<std::vector<
RealGradient>>(_dF_name)),
38 _dFdc(getMaterialPropertyByName<std::vector<
RealGradient>>(
39 derivativePropertyNameFirst(_dF_name, _c_name))),
40 _op_num(coupledComponents(
"etas")),
46 for (
unsigned int i = 0; i <
_op_num; ++i)
50 _dFdeta[i] = &getMaterialPropertyByName<std::vector<RealGradient>>(
65 if (_fe_problem.currentlyComputingJacobian())
71 for (
unsigned int i = 0; i <
_op_num; ++i)
82 for (
unsigned int j = 0; j <
_op_num; ++j)
83 if (i == op_to_grains[j])
86 for (
_qp = 0;
_qp < _qrule->n_points(); ++
_qp)
90 _JxW[
_qp] * _coord[
_qp] * (_current_elem->centroid() - centroid).cross(
_dF[
_qp][j]);
108 for (
unsigned int j = 0; j <
_op_num; ++j)
109 if (i == op_to_grains[j])
112 for (
_qp = 0;
_qp < _qrule->n_points(); ++
_qp)
115 const Real factor = _JxW[
_qp] * _coord[
_qp] * _phi[_j][
_qp];
117 factor * (_current_elem->centroid() - centroid).cross(
_dFdc[
_qp][j]);
125 compute_torque_jacobian_c(0);
127 compute_torque_jacobian_c(1);
129 compute_torque_jacobian_c(2);
133 for (
unsigned int i = 0; i <
_op_num; ++i)
136 for (
unsigned int k = 0; k <
_op_num; ++k)
137 if (j == op_to_grains[k])
140 for (
_qp = 0;
_qp < _qrule->n_points(); ++
_qp)
144 const Real factor = _JxW[
_qp] * _coord[
_qp] * _phi[_j][
_qp];
146 factor * (_current_elem->centroid() - centroid).cross((*
_dFdeta[i])[
_qp][k]);
154 compute_torque_jacobian_eta(0);
156 compute_torque_jacobian_eta(1);
158 compute_torque_jacobian_eta(2);
177 if (_fe_problem.currentlyComputingJacobian())
180 for (
unsigned int i = 0; i <
_op_num; ++i)
189 static_cast<const ComputeExternalGrainForceAndTorque &>(y);
190 for (
unsigned int i = 0; i <
_ncomp; ++i)
192 if (_fe_problem.currentlyComputingJacobian())
196 for (
unsigned int i = 0; i <
_op_num; ++i)
202 const std::vector<RealGradient> &
208 const std::vector<RealGradient> &
214 const std::vector<Real> &
219 const std::vector<std::vector<Real>> &