Source code for pymatsolver.iterative

from __future__ import unicode_literals
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

import numpy as np
import scipy.sparse as sp
from scipy.sparse.linalg import bicgstab
from pymatsolver.solvers import Base


[docs]class BicgJacobi(Base): """Bicg Solver with Jacobi preconditioner""" _factored = False solver = None maxiter = 1000 tol = 1E-6 def __init__(self, A, symmetric=True): self.A = A self.symmetric = symmetric self.dtype = A.dtype self.solver = bicgstab
[docs] def factor(self): if self._factored: return nSize = self.A.shape[0] Ainv = sp.spdiags(1./self.A.diagonal(), 0, nSize, nSize) self.M = sp.linalg.interface.aslinearoperator(Ainv) self._factored = True
def _solve1(self, rhs): self.factor() sol, info = self.solver( self.A, rhs, tol=self.tol, maxiter=self.maxiter, M=self.M ) return sol def _solveM(self, rhs): self.factor() sol = [] for icol in range(rhs.shape[1]): sol.append(self.solver(self.A, rhs[:, icol].flatten(), tol=self.tol, maxiter=self.maxiter, M=self.M)[0]) out = np.hstack(sol) out.shape return out
[docs] def clean(self): self.M = None self.A = None self._factored = False