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