Пример #1
0
    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()
Пример #2
0
    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
Пример #3
0
    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)
Пример #4
0
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]
Пример #5
0
    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
Пример #7
0
    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()
Пример #8
0
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]
Пример #9
0
    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
Пример #12
0
            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)