PFASST++
interface_impl.hpp
Go to the documentation of this file.
2 
3 #include "pfasst/config.hpp"
4 
5 
6 namespace pfasst
7 {
8  template<typename time>
10  : step(0)
11  , iteration(0)
12  , max_iterations(0)
13  , t(0.0)
14  , dt(0.0)
15  , tend(0.0)
16  {}
17 
18  template<typename time>
20  {}
21 
29  template<typename time>
30  void Controller<time>::set_options(bool all_sweepers)
31  {
32  this->tend = config::get_value<double>("tend", this->tend);
33  this->dt = config::get_value<double>("dt", this->dt);
34  this->max_iterations = config::get_value<size_t>("num_iters", this->max_iterations);
35 
36  // XXX: add some nice "nsteps" logic here
37 
38  if (all_sweepers) {
39  for (auto l = coarsest(); l <= finest(); ++l) {
40  l.current()->set_options();
41  }
42  }
43  }
44 
51  template<typename time>
53  {
54  for (auto l = coarsest(); l <= finest(); ++l) {
55  l.current()->set_controller(this);
56  l.current()->setup();
57  }
58  }
59 
60  template<typename time>
61  void Controller<time>::set_duration(time t0, time tend, time dt, size_t niters)
62  {
63  this->t = t0;
64  this->tend = tend;
65  this->dt = dt;
66  this->step = 0;
67  this->iteration = 0;
68  this->max_iterations = niters;
69  }
70 
71  template<typename time>
72  void Controller<time>::add_level(shared_ptr<ISweeper<time>> sweeper,
73  shared_ptr<ITransfer<time>> transfer,
74  bool coarse)
75  {
76  if (coarse) {
77  this->levels.push_front(sweeper);
78  this->transfer.push_front(transfer);
79  } else {
80  this->levels.push_back(sweeper);
81  this->transfer.push_back(transfer);
82  }
83  }
84 
85  template<typename time>
87  {
88  return levels.size();
89  }
90 
91  template<typename time>
93  {
94  return step;
95  }
96 
97  template<typename time>
99  {
100  t += ((int)n - (int)step) * dt;
101  step = n;
102  }
103 
104  template<typename time>
106  {
107  return dt;
108  }
109 
110  template<typename time>
112  {
113  return t;
114  }
115 
116  template<typename time>
117  void Controller<time>::advance_time(size_t nsteps)
118  {
119  step += nsteps;
120  t += nsteps * dt;
121  }
122 
123  template<typename time>
125  {
126  return tend;
127  }
128 
129  template<typename time>
131  {
132  return iteration;
133  }
134 
135  template<typename time>
137  {
138  this->iteration = iter;
139  }
140 
146  template<typename time>
148  {
149  iteration++;
150  }
151 
152  template<typename time>
154  {
155  return max_iterations;
156  }
157 
158  template<typename time>
160  {
161  return Controller<time>::LevelIter(nlevels() - 1, this);
162  }
163 
164  template<typename time>
166  {
167  return Controller<time>::LevelIter(0, this);
168  }
169 
170 
171  template<typename time>
173  : ts(ts)
174  , level(level)
175  {}
176 
177  template<typename time>
179  {
180  level++;
181  return *this;
182  }
183 
184  template<typename time>
186  {
187  return level == i.level;
188  }
189 
190  template<typename time>
192  {
193  return level != i.level;
194  }
195 
196  template<typename time>
198  {
199  level--;
200  return *this;
201  }
202 
203  template<typename time>
205  {
206  return LevelIter(level - i, ts);
207  }
208 
209  template<typename time>
211  {
212  return LevelIter(level + i, ts);
213  }
214 
215  template<typename time>
217  {
218  return level <= i.level;
219  }
220 
221  template<typename time>
223  {
224  return level >= i.level;
225  }
226 
227  template<typename time>
229  {
230  return level < i.level;
231  }
232 
233  template<typename time>
235  {
236  return level > i.level;
237  }
238 } // ::pfasst
virtual LevelIter operator+(difference_type i)
virtual time get_time()
Get start time point of current time step.
virtual time get_step_size()
Get width of current time step.
virtual bool operator<(LevelIter i)
virtual void set_options(bool all_sweepers=true)
Set options from command line etc.
Base SDC/MLSDC/PFASST controller.
Definition: interface.hpp:31
LevelIter(int level, Controller *ts)
virtual void advance_time(size_t nsteps=1)
Advance to a following time step.
virtual void set_step(size_t n)
Set current time step index.
virtual void add_level(shared_ptr< ISweeper< time >> sweeper, shared_ptr< ITransfer< time >> transfer=shared_ptr< ITransfer< time >>(nullptr), bool coarse=true)
Adding a level to the controller.
virtual size_t get_step()
Get current time step index.
virtual LevelIter operator--()
virtual bool operator!=(LevelIter i)
Level (MLSDC/PFASST) iterator.
Definition: interface.hpp:306
virtual bool operator>(LevelIter i)
virtual bool operator>=(LevelIter i)
virtual bool operator<=(LevelIter i)
virtual LevelIter finest()
Convenience accessor to the finest level.
virtual time get_end_time()
Get end time point of last time step.
virtual void set_duration(time t0, time tend, time dt, size_t niters)
Set basic time scope of the Controller.
virtual LevelIter operator-(difference_type i)
virtual void advance_iteration()
Advance to the next iteration.
virtual size_t get_max_iterations()
Get maximum number of allowed iterations per time step.
Abstract time/space transfer (restrict/interpolate) class.
Definition: interfaces.hpp:295
virtual size_t get_iteration()
Get current iteration index of current time step.
tuple t
Definition: plot.py:12
virtual size_t nlevels()
Total number of levels controlled by this Controller.
virtual LevelIter operator++()
virtual bool operator==(LevelIter i)
Abstract SDC sweeper.
Definition: interfaces.hpp:164
virtual void setup()
Basic setup routine for this controller.
virtual LevelIter coarsest()
Convenience accessor to the coarsest level.
float dt
Definition: plot.py:10
virtual void set_iteration(size_t iter)
Set current iteration of current time step.