Source code for Muscat.LinAlg.MumpsSolver
import numpy as np
from Muscat.Types import MuscatIndex, MuscatFloat
[docs]
class MumpsSolver():
"""MumpsSolver class to keep the mumps functionnality within Muscat,
However this relies on the python-mumps package
"""
def __init__(self):
from mumps import Context
self.ctx = Context()
[docs]
def SetICNTL(self, index: int, var:int):
"""Set a ICNTL option """
self.ctx.mumps_instance.icntl[index] = var
[docs]
def GetICNTL(self, index: int) -> int :
"""Get a ICNTL option """
return self.ctx.mumps_instance.icntl[index]
[docs]
def SetCNTL(self, index: int , var):
self.ctx.mumps_instance.cntl[index] = var
[docs]
def GetCNTL(self, index:int) -> float:
return self.ctx.mumps_instance.cntl[index]
[docs]
def SetOp(self, matrix):
self.ctx.set_matrix(matrix)
self.DoAnalysisStep()
self.DoFactorisationStep(reuse_analysis=True)
[docs]
def DoAnalysisStep(self):
self.ctx.analyze()
[docs]
def DoFactorisationStep(self,reuse_analysis=False,ordering = "auto" ):
self.ctx.factor(reuse_analysis=reuse_analysis,ordering = ordering)
[docs]
def Solve(self, rhs, sol ) :
sol[:] = self.ctx.solve(rhs)
return sol
def __dealloc__(self):
del self.ctx
[docs]
def CheckIntegrity():
# test data
try:
from mumps import Context
except ImportError:
return "skip"
from scipy.sparse import coo_matrix
# op
data = np.array([1., 2.], dtype=MuscatFloat)
i = np.array([0,1], dtype=MuscatIndex)
j = np.array([0,1], dtype=MuscatIndex)
m = coo_matrix((data,(i,j)), shape=(2,2) )
# rsh
rhs = np.zeros(2, dtype=MuscatFloat)
rhs[0] = 1.0
rhs[1] = 4.0
# solution
sol = np.zeros_like(rhs)
solver = MumpsSolver()
solver.SetOp(m)
# test using int and
solver.SetICNTL(1, 0)
solver.SetICNTL(1,solver.GetICNTL(1))
solver.SetCNTL(1 ,solver.GetCNTL(1) )
solver.Solve(rhs, sol)
error = sol - [1, 2]
if np.max(np.abs(error)) > 1.e-16 :
print(("sol",sol))
print(("error",error))
raise Exception("Error in the test case of Mumps")
del solver
return "ok"
if __name__ == '__main__':
print(CheckIntegrity()) #pragma: no cover