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 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 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 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 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 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 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 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 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 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 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 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"
M.run(T.getMethod('free_states')) # here is the peturbation... print "CREATING PETURBATION..." 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.setParameter('safeeval', True) I.setParameter('rtol', 1e-4) I.setParameter('atolvect', False) I.setParameter('atol', 1e-4) I.setParameter('maxord', 2) I.setParameter('calcic', 'YA_YDP') I.setInitialSubStep(0.001) I.setReporter(ascpy.IntegratorReporterConsole(I)) I.setLogTimesteps(ascpy.Units("s"), 0.001, 0.002, 10) I.analyse() F = file('gz.mm', 'w') I.writeMatrix(F, 'dg/dz') F = file('gx.mm', 'w') I.writeMatrix(F, 'dg/dx') F = file('fz.mm', 'w') I.writeMatrix(F, 'df/dz') F = file('fx.mm', 'w') I.writeMatrix(F, 'df/dx') F = file('fxp.mm', 'w') I.writeMatrix(F, "df/dx'") #I.solve() from scipy import io