15808f684SSatish Balayimport unittest 25808f684SSatish Balayfrom petsc4py import PETSc 35808f684SSatish Balay 45808f684SSatish Balay# -------------------------------------------------------------------- 55808f684SSatish Balay 6*6f336411SStefano Zampini 75808f684SSatish Balayclass MyODE: 85808f684SSatish Balay """ 95808f684SSatish Balay du/dt + u**2 = 0; 105808f684SSatish Balay u0,u1,u2 = 1,2,3 115808f684SSatish Balay """ 12*6f336411SStefano Zampini 135808f684SSatish Balay def __init__(self): 145808f684SSatish Balay self.rhsfunction_calls = 0 155808f684SSatish Balay self.rhsjacobian_calls = 0 165808f684SSatish Balay self.ifunction_calls = 0 175808f684SSatish Balay self.ijacobian_calls = 0 185808f684SSatish Balay self.presolve_calls = 0 195808f684SSatish Balay self.update_calls = 0 205808f684SSatish Balay self.postsolve_calls = 0 215808f684SSatish Balay self.monitor_calls = 0 225808f684SSatish Balay 235808f684SSatish Balay def rhsfunction(self, ts, t, u, F): 245808f684SSatish Balay # print ('MyODE.rhsfunction()') 255808f684SSatish Balay self.rhsfunction_calls += 1 265808f684SSatish Balay f = -(u * u) 275808f684SSatish Balay f.copy(F) 285808f684SSatish Balay 295808f684SSatish Balay def rhsjacobian(self, ts, t, u, J, P): 305808f684SSatish Balay # print ('MyODE.rhsjacobian()') 315808f684SSatish Balay self.rhsjacobian_calls += 1 325808f684SSatish Balay P.zeroEntries() 335808f684SSatish Balay diag = -2 * u 345808f684SSatish Balay P.setDiagonal(diag) 355808f684SSatish Balay P.assemble() 36*6f336411SStefano Zampini if J != P: 37*6f336411SStefano Zampini J.assemble() 385808f684SSatish Balay return True # same_nz 395808f684SSatish Balay 405808f684SSatish Balay def ifunction(self, ts, t, u, du, F): 415808f684SSatish Balay # print ('MyODE.ifunction()') 425808f684SSatish Balay self.ifunction_calls += 1 435808f684SSatish Balay f = du + u * u 445808f684SSatish Balay f.copy(F) 455808f684SSatish Balay 465808f684SSatish Balay def ijacobian(self, ts, t, u, du, a, J, P): 475808f684SSatish Balay # print ('MyODE.ijacobian()') 485808f684SSatish Balay self.ijacobian_calls += 1 495808f684SSatish Balay P.zeroEntries() 505808f684SSatish Balay diag = a + 2 * u 515808f684SSatish Balay P.setDiagonal(diag) 525808f684SSatish Balay P.assemble() 53*6f336411SStefano Zampini if J != P: 54*6f336411SStefano Zampini J.assemble() 555808f684SSatish Balay return True # same_nz 565808f684SSatish Balay 575808f684SSatish Balay def monitor(self, ts, s, t, u): 585808f684SSatish Balay self.monitor_calls += 1 59*6f336411SStefano Zampini # dt = ts.time_step 60*6f336411SStefano Zampini # ut = ts.vec_sol.norm() 615808f684SSatish Balay # prn = PETSc.Sys.Print 625808f684SSatish Balay # prn('TS: step %2d, T:%f, dT:%f, u:%f' % (s,t,dt,ut)) 635808f684SSatish Balay 645808f684SSatish Balay 65*6f336411SStefano Zampiniclass BaseTestTSNonlinear: 665808f684SSatish Balay TYPE = None 675808f684SSatish Balay 685808f684SSatish Balay def setUp(self): 695808f684SSatish Balay self.ts = PETSc.TS().create(PETSc.COMM_SELF) 705808f684SSatish Balay eft = PETSc.TS.ExactFinalTime.STEPOVER 715808f684SSatish Balay self.ts.setExactFinalTime(eft) 725808f684SSatish Balay ptype = PETSc.TS.ProblemType.NONLINEAR 735808f684SSatish Balay self.ts.setProblemType(ptype) 745808f684SSatish Balay self.ts.setType(self.TYPE) 755808f684SSatish Balay if PETSc.ScalarType().dtype.char in 'fF': 765808f684SSatish Balay snes = self.ts.getSNES() 775808f684SSatish Balay snes.setTolerances(rtol=1e-6) 785808f684SSatish Balay 795808f684SSatish Balay def tearDown(self): 805808f684SSatish Balay self.ts = None 8162e5d2d2SJDBetteridge PETSc.garbage_cleanup() 825808f684SSatish Balay 835808f684SSatish Balay 845808f684SSatish Balayclass BaseTestTSNonlinearRHS(BaseTestTSNonlinear): 85*6f336411SStefano Zampini def testSolveRHS(self, nullsol=False): 865808f684SSatish Balay ts = self.ts 875808f684SSatish Balay dct = self.ts.getDict() 885808f684SSatish Balay self.assertTrue(dct is not None) 89*6f336411SStefano Zampini self.assertTrue(isinstance(dct, dict)) 905808f684SSatish Balay 915808f684SSatish Balay ode = MyODE() 925808f684SSatish Balay J = PETSc.Mat().create(ts.comm) 93*6f336411SStefano Zampini J.setSizes(3) 945808f684SSatish Balay J.setFromOptions() 955808f684SSatish Balay J.setUp() 965808f684SSatish Balay u, f = J.createVecs() 975808f684SSatish Balay 985808f684SSatish Balay ts.setAppCtx(ode) 995808f684SSatish Balay ts.setRHSFunction(ode.rhsfunction, f) 1005808f684SSatish Balay ts.setRHSJacobian(ode.rhsjacobian, J, J) 1015808f684SSatish Balay ts.setMonitor(ode.monitor) 1025808f684SSatish Balay 1035808f684SSatish Balay ts.snes.ksp.pc.setType('none') 1045808f684SSatish Balay 1055808f684SSatish Balay T0, dT, nT = 0.00, 0.1, 10 1065808f684SSatish Balay T = T0 + nT * dT 1075808f684SSatish Balay ts.setTime(T0) 1085808f684SSatish Balay ts.setTimeStep(dT) 1095808f684SSatish Balay ts.setMaxTime(T) 1105808f684SSatish Balay ts.setMaxSteps(nT) 1115808f684SSatish Balay ts.setFromOptions() 1125808f684SSatish Balay u[0], u[1], u[2] = 1, 2, 3 113*6f336411SStefano Zampini if nullsol: 114*6f336411SStefano Zampini ts.setSolution(u) 115*6f336411SStefano Zampini ts.solve() 116*6f336411SStefano Zampini else: 1175808f684SSatish Balay ts.solve(u) 1185808f684SSatish Balay 1195808f684SSatish Balay self.assertTrue(ode.rhsfunction_calls > 0) 1205808f684SSatish Balay self.assertTrue(ode.rhsjacobian_calls > 0) 1215808f684SSatish Balay 1225808f684SSatish Balay dct = self.ts.getDict() 1235808f684SSatish Balay self.assertTrue('__appctx__' in dct) 1245808f684SSatish Balay self.assertTrue('__rhsfunction__' in dct) 1255808f684SSatish Balay self.assertTrue('__rhsjacobian__' in dct) 1265808f684SSatish Balay self.assertTrue('__monitor__' in dct) 1275808f684SSatish Balay 1285808f684SSatish Balay n = ode.monitor_calls 1295808f684SSatish Balay ts.monitor(ts.step_number, ts.time) 1305808f684SSatish Balay self.assertEqual(ode.monitor_calls, n + 1) 1315808f684SSatish Balay n = ode.monitor_calls 1321dbd64e7SPierre Jolivet ts.monitorCancel() 1335808f684SSatish Balay ts.monitor(ts.step_number, ts.time) 1345808f684SSatish Balay self.assertEqual(ode.monitor_calls, n) 1355808f684SSatish Balay 1365808f684SSatish Balay def testFDColorRHS(self): 1375808f684SSatish Balay ts = self.ts 1385808f684SSatish Balay ode = MyODE() 1395808f684SSatish Balay J = PETSc.Mat().create(ts.comm) 140*6f336411SStefano Zampini J.setSizes(5) 141*6f336411SStefano Zampini J.setType('aij') 1425808f684SSatish Balay J.setPreallocationNNZ(nnz=1) 1435808f684SSatish Balay u, f = J.createVecs() 1445808f684SSatish Balay 1455808f684SSatish Balay ts.setAppCtx(ode) 1465808f684SSatish Balay ts.setRHSFunction(ode.rhsfunction, f) 1475808f684SSatish Balay ts.setRHSJacobian(ode.rhsjacobian, J, J) 1485808f684SSatish Balay ts.setMonitor(ode.monitor) 1495808f684SSatish Balay 1505808f684SSatish Balay T0, dT, nT = 0.00, 0.1, 10 1515808f684SSatish Balay T = T0 + nT * dT 1525808f684SSatish Balay ts.setTime(T0) 1535808f684SSatish Balay ts.setTimeStep(dT) 1545808f684SSatish Balay ts.setMaxTime(T) 1555808f684SSatish Balay ts.setMaxSteps(nT) 1565808f684SSatish Balay ts.setFromOptions() 1575808f684SSatish Balay u[0], u[1], u[2] = 1, 2, 3 1585808f684SSatish Balay 1595808f684SSatish Balay ts.setSolution(u) 1605808f684SSatish Balay ode.rhsjacobian(ts, 0, u, J, J) 1615808f684SSatish Balay ts.setUp() 1625808f684SSatish Balay ts.snes.setUseFD(True) 1635808f684SSatish Balay ts.solve(u) 1645808f684SSatish Balay 1655808f684SSatish Balay def testResetAndSolveRHS(self): 1665808f684SSatish Balay self.ts.reset() 1675808f684SSatish Balay self.ts.setStepNumber(0) 1685808f684SSatish Balay self.testSolveRHS() 1695808f684SSatish Balay self.ts.reset() 1705808f684SSatish Balay self.ts.setStepNumber(0) 1715808f684SSatish Balay self.testSolveRHS() 1725808f684SSatish Balay self.ts.reset() 173*6f336411SStefano Zampini self.ts.setStepNumber(0) 174*6f336411SStefano Zampini self.testSolveRHS(nullsol=True) 175*6f336411SStefano Zampini self.ts.reset() 176*6f336411SStefano Zampini 1775808f684SSatish Balay 1785808f684SSatish Balayclass BaseTestTSNonlinearI(BaseTestTSNonlinear): 1795808f684SSatish Balay def testSolveI(self): 1805808f684SSatish Balay ts = self.ts 1815808f684SSatish Balay dct = self.ts.getDict() 1825808f684SSatish Balay self.assertTrue(dct is not None) 183*6f336411SStefano Zampini self.assertTrue(isinstance(dct, dict)) 1845808f684SSatish Balay 1855808f684SSatish Balay ode = MyODE() 1865808f684SSatish Balay J = PETSc.Mat().create(ts.comm) 187*6f336411SStefano Zampini J.setSizes(3) 1885808f684SSatish Balay J.setFromOptions() 1895808f684SSatish Balay J.setUp() 1905808f684SSatish Balay u, f = J.createVecs() 1915808f684SSatish Balay 1925808f684SSatish Balay ts.setAppCtx(ode) 1935808f684SSatish Balay ts.setIFunction(ode.ifunction, f) 1945808f684SSatish Balay ts.setIJacobian(ode.ijacobian, J, J) 1955808f684SSatish Balay ts.setMonitor(ode.monitor) 1965808f684SSatish Balay 1975808f684SSatish Balay ts.snes.ksp.pc.setType('none') 1985808f684SSatish Balay 1995808f684SSatish Balay T0, dT, nT = 0.00, 0.1, 10 2005808f684SSatish Balay T = T0 + nT * dT 2015808f684SSatish Balay ts.setTime(T0) 2025808f684SSatish Balay ts.setTimeStep(dT) 2035808f684SSatish Balay ts.setMaxTime(T) 2045808f684SSatish Balay ts.setMaxSteps(nT) 2055808f684SSatish Balay ts.setFromOptions() 2065808f684SSatish Balay u[0], u[1], u[2] = 1, 2, 3 2075808f684SSatish Balay ts.solve(u) 2085808f684SSatish Balay 2095808f684SSatish Balay self.assertTrue(ode.ifunction_calls > 0) 2105808f684SSatish Balay self.assertTrue(ode.ijacobian_calls > 0) 2115808f684SSatish Balay 2125808f684SSatish Balay dct = self.ts.getDict() 2135808f684SSatish Balay self.assertTrue('__appctx__' in dct) 2145808f684SSatish Balay self.assertTrue('__ifunction__' in dct) 2155808f684SSatish Balay self.assertTrue('__ijacobian__' in dct) 2165808f684SSatish Balay self.assertTrue('__monitor__' in dct) 2175808f684SSatish Balay 2185808f684SSatish Balay n = ode.monitor_calls 2195808f684SSatish Balay ts.monitor(ts.step_number, ts.time) 2205808f684SSatish Balay self.assertEqual(ode.monitor_calls, n + 1) 2215808f684SSatish Balay n = ode.monitor_calls 2221dbd64e7SPierre Jolivet ts.monitorCancel() 2235808f684SSatish Balay ts.monitor(ts.step_number, ts.time) 2245808f684SSatish Balay self.assertEqual(ode.monitor_calls, n) 2255808f684SSatish Balay 2265808f684SSatish Balay def testFDColorI(self): 2275808f684SSatish Balay ts = self.ts 2285808f684SSatish Balay ode = MyODE() 2295808f684SSatish Balay J = PETSc.Mat().create(ts.comm) 230*6f336411SStefano Zampini J.setSizes(5) 231*6f336411SStefano Zampini J.setType('aij') 2325808f684SSatish Balay J.setPreallocationNNZ(nnz=1) 2335808f684SSatish Balay J.setFromOptions() 2345808f684SSatish Balay u, f = J.createVecs() 2355808f684SSatish Balay 2365808f684SSatish Balay ts.setAppCtx(ode) 2375808f684SSatish Balay ts.setIFunction(ode.ifunction, f) 2385808f684SSatish Balay ts.setIJacobian(ode.ijacobian, J, J) 2395808f684SSatish Balay ts.setMonitor(ode.monitor) 2405808f684SSatish Balay 2415808f684SSatish Balay T0, dT, nT = 0.00, 0.1, 10 2425808f684SSatish Balay T = T0 + nT * dT 2435808f684SSatish Balay ts.setTime(T0) 2445808f684SSatish Balay ts.setTimeStep(dT) 2455808f684SSatish Balay ts.setMaxTime(T) 2465808f684SSatish Balay ts.setMaxSteps(nT) 2475808f684SSatish Balay ts.setFromOptions() 2485808f684SSatish Balay u[0], u[1], u[2] = 1, 2, 3 2495808f684SSatish Balay 2505808f684SSatish Balay ts.setSolution(u) 2515808f684SSatish Balay ode.ijacobian(ts, 0, u, 0 * u, 1, J, J) 2525808f684SSatish Balay ts.setUp() 2535808f684SSatish Balay ts.snes.setUseFD(True) 2545808f684SSatish Balay ts.solve(u) 2555808f684SSatish Balay 2565808f684SSatish Balay def testResetAndSolveI(self): 2575808f684SSatish Balay self.ts.reset() 2585808f684SSatish Balay self.ts.setStepNumber(0) 2595808f684SSatish Balay self.testSolveI() 2605808f684SSatish Balay self.ts.reset() 2615808f684SSatish Balay self.ts.setStepNumber(0) 2625808f684SSatish Balay self.testSolveI() 2635808f684SSatish Balay self.ts.reset() 2645808f684SSatish Balay 265*6f336411SStefano Zampini 266*6f336411SStefano Zampiniclass TestTSBeuler(BaseTestTSNonlinearRHS, BaseTestTSNonlinearI, unittest.TestCase): 2675808f684SSatish Balay TYPE = PETSc.TS.Type.BEULER 2685808f684SSatish Balay 269*6f336411SStefano Zampini 270*6f336411SStefano Zampiniclass TestTSCN(BaseTestTSNonlinearRHS, BaseTestTSNonlinearI, unittest.TestCase): 2715808f684SSatish Balay TYPE = PETSc.TS.Type.CN 2725808f684SSatish Balay 273*6f336411SStefano Zampini 274*6f336411SStefano Zampiniclass TestTSTheta(BaseTestTSNonlinearRHS, BaseTestTSNonlinearI, unittest.TestCase): 2755808f684SSatish Balay TYPE = PETSc.TS.Type.THETA 2765808f684SSatish Balay 277*6f336411SStefano Zampini 278*6f336411SStefano Zampiniclass TestTSAlpha(BaseTestTSNonlinearRHS, BaseTestTSNonlinearI, unittest.TestCase): 2795808f684SSatish Balay TYPE = PETSc.TS.Type.ALPHA 2805808f684SSatish Balay 281*6f336411SStefano Zampini 2825808f684SSatish Balay# -------------------------------------------------------------------- 2835808f684SSatish Balay 2845808f684SSatish Balayif __name__ == '__main__': 2855808f684SSatish Balay unittest.main() 2865808f684SSatish Balay 2875808f684SSatish Balay# -------------------------------------------------------------------- 288