예제 #1
0
def test_graph_is_frozen():
    graph = UniformRectilinearGraph((3, 4))

    assert_array_equal(
        graph.nodes_at_link,
        [
            [0, 1],
            [1, 2],
            [2, 3],
            [0, 4],
            [1, 5],
            [2, 6],
            [3, 7],
            [4, 5],
            [5, 6],
            [6, 7],
            [4, 8],
            [5, 9],
            [6, 10],
            [7, 11],
            [8, 9],
            [9, 10],
            [10, 11],
        ],
    )

    with raises(ValueError):
        graph.nodes_at_link[0] = [1, 0]
예제 #2
0
def test_graph_can_thaw():
    graph = UniformRectilinearGraph((3, 4))

    assert_array_equal(
        graph.nodes_at_link,
        [
            [0, 1],
            [1, 2],
            [2, 3],
            [0, 4],
            [1, 5],
            [2, 6],
            [3, 7],
            [4, 5],
            [5, 6],
            [6, 7],
            [4, 8],
            [5, 9],
            [6, 10],
            [7, 11],
            [8, 9],
            [9, 10],
            [10, 11],
        ],
    )

    with graph.thawed():
        graph.nodes_at_link[0] = [1, 0]

    assert_array_equal(
        graph.nodes_at_link,
        [
            [1, 0],
            [1, 2],
            [2, 3],
            [0, 4],
            [1, 5],
            [2, 6],
            [3, 7],
            [4, 5],
            [5, 6],
            [6, 7],
            [4, 8],
            [5, 9],
            [6, 10],
            [7, 11],
            [8, 9],
            [9, 10],
            [10, 11],
        ],
    )
예제 #3
0
def dataset_from_bmi_uniform_rectilinear(bmi, grid_id):
    from landlab.graph import UniformRectilinearGraph

    rank = bmi.get_grid_rank(grid_id)
    shape = bmi.get_grid_shape(grid_id)
    spacing = bmi.get_grid_spacing(grid_id)
    origin = bmi.get_grid_origin(grid_id)

    if rank < 1 or rank > 3:
        raise ValueError('uniform rectilinear grids must be rank 1, 2, or 3')

    attrs=OrderedDict([
        ('cf_role', 'grid_topology'),
        ('long_name',
         'Topology data of {rank}D structured quadrilateral'.format(rank=rank)),
        ('topology_dimension', rank),
        ('node_coordinates', ' '.join(coordinate_names(rank))),
        ('node_dimensions', ' '.join(index_names(rank))),
        ('node_spacing', 'node_spacing'),
        ('node_origin', 'node_origin'),
        ('type', 'structured_quad'),
    ])
    dataset = xr.Dataset(
        {'mesh': xr.DataArray(data=grid_id, attrs=attrs),
         'node_shape': xr.DataArray(data=shape, dims=('rank', )),
         'node_spacing': xr.DataArray(data=spacing, dims=('rank', )),
         'node_origin': xr.DataArray(data=origin, dims=('rank', )),
        })

    coords = []
    for dim in range(rank):
        coords.append(np.arange(shape[dim], dtype=float) * spacing[dim] +
                      origin[dim])

    coords_at_node = np.meshgrid(*coords, indexing='ij')

    for axis, name in enumerate(COORDINATE_NAMES[-rank:]):
        dataset = dataset.update({
            'node_' + name: xr.DataArray(
                data=coords_at_node[axis].reshape(-1), dims=('n_node', ),
                attrs={'standard_name': name, 'units': 'm'})
        })

    if rank == 2:
        graph = UniformRectilinearGraph(shape, spacing=spacing, origin=origin)

        dataset = dataset.update({
            'face_node_connectivity': xr.DataArray(
                data=graph.nodes_at_patch.reshape((-1 ,)),
                dims=('n_vertices', ),
                attrs={'standard_name': 'Face-node connectivity'})
        })
        dataset = dataset.update({
            'face_node_offset': xr.DataArray(
                data=np.arange(1, graph.number_of_patches + 1, dtype=np.int32) * 4,
                dims=('n_faces', ),
                attrs={'standard_name': 'Offset to face-node connectivity'})
        })

    return dataset
예제 #4
0
def test_nodes():
    graphs = (
        UniformRectilinearGraph((3, 4)),
        StructuredQuadGraph((
            [[0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 1.0, 1.0], [2.0, 2.0, 2.0, 2.0]],
            [[0.0, 1.0, 2.0, 3.0], [0.0, 1.0, 2.0, 3.0], [0.0, 1.0, 2.0, 3.0]],
        )),
        RectilinearGraph(([0.0, 1.0, 2.0], [0.0, 1.0, 2.0, 3.0])),
    )

    for graph in graphs:
        assert_array_equal(graph.nodes,
                           [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]])
        with raises(ValueError):
            graph.nodes[0, 0] = 99
