www.mooseframework.org
FXIntegralBaseUserObject.h
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 #pragma once
11 
12 #include "AuxiliarySystem.h"
13 #include "MooseError.h"
14 #include "MooseMesh.h"
15 #include "MooseVariable.h"
16 #include "UserObject.h"
17 
18 #include "libmesh/quadrature.h"
19 
20 #include "FunctionSeries.h"
22 
27 {
28  // Empty class, used only for parameters
29 };
30 
31 template <>
33 
42 template <class IntegralBaseVariableUserObject>
43 class FXIntegralBaseUserObject : public IntegralBaseVariableUserObject,
45 {
46 public:
47  FXIntegralBaseUserObject(const InputParameters & parameters);
48 
52  const FunctionSeries & getFunctionSeries() const;
53 
54  // Override from <IntegralBaseVariableUserObject>
55  virtual Real getValue() final;
56 
57  // Overrides from UserObject
58  virtual void finalize() final;
59  virtual void initialize() final;
60  virtual Real spatialValue(const Point & location) const final;
61  virtual void threadJoin(const UserObject & sibling) final;
62 
63 protected:
64  // Policy-based design requires us to specify which inherited members we are using
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;
77 
78  // Override from <IntegralBaseVariableUserObject>
79  virtual Real computeIntegral() final;
80 
84  virtual Point getCentroid() const = 0;
85 
89  virtual Real getVolume() const = 0;
90 
92  std::vector<std::vector<Real>> _coefficient_history;
93 
95  std::vector<Real> _coefficient_partials;
96 
99 
101  const bool _keep_history;
102 
104  const bool _print_state;
105 
108 
110  Real _volume;
111 };
112 
113 template <class IntegralBaseVariableUserObject>
115  const InputParameters & parameters)
116  : IntegralBaseVariableUserObject(parameters),
117  MutableCoefficientsInterface(this, parameters),
118  _function_series(FunctionSeries::checkAndConvertFunction(
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())
123 {
124  // Size the coefficient arrays
128 
129  if (!_keep_history)
130  _coefficient_history.resize(0);
131 }
132 
133 template <class IntegralBaseVariableUserObject>
134 Real
136 {
137  Real sum = 0.0;
138  const Point centroid = getCentroid();
139 
140  // Check to see if this element/side is within the valid boundaries
141  if (!_function_series.isInPhysicalBounds(centroid))
142  return 0.0;
143 
144  // Loop over the quadrature points
145  for (_qp = 0; _qp < _q_point.size(); ++_qp)
146  {
147  // Get the functional terms for a vectorized approach
148  _function_series.setLocation(_q_point[_qp]);
149  const std::vector<Real> & term_evaluations = _function_series.getGeneration();
150 
151  // Evaluate the functional expansion coefficients at each quadrature point
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;
156 
157  sum += local_contribution;
158  }
159 
160  _volume += getVolume();
161 
162  return sum;
163 }
164 
165 template <class IntegralBaseVariableUserObject>
166 void
168 {
169  // Sum the coefficient arrays over all processes
170  _communicator.sum(_coefficient_partials);
171  _communicator.sum(_volume);
172 
173  // Normalize the volume of the functional expansion to the FX standard space
174  const Real volume_normalization = _standardized_function_volume / _volume;
175  for (auto & partial : _coefficient_partials)
176  partial *= volume_normalization;
177 
178  // We now have the completely evaluated coefficients
179  _coefficients = _coefficient_partials;
180 
181  // The average value is the same as the zeroth coefficient
182  _integral_value = _coefficient_partials[0];
183 
184  if (_keep_history)
185  _coefficient_history.push_back(_coefficients);
186 
187  if (_print_state)
188  {
189  _function_series.setCoefficients(_coefficients);
190  _console << COLOR_YELLOW << _function_series << COLOR_DEFAULT << std::endl;
191  }
192 }
193 
194 template <class IntegralBaseVariableUserObject>
195 const FunctionSeries &
197 {
198  return _function_series;
199 }
200 
201 template <class IntegralBaseVariableUserObject>
202 Real
204 {
205  return _integral_value;
206 }
207 
208 template <class IntegralBaseVariableUserObject>
209 void
211 {
212  IntegralBaseVariableUserObject::initialize();
213 
214  // Clear the partial sums
215  for (auto & partial : _coefficient_partials)
216  partial = 0;
217 
218  _volume = 0;
219 }
220 
221 template <class IntegralBaseVariableUserObject>
222 void
224 {
227 
228  for (std::size_t c = 0; c < _coefficient_partials.size(); ++c)
229  _coefficient_partials[c] += sibling._coefficient_partials[c];
230 
231  _volume += sibling._volume;
232 }
233 
234 template <class IntegralBaseVariableUserObject>
235 Real
237 {
238  _function_series.setLocation(location);
239 
240  return _function_series.expand(_coefficients);
241 }
FXIntegralBaseUserObject::computeIntegral
virtual Real computeIntegral() final
Definition: FXIntegralBaseUserObject.h:135
FXIntegralBaseUserObject
This class interacts with a MooseApp through functional expansions.
Definition: FXIntegralBaseUserObject.h:43
FXIntegralBaseUserObject::getCentroid
virtual Point getCentroid() const =0
Get the centroid of the evaluated unit.
FXIntegralBaseUserObject::_coefficient_history
std::vector< std::vector< Real > > _coefficient_history
History of the expansion coefficients for each solve.
Definition: FXIntegralBaseUserObject.h:92
FunctionSeries::getNumberOfTerms
std::size_t getNumberOfTerms() const
Returns the number of terms (coefficients) in the underlying function series.
Definition: FunctionSeries.C:199
FXIntegralBaseUserObjectParameters
Class declaration for parameters - we cannot use templated types in validParams<>()
Definition: FXIntegralBaseUserObject.h:26
FXIntegralBaseUserObject::_coefficient_partials
std::vector< Real > _coefficient_partials
Current coefficient partial sums.
Definition: FXIntegralBaseUserObject.h:95
FXIntegralBaseUserObject::getValue
virtual Real getValue() final
Definition: FXIntegralBaseUserObject.h:203
MutableCoefficientsInterface::_coefficients
std::vector< Real > & _coefficients
The coefficient array.
Definition: MutableCoefficientsInterface.h:113
FXIntegralBaseUserObject::_volume
Real _volume
Moose volume of evaluation.
Definition: FXIntegralBaseUserObject.h:110
FunctionSeries
This class uses implementations of CompositeSeriesBasisInterface to generate a function based on conv...
Definition: FunctionSeries.h:25
FXIntegralBaseUserObject::initialize
virtual void initialize() final
Definition: FXIntegralBaseUserObject.h:210
FXIntegralBaseUserObject::getFunctionSeries
const FunctionSeries & getFunctionSeries() const
Return a reference to the underlying function series.
Definition: FXIntegralBaseUserObject.h:196
MutableCoefficientsInterface::_characteristics
std::vector< std::size_t > & _characteristics
An array of integer characteristics that can be used to check compatibility.
Definition: MutableCoefficientsInterface.h:107
FXIntegralBaseUserObject::getVolume
virtual Real getVolume() const =0
Get the volume of the evaluated unit.
FXIntegralBaseUserObject::_keep_history
const bool _keep_history
Keep the expansion coefficients after each solve.
Definition: FXIntegralBaseUserObject.h:101
FXIntegralBaseUserObject::threadJoin
virtual void threadJoin(const UserObject &sibling) final
Definition: FXIntegralBaseUserObject.h:223
name
const std::string name
Definition: Setup.h:21
MutableCoefficientsInterface.h
FunctionSeries::getOrders
const std::vector< std::size_t > & getOrders() const
Returns a vector of the functional orders in the underlying functional series.
Definition: FunctionSeries.C:205
FXIntegralBaseUserObject::_function_series
FunctionSeries & _function_series
Reference to the underlying function series.
Definition: FXIntegralBaseUserObject.h:98
FXIntegralBaseUserObject::_print_state
const bool _print_state
Flag to prints the state of the zeroth instance in finalize()
Definition: FXIntegralBaseUserObject.h:104
FXIntegralBaseUserObject::_standardized_function_volume
const Real _standardized_function_volume
Volume of the standardized functional space of integration.
Definition: FXIntegralBaseUserObject.h:107
validParams< FXIntegralBaseUserObjectParameters >
InputParameters validParams< FXIntegralBaseUserObjectParameters >()
Definition: FXntegralBaseUserObjectParameters.C:14
MutableCoefficientsInterface
This class is designed to provide a uniform interface for any class that uses an array of coefficient...
Definition: MutableCoefficientsInterface.h:30
FXIntegralBaseUserObject::finalize
virtual void finalize() final
Definition: FXIntegralBaseUserObject.h:167
FunctionSeries.h
FXIntegralBaseUserObject::FXIntegralBaseUserObject
FXIntegralBaseUserObject(const InputParameters &parameters)
Definition: FXIntegralBaseUserObject.h:114
FXIntegralBaseUserObject::spatialValue
virtual Real spatialValue(const Point &location) const final
Definition: FXIntegralBaseUserObject.h:236