Source code for landlab.grid.unstructured.links

import numpy as np

from ...core.utils import as_id_array
from ...utils.jaggedarray import JaggedArray
from ..nodestatus import NodeStatus


def _split_link_ends(link_ends):
    """
    Examples
    --------
    >>> from landlab.grid.unstructured.links import _split_link_ends
    >>> _split_link_ends(((0, 1, 2), (3, 4, 5)))
    (array([0, 1, 2]), array([3, 4, 5]))
    >>> _split_link_ends([(0, 3), (1, 4), (2, 5)])
    (array([0, 1, 2]), array([3, 4, 5]))
    >>> _split_link_ends((0, 3))
    (array([0]), array([3]))
    """
    links = np.array(list(link_ends), ndmin=2, dtype=int)
    if len(links) != 2:
        links = links.transpose()

    if links.size == 0:
        return (np.array([], dtype=int), np.array([], dtype=int))
    else:
        return links[0], links[1]






















def _sort_links_by_node(node_at_link_ends, link_ids=None, sortby=0):
    sorted_links = np.argsort(node_at_link_ends[sortby], kind="stable")

    if link_ids is not None:
        return np.array(link_ids, dtype=int)[sorted_links]
    else:
        return as_id_array(sorted_links)














[docs] class LinkGrid: """Create a grid of links that enter and leave nodes. __init__((node0, node1), number_of_nodes=None) Parameters ---------- node0, node1 : sequence of array-like Node ID at link start and end. number_of_nodes : int, optional Number of nodes in the grid Returns ------- LinkGrid : A newly-created grid Examples -------- >>> from landlab.grid.unstructured.links import LinkGrid >>> lgrid = LinkGrid([(0, 1, 0, 2, 0), (2, 3, 1, 3, 3)], 4) >>> lgrid.number_of_links 5 >>> lgrid.number_of_nodes 4 >>> lgrid.number_of_in_links_at_node(0) 0 >>> lgrid.number_of_out_links_at_node(0) 3 >>> lgrid.out_link_at_node(0) array([0, 2, 4]) >>> lgrid.nodes_at_link_id(1) array([1, 3]) >>> lgrid = LinkGrid([(0, 1, 0, 2, 0), (2, 3, 1, 3, 3)], 4, link_ids=range(1, 6)) >>> lgrid.nodes_at_link array([[0, 2], [1, 3], [0, 1], [2, 3], [0, 3]]) >>> lgrid.out_link_at_node(0) array([1, 3, 5]) >>> lgrid.nodes_at_link_id(1) array([0, 2]) """
[docs] def __init__(self, link_ends, number_of_nodes, link_ids=None, node_status=None): """Create a grid of links that enter and leave nodes. __init__((node0, node1), number_of_nodes=None) Parameters ---------- node0, node1 : sequence of array-like Node ID at link start and end. number_of_nodes : int, optional Number of nodes in the grid Returns ------- LinkGrid : A newly-created grid Examples -------- >>> from landlab.grid.unstructured.links import LinkGrid >>> lgrid = LinkGrid([(0, 1, 0, 2, 0), (2, 3, 1, 3, 3)], 4) >>> lgrid.number_of_links 5 >>> lgrid.number_of_nodes 4 >>> lgrid.number_of_in_links_at_node(0) 0 >>> lgrid.number_of_out_links_at_node(0) 3 >>> lgrid.out_link_at_node(0) array([0, 2, 4]) >>> lgrid.nodes_at_link_id(1) array([1, 3]) >>> lgrid = LinkGrid( ... [(0, 1, 0, 2, 0), (2, 3, 1, 3, 3)], 4, link_ids=range(1, 6) ... ) >>> lgrid.nodes_at_link array([[0, 2], [1, 3], [0, 1], [2, 3], [0, 3]]) >>> lgrid.out_link_at_node(0) array([1, 3, 5]) >>> lgrid.nodes_at_link_id(1) array([0, 2]) """ link_ends = _split_link_ends(link_ends) self._in_link_at_node = JaggedArray( *in_link_ids_at_node( link_ends, link_ids=link_ids, number_of_nodes=number_of_nodes ) ) self._out_link_at_node = JaggedArray( *out_link_ids_at_node( link_ends, link_ids=link_ids, number_of_nodes=number_of_nodes ) ) self._link_ends = np.array(link_ends) if link_ids is not None: self._link_id_map = dict(zip(link_ids, range(len(link_ids)))) self._link_ids = link_ids self._number_of_links = len(link_ends[0]) self._number_of_nodes = number_of_nodes self._node_status = node_status
@property def number_of_links(self): """Number of links in the grid.""" return self._number_of_links @property def number_of_nodes(self): """Number of nodes in the grid.""" return self._number_of_nodes @property def node_at_link_start(self): return self._link_ends[0] @property def node_at_link_end(self): return self._link_ends[1] @property def nodes_at_link(self): return self._link_ends.T @property def link_id(self): try: return self._link_ids except AttributeError: return np.arange(self.number_of_links)
[docs] def iter_nodes(self): """Iterate of the nodes of the grid. Returns ------- ndarray : Links entering and leaving each node Examples -------- >>> from landlab.grid.unstructured.links import LinkGrid >>> lgrid = LinkGrid([(0, 1, 0, 2), (2, 3, 1, 3)], 4) >>> for link in lgrid.iter_nodes(): ... link ... array([0, 2]) array([2, 1]) array([0, 3]) array([1, 3]) """ for node in range(self.number_of_nodes): yield np.concatenate( (self.in_link_at_node(node), self.out_link_at_node(node)) )
@property def node_status_at_link_start(self): return self._node_status[self.node_at_link_start] @property def node_status_at_link_end(self): return self._node_status[self.node_at_link_end]