예제 #5
0
    def __init__(self, *args):
        super(UniformRectilinear, self).__init__(*args)

        if self.ndim < 1 or self.ndim > 3:
            raise ValueError(
                "uniform_rectangular grid must be rank 1, 2, or 3")

        shape = self.bmi.grid_shape(self.grid_id)
        spacing = self.bmi.grid_spacing(self.grid_id)
        origin = self.bmi.grid_origin(self.grid_id)

        self.metadata = OrderedDict([
            ("cf_role", "grid_topology"),
            (
                "long_name",
                "Topology data of {}D structured quadrilateral".format(
                    self.ndim),
            ),
            ("topology_dimension", self.ndim),
            ("node_coordinates", " ".join(coordinate_names(self.ndim))),
            ("node_dimensions", " ".join(index_names(self.ndim))),
            ("node_spacing", "node_spacing"),
            ("node_origin", "node_origin"),
            ("type", self.grid_type),
        ])
        self.set_mesh()
        self.set_shape(shape)
        self.set_spacing(spacing)
        self.set_origin(origin)

        grid_coords = []
        for dim in range(self.ndim):
            grid_coords.append(
                np.arange(shape[dim], dtype=float) * spacing[dim] +
                origin[dim])
        self.set_nodes_rectilinear(grid_coords)

        graph = UniformRectilinearGraph(shape, spacing=spacing, origin=origin)

        self.set_connectivity(data=graph.nodes_at_patch.reshape((-1, )))
        self.set_offset(
            data=np.arange(1, graph.number_of_patches + 1, dtype=np.int32) * 4)
예제 #6
0
def test_link_dirs_at_node_raster():
    graph = UniformRectilinearGraph((4, 3))
    assert_array_equal(
        graph.link_dirs_at_node,
        [
            [-1, -1, 0, 0],
            [-1, -1, 1, 0],
            [0, -1, 1, 0],
            [-1, -1, 0, 1],
            [-1, -1, 1, 1],
            [0, -1, 1, 1],
            [-1, -1, 0, 1],
            [-1, -1, 1, 1],
            [0, -1, 1, 1],
            [-1, 0, 0, 1],
            [-1, 0, 1, 1],
            [0, 0, 1, 1],
        ],
    )
    assert graph.link_dirs_at_node.dtype == np.int8
예제 #7
0
def dataset_from_bmi_uniform_rectilinear(bmi, grid_id):
    from landlab.graph import UniformRectilinearGraph

    rank = bmi.get_grid_ndim(grid_id)
    shape = bmi.get_grid_shape(grid_id)
    spacing = bmi.get_grid_spacing(grid_id)
    origin = bmi.get_grid_origin(grid_id)

    if rank < 1 or rank > 3:
        raise ValueError("uniform rectilinear grids must be rank 1, 2, or 3")

    attrs = OrderedDict(
        [
            ("cf_role", "grid_topology"),
            (
                "long_name",
                "Topology data of {rank}D structured quadrilateral".format(rank=rank),
            ),
            ("topology_dimension", rank),
            ("node_coordinates", " ".join(coordinate_names(rank))),
            ("node_dimensions", " ".join(index_names(rank))),
            ("node_spacing", "node_spacing"),
            ("node_origin", "node_origin"),
            ("type", "structured_quad"),
        ]
    )
    dataset = xr.Dataset(
        {
            "mesh": xr.DataArray(data=grid_id, attrs=attrs),
            "node_shape": xr.DataArray(data=shape, dims=("rank",)),
            "node_spacing": xr.DataArray(data=spacing, dims=("rank",)),
            "node_origin": xr.DataArray(data=origin, dims=("rank",)),
        }
    )

    coords = []
    for dim in range(rank):
        coords.append(np.arange(shape[dim], dtype=float) * spacing[dim] + origin[dim])

    coords_at_node = np.meshgrid(*coords, indexing="ij")

    for axis, name in enumerate(COORDINATE_NAMES[-rank:]):
        dataset = dataset.update(
            {
                "node_"
                + name: xr.DataArray(
                    data=coords_at_node[axis].reshape(-1),
                    dims=("node",),
                    attrs={"standard_name": name, "units": "m"},
                )
            }
        )

    if rank == 2:
        graph = UniformRectilinearGraph(shape, spacing=spacing, origin=origin)

        dataset = dataset.update(
            {
                "face_node_connectivity": xr.DataArray(
                    data=graph.nodes_at_patch.reshape((-1,)),
                    dims=("vertex",),
                    attrs={"standard_name": "Face-node connectivity"},
                )
            }
        )
        dataset = dataset.update(
            {
                "face_node_offset": xr.DataArray(
                    data=np.arange(1, graph.number_of_patches + 1, dtype=np.int32) * 4,
                    dims=("face",),
                    attrs={"standard_name": "Offset to face-node connectivity"},
                )
            }
        )

    return dataset