www.mooseframework.org
MaskedGrainForceAndTorque.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 
13 
14 template <>
15 InputParameters
17 {
18  InputParameters params = validParams<GeneralUserObject>();
19  params.addClassDescription("Userobject for masking/pinning grains and making forces and torques "
20  "acting on that grain zero");
21  params.addParam<UserObjectName>("grain_force",
22  "userobject for getting force and torque acting on grains");
23  params.addParam<std::vector<unsigned int>>("pinned_grains", "Grain numbers for pinned grains");
24  return params;
25 }
26 
27 MaskedGrainForceAndTorque::MaskedGrainForceAndTorque(const InputParameters & parameters)
29  GeneralUserObject(parameters),
30  _grain_force_torque_input(getUserObject<GrainForceAndTorqueInterface>("grain_force")),
31  _grain_forces_input(_grain_force_torque_input.getForceValues()),
32  _grain_torques_input(_grain_force_torque_input.getTorqueValues()),
33  _grain_force_c_jacobians_input(_grain_force_torque_input.getForceCJacobians()),
34  _grain_force_eta_jacobians_input(_grain_force_torque_input.getForceEtaJacobians()),
35  _pinned_grains(getParam<std::vector<unsigned int>>("pinned_grains")),
36  _num_pinned_grains(_pinned_grains.size()),
37  _grain_num(_grain_forces_input.size()),
38  _force_values(_grain_num),
39  _torque_values(_grain_num)
40 {
41 }
42 
43 void
45 {
46  for (unsigned int i = 0; i < _grain_num; ++i)
47  {
50 
51  if (_num_pinned_grains != 0)
52  {
53  for (unsigned int j = 0; j < _num_pinned_grains; ++j)
54  {
55  if (i == _pinned_grains[j])
56  {
57  _force_values[i] = 0.0;
58  _torque_values[i] = 0.0;
59  }
60  }
61  }
62  }
63 
64  if (_fe_problem.currentlyComputingJacobian())
65  {
66  unsigned int total_dofs = _subproblem.es().n_dofs();
67  _c_jacobians.resize(6 * _grain_num * total_dofs, 0.0);
68  _eta_jacobians.resize(_grain_num);
69  for (unsigned int i = 0; i < _grain_num; ++i)
70  for (unsigned int j = 0; j < total_dofs; ++j)
71  {
72  _c_jacobians[(6 * i + 0) * total_dofs + j] =
73  _grain_force_c_jacobians_input[(6 * i + 0) * total_dofs + j];
74  _c_jacobians[(6 * i + 1) * total_dofs + j] =
75  _grain_force_c_jacobians_input[(6 * i + 1) * total_dofs + j];
76  _c_jacobians[(6 * i + 2) * total_dofs + j] =
77  _grain_force_c_jacobians_input[(6 * i + 2) * total_dofs + j];
78  _c_jacobians[(6 * i + 3) * total_dofs + j] =
79  _grain_force_c_jacobians_input[(6 * i + 3) * total_dofs + j];
80  _c_jacobians[(6 * i + 4) * total_dofs + j] =
81  _grain_force_c_jacobians_input[(6 * i + 4) * total_dofs + j];
82  _c_jacobians[(6 * i + 5) * total_dofs + j] =
83  _grain_force_c_jacobians_input[(6 * i + 5) * total_dofs + j];
84 
85  if (_num_pinned_grains != 0)
86  for (unsigned int k = 0; k < _num_pinned_grains; ++k)
87  if (i == _pinned_grains[k])
88  {
89  _c_jacobians[(6 * i + 0) * total_dofs + j] = 0.0;
90  _c_jacobians[(6 * i + 1) * total_dofs + j] = 0.0;
91  _c_jacobians[(6 * i + 2) * total_dofs + j] = 0.0;
92  _c_jacobians[(6 * i + 3) * total_dofs + j] = 0.0;
93  _c_jacobians[(6 * i + 4) * total_dofs + j] = 0.0;
94  _c_jacobians[(6 * i + 5) * total_dofs + j] = 0.0;
95  }
96  }
97 
98  for (unsigned int i = 0; i < _grain_num; ++i)
99  {
100  _eta_jacobians[i].resize(6 * _grain_num * total_dofs);
101  for (unsigned int j = 0; j < _grain_num; ++j)
102  for (unsigned int k = 0; k < total_dofs; ++k)
103  {
104  _eta_jacobians[i][(6 * j + 0) * total_dofs + k] =
105  _grain_force_eta_jacobians_input[i][(6 * j + 0) * total_dofs + k];
106  _eta_jacobians[i][(6 * j + 1) * total_dofs + k] =
107  _grain_force_eta_jacobians_input[i][(6 * j + 1) * total_dofs + k];
108  _eta_jacobians[i][(6 * j + 2) * total_dofs + k] =
109  _grain_force_eta_jacobians_input[i][(6 * j + 2) * total_dofs + k];
110  _eta_jacobians[i][(6 * j + 3) * total_dofs + k] =
111  _grain_force_eta_jacobians_input[i][(6 * j + 3) * total_dofs + k];
112  _eta_jacobians[i][(6 * j + 4) * total_dofs + k] =
113  _grain_force_eta_jacobians_input[i][(6 * j + 4) * total_dofs + k];
114  _eta_jacobians[i][(6 * j + 5) * total_dofs + k] =
115  _grain_force_eta_jacobians_input[i][(6 * j + 5) * total_dofs + k];
116 
117  if (_num_pinned_grains != 0)
118  for (unsigned int l = 0; l < _num_pinned_grains; ++l)
119  if (j == _pinned_grains[l])
120  {
121  _eta_jacobians[i][(6 * j + 0) * total_dofs + k] = 0.0;
122  _eta_jacobians[i][(6 * j + 1) * total_dofs + k] = 0.0;
123  _eta_jacobians[i][(6 * j + 2) * total_dofs + k] = 0.0;
124  _eta_jacobians[i][(6 * j + 3) * total_dofs + k] = 0.0;
125  _eta_jacobians[i][(6 * j + 4) * total_dofs + k] = 0.0;
126  _eta_jacobians[i][(6 * j + 5) * total_dofs + k] = 0.0;
127  }
128  }
129  }
130  }
131 }
132 
133 const std::vector<RealGradient> &
135 {
136  return _force_values;
137 }
138 
139 const std::vector<RealGradient> &
141 {
142  return _torque_values;
143 }
144 
145 const std::vector<Real> &
147 {
148  return _c_jacobians;
149 }
150 
151 const std::vector<std::vector<Real>> &
153 {
154  return _eta_jacobians;
155 }
MaskedGrainForceAndTorque::_grain_force_eta_jacobians_input
const std::vector< std::vector< Real > > & _grain_force_eta_jacobians_input
Definition: MaskedGrainForceAndTorque.h:44
MaskedGrainForceAndTorque::_num_pinned_grains
unsigned int _num_pinned_grains
Definition: MaskedGrainForceAndTorque.h:47
registerMooseObject
registerMooseObject("PhaseFieldApp", MaskedGrainForceAndTorque)
MaskedGrainForceAndTorque::_torque_values
std::vector< RealGradient > _torque_values
Definition: MaskedGrainForceAndTorque.h:52
MaskedGrainForceAndTorque::_grain_force_c_jacobians_input
const std::vector< Real > & _grain_force_c_jacobians_input
Definition: MaskedGrainForceAndTorque.h:43
MaskedGrainForceAndTorque::MaskedGrainForceAndTorque
MaskedGrainForceAndTorque(const InputParameters &parameters)
Definition: MaskedGrainForceAndTorque.C:27
MaskedGrainForceAndTorque::_grain_num
unsigned int _grain_num
Definition: MaskedGrainForceAndTorque.h:48
MaskedGrainForceAndTorque::getTorqueValues
virtual const std::vector< RealGradient > & getTorqueValues() const
Definition: MaskedGrainForceAndTorque.C:140
MaskedGrainForceAndTorque::getForceEtaJacobians
virtual const std::vector< std::vector< Real > > & getForceEtaJacobians() const
Definition: MaskedGrainForceAndTorque.C:152
MaskedGrainForceAndTorque::_force_values
std::vector< RealGradient > _force_values
providing grain forces, torques and their jacobians w. r. t c
Definition: MaskedGrainForceAndTorque.h:51
MaskedGrainForceAndTorque
This class is here to get the force and torque acting on a grain from different userobjects and sum t...
Definition: MaskedGrainForceAndTorque.h:25
MaskedGrainForceAndTorque::_grain_forces_input
const std::vector< RealGradient > & _grain_forces_input
Definition: MaskedGrainForceAndTorque.h:41
MaskedGrainForceAndTorque::getForceValues
virtual const std::vector< RealGradient > & getForceValues() const
Definition: MaskedGrainForceAndTorque.C:134
MaskedGrainForceAndTorque.h
MaskedGrainForceAndTorque::_eta_jacobians
std::vector< std::vector< Real > > _eta_jacobians
Definition: MaskedGrainForceAndTorque.h:54
MaskedGrainForceAndTorque::_pinned_grains
std::vector< unsigned int > _pinned_grains
Definition: MaskedGrainForceAndTorque.h:46
MaskedGrainForceAndTorque::_grain_torques_input
const std::vector< RealGradient > & _grain_torques_input
Definition: MaskedGrainForceAndTorque.h:42
MaskedGrainForceAndTorque::getForceCJacobians
virtual const std::vector< Real > & getForceCJacobians() const
Definition: MaskedGrainForceAndTorque.C:146
MaskedGrainForceAndTorque::_c_jacobians
std::vector< Real > _c_jacobians
Definition: MaskedGrainForceAndTorque.h:53
validParams< MaskedGrainForceAndTorque >
InputParameters validParams< MaskedGrainForceAndTorque >()
Definition: MaskedGrainForceAndTorque.C:16
MaskedGrainForceAndTorque::initialize
virtual void initialize()
Definition: MaskedGrainForceAndTorque.C:44
GrainForceAndTorqueInterface
This class provides interface for extracting the forces and torques computed in other UserObjects.
Definition: GrainForceAndTorqueInterface.h:24