Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

De koppeling tussen het 1D en 2D mesh gaat via de 1D2D links. Deze verbindingen zijn vergelijkbaar met de ‘normale’ flowlinks tussen 1D-rekenpunten en 2D-rekenpunten: de volledige stromingsvergelijking met momentum worden opgelost. De link wordt dus niet gesimuleerd met een overlaatvergelijking, zoals dit bij SOBEK gebeurde. Dit is overigens in D-Hydro HYDRO wel mogelijk door een landboundary de te specificeren die de 1D2D-link kruist.

Het genereren van de linkjes met D-Hydamo HyDAMO gaat met de functies generatelinks1d2d_add_links_1d_to_2d en generate, links1d2d_add_links_2d_to_1d_embedded en links1d2d_add_links_2d_to_1d_lateral. De eerste functie probeert links te leggen vanuit elk 1D rekenpunt een koppeling met een 2D cell te leggen, de tweede omgekeerd.de 1D rekenpunten naar de 2D cellen; de tweede en derde functie doen dat omgekeerd. Deze functies zijn in principe in combinatie te gebruiken. Voor ‘Embedded’ en “Lateral” links zou dat wel logisch zijn. Deze combinaties zijn echter nog niet grondig getest.

Hieronder geven we meer infomatie over de mogelijkheden van elk van de drie functies, en geven we fictieve voorbeelden van het gebruik ervan.

De functie generatelinks1d2d_add_links_1d_to_2dbiedt de mogelijkheid om linkjes te genereren met een maximale lengte, en op specifieke takken. De codedocumentatie licht toe hoe de functie te gebruiken.

Code Block
def generatedef links1d2d_add_links_1d_to_2d(self, max_distance=
    network: Network,
    branchids: List[str] = None,
    within: Union[Polygon, MultiPolygon] = None,
    max_length: float = np.inf, branchid=None):
    """
    Generate 1d2d links from 1d nodes. Each 1d node is connected to
    the nearest 2d cell. A maximum distance can be specified to remove links
    that are too long. Also the branchid can be specified, if you only want
    to generate links from certain 1d branches.

    Parameters
    ----------
    max_distance : int, float
        The maximum length of a link. All longer links are removed.
    branchid : str or list
        ID's of branches for which the connection from 1d to 2d is made.
    """

...


) -> None:
    """Function to add 1d2d links to network, by generating them from 1d to 2d.
    Branchids can be specified for 1d branches that need to be linked.
    A (Multi)Polygon can be provided were links should be made.

    Args:
        network (Network): Network in which the connections are made
        branchids (List[str], optional): List of branchid's to connect. If None, all branches are connected. Defaults to None.
        within (Union[Polygon, MultiPolygon], optional): Area within which connections are made. Defaults to None.
        max_length (float, optional): Max edge length. Defaults to None.
    """

Het volgende voorbeeld licht de toepassing toe. Eerst wordt een 1d branch (rode lijn) en een 2d raster (blauw raster) gemaakt. Vervolgens worden via het optionele ‘within’ polygon (het groene gebied) 1d2d linkjes gemaakt vanaf de rekenpunten naar de dichtstbijzijnde 2d-cellen. Dat gebeurt dus alleen voor rekenpunten die binnen het groene gebied vallen. Als geen 'within' argument wordt opgegeven worden links gegenereeerd vanaf alle rekenpunten langs de rode lijn.

Code Block
# generate 1d
branch = LineString([[-9, -3], [0, 4]])
branchids = mesh.mesh1d_add_branch_from_linestring(network, branch, node_distance=1)
# Generate 2d
areas = MultiPolygon([box(-8, -10, 8, -2), box(-8, 2, 8, 10)])
hole = box(-6, -6, 6, -4)
mesh.mesh2d_add_rectilinear(network, areas, dx=0.5, dy=0.5)
mesh.mesh2d_clip(network, hole)
within = box(-10, -10, 12, 10).difference(
     LineString([[-2, -10], [2, 10]]).buffer(2)
)
mesh.links1d2d_add_links_1d_to_2d(network, within=within)

Image Added

De functie links1d2d_add_links_2d_to_1d_embedded biedt de mogelijkheid om van 2D naar 1D te genereren. Hierin wordt onderscheidt gemaakt tussen links tussen:

...

In dit geval worden links gelegd naar cellen die het 1D-netwerk kruisen (de watergangen zijn niet uitgeknipt). Dit is vaak in het geval

...

bij kleine watergangen. Per 2d cel wordt een link gelegd naar de 1d cel(len) die het kruist.

Code Block
def links1d2d_add_links_2d_to_1d_embedded(
    network: Network,
    branchids: List[str] = None,
    within: Union[Polygon, MultiPolygon] = None,
) -> None:
    """Generates links from 2d to 1d, where the 2d mesh intersects the 1d mesh: the 'embedded' links.

    To find the intersecting cells in an efficient way, we follow we the next steps. 1) Get the
    maximum length of a face edge. 2) Buffer the branches with this length. 3) Find all face nodes
    within this buffered geometry. 4) Check for each of the corresponding faces if it crossed the
    branches.

    Args:
        network (Network): Network in which the links are made. Should contain a 1d and 2d mesh
        branchids (List[str], optional): List is branch id's for which the connections are made. Defaults to None.
        within (Union[Polygon, MultiPolygon], optional): Clipping polygon for 2d mesh that is. Defaults to None.

    """

Hetzelfde voorbeeld als bij de links van 1d naar 2d wordt hieronder gegeven voor de variant van 2d naar 1d met overlappende cellen.

