Skip to content

Commit ff7d4a8

Browse files
committed
internals: splitting up decls/defs for controller
towards fixing #84
1 parent aa2b097 commit ff7d4a8

File tree

2 files changed

+288
-142
lines changed

2 files changed

+288
-142
lines changed

include/pfasst/controller.hpp

Lines changed: 67 additions & 142 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
1-
/*
2-
* Base controller (see also SDC, MLSDC, and PFASST controllers).
3-
*/
4-
51
#ifndef _PFASST_CONTROLLER_HPP_
62
#define _PFASST_CONTROLLER_HPP_
73

8-
#include <deque>
9-
#include <memory>
104
#include <cassert>
5+
#include <deque>
116
#include <iterator>
12-
#include <iostream>
7+
#include <memory>
8+
using namespace std;
139

1410
#include "interfaces.hpp"
1511

12+
1613
namespace pfasst
1714
{
1815
/**
1916
* base SDC/MLSDC/PFASST controller.
20-
* @tparam time time precision
17+
*
18+
* Base controller (see also SDC, MLSDC, and PFASST controllers).
19+
*
20+
* @tparam time time precision;
2121
* defaults to pfasst::time_precision
2222
*/
2323
template<typename time = time_precision>
@@ -35,75 +35,33 @@ namespace pfasst
3535
//! @}
3636

3737
public:
38-
Controller()
39-
{
40-
this->t = 0.0;
41-
this->tend = 0.0;
42-
this->dt = 0.0;
43-
this->step = 0;
44-
this->iteration = 0;
45-
}
38+
Controller();
39+
virtual ~Controller();
4640

4741
//! @{
48-
virtual void set_options(bool all_sweepers=true)
49-
{
50-
this->tend = config::get_value<double>("tend", this->tend);
51-
this->dt = config::get_value<double>("dt", this->dt);
52-
this->max_iterations = config::get_value<size_t>("num_iters", this->max_iterations);
53-
54-
// XXX: add some nice "nsteps" logic here
55-
56-
if (all_sweepers) {
57-
for (auto l = coarsest(); l <= finest(); ++l) {
58-
l.current()->set_options();
59-
}
60-
}
61-
}
62-
63-
virtual void setup()
64-
{
65-
for (auto l = coarsest(); l <= finest(); ++l) {
66-
l.current()->set_controller(this);
67-
l.current()->setup();
68-
}
69-
}
70-
71-
void set_duration(time t0, time tend, time dt, size_t niters)
72-
{
73-
this->t = t0;
74-
this->tend = tend;
75-
this->dt = dt;
76-
this->step = 0;
77-
this->iteration = 0;
78-
this->max_iterations = niters;
79-
}
80-
81-
void add_level(shared_ptr<ISweeper<time>> swpr,
82-
shared_ptr<ITransfer<time>> trnsfr = shared_ptr<ITransfer<time>>(nullptr),
83-
bool coarse = true)
84-
{
85-
if (coarse) {
86-
levels.push_front(swpr);
87-
transfer.push_front(trnsfr);
88-
} else {
89-
levels.push_back(swpr);
90-
transfer.push_back(trnsfr);
91-
}
92-
}
42+
virtual void set_options(bool all_sweepers = true);
43+
virtual void setup();
44+
virtual void set_duration(time t0, time tend, time dt, size_t niters);
45+
virtual void add_level(shared_ptr<ISweeper<time>> swpr,
46+
shared_ptr<ITransfer<time>> trnsfr = shared_ptr<ITransfer<time>>(nullptr),
47+
bool coarse = true);
9348
//! @}
9449

9550
//! @{
51+
virtual size_t nlevels();
52+
9653
template<typename R = ISweeper<time>>
9754
shared_ptr<R> get_level(size_t level)
9855
{
99-
shared_ptr<R> r = dynamic_pointer_cast<R>(levels[level]); assert(r);
56+
shared_ptr<R> r = dynamic_pointer_cast<R>(levels[level]);
57+
assert(r);
10058
return r;
10159
}
10260

10361
template<typename R = ISweeper<time>>
10462
shared_ptr<R> get_finest()
10563
{
106-
return get_level<R>(nlevels()-1);
64+
return get_level<R>(nlevels() - 1);
10765
}
10866

10967
template<typename R = ISweeper<time>>
@@ -115,14 +73,26 @@ namespace pfasst
11573
template<typename R = ITransfer<time>>
11674
shared_ptr<R> get_transfer(size_t level)
11775
{
118-
shared_ptr<R> r = dynamic_pointer_cast<R>(transfer[level]); assert(r);
76+
shared_ptr<R> r = dynamic_pointer_cast<R>(transfer[level]);
77+
assert(r);
11978
return r;
12079
}
80+
//! @}
12181

122-
size_t nlevels()
123-
{
124-
return levels.size();
125-
}
82+
//! @{
83+
/**
84+
* Get current time step number.
85+
*/
86+
virtual size_t get_step();
87+
virtual void set_step(size_t n);
88+
virtual time get_time_step();
89+
virtual time get_time();
90+
virtual void advance_time(size_t nsteps = 1);
91+
virtual time get_end_time();
92+
virtual size_t get_iteration();
93+
virtual void set_iteration(size_t iter);
94+
virtual void advance_iteration();
95+
virtual size_t get_max_iterations();
12696
//! @}
12797

12898
/**
@@ -140,6 +110,7 @@ namespace pfasst
140110
: iterator<random_access_iterator_tag, shared_ptr<ISweeper<time>>, int,
141111
ISweeper<time>*, ISweeper<time>>
142112
{
113+
protected:
143114
Controller* ts;
144115

145116
public:
@@ -156,9 +127,7 @@ namespace pfasst
156127
//! @}
157128

158129
//! @{
159-
LevelIter(int level, Controller* ts)
160-
: ts(ts), level(level)
161-
{ }
130+
LevelIter(int level, Controller* ts);
162131
//! @}
163132

164133
//! @{
@@ -167,16 +136,19 @@ namespace pfasst
167136
{
168137
return ts->template get_level<R>(level);
169138
}
139+
170140
template<typename R = ISweeper<time>>
171141
shared_ptr<R> fine()
172142
{
173143
return ts->template get_level<R>(level + 1);
174144
}
145+
175146
template<typename R = ISweeper<time>>
176147
shared_ptr<R> coarse()
177148
{
178149
return ts->template get_level<R>(level - 1);
179150
}
151+
180152
template<typename R = ITransfer<time>>
181153
shared_ptr<R> transfer()
182154
{
@@ -187,88 +159,41 @@ namespace pfasst
187159
//! @{
188160
// required by std::iterator
189161
template<typename R = reference>
190-
shared_ptr<R> operator*() { return current<R>(); }
191-
LevelIter operator++() { level++; return *this; }
162+
shared_ptr<R> operator*()
163+
{
164+
return current<R>();
165+
}
166+
192167
// required by std::input_iterator_tag
193168
template<typename R = reference>
194-
shared_ptr<R> operator->() { return current<R>(); }
195-
bool operator==(LevelIter i) { return level == i.level; }
196-
bool operator!=(LevelIter i) { return level != i.level; }
169+
shared_ptr<R> operator->()
170+
{
171+
return current<R>();
172+
}
173+
174+
virtual LevelIter operator++();
175+
virtual bool operator==(LevelIter i);
176+
virtual bool operator!=(LevelIter i);
197177
// required by std::bidirectional_iterator_tag
198-
LevelIter operator--() { level--; return *this; }
178+
virtual LevelIter operator--();
199179
// required by std::random_access_iterator_tag
200-
LevelIter operator- (difference_type i) { return LevelIter(level - i, ts); }
201-
LevelIter operator+ (difference_type i) { return LevelIter(level + i, ts); }
202-
bool operator<=(LevelIter i) { return level <= i.level; }
203-
bool operator>=(LevelIter i) { return level >= i.level; }
204-
bool operator< (LevelIter i) { return level < i.level; }
205-
bool operator> (LevelIter i) { return level > i.level; }
180+
virtual LevelIter operator- (difference_type i);
181+
virtual LevelIter operator+ (difference_type i);
182+
virtual bool operator<=(LevelIter i);
183+
virtual bool operator>=(LevelIter i);
184+
virtual bool operator< (LevelIter i);
185+
virtual bool operator> (LevelIter i);
206186
//! @}
207187
};
208188

209189
//! @{
210-
LevelIter finest() { return LevelIter(nlevels() - 1, this); }
211-
LevelIter coarsest() { return LevelIter(0, this); }
212-
//! @}
213-
214-
//! @{
215-
/**
216-
* Get current time step number.
217-
*/
218-
size_t get_step()
219-
{
220-
return step;
221-
}
222-
223-
void set_step(size_t n)
224-
{
225-
t += (n - step)*dt;
226-
step = n;
227-
}
228-
229-
time get_time_step()
230-
{
231-
return dt;
232-
}
233-
234-
time get_time()
235-
{
236-
return t;
237-
}
238-
239-
void advance_time(size_t nsteps=1)
240-
{
241-
step += nsteps;
242-
t += nsteps*dt;
243-
}
244-
245-
time get_end_time()
246-
{
247-
return tend;
248-
}
249-
250-
size_t get_iteration()
251-
{
252-
return iteration;
253-
}
254-
255-
void set_iteration(size_t iter)
256-
{
257-
this->iteration = iter;
258-
}
259-
260-
void advance_iteration()
261-
{
262-
iteration++;
263-
}
264-
265-
size_t get_max_iterations()
266-
{
267-
return max_iterations;
268-
}
190+
virtual LevelIter finest();
191+
virtual LevelIter coarsest();
269192
//! @}
270193
};
271194

272195
} // ::pfasst
273196

197+
#include "controller_impl.hpp"
198+
274199
#endif

0 commit comments

Comments
 (0)