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 106f336411SStefano 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 107*df8b9251SStefano Zampini def testSolve(self, solve_only=False): 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) 120*df8b9251SStefano Zampini if not solve_only: 1215808f684SSatish Balay self.ksp.setConvergenceHistory() 1225808f684SSatish Balay self.ksp.solve(b, x) 123*df8b9251SStefano Zampini if not solve_only: 1245808f684SSatish Balay u = x.duplicate() 1255808f684SSatish Balay self.ksp.buildSolution(u) 1265808f684SSatish Balay self.ksp.buildResidual(u) 1275808f684SSatish Balay rh = self.ksp.getConvergenceHistory() 1285808f684SSatish Balay self.ksp.setConvergenceHistory(0) 1295808f684SSatish Balay rh = self.ksp.getConvergenceHistory() 1305808f684SSatish Balay self.assertEqual(len(rh), 0) 131*df8b9251SStefano Zampini u.destroy() 1325808f684SSatish Balay del A, x, b 1335808f684SSatish Balay 1345808f684SSatish Balay def testResetAndSolve(self): 1355808f684SSatish Balay self.ksp.reset() 1365808f684SSatish Balay self.testSolve() 1375808f684SSatish Balay self.ksp.reset() 1385808f684SSatish Balay self.testSolve() 1395808f684SSatish Balay self.ksp.reset() 1405808f684SSatish Balay 1415808f684SSatish Balay def testSetMonitor(self): 1425808f684SSatish Balay reshist = {} 1436f336411SStefano Zampini 1445808f684SSatish Balay def monitor(ksp, its, rnorm): 145*df8b9251SStefano Zampini if ksp.type in ['cg', 'stcg']: 146*df8b9251SStefano Zampini reshist[its] = {'r': rnorm, 'o': ksp.getCGObjectiveValue()} 147*df8b9251SStefano Zampini else: 1485808f684SSatish Balay reshist[its] = rnorm 1495808f684SSatish Balay refcnt = getrefcount(monitor) 1505808f684SSatish Balay self.ksp.setMonitor(monitor) 1515808f684SSatish Balay self.assertEqual(getrefcount(monitor), refcnt + 1) 152*df8b9251SStefano Zampini self.testSolve(solve_only=True) 1535808f684SSatish Balay reshist = {} 1541dbd64e7SPierre Jolivet self.ksp.monitorCancel() 1555808f684SSatish Balay self.assertEqual(getrefcount(monitor), refcnt) 156*df8b9251SStefano Zampini self.testSolve(solve_only=True) 1575808f684SSatish Balay self.assertEqual(len(reshist), 0) 1585808f684SSatish Balay ## Monitor = PETSc.KSP.Monitor 1595808f684SSatish Balay ## self.ksp.setMonitor(Monitor()) 1605808f684SSatish Balay ## self.ksp.setMonitor(Monitor.DEFAULT) 1615808f684SSatish Balay ## self.ksp.setMonitor(Monitor.TRUE_RESIDUAL_NORM) 1625808f684SSatish Balay ## self.ksp.setMonitor(Monitor.SOLUTION) 1635808f684SSatish Balay 1645808f684SSatish Balay def testSetConvergenceTest(self): 1655808f684SSatish Balay def converged(ksp, its, rnorm): 1666f336411SStefano Zampini if its > 10: 1676f336411SStefano Zampini return True 1685808f684SSatish Balay return False 1696f336411SStefano Zampini 1705808f684SSatish Balay refcnt = getrefcount(converged) 1715808f684SSatish Balay self.ksp.setConvergenceTest(converged) 1725808f684SSatish Balay self.assertEqual(getrefcount(converged), refcnt + 1) 1735808f684SSatish Balay self.ksp.setConvergenceTest(None) 1745808f684SSatish Balay self.assertEqual(getrefcount(converged), refcnt) 1755808f684SSatish Balay 176859647acSStefano Zampini def testAddConvergenceTest(self): 177859647acSStefano Zampini def converged(ksp, its, rnorm): 178859647acSStefano Zampini return True 1796f336411SStefano Zampini 180859647acSStefano Zampini refcnt = getrefcount(converged) 181859647acSStefano Zampini self.ksp.addConvergenceTest(converged, prepend=True) 182859647acSStefano Zampini self.assertEqual(getrefcount(converged), refcnt + 1) 183859647acSStefano Zampini self.testSolve() 184859647acSStefano Zampini self.ksp.setConvergenceTest(None) 185859647acSStefano Zampini self.assertEqual(getrefcount(converged), refcnt) 186859647acSStefano Zampini self.testSolve() 187859647acSStefano Zampini self.ksp.addConvergenceTest(converged, prepend=False) 188859647acSStefano Zampini self.assertEqual(getrefcount(converged), refcnt + 1) 189859647acSStefano Zampini self.testSolve() 190859647acSStefano Zampini self.ksp.setConvergenceTest(None) 191859647acSStefano Zampini self.assertEqual(getrefcount(converged), refcnt) 192859647acSStefano Zampini 19370aa905bSYANG Zongze def testSetPreSolveTest(self): 19470aa905bSYANG Zongze check = {'val': 0} 1956f336411SStefano Zampini 19670aa905bSYANG Zongze def presolve(ksp, rhs, x): 19770aa905bSYANG Zongze check['val'] = 1 1986f336411SStefano Zampini 19970aa905bSYANG Zongze refcnt = getrefcount(presolve) 20070aa905bSYANG Zongze self.ksp.setPreSolve(presolve) 20170aa905bSYANG Zongze self.assertEqual(getrefcount(presolve), refcnt + 1) 20270aa905bSYANG Zongze self.testSolve() 20370aa905bSYANG Zongze self.assertEqual(check['val'], 1) 20470aa905bSYANG Zongze self.ksp.setPreSolve(None) 20570aa905bSYANG Zongze self.assertEqual(getrefcount(presolve), refcnt) 20670aa905bSYANG Zongze 20770aa905bSYANG Zongze def testSetPostSolveTest(self): 20870aa905bSYANG Zongze check = {'val': 0} 2096f336411SStefano Zampini 21070aa905bSYANG Zongze def postsolve(ksp, rhs, x): 21170aa905bSYANG Zongze check['val'] = 1 2126f336411SStefano Zampini 21370aa905bSYANG Zongze refcnt = getrefcount(postsolve) 21470aa905bSYANG Zongze self.ksp.setPostSolve(postsolve) 21570aa905bSYANG Zongze self.assertEqual(getrefcount(postsolve), refcnt + 1) 21670aa905bSYANG Zongze self.testSolve() 21770aa905bSYANG Zongze self.assertEqual(check['val'], 1) 21870aa905bSYANG Zongze self.ksp.setPostSolve(None) 21970aa905bSYANG Zongze self.assertEqual(getrefcount(postsolve), refcnt) 22070aa905bSYANG Zongze 2216f336411SStefano Zampini 2225808f684SSatish Balay# -------------------------------------------------------------------- 2235808f684SSatish Balay 2246f336411SStefano Zampini 2255808f684SSatish Balayclass TestKSPPREONLY(BaseTestKSP, unittest.TestCase): 2265808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.PREONLY 2275808f684SSatish Balay PC_TYPE = PETSc.PC.Type.LU 2285808f684SSatish Balay 2296f336411SStefano Zampini 2305808f684SSatish Balayclass TestKSPRICHARDSON(BaseTestKSP, unittest.TestCase): 2315808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.RICHARDSON 2325808f684SSatish Balay 2336f336411SStefano Zampini 2345808f684SSatish Balayclass TestKSPCHEBYCHEV(BaseTestKSP, unittest.TestCase): 2355808f684SSatish Balay try: 2365808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CHEBYSHEV 2375808f684SSatish Balay except AttributeError: 2385808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CHEBYCHEV 2395808f684SSatish Balay 2406f336411SStefano Zampini 2415808f684SSatish Balayclass TestKSPCG(BaseTestKSP, unittest.TestCase): 2425808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CG 2435808f684SSatish Balay 2446f336411SStefano Zampini 2455808f684SSatish Balayclass TestKSPCGNE(BaseTestKSP, unittest.TestCase): 2465808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CGNE 2475808f684SSatish Balay 2486f336411SStefano Zampini 2495808f684SSatish Balayclass TestKSPSTCG(BaseTestKSP, unittest.TestCase): 2505808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.STCG 2515808f684SSatish Balay 2526f336411SStefano Zampini 2535808f684SSatish Balayclass TestKSPBCGS(BaseTestKSP, unittest.TestCase): 2545808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.BCGS 2555808f684SSatish Balay 2566f336411SStefano Zampini 2575808f684SSatish Balayclass TestKSPBCGSL(BaseTestKSP, unittest.TestCase): 2585808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.BCGSL 2595808f684SSatish Balay 2606f336411SStefano Zampini 2615808f684SSatish Balayclass TestKSPCGS(BaseTestKSP, unittest.TestCase): 2625808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CGS 2635808f684SSatish Balay 2646f336411SStefano Zampini 2655808f684SSatish Balayclass TestKSPQCG(BaseTestKSP, unittest.TestCase): 2665808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.QCG 2675808f684SSatish Balay PC_TYPE = PETSc.PC.Type.JACOBI 2685808f684SSatish Balay 2696f336411SStefano Zampini 2705808f684SSatish Balayclass TestKSPBICG(BaseTestKSP, unittest.TestCase): 2715808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.BICG 2725808f684SSatish Balay 2736f336411SStefano Zampini 2745808f684SSatish Balayclass TestKSPGMRES(BaseTestKSP, unittest.TestCase): 2755808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.GMRES 2765808f684SSatish Balay 2776f336411SStefano Zampini 2785808f684SSatish Balayclass TestKSPFGMRES(BaseTestKSP, unittest.TestCase): 2795808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.FGMRES 2805808f684SSatish Balay 2816f336411SStefano Zampini 282859647acSStefano Zampiniclass TestKSPLSQR(BaseTestKSP, unittest.TestCase): 283859647acSStefano Zampini KSP_TYPE = PETSc.KSP.Type.LSQR 284859647acSStefano Zampini 2856f336411SStefano Zampini 2865808f684SSatish Balay# -------------------------------------------------------------------- 2875808f684SSatish Balay 2885808f684SSatish Balayif PETSc.ScalarType().dtype.char in 'FDG': 2895808f684SSatish Balay del TestKSPSTCG 2905808f684SSatish Balay 2915808f684SSatish Balay# -------------------------------------------------------------------- 2925808f684SSatish Balay 2935808f684SSatish Balayif __name__ == '__main__': 2945808f684SSatish Balay unittest.main() 295