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 testpeturbida(self): M = self.testdsgsat() self.assertAlmostEqual(M.dTw_dt[2],0.0) T = self.L.findType('dsgsat3') M.run(T.getMethod('free_states')) # here is the peturbation... qdot_s = float(M.qdot_s) print "OLD QDOT_S = %f" % qdot_s M.qdot_s.setRealValueWithUnits(6000,"W/m") # IDA has its own initial conditions solver, so no need to call QRSlv here I = ascpy.Integrator(M) I.setEngine('IDA') I.setParameter('linsolver','DENSE') I.setReporter(ascpy.IntegratorReporterConsole(I)) #I.setLinearTimesteps(ascpy.Units("s"), 0,300,300) I.setLogTimesteps(ascpy.Units("s"), 0.009, 1200, 150) I.analyse() F = file('ga.mm','w') I.writeMatrix(F,'dg/dz') F = file('gd.mm','w') I.writeMatrix(F,'dg/dx') F = file('fa.mm','w') I.writeMatrix(F,'df/dz') F = file('fd.mm','w') I.writeMatrix(F,'df/dx') F = file('fdp.mm','w') I.writeMatrix(F,"df/dx'") I.solve()
def testparameters(self): self.L.load('johnpye/shm.a4c') M = self.L.findType('shm').getSimulation('sim',1) M.build() I = ascpy.Integrator(M) I.setEngine('IDA') P = I.getParameters() for p in P: print p.getName(),"=",p.getValue() assert len(P)==12 assert P[0].isStr() assert P[0].getName()=="linsolver" assert P[0].getValue()=='DENSE' assert P[2].getName()=="maxord" assert P[3].getName()=="autodiff" assert P[3].getValue()==True assert P[8].getName()=="atolvect" assert P[8].getBoolValue() == True P[3].setBoolValue(False) assert P[3].getBoolValue()==False I.setParameters(P) assert I.getParameterValue('autodiff')==False I.setParameter('autodiff',True) try: v = I.getParameterValue('nonexist') except KeyError: pass else: self.fail('Failed to trip invalid Integrator parameter')
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 testwritematrix2(self): self.L.load('test/ida/writematrix.a4c') T = self.L.findType('writematrix2') M = T.getSimulation('sim') M.build() I = ascpy.Integrator(M) I.setEngine('IDA') I.analyse()
def _run(self,filen,modeln=""): self.L.load('test/ida/%s.a4c' % filen) T = self.L.findType('%s%s' % (filen,modeln)) M = T.getSimulation('sim') M.build() I = ascpy.Integrator(M) I.setEngine('IDA') I.analyse() return M;
def testindexproblem(self): self.L.load('test/ida/indexproblem.a4c') T = self.L.findType('indexproblem') M = T.getSimulation('sim') M.build() I = ascpy.Integrator(M) I.setEngine('IDA') I.analyse() pass
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 testindexproblem2(self): self.L.load('test/ida/indexproblem.a4c') T = self.L.findType('indexproblem2') M = T.getSimulation('sim') M.build() I = ascpy.Integrator(M) I.setEngine('IDA') try: I.analyse() except Exception,e: return
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 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 testboundaries(self): self.L.load('test/ida/boundaries.a4c') T = self.L.findType('boundaries') M = T.getSimulation('sim') M.build() I = ascpy.Integrator(M) I.setEngine('IDA') I.analyse() I.setLogTimesteps(ascpy.Units("s"), 0.1, 20, 20) I.setParameter('linsolver','DENSE') I.setParameter('calcic','Y') I.setParameter('linsolver','DENSE') I.setParameter('safeeval',False) I.setReporter(ascpy.IntegratorReporterConsole(I)) I.solve()
def __init__(self, browser, sim): # create a new integrator straight away self.integrator = ascpy.Integrator(sim) self.engines = self.integrator.getEngines() self.browser = browser self.prefs = Preferences() try: self.integrator.findIndependentVar() self.indepvar = self.integrator.getIndependentVariable() except RuntimeError, e: self.browser.reporter.reportNote(str(e)) self.indepvar = None return
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 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 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 testkryx(self): self.L.load('johnpye/idakryx.a4c') M = self.L.findType('idakryx').getSimulation('sim') M.build() I = ascpy.Integrator(M) I.setEngine('IDA') I.setReporter(ascpy.IntegratorReporterConsole(I)) I.setParameter('linsolver','SPGMR') I.setParameter('prec','JACOBI') I.setParameter('maxl',8) I.setParameter('gsmodified',False) I.setParameter('autodiff',True) I.setParameter('gsmodified',True) I.setParameter('rtol',0) I.setParameter('atol',1e-3); I.setParameter('atolvect',False) I.setParameter('calcic','Y') I.analyse() I.setLogTimesteps(ascpy.Units("s"), 0.01, 10.24, 10); print M.udot[1][3] I.solve() assert 0
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"
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) I.solve() x1 = []