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

Annotation of /trunk/test.py

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:executable *

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