[Reactor] Check for Reactor contents before installing FlowDevice

Fixes #279.
This commit is contained in:
Ray Speth 2015-06-18 14:37:54 -04:00
parent c0fa589b8c
commit f6f868fe28
3 changed files with 17 additions and 3 deletions

View file

@ -518,7 +518,7 @@ cdef extern from "cantera/zeroD/flowControllers.h":
cdef cppclass CxxFlowDevice "Cantera::FlowDevice": cdef cppclass CxxFlowDevice "Cantera::FlowDevice":
CxxFlowDevice() CxxFlowDevice()
double massFlowRate(double) except + double massFlowRate(double) except +
cbool install(CxxReactorBase&, CxxReactorBase&) cbool install(CxxReactorBase&, CxxReactorBase&) except +
void setFunction(CxxFunc1*) void setFunction(CxxFunc1*)
void setParameters(int, double*) void setParameters(int, double*)

View file

@ -434,6 +434,19 @@ class TestReactor(utilities.CanteraTest):
self.assertNear(speciesMass(kAr), mAr) self.assertNear(speciesMass(kAr), mAr)
self.assertNear(speciesMass(kO2), mO2) self.assertNear(speciesMass(kO2), mO2)
def test_valve_errors(self):
self.make_reactors()
res = ct.Reservoir()
with self.assertRaises(RuntimeError):
# Must assign contents of both reactors before creating Valve
v = ct.Valve(self.r1, res)
v = ct.Valve(self.r1, self.r2)
with self.assertRaises(RuntimeError):
# inlet and outlet cannot be reassigned
v._install(self.r2, self.r1)
def test_pressure_controller(self): def test_pressure_controller(self):
self.make_reactors(n_reactors=1) self.make_reactors(n_reactors=1)
g = ct.Solution('h2o2.xml') g = ct.Solution('h2o2.xml')

View file

@ -9,7 +9,7 @@ namespace Cantera
bool FlowDevice::install(ReactorBase& in, ReactorBase& out) bool FlowDevice::install(ReactorBase& in, ReactorBase& out)
{ {
if (m_in || m_out) { if (m_in || m_out) {
return false; throw CanteraError("FlowDevice::install", "Already installed");
} }
m_in = ∈ m_in = ∈
m_out = &out; m_out = &out;
@ -20,7 +20,8 @@ bool FlowDevice::install(ReactorBase& in, ReactorBase& out)
ThermoPhase* mixin = &m_in->contents(); ThermoPhase* mixin = &m_in->contents();
ThermoPhase* mixout = &m_out->contents(); ThermoPhase* mixout = &m_out->contents();
if (mixin == 0 || mixout == 0) { if (mixin == 0 || mixout == 0) {
return false; throw CanteraError("FlowDevice::install", "Can't install flow device "
"until reactor contents have been assigned.");
} }
m_nspin = mixin->nSpecies(); m_nspin = mixin->nSpecies();