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]
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], ], )
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
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
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)
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
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