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()
示例#2
0
    def init_hotstart(self, file):
        """
        Initalize water quality state in a network

        :param file: a JSON file or readable binary stream
        :return: None

        {
        "quality": [1,2,3,4,5,...],
        ...
        }

        """
        fh = None
        # get data vector from file (JSON file handle)
        if isinstance(file, str):
            fh = open(file, 'rb')
        elif isinstance(file, io.IOBase):
            fh = file

        state = json.load(fh)
        quality_state = state["quality"]
        n_nodes = toolkit.getcount(self.ph, toolkit.NODECOUNT)
        for component in zip(range(1, n_nodes + 1), quality_state):
            toolkit.setnodevalue(self.ph, component[0], toolkit.QUALITY,
                                 component[1])
def test_add_link():
    epanet_proj = en.createproject()
    en.open(ph=epanet_proj, inpFile=example_1_path, rptFile='report.rpt', outFile='output.out')
    en.addlink(ph=epanet_proj, id='L123', linkType=en.PIPE, fromNode='10', toNode='12')
    num_links = en.getcount(ph=epanet_proj, object=en.LINKCOUNT)
    assert num_links == 14
    clean_dir()
def _test_add_node():
    epanet_proj = en.createproject()
    en.open(ph=epanet_proj, inpFile=example_1_path, rptFile='report.rpt', outFile='output.out')
    en.addnode(ph=epanet_proj, id='33', nodeType=en.JUNCTION)
    num_nodes = en.getcount(ph=epanet_proj, object=en.NODECOUNT)
    assert num_nodes == 12
    clean_dir()
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()
示例#6
0
 def junctions(self):
     nodes = []
     num_nodes = toolkit.getcount(self.ph, toolkit.NODECOUNT)
     for node in range(1, num_nodes + 1):
         if toolkit.getnodetype(self.ph, node) == toolkit.JUNCTION:
             nodes.append(toolkit.getnodeid(self.ph, node))
     return nodes
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 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()
示例#9
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
示例#10
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
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()
示例#12
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
示例#13
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 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 test_get_count():
    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)
    print(num_nodes)
    num_links = en.getcount(ph=epanet_proj, object=en.LINKCOUNT)
    print(num_links)
    num_tanks = en.getcount(ph=epanet_proj, object=en.TANKCOUNT)
    print(num_tanks)
    num_pat = en.getcount(ph=epanet_proj, object=en.PATCOUNT)
    print(num_pat)
    num_curv = en.getcount(ph=epanet_proj, object=en.CURVECOUNT)
    print (num_curv)
    num_contr = en.getcount(ph=epanet_proj, object=en.CONTROLCOUNT)
    print (num_contr)
    en.close(ph=epanet_proj)
    clean_dir()
示例#16
0
    def registerControlLoops(self):
        """
            This method retrieves and deletes all controls from epanet
            and implements them here. This allows the attacker to tamper
            with them later.
        """
        self.controlLoops = []

        count = en.getcount(ph=self.project, object=en.CONTROLCOUNT)
        for idx in range(1,count+1):
            typ, linkIndex, setting, nodeIndex, level = en.getcontrol(ph=self.project, index=idx)
            if typ == en.LOWLEVEL:
                #self.controlLoops.append(lambda state, level=level, node=nodeIndex: if state[node] < level:
            elif typ == en.HILEVEL:
                pass
                # TODO: implement
            elif typ == en.TIMER:
                pass
                # TODO: implement
            elif typ == en.TIMEOFDAY:
                pass
                # TODO: implement
            else:
                loggin.error("Control type unknown.")
