def test_with_just_nodes_and_depths(): expected = two_triangles() del expected.faces del expected.edges depth = UVar('depth', 'node', np.array([1.0, 2.0, 3.0, 4.0]), {'units': 'm', 'positive': 'down', 'standard_name': 'sea_floor_depth_below_geoid'}) expected.add_data(depth) fname = '2_triangles_depth.nc' with chdir(test_files): expected.save_as_netcdf(fname) grid = UGrid.from_ncfile(fname, load_data=True) os.remove(fname) assert grid.faces is None assert grid.edges is None assert np.array_equal(expected.nodes, grid.nodes) assert np.array_equal(expected.data['depth'].data, grid.data['depth'].data) assert expected.data['depth'].attributes == grid.data['depth'].attributes
def test_build_face_coordinates(): grid = two_triangles() grid.build_face_coordinates() coords = grid.face_coordinates assert coords.shape == (2, 2) assert np.allclose(coords, [(1.1, 0.76666667), (2.1, 1.43333333)])
def test_build_edges(): ugrid = two_triangles() ugrid.build_edges() edges = ugrid.edges edges.sort(axis=0) assert np.array_equal(edges, [[0, 1], [0, 2], [1, 2], [1, 3], [2, 3]])
def test_build_face_face_connectivity_small(): ugrid = two_triangles() ugrid.build_face_face_connectivity() face_face = ugrid.face_face_connectivity assert np.array_equal(face_face[0], [-1, 1, -1]) assert np.array_equal(face_face[1], [-1, -1, 0])
def test_write_with_depths(): """Tests writing a netcdf file with depth data.""" grid = two_triangles() grid.mesh_name = 'mesh1' # Create a UVar object for the depths: depths = UVar('depth', location='node', data=[1.0, 2.0, 3.0, 4.0]) depths.attributes['units'] = 'm' depths.attributes['standard_name'] = 'sea_floor_depth_below_geoid' depths.attributes['positive'] = 'down' grid.add_data(depths) fname = 'temp.nc' with chdir(test_files): grid.save_as_netcdf(fname) ds = netCDF4.Dataset(fname) os.remove(fname) assert nc_has_variable(ds, 'mesh1') assert nc_has_variable(ds, 'depth') assert nc_var_has_attr_vals(ds, 'depth', { 'coordinates': 'mesh1_node_lon mesh1_node_lat', 'location': 'node', 'mesh': 'mesh1'}) ds.close()
def test_write_with_edge_data(): """Tests writing a netcdf file with data on the edges (fluxes, maybe?).""" grid = two_triangles() grid.mesh_name = 'mesh2' # Create a UVar object for fluxes: flux = UVar('flux', location='edge', data=[0.0, 0.0, 4.1, 0.0, 5.1, ]) flux.attributes['units'] = 'm^3/s' flux.attributes['long_name'] = 'volume flux between cells' flux.attributes['standard_name'] = 'ocean_volume_transport_across_line' grid.add_data(flux) # Add coordinates for edges. grid.build_edge_coordinates() fname = 'temp.nc' with chdir(test_files): grid.save_as_netcdf(fname) ds = netCDF4.Dataset(fname) os.remove(fname) assert nc_has_variable(ds, 'mesh2') assert nc_has_variable(ds, 'flux') assert nc_var_has_attr_vals(ds, 'flux', { 'coordinates': 'mesh2_edge_lon mesh2_edge_lat', 'location': 'edge', 'units': 'm^3/s', 'mesh': 'mesh2'}) assert np.array_equal(ds.variables['mesh2_edge_lon'], grid.edge_coordinates[:, 0]) assert np.array_equal(ds.variables['mesh2_edge_lat'], grid.edge_coordinates[:, 1]) ds.close()
def test_set_mesh_name(): grid = two_triangles() grid.mesh_name = 'mesh_2' fname = 'temp.nc' with chdir(test_files): grid.save_as_netcdf(fname) ds = netCDF4.Dataset(fname) os.remove(fname) assert nc_has_variable(ds, 'mesh_2') assert nc_var_has_attr_vals(ds, 'mesh_2', { 'cf_role': 'mesh_topology', 'topology_dimension': 2, 'long_name': u'Topology data of 2D unstructured mesh'}) assert nc_var_has_attr_vals(ds, 'mesh_2', { 'cf_role': 'mesh_topology', 'topology_dimension': 2, 'long_name': u'Topology data of 2D unstructured mesh', 'node_coordinates': 'mesh_2_node_lon mesh_2_node_lat'}) assert nc_has_variable(ds, 'mesh_2_node_lon') assert nc_has_variable(ds, 'mesh_2_node_lat') assert nc_has_variable(ds, 'mesh_2_face_nodes') assert nc_has_variable(ds, 'mesh_2_edge_nodes') assert nc_has_dimension(ds, 'mesh_2_num_node') assert nc_has_dimension(ds, 'mesh_2_num_edge') assert nc_has_dimension(ds, 'mesh_2_num_face') assert nc_has_dimension(ds, 'mesh_2_num_vertices') assert not nc_var_has_attr(ds, 'mesh_2', 'face_edge_connectivity') ds.close()
def test_with_just_nodes_and_depths(): expected = two_triangles() del expected.faces del expected.edges depth = UVar( "depth", "node", np.array([1.0, 2.0, 3.0, 4.0]), {"units": "m", "positive": "down", "standard_name": "sea_floor_depth_below_geoid"}, ) expected.add_data(depth) fname = "2_triangles_depth.nc" with chdir(test_files): expected.save_as_netcdf(fname) grid = UGrid.from_ncfile(fname, load_data=True) os.remove(fname) assert grid.faces is None assert grid.edges is None assert np.array_equal(expected.nodes, grid.nodes) assert np.array_equal(expected.data["depth"].data, grid.data["depth"].data) assert expected.data["depth"].attributes == grid.data["depth"].attributes
def test_build_boundaries_small(): ugrid = two_triangles() ugrid.build_face_face_connectivity() ugrid.build_boundaries() boundaries = sorted(ugrid.boundaries.tolist()) expected_boundaries = [[0, 1], [1, 3], [2, 0], [3, 2]] assert boundaries == expected_boundaries
def test_build_edge_coordinates(): grid = two_triangles() grid.build_edge_coordinates() coords = grid.edge_coordinates assert coords.shape == (5, 2) assert np.allclose( coords, [[1.1, 0.1], [2.6, 1.1], [2.1, 2.1], [0.6, 1.1], [1.6, 1.1]])
def test_add_edge_data_wrong(): """Too long an array.""" grid = two_triangles() # Create a UVar object for velocity: # a miss-matched set. bnds = UVar('bounds', location='edge', data=[0, 1, 0, 0, 1, 3, 3]) with pytest.raises(ValueError): grid.add_data(bnds)
def test_build_boundary_coordinates(): grid = two_triangles() grid.boundaries = [(0, 1), (0, 2), (2, 3), (1, 3)] grid.build_boundary_coordinates() coords = grid.boundary_coordinates assert coords.shape == (4, 2) assert np.allclose(coords, [[1.1, 0.1], [0.6, 1.1], [2.1, 2.1], [2.6, 1.1]])
def test_add_node_data_wrong(): """Too short an array.""" grid = two_triangles() # Create a UVar object for the depths: depths = UVar('depth', location='node', data=[1.0, 2.0, 3.0]) with pytest.raises(ValueError): grid.add_data(depths)
def two_triangles_with_depths(): grid = two_triangles() depths = UVar('depth', location='node', data=[1.0, 2.0, 3.0, 4.0]) depths.attributes['units'] = 'unknown' depths.attributes['standard_name'] = 'sea_floor_depth_below_geoid' depths.attributes['positive'] = 'down' grid.add_data(depths) return grid
def test_add_all_data(): """You should not be able add a data dict directly.""" grid = two_triangles() assert grid.data == {} with pytest.raises(AttributeError): grid.data = { 'depth': UVar('depth', location='node', data=[1.0, 2.0, 3.0, 4.0]) }
def test_add_face_data_wrong(): """Too short an array.""" grid = two_triangles() # Create a UVar object for velocity: u_vel = UVar('u', location='face', data=[1.0]) with pytest.raises(ValueError): grid.add_data(u_vel)
def test_add_all_data(): """You should not be able add a data dict directly.""" grid = two_triangles() assert grid.data == {} with pytest.raises(AttributeError): grid.data = {'depth': UVar('depth', location='node', data=[1.0, 2.0, 3.0, 4.0])}
def test_add_edge_data(): grid = two_triangles() # Create a UVar object for velocity: bnds = UVar('bounds', location='edge', data=[0, 1, 0, 0, 1]) bnds.attributes['standard_name'] = 'boundary type' grid.add_data(bnds) assert grid.data['bounds'].name == 'bounds' assert np.array_equal(grid.data['bounds'].data, [0, 1, 0, 0, 1])
def test_build_edge_coordinates(): grid = two_triangles() grid.build_edge_coordinates() coords = grid.edge_coordinates assert coords.shape == (5, 2) assert np.allclose(coords, [[1.1, 0.1], [2.6, 1.1], [2.1, 2.1], [0.6, 1.1], [1.6, 1.1]])
def test_add_face_data(): grid = two_triangles() # Create a UVar object for velocity: u_vel = UVar('u', location='face', data=[1.0, 2.0]) u_vel.attributes['units'] = 'm/s' u_vel.attributes['standard_name'] = 'eastward_sea_water_velocity' grid.add_data(u_vel) assert grid.data['u'].name == 'u' assert grid.data['u'].attributes['units'] == 'm/s' assert np.array_equal(grid.data['u'].data, [1.0, 2.0])
def test_add_node_data(): grid = two_triangles() # Create a UVar object for the depths: depths = UVar('depth', location='node', data=[1.0, 2.0, 3.0, 4.0]) depths.attributes['units'] = 'm' depths.attributes['standard_name'] = 'sea_floor_depth' depths.attributes['positive'] = 'down' grid.add_data(depths) assert grid.data['depth'].name == 'depth' assert grid.data['depth'].attributes['units'] == 'm' assert np.array_equal(grid.data['depth'].data, [1.0, 2.0, 3.0, 4.0])
def test_without_faces(): expected = two_triangles() del expected.faces assert expected.faces is None fname = '2_triangles.nc' with chdir(test_files): expected.save_as_netcdf(fname) grid = UGrid.from_ncfile(fname) os.remove(fname) assert grid.faces is None assert np.array_equal(expected.faces, grid.faces) assert np.array_equal(expected.edges, grid.edges)
def test_without_faces(): expected = two_triangles() del expected.faces assert expected.faces is None fname = "2_triangles.nc" with chdir(test_files): expected.save_as_netcdf(fname) grid = UGrid.from_ncfile(fname) os.remove(fname) assert grid.faces is None assert np.array_equal(expected.faces, grid.faces) assert np.array_equal(expected.edges, grid.edges)
def test_simple_write(): grid = two_triangles() fname = 'temp.nc' with chdir(test_files): grid.save_as_netcdf(fname) ds = netCDF4.Dataset(fname) os.remove(fname) # TODO: Could be lots of tests here. assert nc_has_variable(ds, 'mesh') assert nc_var_has_attr_vals(ds, 'mesh', { 'cf_role': 'mesh_topology', 'topology_dimension': 2, 'long_name': u'Topology data of 2D unstructured mesh'}) ds.close()
def test_with_faces(): """ Test with faces, edges, but no `face_coordinates` or `edge_coordinates`. """ expected = two_triangles() fname = "2_triangles.nc" with chdir(test_files): expected.save_as_netcdf(fname) grid = UGrid.from_ncfile(fname) os.remove(fname) assert np.array_equal(expected.nodes, grid.nodes) assert np.array_equal(expected.faces, grid.faces) assert np.array_equal(expected.edges, grid.edges)
def test_with_faces(): """ Test with faces, edges, but no `face_coordinates` or `edge_coordinates`. """ expected = two_triangles() fname = '2_triangles.nc' with chdir(test_files): expected.save_as_netcdf(fname) grid = UGrid.from_ncfile(fname) os.remove(fname) assert np.array_equal(expected.nodes, grid.nodes) assert np.array_equal(expected.faces, grid.faces) assert np.array_equal(expected.edges, grid.edges)
def test_write_with_bound_data(): """ Tests writing a netcdf file with data on the boundaries suitable for boundary conditions, for example fluxes. """ grid = two_triangles() # Add the boundary definitions: grid.boundaries = [(0, 1), (0, 2), (1, 3), (2, 3)] # Create a UVar object for boundary conditions: bnds = UVar('bnd_cond', location='boundary', data=[0, 1, 0, 0]) bnds.attributes['long_name'] = 'model boundary conditions' bnds.attributes['flag_values'] = '0 1' bnds.attributes['flag_meanings'] = 'no_flow_boundary open_boundary' grid.add_data(bnds) fname = 'temp.nc' with chdir(test_files): grid.save_as_netcdf(fname) ds = netCDF4.Dataset(fname) os.remove(fname) assert nc_has_variable(ds, 'mesh') assert nc_has_variable(ds, 'bnd_cond') assert nc_var_has_attr_vals(ds, 'mesh', { 'boundary_node_connectivity': 'mesh_boundary_nodes'}) assert nc_var_has_attr_vals(ds, 'bnd_cond', {'location': 'boundary', 'flag_values': '0 1', 'flag_meanings': 'no_flow_boundary open_boundary', 'mesh': 'mesh', }) # There should be no coordinates attribute or variable for the # boundaries as there is no boundaries_coordinates defined. assert not nc_has_variable(ds, 'mesh_boundary_lon') assert not nc_has_variable(ds, 'mesh_boundary_lat') assert not nc_var_has_attr(ds, 'bnd_cond', 'coordinates') ds.close()
def test_add_boundary_data(): grid = two_triangles() # Add the boundary definitions: grid.boundaries = [(0, 1), (0, 2), (1, 3), (2, 3)] # Create a UVar object for boundary conditions: bnds = UVar('bounds', location='boundary', data=[0, 1, 0, 0, 1]) bnds.attributes['long_name'] = 'model boundary conditions' # Wrong size for data. with pytest.raises(ValueError): grid.add_data(bnds) # Correct data. bnds.data = [0, 1, 0, 0] grid.add_data(bnds) assert grid.data['bounds'].name == 'bounds' assert np.array_equal(grid.data['bounds'].data, [0, 1, 0, 0])
def test_write_with_velocities(): """Tests writing a netcdf file with velocities on the faces.""" grid = two_triangles() grid.mesh_name = 'mesh2' # Create a UVar object for u velocity: u_vel = UVar('u', location='face', data=[1.0, 2.0]) u_vel.attributes['units'] = 'm/s' u_vel.attributes['standard_name'] = 'eastward_sea_water_velocity' grid.add_data(u_vel) # Create a UVar object for v velocity: v_vel = UVar('v', location='face', data=[3.2, 4.3]) v_vel.attributes['units'] = 'm/s' v_vel.attributes['standard_name'] = 'northward_sea_water_velocity' grid.add_data(v_vel) # Add coordinates for face data. grid.build_face_coordinates() fname = 'temp.nc' with chdir(test_files): grid.save_as_netcdf(fname) ds = netCDF4.Dataset(fname) os.remove(fname) assert nc_has_variable(ds, 'mesh2') assert nc_has_variable(ds, 'u') assert nc_has_variable(ds, 'v') assert nc_var_has_attr_vals(ds, 'u', {'coordinates': 'mesh2_face_lon mesh2_face_lat', 'location': 'face', 'mesh': 'mesh2', } ) ds.close()