Beispiel #1
0
 def run_epanet_file(self):
     ####	Opening the hydraulics results
     ret = epa.ENopenH()
     print ret
     ret = epa.ENinitH(0)
     print ret
     ####	Running the Hydraulics Solver
     epa.ENrunH()
    def Import_EPANet_Results(self):
        ret = epa.ENopen(self.filename, self.filename[:-3] + 'rep',
                         self.filename[:-3] + 'out')
        #print ret
        ####	Opening the hydraulics results
        ret = epa.ENopenH()
        #print ret
        ret = epa.ENinitH(0)
        #print ret
        ####	Running the Hydraulics Solver
        epa.ENrunH()

        ####	Returning the head solutions (for the first time step, the only one accessible at the moment)
        ##	Only need to do this for the node elements at the moment as reservoirs don't change
        ret, no_nodes = epa.ENgetcount(epa.EN_NODECOUNT)
        print 'Number of NODES in results file', no_nodes
        for index in range(1, no_nodes + 1):
            ret, idx = epa.ENgetnodeid(index)
            ret, H0 = epa.ENgetnodevalue(index, epa.EN_HEAD)
            try:
                #print Network.node_idx[idx].Name,idx
                if self.node_idx[idx].type == 'Node':
                    self.node_idx[idx].H_0 = float(H0)
                    self.node_idx[idx].TranH = [float(H0)]

            except:
                print 'Problem getting Head for Node:', idx
                continue

        ####	Returning the flow solutions (for the first time step, the only one accessible at the moment)
        ret, no_links = epa.ENgetcount(epa.EN_LINKCOUNT)
        print 'Number of LINKS in results file', no_links
        for index in range(1, no_links + 1):
            ret, idx = epa.ENgetlinkid(index)

            ret, Q0 = epa.ENgetlinkvalue(index, epa.EN_FLOW)

            ret, V0 = epa.ENgetlinkvalue(index, epa.EN_VELOCITY)

            ret, Headloss = epa.ENgetlinkvalue(index, epa.EN_HEADLOSS)
            ret, Length = epa.ENgetlinkvalue(index, epa.EN_LENGTH)
            ret, Diameter = epa.ENgetlinkvalue(index, epa.EN_DIAMETER)
            #print Headloss,Length,Diameter,V0
            #print 2*9.81*(Headloss/1000.)*Diameter / (Length * V0**2)

            try:

                self.link_idx[idx].Q_0 = float(Q0) / 1000.  #Convert to m^3/s
                self.link_idx[idx].V_0 = float(V0)
                self.link_idx[idx].FF_0 = float(2 * 9.81 * (Headloss / 1000.) *
                                                Diameter / (Length * V0**2))
                #self.link_idx[idx].R = float((Headloss/1000.) / (np.pi*Diameter/4. * Length * V0))
            except:
                print 'Problem getting Flow or Velocity for link:', idx
                continue
Beispiel #3
0
    def run(self, pressure=True, failure=True, sql_yr_w=5):
        et.ENopenH()
        et.ENinitH(0)

        # Run for two days to create network equilibrium
        time = et.ENrunH()[1]
        while time < 172800:
            et.ENnextH()[1]
            time = et.ENrunH()[1]

        while True:
            if not self.iterate(pressure, failure, sql_yr_w=sql_yr_w):
                et.ENcloseH()
                et.ENclose()
                return
def Import_EPANet_Results(inp_filename, Network=None):
    if Network == None:
        Network = Import_EPANet_Geom(inp_filename)

    ret = epa.ENopen(inp_filename, inp_filename[:-3] + 'rep',
                     inp_filename[:-3] + 'out')

    ####	Opening the hydraulics results
    err(epa.ENopenH())
    err(epa.ENinitH(0))

    ####	Running the Hydraulics Solver
    epa.ENrunH()

    ####	Returning the head solutions (for the first time step, the only one accessible at the moment)
    ret, no_nodes = epa.ENgetcount(epa.EN_NODECOUNT)
    for index in range(1, no_nodes):
        ret, idx = epa.ENgetnodeid(index)
        ret, H0 = epa.ENgetnodevalue(index, epa.EN_HEAD)
        try:
            #print Network.node_idx[idx].Name,idx
            Network.node_idx[idx].H_0 = H0
        except:
            print 'Problem getting Head for Node:', idx
            continue

    ####	Returning the flow solutions (for the first time step, the only one accessible at the moment)
    ret, no_links = epa.ENgetcount(epa.EN_LINKCOUNT)
    for index in range(1, no_nodes):
        ret, idx = epa.ENgetlinkid(index)
        ret, Q0 = epa.ENgetlinkvalue(index, epa.EN_FLOW)
        ret, V0 = epa.ENgetlinkvalue(index, epa.EN_VELOCITY)
        try:

            Network.link_idx[idx].Q_0 = Q0
            Network.link_idx[idx].V_0 = V0
        except:
            print 'Problem getting Flow or Velocity for link:', idx
            continue