Code Block
# generate 1d
branch = LineString([[-9, -3], [0, 4]])
branchids = mesh.mesh1d_add_branch_from_linestring(network, branch, node_distance=1)
# Generate 2d
areas = MultiPolygon([box(-8, -10, 8, -2), box(-8, 2, 8, 10)])
hole = box(-6, -6, 6, -4)
mesh.mesh2d_add_rectilinear(network, areas, dx=0.5, dy=0.5)
mesh.mesh2d_clip(network, hole)
within = box(-10, -10, 12, 10).difference(
     LineString([[-2, -10], [2, 10]]).buffer(2)
)
mesh.links1d2d_add_links_2d_to_1d_embedded(network, within=within)
Image Added

De functie links1d2d_add_links_2d_to_1d_lateral biedt de eveneens de mogelijkheid om van 2D naar 1D te genereren. In dit geval wordt dit alleen gedaan bij niet-overlappende cellen. De meshes liggen naast elkaar, vaak in het geval van grotere watergangen en riviertakken. In dit geval kan niet op basis van overlap een link worden gelegd, dus wordt er gezocht naar de dichtstbijzijnde 1d cel, vanuit

...

2d

...

. Om te zorgen dat alleen cellen direct naast de watergang een verbinding krijgen worden alle verbindingen die een andere 2d-cel kruisen verwijderd.

...

De codedocumentatie biedt meer informatie over het gebruik van de functie.

...

Code Block
languagepy
def generatelinks1d2d_add_links_2d_to_1d(self, max_distance=np.inf, intersecting=True, branchid=None):
    """
    _lateral(
    network: Network,
    dist_factor: Union[float, None] = 2.0,
    branchids: List[str] = None,
    within: Union[Polygon, MultiPolygon] = None,
    max_length: float = np.inf,
) -> None:
    """Generate 1d2d links from the 2d cells. A maximum distance can be specified
    to remove links that are too long. Also a branchid can be specified to only
    generate links to certain branches.
    
    In case of a 1D and 2D grid that is on top of each other the user might want
    to generate links only for intersecting cells, where in case of non-overlapping meshes
    the use might want to use the shortest distance. This behaviour can be specified with
    the option intersecting:
    1. intersecting = True: each 2d cell crossing a 1d branch segment is connected to
        the nearest 1d cell.
    2. intersecting = False: each 2d cell is connected to the nearest 1d cell,
        If the link crosses another cell it is removed.
    In case of option 2. setting a max distance will speed up the the process a bit.

    Parameters
    ----------
    max_distance : int, float
        Maximum allowed length for a link
    intersecting : bool
        Make connections for intersecting 1d and 2d cells or based on
        nearest neighbours
    branchid : str or list of str
        Generate only to specified 1d branches
    """
 mesh to the 1d mesh, with a lateral connection.
    If a link is kept, is determined based on the distance between the face center and
    the intersection with the 2d mesh exterior. By default, links with an intersection
    distance larger than 2 times the center to edge distance of the cell, are removed.
    Note that for a square cell with a direct link out of the cell (without passing any
    other cells) this max distance is sqrt(2) = 1.414. The default value of 2 provides
    some flexibility. Note that a link with more than 1 intersection with the 2d mesh
    boundary is removed anyway.

    Furthermore:
    - Branch ids can be specified to connect only specific branches.
    - A 'within' polygon can be given to only connect 2d cells within this polygon.
    - A max link length can be given to limit the link length.

    Args:
        network (Network): Network in which the links are made. Should contain a 1d and 2d mesh
        dist_factor (Union[float, None], optional): Factor to determine which links are kept (see description above). Defaults to 2.0.
        branchids (List[str], optional): List is branch id's for which the conncetions are made. Defaults to None.
        within (Union[Polygon, MultiPolygon], optional): Clipping polygon for 2d mesh that is. Defaults to None.
        max_length (float, optional): Max edge length. Defaults to None.
    """

Hieronder staat hetzelfde voorbeeld als hierboven, maar nu voor 2d-naar-1d links zonder overlap. Omdat de links vanuit 2d worden gegenereerd zijn er meerdere 2d cellen verbonden met één 1d rekenpunt.

Code Block
# generate 1d
branch = LineString([[-9, -3], [0, 4]])
branchids = mesh.mesh1d_add_branch_from_linestring(network, branch, node_distance=1)
# Generate 2d
areas = MultiPolygon([box(-8, -10, 8, -2), box(-8, 2, 8, 10)])
hole = box(-6, -6, 6, -4)
mesh.mesh2d_add_rectilinear(network, areas, dx=0.5, dy=0.5)
mesh.mesh2d_clip(network, hole)
within = box(-10, -10, 12, 10).difference(
     LineString([[-2, -10], [2, 10]]).buffer(2)
)
mesh.links1d2d_add_links_2d_to_1d_lateral(network, within=within)
Image Added

Via onderstaande functie kunnen links die zijn aangemaakt binnen een bepaald polygon weer worden verwijderd.

Code Block
def links1d2d_remove_within(
    network: Network, within: Union[Polygon, MultiPolygon]
) -> None:
    """Remove 1d2d links within a given polygon or multipolygon

    Args:
        network (Network): The network from which the links are removed
        within (Union[Polygon, MultiPolygon]): The polygon that indicates which to remove
    """

1d2d links die zijn aangemaakt op een uiteinde van het netwerk moeten ook worden verwijderd omdat anders randvoorwaarden op die punten niet goed werken,. Gebruik darvoor onderstaande functie.

Code Block
def links1d2d_remove_1d_endpoints(network: Network) -> None:
    """Method to remove 1d2d links from end points of the 1d mesh. The GUI
    will interpret every endpoint as a boundary conditions, which does not
    allow a 1d 2d link at the same node. To avoid problems with this, use
    this metho