def updateResult(self): self.hyd_simulation() #########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######### for index in range(self.demand_dim): [errcode, pressure] = et.ENgetnodevalue(index + 1, et.EN_PRESSURE) self.cali_nodal_p.append(pressure) for index in range(Number_PIPES): [errcode, flow] = et.ENgetlinkvalue(index + 1, et.EN_FLOW) self.cali_pipe_f.append(flow) self.getResidul()
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 populate(self, conf: ComponentConfig, node_types=[et.EN_JUNCTION], thresholds=(20, 40), motor_repair=25200, elec_repair=14400, pipe_repair=316800): for i in range(1, et.ENgetcount(et.EN_NODECOUNT)[1] + 1): self.nodes.append(Node(i)) # self.nodes.append(Node(i, # self.years, # thresholds[0], # thresholds[1])) for i in range(1, et.ENgetcount(et.EN_LINKCOUNT)[1] + 1): link_type = et.ENgetlinktype(i)[1] if link_type in [et.EN_PIPE, et.EN_CVPIPE]: rough = et.ENgetlinkvalue(i, et.EN_ROUGHNESS)[1] if rough > 140: self.pipes.append(Pipe(i, self.timestep, LinkType('iron'))) self.pipes[-1].exp = Exposure(*conf.exp_vals("iron", i)) else: self.pipes.append(Pipe(i, self.timestep, LinkType('pvc'))) self.pipes[-1].exp = Exposure(*conf.exp_vals("pvc", i)) self.pipes[-1].status = Status(pipe_repair) elif link_type == et.EN_PUMP: self.pumps.append(Pump(i, self.timestep, LinkType('pump'))) self.pumps[-1].exp_elec = Exposure(*conf.exp_vals("elec", i)) self.pumps[-1].exp_motor = Exposure(*conf.exp_vals("motor", i)) self.pumps[-1].status_elec = Status(elec_repair) self.pumps[-1].status_motor = Status(motor_repair)
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 read_results_from_epanet(self): #### Returning the head solutions (for the first time step, the only one accessible at the moment) 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) ret, P0 = epa.ENgetnodevalue(index, epa.EN_PRESSURE) ret, Demand = epa.ENgetnodevalue(index, epa.EN_DEMAND) 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].P_0 = float(P0) self.node_idx[idx].TranH = [float(H0)] self.node_idx[idx].demand = float(Demand) / 1000. 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) ret, Roughness = epa.ENgetlinkvalue(index, epa.EN_ROUGHNESS) #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 except: print 'Problem getting Flow or Velocity for link:', idx try: self.link_idx[idx].V_0 = float(V0) except: print 'Problem getting Velocity for link:', idx try: self.link_idx[idx].FF_0 = float(2 * 9.81 * (Headloss / 1000.) * Diameter / (Length * V0**2)) except: print 'Problem getting FF_0 for link:', idx try: self.link_idx[idx].roughness = Roughness except: print 'Problem getting Roughness for link:', idx try: self.link_idx[idx].headloss = Headloss except: print 'Problem getting Headloss for link:', idx
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 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 getSensorValue(self): self.hyd_simulation() 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.measured_sim['Res'] = Res self.measured_sim['P'] = P #Save the simulated sensor pressure self.measured_sim['F'] = F #Save the simulated sensor flow
if t % 3600 != 0: ret, tstep = et.ENnextH() if (tstep <= 0): break else: time.append(t) #play with pump status to obtain diferent water level curves ret = et.ENsetlinkvalue(Pump1, et.EN_STATUS, p_status_1[inc]) ret = et.ENsetlinkvalue(Pump2, et.EN_STATUS, p_status_2[inc]) ret, T1 = et.ENgetnodevalue(Tank1, et.EN_PRESSURE) ret, T2 = et.ENgetnodevalue(Tank2, et.EN_PRESSURE) ret, T3 = et.ENgetnodevalue(Tank3, et.EN_PRESSURE) ret, P1 = et.ENgetlinkvalue(Pump1, et.EN_STATUS) ret, P2 = et.ENgetlinkvalue(Pump2, et.EN_STATUS) Pump_status1.append(P1) Pump_status2.append(P2) Tank_level1.append(T1) Tank_level2.append(T2) Tank_level3.append(T3) ret, tstep = et.ENnextH() inc = inc + 1 if (tstep <= 0): break ret = et.ENcloseH() import matplotlib.pyplot as plt import numpy as np
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) # 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() a=et.ENsetlinkvalue(nlinks,et.EN_STATUS,1) a,b=et.ENgetlinkvalue(nlinks,et.EN_STATUS) pump.append(b) if (tstep<=0): break ret=et.ENcloseH() print([round(x,4) for x in pres[94]]) for i in range(0,len(time)): print(time[i]/3600) print(pump[i]) #pumps id is 10 and 335
ret = et.ENsetlinkvalue(Pump_1A, et.EN_STATUS, Pump_status_1A_2[inc]) ret = et.ENsetlinkvalue(Pump_2A, et.EN_STATUS, p_status_2A[inc]) ret = et.ENsetlinkvalue(Pump_3A, et.EN_STATUS, p_status_3A[inc]) ret = et.ENsetlinkvalue(Pump_4B, et.EN_STATUS, Pump_status_4B_2[inc]) ret = et.ENsetlinkvalue(Pump_5C, et.EN_STATUS, Pump_status_5C_2[inc]) ret = et.ENsetlinkvalue(Pump_6D, et.EN_STATUS, Pump_status_6D_2[inc]) ret = et.ENsetlinkvalue(Pump_7F, et.EN_STATUS, Pump_status_7F_2[inc]) ret, TA = et.ENgetnodevalue(Tank_A, et.EN_PRESSURE) ret, P1A = et.ENgetlinkvalue(Pump_1A, et.EN_STATUS) ret, P2A = et.ENgetlinkvalue(Pump_2A, et.EN_STATUS) ret, P3A = et.ENgetlinkvalue(Pump_3A, et.EN_STATUS) ret, TB = et.ENgetnodevalue(Tank_B, et.EN_PRESSURE) ret, P4B = et.ENgetlinkvalue(Pump_4B, et.EN_STATUS) ret, TC = et.ENgetnodevalue(Tank_C, et.EN_PRESSURE) ret, P5C = et.ENgetlinkvalue(Pump_5C, et.EN_STATUS) ret, TD = et.ENgetnodevalue(Tank_D, et.EN_PRESSURE) ret, P6D = et.ENgetlinkvalue(Pump_6D, et.EN_STATUS) ret, TE = et.ENgetnodevalue(Tank_E, et.EN_PRESSURE) ret, TF = et.ENgetnodevalue(Tank_F, et.EN_PRESSURE)
ret = et.ENsetlinkvalue(Pump_1A, et.EN_STATUS, p_status_1A[inc]) ret = et.ENsetlinkvalue(Pump_2A, et.EN_STATUS, p_status_2A[inc]) ret = et.ENsetlinkvalue(Pump_3A, et.EN_STATUS, p_status_3A[inc]) ret = et.ENsetlinkvalue(Pump_4B, et.EN_STATUS, p_status_4B[inc]) ret = et.ENsetlinkvalue(Pump_5C, et.EN_STATUS, p_status_5C[inc]) ret = et.ENsetlinkvalue(Pump_6D, et.EN_STATUS, p_status_6D[inc]) ret = et.ENsetlinkvalue(Pump_7F, et.EN_STATUS, p_status_7F[inc]) ret, TA = et.ENgetnodevalue(Tank_A, et.EN_PRESSURE) ret, TB = et.ENgetnodevalue(Tank_B, et.EN_PRESSURE) ret, TC = et.ENgetnodevalue(Tank_C, et.EN_PRESSURE) ret, TD = et.ENgetnodevalue(Tank_D, et.EN_PRESSURE) ret, TE = et.ENgetnodevalue(Tank_E, et.EN_PRESSURE) ret, TF = et.ENgetnodevalue(Tank_F, et.EN_PRESSURE) ret, P1A = et.ENgetlinkvalue(Pump_1A, et.EN_STATUS) ret, P2A = et.ENgetlinkvalue(Pump_2A, et.EN_STATUS) ret, P3A = et.ENgetlinkvalue(Pump_3A, et.EN_STATUS) ret, P4B = et.ENgetlinkvalue(Pump_4B, et.EN_STATUS) ret, P5C = et.ENgetlinkvalue(Pump_5C, et.EN_STATUS) ret, P6D = et.ENgetlinkvalue(Pump_6D, et.EN_STATUS) ret, P7F = et.ENgetlinkvalue(Pump_7F, et.EN_STATUS) #ret,TF2=et2.ENgetnodevalue(Tank_F, et.EN_PRESSURE ) #print('TF={} and TF2={}, the distubarnce=TF-TF2={} '.format(TF, TF2,TF-TF2)) #d.append(TF-TF2) #ret,E7F=et.ENgetlinkvalue(Pump_7F,et.EN_ENERGY) #print(E7F) Tank_level_A.append(TA)