xref: /petsc/src/binding/petsc4py/test/test_snes.py (revision 9ae6e6bb1d890a1b8de296f3d5f20c0ab644dece)
15808f684SSatish Balay# --------------------------------------------------------------------
25808f684SSatish Balay
35808f684SSatish Balayfrom petsc4py import PETSc
45808f684SSatish Balayimport unittest
55808f684SSatish Balayfrom sys import getrefcount
6*9ae6e6bbSStefano 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
29*9ae6e6bbSStefano 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))
585808f684SSatish Balay
595808f684SSatish Balay    def testProperties(self):
605808f684SSatish Balay        snes = self.snes
615808f684SSatish Balay        #
625808f684SSatish Balay        snes.appctx = (1, 2, 3)
635808f684SSatish Balay        self.assertEqual(snes.appctx, (1, 2, 3))
645808f684SSatish Balay        snes.appctx = None
655808f684SSatish Balay        self.assertEqual(snes.appctx, None)
665808f684SSatish Balay        #
675808f684SSatish Balay        snes.its = 1
685808f684SSatish Balay        self.assertEqual(snes.its, 1)
695808f684SSatish Balay        snes.its = 0
705808f684SSatish Balay        self.assertEqual(snes.its, 0)
715808f684SSatish Balay        #
725808f684SSatish Balay        snes.norm = 1
735808f684SSatish Balay        self.assertEqual(snes.norm, 1)
745808f684SSatish Balay        snes.norm = 0
755808f684SSatish Balay        self.assertEqual(snes.norm, 0)
765808f684SSatish Balay        #
775808f684SSatish Balay        rh, ih = snes.history
785808f684SSatish Balay        self.assertTrue(len(rh) == 0)
795808f684SSatish Balay        self.assertTrue(len(ih) == 0)
805808f684SSatish Balay        #
815808f684SSatish Balay        reason = PETSc.SNES.ConvergedReason.CONVERGED_ITS
825808f684SSatish Balay        snes.reason = reason
835808f684SSatish Balay        self.assertEqual(snes.reason, reason)
84c78242eeSStefano Zampini        self.assertTrue(snes.is_converged)
85c78242eeSStefano Zampini        self.assertFalse(snes.is_diverged)
86c78242eeSStefano Zampini        self.assertFalse(snes.is_iterating)
875808f684SSatish Balay        reason = PETSc.SNES.ConvergedReason.DIVERGED_MAX_IT
885808f684SSatish Balay        snes.reason = reason
895808f684SSatish Balay        self.assertEqual(snes.reason, reason)
90c78242eeSStefano Zampini        self.assertFalse(snes.is_converged)
91c78242eeSStefano Zampini        self.assertTrue(snes.is_diverged)
92c78242eeSStefano Zampini        self.assertFalse(snes.is_iterating)
935808f684SSatish Balay        reason = PETSc.SNES.ConvergedReason.CONVERGED_ITERATING
945808f684SSatish Balay        snes.reason = reason
955808f684SSatish Balay        self.assertEqual(snes.reason, reason)
96c78242eeSStefano Zampini        self.assertFalse(snes.is_converged)
97c78242eeSStefano Zampini        self.assertFalse(snes.is_diverged)
98c78242eeSStefano Zampini        self.assertTrue(snes.is_iterating)
995808f684SSatish Balay        #
1005808f684SSatish Balay        self.assertFalse(snes.use_ew)
1015808f684SSatish Balay        self.assertFalse(snes.use_mf)
1025808f684SSatish Balay        self.assertFalse(snes.use_fd)
1035808f684SSatish Balay
1045808f684SSatish Balay    def testGetSetFunc(self):
1055808f684SSatish Balay        r, func = self.snes.getFunction()
1065808f684SSatish Balay        self.assertFalse(r)
1075808f684SSatish Balay        self.assertTrue(func is None)
1085808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
1095808f684SSatish Balay        func = Function()
1105808f684SSatish Balay        refcnt = getrefcount(func)
1115808f684SSatish Balay        self.snes.setFunction(func, r)
1125808f684SSatish Balay        self.snes.setFunction(func, r)
1135808f684SSatish Balay        self.assertEqual(getrefcount(func), refcnt + 1)
1145808f684SSatish Balay        r2, func2 = self.snes.getFunction()
1155808f684SSatish Balay        self.assertEqual(r, r2)
1165808f684SSatish Balay        self.assertEqual(func, func2[0])
1175808f684SSatish Balay        self.assertEqual(getrefcount(func), refcnt + 1)
1185808f684SSatish Balay        r3, func3 = self.snes.getFunction()
1195808f684SSatish Balay        self.assertEqual(r, r3)
1205808f684SSatish Balay        self.assertEqual(func, func3[0])
1215808f684SSatish Balay        self.assertEqual(getrefcount(func), refcnt + 1)
1225808f684SSatish Balay
1235808f684SSatish Balay    def testCompFunc(self):
1245808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
1255808f684SSatish Balay        func = Function()
1265808f684SSatish Balay        self.snes.setFunction(func, r)
1275808f684SSatish Balay        x, y = r.duplicate(), r.duplicate()
1285808f684SSatish Balay        x[0], x[1] = [1, 2]
1295808f684SSatish Balay        self.snes.computeFunction(x, y)
130e0aaf7daSStefano Zampini        self.assertAlmostEqual(abs(y[0]), 0.0, places=5)
131e0aaf7daSStefano Zampini        self.assertAlmostEqual(abs(y[1]), 0.0, places=5)
1325808f684SSatish Balay
1335808f684SSatish Balay    def testGetSetJac(self):
1345808f684SSatish Balay        A, P, jac = self.snes.getJacobian()
1355808f684SSatish Balay        self.assertFalse(A)
1365808f684SSatish Balay        self.assertFalse(P)
1375808f684SSatish Balay        self.assertTrue(jac is None)
1385808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
1395808f684SSatish Balay        J.setSizes([2, 2])
1405808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
1415808f684SSatish Balay        J.setUp()
1425808f684SSatish Balay        jac = Jacobian()
1435808f684SSatish Balay        refcnt = getrefcount(jac)
1445808f684SSatish Balay        self.snes.setJacobian(jac, J)
1455808f684SSatish Balay        self.snes.setJacobian(jac, J)
1465808f684SSatish Balay        self.assertEqual(getrefcount(jac), refcnt + 1)
1475808f684SSatish Balay        J2, P2, jac2 = self.snes.getJacobian()
1485808f684SSatish Balay        self.assertEqual(J, J2)
1495808f684SSatish Balay        self.assertEqual(J2, P2)
1505808f684SSatish Balay        self.assertEqual(jac, jac2[0])
1515808f684SSatish Balay        self.assertEqual(getrefcount(jac), refcnt + 1)
1525808f684SSatish Balay        J3, P3, jac3 = self.snes.getJacobian()
1535808f684SSatish Balay        self.assertEqual(J, J3)
1545808f684SSatish Balay        self.assertEqual(J3, P3)
1555808f684SSatish Balay        self.assertEqual(jac, jac3[0])
1565808f684SSatish Balay        self.assertEqual(getrefcount(jac), refcnt + 1)
1575808f684SSatish Balay
1585808f684SSatish Balay    def testCompJac(self):
1595808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
1605808f684SSatish Balay        J.setSizes([2, 2])
1615808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
1625808f684SSatish Balay        J.setUp()
1635808f684SSatish Balay        jac = Jacobian()
1645808f684SSatish Balay        self.snes.setJacobian(jac, J)
1655808f684SSatish Balay        x = PETSc.Vec().createSeq(2)
1665808f684SSatish Balay        x[0], x[1] = [1, 2]
1675808f684SSatish Balay        self.snes.getKSP().getPC()
1685808f684SSatish Balay        self.snes.computeJacobian(x, J)
1695808f684SSatish Balay
1705808f684SSatish Balay    def testGetSetUpd(self):
1715808f684SSatish Balay        self.assertTrue(self.snes.getUpdate() is None)
1725808f684SSatish Balay        upd = lambda snes, it: None
1735808f684SSatish Balay        refcnt = getrefcount(upd)
1745808f684SSatish Balay        self.snes.setUpdate(upd)
1755808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt + 1)
1765808f684SSatish Balay        self.snes.setUpdate(upd)
1775808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt + 1)
1785808f684SSatish Balay        self.snes.setUpdate(None)
1795808f684SSatish Balay        self.assertTrue(self.snes.getUpdate() is None)
1805808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt)
1815808f684SSatish Balay        self.snes.setUpdate(upd)
1825808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt + 1)
1835808f684SSatish Balay        upd2 = lambda snes, it: None
1845808f684SSatish Balay        refcnt2 = getrefcount(upd2)
1855808f684SSatish Balay        self.snes.setUpdate(upd2)
1865808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt)
1875808f684SSatish Balay        self.assertEqual(getrefcount(upd2), refcnt2 + 1)
1885808f684SSatish Balay        tmp = self.snes.getUpdate()[0]
1895808f684SSatish Balay        self.assertTrue(tmp is upd2)
1905808f684SSatish Balay        self.assertEqual(getrefcount(upd2), refcnt2 + 2)
1915808f684SSatish Balay        del tmp
1925808f684SSatish Balay        self.snes.setUpdate(None)
1935808f684SSatish Balay        self.assertTrue(self.snes.getUpdate() is None)
1945808f684SSatish Balay        self.assertEqual(getrefcount(upd2), refcnt2)
1955808f684SSatish Balay
1965808f684SSatish Balay    def testGetKSP(self):
1975808f684SSatish Balay        ksp = self.snes.getKSP()
1985808f684SSatish Balay        self.assertEqual(ksp.getRefCount(), 2)
1995808f684SSatish Balay
2005808f684SSatish Balay    def testSolve(self):
2015808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
2025808f684SSatish Balay        J.setSizes([2, 2])
2035808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
2045808f684SSatish Balay        J.setUp()
2055808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
2065808f684SSatish Balay        x = PETSc.Vec().createSeq(2)
2075808f684SSatish Balay        b = PETSc.Vec().createSeq(2)
2085808f684SSatish Balay        self.snes.setFunction(Function(), r)
2095808f684SSatish Balay        self.snes.setJacobian(Jacobian(), J)
210*9ae6e6bbSStefano Zampini
211*9ae6e6bbSStefano Zampini        def _update(snes, it, cnt):
212*9ae6e6bbSStefano Zampini             cnt += 1
213*9ae6e6bbSStefano Zampini        cnt_up = np.array(0)
214*9ae6e6bbSStefano Zampini        self.snes.setUpdate(_update, (cnt_up,) )
215*9ae6e6bbSStefano Zampini
2165808f684SSatish Balay        x.setArray([2, 3])
2175808f684SSatish Balay        b.set(0)
2185808f684SSatish Balay        self.snes.setConvergenceHistory()
2195808f684SSatish Balay        self.snes.setFromOptions()
2205808f684SSatish Balay        self.snes.solve(b, x)
221*9ae6e6bbSStefano Zampini        self.snes.setUpdate(None)
2225808f684SSatish Balay        rh, ih = self.snes.getConvergenceHistory()
2235808f684SSatish Balay        self.snes.setConvergenceHistory(0, reset=True)
2245808f684SSatish Balay        rh, ih = self.snes.getConvergenceHistory()
2255808f684SSatish Balay        self.assertEqual(len(rh), 0)
2265808f684SSatish Balay        self.assertEqual(len(ih), 0)
227e0aaf7daSStefano Zampini        self.assertAlmostEqual(abs(x[0]), 1.0, places=5)
228e0aaf7daSStefano Zampini        self.assertAlmostEqual(abs(x[1]), 2.0, places=5)
229*9ae6e6bbSStefano Zampini        self.assertEqual(self.snes.getIterationNumber(), cnt_up)
2305808f684SSatish Balay        # XXX this test should not be here !
2315808f684SSatish Balay        reason = self.snes.callConvergenceTest(1, 0, 0, 0)
2325808f684SSatish Balay        self.assertTrue(reason > 0)
2335808f684SSatish Balay
23441e867a5SStefano Zampini        # test interface
23541e867a5SStefano Zampini        x = self.snes.getSolution()
23641e867a5SStefano Zampini        x.setArray([2, 3])
23741e867a5SStefano Zampini        self.snes.solve()
23841e867a5SStefano Zampini        self.assertAlmostEqual(abs(x[0]), 1.0, places=5)
23941e867a5SStefano Zampini        self.assertAlmostEqual(abs(x[1]), 2.0, places=5)
24041e867a5SStefano Zampini
2415808f684SSatish Balay    def testResetAndSolve(self):
2425808f684SSatish Balay        self.snes.reset()
2435808f684SSatish Balay        self.testSolve()
2445808f684SSatish Balay        self.snes.reset()
2455808f684SSatish Balay        self.testSolve()
2465808f684SSatish Balay        self.snes.reset()
2475808f684SSatish Balay
2485808f684SSatish Balay    def testSetMonitor(self):
2495808f684SSatish Balay        reshist = {}
2506f336411SStefano Zampini
2515808f684SSatish Balay        def monitor(snes, its, fgnorm):
2525808f684SSatish Balay            reshist[its] = fgnorm
2536f336411SStefano Zampini
2545808f684SSatish Balay        refcnt = getrefcount(monitor)
2555808f684SSatish Balay        self.snes.setMonitor(monitor)
2565808f684SSatish Balay        self.assertEqual(getrefcount(monitor), refcnt + 1)
2575808f684SSatish Balay        self.testSolve()
2585808f684SSatish Balay        self.assertTrue(len(reshist) > 0)
2595808f684SSatish Balay        reshist = {}
2601dbd64e7SPierre Jolivet        self.snes.monitorCancel()
2615808f684SSatish Balay        self.assertEqual(getrefcount(monitor), refcnt)
2625808f684SSatish Balay        self.testSolve()
2635808f684SSatish Balay        self.assertTrue(len(reshist) == 0)
2645808f684SSatish Balay        self.snes.setMonitor(monitor)
2655808f684SSatish Balay        self.snes.monitor(1, 7)
2665808f684SSatish Balay        self.assertTrue(reshist[1] == 7)
2675808f684SSatish Balay        ## Monitor = PETSc.SNES.Monitor
2685808f684SSatish Balay        ## self.snes.setMonitor(Monitor())
2695808f684SSatish Balay        ## self.snes.setMonitor(Monitor.DEFAULT)
2705808f684SSatish Balay        ## self.snes.setMonitor(Monitor.SOLUTION)
2715808f684SSatish Balay        ## self.snes.setMonitor(Monitor.RESIDUAL)
2725808f684SSatish Balay        ## self.snes.setMonitor(Monitor.SOLUTION_UPDATE)
2735808f684SSatish Balay
2745808f684SSatish Balay    def testSetGetStepFails(self):
2755808f684SSatish Balay        its = self.snes.getIterationNumber()
2765808f684SSatish Balay        self.assertEqual(its, 0)
2775808f684SSatish Balay        fails = self.snes.getNonlinearStepFailures()
2785808f684SSatish Balay        self.assertEqual(fails, 0)
2795808f684SSatish Balay        fails = self.snes.getMaxNonlinearStepFailures()
2805808f684SSatish Balay        self.assertEqual(fails, 1)
2815808f684SSatish Balay        self.snes.setMaxNonlinearStepFailures(5)
2825808f684SSatish Balay        fails = self.snes.getMaxNonlinearStepFailures()
2835808f684SSatish Balay        self.assertEqual(fails, 5)
2845808f684SSatish Balay        self.snes.setMaxNonlinearStepFailures(1)
2855808f684SSatish Balay        fails = self.snes.getMaxNonlinearStepFailures()
2865808f684SSatish Balay        self.assertEqual(fails, 1)
2875808f684SSatish Balay
2885808f684SSatish Balay    def testSetGetLinFails(self):
2895808f684SSatish Balay        its = self.snes.getLinearSolveIterations()
2905808f684SSatish Balay        self.assertEqual(its, 0)
2915808f684SSatish Balay        fails = self.snes.getLinearSolveFailures()
2925808f684SSatish Balay        self.assertEqual(fails, 0)
2935808f684SSatish Balay        fails = self.snes.getMaxLinearSolveFailures()
2945808f684SSatish Balay        self.assertEqual(fails, 1)
2955808f684SSatish Balay        self.snes.setMaxLinearSolveFailures(5)
2965808f684SSatish Balay        fails = self.snes.getMaxLinearSolveFailures()
2975808f684SSatish Balay        self.assertEqual(fails, 5)
2985808f684SSatish Balay        self.snes.setMaxLinearSolveFailures(1)
2995808f684SSatish Balay        fails = self.snes.getMaxLinearSolveFailures()
3005808f684SSatish Balay        self.assertEqual(fails, 1)
3015808f684SSatish Balay
3025808f684SSatish Balay    def testEW(self):
3035808f684SSatish Balay        self.snes.setUseEW(False)
3045808f684SSatish Balay        self.assertFalse(self.snes.getUseEW())
3055808f684SSatish Balay        self.snes.setUseEW(True)
3065808f684SSatish Balay        self.assertTrue(self.snes.getUseEW())
3075808f684SSatish Balay        params = self.snes.getParamsEW()
3085808f684SSatish Balay        params['version'] = 1
3095808f684SSatish Balay        self.snes.setParamsEW(**params)
3105808f684SSatish Balay        params = self.snes.getParamsEW()
3115808f684SSatish Balay        self.assertEqual(params['version'], 1)
3125808f684SSatish Balay        params['version'] = PETSc.DEFAULT
3135808f684SSatish Balay        self.snes.setParamsEW(**params)
3145808f684SSatish Balay        params = self.snes.getParamsEW()
3155808f684SSatish Balay        self.assertEqual(params['version'], 1)
3165808f684SSatish Balay
3175808f684SSatish Balay    def testMF(self):
3185808f684SSatish Balay        # self.snes.setOptionsPrefix('MF-')
3195808f684SSatish Balay        # opts = PETSc.Options(self.snes)
3205808f684SSatish Balay        # opts['mat_mffd_type'] = 'ds'
3215808f684SSatish Balay        # opts['snes_monitor']  = 'stdout'
3225808f684SSatish Balay        # opts['ksp_monitor']   = 'stdout'
3235808f684SSatish Balay        # opts['snes_view']     = 'stdout'
3245808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
3255808f684SSatish Balay        J.setSizes([2, 2])
3265808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
3275808f684SSatish Balay        J.setUp()
3285808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
3295808f684SSatish Balay        x = PETSc.Vec().createSeq(2)
3305808f684SSatish Balay        b = PETSc.Vec().createSeq(2)
3315808f684SSatish Balay        fun = Function()
3325808f684SSatish Balay        jac = Jacobian()
3335808f684SSatish Balay        self.snes.setFunction(fun, r)
3345808f684SSatish Balay        self.snes.setJacobian(jac, J)
3355808f684SSatish Balay        self.assertFalse(self.snes.getUseMF())
3365808f684SSatish Balay        self.snes.setUseMF(False)
3375808f684SSatish Balay        self.assertFalse(self.snes.getUseMF())
3385808f684SSatish Balay        self.snes.setUseMF(True)
3395808f684SSatish Balay        self.assertTrue(self.snes.getUseMF())
3405808f684SSatish Balay        self.snes.setFromOptions()
3414a221d59SStefano Zampini        if self.snes.getType() != PETSc.SNES.Type.NEWTONTR:
3425808f684SSatish Balay            x.setArray([2, 3])
3435808f684SSatish Balay            b.set(0)
3445808f684SSatish Balay            self.snes.solve(b, x)
345e0aaf7daSStefano Zampini            self.assertAlmostEqual(abs(x[0]), 1.0, places=5)
346e0aaf7daSStefano Zampini            self.assertAlmostEqual(abs(x[1]), 2.0, places=5)
3475808f684SSatish Balay
3485808f684SSatish Balay    def testFDColor(self):
3495808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
3505808f684SSatish Balay        J.setSizes([2, 2])
3515808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
3525808f684SSatish Balay        J.setUp()
3535808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
3545808f684SSatish Balay        x = PETSc.Vec().createSeq(2)
3555808f684SSatish Balay        b = PETSc.Vec().createSeq(2)
3565808f684SSatish Balay        fun = Function()
3575808f684SSatish Balay        jac = Jacobian()
3585808f684SSatish Balay        self.snes.setFunction(fun, r)
3595808f684SSatish Balay        self.snes.setJacobian(jac, J)
3605808f684SSatish Balay        self.assertFalse(self.snes.getUseFD())
3615808f684SSatish Balay        jac(self.snes, x, J, J)
3625808f684SSatish Balay        self.snes.setUseFD(False)
3635808f684SSatish Balay        self.assertFalse(self.snes.getUseFD())
3645808f684SSatish Balay        self.snes.setUseFD(True)
3655808f684SSatish Balay        self.assertTrue(self.snes.getUseFD())
3665808f684SSatish Balay        self.snes.setFromOptions()
3675808f684SSatish Balay        x.setArray([2, 3])
3685808f684SSatish Balay        b.set(0)
3695808f684SSatish Balay        self.snes.solve(b, x)
3704a221d59SStefano Zampini        self.assertAlmostEqual(abs(x[0]), 1.0, places=4)
3714a221d59SStefano Zampini        self.assertAlmostEqual(abs(x[1]), 2.0, places=4)
3725808f684SSatish Balay
3739be84c52SStefano Zampini    def testNPC(self):
3749be84c52SStefano Zampini        self.snes.appctx = (1, 2, 3)
3759be84c52SStefano Zampini        npc = self.snes.getNPC()
3769be84c52SStefano Zampini        self.assertEqual(npc.appctx, (1, 2, 3))
3779be84c52SStefano Zampini
3786f336411SStefano Zampini
3795808f684SSatish Balay# --------------------------------------------------------------------
3805808f684SSatish Balay
3816f336411SStefano Zampini
3825808f684SSatish Balayclass TestSNESLS(BaseTestSNES, unittest.TestCase):
3835808f684SSatish Balay    SNES_TYPE = PETSc.SNES.Type.NEWTONLS
3845808f684SSatish Balay
3856f336411SStefano Zampini
3865808f684SSatish Balayclass TestSNESTR(BaseTestSNES, unittest.TestCase):
3875808f684SSatish Balay    SNES_TYPE = PETSc.SNES.Type.NEWTONTR
3885808f684SSatish Balay
3896f336411SStefano Zampini
3905808f684SSatish Balay# --------------------------------------------------------------------
3915808f684SSatish Balay
3925808f684SSatish Balayif __name__ == '__main__':
3935808f684SSatish Balay    unittest.main()
394