Skip to content

Commit 922c335

Browse files
committed
add unittests for drawing methods
1 parent 24ca328 commit 922c335

File tree

1 file changed

+124
-0
lines changed

1 file changed

+124
-0
lines changed

test/python/test_reactor.py

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@
77
from .utilities import unittest
88

99
import cantera as ct
10+
11+
try:
12+
ct.drawnetwork._import_graphviz()
13+
except ImportError:
14+
pass
15+
16+
from cantera.drawnetwork import _graphviz
17+
1018
from . import utilities
1119

1220
class TestReactor(utilities.CanteraTest):
@@ -857,6 +865,122 @@ def test_preconditioner_unsupported(self):
857865
with self.assertRaises(ct.CanteraError):
858866
self.net.initialize()
859867

868+
@utilities.unittest.skipIf(_graphviz is None, "graphviz is not installed")
869+
def test_draw_reactor(self):
870+
T1, P1, X1 = 300, 101325, 'O2:1.0'
871+
self.make_reactors(T1=T1, P1=P1, X1=X1)
872+
self.r1.name = "Name"
873+
self.r1.node_attr = {'style': 'filled', 'fillcolor': 'red'}
874+
dot = self.r1.draw()
875+
expected = ['\tName [fillcolor=red style=filled]\n']
876+
self.assertEqual(dot.body, expected)
877+
878+
self.r1.node_attr = {"style": "filled"}
879+
expected = [('\tName [label="{T (K)\\n300.00|P (bar)\\n1.013}|" '
880+
'color=blue shape=Mrecord style=filled xlabel=Name]\n')]
881+
dot = self.r1.draw(print_state=True, node_attr={"style": "",
882+
"color": "blue"})
883+
self.assertEqual(dot.body, expected)
884+
885+
self.r1.node_attr = {}
886+
expected = [('\tName [label="{T (K)\\n300.00|P (bar)\\n1.013}|X (%)'
887+
'\\nO2: 100.00" shape=Mrecord xlabel=Name]\n')]
888+
dot = self.r1.draw(print_state=True, species="X")
889+
self.assertEqual(dot.body, expected)
890+
891+
expected = [('\tName [label="{T (K)\\n300.00|P (bar)\\n1.013}|Y (%)'
892+
'\\nO2: 100.00" shape=Mrecord xlabel=Name]\n')]
893+
dot = self.r1.draw(print_state=True, species="Y")
894+
self.assertEqual(dot.body, expected)
895+
896+
expected = [('\tName [label="{T (K)\\n300.00|P (bar)\\n1.013}|X (%)'
897+
'\\nH2: 0.00" shape=Mrecord xlabel=Name]\n')]
898+
dot = self.r1.draw(print_state=True, species=["H2"])
899+
self.assertEqual(dot.body, expected)
900+
901+
dot = _graphviz.Digraph()
902+
self.r1.draw(dot)
903+
expected = ['\tName\n']
904+
self.assertEqual(dot.body, expected)
905+
906+
@utilities.unittest.skipIf(_graphviz is None, "graphviz is not installed")
907+
def test_draw_wall(self):
908+
T1, P1, X1 = 300, 101325, 'O2:1.0'
909+
T2, P2, X2 = 600, 101325, 'O2:1.0'
910+
self.make_reactors(T1=T1, P1=P1, X1=X1, T2=T2, P2=P2, X2=X2)
911+
self.r1.name = "Name 1"
912+
self.r2.name = "Name 2"
913+
self.add_wall(U=0.1)
914+
self.w.edge_attr = {'color': 'blue'}
915+
dot = self.w.draw(node_attr={'style': 'filled'},
916+
edge_attr={'style': 'dotted'})
917+
expected = [('\t"Name 2" -> "Name 1" [label="q = 30 W" '
918+
'color=blue style=dotted]\n')]
919+
self.assertEqual(dot.body, expected)
920+
921+
@utilities.unittest.skipIf(_graphviz is None, "graphviz is not installed")
922+
def test_draw_flow_controller(self):
923+
self.make_reactors(n_reactors=1)
924+
self.r1.name = "Reactor"
925+
gas2 = ct.Solution('h2o2.yaml', transport_model=None)
926+
gas2.TPX = 300, 10*101325, 'H2:1.0'
927+
inlet_reservoir = ct.Reservoir(gas2, name='Inlet')
928+
gas2.TPX = 300, 101325, 'H2:1.0'
929+
outlet_reservoir = ct.Reservoir(gas2, name='Outlet')
930+
mfc = ct.MassFlowController(inlet_reservoir, self.r1, mdot=2,
931+
edge_attr={'xlabel': 'MFC'})
932+
pfc = ct.PressureController(self.r1, outlet_reservoir, primary=mfc)
933+
self.net.advance_to_steady_state()
934+
dot = mfc.draw(node_attr={'style': 'filled'},
935+
edge_attr={'style': 'dotted'})
936+
expected = [('\tInlet -> Reactor [label="m = 2 kg/s" '
937+
'style=dotted xlabel=MFC]\n')]
938+
self.assertEqual(dot.body, expected)
939+
940+
@utilities.unittest.skipIf(_graphviz is None, "graphviz is not installed")
941+
def test_draw_network(self):
942+
self.make_reactors()
943+
self.r1.name = "Hot reactor"
944+
self.r2.name = "Cold reactor"
945+
self.add_wall(U=10)
946+
gas2 = ct.Solution('h2o2.yaml', transport_model=None)
947+
gas2.TPX = 600, 101325, 'O2:1.0'
948+
hot_inlet = ct.Reservoir(gas2, name='Hot inlet')
949+
gas2.TPX = 200, 101325, 'O2:1.0'
950+
cold_inlet = ct.Reservoir(gas2, name='Cold inlet')
951+
outlet = ct.Reservoir(gas2, name='Outlet')
952+
mfc_hot = ct.MassFlowController(hot_inlet, self.r1, mdot=2)
953+
mfc_cold = ct.MassFlowController(cold_inlet, self.r2, mdot=2)
954+
pfc_hot = ct.PressureController(self.r1, outlet, primary=mfc_hot)
955+
pfc_cold = ct.PressureController(self.r2, outlet, primary=mfc_cold)
956+
self.net.advance_to_steady_state()
957+
dot = self.net.draw(mass_flow_attr={'color': 'green'},
958+
heat_flow_attr={'color': 'orange'},
959+
print_state=True)
960+
expected = [('\t"Cold reactor" [label="{T (K)\\n202.17|P (bar)'
961+
'\\n1.013}|" shape=Mrecord xlabel="Cold reactor"]\n'),
962+
('\t"Hot reactor" [label="{T (K)\\n598.03|P (bar)'
963+
'\\n1.013}|" shape=Mrecord xlabel="Hot reactor"]\n'),
964+
('\t"Hot inlet" [label="{T (K)\\n600.00|P (bar)'
965+
'\\n1.013}|" shape=Mrecord xlabel="Hot inlet"]\n'),
966+
('\t"Cold inlet" [label="{T (K)\\n200.00|P (bar)'
967+
'\\n1.013}|" shape=Mrecord xlabel="Cold inlet"]\n'),
968+
('\tOutlet [label="{T (K)\\n200.00|P (bar)'
969+
'\\n1.013}|" shape=Mrecord xlabel=Outlet]\n'),
970+
('\t"Cold inlet" -> "Cold reactor" [label="m = 2 kg/s" '
971+
'color=green]\n'),
972+
('\t"Hot reactor" -> Outlet [label="m = 2 kg/s" '
973+
'color=green]\n'),
974+
('\t"Cold reactor" -> Outlet [label="m = 2 kg/s" '
975+
'color=green]\n'),
976+
('\t"Hot reactor" -> "Cold reactor" [label="q = 4e+03 W" '
977+
'color=orange style=dashed]\n'),
978+
('\t"Hot inlet" -> "Hot reactor" [label="m = 2 kg/s" '
979+
'color=green]\n')]
980+
# use sets because order can be random
981+
self.assertSetEqual(set(dot.body), set(expected))
982+
983+
860984
class TestMoleReactor(TestReactor):
861985
reactorClass = ct.MoleReactor
862986

0 commit comments

Comments
 (0)