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
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)
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()
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])
print(("Network has ", result, " nodes.")) 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("")