www.mooseframework.org
MultiGrainRigidBodyMotion.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 
12 // MOOSE includes
13 #include "GrainTrackerInterface.h"
14 #include "MooseVariable.h"
15 
17 
20 {
22  params.addClassDescription("Adds rigid body motion to grains");
23  return params;
24 }
25 
27  : GrainRigidBodyMotionBase(parameters)
28 {
29 }
30 
31 Real
33 {
34  return _velocity_advection * _grad_c[_qp] * _test[_i][_qp];
35 }
36 
37 Real
39 {
40  if (_var.number() == _c_var) // Requires c jacobian
41  return _velocity_advection * _grad_phi[_j][_qp] * _test[_i][_qp] +
43 
44  return 0.0;
45 }
46 
47 Real
49 {
50  if (jvar == _c_var) // Requires c jacobian
51  return _velocity_advection * _grad_phi[_j][_qp] * _test[_i][_qp] +
53  else
55 }
56 
58 {
59  if (_var.number() == _c_var) // Requires c jacobian
61 
62  return 0.0;
63 }
64 
65 Real
67  dof_id_type /* dof_index */)
68 {
70 }
71 
72 void
74 {
76 
77  for (MooseIndex(_grain_ids) i = 0; i < _grain_ids.size(); ++i)
78  {
79  auto grain_id = _grain_ids[i];
80  if (grain_id != FeatureFloodCount::invalid_id)
81  {
82  mooseAssert(grain_id < _grain_volumes.size(), "grain_id out of bounds");
83  const auto volume = _grain_volumes[grain_id];
84  const auto centroid = _grain_tracker.getGrainCentroid(grain_id);
85  RealGradient force_jacobian;
86  RealGradient torque_jacobian;
87 
88  if (jvar == _c_var)
89  {
90  force_jacobian(0) = _grain_force_c_jacobians[(6 * grain_id + 0) * _total_dofs + dof_index];
91  force_jacobian(1) = _grain_force_c_jacobians[(6 * grain_id + 1) * _total_dofs + dof_index];
92  force_jacobian(2) = _grain_force_c_jacobians[(6 * grain_id + 2) * _total_dofs + dof_index];
93  torque_jacobian(0) = _grain_force_c_jacobians[(6 * grain_id + 3) * _total_dofs + dof_index];
94  torque_jacobian(1) = _grain_force_c_jacobians[(6 * grain_id + 4) * _total_dofs + dof_index];
95  torque_jacobian(2) = _grain_force_c_jacobians[(6 * grain_id + 5) * _total_dofs + dof_index];
96  }
97 
98  for (unsigned int jvar_index = 0; jvar_index < _op_num; ++jvar_index)
99  if (jvar == _vals_var[jvar_index])
100  {
101  force_jacobian(0) =
102  _grain_force_eta_jacobians[jvar_index][(6 * grain_id + 0) * _total_dofs + dof_index];
103  force_jacobian(1) =
104  _grain_force_eta_jacobians[jvar_index][(6 * grain_id + 1) * _total_dofs + dof_index];
105  force_jacobian(2) =
106  _grain_force_eta_jacobians[jvar_index][(6 * grain_id + 2) * _total_dofs + dof_index];
107  torque_jacobian(0) =
108  _grain_force_eta_jacobians[jvar_index][(6 * grain_id + 3) * _total_dofs + dof_index];
109  torque_jacobian(1) =
110  _grain_force_eta_jacobians[jvar_index][(6 * grain_id + 4) * _total_dofs + dof_index];
111  torque_jacobian(2) =
112  _grain_force_eta_jacobians[jvar_index][(6 * grain_id + 5) * _total_dofs + dof_index];
113  }
114 
115  const auto force_jac = _mt / volume * force_jacobian;
116  const auto torque_jac =
117  _mr / volume * torque_jacobian.cross(_current_elem->vertex_average() - centroid);
118 
119  _velocity_advection_jacobian += (force_jac + torque_jac);
120  }
121  }
122 }
123 
124 void
126 {
127  _velocity_advection = 0.0;
129 
130  for (MooseIndex(_grain_ids) i = 0; i < _grain_ids.size(); ++i)
131  {
132  auto grain_id = _grain_ids[i];
133  if (grain_id != FeatureFloodCount::invalid_id)
134  {
135  mooseAssert(grain_id < _grain_volumes.size(), "grain_id out of bounds");
136  const auto volume = _grain_volumes[grain_id];
137  const auto centroid = _grain_tracker.getGrainCentroid(grain_id);
138  const auto force = _mt / volume * _grain_forces[grain_id];
139  const auto torque =
140  _mr / volume *
141  (_grain_torques[grain_id].cross(_current_elem->vertex_average() - centroid));
142 
143  _velocity_advection += (force + torque);
144  }
145  }
146 }
const unsigned int _op_num
no. of order parameters
static InputParameters validParams()
MooseVariable & _var
unsigned int number() const
const VariablePhiGradient & _grad_phi
RealGradient _velocity_advection
storing the advection velocity and corresponding jacobian entries calculated in userobjects ...
static InputParameters validParams()
virtual Real computeQpNonlocalJacobian(dof_id_type)
virtual Real computeQpOffDiagJacobian(unsigned int)
const Real _mr
constant value corresponding to grain rotation
const VariableGradient & _grad_c
Variable gradient for the concentration.
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.
MultiGrainRigidBodyMotion(const InputParameters &parameters)
const VariableTestValue & _test
std::vector< unsigned int > _grain_ids
obtain the active grain ids
const std::vector< unsigned int > _vals_var
const std::vector< std::vector< Real > > & _grain_force_eta_jacobians
const VectorPostprocessorValue & _grain_volumes
The grain volumes.
const std::vector< RealGradient > & _grain_torques
virtual Point getGrainCentroid(unsigned int grain_id) const =0
Returns the centroid for the given grain number.
const std::vector< RealGradient > & _grain_forces
unsigned int _i
static const unsigned int invalid_id
TypeVector< typename CompareTypes< Real, T2 >::supertype > cross(const TypeVector< T2 > &v) const
unsigned int _total_dofs
get the total no. of dofs in the system
virtual Real computeQpNonlocalOffDiagJacobian(unsigned int, dof_id_type)
const GrainTrackerInterface & _grain_tracker
grain tracker object
registerMooseObject("PhaseFieldApp", MultiGrainRigidBodyMotion)
unsigned int _j
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
unsigned int _c_var
int label for the Concentration
void addClassDescription(const std::string &doc_string)
const Real _mt
constant value corresponding to grain translation
const Elem *const & _current_elem
virtual void getUserObjectJacobian(unsigned int jvar, dof_id_type dof_index)
unsigned int _qp
uint8_t dof_id_type
const std::vector< Real > & _grain_force_c_jacobians