xref: /petsc/src/binding/petsc4py/test/test_ts_py.py (revision 4af29056ff6d5a2f682866a63f48c315c8d58c44)
15808f684SSatish Balayimport unittest
25808f684SSatish Balayfrom petsc4py import PETSc
35808f684SSatish Balayfrom sys import getrefcount
45808f684SSatish Balayimport gc
55808f684SSatish Balay
65808f684SSatish Balay# --------------------------------------------------------------------
75808f684SSatish Balay
85808f684SSatish Balayclass MyODE:
95808f684SSatish Balay    """
105808f684SSatish Balay    du/dt + u**2 = 0;
115808f684SSatish Balay    u0 = 1
125808f684SSatish Balay    """
135808f684SSatish Balay
145808f684SSatish Balay    def __init__(self):
155808f684SSatish Balay        self.function_calls = 0
165808f684SSatish Balay        self.jacobian_calls = 0
175808f684SSatish Balay
185808f684SSatish Balay    def function(self,ts,t,u,du,F):
195808f684SSatish Balay        #print 'MyODE.function()'
205808f684SSatish Balay        self.function_calls += 1
215808f684SSatish Balay        f = du + u * u
225808f684SSatish Balay        f.copy(F)
235808f684SSatish Balay
245808f684SSatish Balay    def jacobian(self,ts,t,u,du,a,J,P):
255808f684SSatish Balay        #print 'MyODE.jacobian()'
265808f684SSatish Balay        self.jacobian_calls += 1
275808f684SSatish Balay        P.zeroEntries()
285808f684SSatish Balay        diag = a + 2 * u
295808f684SSatish Balay        P.setDiagonal(diag)
305808f684SSatish Balay        P.assemble()
315808f684SSatish Balay        if J != P: J.assemble()
325808f684SSatish Balay        return False # same_nz
335808f684SSatish Balay
345808f684SSatish Balayclass MyTS:
355808f684SSatish Balay    def __init__(self):
365808f684SSatish Balay        self.log = {}
375808f684SSatish Balay    def _log(self, method, *args):
385808f684SSatish Balay        self.log.setdefault(method, 0)
395808f684SSatish Balay        self.log[method] += 1
405808f684SSatish Balay
415808f684SSatish Balay    def create(self, ts, *args):
425808f684SSatish Balay        self._log('create', *args)
435808f684SSatish Balay        self.vec_update = PETSc.Vec()
445808f684SSatish Balay
455808f684SSatish Balay    def destroy(self, ts, *args):
465808f684SSatish Balay        self._log('destroy', *args)
475808f684SSatish Balay        self.vec_update.destroy()
485808f684SSatish Balay
495808f684SSatish Balay    def setFromOptions(self, ts, *args):
505808f684SSatish Balay        self._log('setFromOptions', *args)
515808f684SSatish Balay
525808f684SSatish Balay    def setUp(self, ts, *args):
535808f684SSatish Balay        self._log('setUp', ts, *args)
545808f684SSatish Balay        self.vec_update = ts.getSolution().duplicate()
555808f684SSatish Balay
565808f684SSatish Balay    def reset(self, ts, *args):
575808f684SSatish Balay        self._log('reset', ts, *args)
585808f684SSatish Balay
595808f684SSatish Balay    def solveStep(self, ts, t, u, *args):
605808f684SSatish Balay        self._log('solveStep', ts, t, u, *args)
615808f684SSatish Balay        ts.snes.solve(None, u)
625808f684SSatish Balay
635808f684SSatish Balay    def adaptStep(self, ts, t, u, *args):
645808f684SSatish Balay        self._log('adaptStep', ts, t, u, *args)
655808f684SSatish Balay        return (ts.getTimeStep(), True)
665808f684SSatish Balay
675808f684SSatish Balay
685808f684SSatish Balayclass TestTSPython(unittest.TestCase):
695808f684SSatish Balay
705808f684SSatish Balay    def setUp(self):
715808f684SSatish Balay        self.ts = PETSc.TS()
725808f684SSatish Balay        self.ts.createPython(MyTS(), comm=PETSc.COMM_SELF)
735808f684SSatish Balay        eft = PETSc.TS.ExactFinalTime.STEPOVER
745808f684SSatish Balay        self.ts.setExactFinalTime(eft)
755808f684SSatish Balay        ctx = self.ts.getPythonContext()
765808f684SSatish Balay        self.assertEqual(getrefcount(ctx),  3)
775808f684SSatish Balay        self.assertEqual(ctx.log['create'], 1)
785808f684SSatish Balay        self.nsolve = 0
795808f684SSatish Balay
805808f684SSatish Balay    def tearDown(self):
815808f684SSatish Balay        ctx = self.ts.getPythonContext()
825808f684SSatish Balay        self.assertEqual(getrefcount(ctx), 3)
835808f684SSatish Balay        self.assertTrue('destroy' not in ctx.log)
845808f684SSatish Balay        self.ts.destroy() # XXX
855808f684SSatish Balay        self.ts = None
865808f684SSatish Balay        self.assertEqual(ctx.log['destroy'], 1)
875808f684SSatish Balay        self.assertEqual(getrefcount(ctx),   2)
885808f684SSatish Balay
895808f684SSatish Balay    def testSolve(self):
905808f684SSatish Balay        ts = self.ts
915808f684SSatish Balay        ts.setProblemType(ts.ProblemType.NONLINEAR)
925808f684SSatish Balay        ode = MyODE()
935808f684SSatish Balay        J = PETSc.Mat().create(ts.comm)
945808f684SSatish Balay        J.setSizes(3);
955808f684SSatish Balay        J.setFromOptions()
965808f684SSatish Balay        J.setUp()
975808f684SSatish Balay        u, f = J.createVecs()
985808f684SSatish Balay
995808f684SSatish Balay        ts.setAppCtx(ode)
1005808f684SSatish Balay        ts.setIFunction(ode.function, f)
1015808f684SSatish Balay        ts.setIJacobian(ode.jacobian, J, J)
1025808f684SSatish Balay        ts.snes.ksp.pc.setType('none')
1035808f684SSatish Balay
1045808f684SSatish Balay        T0, dT, nT = 0.0, 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        self.nsolve +=1
1145808f684SSatish Balay
1155808f684SSatish Balay        self.assertTrue(ode.function_calls > 0)
1165808f684SSatish Balay        self.assertTrue(ode.jacobian_calls > 0)
1175808f684SSatish Balay
1185808f684SSatish Balay        ctx = self.ts.getPythonContext()
1195808f684SSatish Balay        ncalls = self.nsolve * ts.step_number
1205808f684SSatish Balay        self.assertTrue(ctx.log['solveStep'] == ncalls)
1215808f684SSatish Balay        self.assertTrue(ctx.log['adaptStep'] == ncalls)
1225808f684SSatish Balay        del ctx
1235808f684SSatish Balay
1245808f684SSatish Balay        dct = self.ts.getDict()
1255808f684SSatish Balay        self.assertTrue('__appctx__'    in dct)
1265808f684SSatish Balay        self.assertTrue('__ifunction__' in dct)
1275808f684SSatish Balay        self.assertTrue('__ijacobian__' in dct)
1285808f684SSatish Balay
1295808f684SSatish Balay    def testFDColor(self):
1305808f684SSatish Balay        #
1315808f684SSatish Balay        ts = self.ts
1325808f684SSatish Balay        ts.setProblemType(ts.ProblemType.NONLINEAR)
1335808f684SSatish Balay        ode = MyODE()
1345808f684SSatish Balay        J = PETSc.Mat().create(ts.comm)
1355808f684SSatish Balay        J.setSizes(5); J.setType('aij');
1365808f684SSatish Balay        J.setPreallocationNNZ(1)
1375808f684SSatish Balay        J.setFromOptions()
1385808f684SSatish Balay        u, f = J.createVecs()
1395808f684SSatish Balay
1405808f684SSatish Balay        ts.setAppCtx(ode)
1415808f684SSatish Balay        ts.setIFunction(ode.function, f)
1425808f684SSatish Balay        ts.setIJacobian(ode.jacobian, J, J)
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[:] = 1, 2, 3, 4, 5
1525808f684SSatish Balay
1535808f684SSatish Balay        ts.setSolution(u)
1545808f684SSatish Balay        ode.jacobian(ts,0.0,u,u,1.0,J,J)
1555808f684SSatish Balay        ts.snes.setUseFD(True)
1565808f684SSatish Balay        ts.solve(u)
1575808f684SSatish Balay        self.nsolve +=1
1585808f684SSatish Balay
1595808f684SSatish Balay    def testResetAndSolve(self):
1605808f684SSatish Balay        self.ts.reset()
1615808f684SSatish Balay        self.ts.setStepNumber(0)
1625808f684SSatish Balay        self.testSolve()
1635808f684SSatish Balay        self.ts.reset()
1645808f684SSatish Balay        self.ts.setStepNumber(0)
1655808f684SSatish Balay        self.testFDColor()
1665808f684SSatish Balay        self.ts.reset()
1675808f684SSatish Balay        self.ts.setStepNumber(0)
1685808f684SSatish Balay        self.testSolve()
1695808f684SSatish Balay        self.ts.reset()
1705808f684SSatish Balay
171*4af29056SMoritz Huck    def testSetAdaptLimits(self):
172*4af29056SMoritz Huck        self.ts.setStepLimits(1.0, 2.0)
173*4af29056SMoritz Huck        hmin, hmax = self.ts.getStepLimits()
174*4af29056SMoritz Huck        self.assertEqual(1.0, hmin)
175*4af29056SMoritz Huck        self.assertEqual(2.0, hmax)
176*4af29056SMoritz Huck
1775808f684SSatish Balay# --------------------------------------------------------------------
1785808f684SSatish Balay
1795808f684SSatish Balayif __name__ == '__main__':
1805808f684SSatish Balay    unittest.main()
1815808f684SSatish Balay
1825808f684SSatish Balay# --------------------------------------------------------------------
183