diff options
Diffstat (limited to 'src/utilities/benchmarkUtil.h')
| -rw-r--r-- | src/utilities/benchmarkUtil.h | 144 | 
1 files changed, 144 insertions, 0 deletions
diff --git a/src/utilities/benchmarkUtil.h b/src/utilities/benchmarkUtil.h new file mode 100644 index 0000000..3c93b05 --- /dev/null +++ b/src/utilities/benchmarkUtil.h @@ -0,0 +1,144 @@ +#ifndef BENCHMARK_UTIL_H +#define BENCHMARK_UTIL_H + +#include <deque> +#include "io/ostreamManager.h" +#include "functors/analytical/analyticalF.h" + +namespace olb { + +namespace util { + +/// Check time-convergence of a scalar. +/** This class is useful, for example to check convergence of + * the velocity field for the simulation of a stationary flow. + * Convergence is claimed when the standard deviation of the + * monitored value is smaller than epsilon times the average. + * The statistics are taken over a macroscopic time scale of the + * system. + */ +template<typename T> +class ValueTracer { +public: +  /// Ctor. +  /** \param u The characteristic velocity of the system, for +   *          computation of the characteristic time scale. +   * \param L The characteristic length of the system, for +   *          computation of the characteristic time scale. +   * \param epsilon Precision of the convergence. +   */ +  ValueTracer(T u, T L, T epsilon); +  /// Ctor. +  /** \param deltaT   corresponds to iteration steps (averaging) +  \*  \param epsilon  allowed derivation of quantity +  */ +  ValueTracer(int deltaT, T epsilon); +  /// Change values of u and L to update characteristic scales of the system. +  void resetScale(T u, T L); +  /// reinitializes the values +  void resetValues(); +  /// Get characteristic time scale. +  int getDeltaT() const; +  /// Feed the object with a new measured scalar. +  void takeValue(T val, bool doPrint=false); +  /// Test for convergence, with respect to stdDev. +  bool hasConverged() const; +  /// Test for convergence, with respect to difference between min and max value; +  bool convergenceCheck() const; +  /// Test for convergence, with respect to difference between min and max value; +  bool hasConvergedMinMax() const; +  T computeAverage() const; +  T computeStdDev(T average) const; +  void setEpsilon(T epsilon); +private: +  int    _deltaT; +  T      _epsilon; +  int    _t; +  bool   _converged; +  std::deque<T> _values; +  mutable OstreamManager clout; +}; + +/// Propose successive test values of a scalar (e.g. Re) to check stability of a system. +/** At first, the stability limit is explored by constant + * increments/decrements of the scalar, and then, by successive + * bisection. + */ +template<typename T> +class BisectStepper { +public: +  /// The only constructor. +  /** \param _iniVal Initial guess for the stability limit. +   * \param _step   Step size at which the value is initially +   *                incremented/decremented. +   */ +  BisectStepper(T _iniVal, T _step=0.); +  /// Get new value, and indicate if the previous value yielded a stable system or not. +  T getVal(bool stable, bool doPrint=false); +  /// Test for convergence. +  bool hasConverged(T epsilon) const; +private: +  T iniVal, currentVal, lowerVal, upperVal; +  T step; +  enum {first, up, down, bisect} state; +  mutable OstreamManager clout; +}; + +/// 1D Newton simple scheme +template<typename T> +class Newton1D { + +protected: +  AnalyticalF1D<T,T>& _f; +  AnalyticalDiffFD1D<T> _df; +  T _yValue; +  T _eps; +  int _maxIterations; + +public: +  Newton1D(AnalyticalF1D<T,T>& f, T yValue = T(), T eps = 1.e-8, int maxIterations = 100); + +  T solve(T startValue, bool print=false); +}; + +/// Trapezoidal rule +template<typename T> +class TrapezRuleInt1D { + +protected: +  AnalyticalF1D<T,T>& _f; + +public: +  TrapezRuleInt1D(AnalyticalF1D<T,T>& f); + +  T integrate(T min, T max, int nSteps); +}; + +/** Simple circular buffer to compute average and other quantities + *  over pre-defined temporal windows. + *  Works with every T supporting += (T or scalar), and /= (scalar) operations, + *  including double and Vector<double, size>. + */ +template<typename T> +class CircularBuffer { +public: +  CircularBuffer(int size); +  /// insert a new entry ed eventually erases the oldest one +  void insert(T entry); +  /// average over all the entries +  T average(); +  /// get reference to the last entry for pos=0, the second-to-last for pos=1, and so on +  T& get(int pos); +  /// return size of the buffer +  int getSize(); +   +private: +  int _size; +  std::vector<T> _data; +}; + +} // namespace util + +} // namespace olb + +#endif  | 
