You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.6 KiB
Python
64 lines
1.6 KiB
Python
5 years ago
|
from __future__ import division, print_function, absolute_import
|
||
|
|
||
|
import scipy.sparse.linalg as la
|
||
|
import scipy.sparse as sp
|
||
|
import scipy.io as io
|
||
|
import numpy as np
|
||
|
import sys
|
||
|
|
||
|
#problem = "SPARSKIT/drivcav/e05r0100"
|
||
|
problem = "SPARSKIT/drivcav/e05r0200"
|
||
|
#problem = "Harwell-Boeing/sherman/sherman1"
|
||
|
#problem = "misc/hamm/add32"
|
||
|
|
||
|
mm = np.lib._datasource.Repository('ftp://math.nist.gov/pub/MatrixMarket2/')
|
||
|
f = mm.open('%s.mtx.gz' % problem)
|
||
|
Am = io.mmread(f).tocsr()
|
||
|
f.close()
|
||
|
|
||
|
f = mm.open('%s_rhs1.mtx.gz' % problem)
|
||
|
b = np.array(io.mmread(f)).ravel()
|
||
|
f.close()
|
||
|
|
||
|
count = [0]
|
||
|
|
||
|
|
||
|
def matvec(v):
|
||
|
count[0] += 1
|
||
|
sys.stderr.write('%d\r' % count[0])
|
||
|
return Am*v
|
||
|
|
||
|
|
||
|
A = la.LinearOperator(matvec=matvec, shape=Am.shape, dtype=Am.dtype)
|
||
|
|
||
|
M = 100
|
||
|
|
||
|
print("MatrixMarket problem %s" % problem)
|
||
|
print("Invert %d x %d matrix; nnz = %d" % (Am.shape[0], Am.shape[1], Am.nnz))
|
||
|
|
||
|
count[0] = 0
|
||
|
x0, info = la.gmres(A, b, restrt=M, tol=1e-14)
|
||
|
count_0 = count[0]
|
||
|
err0 = np.linalg.norm(Am*x0 - b) / np.linalg.norm(b)
|
||
|
print("GMRES(%d):" % M, count_0, "matvecs, residual", err0)
|
||
|
if info != 0:
|
||
|
print("Didn't converge")
|
||
|
|
||
|
count[0] = 0
|
||
|
x1, info = la.lgmres(A, b, inner_m=M-6*2, outer_k=6, tol=1e-14)
|
||
|
count_1 = count[0]
|
||
|
err1 = np.linalg.norm(Am*x1 - b) / np.linalg.norm(b)
|
||
|
print("LGMRES(%d,6) [same memory req.]:" % (M-2*6), count_1,
|
||
|
"matvecs, residual:", err1)
|
||
|
if info != 0:
|
||
|
print("Didn't converge")
|
||
|
|
||
|
count[0] = 0
|
||
|
x2, info = la.lgmres(A, b, inner_m=M-6, outer_k=6, tol=1e-14)
|
||
|
count_2 = count[0]
|
||
|
err2 = np.linalg.norm(Am*x2 - b) / np.linalg.norm(b)
|
||
|
print("LGMRES(%d,6) [same subspace size]:" % (M-6), count_2,
|
||
|
"matvecs, residual:", err2)
|
||
|
if info != 0:
|
||
|
print("Didn't converge")
|