/[ascend]/trunk/test.py
ViewVC logotype

Diff of /trunk/test.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 985 by johnpye, Thu Dec 21 04:06:02 2006 UTC revision 1021 by johnpye, Wed Jan 3 07:40:24 2007 UTC
# Line 1  Line 1 
1    #!/usr/bin/env python
2  import unittest  import unittest
3  import ascpy  import ascpy
4  import math  import math
5  import os, subprocess, sys  import os, subprocess, sys
6  import atexit  import atexit
7    import cunit
8    
9  class Ascend(unittest.TestCase):  class Ascend(unittest.TestCase):
10    
# Line 118  class TestIntegrator(Ascend): Line 120  class TestIntegrator(Ascend):
120      def testIDA(self):      def testIDA(self):
121          self._testIntegrator('IDA')          self._testIntegrator('IDA')
122    
123        def testparameters(self):
124            self.L.load('johnpye/shm.a4c')
125            M = self.L.findType('shm').getSimulation('sim')
126            M.build()
127            I = ascpy.Integrator(M)
128            I.setEngine('IDA')
129            P = I.getParameters()
130            for p in P:
131                print p.getName(),"=",p.getValue()
132            assert len(P)==11
133            assert P[0].isStr()
134            assert P[0].getName()=="linsolver"
135            assert P[0].getValue()=='SPGMR'
136            assert P[2].getName()=="autodiff"
137            assert P[2].getValue()==True
138            assert P[7].getName()=="atolvect"
139            assert P[7].getBoolValue() == True
140            P[2].setBoolValue(False)
141            assert P[2].getBoolValue()==False
142            I.setParameters(P)
143            assert I.getParameterValue('autodiff')==False
144            I.setParameter('autodiff',True)
145            try:
146                v = I.getParameterValue('nonexist')
147            except KeyError:
148                pass
149            else:
150                self.fail('Failed to trip invalid Integrator parameter')
151    
152  class TestLSODE(Ascend):  class TestLSODE(Ascend):
153    
154      def testzill(self):      def testzill(self):
# Line 131  class TestLSODE(Ascend): Line 162  class TestLSODE(Ascend):
162          I.setMaxSubStep(0.001)          I.setMaxSubStep(0.001)
163          I.setMaxSubSteps(10000)          I.setMaxSubSteps(10000)
164          I.setReporter(ascpy.IntegratorReporterConsole(I))          I.setReporter(ascpy.IntegratorReporterConsole(I))
165          I.setLinearTimesteps(ascpy.Units(), 1.0, 1.5, 5);          I.setLinearTimesteps(ascpy.Units(), 1.0, 1.5, 5)
166          I.analyse()          I.analyse()
167          I.solve()          I.solve()
168          M.run(T.getMethod('self_test'))          M.run(T.getMethod('self_test'))
# Line 153  class TestLSODE(Ascend): Line 184  class TestLSODE(Ascend):
184          I.setMaxSubSteps(10000)          I.setMaxSubSteps(10000)
185                    
186          I.setReporter(ascpy.IntegratorReporterConsole(I))          I.setReporter(ascpy.IntegratorReporterConsole(I))
187          I.setLinearTimesteps(ascpy.Units("s"), 0, 2*float(M.v)/float(M.g), 2);          I.setLinearTimesteps(ascpy.Units("s"), 0, 2*float(M.v)/float(M.g), 2)
188          I.analyse()          I.analyse()
189          I.solve()          I.solve()
190          print "At end of simulation,"          print "At end of simulation,"
# Line 168  class TestLSODE(Ascend): Line 199  class TestLSODE(Ascend):
199          I = ascpy.Integrator(M)          I = ascpy.Integrator(M)
200          I.setEngine('LSODE')          I.setEngine('LSODE')
201          I.setReporter(ascpy.IntegratorReporterConsole(I))          I.setReporter(ascpy.IntegratorReporterConsole(I))
202          I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 5);          I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 5)
203          I.analyse()          I.analyse()
204          print "Number of vars = %d" % I.getNumVars()          print "Number of vars = %d" % I.getNumVars()
205          assert I.getNumVars()==2          assert I.getNumVars()==2
# Line 176  class TestLSODE(Ascend): Line 207  class TestLSODE(Ascend):
207          assert I.getNumObservedVars() == 3;          assert I.getNumObservedVars() == 3;
208          assert abs(M.R - 832) < 1.0          assert abs(M.R - 832) < 1.0
209          assert abs(M.F - 21.36) < 0.1          assert abs(M.F - 21.36) < 0.1
           
 class TestIDA(Ascend):  
