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