40 template <
typename Rule>
45 template <
typename Ftor>
46 static typename Ftor::result_type
sum(
typename Ftor::argument_type l,
typename Ftor::argument_type d,
51 Arg
const h =
static_cast<Arg
>(0.5) * d;
123 template <
typename QuadRule1,
typename QuadRule2 = Bisector<QuadRule1>,
typename ConvergencePolicy = ComboDifference,
124 typename CellCountPolicy = OnViolationThrow>
137 AdaptiveQuadrature(
double convergenceTolerance,
unsigned int initialCellCount,
unsigned int cellCountLimit)
160 template <
typename Integrand>
161 std::tuple<bool, typename Integrand::result_type, typename Integrand::result_type, unsigned int>
evaluate(
162 typename Integrand::argument_type l,
typename Integrand::argument_type r, Integrand ftor)
const;
165 template <
typename Integrand>
166 typename Integrand::result_type
operator()(
typename Integrand::argument_type l,
167 typename Integrand::argument_type r, Integrand ftor)
const;
202 template <
typename QuadRule1,
typename QuadRule2,
typename ConvergencePolicy,
typename CellCountPolicy>
203 template <
typename Integrand>
204 std::tuple<bool, typename Integrand::result_type, typename Integrand::result_type, unsigned int>
206 typename Integrand::argument_type l,
typename Integrand::argument_type r, Integrand ftor)
const
208 using std::make_pair;
216 stack<pair<Arg, Arg>> divStack;
219 unsigned int cellCounter;
220 bool NoMoreCells =
false;
226 Arg
const d = (r - l) / static_cast<Arg>(fInitialCellCount);
227 for (Arg b = l; b < r - 0.5 * d; b += d) {
228 divStack.push(make_pair(b, d));
232 cellCounter = fInitialCellCount;
236 while (!divStack.empty()) {
238 Arg
const b = divStack.top().first;
239 Arg
const d = divStack.top().second;
251 if ((ConvergencePolicy::evaluate(sum1, sum2) < fConvergenceTolerance) || NoMoreCells) {
252 cumulateSum1 += sum1;
253 cumulateSum2 += sum2;
260 NoMoreCells = !CellCountPolicy::check(cellCounter + 1 <= fCellCountLimit);
263 Arg
const dN = 0.5 * d;
264 divStack.push(make_pair(b + dN, dN));
265 divStack.push(make_pair(b, dN));
271 bool const status = (ConvergencePolicy::evaluate(cumulateSum1, cumulateSum2) < fConvergenceTolerance);
272 return std::make_tuple(status, cumulateSum1, cumulateSum2, cellCounter);
284 template <
typename QuadRule1,
typename QuadRule2,
typename ConvergencePolicy,
typename ErrorPolicy>
285 template <
typename Integrand>
287 operator()(
typename Integrand::argument_type l,
typename Integrand::argument_type r, Integrand ftor)
const
289 return std::get<2>(evaluate(l, r, ftor));
The AdaptiveQuadrature is a host class with policy classes QuadRule1, QuadRule2, ErrorPolicy and Conv...
void setCellCountLimit(unsigned int i)
Set cell count limit.
Used to disambiguate rules in AdaptiveQuadrature.
double getConvergenceTolerance() const
Return the convergence tolerance.
unsigned int fInitialCellCount
double fConvergenceTolerance
Used to disambiguate rules in AdaptiveQuadrature.
Given a quadrature rule, a new rule is generated that consists of applying the original rule on both ...
AQRule1< QuadRule1 > & rule1()
Return a reference to the first sum rule subobject.
void setConvergenceTolerance(double x)
Set the convergence tolerance.
Predefined policies for handling a cell count violation.
Template parameter provides policy for managing convergence criterion in AdaptiveQuadrature.
unsigned int fCellCountLimit
Utilities for the implementation of the Adaptive Quadrature.
void setInitialCellCount(unsigned int i)
Set initial cell count.
Integrand::result_type operator()(typename Integrand::argument_type l, typename Integrand::argument_type r, Integrand ftor) const
Simplified version of the evaluate member function, returns only second sum value.
static Ftor::result_type sum(typename Ftor::argument_type l, typename Ftor::argument_type d, Ftor const &f)
Execute the rule on the bisected cell.
unsigned int getCellCountLimit() const
Return the cell count limit.
unsigned int getInitialCellCount() const
Return the initial cell count.
typename std::remove_cv< typename std::remove_reference< T >::type >::type type
Template parameter provides policy for managing cell count in AdaptiveQuadrature. ...
C::value_type sum(C const &c)
AdaptiveQuadrature(double convergenceTolerance, unsigned int initialCellCount, unsigned int cellCountLimit)
Constructor initializes everything.
Predefined convergence policies for the AdaptiveQuadrature template.
AQRule2< QuadRule2 > & rule2()
Return a reference to the second sum rule subobject.
std::tuple< bool, typename Integrand::result_type, typename Integrand::result_type, unsigned int > evaluate(typename Integrand::argument_type l, typename Integrand::argument_type r, Integrand ftor) const
Evaluates the quadrature for a functor based on comparing two sum rules.