Module hydroinform.hyimport2

Source code
# -*- coding: utf-8 -*-
import codecs
import numpy as np
from hydroinform import DFS
from hydroinform import Mike_river
from hydroinform import hymod
from operator import attrgetter


class Res1DReader(object):
    """This class reads data from a Res1d file and returns a Hymod reach network"""
    def __init__(self, Res1DFileName):
        self.res1d=Mike_river.River_setup()
        self.res1d.read_res1d(Res1DFileName)
        self.number_of_time_steps = self.res1d.res.number_of_time_steps

    def getHymodNetwork(self):
        """
        Gets a hymod reach network from the res1d file
        """
        reach_network = hymod.Reach_network()

        reach_dic={}

        for r in self.res1d.reaches:
            #We only create a new reach if we do not already have a reach with that name. Otherwise we merge. TODO: Make TopoID count
            if r.name not in reach_dic:
                reach_dic[r.name]= hymod.Reach(r.name)
                reach_network.reaches.append(reach_dic[r.name])
            reach = reach_dic[r.name]
            reach.description = r.topo_id
            for xs in r.xsecs:
                if not any(x.chainage==-xs.Gridpoint.chainage for x in reach.xss): #We can only add one xsecs at the same chainage
                    xsec = hymod.Xs(name=xs.name)
                    xsec.radius_type = 'resistance radius'
                    xsec.chainage = -xs.Gridpoint.chainage
                    xsec.x = xs.Gridpoint.x
                    xsec.y = xs.Gridpoint.y
                    xsec.z= min(xs.xsec_points, key=attrgetter('z')).z
                    for pp in xs.xsec_points:
                        xsec.pps.append(hymod.Pp(pp.x, pp.z-xsec.z))
                    reach.xss.append(xsec)
                    reach.riverPoints.append(hymod.RiverPoint(xsec.chainage, xs.Gridpoint.x, xs.Gridpoint.y))
            for dp in r.digi_points:
                reach.riverPoints.append(hymod.RiverPoint(-dp.chainage, dp.x, dp.y))
           
            downstreamReaches = (dr for dr in self.res1d.reaches if dr.upstream_node==r.downstream_node)
            for dr in downstreamReaches:
                if(dr.name != r.name):
                    reach_network.connections.append(hymod.Connection(r.name, dr.name, -dr.grid_points[0].chainage))

        #Sort and remove duplicate points in reaches
        for hr in reach_network.reaches:
            hr.riverPoints = list(set(hr.riverPoints)) #To remove duplicate points
            hr.riverPoints.sort(key=lambda rp: rp.chainage) #Now sort
            hr.xss.sort(key=lambda rp: rp.chainage) #Also sort xsecs
            hr.update_perimeter_points_xy_coords(rotate180=True)

        hymod.Tools.RemoveUnnecessaryPerimeterPoints(reach_network)

        return reach_network

    def setQandH(self, reaches=[], Time=1):
        """
        Takes a list of hymod reaches and sets Q and H. Matches on reach name and interpolates on chainage
        H is added to the observations. Clear observations first if necessary.
        """
        qitem = next(i for i in self.res1d.DataItems if i.name =='Discharge')
        hitem = next(i for i in self.res1d.DataItems if i.name =='Water level' and i.grouptype==2)
        
        #Reads the data from the res1d-file
        Hdata=self.res1d.get_values(hitem.ItemIndex+1, Time)
        Qdata=self.res1d.get_values(qitem.ItemIndex+1, Time)

        for r in reaches:
            del r.observations[:]
            if r.name in Hdata:
                for chainageH in Hdata[r.name]:
                    r.observations.append((-chainageH[0], chainageH[1]))

            if r.name in Qdata:
                chains = [c[0] for c in Qdata[r.name]]
                qs = [c[1] for c in Qdata[r.name]]
                for xs in r.xss:
                    xs.flow =np.interp(-xs.chainage, chains, qs)

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        """
        Closes the res1d-file
        """
        self.res1d.dispose()

Classes

class Res1DReader (Res1DFileName)

This class reads data from a Res1d file and returns a Hymod reach network

