Regridding to DGGS#

Context#

Purpose#

The goal is to regrid a sample of RiOMar data into DGGS (Healpix).

Description#

In this notebook, we will:

  • Open a RiOMar data file

  • Prepare the DGGS grid for regridding

  • Transform the RiOMar dataset into DGSS (Healpix) grid.

  • Save the transformed data in Zarr

Contributions#

Notebook#

  • Tina Odaka (author), IFREMER (France), @tinaok

  • Anne Fouilloux (reviewer), Simula Research Laboratory (Norway), @annefou

Bibliography and other interesting resources#

Install packages#

  • Install xarray-healpy if you do not have it in your environment.

pip install git+https://github.com/IAOCEA/xarray-healpy.git
Collecting git+https://github.com/IAOCEA/xarray-healpy.git
  Cloning https://github.com/IAOCEA/xarray-healpy.git to /tmp/pip-req-build-xeh8o3ta
  Running command git clone --filter=blob:none --quiet https://github.com/IAOCEA/xarray-healpy.git /tmp/pip-req-build-xeh8o3ta
  Resolved https://github.com/IAOCEA/xarray-healpy.git to commit 9e457091957aa0d7833280558e60e1addc500ec7
  Installing build dependencies ... ?25ldone
?25h  Getting requirements to build wheel ... ?25ldone
?25h  Preparing metadata (pyproject.toml) ... ?25ldone
?25hRequirement already satisfied: xarray>=2023.11.0 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from xarray-healpy==0.1.dev26+g9e45709) (2024.7.0)
Collecting healpy (from xarray-healpy==0.1.dev26+g9e45709)
  Using cached healpy-1.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (8.7 kB)
Requirement already satisfied: sparse in /srv/conda/envs/notebook/lib/python3.12/site-packages (from xarray-healpy==0.1.dev26+g9e45709) (0.15.4)
Collecting opt_einsum (from xarray-healpy==0.1.dev26+g9e45709)
  Using cached opt_einsum-3.4.0-py3-none-any.whl.metadata (6.3 kB)
Requirement already satisfied: numba in /srv/conda/envs/notebook/lib/python3.12/site-packages (from xarray-healpy==0.1.dev26+g9e45709) (0.60.0)
Requirement already satisfied: numpy in /srv/conda/envs/notebook/lib/python3.12/site-packages (from xarray-healpy==0.1.dev26+g9e45709) (1.26.4)
Requirement already satisfied: scikit-learn in /srv/conda/envs/notebook/lib/python3.12/site-packages (from xarray-healpy==0.1.dev26+g9e45709) (1.5.1)
Collecting cdshealpix (from xarray-healpy==0.1.dev26+g9e45709)
  Using cached cdshealpix-0.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.3 kB)
