18 #include "libmesh/quadrature.h" 31 template <
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;
64 using IntegralBaseVariableUserObject::computeIntegral;
65 using IntegralBaseVariableUserObject::computeQpIntegral;
66 using IntegralBaseVariableUserObject::getFunction;
104 template <
class IntegralBaseVariableUserObject>
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");
126 template <
class IntegralBaseVariableUserObject>
129 : IntegralBaseVariableUserObject(parameters),
132 getFunction(
"function"),
UserObject::getParam<
std::string>(
"_moose_base"),
name())),
133 _keep_history(
UserObject::getParam<bool>(
"keep_history")),
134 _print_state(
UserObject::getParam<bool>(
"print_state")),
135 _standardized_function_volume(_function_series.getStandardizedFunctionVolume())
146 template <
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();
178 template <
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;
207 template <
class IntegralBaseVariableUserObject>
211 return _function_series;
214 template <
class IntegralBaseVariableUserObject>
218 return _integral_value;
221 template <
class IntegralBaseVariableUserObject>
225 IntegralBaseVariableUserObject::initialize();
228 for (
auto & partial : _coefficient_partials)
234 template <
class IntegralBaseVariableUserObject>
241 for (std::size_t
c = 0;
c < _coefficient_partials.size(); ++
c)
247 template <
class IntegralBaseVariableUserObject>
251 _function_series.setLocation(location);
253 return _function_series.expand(_coefficients);
virtual void initialize() final
virtual Real getVolume() const =0
Get the volume of the evaluated unit.
const bool _keep_history
Keep the expansion coefficients after each solve.
FXIntegralBaseUserObject(const InputParameters ¶meters)
FunctionSeries & _function_series
Reference to the underlying function series.
virtual Real computeIntegral() final
virtual Point getCentroid() const =0
Get the centroid of the evaluated unit.
const FunctionSeries & getFunctionSeries() const
Return a reference to the underlying function series.
virtual void finalize() final
static InputParameters validParams()
virtual void threadJoin(const UserObject &sibling) final
This class uses implementations of CompositeSeriesBasisInterface to generate a function based on conv...
static InputParameters validParams()
InputParameters validParams()
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.
std::vector< Real > & _coefficients
The coefficient array.
std::size_t getNumberOfTerms() const
Returns the number of terms (coefficients) in the underlying function series.
virtual Real getValue() const final
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::vector< std::size_t > & _characteristics
An array of integer characteristics that can be used to check compatibility.
virtual Real spatialValue(const Point &location) const final
This class is designed to provide a uniform interface for any class that uses an array of coefficient...
const std::vector< std::size_t > & getOrders() const
Returns a vector of the functional orders in the underlying functional series.
Real _volume
Moose volume of evaluation.
std::vector< std::vector< Real > > _coefficient_history
History of the expansion coefficients for each solve.
This class interacts with a MooseApp through functional expansions.
std::vector< Real > _coefficient_partials
Current coefficient partial sums.