xref: /petsc/src/binding/petsc4py/test/test_snes.py (revision 3201ab8d70a3eea669f338f8bd746342de1cf5db)
15808f684SSatish Balay# --------------------------------------------------------------------
25808f684SSatish Balay
35808f684SSatish Balayfrom petsc4py import PETSc
45808f684SSatish Balayimport unittest
55808f684SSatish Balayfrom sys import getrefcount
69ae6e6bbSStefano Zampiniimport numpy as np
75808f684SSatish Balay
85808f684SSatish Balay# --------------------------------------------------------------------
95808f684SSatish Balay
106f336411SStefano Zampini
115808f684SSatish Balayclass Function:
125808f684SSatish Balay    def __call__(self, snes, x, f):
135808f684SSatish Balay        f[0] = (x[0] * x[0] + x[0] * x[1] - 3.0).item()
145808f684SSatish Balay        f[1] = (x[0] * x[1] + x[1] * x[1] - 6.0).item()
155808f684SSatish Balay        f.assemble()
165808f684SSatish Balay
176f336411SStefano Zampini
185808f684SSatish Balayclass Jacobian:
195808f684SSatish Balay    def __call__(self, snes, x, J, P):
205808f684SSatish Balay        P[0, 0] = (2.0 * x[0] + x[1]).item()
215808f684SSatish Balay        P[0, 1] = (x[0]).item()
225808f684SSatish Balay        P[1, 0] = (x[1]).item()
235808f684SSatish Balay        P[1, 1] = (x[0] + 2.0 * x[1]).item()
245808f684SSatish Balay        P.assemble()
256f336411SStefano Zampini        if J != P:
266f336411SStefano Zampini            J.assemble()
276f336411SStefano Zampini
285808f684SSatish Balay
299ae6e6bbSStefano Zampini
305808f684SSatish Balay# --------------------------------------------------------------------
315808f684SSatish Balay
325808f684SSatish Balay
336f336411SStefano Zampiniclass BaseTestSNES:
345808f684SSatish Balay    SNES_TYPE = None
355808f684SSatish Balay
365808f684SSatish Balay    def setUp(self):
375808f684SSatish Balay        snes = PETSc.SNES()
385808f684SSatish Balay        snes.create(PETSc.COMM_SELF)
395808f684SSatish Balay        if self.SNES_TYPE:
405808f684SSatish Balay            snes.setType(self.SNES_TYPE)
415808f684SSatish Balay        self.snes = snes
425808f684SSatish Balay
435808f684SSatish Balay    def tearDown(self):
445808f684SSatish Balay        self.snes = None
4562e5d2d2SJDBetteridge        PETSc.garbage_cleanup()
465808f684SSatish Balay
475808f684SSatish Balay    def testGetSetType(self):
485808f684SSatish Balay        self.assertEqual(self.snes.getType(), self.SNES_TYPE)
495808f684SSatish Balay        self.snes.setType(self.SNES_TYPE)
505808f684SSatish Balay        self.assertEqual(self.snes.getType(), self.SNES_TYPE)
515808f684SSatish Balay
525808f684SSatish Balay    def testTols(self):
535808f684SSatish Balay        tols = self.snes.getTolerances()
545808f684SSatish Balay        self.snes.setTolerances(*tols)
555808f684SSatish Balay        tnames = ('rtol', 'atol', 'stol', 'max_it')
565808f684SSatish Balay        tolvals = [getattr(self.snes, t) for t in tnames]
575808f684SSatish Balay        self.assertEqual(tuple(tols), tuple(tolvals))
58e5cd489fSStefano Zampini        dtol = self.snes.getDivergenceTolerance()
59e5cd489fSStefano Zampini        self.assertTrue(dtol > 0)
6077e5a1f9SBarry Smith        self.snes.setDivergenceTolerance(PETSc.UNLIMITED)
61e5cd489fSStefano Zampini        dtol = self.snes.getDivergenceTolerance()
6277e5a1f9SBarry Smith        self.assertEqual(dtol, PETSc.UNLIMITED)
6377e5a1f9SBarry Smith        self.snes.setDivergenceTolerance(PETSc.CURRENT)
6477e5a1f9SBarry Smith        self.assertEqual(dtol, PETSc.UNLIMITED)
655808f684SSatish Balay
665808f684SSatish Balay    def testProperties(self):
675808f684SSatish Balay        snes = self.snes
685808f684SSatish Balay        #
695808f684SSatish Balay        snes.appctx = (1, 2, 3)
705808f684SSatish Balay        self.assertEqual(snes.appctx, (1, 2, 3))
715808f684SSatish Balay        snes.appctx = None
725808f684SSatish Balay        self.assertEqual(snes.appctx, None)
735808f684SSatish Balay        #
745808f684SSatish Balay        snes.its = 1
755808f684SSatish Balay        self.assertEqual(snes.its, 1)
765808f684SSatish Balay        snes.its = 0
775808f684SSatish Balay        self.assertEqual(snes.its, 0)
785808f684SSatish Balay        #
795808f684SSatish Balay        snes.norm = 1
805808f684SSatish Balay        self.assertEqual(snes.norm, 1)
815808f684SSatish Balay        snes.norm = 0
825808f684SSatish Balay        self.assertEqual(snes.norm, 0)
835808f684SSatish Balay        #
845808f684SSatish Balay        rh, ih = snes.history
855808f684SSatish Balay        self.assertTrue(len(rh) == 0)
865808f684SSatish Balay        self.assertTrue(len(ih) == 0)
875808f684SSatish Balay        #
885808f684SSatish Balay        reason = PETSc.SNES.ConvergedReason.CONVERGED_ITS
895808f684SSatish Balay        snes.reason = reason
905808f684SSatish Balay        self.assertEqual(snes.reason, reason)
91c78242eeSStefano Zampini        self.assertTrue(snes.is_converged)
92c78242eeSStefano Zampini        self.assertFalse(snes.is_diverged)
93c78242eeSStefano Zampini        self.assertFalse(snes.is_iterating)
945808f684SSatish Balay        reason = PETSc.SNES.ConvergedReason.DIVERGED_MAX_IT
955808f684SSatish Balay        snes.reason = reason
965808f684SSatish Balay        self.assertEqual(snes.reason, reason)
97c78242eeSStefano Zampini        self.assertFalse(snes.is_converged)
98c78242eeSStefano Zampini        self.assertTrue(snes.is_diverged)
99c78242eeSStefano Zampini        self.assertFalse(snes.is_iterating)
1005808f684SSatish Balay        reason = PETSc.SNES.ConvergedReason.CONVERGED_ITERATING
1015808f684SSatish Balay        snes.reason = reason
1025808f684SSatish Balay        self.assertEqual(snes.reason, reason)
103c78242eeSStefano Zampini        self.assertFalse(snes.is_converged)
104c78242eeSStefano Zampini        self.assertFalse(snes.is_diverged)
105c78242eeSStefano Zampini        self.assertTrue(snes.is_iterating)
1065808f684SSatish Balay        #
1075808f684SSatish Balay        self.assertFalse(snes.use_ew)
1085808f684SSatish Balay        self.assertFalse(snes.use_mf)
1095808f684SSatish Balay        self.assertFalse(snes.use_fd)
110cfba373dSStefano Zampini        ouse = snes.use_ksp
111cfba373dSStefano Zampini        self.assertEqual(ouse, snes.getUseKSP())
112cfba373dSStefano Zampini        snes.use_ksp = not ouse
113cfba373dSStefano Zampini        self.assertEqual(not ouse, snes.getUseKSP())
114cfba373dSStefano Zampini        snes.setUseKSP(ouse)
115cfba373dSStefano Zampini        self.assertEqual(ouse, snes.use_ksp)
1165808f684SSatish Balay
1175808f684SSatish Balay    def testGetSetFunc(self):
1185808f684SSatish Balay        r, func = self.snes.getFunction()
1195808f684SSatish Balay        self.assertFalse(r)
1205808f684SSatish Balay        self.assertTrue(func is None)
1215808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
1225808f684SSatish Balay        func = Function()
1235808f684SSatish Balay        refcnt = getrefcount(func)
1245808f684SSatish Balay        self.snes.setFunction(func, r)
1255808f684SSatish Balay        self.snes.setFunction(func, r)
1265808f684SSatish Balay        self.assertEqual(getrefcount(func), refcnt + 1)
1275808f684SSatish Balay        r2, func2 = self.snes.getFunction()
1285808f684SSatish Balay        self.assertEqual(r, r2)
1295808f684SSatish Balay        self.assertEqual(func, func2[0])
1305808f684SSatish Balay        self.assertEqual(getrefcount(func), refcnt + 1)
1315808f684SSatish Balay        r3, func3 = self.snes.getFunction()
1325808f684SSatish Balay        self.assertEqual(r, r3)
1335808f684SSatish Balay        self.assertEqual(func, func3[0])
1345808f684SSatish Balay        self.assertEqual(getrefcount(func), refcnt + 1)
1355808f684SSatish Balay
1365808f684SSatish Balay    def testCompFunc(self):
1375808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
1385808f684SSatish Balay        func = Function()
1395808f684SSatish Balay        self.snes.setFunction(func, r)
1405808f684SSatish Balay        x, y = r.duplicate(), r.duplicate()
1415808f684SSatish Balay        x[0], x[1] = [1, 2]
1425808f684SSatish Balay        self.snes.computeFunction(x, y)
143e0aaf7daSStefano Zampini        self.assertAlmostEqual(abs(y[0]), 0.0, places=5)
144e0aaf7daSStefano Zampini        self.assertAlmostEqual(abs(y[1]), 0.0, places=5)
1455808f684SSatish Balay
1465808f684SSatish Balay    def testGetSetJac(self):
1475808f684SSatish Balay        A, P, jac = self.snes.getJacobian()
1485808f684SSatish Balay        self.assertFalse(A)
1495808f684SSatish Balay        self.assertFalse(P)
1505808f684SSatish Balay        self.assertTrue(jac is None)
1515808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
1525808f684SSatish Balay        J.setSizes([2, 2])
1535808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
1545808f684SSatish Balay        J.setUp()
1555808f684SSatish Balay        jac = Jacobian()
1565808f684SSatish Balay        refcnt = getrefcount(jac)
1575808f684SSatish Balay        self.snes.setJacobian(jac, J)
1585808f684SSatish Balay        self.snes.setJacobian(jac, J)
1595808f684SSatish Balay        self.assertEqual(getrefcount(jac), refcnt + 1)
1605808f684SSatish Balay        J2, P2, jac2 = self.snes.getJacobian()
1615808f684SSatish Balay        self.assertEqual(J, J2)
1625808f684SSatish Balay        self.assertEqual(J2, P2)
1635808f684SSatish Balay        self.assertEqual(jac, jac2[0])
1645808f684SSatish Balay        self.assertEqual(getrefcount(jac), refcnt + 1)
1655808f684SSatish Balay        J3, P3, jac3 = self.snes.getJacobian()
1665808f684SSatish Balay        self.assertEqual(J, J3)
1675808f684SSatish Balay        self.assertEqual(J3, P3)
1685808f684SSatish Balay        self.assertEqual(jac, jac3[0])
1695808f684SSatish Balay        self.assertEqual(getrefcount(jac), refcnt + 1)
1705808f684SSatish Balay
1715808f684SSatish Balay    def testCompJac(self):
1725808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
1735808f684SSatish Balay        J.setSizes([2, 2])
1745808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
1755808f684SSatish Balay        J.setUp()
1765808f684SSatish Balay        jac = Jacobian()
1775808f684SSatish Balay        self.snes.setJacobian(jac, J)
1785808f684SSatish Balay        x = PETSc.Vec().createSeq(2)
1795808f684SSatish Balay        x[0], x[1] = [1, 2]
1805808f684SSatish Balay        self.snes.getKSP().getPC()
1815808f684SSatish Balay        self.snes.computeJacobian(x, J)
1825808f684SSatish Balay
1835808f684SSatish Balay    def testGetSetUpd(self):
1845808f684SSatish Balay        self.assertTrue(self.snes.getUpdate() is None)
1855808f684SSatish Balay        upd = lambda snes, it: None
1865808f684SSatish Balay        refcnt = getrefcount(upd)
1875808f684SSatish Balay        self.snes.setUpdate(upd)
1885808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt + 1)
1895808f684SSatish Balay        self.snes.setUpdate(upd)
1905808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt + 1)
1915808f684SSatish Balay        self.snes.setUpdate(None)
1925808f684SSatish Balay        self.assertTrue(self.snes.getUpdate() is None)
1935808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt)
1945808f684SSatish Balay        self.snes.setUpdate(upd)
1955808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt + 1)
1965808f684SSatish Balay        upd2 = lambda snes, it: None
1975808f684SSatish Balay        refcnt2 = getrefcount(upd2)
1985808f684SSatish Balay        self.snes.setUpdate(upd2)
1995808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt)
2005808f684SSatish Balay        self.assertEqual(getrefcount(upd2), refcnt2 + 1)
2015808f684SSatish Balay        tmp = self.snes.getUpdate()[0]
2025808f684SSatish Balay        self.assertTrue(tmp is upd2)
2035808f684SSatish Balay        self.assertEqual(getrefcount(upd2), refcnt2 + 2)
2045808f684SSatish Balay        del tmp
2055808f684SSatish Balay        self.snes.setUpdate(None)
2065808f684SSatish Balay        self.assertTrue(self.snes.getUpdate() is None)
2075808f684SSatish Balay        self.assertEqual(getrefcount(upd2), refcnt2)
2085808f684SSatish Balay
2095808f684SSatish Balay    def testGetKSP(self):
2105808f684SSatish Balay        ksp = self.snes.getKSP()
2115808f684SSatish Balay        self.assertEqual(ksp.getRefCount(), 2)
2125808f684SSatish Balay
2135808f684SSatish Balay    def testSolve(self):
2145808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
2155808f684SSatish Balay        J.setSizes([2, 2])
2165808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
2175808f684SSatish Balay        J.setUp()
2185808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
2195808f684SSatish Balay        x = PETSc.Vec().createSeq(2)
2205808f684SSatish Balay        b = PETSc.Vec().createSeq(2)
2215808f684SSatish Balay        self.snes.setFunction(Function(), r)
2225808f684SSatish Balay        self.snes.setJacobian(Jacobian(), J)
2239ae6e6bbSStefano Zampini
2249ae6e6bbSStefano Zampini        def _update(snes, it, cnt):
2259ae6e6bbSStefano Zampini             cnt += 1
2269ae6e6bbSStefano Zampini        cnt_up = np.array(0)
2279ae6e6bbSStefano Zampini        self.snes.setUpdate(_update, (cnt_up,) )
2289ae6e6bbSStefano Zampini
2295808f684SSatish Balay        x.setArray([2, 3])
2305808f684SSatish Balay        b.set(0)
2315808f684SSatish Balay        self.snes.setConvergenceHistory()
2325808f684SSatish Balay        self.snes.setFromOptions()
2335808f684SSatish Balay        self.snes.solve(b, x)
2349ae6e6bbSStefano Zampini        self.snes.setUpdate(None)
2355808f684SSatish Balay        rh, ih = self.snes.getConvergenceHistory()
2365808f684SSatish Balay        self.snes.setConvergenceHistory(0, reset=True)
2375808f684SSatish Balay        rh, ih = self.snes.getConvergenceHistory()
2385808f684SSatish Balay        self.assertEqual(len(rh), 0)
2395808f684SSatish Balay        self.assertEqual(len(ih), 0)
240e0aaf7daSStefano Zampini        self.assertAlmostEqual(abs(x[0]), 1.0, places=5)
241e0aaf7daSStefano Zampini        self.assertAlmostEqual(abs(x[1]), 2.0, places=5)
2429ae6e6bbSStefano Zampini        self.assertEqual(self.snes.getIterationNumber(), cnt_up)
2435808f684SSatish Balay        # XXX this test should not be here !
2445808f684SSatish Balay        reason = self.snes.callConvergenceTest(1, 0, 0, 0)
2455808f684SSatish Balay        self.assertTrue(reason > 0)
2465808f684SSatish Balay
24741e867a5SStefano Zampini        # test interface
24841e867a5SStefano Zampini        x = self.snes.getSolution()
24941e867a5SStefano Zampini        x.setArray([2, 3])
25041e867a5SStefano Zampini        self.snes.solve()
25141e867a5SStefano Zampini        self.assertAlmostEqual(abs(x[0]), 1.0, places=5)
25241e867a5SStefano Zampini        self.assertAlmostEqual(abs(x[1]), 2.0, places=5)
25341e867a5SStefano Zampini
2545808f684SSatish Balay    def testResetAndSolve(self):
2555808f684SSatish Balay        self.snes.reset()
2565808f684SSatish Balay        self.testSolve()
2575808f684SSatish Balay        self.snes.reset()
2585808f684SSatish Balay        self.testSolve()
2595808f684SSatish Balay        self.snes.reset()
2605808f684SSatish Balay
2615808f684SSatish Balay    def testSetMonitor(self):
2625808f684SSatish Balay        reshist = {}
2636f336411SStefano Zampini
2645808f684SSatish Balay        def monitor(snes, its, fgnorm):
2655808f684SSatish Balay            reshist[its] = fgnorm
2666f336411SStefano Zampini
2675808f684SSatish Balay        refcnt = getrefcount(monitor)
2685808f684SSatish Balay        self.snes.setMonitor(monitor)
2695808f684SSatish Balay        self.assertEqual(getrefcount(monitor), refcnt + 1)
2705808f684SSatish Balay        self.testSolve()
2715808f684SSatish Balay        self.assertTrue(len(reshist) > 0)
2725808f684SSatish Balay        reshist = {}
2731dbd64e7SPierre Jolivet        self.snes.monitorCancel()
2745808f684SSatish Balay        self.assertEqual(getrefcount(monitor), refcnt)
2755808f684SSatish Balay        self.testSolve()
2765808f684SSatish Balay        self.assertTrue(len(reshist) == 0)
2775808f684SSatish Balay        self.snes.setMonitor(monitor)
2785808f684SSatish Balay        self.snes.monitor(1, 7)
2795808f684SSatish Balay        self.assertTrue(reshist[1] == 7)
2805808f684SSatish Balay        ## Monitor = PETSc.SNES.Monitor
2815808f684SSatish Balay        ## self.snes.setMonitor(Monitor())
2825808f684SSatish Balay        ## self.snes.setMonitor(Monitor.DEFAULT)
2835808f684SSatish Balay        ## self.snes.setMonitor(Monitor.SOLUTION)
2845808f684SSatish Balay        ## self.snes.setMonitor(Monitor.RESIDUAL)
2855808f684SSatish Balay        ## self.snes.setMonitor(Monitor.SOLUTION_UPDATE)
2865808f684SSatish Balay
2875808f684SSatish Balay    def testSetGetStepFails(self):
2885808f684SSatish Balay        its = self.snes.getIterationNumber()
2895808f684SSatish Balay        self.assertEqual(its, 0)
2905808f684SSatish Balay        fails = self.snes.getNonlinearStepFailures()
2915808f684SSatish Balay        self.assertEqual(fails, 0)
2925808f684SSatish Balay        fails = self.snes.getMaxNonlinearStepFailures()
2935808f684SSatish Balay        self.assertEqual(fails, 1)
2945808f684SSatish Balay        self.snes.setMaxNonlinearStepFailures(5)
2955808f684SSatish Balay        fails = self.snes.getMaxNonlinearStepFailures()
2965808f684SSatish Balay        self.assertEqual(fails, 5)
2975808f684SSatish Balay        self.snes.setMaxNonlinearStepFailures(1)
2985808f684SSatish Balay        fails = self.snes.getMaxNonlinearStepFailures()
2995808f684SSatish Balay        self.assertEqual(fails, 1)
3005808f684SSatish Balay
3015808f684SSatish Balay    def testSetGetLinFails(self):
3025808f684SSatish Balay        its = self.snes.getLinearSolveIterations()
3035808f684SSatish Balay        self.assertEqual(its, 0)
3045808f684SSatish Balay        fails = self.snes.getLinearSolveFailures()
3055808f684SSatish Balay        self.assertEqual(fails, 0)
3065808f684SSatish Balay        fails = self.snes.getMaxLinearSolveFailures()
3075808f684SSatish Balay        self.assertEqual(fails, 1)
3085808f684SSatish Balay        self.snes.setMaxLinearSolveFailures(5)
3095808f684SSatish Balay        fails = self.snes.getMaxLinearSolveFailures()
3105808f684SSatish Balay        self.assertEqual(fails, 5)
3115808f684SSatish Balay        self.snes.setMaxLinearSolveFailures(1)
3125808f684SSatish Balay        fails = self.snes.getMaxLinearSolveFailures()
3135808f684SSatish Balay        self.assertEqual(fails, 1)
3145808f684SSatish Balay
3155808f684SSatish Balay    def testEW(self):
3165808f684SSatish Balay        self.snes.setUseEW(False)
3175808f684SSatish Balay        self.assertFalse(self.snes.getUseEW())
3185808f684SSatish Balay        self.snes.setUseEW(True)
3195808f684SSatish Balay        self.assertTrue(self.snes.getUseEW())
3205808f684SSatish Balay        params = self.snes.getParamsEW()
3215808f684SSatish Balay        params['version'] = 1
3225808f684SSatish Balay        self.snes.setParamsEW(**params)
3235808f684SSatish Balay        params = self.snes.getParamsEW()
3245808f684SSatish Balay        self.assertEqual(params['version'], 1)
325*3201ab8dSStefano Zampini        params['version'] = PETSc.CURRENT
3265808f684SSatish Balay        self.snes.setParamsEW(**params)
3275808f684SSatish Balay        params = self.snes.getParamsEW()
3285808f684SSatish Balay        self.assertEqual(params['version'], 1)
3295808f684SSatish Balay
3305808f684SSatish Balay    def testMF(self):
3315808f684SSatish Balay        # self.snes.setOptionsPrefix('MF-')
3325808f684SSatish Balay        # opts = PETSc.Options(self.snes)
3335808f684SSatish Balay        # opts['mat_mffd_type'] = 'ds'
3345808f684SSatish Balay        # opts['snes_monitor']  = 'stdout'
3355808f684SSatish Balay        # opts['ksp_monitor']   = 'stdout'
3365808f684SSatish Balay        # opts['snes_view']     = 'stdout'
3375808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
3385808f684SSatish Balay        J.setSizes([2, 2])
3395808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
3405808f684SSatish Balay        J.setUp()
3415808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
3425808f684SSatish Balay        x = PETSc.Vec().createSeq(2)
3435808f684SSatish Balay        b = PETSc.Vec().createSeq(2)
3445808f684SSatish Balay        fun = Function()
3455808f684SSatish Balay        jac = Jacobian()
3465808f684SSatish Balay        self.snes.setFunction(fun, r)
3475808f684SSatish Balay        self.snes.setJacobian(jac, J)
3485808f684SSatish Balay        self.assertFalse(self.snes.getUseMF())
3495808f684SSatish Balay        self.snes.setUseMF(False)
3505808f684SSatish Balay        self.assertFalse(self.snes.getUseMF())
3515808f684SSatish Balay        self.snes.setUseMF(True)
3525808f684SSatish Balay        self.assertTrue(self.snes.getUseMF())
3535808f684SSatish Balay        self.snes.setFromOptions()
3544a221d59SStefano Zampini        if self.snes.getType() != PETSc.SNES.Type.NEWTONTR:
3555808f684SSatish Balay            x.setArray([2, 3])
3565808f684SSatish Balay            b.set(0)
3575808f684SSatish Balay            self.snes.solve(b, x)
358e0aaf7daSStefano Zampini            self.assertAlmostEqual(abs(x[0]), 1.0, places=5)
359e0aaf7daSStefano Zampini            self.assertAlmostEqual(abs(x[1]), 2.0, places=5)
3605808f684SSatish Balay
3615808f684SSatish Balay    def testFDColor(self):
3625808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
3635808f684SSatish Balay        J.setSizes([2, 2])
3645808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
3655808f684SSatish Balay        J.setUp()
3665808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
3675808f684SSatish Balay        x = PETSc.Vec().createSeq(2)
3685808f684SSatish Balay        b = PETSc.Vec().createSeq(2)
3695808f684SSatish Balay        fun = Function()
3705808f684SSatish Balay        jac = Jacobian()
3715808f684SSatish Balay        self.snes.setFunction(fun, r)
3725808f684SSatish Balay        self.snes.setJacobian(jac, J)
3735808f684SSatish Balay        self.assertFalse(self.snes.getUseFD())
3745808f684SSatish Balay        jac(self.snes, x, J, J)
3755808f684SSatish Balay        self.snes.setUseFD(False)
3765808f684SSatish Balay        self.assertFalse(self.snes.getUseFD())
3775808f684SSatish Balay        self.snes.setUseFD(True)
3785808f684SSatish Balay        self.assertTrue(self.snes.getUseFD())
3795808f684SSatish Balay        self.snes.setFromOptions()
3805808f684SSatish Balay        x.setArray([2, 3])
3815808f684SSatish Balay        b.set(0)
3825808f684SSatish Balay        self.snes.solve(b, x)
3834a221d59SStefano Zampini        self.assertAlmostEqual(abs(x[0]), 1.0, places=4)
3844a221d59SStefano Zampini        self.assertAlmostEqual(abs(x[1]), 2.0, places=4)
3855808f684SSatish Balay
3869be84c52SStefano Zampini    def testNPC(self):
3879be84c52SStefano Zampini        self.snes.appctx = (1, 2, 3)
3889be84c52SStefano Zampini        npc = self.snes.getNPC()
3899be84c52SStefano Zampini        self.assertEqual(npc.appctx, (1, 2, 3))
3909be84c52SStefano Zampini
391*3201ab8dSStefano Zampini    def testTRAPI(self):
392*3201ab8dSStefano Zampini        newreg = (1,2,3)
393*3201ab8dSStefano Zampini        newup = (1,2,3,4,5)
394*3201ab8dSStefano Zampini        if self.snes.getType() == PETSc.SNES.Type.NEWTONTR:
395*3201ab8dSStefano Zampini            defreg = self.snes.getTRTolerances()
396*3201ab8dSStefano Zampini            defup = self.snes.getTRUpdateParameters()
397*3201ab8dSStefano Zampini        self.snes.setTRTolerances(*newreg)
398*3201ab8dSStefano Zampini        self.snes.setTRUpdateParameters(*newup)
399*3201ab8dSStefano Zampini        if self.snes.getType() == PETSc.SNES.Type.NEWTONTR:
400*3201ab8dSStefano Zampini            self.assertEqual(newreg, self.snes.getTRTolerances())
401*3201ab8dSStefano Zampini            self.assertEqual(newup, self.snes.getTRUpdateParameters())
402*3201ab8dSStefano Zampini        self.snes.setTRTolerances()
403*3201ab8dSStefano Zampini        self.snes.setTRUpdateParameters()
404*3201ab8dSStefano Zampini        if self.snes.getType() == PETSc.SNES.Type.NEWTONTR:
405*3201ab8dSStefano Zampini            self.assertEqual(newreg, self.snes.getTRTolerances())
406*3201ab8dSStefano Zampini            self.assertEqual(newup, self.snes.getTRUpdateParameters())
407*3201ab8dSStefano Zampini        self.snes.setTRTolerances(*(PETSc.DETERMINE,)*3)
408*3201ab8dSStefano Zampini        self.snes.setTRUpdateParameters(*(PETSc.DETERMINE,)*5)
409*3201ab8dSStefano Zampini        if self.snes.getType() == PETSc.SNES.Type.NEWTONTR:
410*3201ab8dSStefano Zampini            self.assertEqual(defreg, self.snes.getTRTolerances())
411*3201ab8dSStefano Zampini            self.assertEqual(defup, self.snes.getTRUpdateParameters())
4126f336411SStefano Zampini
4135808f684SSatish Balay# --------------------------------------------------------------------
4145808f684SSatish Balay
4156f336411SStefano Zampini
4165808f684SSatish Balayclass TestSNESLS(BaseTestSNES, unittest.TestCase):
4175808f684SSatish Balay    SNES_TYPE = PETSc.SNES.Type.NEWTONLS
4185808f684SSatish Balay
4196f336411SStefano Zampini
4205808f684SSatish Balayclass TestSNESTR(BaseTestSNES, unittest.TestCase):
4215808f684SSatish Balay    SNES_TYPE = PETSc.SNES.Type.NEWTONTR
4225808f684SSatish Balay
4236f336411SStefano Zampini
4245808f684SSatish Balay# --------------------------------------------------------------------
4255808f684SSatish Balay
4265808f684SSatish Balayif __name__ == '__main__':
4275808f684SSatish Balay    unittest.main()
428