12 #include "AuxiliarySystem.h"
13 #include "MooseError.h"
14 #include "MooseMesh.h"
15 #include "MooseVariable.h"
16 #include "UserObject.h"
18 #include "libmesh/quadrature.h"
42 template <
class IntegralBaseVariableUserObject>
60 virtual Real
spatialValue(
const Point & location)
const final;
61 virtual void threadJoin(
const UserObject & sibling)
final;
65 using IntegralBaseVariableUserObject::_communicator;
66 using IntegralBaseVariableUserObject::_console;
67 using IntegralBaseVariableUserObject::_coord;
68 using IntegralBaseVariableUserObject::_integral_value;
69 using IntegralBaseVariableUserObject::_JxW;
70 using IntegralBaseVariableUserObject::_q_point;
71 using IntegralBaseVariableUserObject::_qp;
72 using IntegralBaseVariableUserObject::_variable;
73 using IntegralBaseVariableUserObject::computeIntegral;
74 using IntegralBaseVariableUserObject::computeQpIntegral;
75 using IntegralBaseVariableUserObject::getFunction;
113 template <
class IntegralBaseVariableUserObject>
115 const InputParameters & parameters)
116 : IntegralBaseVariableUserObject(parameters),
119 getFunction(
"function"), UserObject::getParamTempl<std::string>(
"_moose_base"),
name())),
120 _keep_history(UserObject::getParamTempl<bool>(
"keep_history")),
121 _print_state(UserObject::getParamTempl<bool>(
"print_state")),
122 _standardized_function_volume(_function_series.getStandardizedFunctionVolume())
133 template <
class IntegralBaseVariableUserObject>
138 const Point centroid = getCentroid();
141 if (!_function_series.isInPhysicalBounds(centroid))
145 for (_qp = 0; _qp < _q_point.size(); ++_qp)
148 _function_series.setLocation(_q_point[_qp]);
149 const std::vector<Real> & term_evaluations = _function_series.getGeneration();
152 const Real local_contribution = computeQpIntegral();
153 const Real common_evaluation = local_contribution * _JxW[_qp] * _coord[_qp];
154 for (std::size_t c = 0; c < _coefficient_partials.size(); ++c)
155 _coefficient_partials[c] += term_evaluations[c] * common_evaluation;
157 sum += local_contribution;
160 _volume += getVolume();
165 template <
class IntegralBaseVariableUserObject>
170 _communicator.sum(_coefficient_partials);
171 _communicator.sum(_volume);
174 const Real volume_normalization = _standardized_function_volume / _volume;
175 for (
auto & partial : _coefficient_partials)
176 partial *= volume_normalization;
179 _coefficients = _coefficient_partials;
182 _integral_value = _coefficient_partials[0];
185 _coefficient_history.push_back(_coefficients);
189 _function_series.setCoefficients(_coefficients);
190 _console << COLOR_YELLOW << _function_series << COLOR_DEFAULT << std::endl;
194 template <
class IntegralBaseVariableUserObject>
198 return _function_series;
201 template <
class IntegralBaseVariableUserObject>
205 return _integral_value;
208 template <
class IntegralBaseVariableUserObject>
212 IntegralBaseVariableUserObject::initialize();
215 for (
auto & partial : _coefficient_partials)
221 template <
class IntegralBaseVariableUserObject>
228 for (std::size_t c = 0; c < _coefficient_partials.size(); ++c)
234 template <
class IntegralBaseVariableUserObject>
238 _function_series.setLocation(location);
240 return _function_series.expand(_coefficients);