210    
211      def testparameters(self):  #-------------------------------------------------------------------------------
212          self.L.load('johnpye/shm.a4c')  # Testing of a simple external function
213          M = self.L.findType('shm').getSimulation('sim')  
214    class TestExtFn(Ascend):
215        def testextfntest(self):
216            self.L.load('johnpye/extfn/extfntest.a4c')
217            M = self.L.findType('extfntest').getSimulation('sim')
218          M.build()          M.build()
219          I = ascpy.Integrator(M)          M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
220          I.setEngine('IDA')          print "y = %f" % M.y
221          P = I.getParameters()          print "x = %f" % M.x
222          for p in P:          self.assertAlmostEqual(M.y, 1);
223              print p.getName(),"=",p.getValue()          self.assertAlmostEqual(M.x, 0);
224          assert len(P)==9          self.assertAlmostEqual(M.y, M.x + 1);
225          assert P[0].isStr()  
226          assert P[0].getName()=="linsolver"  #-------------------------------------------------------------------------------
227          assert P[0].getValue()=='SPGMR'  # Testing of freesteam external steam properties functions
228          assert P[2].getName()=="autodiff"  
229          assert P[2].getValue()==True  try:
230          assert P[7].getName()=="atolvect"      import freesteam
231          assert P[7].getBoolValue() == True      have_freesteam = True
232          P[2].setBoolValue(False)  except ImportError,e:
233          assert P[2].getBoolValue()==False      have_freesteam = False
234          I.setParameters(P)  
235          for p in I.getParameters():  if have_freesteam:
236              print p.getName(),"=",p.getValue()      class TestFreesteam(Ascend):
237          assert I.getParameterValue('autodiff')==False          def testload(self):
238          I.setParameter('autodiff',True)              self.L.load('johnpye/thermalequilibrium2.a4c')
239          try:  
240              v = I.getParameterValue('nonexist')          def testinstantiate(self):
241          except KeyError:              self.testload()
242              pass              M = self.L.findType('thermalequilibrium2').getSimulation('sim')
243          else:  
244              self.fail('Failed to trip invalid Integrator parameter')          def testsolve(self):
245                self.testinstantiate()
246                M.setSolver(ascpy.Solver("QRSlv"))
247                #I = ascpy.Integrator(M)
248                #I.setEngine('LSODE')
249                #I.setReporter(ascpy.IntegratorReporterConsole(I))
250                #I.setLinearTimesteps(ascpy.Units("s"), 0, 3000, 30)
251                #I.setMinSubStep(0.01)
252                #I.setInitialSubStep(0.1)
253                #I.analyse()
254                #print "Number of vars = %d" % I.getNumVars()
255                #assert I.getNumVars()==2
256                #I.solve()
257                #assert I.getNumObservedVars() == 3;
258                #assert abs(M.R - 832) < 1.0
259                #assert abs(M.F - 21.36) < 0.1
260    
261    
262    #-------------------------------------------------------------------------------
263    # Testing of IDA models using DENSE linear solver
264    
265    class TestIDADENSE(Ascend):
266        """IDA DAE integrator, DENSE linear solver"""
267    
268      def testnewton(self):      def testnewton(self):
269          sys.stderr.write("STARTING TESTNEWTON\n")          sys.stderr.write("STARTING TESTNEWTON\n")
# Line 218  class TestIDA(Ascend): Line 273  class TestIDA(Ascend):
273          M.solve(ascpy.Solver("QRSlv"),ascpy.SolverReporter())            M.solve(ascpy.Solver("QRSlv"),ascpy.SolverReporter())  
274          I = ascpy.Integrator(M)          I = ascpy.Integrator(M)
275          I.setEngine('IDA')          I.setEngine('IDA')
276            I.setParameter('linsolver','DENSE')
277          I.setParameter('safeeval',True)          I.setParameter('safeeval',True)
278          I.setParameter('rtol',1e-8)          I.setParameter('rtol',1e-8)
279          I.setMaxSubStep(0.001)          I.setMaxSubStep(0.001)
280          I.setMaxSubSteps(10000)          I.setMaxSubSteps(10000)
281                    
282          I.setReporter(ascpy.IntegratorReporterConsole(I))          I.setReporter(ascpy.IntegratorReporterConsole(I))
283          I.setLinearTimesteps(ascpy.Units("s"), 0, 2*float(M.v)/float(M.g), 2);          I.setLinearTimesteps(ascpy.Units("s"), 0, 2*float(M.v)/float(M.g), 2)
284          I.analyse()          I.analyse()
285          I.solve()          I.solve()
286          print "At end of simulation,"          print "At end of simulation,"
# Line 232  class TestIDA(Ascend): Line 288  class TestIDA(Ascend):
288          print "v = %f" % M.v          print "v = %f" % M.v
289          M.run(T.getMethod('self_test'))          M.run(T.getMethod('self_test'))
290    
291      def testlotka(self):      def testlotkaDENSE(self):
292          self.L.load('johnpye/lotka.a4c')          self.L.load('johnpye/lotka.a4c')
293          M = self.L.findType('lotka').getSimulation('sim')          M = self.L.findType('lotka').getSimulation('sim')
294          M.setSolver(ascpy.Solver("QRSlv"))          M.setSolver(ascpy.Solver("QRSlv"))
# Line 240  class TestIDA(Ascend): Line 296  class TestIDA(Ascend):
296          I.setEngine('IDA')          I.setEngine('IDA')
297          I.setReporter(ascpy.IntegratorReporterConsole(I))          I.setReporter(ascpy.IntegratorReporterConsole(I))
298          I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 5);          I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 5);
299            I.setParameter('linsolver','DENSE')
300          I.setParameter('rtol',1e-8);          I.setParameter('rtol',1e-8);
301          I.analyse()          I.analyse()
302          assert I.getNumVars()==2          assert I.getNumVars()==2
303          assert abs(M.R - 1000) < 1e-300          assert abs(M.R - 1000) < 1e-300
304          I.solve()          I.solve()
305          assert I.getNumObservedVars() == 3;          assert I.getNumObservedVars() == 3
306          assert abs(M.R - 832) < 1.0          assert abs(M.R - 832) < 1.0
307          assert abs(M.F - 21.36) < 0.1          assert abs(M.F - 21.36) < 0.1
   
     def testzill(self):  
         self.L.load('johnpye/zill.a4c')  
         T = self.L.findType('zill')  
         M = T.getSimulation('sim')  
         M.setSolver(ascpy.Solver('QRSlv'))  
         I = ascpy.Integrator(M)  
         I.setEngine('IDA')  
         I.setParameter('safeeval',False)  
         I.setMinSubStep(1e-7)  
         I.setMaxSubStep(0.001)  
         I.setMaxSubSteps(10000)  
         I.setReporter(ascpy.IntegratorReporterConsole(I))  
         I.setLinearTimesteps(ascpy.Units(), 1.0, 1.5, 5);  
         I.analyse()  
         I.solve()  
         M.run(T.getMethod('self_test'))  
