PFASST++
mlsdc_impl.hpp
Go to the documentation of this file.
2 
3 #include <algorithm>
4 using namespace std;
5 
6 #include "pfasst/logging.hpp"
7 
8 
9 namespace pfasst
10 {
19  template<typename time>
20  void MLSDC<time>::perform_sweeps(size_t level)
21  {
22  auto sweeper = this->get_level(level);
23  ML_CVLOG(1, "Controller", "on level " << level + 1 << "/" << this->nlevels());
24  for (size_t s = 0; s < this->nsweeps[level]; s++) {
25  if (predict) {
26  sweeper->predict(initial & predict);
27  sweeper->post_predict();
28  predict = false;
29  } else {
30  sweeper->sweep();
31  sweeper->post_sweep();
32  }
33  }
34  }
35 
44  template<typename time>
46  {
47  this->nsweeps.resize(this->nlevels());
48  fill(this->nsweeps.begin(), this->nsweeps.end(), 1);
49  for (auto leviter = this->coarsest(); leviter <= this->finest(); ++leviter) {
50  leviter.current()->set_controller(this);
51  leviter.current()->setup(leviter != this->finest());
52  }
53  }
54 
55  template<typename time>
56  void MLSDC<time>::set_nsweeps(vector<size_t> nsweeps)
57  {
58  this->nsweeps = nsweeps;
59  }
60 
61  template<typename time>
63  {
64  for (; this->get_time() < this->get_end_time(); this->advance_time()) {
65  predict = true;
66  initial = true;
67  converged = false;
68 
69  for (this->set_iteration(0);
70  this->get_iteration() < this->get_max_iterations() && !converged;
71  this->advance_iteration()) {
72  cycle_v(this->finest());
73  initial = false;
74  }
75 
76  perform_sweeps(this->finest().level);
77 
78  for (auto l = this->finest(); l >= this->coarsest(); --l) {
79  l.current()->post_step();
80  }
81 
82  if (this->get_time() + this->get_step_size() < this->get_end_time()) {
83  this->get_finest()->advance();
84  }
85  }
86  }
87 
98  template<typename time>
100  {
101  auto fine = level_iter.current();
102  auto crse = level_iter.coarse();
103  auto trns = level_iter.transfer();
104 
105  perform_sweeps(level_iter.level);
106 
107  if (level_iter == this->finest() && fine->converged()) {
108  converged = true;
109  return level_iter;
110  }
111 
112  ML_CVLOG(1, "Controller", "Cycle down onto level " << level_iter.level << "/" << this->nlevels());
113  trns->restrict(crse, fine, initial);
114  trns->fas(this->get_step_size(), crse, fine);
115  crse->save();
116 
117  return level_iter - 1;
118  }
119 
127  template<typename time>
129  {
130  auto fine = level_iter.current();
131  auto crse = level_iter.coarse();
132  auto trns = level_iter.transfer();
133 
134  ML_CVLOG(1, "Controller", "Cycle up onto level " << level_iter.level + 1 << "/" << this->nlevels());
135  trns->interpolate(fine, crse);
136 
137  if (level_iter < this->finest()) {
138  perform_sweeps(level_iter.level);
139  }
140 
141  return level_iter + 1;
142  }
143 
144  template<typename time>
146  {
147  perform_sweeps(level_iter.level);
148  return level_iter + 1;
149  }
150 
157  template<typename time>
159  {
160  if (level_iter.level == 0) {
161  level_iter = cycle_bottom(level_iter);
162  } else {
163  level_iter = cycle_down(level_iter);
164  if (converged) {
165  return level_iter;
166  }
167  level_iter = cycle_v(level_iter);
168  level_iter = cycle_up(level_iter);
169  }
170  return level_iter;
171  }
172 } // ::pfasst
void setup(shared_ptr< WrapperInterface< scalar, time >> wrapper)
STL namespace.
shared_ptr< R > coarse()
Get the next coarser level based on LevelIter::current()
Definition: interface.hpp:365
Level (MLSDC/PFASST) iterator.
Definition: interface.hpp:306
Multilevel SDC controller.
Definition: mlsdc.hpp:24
shared_ptr< R > transfer()
Get transfer operator for current level.
Definition: interface.hpp:377
#define ML_CVLOG(verbose_level, logger_id, x)
same as CVLOG(verbosity, logger, x) from easylogging++
Definition: logging.hpp:131
shared_ptr< R > current()
Get level this iterator is currently pointing at.
Definition: interface.hpp:341