19 template<
typename time>
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++) {
26 sweeper->predict(initial & predict);
27 sweeper->post_predict();
31 sweeper->post_sweep();
44 template<
typename time>
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());
55 template<
typename time>
58 this->nsweeps = nsweeps;
61 template<
typename time>
64 for (; this->get_time() < this->get_end_time(); this->advance_time()) {
69 for (this->set_iteration(0);
70 this->get_iteration() < this->get_max_iterations() && !converged;
71 this->advance_iteration()) {
72 cycle_v(this->finest());
76 perform_sweeps(this->finest().level);
78 for (
auto l = this->finest(); l >= this->coarsest(); --l) {
79 l.current()->post_step();
82 if (this->get_time() + this->get_step_size() < this->get_end_time()) {
83 this->get_finest()->advance();
98 template<
typename time>
101 auto fine = level_iter.
current();
102 auto crse = level_iter.
coarse();
105 perform_sweeps(level_iter.
level);
107 if (level_iter == this->finest() && fine->converged()) {
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);
117 return level_iter - 1;
127 template<
typename time>
130 auto fine = level_iter.
current();
131 auto crse = level_iter.
coarse();
134 ML_CVLOG(1,
"Controller",
"Cycle up onto level " << level_iter.
level + 1 <<
"/" << this->nlevels());
135 trns->interpolate(fine, crse);
137 if (level_iter < this->finest()) {
138 perform_sweeps(level_iter.
level);
141 return level_iter + 1;
144 template<
typename time>
147 perform_sweeps(level_iter.
level);
148 return level_iter + 1;
157 template<
typename time>
160 if (level_iter.
level == 0) {
161 level_iter = cycle_bottom(level_iter);
163 level_iter = cycle_down(level_iter);
167 level_iter = cycle_v(level_iter);
168 level_iter = cycle_up(level_iter);
void setup(shared_ptr< WrapperInterface< scalar, time >> wrapper)
shared_ptr< R > coarse()
Get the next coarser level based on LevelIter::current()
Level (MLSDC/PFASST) iterator.
Multilevel SDC controller.
shared_ptr< R > transfer()
Get transfer operator for current level.
#define ML_CVLOG(verbose_level, logger_id, x)
same as CVLOG(verbosity, logger, x) from easylogging++
shared_ptr< R > current()
Get level this iterator is currently pointing at.