From 93266be5810073b2005558490fa7d76bb0c39b19 Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 15 Oct 2022 01:20:13 +0800 Subject: [PATCH] Quick parser to load inp --- api/__init__.py | 2 + api/parser.py | 127 +++++++++++++ net3.inp | 480 ++++++++++++++++++++++++++++++++++++++++++++++++ parser_demo.py | 7 + tjnetwork.py | 3 + 5 files changed, 619 insertions(+) create mode 100644 api/parser.py create mode 100644 net3.inp create mode 100644 parser_demo.py diff --git a/api/__init__.py b/api/__init__.py index 922b23e..737d03e 100644 --- a/api/__init__.py +++ b/api/__init__.py @@ -2,6 +2,8 @@ from .project import have_project, create_project, delete_project from .project import is_project_open, get_project_open_count, open_project, close_project from .project import copy_project +from .parser import read_inp + from .operation import API_ADD, API_UPDATE, API_DELETE from .operation import ChangeSet from .operation import get_current_operation diff --git a/api/parser.py b/api/parser.py new file mode 100644 index 0000000..94ce991 --- /dev/null +++ b/api/parser.py @@ -0,0 +1,127 @@ +from typing import Any +from .project import * +from .s1_title import * +from .s2_junctions import * +from .s3_reservoirs import * +from .s4_tanks import * +from .s5_pipes import * +from .s6_pumps import * +from .s7_valves import * + +junctions : dict[str, dict[str, Any]] = {} +reservoirs : dict[str, dict[str, Any]] = {} +tanks : dict[str, dict[str, Any]] = {} +pipes : dict[str, dict[str, Any]] = {} +pumps : dict[str, dict[str, Any]] = {} +valves : dict[str, dict[str, Any]] = {} + +def read_inp(name: str, inp: str): + if is_project_open(name): + close_project(name) + + if have_project(name): + delete_project(name) + + create_project(name) + open_project(name) + + section = '' + + for line in open(inp): + line = line.lstrip() + + if line.startswith(';'): + continue + + if line.startswith('[TITLE'): + section = 'title' + continue + if line.startswith('[JUNCTION'): + section = JUNCTION + continue + if line.startswith('[RESERVOIR'): + section = RESERVOIR + continue + if line.startswith('[TANK'): + section = TANK + continue + if line.startswith('[PIPE'): + section = PIPE + continue + if line.startswith('[PUMP'): + section = PUMP + continue + if line.startswith('[VALVE'): + section = VALVE + continue + if line.startswith('[COORDINATE'): + section = 'coordinate' + continue + if line.startswith('['): + section = '' + continue + + tokens = line.split() + if len(tokens) == 0: + continue + + if section == 'title': + # set_title(name, ChangeSet({'value': tokens[0]})) + continue + elif section == JUNCTION: + if tokens[0] not in junctions: + junctions[tokens[0]] = {} + junctions[tokens[0]] |= {'id': tokens[0], 'elevation': tokens[1]} + continue + elif section == RESERVOIR: + if tokens[0] not in reservoirs: + reservoirs[tokens[0]] = {} + reservoirs[tokens[0]] |= {'id': tokens[0], 'head': tokens[1]} + continue + elif section == TANK: + if tokens[0] not in tanks: + tanks[tokens[0]] = {} + tanks[tokens[0]] = {'id': tokens[0], 'elevation': tokens[1], 'init_level': tokens[2], 'min_level': tokens[3], 'max_level': tokens[4], 'diameter': tokens[5], 'min_vol': tokens[6]} + continue + elif section == PIPE: + pipes[tokens[0]] = {'id': tokens[0], 'node1': tokens[1], 'node2': tokens[2], 'length': tokens[3], 'diameter': tokens[4], 'roughness': tokens[5], 'minor_loss': tokens[6], 'status': tokens[7].lower()} + continue + elif section == PUMP: + pumps[tokens[0]] = {'id': tokens[0], 'node1': tokens[1], 'node2': tokens[2]} + continue + elif section == VALVE: + valves[tokens[0]] = {'id': tokens[0], 'node1': tokens[1], 'node2': tokens[2], 'diameter': tokens[3], 'v_type': tokens[4], 'setting': tokens[5], 'minor_loss': tokens[6]} + continue + elif section == 'coordinate': + if tokens[0] in junctions: + junctions[tokens[0]] |= {'x': tokens[1], 'y': tokens[2]} + elif tokens[0] in reservoirs: + reservoirs[tokens[0]] |= {'x': tokens[1], 'y': tokens[2]} + elif tokens[0] in tanks: + tanks[tokens[0]] |= {'x': tokens[1], 'y': tokens[2]} + continue + + for value in junctions.values(): + if 'x' not in value: + value['x'] = 0.0 + if 'y' not in value: + value['y'] = 0.0 + add_junction(name, ChangeSet(value)) + for value in reservoirs.values(): + if 'x' not in value: + value['x'] = 0.0 + if 'y' not in value: + value['y'] = 0.0 + add_reservoir(name, ChangeSet(value)) + for value in tanks.values(): + if 'x' not in value: + value['x'] = 0.0 + if 'y' not in value: + value['y'] = 0.0 + add_tank(name, ChangeSet(value)) + for value in pipes.values(): + add_pipe(name, ChangeSet(value)) + for value in pumps.values(): + add_pump(name, ChangeSet(value)) + for value in valves.values(): + add_valve(name, ChangeSet(value)) diff --git a/net3.inp b/net3.inp new file mode 100644 index 0000000..e379117 --- /dev/null +++ b/net3.inp @@ -0,0 +1,480 @@ +[TITLE] +EPANET Example Network 3 +Example showing how the percent of Lake water in a dual-source +system changes over time. + +[JUNCTIONS] +;ID Elev Demand Pattern + 10 147 0 ; + 15 32 1 3 ; + 20 129 0 ; + 35 12.5 1 4 ; + 40 131.9 0 ; + 50 116.5 0 ; + 60 0 0 ; + 601 0 0 ; + 61 0 0 ; + 101 42 189.95 ; + 103 43 133.2 ; + 105 28.5 135.37 ; + 107 22 54.64 ; + 109 20.3 231.4 ; + 111 10 141.94 ; + 113 2 20.01 ; + 115 14 52.1 ; + 117 13.6 117.71 ; + 119 2 176.13 ; + 120 0 0 ; + 121 -2 41.63 ; + 123 11 1 2 ; + 125 11 45.6 ; + 127 56 17.66 ; + 129 51 0 ; + 131 6 42.75 ; + 139 31 5.89 ; + 141 4 9.85 ; + 143 -4.5 6.2 ; + 145 1 27.63 ; + 147 18.5 8.55 ; + 149 16 27.07 ; + 151 33.5 144.48 ; + 153 66.2 44.17 ; + 157 13.1 51.79 ; + 159 6 41.32 ; + 161 4 15.8 ; + 163 5 9.42 ; + 164 5 0 ; + 166 -2 2.6 ; + 167 -5 14.56 ; + 169 -5 0 ; + 171 -4 39.34 ; + 173 -4 0 ; + 177 8 58.17 ; + 179 8 0 ; + 181 8 0 ; + 183 11 0 ; + 184 16 0 ; + 185 16 25.65 ; + 187 12.5 0 ; + 189 4 107.92 ; + 191 25 81.9 ; + 193 18 71.31 ; + 195 15.5 0 ; + 197 23 17.04 ; + 199 -2 119.32 ; + 201 0.1 44.61 ; + 203 2 1 5 ; + 204 21 0 ; + 205 21 65.36 ; + 206 1 0 ; + 207 9 69.39 ; + 208 16 0 ; + 209 -2 0.87 ; + 211 7 8.67 ; + 213 7 13.94 ; + 215 7 92.19 ; + 217 6 24.22 ; + 219 4 41.32 ; + 225 8 22.8 ; + 229 10.5 64.18 ; + 231 5 16.48 ; + 237 14 15.61 ; + 239 13 44.61 ; + 241 13 0 ; + 243 14 4.34 ; + 247 18 70.38 ; + 249 18 0 ; + 251 30 24.16 ; + 253 36 54.52 ; + 255 27 40.39 ; + 257 17 0 ; + 259 25 0 ; + 261 0 0 ; + 263 0 0 ; + 265 0 0 ; + 267 21 0 ; + 269 0 0 ; + 271 6 0 ; + 273 8 0 ; + 275 10 0 ; + +[RESERVOIRS] +;ID Head Pattern + River 220.0 ; + Lake 167.0 ; + +[TANKS] +;ID Elevation InitLevel MinLevel MaxLevel Diameter MinVol VolCurve Overflow + 1 131.9 13.1 .1 32.1 85 0 ; + 2 116.5 23.5 6.5 40.3 50 0 ; + 3 129.0 29.0 4.0 35.5 164 0 ; + +[PIPES] +;ID Node1 Node2 Length Diameter Roughness MinorLoss Status + 20 3 20 99 99 199 0 Open ; + 40 1 40 99 99 199 0 Open ; + 50 2 50 99 99 199 0 Open ; + 60 River 60 1231 24 140 0 Open ; + 101 10 101 14200 18 110 0 Open ; + 103 101 103 1350 16 130 0 Open ; + 105 101 105 2540 12 130 0 Open ; + 107 105 107 1470 12 130 0 Open ; + 109 103 109 3940 16 130 0 Open ; + 111 109 111 2000 12 130 0 Open ; + 112 115 111 1160 12 130 0 Open ; + 113 111 113 1680 12 130 0 Open ; + 114 115 113 2000 8 130 0 Open ; + 115 107 115 1950 8 130 0 Open ; + 116 113 193 1660 12 130 0 Open ; + 117 263 105 2725 12 130 0 Open ; + 119 115 117 2180 12 130 0 Open ; + 120 119 120 730 12 130 0 Open ; + 121 120 117 1870 12 130 0 Open ; + 122 121 120 2050 8 130 0 Open ; + 123 121 119 2000 30 141 0 Open ; + 125 123 121 1500 30 141 0 Open ; + 129 121 125 930 24 130 0 Open ; + 131 125 127 3240 24 130 0 Open ; + 133 20 127 785 20 130 0 Open ; + 135 127 129 900 24 130 0 Open ; + 137 129 131 6480 16 130 0 Open ; + 145 129 139 2750 8 130 0 Open ; + 147 139 141 2050 8 130 0 Open ; + 149 143 141 1400 8 130 0 Open ; + 151 15 143 1650 8 130 0 Open ; + 153 145 141 3510 12 130 0 Open ; + 155 147 145 2200 12 130 0 Open ; + 159 147 149 880 12 130 0 Open ; + 161 149 151 1020 8 130 0 Open ; + 163 151 153 1170 12 130 0 Open ; + 169 125 153 4560 8 130 0 Open ; + 171 119 151 3460 12 130 0 Open ; + 173 119 157 2080 30 141 0 Open ; + 175 157 159 2910 30 141 0 Open ; + 177 159 161 2000 30 141 0 Open ; + 179 161 163 430 30 141 0 Open ; + 180 163 164 150 14 130 0 Open ; + 181 164 166 490 14 130 0 Open ; + 183 265 169 590 30 141 0 Open ; + 185 167 169 60 8 130 0 Open ; + 186 187 204 99.9 8 130 0 Open ; + 187 169 171 1270 30 141 0 Open ; + 189 171 173 50 30 141 0 Open ; + 191 271 171 760 24 130 0 Open ; + 193 35 181 30 24 130 0 Open ; + 195 181 177 30 12 130 0 Open ; + 197 177 179 30 12 130 0 Open ; + 199 179 183 210 12 130 0 Open ; + 201 40 179 1190 12 130 0 Open ; + 202 185 184 99.9 8 130 0 Open ; + 203 183 185 510 8 130 0 Open ; + 204 184 205 4530. 12 130 0 Open ; + 205 204 185 1325. 12 130 0 Open ; + 207 189 183 1350 12 130 0 Open ; + 209 189 187 500 8 130 0 Open ; + 211 169 269 646 12 130 0 Open ; + 213 191 187 2560 12 130 0 Open ; + 215 267 189 1230 12 130 0 Open ; + 217 191 193 520 12 130 0 Open ; + 219 193 195 360 12 130 0 Open ; + 221 161 195 2300 8 130 0 Open ; + 223 197 191 1150 12 130 0 Open ; + 225 111 197 2790 12 130 0 Open ; + 229 173 199 4000 24 141 0 Open ; + 231 199 201 630 24 141 0 Open ; + 233 201 203 120 24 130 0 Open ; + 235 199 273 725 12 130 0 Open ; + 237 205 207 1200 12 130 0 Open ; + 238 207 206 450 12 130 0 Open ; + 239 275 207 1430 12 130 0 Open ; + 240 206 208 510 12 130 0 Open ; + 241 208 209 885 12 130 0 Open ; + 243 209 211 1210 16 130 0 Open ; + 245 211 213 990 16 130 0 Open ; + 247 213 215 4285 16 130 0 Open ; + 249 215 217 1660 16 130 0 Open ; + 251 217 219 2050 14 130 0 Open ; + 257 217 225 1560 12 130 0 Open ; + 261 213 229 2200 8 130 0 Open ; + 263 229 231 1960 12 130 0 Open ; + 269 211 237 2080 12 130 0 Open ; + 271 237 229 790 8 130 0 Open ; + 273 237 239 510 12 130 0 Open ; + 275 239 241 35 12 130 0 Open ; + 277 241 243 2200 12 130 0 Open ; + 281 241 247 445 10 130 0 Open ; + 283 239 249 430 12 130 0 Open ; + 285 247 249 10 12 130 0 Open ; + 287 247 255 1390 10 130 0 Open ; + 289 50 255 925 10 130 0 Open ; + 291 255 253 1100 10 130 0 Open ; + 293 255 251 1100 8 130 0 Open ; + 295 249 251 1450 12 130 0 Open ; + 297 120 257 645 8 130 0 Open ; + 299 257 259 350 8 130 0 Open ; + 301 259 263 1400 8 130 0 Open ; + 303 257 261 1400 8 130 0 Open ; + 305 117 261 645 12 130 0 Open ; + 307 261 263 350 12 130 0 Open ; + 309 265 267 1580 8 130 0 Open ; + 311 193 267 1170 12 130 0 Open ; + 313 269 189 646 12 130 0 Open ; + 315 181 271 260 24 130 0 Open ; + 317 273 275 2230 8 130 0 Open ; + 319 273 205 645 12 130 0 Open ; + 321 163 265 1200 30 141 0 Open ; + 323 201 275 300 12 130 0 Open ; + 325 269 271 1290 8 130 0 Open ; + 329 61 123 45500 30 140 0 Open ; + 330 60 601 1 30 140 0 Closed ; + 333 601 61 1 30 140 0 Open ; + +[PUMPS] +;ID Node1 Node2 Parameters + 10 Lake 10 HEAD 1 ; + 335 60 61 HEAD 2 ; + +[VALVES] +;ID Node1 Node2 Diameter Type Setting MinorLoss + +[TAGS] + +[DEMANDS] +;Junction Demand Pattern Category + +[STATUS] +;ID Status/Setting + 10 Closed + +[PATTERNS] +;ID Multipliers +;General Default Demand Pattern + 1 1.34 1.94 1.46 1.44 .76 .92 + 1 .85 1.07 .96 1.1 1.08 1.19 + 1 1.16 1.08 .96 .83 .79 .74 + 1 .64 .64 .85 .96 1.24 1.67 +;Demand Pattern for Node 123 + 2 0 0 0 0 0 1219 + 2 0 0 0 1866 1836 1818 + 2 1818 1822 1822 1817 1824 1816 + 2 1833 1817 1830 1814 1840 1859 +;Demand Pattern for Node 15 + 3 620 620 620 620 620 360 + 3 360 0 0 0 0 360 + 3 360 360 360 360 0 0 + 3 0 0 0 0 360 360 +;Demand Pattern for Node 35 + 4 1637 1706 1719 1719 1791 1819 + 4 1777 1842 1815 1825 1856 1801 + 4 1819 1733 1664 1620 1613 1620 + 4 1616 1647 1627 1627 1671 1668 +;Demand Pattern for Node 203 + 5 4439 4531 4511 4582 4531 4582 + 5 4572 4613 4643 4643 4592 4613 + 5 4531 4521 4449 4439 4449 4460 + 5 4439 4419 4368 4399 4470 4480 + +[CURVES] +;ID X-Value Y-Value +;PUMP: Pump Curve for Pump 10 (Lake Source) + 1 0 104. + 1 2000. 92. + 1 4000. 63. +;PUMP: Pump Curve for Pump 335 (River Source) + 2 0 200. + 2 8000. 138. + 2 14000. 86. + +[CONTROLS] +;Lake source operates only part of the day +Link 10 OPEN AT TIME 1 +Link 10 CLOSED AT TIME 15 + +;Pump 335 controlled by level in Tank 1 +;When pump is closed, bypass pipe is opened +Link 335 OPEN IF Node 1 BELOW 17.1 +Link 335 CLOSED IF Node 1 ABOVE 19.1 +Link 330 CLOSED IF Node 1 BELOW 17.1 +Link 330 OPEN IF Node 1 ABOVE 19.1 + + +[RULES] + +[ENERGY] + Global Efficiency 75 + Global Price 0.0 + Demand Charge 0.0 + +[EMITTERS] +;Junction Coefficient + +[QUALITY] +;Node InitQual + +[SOURCES] +;Node Type Quality Pattern + +[REACTIONS] +;Type Pipe/Tank Coefficient + + +[REACTIONS] + Order Bulk 1 + Order Tank 1 + Order Wall 1 + Global Bulk 0.0 + Global Wall 0.0 + Limiting Potential 0.0 + Roughness Correlation 0.0 + +[MIXING] +;Tank Model + +[TIMES] + Duration 24:00 + Hydraulic Timestep 1:00 + Quality Timestep 0:05 + Pattern Timestep 1:00 + Pattern Start 0:00 + Report Timestep 1:00 + Report Start 0:00 + Start ClockTime 12 am + Statistic None + +[REPORT] + Status Yes + Summary No + Page 0 + +[OPTIONS] + Units GPM + Headloss H-W + Specific Gravity 1.0 + Viscosity 1.0 + Trials 40 + Accuracy 0.001 + CHECKFREQ 2 + MAXCHECK 10 + DAMPLIMIT 0 + Unbalanced Continue 10 + Pattern 1 + Demand Multiplier 1.0 + Emitter Exponent 0.5 + Quality Trace Lake + Diffusivity 1.0 + Tolerance 0.01 + +[COORDINATES] +;Node X-Coord Y-Coord +10 9.000 27.850 +15 38.680 23.760 +20 29.440 26.910 +35 25.460 10.520 +40 27.020 9.810 +50 33.010 3.010 +60 23.900 29.940 +601 23.000 29.490 +61 23.710 29.030 +101 13.810 22.940 +103 12.960 21.310 +105 16.970 21.280 +107 18.450 20.460 +109 17.640 18.920 +111 20.210 17.530 +113 22.040 16.610 +115 20.980 19.180 +117 21.690 21.280 +119 23.700 22.760 +120 22.080 23.100 +121 23.540 25.500 +123 23.370 27.310 +125 24.590 25.640 +127 29.290 26.400 +129 30.320 26.390 +131 37.890 29.550 +139 33.280 24.540 +141 35.680 23.080 +143 37.470 21.970 +145 33.020 19.290 +147 30.240 20.380 +149 29.620 20.740 +151 28.290 21.390 +153 28.130 22.630 +157 24.850 20.160 +159 23.120 17.500 +161 25.100 15.280 +163 25.390 14.980 +164 25.980 15.140 +166 26.480 15.130 +167 25.880 12.980 +169 25.680 12.740 +171 26.650 11.800 +173 26.870 11.590 +179 25.710 10.400 +181 25.720 10.740 +183 25.450 10.180 +184 25.150 9.520 +185 25.010 9.670 +187 23.640 11.040 +189 24.150 11.370 +191 22.100 14.070 +193 22.880 14.350 +195 23.180 14.720 +197 20.970 15.180 +199 29.420 8.440 +201 30.890 8.570 +203 31.140 8.890 +204 23.800 10.900 +205 29.200 6.460 +206 31.660 6.640 +207 31.000 6.610 +208 32.540 6.810 +209 33.760 6.590 +211 34.200 5.540 +213 35.260 6.160 +215 39.950 8.730 +217 42.110 8.670 +219 44.860 9.320 +225 43.530 7.380 +229 36.160 3.490 +231 38.380 2.540 +237 35.370 3.080 +239 35.760 2.310 +241 35.870 2.110 +243 37.040 0.000 +247 35.020 2.050 +249 35.020 1.810 +251 34.150 1.100 +253 32.168 1.885 +255 33.510 2.450 +257 21.170 23.320 +259 20.800 23.400 +261 20.790 21.450 +263 20.320 21.570 +265 25.390 13.600 +267 23.380 12.950 +269 25.030 12.140 +271 25.970 11.000 +273 29.160 7.380 +275 31.070 8.290 +River 24.150 31.060 +Lake 8.000 27.530 +1 27.460 9.840 +2 32.990 3.450 +3 29.410 27.270 + +[VERTICES] +;Link X-Coord Y-Coord + +[LABELS] +;X-Coord Y-Coord Label & Anchor Node +8.000 29.418 "LAKE" +25.000 31.100 "RIVER" + +[BACKDROP] + DIMENSIONS 6.157 -1.553 46.703 32.613 + UNITS None + FILE + OFFSET 0.00 0.00 + +[END] diff --git a/parser_demo.py b/parser_demo.py new file mode 100644 index 0000000..d02e126 --- /dev/null +++ b/parser_demo.py @@ -0,0 +1,7 @@ +from tjnetwork import * + +def inp2db(): + read_inp('net3', './net3.inp') + +if __name__ == '__main__': + inp2db() \ No newline at end of file diff --git a/tjnetwork.py b/tjnetwork.py index 186e9eb..822bd2b 100644 --- a/tjnetwork.py +++ b/tjnetwork.py @@ -67,6 +67,9 @@ def close_project(name: str) -> None: def copy_project(source: str, new: str) -> None: return api.copy_project(source, new) +def read_inp(name: str, inp: str) -> None: + return api.read_inp(name, inp) + ############################################################ # operation