Requirement already satisfied: astropy in /srv/conda/envs/notebook/lib/python3.12/site-packages (from xarray-healpy==0.1.dev26+g9e45709) (6.1.2)
Requirement already satisfied: packaging>=23.1 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from xarray>=2023.11.0->xarray-healpy==0.1.dev26+g9e45709) (24.1)
Requirement already satisfied: pandas>=2.0 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from xarray>=2023.11.0->xarray-healpy==0.1.dev26+g9e45709) (2.2.2)
Requirement already satisfied: pyerfa>=2.0.1.1 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from astropy->xarray-healpy==0.1.dev26+g9e45709) (2.0.1.4)
Requirement already satisfied: astropy-iers-data>=0.2024.7.1.0.34.3 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from astropy->xarray-healpy==0.1.dev26+g9e45709) (0.2024.8.5.0.32.23)
Requirement already satisfied: PyYAML>=3.13 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from astropy->xarray-healpy==0.1.dev26+g9e45709) (6.0.2)
Requirement already satisfied: llvmlite<0.44,>=0.43.0dev0 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from numba->xarray-healpy==0.1.dev26+g9e45709) (0.43.0)
Requirement already satisfied: scipy>=1.6.0 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from scikit-learn->xarray-healpy==0.1.dev26+g9e45709) (1.14.0)
Requirement already satisfied: joblib>=1.2.0 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from scikit-learn->xarray-healpy==0.1.dev26+g9e45709) (1.4.2)
Requirement already satisfied: threadpoolctl>=3.1.0 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from scikit-learn->xarray-healpy==0.1.dev26+g9e45709) (3.5.0)
Requirement already satisfied: python-dateutil>=2.8.2 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from pandas>=2.0->xarray>=2023.11.0->xarray-healpy==0.1.dev26+g9e45709) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from pandas>=2.0->xarray>=2023.11.0->xarray-healpy==0.1.dev26+g9e45709) (2024.1)
Requirement already satisfied: tzdata>=2022.7 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from pandas>=2.0->xarray>=2023.11.0->xarray-healpy==0.1.dev26+g9e45709) (2024.1)
Requirement already satisfied: six>=1.5 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas>=2.0->xarray>=2023.11.0->xarray-healpy==0.1.dev26+g9e45709) (1.16.0)
Using cached cdshealpix-0.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB)
Using cached healpy-1.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (8.9 MB)
Using cached opt_einsum-3.4.0-py3-none-any.whl (71 kB)
Building wheels for collected packages: xarray-healpy
  Building wheel for xarray-healpy (pyproject.toml) ... ?25ldone
?25h  Created wheel for xarray-healpy: filename=xarray_healpy-0.1.dev26+g9e45709-py3-none-any.whl size=12889 sha256=c2911e3d940b2f01e383675364c11446cdc24965bccc7a5554b2424ba445133b
  Stored in directory: /tmp/pip-ephem-wheel-cache-yc3jlh9e/wheels/13/12/8e/cc158525fce8db1608cf79d96cd2ec7abe59daf089b7e4f8d6
Successfully built xarray-healpy
Installing collected packages: opt_einsum, healpy, cdshealpix, xarray-healpy
Successfully installed cdshealpix-0.7.1 healpy-1.18.0 opt_einsum-3.4.0 xarray-healpy-0.1.dev26+g9e45709
Note: you may need to restart the kernel to use updated packages.

Import Libraries#

import xarray as xr
import fsspec
from xarray_healpy import HealpyGridInfo, HealpyRegridder
import numpy as np

Open RiOMar sample dataset#

  • This RiOMar data has been generated from the original RiOMar data (netCDF) by selected a few timesteps and saving the results into Zarr to facilitate the access from the cloud (S3 Bucket).

url = "https://data-fair2adapt.ifremer.fr/riomar/small.zarr"
ds = xr.open_zarr(url)
ds
<xarray.Dataset> Size: 498MB
Dimensions:       (y_rho: 838, x_rho: 727, s_rho: 40, time_counter: 5)
Coordinates:
    nav_lat_rho   (y_rho, x_rho) float64 5MB dask.array<chunksize=(838, 727), meta=np.ndarray>
    nav_lon_rho   (y_rho, x_rho) float64 5MB dask.array<chunksize=(838, 727), meta=np.ndarray>
  * s_rho         (s_rho) float32 160B -0.9875 -0.9625 ... -0.0375 -0.0125
  * time_counter  (time_counter) datetime64[ns] 40B 2004-01-01T00:58:30 ... 2...
    time_instant  (time_counter) datetime64[ns] 40B dask.array<chunksize=(1,), meta=np.ndarray>
Dimensions without coordinates: y_rho, x_rho
Data variables:
    ocean_mask    (y_rho, x_rho) bool 609kB dask.array<chunksize=(838, 727), meta=np.ndarray>
    temp          (time_counter, s_rho, y_rho, x_rho) float32 487MB dask.array<chunksize=(1, 40, 838, 727), meta=np.ndarray>
