xref: /petsc/src/binding/petsc4py/test/test_ts.py (revision 62e5d2d2208a68fdbd23dac44110783534664de8)
15808f684SSatish Balayimport unittest
25808f684SSatish Balayfrom petsc4py import PETSc
35808f684SSatish Balayfrom sys import getrefcount
45808f684SSatish Balay
55808f684SSatish Balay# --------------------------------------------------------------------
65808f684SSatish Balay
75808f684SSatish Balayclass MyODE:
85808f684SSatish Balay    """
95808f684SSatish Balay    du/dt + u**2 = 0;
105808f684SSatish Balay    u0,u1,u2 = 1,2,3
115808f684SSatish Balay    """
125808f684SSatish Balay    def __init__(self):
135808f684SSatish Balay        self.rhsfunction_calls = 0
145808f684SSatish Balay        self.rhsjacobian_calls = 0
155808f684SSatish Balay        self.ifunction_calls = 0
165808f684SSatish Balay        self.ijacobian_calls = 0
175808f684SSatish Balay        self.presolve_calls = 0
185808f684SSatish Balay        self.update_calls = 0
195808f684SSatish Balay        self.postsolve_calls = 0
205808f684SSatish Balay        self.monitor_calls = 0
215808f684SSatish Balay
225808f684SSatish Balay    def rhsfunction(self,ts,t,u,F):
235808f684SSatish Balay        # print ('MyODE.rhsfunction()')
245808f684SSatish Balay        self.rhsfunction_calls += 1
255808f684SSatish Balay        f = -(u * u)
265808f684SSatish Balay        f.copy(F)
275808f684SSatish Balay
285808f684SSatish Balay    def rhsjacobian(self,ts,t,u,J,P):
295808f684SSatish Balay        # print ('MyODE.rhsjacobian()')
305808f684SSatish Balay        self.rhsjacobian_calls += 1
315808f684SSatish Balay        P.zeroEntries()
325808f684SSatish Balay        diag = -2 * u
335808f684SSatish Balay        P.setDiagonal(diag)
345808f684SSatish Balay        P.assemble()
355808f684SSatish Balay        if J != P: J.assemble()
365808f684SSatish Balay        return True # same_nz
375808f684SSatish Balay
385808f684SSatish Balay    def ifunction(self,ts,t,u,du,F):
395808f684SSatish Balay        # print ('MyODE.ifunction()')
405808f684SSatish Balay        self.ifunction_calls += 1
415808f684SSatish Balay        f = du + u * u
425808f684SSatish Balay        f.copy(F)
435808f684SSatish Balay
445808f684SSatish Balay    def ijacobian(self,ts,t,u,du,a,J,P):
455808f684SSatish Balay        # print ('MyODE.ijacobian()')
465808f684SSatish Balay        self.ijacobian_calls += 1
475808f684SSatish Balay        P.zeroEntries()
485808f684SSatish Balay        diag = a + 2 * u
495808f684SSatish Balay        P.setDiagonal(diag)
505808f684SSatish Balay        P.assemble()
515808f684SSatish Balay        if J != P: J.assemble()
525808f684SSatish Balay        return True # same_nz
535808f684SSatish Balay
545808f684SSatish Balay    def monitor(self, ts, s, t, u):
555808f684SSatish Balay        self.monitor_calls += 1
565808f684SSatish Balay        dt = ts.time_step
575808f684SSatish Balay        ut  = ts.vec_sol.norm()
585808f684SSatish Balay        #prn = PETSc.Sys.Print
595808f684SSatish Balay        #prn('TS: step %2d, T:%f, dT:%f, u:%f' % (s,t,dt,ut))
605808f684SSatish Balay
615808f684SSatish Balay
625808f684SSatish Balayclass BaseTestTSNonlinear(object):
635808f684SSatish Balay
645808f684SSatish Balay    TYPE = None
655808f684SSatish Balay
665808f684SSatish Balay    def setUp(self):
675808f684SSatish Balay        self.ts = PETSc.TS().create(PETSc.COMM_SELF)
685808f684SSatish Balay        eft = PETSc.TS.ExactFinalTime.STEPOVER
695808f684SSatish Balay        self.ts.setExactFinalTime(eft)
705808f684SSatish Balay        ptype = PETSc.TS.ProblemType.NONLINEAR
715808f684SSatish Balay        self.ts.setProblemType(ptype)
725808f684SSatish Balay        self.ts.setType(self.TYPE)
735808f684SSatish Balay        if PETSc.ScalarType().dtype.char in 'fF':
745808f684SSatish Balay            snes = self.ts.getSNES()
755808f684SSatish Balay            snes.setTolerances(rtol=1e-6)
765808f684SSatish Balay
775808f684SSatish Balay    def tearDown(self):
785808f684SSatish Balay        self.ts = None
79*62e5d2d2SJDBetteridge        PETSc.garbage_cleanup()
805808f684SSatish Balay
815808f684SSatish Balay
825808f684SSatish Balayclass BaseTestTSNonlinearRHS(BaseTestTSNonlinear):
835808f684SSatish Balay
845808f684SSatish Balay    def testSolveRHS(self):
855808f684SSatish Balay        ts = self.ts
865808f684SSatish Balay        dct = self.ts.getDict()
875808f684SSatish Balay        self.assertTrue(dct is not None)
885808f684SSatish Balay        self.assertTrue(type(dct) is dict)
895808f684SSatish Balay
905808f684SSatish Balay        ode = MyODE()
915808f684SSatish Balay        J = PETSc.Mat().create(ts.comm)
925808f684SSatish Balay        J.setSizes(3);
935808f684SSatish Balay        J.setFromOptions()
945808f684SSatish Balay        J.setUp()
955808f684SSatish Balay        u, f = J.createVecs()
965808f684SSatish Balay
975808f684SSatish Balay        ts.setAppCtx(ode)
985808f684SSatish Balay        ts.setRHSFunction(ode.rhsfunction, f)
995808f684SSatish Balay        ts.setRHSJacobian(ode.rhsjacobian, J, J)
1005808f684SSatish Balay        ts.setMonitor(ode.monitor)
1015808f684SSatish Balay
1025808f684SSatish Balay        ts.snes.ksp.pc.setType('none')
1035808f684SSatish Balay
1045808f684SSatish Balay        T0, dT, nT = 0.00, 0.1, 10
1055808f684SSatish Balay        T = T0 + nT*dT
1065808f684SSatish Balay        ts.setTime(T0)
1075808f684SSatish Balay        ts.setTimeStep(dT)
1085808f684SSatish Balay        ts.setMaxTime(T)
1095808f684SSatish Balay        ts.setMaxSteps(nT)
1105808f684SSatish Balay        ts.setFromOptions()
1115808f684SSatish Balay        u[0], u[1], u[2] = 1, 2, 3
1125808f684SSatish Balay        ts.solve(u)
1135808f684SSatish Balay
1145808f684SSatish Balay        self.assertTrue(ode.rhsfunction_calls > 0)
1155808f684SSatish Balay        self.assertTrue(ode.rhsjacobian_calls > 0)
1165808f684SSatish Balay
1175808f684SSatish Balay        dct = self.ts.getDict()
1185808f684SSatish Balay        self.assertTrue('__appctx__'      in dct)
1195808f684SSatish Balay        self.assertTrue('__rhsfunction__' in dct)
1205808f684SSatish Balay        self.assertTrue('__rhsjacobian__' in dct)
1215808f684SSatish Balay        self.assertTrue('__monitor__'     in dct)
1225808f684SSatish Balay
1235808f684SSatish Balay        n = ode.monitor_calls
1245808f684SSatish Balay        ts.monitor(ts.step_number, ts.time)
1255808f684SSatish Balay        self.assertEqual(ode.monitor_calls, n+1)
1265808f684SSatish Balay        n = ode.monitor_calls
1271dbd64e7SPierre Jolivet        ts.monitorCancel()
1285808f684SSatish Balay        ts.monitor(ts.step_number, ts.time)
1295808f684SSatish Balay        self.assertEqual(ode.monitor_calls, n)
1305808f684SSatish Balay
1315808f684SSatish Balay    def testFDColorRHS(self):
1325808f684SSatish Balay        ts = self.ts
1335808f684SSatish Balay        ode = MyODE()
1345808f684SSatish Balay        J = PETSc.Mat().create(ts.comm)
1355808f684SSatish Balay        J.setSizes(5); J.setType('aij')
1365808f684SSatish Balay        J.setPreallocationNNZ(nnz=1)
1375808f684SSatish Balay        u, f = J.createVecs()
1385808f684SSatish Balay
1395808f684SSatish Balay        ts.setAppCtx(ode)
1405808f684SSatish Balay        ts.setRHSFunction(ode.rhsfunction, f)
1415808f684SSatish Balay        ts.setRHSJacobian(ode.rhsjacobian, J, J)
1425808f684SSatish Balay        ts.setMonitor(ode.monitor)
1435808f684SSatish Balay
1445808f684SSatish Balay        T0, dT, nT = 0.00, 0.1, 10
1455808f684SSatish Balay        T = T0 + nT*dT
1465808f684SSatish Balay        ts.setTime(T0)
1475808f684SSatish Balay        ts.setTimeStep(dT)
1485808f684SSatish Balay        ts.setMaxTime(T)
1495808f684SSatish Balay        ts.setMaxSteps(nT)
1505808f684SSatish Balay        ts.setFromOptions()
1515808f684SSatish Balay        u[0], u[1], u[2] = 1, 2, 3
1525808f684SSatish Balay
1535808f684SSatish Balay        ts.setSolution(u)
1545808f684SSatish Balay        ode.rhsjacobian(ts,0,u,J,J)
1555808f684SSatish Balay        ts.setUp()
1565808f684SSatish Balay        ts.snes.setUseFD(True)
1575808f684SSatish Balay        ts.solve(u)
1585808f684SSatish Balay
1595808f684SSatish Balay    def testResetAndSolveRHS(self):
1605808f684SSatish Balay        self.ts.reset()
1615808f684SSatish Balay        self.ts.setStepNumber(0)
1625808f684SSatish Balay        self.testSolveRHS()
1635808f684SSatish Balay        self.ts.reset()
1645808f684SSatish Balay        self.ts.setStepNumber(0)
1655808f684SSatish Balay        self.testSolveRHS()
1665808f684SSatish Balay        self.ts.reset()
1675808f684SSatish Balay
1685808f684SSatish Balayclass BaseTestTSNonlinearI(BaseTestTSNonlinear):
1695808f684SSatish Balay
1705808f684SSatish Balay    def testSolveI(self):
1715808f684SSatish Balay        ts = self.ts
1725808f684SSatish Balay        dct = self.ts.getDict()
1735808f684SSatish Balay        self.assertTrue(dct is not None)
1745808f684SSatish Balay        self.assertTrue(type(dct) is dict)
1755808f684SSatish Balay
1765808f684SSatish Balay        ode = MyODE()
1775808f684SSatish Balay        J = PETSc.Mat().create(ts.comm)
1785808f684SSatish Balay        J.setSizes(3);
1795808f684SSatish Balay        J.setFromOptions()
1805808f684SSatish Balay        J.setUp()
1815808f684SSatish Balay        u, f = J.createVecs()
1825808f684SSatish Balay
1835808f684SSatish Balay        ts.setAppCtx(ode)
1845808f684SSatish Balay        ts.setIFunction(ode.ifunction, f)
1855808f684SSatish Balay        ts.setIJacobian(ode.ijacobian, J, J)
1865808f684SSatish Balay        ts.setMonitor(ode.monitor)
1875808f684SSatish Balay
1885808f684SSatish Balay        ts.snes.ksp.pc.setType('none')
1895808f684SSatish Balay
1905808f684SSatish Balay        T0, dT, nT = 0.00, 0.1, 10
1915808f684SSatish Balay        T = T0 + nT*dT
1925808f684SSatish Balay        ts.setTime(T0)
1935808f684SSatish Balay        ts.setTimeStep(dT)
1945808f684SSatish Balay        ts.setMaxTime(T)
1955808f684SSatish Balay        ts.setMaxSteps(nT)
1965808f684SSatish Balay        ts.setFromOptions()
1975808f684SSatish Balay        u[0], u[1], u[2] = 1, 2, 3
1985808f684SSatish Balay        ts.solve(u)
1995808f684SSatish Balay
2005808f684SSatish Balay        self.assertTrue(ode.ifunction_calls > 0)
2015808f684SSatish Balay        self.assertTrue(ode.ijacobian_calls > 0)
2025808f684SSatish Balay
2035808f684SSatish Balay        dct = self.ts.getDict()
2045808f684SSatish Balay        self.assertTrue('__appctx__'      in dct)
2055808f684SSatish Balay        self.assertTrue('__ifunction__' in dct)
2065808f684SSatish Balay        self.assertTrue('__ijacobian__' in dct)
2075808f684SSatish Balay        self.assertTrue('__monitor__'     in dct)
2085808f684SSatish Balay
2095808f684SSatish Balay        n = ode.monitor_calls
2105808f684SSatish Balay        ts.monitor(ts.step_number, ts.time)
2115808f684SSatish Balay        self.assertEqual(ode.monitor_calls, n+1)
2125808f684SSatish Balay        n = ode.monitor_calls
2131dbd64e7SPierre Jolivet        ts.monitorCancel()
2145808f684SSatish Balay        ts.monitor(ts.step_number, ts.time)
2155808f684SSatish Balay        self.assertEqual(ode.monitor_calls, n)
2165808f684SSatish Balay
2175808f684SSatish Balay    def testFDColorI(self):
2185808f684SSatish Balay        ts = self.ts
2195808f684SSatish Balay        ode = MyODE()
2205808f684SSatish Balay        J = PETSc.Mat().create(ts.comm)
2215808f684SSatish Balay        J.setSizes(5); J.setType('aij')
2225808f684SSatish Balay        J.setPreallocationNNZ(nnz=1)
2235808f684SSatish Balay        J.setFromOptions()
2245808f684SSatish Balay        u, f = J.createVecs()
2255808f684SSatish Balay
2265808f684SSatish Balay        ts.setAppCtx(ode)
2275808f684SSatish Balay        ts.setIFunction(ode.ifunction, f)
2285808f684SSatish Balay        ts.setIJacobian(ode.ijacobian, J, J)
2295808f684SSatish Balay        ts.setMonitor(ode.monitor)
2305808f684SSatish Balay
2315808f684SSatish Balay        T0, dT, nT = 0.00, 0.1, 10
2325808f684SSatish Balay        T = T0 + nT*dT
2335808f684SSatish Balay        ts.setTime(T0)
2345808f684SSatish Balay        ts.setTimeStep(dT)
2355808f684SSatish Balay        ts.setMaxTime(T)
2365808f684SSatish Balay        ts.setMaxSteps(nT)
2375808f684SSatish Balay        ts.setFromOptions()
2385808f684SSatish Balay        u[0], u[1], u[2] = 1, 2, 3
2395808f684SSatish Balay
2405808f684SSatish Balay        ts.setSolution(u)
2415808f684SSatish Balay        ode.ijacobian(ts,0,u,0*u,1,J,J)
2425808f684SSatish Balay        ts.setUp()
2435808f684SSatish Balay        ts.snes.setUseFD(True)
2445808f684SSatish Balay        ts.solve(u)
2455808f684SSatish Balay
2465808f684SSatish Balay    def testResetAndSolveI(self):
2475808f684SSatish Balay        self.ts.reset()
2485808f684SSatish Balay        self.ts.setStepNumber(0)
2495808f684SSatish Balay        self.testSolveI()
2505808f684SSatish Balay        self.ts.reset()
2515808f684SSatish Balay        self.ts.setStepNumber(0)
2525808f684SSatish Balay        self.testSolveI()
2535808f684SSatish Balay        self.ts.reset()
2545808f684SSatish Balay
2555808f684SSatish Balayclass TestTSBeuler(BaseTestTSNonlinearRHS,BaseTestTSNonlinearI,
2565808f684SSatish Balay                   unittest.TestCase):
2575808f684SSatish Balay    TYPE = PETSc.TS.Type.BEULER
2585808f684SSatish Balay
2595808f684SSatish Balayclass TestTSCN(BaseTestTSNonlinearRHS,BaseTestTSNonlinearI,
2605808f684SSatish Balay               unittest.TestCase):
2615808f684SSatish Balay    TYPE = PETSc.TS.Type.CN
2625808f684SSatish Balay
2635808f684SSatish Balayclass TestTSTheta(BaseTestTSNonlinearRHS, BaseTestTSNonlinearI,
2645808f684SSatish Balay                  unittest.TestCase):
2655808f684SSatish Balay    TYPE = PETSc.TS.Type.THETA
2665808f684SSatish Balay
2675808f684SSatish Balayclass TestTSAlpha(BaseTestTSNonlinearRHS, BaseTestTSNonlinearI,
2685808f684SSatish Balay                  unittest.TestCase):
2695808f684SSatish Balay    TYPE = PETSc.TS.Type.ALPHA
2705808f684SSatish Balay
2715808f684SSatish Balay# --------------------------------------------------------------------
2725808f684SSatish Balay
2735808f684SSatish Balayif __name__ == '__main__':
2745808f684SSatish Balay    unittest.main()
2755808f684SSatish Balay
2765808f684SSatish Balay# --------------------------------------------------------------------
277