From 3f9742dcd099d5814d4e4bbce14e88068d4deb19 Mon Sep 17 00:00:00 2001 From: Ingmar Schoegl Date: Thu, 22 Aug 2024 15:34:58 -0500 Subject: [PATCH] [unittests] Improve test-zeroD coverage --- test/python/test_reactor.py | 7 --- test/zeroD/test_zeroD.cpp | 101 ++++++++++++++++++++++++++++++++++-- 2 files changed, 96 insertions(+), 12 deletions(-) diff --git a/test/python/test_reactor.py b/test/python/test_reactor.py index 15de152b7..108cbb10d 100644 --- a/test/python/test_reactor.py +++ b/test/python/test_reactor.py @@ -728,13 +728,6 @@ class TestReactor: assert self.r1.name.startswith(f"{self.r1.type}_") # default name assert res.name.startswith(f"{res.type}_") # default name - def test_valve_errors(self): - self.make_reactors() - v = ct.Valve(self.r1, self.r2) - with pytest.raises(ct.CanteraError, match='Already installed'): - # inlet and outlet cannot be reassigned - v._install(self.r2, self.r1) - def test_pressure_controller1(self): self.make_reactors(n_reactors=1) g = ct.Solution('h2o2.yaml', transport_model=None) diff --git a/test/zeroD/test_zeroD.cpp b/test/zeroD/test_zeroD.cpp index 78e5780ce..044631b6a 100644 --- a/test/zeroD/test_zeroD.cpp +++ b/test/zeroD/test_zeroD.cpp @@ -19,16 +19,16 @@ TEST(zerodim, simple) auto sol = newSolution("gri30.yaml", "gri30", "none"); sol->thermo()->setState_TPX(T, P, X); - auto cppReactor = newReactor("IdealGasReactor", sol, "simple"); - ASSERT_EQ(cppReactor->name(), "simple"); - cppReactor->initialize(); + auto reactor = newReactor("IdealGasReactor", sol, "simple"); + ASSERT_EQ(reactor->name(), "simple"); + reactor->initialize(); ReactorNet network; - network.addReactor(dynamic_cast(*cppReactor)); + network.addReactor(dynamic_cast(*reactor)); network.initialize(); double t = 0.0; while (t < 0.1) { - ASSERT_GE(cppReactor->temperature(), T); + ASSERT_GE(reactor->temperature(), T); t = network.time() + 5e-3; network.advance(t); } @@ -56,6 +56,97 @@ TEST(zerodim, test_guards) EXPECT_THROW(Valve().updateMassFlowRate(0.), CanteraError); } +TEST(zerodim, flowdevice) +{ + auto gas = newSolution("gri30.yaml", "gri30", "none"); + + auto node0 = newReactor("IdealGasReactor", gas, "upstream"); + auto node1 = newReactor("IdealGasReactor", gas, "downstream"); + + auto valve = newFlowDevice("Valve", node0, node1, "valve"); + ASSERT_EQ(valve->name(), "valve"); + ASSERT_EQ(valve->in().name(), "upstream"); + ASSERT_EQ(valve->out().name(), "downstream"); + + ASSERT_EQ(node0->nInlets(), 0); + ASSERT_EQ(node0->nOutlets(), 1); + ASSERT_EQ(node1->nInlets(), 1); + ASSERT_EQ(node1->nOutlets(), 0); +} + +TEST(zerodim, wall) +{ + auto gas = newSolution("gri30.yaml", "gri30", "none"); + + auto node0 = newReactor("IdealGasReactor", gas, "left"); + auto node1 = newReactor("IdealGasReactor", gas, "right"); + + auto wall = newWall("Wall", node0, node1, "wall"); + ASSERT_EQ(wall->name(), "wall"); + ASSERT_EQ(wall->left().name(), "left"); + ASSERT_EQ(wall->right().name(), "right"); + + ASSERT_EQ(node0->nWalls(), 1); + ASSERT_EQ(node1->nWalls(), 1); +} + +TEST(zerodim, mole_reactor) +{ + // simplified version of continuous_reactor.py + auto gas = newSolution("h2o2.yaml", "ohmech", "none"); + + auto tank = make_shared(gas, "fuel-air-tank"); + auto exhaust = make_shared(gas, "exhaust"); + + auto stirred = make_shared(gas, "stirred-reactor"); + stirred->setEnergy(0); + stirred->setInitialVolume(30.5 * 1e-6); + + auto mfc = make_shared(tank, stirred, "mass-flow-controller"); + double residenceTime = 2.; + double mass = stirred->mass(); + mfc->setMassFlowRate(mass/residenceTime); + + auto preg = make_shared(stirred, exhaust, "pressure-regulator"); + preg->setPrimary(mfc.get()); + preg->setPressureCoeff(1e-3); + + auto net = ReactorNet(); + net.addReactor(*stirred); + net.initialize(); +} + +TEST(zerodim, mole_reactor_2) +{ + // simplified version of continuous_reactor.py + auto gas = newSolution("h2o2.yaml", "ohmech", "none"); + + auto tank = std::dynamic_pointer_cast( + newReactor("Reservoir", gas, "fuel-air-tank")); + auto exhaust = std::dynamic_pointer_cast( + newReactor("Reservoir", gas, "exhaust")); + + auto stirred = std::dynamic_pointer_cast( + newReactor("IdealGasMoleReactor", gas, "stirred-reactor")); + stirred->setEnergy(0); + stirred->setInitialVolume(30.5 * 1e-6); + + auto mfc = std::dynamic_pointer_cast( + newConnectorNode("MassFlowController", tank, stirred, "mass-flow-controller")); + double residenceTime = 2.; + double mass = stirred->mass(); + mfc->setMassFlowRate(mass/residenceTime); + + auto preg = std::dynamic_pointer_cast( + newConnectorNode("PressureController", stirred, exhaust, "pressure-regulator")); + preg->setPrimary(mfc.get()); + preg->setPressureCoeff(1e-3); + + auto net = ReactorNet(); + net.addReactor(*stirred); + net.initialize(); +} + // This test ensures that prior reactor initialization of a reactor does // not affect later integration within a network. This example was // adapted from test_reactor.py::test_equilibrium_HP.