www.mooseframework.org
ComputeExternalGrainForceAndTorque.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
11 #include "GrainTrackerInterface.h"
12 
13 #include "libmesh/quadrature.h"
14 
16 
17 template <>
18 InputParameters
20 {
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");
27  return params;
28 }
29 
31  const InputParameters & parameters)
32  : DerivativeMaterialInterface<ShapeElementUserObject>(parameters),
34  _c_name(getVar("c", 0)->name()),
35  _c_var(coupled("c")),
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")),
41  _grain_tracker(getUserObject<GrainTrackerInterface>("grain_data")),
42  _vals_var(_op_num),
43  _vals_name(_op_num),
44  _dFdeta(_op_num)
45 {
46  for (unsigned int i = 0; i < _op_num; ++i)
47  {
48  _vals_var[i] = coupled("etas", i);
49  _vals_name[i] = getVar("etas", i)->name();
50  _dFdeta[i] = &getMaterialPropertyByName<std::vector<RealGradient>>(
51  derivativePropertyNameFirst(_dF_name, _vals_name[i]));
52  }
53 }
54 
55 void
57 {
59  _ncomp = 6 * _grain_num;
60 
61  _force_values.resize(_grain_num);
62  _torque_values.resize(_grain_num);
63  _force_torque_store.assign(_ncomp, 0.0);
64 
65  if (_fe_problem.currentlyComputingJacobian())
66  {
67  _total_dofs = _subproblem.es().n_dofs();
70 
71  for (unsigned int i = 0; i < _op_num; ++i)
73  }
74 }
75 
76 void
78 {
79  const auto & op_to_grains = _grain_tracker.getVarToFeatureVector(_current_elem->id());
80 
81  for (unsigned int i = 0; i < _grain_num; ++i)
82  for (unsigned int j = 0; j < _op_num; ++j)
83  if (i == op_to_grains[j])
84  {
85  const auto centroid = _grain_tracker.getGrainCentroid(i);
86  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
87  if (_dF[_qp][j](0) != 0.0 || _dF[_qp][j](1) != 0.0 || _dF[_qp][j](2) != 0.0)
88  {
89  const RealGradient compute_torque =
90  _JxW[_qp] * _coord[_qp] * (_current_elem->centroid() - centroid).cross(_dF[_qp][j]);
91  _force_torque_store[6 * i + 0] += _JxW[_qp] * _coord[_qp] * _dF[_qp][j](0);
92  _force_torque_store[6 * i + 1] += _JxW[_qp] * _coord[_qp] * _dF[_qp][j](1);
93  _force_torque_store[6 * i + 2] += _JxW[_qp] * _coord[_qp] * _dF[_qp][j](2);
94  _force_torque_store[6 * i + 3] += compute_torque(0);
95  _force_torque_store[6 * i + 4] += compute_torque(1);
96  _force_torque_store[6 * i + 5] += compute_torque(2);
97  }
98  }
99 }
100 
101 void
103 {
104  const auto & op_to_grains = _grain_tracker.getVarToFeatureVector(_current_elem->id());
105 
106  if (jvar == _c_var)
107  for (unsigned int i = 0; i < _grain_num; ++i)
108  for (unsigned int j = 0; j < _op_num; ++j)
109  if (i == op_to_grains[j])
110  {
111  const auto centroid = _grain_tracker.getGrainCentroid(i);
112  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
113  if (_dFdc[_qp][j](0) != 0.0 || _dFdc[_qp][j](1) != 0.0 || _dFdc[_qp][j](2) != 0.0)
114  {
115  const Real factor = _JxW[_qp] * _coord[_qp] * _phi[_j][_qp];
116  const RealGradient compute_torque_jacobian_c =
117  factor * (_current_elem->centroid() - centroid).cross(_dFdc[_qp][j]);
118  _force_torque_c_jacobian_store[(6 * i + 0) * _total_dofs + _j_global] +=
119  factor * _dFdc[_qp][j](0);
120  _force_torque_c_jacobian_store[(6 * i + 1) * _total_dofs + _j_global] +=
121  factor * _dFdc[_qp][j](1);
122  _force_torque_c_jacobian_store[(6 * i + 2) * _total_dofs + _j_global] +=
123  factor * _dFdc[_qp][j](2);
124  _force_torque_c_jacobian_store[(6 * i + 3) * _total_dofs + _j_global] +=
125  compute_torque_jacobian_c(0);
126  _force_torque_c_jacobian_store[(6 * i + 4) * _total_dofs + _j_global] +=
127  compute_torque_jacobian_c(1);
128  _force_torque_c_jacobian_store[(6 * i + 5) * _total_dofs + _j_global] +=
129  compute_torque_jacobian_c(2);
130  }
131  }
132 
133  for (unsigned int i = 0; i < _op_num; ++i)
134  if (jvar == _vals_var[i])
135  for (unsigned int j = 0; j < _grain_num; ++j)
136  for (unsigned int k = 0; k < _op_num; ++k)
137  if (j == op_to_grains[k])
138  {
139  const auto centroid = _grain_tracker.getGrainCentroid(j);
140  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
141  if ((*_dFdeta[i])[_qp][j](0) != 0.0 || (*_dFdeta[i])[_qp][j](1) != 0.0 ||
142  (*_dFdeta[i])[_qp][j](2) != 0.0)
143  {
144  const Real factor = _JxW[_qp] * _coord[_qp] * _phi[_j][_qp];
145  const RealGradient compute_torque_jacobian_eta =
146  factor * (_current_elem->centroid() - centroid).cross((*_dFdeta[i])[_qp][k]);
147  _force_torque_eta_jacobian_store[i][(6 * j + 0) * _total_dofs + _j_global] +=
148  factor * (*_dFdeta[i])[_qp][k](0);
149  _force_torque_eta_jacobian_store[i][(6 * j + 1) * _total_dofs + _j_global] +=
150  factor * (*_dFdeta[i])[_qp][k](1);
151  _force_torque_eta_jacobian_store[i][(6 * j + 2) * _total_dofs + _j_global] +=
152  factor * (*_dFdeta[i])[_qp][k](2);
153  _force_torque_eta_jacobian_store[i][(6 * j + 3) * _total_dofs + _j_global] +=
154  compute_torque_jacobian_eta(0);
155  _force_torque_eta_jacobian_store[i][(6 * j + 4) * _total_dofs + _j_global] +=
156  compute_torque_jacobian_eta(1);
157  _force_torque_eta_jacobian_store[i][(6 * j + 5) * _total_dofs + _j_global] +=
158  compute_torque_jacobian_eta(2);
159  }
160  }
161 }
162 
163 void
165 {
166  gatherSum(_force_torque_store);
167  for (unsigned int i = 0; i < _grain_num; ++i)
168  {
169  _force_values[i](0) = _force_torque_store[6 * i + 0];
170  _force_values[i](1) = _force_torque_store[6 * i + 1];
171  _force_values[i](2) = _force_torque_store[6 * i + 2];
172  _torque_values[i](0) = _force_torque_store[6 * i + 3];
173  _torque_values[i](1) = _force_torque_store[6 * i + 4];
174  _torque_values[i](2) = _force_torque_store[6 * i + 5];
175  }
176 
177  if (_fe_problem.currentlyComputingJacobian())
178  {
180  for (unsigned int i = 0; i < _op_num; ++i)
181  gatherSum(_force_torque_eta_jacobian_store[i]);
182  }
183 }
184 
185 void
187 {
189  static_cast<const ComputeExternalGrainForceAndTorque &>(y);
190  for (unsigned int i = 0; i < _ncomp; ++i)
192  if (_fe_problem.currentlyComputingJacobian())
193  {
194  for (unsigned int i = 0; i < _ncomp * _total_dofs; ++i)
196  for (unsigned int i = 0; i < _op_num; ++i)
197  for (unsigned int j = 0; j < _ncomp * _total_dofs; ++j)
199  }
200 }
201 
202 const std::vector<RealGradient> &
204 {
205  return _force_values;
206 }
207 
208 const std::vector<RealGradient> &
210 {
211  return _torque_values;
212 }
213 
214 const std::vector<Real> &
216 {
218 }
219 const std::vector<std::vector<Real>> &
221 {
223 }
GrainTrackerInterface
This class defines the interface for the GrainTracking objects.
Definition: GrainTrackerInterface.h:24
registerMooseObject
registerMooseObject("PhaseFieldApp", ComputeExternalGrainForceAndTorque)
ComputeExternalGrainForceAndTorque::executeJacobian
virtual void executeJacobian(unsigned int jvar)
Definition: ComputeExternalGrainForceAndTorque.C:102
ComputeExternalGrainForceAndTorque::_qp
unsigned int _qp
Definition: ComputeExternalGrainForceAndTorque.h:45
ComputeExternalGrainForceAndTorque::execute
virtual void execute()
Definition: ComputeExternalGrainForceAndTorque.C:77
libMesh::RealGradient
VectorValue< Real > RealGradient
Definition: GrainForceAndTorqueInterface.h:17
ComputeExternalGrainForceAndTorque::getForceCJacobians
virtual const std::vector< Real > & getForceCJacobians() const
Definition: ComputeExternalGrainForceAndTorque.C:215
ComputeExternalGrainForceAndTorque::_force_torque_store
std::vector< Real > _force_torque_store
vector storing grain force and torque values
Definition: ComputeExternalGrainForceAndTorque.h:70
ComputeExternalGrainForceAndTorque::getForceEtaJacobians
virtual const std::vector< std::vector< Real > > & getForceEtaJacobians() const
Definition: ComputeExternalGrainForceAndTorque.C:220
ComputeExternalGrainForceAndTorque::_c_var
unsigned int _c_var
Definition: ComputeExternalGrainForceAndTorque.h:48
ComputeExternalGrainForceAndTorque::getTorqueValues
virtual const std::vector< RealGradient > & getTorqueValues() const
Definition: ComputeExternalGrainForceAndTorque.C:209
ComputeExternalGrainForceAndTorque::_total_dofs
unsigned int _total_dofs
Definition: ComputeExternalGrainForceAndTorque.h:75
ComputeExternalGrainForceAndTorque::initialize
virtual void initialize()
Definition: ComputeExternalGrainForceAndTorque.C:56
ComputeExternalGrainForceAndTorque::_grain_tracker
const GrainTrackerInterface & _grain_tracker
provide UserObject for calculating grain volumes and centers
Definition: ComputeExternalGrainForceAndTorque.h:57
ComputeExternalGrainForceAndTorque::getForceValues
virtual const std::vector< RealGradient > & getForceValues() const
Definition: ComputeExternalGrainForceAndTorque.C:203
GrainTrackerInterface::getTotalFeatureCount
virtual std::size_t getTotalFeatureCount() const =0
Returns a number large enough to contain the largest ID for all grains in use.
GrainTrackerInterface::getVarToFeatureVector
virtual const std::vector< unsigned int > & getVarToFeatureVector(dof_id_type elem_id) const =0
Returns a list of active unique feature ids for a particular element.
ComputeExternalGrainForceAndTorque::ComputeExternalGrainForceAndTorque
ComputeExternalGrainForceAndTorque(const InputParameters &parameters)
Definition: ComputeExternalGrainForceAndTorque.C:30
ComputeExternalGrainForceAndTorque::_vals_name
std::vector< VariableName > _vals_name
Definition: ComputeExternalGrainForceAndTorque.h:62
ComputeExternalGrainForceAndTorque::_dF_name
MaterialPropertyName _dF_name
material property that provides force density
Definition: ComputeExternalGrainForceAndTorque.h:50
ComputeExternalGrainForceAndTorque::_grain_num
unsigned int _grain_num
Definition: ComputeExternalGrainForceAndTorque.h:58
ComputeExternalGrainForceAndTorque
This class is here to get the force and torque acting on a grain.
Definition: ComputeExternalGrainForceAndTorque.h:26
name
const std::string name
Definition: Setup.h:21
GrainTrackerInterface.h
ComputeExternalGrainForceAndTorque::_force_torque_eta_jacobian_store
std::vector< std::vector< Real > > _force_torque_eta_jacobian_store
Definition: ComputeExternalGrainForceAndTorque.h:73
ComputeExternalGrainForceAndTorque::_torque_values
std::vector< RealGradient > _torque_values
Definition: ComputeExternalGrainForceAndTorque.h:67
ComputeExternalGrainForceAndTorque::_op_num
const unsigned int _op_num
no. of order parameters
Definition: ComputeExternalGrainForceAndTorque.h:55
ComputeExternalGrainForceAndTorque::_force_torque_c_jacobian_store
std::vector< Real > _force_torque_c_jacobian_store
vector storing jacobian of grain force and torque values
Definition: ComputeExternalGrainForceAndTorque.h:72
ComputeExternalGrainForceAndTorque::finalize
virtual void finalize()
Definition: ComputeExternalGrainForceAndTorque.C:164
ComputeExternalGrainForceAndTorque::_dFdc
const MaterialProperty< std::vector< RealGradient > > & _dFdc
material property that provides jacobian of force density with respect to c
Definition: ComputeExternalGrainForceAndTorque.h:53
ComputeExternalGrainForceAndTorque.h
ComputeExternalGrainForceAndTorque::_vals_var
std::vector< unsigned int > _vals_var
Definition: ComputeExternalGrainForceAndTorque.h:61
validParams< ComputeExternalGrainForceAndTorque >
InputParameters validParams< ComputeExternalGrainForceAndTorque >()
Definition: ComputeExternalGrainForceAndTorque.C:19
GrainTrackerInterface::getGrainCentroid
virtual Point getGrainCentroid(unsigned int grain_id) const =0
Returns the centroid for the given grain number.
ComputeExternalGrainForceAndTorque::_dFdeta
std::vector< const MaterialProperty< std::vector< RealGradient > > * > _dFdeta
Definition: ComputeExternalGrainForceAndTorque.h:63
ComputeExternalGrainForceAndTorque::threadJoin
virtual void threadJoin(const UserObject &y)
Definition: ComputeExternalGrainForceAndTorque.C:186
ComputeExternalGrainForceAndTorque::_force_values
std::vector< RealGradient > _force_values
providing grain forces, torques and their jacobians w. r. t c
Definition: ComputeExternalGrainForceAndTorque.h:66
ComputeExternalGrainForceAndTorque::_ncomp
unsigned int _ncomp
Definition: ComputeExternalGrainForceAndTorque.h:59
ComputeExternalGrainForceAndTorque::_dF
const MaterialProperty< std::vector< RealGradient > > & _dF
Definition: ComputeExternalGrainForceAndTorque.h:51
GrainForceAndTorqueInterface
This class provides interface for extracting the forces and torques computed in other UserObjects.
Definition: GrainForceAndTorqueInterface.h:24