@@ -32,21 +32,6 @@ def setupLevelStepProblem(self):
3232 problem = level .prob
3333 return step , level , problem , nnodes
3434
35- def setupQMatrices (self , level ):
36- QE = level .sweep .QE [1 :,1 :]
37- QI = level .sweep .QI [1 :,1 :]
38- Q = level .sweep .coll .Qmat [1 :,1 :]
39- return QE , QI , Q
40-
41- def setupSweeperMatrices (self , step , level , problem ):
42- nnodes = step .levels [0 ].sweep .coll .num_nodes
43- # Build SDC sweep matrix
44- QE , QI , Q = self .setupQMatrices (level )
45- dt = step .status .dt
46- LHS = np .eye (nnodes ) - step .status .dt * ( problem .lambda_f [0 ]* QI + problem .lambda_s [0 ]* QE )
47- RHS = step .status .dt * ( (problem .lambda_f [0 ]+ problem .lambda_s [0 ])* Q - (problem .lambda_f [0 ]* QI + problem .lambda_s [0 ]* QE ) )
48- return LHS , RHS
49-
5035 #
5136 # General setUp function used by all tests
5237 #
@@ -118,7 +103,8 @@ def test_sweepequalmatrix(self):
118103 # Perform node-to-node SDC sweep
119104 level .sweep .update_nodes ()
120105
121- LHS , RHS = self .setupSweeperMatrices (step , level , problem )
106+ lambdas = [ problem .lambda_f [0 ] , problem .lambda_s [0 ] ]
107+ LHS , RHS = level .sweep .get_scalar_problems_sweeper_mats ( lambdas = lambdas )
122108
123109 unew = np .linalg .inv (LHS ).dot ( u0full + RHS .dot (u0full ) )
124110 usweep = np .array ([ level .u [l ].values .flatten () for l in range (1 ,nnodes + 1 ) ])
@@ -137,14 +123,14 @@ def test_updateformula(self):
137123 # Perform update step in sweeper
138124 level .sweep .update_nodes ()
139125 ustages = np .array ([ level .u [l ].values .flatten () for l in range (1 ,nnodes + 1 ) ])
140-
141126 # Compute end value through provided function
142127 level .sweep .compute_end_point ()
143128 uend_sweep = level .uend .values
144129 # Compute end value from matrix formulation
145130 uend_mat = self .pparams ['u0' ] + step .status .dt * level .sweep .coll .weights .dot (ustages * (problem .lambda_s [0 ] + problem .lambda_f [0 ]))
146131 assert np .linalg .norm (uend_sweep - uend_mat , np .infty )< 1e-14 , "Update formula in sweeper gives different result than matrix update formula"
147132
133+
148134 #
149135 # Compute the exact collocation solution by matrix inversion and make sure it is a fixed point
150136 #
@@ -155,7 +141,7 @@ def test_collocationinvariant(self):
155141 level .sweep .predict ()
156142 u0full = np .array ([ level .u [l ].values .flatten () for l in range (1 ,nnodes + 1 ) ])
157143
158- QE , QI , Q = self . setupQMatrices ( level )
144+ QE , QI , Q = level . sweep . get_sweeper_mats ( )
159145
160146 # Build collocation matrix
161147 Mcoll = np .eye (nnodes ) - step .status .dt * Q * (problem .lambda_s [0 ] + problem .lambda_f [0 ])
@@ -172,9 +158,9 @@ def test_collocationinvariant(self):
172158 # Perform node-to-node SDC sweep
173159 level .sweep .update_nodes ()
174160
175- # Build matrices for matrix formulation of sweep
176- LHS = np . eye ( nnodes ) - step . status . dt * ( problem . lambda_f [ 0 ] * QI + problem . lambda_s [ 0 ] * QE )
177- RHS = step . status . dt * ( ( problem . lambda_f [ 0 ] + problem . lambda_s [ 0 ]) * Q - ( problem . lambda_f [ 0 ] * QI + problem . lambda_s [ 0 ] * QE ) )
161+ lambdas = [ problem . lambda_f [ 0 ] , problem . lambda_s [ 0 ] ]
162+ LHS , RHS = level . sweep . get_scalar_problems_sweeper_mats ( lambdas = lambdas )
163+
178164 # Make sure both matrix and node-to-node sweep leave collocation unaltered
179165 unew = np .linalg .inv (LHS ).dot ( u0full + RHS .dot (ucoll ) )
180166 assert np .linalg .norm ( unew - ucoll , np .infty )< 1e-14 , "Collocation solution not invariant under matrix SDC sweep"
@@ -198,18 +184,16 @@ def test_manysweepsequalmatrix(self):
198184 level .sweep .update_nodes ()
199185 usweep = np .array ([ level .u [l ].values .flatten () for l in range (1 ,nnodes + 1 ) ])
200186
201- LHS , RHS = self .setupSweeperMatrices (step , level , problem )
187+ lambdas = [ problem .lambda_f [0 ] , problem .lambda_s [0 ] ]
188+ LHS , RHS = level .sweep .get_scalar_problems_sweeper_mats ( lambdas = lambdas )
189+
202190 unew = u0full
203191 for i in range (0 ,K ):
204192 unew = np .linalg .inv (LHS ).dot ( u0full + RHS .dot (unew ) )
205193
206194 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"
207195
208- # Build single matrix representing K sweeps
209- Pinv = np .linalg .inv (LHS )
210- Mat_sweep = np .linalg .matrix_power (Pinv .dot (RHS ), K )
211- for i in range (0 ,K ):
212- Mat_sweep = Mat_sweep + np .linalg .matrix_power (Pinv .dot (RHS ),i ).dot (Pinv )
196+ Mat_sweep = level .sweep .get_scalar_problems_manysweep_mat ( nsweeps = K , lambdas = lambdas )
213197 usweep_onematrix = Mat_sweep .dot (u0full )
214198 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"
215199
@@ -231,12 +215,11 @@ def test_manysweepupdate(self):
231215 level .sweep .compute_end_point ()
232216 uend_sweep = level .uend .values
233217
234- LHS , RHS = self .setupSweeperMatrices (step , level , problem )
218+ lambdas = [ problem .lambda_f [0 ] , problem .lambda_s [0 ] ]
219+ LHS , RHS = level .sweep .get_scalar_problems_sweeper_mats ( lambdas = lambdas )
220+
235221 # Build single matrix representing K sweeps
236- Pinv = np .linalg .inv (LHS )
237- Mat_sweep = np .linalg .matrix_power (Pinv .dot (RHS ), K )
238- for i in range (0 ,K ):
239- Mat_sweep = Mat_sweep + np .linalg .matrix_power (Pinv .dot (RHS ),i ).dot (Pinv )
222+ Mat_sweep = level .sweep .get_scalar_problems_manysweep_mat ( nsweeps = K , lambdas = lambdas )
240223 # Now build update function
241224 update = 1.0 + (problem .lambda_s [0 ] + problem .lambda_f [0 ])* level .sweep .coll .weights .dot (Mat_sweep .dot (np .ones (nnodes )))
242225 # Multiply u0 by value of update function to get end value directly
0 commit comments