-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTimeStepper.h
More file actions
93 lines (74 loc) · 1.75 KB
/
TimeStepper.h
File metadata and controls
93 lines (74 loc) · 1.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <array>
enum TIMESTEPPER_MODE {ONE_DT, TWO_DT};
class TimeStepper
{
public:
TimeStepper(){};
TimeStepper (double tmin_input, double tmax_input, double dt_input);
// dt12[0] if crit_input(t)==true, otherwise dt12[1]
TimeStepper (double tmin_input, double tmax_input, std::array<double,2> dt12_input, bool (*crit_input)(double));
double operator*() {return t;}
double step()
{
double dt_full = fullstep(t);
double tnew = t+dt_full;
return (tnew<tmax)? dt_full:tmax-t;
}
double fullstep (double tval)
{
if (MODE == ONE_DT)
{
return dt;
}
else if (MODE == TWO_DT)
{
return (crit(tval))? dt12[0]:dt12[1];
}
}
void operator++()
{
tcmp += fullstep(t);
t += step();
};
TimeStepper& operator= (const double &trhs) {t=trhs; return *this;}
bool operator<= (const double &trhs) {
// cout << "tcmp=" << tcmp << ", trhs=" << trhs << ", bool=" << (tcmp<=trhs) << endl;
return tcmp<=trhs;
}
bool operator== (const double &trhs) {return tcmp==trhs;}
double begin();
double end();
private:
TIMESTEPPER_MODE MODE;
double tmin, tmax, dt;
double t;
double tcmp; // needed for comparison tcmp>tmax to ensure correct endpoint of iterator
bool (*crit)(double);
std::array<double,2> dt12;
};
TimeStepper::
TimeStepper (double tmin_input, double tmax_input, double dt_input)
:tmin(tmin_input), tmax(tmax_input), dt(dt_input)
{
t = tmin;
tcmp = tmin;
MODE = ONE_DT;
}
TimeStepper::
TimeStepper (double tmin_input, double tmax_input, std::array<double,2> dt12_input, bool (*crit_input)(double))
:tmin(tmin_input), tmax(tmax_input), dt12(dt12_input), crit(crit_input)
{
t = tmin;
tcmp = tmin;
MODE = TWO_DT;
}
double TimeStepper::
begin()
{
return tmin;
}
double TimeStepper::
end()
{
return tmax+fullstep(tmax);
}