https://mooseframework.inl.gov
GrainAdvectionVelocity.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
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 
10 #include "GrainAdvectionVelocity.h"
11 
13 
16 {
18  params.addClassDescription(
19  "Calculation the advection velocity of grain due to rigid body translation and rotation");
21  "etas", "var_name_base", "op_num", "Array of other coupled order parameters");
22  params.addCoupledVar("c", "Concentration field");
23  params.addParam<Real>(
24  "translation_constant", 500, "constant value characterizing grain translation");
25  params.addParam<Real>("rotation_constant", 1.0, "constant value characterizing grain rotation");
26  params.addParam<std::string>("base_name",
27  "Optional parameter that allows the user to define "
28  "type of force density under consideration");
29  params.addParam<UserObjectName>("grain_data",
30  "UserObject for getting the center of mass of grains");
31  params.addParam<UserObjectName>("grain_force",
32  "userobject for getting force and torque acting on grains");
33  params.addParam<VectorPostprocessorName>("grain_volumes",
34  "The feature volume VectorPostprocessorValue.");
35  return params;
36 }
37 
40  _grain_tracker(getUserObject<GrainTrackerInterface>("grain_data")),
41  _grain_force_torque(getUserObject<GrainForceAndTorqueInterface>("grain_force")),
42  _grain_volumes(getVectorPostprocessorValue("grain_volumes", "feature_volumes")),
43  _grain_forces(_grain_force_torque.getForceValues()),
44  _grain_torques(_grain_force_torque.getTorqueValues()),
45  _mt(getParam<Real>("translation_constant")),
46  _mr(getParam<Real>("rotation_constant")),
47  _op_num(coupledComponents("etas")),
48  _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""),
49  _velocity_advection(
50  declareProperty<std::vector<RealGradient>>(_base_name + "advection_velocity"))
51 {
52  mooseDeprecated("Use GrainAdvectionAux for visualizing advection velocities.");
53 }
54 
55 void
57 {
58  auto grain_num = _grain_tracker.getTotalFeatureCount();
59  const auto & op_to_grains = _grain_tracker.getVarToFeatureVector(_current_elem->id());
60 
61  _velocity_advection[_qp].resize(grain_num);
62 
63  for (unsigned int i = 0; i < _grain_volumes.size(); ++i)
64  {
65  mooseAssert(i < _grain_volumes.size(), "grain index is out of bounds");
66  const auto volume = _grain_volumes[i];
67  const auto centroid = _grain_tracker.getGrainCentroid(i);
68 
69  for (unsigned int j = 0; j < _op_num; ++j)
70  if (i == op_to_grains[j])
71  {
72  const RealGradient velocity_translation = _mt / volume * _grain_forces[i];
73  const RealGradient velocity_rotation =
74  _mr / volume * (_grain_torques[i].cross(_current_elem->vertex_average() - centroid));
75 
76  _velocity_advection[_qp][i] = velocity_translation + velocity_rotation;
77  }
78  }
79 }
registerMooseObject("PhaseFieldApp", GrainAdvectionVelocity)
This class defines the interface for the GrainTracking objects.
void mooseDeprecated(Args &&... args) const
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
This class provides interface for extracting the forces and torques computed in other UserObjects...
GrainAdvectionVelocity(const InputParameters &parameters)
virtual std::size_t getTotalFeatureCount() const =0
Returns a number large enough to contain the largest ID for all grains in use.
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.
const Real _mt
constant value corresponding to grain translation
const VectorPostprocessorValue & _grain_volumes
The grain volumes.
static InputParameters validParams()
virtual Point getGrainCentroid(unsigned int grain_id) const =0
Returns the centroid for the given grain number.
Real volume(const MeshBase &mesh, unsigned int dim=libMesh::invalid_uint)
void addCoupledVar(const std::string &name, const std::string &doc_string)
static InputParameters validParams()
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void addRequiredCoupledVarWithAutoBuild(const std::string &name, const std::string &base_name, const std::string &num_name, const std::string &doc_string)
MaterialProperty< std::vector< RealGradient > > & _velocity_advection
Material storing advection velocities of grains.
void addClassDescription(const std::string &doc_string)
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
const std::vector< RealGradient > & _grain_forces
const GrainTrackerInterface & _grain_tracker
getting userobject for calculating grain centers and volumes
const Real _mr
constant value corresponding to grain rotation
const std::vector< RealGradient > & _grain_torques
This Material calculates the advection velocity, it&#39;s divergence and derivatives acting on a particle...