Attributes: (12/45)
    CPP-options:    REGIONAL GAMAR MPI TIDES OBC_WEST OBC_NORTH XIOS USE_CALE...
    Conventions:    CF-1.6
    Cs_r:           have a look at variable Cs_r in this file
    Cs_w:           have a look at variable Cs_w in this file
    SRCS:           main.F step.F read_inp.F timers_roms.F init_scalars.F ini...
    Tcline:         15.0
    ...             ...
    title:          GAMAR_GLORYS
    tnu4_expl:      biharmonic mixing coefficient for tracers
    units:          meter4 second-1
    uuid:           06f6b784-fcc0-4422-aceb-17da2a5aa9fa
    v_sponge:       0.0
    x_sponge:       0.0

Select a small geographical area#

ds["nav_lat_rho"] = ds["nav_lat_rho"].assign_attrs(standard_nanme="latitude")
ds["nav_lon_rho"] = ds["nav_lon_rho"].assign_attrs(standard_nanme="longitude")
ds = ds.rename_vars({"nav_lat_rho": "latitude", "nav_lon_rho": "longitude"})
ds = ds.merge(ds[["latitude", "longitude"]].compute() )
ds = ds.where((
    (49 > ds.latitude) & (ds.latitude > 47) )
    &
    ( -5 > ds.longitude) & (ds.longitude > -10 ), drop=True)

Prepare the Healpix grid to transform into DGGS#

nside = 4096
def center_longitude(ds, center):
    if center == 0:
        centered = (ds.longitude + 180) % 360 - 180
    else:
        centered = (ds.longitude - 180) % 360 + 180

    return ds.assign_coords(longitude=centered)

Define the target Healpix grid information#

%%time

grid = HealpyGridInfo(level=int(np.log2(nside)))
target_grid = grid.target_grid(ds).pipe(center_longitude, 0)
target_grid
CPU times: user 15 ms, sys: 3.13 ms, total: 18.2 ms
Wall time: 12.1 ms
<xarray.Dataset> Size: 457kB
Dimensions:     (cells: 19047)
Coordinates:
    cell_ids    (cells) uint64 152kB 56417655 56417659 ... 56565776 56565792
    latitude    (cells) float64 152kB 47.03 47.03 47.03 ... 48.98 48.98 48.98
    longitude   (cells) float64 152kB -6.282 -6.331 -6.306 ... -6.44 -6.542
    resolution  float64 8B 0.0002498
Dimensions without coordinates: cells
Data variables:
    *empty*
Attributes:
    grid_type:  healpix
    level:      12
    nside:      4096
    lat:        0
    lon:        0
    rot_lat:    0
    rot_lon:    0

Compute the interpolation weights for regridding the diff data#

%%time

regridder = HealpyRegridder(
    ds[["longitude", "latitude"]].compute(),
    target_grid,
    method="bilinear",
    interpolation_kwargs={},
)
regridder
CPU times: user 122 ms, sys: 5.28 ms, total: 127 ms
Wall time: 124 ms
HealpyRegridder(method='bilinear', interpolation_kwargs={})

Perform the regridding operation using the computed interpolation weights#

%%time

regridded = regridder.regrid_ds(ds)
regridded
CPU times: user 1.41 s, sys: 604 ms, total: 2.01 s
Wall time: 2.05 s
<xarray.Dataset> Size: 31MB
Dimensions:       (cells: 19047, time_counter: 5, s_rho: 40)
Coordinates:
    cell_ids      (cells) uint64 152kB 56417655 56417659 ... 56565776 56565792
    latitude      (cells) float64 152kB 47.03 47.03 47.03 ... 48.98 48.98 48.98
    longitude     (cells) float64 152kB -6.282 -6.331 -6.306 ... -6.44 -6.542
    resolution    float64 8B 0.0002498
  * s_rho         (s_rho) float32 160B -0.9875 -0.9625 ... -0.0375 -0.0125
  * time_counter  (time_counter) datetime64[ns] 40B 2004-01-01T00:58:30 ... 2...
    time_instant  (time_counter) datetime64[ns] 40B dask.array<chunksize=(1,), meta=np.ndarray>
