Skip to content

Commit 55a804d

Browse files
committed
docu: improve controller interfaces
1 parent d04f309 commit 55a804d

File tree

8 files changed

+530
-134
lines changed

8 files changed

+530
-134
lines changed

include/pfasst/controller/interface.hpp

Lines changed: 239 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
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

Comments
 (0)