15808f684SSatish Balay# -------------------------------------------------------------------- 25808f684SSatish Balay 35808f684SSatish Balayfrom petsc4py import PETSc 45808f684SSatish Balayimport unittest 55808f684SSatish Balayfrom sys import getrefcount 65808f684SSatish Balay 75808f684SSatish Balay# -------------------------------------------------------------------- 85808f684SSatish Balay 95808f684SSatish Balay 10*6f336411SStefano Zampiniclass BaseTestKSP: 115808f684SSatish Balay KSP_TYPE = None 125808f684SSatish Balay PC_TYPE = None 135808f684SSatish Balay 145808f684SSatish Balay def setUp(self): 155808f684SSatish Balay ksp = PETSc.KSP() 165808f684SSatish Balay ksp.create(PETSc.COMM_SELF) 175808f684SSatish Balay if self.KSP_TYPE: 185808f684SSatish Balay ksp.setType(self.KSP_TYPE) 195808f684SSatish Balay if self.PC_TYPE: 205808f684SSatish Balay pc = ksp.getPC() 215808f684SSatish Balay pc.setType(self.PC_TYPE) 225808f684SSatish Balay self.ksp = ksp 235808f684SSatish Balay 245808f684SSatish Balay def tearDown(self): 255808f684SSatish Balay self.ksp = None 2662e5d2d2SJDBetteridge PETSc.garbage_cleanup() 275808f684SSatish Balay 285808f684SSatish Balay def testGetSetType(self): 295808f684SSatish Balay self.assertEqual(self.ksp.getType(), self.KSP_TYPE) 305808f684SSatish Balay self.ksp.setType(self.KSP_TYPE) 315808f684SSatish Balay self.assertEqual(self.ksp.getType(), self.KSP_TYPE) 325808f684SSatish Balay 335808f684SSatish Balay def testTols(self): 345808f684SSatish Balay tols = self.ksp.getTolerances() 355808f684SSatish Balay self.ksp.setTolerances(*tols) 365808f684SSatish Balay tnames = ('rtol', 'atol', 'divtol', 'max_it') 375808f684SSatish Balay tolvals = [getattr(self.ksp, t) for t in tnames] 385808f684SSatish Balay self.assertEqual(tuple(tols), tuple(tolvals)) 395808f684SSatish Balay 405808f684SSatish Balay def testProperties(self): 415808f684SSatish Balay ksp = self.ksp 425808f684SSatish Balay # 435808f684SSatish Balay ksp.appctx = (1, 2, 3) 445808f684SSatish Balay self.assertEqual(ksp.appctx, (1, 2, 3)) 455808f684SSatish Balay ksp.appctx = None 465808f684SSatish Balay self.assertEqual(ksp.appctx, None) 475808f684SSatish Balay # 485808f684SSatish Balay side = ksp.pc_side 495808f684SSatish Balay ksp.pc_side = side 505808f684SSatish Balay self.assertEqual(ksp.pc_side, side) 515808f684SSatish Balay # 525808f684SSatish Balay nt = ksp.norm_type 535808f684SSatish Balay ksp.norm_type = nt 545808f684SSatish Balay self.assertEqual(ksp.norm_type, nt) 555808f684SSatish Balay # 565808f684SSatish Balay ksp.its = 1 575808f684SSatish Balay self.assertEqual(ksp.its, 1) 585808f684SSatish Balay ksp.its = 0 595808f684SSatish Balay self.assertEqual(ksp.its, 0) 605808f684SSatish Balay # 615808f684SSatish Balay ksp.norm = 1 625808f684SSatish Balay self.assertEqual(ksp.norm, 1) 635808f684SSatish Balay ksp.norm = 0 645808f684SSatish Balay self.assertEqual(ksp.norm, 0) 655808f684SSatish Balay # 665808f684SSatish Balay rh = ksp.history 675808f684SSatish Balay self.assertTrue(len(rh) == 0) 685808f684SSatish Balay # 695808f684SSatish Balay reason = PETSc.KSP.ConvergedReason.CONVERGED_ITS 705808f684SSatish Balay ksp.reason = reason 715808f684SSatish Balay self.assertEqual(ksp.reason, reason) 72c78242eeSStefano Zampini self.assertTrue(ksp.is_converged) 73c78242eeSStefano Zampini self.assertFalse(ksp.is_diverged) 74c78242eeSStefano Zampini self.assertFalse(ksp.is_iterating) 755808f684SSatish Balay reason = PETSc.KSP.ConvergedReason.DIVERGED_MAX_IT 765808f684SSatish Balay ksp.reason = reason 775808f684SSatish Balay self.assertEqual(ksp.reason, reason) 78c78242eeSStefano Zampini self.assertFalse(ksp.is_converged) 79c78242eeSStefano Zampini self.assertTrue(ksp.is_diverged) 80c78242eeSStefano Zampini self.assertFalse(ksp.is_iterating) 815808f684SSatish Balay reason = PETSc.KSP.ConvergedReason.CONVERGED_ITERATING 825808f684SSatish Balay ksp.reason = reason 835808f684SSatish Balay self.assertEqual(ksp.reason, reason) 84c78242eeSStefano Zampini self.assertFalse(ksp.is_converged) 85c78242eeSStefano Zampini self.assertFalse(ksp.is_diverged) 86c78242eeSStefano Zampini self.assertTrue(ksp.is_iterating) 875808f684SSatish Balay 885808f684SSatish Balay def testGetSetPC(self): 895808f684SSatish Balay oldpc = self.ksp.getPC() 905808f684SSatish Balay self.assertEqual(oldpc.getRefCount(), 2) 915808f684SSatish Balay newpc = PETSc.PC() 925808f684SSatish Balay newpc.create(self.ksp.getComm()) 935808f684SSatish Balay self.assertEqual(newpc.getRefCount(), 1) 945808f684SSatish Balay self.ksp.setPC(newpc) 955808f684SSatish Balay self.assertEqual(newpc.getRefCount(), 2) 965808f684SSatish Balay self.assertEqual(oldpc.getRefCount(), 1) 975808f684SSatish Balay oldpc.destroy() 985808f684SSatish Balay self.assertFalse(bool(oldpc)) 995808f684SSatish Balay pc = self.ksp.getPC() 1005808f684SSatish Balay self.assertTrue(bool(pc)) 1015808f684SSatish Balay self.assertEqual(pc, newpc) 1025808f684SSatish Balay self.assertEqual(pc.getRefCount(), 3) 1035808f684SSatish Balay newpc.destroy() 1045808f684SSatish Balay self.assertFalse(bool(newpc)) 1055808f684SSatish Balay self.assertEqual(pc.getRefCount(), 2) 1065808f684SSatish Balay 1075808f684SSatish Balay def testSolve(self): 1085808f684SSatish Balay A = PETSc.Mat().create(PETSc.COMM_SELF) 1095808f684SSatish Balay A.setSizes([3, 3]) 1105808f684SSatish Balay A.setType(PETSc.Mat.Type.SEQAIJ) 1115808f684SSatish Balay A.setPreallocationNNZ(1) 1125808f684SSatish Balay for i in range(3): 1135808f684SSatish Balay A.setValue(i, i, 0.9 / (i + 1)) 1145808f684SSatish Balay A.assemble() 1155808f684SSatish Balay A.shift(1) 1165808f684SSatish Balay x, b = A.createVecs() 1175808f684SSatish Balay b.set(10) 1185808f684SSatish Balay x.setRandom() 1195808f684SSatish Balay self.ksp.setOperators(A) 1205808f684SSatish Balay self.ksp.setConvergenceHistory() 1215808f684SSatish Balay self.ksp.solve(b, x) 1225808f684SSatish Balay u = x.duplicate() 1235808f684SSatish Balay self.ksp.buildSolution(u) 1245808f684SSatish Balay self.ksp.buildResidual(u) 1255808f684SSatish Balay rh = self.ksp.getConvergenceHistory() 1265808f684SSatish Balay self.ksp.setConvergenceHistory(0) 1275808f684SSatish Balay rh = self.ksp.getConvergenceHistory() 1285808f684SSatish Balay self.assertEqual(len(rh), 0) 1295808f684SSatish Balay del A, x, b 1305808f684SSatish Balay 1315808f684SSatish Balay def testResetAndSolve(self): 1325808f684SSatish Balay self.ksp.reset() 1335808f684SSatish Balay self.testSolve() 1345808f684SSatish Balay self.ksp.reset() 1355808f684SSatish Balay self.testSolve() 1365808f684SSatish Balay self.ksp.reset() 1375808f684SSatish Balay 1385808f684SSatish Balay def testSetMonitor(self): 1395808f684SSatish Balay reshist = {} 140*6f336411SStefano Zampini 1415808f684SSatish Balay def monitor(ksp, its, rnorm): 1425808f684SSatish Balay reshist[its] = rnorm 143*6f336411SStefano Zampini 1445808f684SSatish Balay refcnt = getrefcount(monitor) 1455808f684SSatish Balay self.ksp.setMonitor(monitor) 1465808f684SSatish Balay self.assertEqual(getrefcount(monitor), refcnt + 1) 1475808f684SSatish Balay ## self.testSolve() 1485808f684SSatish Balay reshist = {} 1491dbd64e7SPierre Jolivet self.ksp.monitorCancel() 1505808f684SSatish Balay self.assertEqual(getrefcount(monitor), refcnt) 1515808f684SSatish Balay self.testSolve() 1525808f684SSatish Balay self.assertEqual(len(reshist), 0) 1535808f684SSatish Balay ## Monitor = PETSc.KSP.Monitor 1545808f684SSatish Balay ## self.ksp.setMonitor(Monitor()) 1555808f684SSatish Balay ## self.ksp.setMonitor(Monitor.DEFAULT) 1565808f684SSatish Balay ## self.ksp.setMonitor(Monitor.TRUE_RESIDUAL_NORM) 1575808f684SSatish Balay ## self.ksp.setMonitor(Monitor.SOLUTION) 1585808f684SSatish Balay 1595808f684SSatish Balay def testSetConvergenceTest(self): 1605808f684SSatish Balay def converged(ksp, its, rnorm): 161*6f336411SStefano Zampini if its > 10: 162*6f336411SStefano Zampini return True 1635808f684SSatish Balay return False 164*6f336411SStefano Zampini 1655808f684SSatish Balay refcnt = getrefcount(converged) 1665808f684SSatish Balay self.ksp.setConvergenceTest(converged) 1675808f684SSatish Balay self.assertEqual(getrefcount(converged), refcnt + 1) 1685808f684SSatish Balay self.ksp.setConvergenceTest(None) 1695808f684SSatish Balay self.assertEqual(getrefcount(converged), refcnt) 1705808f684SSatish Balay 171859647acSStefano Zampini def testAddConvergenceTest(self): 172859647acSStefano Zampini def converged(ksp, its, rnorm): 173859647acSStefano Zampini return True 174*6f336411SStefano Zampini 175859647acSStefano Zampini refcnt = getrefcount(converged) 176859647acSStefano Zampini self.ksp.addConvergenceTest(converged, prepend=True) 177859647acSStefano Zampini self.assertEqual(getrefcount(converged), refcnt + 1) 178859647acSStefano Zampini self.testSolve() 179859647acSStefano Zampini self.ksp.setConvergenceTest(None) 180859647acSStefano Zampini self.assertEqual(getrefcount(converged), refcnt) 181859647acSStefano Zampini self.testSolve() 182859647acSStefano Zampini self.ksp.addConvergenceTest(converged, prepend=False) 183859647acSStefano Zampini self.assertEqual(getrefcount(converged), refcnt + 1) 184859647acSStefano Zampini self.testSolve() 185859647acSStefano Zampini self.ksp.setConvergenceTest(None) 186859647acSStefano Zampini self.assertEqual(getrefcount(converged), refcnt) 187859647acSStefano Zampini 18870aa905bSYANG Zongze def testSetPreSolveTest(self): 18970aa905bSYANG Zongze check = {'val': 0} 190*6f336411SStefano Zampini 19170aa905bSYANG Zongze def presolve(ksp, rhs, x): 19270aa905bSYANG Zongze check['val'] = 1 193*6f336411SStefano Zampini 19470aa905bSYANG Zongze refcnt = getrefcount(presolve) 19570aa905bSYANG Zongze self.ksp.setPreSolve(presolve) 19670aa905bSYANG Zongze self.assertEqual(getrefcount(presolve), refcnt + 1) 19770aa905bSYANG Zongze self.testSolve() 19870aa905bSYANG Zongze self.assertEqual(check['val'], 1) 19970aa905bSYANG Zongze self.ksp.setPreSolve(None) 20070aa905bSYANG Zongze self.assertEqual(getrefcount(presolve), refcnt) 20170aa905bSYANG Zongze 20270aa905bSYANG Zongze def testSetPostSolveTest(self): 20370aa905bSYANG Zongze check = {'val': 0} 204*6f336411SStefano Zampini 20570aa905bSYANG Zongze def postsolve(ksp, rhs, x): 20670aa905bSYANG Zongze check['val'] = 1 207*6f336411SStefano Zampini 20870aa905bSYANG Zongze refcnt = getrefcount(postsolve) 20970aa905bSYANG Zongze self.ksp.setPostSolve(postsolve) 21070aa905bSYANG Zongze self.assertEqual(getrefcount(postsolve), refcnt + 1) 21170aa905bSYANG Zongze self.testSolve() 21270aa905bSYANG Zongze self.assertEqual(check['val'], 1) 21370aa905bSYANG Zongze self.ksp.setPostSolve(None) 21470aa905bSYANG Zongze self.assertEqual(getrefcount(postsolve), refcnt) 21570aa905bSYANG Zongze 216*6f336411SStefano Zampini 2175808f684SSatish Balay# -------------------------------------------------------------------- 2185808f684SSatish Balay 219*6f336411SStefano Zampini 2205808f684SSatish Balayclass TestKSPPREONLY(BaseTestKSP, unittest.TestCase): 2215808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.PREONLY 2225808f684SSatish Balay PC_TYPE = PETSc.PC.Type.LU 2235808f684SSatish Balay 224*6f336411SStefano Zampini 2255808f684SSatish Balayclass TestKSPRICHARDSON(BaseTestKSP, unittest.TestCase): 2265808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.RICHARDSON 2275808f684SSatish Balay 228*6f336411SStefano Zampini 2295808f684SSatish Balayclass TestKSPCHEBYCHEV(BaseTestKSP, unittest.TestCase): 2305808f684SSatish Balay try: 2315808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CHEBYSHEV 2325808f684SSatish Balay except AttributeError: 2335808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CHEBYCHEV 2345808f684SSatish Balay 235*6f336411SStefano Zampini 2365808f684SSatish Balayclass TestKSPCG(BaseTestKSP, unittest.TestCase): 2375808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CG 2385808f684SSatish Balay 239*6f336411SStefano Zampini 2405808f684SSatish Balayclass TestKSPCGNE(BaseTestKSP, unittest.TestCase): 2415808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CGNE 2425808f684SSatish Balay 243*6f336411SStefano Zampini 2445808f684SSatish Balayclass TestKSPSTCG(BaseTestKSP, unittest.TestCase): 2455808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.STCG 2465808f684SSatish Balay 247*6f336411SStefano Zampini 2485808f684SSatish Balayclass TestKSPBCGS(BaseTestKSP, unittest.TestCase): 2495808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.BCGS 2505808f684SSatish Balay 251*6f336411SStefano Zampini 2525808f684SSatish Balayclass TestKSPBCGSL(BaseTestKSP, unittest.TestCase): 2535808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.BCGSL 2545808f684SSatish Balay 255*6f336411SStefano Zampini 2565808f684SSatish Balayclass TestKSPCGS(BaseTestKSP, unittest.TestCase): 2575808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CGS 2585808f684SSatish Balay 259*6f336411SStefano Zampini 2605808f684SSatish Balayclass TestKSPQCG(BaseTestKSP, unittest.TestCase): 2615808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.QCG 2625808f684SSatish Balay PC_TYPE = PETSc.PC.Type.JACOBI 2635808f684SSatish Balay 264*6f336411SStefano Zampini 2655808f684SSatish Balayclass TestKSPBICG(BaseTestKSP, unittest.TestCase): 2665808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.BICG 2675808f684SSatish Balay 268*6f336411SStefano Zampini 2695808f684SSatish Balayclass TestKSPGMRES(BaseTestKSP, unittest.TestCase): 2705808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.GMRES 2715808f684SSatish Balay 272*6f336411SStefano Zampini 2735808f684SSatish Balayclass TestKSPFGMRES(BaseTestKSP, unittest.TestCase): 2745808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.FGMRES 2755808f684SSatish Balay 276*6f336411SStefano Zampini 277859647acSStefano Zampiniclass TestKSPLSQR(BaseTestKSP, unittest.TestCase): 278859647acSStefano Zampini KSP_TYPE = PETSc.KSP.Type.LSQR 279859647acSStefano Zampini 280*6f336411SStefano Zampini 2815808f684SSatish Balay# -------------------------------------------------------------------- 2825808f684SSatish Balay 2835808f684SSatish Balayif PETSc.ScalarType().dtype.char in 'FDG': 2845808f684SSatish Balay del TestKSPSTCG 2855808f684SSatish Balay 2865808f684SSatish Balay# -------------------------------------------------------------------- 2875808f684SSatish Balay 2885808f684SSatish Balayif __name__ == '__main__': 2895808f684SSatish Balay unittest.main() 290