From b52b12e6d10d98dfa700a05d6f64c035a517e909 Mon Sep 17 00:00:00 2001 From: Jay Hennen Date: Fri, 6 Sep 2024 17:29:59 -0700 Subject: [PATCH 1/9] rewrote the subset selector for sgrid, added test based on example notebook --- tests/test_grids/test_sgrid.py | 54 +++++++++++++++++++++++++++ xarray_subset_grid/grids/sgrid.py | 62 +++++++++++++++++++------------ xarray_subset_grid/utils.py | 26 +++++++++++++ 3 files changed, 118 insertions(+), 24 deletions(-) create mode 100644 tests/test_grids/test_sgrid.py diff --git a/tests/test_grids/test_sgrid.py b/tests/test_grids/test_sgrid.py new file mode 100644 index 0000000..42f49e2 --- /dev/null +++ b/tests/test_grids/test_sgrid.py @@ -0,0 +1,54 @@ +import cf_xarray +import fsspec +import numpy as np +import xarray as xr + +import xarray_subset_grid.accessor # noqa: F401 +from xarray_subset_grid.utils import ray_tracing_numpy +# open dataset as zarr object using fsspec reference file system and xarray +def test_polygon_subset(): + ''' + This is a basic integration test for the subsetting of a ROMS sgrid dataset using a polygon. + ''' + fs = fsspec.filesystem( + "reference", + fo="s3://nextgen-dmac-cloud-ingest/nos/wcofs/nos.wcofs.2ds.best.nc.zarr", + remote_protocol="s3", + remote_options={"anon": True}, + target_protocol="s3", + target_options={"anon": True}, + ) + m = fs.get_mapper("") + + ds = xr.open_dataset( + m, engine="zarr", backend_kwargs=dict(consolidated=False), chunks={} + ) + + polygon = np.array( + [ + [-122.38488806417945, 34.98888604471138], + [-122.02425311530737, 33.300351211467074], + [-120.60402628930146, 32.723214427630836], + [-116.63789131284673, 32.54346959375448], + [-116.39346090873218, 33.8541384965596], + [-118.83845767505964, 35.257586401855164], + [-121.34541503969862, 35.50073821008141], + [-122.38488806417945, 34.98888604471138], + ] + ) + ds_temp = ds.xsg.subset_vars(['temp_sur']) + ds_subset = ds_temp.xsg.subset_polygon(polygon) + + #Check that the subset dataset has the correct dimensions given the original padding + assert ds_subset.sizes['eta_rho'] == ds_subset.sizes['eta_psi'] + 1 + assert ds_subset.sizes['eta_u'] == ds_subset.sizes['eta_psi'] + 1 + assert ds_subset.sizes['eta_v'] == ds_subset.sizes['eta_psi'] + assert ds_subset.sizes['xi_rho'] == ds_subset.sizes['xi_psi'] + 1 + assert ds_subset.sizes['xi_u'] == ds_subset.sizes['xi_psi'] + assert ds_subset.sizes['xi_v'] == ds_subset.sizes['xi_psi'] + 1 + + #Check that the subset rho/psi/u/v positional relationsip makes sense aka psi point is 'between' it's neighbor rho points + #Note that this needs to be better generalized; it's not trivial to write a test that works in all potential cases. + assert ds_subset['lon_rho'][0,0] < ds_subset['lon_psi'][0,0] and ds_subset['lon_rho'][0,1] > ds_subset['lon_psi'][0,0] + + #ds_subset.temp_sur.isel(ocean_time=0).plot(x="lon_rho", y="lat_rho") \ No newline at end of file diff --git a/xarray_subset_grid/grids/sgrid.py b/xarray_subset_grid/grids/sgrid.py index e73bec5..1670098 100644 --- a/xarray_subset_grid/grids/sgrid.py +++ b/xarray_subset_grid/grids/sgrid.py @@ -3,7 +3,7 @@ from xarray_subset_grid.grid import Grid from xarray_subset_grid.selector import Selector -from xarray_subset_grid.utils import compute_2d_subset_mask +from xarray_subset_grid.utils import compute_2d_subset_mask, parse_padding_string class SGridSelector(Selector): @@ -106,34 +106,48 @@ def compute_polygon_subset_selector( grid_topology_key = ds.cf.cf_roles["grid_topology"][0] grid_topology = ds[grid_topology_key] dims = _get_sgrid_dim_coord_names(grid_topology) - subset_masks: list[tuple[list[str], xr.DataArray]] = [] - for dim, coord in dims: - # Get the variables that have the dimensions - unique_dims = set(dim) - vars = [k for k in ds.variables if unique_dims.issubset(set(ds[k].dims))] - - # If the dataset has already been subset and there are no variables with - # the dimensions, we can skip this dimension set - if len(vars) == 0: - continue - - # Get the coordinates for the dimension + + node_dims = grid_topology.attrs["node_dimensions"].split() + node_coords = grid_topology.attrs["node_coordinates"].split() + + node_lon: xr.DataArray | None = None + node_lat: xr.DataArray | None = None + for c in node_coords: + if 'lon' in c: + node_lon = ds[c] + elif 'lat' in c: + node_lat = ds[c] + if node_lon is None or node_lat is None: + raise ValueError(f"Could not find lon and lat for dimension {node_dims}") + + node_mask = compute_2d_subset_mask(lat=node_lat, lon=node_lon, polygon=polygon) + msk = np.where(node_mask) + subset_masks.append(([node_coords[0], node_coords[1]], node_mask)) + + index_bounding_box = [[msk[0].min(), msk[0].max()], [msk[1].min(), msk[1].max()]] + for s in ('face', 'edge1', 'edge2'): + dims = grid_topology.attrs.get(f"{s}_dimensions", None) + coords = grid_topology.attrs.get(f"{s}_coordinates", None).split() + lon: xr.DataArray | None = None lat: xr.DataArray | None = None - for c in coord: - if "lon" in ds[c].attrs.get("standard_name", ""): + for c in coords: + if 'lon' in c: lon = ds[c] - elif "lat" in ds[c].attrs.get("standard_name", ""): + elif 'lat' in c: lat = ds[c] - if lon is None or lat is None: - raise ValueError(f"Could not find lon and lat for dimension {dim}") - - subset_mask = compute_2d_subset_mask(lat=lat, lon=lon, polygon=polygon) - - subset_masks.append((vars, subset_mask)) - + raise ValueError(f"Could not find lon and lat for dimension {dims}") + padding = parse_padding_string(dims) + arranged_padding = [padding[d] for d in lon.dims] + arranged_padding = [0 if p == 'none' or p == 'low' else 1 for p in arranged_padding] + mask = np.zeros(lon.shape, dtype=bool) + mask[index_bounding_box[0][0]:index_bounding_box[0][1] + arranged_padding[0] + 1, + index_bounding_box[1][0]:index_bounding_box[1][1] + arranged_padding[1] + 1] = True + xr_mask = xr.DataArray(mask, dims=lon.dims) + subset_masks.append(([coords[0], coords[1]], xr_mask)) + return SGridSelector( name=name or 'selector', polygon=polygon, @@ -141,7 +155,7 @@ def compute_polygon_subset_selector( grid_topology=grid_topology, subset_masks=subset_masks, ) - + def _get_sgrid_dim_coord_names( grid_topology: xr.DataArray, diff --git a/xarray_subset_grid/utils.py b/xarray_subset_grid/utils.py index 1b0b535..f53d1cc 100644 --- a/xarray_subset_grid/utils.py +++ b/xarray_subset_grid/utils.py @@ -151,3 +151,29 @@ def compute_2d_subset_mask( polygon_mask = np.where(polygon_mask > 1, True, False) return xr.DataArray(polygon_mask, dims=mask_dims) + +def parse_padding_string(dim_string): + ''' + Given a grid_topology dimension string, parse the padding for each dimension. + Returns a dict of {dim0name: padding, + dim1name: padding + } + valid values of padding are: 'none', 'low', 'high', 'both' + ''' + parsed_string = dim_string.replace('(padding: ', '').replace(')', '').replace(':', '') + split_parsed_string = parsed_string.split(' ') + if len(split_parsed_string) == 6: + return {split_parsed_string[0]:split_parsed_string[2], split_parsed_string[3]:split_parsed_string[5]} + elif len(split_parsed_string) == 5: + if split_parsed_string[4] in {'none', 'low', 'high', 'both'}: + #2nd dim has padding, and with len 5 that means first does not + split_parsed_string.insert(2, 'none') + else: + split_parsed_string.insert(5, 'none') + return {split_parsed_string[0]:split_parsed_string[2], split_parsed_string[3]:split_parsed_string[5]} + elif len(split_parsed_string) == 2: + #node dimensions string could look like this: 'node_dimensions: xi_psi eta_psi' + return {split_parsed_string[0]: 'none', split_parsed_string[1]: 'none'} + else: + raise ValueError(f"Padding parsing failure: {dim_string}") + \ No newline at end of file From 36df92573dfa845341673d6b44318bdb2131336a Mon Sep 17 00:00:00 2001 From: Jay Hennen Date: Mon, 9 Sep 2024 14:23:38 -0700 Subject: [PATCH 2/9] added arakawa_c_test_grid.nc from gridded package --- tests/test_data/arakawa_c_test_grid.nc | Bin 0 -> 55137 bytes tests/test_data/arakawa_c_test_grid.png | Bin 0 -> 65016 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/test_data/arakawa_c_test_grid.nc create mode 100644 tests/test_data/arakawa_c_test_grid.png diff --git a/tests/test_data/arakawa_c_test_grid.nc b/tests/test_data/arakawa_c_test_grid.nc new file mode 100644 index 0000000000000000000000000000000000000000..4a554094b46f041ff06b23f4f5130acd16e18d75 GIT binary patch literal 55137 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 G>Hh-&u88IU literal 0 HcmV?d00001 diff --git a/tests/test_data/arakawa_c_test_grid.png b/tests/test_data/arakawa_c_test_grid.png new file mode 100644 index 0000000000000000000000000000000000000000..32197c548dd34b8747b932877f4396cfcb9df5d0 GIT binary patch literal 65016 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 literal 0 HcmV?d00001 From 1e6d6204c2032eea56663d0c54de887207b8c1e9 Mon Sep 17 00:00:00 2001 From: Jay Hennen Date: Tue, 10 Sep 2024 10:32:40 -0700 Subject: [PATCH 3/9] added test utils, new test stub --- tests/test_grids/test_sgrid.py | 24 +++++++++++++++++++++++- tests/utilities.py | 24 ++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 tests/utilities.py diff --git a/tests/test_grids/test_sgrid.py b/tests/test_grids/test_sgrid.py index 42f49e2..d36fce4 100644 --- a/tests/test_grids/test_sgrid.py +++ b/tests/test_grids/test_sgrid.py @@ -6,6 +6,14 @@ import xarray_subset_grid.accessor # noqa: F401 from xarray_subset_grid.utils import ray_tracing_numpy # open dataset as zarr object using fsspec reference file system and xarray + +from xarray_subset_grid.utils import get_test_file_dir + +from gridded import Variable, VectorVariable + +test_dir = get_test_file_dir() +sample_sgrid_file = os.path.join(test_dir, 'arakawa_c_test_grid.nc') + def test_polygon_subset(): ''' This is a basic integration test for the subsetting of a ROMS sgrid dataset using a polygon. @@ -51,4 +59,18 @@ def test_polygon_subset(): #Note that this needs to be better generalized; it's not trivial to write a test that works in all potential cases. assert ds_subset['lon_rho'][0,0] < ds_subset['lon_psi'][0,0] and ds_subset['lon_rho'][0,1] > ds_subset['lon_psi'][0,0] - #ds_subset.temp_sur.isel(ocean_time=0).plot(x="lon_rho", y="lat_rho") \ No newline at end of file + #ds_subset.temp_sur.isel(ocean_time=0).plot(x="lon_rho", y="lat_rho") + +def test_polygon_subset_2(): + ds = xr.open_dataset(sample_sgrid_file) + polygon = np.array( + [6.5, 37.5], + [6.5, 39.5], + [9.5, 40.5], + [8.5, 37.5], + [6.5, 37.5] + ) + ds_subset = ds.xsg.subset_polygon(polygon) + + breakpoint() + \ No newline at end of file diff --git a/tests/utilities.py b/tests/utilities.py new file mode 100644 index 0000000..17eee6d --- /dev/null +++ b/tests/utilities.py @@ -0,0 +1,24 @@ +""" +Assorted utilities useful for the tests. +""" + +import os +import contextlib + +try: + import urllib.request as urllib_request # for python 3 +except ImportError: + import urllib2 as urllib_request # for python 2 + +import pytest +import glob + +from .get_remote_data import get_datafile + + +def get_test_file_dir(): + """ + returns the test file dir path + """ + test_file_dir = os.path.join(os.path.dirname(__file__), 'test_data') + return test_file_dir \ No newline at end of file From 06b384316fbd4397b2d9af71763afd892d4a2826 Mon Sep 17 00:00:00 2001 From: Jay Hennen Date: Tue, 10 Sep 2024 15:33:25 -0700 Subject: [PATCH 4/9] fixed test grid nc, added 1x padding for psi grid subsets --- tests/__init__.py | 0 tests/test_data/arakawa_c_test_grid.nc | Bin 55137 -> 68712 bytes tests/test_grids/__init__.py | 0 tests/test_grids/test_sgrid.py | 23 ++++++++++++++++------- tests/test_utils.py | 8 ++++++++ tests/test_visualization/__init__.py | 0 xarray_subset_grid/grids/sgrid.py | 15 +++++++++++---- 7 files changed, 35 insertions(+), 11 deletions(-) create mode 100644 tests/__init__.py create mode 100644 tests/test_grids/__init__.py create mode 100644 tests/test_visualization/__init__.py diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_data/arakawa_c_test_grid.nc b/tests/test_data/arakawa_c_test_grid.nc index 4a554094b46f041ff06b23f4f5130acd16e18d75..f59c39dc2af5d0eb869516a6aefad9f25e4f7fea 100644 GIT binary patch literal 68712 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 G>Hh-&u88IU diff --git a/tests/test_grids/__init__.py b/tests/test_grids/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_grids/test_sgrid.py b/tests/test_grids/test_sgrid.py index d36fce4..02dbde6 100644 --- a/tests/test_grids/test_sgrid.py +++ b/tests/test_grids/test_sgrid.py @@ -2,13 +2,12 @@ import fsspec import numpy as np import xarray as xr +import os import xarray_subset_grid.accessor # noqa: F401 -from xarray_subset_grid.utils import ray_tracing_numpy +from ..test_utils import ray_tracing_numpy, get_test_file_dir # open dataset as zarr object using fsspec reference file system and xarray -from xarray_subset_grid.utils import get_test_file_dir - from gridded import Variable, VectorVariable test_dir = get_test_file_dir() @@ -58,19 +57,29 @@ def test_polygon_subset(): #Check that the subset rho/psi/u/v positional relationsip makes sense aka psi point is 'between' it's neighbor rho points #Note that this needs to be better generalized; it's not trivial to write a test that works in all potential cases. assert ds_subset['lon_rho'][0,0] < ds_subset['lon_psi'][0,0] and ds_subset['lon_rho'][0,1] > ds_subset['lon_psi'][0,0] + breakpoint() #ds_subset.temp_sur.isel(ocean_time=0).plot(x="lon_rho", y="lat_rho") def test_polygon_subset_2(): - ds = xr.open_dataset(sample_sgrid_file) - polygon = np.array( + ds = xr.open_dataset(sample_sgrid_file, decode_times=False) + polygon = np.array([ [6.5, 37.5], [6.5, 39.5], [9.5, 40.5], [8.5, 37.5], [6.5, 37.5] - ) + ]) ds_subset = ds.xsg.subset_polygon(polygon) - breakpoint() + #Check that the subset dataset has the correct dimensions given the original padding + assert ds_subset.sizes['eta_rho'] == ds_subset.sizes['eta_psi'] + 1 + assert ds_subset.sizes['eta_u'] == ds_subset.sizes['eta_psi'] + 1 + assert ds_subset.sizes['eta_v'] == ds_subset.sizes['eta_psi'] + assert ds_subset.sizes['xi_rho'] == ds_subset.sizes['xi_psi'] + 1 + assert ds_subset.sizes['xi_u'] == ds_subset.sizes['xi_psi'] + assert ds_subset.sizes['xi_v'] == ds_subset.sizes['xi_psi'] + 1 + + assert ds_subset.lon_psi.min() <= 6.5 and ds_subset.lon_psi.max() >= 9.5 + assert ds_subset.lat_psi.min() <= 37.5 and ds_subset.lat_psi.max() >= 40.5 \ No newline at end of file diff --git a/tests/test_utils.py b/tests/test_utils.py index dd369cc..4df263e 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,5 +1,6 @@ import numpy as np import pytest +import os from xarray_subset_grid.utils import ( normalize_bbox_x_coords, @@ -9,6 +10,13 @@ # normalize_polygon_x_coords tests. +def get_test_file_dir(): + """ + returns the test file dir path + """ + test_file_dir = os.path.join(os.path.dirname(__file__), 'test_data') + return test_file_dir + poly1_180 = np.array( [ [-73, 41], diff --git a/tests/test_visualization/__init__.py b/tests/test_visualization/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/xarray_subset_grid/grids/sgrid.py b/xarray_subset_grid/grids/sgrid.py index 1670098..5cf2ec5 100644 --- a/xarray_subset_grid/grids/sgrid.py +++ b/xarray_subset_grid/grids/sgrid.py @@ -123,9 +123,16 @@ def compute_polygon_subset_selector( node_mask = compute_2d_subset_mask(lat=node_lat, lon=node_lon, polygon=polygon) msk = np.where(node_mask) - subset_masks.append(([node_coords[0], node_coords[1]], node_mask)) + index_bounding_box = np.array([[msk[0].min(), msk[0].max()+1], [msk[1].min(), msk[1].max()+1]]) + # quick and dirty add a 1 node pad around the psi mask. This is to ensure the entire polygon is covered. + index_bounding_box[0,0] = max(0, index_bounding_box[0,0] - 1) + index_bounding_box[0,1] = min(node_lon.shape[0], index_bounding_box[0,1] + 1) + index_bounding_box[1,0] = max(0, index_bounding_box[1,0] - 1) + index_bounding_box[1,1] = min(node_lon.shape[1], index_bounding_box[1,1] + 1) + node_mask[index_bounding_box[0][0]:index_bounding_box[0][1], + index_bounding_box[1][0]:index_bounding_box[1][1]] = True - index_bounding_box = [[msk[0].min(), msk[0].max()], [msk[1].min(), msk[1].max()]] + subset_masks.append(([node_coords[0], node_coords[1]], node_mask)) for s in ('face', 'edge1', 'edge2'): dims = grid_topology.attrs.get(f"{s}_dimensions", None) coords = grid_topology.attrs.get(f"{s}_coordinates", None).split() @@ -143,8 +150,8 @@ def compute_polygon_subset_selector( arranged_padding = [padding[d] for d in lon.dims] arranged_padding = [0 if p == 'none' or p == 'low' else 1 for p in arranged_padding] mask = np.zeros(lon.shape, dtype=bool) - mask[index_bounding_box[0][0]:index_bounding_box[0][1] + arranged_padding[0] + 1, - index_bounding_box[1][0]:index_bounding_box[1][1] + arranged_padding[1] + 1] = True + mask[index_bounding_box[0][0]:index_bounding_box[0][1] + arranged_padding[0], + index_bounding_box[1][0]:index_bounding_box[1][1] + arranged_padding[1]] = True xr_mask = xr.DataArray(mask, dims=lon.dims) subset_masks.append(([coords[0], coords[1]], xr_mask)) From 02fc924de97704801b783aa3591164969e419d0c Mon Sep 17 00:00:00 2001 From: Jay Hennen Date: Fri, 13 Sep 2024 13:00:50 -0700 Subject: [PATCH 5/9] delete redundant utils --- tests/utilities.py | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 tests/utilities.py diff --git a/tests/utilities.py b/tests/utilities.py deleted file mode 100644 index 17eee6d..0000000 --- a/tests/utilities.py +++ /dev/null @@ -1,24 +0,0 @@ -""" -Assorted utilities useful for the tests. -""" - -import os -import contextlib - -try: - import urllib.request as urllib_request # for python 3 -except ImportError: - import urllib2 as urllib_request # for python 2 - -import pytest -import glob - -from .get_remote_data import get_datafile - - -def get_test_file_dir(): - """ - returns the test file dir path - """ - test_file_dir = os.path.join(os.path.dirname(__file__), 'test_data') - return test_file_dir \ No newline at end of file From e8692f834d313ca3533eb7d39fdbe124ca48d285 Mon Sep 17 00:00:00 2001 From: Jay Hennen Date: Fri, 13 Sep 2024 13:05:35 -0700 Subject: [PATCH 6/9] moved subset parse back into sgrid --- tests/test_grids/test_sgrid.py | 1 - xarray_subset_grid/grids/sgrid.py | 27 ++++++++++++++++++++++++++- xarray_subset_grid/utils.py | 25 ------------------------- 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/tests/test_grids/test_sgrid.py b/tests/test_grids/test_sgrid.py index 02dbde6..cbc2948 100644 --- a/tests/test_grids/test_sgrid.py +++ b/tests/test_grids/test_sgrid.py @@ -57,7 +57,6 @@ def test_polygon_subset(): #Check that the subset rho/psi/u/v positional relationsip makes sense aka psi point is 'between' it's neighbor rho points #Note that this needs to be better generalized; it's not trivial to write a test that works in all potential cases. assert ds_subset['lon_rho'][0,0] < ds_subset['lon_psi'][0,0] and ds_subset['lon_rho'][0,1] > ds_subset['lon_psi'][0,0] - breakpoint() #ds_subset.temp_sur.isel(ocean_time=0).plot(x="lon_rho", y="lat_rho") diff --git a/xarray_subset_grid/grids/sgrid.py b/xarray_subset_grid/grids/sgrid.py index 5cf2ec5..a2a7b2b 100644 --- a/xarray_subset_grid/grids/sgrid.py +++ b/xarray_subset_grid/grids/sgrid.py @@ -3,7 +3,7 @@ from xarray_subset_grid.grid import Grid from xarray_subset_grid.selector import Selector -from xarray_subset_grid.utils import compute_2d_subset_mask, parse_padding_string +from xarray_subset_grid.utils import compute_2d_subset_mask class SGridSelector(Selector): @@ -187,3 +187,28 @@ def _get_sgrid_dim_coord_names( coords.append(v.split(" ")) return list(zip(dims, coords)) + +def parse_padding_string(dim_string): + ''' + Given a grid_topology dimension string, parse the padding for each dimension. + Returns a dict of {dim0name: padding, + dim1name: padding + } + valid values of padding are: 'none', 'low', 'high', 'both' + ''' + parsed_string = dim_string.replace('(padding: ', '').replace(')', '').replace(':', '') + split_parsed_string = parsed_string.split(' ') + if len(split_parsed_string) == 6: + return {split_parsed_string[0]:split_parsed_string[2], split_parsed_string[3]:split_parsed_string[5]} + elif len(split_parsed_string) == 5: + if split_parsed_string[4] in {'none', 'low', 'high', 'both'}: + #2nd dim has padding, and with len 5 that means first does not + split_parsed_string.insert(2, 'none') + else: + split_parsed_string.insert(5, 'none') + return {split_parsed_string[0]:split_parsed_string[2], split_parsed_string[3]:split_parsed_string[5]} + elif len(split_parsed_string) == 2: + #node dimensions string could look like this: 'node_dimensions: xi_psi eta_psi' + return {split_parsed_string[0]: 'none', split_parsed_string[1]: 'none'} + else: + raise ValueError(f"Padding parsing failure: {dim_string}") diff --git a/xarray_subset_grid/utils.py b/xarray_subset_grid/utils.py index f53d1cc..8b056cc 100644 --- a/xarray_subset_grid/utils.py +++ b/xarray_subset_grid/utils.py @@ -151,29 +151,4 @@ def compute_2d_subset_mask( polygon_mask = np.where(polygon_mask > 1, True, False) return xr.DataArray(polygon_mask, dims=mask_dims) - -def parse_padding_string(dim_string): - ''' - Given a grid_topology dimension string, parse the padding for each dimension. - Returns a dict of {dim0name: padding, - dim1name: padding - } - valid values of padding are: 'none', 'low', 'high', 'both' - ''' - parsed_string = dim_string.replace('(padding: ', '').replace(')', '').replace(':', '') - split_parsed_string = parsed_string.split(' ') - if len(split_parsed_string) == 6: - return {split_parsed_string[0]:split_parsed_string[2], split_parsed_string[3]:split_parsed_string[5]} - elif len(split_parsed_string) == 5: - if split_parsed_string[4] in {'none', 'low', 'high', 'both'}: - #2nd dim has padding, and with len 5 that means first does not - split_parsed_string.insert(2, 'none') - else: - split_parsed_string.insert(5, 'none') - return {split_parsed_string[0]:split_parsed_string[2], split_parsed_string[3]:split_parsed_string[5]} - elif len(split_parsed_string) == 2: - #node dimensions string could look like this: 'node_dimensions: xi_psi eta_psi' - return {split_parsed_string[0]: 'none', split_parsed_string[1]: 'none'} - else: - raise ValueError(f"Padding parsing failure: {dim_string}") \ No newline at end of file From d17517af40365d8d53921fbdc34b35b9ae59d293 Mon Sep 17 00:00:00 2001 From: Jay Hennen Date: Fri, 13 Sep 2024 13:11:27 -0700 Subject: [PATCH 7/9] check standard name for lon/lat --- xarray_subset_grid/grids/sgrid.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xarray_subset_grid/grids/sgrid.py b/xarray_subset_grid/grids/sgrid.py index a2a7b2b..92eed5d 100644 --- a/xarray_subset_grid/grids/sgrid.py +++ b/xarray_subset_grid/grids/sgrid.py @@ -140,9 +140,9 @@ def compute_polygon_subset_selector( lon: xr.DataArray | None = None lat: xr.DataArray | None = None for c in coords: - if 'lon' in c: + if 'lon' in c.standard_name.lower(): lon = ds[c] - elif 'lat' in c: + elif 'lat' in c.standard_name.lower(): lat = ds[c] if lon is None or lat is None: raise ValueError(f"Could not find lon and lat for dimension {dims}") From 338a1f7aa0946e8be93374df77962c781cb29c15 Mon Sep 17 00:00:00 2001 From: Jay Hennen Date: Fri, 13 Sep 2024 13:12:03 -0700 Subject: [PATCH 8/9] need to look up var in ds --- xarray_subset_grid/grids/sgrid.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xarray_subset_grid/grids/sgrid.py b/xarray_subset_grid/grids/sgrid.py index 92eed5d..3848781 100644 --- a/xarray_subset_grid/grids/sgrid.py +++ b/xarray_subset_grid/grids/sgrid.py @@ -140,9 +140,9 @@ def compute_polygon_subset_selector( lon: xr.DataArray | None = None lat: xr.DataArray | None = None for c in coords: - if 'lon' in c.standard_name.lower(): + if 'lon' in ds[c].standard_name.lower(): lon = ds[c] - elif 'lat' in c.standard_name.lower(): + elif 'lat' in ds[c].standard_name.lower(): lat = ds[c] if lon is None or lat is None: raise ValueError(f"Could not find lon and lat for dimension {dims}") From 83ad4af42d3b732d7a7c13e9a580e61beb64df20 Mon Sep 17 00:00:00 2001 From: Jay Hennen Date: Fri, 13 Sep 2024 13:32:03 -0700 Subject: [PATCH 9/9] linted --- docs/examples/gfs_opendap.ipynb | 2 - docs/examples/nam_opendap.ipynb | 2 - docs/examples/regular_grid_2d.ipynb | 1 - docs/examples/roms-compare.ipynb | 5 +- docs/examples/roms.ipynb | 1 - docs/examples/roms_3d.ipynb | 1 - docs/examples/rtofs.ipynb | 1 - docs/examples/sscofs.ipynb | 4 +- docs/examples/stofs_2d.ipynb | 7625 ++++++----- docs/examples/stofs_3d.ipynb | 15615 +++++++++++------------ docs/examples/subset_from_ncfile.ipynb | 8 +- tests/test_grids/test_sgrid.py | 32 +- tests/test_utils.py | 3 +- xarray_subset_grid/grids/sgrid.py | 24 +- xarray_subset_grid/utils.py | 1 - 15 files changed, 11663 insertions(+), 11662 deletions(-) diff --git a/docs/examples/gfs_opendap.ipynb b/docs/examples/gfs_opendap.ipynb index 2681627..dc58d18 100644 --- a/docs/examples/gfs_opendap.ipynb +++ b/docs/examples/gfs_opendap.ipynb @@ -17587,10 +17587,8 @@ "source": [ "import cf_xarray # noqa\n", "import datetime\n", - "import numpy as np\n", "import xarray as xr\n", "\n", - "import xarray_subset_grid as xsg\n", "\n", "\n", "current_date = datetime.datetime.now().strftime(\"%Y%m%d\")\n", diff --git a/docs/examples/nam_opendap.ipynb b/docs/examples/nam_opendap.ipynb index dd7b624..b436a2f 100644 --- a/docs/examples/nam_opendap.ipynb +++ b/docs/examples/nam_opendap.ipynb @@ -11672,10 +11672,8 @@ "source": [ "import cf_xarray # noqa\n", "import datetime\n", - "import numpy as np\n", "import xarray as xr\n", "\n", - "import xarray_subset_grid as xsg\n", "\n", "\n", "current_date = datetime.datetime.now().strftime(\"%Y%m%d\")\n", diff --git a/docs/examples/regular_grid_2d.ipynb b/docs/examples/regular_grid_2d.ipynb index 584b59d..03ea4a0 100644 --- a/docs/examples/regular_grid_2d.ipynb +++ b/docs/examples/regular_grid_2d.ipynb @@ -1327,7 +1327,6 @@ "import numpy as np\n", "import xarray as xr\n", "\n", - "import xarray_subset_grid\n", "\n", "# Open the dataset from NODD s3 bucket directly\n", "fs = fsspec.filesystem(\"s3\", anon=True)\n", diff --git a/docs/examples/roms-compare.ipynb b/docs/examples/roms-compare.ipynb index 82ce942..9678d62 100644 --- a/docs/examples/roms-compare.ipynb +++ b/docs/examples/roms-compare.ipynb @@ -5293,7 +5293,6 @@ } ], "source": [ - "import cf_xarray\n", "import fsspec\n", "import numpy as np\n", "import xarray as xr\n", @@ -8601,7 +8600,9 @@ } ], "source": [ - "ds_subset_control = xr.open_dataset('./wcofs-subset-control.nc', chunks={}, backend_kwargs={'decode_times': False})\n", + "ds_subset_control = xr.open_dataset('./wcofs-subset-control.nc',\n", + " chunks={},\n", + " backend_kwargs={'decode_times': False})\n", "ds_subset_control" ] }, diff --git a/docs/examples/roms.ipynb b/docs/examples/roms.ipynb index 585add9..6477d00 100644 --- a/docs/examples/roms.ipynb +++ b/docs/examples/roms.ipynb @@ -5235,7 +5235,6 @@ } ], "source": [ - "import cf_xarray\n", "import fsspec\n", "import numpy as np\n", "import xarray as xr\n", diff --git a/docs/examples/roms_3d.ipynb b/docs/examples/roms_3d.ipynb index 2321220..8f9c239 100644 --- a/docs/examples/roms_3d.ipynb +++ b/docs/examples/roms_3d.ipynb @@ -4150,7 +4150,6 @@ } ], "source": [ - "import cf_xarray\n", "import fsspec\n", "import numpy as np\n", "import xarray as xr\n", diff --git a/docs/examples/rtofs.ipynb b/docs/examples/rtofs.ipynb index 48f3c93..7a8efa2 100644 --- a/docs/examples/rtofs.ipynb +++ b/docs/examples/rtofs.ipynb @@ -1285,7 +1285,6 @@ "import cf_xarray # noqa\n", "import datetime\n", "import fsspec\n", - "import numpy as np\n", "import xarray as xr\n", "\n", "import xarray_subset_grid.accessor # noqa: F401\n", diff --git a/docs/examples/sscofs.ipynb b/docs/examples/sscofs.ipynb index 3922ffa..9d9635c 100644 --- a/docs/examples/sscofs.ipynb +++ b/docs/examples/sscofs.ipynb @@ -3883,7 +3883,9 @@ } ], "source": [ - "ds = xarray_subset_grid.grids.ugrid.assign_ugrid_topology(ds, face_node_connectivity='nv', face_face_connectivity='nbe')\n", + "ds = xarray_subset_grid.grids.ugrid.assign_ugrid_topology(ds,\n", + " face_node_connectivity='nv',\n", + " face_face_connectivity='nbe')\n", "ds.cf['mesh_topology']" ] }, diff --git a/docs/examples/stofs_2d.ipynb b/docs/examples/stofs_2d.ipynb index ceeedb6..dbe5f77 100644 --- a/docs/examples/stofs_2d.ipynb +++ b/docs/examples/stofs_2d.ipynb @@ -1,3862 +1,3861 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "mtMFWRVnwY0f" - }, - "source": [ - "# STOFS 2D" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/asascience-open/xarray-subset-grid/blob/main/docs/examples/stofs_2d.ipynb)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We use the Stofs-2d-Global Fields-CWL dataset to compute a subset selector and reuse it" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Install required libraries\n", - "# !pip install -q xarray_subset_grid@git+https://github.com/asascience-open/xarray-subset-grid.git\n", - "# !pip install -q s3fs cftime xarray cf-xarray fsspec dask h5netcdf" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 435 - }, - "id": "WzHpywpMwY0n", - "outputId": "7f423d44-f68a-4488-dbb1-8fa10455086f" - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset> Size: 20GB\n",
-              "Dimensions:      (time: 186, node: 12785004, nele: 24875336, nvertex: 3,\n",
-              "                  mesh: 1, nbou: 262, nvel: 12421)\n",
-              "Coordinates:\n",
-              "  * time         (time) datetime64[ns] 1kB 2024-08-07T01:00:00 ... 2024-08-14...\n",
-              "    x            (node) float64 102MB dask.array<chunksize=(511401,), meta=np.ndarray>\n",
-              "    y            (node) float64 102MB dask.array<chunksize=(511401,), meta=np.ndarray>\n",
-              "Dimensions without coordinates: node, nele, nvertex, mesh, nbou, nvel\n",
-              "Data variables:\n",
-              "    element      (nele, nvertex) int32 299MB dask.array<chunksize=(2763927, 1), meta=np.ndarray>\n",
-              "    adcirc_mesh  (mesh) int32 4B dask.array<chunksize=(1,), meta=np.ndarray>\n",
-              "    nvell        (nbou) int32 1kB dask.array<chunksize=(262,), meta=np.ndarray>\n",
-              "    max_nvell    int32 4B ...\n",
-              "    ibtype       (nbou) int32 1kB dask.array<chunksize=(262,), meta=np.ndarray>\n",
-              "    nbvv         (nvel) int32 50kB dask.array<chunksize=(12421,), meta=np.ndarray>\n",
-              "    depth        (node) float64 102MB dask.array<chunksize=(511401,), meta=np.ndarray>\n",
-              "    zeta         (time, node) float64 19GB dask.array<chunksize=(1, 511401), meta=np.ndarray>\n",
-              "Attributes: (12/50)\n",
-              "    _FillValue:         -99999.0\n",
-              "    model:              ADCIRC\n",
-              "    version:            noaa.stofs.2d.glo.v2.1.0r1.v55.12\n",
-              "    git_hash:           23947fbd9683d0ef48f12e6ce62d45d18bc27ff3\n",
-              "    grid_type:          Triangular\n",
-              "    description:        2024080706 :-6 hr nowcast and +180 hr forecast ! 32 C...\n",
-              "    ...                 ...\n",
-              "    sfea0:              45.0\n",
-              "    cf:                 0.0005\n",
-              "    eslm:               -0.2\n",
-              "    cori:               0.0\n",
-              "    ntif:               8\n",
-              "    nbfr:               0
" - ], - "text/plain": [ - " Size: 20GB\n", - "Dimensions: (time: 186, node: 12785004, nele: 24875336, nvertex: 3,\n", - " mesh: 1, nbou: 262, nvel: 12421)\n", - "Coordinates:\n", - " * time (time) datetime64[ns] 1kB 2024-08-07T01:00:00 ... 2024-08-14...\n", - " x (node) float64 102MB dask.array\n", - " y (node) float64 102MB dask.array\n", - "Dimensions without coordinates: node, nele, nvertex, mesh, nbou, nvel\n", - "Data variables:\n", - " element (nele, nvertex) int32 299MB dask.array\n", - " adcirc_mesh (mesh) int32 4B dask.array\n", - " nvell (nbou) int32 1kB dask.array\n", - " max_nvell int32 4B ...\n", - " ibtype (nbou) int32 1kB dask.array\n", - " nbvv (nvel) int32 50kB dask.array\n", - " depth (node) float64 102MB dask.array\n", - " zeta (time, node) float64 19GB dask.array\n", - "Attributes: (12/50)\n", - " _FillValue: -99999.0\n", - " model: ADCIRC\n", - " version: noaa.stofs.2d.glo.v2.1.0r1.v55.12\n", - " git_hash: 23947fbd9683d0ef48f12e6ce62d45d18bc27ff3\n", - " grid_type: Triangular\n", - " description: 2024080706 :-6 hr nowcast and +180 hr forecast ! 32 C...\n", - " ... ...\n", - " sfea0: 45.0\n", - " cf: 0.0005\n", - " eslm: -0.2\n", - " cori: 0.0\n", - " ntif: 8\n", - " nbfr: 0" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import cf_xarray #noqa\n", - "import fsspec\n", - "import numpy as np\n", - "import xarray as xr\n", - "\n", - "import xarray_subset_grid\n", - "\n", - "# Open the dataset from NODD s3 bucket directly\n", - "fs = fsspec.filesystem(\"s3\", anon=True)\n", - "ds_cwl = xr.open_dataset(\n", - " fs.open(\n", - " \"s3://noaa-gestofs-pds/stofs_2d_glo.20240807/stofs_2d_glo.t06z.fields.cwl.nc\"\n", - " ),\n", - " chunks={},\n", - " drop_variables=['nvel']\n", - ")\n", - "\n", - "ds_cwl" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "x-A2kbpYa-7G" - }, - "source": [ - "Make the dataset CF compliant" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "id": "21LQ8NAFwY0v" - }, - "outputs": [], - "source": [ - "ds_cwl = xarray_subset_grid.grids.ugrid.assign_ugrid_topology(ds_cwl)" - ] + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "mtMFWRVnwY0f" + }, + "source": [ + "# STOFS 2D" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/asascience-open/xarray-subset-grid/blob/main/docs/examples/stofs_2d.ipynb)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We use the Stofs-2d-Global Fields-CWL dataset to compute a subset selector and reuse it" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Install required libraries\n", + "# !pip install -q xarray_subset_grid@git+https://github.com/asascience-open/xarray-subset-grid.git\n", + "# !pip install -q s3fs cftime xarray cf-xarray fsspec dask h5netcdf" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 435 }, + "id": "WzHpywpMwY0n", + "outputId": "7f423d44-f68a-4488-dbb1-8fa10455086f" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 35 - }, - "id": "aTp9T5w7wY0x", - "outputId": "77ef166f-c08f-459e-cada-590530d9c90b" - }, - "outputs": [ - { - "data": { - "application/vnd.google.colaboratory.intrinsic+json": { - "type": "string" - }, - "text/plain": [ - "'Dataset size: 19.629483356 Gb'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset> Size: 20GB\n",
+       "Dimensions:      (time: 186, node: 12785004, nele: 24875336, nvertex: 3,\n",
+       "                  mesh: 1, nbou: 262, nvel: 12421)\n",
+       "Coordinates:\n",
+       "  * time         (time) datetime64[ns] 1kB 2024-08-07T01:00:00 ... 2024-08-14...\n",
+       "    x            (node) float64 102MB dask.array<chunksize=(511401,), meta=np.ndarray>\n",
+       "    y            (node) float64 102MB dask.array<chunksize=(511401,), meta=np.ndarray>\n",
+       "Dimensions without coordinates: node, nele, nvertex, mesh, nbou, nvel\n",
+       "Data variables:\n",
+       "    element      (nele, nvertex) int32 299MB dask.array<chunksize=(2763927, 1), meta=np.ndarray>\n",
+       "    adcirc_mesh  (mesh) int32 4B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+       "    nvell        (nbou) int32 1kB dask.array<chunksize=(262,), meta=np.ndarray>\n",
+       "    max_nvell    int32 4B ...\n",
+       "    ibtype       (nbou) int32 1kB dask.array<chunksize=(262,), meta=np.ndarray>\n",
+       "    nbvv         (nvel) int32 50kB dask.array<chunksize=(12421,), meta=np.ndarray>\n",
+       "    depth        (node) float64 102MB dask.array<chunksize=(511401,), meta=np.ndarray>\n",
+       "    zeta         (time, node) float64 19GB dask.array<chunksize=(1, 511401), meta=np.ndarray>\n",
+       "Attributes: (12/50)\n",
+       "    _FillValue:         -99999.0\n",
+       "    model:              ADCIRC\n",
+       "    version:            noaa.stofs.2d.glo.v2.1.0r1.v55.12\n",
+       "    git_hash:           23947fbd9683d0ef48f12e6ce62d45d18bc27ff3\n",
+       "    grid_type:          Triangular\n",
+       "    description:        2024080706 :-6 hr nowcast and +180 hr forecast ! 32 C...\n",
+       "    ...                 ...\n",
+       "    sfea0:              45.0\n",
+       "    cf:                 0.0005\n",
+       "    eslm:               -0.2\n",
+       "    cori:               0.0\n",
+       "    ntif:               8\n",
+       "    nbfr:               0
" ], - "source": [ - "f\"Dataset size: {ds_cwl.nbytes * 1.0e-9} Gb\"" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "MoMm_GNvwY0y" - }, - "source": [ - "### Example BBOX\n", - "\n", - "Drawn with https://geojson.io\n", - "\n", - "![image.png](example_data/image.png)" + "text/plain": [ + " Size: 20GB\n", + "Dimensions: (time: 186, node: 12785004, nele: 24875336, nvertex: 3,\n", + " mesh: 1, nbou: 262, nvel: 12421)\n", + "Coordinates:\n", + " * time (time) datetime64[ns] 1kB 2024-08-07T01:00:00 ... 2024-08-14...\n", + " x (node) float64 102MB dask.array\n", + " y (node) float64 102MB dask.array\n", + "Dimensions without coordinates: node, nele, nvertex, mesh, nbou, nvel\n", + "Data variables:\n", + " element (nele, nvertex) int32 299MB dask.array\n", + " adcirc_mesh (mesh) int32 4B dask.array\n", + " nvell (nbou) int32 1kB dask.array\n", + " max_nvell int32 4B ...\n", + " ibtype (nbou) int32 1kB dask.array\n", + " nbvv (nvel) int32 50kB dask.array\n", + " depth (node) float64 102MB dask.array\n", + " zeta (time, node) float64 19GB dask.array\n", + "Attributes: (12/50)\n", + " _FillValue: -99999.0\n", + " model: ADCIRC\n", + " version: noaa.stofs.2d.glo.v2.1.0r1.v55.12\n", + " git_hash: 23947fbd9683d0ef48f12e6ce62d45d18bc27ff3\n", + " grid_type: Triangular\n", + " description: 2024080706 :-6 hr nowcast and +180 hr forecast ! 32 C...\n", + " ... ...\n", + " sfea0: 45.0\n", + " cf: 0.0005\n", + " eslm: -0.2\n", + " cori: 0.0\n", + " ntif: 8\n", + " nbfr: 0" ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import cf_xarray #noqa\n", + "import fsspec\n", + "import xarray as xr\n", + "\n", + "import xarray_subset_grid\n", + "\n", + "# Open the dataset from NODD s3 bucket directly\n", + "fs = fsspec.filesystem(\"s3\", anon=True)\n", + "ds_cwl = xr.open_dataset(\n", + " fs.open(\n", + " \"s3://noaa-gestofs-pds/stofs_2d_glo.20240807/stofs_2d_glo.t06z.fields.cwl.nc\"\n", + " ),\n", + " chunks={},\n", + " drop_variables=['nvel']\n", + ")\n", + "\n", + "ds_cwl" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "x-A2kbpYa-7G" + }, + "source": [ + "Make the dataset CF compliant" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "21LQ8NAFwY0v" + }, + "outputs": [], + "source": [ + "ds_cwl = xarray_subset_grid.grids.ugrid.assign_ugrid_topology(ds_cwl)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 }, + "id": "aTp9T5w7wY0x", + "outputId": "77ef166f-c08f-459e-cada-590530d9c90b" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "6UHg8nKQZRVG" + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" }, - "source": [ - "Compute the subset selector. \n", - "Specify the selector name for easier accessibility. (optional)" + "text/plain": [ + "'Dataset size: 19.629483356 Gb'" ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f\"Dataset size: {ds_cwl.nbytes * 1.0e-9} Gb\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MoMm_GNvwY0y" + }, + "source": [ + "### Example BBOX\n", + "\n", + "Drawn with https://geojson.io\n", + "\n", + "![image.png](example_data/image.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6UHg8nKQZRVG" + }, + "source": [ + "Compute the subset selector. \n", + "Specify the selector name for easier accessibility. (optional)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "o8655obSwY0z", + "outputId": "e810be20-35b7-4e1f-93c9-60034bec1e2a" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "o8655obSwY0z", - "outputId": "e810be20-35b7-4e1f-93c9-60034bec1e2a" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 17.6 s, sys: 1.92 s, total: 19.5 s\n", - "Wall time: 58.3 s\n" - ] - }, - { - "data": { - "text/plain": [ - " - northeastUSA2d" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "\n", - "bbox = (-70, 40, -60, 50)\n", - "name = 'northeastUSA2d'\n", - "\n", - "bbox_selector = ds_cwl.xsg.grid.compute_bbox_subset_selector(ds_cwl, bbox, name)\n", - "bbox_selector" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 17.6 s, sys: 1.92 s, total: 19.5 s\n", + "Wall time: 58.3 s\n" + ] }, { - "cell_type": "markdown", - "metadata": { - "id": "CTljtYz_ZadD" - }, - "source": [ - "Use the subset selector to slice the dataset. This is fast because the computation is already done" + "data": { + "text/plain": [ + " - northeastUSA2d" ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "\n", + "bbox = (-70, 40, -60, 50)\n", + "name = 'northeastUSA2d'\n", + "\n", + "bbox_selector = ds_cwl.xsg.grid.compute_bbox_subset_selector(ds_cwl, bbox, name)\n", + "bbox_selector" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CTljtYz_ZadD" + }, + "source": [ + "Use the subset selector to slice the dataset. This is fast because the computation is already done" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 452 }, + "id": "NKOW5A1AZVEW", + "outputId": "8dd61935-c14d-4bc3-c57d-db7856558a05" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 452 - }, - "id": "NKOW5A1AZVEW", - "outputId": "8dd61935-c14d-4bc3-c57d-db7856558a05" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 255 ms, sys: 0 ns, total: 255 ms\n", - "Wall time: 253 ms\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset> Size: 547MB\n",
-              "Dimensions:      (time: 186, node: 356230, nele: 686355, nvertex: 3, mesh: 1,\n",
-              "                  nbou: 262, nvel: 12421)\n",
-              "Coordinates:\n",
-              "  * time         (time) datetime64[ns] 1kB 2024-08-07T01:00:00 ... 2024-08-14...\n",
-              "    x            (node) float64 3MB dask.array<chunksize=(79,), meta=np.ndarray>\n",
-              "    y            (node) float64 3MB dask.array<chunksize=(79,), meta=np.ndarray>\n",
-              "Dimensions without coordinates: node, nele, nvertex, mesh, nbou, nvel\n",
-              "Data variables:\n",
-              "    element      (nele, nvertex) int32 8MB dask.array<chunksize=(44090, 1), meta=np.ndarray>\n",
-              "    adcirc_mesh  (mesh) int32 4B dask.array<chunksize=(1,), meta=np.ndarray>\n",
-              "    nvell        (nbou) int32 1kB dask.array<chunksize=(262,), meta=np.ndarray>\n",
-              "    max_nvell    int32 4B ...\n",
-              "    ibtype       (nbou) int32 1kB dask.array<chunksize=(262,), meta=np.ndarray>\n",
-              "    nbvv         (nvel) int32 50kB dask.array<chunksize=(12421,), meta=np.ndarray>\n",
-              "    depth        (node) float64 3MB dask.array<chunksize=(79,), meta=np.ndarray>\n",
-              "    zeta         (time, node) float64 530MB dask.array<chunksize=(1, 79), meta=np.ndarray>\n",
-              "Attributes: (12/50)\n",
-              "    _FillValue:         -99999.0\n",
-              "    model:              ADCIRC\n",
-              "    version:            noaa.stofs.2d.glo.v2.1.0r1.v55.12\n",
-              "    git_hash:           23947fbd9683d0ef48f12e6ce62d45d18bc27ff3\n",
-              "    grid_type:          Triangular\n",
-              "    description:        2024080706 :-6 hr nowcast and +180 hr forecast ! 32 C...\n",
-              "    ...                 ...\n",
-              "    sfea0:              45.0\n",
-              "    cf:                 0.0005\n",
-              "    eslm:               -0.2\n",
-              "    cori:               0.0\n",
-              "    ntif:               8\n",
-              "    nbfr:               0
" - ], - "text/plain": [ - " Size: 547MB\n", - "Dimensions: (time: 186, node: 356230, nele: 686355, nvertex: 3, mesh: 1,\n", - " nbou: 262, nvel: 12421)\n", - "Coordinates:\n", - " * time (time) datetime64[ns] 1kB 2024-08-07T01:00:00 ... 2024-08-14...\n", - " x (node) float64 3MB dask.array\n", - " y (node) float64 3MB dask.array\n", - "Dimensions without coordinates: node, nele, nvertex, mesh, nbou, nvel\n", - "Data variables:\n", - " element (nele, nvertex) int32 8MB dask.array\n", - " adcirc_mesh (mesh) int32 4B dask.array\n", - " nvell (nbou) int32 1kB dask.array\n", - " max_nvell int32 4B ...\n", - " ibtype (nbou) int32 1kB dask.array\n", - " nbvv (nvel) int32 50kB dask.array\n", - " depth (node) float64 3MB dask.array\n", - " zeta (time, node) float64 530MB dask.array\n", - "Attributes: (12/50)\n", - " _FillValue: -99999.0\n", - " model: ADCIRC\n", - " version: noaa.stofs.2d.glo.v2.1.0r1.v55.12\n", - " git_hash: 23947fbd9683d0ef48f12e6ce62d45d18bc27ff3\n", - " grid_type: Triangular\n", - " description: 2024080706 :-6 hr nowcast and +180 hr forecast ! 32 C...\n", - " ... ...\n", - " sfea0: 45.0\n", - " cf: 0.0005\n", - " eslm: -0.2\n", - " cori: 0.0\n", - " ntif: 8\n", - " nbfr: 0" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "\n", - "ds_subset_cwl = bbox_selector.select(ds_cwl)\n", - "ds_subset_cwl" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 255 ms, sys: 0 ns, total: 255 ms\n", + "Wall time: 253 ms\n" + ] }, { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 35 - }, - "id": "RA-O7wKWZiHA", - "outputId": "aea78a2d-7c5c-483c-ee10-d3432917162e" - }, - "outputs": [ - { - "data": { - "application/vnd.google.colaboratory.intrinsic+json": { - "type": "string" - }, - "text/plain": [ - "'Dataset size: 0.546909296 Gb'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset> Size: 547MB\n",
+       "Dimensions:      (time: 186, node: 356230, nele: 686355, nvertex: 3, mesh: 1,\n",
+       "                  nbou: 262, nvel: 12421)\n",
+       "Coordinates:\n",
+       "  * time         (time) datetime64[ns] 1kB 2024-08-07T01:00:00 ... 2024-08-14...\n",
+       "    x            (node) float64 3MB dask.array<chunksize=(79,), meta=np.ndarray>\n",
+       "    y            (node) float64 3MB dask.array<chunksize=(79,), meta=np.ndarray>\n",
+       "Dimensions without coordinates: node, nele, nvertex, mesh, nbou, nvel\n",
+       "Data variables:\n",
+       "    element      (nele, nvertex) int32 8MB dask.array<chunksize=(44090, 1), meta=np.ndarray>\n",
+       "    adcirc_mesh  (mesh) int32 4B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+       "    nvell        (nbou) int32 1kB dask.array<chunksize=(262,), meta=np.ndarray>\n",
+       "    max_nvell    int32 4B ...\n",
+       "    ibtype       (nbou) int32 1kB dask.array<chunksize=(262,), meta=np.ndarray>\n",
+       "    nbvv         (nvel) int32 50kB dask.array<chunksize=(12421,), meta=np.ndarray>\n",
+       "    depth        (node) float64 3MB dask.array<chunksize=(79,), meta=np.ndarray>\n",
+       "    zeta         (time, node) float64 530MB dask.array<chunksize=(1, 79), meta=np.ndarray>\n",
+       "Attributes: (12/50)\n",
+       "    _FillValue:         -99999.0\n",
+       "    model:              ADCIRC\n",
+       "    version:            noaa.stofs.2d.glo.v2.1.0r1.v55.12\n",
+       "    git_hash:           23947fbd9683d0ef48f12e6ce62d45d18bc27ff3\n",
+       "    grid_type:          Triangular\n",
+       "    description:        2024080706 :-6 hr nowcast and +180 hr forecast ! 32 C...\n",
+       "    ...                 ...\n",
+       "    sfea0:              45.0\n",
+       "    cf:                 0.0005\n",
+       "    eslm:               -0.2\n",
+       "    cori:               0.0\n",
+       "    ntif:               8\n",
+       "    nbfr:               0
" ], - "source": [ - "f\"Dataset size: {ds_subset_cwl.nbytes * 1.0e-9} Gb\"" + "text/plain": [ + " Size: 547MB\n", + "Dimensions: (time: 186, node: 356230, nele: 686355, nvertex: 3, mesh: 1,\n", + " nbou: 262, nvel: 12421)\n", + "Coordinates:\n", + " * time (time) datetime64[ns] 1kB 2024-08-07T01:00:00 ... 2024-08-14...\n", + " x (node) float64 3MB dask.array\n", + " y (node) float64 3MB dask.array\n", + "Dimensions without coordinates: node, nele, nvertex, mesh, nbou, nvel\n", + "Data variables:\n", + " element (nele, nvertex) int32 8MB dask.array\n", + " adcirc_mesh (mesh) int32 4B dask.array\n", + " nvell (nbou) int32 1kB dask.array\n", + " max_nvell int32 4B ...\n", + " ibtype (nbou) int32 1kB dask.array\n", + " nbvv (nvel) int32 50kB dask.array\n", + " depth (node) float64 3MB dask.array\n", + " zeta (time, node) float64 530MB dask.array\n", + "Attributes: (12/50)\n", + " _FillValue: -99999.0\n", + " model: ADCIRC\n", + " version: noaa.stofs.2d.glo.v2.1.0r1.v55.12\n", + " git_hash: 23947fbd9683d0ef48f12e6ce62d45d18bc27ff3\n", + " grid_type: Triangular\n", + " description: 2024080706 :-6 hr nowcast and +180 hr forecast ! 32 C...\n", + " ... ...\n", + " sfea0: 45.0\n", + " cf: 0.0005\n", + " eslm: -0.2\n", + " cori: 0.0\n", + " ntif: 8\n", + " nbfr: 0" ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "\n", + "ds_subset_cwl = bbox_selector.select(ds_cwl)\n", + "ds_subset_cwl" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 }, + "id": "RA-O7wKWZiHA", + "outputId": "aea78a2d-7c5c-483c-ee10-d3432917162e" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "nOKHWSoeZyEi" + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" }, - "source": [ - "We can save the selector to disk. (as a pickle file) \n", - "Use the `save_to_bytes` function to return the selector as a bytes object. \n", - "To get a unique filename, you can use the `get_hashname` function." + "text/plain": [ + "'Dataset size: 0.546909296 Gb'" ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f\"Dataset size: {ds_subset_cwl.nbytes * 1.0e-9} Gb\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nOKHWSoeZyEi" + }, + "source": [ + "We can save the selector to disk. (as a pickle file) \n", + "Use the `save_to_bytes` function to return the selector as a bytes object. \n", + "To get a unique filename, you can use the `get_hashname` function." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 }, + "id": "NsfPNQBNZzsI", + "outputId": "9e3751ab-b435-4cbd-a6c0-8e7d5813dba8" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 35 - }, - "id": "NsfPNQBNZzsI", - "outputId": "9e3751ab-b435-4cbd-a6c0-8e7d5813dba8" + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" }, - "outputs": [ - { - "data": { - "application/vnd.google.colaboratory.intrinsic+json": { - "type": "string" - }, - "text/plain": [ - "'northeastUSA2d_bb3d126e.pkl'" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "selector_bytes = bbox_selector.save_to_bytes()\n", - "filepath = bbox_selector.get_hashname()\n", - "\n", - "with open(filepath, 'wb') as f:\n", - " f.write(selector_bytes)" + "text/plain": [ + "'northeastUSA2d_bb3d126e.pkl'" ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "selector_bytes = bbox_selector.save_to_bytes()\n", + "filepath = bbox_selector.get_hashname()\n", + "\n", + "with open(filepath, 'wb') as f:\n", + " f.write(selector_bytes)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KwJRl6GSZ5kI" + }, + "source": [ + "Open a selector using a bytes object.\n", + "This retains the subclass of the selector (i.e, UGridSelector, SGridSelector, etc)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "zU247L2QZ1_O", + "outputId": "997b8a0e-f27f-4620-8392-ad45df9e45df" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "KwJRl6GSZ5kI" - }, - "source": [ - "Open a selector using a bytes object.\n", - "This retains the subclass of the selector (i.e, UGridSelector, SGridSelector, etc)" + "data": { + "text/plain": [ + " - northeastUSA2d" ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from xarray_subset_grid import Selector\n", + "\n", + "selector_bytes = open(filepath, 'rb').read()\n", + "\n", + "loaded_bbox_selector = Selector(selector_bytes)\n", + "\n", + "loaded_bbox_selector" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1y_7FQPmZ85i" + }, + "source": [ + "Test if both the selectors are same." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "KRoJpqVdZ9xL", + "outputId": "bd3273d0-aac7-41cc-a68e-b55a23b82d2c" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "zU247L2QZ1_O", - "outputId": "997b8a0e-f27f-4620-8392-ad45df9e45df" - }, - "outputs": [ - { - "data": { - "text/plain": [ - " - northeastUSA2d" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from xarray_subset_grid import Selector\n", - "\n", - "selector_bytes = open(filepath, 'rb').read()\n", - "\n", - "loaded_bbox_selector = Selector(selector_bytes)\n", - "\n", - "loaded_bbox_selector" + "data": { + "text/plain": [ + "True" ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bbox_selector == loaded_bbox_selector" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JQ-PSVpnZ7oQ" + }, + "source": [ + "Now we can load in a different STOFS-2D file, like the Fields-SWL file. \n", + "To subset a SWL dataset, first compute a selector using the CWL dataset and then reuse the selector. \n", + "This way, we can avoid the error that occurs during the normal subset method." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "P6rA5uFLaF4C" + }, + "outputs": [], + "source": [ + "ds_swl = xr.open_dataset(\n", + " fs.open(\n", + " \"s3://noaa-gestofs-pds/stofs_2d_glo.20240807/stofs_2d_glo.t06z.fields.swl.nc\"\n", + " ),\n", + " chunks={},\n", + " drop_variables=['nvel']\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mLNvz_1JaNNn" + }, + "source": [ + "And then slice it with the same selector! \n", + "To subset a SWL dataset, first compute a selector using the CWL dataset and then reuse the selector." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 452 }, + "id": "cNYZW2hpaIxD", + "outputId": "550d2166-7cc1-4e34-e7f8-545246bb5bd9" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "1y_7FQPmZ85i" - }, - "source": [ - "Test if both the selectors are same." - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 380 ms, sys: 1.63 ms, total: 381 ms\n", + "Wall time: 410 ms\n" + ] }, { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "KRoJpqVdZ9xL", - "outputId": "bd3273d0-aac7-41cc-a68e-b55a23b82d2c" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset> Size: 547MB\n",
+       "Dimensions:      (time: 186, node: 356230, nele: 686355, nvertex: 3, mesh: 1,\n",
+       "                  nbou: 262, nvel: 12421)\n",
+       "Coordinates:\n",
+       "  * time         (time) datetime64[ns] 1kB 2024-08-07T01:00:00 ... 2024-08-14...\n",
+       "    x            (node) float64 3MB dask.array<chunksize=(79,), meta=np.ndarray>\n",
+       "    y            (node) float64 3MB dask.array<chunksize=(79,), meta=np.ndarray>\n",
+       "Dimensions without coordinates: node, nele, nvertex, mesh, nbou, nvel\n",
+       "Data variables:\n",
+       "    element      (nele, nvertex) int32 8MB dask.array<chunksize=(44090, 1), meta=np.ndarray>\n",
+       "    adcirc_mesh  (mesh) int32 4B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+       "    nvell        (nbou) int32 1kB dask.array<chunksize=(262,), meta=np.ndarray>\n",
+       "    max_nvell    int32 4B ...\n",
+       "    ibtype       (nbou) int32 1kB dask.array<chunksize=(262,), meta=np.ndarray>\n",
+       "    nbvv         (nvel) int32 50kB dask.array<chunksize=(12421,), meta=np.ndarray>\n",
+       "    depth        (node) float64 3MB dask.array<chunksize=(79,), meta=np.ndarray>\n",
+       "    zeta         (time, node) float64 530MB dask.array<chunksize=(1, 79), meta=np.ndarray>\n",
+       "Attributes: (12/50)\n",
+       "    _FillValue:         -99999.0\n",
+       "    model:              ADCIRC\n",
+       "    version:            noaa.stofs.2d.glo.v2.1.0r1.v55.12\n",
+       "    git_hash:           23947fbd9683d0ef48f12e6ce62d45d18bc27ff3\n",
+       "    grid_type:          Triangular\n",
+       "    description:        2024080706 :-6 hr nowcast and +180 hr forecast ! 32 C...\n",
+       "    ...                 ...\n",
+       "    sfea0:              45.0\n",
+       "    cf:                 0.0005\n",
+       "    eslm:               -0.2\n",
+       "    cori:               0.0\n",
+       "    ntif:               8\n",
+       "    nbfr:               0
" ], - "source": [ - "bbox_selector == loaded_bbox_selector" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "JQ-PSVpnZ7oQ" - }, - "source": [ - "Now we can load in a different STOFS-2D file, like the Fields-SWL file. \n", - "To subset a SWL dataset, first compute a selector using the CWL dataset and then reuse the selector. \n", - "This way, we can avoid the error that occurs during the normal subset method." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "id": "P6rA5uFLaF4C" - }, - "outputs": [], - "source": [ - "ds_swl = xr.open_dataset(\n", - " fs.open(\n", - " \"s3://noaa-gestofs-pds/stofs_2d_glo.20240807/stofs_2d_glo.t06z.fields.swl.nc\"\n", - " ),\n", - " chunks={},\n", - " drop_variables=['nvel']\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "mLNvz_1JaNNn" - }, - "source": [ - "And then slice it with the same selector! \n", - "To subset a SWL dataset, first compute a selector using the CWL dataset and then reuse the selector." + "text/plain": [ + " Size: 547MB\n", + "Dimensions: (time: 186, node: 356230, nele: 686355, nvertex: 3, mesh: 1,\n", + " nbou: 262, nvel: 12421)\n", + "Coordinates:\n", + " * time (time) datetime64[ns] 1kB 2024-08-07T01:00:00 ... 2024-08-14...\n", + " x (node) float64 3MB dask.array\n", + " y (node) float64 3MB dask.array\n", + "Dimensions without coordinates: node, nele, nvertex, mesh, nbou, nvel\n", + "Data variables:\n", + " element (nele, nvertex) int32 8MB dask.array\n", + " adcirc_mesh (mesh) int32 4B dask.array\n", + " nvell (nbou) int32 1kB dask.array\n", + " max_nvell int32 4B ...\n", + " ibtype (nbou) int32 1kB dask.array\n", + " nbvv (nvel) int32 50kB dask.array\n", + " depth (node) float64 3MB dask.array\n", + " zeta (time, node) float64 530MB dask.array\n", + "Attributes: (12/50)\n", + " _FillValue: -99999.0\n", + " model: ADCIRC\n", + " version: noaa.stofs.2d.glo.v2.1.0r1.v55.12\n", + " git_hash: 23947fbd9683d0ef48f12e6ce62d45d18bc27ff3\n", + " grid_type: Triangular\n", + " description: 2024080706 :-6 hr nowcast and +180 hr forecast ! 32 C...\n", + " ... ...\n", + " sfea0: 45.0\n", + " cf: 0.0005\n", + " eslm: -0.2\n", + " cori: 0.0\n", + " ntif: 8\n", + " nbfr: 0" ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "\n", + "ds_subset_swl = bbox_selector.select(ds_cwl)\n", + "ds_subset_swl" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 489 }, + "id": "fIKRTPtabkXY", + "outputId": "30e7aca7-e4a6-4150-9f61-5b5dfffaf53b" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 452 - }, - "id": "cNYZW2hpaIxD", - "outputId": "550d2166-7cc1-4e34-e7f8-545246bb5bd9" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 380 ms, sys: 1.63 ms, total: 381 ms\n", - "Wall time: 410 ms\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset> Size: 547MB\n",
-              "Dimensions:      (time: 186, node: 356230, nele: 686355, nvertex: 3, mesh: 1,\n",
-              "                  nbou: 262, nvel: 12421)\n",
-              "Coordinates:\n",
-              "  * time         (time) datetime64[ns] 1kB 2024-08-07T01:00:00 ... 2024-08-14...\n",
-              "    x            (node) float64 3MB dask.array<chunksize=(79,), meta=np.ndarray>\n",
-              "    y            (node) float64 3MB dask.array<chunksize=(79,), meta=np.ndarray>\n",
-              "Dimensions without coordinates: node, nele, nvertex, mesh, nbou, nvel\n",
-              "Data variables:\n",
-              "    element      (nele, nvertex) int32 8MB dask.array<chunksize=(44090, 1), meta=np.ndarray>\n",
-              "    adcirc_mesh  (mesh) int32 4B dask.array<chunksize=(1,), meta=np.ndarray>\n",
-              "    nvell        (nbou) int32 1kB dask.array<chunksize=(262,), meta=np.ndarray>\n",
-              "    max_nvell    int32 4B ...\n",
-              "    ibtype       (nbou) int32 1kB dask.array<chunksize=(262,), meta=np.ndarray>\n",
-              "    nbvv         (nvel) int32 50kB dask.array<chunksize=(12421,), meta=np.ndarray>\n",
-              "    depth        (node) float64 3MB dask.array<chunksize=(79,), meta=np.ndarray>\n",
-              "    zeta         (time, node) float64 530MB dask.array<chunksize=(1, 79), meta=np.ndarray>\n",
-              "Attributes: (12/50)\n",
-              "    _FillValue:         -99999.0\n",
-              "    model:              ADCIRC\n",
-              "    version:            noaa.stofs.2d.glo.v2.1.0r1.v55.12\n",
-              "    git_hash:           23947fbd9683d0ef48f12e6ce62d45d18bc27ff3\n",
-              "    grid_type:          Triangular\n",
-              "    description:        2024080706 :-6 hr nowcast and +180 hr forecast ! 32 C...\n",
-              "    ...                 ...\n",
-              "    sfea0:              45.0\n",
-              "    cf:                 0.0005\n",
-              "    eslm:               -0.2\n",
-              "    cori:               0.0\n",
-              "    ntif:               8\n",
-              "    nbfr:               0
" - ], - "text/plain": [ - " Size: 547MB\n", - "Dimensions: (time: 186, node: 356230, nele: 686355, nvertex: 3, mesh: 1,\n", - " nbou: 262, nvel: 12421)\n", - "Coordinates:\n", - " * time (time) datetime64[ns] 1kB 2024-08-07T01:00:00 ... 2024-08-14...\n", - " x (node) float64 3MB dask.array\n", - " y (node) float64 3MB dask.array\n", - "Dimensions without coordinates: node, nele, nvertex, mesh, nbou, nvel\n", - "Data variables:\n", - " element (nele, nvertex) int32 8MB dask.array\n", - " adcirc_mesh (mesh) int32 4B dask.array\n", - " nvell (nbou) int32 1kB dask.array\n", - " max_nvell int32 4B ...\n", - " ibtype (nbou) int32 1kB dask.array\n", - " nbvv (nvel) int32 50kB dask.array\n", - " depth (node) float64 3MB dask.array\n", - " zeta (time, node) float64 530MB dask.array\n", - "Attributes: (12/50)\n", - " _FillValue: -99999.0\n", - " model: ADCIRC\n", - " version: noaa.stofs.2d.glo.v2.1.0r1.v55.12\n", - " git_hash: 23947fbd9683d0ef48f12e6ce62d45d18bc27ff3\n", - " grid_type: Triangular\n", - " description: 2024080706 :-6 hr nowcast and +180 hr forecast ! 32 C...\n", - " ... ...\n", - " sfea0: 45.0\n", - " cf: 0.0005\n", - " eslm: -0.2\n", - " cori: 0.0\n", - " ntif: 8\n", - " nbfr: 0" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "\n", - "ds_subset_swl = bbox_selector.select(ds_cwl)\n", - "ds_subset_swl" + "data": { + "text/plain": [ + "[]" ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" }, { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 489 - }, - "id": "fIKRTPtabkXY", - "outputId": "30e7aca7-e4a6-4150-9f61-5b5dfffaf53b" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "ds_subset_cwl.isel(time=0).depth.plot()" + "data": { + "image/png": "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", + "text/plain": [ + "
" ] + }, + "metadata": {}, + "output_type": "display_data" } - ], - "metadata": { - "colab": { - "provenance": [] - }, - "kernelspec": { - "display_name": "venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.13" - } + ], + "source": [ + "ds_subset_cwl.isel(time=0).depth.plot()" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" }, - "nbformat": 4, - "nbformat_minor": 0 + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 0 } diff --git a/docs/examples/stofs_3d.ipynb b/docs/examples/stofs_3d.ipynb index 45fc8cd..7f35d95 100644 --- a/docs/examples/stofs_3d.ipynb +++ b/docs/examples/stofs_3d.ipynb @@ -1,7861 +1,7860 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "cKnWTixv0F-d" - }, - "source": [ - "# STOFS 3D" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/asascience-open/xarray-subset-grid/blob/main/docs/examples/stofs_3d.ipynb)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Install required libraries\n", - "# !pip install -q xarray_subset_grid@git+https://github.com/asascience-open/xarray-subset-grid.git\n", - "# !pip install -q s3fs cftime xarray cf-xarray fsspec dask h5netcdf" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Fw4rqcNkE3CM" - }, - "source": [ - "We use the Stofs-3d-Atl Out2d file to compute a subset selector and then reuse it to subset other files like temperature, salinity, etc. \n", - "In this example, we reuse it for temperature." - ] + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "cKnWTixv0F-d" + }, + "source": [ + "# STOFS 3D" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/asascience-open/xarray-subset-grid/blob/main/docs/examples/stofs_3d.ipynb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Install required libraries\n", + "# !pip install -q xarray_subset_grid@git+https://github.com/asascience-open/xarray-subset-grid.git\n", + "# !pip install -q s3fs cftime xarray cf-xarray fsspec dask h5netcdf" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Fw4rqcNkE3CM" + }, + "source": [ + "We use the Stofs-3d-Atl Out2d file to compute a subset selector and then reuse it to subset other files like temperature, salinity, etc. \n", + "In this example, we reuse it for temperature." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 576 }, + "id": "dOBQPslc0F-f", + "outputId": "90e88961-67f5-48cf-ec1d-dd7aed9f390a" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 576 - }, - "id": "dOBQPslc0F-f", - "outputId": "90e88961-67f5-48cf-ec1d-dd7aed9f390a" - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset> Size: 4GB\n",
-              "Dimensions:                  (time: 24, one: 1, nSCHISM_hgrid_node: 2973769,\n",
-              "                              nSCHISM_hgrid_face: 5728020,\n",
-              "                              nSCHISM_hgrid_edge: 8701944,\n",
-              "                              nMaxSCHISM_hgrid_face_nodes: 4, two: 2)\n",
-              "Coordinates:\n",
-              "  * time                     (time) datetime64[ns] 192B 2024-07-17T01:00:00 ....\n",
-              "    SCHISM_hgrid_node_x      (nSCHISM_hgrid_node) float64 24MB dask.array<chunksize=(495629,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_node_y      (nSCHISM_hgrid_node) float64 24MB dask.array<chunksize=(495629,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_face_x      (nSCHISM_hgrid_face) float64 46MB dask.array<chunksize=(520730,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_face_y      (nSCHISM_hgrid_face) float64 46MB dask.array<chunksize=(520730,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_edge_x      (nSCHISM_hgrid_edge) float64 70MB dask.array<chunksize=(511880,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_edge_y      (nSCHISM_hgrid_edge) float64 70MB dask.array<chunksize=(511880,), meta=np.ndarray>\n",
-              "Dimensions without coordinates: one, nSCHISM_hgrid_node, nSCHISM_hgrid_face,\n",
-              "                                nSCHISM_hgrid_edge,\n",
-              "                                nMaxSCHISM_hgrid_face_nodes, two\n",
-              "Data variables: (12/17)\n",
-              "    minimum_depth            (one) float64 8B dask.array<chunksize=(1,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid             (one) |S1 1B dask.array<chunksize=(1,), meta=np.ndarray>\n",
-              "    crs                      (one) int32 4B dask.array<chunksize=(1,), meta=np.ndarray>\n",
-              "    depth                    (nSCHISM_hgrid_node) float32 12MB dask.array<chunksize=(991257,), meta=np.ndarray>\n",
-              "    bottom_index_node        (nSCHISM_hgrid_node) int32 12MB dask.array<chunksize=(991257,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_face_nodes  (nSCHISM_hgrid_face, nMaxSCHISM_hgrid_face_nodes) float64 183MB dask.array<chunksize=(1145604, 1), meta=np.ndarray>\n",
-              "    ...                       ...\n",
-              "    windSpeedX               (time, nSCHISM_hgrid_node) float32 285MB dask.array<chunksize=(1, 991257), meta=np.ndarray>\n",
-              "    windSpeedY               (time, nSCHISM_hgrid_node) float32 285MB dask.array<chunksize=(1, 991257), meta=np.ndarray>\n",
-              "    windStressX              (time, nSCHISM_hgrid_node) float32 285MB dask.array<chunksize=(1, 991257), meta=np.ndarray>\n",
-              "    windStressY              (time, nSCHISM_hgrid_node) float32 285MB dask.array<chunksize=(1, 991257), meta=np.ndarray>\n",
-              "    dryFlagElement           (time, nSCHISM_hgrid_face) float32 550MB dask.array<chunksize=(1, 954670), meta=np.ndarray>\n",
-              "    dryFlagSide              (time, nSCHISM_hgrid_edge) float32 835MB dask.array<chunksize=(1, 966883), meta=np.ndarray>\n",
-              "Attributes:\n",
-              "    NCO:      netCDF Operators version 4.9.7 (Homepage = http://nco.sf.net, C...\n",
-              "    history:  Wed Jul 17 02:17:50 2024: ncatted -a units,windSpeedY,o,c,m/s -...
" - ], - "text/plain": [ - " Size: 4GB\n", - "Dimensions: (time: 24, one: 1, nSCHISM_hgrid_node: 2973769,\n", - " nSCHISM_hgrid_face: 5728020,\n", - " nSCHISM_hgrid_edge: 8701944,\n", - " nMaxSCHISM_hgrid_face_nodes: 4, two: 2)\n", - "Coordinates:\n", - " * time (time) datetime64[ns] 192B 2024-07-17T01:00:00 ....\n", - " SCHISM_hgrid_node_x (nSCHISM_hgrid_node) float64 24MB dask.array\n", - " SCHISM_hgrid_node_y (nSCHISM_hgrid_node) float64 24MB dask.array\n", - " SCHISM_hgrid_face_x (nSCHISM_hgrid_face) float64 46MB dask.array\n", - " SCHISM_hgrid_face_y (nSCHISM_hgrid_face) float64 46MB dask.array\n", - " SCHISM_hgrid_edge_x (nSCHISM_hgrid_edge) float64 70MB dask.array\n", - " SCHISM_hgrid_edge_y (nSCHISM_hgrid_edge) float64 70MB dask.array\n", - "Dimensions without coordinates: one, nSCHISM_hgrid_node, nSCHISM_hgrid_face,\n", - " nSCHISM_hgrid_edge,\n", - " nMaxSCHISM_hgrid_face_nodes, two\n", - "Data variables: (12/17)\n", - " minimum_depth (one) float64 8B dask.array\n", - " SCHISM_hgrid (one) |S1 1B dask.array\n", - " crs (one) int32 4B dask.array\n", - " depth (nSCHISM_hgrid_node) float32 12MB dask.array\n", - " bottom_index_node (nSCHISM_hgrid_node) int32 12MB dask.array\n", - " SCHISM_hgrid_face_nodes (nSCHISM_hgrid_face, nMaxSCHISM_hgrid_face_nodes) float64 183MB dask.array\n", - " ... ...\n", - " windSpeedX (time, nSCHISM_hgrid_node) float32 285MB dask.array\n", - " windSpeedY (time, nSCHISM_hgrid_node) float32 285MB dask.array\n", - " windStressX (time, nSCHISM_hgrid_node) float32 285MB dask.array\n", - " windStressY (time, nSCHISM_hgrid_node) float32 285MB dask.array\n", - " dryFlagElement (time, nSCHISM_hgrid_face) float32 550MB dask.array\n", - " dryFlagSide (time, nSCHISM_hgrid_edge) float32 835MB dask.array\n", - "Attributes:\n", - " NCO: netCDF Operators version 4.9.7 (Homepage = http://nco.sf.net, C...\n", - " history: Wed Jul 17 02:17:50 2024: ncatted -a units,windSpeedY,o,c,m/s -..." - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset> Size: 4GB\n",
+       "Dimensions:                  (time: 24, one: 1, nSCHISM_hgrid_node: 2973769,\n",
+       "                              nSCHISM_hgrid_face: 5728020,\n",
+       "                              nSCHISM_hgrid_edge: 8701944,\n",
+       "                              nMaxSCHISM_hgrid_face_nodes: 4, two: 2)\n",
+       "Coordinates:\n",
+       "  * time                     (time) datetime64[ns] 192B 2024-07-17T01:00:00 ....\n",
+       "    SCHISM_hgrid_node_x      (nSCHISM_hgrid_node) float64 24MB dask.array<chunksize=(495629,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_node_y      (nSCHISM_hgrid_node) float64 24MB dask.array<chunksize=(495629,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_face_x      (nSCHISM_hgrid_face) float64 46MB dask.array<chunksize=(520730,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_face_y      (nSCHISM_hgrid_face) float64 46MB dask.array<chunksize=(520730,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_edge_x      (nSCHISM_hgrid_edge) float64 70MB dask.array<chunksize=(511880,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_edge_y      (nSCHISM_hgrid_edge) float64 70MB dask.array<chunksize=(511880,), meta=np.ndarray>\n",
+       "Dimensions without coordinates: one, nSCHISM_hgrid_node, nSCHISM_hgrid_face,\n",
+       "                                nSCHISM_hgrid_edge,\n",
+       "                                nMaxSCHISM_hgrid_face_nodes, two\n",
+       "Data variables: (12/17)\n",
+       "    minimum_depth            (one) float64 8B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid             (one) |S1 1B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+       "    crs                      (one) int32 4B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+       "    depth                    (nSCHISM_hgrid_node) float32 12MB dask.array<chunksize=(991257,), meta=np.ndarray>\n",
+       "    bottom_index_node        (nSCHISM_hgrid_node) int32 12MB dask.array<chunksize=(991257,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_face_nodes  (nSCHISM_hgrid_face, nMaxSCHISM_hgrid_face_nodes) float64 183MB dask.array<chunksize=(1145604, 1), meta=np.ndarray>\n",
+       "    ...                       ...\n",
+       "    windSpeedX               (time, nSCHISM_hgrid_node) float32 285MB dask.array<chunksize=(1, 991257), meta=np.ndarray>\n",
+       "    windSpeedY               (time, nSCHISM_hgrid_node) float32 285MB dask.array<chunksize=(1, 991257), meta=np.ndarray>\n",
+       "    windStressX              (time, nSCHISM_hgrid_node) float32 285MB dask.array<chunksize=(1, 991257), meta=np.ndarray>\n",
+       "    windStressY              (time, nSCHISM_hgrid_node) float32 285MB dask.array<chunksize=(1, 991257), meta=np.ndarray>\n",
+       "    dryFlagElement           (time, nSCHISM_hgrid_face) float32 550MB dask.array<chunksize=(1, 954670), meta=np.ndarray>\n",
+       "    dryFlagSide              (time, nSCHISM_hgrid_edge) float32 835MB dask.array<chunksize=(1, 966883), meta=np.ndarray>\n",
+       "Attributes:\n",
+       "    NCO:      netCDF Operators version 4.9.7 (Homepage = http://nco.sf.net, C...\n",
+       "    history:  Wed Jul 17 02:17:50 2024: ncatted -a units,windSpeedY,o,c,m/s -...
" ], - "source": [ - "import cf_xarray #noqa\n", - "import fsspec\n", - "import numpy as np\n", - "import xarray as xr\n", - "\n", - "import xarray_subset_grid\n", - "\n", - "# Open the dataset from NODD s3 bucket directly\n", - "fs = fsspec.filesystem(\"s3\", anon=True)\n", - "ds = xr.open_dataset(\n", - " fs.open(\n", - " \"s3://noaa-nos-stofs3d-pds/STOFS-3D-Atl-shadow-VIMS/20240716/out2d_20240717.nc\"\n", - " ),\n", - " chunks={},\n", - " engine='h5netcdf',\n", - " drop_variables=['nvel']\n", - ")\n", - "\n", - "ds" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "anjPHNNM0F-h" - }, - "source": [ - "Fix any inconsistencies with regards to the dataset's UGRID specifications. (Make the dataset CF compliant)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "id": "Wwf2y4mP0F-i" - }, - "outputs": [], - "source": [ - "ds = xarray_subset_grid.grids.ugrid.assign_ugrid_topology(ds)" + "text/plain": [ + " Size: 4GB\n", + "Dimensions: (time: 24, one: 1, nSCHISM_hgrid_node: 2973769,\n", + " nSCHISM_hgrid_face: 5728020,\n", + " nSCHISM_hgrid_edge: 8701944,\n", + " nMaxSCHISM_hgrid_face_nodes: 4, two: 2)\n", + "Coordinates:\n", + " * time (time) datetime64[ns] 192B 2024-07-17T01:00:00 ....\n", + " SCHISM_hgrid_node_x (nSCHISM_hgrid_node) float64 24MB dask.array\n", + " SCHISM_hgrid_node_y (nSCHISM_hgrid_node) float64 24MB dask.array\n", + " SCHISM_hgrid_face_x (nSCHISM_hgrid_face) float64 46MB dask.array\n", + " SCHISM_hgrid_face_y (nSCHISM_hgrid_face) float64 46MB dask.array\n", + " SCHISM_hgrid_edge_x (nSCHISM_hgrid_edge) float64 70MB dask.array\n", + " SCHISM_hgrid_edge_y (nSCHISM_hgrid_edge) float64 70MB dask.array\n", + "Dimensions without coordinates: one, nSCHISM_hgrid_node, nSCHISM_hgrid_face,\n", + " nSCHISM_hgrid_edge,\n", + " nMaxSCHISM_hgrid_face_nodes, two\n", + "Data variables: (12/17)\n", + " minimum_depth (one) float64 8B dask.array\n", + " SCHISM_hgrid (one) |S1 1B dask.array\n", + " crs (one) int32 4B dask.array\n", + " depth (nSCHISM_hgrid_node) float32 12MB dask.array\n", + " bottom_index_node (nSCHISM_hgrid_node) int32 12MB dask.array\n", + " SCHISM_hgrid_face_nodes (nSCHISM_hgrid_face, nMaxSCHISM_hgrid_face_nodes) float64 183MB dask.array\n", + " ... ...\n", + " windSpeedX (time, nSCHISM_hgrid_node) float32 285MB dask.array\n", + " windSpeedY (time, nSCHISM_hgrid_node) float32 285MB dask.array\n", + " windStressX (time, nSCHISM_hgrid_node) float32 285MB dask.array\n", + " windStressY (time, nSCHISM_hgrid_node) float32 285MB dask.array\n", + " dryFlagElement (time, nSCHISM_hgrid_face) float32 550MB dask.array\n", + " dryFlagSide (time, nSCHISM_hgrid_edge) float32 835MB dask.array\n", + "Attributes:\n", + " NCO: netCDF Operators version 4.9.7 (Homepage = http://nco.sf.net, C...\n", + " history: Wed Jul 17 02:17:50 2024: ncatted -a units,windSpeedY,o,c,m/s -..." ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import cf_xarray #noqa\n", + "import fsspec\n", + "import xarray as xr\n", + "\n", + "import xarray_subset_grid\n", + "\n", + "# Open the dataset from NODD s3 bucket directly\n", + "fs = fsspec.filesystem(\"s3\", anon=True)\n", + "ds = xr.open_dataset(\n", + " fs.open(\n", + " \"s3://noaa-nos-stofs3d-pds/STOFS-3D-Atl-shadow-VIMS/20240716/out2d_20240717.nc\"\n", + " ),\n", + " chunks={},\n", + " engine='h5netcdf',\n", + " drop_variables=['nvel']\n", + ")\n", + "\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "anjPHNNM0F-h" + }, + "source": [ + "Fix any inconsistencies with regards to the dataset's UGRID specifications. (Make the dataset CF compliant)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "Wwf2y4mP0F-i" + }, + "outputs": [], + "source": [ + "ds = xarray_subset_grid.grids.ugrid.assign_ugrid_topology(ds)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 }, + "id": "VmXKT-Ey0F-j", + "outputId": "1aa05ec2-a985-443f-e15e-2d07b93395d1" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 35 - }, - "id": "VmXKT-Ey0F-j", - "outputId": "1aa05ec2-a985-443f-e15e-2d07b93395d1" + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" }, - "outputs": [ - { - "data": { - "application/vnd.google.colaboratory.intrinsic+json": { - "type": "string" - }, - "text/plain": [ - "'Dataset size: 4.293908965 Gb'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f\"Dataset size: {ds.nbytes * 1.0e-9} Gb\"" + "text/plain": [ + "'Dataset size: 4.293908965 Gb'" ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f\"Dataset size: {ds.nbytes * 1.0e-9} Gb\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example BBOX\n", + "\n", + "Drawn with https://geojson.io\n", + "\n", + "![image.png](example_data/image.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Or4QgmoD0F-k" + }, + "source": [ + "Compute the subset selection ahead of time, because STOFS doesn't include the grid in all of its output files. \n", + "Specify the selector name for easier accessibility. (optional)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "7uF3xT9U0F-l", + "outputId": "f9d50e0b-3b58-4ce7-b3f8-dde54b35f3e5" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Example BBOX\n", - "\n", - "Drawn with https://geojson.io\n", - "\n", - "![image.png](example_data/image.png)" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 6.54 s, sys: 829 ms, total: 7.37 s\n", + "Wall time: 11.8 s\n" + ] }, { - "cell_type": "markdown", - "metadata": { - "id": "Or4QgmoD0F-k" - }, - "source": [ - "Compute the subset selection ahead of time, because STOFS doesn't include the grid in all of its output files. \n", - "Specify the selector name for easier accessibility. (optional)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "7uF3xT9U0F-l", - "outputId": "f9d50e0b-3b58-4ce7-b3f8-dde54b35f3e5" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 6.54 s, sys: 829 ms, total: 7.37 s\n", - "Wall time: 11.8 s\n" - ] - }, - { - "data": { - "text/plain": [ - " - northeastUSA" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "\n", - "bbox = (-70, 40, -60, 50)\n", - "name = 'northeastUSA'\n", - "\n", - "bbox_selector = ds.xsg.grid.compute_bbox_subset_selector(ds, bbox, name)\n", - "bbox_selector" + "data": { + "text/plain": [ + " - northeastUSA" ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "\n", + "bbox = (-70, 40, -60, 50)\n", + "name = 'northeastUSA'\n", + "\n", + "bbox_selector = ds.xsg.grid.compute_bbox_subset_selector(ds, bbox, name)\n", + "bbox_selector" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "A4Iveume0F-m" + }, + "source": [ + "Then we can slice this dataset to make sure it works. This is FAST because the hard part is already done" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 611 }, + "id": "fMZWy3zp0F-n", + "outputId": "85e957cf-1f88-48dd-f308-fc573f0351c5" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "A4Iveume0F-m" - }, - "source": [ - "Then we can slice this dataset to make sure it works. This is FAST because the hard part is already done" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 301 ms, sys: 2.83 ms, total: 304 ms\n", + "Wall time: 301 ms\n" + ] }, { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 611 - }, - "id": "fMZWy3zp0F-n", - "outputId": "85e957cf-1f88-48dd-f308-fc573f0351c5" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 301 ms, sys: 2.83 ms, total: 304 ms\n", - "Wall time: 301 ms\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset> Size: 1GB\n",
-              "Dimensions:                  (time: 24, one: 1, nSCHISM_hgrid_node: 142475,\n",
-              "                              nSCHISM_hgrid_face: 274187,\n",
-              "                              nSCHISM_hgrid_edge: 8701944,\n",
-              "                              nMaxSCHISM_hgrid_face_nodes: 4, two: 2)\n",
-              "Coordinates:\n",
-              "  * time                     (time) datetime64[ns] 192B 2024-07-17T01:00:00 ....\n",
-              "    SCHISM_hgrid_node_x      (nSCHISM_hgrid_node) float64 1MB dask.array<chunksize=(7165,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_node_y      (nSCHISM_hgrid_node) float64 1MB dask.array<chunksize=(7165,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_face_x      (nSCHISM_hgrid_face) float64 2MB dask.array<chunksize=(166039,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_face_y      (nSCHISM_hgrid_face) float64 2MB dask.array<chunksize=(166039,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_edge_x      (nSCHISM_hgrid_edge) float64 70MB dask.array<chunksize=(511880,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_edge_y      (nSCHISM_hgrid_edge) float64 70MB dask.array<chunksize=(511880,), meta=np.ndarray>\n",
-              "Dimensions without coordinates: one, nSCHISM_hgrid_node, nSCHISM_hgrid_face,\n",
-              "                                nSCHISM_hgrid_edge,\n",
-              "                                nMaxSCHISM_hgrid_face_nodes, two\n",
-              "Data variables: (12/17)\n",
-              "    minimum_depth            (one) float64 8B dask.array<chunksize=(1,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid             (one) |S1 1B dask.array<chunksize=(1,), meta=np.ndarray>\n",
-              "    crs                      (one) int32 4B dask.array<chunksize=(1,), meta=np.ndarray>\n",
-              "    depth                    (nSCHISM_hgrid_node) float32 570kB dask.array<chunksize=(142475,), meta=np.ndarray>\n",
-              "    bottom_index_node        (nSCHISM_hgrid_node) int32 570kB dask.array<chunksize=(142475,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_face_nodes  (nSCHISM_hgrid_face, nMaxSCHISM_hgrid_face_nodes) float64 9MB dask.array<chunksize=(265743, 1), meta=np.ndarray>\n",
-              "    ...                       ...\n",
-              "    windSpeedX               (time, nSCHISM_hgrid_node) float32 14MB dask.array<chunksize=(1, 142475), meta=np.ndarray>\n",
-              "    windSpeedY               (time, nSCHISM_hgrid_node) float32 14MB dask.array<chunksize=(1, 142475), meta=np.ndarray>\n",
-              "    windStressX              (time, nSCHISM_hgrid_node) float32 14MB dask.array<chunksize=(1, 142475), meta=np.ndarray>\n",
-              "    windStressY              (time, nSCHISM_hgrid_node) float32 14MB dask.array<chunksize=(1, 142475), meta=np.ndarray>\n",
-              "    dryFlagElement           (time, nSCHISM_hgrid_face) float32 26MB dask.array<chunksize=(1, 253878), meta=np.ndarray>\n",
-              "    dryFlagSide              (time, nSCHISM_hgrid_edge) float32 835MB dask.array<chunksize=(1, 966883), meta=np.ndarray>\n",
-              "Attributes:\n",
-              "    NCO:      netCDF Operators version 4.9.7 (Homepage = http://nco.sf.net, C...\n",
-              "    history:  Wed Jul 17 02:17:50 2024: ncatted -a units,windSpeedY,o,c,m/s -...
" - ], - "text/plain": [ - " Size: 1GB\n", - "Dimensions: (time: 24, one: 1, nSCHISM_hgrid_node: 142475,\n", - " nSCHISM_hgrid_face: 274187,\n", - " nSCHISM_hgrid_edge: 8701944,\n", - " nMaxSCHISM_hgrid_face_nodes: 4, two: 2)\n", - "Coordinates:\n", - " * time (time) datetime64[ns] 192B 2024-07-17T01:00:00 ....\n", - " SCHISM_hgrid_node_x (nSCHISM_hgrid_node) float64 1MB dask.array\n", - " SCHISM_hgrid_node_y (nSCHISM_hgrid_node) float64 1MB dask.array\n", - " SCHISM_hgrid_face_x (nSCHISM_hgrid_face) float64 2MB dask.array\n", - " SCHISM_hgrid_face_y (nSCHISM_hgrid_face) float64 2MB dask.array\n", - " SCHISM_hgrid_edge_x (nSCHISM_hgrid_edge) float64 70MB dask.array\n", - " SCHISM_hgrid_edge_y (nSCHISM_hgrid_edge) float64 70MB dask.array\n", - "Dimensions without coordinates: one, nSCHISM_hgrid_node, nSCHISM_hgrid_face,\n", - " nSCHISM_hgrid_edge,\n", - " nMaxSCHISM_hgrid_face_nodes, two\n", - "Data variables: (12/17)\n", - " minimum_depth (one) float64 8B dask.array\n", - " SCHISM_hgrid (one) |S1 1B dask.array\n", - " crs (one) int32 4B dask.array\n", - " depth (nSCHISM_hgrid_node) float32 570kB dask.array\n", - " bottom_index_node (nSCHISM_hgrid_node) int32 570kB dask.array\n", - " SCHISM_hgrid_face_nodes (nSCHISM_hgrid_face, nMaxSCHISM_hgrid_face_nodes) float64 9MB dask.array\n", - " ... ...\n", - " windSpeedX (time, nSCHISM_hgrid_node) float32 14MB dask.array\n", - " windSpeedY (time, nSCHISM_hgrid_node) float32 14MB dask.array\n", - " windStressX (time, nSCHISM_hgrid_node) float32 14MB dask.array\n", - " windStressY (time, nSCHISM_hgrid_node) float32 14MB dask.array\n", - " dryFlagElement (time, nSCHISM_hgrid_face) float32 26MB dask.array\n", - " dryFlagSide (time, nSCHISM_hgrid_edge) float32 835MB dask.array\n", - "Attributes:\n", - " NCO: netCDF Operators version 4.9.7 (Homepage = http://nco.sf.net, C...\n", - " history: Wed Jul 17 02:17:50 2024: ncatted -a units,windSpeedY,o,c,m/s -..." - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset> Size: 1GB\n",
+       "Dimensions:                  (time: 24, one: 1, nSCHISM_hgrid_node: 142475,\n",
+       "                              nSCHISM_hgrid_face: 274187,\n",
+       "                              nSCHISM_hgrid_edge: 8701944,\n",
+       "                              nMaxSCHISM_hgrid_face_nodes: 4, two: 2)\n",
+       "Coordinates:\n",
+       "  * time                     (time) datetime64[ns] 192B 2024-07-17T01:00:00 ....\n",
+       "    SCHISM_hgrid_node_x      (nSCHISM_hgrid_node) float64 1MB dask.array<chunksize=(7165,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_node_y      (nSCHISM_hgrid_node) float64 1MB dask.array<chunksize=(7165,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_face_x      (nSCHISM_hgrid_face) float64 2MB dask.array<chunksize=(166039,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_face_y      (nSCHISM_hgrid_face) float64 2MB dask.array<chunksize=(166039,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_edge_x      (nSCHISM_hgrid_edge) float64 70MB dask.array<chunksize=(511880,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_edge_y      (nSCHISM_hgrid_edge) float64 70MB dask.array<chunksize=(511880,), meta=np.ndarray>\n",
+       "Dimensions without coordinates: one, nSCHISM_hgrid_node, nSCHISM_hgrid_face,\n",
+       "                                nSCHISM_hgrid_edge,\n",
+       "                                nMaxSCHISM_hgrid_face_nodes, two\n",
+       "Data variables: (12/17)\n",
+       "    minimum_depth            (one) float64 8B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid             (one) |S1 1B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+       "    crs                      (one) int32 4B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+       "    depth                    (nSCHISM_hgrid_node) float32 570kB dask.array<chunksize=(142475,), meta=np.ndarray>\n",
+       "    bottom_index_node        (nSCHISM_hgrid_node) int32 570kB dask.array<chunksize=(142475,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_face_nodes  (nSCHISM_hgrid_face, nMaxSCHISM_hgrid_face_nodes) float64 9MB dask.array<chunksize=(265743, 1), meta=np.ndarray>\n",
+       "    ...                       ...\n",
+       "    windSpeedX               (time, nSCHISM_hgrid_node) float32 14MB dask.array<chunksize=(1, 142475), meta=np.ndarray>\n",
+       "    windSpeedY               (time, nSCHISM_hgrid_node) float32 14MB dask.array<chunksize=(1, 142475), meta=np.ndarray>\n",
+       "    windStressX              (time, nSCHISM_hgrid_node) float32 14MB dask.array<chunksize=(1, 142475), meta=np.ndarray>\n",
+       "    windStressY              (time, nSCHISM_hgrid_node) float32 14MB dask.array<chunksize=(1, 142475), meta=np.ndarray>\n",
+       "    dryFlagElement           (time, nSCHISM_hgrid_face) float32 26MB dask.array<chunksize=(1, 253878), meta=np.ndarray>\n",
+       "    dryFlagSide              (time, nSCHISM_hgrid_edge) float32 835MB dask.array<chunksize=(1, 966883), meta=np.ndarray>\n",
+       "Attributes:\n",
+       "    NCO:      netCDF Operators version 4.9.7 (Homepage = http://nco.sf.net, C...\n",
+       "    history:  Wed Jul 17 02:17:50 2024: ncatted -a units,windSpeedY,o,c,m/s -...
" ], - "source": [ - "%%time\n", - "\n", - "ds_subset_control = bbox_selector.select(ds)\n", - "ds_subset_control" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 35 - }, - "id": "mnGd_r7a0F-n", - "outputId": "627fc705-6b1c-4d1b-eef2-439ea802ace0" - }, - "outputs": [ - { - "data": { - "application/vnd.google.colaboratory.intrinsic+json": { - "type": "string" - }, - "text/plain": [ - "'Dataset size: 1.2661721650000002 Gb'" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f\"Dataset size: {ds_subset_control.nbytes * 1.0e-9} Gb\"" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Tmd9BgNc0F-o" - }, - "source": [ - "We can save the selector to disk. (as a pickle file) \n", - "Use the `save_to_bytes` function to return the selector as a bytes object. \n", - "To get a unique filename, you can use the `get_hashname` function." + "text/plain": [ + " Size: 1GB\n", + "Dimensions: (time: 24, one: 1, nSCHISM_hgrid_node: 142475,\n", + " nSCHISM_hgrid_face: 274187,\n", + " nSCHISM_hgrid_edge: 8701944,\n", + " nMaxSCHISM_hgrid_face_nodes: 4, two: 2)\n", + "Coordinates:\n", + " * time (time) datetime64[ns] 192B 2024-07-17T01:00:00 ....\n", + " SCHISM_hgrid_node_x (nSCHISM_hgrid_node) float64 1MB dask.array\n", + " SCHISM_hgrid_node_y (nSCHISM_hgrid_node) float64 1MB dask.array\n", + " SCHISM_hgrid_face_x (nSCHISM_hgrid_face) float64 2MB dask.array\n", + " SCHISM_hgrid_face_y (nSCHISM_hgrid_face) float64 2MB dask.array\n", + " SCHISM_hgrid_edge_x (nSCHISM_hgrid_edge) float64 70MB dask.array\n", + " SCHISM_hgrid_edge_y (nSCHISM_hgrid_edge) float64 70MB dask.array\n", + "Dimensions without coordinates: one, nSCHISM_hgrid_node, nSCHISM_hgrid_face,\n", + " nSCHISM_hgrid_edge,\n", + " nMaxSCHISM_hgrid_face_nodes, two\n", + "Data variables: (12/17)\n", + " minimum_depth (one) float64 8B dask.array\n", + " SCHISM_hgrid (one) |S1 1B dask.array\n", + " crs (one) int32 4B dask.array\n", + " depth (nSCHISM_hgrid_node) float32 570kB dask.array\n", + " bottom_index_node (nSCHISM_hgrid_node) int32 570kB dask.array\n", + " SCHISM_hgrid_face_nodes (nSCHISM_hgrid_face, nMaxSCHISM_hgrid_face_nodes) float64 9MB dask.array\n", + " ... ...\n", + " windSpeedX (time, nSCHISM_hgrid_node) float32 14MB dask.array\n", + " windSpeedY (time, nSCHISM_hgrid_node) float32 14MB dask.array\n", + " windStressX (time, nSCHISM_hgrid_node) float32 14MB dask.array\n", + " windStressY (time, nSCHISM_hgrid_node) float32 14MB dask.array\n", + " dryFlagElement (time, nSCHISM_hgrid_face) float32 26MB dask.array\n", + " dryFlagSide (time, nSCHISM_hgrid_edge) float32 835MB dask.array\n", + "Attributes:\n", + " NCO: netCDF Operators version 4.9.7 (Homepage = http://nco.sf.net, C...\n", + " history: Wed Jul 17 02:17:50 2024: ncatted -a units,windSpeedY,o,c,m/s -..." ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "\n", + "ds_subset_control = bbox_selector.select(ds)\n", + "ds_subset_control" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 }, + "id": "mnGd_r7a0F-n", + "outputId": "627fc705-6b1c-4d1b-eef2-439ea802ace0" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 35 - }, - "id": "QgtvWOM40F-o", - "outputId": "5cc6003c-6e46-436f-8a64-8b17a4af39df" + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" }, - "outputs": [ - { - "data": { - "application/vnd.google.colaboratory.intrinsic+json": { - "type": "string" - }, - "text/plain": [ - "'northeastUSA_bb3d126e.pkl'" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "selector_bytes = bbox_selector.save_to_bytes()\n", - "filepath = bbox_selector.get_hashname()\n", - "\n", - "with open(filepath, 'wb') as f:\n", - " f.write(selector_bytes)" + "text/plain": [ + "'Dataset size: 1.2661721650000002 Gb'" ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f\"Dataset size: {ds_subset_control.nbytes * 1.0e-9} Gb\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Tmd9BgNc0F-o" + }, + "source": [ + "We can save the selector to disk. (as a pickle file) \n", + "Use the `save_to_bytes` function to return the selector as a bytes object. \n", + "To get a unique filename, you can use the `get_hashname` function." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 }, + "id": "QgtvWOM40F-o", + "outputId": "5cc6003c-6e46-436f-8a64-8b17a4af39df" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "4pwdYVPJFQwZ" + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" }, - "source": [ - "Open a selector using a bytes object.\n", - "This retains the subclass of the selector (i.e, UGridSelector, SGridSelector, etc)" + "text/plain": [ + "'northeastUSA_bb3d126e.pkl'" ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "selector_bytes = bbox_selector.save_to_bytes()\n", + "filepath = bbox_selector.get_hashname()\n", + "\n", + "with open(filepath, 'wb') as f:\n", + " f.write(selector_bytes)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4pwdYVPJFQwZ" + }, + "source": [ + "Open a selector using a bytes object.\n", + "This retains the subclass of the selector (i.e, UGridSelector, SGridSelector, etc)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "2Qpfhqez190z", + "outputId": "f9c3fc0d-8c65-4b4c-a58e-3e5fdc503236" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "2Qpfhqez190z", - "outputId": "f9c3fc0d-8c65-4b4c-a58e-3e5fdc503236" - }, - "outputs": [ - { - "data": { - "text/plain": [ - " - northeastUSA" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from xarray_subset_grid import Selector\n", - "\n", - "selector_bytes = open(filepath, 'rb').read()\n", - "\n", - "loaded_bbox_selector = Selector(selector_bytes)\n", - "\n", - "loaded_bbox_selector" + "data": { + "text/plain": [ + " - northeastUSA" ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from xarray_subset_grid import Selector\n", + "\n", + "selector_bytes = open(filepath, 'rb').read()\n", + "\n", + "loaded_bbox_selector = Selector(selector_bytes)\n", + "\n", + "loaded_bbox_selector" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TbaU-82Y1YN6" + }, + "source": [ + "Test if both the selectors are same." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "VeinLqPr1bF5", + "outputId": "1913721d-e39f-4a09-9a59-f83e4001769b" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "TbaU-82Y1YN6" - }, - "source": [ - "Test if both the selectors are same." + "data": { + "text/plain": [ + "True" ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bbox_selector == loaded_bbox_selector" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ebvSzaIE0F-o" + }, + "source": [ + "Now we can load in a STOFS 3D - temperature file from a different day and subset it!" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 576 }, + "id": "e1J5_Gxj0F-o", + "outputId": "3c335e74-a57c-4689-a00e-fd23b011bde6" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "VeinLqPr1bF5", - "outputId": "1913721d-e39f-4a09-9a59-f83e4001769b" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset> Size: 4GB\n",
+       "Dimensions:                  (time: 24, one: 1, nSCHISM_hgrid_node: 2973769,\n",
+       "                              nSCHISM_hgrid_face: 5728020,\n",
+       "                              nSCHISM_hgrid_edge: 8701944,\n",
+       "                              nMaxSCHISM_hgrid_face_nodes: 4, two: 2)\n",
+       "Coordinates:\n",
+       "  * time                     (time) datetime64[ns] 192B 2024-07-17T01:00:00 ....\n",
+       "    SCHISM_hgrid_node_x      (nSCHISM_hgrid_node) float64 24MB dask.array<chunksize=(495629,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_node_y      (nSCHISM_hgrid_node) float64 24MB dask.array<chunksize=(495629,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_face_x      (nSCHISM_hgrid_face) float64 46MB dask.array<chunksize=(520730,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_face_y      (nSCHISM_hgrid_face) float64 46MB dask.array<chunksize=(520730,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_edge_x      (nSCHISM_hgrid_edge) float64 70MB dask.array<chunksize=(511880,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_edge_y      (nSCHISM_hgrid_edge) float64 70MB dask.array<chunksize=(511880,), meta=np.ndarray>\n",
+       "Dimensions without coordinates: one, nSCHISM_hgrid_node, nSCHISM_hgrid_face,\n",
+       "                                nSCHISM_hgrid_edge,\n",
+       "                                nMaxSCHISM_hgrid_face_nodes, two\n",
+       "Data variables: (12/17)\n",
+       "    minimum_depth            (one) float64 8B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid             (one) |S1 1B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+       "    crs                      (one) int32 4B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+       "    depth                    (nSCHISM_hgrid_node) float32 12MB dask.array<chunksize=(991257,), meta=np.ndarray>\n",
+       "    bottom_index_node        (nSCHISM_hgrid_node) int32 12MB dask.array<chunksize=(991257,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_face_nodes  (nSCHISM_hgrid_face, nMaxSCHISM_hgrid_face_nodes) float64 183MB dask.array<chunksize=(1145604, 1), meta=np.ndarray>\n",
+       "    ...                       ...\n",
+       "    windSpeedX               (time, nSCHISM_hgrid_node) float32 285MB dask.array<chunksize=(1, 991257), meta=np.ndarray>\n",
+       "    windSpeedY               (time, nSCHISM_hgrid_node) float32 285MB dask.array<chunksize=(1, 991257), meta=np.ndarray>\n",
+       "    windStressX              (time, nSCHISM_hgrid_node) float32 285MB dask.array<chunksize=(1, 991257), meta=np.ndarray>\n",
+       "    windStressY              (time, nSCHISM_hgrid_node) float32 285MB dask.array<chunksize=(1, 991257), meta=np.ndarray>\n",
+       "    dryFlagElement           (time, nSCHISM_hgrid_face) float32 550MB dask.array<chunksize=(1, 954670), meta=np.ndarray>\n",
+       "    dryFlagSide              (time, nSCHISM_hgrid_edge) float32 835MB dask.array<chunksize=(1, 966883), meta=np.ndarray>\n",
+       "Attributes:\n",
+       "    NCO:      netCDF Operators version 4.9.7 (Homepage = http://nco.sf.net, C...\n",
+       "    history:  Wed Jul 17 02:17:50 2024: ncatted -a units,windSpeedY,o,c,m/s -...
" ], - "source": [ - "bbox_selector == loaded_bbox_selector" + "text/plain": [ + " Size: 4GB\n", + "Dimensions: (time: 24, one: 1, nSCHISM_hgrid_node: 2973769,\n", + " nSCHISM_hgrid_face: 5728020,\n", + " nSCHISM_hgrid_edge: 8701944,\n", + " nMaxSCHISM_hgrid_face_nodes: 4, two: 2)\n", + "Coordinates:\n", + " * time (time) datetime64[ns] 192B 2024-07-17T01:00:00 ....\n", + " SCHISM_hgrid_node_x (nSCHISM_hgrid_node) float64 24MB dask.array\n", + " SCHISM_hgrid_node_y (nSCHISM_hgrid_node) float64 24MB dask.array\n", + " SCHISM_hgrid_face_x (nSCHISM_hgrid_face) float64 46MB dask.array\n", + " SCHISM_hgrid_face_y (nSCHISM_hgrid_face) float64 46MB dask.array\n", + " SCHISM_hgrid_edge_x (nSCHISM_hgrid_edge) float64 70MB dask.array\n", + " SCHISM_hgrid_edge_y (nSCHISM_hgrid_edge) float64 70MB dask.array\n", + "Dimensions without coordinates: one, nSCHISM_hgrid_node, nSCHISM_hgrid_face,\n", + " nSCHISM_hgrid_edge,\n", + " nMaxSCHISM_hgrid_face_nodes, two\n", + "Data variables: (12/17)\n", + " minimum_depth (one) float64 8B dask.array\n", + " SCHISM_hgrid (one) |S1 1B dask.array\n", + " crs (one) int32 4B dask.array\n", + " depth (nSCHISM_hgrid_node) float32 12MB dask.array\n", + " bottom_index_node (nSCHISM_hgrid_node) int32 12MB dask.array\n", + " SCHISM_hgrid_face_nodes (nSCHISM_hgrid_face, nMaxSCHISM_hgrid_face_nodes) float64 183MB dask.array\n", + " ... ...\n", + " windSpeedX (time, nSCHISM_hgrid_node) float32 285MB dask.array\n", + " windSpeedY (time, nSCHISM_hgrid_node) float32 285MB dask.array\n", + " windStressX (time, nSCHISM_hgrid_node) float32 285MB dask.array\n", + " windStressY (time, nSCHISM_hgrid_node) float32 285MB dask.array\n", + " dryFlagElement (time, nSCHISM_hgrid_face) float32 550MB dask.array\n", + " dryFlagSide (time, nSCHISM_hgrid_edge) float32 835MB dask.array\n", + "Attributes:\n", + " NCO: netCDF Operators version 4.9.7 (Homepage = http://nco.sf.net, C...\n", + " history: Wed Jul 17 02:17:50 2024: ncatted -a units,windSpeedY,o,c,m/s -..." ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds_temp = xr.open_dataset(\n", + " fs.open(\n", + " \"s3://noaa-nos-stofs3d-pds/STOFS-3D-Atl-shadow-VIMS/20240728/temperature_20240728.nc\"\n", + " ),\n", + " chunks={},\n", + " drop_variables=['nvel']\n", + ")\n", + "\n", + "ds_temp = xarray_subset_grid.grids.ugrid.assign_ugrid_topology(ds_temp)\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "w89jrnv90F-p" + }, + "source": [ + "And then slice it with the same selector!" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 692 }, + "id": "lZbYtR8o0F-p", + "outputId": "7bd6f508-4433-495b-9f9a-3badaa56359e" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "ebvSzaIE0F-o" - }, - "source": [ - "Now we can load in a STOFS 3D - temperature file from a different day and subset it!" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 171 ms, sys: 129 µs, total: 172 ms\n", + "Wall time: 172 ms\n" + ] }, { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 576 - }, - "id": "e1J5_Gxj0F-o", - "outputId": "3c335e74-a57c-4689-a00e-fd23b011bde6" - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset> Size: 4GB\n",
-              "Dimensions:                  (time: 24, one: 1, nSCHISM_hgrid_node: 2973769,\n",
-              "                              nSCHISM_hgrid_face: 5728020,\n",
-              "                              nSCHISM_hgrid_edge: 8701944,\n",
-              "                              nMaxSCHISM_hgrid_face_nodes: 4, two: 2)\n",
-              "Coordinates:\n",
-              "  * time                     (time) datetime64[ns] 192B 2024-07-17T01:00:00 ....\n",
-              "    SCHISM_hgrid_node_x      (nSCHISM_hgrid_node) float64 24MB dask.array<chunksize=(495629,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_node_y      (nSCHISM_hgrid_node) float64 24MB dask.array<chunksize=(495629,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_face_x      (nSCHISM_hgrid_face) float64 46MB dask.array<chunksize=(520730,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_face_y      (nSCHISM_hgrid_face) float64 46MB dask.array<chunksize=(520730,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_edge_x      (nSCHISM_hgrid_edge) float64 70MB dask.array<chunksize=(511880,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_edge_y      (nSCHISM_hgrid_edge) float64 70MB dask.array<chunksize=(511880,), meta=np.ndarray>\n",
-              "Dimensions without coordinates: one, nSCHISM_hgrid_node, nSCHISM_hgrid_face,\n",
-              "                                nSCHISM_hgrid_edge,\n",
-              "                                nMaxSCHISM_hgrid_face_nodes, two\n",
-              "Data variables: (12/17)\n",
-              "    minimum_depth            (one) float64 8B dask.array<chunksize=(1,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid             (one) |S1 1B dask.array<chunksize=(1,), meta=np.ndarray>\n",
-              "    crs                      (one) int32 4B dask.array<chunksize=(1,), meta=np.ndarray>\n",
-              "    depth                    (nSCHISM_hgrid_node) float32 12MB dask.array<chunksize=(991257,), meta=np.ndarray>\n",
-              "    bottom_index_node        (nSCHISM_hgrid_node) int32 12MB dask.array<chunksize=(991257,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_face_nodes  (nSCHISM_hgrid_face, nMaxSCHISM_hgrid_face_nodes) float64 183MB dask.array<chunksize=(1145604, 1), meta=np.ndarray>\n",
-              "    ...                       ...\n",
-              "    windSpeedX               (time, nSCHISM_hgrid_node) float32 285MB dask.array<chunksize=(1, 991257), meta=np.ndarray>\n",
-              "    windSpeedY               (time, nSCHISM_hgrid_node) float32 285MB dask.array<chunksize=(1, 991257), meta=np.ndarray>\n",
-              "    windStressX              (time, nSCHISM_hgrid_node) float32 285MB dask.array<chunksize=(1, 991257), meta=np.ndarray>\n",
-              "    windStressY              (time, nSCHISM_hgrid_node) float32 285MB dask.array<chunksize=(1, 991257), meta=np.ndarray>\n",
-              "    dryFlagElement           (time, nSCHISM_hgrid_face) float32 550MB dask.array<chunksize=(1, 954670), meta=np.ndarray>\n",
-              "    dryFlagSide              (time, nSCHISM_hgrid_edge) float32 835MB dask.array<chunksize=(1, 966883), meta=np.ndarray>\n",
-              "Attributes:\n",
-              "    NCO:      netCDF Operators version 4.9.7 (Homepage = http://nco.sf.net, C...\n",
-              "    history:  Wed Jul 17 02:17:50 2024: ncatted -a units,windSpeedY,o,c,m/s -...
" - ], - "text/plain": [ - " Size: 4GB\n", - "Dimensions: (time: 24, one: 1, nSCHISM_hgrid_node: 2973769,\n", - " nSCHISM_hgrid_face: 5728020,\n", - " nSCHISM_hgrid_edge: 8701944,\n", - " nMaxSCHISM_hgrid_face_nodes: 4, two: 2)\n", - "Coordinates:\n", - " * time (time) datetime64[ns] 192B 2024-07-17T01:00:00 ....\n", - " SCHISM_hgrid_node_x (nSCHISM_hgrid_node) float64 24MB dask.array\n", - " SCHISM_hgrid_node_y (nSCHISM_hgrid_node) float64 24MB dask.array\n", - " SCHISM_hgrid_face_x (nSCHISM_hgrid_face) float64 46MB dask.array\n", - " SCHISM_hgrid_face_y (nSCHISM_hgrid_face) float64 46MB dask.array\n", - " SCHISM_hgrid_edge_x (nSCHISM_hgrid_edge) float64 70MB dask.array\n", - " SCHISM_hgrid_edge_y (nSCHISM_hgrid_edge) float64 70MB dask.array\n", - "Dimensions without coordinates: one, nSCHISM_hgrid_node, nSCHISM_hgrid_face,\n", - " nSCHISM_hgrid_edge,\n", - " nMaxSCHISM_hgrid_face_nodes, two\n", - "Data variables: (12/17)\n", - " minimum_depth (one) float64 8B dask.array\n", - " SCHISM_hgrid (one) |S1 1B dask.array\n", - " crs (one) int32 4B dask.array\n", - " depth (nSCHISM_hgrid_node) float32 12MB dask.array\n", - " bottom_index_node (nSCHISM_hgrid_node) int32 12MB dask.array\n", - " SCHISM_hgrid_face_nodes (nSCHISM_hgrid_face, nMaxSCHISM_hgrid_face_nodes) float64 183MB dask.array\n", - " ... ...\n", - " windSpeedX (time, nSCHISM_hgrid_node) float32 285MB dask.array\n", - " windSpeedY (time, nSCHISM_hgrid_node) float32 285MB dask.array\n", - " windStressX (time, nSCHISM_hgrid_node) float32 285MB dask.array\n", - " windStressY (time, nSCHISM_hgrid_node) float32 285MB dask.array\n", - " dryFlagElement (time, nSCHISM_hgrid_face) float32 550MB dask.array\n", - " dryFlagSide (time, nSCHISM_hgrid_edge) float32 835MB dask.array\n", - "Attributes:\n", - " NCO: netCDF Operators version 4.9.7 (Homepage = http://nco.sf.net, C...\n", - " history: Wed Jul 17 02:17:50 2024: ncatted -a units,windSpeedY,o,c,m/s -..." - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset> Size: 965MB\n",
+       "Dimensions:                  (time: 24, one: 1, nSCHISM_hgrid_node: 142475,\n",
+       "                              nSCHISM_hgrid_face: 274187,\n",
+       "                              nSCHISM_hgrid_edge: 8701944,\n",
+       "                              nMaxSCHISM_hgrid_face_nodes: 4, two: 2,\n",
+       "                              nSCHISM_vgrid_layers: 49)\n",
+       "Coordinates:\n",
+       "  * time                     (time) datetime64[ns] 192B 2024-07-28T01:00:00 ....\n",
+       "    SCHISM_hgrid_node_x      (nSCHISM_hgrid_node) float64 1MB dask.array<chunksize=(7165,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_node_y      (nSCHISM_hgrid_node) float64 1MB dask.array<chunksize=(7165,), meta=np.ndarray>\n",
+       "Dimensions without coordinates: one, nSCHISM_hgrid_node, nSCHISM_hgrid_face,\n",
+       "                                nSCHISM_hgrid_edge,\n",
+       "                                nMaxSCHISM_hgrid_face_nodes, two,\n",
+       "                                nSCHISM_vgrid_layers\n",
+       "Data variables:\n",
+       "    minimum_depth            (one) float64 8B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid             (one) |S1 1B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+       "    crs                      (one) int32 4B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+       "    depth                    (nSCHISM_hgrid_node) float32 570kB dask.array<chunksize=(142475,), meta=np.ndarray>\n",
+       "    bottom_index_node        (nSCHISM_hgrid_node) int32 570kB dask.array<chunksize=(142475,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_face_x      (nSCHISM_hgrid_face) float64 2MB dask.array<chunksize=(166039,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_face_y      (nSCHISM_hgrid_face) float64 2MB dask.array<chunksize=(166039,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_edge_x      (nSCHISM_hgrid_edge) float64 70MB dask.array<chunksize=(511880,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_edge_y      (nSCHISM_hgrid_edge) float64 70MB dask.array<chunksize=(511880,), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_face_nodes  (nSCHISM_hgrid_face, nMaxSCHISM_hgrid_face_nodes) float64 9MB dask.array<chunksize=(265743, 1), meta=np.ndarray>\n",
+       "    SCHISM_hgrid_edge_nodes  (nSCHISM_hgrid_edge, two) float64 139MB dask.array<chunksize=(1740389, 1), meta=np.ndarray>\n",
+       "    temperature              (time, nSCHISM_hgrid_node, nSCHISM_vgrid_layers) float32 670MB dask.array<chunksize=(1, 142475, 49), meta=np.ndarray>\n",
+       "Attributes:\n",
+       "    NCO:      netCDF Operators version 4.9.7 (Homepage = http://nco.sf.net, C...\n",
+       "    history:  Mon Jul 29 02:42:02 2024: ncatted -a units,temperature,o,c,Degr...
" ], - "source": [ - "ds_temp = xr.open_dataset(\n", - " fs.open(\n", - " \"s3://noaa-nos-stofs3d-pds/STOFS-3D-Atl-shadow-VIMS/20240728/temperature_20240728.nc\"\n", - " ),\n", - " chunks={},\n", - " drop_variables=['nvel']\n", - ")\n", - "\n", - "ds_temp = xarray_subset_grid.grids.ugrid.assign_ugrid_topology(ds_temp)\n", - "ds" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "w89jrnv90F-p" - }, - "source": [ - "And then slice it with the same selector!" + "text/plain": [ + " Size: 965MB\n", + "Dimensions: (time: 24, one: 1, nSCHISM_hgrid_node: 142475,\n", + " nSCHISM_hgrid_face: 274187,\n", + " nSCHISM_hgrid_edge: 8701944,\n", + " nMaxSCHISM_hgrid_face_nodes: 4, two: 2,\n", + " nSCHISM_vgrid_layers: 49)\n", + "Coordinates:\n", + " * time (time) datetime64[ns] 192B 2024-07-28T01:00:00 ....\n", + " SCHISM_hgrid_node_x (nSCHISM_hgrid_node) float64 1MB dask.array\n", + " SCHISM_hgrid_node_y (nSCHISM_hgrid_node) float64 1MB dask.array\n", + "Dimensions without coordinates: one, nSCHISM_hgrid_node, nSCHISM_hgrid_face,\n", + " nSCHISM_hgrid_edge,\n", + " nMaxSCHISM_hgrid_face_nodes, two,\n", + " nSCHISM_vgrid_layers\n", + "Data variables:\n", + " minimum_depth (one) float64 8B dask.array\n", + " SCHISM_hgrid (one) |S1 1B dask.array\n", + " crs (one) int32 4B dask.array\n", + " depth (nSCHISM_hgrid_node) float32 570kB dask.array\n", + " bottom_index_node (nSCHISM_hgrid_node) int32 570kB dask.array\n", + " SCHISM_hgrid_face_x (nSCHISM_hgrid_face) float64 2MB dask.array\n", + " SCHISM_hgrid_face_y (nSCHISM_hgrid_face) float64 2MB dask.array\n", + " SCHISM_hgrid_edge_x (nSCHISM_hgrid_edge) float64 70MB dask.array\n", + " SCHISM_hgrid_edge_y (nSCHISM_hgrid_edge) float64 70MB dask.array\n", + " SCHISM_hgrid_face_nodes (nSCHISM_hgrid_face, nMaxSCHISM_hgrid_face_nodes) float64 9MB dask.array\n", + " SCHISM_hgrid_edge_nodes (nSCHISM_hgrid_edge, two) float64 139MB dask.array\n", + " temperature (time, nSCHISM_hgrid_node, nSCHISM_vgrid_layers) float32 670MB dask.array\n", + "Attributes:\n", + " NCO: netCDF Operators version 4.9.7 (Homepage = http://nco.sf.net, C...\n", + " history: Mon Jul 29 02:42:02 2024: ncatted -a units,temperature,o,c,Degr..." ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "\n", + "ds_temp_subset = loaded_bbox_selector.select(ds_temp)\n", + "ds_temp_subset" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 489 }, + "id": "Kn8H9L-82vDi", + "outputId": "58cac6b1-7692-41e8-ac91-c06066a27dab" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 692 - }, - "id": "lZbYtR8o0F-p", - "outputId": "7bd6f508-4433-495b-9f9a-3badaa56359e" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 171 ms, sys: 129 µs, total: 172 ms\n", - "Wall time: 172 ms\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset> Size: 965MB\n",
-              "Dimensions:                  (time: 24, one: 1, nSCHISM_hgrid_node: 142475,\n",
-              "                              nSCHISM_hgrid_face: 274187,\n",
-              "                              nSCHISM_hgrid_edge: 8701944,\n",
-              "                              nMaxSCHISM_hgrid_face_nodes: 4, two: 2,\n",
-              "                              nSCHISM_vgrid_layers: 49)\n",
-              "Coordinates:\n",
-              "  * time                     (time) datetime64[ns] 192B 2024-07-28T01:00:00 ....\n",
-              "    SCHISM_hgrid_node_x      (nSCHISM_hgrid_node) float64 1MB dask.array<chunksize=(7165,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_node_y      (nSCHISM_hgrid_node) float64 1MB dask.array<chunksize=(7165,), meta=np.ndarray>\n",
-              "Dimensions without coordinates: one, nSCHISM_hgrid_node, nSCHISM_hgrid_face,\n",
-              "                                nSCHISM_hgrid_edge,\n",
-              "                                nMaxSCHISM_hgrid_face_nodes, two,\n",
-              "                                nSCHISM_vgrid_layers\n",
-              "Data variables:\n",
-              "    minimum_depth            (one) float64 8B dask.array<chunksize=(1,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid             (one) |S1 1B dask.array<chunksize=(1,), meta=np.ndarray>\n",
-              "    crs                      (one) int32 4B dask.array<chunksize=(1,), meta=np.ndarray>\n",
-              "    depth                    (nSCHISM_hgrid_node) float32 570kB dask.array<chunksize=(142475,), meta=np.ndarray>\n",
-              "    bottom_index_node        (nSCHISM_hgrid_node) int32 570kB dask.array<chunksize=(142475,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_face_x      (nSCHISM_hgrid_face) float64 2MB dask.array<chunksize=(166039,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_face_y      (nSCHISM_hgrid_face) float64 2MB dask.array<chunksize=(166039,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_edge_x      (nSCHISM_hgrid_edge) float64 70MB dask.array<chunksize=(511880,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_edge_y      (nSCHISM_hgrid_edge) float64 70MB dask.array<chunksize=(511880,), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_face_nodes  (nSCHISM_hgrid_face, nMaxSCHISM_hgrid_face_nodes) float64 9MB dask.array<chunksize=(265743, 1), meta=np.ndarray>\n",
-              "    SCHISM_hgrid_edge_nodes  (nSCHISM_hgrid_edge, two) float64 139MB dask.array<chunksize=(1740389, 1), meta=np.ndarray>\n",
-              "    temperature              (time, nSCHISM_hgrid_node, nSCHISM_vgrid_layers) float32 670MB dask.array<chunksize=(1, 142475, 49), meta=np.ndarray>\n",
-              "Attributes:\n",
-              "    NCO:      netCDF Operators version 4.9.7 (Homepage = http://nco.sf.net, C...\n",
-              "    history:  Mon Jul 29 02:42:02 2024: ncatted -a units,temperature,o,c,Degr...
" - ], - "text/plain": [ - " Size: 965MB\n", - "Dimensions: (time: 24, one: 1, nSCHISM_hgrid_node: 142475,\n", - " nSCHISM_hgrid_face: 274187,\n", - " nSCHISM_hgrid_edge: 8701944,\n", - " nMaxSCHISM_hgrid_face_nodes: 4, two: 2,\n", - " nSCHISM_vgrid_layers: 49)\n", - "Coordinates:\n", - " * time (time) datetime64[ns] 192B 2024-07-28T01:00:00 ....\n", - " SCHISM_hgrid_node_x (nSCHISM_hgrid_node) float64 1MB dask.array\n", - " SCHISM_hgrid_node_y (nSCHISM_hgrid_node) float64 1MB dask.array\n", - "Dimensions without coordinates: one, nSCHISM_hgrid_node, nSCHISM_hgrid_face,\n", - " nSCHISM_hgrid_edge,\n", - " nMaxSCHISM_hgrid_face_nodes, two,\n", - " nSCHISM_vgrid_layers\n", - "Data variables:\n", - " minimum_depth (one) float64 8B dask.array\n", - " SCHISM_hgrid (one) |S1 1B dask.array\n", - " crs (one) int32 4B dask.array\n", - " depth (nSCHISM_hgrid_node) float32 570kB dask.array\n", - " bottom_index_node (nSCHISM_hgrid_node) int32 570kB dask.array\n", - " SCHISM_hgrid_face_x (nSCHISM_hgrid_face) float64 2MB dask.array\n", - " SCHISM_hgrid_face_y (nSCHISM_hgrid_face) float64 2MB dask.array\n", - " SCHISM_hgrid_edge_x (nSCHISM_hgrid_edge) float64 70MB dask.array\n", - " SCHISM_hgrid_edge_y (nSCHISM_hgrid_edge) float64 70MB dask.array\n", - " SCHISM_hgrid_face_nodes (nSCHISM_hgrid_face, nMaxSCHISM_hgrid_face_nodes) float64 9MB dask.array\n", - " SCHISM_hgrid_edge_nodes (nSCHISM_hgrid_edge, two) float64 139MB dask.array\n", - " temperature (time, nSCHISM_hgrid_node, nSCHISM_vgrid_layers) float32 670MB dask.array\n", - "Attributes:\n", - " NCO: netCDF Operators version 4.9.7 (Homepage = http://nco.sf.net, C...\n", - " history: Mon Jul 29 02:42:02 2024: ncatted -a units,temperature,o,c,Degr..." - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "\n", - "ds_temp_subset = loaded_bbox_selector.select(ds_temp)\n", - "ds_temp_subset" + "data": { + "text/plain": [ + "" ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" }, { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 489 - }, - "id": "Kn8H9L-82vDi", - "outputId": "58cac6b1-7692-41e8-ac91-c06066a27dab" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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yScBACtWrMC7776Ld999F5UqVRL2S05OxunTpzFnzhz06dMH69atw4wZM9C7d2/YbDYsXLgQ7du3x7Jly/Duu+869P3nP/+JCRMmoF27dli1ahWGDh2KDRs2IDExERaLRTivyWTCH3/8oenLGVRVxZUrV1CxYkX7td9++w1Xr15F8+bNi9zfsmVL/PDDD+S4GRkZDmMWcvHiRSxevBhLlixBUFBQidb6ww8/ICQkBPXq1SuypsL2u/Hpp58iMzMTgwYNKtGct1PcuwKAhx56CNu3b8dLL72ECxcu4OTJk0hKSkJWVhZGjx5d4nkKn+PO9x8XF4eqVatqev/FsWbNGtSrVw/fffcdOVezZs2g1+vt7Yqi4MiRI3f9nTh79ixu3rxpv/b0008X+Tn98MMPuO+++xAeHl6kPwAcPnwYAHD06FFYrdYicxmNRjRt2tTp52cYX8PP2wtgGIrGjRvjgQcewL///W/07dsXNWvW1NQvJiYGn376KXQ6Hf71r3/hzJkzWLZsGf75z39i7dq1AIARI0agZs2aePPNN/H0008DAL755hu8/vrr2LBhAwYOHGgfr1OnTujWrRs2b97scP1O/v3vf2Po0KGa1qiqqqb7bmfDhg347bffMHfuXPu1y5cvAwCqVKlS5P4qVarg+vXrMJlMCAgIKHbMPXv2ID09HdOnTy/SNm7cONx///0YMGBAidd6+fJlxMTEQKfTFVkTAPz+++937bthwwYEBATg0UcfLfG8t49x57sCgNWrV+OPP/7A888/j+effx4AULFiRaSlpaFNmzYlnod6/6LndGYug8GAypUrO1w3Go2oUKGCfa7Cn/nd1gTcev916tQRzkX1L7zv9ut33rtnzx4tj8YwPg8bTUyZZfjw4Q6bdatWrZCeno7hw4fbrxkMBjRv3hyHDh2yX9u8eTMiIiLw97//3cEb1KxZM4SGhmLnzp1CoykxMfGup4tkKfSItGnTBkOGDLFfz8/PB4BijaLAwED7PcW1X716FQMHDkR8fDwmTpzo0LZz5058+OGH2L9/v1Prvduct6+pOLKzs7Ft2zb06NEDkZGRTs19t3cFAMHBwahTpw6qVq2KXr164ebNm1ixYgX69euHPXv24N577y3RXNT7z87OduoZZs+ejdmzZxeZy2g0Fnt/YGCgfS1afycKKe4En9afHzXX3X7ODFPa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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "ds_temp_subset.isel(time=0).temperature.plot()" + "data": { + "image/png": "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yScBACtWrMC7776Ld999F5UqVRL2S05OxunTpzFnzhz06dMH69atw4wZM9C7d2/YbDYsXLgQ7du3x7Jly/Duu+869P3nP/+JCRMmoF27dli1ahWGDh2KDRs2IDExERaLRTivyWTCH3/8oenLGVRVxZUrV1CxYkX7td9++w1Xr15F8+bNi9zfsmVL/PDDD+S4GRkZDmMWcvHiRSxevBhLlixBUFBQidb6ww8/ICQkBPXq1SuypsL2u/Hpp58iMzMTgwYNKtGct1PcuwKAhx56CNu3b8dLL72ECxcu4OTJk0hKSkJWVhZGjx5d4nkKn+PO9x8XF4eqVatqev/FsWbNGtSrVw/fffcdOVezZs2g1+vt7Yqi4MiRI3f9nTh79ixu3rxpv/b0008X+Tn98MMPuO+++xAeHl6kPwAcPnwYAHD06FFYrdYicxmNRjRt2tTp52cYX8PP2wtgGIrGjRvjgQcewL///W/07dsXNWvW1NQvJiYGn376KXQ6Hf71r3/hzJkzWLZsGf75z39i7dq1AIARI0agZs2aePPNN/H0008DAL755hu8/vrr2LBhAwYOHGgfr1OnTujWrRs2b97scP1O/v3vf2Po0KGa1qiqqqb7bmfDhg347bffMHfuXPu1y5cvAwCqVKlS5P4qVarg+vXrMJlMCAgIKHbMPXv2ID09HdOnTy/SNm7cONx///0YMGBAidd6+fJlxMTEQKfTFVkTAPz+++937bthwwYEBATg0UcfLfG8t49x57sCgNWrV+OPP/7A888/j+effx4AULFiRaSlpaFNmzYlnod6/6LndGYug8GAypUrO1w3Go2oUKGCfa7Cn/nd1gTcev916tQRzkX1L7zv9ut33rtnzx4tj8YwPg8bTUyZZfjw4Q6bdatWrZCeno7hw4fbrxkMBjRv3hyHDh2yX9u8eTMiIiLw97//3cEb1KxZM4SGhmLnzp1CoykxMfGup4tkKfSItGnTBkOGDLFfz8/PB4BijaLAwED7PcW1X716FQMHDkR8fDwmTpzo0LZz5058+OGH2L9/v1Prvduct6+pOLKzs7Ft2zb06NEDkZGRTs19t3cFAMHBwahTpw6qVq2KXr164ebNm1ixYgX69euHPXv24N577y3RXNT7z87OduoZZs+ejdmzZxeZy2g0Fnt/YGCgfS1afycKKe4En9afHzXX3X7ODFPa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", + "text/plain": [ + "
" ] + }, + "metadata": {}, + "output_type": "display_data" } - ], - "metadata": { - "colab": { - "provenance": [] - }, - "kernelspec": { - "display_name": "venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" - } + ], + "source": [ + "ds_temp_subset.isel(time=0).temperature.plot()" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" }, - "nbformat": 4, - "nbformat_minor": 0 + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 0 } diff --git a/docs/examples/subset_from_ncfile.ipynb b/docs/examples/subset_from_ncfile.ipynb index 9b2ea08..7825963 100644 --- a/docs/examples/subset_from_ncfile.ipynb +++ b/docs/examples/subset_from_ncfile.ipynb @@ -45,7 +45,6 @@ "outputs": [], "source": [ "import cf_xarray # noqa\n", - "import fsspec\n", "import numpy as np\n", "import xarray as xr\n", "\n", @@ -99,6 +98,7 @@ ], "source": [ "from xarray_subset_grid.utils import convert_bytes\n", + "\n", "f\"Dataset size: {convert_bytes(ds.nbytes)}\"" ] }, @@ -703,7 +703,7 @@ " [-122.51257315724197, 37.89737526062751],\n", " [-122.50081931329709, 37.88165893138216],\n", " [-122.51039590603393, 37.870731699265534],\n", - " [-122.49008935972195, 37.85535293037749]] \n", + " [-122.49008935972195, 37.85535293037749]]\n", ")\n", "polygon" ] @@ -1317,7 +1317,9 @@ "import matplotlib.tri as tri\n", "\n", "zeta = ds_subset.zeta.isel(time=0)\n", - "tris = tri.Triangulation(zeta.cf['longitude'], zeta.cf['latitude'], ds_subset[ds_subset.fvcom_mesh.face_node_connectivity].T - 1)\n", + "tris = tri.Triangulation(zeta.cf['longitude'],\n", + " zeta.cf['latitude'],\n", + " ds_subset[ds_subset.fvcom_mesh.face_node_connectivity].T - 1)\n", "plt.tripcolor(tris, zeta, shading='flat')" ] }, diff --git a/tests/test_grids/test_sgrid.py b/tests/test_grids/test_sgrid.py index cbc2948..50bbf82 100644 --- a/tests/test_grids/test_sgrid.py +++ b/tests/test_grids/test_sgrid.py @@ -1,14 +1,14 @@ -import cf_xarray +import os + import fsspec import numpy as np import xarray as xr -import os import xarray_subset_grid.accessor # noqa: F401 -from ..test_utils import ray_tracing_numpy, get_test_file_dir +from tests.test_utils import get_test_file_dir + # open dataset as zarr object using fsspec reference file system and xarray -from gridded import Variable, VectorVariable test_dir = get_test_file_dir() sample_sgrid_file = os.path.join(test_dir, 'arakawa_c_test_grid.nc') @@ -45,7 +45,7 @@ def test_polygon_subset(): ) ds_temp = ds.xsg.subset_vars(['temp_sur']) ds_subset = ds_temp.xsg.subset_polygon(polygon) - + #Check that the subset dataset has the correct dimensions given the original padding assert ds_subset.sizes['eta_rho'] == ds_subset.sizes['eta_psi'] + 1 assert ds_subset.sizes['eta_u'] == ds_subset.sizes['eta_psi'] + 1 @@ -53,14 +53,17 @@ def test_polygon_subset(): assert ds_subset.sizes['xi_rho'] == ds_subset.sizes['xi_psi'] + 1 assert ds_subset.sizes['xi_u'] == ds_subset.sizes['xi_psi'] assert ds_subset.sizes['xi_v'] == ds_subset.sizes['xi_psi'] + 1 - - #Check that the subset rho/psi/u/v positional relationsip makes sense aka psi point is 'between' it's neighbor rho points - #Note that this needs to be better generalized; it's not trivial to write a test that works in all potential cases. - assert ds_subset['lon_rho'][0,0] < ds_subset['lon_psi'][0,0] and ds_subset['lon_rho'][0,1] > ds_subset['lon_psi'][0,0] - + + #Check that the subset rho/psi/u/v positional relationsip makes sense aka psi point is + #'between' it's neighbor rho points + #Note that this needs to be better generalized; it's not trivial to write a test that + #works in all potential cases. + assert (ds_subset['lon_rho'][0,0] < ds_subset['lon_psi'][0,0] + and ds_subset['lon_rho'][0,1] > ds_subset['lon_psi'][0,0]) + #ds_subset.temp_sur.isel(ocean_time=0).plot(x="lon_rho", y="lat_rho") - -def test_polygon_subset_2(): + +def test_polygon_subset_2(): ds = xr.open_dataset(sample_sgrid_file, decode_times=False) polygon = np.array([ [6.5, 37.5], @@ -70,7 +73,7 @@ def test_polygon_subset_2(): [6.5, 37.5] ]) ds_subset = ds.xsg.subset_polygon(polygon) - + #Check that the subset dataset has the correct dimensions given the original padding assert ds_subset.sizes['eta_rho'] == ds_subset.sizes['eta_psi'] + 1 assert ds_subset.sizes['eta_u'] == ds_subset.sizes['eta_psi'] + 1 @@ -78,7 +81,6 @@ def test_polygon_subset_2(): assert ds_subset.sizes['xi_rho'] == ds_subset.sizes['xi_psi'] + 1 assert ds_subset.sizes['xi_u'] == ds_subset.sizes['xi_psi'] assert ds_subset.sizes['xi_v'] == ds_subset.sizes['xi_psi'] + 1 - + assert ds_subset.lon_psi.min() <= 6.5 and ds_subset.lon_psi.max() >= 9.5 assert ds_subset.lat_psi.min() <= 37.5 and ds_subset.lat_psi.max() >= 40.5 - \ No newline at end of file diff --git a/tests/test_utils.py b/tests/test_utils.py index 4df263e..c70e03d 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,6 +1,7 @@ +import os + import numpy as np import pytest -import os from xarray_subset_grid.utils import ( normalize_bbox_x_coords, diff --git a/xarray_subset_grid/grids/sgrid.py b/xarray_subset_grid/grids/sgrid.py index 3848781..8e408ad 100644 --- a/xarray_subset_grid/grids/sgrid.py +++ b/xarray_subset_grid/grids/sgrid.py @@ -107,7 +107,7 @@ def compute_polygon_subset_selector( grid_topology = ds[grid_topology_key] dims = _get_sgrid_dim_coord_names(grid_topology) subset_masks: list[tuple[list[str], xr.DataArray]] = [] - + node_dims = grid_topology.attrs["node_dimensions"].split() node_coords = grid_topology.attrs["node_coordinates"].split() @@ -120,23 +120,25 @@ def compute_polygon_subset_selector( node_lat = ds[c] if node_lon is None or node_lat is None: raise ValueError(f"Could not find lon and lat for dimension {node_dims}") - + node_mask = compute_2d_subset_mask(lat=node_lat, lon=node_lon, polygon=polygon) msk = np.where(node_mask) - index_bounding_box = np.array([[msk[0].min(), msk[0].max()+1], [msk[1].min(), msk[1].max()+1]]) - # quick and dirty add a 1 node pad around the psi mask. This is to ensure the entire polygon is covered. + index_bounding_box = np.array([[msk[0].min(), msk[0].max()+1], + [msk[1].min(), msk[1].max()+1]]) + # quick and dirty add a 1 node pad around the psi mask. + # This is to ensure the entire polygon is covered. index_bounding_box[0,0] = max(0, index_bounding_box[0,0] - 1) index_bounding_box[0,1] = min(node_lon.shape[0], index_bounding_box[0,1] + 1) index_bounding_box[1,0] = max(0, index_bounding_box[1,0] - 1) index_bounding_box[1,1] = min(node_lon.shape[1], index_bounding_box[1,1] + 1) node_mask[index_bounding_box[0][0]:index_bounding_box[0][1], index_bounding_box[1][0]:index_bounding_box[1][1]] = True - + subset_masks.append(([node_coords[0], node_coords[1]], node_mask)) for s in ('face', 'edge1', 'edge2'): dims = grid_topology.attrs.get(f"{s}_dimensions", None) coords = grid_topology.attrs.get(f"{s}_coordinates", None).split() - + lon: xr.DataArray | None = None lat: xr.DataArray | None = None for c in coords: @@ -154,7 +156,7 @@ def compute_polygon_subset_selector( index_bounding_box[1][0]:index_bounding_box[1][1] + arranged_padding[1]] = True xr_mask = xr.DataArray(mask, dims=lon.dims) subset_masks.append(([coords[0], coords[1]], xr_mask)) - + return SGridSelector( name=name or 'selector', polygon=polygon, @@ -162,7 +164,7 @@ def compute_polygon_subset_selector( grid_topology=grid_topology, subset_masks=subset_masks, ) - + def _get_sgrid_dim_coord_names( grid_topology: xr.DataArray, @@ -199,14 +201,16 @@ def parse_padding_string(dim_string): parsed_string = dim_string.replace('(padding: ', '').replace(')', '').replace(':', '') split_parsed_string = parsed_string.split(' ') if len(split_parsed_string) == 6: - return {split_parsed_string[0]:split_parsed_string[2], split_parsed_string[3]:split_parsed_string[5]} + return {split_parsed_string[0]:split_parsed_string[2], + split_parsed_string[3]:split_parsed_string[5]} elif len(split_parsed_string) == 5: if split_parsed_string[4] in {'none', 'low', 'high', 'both'}: #2nd dim has padding, and with len 5 that means first does not split_parsed_string.insert(2, 'none') else: split_parsed_string.insert(5, 'none') - return {split_parsed_string[0]:split_parsed_string[2], split_parsed_string[3]:split_parsed_string[5]} + return {split_parsed_string[0]:split_parsed_string[2], + split_parsed_string[3]:split_parsed_string[5]} elif len(split_parsed_string) == 2: #node dimensions string could look like this: 'node_dimensions: xi_psi eta_psi' return {split_parsed_string[0]: 'none', split_parsed_string[1]: 'none'} diff --git a/xarray_subset_grid/utils.py b/xarray_subset_grid/utils.py index 8b056cc..1b0b535 100644 --- a/xarray_subset_grid/utils.py +++ b/xarray_subset_grid/utils.py @@ -151,4 +151,3 @@ def compute_2d_subset_mask( polygon_mask = np.where(polygon_mask > 1, True, False) return xr.DataArray(polygon_mask, dims=mask_dims) - \ No newline at end of file