@@ -116,21 +116,22 @@ def test_sweepequalmatrix(self):
116116 def test_updateformula (self ):
117117 for type in classes :
118118 self .swparams ['collocation_class' ] = getattr (pySDC .CollocationClasses , type )
119+
119120 step , level , problem , nnodes = self .setupLevelStepProblem ()
120121 level .sweep .predict ()
121122 u0full = np .array ([ level .u [l ].values .flatten () for l in range (1 ,nnodes + 1 ) ])
122123
123124 # Perform update step in sweeper
124125 level .sweep .update_nodes ()
125126 ustages = np .array ([ level .u [l ].values .flatten () for l in range (1 ,nnodes + 1 ) ])
126-
127127 # Compute end value through provided function
128128 level .sweep .compute_end_point ()
129129 uend_sweep = level .uend .values
130130 # Compute end value from matrix formulation
131131 uend_mat = self .pparams ['u0' ] + step .status .dt * level .sweep .coll .weights .dot (ustages * (problem .lambda_s [0 ] + problem .lambda_f [0 ]))
132132 assert np .linalg .norm (uend_sweep - uend_mat , np .infty )< 1e-14 , "Update formula in sweeper gives different result than matrix update formula"
133133
134+
134135 #
135136 # Compute the exact collocation solution by matrix inversion and make sure it is a fixed point
136137 #
@@ -193,11 +194,7 @@ def test_manysweepsequalmatrix(self):
193194
194195 assert np .linalg .norm (unew - usweep , np .infty )< 1e-14 , "Doing multiple node-to-node sweeps yields different result than same number of matrix-form sweeps"
195196
196- # Build single matrix representing K sweeps
197- Pinv = np .linalg .inv (LHS )
198- Mat_sweep = np .linalg .matrix_power (Pinv .dot (RHS ), K )
199- for i in range (0 ,K ):
200- Mat_sweep = Mat_sweep + np .linalg .matrix_power (Pinv .dot (RHS ),i ).dot (Pinv )
197+ Mat_sweep = level .sweep .get_scalar_problems_manysweep_mat ( nsweeps = K , lambdas = lambdas )
201198 usweep_onematrix = Mat_sweep .dot (u0full )
202199 assert np .linalg .norm ( usweep_onematrix - usweep , np .infty )< 1e-14 , "Single-matrix multiple sweep formulation yields different result than multiple sweeps in node-to-node or matrix form form"
203200
@@ -208,6 +205,7 @@ def test_manysweepsequalmatrix(self):
208205 def test_manysweepupdate (self ):
209206 for type in classes :
210207 self .swparams ['collocation_class' ] = getattr (pySDC .CollocationClasses , type )
208+
211209 step , level , problem , nnodes = self .setupLevelStepProblem ()
212210 step .levels [0 ].sweep .predict ()
213211 u0full = np .array ([ level .u [l ].values .flatten () for l in range (1 ,nnodes + 1 ) ])
@@ -224,10 +222,7 @@ def test_manysweepupdate(self):
224222 LHS , RHS = level .sweep .get_scalar_problems_sweeper_mats ( lambdas = lambdas )
225223
226224 # Build single matrix representing K sweeps
227- Pinv = np .linalg .inv (LHS )
228- Mat_sweep = np .linalg .matrix_power (Pinv .dot (RHS ), K )
229- for i in range (0 ,K ):
230- Mat_sweep = Mat_sweep + np .linalg .matrix_power (Pinv .dot (RHS ),i ).dot (Pinv )
225+ Mat_sweep = level .sweep .get_scalar_problems_manysweep_mat ( nsweeps = K , lambdas = lambdas )
231226 # Now build update function
232227 update = 1.0 + (problem .lambda_s [0 ] + problem .lambda_f [0 ])* level .sweep .coll .weights .dot (Mat_sweep .dot (np .ones (nnodes )))
233228 # Multiply u0 by value of update function to get end value directly
0 commit comments