xref: /petsc/src/binding/petsc4py/test/test_mat_fact.py (revision 552edb6364df478b294b3111f33a8f37ca096b20)
15808f684SSatish Balayfrom petsc4py import PETSc
25808f684SSatish Balayimport unittest
35808f684SSatish Balay
45808f684SSatish Balay
55808f684SSatish Balaydef mkmat(n, mtype, opts):
65808f684SSatish Balay    A = PETSc.Mat().create(PETSc.COMM_SELF)
75808f684SSatish Balay    A.setSizes([n, n])
85808f684SSatish Balay    A.setType(mtype)
95808f684SSatish Balay    A.setUp()
105808f684SSatish Balay    for o in opts:
115808f684SSatish Balay        A.setOption(o, True)
125808f684SSatish Balay    return A
135808f684SSatish Balay
14*6f336411SStefano Zampini
155808f684SSatish Balaydef mksys_diag(n, mtype, opts):
165808f684SSatish Balay    A = mkmat(n, mtype, opts)
175808f684SSatish Balay    x, b = A.createVecs()
185808f684SSatish Balay    for i in range(n):
195808f684SSatish Balay        A[i, i] = i + 1
205808f684SSatish Balay        x[i] = 1.0 / (i + 1)
215808f684SSatish Balay        b[i] = 1
225808f684SSatish Balay    A.assemble()
235808f684SSatish Balay    x.assemble()
245808f684SSatish Balay    b.assemble()
255808f684SSatish Balay    return A, x, b
265808f684SSatish Balay
27*6f336411SStefano Zampini
285808f684SSatish Balaydef mksys_poi2(n, mtype, opts):
295808f684SSatish Balay    A = mkmat(n, mtype, opts)
305808f684SSatish Balay    x, b = A.createVecs()
315808f684SSatish Balay    for i in range(n):
325808f684SSatish Balay        if i == 0:
335808f684SSatish Balay            cols = [i, i + 1]
345808f684SSatish Balay            vals = [2, -1]
355808f684SSatish Balay        elif i == n - 1:
365808f684SSatish Balay            cols = [i - 1, i]
375808f684SSatish Balay            vals = [-1, 2]
385808f684SSatish Balay        else:
395808f684SSatish Balay            cols = [i - 1, i, i + 1]
405808f684SSatish Balay            vals = [-1, 2, -1]
415808f684SSatish Balay        A[i, cols] = vals
425808f684SSatish Balay        x[i] = i + 1
435808f684SSatish Balay        b[i] = 0
445808f684SSatish Balay    A.assemble()
455808f684SSatish Balay    x.assemble()
465808f684SSatish Balay    b.assemble()
475808f684SSatish Balay    A.mult(x, b)
485808f684SSatish Balay    return A, x, b
495808f684SSatish Balay
505808f684SSatish Balay
51*6f336411SStefano Zampiniclass BaseTestMatFactor:
525808f684SSatish Balay    MKSYS = None
535808f684SSatish Balay    MTYPE = None
545808f684SSatish Balay    MOPTS = ()
555808f684SSatish Balay
565808f684SSatish Balay    def setUp(self):
575808f684SSatish Balay        A, x, b = self.MKSYS(10, self.MTYPE, self.MOPTS)
585808f684SSatish Balay        self.A = A
595808f684SSatish Balay        self.x = x
605808f684SSatish Balay        self.b = b
615808f684SSatish Balay
625808f684SSatish Balay    def tearDown(self):
635808f684SSatish Balay        self.A.setUnfactored()
64*6f336411SStefano Zampini        self.A.destroy()
65*6f336411SStefano Zampini        self.A = None
66*6f336411SStefano Zampini        self.x.destroy()
67*6f336411SStefano Zampini        self.x = None
68*6f336411SStefano Zampini        self.b.destroy()
69*6f336411SStefano Zampini        self.b = None
7062e5d2d2SJDBetteridge        PETSc.garbage_cleanup()
715808f684SSatish Balay
725808f684SSatish Balay
73*6f336411SStefano Zampiniclass BaseTestMatFactorLU(BaseTestMatFactor):
745808f684SSatish Balay    def testFactorLU(self):
75*6f336411SStefano Zampini        r, c = self.A.getOrdering('nd')
765808f684SSatish Balay        self.A.reorderForNonzeroDiagonal(r, c)
775808f684SSatish Balay        self.A.factorLU(r, c, {'zeropivot': 1e-5})
785808f684SSatish Balay        x = self.x.duplicate()
795808f684SSatish Balay        self.A.solve(self.b, x)
805808f684SSatish Balay        x.axpy(-1, self.x)
815808f684SSatish Balay        self.assertTrue(x.norm() < 1e-3)
825808f684SSatish Balay
835808f684SSatish Balay
84*6f336411SStefano Zampiniclass BaseTestMatFactorILU(BaseTestMatFactor):
855808f684SSatish Balay    def testFactorILU(self):
86*6f336411SStefano Zampini        r, c = self.A.getOrdering('natural')
875808f684SSatish Balay        self.A.factorILU(r, c, {'levels': 0})
885808f684SSatish Balay        x = self.x.duplicate()
895808f684SSatish Balay        self.A.solve(self.b, x)
905808f684SSatish Balay        x.axpy(-1, self.x)
915808f684SSatish Balay        self.assertTrue(x.norm() < 1e-3)
925808f684SSatish Balay
93*6f336411SStefano Zampini
945808f684SSatish Balay## class BaseTestMatFactorILUDT(BaseTestMatFactor):
955808f684SSatish Balay##
965808f684SSatish Balay##     def testFactorILUDT(self):
975808f684SSatish Balay##         r, c = self.A.getOrdering("natural")
985808f684SSatish Balay##         self.A = self.A.factorILUDT(r,c)
995808f684SSatish Balay##         x = self.x.duplicate()
1005808f684SSatish Balay##         self.A.solve(self.b, x)
1015808f684SSatish Balay##         x.axpy(-1, self.x)
1025808f684SSatish Balay##         self.assertTrue(x.norm() < 1e-3)
1035808f684SSatish Balay##
1045808f684SSatish Balayclass BaseTestMatFactorChol(BaseTestMatFactor):
1055808f684SSatish Balay    def testFactorChol(self):
106*6f336411SStefano Zampini        r, c = self.A.getOrdering('natural')
1075808f684SSatish Balay        self.A.factorCholesky(r)
1085808f684SSatish Balay        x = self.x.duplicate()
1095808f684SSatish Balay        self.A.solve(self.b, x)
1105808f684SSatish Balay        x.axpy(-1, self.x)
1115808f684SSatish Balay        self.assertTrue(x.norm() < 1e-3)
1125808f684SSatish Balay
1135808f684SSatish Balay
114*6f336411SStefano Zampiniclass BaseTestMatFactorICC(BaseTestMatFactor):
1155808f684SSatish Balay    def testFactorICC(self):
116*6f336411SStefano Zampini        r, c = self.A.getOrdering('natural')
1175808f684SSatish Balay        self.A.factorICC(r)
1185808f684SSatish Balay        x = self.x.duplicate()
1195808f684SSatish Balay        self.A.solve(self.b, x)
1205808f684SSatish Balay        x.axpy(-1, self.x)
1215808f684SSatish Balay        self.assertTrue(x.norm() < 1e-3)
1225808f684SSatish Balay
1235808f684SSatish Balay
1245808f684SSatish Balay# --------------------------------------------------------------------
1255808f684SSatish Balay
126*6f336411SStefano Zampini
127*6f336411SStefano Zampiniclass TestMatFactorA1(BaseTestMatFactorLU, BaseTestMatFactorChol, unittest.TestCase):
1285808f684SSatish Balay    MKSYS = staticmethod(mksys_diag)
1295808f684SSatish Balay    MTYPE = PETSc.Mat.Type.SEQDENSE
1305808f684SSatish Balay
131*6f336411SStefano Zampini
132*6f336411SStefano Zampiniclass TestMatFactorA2(BaseTestMatFactorLU, BaseTestMatFactorChol, unittest.TestCase):
1335808f684SSatish Balay    MKSYS = staticmethod(mksys_poi2)
1345808f684SSatish Balay    MTYPE = PETSc.Mat.Type.SEQDENSE
1355808f684SSatish Balay
136*6f336411SStefano Zampini
1375808f684SSatish Balay# ---
1385808f684SSatish Balay
139*6f336411SStefano Zampini
140*6f336411SStefano Zampiniclass TestMatFactorB1(
141*6f336411SStefano Zampini    BaseTestMatFactorLU,
1425808f684SSatish Balay    BaseTestMatFactorILU,
1435808f684SSatish Balay    ## BaseTestMatFactorILUDT,
144*6f336411SStefano Zampini    unittest.TestCase,
145*6f336411SStefano Zampini):
1465808f684SSatish Balay    MKSYS = staticmethod(mksys_diag)
1475808f684SSatish Balay    MTYPE = PETSc.Mat.Type.SEQAIJ
1485808f684SSatish Balay
149*6f336411SStefano Zampini
150*6f336411SStefano Zampiniclass TestMatFactorB2(
151*6f336411SStefano Zampini    BaseTestMatFactorLU,
1525808f684SSatish Balay    BaseTestMatFactorILU,
1535808f684SSatish Balay    ## BaseTestMatFactorILUDT,
154*6f336411SStefano Zampini    unittest.TestCase,
155*6f336411SStefano Zampini):
1565808f684SSatish Balay    MKSYS = staticmethod(mksys_poi2)
1575808f684SSatish Balay    MTYPE = PETSc.Mat.Type.SEQAIJ
1585808f684SSatish Balay
159*6f336411SStefano Zampini
1605808f684SSatish Balay# ---
1615808f684SSatish Balay
162*6f336411SStefano Zampini
163*6f336411SStefano Zampiniclass TestMatFactorC1(BaseTestMatFactorLU, BaseTestMatFactorILU, unittest.TestCase):
1645808f684SSatish Balay    MKSYS = staticmethod(mksys_diag)
1655808f684SSatish Balay    MTYPE = PETSc.Mat.Type.SEQBAIJ
1665808f684SSatish Balay
167*6f336411SStefano Zampini
168*6f336411SStefano Zampiniclass TestMatFactorC2(BaseTestMatFactorLU, BaseTestMatFactorILU, unittest.TestCase):
1695808f684SSatish Balay    MKSYS = staticmethod(mksys_poi2)
1705808f684SSatish Balay    MTYPE = PETSc.Mat.Type.SEQBAIJ
1715808f684SSatish Balay
172*6f336411SStefano Zampini
1735808f684SSatish Balay# ---
1745808f684SSatish Balay
175*6f336411SStefano Zampini
176*6f336411SStefano Zampiniclass TestMatFactorD1(BaseTestMatFactorChol, BaseTestMatFactorICC, unittest.TestCase):
1775808f684SSatish Balay    MKSYS = staticmethod(mksys_diag)
1785808f684SSatish Balay    MTYPE = PETSc.Mat.Type.SEQSBAIJ
1795808f684SSatish Balay    MOPTS = [PETSc.Mat.Option.IGNORE_LOWER_TRIANGULAR]
1805808f684SSatish Balay
181*6f336411SStefano Zampini
182*6f336411SStefano Zampiniclass TestMatFactorD2(BaseTestMatFactorChol, BaseTestMatFactorICC, unittest.TestCase):
1835808f684SSatish Balay    MKSYS = staticmethod(mksys_poi2)
1845808f684SSatish Balay    MTYPE = PETSc.Mat.Type.SEQSBAIJ
1855808f684SSatish Balay    MOPTS = [PETSc.Mat.Option.IGNORE_LOWER_TRIANGULAR]
1865808f684SSatish Balay
187*6f336411SStefano Zampini
1885808f684SSatish Balay# --------------------------------------------------------------------
1895808f684SSatish Balay
1905808f684SSatish Balayif __name__ == '__main__':
1915808f684SSatish Balay    unittest.main()
192