|
7 | 7 | from .utilities import unittest
|
8 | 8 |
|
9 | 9 | 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 | + |
10 | 18 | from . import utilities
|
11 | 19 |
|
12 | 20 | class TestReactor(utilities.CanteraTest):
|
@@ -857,6 +865,122 @@ def test_preconditioner_unsupported(self):
|
857 | 865 | with self.assertRaises(ct.CanteraError):
|
858 | 866 | self.net.initialize()
|
859 | 867 |
|
| 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 | + |
860 | 984 | class TestMoleReactor(TestReactor):
|
861 | 985 | reactorClass = ct.MoleReactor
|
862 | 986 |
|
|
0 commit comments