xref: /petsc/src/binding/petsc4py/test/test_ksp.py (revision 5808f68492579297331054bd8ff190489c3b8c20)
1*5808f684SSatish Balay# --------------------------------------------------------------------
2*5808f684SSatish Balay
3*5808f684SSatish Balayfrom petsc4py import PETSc
4*5808f684SSatish Balayimport unittest
5*5808f684SSatish Balayfrom sys import getrefcount
6*5808f684SSatish Balay
7*5808f684SSatish Balay# --------------------------------------------------------------------
8*5808f684SSatish Balay
9*5808f684SSatish Balayclass BaseTestKSP(object):
10*5808f684SSatish Balay
11*5808f684SSatish Balay    KSP_TYPE = None
12*5808f684SSatish Balay    PC_TYPE  = None
13*5808f684SSatish Balay
14*5808f684SSatish Balay    def setUp(self):
15*5808f684SSatish Balay        ksp = PETSc.KSP()
16*5808f684SSatish Balay        ksp.create(PETSc.COMM_SELF)
17*5808f684SSatish Balay        if self.KSP_TYPE:
18*5808f684SSatish Balay            ksp.setType(self.KSP_TYPE)
19*5808f684SSatish Balay        if self.PC_TYPE:
20*5808f684SSatish Balay            pc = ksp.getPC()
21*5808f684SSatish Balay            pc.setType(self.PC_TYPE)
22*5808f684SSatish Balay        self.ksp = ksp
23*5808f684SSatish Balay
24*5808f684SSatish Balay    def tearDown(self):
25*5808f684SSatish Balay        self.ksp = None
26*5808f684SSatish Balay
27*5808f684SSatish Balay    def testGetSetType(self):
28*5808f684SSatish Balay        self.assertEqual(self.ksp.getType(), self.KSP_TYPE)
29*5808f684SSatish Balay        self.ksp.setType(self.KSP_TYPE)
30*5808f684SSatish Balay        self.assertEqual(self.ksp.getType(), self.KSP_TYPE)
31*5808f684SSatish Balay
32*5808f684SSatish Balay    def testTols(self):
33*5808f684SSatish Balay        tols = self.ksp.getTolerances()
34*5808f684SSatish Balay        self.ksp.setTolerances(*tols)
35*5808f684SSatish Balay        tnames = ('rtol', 'atol', 'divtol', 'max_it')
36*5808f684SSatish Balay        tolvals = [getattr(self.ksp, t) for t in  tnames]
37*5808f684SSatish Balay        self.assertEqual(tuple(tols), tuple(tolvals))
38*5808f684SSatish Balay
39*5808f684SSatish Balay    def testProperties(self):
40*5808f684SSatish Balay        ksp = self.ksp
41*5808f684SSatish Balay        #
42*5808f684SSatish Balay        ksp.appctx = (1,2,3)
43*5808f684SSatish Balay        self.assertEqual(ksp.appctx, (1,2,3))
44*5808f684SSatish Balay        ksp.appctx = None
45*5808f684SSatish Balay        self.assertEqual(ksp.appctx, None)
46*5808f684SSatish Balay        #
47*5808f684SSatish Balay        side = ksp.pc_side
48*5808f684SSatish Balay        ksp.pc_side = side
49*5808f684SSatish Balay        self.assertEqual(ksp.pc_side, side)
50*5808f684SSatish Balay        #
51*5808f684SSatish Balay        nt = ksp.norm_type
52*5808f684SSatish Balay        ksp.norm_type = nt
53*5808f684SSatish Balay        self.assertEqual(ksp.norm_type, nt)
54*5808f684SSatish Balay        #
55*5808f684SSatish Balay        ksp.its = 1
56*5808f684SSatish Balay        self.assertEqual(ksp.its, 1)
57*5808f684SSatish Balay        ksp.its = 0
58*5808f684SSatish Balay        self.assertEqual(ksp.its, 0)
59*5808f684SSatish Balay        #
60*5808f684SSatish Balay        ksp.norm = 1
61*5808f684SSatish Balay        self.assertEqual(ksp.norm, 1)
62*5808f684SSatish Balay        ksp.norm = 0
63*5808f684SSatish Balay        self.assertEqual(ksp.norm, 0)
64*5808f684SSatish Balay        #
65*5808f684SSatish Balay        rh = ksp.history
66*5808f684SSatish Balay        self.assertTrue(len(rh)==0)
67*5808f684SSatish Balay        #
68*5808f684SSatish Balay        reason = PETSc.KSP.ConvergedReason.CONVERGED_ITS
69*5808f684SSatish Balay        ksp.reason = reason
70*5808f684SSatish Balay        self.assertEqual(ksp.reason, reason)
71*5808f684SSatish Balay        self.assertTrue(ksp.converged)
72*5808f684SSatish Balay        self.assertFalse(ksp.diverged)
73*5808f684SSatish Balay        self.assertFalse(ksp.iterating)
74*5808f684SSatish Balay        reason = PETSc.KSP.ConvergedReason.DIVERGED_MAX_IT
75*5808f684SSatish Balay        ksp.reason = reason
76*5808f684SSatish Balay        self.assertEqual(ksp.reason, reason)
77*5808f684SSatish Balay        self.assertFalse(ksp.converged)
78*5808f684SSatish Balay        self.assertTrue(ksp.diverged)
79*5808f684SSatish Balay        self.assertFalse(ksp.iterating)
80*5808f684SSatish Balay        reason = PETSc.KSP.ConvergedReason.CONVERGED_ITERATING
81*5808f684SSatish Balay        ksp.reason = reason
82*5808f684SSatish Balay        self.assertEqual(ksp.reason, reason)
83*5808f684SSatish Balay        self.assertFalse(ksp.converged)
84*5808f684SSatish Balay        self.assertFalse(ksp.diverged)
85*5808f684SSatish Balay        self.assertTrue(ksp.iterating)
86*5808f684SSatish Balay
87*5808f684SSatish Balay    def testGetSetPC(self):
88*5808f684SSatish Balay        oldpc = self.ksp.getPC()
89*5808f684SSatish Balay        self.assertEqual(oldpc.getRefCount(), 2)
90*5808f684SSatish Balay        newpc = PETSc.PC()
91*5808f684SSatish Balay        newpc.create(self.ksp.getComm())
92*5808f684SSatish Balay        self.assertEqual(newpc.getRefCount(), 1)
93*5808f684SSatish Balay        self.ksp.setPC(newpc)
94*5808f684SSatish Balay        self.assertEqual(newpc.getRefCount(), 2)
95*5808f684SSatish Balay        self.assertEqual(oldpc.getRefCount(), 1)
96*5808f684SSatish Balay        oldpc.destroy()
97*5808f684SSatish Balay        self.assertFalse(bool(oldpc))
98*5808f684SSatish Balay        pc = self.ksp.getPC()
99*5808f684SSatish Balay        self.assertTrue(bool(pc))
100*5808f684SSatish Balay        self.assertEqual(pc, newpc)
101*5808f684SSatish Balay        self.assertEqual(pc.getRefCount(), 3)
102*5808f684SSatish Balay        newpc.destroy()
103*5808f684SSatish Balay        self.assertFalse(bool(newpc))
104*5808f684SSatish Balay        self.assertEqual(pc.getRefCount(), 2)
105*5808f684SSatish Balay
106*5808f684SSatish Balay    def testSolve(self):
107*5808f684SSatish Balay        A = PETSc.Mat().create(PETSc.COMM_SELF)
108*5808f684SSatish Balay        A.setSizes([3,3])
109*5808f684SSatish Balay        A.setType(PETSc.Mat.Type.SEQAIJ)
110*5808f684SSatish Balay        A.setPreallocationNNZ(1)
111*5808f684SSatish Balay        for i in range(3):
112*5808f684SSatish Balay            A.setValue(i, i, 0.9/(i+1))
113*5808f684SSatish Balay        A.assemble()
114*5808f684SSatish Balay        A.shift(1)
115*5808f684SSatish Balay        x, b = A.createVecs()
116*5808f684SSatish Balay        b.set(10)
117*5808f684SSatish Balay        x.setRandom()
118*5808f684SSatish Balay        self.ksp.setOperators(A)
119*5808f684SSatish Balay        self.ksp.setConvergenceHistory()
120*5808f684SSatish Balay        self.ksp.solve(b, x)
121*5808f684SSatish Balay        r = b.duplicate()
122*5808f684SSatish Balay        u = x.duplicate()
123*5808f684SSatish Balay        self.ksp.buildSolution(u)
124*5808f684SSatish Balay        self.ksp.buildResidual(u)
125*5808f684SSatish Balay        rh = self.ksp.getConvergenceHistory()
126*5808f684SSatish Balay        self.ksp.setConvergenceHistory(0)
127*5808f684SSatish Balay        rh = self.ksp.getConvergenceHistory()
128*5808f684SSatish Balay        self.assertEqual(len(rh), 0)
129*5808f684SSatish Balay        del A, x, b
130*5808f684SSatish Balay
131*5808f684SSatish Balay    def testResetAndSolve(self):
132*5808f684SSatish Balay        self.ksp.reset()
133*5808f684SSatish Balay        self.testSolve()
134*5808f684SSatish Balay        self.ksp.reset()
135*5808f684SSatish Balay        self.testSolve()
136*5808f684SSatish Balay        self.ksp.reset()
137*5808f684SSatish Balay
138*5808f684SSatish Balay    def testSetMonitor(self):
139*5808f684SSatish Balay        reshist = {}
140*5808f684SSatish Balay        def monitor(ksp, its, rnorm):
141*5808f684SSatish Balay            reshist[its] = rnorm
142*5808f684SSatish Balay        refcnt = getrefcount(monitor)
143*5808f684SSatish Balay        self.ksp.setMonitor(monitor)
144*5808f684SSatish Balay        self.assertEqual(getrefcount(monitor), refcnt + 1)
145*5808f684SSatish Balay        ## self.testSolve()
146*5808f684SSatish Balay        reshist = {}
147*5808f684SSatish Balay        self.ksp.cancelMonitor()
148*5808f684SSatish Balay        self.assertEqual(getrefcount(monitor), refcnt)
149*5808f684SSatish Balay        self.testSolve()
150*5808f684SSatish Balay        self.assertEqual(len(reshist), 0)
151*5808f684SSatish Balay        ## Monitor = PETSc.KSP.Monitor
152*5808f684SSatish Balay        ## self.ksp.setMonitor(Monitor())
153*5808f684SSatish Balay        ## self.ksp.setMonitor(Monitor.DEFAULT)
154*5808f684SSatish Balay        ## self.ksp.setMonitor(Monitor.TRUE_RESIDUAL_NORM)
155*5808f684SSatish Balay        ## self.ksp.setMonitor(Monitor.SOLUTION)
156*5808f684SSatish Balay
157*5808f684SSatish Balay    def testSetConvergenceTest(self):
158*5808f684SSatish Balay        def converged(ksp, its, rnorm):
159*5808f684SSatish Balay            if its > 10: return True
160*5808f684SSatish Balay            return False
161*5808f684SSatish Balay        refcnt = getrefcount(converged)
162*5808f684SSatish Balay        self.ksp.setConvergenceTest(converged)
163*5808f684SSatish Balay        self.assertEqual(getrefcount(converged), refcnt + 1)
164*5808f684SSatish Balay        self.ksp.setConvergenceTest(None)
165*5808f684SSatish Balay        self.assertEqual(getrefcount(converged), refcnt)
166*5808f684SSatish Balay
167*5808f684SSatish Balay# --------------------------------------------------------------------
168*5808f684SSatish Balay
169*5808f684SSatish Balayclass TestKSPPREONLY(BaseTestKSP, unittest.TestCase):
170*5808f684SSatish Balay    KSP_TYPE = PETSc.KSP.Type.PREONLY
171*5808f684SSatish Balay    PC_TYPE = PETSc.PC.Type.LU
172*5808f684SSatish Balay
173*5808f684SSatish Balayclass TestKSPRICHARDSON(BaseTestKSP, unittest.TestCase):
174*5808f684SSatish Balay    KSP_TYPE = PETSc.KSP.Type.RICHARDSON
175*5808f684SSatish Balay
176*5808f684SSatish Balayclass TestKSPCHEBYCHEV(BaseTestKSP, unittest.TestCase):
177*5808f684SSatish Balay    try:
178*5808f684SSatish Balay        KSP_TYPE = PETSc.KSP.Type.CHEBYSHEV
179*5808f684SSatish Balay    except AttributeError:
180*5808f684SSatish Balay        KSP_TYPE = PETSc.KSP.Type.CHEBYCHEV
181*5808f684SSatish Balay
182*5808f684SSatish Balayclass TestKSPCG(BaseTestKSP, unittest.TestCase):
183*5808f684SSatish Balay    KSP_TYPE = PETSc.KSP.Type.CG
184*5808f684SSatish Balay
185*5808f684SSatish Balayclass TestKSPCGNE(BaseTestKSP, unittest.TestCase):
186*5808f684SSatish Balay    KSP_TYPE = PETSc.KSP.Type.CGNE
187*5808f684SSatish Balay
188*5808f684SSatish Balayclass TestKSPSTCG(BaseTestKSP, unittest.TestCase):
189*5808f684SSatish Balay    KSP_TYPE = PETSc.KSP.Type.STCG
190*5808f684SSatish Balay
191*5808f684SSatish Balayclass TestKSPBCGS(BaseTestKSP, unittest.TestCase):
192*5808f684SSatish Balay    KSP_TYPE = PETSc.KSP.Type.BCGS
193*5808f684SSatish Balay
194*5808f684SSatish Balayclass TestKSPBCGSL(BaseTestKSP, unittest.TestCase):
195*5808f684SSatish Balay    KSP_TYPE = PETSc.KSP.Type.BCGSL
196*5808f684SSatish Balay
197*5808f684SSatish Balayclass TestKSPCGS(BaseTestKSP, unittest.TestCase):
198*5808f684SSatish Balay    KSP_TYPE = PETSc.KSP.Type.CGS
199*5808f684SSatish Balay
200*5808f684SSatish Balayclass TestKSPQCG(BaseTestKSP, unittest.TestCase):
201*5808f684SSatish Balay    KSP_TYPE = PETSc.KSP.Type.QCG
202*5808f684SSatish Balay    PC_TYPE  = PETSc.PC.Type.JACOBI
203*5808f684SSatish Balay
204*5808f684SSatish Balayclass TestKSPBICG(BaseTestKSP, unittest.TestCase):
205*5808f684SSatish Balay    KSP_TYPE = PETSc.KSP.Type.BICG
206*5808f684SSatish Balay
207*5808f684SSatish Balayclass TestKSPGMRES(BaseTestKSP, unittest.TestCase):
208*5808f684SSatish Balay    KSP_TYPE = PETSc.KSP.Type.GMRES
209*5808f684SSatish Balay
210*5808f684SSatish Balayclass TestKSPFGMRES(BaseTestKSP, unittest.TestCase):
211*5808f684SSatish Balay    KSP_TYPE = PETSc.KSP.Type.FGMRES
212*5808f684SSatish Balay
213*5808f684SSatish Balay# --------------------------------------------------------------------
214*5808f684SSatish Balay
215*5808f684SSatish Balayif PETSc.ScalarType().dtype.char in 'FDG':
216*5808f684SSatish Balay    del TestKSPSTCG
217*5808f684SSatish Balay
218*5808f684SSatish Balay# --------------------------------------------------------------------
219*5808f684SSatish Balay
220*5808f684SSatish Balayif __name__ == '__main__':
221*5808f684SSatish Balay    unittest.main()
222