15808f684SSatish Balay# -------------------------------------------------------------------- 25808f684SSatish Balay 35808f684SSatish Balayfrom petsc4py import PETSc 45808f684SSatish Balayimport unittest 55808f684SSatish Balayfrom sys import getrefcount 6e0aaf7daSStefano Zampiniimport numpy 75808f684SSatish Balay 85808f684SSatish Balay# -------------------------------------------------------------------- 95808f684SSatish Balay 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 165808f684SSatish Balayclass Jacobian: 175808f684SSatish Balay def __call__(self, snes, x, J, P): 185808f684SSatish Balay P[0,0] = (2.0*x[0] + x[1]).item() 195808f684SSatish Balay P[0,1] = (x[0]).item() 205808f684SSatish Balay P[1,0] = (x[1]).item() 215808f684SSatish Balay P[1,1] = (x[0] + 2.0*x[1]).item() 225808f684SSatish Balay P.assemble() 235808f684SSatish Balay if J != P: J.assemble() 245808f684SSatish Balay 255808f684SSatish Balay# -------------------------------------------------------------------- 265808f684SSatish Balay 275808f684SSatish Balayclass BaseTestSNES(object): 285808f684SSatish Balay 295808f684SSatish Balay SNES_TYPE = None 305808f684SSatish Balay 315808f684SSatish Balay def setUp(self): 325808f684SSatish Balay snes = PETSc.SNES() 335808f684SSatish Balay snes.create(PETSc.COMM_SELF) 345808f684SSatish Balay if self.SNES_TYPE: 355808f684SSatish Balay snes.setType(self.SNES_TYPE) 365808f684SSatish Balay self.snes = snes 375808f684SSatish Balay 385808f684SSatish Balay def tearDown(self): 395808f684SSatish Balay self.snes = None 405808f684SSatish Balay 415808f684SSatish Balay def testGetSetType(self): 425808f684SSatish Balay self.assertEqual(self.snes.getType(), self.SNES_TYPE) 435808f684SSatish Balay self.snes.setType(self.SNES_TYPE) 445808f684SSatish Balay self.assertEqual(self.snes.getType(), self.SNES_TYPE) 455808f684SSatish Balay 465808f684SSatish Balay def testTols(self): 475808f684SSatish Balay tols = self.snes.getTolerances() 485808f684SSatish Balay self.snes.setTolerances(*tols) 495808f684SSatish Balay tnames = ('rtol', 'atol','stol', 'max_it') 505808f684SSatish Balay tolvals = [getattr(self.snes, t) for t in tnames] 515808f684SSatish Balay self.assertEqual(tuple(tols), tuple(tolvals)) 525808f684SSatish Balay 535808f684SSatish Balay def testProperties(self): 545808f684SSatish Balay snes = self.snes 555808f684SSatish Balay # 565808f684SSatish Balay snes.appctx = (1,2,3) 575808f684SSatish Balay self.assertEqual(snes.appctx, (1,2,3)) 585808f684SSatish Balay snes.appctx = None 595808f684SSatish Balay self.assertEqual(snes.appctx, None) 605808f684SSatish Balay # 615808f684SSatish Balay snes.its = 1 625808f684SSatish Balay self.assertEqual(snes.its, 1) 635808f684SSatish Balay snes.its = 0 645808f684SSatish Balay self.assertEqual(snes.its, 0) 655808f684SSatish Balay # 665808f684SSatish Balay snes.norm = 1 675808f684SSatish Balay self.assertEqual(snes.norm, 1) 685808f684SSatish Balay snes.norm = 0 695808f684SSatish Balay self.assertEqual(snes.norm, 0) 705808f684SSatish Balay # 715808f684SSatish Balay rh, ih = snes.history 725808f684SSatish Balay self.assertTrue(len(rh)==0) 735808f684SSatish Balay self.assertTrue(len(ih)==0) 745808f684SSatish Balay # 755808f684SSatish Balay reason = PETSc.SNES.ConvergedReason.CONVERGED_ITS 765808f684SSatish Balay snes.reason = reason 775808f684SSatish Balay self.assertEqual(snes.reason, reason) 785808f684SSatish Balay self.assertTrue(snes.converged) 795808f684SSatish Balay self.assertFalse(snes.diverged) 805808f684SSatish Balay self.assertFalse(snes.iterating) 815808f684SSatish Balay reason = PETSc.SNES.ConvergedReason.DIVERGED_MAX_IT 825808f684SSatish Balay snes.reason = reason 835808f684SSatish Balay self.assertEqual(snes.reason, reason) 845808f684SSatish Balay self.assertFalse(snes.converged) 855808f684SSatish Balay self.assertTrue(snes.diverged) 865808f684SSatish Balay self.assertFalse(snes.iterating) 875808f684SSatish Balay reason = PETSc.SNES.ConvergedReason.CONVERGED_ITERATING 885808f684SSatish Balay snes.reason = reason 895808f684SSatish Balay self.assertEqual(snes.reason, reason) 905808f684SSatish Balay self.assertFalse(snes.converged) 915808f684SSatish Balay self.assertFalse(snes.diverged) 925808f684SSatish Balay self.assertTrue(snes.iterating) 935808f684SSatish Balay # 945808f684SSatish Balay self.assertFalse(snes.use_ew) 955808f684SSatish Balay self.assertFalse(snes.use_mf) 965808f684SSatish Balay self.assertFalse(snes.use_fd) 975808f684SSatish Balay 985808f684SSatish Balay def testGetSetFunc(self): 995808f684SSatish Balay r, func = self.snes.getFunction() 1005808f684SSatish Balay self.assertFalse(r) 1015808f684SSatish Balay self.assertTrue(func is None) 1025808f684SSatish Balay r = PETSc.Vec().createSeq(2) 1035808f684SSatish Balay func = Function() 1045808f684SSatish Balay refcnt = getrefcount(func) 1055808f684SSatish Balay self.snes.setFunction(func, r) 1065808f684SSatish Balay self.snes.setFunction(func, r) 1075808f684SSatish Balay self.assertEqual(getrefcount(func), refcnt + 1) 1085808f684SSatish Balay r2, func2 = self.snes.getFunction() 1095808f684SSatish Balay self.assertEqual(r, r2) 1105808f684SSatish Balay self.assertEqual(func, func2[0]) 1115808f684SSatish Balay self.assertEqual(getrefcount(func), refcnt + 1) 1125808f684SSatish Balay r3, func3 = self.snes.getFunction() 1135808f684SSatish Balay self.assertEqual(r, r3) 1145808f684SSatish Balay self.assertEqual(func, func3[0]) 1155808f684SSatish Balay self.assertEqual(getrefcount(func), refcnt + 1) 1165808f684SSatish Balay 1175808f684SSatish Balay def testCompFunc(self): 1185808f684SSatish Balay r = PETSc.Vec().createSeq(2) 1195808f684SSatish Balay func = Function() 1205808f684SSatish Balay self.snes.setFunction(func, r) 1215808f684SSatish Balay x, y = r.duplicate(), r.duplicate() 1225808f684SSatish Balay x[0], x[1] = [1, 2] 1235808f684SSatish Balay self.snes.computeFunction(x, y) 124e0aaf7daSStefano Zampini self.assertAlmostEqual(abs(y[0]), 0.0, places=5) 125e0aaf7daSStefano Zampini self.assertAlmostEqual(abs(y[1]), 0.0, places=5) 1265808f684SSatish Balay 1275808f684SSatish Balay def testGetSetJac(self): 1285808f684SSatish Balay A, P, jac = self.snes.getJacobian() 1295808f684SSatish Balay self.assertFalse(A) 1305808f684SSatish Balay self.assertFalse(P) 1315808f684SSatish Balay self.assertTrue(jac is None) 1325808f684SSatish Balay J = PETSc.Mat().create(PETSc.COMM_SELF) 1335808f684SSatish Balay J.setSizes([2,2]) 1345808f684SSatish Balay J.setType(PETSc.Mat.Type.SEQAIJ) 1355808f684SSatish Balay J.setUp() 1365808f684SSatish Balay jac = Jacobian() 1375808f684SSatish Balay refcnt = getrefcount(jac) 1385808f684SSatish Balay self.snes.setJacobian(jac, J) 1395808f684SSatish Balay self.snes.setJacobian(jac, J) 1405808f684SSatish Balay self.assertEqual(getrefcount(jac), refcnt + 1) 1415808f684SSatish Balay J2, P2, jac2 = self.snes.getJacobian() 1425808f684SSatish Balay self.assertEqual(J, J2) 1435808f684SSatish Balay self.assertEqual(J2, P2) 1445808f684SSatish Balay self.assertEqual(jac, jac2[0]) 1455808f684SSatish Balay self.assertEqual(getrefcount(jac), refcnt + 1) 1465808f684SSatish Balay J3, P3, jac3 = self.snes.getJacobian() 1475808f684SSatish Balay self.assertEqual(J, J3) 1485808f684SSatish Balay self.assertEqual(J3, P3) 1495808f684SSatish Balay self.assertEqual(jac, jac3[0]) 1505808f684SSatish Balay self.assertEqual(getrefcount(jac), refcnt + 1) 1515808f684SSatish Balay 1525808f684SSatish Balay def testCompJac(self): 1535808f684SSatish Balay J = PETSc.Mat().create(PETSc.COMM_SELF) 1545808f684SSatish Balay J.setSizes([2,2]) 1555808f684SSatish Balay J.setType(PETSc.Mat.Type.SEQAIJ) 1565808f684SSatish Balay J.setUp() 1575808f684SSatish Balay jac = Jacobian() 1585808f684SSatish Balay self.snes.setJacobian(jac, J) 1595808f684SSatish Balay x = PETSc.Vec().createSeq(2) 1605808f684SSatish Balay x[0], x[1] = [1, 2] 1615808f684SSatish Balay self.snes.getKSP().getPC() 1625808f684SSatish Balay self.snes.computeJacobian(x, J) 1635808f684SSatish Balay 1645808f684SSatish Balay def testGetSetUpd(self): 1655808f684SSatish Balay self.assertTrue(self.snes.getUpdate() is None) 1665808f684SSatish Balay upd = lambda snes, it: None 1675808f684SSatish Balay refcnt = getrefcount(upd) 1685808f684SSatish Balay self.snes.setUpdate(upd) 1695808f684SSatish Balay self.assertEqual(getrefcount(upd), refcnt + 1) 1705808f684SSatish Balay self.snes.setUpdate(upd) 1715808f684SSatish Balay self.assertEqual(getrefcount(upd), refcnt + 1) 1725808f684SSatish Balay self.snes.setUpdate(None) 1735808f684SSatish Balay self.assertTrue(self.snes.getUpdate() is None) 1745808f684SSatish Balay self.assertEqual(getrefcount(upd), refcnt) 1755808f684SSatish Balay self.snes.setUpdate(upd) 1765808f684SSatish Balay self.assertEqual(getrefcount(upd), refcnt + 1) 1775808f684SSatish Balay upd2 = lambda snes, it: None 1785808f684SSatish Balay refcnt2 = getrefcount(upd2) 1795808f684SSatish Balay self.snes.setUpdate(upd2) 1805808f684SSatish Balay self.assertEqual(getrefcount(upd), refcnt) 1815808f684SSatish Balay self.assertEqual(getrefcount(upd2), refcnt2 + 1) 1825808f684SSatish Balay tmp = self.snes.getUpdate()[0] 1835808f684SSatish Balay self.assertTrue(tmp is upd2) 1845808f684SSatish Balay self.assertEqual(getrefcount(upd2), refcnt2 + 2) 1855808f684SSatish Balay del tmp 1865808f684SSatish Balay self.snes.setUpdate(None) 1875808f684SSatish Balay self.assertTrue(self.snes.getUpdate() is None) 1885808f684SSatish Balay self.assertEqual(getrefcount(upd2), refcnt2) 1895808f684SSatish Balay 1905808f684SSatish Balay def testGetKSP(self): 1915808f684SSatish Balay ksp = self.snes.getKSP() 1925808f684SSatish Balay self.assertEqual(ksp.getRefCount(), 2) 1935808f684SSatish Balay 1945808f684SSatish Balay def testSolve(self): 1955808f684SSatish Balay J = PETSc.Mat().create(PETSc.COMM_SELF) 1965808f684SSatish Balay J.setSizes([2,2]) 1975808f684SSatish Balay J.setType(PETSc.Mat.Type.SEQAIJ) 1985808f684SSatish Balay J.setUp() 1995808f684SSatish Balay r = PETSc.Vec().createSeq(2) 2005808f684SSatish Balay x = PETSc.Vec().createSeq(2) 2015808f684SSatish Balay b = PETSc.Vec().createSeq(2) 2025808f684SSatish Balay self.snes.setFunction(Function(), r) 2035808f684SSatish Balay self.snes.setJacobian(Jacobian(), J) 2045808f684SSatish Balay x.setArray([2,3]) 2055808f684SSatish Balay b.set(0) 2065808f684SSatish Balay self.snes.setConvergenceHistory() 2075808f684SSatish Balay self.snes.setFromOptions() 2085808f684SSatish Balay self.snes.solve(b, x) 2095808f684SSatish Balay rh, ih = self.snes.getConvergenceHistory() 2105808f684SSatish Balay self.snes.setConvergenceHistory(0, reset=True) 2115808f684SSatish Balay rh, ih = self.snes.getConvergenceHistory() 2125808f684SSatish Balay self.assertEqual(len(rh), 0) 2135808f684SSatish Balay self.assertEqual(len(ih), 0) 214e0aaf7daSStefano Zampini self.assertAlmostEqual(abs(x[0]), 1.0, places=5) 215e0aaf7daSStefano Zampini self.assertAlmostEqual(abs(x[1]), 2.0, places=5) 2165808f684SSatish Balay # XXX this test should not be here ! 2175808f684SSatish Balay reason = self.snes.callConvergenceTest(1, 0, 0, 0) 2185808f684SSatish Balay self.assertTrue(reason > 0) 2195808f684SSatish Balay 220*41e867a5SStefano Zampini # test interface 221*41e867a5SStefano Zampini x = self.snes.getSolution() 222*41e867a5SStefano Zampini x.setArray([2,3]) 223*41e867a5SStefano Zampini self.snes.solve() 224*41e867a5SStefano Zampini self.assertAlmostEqual(abs(x[0]), 1.0, places=5) 225*41e867a5SStefano Zampini self.assertAlmostEqual(abs(x[1]), 2.0, places=5) 226*41e867a5SStefano Zampini 2275808f684SSatish Balay def testResetAndSolve(self): 2285808f684SSatish Balay self.snes.reset() 2295808f684SSatish Balay self.testSolve() 2305808f684SSatish Balay self.snes.reset() 2315808f684SSatish Balay self.testSolve() 2325808f684SSatish Balay self.snes.reset() 2335808f684SSatish Balay 2345808f684SSatish Balay def testSetMonitor(self): 2355808f684SSatish Balay reshist = {} 2365808f684SSatish Balay def monitor(snes, its, fgnorm): 2375808f684SSatish Balay reshist[its] = fgnorm 2385808f684SSatish Balay refcnt = getrefcount(monitor) 2395808f684SSatish Balay self.snes.setMonitor(monitor) 2405808f684SSatish Balay self.assertEqual(getrefcount(monitor), refcnt + 1) 2415808f684SSatish Balay self.testSolve() 2425808f684SSatish Balay self.assertTrue(len(reshist) > 0) 2435808f684SSatish Balay reshist = {} 2441dbd64e7SPierre Jolivet self.snes.monitorCancel() 2455808f684SSatish Balay self.assertEqual(getrefcount(monitor), refcnt) 2465808f684SSatish Balay self.testSolve() 2475808f684SSatish Balay self.assertTrue(len(reshist) == 0) 2485808f684SSatish Balay self.snes.setMonitor(monitor) 2495808f684SSatish Balay self.snes.monitor(1, 7) 2505808f684SSatish Balay self.assertTrue(reshist[1] == 7) 2515808f684SSatish Balay ## Monitor = PETSc.SNES.Monitor 2525808f684SSatish Balay ## self.snes.setMonitor(Monitor()) 2535808f684SSatish Balay ## self.snes.setMonitor(Monitor.DEFAULT) 2545808f684SSatish Balay ## self.snes.setMonitor(Monitor.SOLUTION) 2555808f684SSatish Balay ## self.snes.setMonitor(Monitor.RESIDUAL) 2565808f684SSatish Balay ## self.snes.setMonitor(Monitor.SOLUTION_UPDATE) 2575808f684SSatish Balay 2585808f684SSatish Balay def testSetGetStepFails(self): 2595808f684SSatish Balay its = self.snes.getIterationNumber() 2605808f684SSatish Balay self.assertEqual(its, 0) 2615808f684SSatish Balay fails = self.snes.getNonlinearStepFailures() 2625808f684SSatish Balay self.assertEqual(fails, 0) 2635808f684SSatish Balay fails = self.snes.getMaxNonlinearStepFailures() 2645808f684SSatish Balay self.assertEqual(fails, 1) 2655808f684SSatish Balay self.snes.setMaxNonlinearStepFailures(5) 2665808f684SSatish Balay fails = self.snes.getMaxNonlinearStepFailures() 2675808f684SSatish Balay self.assertEqual(fails, 5) 2685808f684SSatish Balay self.snes.setMaxNonlinearStepFailures(1) 2695808f684SSatish Balay fails = self.snes.getMaxNonlinearStepFailures() 2705808f684SSatish Balay self.assertEqual(fails, 1) 2715808f684SSatish Balay 2725808f684SSatish Balay def testSetGetLinFails(self): 2735808f684SSatish Balay its = self.snes.getLinearSolveIterations() 2745808f684SSatish Balay self.assertEqual(its, 0) 2755808f684SSatish Balay fails = self.snes.getLinearSolveFailures() 2765808f684SSatish Balay self.assertEqual(fails, 0) 2775808f684SSatish Balay fails = self.snes.getMaxLinearSolveFailures() 2785808f684SSatish Balay self.assertEqual(fails, 1) 2795808f684SSatish Balay self.snes.setMaxLinearSolveFailures(5) 2805808f684SSatish Balay fails = self.snes.getMaxLinearSolveFailures() 2815808f684SSatish Balay self.assertEqual(fails, 5) 2825808f684SSatish Balay self.snes.setMaxLinearSolveFailures(1) 2835808f684SSatish Balay fails = self.snes.getMaxLinearSolveFailures() 2845808f684SSatish Balay self.assertEqual(fails, 1) 2855808f684SSatish Balay 2865808f684SSatish Balay def testEW(self): 2875808f684SSatish Balay self.snes.setUseEW(False) 2885808f684SSatish Balay self.assertFalse(self.snes.getUseEW()) 2895808f684SSatish Balay self.snes.setUseEW(True) 2905808f684SSatish Balay self.assertTrue(self.snes.getUseEW()) 2915808f684SSatish Balay params = self.snes.getParamsEW() 2925808f684SSatish Balay params['version'] = 1 2935808f684SSatish Balay self.snes.setParamsEW(**params) 2945808f684SSatish Balay params = self.snes.getParamsEW() 2955808f684SSatish Balay self.assertEqual(params['version'], 1) 2965808f684SSatish Balay params['version'] = PETSc.DEFAULT 2975808f684SSatish Balay self.snes.setParamsEW(**params) 2985808f684SSatish Balay params = self.snes.getParamsEW() 2995808f684SSatish Balay self.assertEqual(params['version'], 1) 3005808f684SSatish Balay 3015808f684SSatish Balay def testMF(self): 3025808f684SSatish Balay #self.snes.setOptionsPrefix('MF-') 3035808f684SSatish Balay #opts = PETSc.Options(self.snes) 3045808f684SSatish Balay #opts['mat_mffd_type'] = 'ds' 3055808f684SSatish Balay #opts['snes_monitor'] = 'stdout' 3065808f684SSatish Balay #opts['ksp_monitor'] = 'stdout' 3075808f684SSatish Balay #opts['snes_view'] = 'stdout' 3085808f684SSatish Balay J = PETSc.Mat().create(PETSc.COMM_SELF) 3095808f684SSatish Balay J.setSizes([2,2]) 3105808f684SSatish Balay J.setType(PETSc.Mat.Type.SEQAIJ) 3115808f684SSatish Balay J.setUp() 3125808f684SSatish Balay r = PETSc.Vec().createSeq(2) 3135808f684SSatish Balay x = PETSc.Vec().createSeq(2) 3145808f684SSatish Balay b = PETSc.Vec().createSeq(2) 3155808f684SSatish Balay fun = Function() 3165808f684SSatish Balay jac = Jacobian() 3175808f684SSatish Balay self.snes.setFunction(fun, r) 3185808f684SSatish Balay self.snes.setJacobian(jac, J) 3195808f684SSatish Balay self.assertFalse(self.snes.getUseMF()) 3205808f684SSatish Balay self.snes.setUseMF(False) 3215808f684SSatish Balay self.assertFalse(self.snes.getUseMF()) 3225808f684SSatish Balay self.snes.setUseMF(True) 3235808f684SSatish Balay self.assertTrue(self.snes.getUseMF()) 3245808f684SSatish Balay self.snes.setFromOptions() 3255808f684SSatish Balay x.setArray([2,3]) 3265808f684SSatish Balay b.set(0) 3275808f684SSatish Balay self.snes.solve(b, x) 328e0aaf7daSStefano Zampini self.assertAlmostEqual(abs(x[0]), 1.0, places=5) 329e0aaf7daSStefano Zampini self.assertAlmostEqual(abs(x[1]), 2.0, places=5) 3305808f684SSatish Balay 3315808f684SSatish Balay def testFDColor(self): 3325808f684SSatish Balay J = PETSc.Mat().create(PETSc.COMM_SELF) 3335808f684SSatish Balay J.setSizes([2,2]) 3345808f684SSatish Balay J.setType(PETSc.Mat.Type.SEQAIJ) 3355808f684SSatish Balay J.setUp() 3365808f684SSatish Balay r = PETSc.Vec().createSeq(2) 3375808f684SSatish Balay x = PETSc.Vec().createSeq(2) 3385808f684SSatish Balay b = PETSc.Vec().createSeq(2) 3395808f684SSatish Balay fun = Function() 3405808f684SSatish Balay jac = Jacobian() 3415808f684SSatish Balay self.snes.setFunction(fun, r) 3425808f684SSatish Balay self.snes.setJacobian(jac, J) 3435808f684SSatish Balay self.assertFalse(self.snes.getUseFD()) 3445808f684SSatish Balay jac(self.snes, x, J, J) 3455808f684SSatish Balay self.snes.setUseFD(False) 3465808f684SSatish Balay self.assertFalse(self.snes.getUseFD()) 3475808f684SSatish Balay self.snes.setUseFD(True) 3485808f684SSatish Balay self.assertTrue(self.snes.getUseFD()) 3495808f684SSatish Balay self.snes.setFromOptions() 3505808f684SSatish Balay x.setArray([2,3]) 3515808f684SSatish Balay b.set(0) 3525808f684SSatish Balay self.snes.solve(b, x) 353e0aaf7daSStefano Zampini self.assertAlmostEqual(abs(x[0]), 1.0, places=5) 354e0aaf7daSStefano Zampini self.assertAlmostEqual(abs(x[1]), 2.0, places=5) 3555808f684SSatish Balay 3565808f684SSatish Balay# -------------------------------------------------------------------- 3575808f684SSatish Balay 3585808f684SSatish Balayclass TestSNESLS(BaseTestSNES, unittest.TestCase): 3595808f684SSatish Balay SNES_TYPE = PETSc.SNES.Type.NEWTONLS 3605808f684SSatish Balay 3615808f684SSatish Balayclass TestSNESTR(BaseTestSNES, unittest.TestCase): 3625808f684SSatish Balay SNES_TYPE = PETSc.SNES.Type.NEWTONTR 3635808f684SSatish Balay 3645808f684SSatish Balay# -------------------------------------------------------------------- 3655808f684SSatish Balay 3665808f684SSatish Balayif __name__ == '__main__': 3675808f684SSatish Balay unittest.main() 368