Quick parser to load inp

This commit is contained in:
WQY\qiong
2022-10-15 01:20:13 +08:00
parent 37bafed958
commit 93266be581
5 changed files with 619 additions and 0 deletions

View File

@@ -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

127
api/parser.py Normal file
View File

@@ -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))

480
net3.inp Normal file
View File

@@ -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]

7
parser_demo.py Normal file
View File

@@ -0,0 +1,7 @@
from tjnetwork import *
def inp2db():
read_inp('net3', './net3.inp')
if __name__ == '__main__':
inp2db()

View File

@@ -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