import numpy as np
import pylab as pp
import csv
from epanettools.epanettools import EPANetSimulation, Node, Link, Network, Nodes,Links, Patterns, Pattern, Controls, Control
from epanettools import epanet2 as et
Directory = 'Projects/Xu_Leak_Detection/'
# FileName = '250701 K709vs2-Export.inp'
FileName = 'ExampleNetwork1.inp'
FileName = 'LeakTestNet.inp'

ret=et.ENopen(Directory+FileName,Directory + 'Temp.rpt',"")
et.ENopenH()
et.ENinitH(0)


time=[]
nodes={}
ret,nnodes=et.ENgetcount(et.EN_NODECOUNT)
for index in range(1,nnodes+1):
    ret,t=et.ENgetnodeid(index)
    nodes[t] = []

for index in range(1,nnodes):
    ret,d = et.ENgetnodevalue(index,et.EN_BASEDEMAND)

    if d == 0.0:
        Pete = np.random.randint(1, 6)
    #if Pete == 1:
        ret1 = et.ENsetnodevalue(index, et.EN_PATTERN, 1)
        ret2 = et.ENsetnodevalue(index,et.EN_BASEDEMAND,300.0)
Beispiel #6
0
def getValue(network_object,
             object_property,
             object_index=''):  # ! Sredjeno - TESTIRATI -> RADI
    """
        :param  network_object    : string - 'node' ili 'link'
        :param  object_property   : parametar u vidu velicine koju trazimo, pogledaj dole listu parametara za oredjene objekte.
        :param  object_index = '' : int - index objekta, ako ne unesemo broj index-a objekta, izbacuje vrednosti za sve objekte
        :return                   : vraca velicinu(e), u zaviasnosti od unetog `object_index` parametra, NODE-a ili LINK-a 

        *node - properties*
        epa.EN_PRESSURE   - pritisak u cvoru
        epa.EN_HEAD       - piezometrijska kota
        epa.EN_ELEVATION  - apsolutna kota cvora
        epa.EN_BASEDEMAND - potreba za vodom u cvoru
                            itd. pogledaj EPANET-Toolkit-PDF-fajl

        *link - properties*
        epa.EN_FLOW        - protok u cevi
        epa.EN_VELOCITY    - brzina vode u cevi
        epa.EN_INITSTATUS  - inicijalni status (Open ili Closed)
        epa.EN_DIAMETER    - precnik cevi
                             itd. pogledaj EPANET-Toolkit-PDF-fajl

        :info: 
        Vremenski korak podesen je na 1h tj. 3600s !!!
     """

    count_param = {'link': epa.EN_LINKCOUNT, 'node': epa.EN_NODECOUNT}

    # Provera da li smo ubacili index objekta.
    if type(object_index) == int:
        nobjects = 1
    else:
        nobjects = epa.ENgetcount(count_param[network_object])[1]

    # Lista indeksa objekata u mrezi
    objects = []
    object_value = []

    id_fun = {'link': epa.ENgetlinkid, 'node': epa.ENgetnodeid}

    if type(object_index) == int:
        objects.append(object_index)

    else:
        for index in range(1, nobjects + 1):
            t = id_fun[network_object](index)[1]
            objects.append(t)
            object_value.append([])

    value_fun = {'link': epa.ENgetlinkvalue, 'node': epa.ENgetnodevalue}

    # ** Hidraulicki Proracun **
    # Hidraulicki proracun zapocinjemo ovim dvema f-jama.
    epa.ENopenH()
    epa.ENinitH(0)

    time = []

    while True:
        t = epa.ENrunH()[1]

        # Ovaj deo je ubacen kao korekcija jer se javlja BUG u source_code-u
        # Ako je tstep != 3600, petlja ga preskoci, u suprotnom imamo visak podataka!
        if t % 3600 == 0:
            time.append(t)

            # Ako trazimo vrednosti samo jednog objekta
            if nobjects == 1:
                # Retrieve hydraulic results for time t
                # posto EPAnet broji od jedan moramo da uvecamo indeks za 1!
                p = value_fun[network_object](object_index, object_property)[1]
                object_value.append(p)

                # Vremenski Korak - u nasem slucaju svakih = 3600s
                tstep = epa.ENnextH()[1]

            # Ako trazimo vrednosti za celu mrezu
            else:
                # Retrieve hydraulic results for time t
                for i in range(0, len(objects)):
                    # posto EPAnet broji od jedan moramo da uvecamo indeks za 1!
                    p = value_fun[network_object](i + 1, object_property)[1]
                    object_value[i].append(p)

                # Vremenski Korak - u nasem slucaju svakih = 3600s
                tstep = epa.ENnextH()[1]

            if tstep <= 0:
                break

        else:
            tstep = epa.ENnextH()[1]
            if tstep <= 0:
                break
            continue

    epa.ENcloseH()  # Kraj Hidraulickog proracuna.

    return object_value
