def openepafile(inp_file_path=''): # ! Sredjeno - TESTIRATI -> RADI """ :param inp_file_path = '' : string - Ako ne unesemo putanju, otvara se `dialog-box` da odaberemo .inp-fajl. :return : Ne vraca nista :info: Otvaranje EPANET inp-fajla. Bilo bi JAKO korisno da se vrednost ove f-je sacuva u nekoj varijabli, zato sto putanju fajla koriste neke funkcije kao parametar, kao npr f-ja getQH(file_path)... :primer: epanetfilepath = openepafile() """ if inp_file_path == '': # pretvaramo u `string` zato sto je u `unicode-u` ('uPAnekitext') epanetfile = str(gui.fileopenbox()) n = len(epanetfile) - 3 epa.ENopen(epanetfile, epanetfile[:n] + "rpt", "") return epanetfile elif inp_file_path != '': n = len(inp_file_path) - 3 epa.ENopen(inp_file_path, inp_file_path[:n] + "rpt", "") return inp_file_path
def __init__(self, network, output, tasmax, years=82, timestep=60 * 60, tmp_dir='data/tmp/'): # super().__init__(output, tasmax, years=years, timestep=timestep, tmp_dir=tmp_dir) self.tmp_dir = tmp_dir self.tasmax = tasmax self.pumps = list() self.pipes = list() self.nodes = list() self.current_time = 0 self.current_temp = 0.0 self.timestep = timestep self.time = ((48 * 60 * 60) + (years * self.year)) self.years = years rmtree(self.tmp_dir, ignore_errors=True) makedirs(tmp_dir) et.ENopen(network, output, '') et.ENsettimeparam(0, self.time) network = tmp_dir + network.split('/')[-1] output = tmp_dir + output.split('/')[-1] et.ENsaveinpfile(network) et.ENclose() et.ENopen(network, output, '') self.network = network
def getResidulSqure_EPA(MeaData): errcode = et.ENopen(ResultInp, "BUFF.rpt", "") errcode = et.ENsolveH() ResidulSqure = {} ResidulSqure['Res'] = {} ResidulSqure['P'] = {} ResidulSqure['F'] = {} residul = [] for id in ResID: [errcode, index] = et.ENgetnodeindex(id) [errcode, value] = et.ENgetnodevalue(index, et.EN_DEMAND) ResidulSqure['Res'][id] = (value - MeaData.Data['Res'][id])**2 residul.append(value - MeaData.Data['Res'][id]) for id in PreID: [errcode, index] = et.ENgetnodeindex(id) [errcode, value] = et.ENgetnodevalue(index, et.EN_PRESSURE) ResidulSqure['P'][id] = (value - MeaData.Data['P'][id])**2 residul.append(value - MeaData.Data['P'][id]) for id in FloID: [errcode, index] = et.ENgetlinkindex(id) [errcode, value] = et.ENgetlinkvalue(index, et.EN_FLOW) ResidulSqure['F'][id] = (value - MeaData.Data['F'][id])**2 residul.append(value - MeaData.Data['F'][id]) errcode = et.ENclose() return [ResidulSqure, residul]
def setDiameter(id,value): errcode=et.ENopen(Inp,"BUFF.rpt","") [errcode,index]=et.ENgetlinkindex(id) # [errcode,diameter]=et.ENgetlinkvalue(index,et.EN_DIAMETER) et.ENsetlinkvalue(index,et.EN_DIAMETER,value) errcode=et.ENsaveinpfile(InpCopy) errcode=et.ENclose()
def setElevation(id,value): errcode=et.ENopen(Inp,"BUFF.rpt","") [errcode,index]=et.ENgetnodeindex(id) [errcode,elevation]=et.ENgetnodevalue(index,et.EN_ELEVATION) et.ENsetnodevalue(index,et.EN_ELEVATION,elevation+value) errcode=et.ENsaveinpfile(InpCopy) errcode=et.ENclose()
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 generatePriorDist(): PriorDist = priorDistributon() PriorDist.pred_values = 0 PriorDist.pred_variance = 0 PriorDist.prior_values = 0 PriorDist.prior_variance = 100 PriorDist.node_id = [] errcode = et.ENopen(Inp, "BUFF.rpt", "") for i in range(DEMAND_NUM): [errcode, id] = et.ENgetnodeid(i + 1) PriorDist.node_id.append(id) errcode = et.ENclose() return PriorDist
def getResidulSqure_EPA(MeaData): errcode = et.ENopen(ResultInp, "BUFF.rpt", "") errcode = et.ENsolveH() ResidulSqure = {} ResidulSqure['Res'] = {} ResidulSqure['P'] = {} ResidulSqure['F'] = {} print_R_RES = 0 print_R_Pre = 0 print_R_Flo = 0 residul = [] for id in MeaData.ResID: [errcode, index] = et.ENgetnodeindex(id) [errcode, value] = et.ENgetnodevalue(index, et.EN_DEMAND) ResidulSqure['Res'][id] = (value - MeaData.Data['Res'][id])**2 print_R_RES = print_R_RES + ResidulSqure['Res'][id] residul.append(value - MeaData.Data['Res'][id]) if (len(MeaData.ResID) > 0): print_R_RES = print_R_RES / len(MeaData.ResID) for id in MeaData.PreID: [errcode, index] = et.ENgetnodeindex(id) [errcode, value] = et.ENgetnodevalue(index, et.EN_PRESSURE) ResidulSqure['P'][id] = (value - MeaData.Data['P'][id])**2 print_R_Pre = print_R_Pre + ResidulSqure['P'][id] residul.append(value - MeaData.Data['P'][id]) if (len(MeaData.PreID) > 0): print_R_Pre = print_R_Pre / len(MeaData.PreID) for id in MeaData.FloID: [errcode, index] = et.ENgetlinkindex(id) [errcode, value] = et.ENgetlinkvalue(index, et.EN_FLOW) ResidulSqure['F'][id] = (value - MeaData.Data['F'][id])**2 print_R_Flo = print_R_Flo + ResidulSqure['F'][id] residul.append(value - MeaData.Data['F'][id]) if (len(MeaData.FloID) > 0): print_R_Flo = print_R_Flo / len(MeaData.FloID) errcode = et.ENclose() print('ave Squre error: Res Flo Pre') print(' ' + str(print_R_RES) + ' ' + str(print_R_Flo) + ' ' + str(print_R_Pre)) return [ResidulSqure, residul]
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
def updateResult(self, ResultInp): errcode = et.ENopen(ResultInp, 'r.rtp', '') errcode = et.ENsolveH() #########update the calibrated value at sensors######### Res = {} P = {} F = {} for id in self.sensorID_Res: [errcode, index] = et.ENgetnodeindex(id) [errcode, demand] = et.ENgetnodevalue(index, et.EN_DEMAND) Res[id] = demand for id in self.sensorID_P: [errcode, index] = et.ENgetnodeindex(id) [errcode, pressure] = et.ENgetnodevalue(index, et.EN_PRESSURE) P[id] = pressure # for id in self.sensorID_F: # [errcode,index]=et.ENgetlinkindex(id) # [errcode,flow]=et.ENgetlinkvalue(index,et.EN_FLOW) # F[id]=flow self.cali_sensor['Res'] = Res self.cali_sensor['P'] = P #Save the simulated sensor pressure # self.cali_sensor['F']=F#Save the simulated sensor flow #########update the calibrated nodal pressure and pipe flow rate######### self.cali_demand_values = [] self.cali_nodal_p = [] #需要初始化 self.cali_pipe_f = [] for index in range(self.demand_dim): [errcode, pressure] = et.ENgetnodevalue(index + 1, et.EN_PRESSURE) self.cali_nodal_p.append(pressure) [errcode, demand] = et.ENgetnodevalue(index + 1, et.EN_DEMAND) self.cali_demand_values.append(demand) for index in range(Number_PIPES): [errcode, flow] = et.ENgetlinkvalue(index + 1, et.EN_FLOW) self.cali_pipe_f.append(flow) errcode = et.ENclose()
def hyd_simulation(self, ResultInp): errcode = et.ENopen(ResultInp, 'r.rtp', '') errcode = et.ENsolveH()
pressure = Node.value_type[ 'EN_PRESSURE'] #this gives the water level of the tank for each increment for i in range(0, 27): print("%.3f" % es.network.nodes['1'].results[pressure][i]) print("%.3f" % es.network.nodes['2'].results[pressure][i]) print("%.3f \n" % es.network.nodes['3'].results[pressure][i]) ''' Simulation ''' import os from random import randint 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, "Net3B.rpt", "") time = [] Pump_status1 = [] Pump_status2 = [] Tank_level1 = [] Tank_level2 = [] Tank_level3 = [] et.ENopenH() et.ENinitH(0) inc = 0 p_status_1 = [] for i in range(0, 25): p_status_1.append(randint(0, 0)) p_status_2 = []
Tank_level_C2 = [] d_C = [] cost_6D_2 = [] Tank_level_D2 = [] d_D = [] Tank_level_E2 = [] cost_7F_2 = [] Tank_level_F2 = [] d_F = [] network_real = "richmondNet_2_Under" file2 = os.path.join(os.path.dirname(simple.__file__), network_real + '.inp') ret = et.ENopen(file2, network_real + ".rpt", "") et.ENopenH() et.ENinitH(0) while True: ret, t = et.ENrunH() if t % 3600 != 0: ret, tstep = et.ENnextH() if (tstep <= 0): break else: time.append(t)
""" This workflow runs extended-period simulation of CTOWN network and plots pressure reads for junction J193 Dependencies: epanettools and matplot modules """ from epanettools import epanet2 as et from epanettools.epanettools import EPANetSimulation import matplotlib.pyplot as plt import os dir = os.path.abspath('testEPANETTOOLS.py') dir = '\\'.join(dir.split('\\')[0:-2]) file_directory = dir + '\\resources\\CTOWN.inp' ret = et.ENopen(file_directory, "CTOWN.rpt", "") es = EPANetSimulation(file_directory) n = es.network.nodes junction = 'J193' pres = [] nodes = [] time = [] et.ENopenH() et.ENinitH(0) while True: ret, t = et.ENrunH() ret, p = et.ENgetnodevalue(n[junction].index, et.EN_PRESSURE) print t, p
# and open the template in the editor. __author__ = "assela" __date__ = "$Sep 30, 2011 12:59:16 PM$" def err(e): if (e > 0): print((e, et.ENgeterror(e, 25))) exit(5) if __name__ == "__main__": from epanettools import epanet2 as et ret = et.ENopen("Net3.inp", "Net3.rpt", "") err(ret) ret, result = et.ENgetcount(et.EN_LINKCOUNT) err(ret) print(("Network has ", result, " links.")) ret, result = et.ENgetcount(et.EN_NODECOUNT) err(ret) 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):
def openEPANET(INP): errcode = et.ENopen(INP, "BUFF.rpt", "") if (errcode > 100): print('error in open INP')
def copyInp(INP): errcode=et.ENopen(INP,"BUFF.rpt","") errcode=et.ENsaveinpfile(InpCopy) errcode=et.ENclose()
def open_EPANET(filename): ret = epa.ENopen(filename, filename[:-3] + 'rep', filename[:-3] + 'out')
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])
def setUp(self): print("SETUP!") self.file = os.path.join(os.path.dirname(simple.__file__), 'Net3.inp') self.Error(et.ENopen(self.file, "t.rpt", ""))
Tank_C = es_nodes['C'].index Tank_A = es_nodes['A'].index Tank_D = es_nodes['D'].index Tank_B = es_nodes['B'].index Tank_E = es_nodes['E'].index Tank_F = es_nodes['F'].index ''' Simulation ''' import os from random import randint from epanettools import epanet2 as et from epanettools.examples import simple file = os.path.join(os.path.dirname(simple.__file__), 'richmondNet_1.inp') ret = et.ENopen(file, "richmondNet_1.rpt", "") time = [] Pump_status_1A = [] Pump_status_2A = [] Pump_status_3A = [] Pump_status_4B = [] Pump_status_5C = [] Pump_status_6D = [] Pump_status_7F = [] Tank_level_A = [] Tank_level_B = [] Tank_level_C = [] Tank_level_D = [] Tank_level_E = [] Tank_level_F = []
def open_epanet_file(self): ret = epa.ENopen(self.filename, self.filename[:-3] + 'rep', self.filename[:-3] + 'out')
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)
'EN_PRESSURE'] #this gives the water level of the tank for each increment for i in range(0, 27): print("%.3f" % es.network.nodes['C'].results[pressure][i]) print("%.3f" % es.network.nodes['A'].results[pressure][i]) print("%.3f \n" % es.network.nodes['D'].results[pressure][i]) es._close ''' Simulation ''' import os from random import randint from epanettools import epanet2 as et from epanettools.examples import simple file = os.path.join(os.path.dirname(simple.__file__), 'richmondNet_1.inp') ret = et.ENopen(file, "richmondNet.rpt_1", "") time = [] Pump_status_1A = [] Pump_status_2A = [] Pump_status_3A = [] Pump_status_4B = [] Pump_status_5C = [] Pump_status_6D = [] Pump_status_7F = [] Tank_level_A = [] Tank_level_B = [] Tank_level_C = [] Tank_level_D = [] Tank_level_E = [] Tank_level_F = []