From c314eaed6d30eb1c0fac486be11c28c9f6b0568f Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 19 Nov 2022 18:59:37 +0800 Subject: [PATCH 1/3] Dump reactions to json --- epanet/epanet.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/epanet/epanet.py b/epanet/epanet.py index 76830d6..35a702f 100644 --- a/epanet/epanet.py +++ b/epanet/epanet.py @@ -27,6 +27,11 @@ class Output: self._check(self._lib.ENR_open(self._handle, ctypes.c_char_p(self._path.encode()))) + def __del__(self): + # throw exception in destructor ? :) + self._check(self._lib.ENR_close(ctypes.byref(self._handle))) + + def _check(self, result): if result != 0: msg = ctypes.c_char_p() @@ -108,7 +113,6 @@ class Output: return { 'nodes' : nodes, 'links': links } - # { pump_index, link_index, utilization, avg.efficiency, avg.kW/flow, avg.kwatts, max.kwatts, cost/day } def energy_usage(self) -> list[dict[str, Any]]: size = self.net_size()['pump'] usages = [] @@ -126,6 +130,18 @@ class Output: return usages + def reactions(self) -> dict[str, float]: + values = ctypes.POINTER(ctypes.c_float)() + length = ctypes.c_int() + self._check(self._lib.ENR_getNetReacts(self._handle, ctypes.byref(values), ctypes.byref(length))) + assert length.value == 4 + category = ['bulk', 'wall', 'tank', 'source'] + d = {} + for i in range(4): + d[category[i]] = values[i] + return d + + def dump(self, cache: bool = True) -> str: data = {} data |= { 'version' : self.version() } @@ -134,17 +150,13 @@ class Output: data |= { 'times' : self.times() } data |= { 'element_name' : self.element_name() } data |= { 'energy_usage' : self.energy_usage() } + data |= { 'reactions' : self.reactions() } if cache: with open(self._path + '.json', 'w') as f: json.dump(data, f) return json.dumps(data) - def __del__(self): - # throw exception in destructor ? :) - self._check(self._lib.ENR_close(ctypes.byref(self._handle))) - - def dump_output(path: str) -> str: opt = Output(path) return opt.dump() From 3ec966d491da95b683f3e21001535fd5c97c8e86 Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Thu, 24 Nov 2022 19:43:41 +0800 Subject: [PATCH 2/3] Fix path issue, since api dir is different from internal --- epanet/epanet.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/epanet/epanet.py b/epanet/epanet.py index 35a702f..c1ec5a5 100644 --- a/epanet/epanet.py +++ b/epanet/epanet.py @@ -19,7 +19,7 @@ class Output: def __init__(self, path: str) -> None: self._path = path - self._lib = ctypes.CDLL(os.path.join(os.getcwd(), 'epanet-output.dll')) + self._lib = ctypes.CDLL(os.path.join(os.getcwd(), 'epanet', 'epanet-output.dll')) self._handle = ctypes.c_void_p() self._check(self._lib.ENR_init(ctypes.byref(self._handle))) @@ -166,7 +166,7 @@ def run_project(name: str) -> str: if not project.have_project(name): raise Exception(f'Not found project [{name}]') - dir = os.path.dirname(os.getcwd()) + dir = os.path.abspath(os.getcwd()) db_inp = os.path.join(os.path.join(dir, 'db_inp'), name + '.db.inp') parser.dump_inp(name, db_inp) @@ -187,7 +187,7 @@ def run_project(name: str) -> str: def run_inp(name: str) -> str: - dir = os.path.dirname(os.getcwd()) + dir = os.path.abspath(os.getcwd()) exe = os.path.join(os.path.join(dir, 'epanet'), 'runepanet.exe') inp = os.path.join(os.path.join(dir, 'inp'), name + '.inp') From 5f5cf961ef682f3aeaa3620a0348271a4a9ea663 Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Thu, 24 Nov 2022 19:44:05 +0800 Subject: [PATCH 3/3] Try simulation by api --- build_db.py | 1 + 1 file changed, 1 insertion(+) diff --git a/build_db.py b/build_db.py index 2da4a82..550a692 100644 --- a/build_db.py +++ b/build_db.py @@ -21,4 +21,5 @@ def db2inp(): if __name__ == '__main__': #inp2db() #db2inp() + print(run_project('net3')) pass \ No newline at end of file