demo_lgmres.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from __future__ import division, print_function, absolute_import
  2. import scipy.sparse.linalg as la
  3. import scipy.sparse as sp
  4. import scipy.io as io
  5. import numpy as np
  6. import sys
  7. #problem = "SPARSKIT/drivcav/e05r0100"
  8. problem = "SPARSKIT/drivcav/e05r0200"
  9. #problem = "Harwell-Boeing/sherman/sherman1"
  10. #problem = "misc/hamm/add32"
  11. mm = np.lib._datasource.Repository('ftp://math.nist.gov/pub/MatrixMarket2/')
  12. f = mm.open('%s.mtx.gz' % problem)
  13. Am = io.mmread(f).tocsr()
  14. f.close()
  15. f = mm.open('%s_rhs1.mtx.gz' % problem)
  16. b = np.array(io.mmread(f)).ravel()
  17. f.close()
  18. count = [0]
  19. def matvec(v):
  20. count[0] += 1
  21. sys.stderr.write('%d\r' % count[0])
  22. return Am*v
  23. A = la.LinearOperator(matvec=matvec, shape=Am.shape, dtype=Am.dtype)
  24. M = 100
  25. print("MatrixMarket problem %s" % problem)
  26. print("Invert %d x %d matrix; nnz = %d" % (Am.shape[0], Am.shape[1], Am.nnz))
  27. count[0] = 0
  28. x0, info = la.gmres(A, b, restrt=M, tol=1e-14)
  29. count_0 = count[0]
  30. err0 = np.linalg.norm(Am*x0 - b) / np.linalg.norm(b)
  31. print("GMRES(%d):" % M, count_0, "matvecs, residual", err0)
  32. if info != 0:
  33. print("Didn't converge")
  34. count[0] = 0
  35. x1, info = la.lgmres(A, b, inner_m=M-6*2, outer_k=6, tol=1e-14)
  36. count_1 = count[0]
  37. err1 = np.linalg.norm(Am*x1 - b) / np.linalg.norm(b)
  38. print("LGMRES(%d,6) [same memory req.]:" % (M-2*6), count_1,
  39. "matvecs, residual:", err1)
  40. if info != 0:
  41. print("Didn't converge")
  42. count[0] = 0
  43. x2, info = la.lgmres(A, b, inner_m=M-6, outer_k=6, tol=1e-14)
  44. count_2 = count[0]
  45. err2 = np.linalg.norm(Am*x2 - b) / np.linalg.norm(b)
  46. print("LGMRES(%d,6) [same subspace size]:" % (M-6), count_2,
  47. "matvecs, residual:", err2)
  48. if info != 0:
  49. print("Didn't converge")