308                    
309      def testdenx(self):      def testdenx(self):
310          self.L.load('johnpye/idadenx.a4c')          self.L.load('johnpye/idadenx.a4c')
311          M = self.L.findType('idadenx').getSimulation('sim')          M = self.L.findType('idadenx').getSimulation('sim')
312          M.solve(ascpy.Solver("QRSlv"),ascpy.SolverReporter())            M.setSolver(ascpy.Solver("QRSlv"))
313          I = ascpy.Integrator(M)          I = ascpy.Integrator(M)
314          I.setEngine('IDA')          I.setEngine('IDA')
315          I.setParameter('calcic',False)          I.setParameter('calcic','NONE')
316          I.setParameter('linsolver','DENSE')          I.setParameter('linsolver','DENSE')
317          I.setReporter(ascpy.IntegratorReporterConsole(I))          I.setReporter(ascpy.IntegratorReporterConsole(I))
318          I.setLogTimesteps(ascpy.Units("s"), 0.4, 4e10, 11);          I.setLogTimesteps(ascpy.Units("s"), 0.4, 4e10, 11)
319          I.setMaxSubStep(0);          I.setMaxSubStep(0);
320          I.setInitialSubStep(0);          I.setInitialSubStep(0)
321          I.setMaxSubSteps(0);          I.setMaxSubSteps(0);
322          I.setParameter('autodiff',True)          I.setParameter('autodiff',True)
323          I.analyse()          I.analyse()
324          I.solve()          I.solve()
325          assert abs(float(M.y1) - 5.1091e-08) < 1e-10;          assert abs(float(M.y1) - 5.1091e-08) < 1e-10
326          assert abs(float(M.y2) - 2.0437e-13) < 1e-15;          assert abs(float(M.y2) - 2.0437e-13) < 1e-15
327          assert abs(float(M.y3) - 1.0) < 1e-5;          assert abs(float(M.y3) - 1.0) < 1e-5
328    
329      def testdenxSPGMR(self):      def testkryxDENSE(self):
330          self.L.load('johnpye/idadenx.a4c')          self.L.load('johnpye/idakryx.a4c')
331          M = self.L.findType('idadenx').getSimulation('sim')          M = self.L.findType('idakryx').getSimulation('sim')
332            M.setSolver(ascpy.Solver('QRSlv'))
333            M.build()
334          I = ascpy.Integrator(M)          I = ascpy.Integrator(M)
335          I.setEngine('IDA')          I.setEngine('IDA')
336          I.setReporter(ascpy.IntegratorReporterConsole(I))          I.setReporter(ascpy.IntegratorReporterConsole(I))
337          I.setLogTimesteps(ascpy.Units("s"), 0.4, 4e10, 11);          I.setParameter('linsolver','DENSE')
338          I.setMaxSubStep(0);          I.setParameter('maxl',8)
         I.setInitialSubStep(0);  
         I.setMaxSubSteps(0);  
         I.setParameter('autodiff',True)  
         I.setParameter('linsolver','SPGMR')  