Dimensions without coordinates: cells
Data variables:
    ocean_mask    (cells) float64 152kB dask.array<chunksize=(19047,), meta=np.ndarray>
    temp          (time_counter, s_rho, cells) float64 30MB dask.array<chunksize=(1, 40, 19047), meta=np.ndarray>
Attributes:
    grid_type:  healpix
    level:      12
    nside:      4096
    lat:        0
    lon:        0
    rot_lat:    0
    rot_lon:    0

Reshape the regridded data to 2D#

%%time

reshaped = grid.to_2d(regridded).pipe(center_longitude, 0)
reshaped = reshaped.persist()
reshaped
CPU times: user 5.94 s, sys: 12 s, total: 18 s
Wall time: 10.4 s
<xarray.Dataset> Size: 57MB
Dimensions:       (y: 130, x: 267, time_counter: 5, s_rho: 40)
Coordinates:
    resolution    float64 8B 0.0002498
  * s_rho         (s_rho) float32 160B -0.9875 -0.9625 ... -0.0375 -0.0125
  * time_counter  (time_counter) datetime64[ns] 40B 2004-01-01T00:58:30 ... 2...
    time_instant  (time_counter) datetime64[ns] 40B dask.array<chunksize=(1,), meta=np.ndarray>
    cell_ids      (y, x) int64 278kB 56389452 56389454 ... 56569807 56569829
    latitude      (y, x) float64 278kB 45.55 45.56 45.57 ... 50.36 50.37 50.38
    longitude     (y, x) float64 278kB -7.719 -7.721 -7.723 ... -5.2 -5.201
Dimensions without coordinates: y, x
Data variables:
    ocean_mask    (y, x) float64 278kB dask.array<chunksize=(130, 267), meta=np.ndarray>
    temp          (time_counter, s_rho, y, x) float64 56MB dask.array<chunksize=(1, 40, 130, 267), meta=np.ndarray>
Attributes:
    grid_type:  healpix
    level:      12
    nside:      4096
    lat:        0
    lon:        0
    rot_lat:    0
    rot_lon:    0

This cell verifies the regridded data by plotting the count of non-NaN values.#

reshaped["temp"].count(["x", "y"]).plot()
<matplotlib.collections.QuadMesh at 0x716aa9bc33e0>
_images/e08fc52d53134e9ac15f7896261368a1f31ec3139277e33b5de8c8410130df72.png

Save to the regridded data to Zarr format#

%%time
# This cell saves the regridded data to Zarr format, then cleans up unnecessary variables to free up memory after the regridding process.
reshaped.to_zarr(
    f"./diff-regridded.zarr",
    mode="w",
    consolidated=True,
    compute=True
)
CPU times: user 120 ms, sys: 112 ms, total: 233 ms
Wall time: 629 ms
<xarray.backends.zarr.ZarrStore at 0x716aaa1325c0>

Open and check zarr with xdggs#

pip install xdggs
Collecting xdggs
  Using cached xdggs-0.1.1-py3-none-any.whl.metadata (5.2 kB)
Requirement already satisfied: xarray in /srv/conda/envs/notebook/lib/python3.12/site-packages (from xdggs) (2024.7.0)
Requirement already satisfied: cdshealpix in /srv/conda/envs/notebook/lib/python3.12/site-packages (from xdggs) (0.7.1)
Collecting h3ronpy (from xdggs)
  Using cached h3ronpy-0.22.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.8 kB)
Requirement already satisfied: typing-extensions in /srv/conda/envs/notebook/lib/python3.12/site-packages (from xdggs) (4.12.2)
Requirement already satisfied: lonboard>=0.9.3 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from xdggs) (0.9.3)
Requirement already satisfied: pyproj>=3.3 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from xdggs) (3.6.1)
Requirement already satisfied: matplotlib in /srv/conda/envs/notebook/lib/python3.12/site-packages (from xdggs) (3.9.2)
Collecting arro3-core>=0.4.0 (from xdggs)
  Using cached arro3_core-0.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (885 bytes)