def run_EPANET():
    ret = epa.ENopenH()
    ret = epa.ENinitH(0)
    epa.ENrunH()
Beispiel #8
0
 def test_basic(self):
     import os
     from epanettools import epanet2 as et
     from epanettools.examples import simple 
     
     file = os.path.join(os.path.dirname(simple.__file__),'Net3.inp')
     ret=et.ENopen(file,"Net3.rpt","Net3.dat")
     self.err(et,ret)
     
     ret,result=et.ENgetcount(et.EN_LINKCOUNT)
     
     # #links
     assert (result==119)
     
     ret,result=et.ENgetcount(et.EN_NODECOUNT)
     # # nodes
     assert(result==97)
 
     node='105'
     ret,index=et.ENgetnodeindex(node)
     # index of node '105'
     assert(index==12)
     
     #
     print(et.ENgetlinknodes(55))
     assert all([i==j for i,j in zip(et.ENgetlinknodes(55),[0,5,46])])
  
 
     ret,nnodes=et.ENgetcount(et.EN_NODECOUNT)
     nodes=[]
     pres=[]
     time=[]
     for index in range(1,nnodes):
         ret,t=et.ENgetnodeid(index)
         nodes.append(t)
         t=[]
         pres.append(t)
     print(nodes)
     assert(nodes==['10', '15', '20', '35', '40', '50', 
                    '60', '601', '61', '101', '103', '105',
                    '107', '109', '111', '113', '115', '117',
                    '119', '120', '121', '123', '125', '127', 
                    '129', '131', '139', '141', '143', '145',
                    '147', '149', '151', '153', '157', '159', 
                    '161', '163', '164', '166', '167', '169',
                    '171', '173', '177', '179', '181', '183', 
                    '184', '185', '187', '189', '191', '193', 
                    '195', '197', '199', '201', '203', '204', 
                    '205', '206', '207', '208', '209', '211', 
                    '213', '215', '217', '219', '225', '229', 
                    '231', '237', '239', '241', '243', '247', 
                    '249', '251', '253', '255', '257', '259', 
                    '261', '263', '265', '267', '269', '271', 
                    '273', '275', 'River', 'Lake', '1', '2'])
 
     
     self.err(et,et.ENopenH())
     self.err(et,et.ENinitH(0))
     while True :
         ret,t=et.ENrunH()
         time.append(t)
         self.err(et,ret)
         # Retrieve hydraulic results for time t
         for  i in range(0,len(nodes)):
             ret,p=et.ENgetnodevalue(i+1, et.EN_PRESSURE )
             pres[i].append(p)
         ret,tstep=et.ENnextH()
         self.err(et,ret)
         if (tstep<=0):
             break
     ret=et.ENcloseH()
     print(pres[12])
     diffs=[abs(i-j) for i,j in zip(pres[12],
                                          [54.085777282714844, 60.99293518066406, 
                                           63.03010940551758, 63.56983947753906, 
                                           66.80770874023438, 63.989463806152344, 
                                           63.49333190917969, 63.895835876464844, 
                                           63.440582275390625, 63.90030288696289, 
                                           63.43799591064453, 63.438758850097656, 
                                           63.03285598754883, 63.005157470703125, 
                                           63.1264533996582, 63.40403366088867, 
                                           56.72084045410156, 56.622596740722656, 
                                           56.47193908691406, 56.478843688964844, 
                                           56.27402114868164, 55.576839447021484, 
                                           55.0153923034668, 55.81755065917969, 
                                           55.200626373291016, 53.8864860534668, 
                                           55.024227142333984])]
     print([i for i in diffs])
     assert all([i<1.e-5 for i in  diffs])
     
    node = '105'
    ret, index = et.ENgetnodeindex(node)
    print(("Node ", node, " has index : ", index))

    ret, nnodes = et.ENgetcount(et.EN_NODECOUNT)
    nodes = []
    pres = []
    for index in range(1, nnodes):
        ret, t = et.ENgetnodeid(index)
        nodes.append(t)
        t = []
        pres.append(t)

    print(nodes)
    err(et.ENopenH())
    err(et.ENinitH(0))
    while True:
        ret, t = et.ENrunH()
        time.append(t)
        err(ret)
        # Retrieve hydraulic results for time t
        for i in range(0, len(nodes)):
            ret, p = et.ENgetnodevalue(i + 1, et.EN_PRESSURE)
            pres[i].append(p)
        ret, tstep = et.ENnextH()
        err(ret)
        if (tstep <= 0):
            break
    ret = et.ENcloseH()
    print("")
    import matplotlib