PFASST++
interface.hpp
Go to the documentation of this file.
1 
5 #ifndef _PFASST_CONTROLLER_HPP_
6 #define _PFASST_CONTROLLER_HPP_
7 
8 #include <cassert>
9 #include <deque>
10 #include <iterator>
11 #include <memory>
12 using namespace std;
13 
14 #include "pfasst/interfaces.hpp"
15 
16 
17 namespace pfasst
18 {
30  template<typename time = time_precision>
31  class Controller
32  {
33  protected:
35 
42  deque<shared_ptr<ISweeper<time>>> levels;
43 
49  deque<shared_ptr<ITransfer<time>>> transfer;
51 
53 
56  size_t step;
57 
61  size_t iteration;
62 
67 
71  time t;
72 
76  time dt;
77 
81  time tend;
83 
84  public:
86  Controller();
87  virtual ~Controller();
89 
91 
97  virtual void set_options(bool all_sweepers = true);
98 
106  virtual void setup();
107 
117  virtual void set_duration(time t0, time tend, time dt, size_t niters);
118 
126  virtual void add_level(shared_ptr<ISweeper<time>> sweeper,
127  shared_ptr<ITransfer<time>> transfer = shared_ptr<ITransfer<time>>(nullptr),
128  bool coarse = true);
130 
132 
135  virtual size_t nlevels();
136 
148  template<typename R = ISweeper<time>>
149  shared_ptr<R> get_level(size_t level)
150  {
151  shared_ptr<R> r = dynamic_pointer_cast<R>(levels[level]);
152  assert(r);
153  return r;
154  }
155 
162  template<typename R = ISweeper<time>>
163  shared_ptr<R> get_finest()
164  {
165  return get_level<R>(nlevels() - 1);
166  }
167 
174  template<typename R = ISweeper<time>>
175  shared_ptr<R> get_coarsest()
176  {
177  return get_level<R>(0);
178  }
179 
192  template<typename R = ITransfer<time>>
193  shared_ptr<R> get_transfer(size_t level)
194  {
195  shared_ptr<R> r = dynamic_pointer_cast<R>(transfer[level]);
196  assert(r);
197  return r;
198  }
200 
202 
209  virtual size_t get_step();
210 
216  virtual void set_step(size_t n);
217 
223  virtual time get_step_size();
224 
230  time get_dt() { return this->get_step_size(); }
231 
237  virtual time get_time();
238 
244  time get_t() { return this->get_time(); }
245 
251  virtual void advance_time(size_t nsteps = 1);
252 
258  virtual time get_end_time();
259 
265  virtual size_t get_iteration();
266 
272  virtual void set_iteration(size_t iter);
273 
279  virtual void advance_iteration();
280 
286  virtual size_t get_max_iterations();
288 
306  class LevelIter
307  : std::iterator<random_access_iterator_tag, shared_ptr<ISweeper<time>>, int,
308  ISweeper<time>*, ISweeper<time>>
309  {
310  protected:
315 
316  public:
318  typedef int difference_type;
319  typedef shared_ptr<ISweeper<time>> value_type;
322  typedef random_access_iterator_tag iterator_category;
324 
326  int level;
328 
330  LevelIter(int level, Controller* ts);
332 
334 
340  template<typename R = ISweeper<time>>
341  shared_ptr<R> current()
342  {
343  return ts->template get_level<R>(level);
344  }
345 
352  template<typename R = ISweeper<time>>
353  shared_ptr<R> fine()
354  {
355  return ts->template get_level<R>(level + 1);
356  }
357 
364  template<typename R = ISweeper<time>>
365  shared_ptr<R> coarse()
366  {
367  return ts->template get_level<R>(level - 1);
368  }
369 
376  template<typename R = ITransfer<time>>
377  shared_ptr<R> transfer()
378  {
379  return ts->template get_transfer<R>(level);
380  }
382 
387  // required by std::iterator
388  template<typename R = reference>
389  shared_ptr<R> operator*()
390  {
391  return current<R>();
392  }
393 
394  // required by std::input_iterator_tag
395  template<typename R = reference>
396  shared_ptr<R> operator->()
397  {
398  return current<R>();
399  }
400 
401  virtual LevelIter operator++();
402  virtual bool operator==(LevelIter i);
403  virtual bool operator!=(LevelIter i);
404  // required by std::bidirectional_iterator_tag
405  virtual LevelIter operator--();
406  // required by std::random_access_iterator_tag
407  virtual LevelIter operator- (difference_type i);
408  virtual LevelIter operator+ (difference_type i);
409  virtual bool operator<=(LevelIter i);
410  virtual bool operator>=(LevelIter i);
411  virtual bool operator< (LevelIter i);
412  virtual bool operator> (LevelIter i);
414  };
415 
417 
422  virtual LevelIter finest();
423 
429  virtual LevelIter coarsest();
431  };
432 } // ::pfasst
433 
435 
436 #endif
deque< shared_ptr< ITransfer< time > > > transfer
Ordered list of transfer operators for levels.
Definition: interface.hpp:49
time dt
Width of current time step (\( \Delta t \)).
Definition: interface.hpp:76
deque< shared_ptr< ISweeper< time > > > levels
Ordered list of all levels.
Definition: interface.hpp:42
ISweeper< time > * pointer
Definition: interface.hpp:320
time get_t()
Get start time point of current time step (alias for get_time).
Definition: interface.hpp:244
shared_ptr< R > fine()
Get the next finer level based on LevelIter::current()
Definition: interface.hpp:353
void setup(shared_ptr< WrapperInterface< scalar, time >> wrapper)
Base SDC/MLSDC/PFASST controller.
Definition: interface.hpp:31
shared_ptr< R > get_transfer(size_t level)
Retreive transfer operator for level level.
Definition: interface.hpp:193
STL namespace.
time get_dt()
Get width of current time step (alias for get_step_size).
Definition: interface.hpp:230
shared_ptr< R > coarse()
Get the next coarser level based on LevelIter::current()
Definition: interface.hpp:365
shared_ptr< R > get_level(size_t level)
Get sweeper for level with index level.
Definition: interface.hpp:149
Level (MLSDC/PFASST) iterator.
Definition: interface.hpp:306
shared_ptr< R > operator->()
Definition: interface.hpp:396
vector< precision > operator+(const vector< precision > &first, const vector< precision > &second)
time t
\( t_0 \) of current time step.
Definition: interface.hpp:71
time tend
\( T_{end} \) of last time step.
Definition: interface.hpp:81
size_t iteration
Current iteration index on current time step.
Definition: interface.hpp:61
Controller * ts
Controller this iterator is bound to.
Definition: interface.hpp:314
shared_ptr< R > operator*()
Definition: interface.hpp:389
random_access_iterator_tag iterator_category
Definition: interface.hpp:322
vector< precision > operator-(const vector< precision > &first, const vector< precision > &second)
interfaces for SDC/MLSDC/PFASST algorithms.
shared_ptr< R > transfer()
Get transfer operator for current level.
Definition: interface.hpp:377
shared_ptr< R > get_finest()
Get coarsest level.
Definition: interface.hpp:163
Abstract time/space transfer (restrict/interpolate) class.
Definition: interfaces.hpp:295
size_t step
Current time step index.
Definition: interface.hpp:56
shared_ptr< R > current()
Get level this iterator is currently pointing at.
Definition: interface.hpp:341
shared_ptr< ISweeper< time > > value_type
Definition: interface.hpp:319
ISweeper< time > reference
Definition: interface.hpp:321
Abstract SDC sweeper.
Definition: interfaces.hpp:164
size_t max_iterations
Maximum iterations per time step.
Definition: interface.hpp:66
shared_ptr< R > get_coarsest()
Get coarsest level.
Definition: interface.hpp:175