www.mooseframework.org
AverageGrainVolume.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 
10 #include "AverageGrainVolume.h"
11 #include "FeatureFloodCount.h"
12 #include "MooseMesh.h"
13 #include "Assembly.h"
14 #include "MooseVariable.h"
15 
16 #include "libmesh/quadrature.h"
17 
18 registerMooseObject("PhaseFieldApp", AverageGrainVolume);
19 
20 template <>
21 InputParameters
23 {
24  InputParameters params = validParams<GeneralPostprocessor>();
25  params.addClassDescription("Calculate average grain area in a polycrystal");
26 
34  // Mode 1: Use the GrainTracker
35  params.addParam<UserObjectName>("feature_counter",
36  "The FeatureFloodCount UserObject to get values from.");
37 
38  // Mode 2: Calculate grain volumes adirectly
39  params.addCoupledVarWithAutoBuild(
40  "variable", "var_name_base", "op_num", "Array of coupled variables");
41  params.addParam<unsigned int>("grain_num", "number of grains to create");
42  return params;
43 }
44 
45 AverageGrainVolume::AverageGrainVolume(const InputParameters & parameters)
46  : GeneralPostprocessor(parameters),
47  Coupleable(this, false),
48  MooseVariableDependencyInterface(),
49  _mesh(_subproblem.mesh()),
50  _assembly(_subproblem.assembly(0)),
51  _q_point(_assembly.qPoints()),
52  _qrule(_assembly.qRule()),
53  _JxW(_assembly.JxW()),
54  _coord(_assembly.coordTransformation()),
55  _feature_counter(isParamValid("feature_counter")
56  ? &getUserObject<FeatureFloodCount>("feature_counter")
57  : nullptr)
58 {
59  if (!_feature_counter)
60  {
61  if (isParamValid("variable") && isParamValid("grain_num"))
62  {
63  auto num_coupled_vars = coupledComponents("variable");
64  if (num_coupled_vars != getParam<unsigned int>("grain_num"))
65  mooseError("The number of grains must match the number of OPs if a feature_counter is not "
66  "supplied");
67 
68  _vals.resize(num_coupled_vars);
69  for (unsigned int i = 0; i < num_coupled_vars; ++i)
70  _vals[i] = &coupledValue("variable", i);
71 
72  _feature_volumes.resize(num_coupled_vars);
73 
74  // Build a reflexive map (ops map to grains directly)
75  _static_var_to_feature.resize(num_coupled_vars);
76  for (MooseIndex(_static_var_to_feature) i = 0; i < num_coupled_vars; ++i)
78  }
79  else
80  mooseError("Must supply either a feature_counter object or coupled variables and grain_num");
81  }
82  else
83  {
84  const auto & coupled_vars = _feature_counter->getCoupledVars();
85  _vals.reserve(coupled_vars.size());
86 
87  for (auto & coupled_var : coupled_vars)
88  _vals.emplace_back(&coupled_var->sln());
89 
90  addMooseVariableDependency(_feature_counter->getFECoupledVars());
91  }
92 }
93 
94 void
96 {
97  auto num_features = _feature_volumes.size();
98 
99  // When using FeatureFloodCount, the number of grains may not be fixed. Resize as appropriate
100  if (_feature_counter)
101  num_features = _feature_counter->getTotalFeatureCount();
102 
103  _feature_volumes.assign(num_features, 0);
104 }
105 
106 void
108 {
109  auto num_features = _feature_volumes.size();
110  for (const auto & elem : _mesh.getMesh().active_local_element_ptr_range())
111  {
112  _fe_problem.prepare(elem, 0);
113  _fe_problem.reinitElem(elem, 0);
114 
115  const std::vector<unsigned int> & var_to_feature_ptr =
118 
119  accumulateVolumes(var_to_feature_ptr, num_features);
120  }
121 }
122 
123 void
124 AverageGrainVolume::accumulateVolumes(const std::vector<unsigned int> & var_to_features,
125  std::size_t libmesh_dbg_var(num_features))
126 {
127  for (MooseIndex(var_to_features) var_index = 0; var_index < var_to_features.size(); ++var_index)
128  {
129  // Only sample "active" variables
130  if (var_to_features[var_index] != FeatureFloodCount::invalid_id)
131  {
132  auto feature_id = var_to_features[var_index];
133  mooseAssert(feature_id < num_features, "Feature ID out of range");
134  auto integral_value = computeIntegral(var_index);
135 
136  _feature_volumes[feature_id] += integral_value;
137  }
138  }
139 }
140 
141 Real
142 AverageGrainVolume::computeIntegral(std::size_t var_index) const
143 {
144  Real sum = 0;
145 
146  for (unsigned int qp = 0; qp < _qrule->n_points(); ++qp)
147  sum += _JxW[qp] * _coord[qp] * (*_vals[var_index])[qp];
148 
149  return sum;
150 }
151 
152 Real
154 {
155  _communicator.sum(_feature_volumes);
156 
157  Real total_volume = 0;
158  for (auto & volume : _feature_volumes)
159  total_volume += volume;
160 
161  unsigned int active_features =
163 
164  return total_volume / active_features;
165 }
AverageGrainVolume::_coord
const MooseArray< Real > & _coord
Definition: AverageGrainVolume.h:51
FeatureFloodCount::getVarToFeatureVector
virtual const std::vector< unsigned int > & getVarToFeatureVector(dof_id_type elem_id) const
Returns a list of active unique feature ids for a particular element.
Definition: FeatureFloodCount.C:701
AverageGrainVolume::execute
virtual void execute() override
Definition: AverageGrainVolume.C:107
AverageGrainVolume::accumulateVolumes
void accumulateVolumes(const std::vector< unsigned int > &var_to_features, std::size_t libmesh_dbg_var(num_features))
Definition: AverageGrainVolume.C:124
FeatureFloodCount
This object will mark nodes or elements of continuous regions all with a unique number for the purpos...
Definition: FeatureFloodCount.h:44
FeatureFloodCount::getTotalFeatureCount
virtual std::size_t getTotalFeatureCount() const
Returns the total feature count (active and inactive ids, useful for sizing vectors)
Definition: FeatureFloodCount.C:798
AverageGrainVolume
Compute the average grain area in a polycrystal.
Definition: AverageGrainVolume.h:26
AverageGrainVolume::computeIntegral
Real computeIntegral(std::size_t var_index) const
Definition: AverageGrainVolume.C:142
registerMooseObject
registerMooseObject("PhaseFieldApp", AverageGrainVolume)
AverageGrainVolume::AverageGrainVolume
AverageGrainVolume(const InputParameters &parameters)
Definition: AverageGrainVolume.C:45
AverageGrainVolume::_static_var_to_feature
std::vector< unsigned int > _static_var_to_feature
Definition: AverageGrainVolume.h:45
FeatureFloodCount::getCoupledVars
const std::vector< MooseVariable * > & getCoupledVars() const
Returns a const vector to the coupled variable pointers.
Definition: FeatureFloodCount.h:98
FeatureFloodCount.h
AverageGrainVolume.h
AverageGrainVolume::_feature_volumes
std::vector< Real > _feature_volumes
Definition: AverageGrainVolume.h:47
AverageGrainVolume::_JxW
const MooseArray< Real > & _JxW
Definition: AverageGrainVolume.h:50
AverageGrainVolume::_vals
std::vector< const VariableValue * > _vals
Definition: AverageGrainVolume.h:46
AverageGrainVolume::_mesh
MooseMesh & _mesh
A reference to the mesh.
Definition: AverageGrainVolume.h:43
FeatureFloodCount::invalid_id
static const unsigned int invalid_id
Definition: FeatureFloodCount.h:94
AverageGrainVolume::getValue
virtual Real getValue() override
Definition: AverageGrainVolume.C:153
AverageGrainVolume::initialize
virtual void initialize() override
Definition: AverageGrainVolume.C:95
AverageGrainVolume::_qrule
const QBase *const & _qrule
Definition: AverageGrainVolume.h:49
AverageGrainVolume::_feature_counter
const FeatureFloodCount * _feature_counter
Definition: AverageGrainVolume.h:52
validParams< AverageGrainVolume >
InputParameters validParams< AverageGrainVolume >()
Definition: AverageGrainVolume.C:22
FeatureFloodCount::getFECoupledVars
const std::vector< MooseVariableFEBase * > & getFECoupledVars() const
Returns a const vector to the coupled MooseVariableFEBase pointers.
Definition: FeatureFloodCount.h:101
FeatureFloodCount::getNumberActiveFeatures
std::size_t getNumberActiveFeatures() const
Return the number of active features.
Definition: FeatureFloodCount.C:791