|
22 | 22 | import argparse |
23 | 23 | import os.path |
24 | 24 | import sys |
25 | | -import time |
26 | 25 |
|
27 | 26 | import numpy as np |
28 | | -import scipy.sparse as sp |
29 | | - |
30 | 27 |
|
| 28 | +# ruff: noqa: E402 |
31 | 29 | HERE = os.path.dirname(__file__) |
32 | 30 | sys.path.insert(0, HERE) |
33 | 31 |
|
34 | 32 | from utils import ( |
35 | | - WHICH_TO_SORT_SLEPC, ConvergenceTracker, EigensolverParameters, Statistics, |
36 | | - load_suitesparse_mat, slepc_eig, print_residuals, |
| 33 | + WHICH_TO_SORT_SLEPC, ConvergenceTracker, EigensolverParameters, |
| 34 | + find_best_matching, load_suitesparse_mat, slepc_eig, print_residuals, |
| 35 | + arnoldi_py_eig, |
37 | 36 | ) |
38 | 37 |
|
39 | 38 |
|
@@ -97,6 +96,20 @@ def main(): |
97 | 96 | print(f" BVMultVec (w-=V*c): {stats.count_multivec}") |
98 | 97 | print(f" DSSolve (restart): {stats.count_ds_solve}") |
99 | 98 |
|
| 99 | + print(f"\n--- Running partial_schur (p = {parameters.p}) ---") |
| 100 | + ps_vals, ps_vecs, ps_stats = arnoldi_py_eig(A, parameters) |
| 101 | + print(f" matvecs={ps_stats.matvecs}, elapsed={ps_stats.elapsed:.2f}s for {ps_stats.restarts} iterations") |
| 102 | + print_residuals("Krylov-Schur", A, ps_vals, ps_vecs) |
| 103 | + |
| 104 | + print(f"\n--- Perf comparison ---") |
| 105 | + print(f" SLEPC: {stats.matvecs} matvecs in {stats.restarts} iterations ({stats.elapsed:.2f}s)") |
| 106 | + print(f" partial_schur: {ps_stats.matvecs} matvecs in {ps_stats.restarts} iterations ({ps_stats.elapsed:.2f}s)") |
| 107 | + |
| 108 | + # Ensure the eigenvalues match. This check + ensure normalized residuals |
| 109 | + # are close to 0 should be enough to ensure the output is correct. |
| 110 | + x, y = find_best_matching(vals, ps_vals) |
| 111 | + np.testing.assert_allclose(x, y, rtol=args.tol) |
| 112 | + |
100 | 113 |
|
101 | 114 | if __name__ == "__main__": |
102 | 115 | main() |
0 commit comments