Exemple #1
0
    def check_inputs(self):
        # set the timesteps (samples)
        _val = {}
        units = ''
        for _k, _v in {
                self.beginentry: [lambda x: float(x), "begin"],
                self.durationentry: [lambda x: float(x), "duration"],
                self.nstepsentry: [lambda x: int(x), "num"]
        }.iteritems():
            x = RealAtomEntry(self.indepvar.getInstance(), _k.get_text())
            x.checkEntry()
            if _k == self.beginentry:
                units = x.units
                #self.indepvar.getInstance().setRealValueWithUnits()
            if _k == self.nstepsentry:
                _val[_v[1]] = _v[0](_k.get_text())
            else:
                _val[_v[1]] = _v[0](x.getValue() /
                                    ascpy.Units(units).getConversion())

        self.integrator.setLinearTimesteps(ascpy.Units(units), _val["begin"],
                                           (_val["begin"] + _val["duration"]),
                                           _val["num"])
        self.begin = _val["begin"]
        self.duration = _val["duration"]

        self.prefs.setStringPref("Integrator", "duration", str(self.duration))

        # set substep parameters (ie settings common to any integrator engine)
        _failed = False
        x = {}
        for _k, _v in self.settings.iteritems():
            try:
                _f = self.integratorentries[_k]
                # pass the substep setting to the integrator
                x[_f] = RealAtomEntry(self.indepvar.getInstance(),
                                      _f.get_text())
                x[_f].checkEntry()
                if _k != "maxsteps":
                    self.taint_entry(_f, "white")
                    _v[1](x[_f].getValue() /
                          ascpy.Units(units).getConversion())
                else:
                    _v[1](_f.get_text())
                    self.color_entry(_f, "white")
            except ValueError, e:
                if _k != "maxsteps":
                    self.taint_entry(_f, "#FFBBBB")
                else:
                    self.color_entry(_f, "#FFBBBB")
                _failed = True
Exemple #2
0
	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
Exemple #3
0
    def checkEntry(self):
        _instdim = self.instance.type.getDimensions()
        _insttype = self.instance.type

        try:
            # match a float with option text afterwards, optionally separated by whitespace
            _match = re.match(UNITS_RE, self.newtext)
            if not _match:
                raise InputError("Not a valid value-and-optional-units")

            _val = _match.group(1)  # the numerical part of the input
            self.units = _match.group(5)  # the text entered for units
            #_val, _units = re.split("[ \t]+",newtext,2);
        except RuntimeError:
            raise InputError("Unable to split value and units")

        print "val = ", _val
        print "units = ", self.units

        # parse the units, throw an error if no good
        try:
            _val = float(_val)
        except RuntimeError:
            raise InputError("Unable to convert number part '%s' to float" %
                             _val)

        # check the units
        if self.units.strip() == "":
            # if no units entered, assume the 'preferred' units
            _u = _insttype.getPreferredUnits()
            if _u is None:
                # no preferred units for this type, so assume default units
                _u = _instdim.getDefaultUnits()
            print "Assuming units '%s'" % _u.getName().toString()
        else:
            try:
                _u = ascpy.Units(self.units)
                print "Parsed units '%s'" % self.units
            except RuntimeError:
                raise InputError("Unrecognisable units '%s'" % self.units)

            if _instdim != _u.getDimensions():

                if _u.getDimensions().isDimensionless():
                    self.units = "[dimensionless]"

                _my_dims = _instdim.getDefaultUnits()
                if _instdim.isDimensionless():
                    _my_dims = "[dimensionless]"

                raise InputError(
                    "Incompatible units '%s' (must fit with '%s')" %
                    (self.units, _my_dims.getName().toString()))

        self._conv = float(_u.getConversion())
        # self.reporter.reportNote("Converting: multiplying '%s %s' by factor %s to get SI units" % (_val, _units, _conv) )
        self.value = _val

        print "Setting '%s' to '%f'" % (
            self.instance.type.getName().toString(), self.value)
Exemple #4
0
	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()
Exemple #5
0
	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')
Exemple #6
0
	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()
Exemple #7
0
	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()
Exemple #8
0
	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
Exemple #9
0
	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()
Exemple #10
0
	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'))
Exemple #11
0
	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
Exemple #12
0
	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'))
Exemple #13
0
	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
Exemple #14
0
	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'))
Exemple #15
0
	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
Exemple #16
0
	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
Exemple #17
0
	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
Exemple #18
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'))
Exemple #19
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"
Exemple #20
0
import matplotlib.pyplot as plt

## CODE BEGINS

lib = ascpy.Library()
lib.load('test/ida/leon/bouncingball.a4c')

M = lib.findType('bouncingball').getSimulation('sim')
M.setSolver(ascpy.Solver('QRSlv'))

P = M.getParameters()

I = ascpy.Integrator(M)

I.setEngine('IDA')
I.setLinearTimesteps(ascpy.Units("s"), 0.0, 23, 300)
I.setMinSubStep(0.1)
I.setMaxSubStep(1)
I.setInitialSubStep(0.001)
I.setMaxSubSteps(400)

I.setParameter('autodiff', False)
I.analyse()
reporter = TReport.TestReporter(I)
I.setReporter(reporter)
I.solve()

fig = plt.figure()
data = reporter.data
plt.plot(reporter.t, data)
plt.show()
Exemple #21
0
                if _k != "maxsteps":
                    self.taint_entry(_f, "#FFBBBB")
                else:
                    self.color_entry(_f, "#FFBBBB")
                _failed = True

        if _failed:
            raise IntegratorError("Invalid step parameter(s)")

        for _k, _v in self.settings.iteritems():
            # store those inputs for next time
            _f = self.integratorentries[_k]
            if _k != "maxsteps":
                self.prefs.setStringPref(
                    "Integrator", _k,
                    str(x[_f].getValue() / ascpy.Units(units).getConversion()))
            else:
                self.prefs.setStringPref("Integrator", _k, str(_f.get_text()))

        # set engine (and check that it's OK with this system)
        engine = self.engineselect.get_active()
        if engine == -1:
            self.color_entry(self.engineselect, "#FFBBBB")
            raise IntegratorError("No engine selected")

        self.color_entry(self.engineselect, "white")

        try:
            self.prefs.setStringPref("Integrator", "engine",
                                     self.engines[engine])
            _res = self.integrator.setEngine(self.engines[engine])
Exemple #22
0
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 = []
x2 = []
data = reporter.data
for i in range(len(data)):
Exemple #23
0
# 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
from scipy import linalg