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

Contents of /trunk/test.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1144 - (show annotations) (download) (as text)
Mon Jan 15 10:42:11 2007 UTC (17 years, 5 months ago) by johnpye
File MIME type: text/x-python
File size: 25374 byte(s)
Added except.[ch] which are intended to hold some TRY..CATCH..FINAL macro goodness to replace the explicit longjmp calls.
Added time-watching in LSODE to update GUI in case of long samplelist timesteps (TODO: permit interruption vai this mechanism too).
1 #!/usr/bin/env python
2 # ASCEND modelling environment
3 # Copyright (C) 2006 Carnegie Mellon University
4 #
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2, or (at your option)
8 # any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place - Suite 330,
18 # Boston, MA 02111-1307, USA.
19
20 # This script gives a test suite for the high-level interface of ASCEND via
21 # Python. It is also planned to be a wrapper for the CUnit test suite, although
22 # this is still experimental.
23
24 import unittest
25 import os, sys
26 import math
27 import atexit
28
29 import platform
30 if platform.system() != "Windows":
31 import dl
32 sys.setdlopenflags(dl.RTLD_GLOBAL|dl.RTLD_NOW)
33
34 class Ascend(unittest.TestCase):
35
36 def setUp(self):
37 import ascpy
38 self.L = ascpy.Library()
39
40 def tearDown(self):
41 self.L.clear()
42 del self.L
43
44 class AscendSelfTester(Ascend):
45
46 def _run(self,modelname,solvername="QRSlv",filename=None):
47 if filename==None:
48 filename = 'johnpye/%s.a4c' % modelname
49 self.L.load(filename)
50 T = self.L.findType(modelname)
51 M = T.getSimulation('sim')
52 M.build()
53 M.solve(ascpy.Solver(solvername),ascpy.SolverReporter())
54 M.run(T.getMethod('self_test'))
55 return M
56
57 class TestCompiler(Ascend):
58
59 def testloading(self):
60 pass
61
62 def testsystema4l(self):
63 self.L.load('system.a4l')
64
65 def testatomsa4l(self):
66 self.L.load('atoms.a4l')
67
68 class TestSolver(AscendSelfTester):
69
70 def testlog10(self):
71 self._run('testlog10')
72
73 def testconopt(self):
74 self._run('testconopt',"CONOPT")
75
76 def testcmslv2(self):
77 self._run('testcmslv2',"CMSlv")
78
79 def testsunpos1(self):
80 self._run('example_1_6_1',"QRSlv","johnpye/sunpos.a4c")
81
82 def testsunpos2(self):
83 self._run('example_1_6_2',"QRSlv","johnpye/sunpos.a4c")
84
85 def testsunpos3(self):
86 self._run('example_1_7_1',"QRSlv","johnpye/sunpos.a4c")
87
88 def testsunpos4(self):
89 self._run('example_1_7_2',"QRSlv","johnpye/sunpos.a4c")
90
91 def testsunpos5(self):
92 self._run('example_1_7_3',"QRSlv","johnpye/sunpos.a4c")
93
94 def testsunpos6(self):
95 self._run('example_1_8_1',"QRSlv","johnpye/sunpos.a4c")
96
97 def testinstanceas(self):
98 M = self._run('example_1_6_1',"QRSlv","johnpye/sunpos.a4c")
99 self.assertAlmostEqual( float(M.t_solar), M.t_solar.as("s"))
100 self.assertAlmostEqual( float(M.t_solar)/3600, M.t_solar.as("h"))
101
102 class TestMatrix(AscendSelfTester):
103 def testlog10(self):
104 M = self._run('testlog10')
105 print M.getMatrix().write(sys.stderr,"mmio")
106
107
108 class TestIntegrator(Ascend):
109
110 def testListIntegrators(self):
111 I = ascpy.Integrator.getEngines()
112 s1 = sorted([str(i) for i in I.values()])
113 s2 = sorted(['IDA','LSODE','AWW'])
114 assert s1==s2
115
116 # this routine is reused by both testIDA and testLSODE
117 def _testIntegrator(self,integratorname):
118 self.L.load('johnpye/shm.a4c')
119 M = self.L.findType('shm').getSimulation('sim')
120 M.setSolver(ascpy.Solver('QRSlv'))
121 P = M.getParameters()
122 M.setParameter('feastol',1e-12)
123 print M.getChildren()
124 assert float(M.x) == 10.0
125 assert float(M.v) == 0.0
126 t_end = math.pi
127
128 I = ascpy.Integrator(M)
129 I.setReporter(ascpy.IntegratorReporterNull(I))
130 I.setEngine(integratorname);
131 I.setLinearTimesteps(ascpy.Units("s"), 0.0, t_end, 100);
132 I.setMinSubStep(0.0001); # these limits are required by IDA at present (numeric diff)
133 I.setMaxSubStep(0.1);
134 I.setInitialSubStep(0.001);
135 I.setMaxSubSteps(200);
136 if(integratorname=='IDA'):
137 I.setParameter('autodiff',False)
138 for p in M.getParameters():
139 print p.getName(),"=",p.getValue()
140 I.analyse();
141 I.solve();
142 print "At end of simulation,"
143 print "x = %f" % M.x
144 print "v = %f" % M.v
145 assert abs(float(M.x) + 10) < 1e-2
146 assert abs(float(M.v)) < 1e-2
147 assert I.getNumObservedVars() == 3
148
149 def testInvalidIntegrator(self):
150 self.L.load('johnpye/shm.a4c')
151 M = self.L.findType('shm').getSimulation('sim')
152 M.setSolver(ascpy.Solver('QRSlv'))
153 I = ascpy.Integrator(M)
154 try:
155 I.setEngine('___NONEXISTENT____')
156 except RuntimeError:
157 return
158 self.fail("setEngine did not raise error!")
159
160 def testLSODE(self):
161 self._testIntegrator('LSODE')
162
163 def testIDA(self):
164 self._testIntegrator('IDA')
165
166 def testparameters(self):
167 self.L.load('johnpye/shm.a4c')
168 M = self.L.findType('shm').getSimulation('sim')
169 M.build()
170 I = ascpy.Integrator(M)
171 I.setEngine('IDA')
172 P = I.getParameters()
173 for p in P:
174 print p.getName(),"=",p.getValue()
175 assert len(P)==11
176 assert P[0].isStr()
177 assert P[0].getName()=="linsolver"
178 assert P[0].getValue()=='SPGMR'
179 assert P[2].getName()=="autodiff"
180 assert P[2].getValue()==True
181 assert P[7].getName()=="atolvect"
182 assert P[7].getBoolValue() == True
183 P[2].setBoolValue(False)
184 assert P[2].getBoolValue()==False
185 I.setParameters(P)
186 assert I.getParameterValue('autodiff')==False
187 I.setParameter('autodiff',True)
188 try:
189 v = I.getParameterValue('nonexist')
190 except KeyError:
191 pass
192 else:
193 self.fail('Failed to trip invalid Integrator parameter')
194
195 class TestLSODE(Ascend):
196
197 def testzill(self):
198 self.L.load('johnpye/zill.a4c')
199 T = self.L.findType('zill')
200 M = T.getSimulation('sim')
201 M.setSolver(ascpy.Solver('QRSlv'))
202 I = ascpy.Integrator(M)
203 I.setEngine('LSODE')
204 I.setMinSubStep(1e-7)
205 I.setMaxSubStep(0.001)
206 I.setMaxSubSteps(10000)
207 I.setReporter(ascpy.IntegratorReporterConsole(I))
208 I.setLinearTimesteps(ascpy.Units(), 1.0, 1.5, 5)
209 I.analyse()
210 I.solve()
211 M.run(T.getMethod('self_test'))
212
213 def testnewton(self):
214 sys.stderr.write("STARTING TESTNEWTON\n")
215 self.L.load('johnpye/newton.a4c')
216 T = self.L.findType('newton')
217 M = T.getSimulation('sim')
218 M.solve(ascpy.Solver("QRSlv"),ascpy.SolverReporter())
219 I = ascpy.Integrator(M)
220 I.setEngine('LSODE')
221 I.setParameter('rtolvect',False)
222 I.setParameter('rtol',1e-7)
223 I.setParameter('atolvect',False)
224 I.setParameter('atol',1e-7)
225 I.setMinSubStep(1e-7)
226 I.setMaxSubStep(0.001)
227 I.setMaxSubSteps(10000)
228
229 I.setReporter(ascpy.IntegratorReporterConsole(I))
230 I.setLinearTimesteps(ascpy.Units("s"), 0, 2*float(M.v)/float(M.g), 2)
231 I.analyse()
232 I.solve()
233 print "At end of simulation,"
234 print "x = %f" % M.x
235 print "v = %f" % M.v
236 M.run(T.getMethod('self_test'))
237
238 def testlotka(self):
239 self.L.load('johnpye/lotka.a4c')
240 M = self.L.findType('lotka').getSimulation('sim')
241 M.setSolver(ascpy.Solver("QRSlv"))
242 I = ascpy.Integrator(M)
243 I.setEngine('LSODE')
244 I.setReporter(ascpy.IntegratorReporterConsole(I))
245 I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 5)
246 I.analyse()
247 print "Number of vars = %d" % I.getNumVars()
248 assert I.getNumVars()==2
249 I.solve()
250 assert I.getNumObservedVars() == 3;
251 assert abs(M.R - 832) < 1.0
252 assert abs(M.F - 21.36) < 0.1
253
254 #-------------------------------------------------------------------------------
255 # Testing of a external blackbox functions
256
257 class TestBlackBox(AscendSelfTester):
258 def testparsefail0(self):
259 try:
260 self.L.load('test/blackbox/parsefail0.a4c')
261 self.fail("parsefail0 should not have loaded without errors")
262 except:
263 pass
264
265 def testparsefail1(self):
266 try:
267 self.L.load('test/blackbox/parsefail1.a4c')
268 self.fail("parsefail1 should not have loaded without errors")
269 except:
270 pass
271
272 def testparsefail2(self):
273 try:
274 self.L.load('test/blackbox/parsefail2.a4c')
275 self.fail("parsefail2 should not have loaded without errors")
276 except:
277 pass
278
279 def testparsefail3(self):
280 try:
281 self.L.load('test/blackbox/parsefail3.a4c')
282 self.fail("parsefail3 should not have loaded without errors")
283 except:
284 pass
285
286 def testparsefail4(self):
287 try:
288 self.L.load('test/blackbox/parsefail4.a4c')
289 self.fail("parsefail4 should not have loaded")
290 except:
291 pass
292
293 def testfail1(self):
294 """Mismatched arg counts check-- tests bbox, not ascend."""
295 self.L.load('test/blackbox/fail1.a4c')
296 try:
297 M = self.L.findType('fail1').getSimulation('sim')
298 self.fail("expected exception was not raised")
299 except RuntimeError,e:
300 print "Caught exception '%s', assumed ok" % e
301
302 def testfail2(self):
303 """Incorrect data arg check -- tests bbox, not ascend"""
304 self.L.load('test/blackbox/fail2.a4c')
305 try:
306 M = self.L.findType('fail2').getSimulation('sim')
307 self.fail("expected exception was not raised")
308 except RuntimeError,e:
309 print "Caught exception '%s', assumed ok (should mention errors during instantiation)" % e
310
311 def testpass1(self):
312 """simple single bbox forward solve"""
313 M = self._run('pass1',filename='test/blackbox/pass.a4c')
314
315 def testpass2(self):
316 """simple single bbox reverse solve"""
317 M = self._run('pass2',filename='test/blackbox/pass.a4c')
318
319 def testpass3(self):
320 """simple double bbox solve"""
321 M = self._run('pass3',filename='test/blackbox/pass3.a4c')
322
323 def testpass4(self):
324 """simple double bbox reverse solve"""
325 M = self._run('pass4',filename='test/blackbox/pass3.a4c')
326
327 def testpass5(self):
328 M = self._run('pass5',filename='test/blackbox/pass5.a4c')
329
330 def testpass6(self):
331 M = self._run('pass6',filename='test/blackbox/pass5.a4c')
332
333 def testpass7(self):
334 M = self._run('pass7',filename='test/blackbox/passmerge.a4c')
335
336 def testpass8(self):
337 M = self._run('pass8',filename='test/blackbox/passmerge.a4c')
338
339 def testpass9(self):
340 M = self._run('pass9',filename='test/blackbox/passmerge.a4c')
341
342 def testpass10(self):
343 M = self._run('pass10',filename='test/blackbox/passmerge.a4c')
344
345 def testpass11(self):
346 M = self._run('pass11',filename='test/blackbox/passmerge.a4c')
347
348 def testpass12(self):
349 M = self._run('pass12',filename='test/blackbox/passmerge.a4c')
350
351 # this test doesn't work: 'system is inconsistent' -- and structurally singular
352 # def testpass13(self):
353 # """cross-merged input/output solve"""
354 # M = self._run('pass13',filename='test/blackbox/passmerge.a4c')
355
356 def testpass14(self):
357 """cross-merged input/output reverse solve"""
358 M = self._run('pass14',filename='test/blackbox/passmerge.a4c')
359
360 def testpass20(self):
361 M = self._run('pass20',filename='test/blackbox/passarray.a4c')
362
363 def testparsefail21(self):
364 """dense array of black boxes wrong syntax"""
365 try:
366 self.L.load('test/blackbox/parsefail21.a4c')
367 self.fail("parsefail21 should not have loaded without errors")
368 except:
369 pass
370
371 def testpass22(self):
372 M = self._run('pass22',filename='test/blackbox/passarray.a4c')
373
374 def testpass23(self):
375 M = self._run('pass23',filename='test/blackbox/passarray.a4c')
376
377 def testpass61(self):
378 M = self._run('pass61',filename='test/blackbox/reinstantiate.a4c')
379
380 def testpass62(self):
381 M = self._run('pass62',filename='test/blackbox/reinstantiate.a4c')
382
383 def testpass64(self):
384 M = self._run('pass64',filename='test/blackbox/reinstantiate.a4c')
385
386 def testpass65(self):
387 M = self._run('pass65',filename='test/blackbox/reinstantiate.a4c')
388
389 def testpass66(self):
390 M = self._run('pass66',filename='test/blackbox/reinstantiate.a4c')
391
392 def testpass67(self):
393 M = self._run('pass67',filename='test/blackbox/reinstantiate.a4c')
394
395 class TestExtFn(AscendSelfTester):
396 def testextfntest(self):
397 M = self._run('extfntest',filename='johnpye/extfn/extfntest.a4c')
398 self.assertAlmostEqual(M.y, 2);
399 self.assertAlmostEqual(M.x, 1);
400 self.assertAlmostEqual(M.y, M.x + 1);
401
402 def testextrelfor(self):
403 M = self._run('extrelfor',filename='johnpye/extfn/extrelfor.a4c')
404
405 ## @TODO fix bug with badly-named bbox rel in a loop (Ben, maybe)
406 # def testextrelforbadnaming(self):
407 # self.L.load('johnpye/extfn/extrelforbadnaming.a4c')
408 # T = self.L.findType('extrelfor')
409 # M = T.getSimulation('sim')
410 # M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
411 # print "x[1] = %f" % M.x[1]
412 # print "x[2] = %f" % M.x[2]
413 # print "x[3] = %f" % M.x[3]
414 # print "x[4] = %f" % M.x[4]
415 # print "x[5] = %f" % M.x[5]
416 # M.run(T.getMethod('self_test'))
417
418 def testextrelrepeat(self):
419 M = self._run('extrelrepeat',filename='johnpye/extfn/extrelrepeat.a4c')
420
421 #-------------------------------------------------------------------------------
422 # Testing of a ExtPy - external python methods
423
424 class TestExtPy(AscendSelfTester):
425 def test1(self):
426 self.L.load('johnpye/extpy/extpytest.a4c')
427 T = self.L.findType('extpytest')
428 M = T.getSimulation('sim')
429 M.run(T.getMethod('self_test'))
430
431 def test2(self):
432 self.L.load('johnpye/extpy/extpytest.a4c')
433 T = self.L.findType('extpytest')
434 M = T.getSimulation('sim')
435 M.run(T.getMethod('pythonthing'))
436 M.run(T.getMethod('pythonthing'))
437 M.run(T.getMethod('pythonthing'))
438 M.run(T.getMethod('pythonthing'))
439 # causes crash!
440
441 #-------------------------------------------------------------------------------
442 # Testing of saturated steam properties library (iapwssatprops.a4c)
443
444 class TestSteam(AscendSelfTester):
445 def testiapwssatprops1(self):
446 M = self._run('testiapwssatprops1',filename='steam/iapwssatprops.a4c')
447 def testiapwssatprops2(self):
448 M = self._run('testiapwssatprops2',filename='steam/iapwssatprops.a4c')
449 def testiapwssatprops3(self):
450 M = self._run('testiapwssatprops3',filename='steam/iapwssatprops.a4c')
451 def testsatsteamstream(self):
452 M = self._run('satsteamstream',filename='steam/satsteamstream.a4c')
453
454 def testsatsteamstream(self):
455 M = self._run('satsteamstream',filename='steam/satsteamstream.a4c')
456
457 ## @TODO fix error capture from bounds checking during initialisation
458 # def testiapwssat1(self):
459 # M = self._run('testiapwssat1',filename='steam/iapwssat.a4c')
460
461 def testdsgsat(self):
462 self.L.load('steam/dsgsat2.a4c')
463 T = self.L.findType('dsgsat2')
464 M = T.getSimulation('sim',False)
465 M.run(T.getMethod('on_load'))
466 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
467 self.assertAlmostEqual(M.dTw_dt[4],0.0);
468 M.run(T.getMethod('configure_dynamic'))
469 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
470 return M
471
472 def testintegLSODE(self):
473 M = self.testdsgsat()
474 M.qdot_s.setRealValueWithUnits(1000,"W/m")
475 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
476 #M.setParameter('
477 I = ascpy.Integrator(M)
478 I.setEngine('LSODE')
479 I.setParameter('meth','AM')
480 I.setParameter('maxord',12)
481 I.setReporter(ascpy.IntegratorReporterConsole(I))
482 I.setLinearTimesteps(ascpy.Units("s"), 0, 5, 1)
483 I.analyse()
484 I.solve()
485
486 def testintegIDA(self):
487 M = self.testdsgsat()
488 self.assertAlmostEqual(M.dTw_dt[4],0.0)
489 Tw1 = float(M.T_w[4])
490 T = self.L.findType('dsgsat2')
491 M.run(T.getMethod('free_states'))
492 I = ascpy.Integrator(M)
493 I.setEngine('IDA')
494 I.setParameter('linsolver','DENSE')
495 I.setParameter('safeeval',True)
496 I.setParameter('rtol',1e-8)
497 I.setInitialSubStep(0.01)
498 I.setMinSubStep(0.001)
499 I.setMaxSubSteps(100)
500 I.setReporter(ascpy.IntegratorReporterConsole(I))
501 I.setLinearTimesteps(ascpy.Units("s"), 0, 3600, 100)
502 I.analyse()
503 I.solve()
504 I.analyse()
505 I.solve()
506 self.assertAlmostEqual(float(M.T_w[4]),Tw1)
507 M.qdot_s.setRealValueWithUnits(1000,"W/m")
508 self.assertAlmostEqual(M.qdot_s.as("W/m"),1000)
509 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
510 self.assertNotAlmostEqual(M.dTw_dt[4],0.0)
511 # I = ascpy.Integrator(M)
512 # I.setEngine('LSODE')
513 # I.setReporter(ascpy.IntegratorReporterConsole(I))
514 # I.setReporter(ascpy.IntegratorReporterConsole(I))
515 # I.setLinearTimesteps(ascpy.Units("s"), 0, 5, 100)
516 # I.setMinSubStep(0.0001)
517 # I.setMaxSubStep(100)
518 # I.setInitialSubStep(0.1)
519 # I.analyse()
520 # I.solve()
521
522 #-------------------------------------------------------------------------------
523 # Testing of freesteam external steam properties functions
524
525 with_freesteam = True
526 try:
527 # we assume that if the freesteam python module is installed, the ASCEND
528 # external library will also be.
529 import freesteam
530 have_freesteam = True
531 except ImportError,e:
532 have_freesteam = False
533
534 if with_freesteam and have_freesteam:
535 class TestFreesteam(AscendSelfTester):
536 # def testfreesteamtest(self):
537 # """run the self-test cases bundled with freesteam"""
538 # self._run('testfreesteam',filename='testfreesteam.a4c')
539
540 def testload(self):
541 """check that we can load 'thermalequilibrium2' (IMPORT "freesteam", etc)"""
542 self.L.load('johnpye/thermalequilibrium2.a4c')
543
544 def testinstantiate(self):
545 """load an instantiate 'thermalequilibrium2'"""
546 self.testload()
547 M = self.L.findType('thermalequilibrium2').getSimulation('sim')
548 return M
549
550 def testintegrate(self):
551 """integrate transfer of heat from one mass of water/steam to another
552 according to Newton's law of cooling"""
553 M = self.testinstantiate()
554 M.setSolver(ascpy.Solver("QRSlv"))
555 I = ascpy.Integrator(M)
556 I.setEngine('LSODE')
557 I.setReporter(ascpy.IntegratorReporterConsole(I))
558 I.setLinearTimesteps(ascpy.Units("s"), 0, 3000, 30)
559 I.setMinSubStep(0.01)
560 I.setInitialSubStep(1)
561 I.analyse()
562 print "Number of vars = %d" % I.getNumVars()
563 assert I.getNumVars()==2
564 I.solve()
565 assert I.getNumObservedVars() == 3;
566 print "S[1].T = %f K" % M.S[1].T
567 print "S[2].T = %f K" % M.S[2].T
568 print "Q = %f W" % M.Q
569 self.assertAlmostEqual(float(M.S[1].T),506.77225109,4);
570 self.assertAlmostEqual(float(M.S[2].T),511.605173967,5);
571 self.assertAlmostEqual(float(M.Q),-48.32922877329,3);
572 self.assertAlmostEqual(float(M.t),3000);
573 print "Note that the above values have not been verified analytically"
574
575
576 #-------------------------------------------------------------------------------
577 # Testing of IDA models using DENSE linear solver
578
579 class TestIDADENSE(Ascend):
580 """IDA DAE integrator, DENSE linear solver"""
581
582 def testnewton(self):
583 sys.stderr.write("STARTING TESTNEWTON\n")
584 self.L.load('johnpye/newton.a4c')
585 T = self.L.findType('newton')
586 M = T.getSimulation('sim')
587 M.solve(ascpy.Solver("QRSlv"),ascpy.SolverReporter())
588 I = ascpy.Integrator(M)
589 I.setEngine('IDA')
590 I.setParameter('linsolver','DENSE')
591 I.setParameter('safeeval',True)
592 I.setParameter('rtol',1e-8)
593 I.setMaxSubStep(0.001)
594 I.setMaxSubSteps(10000)
595
596 I.setReporter(ascpy.IntegratorReporterConsole(I))
597 I.setLinearTimesteps(ascpy.Units("s"), 0, 2*float(M.v)/float(M.g), 2)
598 I.analyse()
599 I.solve()
600 print "At end of simulation,"
601 print "x = %f" % M.x
602 print "v = %f" % M.v
603 M.run(T.getMethod('self_test'))
604
605 def testlotka(self):
606 self.L.load('johnpye/lotka.a4c')
607 M = self.L.findType('lotka').getSimulation('sim')
608 M.setSolver(ascpy.Solver("QRSlv"))
609 I = ascpy.Integrator(M)
610 I.setEngine('IDA')
611 I.setReporter(ascpy.IntegratorReporterConsole(I))
612 I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 5);
613 I.setParameter('linsolver','DENSE')
614 I.setParameter('rtol',1e-8);
615 I.analyse()
616 assert I.getNumVars()==2
617 assert abs(M.R - 1000) < 1e-300
618 I.solve()
619 assert I.getNumObservedVars() == 3
620 assert abs(M.R - 832) < 1.0
621 assert abs(M.F - 21.36) < 0.1
622
623 def testdenx(self):
624 print "-----------------------------====="
625 self.L.load('johnpye/idadenx.a4c')
626 M = self.L.findType('idadenx').getSimulation('sim')
627 M.setSolver(ascpy.Solver("QRSlv"))
628 I = ascpy.Integrator(M)
629 I.setEngine('IDA')
630 I.setParameter('calcic','YA_YPD')
631 I.setParameter('linsolver','DENSE')
632 I.setReporter(ascpy.IntegratorReporterConsole(I))
633 I.setLogTimesteps(ascpy.Units("s"), 0.4, 4e10, 11)
634 I.setMaxSubStep(0);
635 I.setInitialSubStep(0)
636 I.setMaxSubSteps(0);
637 I.setParameter('autodiff',True)
638 I.analyse()
639 I.solve()
640 assert abs(float(M.y1) - 5.1091e-08) < 2e-9
641 assert abs(float(M.y2) - 2.0437e-13) < 2e-14
642 assert abs(float(M.y3) - 1.0) < 1e-5
643
644 ## @TODO fails during IDACalcIC (model too big?)
645 # def testkryx(self):
646 # self.L.load('johnpye/idakryx.a4c')
647 # ascpy.getCompiler().setUseRelationSharing(False)
648 # M = self.L.findType('idakryx').getSimulation('sim')
649 # M.setSolver(ascpy.Solver('QRSlv'))
650 # M.build()
651 # I = ascpy.Integrator(M)
652 # I.setEngine('IDA')
653 # I.setReporter(ascpy.IntegratorReporterConsole(I))
654 # I.setParameter('linsolver','DENSE')
655 # I.setParameter('maxl',8)
656 # I.setParameter('gsmodified',False)
657 # I.setParameter('autodiff',True)
658 # I.setParameter('rtol',0)
659 # I.setParameter('atol',1e-3);
660 # I.setParameter('atolvect',False)
661 # I.setParameter('calcic','YA_YDP')
662 # I.analyse()
663 # I.setLogTimesteps(ascpy.Units("s"), 0.01, 10.24, 11)
664 # I.solve()
665 # assert abs(M.u[2][2].getValue()) < 1e-5
666
667 #-------------------------------------------------------------------------------
668 # Testing of IDA models using SPGMR linear solver (Krylov)
669
670 # these tests are disabled until SPGMR preconditioning has been implemented
671 class TestIDASPGMR:#(Ascend):
672 def testlotka(self):
673 self.L.load('johnpye/lotka.a4c')
674 M = self.L.findType('lotka').getSimulation('sim')
675 M.setSolver(ascpy.Solver("QRSlv"))
676 I = ascpy.Integrator(M)
677 I.setEngine('IDA')
678 I.setReporter(ascpy.IntegratorReporterConsole(I))
679 I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 5)
680 I.setParameter('rtol',1e-8)
681 I.analyse()
682 assert I.getNumVars()==2
683 assert abs(M.R - 1000) < 1e-300
684 I.solve()
685 assert I.getNumObservedVars() == 3
686 assert abs(M.R - 832) < 1.0
687 assert abs(M.F - 21.36) < 0.1
688
689
690 def testkryx(self):
691 self.L.load('johnpye/idakryx.a4c')
692 M = self.L.findType('idakryx').getSimulation('sim')
693 M.build()
694 I = ascpy.Integrator(M)
695 I.setEngine('IDA')
696 I.setReporter(ascpy.IntegratorReporterConsole(I))
697 I.setParameter('linsolver','SPGMR')
698 I.setParameter('prec','JACOBI')
699 I.setParameter('maxl',8)
700 I.setParameter('gsmodified',False)
701 I.setParameter('autodiff',True)
702 I.setParameter('gsmodified',True)
703 I.setParameter('rtol',0)
704 I.setParameter('atol',1e-3);
705 I.setParameter('atolvect',False)
706 I.setParameter('calcic','Y')
707 I.analyse()
708 I.setLogTimesteps(ascpy.Units("s"), 0.01, 10.24, 10);
709 print M.udot[1][3]
710 I.solve()
711 assert 0
712
713 def testzill(self):
714 self.L.load('johnpye/zill.a4c')
715 T = self.L.findType('zill')
716 M = T.getSimulation('sim')
717 M.setSolver(ascpy.Solver('QRSlv'))
718 I = ascpy.Integrator(M)
719 I.setEngine('IDA')
720 I.setParameter('safeeval',False)
721 I.setMinSubStep(1e-7)
722 I.setMaxSubStep(0.001)
723 I.setMaxSubSteps(10000)
724 I.setReporter(ascpy.IntegratorReporterConsole(I))
725 I.setLinearTimesteps(ascpy.Units(), 1.0, 1.5, 5)
726 I.analyse()
727 I.solve()
728 M.run(T.getMethod('self_test'))
729
730 def testdenxSPGMR(self):
731 self.L.load('johnpye/idadenx.a4c')
732 M = self.L.findType('idadenx').getSimulation('sim')
733 M.setSolver(ascpy.Solver('QRSlv'))
734 I = ascpy.Integrator(M)
735 I.setEngine('IDA')
736 I.setReporter(ascpy.IntegratorReporterConsole(I))
737 I.setLogTimesteps(ascpy.Units("s"), 0.4, 4e10, 11)
738 I.setMaxSubStep(0);
739 I.setInitialSubStep(0);
740 I.setMaxSubSteps(0);
741 I.setParameter('autodiff',True)
742 I.setParameter('linsolver','SPGMR')
743 I.setParameter('gsmodified',False)
744 I.setParameter('maxncf',10)
745 I.analyse()
746 I.solve()
747 assert abs(float(M.y1) - 5.1091e-08) < 1e-10
748 assert abs(float(M.y2) - 2.0437e-13) < 1e-15
749 assert abs(float(M.y3) - 1.0) < 1e-5
750
751 # move code above down here if you want to temporarily avoid testing it
752 class NotToBeTested:
753 def nothing(self):
754 pass
755
756 if __name__=='__main__':
757 # a whole bag of tricks to make sure we get the necessary dirs in our ascend, python and ld path vars
758 restart = 0
759
760 if platform.system()=="Windows":
761 LD_LIBRARY_PATH="PATH"
762 SEP = ";"
763 else:
764 LD_LIBRARY_PATH="LD_LIBRARY_PATH"
765 SEP = ":"
766
767 freesteamdir = os.path.expanduser("~/freesteam/ascend")
768 modeldirs = [os.path.abspath(os.path.join(sys.path[0],"models")),os.path.abspath(freesteamdir)]
769 if not os.environ.get('ASCENDLIBRARY'):
770 os.environ['ASCENDLIBRARY'] = SEP.join(modeldirs)
771 restart = 1
772 else:
773 envmodelsdir = [os.path.abspath(i) for i in os.environ['ASCENDLIBRARY'].split(SEP)]
774 for l in modeldirs:
775 if l in envmodelsdir[len(modeldirs):]:
776 envmodelsdir.remove(l)
777 restart = 1
778 for l in modeldirs:
779 if l not in envmodelsdir:
780 envmodelsdir.insert(0,l)
781 restart = 1
782 os.environ['ASCENDLIBRARY'] = SEP.join(envmodelsdir)
783
784 libdirs = ["pygtk","."]
785 libdirs = [os.path.normpath(os.path.join(sys.path[0],l)) for l in libdirs]
786 if not os.environ.get(LD_LIBRARY_PATH):
787 os.environ[LD_LIBRARY_PATH]=SEP.join(libdirs)
788 restart = 1
789 else:
790 envlibdirs = [os.path.normpath(i) for i in os.environ[LD_LIBRARY_PATH].split(SEP)]
791 for l in libdirs:
792 if l in envlibdirs[len(libdirs):]:
793 envlibdirs.remove(l)
794 restart = 1
795 for l in libdirs:
796 if l not in envlibdirs:
797 envlibdirs.insert(0,l)
798 restart = 1
799 os.environ[LD_LIBRARY_PATH] = SEP.join(envlibdirs)
800
801 pypath = os.path.normpath(os.path.join(sys.path[0],"pygtk"))
802 if not os.environ.get('PYTHONPATH'):
803 os.environ['PYTHONPATH']=pypath
804 else:
805 envpypath = os.environ['PYTHONPATH'].split(SEP)
806 if pypath not in envpypath:
807 envpypath.insert(0,pypath)
808 os.environ['PYTHONPATH']=SEP.join(envpypath)
809 restart = 1
810
811 if restart:
812 script = os.path.join(sys.path[0],"test.py")
813 print "Restarting with..."
814 print " LD_LIBRARY_PATH = %s" % os.environ.get(LD_LIBRARY_PATH)
815 print " PYTHONPATH = %s" % os.environ.get('PYTHONPATH')
816 print " ASCENDLIBRARY = %s" % os.environ.get('ASCENDLIBRARY')
817 os.execvp("python",[script] + sys.argv)
818
819 import ascpy
820
821 try:
822 import cunit
823 except:
824 pass
825
826 atexit.register(ascpy.shutdown)
827 #suite = unittest.TestSuite()
828 #suite = unittest.defaultTestLoader.loadTestsFromName('__main__')
829 #unittest.TextTestRunner(verbosity=2).run(suite)
830 unittest.main()

Properties

Name Value
svn:executable *

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