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