xref: /petsc/src/binding/petsc4py/test/test_ksp.py (revision 1dbd64e75d9340f5d9ed5410ac603420dec0b324)
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