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

Contents of /trunk/test.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1351 - (show annotations) (download) (as text)
Wed Mar 14 07:48:27 2007 UTC (17 years, 10 months ago) by jpye
File MIME type: text/x-python
File size: 40667 byte(s)
Added test for write('graph'). Added couple of items to syntax definition. Updated GPL notice in some core model files.
1 #!/usr/bin/env python
2 # ASCEND modelling environment
3 # Copyright (C) 2006, 2007 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 try:
32 import dl
33 _dlflags = dl.RTLD_GLOBAL|dl.RTLD_NOW
34 except:
35 # On platforms that unilaterally refuse to provide the 'dl' module
36 # we'll just set the value and see if it works.
37 print "Note: python 'dl' module not available on this system, guessing value of RTLD_* flags"
38 _dlflags = 258
39
40 sys.setdlopenflags(_dlflags)
41
42 class Ascend(unittest.TestCase):
43
44 def setUp(self):
45 import ascpy
46 self.L = ascpy.Library()
47
48 def tearDown(self):
49 self.L.clear()
50 del self.L
51
52 class AscendSelfTester(Ascend):
53
54 def _run(self,modelname,solvername="QRSlv",filename=None,parameters={}):
55 if filename==None:
56 filename = 'johnpye/%s.a4c' % modelname
57 self.L.load(filename)
58 T = self.L.findType(modelname)
59 M = T.getSimulation('sim')
60 M.setSolver(ascpy.Solver(solvername))
61 for k,v in parameters.iteritems():
62 M.setParameter(k,v)
63 M.solve(ascpy.Solver(solvername),ascpy.SolverReporter())
64 M.run(T.getMethod('self_test'))
65 return M
66
67 class TestCompiler(Ascend):
68
69 def _run(self,filen,modeln=""):
70 self.L.load('test/compiler/%s.a4c' % filen)
71 T = self.L.findType('%s%s' % (filen,modeln))
72 M = T.getSimulation('sim')
73 M.build()
74
75 def _runfail(self,filen,n,msg="failed"):
76 try:
77 self._run(filen,'fail%d' % n)
78 except Exception,e:
79 print "(EXPECTED) ERROR: %s" % e
80 return
81 self.fail(msg)
82
83
84 def testloading(self):
85 """library startup"""
86 pass
87
88 def testsystema4l(self):
89 """loading system.a4l?"""
90 self.L.load('system.a4l')
91
92 def testatomsa4l(self):
93 """loading atoms.a4l?"""
94 self.L.load('atoms.a4l')
95
96 def testmissingreq(self):
97 """flagging a missing REQUIRE"""
98 self._runfail('missingreq',1)
99
100 def testmissingsubreq(self):
101 """flagging a subsidiary missing REQUIRE"""
102 self._runfail('missingreq',1)
103
104 def defaultmethodstest(self,modelname):
105 self.L.load("test/defaultmethods.a4c")
106 T = self.L.findType(modelname)
107 M = T.getSimulation('sim')
108 M.run(T.getMethod('on_load'))
109 M.run(T.getMethod('self_test'))
110 return M
111
112 def testdefault1(self):
113 self.defaultmethodstest('testdefault1')
114
115 def testdefault2(self):
116 self.defaultmethodstest('testdefault2')
117
118 def testdefault3(self):
119 self.defaultmethodstest('testdefault3')
120
121 def testdefault4(self):
122 self.defaultmethodstest('testdefault4')
123
124 def testdefault5(self):
125 self.defaultmethodstest('testdefault5')
126
127 def testdefault6(self):
128 self.defaultmethodstest('testdefault6')
129
130 def testdefault7(self):
131 self.defaultmethodstest('testdefault7')
132
133 def testdefault8(self):
134 self.defaultmethodstest('testdefault8')
135
136 def testdefault9(self):
137 self.defaultmethodstest('testdefault9')
138
139 def testdefault10(self):
140 self.defaultmethodstest('testdefault10')
141
142 def testdefault11(self):
143 self.defaultmethodstest('testdefault11')
144
145 def testdefault12(self):
146 self.defaultmethodstest('testdefault12')
147
148 def testdefault13(self):
149 self.defaultmethodstest('testdefault13')
150
151 def testdefault14(self):
152 self.defaultmethodstest('testdefault14')
153
154 def testdefault15(self):
155 self.defaultmethodstest('testdefault15')
156
157 def testdefault16(self):
158 self.defaultmethodstest('testdefault16')
159
160 def testdefault17(self):
161 self.defaultmethodstest('testdefault17')
162 def testdefault18(self):
163 self.defaultmethodstest('testdefault18')
164
165 class TestSolver(AscendSelfTester):
166
167 def testlog10(self):
168 M = self._run('testlog10')
169
170 def testrootsofpoly(self):
171 self._run('roots_of_poly',filename="roots_of_poly.a4c")
172
173 def testcollapsingcan(self):
174 self._run('collapsingcan',filename="collapsingcan.a4c")
175
176 def testdistancecalc(self):
177 self._run('distance_calc',filename="distance_calc.a4c")
178
179 def testconopt(self):
180 self._run('testconopt',"CONOPT")
181
182 def testcmslv2(self):
183 self._run('testcmslv2',"CMSlv")
184
185 def testsunpos1(self):
186 self._run('example_1_6_1',"QRSlv","johnpye/sunpos.a4c")
187
188 def testsunpos2(self):
189 self._run('example_1_6_2',"QRSlv","johnpye/sunpos.a4c")
190
191 def testsunpos3(self):
192 self._run('example_1_7_1',"QRSlv","johnpye/sunpos.a4c")
193
194 def testsunpos4(self):
195 self._run('example_1_7_2',"QRSlv","johnpye/sunpos.a4c")
196
197 def testsunpos5(self):
198 self._run('example_1_7_3',"QRSlv","johnpye/sunpos.a4c")
199
200 def testsunpos6(self):
201 self._run('example_1_8_1',"QRSlv","johnpye/sunpos.a4c")
202
203 def testinstanceas(self):
204 M = self._run('example_1_6_1',"QRSlv","johnpye/sunpos.a4c")
205 self.assertAlmostEqual( float(M.t_solar), M.t_solar.as("s"))
206 self.assertAlmostEqual( float(M.t_solar)/3600, M.t_solar.as("h"))
207
208 def testwritegraph(self):
209 M = self._run('testlog10')
210 M.write("dot")
211
212
213 class TestLRSlv(AscendSelfTester):
214 def testonerel(self):
215 self._run('onerel',"LRSlv","test/lrslv/onerel.a4c")
216
217 # need to migrate to 'FIX boolvar', currently not supported...
218 # def testonerel(self):
219 # self._run('onerel',"LRSlv","test/lrslv/onerel.a4c")
220
221 def testsequencecrash(self):
222 try:
223 self._run('onerel',"LRSlv","test/lrslv/sequencecrash.a4c")
224 except:
225 pass
226 # it just has to not crash, that's all
227
228 def testsequence(self):
229 self._run('onerel',"LRSlv","test/lrslv/sequence.a4c")
230
231
232 class TestCMSlv(AscendSelfTester):
233 def testsonic(self):
234 M = self._run('sonic',"CMSlv","sonic.a4c")
235 assert(M.sonic_flow.getBoolValue())
236
237 # other side of boundary...
238 M.D.setRealValueWithUnits(4.,"cm")
239 T = self.L.findType('sonic')
240 M.solve(ascpy.Solver('CMSlv'),ascpy.SolverReporter())
241 M.run(T.getMethod('self_test'))
242 assert(not M.sonic_flow.getBoolValue())
243
244 def testheatex(self):
245 self._run('heatex',"CMSlv","heatex.a4c")
246 def testphaseeq(self):
247 self._run('phaseq',"CMSlv","phaseq.a4c")
248 def testpipeline(self):
249 self._run('pipeline',"CMSlv","pipeline.a4c"
250 ,{'infinity':3.2e9}
251 )
252 def testrachford(self):
253 self._run('rachford',"CMSlv","rachford.a4c")
254 def testlinmassbal(self):
255 self._run('linmassbal',"CMSlv","linmassbal.a4c")
256
257
258 class TestMatrix(AscendSelfTester):
259 def testlog10(self):
260 M = self._run('testlog10')
261 print M.getMatrix().write(sys.stderr,"mmio")
262
263
264 class TestIntegrator(Ascend):
265
266 def testListIntegrators(self):
267 I = ascpy.Integrator.getEngines()
268 s1 = sorted([str(i) for i in I.values()])
269 s2 = sorted(['IDA','LSODE','AWW'])
270 assert s1==s2
271
272 # this routine is reused by both testIDA and testLSODE
273 def _testIntegrator(self,integratorname):
274 self.L.load('johnpye/shm.a4c')
275 M = self.L.findType('shm').getSimulation('sim')
276 M.setSolver(ascpy.Solver('QRSlv'))
277 P = M.getParameters()
278 M.setParameter('feastol',1e-12)
279 print M.getChildren()
280 assert float(M.x) == 10.0
281 assert float(M.v) == 0.0
282 t_end = math.pi
283
284 I = ascpy.Integrator(M)
285 I.setReporter(ascpy.IntegratorReporterNull(I))
286 I.setEngine(integratorname);
287 I.setLinearTimesteps(ascpy.Units("s"), 0.0, t_end, 100);
288 I.setMinSubStep(0.0001); # these limits are required by IDA at present (numeric diff)
289 I.setMaxSubStep(0.1);
290 I.setInitialSubStep(0.001);
291 I.setMaxSubSteps(200);
292 if(integratorname=='IDA'):
293 I.setParameter('autodiff',False)
294 for p in M.getParameters():
295 print p.getName(),"=",p.getValue()
296 I.analyse();
297 I.solve();
298 print "At end of simulation,"
299 print "x = %f" % M.x
300 print "v = %f" % M.v
301 assert abs(float(M.x) + 10) < 1e-2
302 assert abs(float(M.v)) < 1e-2
303 assert I.getNumObservedVars() == 3
304
305 def testInvalidIntegrator(self):
306 self.L.load('johnpye/shm.a4c')
307 M = self.L.findType('shm').getSimulation('sim')
308 M.setSolver(ascpy.Solver('QRSlv'))
309 I = ascpy.Integrator(M)
310 try:
311 I.setEngine('___NONEXISTENT____')
312 except RuntimeError:
313 return
314 self.fail("setEngine did not raise error!")
315
316 def testLSODE(self):
317 self._testIntegrator('LSODE')
318
319 def testIDA(self):
320 self._testIntegrator('IDA')
321
322 def testparameters(self):
323 self.L.load('johnpye/shm.a4c')
324 M = self.L.findType('shm').getSimulation('sim')
325 M.build()
326 I = ascpy.Integrator(M)
327 I.setEngine('IDA')
328 P = I.getParameters()
329 for p in P:
330 print p.getName(),"=",p.getValue()
331 assert len(P)==12
332 assert P[0].isStr()
333 assert P[0].getName()=="linsolver"
334 assert P[0].getValue()=='DENSE'
335 assert P[2].getName()=="maxord"
336 assert P[3].getName()=="autodiff"
337 assert P[3].getValue()==True
338 assert P[8].getName()=="atolvect"
339 assert P[8].getBoolValue() == True
340 P[3].setBoolValue(False)
341 assert P[3].getBoolValue()==False
342 I.setParameters(P)
343 assert I.getParameterValue('autodiff')==False
344 I.setParameter('autodiff',True)
345 try:
346 v = I.getParameterValue('nonexist')
347 except KeyError:
348 pass
349 else:
350 self.fail('Failed to trip invalid Integrator parameter')
351
352 class TestLSODE(Ascend):
353
354 def testzill(self):
355 self.L.load('johnpye/zill.a4c')
356 T = self.L.findType('zill')
357 M = T.getSimulation('sim')
358 M.setSolver(ascpy.Solver('QRSlv'))
359 I = ascpy.Integrator(M)
360 I.setEngine('LSODE')
361 I.setMinSubStep(1e-7)
362 I.setMaxSubStep(0.001)
363 I.setMaxSubSteps(10000)
364 I.setReporter(ascpy.IntegratorReporterConsole(I))
365 I.setLinearTimesteps(ascpy.Units(), 1.0, 1.5, 5)
366 I.analyse()
367 I.solve()
368 M.run(T.getMethod('self_test'))
369
370 def testnewton(self):
371 sys.stderr.write("STARTING TESTNEWTON\n")
372 self.L.load('johnpye/newton.a4c')
373 T = self.L.findType('newton')
374 M = T.getSimulation('sim')
375 M.solve(ascpy.Solver("QRSlv"),ascpy.SolverReporter())
376 I = ascpy.Integrator(M)
377 I.setEngine('LSODE')
378 I.setParameter('rtolvect',False)
379 I.setParameter('rtol',1e-7)
380 I.setParameter('atolvect',False)
381 I.setParameter('atol',1e-7)
382 I.setMinSubStep(1e-7)
383 I.setMaxSubStep(0.001)
384 I.setMaxSubSteps(10000)
385
386 I.setReporter(ascpy.IntegratorReporterConsole(I))
387 I.setLinearTimesteps(ascpy.Units("s"), 0, 2*float(M.v)/float(M.g), 2)
388 I.analyse()
389 I.solve()
390 print "At end of simulation,"
391 print "x = %f" % M.x
392 print "v = %f" % M.v
393 M.run(T.getMethod('self_test'))
394
395 def testlotka(self):
396 self.L.load('johnpye/lotka.a4c')
397 M = self.L.findType('lotka').getSimulation('sim')
398 M.setSolver(ascpy.Solver("QRSlv"))
399 I = ascpy.Integrator(M)
400 I.setEngine('LSODE')
401 I.setReporter(ascpy.IntegratorReporterConsole(I))
402 I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 5)
403 I.analyse()
404 print "Number of vars = %d" % I.getNumVars()
405 assert I.getNumVars()==2
406 I.solve()
407 assert I.getNumObservedVars() == 3;
408 assert abs(M.R - 832) < 1.0
409 assert abs(M.F - 21.36) < 0.1
410
411 def testwritegraph(self):
412 self.L.load('johnpye/lotka.a4c')
413 M = self.L.findType('lotka').getSimulation('sim')
414 F = file('lotka.dot','w')
415 M.build()
416 M.write(F,"dot")
417
418
419 #-------------------------------------------------------------------------------
420 # Testing of a external blackbox functions
421
422 class TestBlackBox(AscendSelfTester):
423 def testparsefail0(self):
424 try:
425 self.L.load('test/blackbox/parsefail0.a4c')
426 self.fail("parsefail0 should not have loaded without errors")
427 except:
428 pass
429
430 def testparsefail1(self):
431 try:
432 self.L.load('test/blackbox/parsefail1.a4c')
433 self.fail("parsefail1 should not have loaded without errors")
434 except:
435 pass
436
437 def testparsefail2(self):
438 try:
439 self.L.load('test/blackbox/parsefail2.a4c')
440 self.fail("parsefail2 should not have loaded without errors")
441 except:
442 pass
443
444 def testparsefail3(self):
445 try:
446 self.L.load('test/blackbox/parsefail3.a4c')
447 self.fail("parsefail3 should not have loaded without errors")
448 except:
449 pass
450
451 def testparsefail4(self):
452 try:
453 self.L.load('test/blackbox/parsefail4.a4c')
454 self.fail("parsefail4 should not have loaded")
455 except:
456 pass
457
458 def testfail1(self):
459 """Mismatched arg counts check-- tests bbox, not ascend."""
460 self.L.load('test/blackbox/fail1.a4c')
461 try:
462 M = self.L.findType('fail1').getSimulation('sim')
463 self.fail("expected exception was not raised")
464 except RuntimeError,e:
465 print "Caught exception '%s', assumed ok" % e
466
467 def testfail2(self):
468 """Incorrect data arg check -- tests bbox, not ascend"""
469 self.L.load('test/blackbox/fail2.a4c')
470 try:
471 M = self.L.findType('fail2').getSimulation('sim')
472 self.fail("expected exception was not raised")
473 except RuntimeError,e:
474 print "Caught exception '%s', assumed ok (should mention errors during instantiation)" % e
475
476 def testpass1(self):
477 """simple single bbox forward solve"""
478 M = self._run('pass1',filename='test/blackbox/pass.a4c')
479
480 def testpass2(self):
481 """simple single bbox reverse solve"""
482 M = self._run('pass2',filename='test/blackbox/pass.a4c')
483
484 def testpass3(self):
485 """simple double bbox solve"""
486 M = self._run('pass3',filename='test/blackbox/pass3.a4c')
487
488 def testpass4(self):
489 """simple double bbox reverse solve"""
490 M = self._run('pass4',filename='test/blackbox/pass3.a4c')
491
492 def testpass5(self):
493 M = self._run('pass5',filename='test/blackbox/pass5.a4c')
494
495 def testpass6(self):
496 M = self._run('pass6',filename='test/blackbox/pass5.a4c')
497
498 def testpass7(self):
499 M = self._run('pass7',filename='test/blackbox/passmerge.a4c')
500
501 def testpass8(self):
502 M = self._run('pass8',filename='test/blackbox/passmerge.a4c')
503
504 def testpass9(self):
505 M = self._run('pass9',filename='test/blackbox/passmerge.a4c')
506
507 def testpass10(self):
508 M = self._run('pass10',filename='test/blackbox/passmerge.a4c')
509
510 def testpass11(self):
511 M = self._run('pass11',filename='test/blackbox/passmerge.a4c')
512
513 def testpass12(self):
514 M = self._run('pass12',filename='test/blackbox/passmerge.a4c')
515
516 # this test doesn't work: 'system is inconsistent' -- and structurally singular
517 # def testpass13(self):
518 # """cross-merged input/output solve"""
519 # M = self._run('pass13',filename='test/blackbox/passmerge.a4c')
520
521 def testpass14(self):
522 """cross-merged input/output reverse solve"""
523 M = self._run('pass14',filename='test/blackbox/passmerge.a4c')
524
525 def testpass20(self):
526 M = self._run('pass20',filename='test/blackbox/passarray.a4c')
527
528 def testparsefail21(self):
529 """dense array of black boxes wrong syntax"""
530 try:
531 self.L.load('test/blackbox/parsefail21.a4c')
532 self.fail("parsefail21 should not have loaded without errors")
533 except:
534 pass
535
536 def testpass22(self):
537 M = self._run('pass22',filename='test/blackbox/passarray.a4c')
538
539 def testpass23(self):
540 M = self._run('pass23',filename='test/blackbox/passarray.a4c')
541
542 def testpass61(self):
543 M = self._run('pass61',filename='test/blackbox/reinstantiate.a4c')
544
545 def testpass62(self):
546 M = self._run('pass62',filename='test/blackbox/reinstantiate.a4c')
547
548 def testpass64(self):
549 M = self._run('pass64',filename='test/blackbox/reinstantiate.a4c')
550
551 def testpass65(self):
552 M = self._run('pass65',filename='test/blackbox/reinstantiate.a4c')
553
554 def testpass66(self):
555 M = self._run('pass66',filename='test/blackbox/reinstantiate.a4c')
556
557 def testpass67(self):
558 M = self._run('pass67',filename='test/blackbox/reinstantiate.a4c')
559
560 class TestExtFn(AscendSelfTester):
561 def testextfntest(self):
562 M = self._run('extfntest',filename='johnpye/extfn/extfntest.a4c')
563 self.assertAlmostEqual(M.y, 2);
564 self.assertAlmostEqual(M.x, 1);
565 self.assertAlmostEqual(M.y, M.x + 1);
566
567 def testextrelfor(self):
568 M = self._run('extrelfor',filename='johnpye/extfn/extrelfor.a4c')
569
570 ## @TODO fix bug with badly-named bbox rel in a loop (Ben, maybe)
571 # def testextrelforbadnaming(self):
572 # self.L.load('johnpye/extfn/extrelforbadnaming.a4c')
573 # T = self.L.findType('extrelfor')
574 # M = T.getSimulation('sim')
575 # M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
576 # print "x[1] = %f" % M.x[1]
577 # print "x[2] = %f" % M.x[2]
578 # print "x[3] = %f" % M.x[3]
579 # print "x[4] = %f" % M.x[4]
580 # print "x[5] = %f" % M.x[5]
581 # M.run(T.getMethod('self_test'))
582
583 def testextrelrepeat(self):
584 M = self._run('extrelrepeat',filename='johnpye/extfn/extrelrepeat.a4c')
585
586 #-------------------------------------------------------------------------------
587 # Testing of Sensitivity module
588
589 class TestSensitivity(AscendSelfTester):
590 def test1(self):
591 self.L.load('sensitivity_test.a4c')
592 T = self.L.findType('sensitivity_test')
593 M = T.getSimulation('sim',False)
594 M.run(T.getMethod('on_load'))
595 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
596 M.run(T.getMethod('analyse'))
597 M.run(T.getMethod('self_test'))
598
599 # def testall(self):
600 # self.L.load('sensitivity_test.a4c')
601 # T = self.L.findType('sensitivity_test_all')
602 # M = T.getSimulation('sim',False)
603 # M.run(T.getMethod('on_load'))
604 # M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
605 # M.run(T.getMethod('analyse'))
606 # M.run(T.getMethod('self_test'))
607 # CAUSES CRASH
608
609 #-------------------------------------------------------------------------------
610 # Testing of a ExtPy - external python methods
611
612 class TestExtPy(AscendSelfTester):
613 def test1(self):
614 self.L.load('johnpye/extpy/extpytest.a4c')
615 T = self.L.findType('extpytest')
616 M = T.getSimulation('sim')
617 M.run(T.getMethod('self_test'))
618
619 def test2(self):
620 self.L.load('johnpye/extpy/extpytest.a4c')
621 T = self.L.findType('extpytest')
622 M = T.getSimulation('sim')
623 M.run(T.getMethod('pythonthing'))
624 M.run(T.getMethod('pythonthing'))
625 M.run(T.getMethod('pythonthing'))
626 M.run(T.getMethod('pythonthing'))
627 M.run(T.getMethod('pythonthing'))
628 M.run(T.getMethod('pythonthing'))
629 M.run(T.getMethod('pythonthing'))
630 # causes crash!
631
632 #-------------------------------------------------------------------------------
633 # Testing of saturated steam properties library (iapwssatprops.a4c)
634
635 class TestSteam(AscendSelfTester):
636
637 def testiapwssatprops1(self):
638 M = self._run('testiapwssatprops1',filename='steam/iapwssatprops.a4c')
639 def testiapwssatprops2(self):
640 M = self._run('testiapwssatprops2',filename='steam/iapwssatprops.a4c')
641 def testiapwssatprops3(self):
642 M = self._run('testiapwssatprops3',filename='steam/iapwssatprops.a4c')
643
644 # test the stream model basically works
645 def testsatsteamstream(self):
646 M = self._run('satsteamstream',filename='steam/satsteamstream.a4c')
647
648 # test that we can solve in terms of various (rho,u)
649 def testsatuv(self):
650 self.L.load('steam/iapwssat.a4c')
651 T = self.L.findType('testiapwssatuv')
652 M = T.getSimulation('sim',False)
653 M.run(T.getMethod('on_load'))
654 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
655 print "p = %f bar" % M.p.as('bar');
656 print "T = %f C" % (M.T.as('K') - 273.15);
657 print "x = %f" % M.x;
658 M.run(T.getMethod('self_test'))
659 M.run(T.getMethod('values2'))
660 # M.v.setRealValueWithUnits(1.0/450,"m^3/kg");
661 # M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
662 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
663 print "p = %f bar" % M.p.as('bar');
664 print "T = %f C" % (M.T.as('K') - 273.15);
665 print "x = %f" % M.x;
666 M.run(T.getMethod('self_test2'))
667
668
669 ## @TODO fix error capture from bounds checking during initialisation
670 # def testiapwssat1(self):
671 # M = self._run('testiapwssat1',filename='steam/iapwssat.a4c')
672
673 def testdsgsat(self):
674 self.L.load('steam/dsgsat3.a4c')
675 T = self.L.findType('dsgsat3')
676 M = T.getSimulation('sim',False)
677 M.run(T.getMethod('on_load'))
678 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
679 self.assertAlmostEqual(M.dTw_dt[2],0.0);
680 M.run(T.getMethod('configure_dynamic'))
681 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
682 return M
683
684 def testdsgsatrepeat(self):
685 self.L.load('steam/dsgsat3.a4c')
686 T = self.L.findType('dsgsat3')
687 M = T.getSimulation('sim',False)
688 M.run(T.getMethod('on_load'))
689 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
690 M.run(T.getMethod('on_load'))
691 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
692 M.run(T.getMethod('on_load'))
693 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
694
695 def testvary(self):
696 self.L.load('steam/dsgsat3.a4c')
697 T = self.L.findType('dsgsat3')
698 M = T.getSimulation('sim',False)
699 M.run(T.getMethod('on_load'))
700 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
701 print "----- setting qdot_s -----"
702 M.qdot_s.setRealValueWithUnits(1000,"W/m")
703 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
704 print "----- setting qdot_s -----"
705 M.qdot_s.setRealValueWithUnits(2000,"W/m")
706 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
707
708 def teststeadylsode(self):
709 "test that steady conditions are stable with LSODE"
710 M = self.testdsgsat()
711 #M.qdot_s.setRealValueWithUnits(1000,"W/m")
712 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
713 #M.setParameter('
714 I = ascpy.Integrator(M)
715 I.setEngine('LSODE')
716 I.setReporter(ascpy.IntegratorReporterConsole(I))
717 I.setLinearTimesteps(ascpy.Units("s"), 0, 3600, 10)
718 I.analyse()
719 I.solve()
720
721 # def testpeturblsode(self):
722 # "test that steady conditions are stable with LSODE"
723 # M = self.testdsgsat()
724 # # here is the peturbation...
725 # M.qdot_s.setRealValueWithUnits(1000,"W/m")
726 # M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
727 # I = ascpy.Integrator(M)
728 # I.setEngine('LSODE')
729 # I.setReporter(ascpy.IntegratorReporterConsole(I))
730 # I.setLinearTimesteps(ascpy.Units("s"), 0, 5, 1)
731 # I.analyse()
732 # I.solve()
733
734 def teststeadyida(self):
735 M = self.testdsgsat()
736 self.assertAlmostEqual(M.dTw_dt[2],0.0)
737 Tw1 = float(M.T_w[2])
738 T = self.L.findType('dsgsat3')
739 M.run(T.getMethod('free_states'))
740 I = ascpy.Integrator(M)
741 I.setEngine('IDA')
742 I.setParameter('linsolver','DENSE')
743 I.setParameter('safeeval',True)
744 I.setParameter('rtol',1e-4)
745 I.setParameter('atolvect',False)
746 I.setParameter('atol',1e-4)
747 I.setParameter('maxord',3)
748 I.setInitialSubStep(0.001)
749 I.setReporter(ascpy.IntegratorReporterConsole(I))
750 I.setLinearTimesteps(ascpy.Units("s"), 0, 3600, 10)
751 I.analyse()
752 I.solve()
753 self.assertAlmostEqual(float(M.T_w[2]),Tw1)
754 M.qdot_s.setRealValueWithUnits(1000,"W/m")
755 self.assertAlmostEqual(M.qdot_s.as("W/m"),1000)
756 M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
757 print "dTw/dt = %f" % M.dTw_dt[2]
758 self.assertNotAlmostEqual(M.dTw_dt[2],0.0)
759 F=file('dsgsat.dot','w')
760 M.write(F,'dot')
761
762 def testpeturbida(self):
763 M = self.testdsgsat()
764 self.assertAlmostEqual(M.dTw_dt[2],0.0)
765 T = self.L.findType('dsgsat3')
766 M.run(T.getMethod('free_states'))
767 # here is the peturbation...
768 M.qdot_s.setRealValueWithUnits(6000,"W/m")
769 # IDA has its own initial conditions solver, so no need to call QRSlv here
770 I = ascpy.Integrator(M)
771 I.setEngine('IDA')
772 I.setParameter('linsolver','DENSE')
773 I.setParameter('safeeval',True)
774 I.setParameter('rtol',1e-4)
775 I.setParameter('atolvect',False)
776 I.setParameter('atol',1e-4)
777 I.setParameter('maxord',3)
778 I.setInitialSubStep(0.001)
779 I.setReporter(ascpy.IntegratorReporterConsole(I))
780 I.setLogTimesteps(ascpy.Units("s"), 0.001, 3600, 40)
781 I.analyse()
782 F = file('ga.mm','w')
783 I.writeMatrix(F,'dg/dz')
784 F = file('gd.mm','w')
785 I.writeMatrix(F,'dg/dx')
786 F = file('fa.mm','w')
787 I.writeMatrix(F,'df/dz')
788 F = file('fd.mm','w')
789 I.writeMatrix(F,'df/dx')
790 F = file('fdp.mm','w')
791 I.writeMatrix(F,"df/dx'")
792 I.solve()
793
794 #-------------------------------------------------------------------------------
795 # Testing of freesteam external steam properties functions
796
797 with_freesteam = True
798 try:
799 # we assume that if the freesteam python module is installed, the ASCEND
800 # external library will also be.
801 import freesteam
802 have_freesteam = True
803 except ImportError,e:
804 have_freesteam = False
805
806 if with_freesteam and have_freesteam:
807 class TestFreesteam(AscendSelfTester):
808 # def testfreesteamtest(self):
809 # """run the self-test cases bundled with freesteam"""
810 # self._run('testfreesteam',filename='testfreesteam.a4c')
811
812 def testload(self):
813 """check that we can load 'thermalequilibrium2' (IMPORT "freesteam", etc)"""
814 self.L.load('johnpye/thermalequilibrium2.a4c')
815
816 def testinstantiate(self):
817 """load an instantiate 'thermalequilibrium2'"""
818 self.testload()
819 M = self.L.findType('thermalequilibrium2').getSimulation('sim')
820 return M
821
822 def testintegrate(self):
823 """integrate transfer of heat from one mass of water/steam to another
824 according to Newton's law of cooling"""
825 M = self.testinstantiate()
826 M.setSolver(ascpy.Solver("QRSlv"))
827 I = ascpy.Integrator(M)
828 I.setEngine('LSODE')
829 I.setReporter(ascpy.IntegratorReporterConsole(I))
830 I.setLinearTimesteps(ascpy.Units("s"), 0, 3000, 30)
831 I.setMinSubStep(0.01)
832 I.setInitialSubStep(1)
833 I.analyse()
834 print "Number of vars = %d" % I.getNumVars()
835 assert I.getNumVars()==2
836 I.solve()
837 assert I.getNumObservedVars() == 3;
838 print "S[1].T = %f K" % M.S[1].T
839 print "S[2].T = %f K" % M.S[2].T
840 print "Q = %f W" % M.Q
841 self.assertAlmostEqual(float(M.S[1].T),506.77225109,4);
842 self.assertAlmostEqual(float(M.S[2].T),511.605173967,5);
843 self.assertAlmostEqual(float(M.Q),-48.32922877329,3);
844 self.assertAlmostEqual(float(M.t),3000);
845 print "Note that the above values have not been verified analytically"
846
847 def testcollapsingcan2(self):
848 """ solve the collapsing can model using IAPWS-IF97 steam props """
849 M = self._run("collapsingcan2",filename="collapsingcan2.a4c");
850
851 #-------------------------------------------------------------------------------
852 # Testing of IDA's analysis module
853
854 class TestIDA(Ascend):
855 def _run(self,filen,modeln=""):
856 self.L.load('test/ida/%s.a4c' % filen)
857 T = self.L.findType('%s%s' % (filen,modeln))
858 M = T.getSimulation('sim')
859 M.build()
860 I = ascpy.Integrator(M)
861 I.setEngine('IDA')
862 I.analyse()
863 return M;
864
865 def _runfail(self,filen,n,msg="failed"):
866 try:
867 self._run(filen,'fail%d' % n)
868 except Exception,e:
869 print "(EXPECTED) ERROR: %s" % e
870 return
871 self.fail(msg)
872
873 def testsinglederiv(self):
874 self._run('singlederiv')
875
876 def testsinglederivfail1(self):
877 self._runfail('singlederiv',1
878 ,"t.ode_id=-1 did not trigger error")
879
880 def testsinglederivfail2(self):
881 self._runfail('singlederiv',2
882 ,"dy_dt.ode_id=2 did not trigger error")
883
884 def testsinglederivfail3(self):
885 self._runfail('singlederiv',3
886 ,"dy_dt.ode_type=3 did not trigger error")
887
888 def testsinglederivfail4(self):
889 self._runfail('singlederiv',4
890 ,"duplicate ode_type=1 did not trigger error")
891
892 def testsinglederivfail5(self):
893 self._runfail('singlederiv',5
894 ,"duplicate ode_type=1 did not trigger error")
895
896 def testsinglederivfail6(self):
897 self._runfail('singlederiv',6
898 ,"duplicate ode_type=1 did not trigger error")
899
900 def testtwoderiv(self):
901 self._run('twoderiv')
902
903 def testtwoderivfail1(self):
904 self._runfail('twoderiv',1)
905
906 def testtwoderivfail2(self):
907 self._runfail('twoderiv',2)
908
909 def testtwoderivfail3(self):
910 self._runfail('twoderiv',3)
911 def testtwoderivfail4(self):
912 self._runfail('twoderiv',4)
913 def testtwoderivfail5(self):
914 self._runfail('twoderiv',5)
915
916 def testnoderivs(self):
917 self._runfail('noderivs',1)
918
919 def testnoindeps(self):
920 self._runfail('indeps',1)
921
922 def testtwoindeps(self):
923 self._runfail('indeps',2)
924
925 def testfixedvars(self):
926 self._run('fixedvars')
927
928 def testfixedvars1(self):
929 self._run('fixedvars',1)
930
931 # fails the index check
932 # def testfixedvars2(self):
933 # self._run('fixedvars',2)
934
935 # fails the index check
936 # def testfixedvars3(self):
937 # self._run('fixedvars',3)
938
939 def testincidence(self):
940 self._run('incidence')
941
942 def testincidence1(self):
943 self._run('incidence',1)
944 def testincidence2(self):
945 self._run('incidence',2)
946 def testincidence3(self):
947 M = self._run('incidence',3)
948
949 def testincidence4(self):
950 self._run('incidence',4)
951 def testincidencefail5(self):
952 self._runfail('incidence',5)
953
954 def testwritematrix(self):
955 self.L.load('test/ida/writematrix.a4c')
956 T = self.L.findType('writematrix')
957 M = T.getSimulation('sim')
958 M.build()
959 I = ascpy.Integrator(M)
960 I.setEngine('IDA')
961 I.analyse()
962 F = os.tmpfile()
963 I.writeMatrix(F,"dF/dy")
964 F.seek(0)
965 print F.read()
966 F1 = os.tmpfile()
967 I.writeMatrix(F1,"dF/dy'")
968 F1.seek(0)
969 print F1.read()
970 F1 = os.tmpfile()
971 I.writeMatrix(F1,"dg/dx")
972 F1.seek(0)
973 print F1.read()
974 # for the moment you'll have to check these results manually.
975
976 def testwritematrix2(self):
977 self.L.load('test/ida/writematrix.a4c')
978 T = self.L.findType('writematrix2')
979 M = T.getSimulation('sim')
980 M.build()
981 I = ascpy.Integrator(M)
982 I.setEngine('IDA')
983 I.analyse()
984 F = os.tmpfile()
985 I.writeMatrix(F,"dF/dy")
986 F.seek(0)
987 print F.read()
988 F1 = os.tmpfile()
989 I.writeMatrix(F1,"dF/dy'")
990 F1.seek(0)
991 print F1.read()
992 F1 = os.tmpfile()
993 I.writeMatrix(F1,"dg/dx")
994 F1.seek(0)
995 print F1.read()
996 #F1 = os.tmpfile()
997 #I.writeMatrix(F1,"dydp/dyd")
998 #F1.seek(0)
999 #print F1.read()
1000 # for the moment you'll have to check these results manually.
1001
1002 def testindexproblem(self):
1003 self.L.load('test/ida/indexproblem.a4c')
1004 T = self.L.findType('indexproblem')
1005 M = T.getSimulation('sim')
1006 M.build()
1007 I = ascpy.Integrator(M)
1008 I.setEngine('IDA')
1009 I.analyse()
1010 pass
1011
1012 def testindexproblem2(self):
1013 self.L.load('test/ida/indexproblem.a4c')
1014 T = self.L.findType('indexproblem2')
1015 M = T.getSimulation('sim')
1016 M.build()
1017 I = ascpy.Integrator(M)
1018 I.setEngine('IDA')
1019 try:
1020 I.analyse()
1021 except Exception,e:
1022 return
1023 self.fail("Index problem not detected")
1024
1025 def testboundaries(self):
1026 self.L.load('test/ida/boundaries.a4c')
1027 T = self.L.findType('boundaries')
1028 M = T.getSimulation('sim')
1029 M.build()
1030 I = ascpy.Integrator(M)
1031 I.setEngine('IDA')
1032 I.analyse()
1033 I.setLogTimesteps(ascpy.Units("s"), 0.1, 20, 20)
1034 I.setParameter('linsolver','DENSE')
1035 I.setParameter('calcic','Y')
1036 I.setParameter('linsolver','DENSE')
1037 I.setParameter('safeeval',False)
1038 I.setReporter(ascpy.IntegratorReporterConsole(I))
1039 I.solve()
1040
1041 # doesn't work yet:
1042 # def testincidence5(self):
1043 # self._run('incidence',5)
1044
1045
1046 #-------------------------------------------------------------------------------
1047 # Testing of IDA models using DENSE linear solver
1048
1049 class TestIDADENSE(Ascend):
1050 """IDA DAE integrator, DENSE linear solver"""
1051
1052 def testlotka(self):
1053 self.L.load('johnpye/lotka.a4c')
1054 M = self.L.findType('lotka').getSimulation('sim')
1055 M.setSolver(ascpy.Solver("QRSlv"))
1056 I = ascpy.Integrator(M)
1057 I.setEngine('IDA')
1058 I.setReporter(ascpy.IntegratorReporterConsole(I))
1059 I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 5);
1060 I.setParameter('linsolver','DENSE')
1061 I.setParameter('rtol',1e-8);
1062 I.analyse()
1063 assert I.getNumVars()==2
1064 assert abs(M.R - 1000) < 1e-300
1065 I.solve()
1066 assert I.getNumObservedVars() == 3
1067 assert abs(M.R - 832) < 1.0
1068 assert abs(M.F - 21.36) < 0.1
1069
1070 def testdenx(self):
1071 print "-----------------------------====="
1072 self.L.load('johnpye/idadenx.a4c')
1073 M = self.L.findType('idadenx').getSimulation('sim')
1074 M.setSolver(ascpy.Solver("QRSlv"))
1075 I = ascpy.Integrator(M)
1076 I.setEngine('IDA')
1077 I.setParameter('calcic','YA_YDP')
1078 I.setParameter('linsolver','DENSE')
1079 I.setParameter('safeeval',True)
1080 I.setReporter(ascpy.IntegratorReporterConsole(I))
1081 I.setLogTimesteps(ascpy.Units("s"), 0.4, 4e10, 11)
1082 I.setMaxSubStep(0);
1083 I.setInitialSubStep(0)
1084 I.setMaxSubSteps(0)
1085 I.setParameter('autodiff',True)
1086 I.analyse()
1087 I.solve()
1088 assert abs(float(M.y1) - 5.1091e-08) < 2e-9
1089 assert abs(float(M.y2) - 2.0437e-13) < 2e-14
1090 assert abs(float(M.y3) - 1.0) < 1e-5
1091
1092 def testhires(self):
1093 self.L.load('test/hires.a4c')
1094 T = self.L.findType('hires')
1095 M = T.getSimulation('sim')
1096 M.setSolver(ascpy.Solver('QRSlv'))
1097 I = ascpy.Integrator(M)
1098 I.setEngine('IDA')
1099 I.setParameter('linsolver','DENSE')
1100 I.setParameter('rtol',1.1e-15)
1101 I.setParameter('atolvect',0)
1102 I.setParameter('atol',1.1e-15)
1103 I.setReporter(ascpy.IntegratorReporterConsole(I))
1104 I.setLogTimesteps(ascpy.Units(""), 1, 321.8122, 5)
1105 I.setInitialSubStep(1e-5)
1106 I.setMaxSubSteps(10000)
1107 I.analyse()
1108 I.solve()
1109 for i in range(8):
1110 print "y[%d] = %.20g" % (i+1, M.y[i+1])
1111 M.run(T.getMethod('self_test'))
1112
1113 def testchemakzo(self):
1114 self.L.load('test/chemakzo.a4c')
1115 T = self.L.findType('chemakzo')
1116 M = T.getSimulation('sim')
1117 M.setSolver(ascpy.Solver('QRSlv'))
1118 I = ascpy.Integrator(M)
1119 I.setEngine('IDA')
1120 I.setParameter('linsolver','DENSE')
1121 I.setParameter('rtol',1e-15)
1122 I.setParameter('atolvect',0)
1123 I.setParameter('atol',1e-15)
1124 I.setReporter(ascpy.IntegratorReporterConsole(I))
1125 I.setLinearTimesteps(ascpy.Units("s"), 1, 180, 5)
1126 I.setInitialSubStep(1e-13)
1127 I.setMaxSubSteps(10000)
1128 I.analyse()
1129 I.solve()
1130 for i in range(6):
1131 print "y[%d] = %.20g" % (i+1, M.y[i+1])
1132 M.run(T.getMethod('self_test'))
1133
1134 def testtransamp(self):
1135 self.L.load('test/transamp.a4c')
1136 T = self.L.findType('transamp')
1137 M = T.getSimulation('sim')
1138 M.setSolver(ascpy.Solver('QRSlv'))
1139 I = ascpy.Integrator(M)
1140 I.setEngine('IDA')
1141 I.setParameter('linsolver','DENSE')
1142 I.setParameter('rtol',1e-7)
1143 I.setParameter('atolvect',0)
1144 I.setParameter('atol',1e-7)
1145 I.setReporter(ascpy.IntegratorReporterConsole(I))
1146 I.setLinearTimesteps(ascpy.Units("s"), 0.05, 0.2, 20)
1147 I.setInitialSubStep(0.00001)
1148 I.setMaxSubSteps(10000)
1149 I.analyse()
1150 I.solve()
1151 for i in range(6):
1152 print "y[%d] = %.20g" % (i+1, M.y[i+1])
1153 M.run(T.getMethod('self_test'))
1154
1155 # MODEL FAILS ANALYSIS: we need to add support for non-incident differential vars
1156 # def testpollution(self):
1157 # self.L.load('test/pollution.a4c')
1158 # T = self.L.findType('pollution')
1159 # M = T.getSimulation('sim')
1160 # M.setSolver(ascpy.Solver('QRSlv'))
1161 # I = ascpy.Integrator(M)
1162 # I.setEngine('IDA')
1163 # I.setParameter('linsolver','DENSE')
1164 # I.setParameter('rtol',1.1e-15)
1165 # I.setParameter('atolvect',0)
1166 # I.setParameter('atol',1.1e-15)
1167 # I.setReporter(ascpy.IntegratorReporterConsole(I))
1168 # I.setLogTimesteps(ascpy.Units("s"), 1, 60, 5)
1169 # I.setInitialSubStep(1e-5)
1170 # I.setMaxSubSteps(10000)
1171 # I.analyse()
1172 # I.solve()
1173 # for i in range(20):
1174 # print "y[%d] = %.20g" % (i+1, M.y[i+1])
1175 # M.run(T.getMethod('self_test'))
1176
1177 ## @TODO fails during IDACalcIC (model too big?)
1178 # def testkryx(self):
1179 # self.L.load('johnpye/idakryx.a4c')
1180 # ascpy.getCompiler().setUseRelationSharing(False)
1181 # M = self.L.findType('idakryx').getSimulation('sim')
1182 # M.setSolver(ascpy.Solver('QRSlv'))
1183 # M.build()
1184 # I = ascpy.Integrator(M)
1185 # I.setEngine('IDA')
1186 # I.setReporter(ascpy.IntegratorReporterConsole(I))
1187 # I.setParameter('linsolver','DENSE')
1188 # I.setParameter('maxl',8)
1189 # I.setParameter('gsmodified',False)
1190 # I.setParameter('autodiff',True)
1191 # I.setParameter('rtol',0)
1192 # I.setParameter('atol',1e-3);
1193 # I.setParameter('atolvect',False)
1194 # I.setParameter('calcic','YA_YDP')
1195 # I.analyse()
1196 # I.setLogTimesteps(ascpy.Units("s"), 0.01, 10.24, 11)
1197 # I.solve()
1198 # assert abs(M.u[2][2].getValue()) < 1e-5
1199
1200 #-------------------------------------------------------------------------------
1201 # Testing of IDA models using SPGMR linear solver (Krylov)
1202
1203 # these tests are disabled until SPGMR preconditioning has been implemented
1204 class TestIDASPGMR:#(Ascend):
1205 def testlotka(self):
1206 self.L.load('johnpye/lotka.a4c')
1207 M = self.L.findType('lotka').getSimulation('sim')
1208 M.setSolver(ascpy.Solver("QRSlv"))
1209 I = ascpy.Integrator(M)
1210 I.setEngine('IDA')
1211 I.setReporter(ascpy.IntegratorReporterConsole(I))
1212 I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 5)
1213 I.setParameter('rtol',1e-8)
1214 I.analyse()
1215 assert I.getNumVars()==2
1216 assert abs(M.R - 1000) < 1e-300
1217 I.solve()
1218 assert I.getNumObservedVars() == 3
1219 assert abs(M.R - 832) < 1.0
1220 assert abs(M.F - 21.36) < 0.1
1221
1222
1223 def testkryx(self):
1224 self.L.load('johnpye/idakryx.a4c')
1225 M = self.L.findType('idakryx').getSimulation('sim')
1226 M.build()
1227 I = ascpy.Integrator(M)
1228 I.setEngine('IDA')
1229 I.setReporter(ascpy.IntegratorReporterConsole(I))
1230 I.setParameter('linsolver','SPGMR')
1231 I.setParameter('prec','JACOBI')
1232 I.setParameter('maxl',8)
1233 I.setParameter('gsmodified',False)
1234 I.setParameter('autodiff',True)
1235 I.setParameter('gsmodified',True)
1236 I.setParameter('rtol',0)
1237 I.setParameter('atol',1e-3);
1238 I.setParameter('atolvect',False)
1239 I.setParameter('calcic','Y')
1240 I.analyse()
1241 I.setLogTimesteps(ascpy.Units("s"), 0.01, 10.24, 10);
1242 print M.udot[1][3]
1243 I.solve()
1244 assert 0
1245
1246 def testzill(self):
1247 self.L.load('johnpye/zill.a4c')
1248 T = self.L.findType('zill')
1249 M = T.getSimulation('sim')
1250 M.setSolver(ascpy.Solver('QRSlv'))
1251 I = ascpy.Integrator(M)
1252 I.setEngine('IDA')
1253 I.setParameter('safeeval',False)
1254 I.setMinSubStep(1e-7)
1255 I.setMaxSubStep(0.001)
1256 I.setMaxSubSteps(10000)
1257 I.setReporter(ascpy.IntegratorReporterConsole(I))
1258 I.setLinearTimesteps(ascpy.Units(), 1.0, 1.5, 5)
1259 I.analyse()
1260 I.solve()
1261 M.run(T.getMethod('self_test'))
1262
1263 def testdenxSPGMR(self):
1264 self.L.load('johnpye/idadenx.a4c')
1265 M = self.L.findType('idadenx').getSimulation('sim')
1266 M.setSolver(ascpy.Solver('QRSlv'))
1267 I = ascpy.Integrator(M)
1268 I.setEngine('IDA')
1269 I.setReporter(ascpy.IntegratorReporterConsole(I))
1270 I.setLogTimesteps(ascpy.Units("s"), 0.4, 4e10, 11)
1271 I.setMaxSubStep(0);
1272 I.setInitialSubStep(0);
1273 I.setMaxSubSteps(0);
1274 I.setParameter('autodiff',True)
1275 I.setParameter('linsolver','SPGMR')
1276 I.setParameter('gsmodified',False)
1277 I.setParameter('maxncf',10)
1278 I.analyse()
1279 I.solve()
1280 assert abs(float(M.y1) - 5.1091e-08) < 1e-10
1281 assert abs(float(M.y2) - 2.0437e-13) < 1e-15
1282 assert abs(float(M.y3) - 1.0) < 1e-5
1283
1284 # move code above down here if you want to temporarily avoid testing it
1285 class NotToBeTested:
1286 def nothing(self):
1287 pass
1288
1289 def testnewton(self):
1290 sys.stderr.write("STARTING TESTNEWTON\n")
1291 self.L.load('johnpye/newton.a4c')
1292 T = self.L.findType('newton')
1293 M = T.getSimulation('sim')
1294 M.solve(ascpy.Solver("QRSlv"),ascpy.SolverReporter())
1295 I = ascpy.Integrator(M)
1296 I.setEngine('IDA')
1297 I.setParameter('linsolver','DENSE')
1298 I.setParameter('safeeval',True)
1299 I.setParameter('rtol',1e-8)
1300 I.setMaxSubStep(0.001)
1301 I.setMaxSubSteps(10000)
1302
1303 I.setReporter(ascpy.IntegratorReporterConsole(I))
1304 I.setLinearTimesteps(ascpy.Units("s"), 0, 2*float(M.v)/float(M.g), 2)
1305 I.analyse()
1306 I.solve()
1307 print "At end of simulation,"
1308 print "x = %f" % M.x
1309 print "v = %f" % M.v
1310 M.run(T.getMethod('self_test'))
1311
1312 if __name__=='__main__':
1313 # a whole bag of tricks to make sure we get the necessary dirs in our ascend, python and ld path vars
1314 restart = 0
1315
1316 if platform.system()=="Windows":
1317 LD_LIBRARY_PATH="PATH"
1318 SEP = ";"
1319 else:
1320 LD_LIBRARY_PATH="LD_LIBRARY_PATH"
1321 SEP = ":"
1322
1323 freesteamdir = os.path.expanduser("~/freesteam/ascend")
1324 modeldirs = [os.path.abspath(os.path.join(sys.path[0],"models")),os.path.abspath(freesteamdir)]
1325 if not os.environ.get('ASCENDLIBRARY'):
1326 os.environ['ASCENDLIBRARY'] = SEP.join(modeldirs)
1327 restart = 1
1328 else:
1329 envmodelsdir = [os.path.abspath(i) for i in os.environ['ASCENDLIBRARY'].split(SEP)]
1330 for l in modeldirs:
1331 if l in envmodelsdir[len(modeldirs):]:
1332 envmodelsdir.remove(l)
1333 restart = 1
1334 for l in modeldirs:
1335 if l not in envmodelsdir:
1336 envmodelsdir.insert(0,l)
1337 restart = 1
1338 os.environ['ASCENDLIBRARY'] = SEP.join(envmodelsdir)
1339
1340 libdirs = ["pygtk","."]
1341 libdirs = [os.path.normpath(os.path.join(sys.path[0],l)) for l in libdirs]
1342 if not os.environ.get(LD_LIBRARY_PATH):
1343 os.environ[LD_LIBRARY_PATH]=SEP.join(libdirs)
1344 restart = 1
1345 else:
1346 envlibdirs = [os.path.normpath(i) for i in os.environ[LD_LIBRARY_PATH].split(SEP)]
1347 for l in libdirs:
1348 if l in envlibdirs[len(libdirs):]:
1349 envlibdirs.remove(l)
1350 restart = 1
1351 for l in libdirs:
1352 if l not in envlibdirs:
1353 envlibdirs.insert(0,l)
1354 restart = 1
1355 os.environ[LD_LIBRARY_PATH] = SEP.join(envlibdirs)
1356
1357 pypath = os.path.normpath(os.path.join(sys.path[0],"pygtk"))
1358 if not os.environ.get('PYTHONPATH'):
1359 os.environ['PYTHONPATH']=pypath
1360 else:
1361 envpypath = os.environ['PYTHONPATH'].split(SEP)
1362 if pypath not in envpypath:
1363 envpypath.insert(0,pypath)
1364 os.environ['PYTHONPATH']=SEP.join(envpypath)
1365 restart = 1
1366
1367 if restart:
1368 script = os.path.join(sys.path[0],"test.py")
1369 print "Restarting with..."
1370 print " export LD_LIBRARY_PATH=%s" % os.environ.get(LD_LIBRARY_PATH)
1371 print " export PYTHONPATH=%s" % os.environ.get('PYTHONPATH')
1372 print " export ASCENDLIBRARY=%s" % os.environ.get('ASCENDLIBRARY')
1373
1374 os.execvp("python",[script] + sys.argv)
1375
1376 import ascpy
1377
1378 try:
1379 import cunit
1380 except:
1381 pass
1382
1383 atexit.register(ascpy.shutdown)
1384 #suite = unittest.TestSuite()
1385 #suite = unittest.defaultTestLoader.loadTestsFromName('__main__')
1386 #unittest.TextTestRunner(verbosity=2).run(suite)
1387 unittest.main()

Properties

Name Value
svn:executable *

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