@@ -89,6 +89,24 @@ namespace pfasst
8989 initial = true ;
9090 }
9191
92+ int tag (int level)
93+ {
94+ return level * 10000 + this ->get_iteration () + 10 ;
95+ }
96+
97+ int tag (LevelIter l)
98+ {
99+ return tag (l.level );
100+ }
101+
102+ void post ()
103+ {
104+ for (auto l = this ->coarsest () + 1 ; l <= this ->finest (); ++l) {
105+ l.current ()->post (comm, tag (l));
106+ }
107+ }
108+
109+
92110 /* *
93111 * Evolve ODE using PFASST.
94112 *
@@ -113,30 +131,8 @@ namespace pfasst
113131
114132 for (this ->set_iteration (0 ); this ->get_iteration () < this ->get_max_iterations ();
115133 this ->advance_iteration ()) {
116- for (auto l = this ->coarsest () + 1 ; l <= this ->finest (); ++l) {
117- int tag = l.level * 10000 + this ->get_iteration () + 10 ;
118- l.current ()->post (comm, tag);
119- }
120-
121- perform_sweeps (this ->nlevels () - 1 );
122-
123- // note: convergence checks belong here...
124-
125- auto fine = this ->get_level (this ->nlevels () - 1 );
126- auto crse = this ->get_level (this ->nlevels () - 2 );
127- auto trns = this ->get_transfer (this ->nlevels () - 1 );
128-
129- int tag = (this ->nlevels () - 1 ) * 10000 + this ->get_iteration () + 10 ;
130- fine->send (comm, tag, false );
131- trns->restrict (crse, fine, true );
132- trns->fas (this ->get_time_step (), crse, fine);
133- crse->save ();
134-
135- cycle_v (this ->finest () - 1 );
136-
137- trns->interpolate (fine, crse, true );
138- fine->recv (comm, tag, false );
139- trns->interpolate_initial (fine, crse);
134+ post ();
135+ cycle_v (this ->finest ());
140136 }
141137
142138 if (nblock < nblocks - 1 ) {
@@ -156,8 +152,11 @@ namespace pfasst
156152
157153 perform_sweeps (l.level );
158154
159- int tag = l.level * 10000 + this ->get_iteration () + 10 ;
160- fine->send (comm, tag, false );
155+ if (l == this ->finest ()) {
156+ // note: convergence tests belong here
157+ }
158+
159+ fine->send (comm, tag (l), false );
161160
162161 auto dt = this ->get_time_step ();
163162 trns->restrict (crse, fine, true );
@@ -183,8 +182,7 @@ namespace pfasst
183182
184183 trns->interpolate (fine, crse, true );
185184
186- int tag = l.level * 10000 + this ->get_iteration () + 10 ;
187- fine->recv (comm, tag, false );
185+ fine->recv (comm, tag (l), false );
188186 trns->interpolate_initial (fine, crse);
189187
190188 if (l < this ->finest ()) {
@@ -201,10 +199,9 @@ namespace pfasst
201199 {
202200 auto crse = l.current ();
203201
204- int tag = l.level * 10000 + this ->get_iteration () + 10 ;
205- crse->recv (comm, tag, true );
202+ crse->recv (comm, tag (l), true );
206203 this ->perform_sweeps (l.level );
207- crse->send (comm, tag, true );
204+ crse->send (comm, tag (l) , true );
208205 return l + 1 ;
209206 }
210207
0 commit comments