From 833ca13dc1e52a67a32cf308d940dc5501d403b0 Mon Sep 17 00:00:00 2001 From: Ray Speth Date: Tue, 18 Dec 2012 00:11:24 +0000 Subject: [PATCH] [1D/Python] Set pressure when restoring solution from XML file This partially addresses Issue 90. --- .../python/Cantera/OneD/BurnerDiffFlame.py | 6 +++--- interfaces/python/Cantera/OneD/BurnerFlame.py | 5 ++--- interfaces/python/Cantera/OneD/CounterFlame.py | 10 +++++----- interfaces/python/Cantera/OneD/FreeFlame.py | 5 ++--- interfaces/python/Cantera/OneD/StagnationFlow.py | 5 ++--- interfaces/python/Cantera/OneD/onedim.py | 4 +--- src/clib/ctonedim.cpp | 9 +++++++++ src/clib/ctonedim.h | 1 + src/python/ctonedim_methods.cpp | 16 ++++++++++++++++ src/python/methods.h | 1 + 10 files changed, 42 insertions(+), 20 deletions(-) diff --git a/interfaces/python/Cantera/OneD/BurnerDiffFlame.py b/interfaces/python/Cantera/OneD/BurnerDiffFlame.py index 8b160fcdc..a094877eb 100644 --- a/interfaces/python/Cantera/OneD/BurnerDiffFlame.py +++ b/interfaces/python/Cantera/OneD/BurnerDiffFlame.py @@ -33,7 +33,7 @@ class BurnerDiffFlame(Stack): self.outlet = outlet else: self.outlet = OutletRes('outletres') - self.pressure = gas.pressure() + self.flame = AxisymmetricFlow('flame',gas = gas) self.flame.setupGrid(grid) Stack.__init__(self, [self.burner, self.flame, self.outlet]) @@ -53,7 +53,7 @@ class BurnerDiffFlame(Stack): yin = zeros(nsp, 'd') for k in range(nsp): yin[k] = self.burner.massFraction(k) - gas.setState_TPY(self.burner.temperature(), self.pressure, yin) + gas.setState_TPY(self.burner.temperature(), self.flame.pressure(), yin) u0 = self.burner.mdot()/gas.density() t0 = self.burner.temperature() @@ -133,6 +133,6 @@ class BurnerDiffFlame(Stack): for n in range(nsp): nm = self.gas.speciesName(n) y[n] = self.solution(nm, j) - self.gas.setState_TPY(self.T(j), self.pressure, y) + self.gas.setState_TPY(self.T(j), self.flame.pressure(), y) fix_docs(BurnerDiffFlame) diff --git a/interfaces/python/Cantera/OneD/BurnerFlame.py b/interfaces/python/Cantera/OneD/BurnerFlame.py index b0971563f..604d2af62 100644 --- a/interfaces/python/Cantera/OneD/BurnerFlame.py +++ b/interfaces/python/Cantera/OneD/BurnerFlame.py @@ -33,7 +33,6 @@ class BurnerFlame(Stack): self.outlet = outlet else: self.outlet = Outlet('outlet') - self.pressure = gas.pressure() self.flame = AxisymmetricFlow('flame',gas = gas) self.flame.setupGrid(grid) Stack.__init__(self, [self.burner, self.flame, self.outlet]) @@ -53,7 +52,7 @@ class BurnerFlame(Stack): yin = zeros(nsp, 'd') for k in range(nsp): yin[k] = self.burner.massFraction(k) - gas.setState_TPY(self.burner.temperature(), self.pressure, yin) + gas.setState_TPY(self.burner.temperature(), self.flame.pressure(), yin) u0 = self.burner.mdot()/gas.density() t0 = self.burner.temperature() @@ -133,6 +132,6 @@ class BurnerFlame(Stack): for n in range(nsp): nm = self.gas.speciesName(n) y[n] = self.solution(nm, j) - self.gas.setState_TPY(self.T(j), self.pressure, y) + self.gas.setState_TPY(self.T(j), self.flame.pressure(), y) fix_docs(BurnerFlame) diff --git a/interfaces/python/Cantera/OneD/CounterFlame.py b/interfaces/python/Cantera/OneD/CounterFlame.py index cffec7861..02f5868da 100644 --- a/interfaces/python/Cantera/OneD/CounterFlame.py +++ b/interfaces/python/Cantera/OneD/CounterFlame.py @@ -46,7 +46,6 @@ class CounterFlame(Stack): self.gas = gas self.fuel_inlet.set(temperature = gas.temperature()) self.oxidizer_inlet.set(temperature = gas.temperature()) - self.pressure = gas.pressure() self.flame = AxisymmetricFlow('flame',gas = gas) self.flame.setupGrid(grid) Stack.__init__(self, [self.fuel_inlet, self.flame, @@ -86,6 +85,7 @@ class CounterFlame(Stack): y0ox = self.oxidizer_inlet.massFraction(iox) phi = s*y0f/y0ox zst = 1.0/(1.0 + phi) + pressure = self.flame.pressure() yin_f = zeros(nsp, 'd') yin_o = zeros(nsp, 'd') @@ -95,20 +95,20 @@ class CounterFlame(Stack): yin_o[k] = self.oxidizer_inlet.massFraction(k) yst[k] = zst*yin_f[k] + (1.0 - zst)*yin_o[k] - gas.setState_TPY(self.fuel_inlet.temperature(), self.pressure, yin_f) + gas.setState_TPY(self.fuel_inlet.temperature(), pressure, yin_f) mdotf = self.fuel_inlet.mdot() u0f = mdotf/gas.density() t0f = self.fuel_inlet.temperature() gas.setState_TPY(self.oxidizer_inlet.temperature(), - self.pressure, yin_o) + pressure, yin_o) mdoto = self.oxidizer_inlet.mdot() u0o = mdoto/gas.density() t0o = self.oxidizer_inlet.temperature() # get adiabatic flame temperature and composition tbar = 0.5*(t0o + t0f) - gas.setState_TPY(tbar, self.pressure, yst) + gas.setState_TPY(tbar, pressure, yst) gas.equilibrate('HP') teq = gas.temperature() yeq = gas.massFractions() @@ -214,6 +214,6 @@ class CounterFlame(Stack): for n in range(nsp): nm = self.gas.speciesName(n) y[n] = self.solution(nm, j) - self.gas.setState_TPY(self.T(j), self.pressure, y) + self.gas.setState_TPY(self.T(j), self.flame.pressure(), y) fix_docs(CounterFlame) diff --git a/interfaces/python/Cantera/OneD/FreeFlame.py b/interfaces/python/Cantera/OneD/FreeFlame.py index 3748658da..ec22b731c 100644 --- a/interfaces/python/Cantera/OneD/FreeFlame.py +++ b/interfaces/python/Cantera/OneD/FreeFlame.py @@ -23,7 +23,6 @@ class FreeFlame(Stack): self.gas = gas self.inlet.set(temperature = gas.temperature()) self.outlet = Outlet('outlet') - self.pressure = gas.pressure() # type 2 is Cantera C++ class FreeFlame self.flame = AxisymmetricFlow('flame',gas = gas,type=2) @@ -47,7 +46,7 @@ class FreeFlame(Stack): yin = zeros(nsp, 'd') for k in range(nsp): yin[k] = self.inlet.massFraction(k) - gas.setState_TPY(self.inlet.temperature(), self.pressure, yin) + gas.setState_TPY(self.inlet.temperature(), self.flame.pressure(), yin) u0 = self.inlet.mdot()/gas.density() t0 = self.inlet.temperature() @@ -131,6 +130,6 @@ class FreeFlame(Stack): for n in range(nsp): nm = self.gas.speciesName(n) y[n] = self.solution(nm, j) - self.gas.setState_TPY(self.T(j), self.pressure, y) + self.gas.setState_TPY(self.T(j), self.flame.pressure(), y) fix_docs(FreeFlame) diff --git a/interfaces/python/Cantera/OneD/StagnationFlow.py b/interfaces/python/Cantera/OneD/StagnationFlow.py index 57789b3d0..689e22c7a 100644 --- a/interfaces/python/Cantera/OneD/StagnationFlow.py +++ b/interfaces/python/Cantera/OneD/StagnationFlow.py @@ -26,7 +26,6 @@ class StagnationFlow(Stack): self.surfchem = surfchem self.inlet.set(temperature = gas.temperature()) self.surface = Surface(id = 'surface', surface_mech = surfchem) - self.pressure = gas.pressure() self.flow = AxisymmetricFlow('flow',gas = gas) self.flow.setupGrid(grid) Stack.__init__(self, [self.inlet, self.flow, self.surface]) @@ -44,7 +43,7 @@ class StagnationFlow(Stack): yin = zeros(nsp, 'd') for k in range(nsp): yin[k] = self.inlet.massFraction(k) - gas.setState_TPY(self.inlet.temperature(), self.pressure, yin) + gas.setState_TPY(self.inlet.temperature(), self.flow.pressure(), yin) u0 = self.inlet.mdot()/gas.density() t0 = self.inlet.temperature() V0 = 0.0 @@ -147,6 +146,6 @@ class StagnationFlow(Stack): for n in range(nsp): nm = self.gas.speciesName(n) y[n] = self.solution(nm, j) - self.gas.setState_TPY(self.T(j), self.pressure, y) + self.gas.setState_TPY(self.T(j), self.flow.pressure(), y) fix_docs(StagnationFlow) diff --git a/interfaces/python/Cantera/OneD/onedim.py b/interfaces/python/Cantera/OneD/onedim.py index ca3b2362a..2fad1c5cc 100644 --- a/interfaces/python/Cantera/OneD/onedim.py +++ b/interfaces/python/Cantera/OneD/onedim.py @@ -384,7 +384,6 @@ class AxisymmetricFlow(Domain1D): itr = gas.transport_hndl() self._hndl = _cantera.stflow_new(iph, ikin, itr, type) if id: self.setID(id) - self._p = -1.0 self.setPressure(gas.pressure()) self.solveEnergyEqn() @@ -392,7 +391,6 @@ class AxisymmetricFlow(Domain1D): """Set the pressure [Pa]. The pressure is a constant, since the governing equations are those for the low-Mach-number limit.""" _cantera.stflow_setPressure(self._hndl, p) - self._p = p def setTransportModel(self, transp, withSoret = 0): """Set the transport model. The argument must be a transport @@ -408,7 +406,7 @@ class AxisymmetricFlow(Domain1D): def pressure(self): """Pressure [Pa].""" - return self._p + return _cantera.stflow_pressure(self._hndl) def setFixedTempProfile(self, pos, temp): """Set the fixed temperature profile. This profile is used diff --git a/src/clib/ctonedim.cpp b/src/clib/ctonedim.cpp index cd383c665..1bc7bd732 100644 --- a/src/clib/ctonedim.cpp +++ b/src/clib/ctonedim.cpp @@ -416,6 +416,15 @@ extern "C" { } } + double stflow_pressure(int i) + { + try { + return DomainCabinet::get(i).pressure(); + } catch (...) { + return handleAllExceptions(DERR, DERR); + } + } + int stflow_setFixedTempProfile(int i, size_t n, double* pos, size_t m, double* temp) { diff --git a/src/clib/ctonedim.h b/src/clib/ctonedim.h index e9b72864c..8197163e2 100644 --- a/src/clib/ctonedim.h +++ b/src/clib/ctonedim.h @@ -52,6 +52,7 @@ extern "C" { CANTERA_CAPI int stflow_setTransport(int i, int itr, int iSoret); CANTERA_CAPI int stflow_enableSoret(int i, int iSoret); CANTERA_CAPI int stflow_setPressure(int i, double p); + CANTERA_CAPI double stflow_pressure(int i); CANTERA_CAPI int stflow_setFixedTempProfile(int i, size_t n, double* pos, size_t m, double* temp); CANTERA_CAPI int stflow_solveSpeciesEqs(int i, int flag); diff --git a/src/python/ctonedim_methods.cpp b/src/python/ctonedim_methods.cpp index ab83757e1..4c80f3790 100644 --- a/src/python/ctonedim_methods.cpp +++ b/src/python/ctonedim_methods.cpp @@ -631,6 +631,22 @@ py_stflow_setPressure(PyObject* self, PyObject* args) return Py_BuildValue("i",_val); } +static PyObject* +py_stflow_pressure(PyObject* self, PyObject* args) +{ + double _val; + int i; + int n; + if (!PyArg_ParseTuple(args, "i:stflow_pressure", &i)) { + return NULL; + } + + _val = stflow_pressure(i); + if (_val == DERR) { + return reportCanteraError(); + } + return Py_BuildValue("d",_val); +} static PyObject* py_stflow_setFixedTempProfile(PyObject* self, PyObject* args) diff --git a/src/python/methods.h b/src/python/methods.h index 6cd1aa667..411633f8f 100644 --- a/src/python/methods.h +++ b/src/python/methods.h @@ -129,6 +129,7 @@ static PyMethodDef ct_methods[] = { {"reactingsurf_new", py_reactingsurf_new, METH_VARARGS}, {"stflow_new", py_stflow_new, METH_VARARGS}, {"stflow_setPressure", py_stflow_setPressure, METH_VARARGS}, + {"stflow_pressure", py_stflow_pressure, METH_VARARGS}, {"stflow_setTransport", py_stflow_setTransport, METH_VARARGS}, {"stflow_enableSoret", py_stflow_enableSoret, METH_VARARGS}, {"stflow_setFixedTempProfile", py_stflow_setFixedTempProfile, METH_VARARGS},