def getNodeSourceQuality(): epanet_proj = en.createproject() en.open(ph=epanet_proj, inpFile=example_1_path, rptFile='report.rpt', outFile='output.out') en.setqualtype(ph=epanet_proj, qualType=1, chemName='Chlorine', chemUnits='mg/L', traceNode=None) num_nodes = en.getcount(ph=epanet_proj, object=en.NODECOUNT) source_qual_list = [] en.openH(ph=epanet_proj) en.initH(ph=epanet_proj, initFlag=0) en.openQ(ph=epanet_proj) en.initQ(ph=epanet_proj, saveFlag=1) #sets source_ind as booster, need to find a way to acknowledge pre-set boosters #en.setnodevalue(ph=epanet_proj, index=source_ind, property=en.SOURCETYPE, value=1) for i in range(1, num_nodes + 1): node_type = en.getnodevalue(ph=epanet_proj, index=i, property=en.SOURCETYPE) if node_type == 1: source_qual = en.getnodevalue(ph=epanet_proj, index=source_ind, property=en.SOURCEQUAL) print('Node (index %d) source quality: %5.2f' % (i, source_qual)) source_qual_list.append(source_qual) print('End of getNodeSourceQuality function.') en.closeH(ph=epanet_proj) en.closeQ(ph=epanet_proj) en.close(ph=epanet_proj) clean_dir()
def print_node_heads(ph, time, node_count): print(f'Time: {time}') for i in range(1, node_count + 1): node_type = en.getnodetype(ph, i) node_id = en.getnodeid(ph, i) head = en.getnodevalue(ph, i, en.HEAD) pressure = en.getnodevalue(ph, i, en.PRESSURE) demand = en.getnodevalue(ph, i, en.DEMAND) print( f'Node: {i:2}, ID: {node_id}, type: {node_type_str[node_type]},', f'head: {head:8g}, pressure: {pressure:8g}, demand: {demand:8g}')
def test_water_age_sim(): epanet_proj = en.createproject() en.open(ph=epanet_proj, inpFile=example_1_path, rptFile='report.rpt', outFile='output.out') en.setqualtype(ph=epanet_proj, qualType=2, chemName='Age', chemUnits='hours', traceNode=None) en.solveH(ph=epanet_proj) en.openQ(ph=epanet_proj) en.initQ(ph=epanet_proj, saveFlag=1) num_nodes = en.getcount(ph=epanet_proj, object=en.NODECOUNT) age_list = [] while True: node_age_list = [] en.runQ(ph=epanet_proj) t = en.nextQ(ph=epanet_proj) for i in range(1, num_nodes*1): node_qual = en.getnodevalue(ph=epanet_proj, index=i, property=en.QUALITY) node_age_list.append(node_qual) age_list.append(node_age_list) if t <= 0: break en.closeQ(ph=epanet_proj) en.closeH(ph=epanet_proj) en.close(ph=epanet_proj) assert age_list[26] == [1.0, 2.2141675704376946, 12.939125434025273, 24.44152992466322, 13.174235412569542, 24.441519659540887, 15.679376648181817, 21.97064181429266, 19.048343501261524, 1.0] clean_dir()
def get_state(self, parameter, element_id): """ get a state from the network simulation :param parameter: i.e., pressure, status, flow, level, head, etc... :param element_id: the name of the element :return: the state (real/double) """ node_states = { 'pressure': toolkit.PRESSURE, 'demand': toolkit.DEMAND, 'head': toolkit.HEAD, 'level': toolkit.TANKLEVEL, 'quality': toolkit.QUALITY, 'emitter': toolkit.EMITTER } link_states = {'flow': toolkit.FLOW, 'velocity': toolkit.VELOCITY} state = None if parameter in node_states: node_idx = toolkit.getnodeindex(self.ph, element_id) state = toolkit.getnodevalue(self.ph, node_idx, node_states[parameter]) elif parameter in link_states: link_idx = toolkit.getlinkindex(self.ph, element_id) state = toolkit.getlinkvalue(self.ph, link_idx, link_states[parameter]) return state
def getNodeHydaulicHead(self): H = np.zeros(shape=self.NodeCount) for i in self.NodeIndex: head = en.getnodevalue(ph=self.epanet_proj, index=i, property=en.HEAD) H[i - 1] = head return H
def set(self, key, value): k = key.key if isinstance(key, KeyPath) else key idx = toolkit.getnodeindex(self._p, self._n) toolkit.setnodevalue(self._p, idx, NodeModifier.keys[k], value) if debug: print("set {} to {} -> epanet value is {}".format( key, value, toolkit.getnodevalue(self._p, idx, NodeModifier.keys[k])))
def getLinkNames(self): names = [] linkCount = en.getcount(ph=self.project, object=en.LINKCOUNT) for idx in range(linkCount): # TODO: add headCurveIndex = en.getheadcurveindex(ph=self.project, id=""), getPumpType, getVertex, getVertexCount index = idx + 1 # Get link id. linkId = en.getlinkid(ph=self.project, index=index) # Get start and end node. linkNodes = en.getlinknodes(ph=self.project, index=index) sNode = en.getcoord(ph=self.project, index=linkNodes[0]) sNode.append(en.getnodevalue(ph=self.project, index=linkNodes[0], property=en.ELEVATION)) eNode = en.getcoord(ph=self.project, index=linkNodes[1]) eNode.append(en.getnodevalue(ph=self.project, index=linkNodes[1], property=en.ELEVATION)) # Get link type. linkType = en.getlinktype(ph=self.project, index=index) if linkType == en.CVPIPE: linkType = "Cvpipe" elif linkType == en.PIPE: linkType = "Pipe" elif linkType == en.PUMP: linkType = "Pump" elif linkType == en.PRV: linkType = "Prv" elif linkType == en.PSV: linkType = "Psv" elif linkType == en.PBV: linkType = "Pbv" elif linkType == en.FCV: linkType = "Fcv" elif linkType == en.TCV: linkType = "Tcv" elif linkType == en.GPV: linkType = "Gpv" else: linkType = "Unknown" names.append(linkType + "-" + linkId + " (flow)") names.append(linkType + "-" + linkId + " (velocity)") names.append(linkType + "-" + linkId + " (headloss)") names.append(linkType + "-" + linkId + " (status)") names.append(linkType + "-" + linkId + " (pump_state)") names.append(linkType + "-" + linkId + " (energy)") return names
def getLinkCoordinates(self): c_x, c_y, c_z = [], [], [] linkCount = en.getcount(ph=self.project, object=en.LINKCOUNT) for idx in range(linkCount): index = idx + 1 # Get start and end node. linkNodes = en.getlinknodes(ph=self.project, index=index) sNode = en.getcoord(ph=self.project, index=linkNodes[0]) sNode.append(en.getnodevalue(ph=self.project, index=linkNodes[0], property=en.ELEVATION)) eNode = en.getcoord(ph=self.project, index=linkNodes[1]) eNode.append(en.getnodevalue(ph=self.project, index=linkNodes[1], property=en.ELEVATION)) c_x.append(sNode[0]), c_y.append(sNode[1]), c_z.append(sNode[2]) c_x.append(eNode[0]), c_y.append(eNode[1]), c_z.append(eNode[2]) c_x.append(None), c_y.append(None), c_z.append(None) return c_x, c_y, c_z
def inject_chlorine(str_nodeID, booster_val): epanet_proj = en.createproject() en.open(ph=epanet_proj, inpFile=example_1_path, rptFile='report.rpt', outFile='output.out') en.setqualtype(ph=epanet_proj, qualType=1, chemName='Chlorine', chemUnits='mg/L', traceNode=None) num_nodes = en.getcount(ph=epanet_proj, object=en.NODECOUNT) num_links = en.getcount(ph=epanet_proj, object=en.LINKCOUNT) tlist = [] en.openH(ph=epanet_proj) en.initH(ph=epanet_proj, initFlag=0) en.openQ(ph=epanet_proj) booster_node = en.getnodeindex(ph=epanet_proj, id=str_nodeID) print('Booster node index is %d' % (booster_node)) #sets node as Mass Booster en.setnodevalue(ph=epanet_proj, index=booster_node, property=en.SOURCETYPE, value=1) en.setnodevalue(ph=epanet_proj, index=booster_node, property=en.SOURCEQUAL, value=booster_val) nodetype = en.getnodevalue(ph=epanet_proj, index=booster_node, property=en.SOURCETYPE) obj = QualityControl(1) #seems to set nodetype to 1 #obj.set_nodetype(1) runs automatically print(obj.get_nodetype()) #checking en.initQ(ph=epanet_proj, saveFlag=1) node_qual = en.getnodevalue(ph=epanet_proj, index=booster_node, property=en.SOURCEQUAL) print('Booster node source quality: %5.2f' % (node_qual)) #print('End of inject chlorine function.') en.closeH(ph=epanet_proj) en.closeQ(ph=epanet_proj) en.close(ph=epanet_proj) clean_dir()
def getNodeQuality(self): # finds chlorine concentration in nodes C = np.zeros(shape=self.NodeCount) for i in self.NodeIndex: # print(i) quality = en.getnodevalue(ph=self.epanet_proj, index=i, property=en.QUALITY) # print(quality) C[i - 1] = quality return C
def getNodeActualDemand(self): # todo establish actualdemand list (DONE!) value = range(1, self.NodeCount + 1) nodeActualDemand = list() for i in value: # print(i) type = en.getnodevalue(ph=self.epanet_proj, index=i, property=en.DEMAND) # print(type) nodeActualDemand.append(type) return nodeActualDemand
def test_setnodevalue(): epanet_proj = en.createproject() en.open(ph=epanet_proj, inpFile=example_1_path, rptFile='report.rpt', outFile='output.out') num_nodes = en.getcount(ph=epanet_proj, object=en.NODECOUNT) elev_list = [] demand_list = [] pattern_list=[] emitter_list = [] initqual_list = [] tank_level_list = [] for node_ind in range(1, num_nodes+1): # elevation elev = en.getnodevalue(ph=epanet_proj, index=node_ind, property=en.ELEVATION) en.setnodevalue(ph=epanet_proj, index=node_ind, property=en.ELEVATION, value=elev + 1) elev_list.append(en.getnodevalue(ph=epanet_proj, index=node_ind, property=en.ELEVATION)) # base demand demand = en.getnodevalue(ph=epanet_proj, index=node_ind, property=en.BASEDEMAND) en.setnodevalue(ph=epanet_proj, index=node_ind, property=en.BASEDEMAND, value=demand + 1) demand_list.append(en.getnodevalue(ph=epanet_proj, index=node_ind, property=en.BASEDEMAND)) # pattern en.setnodevalue(ph=epanet_proj, index=node_ind, property=en.PATTERN, value=0) pattern_list.append(en.getnodevalue(ph=epanet_proj, index=node_ind, property=en.PATTERN)) # emitter en.setnodevalue(ph=epanet_proj, index=node_ind, property=en.EMITTER, value=0.01) emitter_list.append(en.getnodevalue(ph=epanet_proj, index=node_ind, property=en.EMITTER)) # initqual initqual = en.getnodevalue(ph=epanet_proj, index=node_ind, property=en.INITQUAL) en.setnodevalue(ph=epanet_proj, index=node_ind, property=en.INITQUAL, value=initqual + 0.1) initqual_list.append(en.getnodevalue(ph=epanet_proj, index=node_ind, property=en.INITQUAL)) # tanklevel if en.getnodetype(ph=epanet_proj, index=node_ind) == en.TANK: tank_level = en.getnodevalue(ph=epanet_proj, index=node_ind, property=en.TANKLEVEL) en.setnodevalue(ph=epanet_proj, index=node_ind, property=en.TANKLEVEL, value=tank_level + 1) tank_level_list.append(en.getnodevalue(ph=epanet_proj, index=node_ind, property=en.TANKLEVEL)) assert elev_list == [711.0, 711.0, 701.0, 696.0, 701.0, 696.0, 691.0, 701.0, 711.0, 801.0, 851.0] assert demand_list == [1.0, 151.0, 151.0, 101.0, 151.0, 201.0, 151.0, 101.0, 101.0, 0.0, 0.0] assert pattern_list == [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] assert emitter_list == [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.0, 0.0] assert initqual_list == [0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 1.1, 1.1] assert tank_level_list ==[121.0] clean_dir()
def state(self): state = [] # Get number of nodes and links. nodeCount = en.getcount(ph=self.project, object=en.NODECOUNT) linkCount = en.getcount(ph=self.project, object=en.LINKCOUNT) # Enumerate all nodes. for index in range(1,nodeCount+1): # Create state from current values. state.append(en.getnodevalue(ph=self.project, index=index, property=en.TANKLEVEL)) state.append(en.getnodevalue(ph=self.project, index=index, property=en.HEAD)) state.append(en.getnodevalue(ph=self.project, index=index, property=en.DEMAND)) state.append(en.getnodevalue(ph=self.project, index=index, property=en.PRESSURE)) for index in range(1,linkCount+1): state.append(en.getlinkvalue(ph=self.project, index=index, property=en.FLOW)) state.append(en.getlinkvalue(ph=self.project, index=index, property=en.VELOCITY)) state.append(en.getlinkvalue(ph=self.project, index=index, property=en.HEADLOSS)) state.append(en.getlinkvalue(ph=self.project, index=index, property=en.STATUS)) state.append(en.getlinkvalue(ph=self.project, index=index, property=en.PUMP_STATE)) state.append(en.getlinkvalue(ph=self.project, index=index, property=en.ENERGY)) return state
def getNodeCoordinates(self): c_x, c_y, c_z = [], [], [] nodeCount = en.getcount(ph=self.project, object=en.NODECOUNT) for idx in range(nodeCount): index = idx + 1 coords = en.getcoord(ph=self.project, index=index) coords.append(en.getnodevalue(ph=self.project, index=index, property=en.ELEVATION)) c_x.append(coords[0]) c_y.append(coords[1]) c_z.append(coords[2]) return c_x, c_y, c_z
def test_water_quality(): epanet_proj = en.createproject() en.open(ph=epanet_proj, inpFile=example_1_path, rptFile='report.rpt', outFile='output.out') en.setqualtype(ph=epanet_proj, qualType=1, chemName='Chlorine', chemUnits='mg/L', traceNode=None) num_nodes = en.getcount(ph=epanet_proj, object=en.NODECOUNT) num_links = en.getcount(ph=epanet_proj, object=en.LINKCOUNT) tlist = [] node_cl_list = [] link_cl_list = [] en.openH(ph=epanet_proj) en.initH(ph=epanet_proj, initFlag=0) print('Printing hydraulic time step:') while True: en.runH(ph=epanet_proj) t = en.nextH(ph=epanet_proj) print(t) tlist.append(t) if t <= 0: break assert tlist == timesteps en.openQ(ph=epanet_proj) en.initQ(ph=epanet_proj, saveFlag=1) print('Printing chlorine concentration in nodes:') while True: en.runQ(ph=epanet_proj) t = en.nextQ(ph=epanet_proj) for i in range(1, num_nodes+1): node_qual = en.getnodevalue(ph=epanet_proj, index=i, property=en.QUALITY) print('Node %d: %5.2f' % (i, node_qual)) node_cl_list.append(node_qual) if t <= 0: break print('Printing chlorine concentration in links:') while True: en.runQ(ph=epanet_proj) t = en.nextQ(ph=epanet_proj) for i in range(1, num_links+1): link_qual = en.getlinkvalue(ph=epanet_proj, index=i, property=en.QUALITY) print('Node %d: %5.2f' % (i, link_qual)) link_cl_list.append(link_qual) if t <= 0: break en.closeH(ph=epanet_proj) en.closeQ(ph=epanet_proj) en.close(ph=epanet_proj) clean_dir()
def setNodeSourceQuality(str_nodeID, booster_val): epanet_proj = en.createproject() en.open(ph=epanet_proj, inpFile=example_1_path, rptFile='report.rpt', outFile='output.out') en.setqualtype(ph=epanet_proj, qualType=1, chemName='Chlorine', chemUnits='mg/L', traceNode=None) num_nodes = en.getcount(ph=epanet_proj, object=en.NODECOUNT) num_links = en.getcount(ph=epanet_proj, object=en.LINKCOUNT) source_ind = en.getnodeindex(ph=epanet_proj, id=str_nodeID) '''en.openH(ph=epanet_proj) en.initH(ph=epanet_proj, initFlag=0) en.openQ(ph=epanet_proj) en.initQ(ph=epanet_proj, saveFlag=1)''' #setting source_ind as booster, need to find a way to acknowledge pre-set boosters #en.setnodevalue(ph=epanet_proj, index=source_ind, property=en.SOURCETYPE, value=1) node_type = en.getnodevalue(ph=epanet_proj, index=source_ind, property=en.SOURCETYPE) if node_type == 1: en.setnodevalue(ph=epanet_proj, index=source_ind, property=en.SOURCEQUAL, value=booster_val) print('Node (index %d) source quality set to value %5.2f' % (source_ind, booster_val)) else: print('Specified node is not designated as mass booster.') print('End of setNodeSourceQuality function.') '''en.closeH(ph=epanet_proj) en.closeQ(ph=epanet_proj) en.close(ph=epanet_proj)''' clean_dir()
def __call__(self, time): self._cw.writerow([time] + [ en.getnodevalue(self._ph, i, self._node_value) for i in self._node_range ])
def getNodeSourceQuality(self, nodeID): index = self.getNodeIndexbyID(nodeID) return en.getnodevalue(ph=self.epanet_proj, index=index, property=en.SOURCEQUAL)
def test_hydraulic(): epanet_proj = en.createproject() en.open(ph=epanet_proj, inpFile=example_1_path, rptFile='report.rpt', outFile='output.out') en.openH(ph=epanet_proj) en.initH(ph=epanet_proj, initFlag=0) num_nodes = en.getcount(ph=epanet_proj, object=en.NODECOUNT) num_links = en.getcount(ph=epanet_proj, object=en.LINKCOUNT) tlist = [] head_list = [] demand_list = [] flow_list = [] length_list = [] diam_list = [] vel_list = [] print('Printing hydraulic time step:') while True: en.runH(ph=epanet_proj) t = en.nextH(ph=epanet_proj) print(t) tlist.append(t) if t <= 0: break assert tlist == timesteps print('Printing demand in nodes:') for node_ind in range(1, num_nodes+1): en.runH(ph=epanet_proj) demand = en.getnodevalue(ph=epanet_proj, index=node_ind, property=en.BASEDEMAND) print('Node %d: %5.2f' % (node_ind, demand)) demand_list.append(demand) print('Printing head in nodes:') for node_ind in range(1, num_nodes+1): en.runH(ph=epanet_proj) head = en.getnodevalue(ph=epanet_proj, index=node_ind, property=en.HEAD) print('Node %d: %5.2f' % (node_ind, head)) head_list.append(head) print('Printing flowrate in links:') for link_ind in range(1, num_links+1): en.runH(ph=epanet_proj) flow = en.getlinkvalue(ph=epanet_proj, index=link_ind, property=en.FLOW) print('Link %d: %5.2f' % (link_ind, flow)) flow_list.append(flow) print('Printing length of links:') for link_ind in range(1, num_links+1): en.runH(ph=epanet_proj) length = en.getlinkvalue(ph=epanet_proj, index=link_ind, property=en.LENGTH) print('Link %d: %5.2f' % (link_ind, length)) length_list.append(length) print('Printing diameter of links:') for link_ind in range(1, num_links+1): en.runH(ph=epanet_proj) diam = en.getlinkvalue(ph=epanet_proj, index=link_ind, property=en.DIAMETER) print('Link %d: %5.2f' % (link_ind, diam)) diam_list.append(diam) print('Printing velocity in links:') for link_ind in range(1, num_links+1): en.runH(ph=epanet_proj) vel = en.getlinkvalue(ph=epanet_proj, index=link_ind, property=en.VELOCITY) print('Link %d: %5.2f' % (link_ind, vel)) vel_list.append(vel) en.closeH(ph=epanet_proj) en.close(ph=epanet_proj) clean_dir()