diff --git a/epanet/epanet.py b/epanet/epanet.py index c1ec5a5..938780b 100644 --- a/epanet/epanet.py +++ b/epanet/epanet.py @@ -117,13 +117,14 @@ class Output: size = self.net_size()['pump'] usages = [] category = ['utilization', 'avg.efficiency', 'avg.kW/flow', 'avg.kwatts', 'max.kwatts', 'cost/day' ] + links = self.element_name()['links'] for i in range(1, size + 1): index = ctypes.c_int() values = ctypes.POINTER(ctypes.c_float)() length = ctypes.c_int() self._check(self._lib.ENR_getEnergyUsage(self._handle, ctypes.c_int(i), ctypes.byref(index), ctypes.byref(values), ctypes.byref(length))) assert length.value == 6 - d = { 'pump_index' : i - 1, 'link_index' : index.value - 1 } + d = { 'pump' : links[index.value - 1] } for j in range(length.value): d |= { category[j] : values[j] } usages.append(d) @@ -142,6 +143,55 @@ class Output: return d + def node_results(self) -> list[dict[str, Any]]: + size = self.net_size()['node'] + num_periods = self.times()['num_periods'] + nodes = self.element_name()['nodes'] + category = ['demand', 'head', 'pressure', 'quality'] + ds = [] + for i in range(1, size + 1): + d = { 'node' : nodes[i - 1], 'result' : [] } + for j in range(num_periods): + values = ctypes.POINTER(ctypes.c_float)() + length = ctypes.c_int() + self._check(self._lib.ENR_getNodeResult(self._handle, j, i, ctypes.byref(values), ctypes.byref(length))) + assert length.value == len(category) + attributes = {} + for k in range(length.value): + attributes[category[k]] = values[k] + d['result'].append(attributes) + ds.append(d) + return ds + + + def link_results(self) -> list[dict[str, Any]]: + size = self.net_size()['link'] + num_periods = self.times()['num_periods'] + links = self.element_name()['links'] + category = ['flow', 'velocity', 'headloss', 'quality', 'status', 'setting', 'reaction', 'friction'] + ds = [] + + for i in range(1, size + 1): + d = { 'link' : links[i - 1], 'result' : [] } + for j in range(num_periods): + values = ctypes.POINTER(ctypes.c_float)() + length = ctypes.c_int() + self._check(self._lib.ENR_getLinkResult(self._handle, j, i, ctypes.byref(values), ctypes.byref(length))) + assert length.value == len(category) + attributes = {} + for k in range(length.value): + if category[k] == 'status': + if values[k] == 2.0: + attributes[category[k]] = 'CLOSED' + else: + attributes[category[k]] = 'OPEN' + continue + attributes[category[k]] = values[k] + d['result'].append(attributes) + ds.append(d) + return ds + + def dump(self, cache: bool = True) -> str: data = {} data |= { 'version' : self.version() } @@ -151,6 +201,8 @@ class Output: data |= { 'element_name' : self.element_name() } data |= { 'energy_usage' : self.energy_usage() } data |= { 'reactions' : self.reactions() } + data |= { 'node_results' : self.node_results() } + data |= { 'link_results' : self.link_results() } if cache: with open(self._path + '.json', 'w') as f: json.dump(data, f) @@ -205,4 +257,3 @@ def run_inp(name: str) -> str: if __name__ == '__main__': _verify_platform() - print(run_inp('net3'))