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

Contents of /trunk/test.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1133 - (show annotations) (download) (as text)
Sun Jan 14 11:51:48 2007 UTC (13 years, 4 months ago) by johnpye
File MIME type: text/x-python
File size: 25275 byte(s)
Removed the 'REX' and 'IEX' array aliases (added the solver parameter comments directly in the slv_param_* calls).
Renamed Simulation::[gs]etSolverParameters to Simulation::[gs]etParameters.
Added [gs]etParameter (singular) methods to SWIG wrapper.
Fixed missing NULL in IDA.
Fixed bug with BDF/AM wrong way round in LSODE.
Removed some debug output from slv.c
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 # @TODO fix bug with unpivoted node[i].hg_expr eqns.
462 def testdsgsat(self):
463 self.L.load('steam/dsgsat2.a4c')
464 T = self.L.findType('dsgsat2')
465 M = T.getSimulation('sim',False)
466 M.run(T.getMethod('on_load'))
467 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
468 self.assertAlmostEqual(M.dTw_dt[4],0.0);
469 M.run(T.getMethod('configure_dynamic'))
470 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
471 return M
472
473 def testintegLSODE(self):
474 M = self.testdsgsat()
475 M.qdot_s.setRealValueWithUnits(1000,"W/m")
476 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
477 I = ascpy.Integrator(M)
478 I.setEngine('LSODE')
479 I.setParameter('meth','AM')
480 I.setReporter(ascpy.IntegratorReporterConsole(I))
481 I.setLinearTimesteps(ascpy.Units("s"), 0, 5, 1)
482 I.analyse()
483 I.solve()
484
485 def testintegIDA(self):
486 self.assertAlmostEqual(M.dTw_dt[4],0.0)
487 Tw1 = float(M.T_w[4])
488 I = ascpy.Integrator(M)
489 I.setEngine('IDA')
490 I.setParameter('linsolver','DENSE')
491 I.setParameter('safeeval',True)
492 I.setParameter('rtol',1e-8)
493 I.setInitialSubStep(0.01)
494 I.setMinSubSteps(0.001)
495 I.setMaxSubSteps(100)
496 I.setReporter(ascpy.IntegratorReporterConsole(I))
497 I.setLinearTimesteps(ascpy.Units("s"), 0, 3600, 100)
498 I.analyse()
499 I.solve()
500 I.analyse()
501 I.solve()
502 self.assertAlmostEqual(float(M.T_w[4]),Tw1)
503 M.qdot_s.setRealValueWithUnits(1000,"W/m")
504 self.assertAlmostEqual(M.qdot_s.as("W/m"),1000)
505 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
506 self.assertNotAlmostEqual(M.dTw_dt[4],0.0)
507 # I = ascpy.Integrator(M)
508 # I.setEngine('LSODE')
509 # I.setReporter(ascpy.IntegratorReporterConsole(I))
510 # I.setReporter(ascpy.IntegratorReporterConsole(I))
511 # I.setLinearTimesteps(ascpy.Units("s"), 0, 5, 100)
512 # I.setMinSubStep(0.0001)
513 # I.setMaxSubStep(100)
514 # I.setInitialSubStep(0.1)
515 # I.analyse()
516 # I.solve()
517
518 #-------------------------------------------------------------------------------
519 # Testing of freesteam external steam properties functions
520
521 with_freesteam = True
522 try:
523 # we assume that if the freesteam python module is installed, the ASCEND
524 # external library will also be.
525 import freesteam
526 have_freesteam = True
527 except ImportError,e:
528 have_freesteam = False
529
530 if with_freesteam and have_freesteam:
531 class TestFreesteam(AscendSelfTester):
532 # def testfreesteamtest(self):
533 # """run the self-test cases bundled with freesteam"""
534 # self._run('testfreesteam',filename='testfreesteam.a4c')
535
536 def testload(self):
537 """check that we can load 'thermalequilibrium2' (IMPORT "freesteam", etc)"""
538 self.L.load('johnpye/thermalequilibrium2.a4c')
539
540 def testinstantiate(self):
541 """load an instantiate 'thermalequilibrium2'"""
542 self.testload()
543 M = self.L.findType('thermalequilibrium2').getSimulation('sim')
544 return M
545
546 def testintegrate(self):
547 """integrate transfer of heat from one mass of water/steam to another
548 according to Newton's law of cooling"""
549 M = self.testinstantiate()
550 M.setSolver(ascpy.Solver("QRSlv"))
551 I = ascpy.Integrator(M)
552 I.setEngine('LSODE')
553 I.setReporter(ascpy.IntegratorReporterConsole(I))
554 I.setLinearTimesteps(ascpy.Units("s"), 0, 3000, 30)
555 I.setMinSubStep(0.01)
556 I.setInitialSubStep(1)
557 I.analyse()
558 print "Number of vars = %d" % I.getNumVars()
559 assert I.getNumVars()==2
560 I.solve()
561 assert I.getNumObservedVars() == 3;
562 print "S[1].T = %f K" % M.S[1].T
563 print "S[2].T = %f K" % M.S[2].T
564 print "Q = %f W" % M.Q
565 self.assertAlmostEqual(float(M.S[1].T),506.77225109,4);
566 self.assertAlmostEqual(float(M.S[2].T),511.605173967,5);
567 self.assertAlmostEqual(float(M.Q),-48.32922877329,3);
568 self.assertAlmostEqual(float(M.t),3000);
569 print "Note that the above values have not been verified analytically"
570
571
572 #-------------------------------------------------------------------------------
573 # Testing of IDA models using DENSE linear solver
574
575 class TestIDADENSE(Ascend):
576 """IDA DAE integrator, DENSE linear solver"""
577
578 def testnewton(self):
579 sys.stderr.write("STARTING TESTNEWTON\n")
580 self.L.load('johnpye/newton.a4c')
581 T = self.L.findType('newton')
582 M = T.getSimulation('sim')
583 M.solve(ascpy.Solver("QRSlv"),ascpy.SolverReporter())
584 I = ascpy.Integrator(M)
585 I.setEngine('IDA')
586 I.setParameter('linsolver','DENSE')
587 I.setParameter('safeeval',True)
588 I.setParameter('rtol',1e-8)
589 I.setMaxSubStep(0.001)
590 I.setMaxSubSteps(10000)
591
592 I.setReporter(ascpy.IntegratorReporterConsole(I))
593 I.setLinearTimesteps(ascpy.Units("s"), 0, 2*float(M.v)/float(M.g), 2)
594 I.analyse()
595 I.solve()
596 print "At end of simulation,"
597 print "x = %f" % M.x
598 print "v = %f" % M.v
599 M.run(T.getMethod('self_test'))
600
601 def testlotka(self):
602 self.L.load('johnpye/lotka.a4c')
603 M = self.L.findType('lotka').getSimulation('sim')
604 M.setSolver(ascpy.Solver("QRSlv"))
605 I = ascpy.Integrator(M)
606 I.setEngine('IDA')
607 I.setReporter(ascpy.IntegratorReporterConsole(I))
608 I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 5);
609 I.setParameter('linsolver','DENSE')
610 I.setParameter('rtol',1e-8);
611 I.analyse()
612 assert I.getNumVars()==2
613 assert abs(M.R - 1000) < 1e-300
614 I.solve()
615 assert I.getNumObservedVars() == 3
616 assert abs(M.R - 832) < 1.0
617 assert abs(M.F - 21.36) < 0.1
618
619 def testdenx(self):
620 print "-----------------------------====="
621 self.L.load('johnpye/idadenx.a4c')
622 M = self.L.findType('idadenx').getSimulation('sim')
623 M.setSolver(ascpy.Solver("QRSlv"))
624 I = ascpy.Integrator(M)
625 I.setEngine('IDA')
626 I.setParameter('calcic','YA_YPD')
627 I.setParameter('linsolver','DENSE')
628 I.setReporter(ascpy.IntegratorReporterConsole(I))
629 I.setLogTimesteps(ascpy.Units("s"), 0.4, 4e10, 11)
630 I.setMaxSubStep(0);
631 I.setInitialSubStep(0)
632 I.setMaxSubSteps(0);
633 I.setParameter('autodiff',True)
634 I.analyse()
635 I.solve()
636 assert abs(float(M.y1) - 5.1091e-08) < 2e-9
637 assert abs(float(M.y2) - 2.0437e-13) < 2e-14
638 assert abs(float(M.y3) - 1.0) < 1e-5
639
640 ## @TODO fails during IDACalcIC (model too big?)
641 # def testkryx(self):
642 # self.L.load('johnpye/idakryx.a4c')
643 # ascpy.getCompiler().setUseRelationSharing(False)
644 # M = self.L.findType('idakryx').getSimulation('sim')
645 # M.setSolver(ascpy.Solver('QRSlv'))
646 # M.build()
647 # I = ascpy.Integrator(M)
648 # I.setEngine('IDA')
649 # I.setReporter(ascpy.IntegratorReporterConsole(I))
650 # I.setParameter('linsolver','DENSE')
651 # I.setParameter('maxl',8)
652 # I.setParameter('gsmodified',False)
653 # I.setParameter('autodiff',True)
654 # I.setParameter('rtol',0)
655 # I.setParameter('atol',1e-3);
656 # I.setParameter('atolvect',False)
657 # I.setParameter('calcic','YA_YDP')
658 # I.analyse()
659 # I.setLogTimesteps(ascpy.Units("s"), 0.01, 10.24, 11)
660 # I.solve()
661 # assert abs(M.u[2][2].getValue()) < 1e-5
662
663 #-------------------------------------------------------------------------------
664 # Testing of IDA models using SPGMR linear solver (Krylov)
665
666 # these tests are disabled until SPGMR preconditioning has been implemented
667 class TestIDASPGMR:#(Ascend):
668 def testlotka(self):
669 self.L.load('johnpye/lotka.a4c')
670 M = self.L.findType('lotka').getSimulation('sim')
671 M.setSolver(ascpy.Solver("QRSlv"))
672 I = ascpy.Integrator(M)
673 I.setEngine('IDA')
674 I.setReporter(ascpy.IntegratorReporterConsole(I))
675 I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 5)
676 I.setParameter('rtol',1e-8)
677 I.analyse()
678 assert I.getNumVars()==2
679 assert abs(M.R - 1000) < 1e-300
680 I.solve()
681 assert I.getNumObservedVars() == 3
682 assert abs(M.R - 832) < 1.0
683 assert abs(M.F - 21.36) < 0.1
684
685
686 def testkryx(self):
687 self.L.load('johnpye/idakryx.a4c')
688 M = self.L.findType('idakryx').getSimulation('sim')
689 M.build()
690 I = ascpy.Integrator(M)
691 I.setEngine('IDA')
692 I.setReporter(ascpy.IntegratorReporterConsole(I))
693 I.setParameter('linsolver','SPGMR')
694 I.setParameter('prec','JACOBI')
695 I.setParameter('maxl',8)
696 I.setParameter('gsmodified',False)
697 I.setParameter('autodiff',True)
698 I.setParameter('gsmodified',True)
699 I.setParameter('rtol',0)
700 I.setParameter('atol',1e-3);
701 I.setParameter('atolvect',False)
702 I.setParameter('calcic','Y')
703 I.analyse()
704 I.setLogTimesteps(ascpy.Units("s"), 0.01, 10.24, 10);
705 print M.udot[1][3]
706 I.solve()
707 assert 0
708
709 def testzill(self):
710 self.L.load('johnpye/zill.a4c')
711 T = self.L.findType('zill')
712 M = T.getSimulation('sim')
713 M.setSolver(ascpy.Solver('QRSlv'))
714 I = ascpy.Integrator(M)
715 I.setEngine('IDA')
716 I.setParameter('safeeval',False)
717 I.setMinSubStep(1e-7)
718 I.setMaxSubStep(0.001)
719 I.setMaxSubSteps(10000)
720 I.setReporter(ascpy.IntegratorReporterConsole(I))
721 I.setLinearTimesteps(ascpy.Units(), 1.0, 1.5, 5)
722 I.analyse()
723 I.solve()
724 M.run(T.getMethod('self_test'))
725
726 def testdenxSPGMR(self):
727 self.L.load('johnpye/idadenx.a4c')
728 M = self.L.findType('idadenx').getSimulation('sim')
729 M.setSolver(ascpy.Solver('QRSlv'))
730 I = ascpy.Integrator(M)
731 I.setEngine('IDA')
732 I.setReporter(ascpy.IntegratorReporterConsole(I))
733 I.setLogTimesteps(ascpy.Units("s"), 0.4, 4e10, 11)
734 I.setMaxSubStep(0);
735 I.setInitialSubStep(0);
736 I.setMaxSubSteps(0);
737 I.setParameter('autodiff',True)
738 I.setParameter('linsolver','SPGMR')
739 I.setParameter('gsmodified',False)
740 I.setParameter('maxncf',10)
741 I.analyse()
742 I.solve()
743 assert abs(float(M.y1) - 5.1091e-08) < 1e-10
744 assert abs(float(M.y2) - 2.0437e-13) < 1e-15
745 assert abs(float(M.y3) - 1.0) < 1e-5
746
747 # move code above down here if you want to temporarily avoid testing it
748 class NotToBeTested:
749 def nothing(self):
750 pass
751
752 if __name__=='__main__':
753 # a whole bag of tricks to make sure we get the necessary dirs in our ascend, python and ld path vars
754 restart = 0
755
756 if platform.system()=="Windows":
757 LD_LIBRARY_PATH="PATH"
758 SEP = ";"
759 else:
760 LD_LIBRARY_PATH="LD_LIBRARY_PATH"
761 SEP = ":"
762
763 freesteamdir = os.path.expanduser("~/freesteam/ascend")
764 modeldirs = [os.path.abspath(os.path.join(sys.path[0],"models")),os.path.abspath(freesteamdir)]
765 if not os.environ.get('ASCENDLIBRARY'):
766 os.environ['ASCENDLIBRARY'] = SEP.join(modeldirs)
767 restart = 1
768 else:
769 envmodelsdir = [os.path.abspath(i) for i in os.environ['ASCENDLIBRARY'].split(SEP)]
770 for l in modeldirs:
771 if l in envmodelsdir[len(modeldirs):]:
772 envmodelsdir.remove(l)
773 restart = 1
774 for l in modeldirs:
775 if l not in envmodelsdir:
776 envmodelsdir.insert(0,l)
777 restart = 1
778 os.environ['ASCENDLIBRARY'] = SEP.join(envmodelsdir)
779
780 libdirs = ["pygtk","."]
781 libdirs = [os.path.normpath(os.path.join(sys.path[0],l)) for l in libdirs]
782 if not os.environ.get(LD_LIBRARY_PATH):
783 os.environ[LD_LIBRARY_PATH]=SEP.join(libdirs)
784 restart = 1
785 else:
786 envlibdirs = [os.path.normpath(i) for i in os.environ[LD_LIBRARY_PATH].split(SEP)]
787 for l in libdirs:
788 if l in envlibdirs[len(libdirs):]:
789 envlibdirs.remove(l)
790 restart = 1
791 for l in libdirs:
792 if l not in envlibdirs:
793 envlibdirs.insert(0,l)
794 restart = 1
795 os.environ[LD_LIBRARY_PATH] = SEP.join(envlibdirs)
796
797 pypath = os.path.normpath(os.path.join(sys.path[0],"pygtk"))
798 if not os.environ.get('PYTHONPATH'):
799 os.environ['PYTHONPATH']=pypath
800 else:
801 envpypath = os.environ['PYTHONPATH'].split(SEP)
802 if pypath not in envpypath:
803 envpypath.insert(0,pypath)
804 os.environ['PYTHONPATH']=envpypath
805 restart = 1
806
807 if restart:
808 script = os.path.join(sys.path[0],"test.py")
809 print "Restarting with..."
810 print " LD_LIBRARY_PATH = %s" % os.environ.get(LD_LIBRARY_PATH)
811 print " PYTHONPATH = %s" % os.environ.get('PYTHONPATH')
812 print " ASCENDLIBRARY = %s" % os.environ.get('ASCENDLIBRARY')
813 os.execvp("python",[script] + sys.argv)
814
815 import ascpy
816
817 try:
818 import cunit
819 except:
820 pass
821
822 atexit.register(ascpy.shutdown)
823 #suite = unittest.TestSuite()
824 #suite = unittest.defaultTestLoader.loadTestsFromName('__main__')
825 #unittest.TextTestRunner(verbosity=2).run(suite)
826 unittest.main()

Properties

Name Value
svn:executable *

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