Source code
class Res1DReader(object):
    """This class reads data from a Res1d file and returns a Hymod reach network"""
    def __init__(self, Res1DFileName):
        self.res1d=Mike_river.River_setup()
        self.res1d.read_res1d(Res1DFileName)
        self.number_of_time_steps = self.res1d.res.number_of_time_steps

    def getHymodNetwork(self):
        """
        Gets a hymod reach network from the res1d file
        """
        reach_network = hymod.Reach_network()

        reach_dic={}

        for r in self.res1d.reaches:
            #We only create a new reach if we do not already have a reach with that name. Otherwise we merge. TODO: Make TopoID count
            if r.name not in reach_dic:
                reach_dic[r.name]= hymod.Reach(r.name)
                reach_network.reaches.append(reach_dic[r.name])
            reach = reach_dic[r.name]
            reach.description = r.topo_id
            for xs in r.xsecs:
                if not any(x.chainage==-xs.Gridpoint.chainage for x in reach.xss): #We can only add one xsecs at the same chainage
                    xsec = hymod.Xs(name=xs.name)
                    xsec.radius_type = 'resistance radius'
                    xsec.chainage = -xs.Gridpoint.chainage
                    xsec.x = xs.Gridpoint.x
                    xsec.y = xs.Gridpoint.y
                    xsec.z= min(xs.xsec_points, key=attrgetter('z')).z
                    for pp in xs.xsec_points:
                        xsec.pps.append(hymod.Pp(pp.x, pp.z-xsec.z))
                    reach.xss.append(xsec)
                    reach.riverPoints.append(hymod.RiverPoint(xsec.chainage, xs.Gridpoint.x, xs.Gridpoint.y))
            for dp in r.digi_points:
                reach.riverPoints.append(hymod.RiverPoint(-dp.chainage, dp.x, dp.y))
           
            downstreamReaches = (dr for dr in self.res1d.reaches if dr.upstream_node==r.downstream_node)
            for dr in downstreamReaches:
                if(dr.name != r.name):
                    reach_network.connections.append(hymod.Connection(r.name, dr.name, -dr.grid_points[0].chainage))

        #Sort and remove duplicate points in reaches
        for hr in reach_network.reaches:
            hr.riverPoints = list(set(hr.riverPoints)) #To remove duplicate points
            hr.riverPoints.sort(key=lambda rp: rp.chainage) #Now sort
            hr.xss.sort(key=lambda rp: rp.chainage) #Also sort xsecs
            hr.update_perimeter_points_xy_coords(rotate180=True)

        hymod.Tools.RemoveUnnecessaryPerimeterPoints(reach_network)

        return reach_network

    def setQandH(self, reaches=[], Time=1):
        """
        Takes a list of hymod reaches and sets Q and H. Matches on reach name and interpolates on chainage
        H is added to the observations. Clear observations first if necessary.
        """
        qitem = next(i for i in self.res1d.DataItems if i.name =='Discharge')
        hitem = next(i for i in self.res1d.DataItems if i.name =='Water level' and i.grouptype==2)
        
        #Reads the data from the res1d-file
        Hdata=self.res1d.get_values(hitem.ItemIndex+1, Time)
        Qdata=self.res1d.get_values(qitem.ItemIndex+1, Time)

        for r in reaches:
            del r.observations[:]
            if r.name in Hdata:
                for chainageH in Hdata[r.name]:
                    r.observations.append((-chainageH[0], chainageH[1]))

            if r.name in Qdata:
                chains = [c[0] for c in Qdata[r.name]]
                qs = [c[1] for c in Qdata[r.name]]
                for xs in r.xss:
                    xs.flow =np.interp(-xs.chainage, chains, qs)

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        """
        Closes the res1d-file
        """
        self.res1d.dispose()

Methods

def getHymodNetwork(self)

Gets a hymod reach network from the res1d file

Source code
def getHymodNetwork(self):
    """
    Gets a hymod reach network from the res1d file
    """
    reach_network = hymod.Reach_network()

    reach_dic={}

    for r in self.res1d.reaches:
        #We only create a new reach if we do not already have a reach with that name. Otherwise we merge. TODO: Make TopoID count
        if r.name not in reach_dic:
            reach_dic[r.name]= hymod.Reach(r.name)
            reach_network.reaches.append(reach_dic[r.name])
        reach = reach_dic[r.name]
        reach.description = r.topo_id
        for xs in r.xsecs:
            if not any(x.chainage==-xs.Gridpoint.chainage for x in reach.xss): #We can only add one xsecs at the same chainage
                xsec = hymod.Xs(name=xs.name)
                xsec.radius_type = 'resistance radius'
                xsec.chainage = -xs.Gridpoint.chainage
                xsec.x = xs.Gridpoint.x
                xsec.y = xs.Gridpoint.y
                xsec.z= min(xs.xsec_points, key=attrgetter('z')).z
                for pp in xs.xsec_points:
                    xsec.pps.append(hymod.Pp(pp.x, pp.z-xsec.z))
                reach.xss.append(xsec)
                reach.riverPoints.append(hymod.RiverPoint(xsec.chainage, xs.Gridpoint.x, xs.Gridpoint.y))
        for dp in r.digi_points:
            reach.riverPoints.append(hymod.RiverPoint(-dp.chainage, dp.x, dp.y))
       
        downstreamReaches = (dr for dr in self.res1d.reaches if dr.upstream_node==r.downstream_node)
        for dr in downstreamReaches:
            if(dr.name != r.name):
                reach_network.connections.append(hymod.Connection(r.name, dr.name, -dr.grid_points[0].chainage))

    #Sort and remove duplicate points in reaches
    for hr in reach_network.reaches:
        hr.riverPoints = list(set(hr.riverPoints)) #To remove duplicate points
        hr.riverPoints.sort(key=lambda rp: rp.chainage) #Now sort
        hr.xss.sort(key=lambda rp: rp.chainage) #Also sort xsecs
        hr.update_perimeter_points_xy_coords(rotate180=True)

    hymod.Tools.RemoveUnnecessaryPerimeterPoints(reach_network)

    return reach_network
def setQandH(self, reaches=[], Time=1)

Takes a list of hymod reaches and sets Q and H. Matches on reach name and interpolates on chainage H is added to the observations. Clear observations first if necessary.

Source code
def setQandH(self, reaches=[], Time=1):
    """
    Takes a list of hymod reaches and sets Q and H. Matches on reach name and interpolates on chainage
    H is added to the observations. Clear observations first if necessary.
    """
    qitem = next(i for i in self.res1d.DataItems if i.name =='Discharge')
    hitem = next(i for i in self.res1d.DataItems if i.name =='Water level' and i.grouptype==2)
    
    #Reads the data from the res1d-file
    Hdata=self.res1d.get_values(hitem.ItemIndex+1, Time)
    Qdata=self.res1d.get_values(qitem.ItemIndex+1, Time)

    for r in reaches:
        del r.observations[:]
        if r.name in Hdata:
            for chainageH in Hdata[r.name]:
                r.observations.append((-chainageH[0], chainageH[1]))

        if r.name in Qdata:
            chains = [c[0] for c in Qdata[r.name]]
            qs = [c[1] for c in Qdata[r.name]]
            for xs in r.xss:
                xs.flow =np.interp(-xs.chainage, chains, qs)