xref: /petsc/src/binding/petsc4py/test/test_snes.py (revision 8aa39e1bf17a5ea28fa0458095c26b0a3b4f2478)
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
29*0f621c1cSStefano Zampiniclass FunctionAL:
30*0f621c1cSStefano Zampini    def __call__(self, snes, x, f):
31*0f621c1cSStefano Zampini        load = snes.getNewtonALLoadParameter()
32*0f621c1cSStefano Zampini        f[0] = (x[0] * x[0] + x[0] * x[1] - 3.0 * load).item()
33*0f621c1cSStefano Zampini        f[1] = (x[0] * x[1] + x[1] * x[1] - 6.0 * load).item()
34*0f621c1cSStefano Zampini        f.assemble()
35*0f621c1cSStefano Zampini
36*0f621c1cSStefano Zampini
37*0f621c1cSStefano Zampiniclass FunctionALLoad:
38*0f621c1cSStefano Zampini    def __call__(self, snes, x, f):
39*0f621c1cSStefano Zampini        f[0] = 3.0
40*0f621c1cSStefano Zampini        f[1] = 6.0
41*0f621c1cSStefano Zampini        f.assemble()
42*0f621c1cSStefano Zampini
439ae6e6bbSStefano Zampini
445808f684SSatish Balay# --------------------------------------------------------------------
455808f684SSatish Balay
465808f684SSatish Balay
476f336411SStefano Zampiniclass BaseTestSNES:
485808f684SSatish Balay    SNES_TYPE = None
495808f684SSatish Balay
505808f684SSatish Balay    def setUp(self):
515808f684SSatish Balay        snes = PETSc.SNES()
525808f684SSatish Balay        snes.create(PETSc.COMM_SELF)
535808f684SSatish Balay        if self.SNES_TYPE:
545808f684SSatish Balay            snes.setType(self.SNES_TYPE)
555808f684SSatish Balay        self.snes = snes
565808f684SSatish Balay
575808f684SSatish Balay    def tearDown(self):
585808f684SSatish Balay        self.snes = None
5962e5d2d2SJDBetteridge        PETSc.garbage_cleanup()
605808f684SSatish Balay
615808f684SSatish Balay    def testGetSetType(self):
625808f684SSatish Balay        self.assertEqual(self.snes.getType(), self.SNES_TYPE)
635808f684SSatish Balay        self.snes.setType(self.SNES_TYPE)
645808f684SSatish Balay        self.assertEqual(self.snes.getType(), self.SNES_TYPE)
655808f684SSatish Balay
665808f684SSatish Balay    def testTols(self):
675808f684SSatish Balay        tols = self.snes.getTolerances()
685808f684SSatish Balay        self.snes.setTolerances(*tols)
695808f684SSatish Balay        tnames = ('rtol', 'atol', 'stol', 'max_it')
705808f684SSatish Balay        tolvals = [getattr(self.snes, t) for t in tnames]
715808f684SSatish Balay        self.assertEqual(tuple(tols), tuple(tolvals))
72e5cd489fSStefano Zampini        dtol = self.snes.getDivergenceTolerance()
73e5cd489fSStefano Zampini        self.assertTrue(dtol > 0)
7477e5a1f9SBarry Smith        self.snes.setDivergenceTolerance(PETSc.UNLIMITED)
75e5cd489fSStefano Zampini        dtol = self.snes.getDivergenceTolerance()
7677e5a1f9SBarry Smith        self.assertEqual(dtol, PETSc.UNLIMITED)
7777e5a1f9SBarry Smith        self.snes.setDivergenceTolerance(PETSc.CURRENT)
7877e5a1f9SBarry Smith        self.assertEqual(dtol, PETSc.UNLIMITED)
795808f684SSatish Balay
805808f684SSatish Balay    def testProperties(self):
815808f684SSatish Balay        snes = self.snes
825808f684SSatish Balay        #
835808f684SSatish Balay        snes.appctx = (1, 2, 3)
845808f684SSatish Balay        self.assertEqual(snes.appctx, (1, 2, 3))
855808f684SSatish Balay        snes.appctx = None
865808f684SSatish Balay        self.assertEqual(snes.appctx, None)
875808f684SSatish Balay        #
885808f684SSatish Balay        snes.its = 1
895808f684SSatish Balay        self.assertEqual(snes.its, 1)
905808f684SSatish Balay        snes.its = 0
915808f684SSatish Balay        self.assertEqual(snes.its, 0)
925808f684SSatish Balay        #
935808f684SSatish Balay        snes.norm = 1
945808f684SSatish Balay        self.assertEqual(snes.norm, 1)
955808f684SSatish Balay        snes.norm = 0
965808f684SSatish Balay        self.assertEqual(snes.norm, 0)
975808f684SSatish Balay        #
985808f684SSatish Balay        rh, ih = snes.history
995808f684SSatish Balay        self.assertTrue(len(rh) == 0)
1005808f684SSatish Balay        self.assertTrue(len(ih) == 0)
1015808f684SSatish Balay        #
1025808f684SSatish Balay        reason = PETSc.SNES.ConvergedReason.CONVERGED_ITS
1035808f684SSatish Balay        snes.reason = reason
1045808f684SSatish Balay        self.assertEqual(snes.reason, reason)
105c78242eeSStefano Zampini        self.assertTrue(snes.is_converged)
106c78242eeSStefano Zampini        self.assertFalse(snes.is_diverged)
107c78242eeSStefano Zampini        self.assertFalse(snes.is_iterating)
1085808f684SSatish Balay        reason = PETSc.SNES.ConvergedReason.DIVERGED_MAX_IT
1095808f684SSatish Balay        snes.reason = reason
1105808f684SSatish Balay        self.assertEqual(snes.reason, reason)
111c78242eeSStefano Zampini        self.assertFalse(snes.is_converged)
112c78242eeSStefano Zampini        self.assertTrue(snes.is_diverged)
113c78242eeSStefano Zampini        self.assertFalse(snes.is_iterating)
1145808f684SSatish Balay        reason = PETSc.SNES.ConvergedReason.CONVERGED_ITERATING
1155808f684SSatish Balay        snes.reason = reason
1165808f684SSatish Balay        self.assertEqual(snes.reason, reason)
117c78242eeSStefano Zampini        self.assertFalse(snes.is_converged)
118c78242eeSStefano Zampini        self.assertFalse(snes.is_diverged)
119c78242eeSStefano Zampini        self.assertTrue(snes.is_iterating)
1205808f684SSatish Balay        #
1215808f684SSatish Balay        self.assertFalse(snes.use_ew)
1225808f684SSatish Balay        self.assertFalse(snes.use_mf)
1235808f684SSatish Balay        self.assertFalse(snes.use_fd)
124cfba373dSStefano Zampini        ouse = snes.use_ksp
125cfba373dSStefano Zampini        self.assertEqual(ouse, snes.getUseKSP())
126cfba373dSStefano Zampini        snes.use_ksp = not ouse
127cfba373dSStefano Zampini        self.assertEqual(not ouse, snes.getUseKSP())
128cfba373dSStefano Zampini        snes.setUseKSP(ouse)
129cfba373dSStefano Zampini        self.assertEqual(ouse, snes.use_ksp)
1305808f684SSatish Balay
1315808f684SSatish Balay    def testGetSetFunc(self):
1325808f684SSatish Balay        r, func = self.snes.getFunction()
1335808f684SSatish Balay        self.assertFalse(r)
1345808f684SSatish Balay        self.assertTrue(func is None)
1355808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
1365808f684SSatish Balay        func = Function()
1375808f684SSatish Balay        refcnt = getrefcount(func)
1385808f684SSatish Balay        self.snes.setFunction(func, r)
1395808f684SSatish Balay        self.snes.setFunction(func, r)
1405808f684SSatish Balay        self.assertEqual(getrefcount(func), refcnt + 1)
1415808f684SSatish Balay        r2, func2 = self.snes.getFunction()
1425808f684SSatish Balay        self.assertEqual(r, r2)
1435808f684SSatish Balay        self.assertEqual(func, func2[0])
1445808f684SSatish Balay        self.assertEqual(getrefcount(func), refcnt + 1)
1455808f684SSatish Balay        r3, func3 = self.snes.getFunction()
1465808f684SSatish Balay        self.assertEqual(r, r3)
1475808f684SSatish Balay        self.assertEqual(func, func3[0])
1485808f684SSatish Balay        self.assertEqual(getrefcount(func), refcnt + 1)
1495808f684SSatish Balay
1505808f684SSatish Balay    def testCompFunc(self):
1515808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
1525808f684SSatish Balay        func = Function()
1535808f684SSatish Balay        self.snes.setFunction(func, r)
1545808f684SSatish Balay        x, y = r.duplicate(), r.duplicate()
1555808f684SSatish Balay        x[0], x[1] = [1, 2]
1565808f684SSatish Balay        self.snes.computeFunction(x, y)
157e0aaf7daSStefano Zampini        self.assertAlmostEqual(abs(y[0]), 0.0, places=5)
158e0aaf7daSStefano Zampini        self.assertAlmostEqual(abs(y[1]), 0.0, places=5)
1595808f684SSatish Balay
1605808f684SSatish Balay    def testGetSetJac(self):
1615808f684SSatish Balay        A, P, jac = self.snes.getJacobian()
1625808f684SSatish Balay        self.assertFalse(A)
1635808f684SSatish Balay        self.assertFalse(P)
1645808f684SSatish Balay        self.assertTrue(jac is None)
1655808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
1665808f684SSatish Balay        J.setSizes([2, 2])
1675808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
1685808f684SSatish Balay        J.setUp()
1695808f684SSatish Balay        jac = Jacobian()
1705808f684SSatish Balay        refcnt = getrefcount(jac)
1715808f684SSatish Balay        self.snes.setJacobian(jac, J)
1725808f684SSatish Balay        self.snes.setJacobian(jac, J)
1735808f684SSatish Balay        self.assertEqual(getrefcount(jac), refcnt + 1)
1745808f684SSatish Balay        J2, P2, jac2 = self.snes.getJacobian()
1755808f684SSatish Balay        self.assertEqual(J, J2)
1765808f684SSatish Balay        self.assertEqual(J2, P2)
1775808f684SSatish Balay        self.assertEqual(jac, jac2[0])
1785808f684SSatish Balay        self.assertEqual(getrefcount(jac), refcnt + 1)
1795808f684SSatish Balay        J3, P3, jac3 = self.snes.getJacobian()
1805808f684SSatish Balay        self.assertEqual(J, J3)
1815808f684SSatish Balay        self.assertEqual(J3, P3)
1825808f684SSatish Balay        self.assertEqual(jac, jac3[0])
1835808f684SSatish Balay        self.assertEqual(getrefcount(jac), refcnt + 1)
1845808f684SSatish Balay
1855808f684SSatish Balay    def testCompJac(self):
1865808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
1875808f684SSatish Balay        J.setSizes([2, 2])
1885808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
1895808f684SSatish Balay        J.setUp()
1905808f684SSatish Balay        jac = Jacobian()
1915808f684SSatish Balay        self.snes.setJacobian(jac, J)
1925808f684SSatish Balay        x = PETSc.Vec().createSeq(2)
1935808f684SSatish Balay        x[0], x[1] = [1, 2]
1945808f684SSatish Balay        self.snes.getKSP().getPC()
1955808f684SSatish Balay        self.snes.computeJacobian(x, J)
1965808f684SSatish Balay
1975808f684SSatish Balay    def testGetSetUpd(self):
1985808f684SSatish Balay        self.assertTrue(self.snes.getUpdate() is None)
1995808f684SSatish Balay        upd = lambda snes, it: None
2005808f684SSatish Balay        refcnt = getrefcount(upd)
2015808f684SSatish Balay        self.snes.setUpdate(upd)
2025808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt + 1)
2035808f684SSatish Balay        self.snes.setUpdate(upd)
2045808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt + 1)
2055808f684SSatish Balay        self.snes.setUpdate(None)
2065808f684SSatish Balay        self.assertTrue(self.snes.getUpdate() is None)
2075808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt)
2085808f684SSatish Balay        self.snes.setUpdate(upd)
2095808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt + 1)
2105808f684SSatish Balay        upd2 = lambda snes, it: None
2115808f684SSatish Balay        refcnt2 = getrefcount(upd2)
2125808f684SSatish Balay        self.snes.setUpdate(upd2)
2135808f684SSatish Balay        self.assertEqual(getrefcount(upd), refcnt)
2145808f684SSatish Balay        self.assertEqual(getrefcount(upd2), refcnt2 + 1)
2155808f684SSatish Balay        tmp = self.snes.getUpdate()[0]
2165808f684SSatish Balay        self.assertTrue(tmp is upd2)
2175808f684SSatish Balay        self.assertEqual(getrefcount(upd2), refcnt2 + 2)
2185808f684SSatish Balay        del tmp
2195808f684SSatish Balay        self.snes.setUpdate(None)
2205808f684SSatish Balay        self.assertTrue(self.snes.getUpdate() is None)
2215808f684SSatish Balay        self.assertEqual(getrefcount(upd2), refcnt2)
2225808f684SSatish Balay
2235808f684SSatish Balay    def testGetKSP(self):
2245808f684SSatish Balay        ksp = self.snes.getKSP()
2255808f684SSatish Balay        self.assertEqual(ksp.getRefCount(), 2)
2265808f684SSatish Balay
2275808f684SSatish Balay    def testSolve(self):
2285808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
2295808f684SSatish Balay        J.setSizes([2, 2])
2305808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
2315808f684SSatish Balay        J.setUp()
2325808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
2335808f684SSatish Balay        x = PETSc.Vec().createSeq(2)
2345808f684SSatish Balay        b = PETSc.Vec().createSeq(2)
235*0f621c1cSStefano Zampini        if self.snes.getType() == PETSc.SNES.Type.NEWTONAL:
236*0f621c1cSStefano Zampini            self.snes.setFunction(FunctionAL(), r)
237*0f621c1cSStefano Zampini            self.snes.setNewtonALCorrectionType(PETSc.SNES.NewtonALCorrectionType.EXACT)
238*0f621c1cSStefano Zampini            self.snes.setNewtonALFunction(FunctionALLoad())
239*0f621c1cSStefano Zampini        else:
2405808f684SSatish Balay            self.snes.setFunction(Function(), r)
2415808f684SSatish Balay        self.snes.setJacobian(Jacobian(), J)
2429ae6e6bbSStefano Zampini
2439ae6e6bbSStefano Zampini        def _update(snes, it, cnt):
2449ae6e6bbSStefano Zampini             cnt += 1
2459ae6e6bbSStefano Zampini        cnt_up = np.array(0)
2469ae6e6bbSStefano Zampini        self.snes.setUpdate(_update, (cnt_up,) )
2479ae6e6bbSStefano Zampini
2485808f684SSatish Balay        x.setArray([2, 3])
2495808f684SSatish Balay        b.set(0)
2505808f684SSatish Balay        self.snes.setConvergenceHistory()
2515808f684SSatish Balay        self.snes.setFromOptions()
2525808f684SSatish Balay        self.snes.solve(b, x)
2539ae6e6bbSStefano Zampini        self.snes.setUpdate(None)
2545808f684SSatish Balay        rh, ih = self.snes.getConvergenceHistory()
2555808f684SSatish Balay        self.snes.setConvergenceHistory(0, reset=True)
2565808f684SSatish Balay        rh, ih = self.snes.getConvergenceHistory()
2575808f684SSatish Balay        self.assertEqual(len(rh), 0)
2585808f684SSatish Balay        self.assertEqual(len(ih), 0)
259*0f621c1cSStefano Zampini        if self.snes.getType() != PETSc.SNES.Type.NEWTONAL:
260e0aaf7daSStefano Zampini            self.assertAlmostEqual(abs(x[0]), 1.0, places=5)
261e0aaf7daSStefano Zampini            self.assertAlmostEqual(abs(x[1]), 2.0, places=5)
2629ae6e6bbSStefano Zampini        self.assertEqual(self.snes.getIterationNumber(), cnt_up)
2635808f684SSatish Balay        # XXX this test should not be here !
2645808f684SSatish Balay        reason = self.snes.callConvergenceTest(1, 0, 0, 0)
2655808f684SSatish Balay        self.assertTrue(reason > 0)
2665808f684SSatish Balay
26741e867a5SStefano Zampini        # test interface
26841e867a5SStefano Zampini        x = self.snes.getSolution()
26941e867a5SStefano Zampini        x.setArray([2, 3])
27041e867a5SStefano Zampini        self.snes.solve()
271*0f621c1cSStefano Zampini        if self.snes.getType() != PETSc.SNES.Type.NEWTONAL:
27241e867a5SStefano Zampini            self.assertAlmostEqual(abs(x[0]), 1.0, places=5)
27341e867a5SStefano Zampini            self.assertAlmostEqual(abs(x[1]), 2.0, places=5)
27441e867a5SStefano Zampini
2755808f684SSatish Balay    def testResetAndSolve(self):
2765808f684SSatish Balay        self.snes.reset()
2775808f684SSatish Balay        self.testSolve()
2785808f684SSatish Balay        self.snes.reset()
2795808f684SSatish Balay        self.testSolve()
2805808f684SSatish Balay        self.snes.reset()
2815808f684SSatish Balay
2825808f684SSatish Balay    def testSetMonitor(self):
2835808f684SSatish Balay        reshist = {}
2846f336411SStefano Zampini
2855808f684SSatish Balay        def monitor(snes, its, fgnorm):
2865808f684SSatish Balay            reshist[its] = fgnorm
2876f336411SStefano Zampini
2885808f684SSatish Balay        refcnt = getrefcount(monitor)
2895808f684SSatish Balay        self.snes.setMonitor(monitor)
2905808f684SSatish Balay        self.assertEqual(getrefcount(monitor), refcnt + 1)
2915808f684SSatish Balay        self.testSolve()
2925808f684SSatish Balay        self.assertTrue(len(reshist) > 0)
2935808f684SSatish Balay        reshist = {}
2941dbd64e7SPierre Jolivet        self.snes.monitorCancel()
2955808f684SSatish Balay        self.assertEqual(getrefcount(monitor), refcnt)
2965808f684SSatish Balay        self.testSolve()
2975808f684SSatish Balay        self.assertTrue(len(reshist) == 0)
2985808f684SSatish Balay        self.snes.setMonitor(monitor)
2995808f684SSatish Balay        self.snes.monitor(1, 7)
3005808f684SSatish Balay        self.assertTrue(reshist[1] == 7)
3015808f684SSatish Balay        ## Monitor = PETSc.SNES.Monitor
3025808f684SSatish Balay        ## self.snes.setMonitor(Monitor())
3035808f684SSatish Balay        ## self.snes.setMonitor(Monitor.DEFAULT)
3045808f684SSatish Balay        ## self.snes.setMonitor(Monitor.SOLUTION)
3055808f684SSatish Balay        ## self.snes.setMonitor(Monitor.RESIDUAL)
3065808f684SSatish Balay        ## self.snes.setMonitor(Monitor.SOLUTION_UPDATE)
3075808f684SSatish Balay
3085808f684SSatish Balay    def testSetGetStepFails(self):
3095808f684SSatish Balay        its = self.snes.getIterationNumber()
3105808f684SSatish Balay        self.assertEqual(its, 0)
3115808f684SSatish Balay        fails = self.snes.getNonlinearStepFailures()
3125808f684SSatish Balay        self.assertEqual(fails, 0)
3135808f684SSatish Balay        fails = self.snes.getMaxNonlinearStepFailures()
3145808f684SSatish Balay        self.assertEqual(fails, 1)
3155808f684SSatish Balay        self.snes.setMaxNonlinearStepFailures(5)
3165808f684SSatish Balay        fails = self.snes.getMaxNonlinearStepFailures()
3175808f684SSatish Balay        self.assertEqual(fails, 5)
3185808f684SSatish Balay        self.snes.setMaxNonlinearStepFailures(1)
3195808f684SSatish Balay        fails = self.snes.getMaxNonlinearStepFailures()
3205808f684SSatish Balay        self.assertEqual(fails, 1)
3215808f684SSatish Balay
3225808f684SSatish Balay    def testSetGetLinFails(self):
3235808f684SSatish Balay        its = self.snes.getLinearSolveIterations()
3245808f684SSatish Balay        self.assertEqual(its, 0)
3255808f684SSatish Balay        fails = self.snes.getLinearSolveFailures()
3265808f684SSatish Balay        self.assertEqual(fails, 0)
3275808f684SSatish Balay        fails = self.snes.getMaxLinearSolveFailures()
3285808f684SSatish Balay        self.assertEqual(fails, 1)
3295808f684SSatish Balay        self.snes.setMaxLinearSolveFailures(5)
3305808f684SSatish Balay        fails = self.snes.getMaxLinearSolveFailures()
3315808f684SSatish Balay        self.assertEqual(fails, 5)
3325808f684SSatish Balay        self.snes.setMaxLinearSolveFailures(1)
3335808f684SSatish Balay        fails = self.snes.getMaxLinearSolveFailures()
3345808f684SSatish Balay        self.assertEqual(fails, 1)
3355808f684SSatish Balay
3365808f684SSatish Balay    def testEW(self):
3375808f684SSatish Balay        self.snes.setUseEW(False)
3385808f684SSatish Balay        self.assertFalse(self.snes.getUseEW())
3395808f684SSatish Balay        self.snes.setUseEW(True)
3405808f684SSatish Balay        self.assertTrue(self.snes.getUseEW())
3415808f684SSatish Balay        params = self.snes.getParamsEW()
3425808f684SSatish Balay        params['version'] = 1
3435808f684SSatish Balay        self.snes.setParamsEW(**params)
3445808f684SSatish Balay        params = self.snes.getParamsEW()
3455808f684SSatish Balay        self.assertEqual(params['version'], 1)
3463201ab8dSStefano Zampini        params['version'] = PETSc.CURRENT
3475808f684SSatish Balay        self.snes.setParamsEW(**params)
3485808f684SSatish Balay        params = self.snes.getParamsEW()
3495808f684SSatish Balay        self.assertEqual(params['version'], 1)
3505808f684SSatish Balay
3515808f684SSatish Balay    def testMF(self):
3525808f684SSatish Balay        # self.snes.setOptionsPrefix('MF-')
3535808f684SSatish Balay        # opts = PETSc.Options(self.snes)
3545808f684SSatish Balay        # opts['mat_mffd_type'] = 'ds'
3555808f684SSatish Balay        # opts['snes_monitor']  = 'stdout'
3565808f684SSatish Balay        # opts['ksp_monitor']   = 'stdout'
3575808f684SSatish Balay        # opts['snes_view']     = 'stdout'
3585808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
3595808f684SSatish Balay        J.setSizes([2, 2])
3605808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
3615808f684SSatish Balay        J.setUp()
3625808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
3635808f684SSatish Balay        x = PETSc.Vec().createSeq(2)
3645808f684SSatish Balay        b = PETSc.Vec().createSeq(2)
3655808f684SSatish Balay        fun = Function()
3665808f684SSatish Balay        jac = Jacobian()
3675808f684SSatish Balay        self.snes.setFunction(fun, r)
3685808f684SSatish Balay        self.snes.setJacobian(jac, J)
3695808f684SSatish Balay        self.assertFalse(self.snes.getUseMF())
3705808f684SSatish Balay        self.snes.setUseMF(False)
3715808f684SSatish Balay        self.assertFalse(self.snes.getUseMF())
3725808f684SSatish Balay        self.snes.setUseMF(True)
3735808f684SSatish Balay        self.assertTrue(self.snes.getUseMF())
3745808f684SSatish Balay        self.snes.setFromOptions()
375*0f621c1cSStefano Zampini        if self.snes.getType() == PETSc.SNES.Type.NEWTONLS:
3765808f684SSatish Balay            x.setArray([2, 3])
3775808f684SSatish Balay            b.set(0)
3785808f684SSatish Balay            self.snes.solve(b, x)
379e0aaf7daSStefano Zampini            self.assertAlmostEqual(abs(x[0]), 1.0, places=5)
380e0aaf7daSStefano Zampini            self.assertAlmostEqual(abs(x[1]), 2.0, places=5)
3815808f684SSatish Balay
3825808f684SSatish Balay    def testFDColor(self):
3835808f684SSatish Balay        J = PETSc.Mat().create(PETSc.COMM_SELF)
3845808f684SSatish Balay        J.setSizes([2, 2])
3855808f684SSatish Balay        J.setType(PETSc.Mat.Type.SEQAIJ)
3865808f684SSatish Balay        J.setUp()
3875808f684SSatish Balay        r = PETSc.Vec().createSeq(2)
3885808f684SSatish Balay        x = PETSc.Vec().createSeq(2)
3895808f684SSatish Balay        b = PETSc.Vec().createSeq(2)
3905808f684SSatish Balay        fun = Function()
3915808f684SSatish Balay        jac = Jacobian()
3925808f684SSatish Balay        self.snes.setFunction(fun, r)
3935808f684SSatish Balay        self.snes.setJacobian(jac, J)
3945808f684SSatish Balay        self.assertFalse(self.snes.getUseFD())
3955808f684SSatish Balay        jac(self.snes, x, J, J)
3965808f684SSatish Balay        self.snes.setUseFD(False)
3975808f684SSatish Balay        self.assertFalse(self.snes.getUseFD())
3985808f684SSatish Balay        self.snes.setUseFD(True)
3995808f684SSatish Balay        self.assertTrue(self.snes.getUseFD())
4005808f684SSatish Balay        self.snes.setFromOptions()
4015808f684SSatish Balay        x.setArray([2, 3])
4025808f684SSatish Balay        b.set(0)
4035808f684SSatish Balay        self.snes.solve(b, x)
404*0f621c1cSStefano Zampini        if self.snes.getType() != PETSc.SNES.Type.NEWTONAL:
4054a221d59SStefano Zampini            self.assertAlmostEqual(abs(x[0]), 1.0, places=4)
4064a221d59SStefano Zampini            self.assertAlmostEqual(abs(x[1]), 2.0, places=4)
4075808f684SSatish Balay
4089be84c52SStefano Zampini    def testNPC(self):
4099be84c52SStefano Zampini        self.snes.appctx = (1, 2, 3)
4109be84c52SStefano Zampini        npc = self.snes.getNPC()
4119be84c52SStefano Zampini        self.assertEqual(npc.appctx, (1, 2, 3))
4129be84c52SStefano Zampini
4133201ab8dSStefano Zampini    def testTRAPI(self):
4143201ab8dSStefano Zampini        newreg = (1,2,3)
4153201ab8dSStefano Zampini        newup = (1,2,3,4,5)
4163201ab8dSStefano Zampini        if self.snes.getType() == PETSc.SNES.Type.NEWTONTR:
4173201ab8dSStefano Zampini            defreg = self.snes.getTRTolerances()
4183201ab8dSStefano Zampini            defup = self.snes.getTRUpdateParameters()
4193201ab8dSStefano Zampini        self.snes.setTRTolerances(*newreg)
4203201ab8dSStefano Zampini        self.snes.setTRUpdateParameters(*newup)
4213201ab8dSStefano Zampini        if self.snes.getType() == PETSc.SNES.Type.NEWTONTR:
4223201ab8dSStefano Zampini            self.assertEqual(newreg, self.snes.getTRTolerances())
4233201ab8dSStefano Zampini            self.assertEqual(newup, self.snes.getTRUpdateParameters())
4243201ab8dSStefano Zampini        self.snes.setTRTolerances()
4253201ab8dSStefano Zampini        self.snes.setTRUpdateParameters()
4263201ab8dSStefano Zampini        if self.snes.getType() == PETSc.SNES.Type.NEWTONTR:
4273201ab8dSStefano Zampini            self.assertEqual(newreg, self.snes.getTRTolerances())
4283201ab8dSStefano Zampini            self.assertEqual(newup, self.snes.getTRUpdateParameters())
4293201ab8dSStefano Zampini        self.snes.setTRTolerances(*(PETSc.DETERMINE,)*3)
4303201ab8dSStefano Zampini        self.snes.setTRUpdateParameters(*(PETSc.DETERMINE,)*5)
4313201ab8dSStefano Zampini        if self.snes.getType() == PETSc.SNES.Type.NEWTONTR:
4323201ab8dSStefano Zampini            self.assertEqual(defreg, self.snes.getTRTolerances())
4333201ab8dSStefano Zampini            self.assertEqual(defup, self.snes.getTRUpdateParameters())
4346f336411SStefano Zampini
4355808f684SSatish Balay# --------------------------------------------------------------------
4365808f684SSatish Balay
4376f336411SStefano Zampini
4385808f684SSatish Balayclass TestSNESLS(BaseTestSNES, unittest.TestCase):
4395808f684SSatish Balay    SNES_TYPE = PETSc.SNES.Type.NEWTONLS
4405808f684SSatish Balay
4416f336411SStefano Zampini
4425808f684SSatish Balayclass TestSNESTR(BaseTestSNES, unittest.TestCase):
4435808f684SSatish Balay    SNES_TYPE = PETSc.SNES.Type.NEWTONTR
4445808f684SSatish Balay
4456f336411SStefano Zampini
446*0f621c1cSStefano Zampiniclass TestSNESAL(BaseTestSNES, unittest.TestCase):
447*0f621c1cSStefano Zampini    SNES_TYPE = PETSc.SNES.Type.NEWTONAL
448*0f621c1cSStefano Zampini
449*0f621c1cSStefano Zampini
4505808f684SSatish Balay# --------------------------------------------------------------------
4515808f684SSatish Balay
452bc7287b7SStefano Zampini
453bc7287b7SStefano Zampiniclass TestSNESLineSearchAPI(unittest.TestCase):
454bc7287b7SStefano Zampini    def test_create_destroy(self):
455bc7287b7SStefano Zampini        ls = PETSc.SNESLineSearch()
456bc7287b7SStefano Zampini        ls.create()
457bc7287b7SStefano Zampini        ls.destroy()
458bc7287b7SStefano Zampini
459bc7287b7SStefano Zampini    def test_type_set_get(self):
460bc7287b7SStefano Zampini        ls = PETSc.SNESLineSearch().create()
461bc7287b7SStefano Zampini        ls.setType(PETSc.SNESLineSearch.Type.BASIC)
462bc7287b7SStefano Zampini        typ = ls.getType()
463bc7287b7SStefano Zampini        self.assertEqual(typ, 'basic')
464bc7287b7SStefano Zampini        ls.destroy()
465bc7287b7SStefano Zampini
466bc7287b7SStefano Zampini    def test_tolerances_set_get(self):
467bc7287b7SStefano Zampini        ls = PETSc.SNESLineSearch().create()
468bc7287b7SStefano Zampini        ls.setTolerances(rtol=0.125, atol=3, minstep=4, ltol=5, maxstep=6, max_its=7)
469bc7287b7SStefano Zampini        minstep, maxstep, rtol, atol, ltol, max_its = ls.getTolerances()
470bc7287b7SStefano Zampini        self.assertEqual(rtol, 0.125)
471bc7287b7SStefano Zampini        self.assertEqual(atol, 3)
472bc7287b7SStefano Zampini        self.assertEqual(minstep, 4)
473bc7287b7SStefano Zampini        self.assertEqual(ltol, 5)
474bc7287b7SStefano Zampini        self.assertEqual(maxstep, 6)
475bc7287b7SStefano Zampini        self.assertEqual(max_its, 7)
476bc7287b7SStefano Zampini        ls.destroy()
477bc7287b7SStefano Zampini
478bc7287b7SStefano Zampini    def test_order_set_get(self):
479bc7287b7SStefano Zampini        ls = PETSc.SNESLineSearch().create()
480bc7287b7SStefano Zampini        ls.setOrder(2)
481bc7287b7SStefano Zampini        order = ls.getOrder()
482bc7287b7SStefano Zampini        self.assertEqual(order, 2)
483bc7287b7SStefano Zampini        ls.destroy()
484bc7287b7SStefano Zampini
485bc7287b7SStefano Zampini    def test_set_from_options(self):
486bc7287b7SStefano Zampini        ls = PETSc.SNESLineSearch().create()
487bc7287b7SStefano Zampini        ls.setFromOptions()
488bc7287b7SStefano Zampini        # ls.view()
489bc7287b7SStefano Zampini        ls.destroy()
490bc7287b7SStefano Zampini
491bc7287b7SStefano Zampini    def test_snes_linesearch_property(self):
492bc7287b7SStefano Zampini        snes = PETSc.SNES().create()
493bc7287b7SStefano Zampini        ls = snes.getLineSearch()
494bc7287b7SStefano Zampini        self.assertTrue(isinstance(ls, PETSc.SNESLineSearch))
495bc7287b7SStefano Zampini        # Set/get via property
496bc7287b7SStefano Zampini        self.assertEqual(snes.linesearch, ls)
497bc7287b7SStefano Zampini        snes.linesearch = ls
498bc7287b7SStefano Zampini        self.assertEqual(snes.linesearch, ls)
499bc7287b7SStefano Zampini        snes.destroy()
500bc7287b7SStefano Zampini
501bc7287b7SStefano Zampini
502bc7287b7SStefano Zampini# --------------------------------------------------------------------
503bc7287b7SStefano Zampini
5045808f684SSatish Balayif __name__ == '__main__':
5055808f684SSatish Balay    unittest.main()
506