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 265808f684SSatish Balay 275808f684SSatish Balay def testGetSetType(self): 285808f684SSatish Balay self.assertEqual(self.ksp.getType(), self.KSP_TYPE) 295808f684SSatish Balay self.ksp.setType(self.KSP_TYPE) 305808f684SSatish Balay self.assertEqual(self.ksp.getType(), self.KSP_TYPE) 315808f684SSatish Balay 325808f684SSatish Balay def testTols(self): 335808f684SSatish Balay tols = self.ksp.getTolerances() 345808f684SSatish Balay self.ksp.setTolerances(*tols) 355808f684SSatish Balay tnames = ('rtol', 'atol', 'divtol', 'max_it') 365808f684SSatish Balay tolvals = [getattr(self.ksp, t) for t in tnames] 375808f684SSatish Balay self.assertEqual(tuple(tols), tuple(tolvals)) 385808f684SSatish Balay 395808f684SSatish Balay def testProperties(self): 405808f684SSatish Balay ksp = self.ksp 415808f684SSatish Balay # 425808f684SSatish Balay ksp.appctx = (1,2,3) 435808f684SSatish Balay self.assertEqual(ksp.appctx, (1,2,3)) 445808f684SSatish Balay ksp.appctx = None 455808f684SSatish Balay self.assertEqual(ksp.appctx, None) 465808f684SSatish Balay # 475808f684SSatish Balay side = ksp.pc_side 485808f684SSatish Balay ksp.pc_side = side 495808f684SSatish Balay self.assertEqual(ksp.pc_side, side) 505808f684SSatish Balay # 515808f684SSatish Balay nt = ksp.norm_type 525808f684SSatish Balay ksp.norm_type = nt 535808f684SSatish Balay self.assertEqual(ksp.norm_type, nt) 545808f684SSatish Balay # 555808f684SSatish Balay ksp.its = 1 565808f684SSatish Balay self.assertEqual(ksp.its, 1) 575808f684SSatish Balay ksp.its = 0 585808f684SSatish Balay self.assertEqual(ksp.its, 0) 595808f684SSatish Balay # 605808f684SSatish Balay ksp.norm = 1 615808f684SSatish Balay self.assertEqual(ksp.norm, 1) 625808f684SSatish Balay ksp.norm = 0 635808f684SSatish Balay self.assertEqual(ksp.norm, 0) 645808f684SSatish Balay # 655808f684SSatish Balay rh = ksp.history 665808f684SSatish Balay self.assertTrue(len(rh)==0) 675808f684SSatish Balay # 685808f684SSatish Balay reason = PETSc.KSP.ConvergedReason.CONVERGED_ITS 695808f684SSatish Balay ksp.reason = reason 705808f684SSatish Balay self.assertEqual(ksp.reason, reason) 715808f684SSatish Balay self.assertTrue(ksp.converged) 725808f684SSatish Balay self.assertFalse(ksp.diverged) 735808f684SSatish Balay self.assertFalse(ksp.iterating) 745808f684SSatish Balay reason = PETSc.KSP.ConvergedReason.DIVERGED_MAX_IT 755808f684SSatish Balay ksp.reason = reason 765808f684SSatish Balay self.assertEqual(ksp.reason, reason) 775808f684SSatish Balay self.assertFalse(ksp.converged) 785808f684SSatish Balay self.assertTrue(ksp.diverged) 795808f684SSatish Balay self.assertFalse(ksp.iterating) 805808f684SSatish Balay reason = PETSc.KSP.ConvergedReason.CONVERGED_ITERATING 815808f684SSatish Balay ksp.reason = reason 825808f684SSatish Balay self.assertEqual(ksp.reason, reason) 835808f684SSatish Balay self.assertFalse(ksp.converged) 845808f684SSatish Balay self.assertFalse(ksp.diverged) 855808f684SSatish Balay self.assertTrue(ksp.iterating) 865808f684SSatish Balay 875808f684SSatish Balay def testGetSetPC(self): 885808f684SSatish Balay oldpc = self.ksp.getPC() 895808f684SSatish Balay self.assertEqual(oldpc.getRefCount(), 2) 905808f684SSatish Balay newpc = PETSc.PC() 915808f684SSatish Balay newpc.create(self.ksp.getComm()) 925808f684SSatish Balay self.assertEqual(newpc.getRefCount(), 1) 935808f684SSatish Balay self.ksp.setPC(newpc) 945808f684SSatish Balay self.assertEqual(newpc.getRefCount(), 2) 955808f684SSatish Balay self.assertEqual(oldpc.getRefCount(), 1) 965808f684SSatish Balay oldpc.destroy() 975808f684SSatish Balay self.assertFalse(bool(oldpc)) 985808f684SSatish Balay pc = self.ksp.getPC() 995808f684SSatish Balay self.assertTrue(bool(pc)) 1005808f684SSatish Balay self.assertEqual(pc, newpc) 1015808f684SSatish Balay self.assertEqual(pc.getRefCount(), 3) 1025808f684SSatish Balay newpc.destroy() 1035808f684SSatish Balay self.assertFalse(bool(newpc)) 1045808f684SSatish Balay self.assertEqual(pc.getRefCount(), 2) 1055808f684SSatish Balay 1065808f684SSatish Balay def testSolve(self): 1075808f684SSatish Balay A = PETSc.Mat().create(PETSc.COMM_SELF) 1085808f684SSatish Balay A.setSizes([3,3]) 1095808f684SSatish Balay A.setType(PETSc.Mat.Type.SEQAIJ) 1105808f684SSatish Balay A.setPreallocationNNZ(1) 1115808f684SSatish Balay for i in range(3): 1125808f684SSatish Balay A.setValue(i, i, 0.9/(i+1)) 1135808f684SSatish Balay A.assemble() 1145808f684SSatish Balay A.shift(1) 1155808f684SSatish Balay x, b = A.createVecs() 1165808f684SSatish Balay b.set(10) 1175808f684SSatish Balay x.setRandom() 1185808f684SSatish Balay self.ksp.setOperators(A) 1195808f684SSatish Balay self.ksp.setConvergenceHistory() 1205808f684SSatish Balay self.ksp.solve(b, x) 1215808f684SSatish Balay r = b.duplicate() 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 = {} 1405808f684SSatish Balay def monitor(ksp, its, rnorm): 1415808f684SSatish Balay reshist[its] = rnorm 1425808f684SSatish Balay refcnt = getrefcount(monitor) 1435808f684SSatish Balay self.ksp.setMonitor(monitor) 1445808f684SSatish Balay self.assertEqual(getrefcount(monitor), refcnt + 1) 1455808f684SSatish Balay ## self.testSolve() 1465808f684SSatish Balay reshist = {} 147*1dbd64e7SPierre Jolivet self.ksp.monitorCancel() 1485808f684SSatish Balay self.assertEqual(getrefcount(monitor), refcnt) 1495808f684SSatish Balay self.testSolve() 1505808f684SSatish Balay self.assertEqual(len(reshist), 0) 1515808f684SSatish Balay ## Monitor = PETSc.KSP.Monitor 1525808f684SSatish Balay ## self.ksp.setMonitor(Monitor()) 1535808f684SSatish Balay ## self.ksp.setMonitor(Monitor.DEFAULT) 1545808f684SSatish Balay ## self.ksp.setMonitor(Monitor.TRUE_RESIDUAL_NORM) 1555808f684SSatish Balay ## self.ksp.setMonitor(Monitor.SOLUTION) 1565808f684SSatish Balay 1575808f684SSatish Balay def testSetConvergenceTest(self): 1585808f684SSatish Balay def converged(ksp, its, rnorm): 1595808f684SSatish Balay if its > 10: return True 1605808f684SSatish Balay return False 1615808f684SSatish Balay refcnt = getrefcount(converged) 1625808f684SSatish Balay self.ksp.setConvergenceTest(converged) 1635808f684SSatish Balay self.assertEqual(getrefcount(converged), refcnt + 1) 1645808f684SSatish Balay self.ksp.setConvergenceTest(None) 1655808f684SSatish Balay self.assertEqual(getrefcount(converged), refcnt) 1665808f684SSatish Balay 1675808f684SSatish Balay# -------------------------------------------------------------------- 1685808f684SSatish Balay 1695808f684SSatish Balayclass TestKSPPREONLY(BaseTestKSP, unittest.TestCase): 1705808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.PREONLY 1715808f684SSatish Balay PC_TYPE = PETSc.PC.Type.LU 1725808f684SSatish Balay 1735808f684SSatish Balayclass TestKSPRICHARDSON(BaseTestKSP, unittest.TestCase): 1745808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.RICHARDSON 1755808f684SSatish Balay 1765808f684SSatish Balayclass TestKSPCHEBYCHEV(BaseTestKSP, unittest.TestCase): 1775808f684SSatish Balay try: 1785808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CHEBYSHEV 1795808f684SSatish Balay except AttributeError: 1805808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CHEBYCHEV 1815808f684SSatish Balay 1825808f684SSatish Balayclass TestKSPCG(BaseTestKSP, unittest.TestCase): 1835808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CG 1845808f684SSatish Balay 1855808f684SSatish Balayclass TestKSPCGNE(BaseTestKSP, unittest.TestCase): 1865808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CGNE 1875808f684SSatish Balay 1885808f684SSatish Balayclass TestKSPSTCG(BaseTestKSP, unittest.TestCase): 1895808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.STCG 1905808f684SSatish Balay 1915808f684SSatish Balayclass TestKSPBCGS(BaseTestKSP, unittest.TestCase): 1925808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.BCGS 1935808f684SSatish Balay 1945808f684SSatish Balayclass TestKSPBCGSL(BaseTestKSP, unittest.TestCase): 1955808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.BCGSL 1965808f684SSatish Balay 1975808f684SSatish Balayclass TestKSPCGS(BaseTestKSP, unittest.TestCase): 1985808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.CGS 1995808f684SSatish Balay 2005808f684SSatish Balayclass TestKSPQCG(BaseTestKSP, unittest.TestCase): 2015808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.QCG 2025808f684SSatish Balay PC_TYPE = PETSc.PC.Type.JACOBI 2035808f684SSatish Balay 2045808f684SSatish Balayclass TestKSPBICG(BaseTestKSP, unittest.TestCase): 2055808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.BICG 2065808f684SSatish Balay 2075808f684SSatish Balayclass TestKSPGMRES(BaseTestKSP, unittest.TestCase): 2085808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.GMRES 2095808f684SSatish Balay 2105808f684SSatish Balayclass TestKSPFGMRES(BaseTestKSP, unittest.TestCase): 2115808f684SSatish Balay KSP_TYPE = PETSc.KSP.Type.FGMRES 2125808f684SSatish Balay 2135808f684SSatish Balay# -------------------------------------------------------------------- 2145808f684SSatish Balay 2155808f684SSatish Balayif PETSc.ScalarType().dtype.char in 'FDG': 2165808f684SSatish Balay del TestKSPSTCG 2175808f684SSatish Balay 2185808f684SSatish Balay# -------------------------------------------------------------------- 2195808f684SSatish Balay 2205808f684SSatish Balayif __name__ == '__main__': 2215808f684SSatish Balay unittest.main() 222