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