12 #include "MooseMesh.h"
14 #include "MooseVariable.h"
16 #include "libmesh/quadrature.h"
24 InputParameters params = validParams<GeneralPostprocessor>();
25 params.addClassDescription(
"Calculate average grain area in a polycrystal");
35 params.addParam<UserObjectName>(
"feature_counter",
36 "The FeatureFloodCount UserObject to get values from.");
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");
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")
61 if (isParamValid(
"variable") && isParamValid(
"grain_num"))
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 "
68 _vals.resize(num_coupled_vars);
69 for (
unsigned int i = 0; i < num_coupled_vars; ++i)
70 _vals[i] = &coupledValue(
"variable", i);
80 mooseError(
"Must supply either a feature_counter object or coupled variables and grain_num");
85 _vals.reserve(coupled_vars.size());
87 for (
auto & coupled_var : coupled_vars)
88 _vals.emplace_back(&coupled_var->sln());
110 for (
const auto & elem :
_mesh.getMesh().active_local_element_ptr_range())
112 _fe_problem.prepare(elem, 0);
113 _fe_problem.reinitElem(elem, 0);
115 const std::vector<unsigned int> & var_to_feature_ptr =
125 std::size_t libmesh_dbg_var(num_features))
127 for (MooseIndex(var_to_features) var_index = 0; var_index < var_to_features.size(); ++var_index)
132 auto feature_id = var_to_features[var_index];
133 mooseAssert(feature_id < num_features,
"Feature ID out of range");
146 for (
unsigned int qp = 0; qp <
_qrule->n_points(); ++qp)
157 Real total_volume = 0;
159 total_volume += volume;
161 unsigned int active_features =
164 return total_volume / active_features;