@@ -46,14 +46,14 @@ namespace pfasst
4646 auto fine_factory = fine.get_factory ();
4747
4848 auto crse_delta = crse_factory->create (solution);
49- this ->restrict (crse_delta, fine.get_state ( 0 ));
50- crse_delta->saxpy (-1.0 , crse.get_state ( 0 ));
49+ this ->restrict (crse_delta, fine.get_start_state ( ));
50+ crse_delta->saxpy (-1.0 , crse.get_start_state ( ));
5151
5252 auto fine_delta = fine_factory->create (solution);
5353 this ->interpolate (fine_delta, crse_delta);
54- fine.get_state ( 0 )->saxpy (-1.0 , fine_delta);
54+ fine.get_start_state ( )->saxpy (-1.0 , fine_delta);
5555
56- fine.evaluate ( 0 );
56+ fine.reevaluate ( true );
5757 }
5858
5959
@@ -68,6 +68,11 @@ namespace pfasst
6868 tmat = pfasst::quadrature::compute_interp<time>(fine.get_nodes (), crse.get_nodes ());
6969 }
7070
71+ if (interp_initial) {
72+ this ->interpolate_initial (dst, src);
73+ return ;
74+ }
75+
7176 size_t nfine = fine.get_nodes ().size ();
7277 size_t ncrse = crse.get_nodes ().size ();
7378
@@ -80,20 +85,15 @@ namespace pfasst
8085 for (size_t m = 0 ; m < ncrse; m++) { fine_delta[m] = fine_factory->create (solution); }
8186
8287 auto crse_delta = crse_factory->create (solution);
83- size_t m0 = interp_initial ? 0 : 1 ;
84- for (size_t m = m0; m < ncrse; m++) {
88+ for (size_t m = 0 ; m < ncrse; m++) {
8589 crse_delta->copy (crse.get_state (m));
8690 crse_delta->saxpy (-1.0 , crse.get_saved_state (m));
8791 interpolate (fine_delta[m], crse_delta);
8892 }
8993
90- if (!interp_initial) {
91- fine_delta[0 ]->zero ();
92- }
93-
9494 fine.get_state (0 )->mat_apply (fine_state, 1.0 , tmat, fine_delta, false );
9595
96- for ( size_t m = m0; m < nfine; m++) { fine.evaluate (m); }
96+ fine.reevaluate ();
9797 }
9898
9999
@@ -112,7 +112,8 @@ namespace pfasst
112112 {
113113 auto & crse = as_encap_sweeper (dst);
114114 auto & fine = as_encap_sweeper (src);
115- this ->restrict (crse.get_state (0 ), fine.get_state (0 ));
115+ this ->restrict (crse.get_start_state (), fine.get_start_state ());
116+ crse.reevaluate (true );
116117 }
117118
118119
@@ -128,17 +129,21 @@ namespace pfasst
128129 auto const num_crse = crse_nodes.size ();
129130 auto const num_fine = fine_nodes.size ();
130131
132+ if (restrict_initial) {
133+ this ->restrict_initial (dst, src);
134+ return ;
135+ }
136+
131137 int trat = (int (num_fine) - 1 ) / (int (num_crse) - 1 );
132138
133- int m0 = restrict_initial ? 0 : 1 ;
134- for (size_t m = m0; m < num_crse; m++) {
139+ for (size_t m = 0 ; m < num_crse; m++) {
135140 if (crse_nodes[m] != fine_nodes[m * trat]) {
136141 throw NotImplementedYet (" coarse nodes must be nested" );
137142 }
138143 this ->restrict (crse.get_state (m), fine.get_state (m * trat));
139144 }
140145
141- for ( size_t m = m0; m < num_crse; m++) { crse.evaluate (m); }
146+ crse.reevaluate ();
142147 }
143148
144149
0 commit comments