1*5808f684SSatish Balayimport unittest 2*5808f684SSatish Balayfrom petsc4py import PETSc 3*5808f684SSatish Balayfrom sys import getrefcount 4*5808f684SSatish Balay 5*5808f684SSatish Balay# -------------------------------------------------------------------- 6*5808f684SSatish Balay 7*5808f684SSatish Balayclass MyODE: 8*5808f684SSatish Balay """ 9*5808f684SSatish Balay du/dt + u**2 = 0; 10*5808f684SSatish Balay u0,u1,u2 = 1,2,3 11*5808f684SSatish Balay """ 12*5808f684SSatish Balay def __init__(self): 13*5808f684SSatish Balay self.rhsfunction_calls = 0 14*5808f684SSatish Balay self.rhsjacobian_calls = 0 15*5808f684SSatish Balay self.ifunction_calls = 0 16*5808f684SSatish Balay self.ijacobian_calls = 0 17*5808f684SSatish Balay self.presolve_calls = 0 18*5808f684SSatish Balay self.update_calls = 0 19*5808f684SSatish Balay self.postsolve_calls = 0 20*5808f684SSatish Balay self.monitor_calls = 0 21*5808f684SSatish Balay 22*5808f684SSatish Balay def rhsfunction(self,ts,t,u,F): 23*5808f684SSatish Balay # print ('MyODE.rhsfunction()') 24*5808f684SSatish Balay self.rhsfunction_calls += 1 25*5808f684SSatish Balay f = -(u * u) 26*5808f684SSatish Balay f.copy(F) 27*5808f684SSatish Balay 28*5808f684SSatish Balay def rhsjacobian(self,ts,t,u,J,P): 29*5808f684SSatish Balay # print ('MyODE.rhsjacobian()') 30*5808f684SSatish Balay self.rhsjacobian_calls += 1 31*5808f684SSatish Balay P.zeroEntries() 32*5808f684SSatish Balay diag = -2 * u 33*5808f684SSatish Balay P.setDiagonal(diag) 34*5808f684SSatish Balay P.assemble() 35*5808f684SSatish Balay if J != P: J.assemble() 36*5808f684SSatish Balay return True # same_nz 37*5808f684SSatish Balay 38*5808f684SSatish Balay def ifunction(self,ts,t,u,du,F): 39*5808f684SSatish Balay # print ('MyODE.ifunction()') 40*5808f684SSatish Balay self.ifunction_calls += 1 41*5808f684SSatish Balay f = du + u * u 42*5808f684SSatish Balay f.copy(F) 43*5808f684SSatish Balay 44*5808f684SSatish Balay def ijacobian(self,ts,t,u,du,a,J,P): 45*5808f684SSatish Balay # print ('MyODE.ijacobian()') 46*5808f684SSatish Balay self.ijacobian_calls += 1 47*5808f684SSatish Balay P.zeroEntries() 48*5808f684SSatish Balay diag = a + 2 * u 49*5808f684SSatish Balay P.setDiagonal(diag) 50*5808f684SSatish Balay P.assemble() 51*5808f684SSatish Balay if J != P: J.assemble() 52*5808f684SSatish Balay return True # same_nz 53*5808f684SSatish Balay 54*5808f684SSatish Balay def monitor(self, ts, s, t, u): 55*5808f684SSatish Balay self.monitor_calls += 1 56*5808f684SSatish Balay dt = ts.time_step 57*5808f684SSatish Balay ut = ts.vec_sol.norm() 58*5808f684SSatish Balay #prn = PETSc.Sys.Print 59*5808f684SSatish Balay #prn('TS: step %2d, T:%f, dT:%f, u:%f' % (s,t,dt,ut)) 60*5808f684SSatish Balay 61*5808f684SSatish Balay 62*5808f684SSatish Balayclass BaseTestTSNonlinear(object): 63*5808f684SSatish Balay 64*5808f684SSatish Balay TYPE = None 65*5808f684SSatish Balay 66*5808f684SSatish Balay def setUp(self): 67*5808f684SSatish Balay self.ts = PETSc.TS().create(PETSc.COMM_SELF) 68*5808f684SSatish Balay eft = PETSc.TS.ExactFinalTime.STEPOVER 69*5808f684SSatish Balay self.ts.setExactFinalTime(eft) 70*5808f684SSatish Balay ptype = PETSc.TS.ProblemType.NONLINEAR 71*5808f684SSatish Balay self.ts.setProblemType(ptype) 72*5808f684SSatish Balay self.ts.setType(self.TYPE) 73*5808f684SSatish Balay if PETSc.ScalarType().dtype.char in 'fF': 74*5808f684SSatish Balay snes = self.ts.getSNES() 75*5808f684SSatish Balay snes.setTolerances(rtol=1e-6) 76*5808f684SSatish Balay 77*5808f684SSatish Balay def tearDown(self): 78*5808f684SSatish Balay self.ts = None 79*5808f684SSatish Balay 80*5808f684SSatish Balay 81*5808f684SSatish Balayclass BaseTestTSNonlinearRHS(BaseTestTSNonlinear): 82*5808f684SSatish Balay 83*5808f684SSatish Balay def testSolveRHS(self): 84*5808f684SSatish Balay ts = self.ts 85*5808f684SSatish Balay dct = self.ts.getDict() 86*5808f684SSatish Balay self.assertTrue(dct is not None) 87*5808f684SSatish Balay self.assertTrue(type(dct) is dict) 88*5808f684SSatish Balay 89*5808f684SSatish Balay ode = MyODE() 90*5808f684SSatish Balay J = PETSc.Mat().create(ts.comm) 91*5808f684SSatish Balay J.setSizes(3); 92*5808f684SSatish Balay J.setFromOptions() 93*5808f684SSatish Balay J.setUp() 94*5808f684SSatish Balay u, f = J.createVecs() 95*5808f684SSatish Balay 96*5808f684SSatish Balay ts.setAppCtx(ode) 97*5808f684SSatish Balay ts.setRHSFunction(ode.rhsfunction, f) 98*5808f684SSatish Balay ts.setRHSJacobian(ode.rhsjacobian, J, J) 99*5808f684SSatish Balay ts.setMonitor(ode.monitor) 100*5808f684SSatish Balay 101*5808f684SSatish Balay ts.snes.ksp.pc.setType('none') 102*5808f684SSatish Balay 103*5808f684SSatish Balay T0, dT, nT = 0.00, 0.1, 10 104*5808f684SSatish Balay T = T0 + nT*dT 105*5808f684SSatish Balay ts.setTime(T0) 106*5808f684SSatish Balay ts.setTimeStep(dT) 107*5808f684SSatish Balay ts.setMaxTime(T) 108*5808f684SSatish Balay ts.setMaxSteps(nT) 109*5808f684SSatish Balay ts.setFromOptions() 110*5808f684SSatish Balay u[0], u[1], u[2] = 1, 2, 3 111*5808f684SSatish Balay ts.solve(u) 112*5808f684SSatish Balay 113*5808f684SSatish Balay self.assertTrue(ode.rhsfunction_calls > 0) 114*5808f684SSatish Balay self.assertTrue(ode.rhsjacobian_calls > 0) 115*5808f684SSatish Balay 116*5808f684SSatish Balay dct = self.ts.getDict() 117*5808f684SSatish Balay self.assertTrue('__appctx__' in dct) 118*5808f684SSatish Balay self.assertTrue('__rhsfunction__' in dct) 119*5808f684SSatish Balay self.assertTrue('__rhsjacobian__' in dct) 120*5808f684SSatish Balay self.assertTrue('__monitor__' in dct) 121*5808f684SSatish Balay 122*5808f684SSatish Balay n = ode.monitor_calls 123*5808f684SSatish Balay ts.monitor(ts.step_number, ts.time) 124*5808f684SSatish Balay self.assertEqual(ode.monitor_calls, n+1) 125*5808f684SSatish Balay n = ode.monitor_calls 126*5808f684SSatish Balay ts.cancelMonitor() 127*5808f684SSatish Balay ts.monitor(ts.step_number, ts.time) 128*5808f684SSatish Balay self.assertEqual(ode.monitor_calls, n) 129*5808f684SSatish Balay 130*5808f684SSatish Balay def testFDColorRHS(self): 131*5808f684SSatish Balay ts = self.ts 132*5808f684SSatish Balay ode = MyODE() 133*5808f684SSatish Balay J = PETSc.Mat().create(ts.comm) 134*5808f684SSatish Balay J.setSizes(5); J.setType('aij') 135*5808f684SSatish Balay J.setPreallocationNNZ(nnz=1) 136*5808f684SSatish Balay u, f = J.createVecs() 137*5808f684SSatish Balay 138*5808f684SSatish Balay ts.setAppCtx(ode) 139*5808f684SSatish Balay ts.setRHSFunction(ode.rhsfunction, f) 140*5808f684SSatish Balay ts.setRHSJacobian(ode.rhsjacobian, J, J) 141*5808f684SSatish Balay ts.setMonitor(ode.monitor) 142*5808f684SSatish Balay 143*5808f684SSatish Balay T0, dT, nT = 0.00, 0.1, 10 144*5808f684SSatish Balay T = T0 + nT*dT 145*5808f684SSatish Balay ts.setTime(T0) 146*5808f684SSatish Balay ts.setTimeStep(dT) 147*5808f684SSatish Balay ts.setMaxTime(T) 148*5808f684SSatish Balay ts.setMaxSteps(nT) 149*5808f684SSatish Balay ts.setFromOptions() 150*5808f684SSatish Balay u[0], u[1], u[2] = 1, 2, 3 151*5808f684SSatish Balay 152*5808f684SSatish Balay ts.setSolution(u) 153*5808f684SSatish Balay ode.rhsjacobian(ts,0,u,J,J) 154*5808f684SSatish Balay ts.setUp() 155*5808f684SSatish Balay ts.snes.setUseFD(True) 156*5808f684SSatish Balay ts.solve(u) 157*5808f684SSatish Balay 158*5808f684SSatish Balay def testResetAndSolveRHS(self): 159*5808f684SSatish Balay self.ts.reset() 160*5808f684SSatish Balay self.ts.setStepNumber(0) 161*5808f684SSatish Balay self.testSolveRHS() 162*5808f684SSatish Balay self.ts.reset() 163*5808f684SSatish Balay self.ts.setStepNumber(0) 164*5808f684SSatish Balay self.testSolveRHS() 165*5808f684SSatish Balay self.ts.reset() 166*5808f684SSatish Balay 167*5808f684SSatish Balayclass BaseTestTSNonlinearI(BaseTestTSNonlinear): 168*5808f684SSatish Balay 169*5808f684SSatish Balay def testSolveI(self): 170*5808f684SSatish Balay ts = self.ts 171*5808f684SSatish Balay dct = self.ts.getDict() 172*5808f684SSatish Balay self.assertTrue(dct is not None) 173*5808f684SSatish Balay self.assertTrue(type(dct) is dict) 174*5808f684SSatish Balay 175*5808f684SSatish Balay ode = MyODE() 176*5808f684SSatish Balay J = PETSc.Mat().create(ts.comm) 177*5808f684SSatish Balay J.setSizes(3); 178*5808f684SSatish Balay J.setFromOptions() 179*5808f684SSatish Balay J.setUp() 180*5808f684SSatish Balay u, f = J.createVecs() 181*5808f684SSatish Balay 182*5808f684SSatish Balay ts.setAppCtx(ode) 183*5808f684SSatish Balay ts.setIFunction(ode.ifunction, f) 184*5808f684SSatish Balay ts.setIJacobian(ode.ijacobian, J, J) 185*5808f684SSatish Balay ts.setMonitor(ode.monitor) 186*5808f684SSatish Balay 187*5808f684SSatish Balay ts.snes.ksp.pc.setType('none') 188*5808f684SSatish Balay 189*5808f684SSatish Balay T0, dT, nT = 0.00, 0.1, 10 190*5808f684SSatish Balay T = T0 + nT*dT 191*5808f684SSatish Balay ts.setTime(T0) 192*5808f684SSatish Balay ts.setTimeStep(dT) 193*5808f684SSatish Balay ts.setMaxTime(T) 194*5808f684SSatish Balay ts.setMaxSteps(nT) 195*5808f684SSatish Balay ts.setFromOptions() 196*5808f684SSatish Balay u[0], u[1], u[2] = 1, 2, 3 197*5808f684SSatish Balay ts.solve(u) 198*5808f684SSatish Balay 199*5808f684SSatish Balay self.assertTrue(ode.ifunction_calls > 0) 200*5808f684SSatish Balay self.assertTrue(ode.ijacobian_calls > 0) 201*5808f684SSatish Balay 202*5808f684SSatish Balay dct = self.ts.getDict() 203*5808f684SSatish Balay self.assertTrue('__appctx__' in dct) 204*5808f684SSatish Balay self.assertTrue('__ifunction__' in dct) 205*5808f684SSatish Balay self.assertTrue('__ijacobian__' in dct) 206*5808f684SSatish Balay self.assertTrue('__monitor__' in dct) 207*5808f684SSatish Balay 208*5808f684SSatish Balay n = ode.monitor_calls 209*5808f684SSatish Balay ts.monitor(ts.step_number, ts.time) 210*5808f684SSatish Balay self.assertEqual(ode.monitor_calls, n+1) 211*5808f684SSatish Balay n = ode.monitor_calls 212*5808f684SSatish Balay ts.cancelMonitor() 213*5808f684SSatish Balay ts.monitor(ts.step_number, ts.time) 214*5808f684SSatish Balay self.assertEqual(ode.monitor_calls, n) 215*5808f684SSatish Balay 216*5808f684SSatish Balay def testFDColorI(self): 217*5808f684SSatish Balay ts = self.ts 218*5808f684SSatish Balay ode = MyODE() 219*5808f684SSatish Balay J = PETSc.Mat().create(ts.comm) 220*5808f684SSatish Balay J.setSizes(5); J.setType('aij') 221*5808f684SSatish Balay J.setPreallocationNNZ(nnz=1) 222*5808f684SSatish Balay J.setFromOptions() 223*5808f684SSatish Balay u, f = J.createVecs() 224*5808f684SSatish Balay 225*5808f684SSatish Balay ts.setAppCtx(ode) 226*5808f684SSatish Balay ts.setIFunction(ode.ifunction, f) 227*5808f684SSatish Balay ts.setIJacobian(ode.ijacobian, J, J) 228*5808f684SSatish Balay ts.setMonitor(ode.monitor) 229*5808f684SSatish Balay 230*5808f684SSatish Balay T0, dT, nT = 0.00, 0.1, 10 231*5808f684SSatish Balay T = T0 + nT*dT 232*5808f684SSatish Balay ts.setTime(T0) 233*5808f684SSatish Balay ts.setTimeStep(dT) 234*5808f684SSatish Balay ts.setMaxTime(T) 235*5808f684SSatish Balay ts.setMaxSteps(nT) 236*5808f684SSatish Balay ts.setFromOptions() 237*5808f684SSatish Balay u[0], u[1], u[2] = 1, 2, 3 238*5808f684SSatish Balay 239*5808f684SSatish Balay ts.setSolution(u) 240*5808f684SSatish Balay ode.ijacobian(ts,0,u,0*u,1,J,J) 241*5808f684SSatish Balay ts.setUp() 242*5808f684SSatish Balay ts.snes.setUseFD(True) 243*5808f684SSatish Balay ts.solve(u) 244*5808f684SSatish Balay 245*5808f684SSatish Balay def testResetAndSolveI(self): 246*5808f684SSatish Balay self.ts.reset() 247*5808f684SSatish Balay self.ts.setStepNumber(0) 248*5808f684SSatish Balay self.testSolveI() 249*5808f684SSatish Balay self.ts.reset() 250*5808f684SSatish Balay self.ts.setStepNumber(0) 251*5808f684SSatish Balay self.testSolveI() 252*5808f684SSatish Balay self.ts.reset() 253*5808f684SSatish Balay 254*5808f684SSatish Balayclass TestTSBeuler(BaseTestTSNonlinearRHS,BaseTestTSNonlinearI, 255*5808f684SSatish Balay unittest.TestCase): 256*5808f684SSatish Balay TYPE = PETSc.TS.Type.BEULER 257*5808f684SSatish Balay 258*5808f684SSatish Balayclass TestTSCN(BaseTestTSNonlinearRHS,BaseTestTSNonlinearI, 259*5808f684SSatish Balay unittest.TestCase): 260*5808f684SSatish Balay TYPE = PETSc.TS.Type.CN 261*5808f684SSatish Balay 262*5808f684SSatish Balayclass TestTSTheta(BaseTestTSNonlinearRHS, BaseTestTSNonlinearI, 263*5808f684SSatish Balay unittest.TestCase): 264*5808f684SSatish Balay TYPE = PETSc.TS.Type.THETA 265*5808f684SSatish Balay 266*5808f684SSatish Balayclass TestTSAlpha(BaseTestTSNonlinearRHS, BaseTestTSNonlinearI, 267*5808f684SSatish Balay unittest.TestCase): 268*5808f684SSatish Balay TYPE = PETSc.TS.Type.ALPHA 269*5808f684SSatish Balay 270*5808f684SSatish Balay# -------------------------------------------------------------------- 271*5808f684SSatish Balay 272*5808f684SSatish Balayif __name__ == '__main__': 273*5808f684SSatish Balay unittest.main() 274*5808f684SSatish Balay 275*5808f684SSatish Balay# -------------------------------------------------------------------- 276