Requirement already satisfied: pooch in /srv/conda/envs/notebook/lib/python3.12/site-packages (from xdggs) (1.8.2)
Requirement already satisfied: anywidget<0.10.0,>=0.9.0 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from lonboard>=0.9.3->xdggs) (0.9.13)
Requirement already satisfied: geopandas>=0.13 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from lonboard>=0.9.3->xdggs) (1.0.1)
Requirement already satisfied: palettable<4.0.0,>=3.3.3 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from lonboard>=0.9.3->xdggs) (3.3.3)
Requirement already satisfied: pandas<3,>=2 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from lonboard>=0.9.3->xdggs) (2.2.2)
Requirement already satisfied: pyarrow>=14.0.1 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from lonboard>=0.9.3->xdggs) (17.0.0)
Requirement already satisfied: shapely<3,>=2 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from lonboard>=0.9.3->xdggs) (2.0.5)
Requirement already satisfied: contourpy>=1.0.1 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from matplotlib->xdggs) (1.2.1)
Requirement already satisfied: cycler>=0.10 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from matplotlib->xdggs) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from matplotlib->xdggs) (4.53.1)
Requirement already satisfied: kiwisolver>=1.3.1 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from matplotlib->xdggs) (1.4.5)
Requirement already satisfied: numpy>=1.23 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from matplotlib->xdggs) (1.26.4)
Requirement already satisfied: packaging>=20.0 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from matplotlib->xdggs) (24.1)
Requirement already satisfied: pillow>=8 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from matplotlib->xdggs) (10.4.0)
Requirement already satisfied: pyparsing>=2.3.1 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from matplotlib->xdggs) (3.1.2)
Requirement already satisfied: python-dateutil>=2.7 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from matplotlib->xdggs) (2.8.2)
Requirement already satisfied: certifi in /srv/conda/envs/notebook/lib/python3.12/site-packages (from pyproj>=3.3->xdggs) (2024.7.4)
Requirement already satisfied: astropy in /srv/conda/envs/notebook/lib/python3.12/site-packages (from cdshealpix->xdggs) (6.1.2)
Requirement already satisfied: platformdirs>=2.5.0 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from pooch->xdggs) (4.2.2)
Requirement already satisfied: requests>=2.19.0 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from pooch->xdggs) (2.32.3)
Requirement already satisfied: ipywidgets>=7.6.0 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (8.1.3)
Requirement already satisfied: psygnal>=0.8.1 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (0.11.1)
Requirement already satisfied: pyogrio>=0.7.2 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from geopandas>=0.13->lonboard>=0.9.3->xdggs) (0.9.0)
Requirement already satisfied: pytz>=2020.1 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from pandas<3,>=2->lonboard>=0.9.3->xdggs) (2024.1)
Requirement already satisfied: tzdata>=2022.7 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from pandas<3,>=2->lonboard>=0.9.3->xdggs) (2024.1)
Requirement already satisfied: six>=1.5 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from python-dateutil>=2.7->matplotlib->xdggs) (1.16.0)
Requirement already satisfied: charset-normalizer<4,>=2 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from requests>=2.19.0->pooch->xdggs) (3.3.2)
Requirement already satisfied: idna<4,>=2.5 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from requests>=2.19.0->pooch->xdggs) (3.7)
Requirement already satisfied: urllib3<3,>=1.21.1 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from requests>=2.19.0->pooch->xdggs) (1.26.19)
Requirement already satisfied: pyerfa>=2.0.1.1 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from astropy->cdshealpix->xdggs) (2.0.1.4)
Requirement already satisfied: astropy-iers-data>=0.2024.7.1.0.34.3 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from astropy->cdshealpix->xdggs) (0.2024.8.5.0.32.23)
Requirement already satisfied: PyYAML>=3.13 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from astropy->cdshealpix->xdggs) (6.0.2)
Requirement already satisfied: comm>=0.1.3 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from ipywidgets>=7.6.0->anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (0.2.2)
Requirement already satisfied: ipython>=6.1.0 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from ipywidgets>=7.6.0->anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (8.17.2)
Requirement already satisfied: traitlets>=4.3.1 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from ipywidgets>=7.6.0->anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (5.14.3)
Requirement already satisfied: widgetsnbextension~=4.0.11 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from ipywidgets>=7.6.0->anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (4.0.11)
Requirement already satisfied: jupyterlab-widgets~=3.0.11 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from ipywidgets>=7.6.0->anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (3.0.11)
Requirement already satisfied: decorator in /srv/conda/envs/notebook/lib/python3.12/site-packages (from ipython>=6.1.0->ipywidgets>=7.6.0->anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (5.1.1)
Requirement already satisfied: jedi>=0.16 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from ipython>=6.1.0->ipywidgets>=7.6.0->anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (0.19.1)
Requirement already satisfied: matplotlib-inline in /srv/conda/envs/notebook/lib/python3.12/site-packages (from ipython>=6.1.0->ipywidgets>=7.6.0->anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (0.1.7)
Requirement already satisfied: prompt-toolkit!=3.0.37,<3.1.0,>=3.0.30 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from ipython>=6.1.0->ipywidgets>=7.6.0->anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (3.0.38)
Requirement already satisfied: pygments>=2.4.0 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from ipython>=6.1.0->ipywidgets>=7.6.0->anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (2.18.0)
Requirement already satisfied: stack-data in /srv/conda/envs/notebook/lib/python3.12/site-packages (from ipython>=6.1.0->ipywidgets>=7.6.0->anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (0.6.2)
Requirement already satisfied: pexpect>4.3 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from ipython>=6.1.0->ipywidgets>=7.6.0->anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (4.9.0)
Requirement already satisfied: parso<0.9.0,>=0.8.3 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from jedi>=0.16->ipython>=6.1.0->ipywidgets>=7.6.0->anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (0.8.4)
Requirement already satisfied: ptyprocess>=0.5 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from pexpect>4.3->ipython>=6.1.0->ipywidgets>=7.6.0->anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (0.7.0)
Requirement already satisfied: wcwidth in /srv/conda/envs/notebook/lib/python3.12/site-packages (from prompt-toolkit!=3.0.37,<3.1.0,>=3.0.30->ipython>=6.1.0->ipywidgets>=7.6.0->anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (0.2.13)
Requirement already satisfied: executing>=1.2.0 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from stack-data->ipython>=6.1.0->ipywidgets>=7.6.0->anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (2.0.1)
Requirement already satisfied: asttokens>=2.1.0 in /srv/conda/envs/notebook/lib/python3.12/site-packages (from stack-data->ipython>=6.1.0->ipywidgets>=7.6.0->anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (2.4.1)
Requirement already satisfied: pure-eval in /srv/conda/envs/notebook/lib/python3.12/site-packages (from stack-data->ipython>=6.1.0->ipywidgets>=7.6.0->anywidget<0.10.0,>=0.9.0->lonboard>=0.9.3->xdggs) (0.2.3)
Using cached xdggs-0.1.1-py3-none-any.whl (32 kB)
Using cached arro3_core-0.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.5 MB)
Using cached h3ronpy-0.22.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.4 MB)
Installing collected packages: arro3-core, h3ronpy, xdggs
Successfully installed arro3-core-0.4.5 h3ronpy-0.22.0 xdggs-0.1.1
Note: you may need to restart the kernel to use updated packages.
import xdggs
dout = xr.open_zarr("./diff-regridded.zarr")
dout
<xarray.Dataset> Size: 57MB
Dimensions:       (y: 130, x: 267, s_rho: 40, time_counter: 5)
Coordinates:
    cell_ids      (y, x) int64 278kB dask.array<chunksize=(65, 267), meta=np.ndarray>
    latitude      (y, x) float64 278kB dask.array<chunksize=(65, 267), meta=np.ndarray>
    longitude     (y, x) float64 278kB dask.array<chunksize=(65, 267), meta=np.ndarray>
    resolution    float64 8B ...
  * s_rho         (s_rho) float32 160B -0.9875 -0.9625 ... -0.0375 -0.0125
  * time_counter  (time_counter) datetime64[ns] 40B 2004-01-01T00:58:30 ... 2...
    time_instant  (time_counter) datetime64[ns] 40B dask.array<chunksize=(1,), meta=np.ndarray>
Dimensions without coordinates: y, x
Data variables:
    ocean_mask    (y, x) float64 278kB dask.array<chunksize=(130, 267), meta=np.ndarray>
    temp          (time_counter, s_rho, y, x) float64 56MB dask.array<chunksize=(1, 40, 130, 267), meta=np.ndarray>
Attributes:
    grid_type:  healpix
    lat:        0
    level:      12
    lon:        0
    nside:      4096
    rot_lat:    0
    rot_lon:    0
dout = (
    dout.load()
    .drop_vars(["latitude", "longitude"])
    .stack(cell=["x", "y"], create_index=False)
)

dout.cell_ids.attrs = {
    "grid_name": "healpix",
    "nside": nside,
    "nest": True,
}

dout
<xarray.Dataset> Size: 56MB
Dimensions:       (cell: 34710, s_rho: 40, time_counter: 5)
Coordinates:
    cell_ids      (cell) int64 278kB 56389452 56389453 ... 56569828 56569829
    resolution    float64 8B 0.0002498
  * s_rho         (s_rho) float32 160B -0.9875 -0.9625 ... -0.0375 -0.0125
  * time_counter  (time_counter) datetime64[ns] 40B 2004-01-01T00:58:30 ... 2...
    time_instant  (time_counter) datetime64[ns] 40B 2004-01-01T00:58:30 ... 2...
Dimensions without coordinates: cell
Data variables:
    ocean_mask    (cell) float64 278kB nan nan nan nan nan ... nan nan nan nan
    temp          (time_counter, s_rho, cell) float64 56MB nan nan ... nan nan
Attributes:
    grid_type:  healpix
    lat:        0
    level:      12
    lon:        0
    nside:      4096
    rot_lat:    0
    rot_lon:    0
dout_idx = dout.set_xindex("cell_ids", xdggs.DGGSIndex)

dout_idx
<xarray.Dataset> Size: 56MB
Dimensions:       (cell: 34710, s_rho: 40, time_counter: 5)
Coordinates:
  * cell_ids      (cell) int64 278kB 56389452 56389453 ... 56569828 56569829
    resolution    float64 8B 0.0002498
  * s_rho         (s_rho) float32 160B -0.9875 -0.9625 ... -0.0375 -0.0125
  * time_counter  (time_counter) datetime64[ns] 40B 2004-01-01T00:58:30 ... 2...
    time_instant  (time_counter) datetime64[ns] 40B 2004-01-01T00:58:30 ... 2...
Dimensions without coordinates: cell
Data variables:
    ocean_mask    (cell) float64 278kB nan nan nan nan nan ... nan nan nan nan
    temp          (time_counter, s_rho, cell) float64 56MB nan nan ... nan nan
Indexes:
    cell_ids  HealpixIndex(nside=12, indexing_scheme=nested)
Attributes:
    grid_type:  healpix
    lat:        0
    level:      12
    lon:        0
    nside:      4096
    rot_lat:    0
    rot_lon:    0
dout_idx.temp.isel(time_counter=0, s_rho=0).dggs.explore(center=0, cmap="viridis", alpha=0.8)