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+
1613namespace 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