18#include "libmesh/quadrature.h"
31template <
class IntegralBaseVariableUserObject>
56 using IntegralBaseVariableUserObject::_communicator;
57 using IntegralBaseVariableUserObject::
_console;
58 using IntegralBaseVariableUserObject::_coord;
59 using IntegralBaseVariableUserObject::_integral_value;
60 using IntegralBaseVariableUserObject::_JxW;
61 using IntegralBaseVariableUserObject::_q_point;
62 using IntegralBaseVariableUserObject::_qp;
63 using IntegralBaseVariableUserObject::_variable;
65 using IntegralBaseVariableUserObject::computeQpIntegral;
66 using IntegralBaseVariableUserObject::getFunction;
67 using IntegralBaseVariableUserObject::
name;
104template <class IntegralBaseVariableUserObject>
108 InputParameters params = IntegralBaseVariableUserObject::validParams();
112 "This UserObject interacts with a MooseApp through functional expansions.");
115 "The name of the FunctionSeries \"Function\" object with "
116 "which to generate this functional expansion.");
119 "keep_history",
false,
"Keep the expansion coefficients from previous solves");
121 params.
addParam<
bool>(
"print_state",
false,
"Print the state of the zeroth instance each solve");
126template <
class IntegralBaseVariableUserObject>
129 : IntegralBaseVariableUserObject(parameters),
132 FunctionSeries::checkAndConvertFunction(getFunction(
"function"), this->getBase(),
name())),
146template <
class IntegralBaseVariableUserObject>
151 const Point centroid = getCentroid();
154 if (!_function_series.isInPhysicalBounds(centroid))
158 for (_qp = 0; _qp < _q_point.size(); ++_qp)
161 _function_series.setLocation(_q_point[_qp]);
162 const std::vector<Real> & term_evaluations = _function_series.getGeneration();
165 const Real local_contribution = computeQpIntegral();
166 const Real common_evaluation = local_contribution * _JxW[_qp] * _coord[_qp];
167 for (std::size_t
c = 0;
c < _coefficient_partials.size(); ++
c)
168 _coefficient_partials[
c] += term_evaluations[
c] * common_evaluation;
170 sum += local_contribution;
173 _volume += getVolume();
178template <
class IntegralBaseVariableUserObject>
183 _communicator.sum(_coefficient_partials);
184 _communicator.sum(_volume);
187 const Real volume_normalization = _standardized_function_volume / _volume;
188 for (
auto & partial : _coefficient_partials)
189 partial *= volume_normalization;
192 _coefficients = _coefficient_partials;
195 _integral_value = _coefficient_partials[0];
198 _coefficient_history.push_back(_coefficients);
202 _function_series.setCoefficients(_coefficients);
203 _console << COLOR_YELLOW << _function_series << COLOR_DEFAULT << std::endl;
207template <
class IntegralBaseVariableUserObject>
211 return _function_series;
214template <
class IntegralBaseVariableUserObject>
218 return _integral_value;
221template <
class IntegralBaseVariableUserObject>
225 IntegralBaseVariableUserObject::initialize();
228 for (
auto & partial : _coefficient_partials)
234template <
class IntegralBaseVariableUserObject>
241 for (std::size_t
c = 0;
c < _coefficient_partials.size(); ++
c)
247template <
class IntegralBaseVariableUserObject>
251 _function_series.setLocation(location);
253 return _function_series.expand(_coefficients);
This class interacts with a MooseApp through functional expansions.
const bool _print_state
Flag to prints the state of the zeroth instance in finalize()
const Real _standardized_function_volume
Volume of the standardized functional space of integration.
virtual void finalize() final
FXIntegralBaseUserObject(const InputParameters ¶meters)
std::vector< std::vector< Real > > _coefficient_history
History of the expansion coefficients for each solve.
virtual void threadJoin(const UserObject &sibling) final
FunctionSeries & _function_series
Reference to the underlying function series.
virtual Real spatialValue(const Point &location) const final
static InputParameters validParams()
virtual Real getVolume() const =0
Get the volume of the evaluated unit.
std::vector< Real > _coefficient_partials
Current coefficient partial sums.
virtual Real computeIntegral() final
const FunctionSeries & getFunctionSeries() const
Return a reference to the underlying function series.
Real _volume
Moose volume of evaluation.
const bool _keep_history
Keep the expansion coefficients after each solve.
virtual Real getValue() const final
virtual Point getCentroid() const =0
Get the centroid of the evaluated unit.
virtual void initialize() final
This class uses implementations of CompositeSeriesBasisInterface to generate a function based on conv...
std::size_t getNumberOfTerms() const
Returns the number of terms (coefficients) in the underlying function series.
const std::vector< std::size_t > & getOrders() const
Returns a vector of the functional orders in the underlying functional series.
This class is designed to provide a uniform interface for any class that uses an array of coefficient...
static InputParameters validParams()
std::vector< std::size_t > & _characteristics
An array of integer characteristics that can be used to check compatibility.
const ConsoleStream & _console
MooseObject instance of this to provide access to _console
std::vector< Real > & _coefficients
The coefficient array.
void resize(std::size_t size, Real fill=0.0, bool fill_out_to_size=true)
Resize the array, using the value for fill if the new size is larger.