def ipopt_tester(self,testname,hessian_approx='limited-memory',linear_solver='mumps'): self.L.load('test/ipopt/%s.a4c' % testname) T = self.L.findType(testname) M = T.getSimulation('sim') M.setSolver(ascpy.Solver("IPOPT")) M.setParameter('linear_solver',linear_solver) M.setParameter('hessian_approximation',hessian_approx) M.solve(ascpy.Solver("IPOPT"),ascpy.SolverReporter()) M.run(T.getMethod('self_test'))
def testdsgsat(self): self.L.load('steam/dsgsat3.a4c') T = self.L.findType('dsgsat3') M = T.getSimulation('sim',False) M.run(T.getMethod('on_load')) M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter()) self.assertAlmostEqual(M.dTw_dt[2],0.0); M.run(T.getMethod('configure_dynamic')) M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter()) return M
def testdsgsatrepeat(self): self.L.load('steam/dsgsat3.a4c') T = self.L.findType('dsgsat3') M = T.getSimulation('sim',False) M.run(T.getMethod('on_load')) M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter()) M.run(T.getMethod('on_load')) M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter()) M.run(T.getMethod('on_load')) M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
def _run(self,modelname,solvername="QRSlv",filename=None,parameters={}): if filename==None: filename = 'johnpye/%s.a4c' % modelname self.L.load(filename) T = self.L.findType(modelname) M = T.getSimulation('sim',1) M.setSolver(ascpy.Solver(solvername)) for k,v in parameters.iteritems(): M.setParameter(k,v) M.solve(ascpy.Solver(solvername),ascpy.SolverReporter()) M.run(T.getMethod('self_test')) return M
def testvary(self): self.L.load('steam/dsgsat3.a4c') T = self.L.findType('dsgsat3') M = T.getSimulation('sim',False) M.run(T.getMethod('on_load')) M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter()) print "----- setting qdot_s -----" M.qdot_s.setRealValueWithUnits(1000,"W/m") M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter()) print "----- setting qdot_s -----" M.qdot_s.setRealValueWithUnits(2000,"W/m") M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
def testlotka(self): self.L.load('test/dopri5/dopri5test.a4c') M = self.L.findType('dopri5test').getSimulation('sim') M.setSolver(ascpy.Solver("QRSlv")) M.solve(ascpy.Solver("QRSlv"),ascpy.SolverReporter()) I = ascpy.Integrator(M) I.setEngine('DOPRI5') I.setReporter(ascpy.IntegratorReporterConsole(I)) I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 20) I.setParameter('rtol',1e-8) I.analyse() assert I.getNumVars()==1 I.solve()
def _testIntegrator(self,integratorname): self.L.load('johnpye/shm.a4c') M = self.L.findType('shm').getSimulation('sim',1) M.setSolver(ascpy.Solver('QRSlv')) P = M.getParameters() M.setParameter('feastol',1e-12) print M.getChildren() assert float(M.x) == 10.0 assert float(M.v) == 0.0 t_end = math.pi I = ascpy.Integrator(M) I.setReporter(ascpy.IntegratorReporterNull(I)) I.setEngine(integratorname); I.setLinearTimesteps(ascpy.Units("s"), 0.0, t_end, 100); I.setMinSubStep(0.0001); # these limits are required by IDA at present (numeric diff) I.setMaxSubStep(0.1); I.setInitialSubStep(0.001); I.setMaxSubSteps(200); if(integratorname=='IDA'): I.setParameter('autodiff',False) for p in M.getParameters(): print p.getName(),"=",p.getValue() I.analyse(); I.solve(); print "At end of simulation," print "x = %f" % M.x print "v = %f" % M.v assert abs(float(M.x) + 10) < 1e-2 assert abs(float(M.v)) < 1e-2 assert I.getNumObservedVars() == 3
def moodyplot(self): """ repeatedly solve the colebrook equation to plot a Moody diagram """ self = ascpy.Registry().getInstance('context') self.eps.setFixed(False) self.eps_on_D.setFixed(True) ioff() figure() hold(True) leg = [] Re_vals = array([ 1000, 1500, 2000, 2100, 2300, 2400, 2500, 2600, 2700, 2900, 3000, 4000, 5000, 10000, 20000, 50000, 100000, 200000, 500000, 1e6 ]) #browser.reporter.reportNote(str(len(Re_vals))) for eps_on_D in [ 1e-5, 2e-5, 5e-5, 1e-4, 2e-4, 5e-4, 1e-3, 5e-3, 0.01, 0.02 ]: self.eps_on_D.setRealValue(eps_on_D) f_vals = zeros(size(Re_vals), 'f') for i in range(0, len(Re_vals)): self.Re.setRealValue(Re_vals[i]) browser.sim.solve(ascpy.Solver("QRSlv"), SimpleSolverReporter(browser)) f_vals[i] = self.f.getRealValue() loglog(Re_vals, f_vals) leg += ["e/D = %f" % eps_on_D] legend(leg) ion() show()
def test1(self): ascpy.getCompiler().setBinaryCompilation(True) self.L.load('johnpye/testlog10.a4c') T = self.L.findType('testlog10') M = T.getSimulation('sim',1) M.build() M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter())
def teststeadyida(self): M = self.testdsgsat() self.assertAlmostEqual(M.dTw_dt[2],0.0) Tw1 = float(M.T_w[2]) T = self.L.findType('dsgsat3') M.run(T.getMethod('free_states')) I = ascpy.Integrator(M) I.setEngine('IDA') I.setParameter('linsolver','DENSE') I.setParameter('safeeval',True) I.setParameter('rtol',1e-4) I.setParameter('atolvect',False) I.setParameter('atol',1e-4) I.setParameter('maxord',3) I.setInitialSubStep(0.001) I.setReporter(ascpy.IntegratorReporterConsole(I)) I.setLinearTimesteps(ascpy.Units("s"), 0, 3600, 10) I.analyse() I.solve() self.assertAlmostEqual(float(M.T_w[2]),Tw1) M.qdot_s.setRealValueWithUnits(1000,"W/m") self.assertAlmostEqual(M.qdot_s.to("W/m"),1000) M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter()) print "dTw/dt = %f" % M.dTw_dt[2] self.assertNotAlmostEqual(M.dTw_dt[2],0.0) F=file('dsgsat.dot','w') M.write(F,'dot')
def test1(self): self.L.load('sensitivity_test.a4c') T = self.L.findType('sensitivity_test') M = T.getSimulation('sim',0) M.run(T.getMethod('on_load')) M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter()) M.run(T.getMethod('analyse')) M.run(T.getMethod('self_test'))
def testsatuv(self): self.L.load('steam/iapwssat.a4c') T = self.L.findType('testiapwssatuv') M = T.getSimulation('sim',False) M.run(T.getMethod('on_load')) M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter()) print "p = %f bar" % M.p.to('bar'); print "T = %f C" % (M.T.to('K') - 273.15); print "x = %f" % M.x; M.run(T.getMethod('self_test')) M.run(T.getMethod('values2')) # M.v.setRealValueWithUnits(1.0/450,"m^3/kg"); # M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter()) M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter()) print "p = %f bar" % M.p.to('bar'); print "T = %f C" % (M.T.to('K') - 273.15); print "x = %f" % M.x; M.run(T.getMethod('self_test2'))
def testInvalidIntegrator(self): self.L.load('johnpye/shm.a4c') M = self.L.findType('shm').getSimulation('sim',1) M.setSolver(ascpy.Solver('QRSlv')) I = ascpy.Integrator(M) try: I.setEngine('___NONEXISTENT____') except IndexError: return self.fail("setEngine did not raise error!")
def testsonic(self): M = self._run('sonic',"CMSlv","sonic.a4c") assert(M.sonic_flow.getBoolValue()) # other side of boundary... M.D.setRealValueWithUnits(4.,"cm") T = self.L.findType('sonic') M.solve(ascpy.Solver('CMSlv'),ascpy.SolverReporter()) M.run(T.getMethod('self_test')) assert(not M.sonic_flow.getBoolValue())
def testrelinclude(self): self.L.load('test/relinclude.a4c') T = self.L.findType('relinclude') M = T.getSimulation('sim',1) M.eq1.setIncluded(True) M.eq2.setIncluded(False) M.eq3.setIncluded(False) M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter()) self.assertAlmostEqual( float(M.z), 2.0) M.eq1.setIncluded(False) M.eq2.setIncluded(True) M.eq3.setIncluded(False) M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter()) self.assertAlmostEqual( float(M.z), 4.0) M.eq1.setIncluded(False) M.eq2.setIncluded(False) M.eq3.setIncluded(True) M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter()) self.assertAlmostEqual( float(M.z), 4.61043629206)
def teststeadylsode(self): "test that steady conditions are stable with LSODE" M = self.testdsgsat() #M.qdot_s.setRealValueWithUnits(1000,"W/m") M.solve(ascpy.Solver('QRSlv'),ascpy.SolverReporter()) #M.setParameter(' I = ascpy.Integrator(M) I.setEngine('LSODE') I.setReporter(ascpy.IntegratorReporterConsole(I)) I.setLinearTimesteps(ascpy.Units("s"), 0, 3600, 10) I.analyse() I.solve()
def testaren(self): self.L.load('test/dopri5/aren.a4c') M = self.L.findType('aren').getSimulation('sim') M.setSolver(ascpy.Solver("QRSlv")) M.solve(ascpy.Solver("QRSlv"),ascpy.SolverReporter()) I = ascpy.Integrator(M) I.setEngine('DOPRI5') I.setReporter(ascpy.IntegratorReporterConsole(I)) #xend = 17.0652165601579625588917206249 I.setLinearTimesteps(ascpy.Units("s"), 0, 17.0652165601579625588917206249, 10) I.setParameter('rtol',1e-7) I.setParameter('atol',1e-7) I.setParameter('tolvect',False) I.setMinSubStep(0); I.setMaxSubStep(0); I.setInitialSubStep(0); I.analyse() I.solve() print "y[0] = %f" % float(M.y[0]) assert abs(float(M.y[0]) - 0.994) < 1e-5 assert abs(float(M.y[1]) - 0.0) < 1e-5
def testlotka(self): self.L.load('johnpye/lotka.a4c') M = self.L.findType('lotka').getSimulation('sim',1) M.setSolver(ascpy.Solver("QRSlv")) I = ascpy.Integrator(M) I.setEngine('LSODE') I.setReporter(ascpy.IntegratorReporterConsole(I)) I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 5) I.analyse() print "Number of vars = %d" % I.getNumVars() assert I.getNumVars()==2 I.solve() assert I.getNumObservedVars() == 3; assert abs(M.R - 832) < 1.0 assert abs(M.F - 21.36) < 0.1
def testzill(self): self.L.load('johnpye/zill.a4c') T = self.L.findType('zill') M = T.getSimulation('sim',1) M.setSolver(ascpy.Solver('QRSlv')) I = ascpy.Integrator(M) I.setEngine('LSODE') I.setMinSubStep(1e-7) I.setMaxSubStep(0.001) I.setMaxSubSteps(10000) I.setReporter(ascpy.IntegratorReporterConsole(I)) I.setLinearTimesteps(ascpy.Units(), 1.0, 1.5, 5) I.analyse() I.solve() M.run(T.getMethod('self_test'))
def testlotka(self): self.L.load('johnpye/lotka.a4c') M = self.L.findType('lotka').getSimulation('sim') M.setSolver(ascpy.Solver("QRSlv")) I = ascpy.Integrator(M) I.setEngine('IDA') I.setReporter(ascpy.IntegratorReporterConsole(I)) I.setLinearTimesteps(ascpy.Units("s"), 0, 200, 5) I.setParameter('rtol',1e-8) I.analyse() assert I.getNumVars()==2 assert abs(M.R - 1000) < 1e-300 I.solve() assert I.getNumObservedVars() == 3 assert abs(M.R - 832) < 1.0 assert abs(M.F - 21.36) < 0.1
def testhires(self): self.L.load('test/hires.a4c') T = self.L.findType('hires') M = T.getSimulation('sim') M.setSolver(ascpy.Solver('QRSlv')) I = ascpy.Integrator(M) I.setEngine('IDA') I.setParameter('linsolver','DENSE') I.setParameter('rtol',1.1e-15) I.setParameter('atolvect',0) I.setParameter('atol',1.1e-15) I.setReporter(ascpy.IntegratorReporterConsole(I)) I.setLogTimesteps(ascpy.Units(""), 1, 321.8122, 5) I.setInitialSubStep(1e-5) I.setMaxSubSteps(10000) I.analyse() I.solve() for i in range(8): print "y[%d] = %.20g" % (i+1, M.y[i+1]) M.run(T.getMethod('self_test'))
def testtransamp(self): self.L.load('test/transamp.a4c') T = self.L.findType('transamp') M = T.getSimulation('sim') M.setSolver(ascpy.Solver('QRSlv')) I = ascpy.Integrator(M) I.setEngine('IDA') I.setParameter('linsolver','DENSE') I.setParameter('rtol',1e-7) I.setParameter('atolvect',0) I.setParameter('atol',1e-7) I.setReporter(ascpy.IntegratorReporterConsole(I)) I.setLinearTimesteps(ascpy.Units("s"), 0.05, 0.2, 20) I.setInitialSubStep(0.00001) I.setMaxSubSteps(10000) I.analyse() I.solve() for i in range(6): print "y[%d] = %.20g" % (i+1, M.y[i+1]) M.run(T.getMethod('self_test'))
def testdenxSPGMR(self): self.L.load('johnpye/idadenx.a4c') M = self.L.findType('idadenx').getSimulation('sim') M.setSolver(ascpy.Solver('QRSlv')) I = ascpy.Integrator(M) I.setEngine('IDA') I.setReporter(ascpy.IntegratorReporterConsole(I)) I.setLogTimesteps(ascpy.Units("s"), 0.4, 4e10, 11) I.setMaxSubStep(0); I.setInitialSubStep(0); I.setMaxSubSteps(0); I.setParameter('autodiff',True) I.setParameter('linsolver','SPGMR') I.setParameter('gsmodified',False) I.setParameter('maxncf',10) I.analyse() I.solve() assert abs(float(M.y1) - 5.1091e-08) < 1e-10 assert abs(float(M.y2) - 2.0437e-13) < 1e-15 assert abs(float(M.y3) - 1.0) < 1e-5
def testdenx(self): print "-----------------------------=====" self.L.load('johnpye/idadenx.a4c') M = self.L.findType('idadenx').getSimulation('sim') M.setSolver(ascpy.Solver("QRSlv")) I = ascpy.Integrator(M) I.setEngine('IDA') I.setParameter('calcic','YA_YDP') I.setParameter('linsolver','DENSE') I.setParameter('safeeval',True) I.setReporter(ascpy.IntegratorReporterConsole(I)) I.setLogTimesteps(ascpy.Units("s"), 0.4, 4e10, 11) I.setMaxSubStep(0); I.setInitialSubStep(0) I.setMaxSubSteps(0) I.setParameter('autodiff',True) I.analyse() I.solve() assert abs(float(M.y1) - 5.1091e-08) < 2e-9 assert abs(float(M.y2) - 2.0437e-13) < 2e-14 assert abs(float(M.y3) - 1.0) < 1e-5
def testnewton(self): sys.stderr.write("STARTING TESTNEWTON\n") self.L.load('johnpye/newton.a4c') T = self.L.findType('newton') M = T.getSimulation('sim') M.solve(ascpy.Solver("QRSlv"),ascpy.SolverReporter()) I = ascpy.Integrator(M) I.setEngine('IDA') I.setParameter('linsolver','DENSE') I.setParameter('safeeval',True) I.setParameter('rtol',1e-8) I.setMaxSubStep(0.001) I.setMaxSubSteps(10000) I.setReporter(ascpy.IntegratorReporterConsole(I)) I.setLinearTimesteps(ascpy.Units("s"), 0, 2*float(M.v)/float(M.g), 2) I.analyse() I.solve() print "At end of simulation," print "x = %f" % M.x print "v = %f" % M.v M.run(T.getMethod('self_test'))
def testintegrate(self): """integrate transfer of heat from one mass of water/steam to another according to Newton's law of cooling""" M = self.testinstantiate() M.setSolver(ascpy.Solver("QRSlv")) I = ascpy.Integrator(M) I.setEngine('LSODE') I.setReporter(ascpy.IntegratorReporterConsole(I)) I.setLinearTimesteps(ascpy.Units("s"), 0, 3000, 30) I.setMinSubStep(0.01) I.setInitialSubStep(1) I.analyse() print "Number of vars = %d" % I.getNumVars() assert I.getNumVars()==2 I.solve() assert I.getNumObservedVars() == 3; print "S[1].T = %f K" % M.S[1].T print "S[2].T = %f K" % M.S[2].T print "Q = %f W" % M.Q self.assertAlmostEqual(float(M.S[1].T),506.77225109,4); self.assertAlmostEqual(float(M.S[2].T),511.605173967,5); self.assertAlmostEqual(float(M.Q),-48.32922877329,3); self.assertAlmostEqual(float(M.t),3000); print "Note that the above values have not been verified analytically"
def run(self): ascendlock.acquire() try: L = ascpy.Library() L.clear() L.load(self.filepath) t = L.findType(self.modelname) testmethod = None for m in t.getMethods(): if m.getName() == TEST_METHOD_NAME: testmethod = m if not testmethod: raise RuntimeError("No method '" + TEST_METHOD_NAME + "' found") s = t.getSimulation('testsim') #s.check() s.build() print "LAUNCHING SOLVER...\n\n" r = ascpy.SolverReporter() s.solve(ascpy.Solver('QRSlv'), r) s.run(testmethod) except RuntimeError, e: print e
#-------------------------------- print "\n\n\n\nINSTANTIATING TEST...\n\n\n" t = L.findType("extfntest") #t = L.findType("intfntest") sim = t.getSimulation("S") print "\n--------------------------\n" #-------------------------------- print "\n\n\n\nLISTING EXTERNAL METHODS...\n\n\n" print chr(27) + "[31;1mEXTERNAL METHODS (!):" + chr(27) + "[0m" ff = L.getExtMethods() for f in ff: fn = f.getName() fh = f.getHelp() if not fh: fh = '[no help]' else: mlre = re.compile("\\n") fh = re.sub(mlre, "\n ", fh) print chr(27) + "[31;1m" + fn + chr(27) + "[31;2m: " + fh + chr(27) + "[0m" #-------------------------------- print "\n\n\n\nBUILDING...\n\n\n" sim.build() sim.solve(ascpy.Solver('QRSlv'), ascpy.SolverReporter())
import ascpy import TReport import matplotlib as mpl from mpl_toolkits.mplot3d import Axes3D import numpy as np import matplotlib.pyplot as plt ## CODE BEGINS lib = ascpy.Library() lib.load('test/ida/leon/electron.a4c') M = lib.findType('electron').getSimulation('sim') M.setSolver(ascpy.Solver('QRSlv')) P = M.getParameters() I = ascpy.Integrator(M) I.setEngine('IDA') I.setLinearTimesteps(ascpy.Units("s"), 0.0, 40.0, 60) I.setMinSubStep(0.0001) I.setMaxSubStep(0.1) I.setInitialSubStep(0.001) I.setMaxSubSteps(200) I.setParameter('autodiff', False) I.analyse() reporter = TReport.TestReporter(I) I.setReporter(reporter)
def test_compound2(self): self.L.load('johnpye/section.a4c') T = self.L.findType('compound_section_test2') M = T.getSimulation('sim') M.solve(ascpy.Solver("QRSlv"),ascpy.SolverReporter()) M.run(T.getMethod('self_test'))