339          I.setParameter('gsmodified',False)          I.setParameter('gsmodified',False)
340            I.setParameter('autodiff',True)
341            I.setParameter('rtol',0)
342            I.setParameter('atol',1e-3);
343            I.setParameter('atolvect',False)
344            I.setParameter('calcic','YA_YDP')
345            I.analyse()
346            I.setLogTimesteps(ascpy.Units("s"), 0.01, 10.24, 11)
347            I.solve()
348            assert abs(M.u[2][2].getValue()) < 1e-5
349        
350    #-------------------------------------------------------------------------------
351    # Testing of IDA models using SPGMR linear solver (Krylov)
352        
353    # these tests are disabled until SPGMR preconditioning has been implemented
354    class TestIDASPGMR:#(Ascend):
355        def testlotka(self):
356            self.L.load('johnpye/lotka.a4c')
357            M = self.L.findType('lotka').getSimulation('sim')
358            M.setSolver(ascpy.Solver("QRSlv"))
359            I = ascpy.Integrator(M)
360            I.setEngine('IDA')
361            I.setReporter(ascpy.IntegratorReporterConsole(I))
362            I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 5)
363            I.setParameter('rtol',1e-8)
364          I.analyse()          I.analyse()
365            assert I.getNumVars()==2
366            assert abs(M.R - 1000) < 1e-300
367          I.solve()          I.solve()
368          assert abs(float(M.y1) - 5.1091e-08) < 1e-10;          assert I.getNumObservedVars() == 3
369          assert abs(float(M.y2) - 2.0437e-13) < 1e-15;          assert abs(M.R - 832) < 1.0
370          assert abs(float(M.y3) - 1.0) < 1e-5;          assert abs(M.F - 21.36) < 0.1
371    
372    
373      def testkryx(self):      def testkryx(self):
374          self.L.load('johnpye/idakryx.a4c')          self.L.load('johnpye/idakryx.a4c')
# Line 313  class TestIDA(Ascend): Line 378  class TestIDA(Ascend):
378          I.setEngine('IDA')          I.setEngine('IDA')
379          I.setReporter(ascpy.IntegratorReporterConsole(I))          I.setReporter(ascpy.IntegratorReporterConsole(I))
380          I.setParameter('linsolver','SPGMR')          I.setParameter('linsolver','SPGMR')
381            I.setParameter('prec','JACOBI')
382          I.setParameter('maxl',8)          I.setParameter('maxl',8)
383          I.setParameter('gsmodified',False)          I.setParameter('gsmodified',False)
384          I.setParameter('autodiff',True)          I.setParameter('autodiff',True)
385            I.setParameter('gsmodified',True)
386          I.setParameter('rtol',0)          I.setParameter('rtol',0)
387          I.setParameter('atol',1e-3);          I.setParameter('atol',1e-3);
388          I.setParameter('atolvect',False)          I.setParameter('atolvect',False)
389          I.setParameter('calcic',True)          I.setParameter('calcic','Y')
390          I.analyse()          I.analyse()
391          I.setLogTimesteps(ascpy.Units("s"), 0.01, 10.24, 10);          I.setLogTimesteps(ascpy.Units("s"), 0.01, 10.24, 10);
392          print M.udot[1][3];          print M.udot[1][3]
393          I.solve()          I.solve()
394          assert 0          assert 0
395        
396  class CUnit(unittest.TestCase):      def testzill(self):
397      def setUp(self):          self.L.load('johnpye/zill.a4c')
398          self.cunitexe = "../base/generic/test/test"          T = self.L.findType('zill')
399                M = T.getSimulation('sim')
400      def testcunittests(self):          M.setSolver(ascpy.Solver('QRSlv'))
401          res = os.system(self.cunitexe)          I = ascpy.Integrator(M)
402          if res:          I.setEngine('IDA')
403              raise RuntimeError("CUnit tests failed (returned %d -- run %s for details)" % (res,self.cunitexe))          I.setParameter('safeeval',False)
404          else:          I.setMinSubStep(1e-7)
405              print "CUnit returned %s" % res          I.setMaxSubStep(0.001)
406            I.setMaxSubSteps(10000)
407            I.setReporter(ascpy.IntegratorReporterConsole(I))
408            I.setLinearTimesteps(ascpy.Units(), 1.0, 1.5, 5)
409            I.analyse()
410            I.solve()
411            M.run(T.getMethod('self_test'))
412    
413        def testdenxSPGMR(self):
414            self.L.load('johnpye/idadenx.a4c')
415            M = self.L.findType('idadenx').getSimulation('sim')
416            M.setSolver(ascpy.Solver('QRSlv'))
417            I = ascpy.Integrator(M)
418            I.setEngine('IDA')
419            I.setReporter(ascpy.IntegratorReporterConsole(I))
420            I.setLogTimesteps(ascpy.Units("s"), 0.4, 4e10, 11)
421            I.setMaxSubStep(0);
422            I.setInitialSubStep(0);
423            I.setMaxSubSteps(0);
424            I.setParameter('autodiff',True)
425            I.setParameter('linsolver','SPGMR')
426            I.setParameter('gsmodified',False)
427            I.setParameter('maxncf',10)
428            I.analyse()
429            I.solve()
430            assert abs(float(M.y1) - 5.1091e-08) < 1e-10
431            assert abs(float(M.y2) - 2.0437e-13) < 1e-15
432            assert abs(float(M.y3) - 1.0) < 1e-5
433    
434  # move code above down here if you want to temporarily avoid testing it  # move code above down here if you want to temporarily avoid testing it
435  class NotToBeTested:  class NotToBeTested:
436      def nothing(self):      def nothing(self):
437          pass          pass
438            
439  if __name__=='__main__':  if __name__=='__main__':
440      atexit.register(ascpy.shutdown)      atexit.register(ascpy.shutdown)
441      unittest.main()      #suite = unittest.TestSuite()
442        #suite = unittest.defaultTestLoader.loadTestsFromName('__main__')
443        #unittest.TextTestRunner(verbosity=2).run(suite)
444        unittest.main()

Legend:
Removed from v.985  
changed lines
  Added in v.1021

john.pye@anu.edu.au
ViewVC Help
Powered by ViewVC 1.1.22