1+ /* *
2+ * @file controller/interface.hpp
3+ * @since v0.1.0
4+ */
15#ifndef _PFASST_CONTROLLER_HPP_
26#define _PFASST_CONTROLLER_HPP_
37
@@ -17,39 +21,133 @@ namespace pfasst
1721 *
1822 * Base controller (see also SDC, MLSDC, and PFASST controllers).
1923 *
20- * @tparam time time precision;
21- * defaults to pfasst::time_precision
24+ * @tparam time time precision; defaults to pfasst::time_precision
25+ *
26+ * @since v0.1.0
27+ *
28+ * @todo Consider renaming `get_time_step`.
29+ * See [#161](https://github.com/Parallel-in-Time/PFASST/issues/161).
30+ *
31+ * @ingroup Controllers
2232 */
2333 template <typename time = time_precision>
2434 class Controller
2535 {
2636 protected:
2737 // ! @{
38+ /* *
39+ * ordered list of all levels.
40+ *
41+ * A level is represented by a sweeper implementing the ISweeper interface.
42+ *
43+ * @note The levels are ordered from coarsest (index `0`) to finest.
44+ */
2845 deque<shared_ptr<ISweeper<time>>> levels;
46+
47+ /* *
48+ * ordered list of transfer operators for levels.
49+ *
50+ * A transfer operator for a level must implement the ITransfer interface.
51+ */
2952 deque<shared_ptr<ITransfer<time>>> transfer;
3053 // ! @}
3154
3255 // ! @{
33- size_t step, iteration, max_iterations;
34- time t, dt, tend;
56+ /* *
57+ * current time step index.
58+ */
59+ size_t step;
60+
61+ /* *
62+ * current iteration index on current time step.
63+ */
64+ size_t iteration;
65+
66+ /* *
67+ * maximum iterations per time step.
68+ */
69+ size_t max_iterations;
70+
71+ /* *
72+ * \\( t_0 \\) of current time step.
73+ */
74+ time t;
75+
76+ /* *
77+ * width of current time step (\\( \\Delta t \\)).
78+ */
79+ time dt;
80+
81+ /* *
82+ * \\( T_{end} \\) of last time step.
83+ */
84+ time tend;
3585 // ! @}
3686
3787 public:
88+ // ! @{
3889 Controller ();
3990 virtual ~Controller ();
91+ // ! @}
4092
4193 // ! @{
94+ /* *
95+ * set options from command line etc.
96+ *
97+ * @param[in] all_sweepers if given also calls ISweeper::set_options for all already added
98+ * levels
99+ */
42100 virtual void set_options (bool all_sweepers = true );
101+
102+ /* *
103+ * basic setup routine for this controller.
104+ *
105+ * @pre It is expected (i.e. the user has to make that sure) that all levels and transfer
106+ * operators have been instantiated and added to this controller before calling
107+ * Controller::setup().
108+ */
43109 virtual void setup ();
110+
111+ /* *
112+ * set basic time scope of the Controller.
113+ *
114+ * @param[in] t0 time start point of the first time step
115+ * @param[in] tend time end point of the last time step
116+ * @param[in] dt width of one time step
117+ * @param[in] niters maximum number of iterations per time step
118+ * The total number of time steps will get computed internally if required.
119+ */
44120 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 ),
121+
122+ /* *
123+ * adding a level to the controller.
124+ *
125+ * @param[in] sweeper sweeper representing the level
126+ * @param[in] transfer corresponding transfer operator for the level
127+ * @param[in] coarse whether to add this level as a coarser one to the list of existing
128+ */
129+ virtual void add_level (shared_ptr<ISweeper<time>> sweeper,
130+ shared_ptr<ITransfer<time>> transfer = shared_ptr<ITransfer<time>>(nullptr ),
47131 bool coarse = true);
48132 // ! @}
49133
50134 // ! @{
135+ /* *
136+ * total number of levels controlled by this Controller.
137+ */
51138 virtual size_t nlevels ();
52139
140+ /* *
141+ * get sweeper for level with index @p level.
142+ *
143+ * @tparam R type of the level sweeper
144+ * @returns sweeper of type @p R for requested level
145+ *
146+ * @internals
147+ * @note Asserts sweeper for level @p level can be interpreted as @p R if `NDEBUG` is not
148+ * defined.
149+ * @endinternals
150+ */
53151 template <typename R = ISweeper<time>>
54152 shared_ptr<R> get_level (size_t level)
55153 {
@@ -58,18 +156,42 @@ namespace pfasst
58156 return r;
59157 }
60158
159+ /* *
160+ * get coarsest level.
161+ *
162+ * @tparam R type of the level sweeper
163+ * @see Controller::get_level() with `level=(Controller::nlevels() - 1)`
164+ */
61165 template <typename R = ISweeper<time>>
62166 shared_ptr<R> get_finest ()
63167 {
64168 return get_level<R>(nlevels () - 1 );
65169 }
66170
171+ /* *
172+ * get coarsest level.
173+ *
174+ * @tparam R type of the level sweeper
175+ * @see Controller::get_level() with `level=0`
176+ */
67177 template <typename R = ISweeper<time>>
68178 shared_ptr<R> get_coarsest ()
69179 {
70180 return get_level<R>(0 );
71181 }
72182
183+ /* *
184+ * retreive transfer operator for level @p level.
185+ *
186+ * @tparam R type of the requested transfer operator
187+ * @param[in] level level index to retreive transfer operator for
188+ * @returns transfer operator of requested type @p R for desired level
189+ *
190+ * @internals
191+ * @note Asserts transfer operator for level @p level can be interpreted as @p R if `NDEBUG`
192+ * is not defined.
193+ * @endinternals
194+ */
73195 template <typename R = ITransfer<time>>
74196 shared_ptr<R> get_transfer (size_t level)
75197 {
@@ -81,17 +203,75 @@ namespace pfasst
81203
82204 // ! @{
83205 /* *
84- * Get current time step number.
206+ * get current time step index.
207+ *
208+ * The time step number is zero-based, i.e. the first time step has index `0`.
209+ *
210+ * @returns current time step index
85211 */
86212 virtual size_t get_step ();
213+
214+ /* *
215+ * set current time step index.
216+ *
217+ * @param[in] n index of new time step
218+ */
87219 virtual void set_step (size_t n);
220+
221+ /* *
222+ * get width of current time step.
223+ *
224+ * @returns \\( \\Delta t \\) of current time step
225+ */
88226 virtual time get_time_step ();
227+
228+ /* *
229+ * get start time point of current time step.
230+ *
231+ * @returns \\( t_0 \\) of current time step
232+ */
89233 virtual time get_time ();
234+
235+ /* *
236+ * advance to a following time step
237+ *
238+ * @param[in] nsteps number of time steps to advance; `1` meaning the next step
239+ */
90240 virtual void advance_time (size_t nsteps = 1 );
241+
242+ /* *
243+ * get end time point of last time step.
244+ *
245+ * @returns \\( T_{end} \\) of last time step.
246+ */
91247 virtual time get_end_time ();
248+
249+ /* *
250+ * get current iteration index of current time step.
251+ *
252+ * @returns current iteration index of current time step.
253+ */
92254 virtual size_t get_iteration ();
255+
256+ /* *
257+ * set current iteration of current time step.
258+ *
259+ * @param[in] iter iteration index to set
260+ */
93261 virtual void set_iteration (size_t iter);
262+
263+ /* *
264+ * advance to the next iteration.
265+ *
266+ * This method may or may not trigger additional post-iteration procedures.
267+ */
94268 virtual void advance_iteration ();
269+
270+ /* *
271+ * get maximum number of allowed iterations per time step.
272+ *
273+ * @returns maximum allowed iterations per time step.
274+ */
95275 virtual size_t get_max_iterations ();
96276 // ! @}
97277
@@ -103,14 +283,23 @@ namespace pfasst
103283 * LevelIter::current(), LevelIter::fine() (i.e. `current+1`), and LevelIter::coarse()
104284 * (`current-1`) sweepers.
105285 *
106- * Under the hood it satisfies the requirements of std::random_access_iterator_tag, thus
107- * implementing a `RandomAccessIterator`.
286+ * @since v0.1.0
287+ *
288+ * @internals
289+ * Under the hood it satisfies the requirements of
290+ * [std::random_access_iterator_tag](http://en.cppreference.com/w/cpp/iterator/iterator_tags),
291+ * thus implementing a
292+ * [RandomAccessIterator](http://en.cppreference.com/w/cpp/concept/RandomAccessIterator).
293+ * @endinternals
108294 */
109295 class LevelIter
110- : iterator<random_access_iterator_tag, shared_ptr<ISweeper<time>>, int ,
111- ISweeper<time>*, ISweeper<time>>
296+ : std:: iterator<random_access_iterator_tag, shared_ptr<ISweeper<time>>, int ,
297+ ISweeper<time>*, ISweeper<time>>
112298 {
113299 protected:
300+ /* *
301+ * Controller this iterator is bound to.
302+ */
114303 Controller* ts;
115304
116305 public:
@@ -131,32 +320,59 @@ namespace pfasst
131320 // ! @}
132321
133322 // ! @{
323+ /* *
324+ * get level this iterator is currently pointing at.
325+ *
326+ * @tparam R type implementing ISweeper
327+ * @returns sweeper of type @p R this is currently pointing at
328+ */
134329 template <typename R = ISweeper<time>>
135330 shared_ptr<R> current ()
136331 {
137332 return ts->template get_level <R>(level);
138333 }
139334
335+ /* *
336+ * get the next finer level based on LevelIter::current()
337+ *
338+ * @tparam R type implementing ISweeper
339+ * @returns next finer sweeper with respect to current()
340+ */
140341 template <typename R = ISweeper<time>>
141342 shared_ptr<R> fine ()
142343 {
143344 return ts->template get_level <R>(level + 1 );
144345 }
145346
347+ /* *
348+ * get the next coarser level based on LevelIter::current()
349+ *
350+ * @tparam R type implementing ISweeper
351+ * @returns next coarser sweeper with respect to current()
352+ */
146353 template <typename R = ISweeper<time>>
147354 shared_ptr<R> coarse ()
148355 {
149356 return ts->template get_level <R>(level - 1 );
150357 }
151358
359+ /* *
360+ * get transfer operator for current level.
361+ *
362+ * @tparam R type implementing ITransfer
363+ * @returns transfer operator for current level
364+ */
152365 template <typename R = ITransfer<time>>
153366 shared_ptr<R> transfer ()
154367 {
155368 return ts->template get_transfer <R>(level);
156369 }
157370 // ! @}
158371
159- // ! @{
372+ /* *
373+ * @name Standard Operators for Iterators
374+ * @{
375+ */
160376 // required by std::iterator
161377 template <typename R = reference>
162378 shared_ptr<R> operator *()
@@ -187,7 +403,18 @@ namespace pfasst
187403 };
188404
189405 // ! @{
406+ /* *
407+ * convenience accessor to the finest level.
408+ *
409+ * @returns iterator to the finest level.
410+ */
190411 virtual LevelIter finest ();
412+
413+ /* *
414+ * convenience accessor to the coarsest level.
415+ *
416+ * @returns iterator to the coarsest level.
417+ */
191418 virtual LevelIter coarsest ();
192419 // ! @}
193420 };
0 commit comments