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

Contents of /trunk/test.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1251 - (show annotations) (download) (as text)
Sat Jan 27 05:04:49 2007 UTC (16 years, 4 months ago) by johnpye
File MIME type: text/x-python
File size: 31122 byte(s)
Fixed 'hires' test (needed to rack down the tolerances a bit)
Removed newton test (until we make some changes to the solvers var list)
All of TestIDADENSE passes now and will be added to the buildbot list.
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 _run(self,filen,modeln=""):
60 self.L.load('test/compiler/%s.a4c' % filen)
61 T = self.L.findType('%s%s' % (filen,modeln))
62 M = T.getSimulation('sim')
63 M.build()
64
65 def _runfail(self,filen,n,msg="failed"):
66 try:
67 self._run(filen,'fail%d' % n)
68 except Exception,e:
69 print "(EXPECTED) ERROR: %s" % e
70 return
71 self.fail(msg)
72
73
74 def testloading(self):
75 """library startup"""
76 pass
77
78 def testsystema4l(self):
79 """loading system.a4l?"""
80 self.L.load('system.a4l')
81
82 def testatomsa4l(self):
83 """loading atoms.a4l?"""
84 self.L.load('atoms.a4l')
85
86 def testmissingreq(self):
87 """flagging a missing REQUIRE"""
88 self._runfail('missingreq',1)
89
90 def testmissingsubreq(self):
91 """flagging a subsidiary missing REQUIRE"""
92 self._runfail('missingreq',1)
93
94 class TestSolver(AscendSelfTester):
95
96 def testlog10(self):
97 self._run('testlog10')
98
99 def testrootsofpoly(self):
100 self._run('roots_of_poly',filename="roots_of_poly.a4c")
101
102 def testcollapsingcan(self):
103 self._run('collapsingcan',filename="collapsingcan.a4c")
104
105 def testdistancecalc(self):
106 self._run('distance_calc',filename="distance_calc.a4c")
107
108 def testconopt(self):
109 self._run('testconopt',"CONOPT")
110
111 def testcmslv2(self):
112 self._run('testcmslv2',"CMSlv")
113
114 def testsunpos1(self):
115 self._run('example_1_6_1',"QRSlv","johnpye/sunpos.a4c")
116
117 def testsunpos2(self):
118 self._run('example_1_6_2',"QRSlv","johnpye/sunpos.a4c")
119
120 def testsunpos3(self):
121 self._run('example_1_7_1',"QRSlv","johnpye/sunpos.a4c")
122
123 def testsunpos4(self):
124 self._run('example_1_7_2',"QRSlv","johnpye/sunpos.a4c")
125
126 def testsunpos5(self):
127 self._run('example_1_7_3',"QRSlv","johnpye/sunpos.a4c")
128
129 def testsunpos6(self):
130 self._run('example_1_8_1',"QRSlv","johnpye/sunpos.a4c")
131
132 def testinstanceas(self):
133 M = self._run('example_1_6_1',"QRSlv","johnpye/sunpos.a4c")
134 self.assertAlmostEqual( float(M.t_solar), M.t_solar.as("s"))
135 self.assertAlmostEqual( float(M.t_solar)/3600, M.t_solar.as("h"))
136
137 class TestMatrix(AscendSelfTester):
138 def testlog10(self):
139 M = self._run('testlog10')
140 print M.getMatrix().write(sys.stderr,"mmio")
141
142
143 class TestIntegrator(Ascend):
144
145 def testListIntegrators(self):
146 I = ascpy.Integrator.getEngines()
147 s1 = sorted([str(i) for i in I.values()])
148 s2 = sorted(['IDA','LSODE','AWW'])
149 assert s1==s2
150
151 # this routine is reused by both testIDA and testLSODE
152 def _testIntegrator(self,integratorname):
153 self.L.load('johnpye/shm.a4c')
154 M = self.L.findType('shm').getSimulation('sim')
155 M.setSolver(ascpy.Solver('QRSlv'))
156 P = M.getParameters()
157 M.setParameter('feastol',1e-12)
158 print M.getChildren()
159 assert float(M.x) == 10.0
160 assert float(M.v) == 0.0
161 t_end = math.pi
162
163 I = ascpy.Integrator(M)
164 I.setReporter(ascpy.IntegratorReporterNull(I))
165 I.setEngine(integratorname);
166 I.setLinearTimesteps(ascpy.Units("s"), 0.0, t_end, 100);
167 I.setMinSubStep(0.0001); # these limits are required by IDA at present (numeric diff)
168 I.setMaxSubStep(0.1);
169 I.setInitialSubStep(0.001);
170 I.setMaxSubSteps(200);
171 if(integratorname=='IDA'):
172 I.setParameter('autodiff',False)
173 for p in M.getParameters():
174 print p.getName(),"=",p.getValue()
175 I.analyse();
176 I.solve();
177 print "At end of simulation,"
178 print "x = %f" % M.x
179 print "v = %f" % M.v
180 assert abs(float(M.x) + 10) < 1e-2
181 assert abs(float(M.v)) < 1e-2
182 assert I.getNumObservedVars() == 3
183
184 def testInvalidIntegrator(self):
185 self.L.load('johnpye/shm.a4c')
186 M = self.L.findType('shm').getSimulation('sim')
187 M.setSolver(ascpy.Solver('QRSlv'))
188 I = ascpy.Integrator(M)
189 try:
190 I.setEngine('___NONEXISTENT____')
191 except RuntimeError:
192 return
193 self.fail("setEngine did not raise error!")
194
195 def testLSODE(self):
196 self._testIntegrator('LSODE')
197
198 def testIDA(self):
199 self._testIntegrator('IDA')
200
201 def testparameters(self):
202 self.L.load('johnpye/shm.a4c')
203 M = self.L.findType('shm').getSimulation('sim')
204 M.build()
205 I = ascpy.Integrator(M)
206 I.setEngine('IDA')
207 P = I.getParameters()
208 for p in P:
209 print p.getName(),"=",p.getValue()
210 assert len(P)==11
211 assert P[0].isStr()
212 assert P[0].getName()=="linsolver"
213 assert P[0].getValue()=='SPGMR'
214 assert P[2].getName()=="autodiff"
215 assert P[2].getValue()==True
216 assert P[7].getName()=="atolvect"
217 assert P[7].getBoolValue() == True
218 P[2].setBoolValue(False)
219 assert P[2].getBoolValue()==False
220 I.setParameters(P)
221 assert I.getParameterValue('autodiff')==False
222 I.setParameter('autodiff',True)
223 try:
224 v = I.getParameterValue('nonexist')
225 except KeyError:
226 pass
227 else:
228 self.fail('Failed to trip invalid Integrator parameter')
229
230 class TestLSODE(Ascend):
231
232 def testzill(self):
233 self.L.load('johnpye/zill.a4c')
234 T = self.L.findType('zill')
235 M = T.getSimulation('sim')
236 M.setSolver(ascpy.Solver('QRSlv'))
237 I = ascpy.Integrator(M)
238 I.setEngine('LSODE')
239 I.setMinSubStep(1e-7)
240 I.setMaxSubStep(0.001)
241 I.setMaxSubSteps(10000)
242 I.setReporter(ascpy.IntegratorReporterConsole(I))
243 I.setLinearTimesteps(ascpy.Units(), 1.0, 1.5, 5)
244 I.analyse()
245 I.solve()
246 M.run(T.getMethod('self_test'))
247
248 def testnewton(self):
249 sys.stderr.write("STARTING TESTNEWTON\n")
250 self.L.load('johnpye/newton.a4c')
251 T = self.L.findType('newton')
252 M = T.getSimulation('sim')
253 M.solve(ascpy.Solver("QRSlv"),ascpy.SolverReporter())
254 I = ascpy.Integrator(M)
255 I.setEngine('LSODE')
256 I.setParameter('rtolvect',False)
257 I.setParameter('rtol',1e-7)
258 I.setParameter('atolvect',False)
259 I.setParameter('atol',1e-7)
260 I.setMinSubStep(1e-7)
261 I.setMaxSubStep(0.001)
262 I.setMaxSubSteps(10000)
263
264 I.setReporter(ascpy.IntegratorReporterConsole(I))
265 I.setLinearTimesteps(ascpy.Units("s"), 0, 2*float(M.v)/float(M.g), 2)
266 I.analyse()
267 I.solve()
268 print "At end of simulation,"
269 print "x = %f" % M.x
270 print "v = %f" % M.v
271 M.run(T.getMethod('self_test'))
272
273 def testlotka(self):
274 self.L.load('johnpye/lotka.a4c')
275 M = self.L.findType('lotka').getSimulation('sim')
276 M.setSolver(ascpy.Solver("QRSlv"))
277 I = ascpy.Integrator(M)
278 I.setEngine('LSODE')
279 I.setReporter(ascpy.IntegratorReporterConsole(I))
280 I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 5)
281 I.analyse()
282 print "Number of vars = %d" % I.getNumVars()
283 assert I.getNumVars()==2
284 I.solve()
285 assert I.getNumObservedVars() == 3;
286 assert abs(M.R - 832) < 1.0
287 assert abs(M.F - 21.36) < 0.1
288
289 #-------------------------------------------------------------------------------
290 # Testing of a external blackbox functions
291
292 class TestBlackBox(AscendSelfTester):
293 def testparsefail0(self):
294 try:
295 self.L.load('test/blackbox/parsefail0.a4c')
296 self.fail("parsefail0 should not have loaded without errors")
297 except:
298 pass
299
300 def testparsefail1(self):
301 try:
302 self.L.load('test/blackbox/parsefail1.a4c')
303 self.fail("parsefail1 should not have loaded without errors")
304 except:
305 pass
306
307 def testparsefail2(self):
308 try:
309 self.L.load('test/blackbox/parsefail2.a4c')
310 self.fail("parsefail2 should not have loaded without errors")
311 except:
312 pass
313
314 def testparsefail3(self):
315 try:
316 self.L.load('test/blackbox/parsefail3.a4c')
317 self.fail("parsefail3 should not have loaded without errors")
318 except:
319 pass
320
321 def testparsefail4(self):
322 try:
323 self.L.load('test/blackbox/parsefail4.a4c')
324 self.fail("parsefail4 should not have loaded")
325 except:
326 pass
327
328 def testfail1(self):
329 """Mismatched arg counts check-- tests bbox, not ascend."""
330 self.L.load('test/blackbox/fail1.a4c')
331 try:
332 M = self.L.findType('fail1').getSimulation('sim')
333 self.fail("expected exception was not raised")
334 except RuntimeError,e:
335 print "Caught exception '%s', assumed ok" % e
336
337 def testfail2(self):
338 """Incorrect data arg check -- tests bbox, not ascend"""
339 self.L.load('test/blackbox/fail2.a4c')
340 try:
341 M = self.L.findType('fail2').getSimulation('sim')
342 self.fail("expected exception was not raised")
343 except RuntimeError,e:
344 print "Caught exception '%s', assumed ok (should mention errors during instantiation)" % e
345
346 def testpass1(self):
347 """simple single bbox forward solve"""
348 M = self._run('pass1',filename='test/blackbox/pass.a4c')
349
350 def testpass2(self):
351 """simple single bbox reverse solve"""
352 M = self._run('pass2',filename='test/blackbox/pass.a4c')
353
354 def testpass3(self):
355 """simple double bbox solve"""
356 M = self._run('pass3',filename='test/blackbox/pass3.a4c')
357
358 def testpass4(self):
359 """simple double bbox reverse solve"""
360 M = self._run('pass4',filename='test/blackbox/pass3.a4c')
361
362 def testpass5(self):
363 M = self._run('pass5',filename='test/blackbox/pass5.a4c')
364
365 def testpass6(self):
366 M = self._run('pass6',filename='test/blackbox/pass5.a4c')
367
368 def testpass7(self):
369 M = self._run('pass7',filename='test/blackbox/passmerge.a4c')
370
371 def testpass8(self):
372 M = self._run('pass8',filename='test/blackbox/passmerge.a4c')
373
374 def testpass9(self):
375 M = self._run('pass9',filename='test/blackbox/passmerge.a4c')
376
377 def testpass10(self):
378 M = self._run('pass10',filename='test/blackbox/passmerge.a4c')
379
380 def testpass11(self):
381 M = self._run('pass11',filename='test/blackbox/passmerge.a4c')
382
383 def testpass12(self):
384 M = self._run('pass12',filename='test/blackbox/passmerge.a4c')
385
386 # this test doesn't work: 'system is inconsistent' -- and structurally singular
387 # def testpass13(self):
388 # """cross-merged input/output solve"""
389 # M = self._run('pass13',filename='test/blackbox/passmerge.a4c')
390
391 def testpass14(self):
392 """cross-merged input/output reverse solve"""
393 M = self._run('pass14',filename='test/blackbox/passmerge.a4c')
394
395 def testpass20(self):
396 M = self._run('pass20',filename='test/blackbox/passarray.a4c')
397
398 def testparsefail21(self):
399 """dense array of black boxes wrong syntax"""
400 try:
401 self.L.load('test/blackbox/parsefail21.a4c')
402 self.fail("parsefail21 should not have loaded without errors")
403 except:
404 pass
405
406 def testpass22(self):
407 M = self._run('pass22',filename='test/blackbox/passarray.a4c')
408
409 def testpass23(self):
410 M = self._run('pass23',filename='test/blackbox/passarray.a4c')
411
412 def testpass61(self):
413 M = self._run('pass61',filename='test/blackbox/reinstantiate.a4c')
414
415 def testpass62(self):
416 M = self._run('pass62',filename='test/blackbox/reinstantiate.a4c')
417
418 def testpass64(self):
419 M = self._run('pass64',filename='test/blackbox/reinstantiate.a4c')
420
421 def testpass65(self):
422 M = self._run('pass65',filename='test/blackbox/reinstantiate.a4c')
423
424 def testpass66(self):
425 M = self._run('pass66',filename='test/blackbox/reinstantiate.a4c')
426
427 def testpass67(self):
428 M = self._run('pass67',filename='test/blackbox/reinstantiate.a4c')
429
430 class TestExtFn(AscendSelfTester):
431 def testextfntest(self):
432 M = self._run('extfntest',filename='johnpye/extfn/extfntest.a4c')
433 self.assertAlmostEqual(M.y, 2);
434 self.assertAlmostEqual(M.x, 1);
435 self.assertAlmostEqual(M.y, M.x + 1);
436
437 def testextrelfor(self):
438 M = self._run('extrelfor',filename='johnpye/extfn/extrelfor.a4c')
439
440 ## @TODO fix bug with badly-named bbox rel in a loop (Ben, maybe)
441 # def testextrelforbadnaming(self):
442 # self.L.load('johnpye/extfn/extrelforbadnaming.a4c')
443 # T = self.L.findType('extrelfor')
444 # M = T.getSimulation('sim')
445 # M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
446 # print "x[1] = %f" % M.x[1]
447 # print "x[2] = %f" % M.x[2]
448 # print "x[3] = %f" % M.x[3]
449 # print "x[4] = %f" % M.x[4]
450 # print "x[5] = %f" % M.x[5]
451 # M.run(T.getMethod('self_test'))
452
453 def testextrelrepeat(self):
454 M = self._run('extrelrepeat',filename='johnpye/extfn/extrelrepeat.a4c')
455
456 #-------------------------------------------------------------------------------
457 # Testing of Sensitivity module
458
459 class TestSensitivity(AscendSelfTester):
460 def test1(self):
461 self.L.load('sensitivity_test.a4c')
462 T = self.L.findType('sensitivity_test')
463 M = T.getSimulation('sim',False)
464 M.run(T.getMethod('on_load'))
465 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
466 M.run(T.getMethod('analyse'))
467 M.run(T.getMethod('self_test'))
468
469 # def testall(self):
470 # self.L.load('sensitivity_test.a4c')
471 # T = self.L.findType('sensitivity_test_all')
472 # M = T.getSimulation('sim',False)
473 # M.run(T.getMethod('on_load'))
474 # M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
475 # M.run(T.getMethod('analyse'))
476 # M.run(T.getMethod('self_test'))
477 # CAUSES CRASH
478
479 #-------------------------------------------------------------------------------
480 # Testing of a ExtPy - external python methods
481
482 class TestExtPy(AscendSelfTester):
483 def test1(self):
484 self.L.load('johnpye/extpy/extpytest.a4c')
485 T = self.L.findType('extpytest')
486 M = T.getSimulation('sim')
487 M.run(T.getMethod('self_test'))
488
489 def test2(self):
490 self.L.load('johnpye/extpy/extpytest.a4c')
491 T = self.L.findType('extpytest')
492 M = T.getSimulation('sim')
493 M.run(T.getMethod('pythonthing'))
494 M.run(T.getMethod('pythonthing'))
495 M.run(T.getMethod('pythonthing'))
496 M.run(T.getMethod('pythonthing'))
497 M.run(T.getMethod('pythonthing'))
498 M.run(T.getMethod('pythonthing'))
499 M.run(T.getMethod('pythonthing'))
500 # causes crash!
501
502 #-------------------------------------------------------------------------------
503 # Testing of saturated steam properties library (iapwssatprops.a4c)
504
505 class TestSteam(AscendSelfTester):
506
507 def testiapwssatprops1(self):
508 M = self._run('testiapwssatprops1',filename='steam/iapwssatprops.a4c')
509 def testiapwssatprops2(self):
510 M = self._run('testiapwssatprops2',filename='steam/iapwssatprops.a4c')
511 def testiapwssatprops3(self):
512 M = self._run('testiapwssatprops3',filename='steam/iapwssatprops.a4c')
513
514 # test the stream model basically works
515 def testsatsteamstream(self):
516 M = self._run('satsteamstream',filename='steam/satsteamstream.a4c')
517
518 # test that we can solve in terms of various (rho,u)
519 def testsatuv(self):
520 self.L.load('steam/iapwssat.a4c')
521 T = self.L.findType('testiapwssatuv')
522 M = T.getSimulation('sim',False)
523 M.run(T.getMethod('on_load'))
524 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
525 print "p = %f bar" % M.p.as('bar');
526 print "T = %f C" % (M.T.as('K') - 273.15);
527 print "x = %f" % M.x;
528 M.run(T.getMethod('self_test'))
529 M.run(T.getMethod('values2'))
530 # M.v.setRealValueWithUnits(1.0/450,"m^3/kg");
531 # M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
532 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
533 print "p = %f bar" % M.p.as('bar');
534 print "T = %f C" % (M.T.as('K') - 273.15);
535 print "x = %f" % M.x;
536 M.run(T.getMethod('self_test2'))
537
538
539 ## @TODO fix error capture from bounds checking during initialisation
540 # def testiapwssat1(self):
541 # M = self._run('testiapwssat1',filename='steam/iapwssat.a4c')
542
543 def testdsgsat(self):
544 self.L.load('steam/dsgsat3.a4c')
545 T = self.L.findType('dsgsat3')
546 M = T.getSimulation('sim',False)
547 M.run(T.getMethod('on_load'))
548 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
549 self.assertAlmostEqual(M.dTw_dt[2],0.0);
550 M.run(T.getMethod('configure_dynamic'))
551 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
552 return M
553
554 def testintegLSODE(self):
555 M = self.testdsgsat()
556 M.qdot_s.setRealValueWithUnits(1000,"W/m")
557 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
558 #M.setParameter('
559 I = ascpy.Integrator(M)
560 I.setEngine('LSODE')
561 I.setParameter('meth','AM')
562 I.setParameter('maxord',12)
563 I.setReporter(ascpy.IntegratorReporterConsole(I))
564 I.setLinearTimesteps(ascpy.Units("s"), 0, 5, 1)
565 I.analyse()
566 I.solve()
567
568 def testintegIDA(self):
569 M = self.testdsgsat()
570 self.assertAlmostEqual(M.dTw_dt[2],0.0)
571 Tw1 = float(M.T_w[2])
572 T = self.L.findType('dsgsat3')
573 M.run(T.getMethod('free_states'))
574 I = ascpy.Integrator(M)
575 I.setEngine('IDA')
576 I.setParameter('linsolver','DENSE')
577 I.setParameter('safeeval',True)
578 I.setParameter('rtol',1e-8)
579 I.setInitialSubStep(0.01)
580 I.setMaxSubSteps(100)
581 I.setReporter(ascpy.IntegratorReporterConsole(I))
582 I.setLinearTimesteps(ascpy.Units("s"), 0, 3600, 100)
583 try:
584 I.analyse()
585 except Exception,e:
586 print "ERROR: %s" % e
587 I.writeDebug(sys.stdout)
588
589 I.solve()
590 self.assertAlmostEqual(float(M.T_w[2]),Tw1)
591 M.qdot_s.setRealValueWithUnits(1000,"W/m")
592 self.assertAlmostEqual(M.qdot_s.as("W/m"),1000)
593 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
594 self.assertNotAlmostEqual(M.dTw_dt[2],0.0)
595 # I = ascpy.Integrator(M)
596 # I.setEngine('LSODE')
597 # I.setReporter(ascpy.IntegratorReporterConsole(I))
598 # I.setReporter(ascpy.IntegratorReporterConsole(I))
599 # I.setLinearTimesteps(ascpy.Units("s"), 0, 5, 100)
600 # I.setMinSubStep(0.0001)
601 # I.setMaxSubStep(100)
602 # I.setInitialSubStep(0.1)
603 # I.analyse()
604 # I.solve()
605
606 #-------------------------------------------------------------------------------
607 # Testing of freesteam external steam properties functions
608
609 with_freesteam = True
610 try:
611 # we assume that if the freesteam python module is installed, the ASCEND
612 # external library will also be.
613 import freesteam
614 have_freesteam = True
615 except ImportError,e:
616 have_freesteam = False
617
618 if with_freesteam and have_freesteam:
619 class TestFreesteam(AscendSelfTester):
620 # def testfreesteamtest(self):
621 # """run the self-test cases bundled with freesteam"""
622 # self._run('testfreesteam',filename='testfreesteam.a4c')
623
624 def testload(self):
625 """check that we can load 'thermalequilibrium2' (IMPORT "freesteam", etc)"""
626 self.L.load('johnpye/thermalequilibrium2.a4c')
627
628 def testinstantiate(self):
629 """load an instantiate 'thermalequilibrium2'"""
630 self.testload()
631 M = self.L.findType('thermalequilibrium2').getSimulation('sim')
632 return M
633
634 def testintegrate(self):
635 """integrate transfer of heat from one mass of water/steam to another
636 according to Newton's law of cooling"""
637 M = self.testinstantiate()
638 M.setSolver(ascpy.Solver("QRSlv"))
639 I = ascpy.Integrator(M)
640 I.setEngine('LSODE')
641 I.setReporter(ascpy.IntegratorReporterConsole(I))
642 I.setLinearTimesteps(ascpy.Units("s"), 0, 3000, 30)
643 I.setMinSubStep(0.01)
644 I.setInitialSubStep(1)
645 I.analyse()
646 print "Number of vars = %d" % I.getNumVars()
647 assert I.getNumVars()==2
648 I.solve()
649 assert I.getNumObservedVars() == 3;
650 print "S[1].T = %f K" % M.S[1].T
651 print "S[2].T = %f K" % M.S[2].T
652 print "Q = %f W" % M.Q
653 self.assertAlmostEqual(float(M.S[1].T),506.77225109,4);
654 self.assertAlmostEqual(float(M.S[2].T),511.605173967,5);
655 self.assertAlmostEqual(float(M.Q),-48.32922877329,3);
656 self.assertAlmostEqual(float(M.t),3000);
657 print "Note that the above values have not been verified analytically"
658
659 def testcollapsingcan2(self):
660 """ solve the collapsing can model using IAPWS-IF97 steam props """
661 M = self._run("collapsingcan2",filename="collapsingcan2.a4c");
662
663 #-------------------------------------------------------------------------------
664 # Testing of IDA's analysis module
665
666 class TestIDA(Ascend):
667 def _run(self,filen,modeln=""):
668 self.L.load('test/ida/%s.a4c' % filen)
669 T = self.L.findType('%s%s' % (filen,modeln))
670 M = T.getSimulation('sim')
671 M.build()
672 I = ascpy.Integrator(M)
673 I.setEngine('IDA')
674 I.analyse()
675 return M;
676
677 def _runfail(self,filen,n,msg="failed"):
678 try:
679 self._run(filen,'fail%d' % n)
680 except Exception,e:
681 print "(EXPECTED) ERROR: %s" % e
682 return
683 self.fail(msg)
684
685 def testsinglederiv(self):
686 self._run('singlederiv')
687
688 def testsinglederivfail1(self):
689 self._runfail('singlederiv',1
690 ,"t.ode_id=-1 did not trigger error")
691
692 def testsinglederivfail2(self):
693 self._runfail('singlederiv',2
694 ,"dy_dt.ode_id=2 did not trigger error")
695
696 def testsinglederivfail3(self):
697 self._runfail('singlederiv',3
698 ,"dy_dt.ode_type=3 did not trigger error")
699
700 def testsinglederivfail4(self):
701 self._runfail('singlederiv',4
702 ,"duplicate ode_type=1 did not trigger error")
703
704 def testsinglederivfail5(self):
705 self._runfail('singlederiv',5
706 ,"duplicate ode_type=1 did not trigger error")
707
708 def testsinglederivfail6(self):
709 self._runfail('singlederiv',6
710 ,"duplicate ode_type=1 did not trigger error")
711
712 def testtwoderiv(self):
713 self._run('twoderiv')
714
715 def testtwoderivfail1(self):
716 self._runfail('twoderiv',1)
717
718 def testtwoderivfail2(self):
719 self._runfail('twoderiv',2)
720
721 def testtwoderivfail3(self):
722 self._runfail('twoderiv',3)
723 def testtwoderivfail4(self):
724 self._runfail('twoderiv',4)
725 def testtwoderivfail5(self):
726 self._runfail('twoderiv',5)
727
728 def testnoderivs(self):
729 self._runfail('noderivs',1)
730
731 def testnoindeps(self):
732 self._runfail('indeps',1)
733
734 def testtwoindeps(self):
735 self._runfail('indeps',2)
736
737 def testfixedvars(self):
738 self._run('fixedvars')
739
740 def testfixedvars1(self):
741 self._run('fixedvars',1)
742
743 def testfixedvars2(self):
744 self._run('fixedvars',2)
745
746 def testfixedvars3(self):
747 self._run('fixedvars',3)
748
749 def testincidence(self):
750 self._run('incidence')
751
752 def testincidence1(self):
753 self._run('incidence',1)
754 def testincidence2(self):
755 self._run('incidence',2)
756 def testincidence3(self):
757 M = self._run('incidence',3)
758
759 def testincidence4(self):
760 self._run('incidence',4)
761 def testincidencefail5(self):
762 self._runfail('incidence',5)
763
764 # doesn't work yet:
765 # def testincidence5(self):
766 # self._run('incidence',5)
767
768
769 #-------------------------------------------------------------------------------
770 # Testing of IDA models using DENSE linear solver
771
772 class TestIDADENSE(Ascend):
773 """IDA DAE integrator, DENSE linear solver"""
774
775 def testlotka(self):
776 self.L.load('johnpye/lotka.a4c')
777 M = self.L.findType('lotka').getSimulation('sim')
778 M.setSolver(ascpy.Solver("QRSlv"))
779 I = ascpy.Integrator(M)
780 I.setEngine('IDA')
781 I.setReporter(ascpy.IntegratorReporterConsole(I))
782 I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 5);
783 I.setParameter('linsolver','DENSE')
784 I.setParameter('rtol',1e-8);
785 I.analyse()
786 assert I.getNumVars()==2
787 assert abs(M.R - 1000) < 1e-300
788 I.solve()
789 assert I.getNumObservedVars() == 3
790 assert abs(M.R - 832) < 1.0
791 assert abs(M.F - 21.36) < 0.1
792
793 def testdenx(self):
794 print "-----------------------------====="
795 self.L.load('johnpye/idadenx.a4c')
796 M = self.L.findType('idadenx').getSimulation('sim')
797 M.setSolver(ascpy.Solver("QRSlv"))
798 I = ascpy.Integrator(M)
799 I.setEngine('IDA')
800 I.setParameter('calcic','YA_YDP')
801 I.setParameter('linsolver','DENSE')
802 I.setParameter('safeeval',True)
803 I.setReporter(ascpy.IntegratorReporterConsole(I))
804 I.setLogTimesteps(ascpy.Units("s"), 0.4, 4e10, 11)
805 I.setMaxSubStep(0);
806 I.setInitialSubStep(0)
807 I.setMaxSubSteps(0)
808 I.setParameter('autodiff',True)
809 I.analyse()
810 I.solve()
811 assert abs(float(M.y1) - 5.1091e-08) < 2e-9
812 assert abs(float(M.y2) - 2.0437e-13) < 2e-14
813 assert abs(float(M.y3) - 1.0) < 1e-5
814
815 def testhires(self):
816 self.L.load('test/hires.a4c')
817 T = self.L.findType('hires')
818 M = T.getSimulation('sim')
819 M.setSolver(ascpy.Solver('QRSlv'))
820 I = ascpy.Integrator(M)
821 I.setEngine('IDA')
822 I.setParameter('linsolver','DENSE')
823 I.setParameter('rtol',1.1e-15)
824 I.setParameter('atolvect',0)
825 I.setParameter('atol',1.1e-15)
826 I.setReporter(ascpy.IntegratorReporterConsole(I))
827 I.setLogTimesteps(ascpy.Units(""), 1, 321.8122, 5)
828 I.setInitialSubStep(1e-5)
829 I.setMaxSubSteps(10000)
830 I.analyse()
831 I.solve()
832 for i in range(8):
833 print "y[%d] = %.20g" % (i+1, M.y[i+1])
834 M.run(T.getMethod('self_test'))
835
836 ## @TODO fails during IDACalcIC (model too big?)
837 # def testkryx(self):
838 # self.L.load('johnpye/idakryx.a4c')
839 # ascpy.getCompiler().setUseRelationSharing(False)
840 # M = self.L.findType('idakryx').getSimulation('sim')
841 # M.setSolver(ascpy.Solver('QRSlv'))
842 # M.build()
843 # I = ascpy.Integrator(M)
844 # I.setEngine('IDA')
845 # I.setReporter(ascpy.IntegratorReporterConsole(I))
846 # I.setParameter('linsolver','DENSE')
847 # I.setParameter('maxl',8)
848 # I.setParameter('gsmodified',False)
849 # I.setParameter('autodiff',True)
850 # I.setParameter('rtol',0)
851 # I.setParameter('atol',1e-3);
852 # I.setParameter('atolvect',False)
853 # I.setParameter('calcic','YA_YDP')
854 # I.analyse()
855 # I.setLogTimesteps(ascpy.Units("s"), 0.01, 10.24, 11)
856 # I.solve()
857 # assert abs(M.u[2][2].getValue()) < 1e-5
858
859 #-------------------------------------------------------------------------------
860 # Testing of IDA models using SPGMR linear solver (Krylov)
861
862 # these tests are disabled until SPGMR preconditioning has been implemented
863 class TestIDASPGMR:#(Ascend):
864 def testlotka(self):
865 self.L.load('johnpye/lotka.a4c')
866 M = self.L.findType('lotka').getSimulation('sim')
867 M.setSolver(ascpy.Solver("QRSlv"))
868 I = ascpy.Integrator(M)
869 I.setEngine('IDA')
870 I.setReporter(ascpy.IntegratorReporterConsole(I))
871 I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 5)
872 I.setParameter('rtol',1e-8)
873 I.analyse()
874 assert I.getNumVars()==2
875 assert abs(M.R - 1000) < 1e-300
876 I.solve()
877 assert I.getNumObservedVars() == 3
878 assert abs(M.R - 832) < 1.0
879 assert abs(M.F - 21.36) < 0.1
880
881
882 def testkryx(self):
883 self.L.load('johnpye/idakryx.a4c')
884 M = self.L.findType('idakryx').getSimulation('sim')
885 M.build()
886 I = ascpy.Integrator(M)
887 I.setEngine('IDA')
888 I.setReporter(ascpy.IntegratorReporterConsole(I))
889 I.setParameter('linsolver','SPGMR')
890 I.setParameter('prec','JACOBI')
891 I.setParameter('maxl',8)
892 I.setParameter('gsmodified',False)
893 I.setParameter('autodiff',True)
894 I.setParameter('gsmodified',True)
895 I.setParameter('rtol',0)
896 I.setParameter('atol',1e-3);
897 I.setParameter('atolvect',False)
898 I.setParameter('calcic','Y')
899 I.analyse()
900 I.setLogTimesteps(ascpy.Units("s"), 0.01, 10.24, 10);
901 print M.udot[1][3]
902 I.solve()
903 assert 0
904
905 def testzill(self):
906 self.L.load('johnpye/zill.a4c')
907 T = self.L.findType('zill')
908 M = T.getSimulation('sim')
909 M.setSolver(ascpy.Solver('QRSlv'))
910 I = ascpy.Integrator(M)
911 I.setEngine('IDA')
912 I.setParameter('safeeval',False)
913 I.setMinSubStep(1e-7)
914 I.setMaxSubStep(0.001)
915 I.setMaxSubSteps(10000)
916 I.setReporter(ascpy.IntegratorReporterConsole(I))
917 I.setLinearTimesteps(ascpy.Units(), 1.0, 1.5, 5)
918 I.analyse()
919 I.solve()
920 M.run(T.getMethod('self_test'))
921
922 def testdenxSPGMR(self):
923 self.L.load('johnpye/idadenx.a4c')
924 M = self.L.findType('idadenx').getSimulation('sim')
925 M.setSolver(ascpy.Solver('QRSlv'))
926 I = ascpy.Integrator(M)
927 I.setEngine('IDA')
928 I.setReporter(ascpy.IntegratorReporterConsole(I))
929 I.setLogTimesteps(ascpy.Units("s"), 0.4, 4e10, 11)
930 I.setMaxSubStep(0);
931 I.setInitialSubStep(0);
932 I.setMaxSubSteps(0);
933 I.setParameter('autodiff',True)
934 I.setParameter('linsolver','SPGMR')
935 I.setParameter('gsmodified',False)
936 I.setParameter('maxncf',10)
937 I.analyse()
938 I.solve()
939 assert abs(float(M.y1) - 5.1091e-08) < 1e-10
940 assert abs(float(M.y2) - 2.0437e-13) < 1e-15
941 assert abs(float(M.y3) - 1.0) < 1e-5
942
943 # move code above down here if you want to temporarily avoid testing it
944 class NotToBeTested:
945 def nothing(self):
946 pass
947
948 def testnewton(self):
949 sys.stderr.write("STARTING TESTNEWTON\n")
950 self.L.load('johnpye/newton.a4c')
951 T = self.L.findType('newton')
952 M = T.getSimulation('sim')
953 M.solve(ascpy.Solver("QRSlv"),ascpy.SolverReporter())
954 I = ascpy.Integrator(M)
955 I.setEngine('IDA')
956 I.setParameter('linsolver','DENSE')
957 I.setParameter('safeeval',True)
958 I.setParameter('rtol',1e-8)
959 I.setMaxSubStep(0.001)
960 I.setMaxSubSteps(10000)
961
962 I.setReporter(ascpy.IntegratorReporterConsole(I))
963 I.setLinearTimesteps(ascpy.Units("s"), 0, 2*float(M.v)/float(M.g), 2)
964 I.analyse()
965 I.solve()
966 print "At end of simulation,"
967 print "x = %f" % M.x
968 print "v = %f" % M.v
969 M.run(T.getMethod('self_test'))
970
971 if __name__=='__main__':
972 # a whole bag of tricks to make sure we get the necessary dirs in our ascend, python and ld path vars
973 restart = 0
974
975 if platform.system()=="Windows":
976 LD_LIBRARY_PATH="PATH"
977 SEP = ";"
978 else:
979 LD_LIBRARY_PATH="LD_LIBRARY_PATH"
980 SEP = ":"
981
982 freesteamdir = os.path.expanduser("~/freesteam/ascend")
983 modeldirs = [os.path.abspath(os.path.join(sys.path[0],"models")),os.path.abspath(freesteamdir)]
984 if not os.environ.get('ASCENDLIBRARY'):
985 os.environ['ASCENDLIBRARY'] = SEP.join(modeldirs)
986 restart = 1
987 else:
988 envmodelsdir = [os.path.abspath(i) for i in os.environ['ASCENDLIBRARY'].split(SEP)]
989 for l in modeldirs:
990 if l in envmodelsdir[len(modeldirs):]:
991 envmodelsdir.remove(l)
992 restart = 1
993 for l in modeldirs:
994 if l not in envmodelsdir:
995 envmodelsdir.insert(0,l)
996 restart = 1
997 os.environ['ASCENDLIBRARY'] = SEP.join(envmodelsdir)
998
999 libdirs = ["pygtk","."]
1000 libdirs = [os.path.normpath(os.path.join(sys.path[0],l)) for l in libdirs]
1001 if not os.environ.get(LD_LIBRARY_PATH):
1002 os.environ[LD_LIBRARY_PATH]=SEP.join(libdirs)
1003 restart = 1
1004 else:
1005 envlibdirs = [os.path.normpath(i) for i in os.environ[LD_LIBRARY_PATH].split(SEP)]
1006 for l in libdirs:
1007 if l in envlibdirs[len(libdirs):]:
1008 envlibdirs.remove(l)
1009 restart = 1
1010 for l in libdirs:
1011 if l not in envlibdirs:
1012 envlibdirs.insert(0,l)
1013 restart = 1
1014 os.environ[LD_LIBRARY_PATH] = SEP.join(envlibdirs)
1015
1016 pypath = os.path.normpath(os.path.join(sys.path[0],"pygtk"))
1017 if not os.environ.get('PYTHONPATH'):
1018 os.environ['PYTHONPATH']=pypath
1019 else:
1020 envpypath = os.environ['PYTHONPATH'].split(SEP)
1021 if pypath not in envpypath:
1022 envpypath.insert(0,pypath)
1023 os.environ['PYTHONPATH']=SEP.join(envpypath)
1024 restart = 1
1025
1026 if restart:
1027 script = os.path.join(sys.path[0],"test.py")
1028 print "Restarting with..."
1029 print " export LD_LIBRARY_PATH=%s" % os.environ.get(LD_LIBRARY_PATH)
1030 print " export PYTHONPATH=%s" % os.environ.get('PYTHONPATH')
1031 print " export ASCENDLIBRARY=%s" % os.environ.get('ASCENDLIBRARY')
1032
1033 os.execvp("python",[script] + sys.argv)
1034
1035 import ascpy
1036
1037 try:
1038 import cunit
1039 except:
1040 pass
1041
1042 atexit.register(ascpy.shutdown)
1043 #suite = unittest.TestSuite()
1044 #suite = unittest.defaultTestLoader.loadTestsFromName('__main__')
1045 #unittest.TextTestRunner(verbosity=2).run(suite)
1046 unittest.main()

Properties

Name Value
svn:executable *

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