xref: /petsc/src/binding/petsc4py/test/test_snes.py (revision cfba373d68860fab419005b5067e7773a25d1143)
15808f684SSatish Balay# --------------------------------------------------------------------
25808f684SSatish Balay
35808f684SSatish Balayfrom petsc4py import PETSc
45808f684SSatish Balayimport unittest
55808f684SSatish Balayfrom sys import getrefcount
65808f684SSatish Balay
75808f684SSatish Balay# --------------------------------------------------------------------
85808f684SSatish Balay
96f336411SStefano Zampini
105808f684SSatish Balayclass Function:
115808f684SSatish Balay    def __call__(self, snes, x, f):
125808f684SSatish Balay        f[0] = (x[0] * x[0] + x[0] * x[1] - 3.0).item()
135808f684SSatish Balay        f[1] = (x[0] * x[1] + x[1] * x[1] - 6.0).item()
145808f684SSatish Balay        f.assemble()
155808f684SSatish Balay
166f336411SStefano Zampini
175808f684SSatish Balayclass Jacobian:
185808f684SSatish Balay    def __call__(self, snes, x, J, P):
195808f684SSatish Balay        P[0, 0] = (2.0 * x[0] + x[1]).item()
205808f684SSatish Balay        P[0, 1] = (x[0]).item()
215808f684SSatish Balay        P[1, 0] = (x[1]).item()
225808f684SSatish Balay        P[1, 1] = (x[0] + 2.0 * x[1]).item()
235808f684SSatish Balay        P.assemble()
246f336411SStefano Zampini        if J != P:
256f336411SStefano Zampini            J.assemble()
266f336411SStefano Zampini
275808f684SSatish Balay
285808f684SSatish Balay# --------------------------------------------------------------------
295808f684SSatish Balay
305808f684SSatish Balay
316f336411SStefano Zampiniclass BaseTestSNES:
325808f684SSatish Balay    SNES_TYPE = None
335808f684SSatish Balay
345808f684SSatish Balay    def setUp(self):
355808f684SSatish Balay        snes = PETSc.SNES()
365808f684SSatish Balay        snes.create(PETSc.COMM_SELF)
375808f684SSatish Balay        if self.SNES_TYPE:
385808f684SSatish Balay            snes.setType(self.SNES_TYPE)
395808f684SSatish Balay        self.snes = snes
405808f684SSatish Balay
415808f684SSatish Balay    def tearDown(self):
425808f684SSatish Balay        self.snes = None
4362e5d2d2SJDBetteridge        PETSc.garbage_cleanup()
445808f684SSatish Balay
455808f684SSatish Balay    def testGetSetType(self):
465808f684SSatish Balay        self.assertEqual(self.snes.getType(), self.SNES_TYPE)
475808f684SSatish Balay        self.snes.setType(self.SNES_TYPE)
485808f684SSatish Balay        self.assertEqual(self.snes.getType(), self.SNES_TYPE)
495808f684SSatish Balay
505808f684SSatish Balay    def testTols(self):
515808f684SSatish Balay        tols = self.snes.getTolerances()
525808f684SSatish Balay        self.snes.setTolerances(*tols)
535808f684SSatish Balay        tnames = ('rtol', 'atol', 'stol', 'max_it')
545808f684SSatish Balay        tolvals = [getattr(self.snes, t) for t in tnames]
555808f684SSatish Balay        self.assertEqual(tuple(tols), tuple(tolvals))
56e5cd489fSStefano Zampini        dtol = self.snes.getDivergenceTolerance()
57e5cd489fSStefano Zampini        self.assertTrue(dtol > 0)
58e5cd489fSStefano Zampini        self.snes.setDivergenceTolerance(-1)
59e5cd489fSStefano Zampini        dtol = self.snes.getDivergenceTolerance()
60e5cd489fSStefano Zampini        self.assertEqual(dtol, -1)
61e5cd489fSStefano Zampini        self.snes.setDivergenceTolerance(PETSc.DEFAULT)
62e5cd489fSStefano Zampini        self.assertEqual(dtol, -1)
635808f684SSatish Balay
645808f684SSatish Balay    def testProperties(self):
655808f684SSatish Balay        snes = self.snes
665808f684SSatish Balay        #
675808f684SSatish Balay        snes.appctx = (1, 2, 3)
685808f684SSatish Balay        self.assertEqual(snes.appctx, (1, 2, 3))
695808f684SSatish Balay        snes.appctx = None
705808f684SSatish Balay        self.assertEqual(snes.appctx, None)
715808f684SSatish Balay        #
725808f684SSatish Balay        snes.its = 1
735808f684SSatish Balay        self.assertEqual(snes.its, 1)
745808f684SSatish Balay        snes.its = 0
755808f684SSatish Balay        self.assertEqual(snes.its, 0)
765808f684SSatish Balay        #
775808f684SSatish Balay        snes.norm = 1
785808f684SSatish Balay        self.assertEqual(snes.norm, 1)
795808f684SSatish Balay        snes.norm = 0
805808f684SSatish Balay        self.assertEqual(snes.norm, 0)
815808f684SSatish Balay        #
825808f684SSatish Balay        rh, ih = snes.history
835808f684SSatish Balay        self.assertTrue(len(rh) == 0)
845808f684SSatish Balay        self.assertTrue(len(ih) == 0)
855808f684SSatish Balay        #
865808f684SSatish Balay        reason = PETSc.SNES.ConvergedReason.CONVERGED_ITS
875808f684SSatish Balay        snes.reason = reason
885808f684SSatish Balay        self.assertEqual(snes.reason, reason)
89c78242eeSStefano Zampini        self.assertTrue(snes.is_converged)
90c78242eeSStefano Zampini        self.assertFalse(snes.is_diverged)
91c78242eeSStefano Zampini        self.assertFalse(snes.is_iterating)
925808f684SSatish Balay        reason = PETSc.SNES.ConvergedReason.DIVERGED_MAX_IT
935808f684SSatish Balay        snes.reason = reason
945808f684SSatish Balay        self.assertEqual(snes.reason, reason)
95c78242eeSStefano Zampini        self.assertFalse(snes.is_converged)
96c78242eeSStefano Zampini        self.assertTrue(snes.is_diverged)
97c78242eeSStefano Zampini        self.assertFalse(snes.is_iterating)
985808f684SSatish Balay        reason = PETSc.SNES.ConvergedReason.CONVERGED_ITERATING
995808f684SSatish Balay        snes.reason = reason
1005808f684SSatish Balay        self.assertEqual(snes.reason, reason)
101c78242eeSStefano Zampini        self.assertFalse(snes.is_converged)
102c78242eeSStefano Zampini        self.assertFalse(snes.is_diverged)
103c78242eeSStefano Zampini        self.assertTrue(snes.is_iterating)
1045808f684SSatish Balay        #
1055808f684SSatish Balay        self.assertFalse(snes.use_ew)
1065808f684SSatish Balay        self.assertFalse(snes.use_mf)
1075808f684SSatish Balay        self.assertFalse(snes.use_fd)
108*cfba373dSStefano Zampini        ouse = snes.use_ksp
109*cfba373dSStefano Zampini        self.assertEqual(ouse, snes.getUseKSP())
110*cfba373dSStefano Zampini        snes.use_ksp = not ouse
111*cfba373dSStefano Zampini        self.assertEqual(not ouse, snes.getUseKSP())
112*cfba373dSStefano Zampini        snes.setUseKSP(ouse)
113*cfba373dSStefano Zampini        self.assertEqual(ouse, snes.use_ksp)
1145808f684SSatish Balay
1155808f684SSatish Balay    def testGetSetFunc(self):
1165808f684SSatish Balay        r, func = self.snes.getFunction()
1175808f684SSatish Balay        self.assertFalse(r)
1185808f684SSatish Balay        self.assertTrue(func is None)
1195808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
1205808f684SSatish Balay        func = Function()
1215808f684SSatish Balay        refcnt = getrefcount(func)
1225808f684SSatish Balay        self.snes.setFunction(func, r)
1235808f684SSatish Balay        self.snes.setFunction(func, r)
1245808f684SSatish Balay        self.assertEqual(getrefcount(func), refcnt + 1)
1255808f684SSatish Balay        r2, func2 = self.snes.getFunction()
1265808f684SSatish Balay        self.assertEqual(r, r2)
1275808f684SSatish Balay        self.assertEqual(func, func2[0])
1285808f684SSatish Balay        self.assertEqual(getrefcount(func), refcnt + 1)
1295808f684SSatish Balay        r3, func3 = self.snes.getFunction()
1305808f684SSatish Balay        self.assertEqual(r, r3)
1315808f684SSatish Balay        self.assertEqual(func, func3[0])
1325808f684SSatish Balay        self.assertEqual(getrefcount(func), refcnt + 1)
1335808f684SSatish Balay
1345808f684SSatish Balay    def testCompFunc(self):
1355808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
1365808f684SSatish Balay        func = Function()
1375808f684SSatish Balay        self.snes.setFunction(func, r)
1385808f684SSatish Balay        x, y = r.duplicate(), r.duplicate()
1395808f684SSatish Balay        x[0], x[1] = [1, 2]
1405808f684SSatish Balay        self.snes.computeFunction(x, y)
141e0aaf7daSStefano Zampini        self.assertAlmostEqual(abs(y[0]), 0.0, places=5)
142e0aaf7daSStefano Zampini        self.assertAlmostEqual(abs(y[1]), 0.0, places=5)
1435808f684SSatish Balay
1445808f684SSatish Balay    def testGetSetJac(self):
1455808f684SSatish Balay        A, P, jac = self.snes.getJacobian()
1465808f684SSatish Balay        self.assertFalse(A)
1475808f684SSatish Balay        self.assertFalse(P)
1485808f684SSatish Balay        self.assertTrue(jac is None)
1495808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
1505808f684SSatish Balay        J.setSizes([2, 2])
1515808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
1525808f684SSatish Balay        J.setUp()
1535808f684SSatish Balay        jac = Jacobian()
1545808f684SSatish Balay        refcnt = getrefcount(jac)
1555808f684SSatish Balay        self.snes.setJacobian(jac, J)
1565808f684SSatish Balay        self.snes.setJacobian(jac, J)
1575808f684SSatish Balay        self.assertEqual(getrefcount(jac), refcnt + 1)
1585808f684SSatish Balay        J2, P2, jac2 = self.snes.getJacobian()
1595808f684SSatish Balay        self.assertEqual(J, J2)
1605808f684SSatish Balay        self.assertEqual(J2, P2)
1615808f684SSatish Balay        self.assertEqual(jac, jac2[0])
1625808f684SSatish Balay        self.assertEqual(getrefcount(jac), refcnt + 1)
1635808f684SSatish Balay        J3, P3, jac3 = self.snes.getJacobian()
1645808f684SSatish Balay        self.assertEqual(J, J3)
1655808f684SSatish Balay        self.assertEqual(J3, P3)
1665808f684SSatish Balay        self.assertEqual(jac, jac3[0])
1675808f684SSatish Balay        self.assertEqual(getrefcount(jac), refcnt + 1)
1685808f684SSatish Balay
1695808f684SSatish Balay    def testCompJac(self):
1705808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
1715808f684SSatish Balay        J.setSizes([2, 2])
1725808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
1735808f684SSatish Balay        J.setUp()
1745808f684SSatish Balay        jac = Jacobian()
1755808f684SSatish Balay        self.snes.setJacobian(jac, J)
1765808f684SSatish Balay        x = PETSc.Vec().createSeq(2)
1775808f684SSatish Balay        x[0], x[1] = [1, 2]
1785808f684SSatish Balay        self.snes.getKSP().getPC()
1795808f684SSatish Balay        self.snes.computeJacobian(x, J)
1805808f684SSatish Balay
1815808f684SSatish Balay    def testGetSetUpd(self):
1825808f684SSatish Balay        self.assertTrue(self.snes.getUpdate() is None)
1835808f684SSatish Balay        upd = lambda snes, it: None
1845808f684SSatish Balay        refcnt = getrefcount(upd)
1855808f684SSatish Balay        self.snes.setUpdate(upd)
1865808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt + 1)
1875808f684SSatish Balay        self.snes.setUpdate(upd)
1885808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt + 1)
1895808f684SSatish Balay        self.snes.setUpdate(None)
1905808f684SSatish Balay        self.assertTrue(self.snes.getUpdate() is None)
1915808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt)
1925808f684SSatish Balay        self.snes.setUpdate(upd)
1935808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt + 1)
1945808f684SSatish Balay        upd2 = lambda snes, it: None
1955808f684SSatish Balay        refcnt2 = getrefcount(upd2)
1965808f684SSatish Balay        self.snes.setUpdate(upd2)
1975808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt)
1985808f684SSatish Balay        self.assertEqual(getrefcount(upd2), refcnt2 + 1)
1995808f684SSatish Balay        tmp = self.snes.getUpdate()[0]
2005808f684SSatish Balay        self.assertTrue(tmp is upd2)
2015808f684SSatish Balay        self.assertEqual(getrefcount(upd2), refcnt2 + 2)
2025808f684SSatish Balay        del tmp
2035808f684SSatish Balay        self.snes.setUpdate(None)
2045808f684SSatish Balay        self.assertTrue(self.snes.getUpdate() is None)
2055808f684SSatish Balay        self.assertEqual(getrefcount(upd2), refcnt2)
2065808f684SSatish Balay
2075808f684SSatish Balay    def testGetKSP(self):
2085808f684SSatish Balay        ksp = self.snes.getKSP()
2095808f684SSatish Balay        self.assertEqual(ksp.getRefCount(), 2)
2105808f684SSatish Balay
2115808f684SSatish Balay    def testSolve(self):
2125808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
2135808f684SSatish Balay        J.setSizes([2, 2])
2145808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
2155808f684SSatish Balay        J.setUp()
2165808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
2175808f684SSatish Balay        x = PETSc.Vec().createSeq(2)
2185808f684SSatish Balay        b = PETSc.Vec().createSeq(2)
2195808f684SSatish Balay        self.snes.setFunction(Function(), r)
2205808f684SSatish Balay        self.snes.setJacobian(Jacobian(), J)
2215808f684SSatish Balay        x.setArray([2, 3])
2225808f684SSatish Balay        b.set(0)
2235808f684SSatish Balay        self.snes.setConvergenceHistory()
2245808f684SSatish Balay        self.snes.setFromOptions()
2255808f684SSatish Balay        self.snes.solve(b, x)
2265808f684SSatish Balay        rh, ih = self.snes.getConvergenceHistory()
2275808f684SSatish Balay        self.snes.setConvergenceHistory(0, reset=True)
2285808f684SSatish Balay        rh, ih = self.snes.getConvergenceHistory()
2295808f684SSatish Balay        self.assertEqual(len(rh), 0)
2305808f684SSatish Balay        self.assertEqual(len(ih), 0)
231e0aaf7daSStefano Zampini        self.assertAlmostEqual(abs(x[0]), 1.0, places=5)
232e0aaf7daSStefano Zampini        self.assertAlmostEqual(abs(x[1]), 2.0, places=5)
2335808f684SSatish Balay        # XXX this test should not be here !
2345808f684SSatish Balay        reason = self.snes.callConvergenceTest(1, 0, 0, 0)
2355808f684SSatish Balay        self.assertTrue(reason > 0)
2365808f684SSatish Balay
23741e867a5SStefano Zampini        # test interface
23841e867a5SStefano Zampini        x = self.snes.getSolution()
23941e867a5SStefano Zampini        x.setArray([2, 3])
24041e867a5SStefano Zampini        self.snes.solve()
24141e867a5SStefano Zampini        self.assertAlmostEqual(abs(x[0]), 1.0, places=5)
24241e867a5SStefano Zampini        self.assertAlmostEqual(abs(x[1]), 2.0, places=5)
24341e867a5SStefano Zampini
2445808f684SSatish Balay    def testResetAndSolve(self):
2455808f684SSatish Balay        self.snes.reset()
2465808f684SSatish Balay        self.testSolve()
2475808f684SSatish Balay        self.snes.reset()
2485808f684SSatish Balay        self.testSolve()
2495808f684SSatish Balay        self.snes.reset()
2505808f684SSatish Balay
2515808f684SSatish Balay    def testSetMonitor(self):
2525808f684SSatish Balay        reshist = {}
2536f336411SStefano Zampini
2545808f684SSatish Balay        def monitor(snes, its, fgnorm):
2555808f684SSatish Balay            reshist[its] = fgnorm
2566f336411SStefano Zampini
2575808f684SSatish Balay        refcnt = getrefcount(monitor)
2585808f684SSatish Balay        self.snes.setMonitor(monitor)
2595808f684SSatish Balay        self.assertEqual(getrefcount(monitor), refcnt + 1)
2605808f684SSatish Balay        self.testSolve()
2615808f684SSatish Balay        self.assertTrue(len(reshist) > 0)
2625808f684SSatish Balay        reshist = {}
2631dbd64e7SPierre Jolivet        self.snes.monitorCancel()
2645808f684SSatish Balay        self.assertEqual(getrefcount(monitor), refcnt)
2655808f684SSatish Balay        self.testSolve()
2665808f684SSatish Balay        self.assertTrue(len(reshist) == 0)
2675808f684SSatish Balay        self.snes.setMonitor(monitor)
2685808f684SSatish Balay        self.snes.monitor(1, 7)
2695808f684SSatish Balay        self.assertTrue(reshist[1] == 7)
2705808f684SSatish Balay        ## Monitor = PETSc.SNES.Monitor
2715808f684SSatish Balay        ## self.snes.setMonitor(Monitor())
2725808f684SSatish Balay        ## self.snes.setMonitor(Monitor.DEFAULT)
2735808f684SSatish Balay        ## self.snes.setMonitor(Monitor.SOLUTION)
2745808f684SSatish Balay        ## self.snes.setMonitor(Monitor.RESIDUAL)
2755808f684SSatish Balay        ## self.snes.setMonitor(Monitor.SOLUTION_UPDATE)
2765808f684SSatish Balay
2775808f684SSatish Balay    def testSetGetStepFails(self):
2785808f684SSatish Balay        its = self.snes.getIterationNumber()
2795808f684SSatish Balay        self.assertEqual(its, 0)
2805808f684SSatish Balay        fails = self.snes.getNonlinearStepFailures()
2815808f684SSatish Balay        self.assertEqual(fails, 0)
2825808f684SSatish Balay        fails = self.snes.getMaxNonlinearStepFailures()
2835808f684SSatish Balay        self.assertEqual(fails, 1)
2845808f684SSatish Balay        self.snes.setMaxNonlinearStepFailures(5)
2855808f684SSatish Balay        fails = self.snes.getMaxNonlinearStepFailures()
2865808f684SSatish Balay        self.assertEqual(fails, 5)
2875808f684SSatish Balay        self.snes.setMaxNonlinearStepFailures(1)
2885808f684SSatish Balay        fails = self.snes.getMaxNonlinearStepFailures()
2895808f684SSatish Balay        self.assertEqual(fails, 1)
2905808f684SSatish Balay
2915808f684SSatish Balay    def testSetGetLinFails(self):
2925808f684SSatish Balay        its = self.snes.getLinearSolveIterations()
2935808f684SSatish Balay        self.assertEqual(its, 0)
2945808f684SSatish Balay        fails = self.snes.getLinearSolveFailures()
2955808f684SSatish Balay        self.assertEqual(fails, 0)
2965808f684SSatish Balay        fails = self.snes.getMaxLinearSolveFailures()
2975808f684SSatish Balay        self.assertEqual(fails, 1)
2985808f684SSatish Balay        self.snes.setMaxLinearSolveFailures(5)
2995808f684SSatish Balay        fails = self.snes.getMaxLinearSolveFailures()
3005808f684SSatish Balay        self.assertEqual(fails, 5)
3015808f684SSatish Balay        self.snes.setMaxLinearSolveFailures(1)
3025808f684SSatish Balay        fails = self.snes.getMaxLinearSolveFailures()
3035808f684SSatish Balay        self.assertEqual(fails, 1)
3045808f684SSatish Balay
3055808f684SSatish Balay    def testEW(self):
3065808f684SSatish Balay        self.snes.setUseEW(False)
3075808f684SSatish Balay        self.assertFalse(self.snes.getUseEW())
3085808f684SSatish Balay        self.snes.setUseEW(True)
3095808f684SSatish Balay        self.assertTrue(self.snes.getUseEW())
3105808f684SSatish Balay        params = self.snes.getParamsEW()
3115808f684SSatish Balay        params['version'] = 1
3125808f684SSatish Balay        self.snes.setParamsEW(**params)
3135808f684SSatish Balay        params = self.snes.getParamsEW()
3145808f684SSatish Balay        self.assertEqual(params['version'], 1)
3155808f684SSatish Balay        params['version'] = PETSc.DEFAULT
3165808f684SSatish Balay        self.snes.setParamsEW(**params)
3175808f684SSatish Balay        params = self.snes.getParamsEW()
3185808f684SSatish Balay        self.assertEqual(params['version'], 1)
3195808f684SSatish Balay
3205808f684SSatish Balay    def testMF(self):
3215808f684SSatish Balay        # self.snes.setOptionsPrefix('MF-')
3225808f684SSatish Balay        # opts = PETSc.Options(self.snes)
3235808f684SSatish Balay        # opts['mat_mffd_type'] = 'ds'
3245808f684SSatish Balay        # opts['snes_monitor']  = 'stdout'
3255808f684SSatish Balay        # opts['ksp_monitor']   = 'stdout'
3265808f684SSatish Balay        # opts['snes_view']     = 'stdout'
3275808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
3285808f684SSatish Balay        J.setSizes([2, 2])
3295808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
3305808f684SSatish Balay        J.setUp()
3315808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
3325808f684SSatish Balay        x = PETSc.Vec().createSeq(2)
3335808f684SSatish Balay        b = PETSc.Vec().createSeq(2)
3345808f684SSatish Balay        fun = Function()
3355808f684SSatish Balay        jac = Jacobian()
3365808f684SSatish Balay        self.snes.setFunction(fun, r)
3375808f684SSatish Balay        self.snes.setJacobian(jac, J)
3385808f684SSatish Balay        self.assertFalse(self.snes.getUseMF())
3395808f684SSatish Balay        self.snes.setUseMF(False)
3405808f684SSatish Balay        self.assertFalse(self.snes.getUseMF())
3415808f684SSatish Balay        self.snes.setUseMF(True)
3425808f684SSatish Balay        self.assertTrue(self.snes.getUseMF())
3435808f684SSatish Balay        self.snes.setFromOptions()
3444a221d59SStefano Zampini        if self.snes.getType() != PETSc.SNES.Type.NEWTONTR:
3455808f684SSatish Balay            x.setArray([2, 3])
3465808f684SSatish Balay            b.set(0)
3475808f684SSatish Balay            self.snes.solve(b, x)
348e0aaf7daSStefano Zampini            self.assertAlmostEqual(abs(x[0]), 1.0, places=5)
349e0aaf7daSStefano Zampini            self.assertAlmostEqual(abs(x[1]), 2.0, places=5)
3505808f684SSatish Balay
3515808f684SSatish Balay    def testFDColor(self):
3525808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
3535808f684SSatish Balay        J.setSizes([2, 2])
3545808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
3555808f684SSatish Balay        J.setUp()
3565808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
3575808f684SSatish Balay        x = PETSc.Vec().createSeq(2)
3585808f684SSatish Balay        b = PETSc.Vec().createSeq(2)
3595808f684SSatish Balay        fun = Function()
3605808f684SSatish Balay        jac = Jacobian()
3615808f684SSatish Balay        self.snes.setFunction(fun, r)
3625808f684SSatish Balay        self.snes.setJacobian(jac, J)
3635808f684SSatish Balay        self.assertFalse(self.snes.getUseFD())
3645808f684SSatish Balay        jac(self.snes, x, J, J)
3655808f684SSatish Balay        self.snes.setUseFD(False)
3665808f684SSatish Balay        self.assertFalse(self.snes.getUseFD())
3675808f684SSatish Balay        self.snes.setUseFD(True)
3685808f684SSatish Balay        self.assertTrue(self.snes.getUseFD())
3695808f684SSatish Balay        self.snes.setFromOptions()
3705808f684SSatish Balay        x.setArray([2, 3])
3715808f684SSatish Balay        b.set(0)
3725808f684SSatish Balay        self.snes.solve(b, x)
3734a221d59SStefano Zampini        self.assertAlmostEqual(abs(x[0]), 1.0, places=4)
3744a221d59SStefano Zampini        self.assertAlmostEqual(abs(x[1]), 2.0, places=4)
3755808f684SSatish Balay
3769be84c52SStefano Zampini    def testNPC(self):
3779be84c52SStefano Zampini        self.snes.appctx = (1, 2, 3)
3789be84c52SStefano Zampini        npc = self.snes.getNPC()
3799be84c52SStefano Zampini        self.assertEqual(npc.appctx, (1, 2, 3))
3809be84c52SStefano Zampini
3816f336411SStefano Zampini
3825808f684SSatish Balay# --------------------------------------------------------------------
3835808f684SSatish Balay
3846f336411SStefano Zampini
3855808f684SSatish Balayclass TestSNESLS(BaseTestSNES, unittest.TestCase):
3865808f684SSatish Balay    SNES_TYPE = PETSc.SNES.Type.NEWTONLS
3875808f684SSatish Balay
3886f336411SStefano Zampini
3895808f684SSatish Balayclass TestSNESTR(BaseTestSNES, unittest.TestCase):
3905808f684SSatish Balay    SNES_TYPE = PETSc.SNES.Type.NEWTONTR
3915808f684SSatish Balay
3926f336411SStefano Zampini
3935808f684SSatish Balay# --------------------------------------------------------------------
3945808f684SSatish Balay
3955808f684SSatish Balayif __name__ == '__main__':
3965808f684SSatish Balay    unittest.main()
397