示例#17
0
    def getNodeNames(self):
        names = []
        nodeCount = en.getcount(ph=self.project, object=en.NODECOUNT)

        for idx in range(nodeCount):
            index = idx + 1
            # Get node id.
            nodeId = en.getnodeid(ph=self.project, index=index)
            # Get node type.
            nodeType = "Node"
            if en.getnodetype(ph=self.project, index=index) == en.TANK:
                nodeType = "Tank"
            elif en.getnodetype(ph=self.project, index=index) == en.JUNCTION:
                nodeType = "Junction"
            elif en.getnodetype(ph=self.project, index=index) == en.RESERVOIR:
                nodeType = "Reservoir"
            else:
                nodeType = "Unknown"
            names.append(nodeType + "-" + nodeId + " (tanklevel)")
            names.append(nodeType + "-" + nodeId + " (head)")
            names.append(nodeType + "-" + nodeId + " (demand)")
            names.append(nodeType + "-" + nodeId + " (pressure)")

        return names
示例#18
0
    ## Set time step
    hstep = en.gettimeparam(ph, en.HYDSTEP)
    print(f'Hydraulic time step was: {hstep}', end='')
    hstep = args.hstep
    en.settimeparam(ph, en.HYDSTEP, hstep)
    print(f', setting to: {hstep}')

    ## Other initialisation
    en.setstatusreport(ph, en.NORMAL_REPORT)
    en.initH(ph, en.SAVE)
    #en.setreport(ph, 'SUMMARY YES')
    #en.setreport(ph, 'NODES ALL')
    #en.setreport(ph, 'LINKS ALL')
    #en.settimeparam(ph, en.REPORTSTEP, 600)
    node_count = en.getcount(ph, en.NODECOUNT)
    link_count = en.getcount(ph, en.LINKCOUNT)

    en.openQ(ph)
    en.initQ(ph, en.NOSAVE)

    print(f'Node count: {node_count}, link count: {link_count}')

    with contextlib.ExitStack() as ctx_stack:
        nodevalue_wrts = [
            ctx_stack.enter_context(NodeValueCSVWriter(fn, ph, nv))
            for nv, fn in nodevalue_filename_list
        ]
        linkvalue_wrts = [
            ctx_stack.enter_context(LinkValueCSVWriter(fn, ph, lv))
            for lv, fn in linkvalue_filename_list
示例#19
0
 def __init__(self, csv_filename, project_handle, node_value):
     self._csv_filename = csv_filename
     self._ph = project_handle
     self._node_value = node_value
     node_count = en.getcount(self._ph, en.NODECOUNT)
     self._node_range = range(1, node_count + 1)
示例#20
0
 def __init__(self, csv_filename, project_handle, link_value):
     self._csv_filename = csv_filename
     self._ph = project_handle
     self._link_value = link_value
     link_count = en.getcount(self._ph, en.LINKCOUNT)
     self._link_range = range(1, link_count + 1)
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()
    def __init__(self, network):
        classversion = 'v0.1'
        self.TYPELINK = [
            'CVPIPE', 'PIPE', 'PUMP', 'PRV', 'PSV', 'PBV', 'FCV', 'TCV', 'GPV'
        ]  # Constants for links: 'CVPIPE', 'PIPE', 'PUMP', 'PRV', 'PSV', 'PBV', 'FCV', 'TCV', 'GPV', 'VALVE'
        TYPEMIXMODEL = [
            'MIX1', 'MIX2', 'FIFO', 'LIFO'
        ]  # Constants for mixing models: 'MIX1', 'MIX2', 'FIFO', 'LIFO'
        self.TYPENODE = [
            'JUNCTION', 'RESERVOIR', 'TANK'
        ]  # Contants for nodes: 'JUNCTION', 'RESERVOIR', 'TANK'
        TYPEPUMP = [
            'CONSTANT_HORSEPOWER', 'POWER_FUNCTION', 'CUSTOM'
        ]  # Constants for pumps: 'CONSTANT_HORSEPOWER', 'POWER_FUNCTION', 'CUSTOM'
        TYPEQUALITY = [
            'NONE', 'CHEM', 'AGE', 'TRACE', 'MULTIS'
        ]  # Constants for quality: 'NONE', 'CHEM', 'AGE', 'TRACE', 'MULTIS'
        TYPEREPORT = ['YES', 'NO',
                      'FULL']  # Constants for report: 'YES', 'NO', 'FULL'

        self.TYPESOURCE = [
            'CONCEN', 'MASS', 'SETPOINT', 'FLOWPACED'
        ]  # Constant for sources: 'CONCEN', 'MASS', 'SETPOINT', 'FLOWPACED'

        TYPESTATS = [
            'NONE', 'AVERAGE', 'MINIMUM', 'MAXIMUM', 'RANGE'
        ]  # Constants for statistics: 'NONE', 'AVERAGE', 'MINIMUM', 'MAXIMUM', 'RANGE'
        TYPEUNITS = [
            'CFS', 'GPM', 'MGD', 'IMGD', 'AFD', 'LPS', 'LPM', 'MLD', 'CMH',
            'CMD'
        ]  # Constants  for units: 'CFS', 'GPM', 'MGD', 'IMGD', 'AFD', 'LPS', 'LPM', 'MLD', 'CMH', 'CMD'
        TYPEHEADLOSS = [
            'HW', 'DW', 'CM'
        ]  # Constants of  headloss types: HW: Hazen - Williams, DW: Darcy - Weisbach, CM: Chezy - Manning
        TYPESTATUS = ['CLOSED', 'OPEN']  # Link status
        self.epanet_proj = en.createproject()
        print('Loading:', network)
        en.open(ph=self.epanet_proj,
                inpFile=network,
                rptFile='report.rpt',
                outFile='output.out')
        # Get all the countable network parameters
        self.NodeCount = en.getcount(ph=self.epanet_proj, object=en.NODECOUNT)
        self.TankReservoirCount = en.getcount(ph=self.epanet_proj,
                                              object=en.TANKCOUNT)
        self.LinkCount = en.getcount(ph=self.epanet_proj, object=en.LINKCOUNT)
        self.PatternCount = en.getcount(ph=self.epanet_proj,
                                        object=en.PATCOUNT)
        self.CurveCount = en.getcount(ph=self.epanet_proj,
                                      object=en.CURVECOUNT)
        self.CurveIndex = self.getCurveIndex()
        self.JunctionCount = self.NodeCount - self.TankReservoirCount  # en.getNodeJunctionCount

        self.NodeID = self.getNodeID()
        self.LinkID = self.getLinkID()
        # Get node type index
        self.NodeTypeIndex = self.getNodeTypeIndex()
        self.LinkTypeIndex = self.getLinkTypeIndex()

        # Get type of the parameters
        self.LinkType = self.getLnkType()
        self.NodeType = self.getNodeType()

        self.ReservoirCount = self.getReservoirCount()
        self.TankCount = self.TankReservoirCount - self.ReservoirCount

        self.PumpCount = self.getPumpCount()
        self.PipeCount = self.getPipeCount()
        self.ValveCount = self.LinkCount - self.PumpCount - self.PipeCount

        # Get node index
        self.NodeIndex = list(range(1, self.NodeCount + 1))

        self.JunctionIndex = self.NodeIndex[0:self.JunctionCount]
        self.JunctionID = self.NodeID[0:self.JunctionCount]

        temp = self.JunctionCount + self.ReservoirCount
        self.ReservoirIndex = self.NodeIndex[self.JunctionCount:temp]
        self.ReservoirID = self.NodeID[self.JunctionCount:temp]

        self.TankIndex = self.NodeIndex[temp:temp + self.ReservoirCount]
        self.TankID = self.NodeID[temp:temp + self.ReservoirCount]

        # Get link index
        self.LinkIndex = list(range(1, self.LinkCount + 1))

        self.PipeIndex = self.LinkIndex[0:self.PipeCount]
        self.PipeID = self.LinkID[0:self.PipeCount]

        temp = self.PipeCount + self.PumpCount
        self.PumpIndex = self.LinkIndex[self.PipeCount:temp]
        self.PumpID = self.LinkID[self.PipeCount:temp]

        self.ValveIndex = self.LinkIndex[temp:temp + self.ValveCount]
        self.ValveID = self.LinkID[temp:temp + self.ValveCount]

        print('Loading ends, and ready to go!')