xref: /petsc/src/binding/petsc4py/test/test_ts.py (revision 552edb6364df478b294b3111f33a8f37ca096b20)
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