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()
Exemplo n.º 2
0
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()
Exemplo n.º 4
0
    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
Exemplo n.º 6
0
 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])))
Exemplo n.º 7
0
    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
Exemplo n.º 8
0
    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()
Exemplo n.º 13
0
    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
Exemplo n.º 14
0
    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()
Exemplo n.º 17
0
 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()