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 = 1 115808f684SSatish Balay """ 125808f684SSatish Balay 135808f684SSatish Balay def __init__(self): 145808f684SSatish Balay self.function_calls = 0 155808f684SSatish Balay self.jacobian_calls = 0 165808f684SSatish Balay 175808f684SSatish Balay def function(self,ts,t,u,du,F): 185808f684SSatish Balay #print 'MyODE.function()' 195808f684SSatish Balay self.function_calls += 1 205808f684SSatish Balay f = du + u * u 215808f684SSatish Balay f.copy(F) 225808f684SSatish Balay 235808f684SSatish Balay def jacobian(self,ts,t,u,du,a,J,P): 245808f684SSatish Balay #print 'MyODE.jacobian()' 255808f684SSatish Balay self.jacobian_calls += 1 265808f684SSatish Balay P.zeroEntries() 275808f684SSatish Balay diag = a + 2 * u 285808f684SSatish Balay P.setDiagonal(diag) 295808f684SSatish Balay P.assemble() 305808f684SSatish Balay if J != P: J.assemble() 315808f684SSatish Balay return False # same_nz 325808f684SSatish Balay 33ebead697SStefano Zampiniclass MyTS(object): 34ebead697SStefano Zampini 355808f684SSatish Balay def __init__(self): 365808f684SSatish Balay self.log = {} 37a82e8c82SStefano Zampini 385808f684SSatish Balay def _log(self, method, *args): 395808f684SSatish Balay self.log.setdefault(method, 0) 405808f684SSatish Balay self.log[method] += 1 415808f684SSatish Balay 425808f684SSatish Balay def create(self, ts, *args): 435808f684SSatish Balay self._log('create', *args) 445808f684SSatish Balay self.vec_update = PETSc.Vec() 455808f684SSatish Balay 465808f684SSatish Balay def destroy(self, ts, *args): 475808f684SSatish Balay self._log('destroy', *args) 485808f684SSatish Balay self.vec_update.destroy() 495808f684SSatish Balay 505808f684SSatish Balay def setFromOptions(self, ts, *args): 515808f684SSatish Balay self._log('setFromOptions', *args) 525808f684SSatish Balay 535808f684SSatish Balay def setUp(self, ts, *args): 545808f684SSatish Balay self._log('setUp', ts, *args) 555808f684SSatish Balay self.vec_update = ts.getSolution().duplicate() 565808f684SSatish Balay 575808f684SSatish Balay def reset(self, ts, *args): 585808f684SSatish Balay self._log('reset', ts, *args) 595808f684SSatish Balay 605808f684SSatish Balay def solveStep(self, ts, t, u, *args): 615808f684SSatish Balay self._log('solveStep', ts, t, u, *args) 625808f684SSatish Balay ts.snes.solve(None, u) 635808f684SSatish Balay 645808f684SSatish Balay def adaptStep(self, ts, t, u, *args): 655808f684SSatish Balay self._log('adaptStep', ts, t, u, *args) 665808f684SSatish Balay return (ts.getTimeStep(), True) 675808f684SSatish Balay 685808f684SSatish Balay 695808f684SSatish Balayclass TestTSPython(unittest.TestCase): 705808f684SSatish Balay 715808f684SSatish Balay def setUp(self): 725808f684SSatish Balay self.ts = PETSc.TS() 735808f684SSatish Balay self.ts.createPython(MyTS(), comm=PETSc.COMM_SELF) 745808f684SSatish Balay eft = PETSc.TS.ExactFinalTime.STEPOVER 755808f684SSatish Balay self.ts.setExactFinalTime(eft) 765808f684SSatish Balay ctx = self.ts.getPythonContext() 775808f684SSatish Balay self.assertEqual(getrefcount(ctx), 3) 785808f684SSatish Balay self.assertEqual(ctx.log['create'], 1) 795808f684SSatish Balay self.nsolve = 0 805808f684SSatish Balay 815808f684SSatish Balay def tearDown(self): 825808f684SSatish Balay ctx = self.ts.getPythonContext() 835808f684SSatish Balay self.assertEqual(getrefcount(ctx), 3) 845808f684SSatish Balay self.assertTrue('destroy' not in ctx.log) 855808f684SSatish Balay self.ts.destroy() # XXX 865808f684SSatish Balay self.ts = None 87*62e5d2d2SJDBetteridge PETSc.garbage_cleanup() 885808f684SSatish Balay self.assertEqual(ctx.log['destroy'], 1) 895808f684SSatish Balay self.assertEqual(getrefcount(ctx), 2) 905808f684SSatish Balay 91ebead697SStefano Zampini def testGetType(self): 92ebead697SStefano Zampini ctx = self.ts.getPythonContext() 93ebead697SStefano Zampini pytype = "{0}.{1}".format(ctx.__module__, type(ctx).__name__) 94ebead697SStefano Zampini self.assertTrue(self.ts.getPythonType() == pytype) 95ebead697SStefano Zampini 965808f684SSatish Balay def testSolve(self): 975808f684SSatish Balay ts = self.ts 985808f684SSatish Balay ts.setProblemType(ts.ProblemType.NONLINEAR) 995808f684SSatish Balay ode = MyODE() 1005808f684SSatish Balay J = PETSc.Mat().create(ts.comm) 1015808f684SSatish Balay J.setSizes(3); 1025808f684SSatish Balay J.setFromOptions() 1035808f684SSatish Balay J.setUp() 1045808f684SSatish Balay u, f = J.createVecs() 1055808f684SSatish Balay 1065808f684SSatish Balay ts.setAppCtx(ode) 1075808f684SSatish Balay ts.setIFunction(ode.function, f) 1085808f684SSatish Balay ts.setIJacobian(ode.jacobian, J, J) 1095808f684SSatish Balay ts.snes.ksp.pc.setType('none') 1105808f684SSatish Balay 1115808f684SSatish Balay T0, dT, nT = 0.0, 0.1, 10 1125808f684SSatish Balay T = T0 + nT*dT 1135808f684SSatish Balay ts.setTime(T0) 1145808f684SSatish Balay ts.setTimeStep(dT) 1155808f684SSatish Balay ts.setMaxTime(T) 1165808f684SSatish Balay ts.setMaxSteps(nT) 1175808f684SSatish Balay ts.setFromOptions() 1185808f684SSatish Balay u[0], u[1], u[2] = 1, 2, 3 1195808f684SSatish Balay ts.solve(u) 1205808f684SSatish Balay self.nsolve +=1 1215808f684SSatish Balay 1225808f684SSatish Balay self.assertTrue(ode.function_calls > 0) 1235808f684SSatish Balay self.assertTrue(ode.jacobian_calls > 0) 1245808f684SSatish Balay 1255808f684SSatish Balay ctx = self.ts.getPythonContext() 1265808f684SSatish Balay ncalls = self.nsolve * ts.step_number 1275808f684SSatish Balay self.assertTrue(ctx.log['solveStep'] == ncalls) 1285808f684SSatish Balay self.assertTrue(ctx.log['adaptStep'] == ncalls) 1295808f684SSatish Balay del ctx 1305808f684SSatish Balay 1315808f684SSatish Balay dct = self.ts.getDict() 1325808f684SSatish Balay self.assertTrue('__appctx__' in dct) 1335808f684SSatish Balay self.assertTrue('__ifunction__' in dct) 1345808f684SSatish Balay self.assertTrue('__ijacobian__' in dct) 1355808f684SSatish Balay 1365808f684SSatish Balay def testFDColor(self): 1375808f684SSatish Balay # 1385808f684SSatish Balay ts = self.ts 1395808f684SSatish Balay ts.setProblemType(ts.ProblemType.NONLINEAR) 1405808f684SSatish Balay ode = MyODE() 1415808f684SSatish Balay J = PETSc.Mat().create(ts.comm) 1425808f684SSatish Balay J.setSizes(5); J.setType('aij'); 1435808f684SSatish Balay J.setPreallocationNNZ(1) 1445808f684SSatish Balay J.setFromOptions() 1455808f684SSatish Balay u, f = J.createVecs() 1465808f684SSatish Balay 1475808f684SSatish Balay ts.setAppCtx(ode) 1485808f684SSatish Balay ts.setIFunction(ode.function, f) 1495808f684SSatish Balay ts.setIJacobian(ode.jacobian, J, J) 1505808f684SSatish Balay 1515808f684SSatish Balay T0, dT, nT = 0.00, 0.1, 10 1525808f684SSatish Balay T = T0 + nT*dT 1535808f684SSatish Balay ts.setTime(T0) 1545808f684SSatish Balay ts.setTimeStep(dT) 1555808f684SSatish Balay ts.setMaxTime(T) 1565808f684SSatish Balay ts.setMaxSteps(nT) 1575808f684SSatish Balay ts.setFromOptions() 1585808f684SSatish Balay u[:] = 1, 2, 3, 4, 5 1595808f684SSatish Balay 1605808f684SSatish Balay ts.setSolution(u) 1615808f684SSatish Balay ode.jacobian(ts,0.0,u,u,1.0,J,J) 1625808f684SSatish Balay ts.snes.setUseFD(True) 1635808f684SSatish Balay ts.solve(u) 1645808f684SSatish Balay self.nsolve +=1 1655808f684SSatish Balay 1665808f684SSatish Balay def testResetAndSolve(self): 1675808f684SSatish Balay self.ts.reset() 1685808f684SSatish Balay self.ts.setStepNumber(0) 1695808f684SSatish Balay self.testSolve() 1705808f684SSatish Balay self.ts.reset() 1715808f684SSatish Balay self.ts.setStepNumber(0) 1725808f684SSatish Balay self.testFDColor() 1735808f684SSatish Balay self.ts.reset() 1745808f684SSatish Balay self.ts.setStepNumber(0) 1755808f684SSatish Balay self.testSolve() 1765808f684SSatish Balay self.ts.reset() 1775808f684SSatish Balay 1784af29056SMoritz Huck def testSetAdaptLimits(self): 1794af29056SMoritz Huck self.ts.setStepLimits(1.0, 2.0) 1804af29056SMoritz Huck hmin, hmax = self.ts.getStepLimits() 1814af29056SMoritz Huck self.assertEqual(1.0, hmin) 1824af29056SMoritz Huck self.assertEqual(2.0, hmax) 1834af29056SMoritz Huck 1845808f684SSatish Balay# -------------------------------------------------------------------- 1855808f684SSatish Balay 1865808f684SSatish Balayif __name__ == '__main__': 1875808f684SSatish Balay unittest.main() 1885808f684SSatish Balay 1895808f684SSatish Balay# -------------------------------------------------------------------- 190