24#ifndef BENCHMARK_UTIL_HH
25#define BENCHMARK_UTIL_HH
46 : _deltaT((int)(L/u/2.)),
50 clout(std::cout,
"ValueTracer")
59 clout(std::cout,
"ValueTracer")
68 clout(std::cout,
"ValueTracer "+name)
80 _values.push_back(val);
81 if ((
int)_values.size() >
util::abs(_deltaT)) {
82 _values.erase(_values.begin());
83 if (doPrint && _t%_deltaT==0) {
85 T stdDev = computeStdDev(
average);
86 clout <<
"average=" <<
average <<
"; stdDev/average=" << stdDev/
average << std::endl;
96 _deltaT = (int) (L/u/2.);
97 if ( (
int)_values.size() >
util::abs(_deltaT) ) {
98 _values.erase(_values.begin(), _values.begin() + (_values.size()-_deltaT) );
106 if ((
int)_values.size() > 0) {
107 _values.erase(_values.begin(), _values.begin() + _values.size() );
114 if ((
int)_values.size() <
util::abs(_deltaT)) {
119 T stdDev = computeStdDev(
average);
120 if (!std::isnan(stdDev/
average)) {
124 clout <<
"simulation diverged." << std::endl;
132 if ((
int)_values.size() <
util::abs(_deltaT)) {
137 T stdDev = computeStdDev(
average);
138 if (!std::isnan(stdDev/
average)) {
142 clout <<
"simulation diverged." << std::endl;
150 if ((
int)_values.size() <
util::abs(_deltaT)) {
154 T minEl = *
min_element(_values.begin(), _values.end());
155 T maxEl = *
max_element(_values.begin(), _values.end());
157 return (maxEl - minEl)/
average < _epsilon;
164 return std::accumulate(_values.begin(), _values.end(), 0.) / _values.size();
170 int n = _values.size();
172 for (
int i=0; i<n; ++i) {
196 : iniVal(_iniVal), step(_step), state(first), clout(std::cout,
"BisectStepper")
207 std::stringstream message;
211 currentVal = iniVal+step;
213 message <<
"[" << iniVal <<
",infty]";
216 currentVal = iniVal-step;
218 message <<
"[-infty," << iniVal <<
"]";
223 message <<
"[" << currentVal <<
",infty]";
227 lowerVal = currentVal-step;
228 upperVal = currentVal;
229 currentVal = 0.5*(lowerVal+upperVal);
231 message <<
"[" << lowerVal <<
"," << upperVal <<
"]";
236 message <<
"[-infty," << currentVal <<
"]";
240 lowerVal = currentVal;
241 upperVal = currentVal+step;
242 currentVal = 0.5*(lowerVal+upperVal);
244 message <<
"[" << lowerVal <<
"," << upperVal <<
"]";
249 lowerVal = currentVal;
252 upperVal = currentVal;
254 currentVal = 0.5*(lowerVal+upperVal);
255 message <<
"[" << lowerVal <<
"," << upperVal <<
"]";
259 clout <<
"Value in range " << message.str() << std::endl;
267 return (state==bisect) && ((upperVal-lowerVal)/lowerVal < epsilon);
280 T fValue[1], dfValue[1], x[1];
284 for (
int i=0; i<_maxIterations && eps>_eps; i++) {
289 std::cout <<
"newtonStep=" << i <<
"; eps=" << eps <<
"; x=" << x[0] <<
"; f(x)="<< fValue[0] <<
"; df(x)="<< dfValue[0] << std::endl;
291 x[0] -= (fValue[0] - _yValue)/dfValue[0];
304 T integral[1], tmp[1], min_[1], max_[1], x[1], deltax[0];
307 deltax[0] = (
max -
min) / nSteps;
309 integral[0] = 0.5 * tmp[0];
311 for (
int i = 1; i < nSteps; i++) {
314 integral[0] += tmp[0];
318 integral[0] += 0.5*tmp[0];
319 integral[0] *= deltax[0];
321 std::cout <<
"Itnegral=" << integral[0] << std::endl;
335 _data.push_back(entry);
336 if (_data.size() >
static_cast<unsigned int>(_size) ) {
337 _data.erase( _data.begin() );
345 for (
auto i=_data.begin(); i!=_data.end(); i++) {
348 avg *= 1. / _data.size();
360 return _data.front();
363 return _data[_size - 1 - pos];;
373template<
typename T,
typename S>
375 const std::function<T(
int)> smoothingFactorFunction)
377 _smoothingFactorFunction(smoothingFactorFunction),
381template<
typename T,
typename S>
384 if (_noOfEntries == 0) {
391 S smoothingFactor = _smoothingFactorFunction(_noOfEntries);
392 _EMA = val* smoothingFactor + _EMA * (1 - smoothingFactor);
396template<
typename T,
typename S>
403template<
typename T,
typename S>
BisectStepper(T _iniVal, T _step=0.)
The only constructor.
T getVal(bool stable, bool doPrint=false)
Get new value, and indicate if the previous value yielded a stable system or not.
bool hasConverged(T epsilon) const
Test for convergence.
void insert(T entry)
insert a new entry ed eventually erases the oldest one
T & get(int pos)
get reference to the last entry for pos=0, the second-to-last for pos=1, and so on
T average()
average over all the entries
int getSize()
return size of the buffer
void resetNoOfEntries()
reset number of entries
void takeValue(const T val)
compute next EMA with given value
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
ExponentialMovingAverage(const std::function< T(int)> smoothingFactorFunction=[](int i) -> T { return 2./(1+i);})
(constructor)
T solve(T startValue, bool print=false)
Newton1D(AnalyticalF1D< T, T > &f, T yValue=T(), T eps=1.e-8, int maxIterations=100)
TrapezRuleInt1D(AnalyticalF1D< T, T > &f)
T integrate(T min, T max, int nSteps)
bool hasConverged() const
Test for convergence, with respect to stdDev.
int getDeltaT() const
Get characteristic time scale.
bool convergenceCheck() const
Test for convergence, with respect to difference between min and max value;.
void resetScale(T u, T L)
Change values of u and L to update characteristic scales of the system.
void setEpsilon(T epsilon)
bool hasConvergedMinMax() const
Test for convergence, with respect to difference between min and max value;.
ValueTracer(T u, T L, T epsilon)
Ctor.
void takeValue(T val, bool doPrint=false)
Feed the object with a new measured scalar.
T computeStdDev(T average) const
void resetValues()
reinitializes the values
cpu::simd::Pack< T > sqrt(cpu::simd::Pack< T > value)
ADf< T, DIM > abs(const ADf< T, DIM > &a)
cpu::simd::Pack< T > min(cpu::simd::Pack< T > rhs, cpu::simd::Pack< T > lhs)
T average(const Vector< T, Size > &a)
computes the average of all elements
T max_element(const Vector< T, Size > &a)
finds maximum element of all elements
cpu::simd::Pack< T > max(cpu::simd::Pack< T > rhs, cpu::simd::Pack< T > lhs)
T min_element(const Vector< T, Size > &a)
finds minimum element of all elements
cpu::simd::Pack< T > fabs(cpu::simd::Pack< T > value)
bool nearZero(const ADf< T, DIM > &a)
void print(U data, const std::string &name="", OstreamManager clout=OstreamManager(std::cout,"print"), const char delimiter=',')
Top level namespace for all of OpenLB.