15808f684SSatish Balay# -------------------------------------------------------------------- 25808f684SSatish Balay 35808f684SSatish Balayfrom petsc4py import PETSc 45808f684SSatish Balayimport unittest 55808f684SSatish Balayfrom sys import getrefcount 65808f684SSatish Balay 75808f684SSatish Balay# -------------------------------------------------------------------- 85808f684SSatish Balay 95808f684SSatish Balayclass BaseTestKSP(object): 105808f684SSatish Balay 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 26*62e5d2d2SJDBetteridge 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) 725808f684SSatish Balay self.assertTrue(ksp.converged) 735808f684SSatish Balay self.assertFalse(ksp.diverged) 745808f684SSatish Balay self.assertFalse(ksp.iterating) 755808f684SSatish Balay reason = PETSc.KSP.ConvergedReason.DIVERGED_MAX_IT 765808f684SSatish Balay ksp.reason = reason 775808f684SSatish Balay self.assertEqual(ksp.reason, reason) 785808f684SSatish Balay self.assertFalse(ksp.converged) 795808f684SSatish Balay self.assertTrue(ksp.diverged) 805808f684SSatish Balay self.assertFalse(ksp.iterating) 815808f684SSatish Balay reason = PETSc.KSP.ConvergedReason.CONVERGED_ITERATING 825808f684SSatish Balay ksp.reason = reason 835808f684SSatish Balay self.assertEqual(ksp.reason, reason) 845808f684SSatish Balay self.assertFalse(ksp.converged) 855808f684SSatish Balay self.assertFalse(ksp.diverged) 865808f684SSatish Balay self.assertTrue(ksp.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 r = b.duplicate() 1235808f684SSatish Balay u = x.duplicate() 1245808f684SSatish Balay self.ksp.buildSolution(u) 1255808f684SSatish Balay self.ksp.buildResidual(u) 1265808f684SSatish Balay rh = self.ksp.getConvergenceHistory() 1275808f684SSatish Balay self.ksp.setConvergenceHistory(0) 1285808f684SSatish Balay rh = self.ksp.getConvergenceHistory() 1295808f684SSatish Balay self.assertEqual(len(rh), 0) 1305808f684SSatish Balay del A, x, b 1315808f684SSatish Balay 1325808f684SSatish Balay def testResetAndSolve(self): 1335808f684SSatish Balay self.ksp.reset() 1345808f684SSatish Balay self.testSolve() 1355808f684SSatish Balay self.ksp.reset() 1365808f684SSatish Balay self.testSolve() 1375808f684SSatish Balay self.ksp.reset() 1385808f684SSatish Balay 1395808f684SSatish Balay def testSetMonitor(self): 1405808f684SSatish Balay reshist = {} 1415808f684SSatish Balay def monitor(ksp, its, rnorm): 1425808f684SSatish Balay reshist[its] = rnorm 1435808f684SSatish Balay refcnt = getrefcount(monitor) 1445808f684SSatish Balay self.ksp.setMonitor(monitor) 1455808f684SSatish Balay self.assertEqual(getrefcount(monitor), refcnt + 1) 1465808f684SSatish Balay ## self.testSolve() 1475808f684SSatish Balay reshist = {} 1481dbd64e7SPierre Jolivet self.ksp.monitorCancel() 1495808f684SSatish Balay self.assertEqual(getrefcount(monitor), refcnt) 1505808f684SSatish Balay self.testSolve() 1515808f684SSatish Balay self.assertEqual(len(reshist), 0) 1525808f684SSatish Balay ## Monitor = PETSc.KSP.Monitor 1535808f684SSatish Balay ## self.ksp.setMonitor(Monitor()) 1545808f684SSatish Balay ## self.ksp.setMonitor(Monitor.DEFAULT) 1555808f684SSatish Balay ## self.ksp.setMonitor(Monitor.TRUE_RESIDUAL_NORM) 1565808f684SSatish Balay ## self.ksp.setMonitor(Monitor.SOLUTION) 1575808f684SSatish Balay 1585808f684SSatish Balay def testSetConvergenceTest(self): 1595808f684SSatish Balay def converged(ksp, its, rnorm): 1605808f684SSatish Balay if its > 10: return True 1615808f684SSatish Balay return False 1625808f684SSatish Balay refcnt = getrefcount(converged) 1635808f684SSatish Balay self.ksp.setConvergenceTest(converged) 1645808f684SSatish Balay self.assertEqual(getrefcount(converged), refcnt + 1) 1655808f684SSatish Balay self.ksp.setConvergenceTest(None) 1665808f684SSatish Balay self.assertEqual(getrefcount(converged), refcnt) 1675808f684SSatish Balay 1685808f684SSatish Balay# -------------------------------------------------------------------- 1695808f684SSatish Balay 1705808f684SSatish Balayclass TestKSPPREONLY(BaseTestKSP, unittest.TestCase): 1715808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.PREONLY 1725808f684SSatish Balay PC_TYPE = PETSc.PC.Type.LU 1735808f684SSatish Balay 1745808f684SSatish Balayclass TestKSPRICHARDSON(BaseTestKSP, unittest.TestCase): 1755808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.RICHARDSON 1765808f684SSatish Balay 1775808f684SSatish Balayclass TestKSPCHEBYCHEV(BaseTestKSP, unittest.TestCase): 1785808f684SSatish Balay try: 1795808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CHEBYSHEV 1805808f684SSatish Balay except AttributeError: 1815808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CHEBYCHEV 1825808f684SSatish Balay 1835808f684SSatish Balayclass TestKSPCG(BaseTestKSP, unittest.TestCase): 1845808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CG 1855808f684SSatish Balay 1865808f684SSatish Balayclass TestKSPCGNE(BaseTestKSP, unittest.TestCase): 1875808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CGNE 1885808f684SSatish Balay 1895808f684SSatish Balayclass TestKSPSTCG(BaseTestKSP, unittest.TestCase): 1905808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.STCG 1915808f684SSatish Balay 1925808f684SSatish Balayclass TestKSPBCGS(BaseTestKSP, unittest.TestCase): 1935808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.BCGS 1945808f684SSatish Balay 1955808f684SSatish Balayclass TestKSPBCGSL(BaseTestKSP, unittest.TestCase): 1965808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.BCGSL 1975808f684SSatish Balay 1985808f684SSatish Balayclass TestKSPCGS(BaseTestKSP, unittest.TestCase): 1995808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CGS 2005808f684SSatish Balay 2015808f684SSatish Balayclass TestKSPQCG(BaseTestKSP, unittest.TestCase): 2025808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.QCG 2035808f684SSatish Balay PC_TYPE = PETSc.PC.Type.JACOBI 2045808f684SSatish Balay 2055808f684SSatish Balayclass TestKSPBICG(BaseTestKSP, unittest.TestCase): 2065808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.BICG 2075808f684SSatish Balay 2085808f684SSatish Balayclass TestKSPGMRES(BaseTestKSP, unittest.TestCase): 2095808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.GMRES 2105808f684SSatish Balay 2115808f684SSatish Balayclass TestKSPFGMRES(BaseTestKSP, unittest.TestCase): 2125808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.FGMRES 2135808f684SSatish Balay 2145808f684SSatish Balay# -------------------------------------------------------------------- 2155808f684SSatish Balay 2165808f684SSatish Balayif PETSc.ScalarType().dtype.char in 'FDG': 2175808f684SSatish Balay del TestKSPSTCG 2185808f684SSatish Balay 2195808f684SSatish Balay# -------------------------------------------------------------------- 2205808f684SSatish Balay 2215808f684SSatish Balayif __name__ == '__main__': 2225808f684SSatish Balay unittest.main() 223