@@ -55,6 +55,7 @@ namespace pfasst
5555 fine.evaluate (0 );
5656 }
5757
58+
5859 virtual void interpolate (shared_ptr<ISweeper<time>> dst,
5960 shared_ptr<const ISweeper<time>> src,
6061 bool interp_initial) override
@@ -77,22 +78,11 @@ namespace pfasst
7778 for (size_t m = 0 ; m < nfine; m++) { fine_state[m] = fine.get_state (m); }
7879 for (size_t m = 0 ; m < ncrse; m++) { fine_delta[m] = fine_factory->create (solution); }
7980
80- // if (interp_delta_from_initial) {
81- // for (size_t m = 1; m < nfine; m++) {
82- // fine_state[m]->copy(fine_state[0]);
83- // }
84- // }
85-
8681 auto crse_delta = crse_factory->create (solution);
8782 size_t m0 = interp_initial ? 0 : 1 ;
8883 for (size_t m = m0; m < ncrse; m++) {
8984 crse_delta->copy (crse.get_state (m));
90- // if (interp_delta_from_initial) {
91- // crse_delta->saxpy(-1.0, crse->get_saved_state(0));
92- // // crse_delta->saxpy(-1.0, crse->get_state(0));
93- // } else {
94- crse_delta->saxpy (-1.0 , crse.get_saved_state (m));
95- // }
85+ crse_delta->saxpy (-1.0 , crse.get_saved_state (m));
9686 interpolate (fine_delta[m], crse_delta);
9787 }
9888
@@ -105,43 +95,39 @@ namespace pfasst
10595 for (size_t m = m0; m < nfine; m++) { fine.evaluate (m); }
10696 }
10797
108- // required for interp/restrict helpers
109- virtual void interpolate (shared_ptr<Encapsulation<time>> /* dst*/ ,
110- shared_ptr<const Encapsulation<time>> /* src*/ )
98+
99+ virtual void interpolate (shared_ptr<Encapsulation<time>> dst,
100+ shared_ptr<const Encapsulation<time>> src)
111101 {
102+ UNUSED (dst); UNUSED (src);
112103 throw NotImplementedYet (" mlsdc/pfasst" );
113104 }
105+ // ! @}
114106
115- virtual void restrict (shared_ptr<ISweeper<time>> dst,
116- shared_ptr<const ISweeper<time>> src,
117- bool restrict_initial,
118- bool restrict_initial_only) override
119- {
120- shared_ptr<EncapSweeper<time>> crse = dynamic_pointer_cast<EncapSweeper<time>>(dst);
121- assert (crse);
122- shared_ptr<const EncapSweeper<time>> fine = \
123- dynamic_pointer_cast<const EncapSweeper<time>>(src);
124- assert (fine);
125107
126- this ->restrict (crse, fine, restrict_initial, restrict_initial_only);
108+ // ! @{
109+ virtual void restrict_initial (shared_ptr<ISweeper<time>> dst,
110+ shared_ptr<const ISweeper<time>> src) override
111+ {
112+ auto & crse = as_encap_sweeper (dst);
113+ auto & fine = as_encap_sweeper (src);
114+ this ->restrict (crse.get_state (0 ), fine.get_state (0 ));
127115 }
128116
129- virtual void restrict (shared_ptr<EncapSweeper<time>> crse,
130- shared_ptr<const EncapSweeper <time>> fine ,
131- bool restrict_initial ,
132- bool restrict_initial_only)
117+
118+ virtual void restrict ( shared_ptr<ISweeper <time>> dst ,
119+ shared_ptr< const ISweeper<time>> src ,
120+ bool restrict_initial) override
133121 {
134- if (restrict_initial_only) {
135- this ->restrict (crse->get_state (0 ), fine->get_state (0 ));
136- return ;
137- }
122+ auto & crse = as_encap_sweeper (dst);
123+ auto & fine = as_encap_sweeper (src);
138124
139- auto dnodes = crse-> get_nodes ();
140- auto snodes = fine-> get_nodes ();
125+ auto dnodes = crse. get_nodes ();
126+ auto snodes = fine. get_nodes ();
141127
142- size_t ncrse = crse-> get_nodes ().size ();
128+ size_t ncrse = crse. get_nodes ().size ();
143129 assert (ncrse > 1 );
144- size_t nfine = fine-> get_nodes ().size ();
130+ size_t nfine = fine. get_nodes ().size ();
145131
146132 int trat = (int (nfine) - 1 ) / (int (ncrse) - 1 );
147133
@@ -150,39 +136,32 @@ namespace pfasst
150136 if (dnodes[m] != snodes[m * trat]) {
151137 throw NotImplementedYet (" coarse nodes must be nested" );
152138 }
153- this ->restrict (crse-> get_state (m), fine-> get_state (m * trat));
139+ this ->restrict (crse. get_state (m), fine. get_state (m * trat));
154140 }
155141
156- for (size_t m = m0; m < ncrse; m++) { crse-> evaluate (m); }
142+ for (size_t m = m0; m < ncrse; m++) { crse. evaluate (m); }
157143 }
158144
145+
159146 virtual void restrict (shared_ptr<Encapsulation<time>> dst,
160147 shared_ptr<const Encapsulation<time>> src)
161148 {
162149 UNUSED (dst); UNUSED (src);
163150 throw NotImplementedYet (" mlsdc/pfasst" );
164151 }
152+ // ! @}
165153
166154 virtual void fas (time dt, shared_ptr<ISweeper<time>> dst,
167155 shared_ptr<const ISweeper<time>> src) override
168156 {
169- shared_ptr<EncapSweeper<time>> crse = dynamic_pointer_cast<EncapSweeper<time>>(dst);
170- assert (crse);
171- shared_ptr<const EncapSweeper<time>> fine = \
172- dynamic_pointer_cast<const EncapSweeper<time>>(src);
173- assert (fine);
174-
175- this ->fas (dt, crse, fine);
176- }
157+ auto & crse = pfasst::encap::as_encap_sweeper (dst);
158+ auto & fine = pfasst::encap::as_encap_sweeper (src);
177159
178- virtual void fas (time dt, shared_ptr<EncapSweeper<time>> crse,
179- shared_ptr<const EncapSweeper<time>> fine)
180- {
181- size_t ncrse = crse->get_nodes ().size (); assert (ncrse >= 1 );
182- size_t nfine = fine->get_nodes ().size (); assert (nfine >= 1 );
160+ size_t ncrse = crse.get_nodes ().size (); assert (ncrse >= 1 );
161+ size_t nfine = fine.get_nodes ().size (); assert (nfine >= 1 );
183162
184- auto crse_factory = crse-> get_factory ();
185- auto fine_factory = fine-> get_factory ();
163+ auto crse_factory = crse. get_factory ();
164+ auto fine_factory = fine. get_factory ();
186165
187166 EncapVecT crse_z2n (ncrse - 1 ), fine_z2n (nfine - 1 ), rstr_z2n (ncrse - 1 );
188167
@@ -191,13 +170,13 @@ namespace pfasst
191170 for (size_t m = 0 ; m < nfine - 1 ; m++) { fine_z2n[m] = fine_factory->create (solution); }
192171
193172 // compute '0 to node' integral on the coarse level
194- crse-> integrate (dt, crse_z2n);
173+ crse. integrate (dt, crse_z2n);
195174 for (size_t m = 1 ; m < ncrse - 1 ; m++) {
196175 crse_z2n[m]->saxpy (1.0 , crse_z2n[m - 1 ]);
197176 }
198177
199178 // compute '0 to node' integral on the fine level
200- fine-> integrate (dt, fine_z2n);
179+ fine. integrate (dt, fine_z2n);
201180 for (size_t m = 1 ; m < nfine - 1 ; m++) {
202181 fine_z2n[m]->saxpy (1.0 , fine_z2n[m - 1 ]);
203182 }
@@ -210,7 +189,7 @@ namespace pfasst
210189
211190 // compute 'node to node' tau correction
212191 EncapVecT tau (ncrse - 1 ), rstr_and_crse (2 * (ncrse - 1 ));
213- for (size_t m = 0 ; m < ncrse - 1 ; m++) { tau[m] = crse-> get_tau (m); }
192+ for (size_t m = 0 ; m < ncrse - 1 ; m++) { tau[m] = crse. get_tau (m); }
214193 for (size_t m = 0 ; m < ncrse - 1 ; m++) { rstr_and_crse[m] = rstr_z2n[m]; }
215194 for (size_t m = 0 ; m < ncrse - 1 ; m++) { rstr_and_crse[ncrse - 1 + m] = crse_z2n[m]; }
216195
@@ -231,7 +210,7 @@ namespace pfasst
231210
232211 tau[0 ]->mat_apply (tau, 1.0 , fmat, rstr_and_crse, true );
233212 }
234- // ! @}
213+
235214 };
236215
237216 } // ::pfasst::encap
0 commit comments