From 2e86ec521a0d71438d84fc651518f0c573a27de2 Mon Sep 17 00:00:00 2001 From: Vecko <36369090+VeckoTheGecko@users.noreply.github.com> Date: Wed, 18 Mar 2026 10:11:56 +0100 Subject: [PATCH 01/10] Update code --- benchmarks/fesom2.py | 2 +- benchmarks/moi_curvilinear.py | 4 ++-- results/benchmarks.json | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/benchmarks/fesom2.py b/benchmarks/fesom2.py index e7bd735..b6a18cf 100644 --- a/benchmarks/fesom2.py +++ b/benchmarks/fesom2.py @@ -48,7 +48,7 @@ def pset_execute(self, npart, integrator): lat = np.linspace(32.0, 19.0, npart) pset = ParticleSet(fieldset=fieldset, pclass=Particle, lon=lon, lat=lat) - pset.execute(runtime=runtime, dt=dt, pyfunc=integrator) + pset.execute(kernels=integrator, runtime=runtime, dt=dt) def time_pset_execute(self, npart, integrator): self.pset_execute(npart, integrator) diff --git a/benchmarks/moi_curvilinear.py b/benchmarks/moi_curvilinear.py index dcc1f27..d4b00e8 100644 --- a/benchmarks/moi_curvilinear.py +++ b/benchmarks/moi_curvilinear.py @@ -108,8 +108,8 @@ def pset_execute_3d(self, interpolator, chunk, npart): U = parcels.Field("U", ds["U"], grid, interp_method=interp_method) V = parcels.Field("V", ds["V"], grid, interp_method=interp_method) - U.units = parcels.GeographicPolar() - V.units = parcels.Geographic() + # U.units = parcels.GeographicPolar() + # V.units = parcels.Geographic() UV = parcels.VectorField("UV", U, V) fieldset = parcels.FieldSet([U, V, UV]) diff --git a/results/benchmarks.json b/results/benchmarks.json index 2093eba..b531d8c 100644 --- a/results/benchmarks.json +++ b/results/benchmarks.json @@ -11,7 +11,7 @@ "10000" ], [ - "" + "" ] ], "type": "peakmemory", @@ -32,7 +32,7 @@ "10000" ], [ - "" + "" ] ], "repeat": 0, @@ -57,7 +57,7 @@ "10000" ], [ - "" + "" ] ], "repeat": 0, From d678e038d23f99c65da8998d8399a2fdede6a51b Mon Sep 17 00:00:00 2001 From: Vecko <36369090+VeckoTheGecko@users.noreply.github.com> Date: Wed, 18 Mar 2026 16:16:14 +0100 Subject: [PATCH 02/10] Update fieldset ingestion --- benchmarks/moi_curvilinear.py | 50 ++++++----------------------------- 1 file changed, 8 insertions(+), 42 deletions(-) diff --git a/benchmarks/moi_curvilinear.py b/benchmarks/moi_curvilinear.py index d4b00e8..b4ce7c9 100644 --- a/benchmarks/moi_curvilinear.py +++ b/benchmarks/moi_curvilinear.py @@ -14,7 +14,6 @@ def _load_ds(datapath, chunk): """Helper function to load xarray dataset from datapath with or without chunking""" - fileU = f"{datapath}/psy4v3r1-daily_U_2025-01-0[1-3].nc" filenames = { "U": glob(fileU), @@ -32,27 +31,12 @@ def _load_ds(datapath, chunk): if chunk: fileargs["chunks"] = {"time_counter": 1, "depth": 2, "y": chunk, "x": chunk} - ds_u = xr.open_mfdataset(filenames["U"], **fileargs)[["vozocrtx"]].drop_vars( - ["nav_lon", "nav_lat"] - ) - ds_v = xr.open_mfdataset(filenames["V"], **fileargs)[["vomecrty"]].drop_vars( - ["nav_lon", "nav_lat"] - ) - ds_depth = xr.open_mfdataset(filenames["W"], **fileargs)[["depthw"]] + ds_u = xr.open_mfdataset(filenames["U"], **fileargs)[["vozocrtx"]].rename_vars({"vozocrtx": "U"}) + ds_v = xr.open_mfdataset(filenames["V"], **fileargs)[["vomecrty"]].rename_vars({"vomecrty": "V"}) + da_depth = xr.open_mfdataset(filenames["W"], **fileargs)["depthw"] ds_mesh = xr.open_dataset(mesh_mask)[["glamf", "gphif"]].isel(t=0) - - ds = xr.merge([ds_u, ds_v, ds_depth, ds_mesh], compat="identical") - ds = ds.rename( - { - "vozocrtx": "U", - "vomecrty": "V", - "glamf": "lon", - "gphif": "lat", - "time_counter": "time", - "depthw": "depth", - } - ) - ds.deptht.attrs["c_grid_axis_shift"] = -0.5 + ds_mesh['depthw'] = da_depth + ds = parcels.convert.nemo_to_sgrid(fields=dict(U=ds_u, V=ds_v), coords=ds_mesh) return ds @@ -89,31 +73,13 @@ def time_load_data_3d(self, interpolator, chunk, npart): def pset_execute_3d(self, interpolator, chunk, npart): ds = _load_ds(self.datapath, chunk) - coords = { - "X": {"left": "x"}, - "Y": {"left": "y"}, - "Z": {"center": "deptht", "left": "depth"}, - "T": {"center": "time"}, - } - - grid = parcels._core.xgrid.XGrid( - xgcm.Grid(ds, coords=coords, autoparse_metadata=False, periodic=False), - mesh="spherical", - ) - + fieldset = parcels.FieldSet.from_sgrid_conventions(ds) if interpolator == "XLinear": - interp_method = XLinear + fieldset.U.interp_method = XLinear + fieldset.V.interp_method = XLinear else: raise ValueError(f"Unknown interpolator: {interpolator}") - U = parcels.Field("U", ds["U"], grid, interp_method=interp_method) - V = parcels.Field("V", ds["V"], grid, interp_method=interp_method) - # U.units = parcels.GeographicPolar() - # V.units = parcels.Geographic() - UV = parcels.VectorField("UV", U, V) - - fieldset = parcels.FieldSet([U, V, UV]) - pclass = parcels.Particle lon = np.linspace(-10, 10, npart) From 6e84d4a00134957a5a2e65e1d677e65d5e9500e0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 15:37:19 +0000 Subject: [PATCH 03/10] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- benchmarks/moi_curvilinear.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/benchmarks/moi_curvilinear.py b/benchmarks/moi_curvilinear.py index b4ce7c9..8e7848d 100644 --- a/benchmarks/moi_curvilinear.py +++ b/benchmarks/moi_curvilinear.py @@ -3,7 +3,6 @@ import numpy as np import parcels import xarray as xr -import xgcm from parcels.interpolators import XLinear from parcels_benchmarks.benchmark_setup import PARCELS_DATADIR, download_example_dataset @@ -31,11 +30,15 @@ def _load_ds(datapath, chunk): if chunk: fileargs["chunks"] = {"time_counter": 1, "depth": 2, "y": chunk, "x": chunk} - ds_u = xr.open_mfdataset(filenames["U"], **fileargs)[["vozocrtx"]].rename_vars({"vozocrtx": "U"}) - ds_v = xr.open_mfdataset(filenames["V"], **fileargs)[["vomecrty"]].rename_vars({"vomecrty": "V"}) + ds_u = xr.open_mfdataset(filenames["U"], **fileargs)[["vozocrtx"]].rename_vars( + {"vozocrtx": "U"} + ) + ds_v = xr.open_mfdataset(filenames["V"], **fileargs)[["vomecrty"]].rename_vars( + {"vomecrty": "V"} + ) da_depth = xr.open_mfdataset(filenames["W"], **fileargs)["depthw"] ds_mesh = xr.open_dataset(mesh_mask)[["glamf", "gphif"]].isel(t=0) - ds_mesh['depthw'] = da_depth + ds_mesh["depthw"] = da_depth ds = parcels.convert.nemo_to_sgrid(fields=dict(U=ds_u, V=ds_v), coords=ds_mesh) return ds From 1d07d487cf3abacb20847806b211229494e02b3d Mon Sep 17 00:00:00 2001 From: Vecko <36369090+VeckoTheGecko@users.noreply.github.com> Date: Tue, 24 Mar 2026 16:08:20 +0100 Subject: [PATCH 04/10] Comment out list_datasets, update readme --- README.md | 2 +- parcels_benchmarks/benchmark_setup.py | 29 ++++++++++++++------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 7e4f03c..c500753 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ Data is hosted remotely on a SurfDrive managed by the Parcels developers. You wi Once your data is hosted in the shared SurfDrive, you can easily add your dataset to the benchmark dataset manifest using ``` -pixi run benchmark-setup pixi add-dataset --name "Name for your dataset" --file "Path to ZIP archive in the SurfDrive" +pixi run benchmark-setup add-dataset --name "Name for your dataset" --file "Path to ZIP archive in the SurfDrive" ``` During this process, the dataset will be downloaded and a complete entry will be added to the [parcels_benchmarks/benchmarks.json](./parcels_benchmarks/benchmarks.json) manifest file. Once updated, this file can be committed to this repository and contributed via a pull request. diff --git a/parcels_benchmarks/benchmark_setup.py b/parcels_benchmarks/benchmark_setup.py index 6996c2a..2c8ee9b 100644 --- a/parcels_benchmarks/benchmark_setup.py +++ b/parcels_benchmarks/benchmark_setup.py @@ -139,7 +139,7 @@ def download_all( data_home: Path | None = typer.Option( PARCELS_DATADIR, help="Override cache directory." ), -) -> None: +) -> dict[str, Path]: """Download all datasets listed in benchmarks manifest file.""" manifest = _load_manifest(manifest_path) @@ -224,19 +224,20 @@ def add_dataset( typer.echo(f"Added {name!r} to {manifest}") -@app.command("list") -def list_datasets( - manifest: Path = typer.Option( - DEFAULT_MANIFEST, help="Path to benchmarks manifest JSON." - ), -) -> None: - """ - List datasets in the manifest. - """ - m = _load_manifest(manifest) - by_name = _dataset_by_name(m) # noqa: F821 - for name, entry in sorted(by_name.items(), key=lambda kv: kv[0]): - typer.echo(f"{name}: {entry['file']} ({entry.get('known_hash', 'no-hash')})") +# TODO: Is this function needed? if so define `_dataset_by_name` +# @app.command("list") +# def list_datasets( +# manifest: Path = typer.Option( +# DEFAULT_MANIFEST, help="Path to benchmarks manifest JSON." +# ), +# ) -> None: +# """ +# List datasets in the manifest. +# """ +# m = _load_manifest(manifest) +# by_name = _dataset_by_name(m) +# for name, entry in sorted(by_name.items(), key=lambda kv: kv[0]): +# typer.echo(f"{name}: {entry['file']} ({entry.get('known_hash', 'no-hash')})") def main() -> None: From 351c4708371a68060dae8abdb488ad4638b53176 Mon Sep 17 00:00:00 2001 From: Vecko <36369090+VeckoTheGecko@users.noreply.github.com> Date: Tue, 24 Mar 2026 16:35:31 +0100 Subject: [PATCH 05/10] Add typer and ty --- pixi.lock | 338 +++++++++++++++++++++++++++++++++++------------------- pixi.toml | 7 +- 2 files changed, 228 insertions(+), 117 deletions(-) diff --git a/pixi.lock b/pixi.lock index 3f10ffb..73de432 100644 --- a/pixi.lock +++ b/pixi.lock @@ -5,10 +5,13 @@ environments: - url: https://conda.anaconda.org/conda-forge/ indexes: - https://pypi.org/simple + options: + pypi-prerelease-mode: if-necessary-or-explicit packages: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/asv-0.6.5-py312h1289d80_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda @@ -19,6 +22,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.21.2-pyhd8ed1ab_0.conda @@ -43,6 +47,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda @@ -53,6 +59,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pre_commit-4.5.1-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/py-rattler-0.15.0-py310h045cca9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pympler-1.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.12-hd63d673_2_cpython.conda @@ -61,10 +68,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhcf101f3_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ty-0.0.24-h4e94fc0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.24.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda @@ -73,22 +84,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/c6/a18e59f3f0b8071cc85cbc8d80cd02d68aa9710170b2553a117203d46936/numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/bf/2e/9211f09bedb04f9832122942de8b051804b31a39cfbad199a819bb88d9f3/pandas-3.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/45/615f5babd880b4bd7d405cc0dc348234c5ffb6ed1ea33e152ede08b2072d/rich-14.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d5/91/9b286ab899c008c2cb05e8be99814807e7fbbd33f0c0c960470826e5ac82/typer-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: ./ osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/asv-0.6.5-py312h69bf00f_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/backports.zstd-1.3.0-py312h6917036_0.conda @@ -99,6 +103,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-2.0.0-py312he90777b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.21.2-pyhd8ed1ab_0.conda @@ -115,6 +120,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.2-hb99441e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda @@ -125,6 +132,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pre_commit-4.5.1-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/py-rattler-0.15.0-py310h95ad8d8_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pympler-1.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.12-h74c2667_2_cpython.conda @@ -133,10 +141,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.3-py312h51361c1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhcf101f3_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ty-0.0.24-h479939e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.24.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ukkonen-1.1.0-py312h0aa9c5c_0.conda @@ -145,22 +157,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/6e/6f394c9c77668153e14d4da83bcc247beb5952f6ead7699a1a2992613bea/numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/0b/38/db33686f4b5fa64d7af40d96361f6a4615b8c6c8f1b3d334eee46ae6160e/pandas-3.0.0-cp312-cp312-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/45/615f5babd880b4bd7d405cc0dc348234c5ffb6ed1ea33e152ede08b2072d/rich-14.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d5/91/9b286ab899c008c2cb05e8be99814807e7fbbd33f0c0c960470826e5ac82/typer-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: ./ osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/asv-0.6.5-py312h455b684_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/backports.zstd-1.3.0-py312h44dc372_0.conda @@ -171,6 +176,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py312h1b4d9a2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.21.2-pyhd8ed1ab_0.conda @@ -188,6 +194,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda @@ -198,6 +206,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pre_commit-4.5.1-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/py-rattler-0.15.0-py310h96aa460_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pympler-1.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.12-h18782d2_2_cpython.conda @@ -206,10 +215,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py312h04c11ed_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhcf101f3_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ty-0.0.24-ha73ee7d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.24.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py312h766f71e_0.conda @@ -218,22 +231,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1f/f8/55483431f2b2fd015ae6ed4fe62288823ce908437ed49db5a03d15151678/numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/a5/7b/9254310594e9774906bacdd4e732415e1f86ab7dbb4b377ef9ede58cd8ec/pandas-3.0.0-cp312-cp312-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/45/615f5babd880b4bd7d405cc0dc348234c5ffb6ed1ea33e152ede08b2072d/rich-14.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d5/91/9b286ab899c008c2cb05e8be99814807e7fbbd33f0c0c960470826e5ac82/typer-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: ./ win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/asv-0.6.5-py312hbb81ca0_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/backports.zstd-1.3.0-py312h06d0912_0.conda @@ -244,6 +250,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py312he06e257_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.12-py312hd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda @@ -260,6 +267,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.2-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda @@ -269,6 +278,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pre_commit-4.5.1-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/py-rattler-0.15.0-py310hb39080a_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pympler-1.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.12-h0159041_2_cpython.conda @@ -276,10 +286,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py312h05f76fc_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhcf101f3_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ty-0.0.24-hc21aad4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.24.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda @@ -293,18 +307,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/0f/7ceaaeaacb40567071e94dbf2c9480c0ae453d5bb4f52bea3892c39dc83c/numpy-2.4.2-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/64/2d/4f8a2f192ed12c90a0aab47f5557ece0e56b0370c49de9454a09de7381b2/pandas-3.0.0-cp312-cp312-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ef/45/615f5babd880b4bd7d405cc0dc348234c5ffb6ed1ea33e152ede08b2072d/rich-14.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d5/91/9b286ab899c008c2cb05e8be99814807e7fbbd33f0c0c960470826e5ac82/typer-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: ./ @@ -333,11 +339,18 @@ packages: purls: [] size: 8191 timestamp: 1744137672556 -- pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl - name: annotated-doc - version: 0.0.4 - sha256: 571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320 - requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.4-pyhcf101f3_0.conda + sha256: cc9fbc50d4ee7ee04e49ee119243e6f1765750f0fd0b4d270d5ef35461b643b1 + md5: 52be5139047efadaeeb19c6a5103f92a + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/annotated-doc?source=hash-mapping + size: 14222 + timestamp: 1762868213144 - conda: https://conda.anaconda.org/conda-forge/linux-64/asv-0.6.5-py312h1289d80_3.conda sha256: 358ee2461703e253a358e756a2bdb7f99706c3895d65ced5269ec5badc91ee7a md5: b12b1d6ff9f31fd303c8c8a39dff9188 @@ -717,13 +730,33 @@ packages: - pkg:pypi/charset-normalizer?source=hash-mapping size: 50965 timestamp: 1760437331772 -- pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - name: click - version: 8.3.1 - sha256: 981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6 - requires_dist: - - colorama ; sys_platform == 'win32' - requires_python: '>=3.10' +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda + sha256: 38cfe1ee75b21a8361c8824f5544c3866f303af1762693a178266d7f198e8715 + md5: ea8a6c3256897cc31263de9f455e25d9 + depends: + - python >=3.10 + - __unix + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 97676 + timestamp: 1764518652276 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda + sha256: c3bc9a49930fa1c3383a1485948b914823290efac859a2587ca57a270a652e08 + md5: 6cd3ccc98bacfcc92b2bd7f236f01a7e + depends: + - python >=3.10 + - colorama + - __win + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 96620 + timestamp: 1764518654675 - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 md5: 962b9857ee8e7018c22f2776ffa0b2d7 @@ -1219,44 +1252,29 @@ packages: purls: [] size: 55476 timestamp: 1727963768015 -- pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - name: markdown-it-py - version: 4.0.0 - sha256: 87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147 - requires_dist: - - mdurl~=0.1 - - psutil ; extra == 'benchmarking' - - pytest ; extra == 'benchmarking' - - pytest-benchmark ; extra == 'benchmarking' - - commonmark~=0.9 ; extra == 'compare' - - markdown~=3.4 ; extra == 'compare' - - mistletoe~=1.0 ; extra == 'compare' - - mistune~=3.0 ; extra == 'compare' - - panflute~=2.3 ; extra == 'compare' - - markdown-it-pyrs ; extra == 'compare' - - linkify-it-py>=1,<3 ; extra == 'linkify' - - mdit-py-plugins>=0.5.0 ; extra == 'plugins' - - gprof2dot ; extra == 'profiling' - - mdit-py-plugins>=0.5.0 ; extra == 'rtd' - - myst-parser ; extra == 'rtd' - - pyyaml ; extra == 'rtd' - - sphinx ; extra == 'rtd' - - sphinx-copybutton ; extra == 'rtd' - - sphinx-design ; extra == 'rtd' - - sphinx-book-theme~=1.0 ; extra == 'rtd' - - jupyter-sphinx ; extra == 'rtd' - - ipykernel ; extra == 'rtd' - - coverage ; extra == 'testing' - - pytest ; extra == 'testing' - - pytest-cov ; extra == 'testing' - - pytest-regressions ; extra == 'testing' - - requests ; extra == 'testing' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - name: mdurl - version: 0.1.2 - sha256: 84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 - requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e + md5: 5b5203189eb668f042ac2b0826244964 + depends: + - mdurl >=0.1,<1 + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/markdown-it-py?source=hash-mapping + size: 64736 + timestamp: 1754951288511 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + md5: 592132998493b3ff25fd7479396e8351 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mdurl?source=hash-mapping + size: 14465 + timestamp: 1733255681319 - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 md5: 47e340acb35de30501a76c7c799c41d7 @@ -1739,13 +1757,12 @@ packages: - pypi: ./ name: parcels-benchmarks version: 0.1.0 - sha256: e7140ad4b1715c746a6929c2cfa53d4fc5513104bd3819d49c09ec86897fcb82 + sha256: 0f31a2a374ddfcca85e196b8c13ab75ac1aa502b3dc6eb3711010a8502411bd8 requires_dist: - xarray - pooch - typer>=0.9 requires_python: '>=3.10' - editable: true - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda sha256: 04c64fb78c520e5c396b6e07bc9082735a5cc28175dbe23138201d0a9441800b md5: 1bd2e65c8c7ef24f4639ae6e850dacc2 @@ -1885,13 +1902,17 @@ packages: - pkg:pypi/pycparser?source=hash-mapping size: 110100 timestamp: 1733195786147 -- pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl - name: pygments - version: 2.19.2 - sha256: 86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b - requires_dist: - - colorama>=0.4.6 ; extra == 'windows-terminal' - requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a + md5: 6b6ece66ebcae2d5f326c77ef2c5a066 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/pygments?source=hash-mapping + size: 889287 + timestamp: 1750615908735 - conda: https://conda.anaconda.org/conda-forge/noarch/pympler-1.1-pyhd8ed1ab_1.conda sha256: bf38dd14c7f21259b86835a942743da9e861f7ddfc791f0c603d76a00d607693 md5: efe5e018e5852d26f3c3243c91383ef5 @@ -2165,15 +2186,21 @@ packages: - pkg:pypi/requests?source=compressed-mapping size: 63602 timestamp: 1766926974520 -- pypi: https://files.pythonhosted.org/packages/ef/45/615f5babd880b4bd7d405cc0dc348234c5ffb6ed1ea33e152ede08b2072d/rich-14.3.2-py3-none-any.whl - name: rich - version: 14.3.2 - sha256: 08e67c3e90884651da3239ea668222d19bea7b589149d8014a21c633420dbb69 - requires_dist: - - ipywidgets>=7.5.1,<9 ; extra == 'jupyter' - - markdown-it-py>=2.2.0 - - pygments>=2.13.0,<3.0.0 - requires_python: '>=3.8.0' +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda + sha256: b06ce84d6a10c266811a7d3adbfa1c11f13393b91cc6f8a5b468277d90be9590 + md5: 7a6289c50631d620652f5045a63eb573 + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.10 + - typing_extensions >=4.0.0,<5.0.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/rich?source=compressed-mapping + size: 208472 + timestamp: 1771572730357 - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda sha256: fd7201e38e38bf7f25818d624ca8da97b8998957ca9ae3fb7fdc9c17e6b25fcd md5: 1d00d46c634177fc8ede8b99d6089239 @@ -2185,11 +2212,17 @@ packages: - pkg:pypi/setuptools?source=compressed-mapping size: 637506 timestamp: 1770634745653 -- pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl - name: shellingham - version: 1.5.4 - sha256: 7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686 - requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda + sha256: 1d6534df8e7924d9087bd388fbac5bd868c5bf8971c36885f9f016da0657d22b + md5: 83ea3a2ddb7a75c1b09cea582aa4f106 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/shellingham?source=hash-mapping + size: 15018 + timestamp: 1762858315311 - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl name: six version: 1.17.0 @@ -2267,16 +2300,91 @@ packages: - pkg:pypi/tomli?source=compressed-mapping size: 21453 timestamp: 1768146676791 -- pypi: https://files.pythonhosted.org/packages/d5/91/9b286ab899c008c2cb05e8be99814807e7fbbd33f0c0c960470826e5ac82/typer-0.23.1-py3-none-any.whl - name: typer - version: 0.23.1 - sha256: 3291ad0d3c701cbf522012faccfbb29352ff16ad262db2139e6b01f15781f14e - requires_dist: - - click>=8.0.0 - - shellingham>=1.3.0 - - rich>=10.11.0 - - annotated-doc>=0.0.2 - requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/linux-64/ty-0.0.24-h4e94fc0_0.conda + noarch: python + sha256: 3de56413211bcb07c8df0a66eaaed996f0d14a6dbd9cee0b42a0b275c0e464e0 + md5: db52fd98c2edb81ba0f81a1b0aecc8cc + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - _python_abi3_support 1.* + - cpython >=3.10 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ty?source=hash-mapping + size: 9207623 + timestamp: 1773948239539 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ty-0.0.24-h479939e_0.conda + noarch: python + sha256: a1ac01534a37577973f11220f0d0e1b38e0d1c14d4c7b3ff1b6da2f298b4f080 + md5: e91383eb1ce5e4195c75541d8bd273ba + depends: + - python + - __osx >=11.0 + - _python_abi3_support 1.* + - cpython >=3.10 + constrains: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ty?source=hash-mapping + size: 8867239 + timestamp: 1773948349978 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ty-0.0.24-ha73ee7d_0.conda + noarch: python + sha256: c6924afb9d541bed15f159389c08ab5ae492bb69f4e660ae608add0498834703 + md5: 39c996ee15024882153fd31b502b6572 + depends: + - python + - __osx >=11.0 + - _python_abi3_support 1.* + - cpython >=3.10 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ty?source=hash-mapping + size: 8304066 + timestamp: 1773948334333 +- conda: https://conda.anaconda.org/conda-forge/win-64/ty-0.0.24-hc21aad4_0.conda + noarch: python + sha256: 754cd686b04cebdb019d64481f4e3affdbf2fad05e34410ecf6d266c5463e2d5 + md5: b8a33290eda47d529ed05976ec5b0128 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - _python_abi3_support 1.* + - cpython >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ty?source=hash-mapping + size: 9232166 + timestamp: 1773948344148 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.24.0-pyhcf101f3_0.conda + sha256: e1116d08e6a55b2b42a090130c268f75211ad8e6a8e7749e977924de3864d487 + md5: 10870929f587540c5802cd9b071cba5c + depends: + - annotated-doc >=0.0.2 + - click >=8.2.1 + - python >=3.10 + - rich >=12.3.0 + - shellingham >=1.3.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/typer?source=hash-mapping + size: 117860 + timestamp: 1771292312899 - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 md5: 0caa1af407ecff61170c9437a808404d diff --git a/pixi.toml b/pixi.toml index 8b1cb52..14bdea1 100644 --- a/pixi.toml +++ b/pixi.toml @@ -11,10 +11,13 @@ lint = "pre-commit run --all-files" [dependencies] python = "3.12.*" -asv = ">=0.6.5" pooch = ">=1.8.2" -pre_commit = "*" +asv = ">=0.6.5" py-rattler = "0.15.*" +pre_commit = "*" +ty = "*" +typer = "*" + [pypi-dependencies] parcels_benchmarks = { path = ".", editable = true } From a2c10a20999c6e4551ec8a3a76b95889fdd00f43 Mon Sep 17 00:00:00 2001 From: Vecko <36369090+VeckoTheGecko@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:08:37 +0100 Subject: [PATCH 06/10] remove typer --- pixi.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pixi.toml b/pixi.toml index 14bdea1..226bd57 100644 --- a/pixi.toml +++ b/pixi.toml @@ -17,7 +17,6 @@ py-rattler = "0.15.*" pre_commit = "*" ty = "*" -typer = "*" [pypi-dependencies] parcels_benchmarks = { path = ".", editable = true } From 3372708ba7e5cf534356acc7407b9f030016411c Mon Sep 17 00:00:00 2001 From: Vecko <36369090+VeckoTheGecko@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:30:42 +0100 Subject: [PATCH 07/10] Switch to local Parcels install --- README.md | 1 + asv.conf.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c500753..832d968 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ This repository houses performance benchmarks for [Parcels](https://github.com/O ## Development instructions - [install Pixi](https://pixi.sh/dev/installation/) `curl -fsSL https://pixi.sh/install.sh | bash` +- `git clone git@github.com:Parcels-code/parcels Parcels` - `pixi install` - `pixi run asv run` diff --git a/asv.conf.json b/asv.conf.json index ab7af9b..d14c1d0 100644 --- a/asv.conf.json +++ b/asv.conf.json @@ -2,7 +2,7 @@ "version": 1, "project": "parcels", "project_url": "https://github.com/Parcels-Code/parcels", - "repo": "https://github.com/Parcels-Code/parcels.git", + "repo": "./Parcels", "branches": ["main"], "environment_type": "rattler", "conda_channels": [ From bf540bc61206ff90848b131562a17c4753b2247d Mon Sep 17 00:00:00 2001 From: Vecko <36369090+VeckoTheGecko@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:48:12 +0100 Subject: [PATCH 08/10] Update README --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 832d968..823046b 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@ This repository houses performance benchmarks for [Parcels](https://github.com/O ## Development instructions - [install Pixi](https://pixi.sh/dev/installation/) `curl -fsSL https://pixi.sh/install.sh | bash` -- `git clone git@github.com:Parcels-code/parcels Parcels` - `pixi install` - `pixi run asv run` @@ -35,7 +34,7 @@ Members of the Parcels community can contribute benchmark data using the followi 2. Clone your fork onto your system ``` -git clone git@github.com:/parcels-benchmarks.git ~/parcels-benchmarks +git clone --recurse-submodules git@github.com:/parcels-benchmarks.git ``` 3. Run the benchmarks From c6699b67069d2eecfbccec365c489d744a75b22b Mon Sep 17 00:00:00 2001 From: Vecko <36369090+VeckoTheGecko@users.noreply.github.com> Date: Thu, 2 Apr 2026 16:24:23 +0200 Subject: [PATCH 09/10] Complete the catalogs --- catalogs/parcels-benchmarks/catalog.yml | 214 ++++++++++++++++++++--- catalogs/parcels-examples/catalog.yml | 111 ++++++++++-- pixi.toml | 6 + scripts/test_load_all_catalog_entries.py | 44 +++++ 4 files changed, 331 insertions(+), 44 deletions(-) create mode 100644 scripts/test_load_all_catalog_entries.py diff --git a/catalogs/parcels-benchmarks/catalog.yml b/catalogs/parcels-benchmarks/catalog.yml index b502b94..b8bbe84 100644 --- a/catalogs/parcels-benchmarks/catalog.yml +++ b/catalogs/parcels-benchmarks/catalog.yml @@ -3,61 +3,219 @@ plugins: source: - module: intake_xarray -sources: #!TODO Update - croco: - description: CROCO_idealized +sources: + fesom_baroclinic_gyre_data: + description: FESOM baroclinic gyre velocity data (legacy) driver: netcdf - #cache: - # - argkey: urlpath - # regex: '' - # type: file args: - urlpath: "{{ CATALOG_DIR }}/data/CROCOidealized_data/CROCO_idealized.nc" + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_FESOM-baroclinic-gyre/data/*.nc" chunks: {} xarray_kwargs: engine: "netcdf4" - GlobCurrent_example_data: - description: GlobCurrent_example_data + fesom_baroclinic_gyre_mesh: + description: FESOM baroclinic gyre mesh (legacy) driver: netcdf args: - urlpath: "{{ CATALOG_DIR }}/data/GlobCurrent_example_data/*.nc" + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_FESOM-baroclinic-gyre/data/mesh/fesom.mesh.diag.nc" chunks: {} xarray_kwargs: engine: "netcdf4" - MITgcm_example_data: - description: MITgcm_example_data + fesom_baroclinic_gyre_v2_data: + description: FESOM baroclinic gyre velocity data (v2025.10.2.2) driver: netcdf args: - urlpath: "{{ CATALOG_DIR }}/data/MITgcm_example_data/*.nc" + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_FESOM-baroclinic-gyre_v2025.10.2.2/*.nc" chunks: {} xarray_kwargs: engine: "netcdf4" - MovingEddies_data: - description: MovingEddies_data + fesom_baroclinic_gyre_v2_mesh: + description: FESOM baroclinic gyre mesh (v2025.10.2.2) driver: netcdf args: - urlpath: "{{ CATALOG_DIR }}/data/MovingEddies_data/*.nc" + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_FESOM-baroclinic-gyre_v2025.10.2.2/mesh/fesom.mesh.diag.nc" chunks: {} xarray_kwargs: engine: "netcdf4" - - # NemoCurvilinear_data: - # NemoNorthSeaORCA025-N006_data: - # OFAM_example_data - # Peninsula_data - SWASH_data: - description: SWASH_data + icon_data: + description: ICON ocean model data driver: netcdf args: - urlpath: "{{ CATALOG_DIR }}/data/SWASH_data/*.nc" + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_ICON/epoc2_010_oce_ml_1d_mean_19900102T000000Z.nc" chunks: {} xarray_kwargs: engine: "netcdf4" - WOA_data: - description: WOA_data + icon_grid: + description: ICON ocean grid driver: netcdf args: - urlpath: "{{ CATALOG_DIR }}/data/WOA_data/*.nc" + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_ICON/icon_grid_O.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + moi_u: + description: MOi curvilinear U velocity + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_MOi_data/psy4v3r1-daily_U_*.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + concat_dim: "time_counter" + combine: "nested" + data_vars: "minimal" + coords: "minimal" + compat: "override" + moi_v: + description: MOi curvilinear V velocity + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_MOi_data/psy4v3r1-daily_V_*.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + concat_dim: "time_counter" + combine: "nested" + data_vars: "minimal" + coords: "minimal" + compat: "override" + moi_w: + description: MOi curvilinear W velocity + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_MOi_data/psy4v3r1-daily_W_*.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + concat_dim: "time_counter" + combine: "nested" + data_vars: "minimal" + coords: "minimal" + compat: "override" + moi_mesh: + description: MOi curvilinear horizontal grid + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_MOi_data/PSY4V3R1_mesh_hgr.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + nested_locate_regional: + description: Nested LOCATE regional IBI data + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_Nested_LOCATE/regional/*.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + nested_locate_regional_resampled: + description: Nested LOCATE regional IBI data (resampled) + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_Nested_LOCATE/regional_resampled/*.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + nested_locate_bcn_coastal: + description: Nested LOCATE BCN coastal data + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_Nested_LOCATE/BCN/coastal/*.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + nested_locate_bcn_coastal_resampled: + description: Nested LOCATE BCN coastal data (resampled) + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_Nested_LOCATE/BCN/coastal_resampled/*.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + nested_locate_bcn_harbour: + description: Nested LOCATE BCN harbour data + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_Nested_LOCATE/BCN/harbour/*.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + nested_locate_bcn_harbour_resampled: + description: Nested LOCATE BCN harbour data (resampled) + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_Nested_LOCATE/BCN/harbour_resampled/*.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + nested_locate_tar_coastal: + description: Nested LOCATE TAR coastal data + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_Nested_LOCATE/TAR/coastal/*.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + nested_locate_tar_coastal_resampled: + description: Nested LOCATE TAR coastal data (resampled) + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_Nested_LOCATE/TAR/coastal_resampled/*.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + nested_locate_tar_harbour: + description: Nested LOCATE TAR harbour data + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_Nested_LOCATE/TAR/harbour/*.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + nested_locate_tar_harbour_resampled: + description: Nested LOCATE TAR harbour data (resampled) + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_Nested_LOCATE/TAR/harbour_resampled/*.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + smoc: + description: SMOC ocean model data + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/Parcels_Benchmarks_SMOC_data/*.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + creg12_u: + description: CREG12 NEMO U velocity (parcels-2521) + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/parcels-2521-data/data/CREG12.L75-REF12_y2001m02.1d_gridU.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + creg12_v: + description: CREG12 NEMO V velocity (parcels-2521) + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/parcels-2521-data/data/CREG12.L75-REF12_y2001m02.1d_gridV.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + creg12_w: + description: CREG12 NEMO W velocity (parcels-2521) + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/parcels-2521-data/data/CREG12.L75-REF12_y2001m02.1d_gridW.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + creg12_mesh: + description: CREG12 NEMO mesh (parcels-2521) + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/Parcelsv4_Benchmarking_data/parcels-2521-data/data/trimmed_mesh_file.nc" chunks: {} xarray_kwargs: engine: "netcdf4" diff --git a/catalogs/parcels-examples/catalog.yml b/catalogs/parcels-examples/catalog.yml index 90f919c..1567c6e 100644 --- a/catalogs/parcels-examples/catalog.yml +++ b/catalogs/parcels-examples/catalog.yml @@ -7,12 +7,16 @@ sources: croco: description: CROCO_idealized driver: netcdf - #cache: - # - argkey: urlpath - # regex: '' - # type: file args: - urlpath: "{{ CATALOG_DIR }}/data/CROCOidealized_data/CROCO_idealized.nc" + urlpath: "{{ CATALOG_DIR }}/data/parcels-examples/CROCOidealized_data/CROCO_idealized.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + DecayingMovingEddy_data: + description: DecayingMovingEddy_data + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/parcels-examples/DecayingMovingEddy_data/*.nc" chunks: {} xarray_kwargs: engine: "netcdf4" @@ -20,7 +24,7 @@ sources: description: GlobCurrent_example_data driver: netcdf args: - urlpath: "{{ CATALOG_DIR }}/data/GlobCurrent_example_data/*.nc" + urlpath: "{{ CATALOG_DIR }}/data/parcels-examples/GlobCurrent_example_data/*.nc" chunks: {} xarray_kwargs: engine: "netcdf4" @@ -28,7 +32,7 @@ sources: description: MITgcm_example_data driver: netcdf args: - urlpath: "{{ CATALOG_DIR }}/data/MITgcm_example_data/*.nc" + urlpath: "{{ CATALOG_DIR }}/data/parcels-examples/MITgcm_example_data/*.nc" chunks: {} xarray_kwargs: engine: "netcdf4" @@ -36,21 +40,95 @@ sources: description: MovingEddies_data driver: netcdf args: - urlpath: "{{ CATALOG_DIR }}/data/MovingEddies_data/*.nc" + urlpath: "{{ CATALOG_DIR }}/data/parcels-examples/MovingEddies_data/*.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + NemoCurvilinear_data: + description: NemoCurvilinear_data + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/parcels-examples/NemoCurvilinear_data/*.nc4" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + NemoNorthSeaORCA025_data: + description: NemoNorthSeaORCA025-N006 velocity data + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/parcels-examples/NemoNorthSeaORCA025-N006_data/ORCA025*.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + concat_dim: "time_counter" + combine: "nested" + data_vars: "minimal" + coords: "minimal" + compat: "override" + NemoNorthSeaORCA025_coords: + description: NemoNorthSeaORCA025-N006 coordinates + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/parcels-examples/NemoNorthSeaORCA025-N006_data/coordinates.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + decode_times: false + OFAM_example_data: + description: OFAM_example_data + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/parcels-examples/OFAM_example_data/*.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + Peninsula_U: + description: Peninsula U velocity + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/parcels-examples/Peninsula_data/peninsulaU.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + Peninsula_V: + description: Peninsula V velocity + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/parcels-examples/Peninsula_data/peninsulaV.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + Peninsula_T: + description: Peninsula temperature + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/parcels-examples/Peninsula_data/peninsulaT.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + Peninsula_P: + description: Peninsula pressure + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/parcels-examples/Peninsula_data/peninsulaP.nc" + chunks: {} + xarray_kwargs: + engine: "netcdf4" + POPSouthernOcean_data: + description: POPSouthernOcean_data + driver: netcdf + args: + urlpath: "{{ CATALOG_DIR }}/data/parcels-examples/POPSouthernOcean_data/*.nc" chunks: {} xarray_kwargs: engine: "netcdf4" - - # NemoCurvilinear_data: - # NemoNorthSeaORCA025-N006_data: - # OFAM_example_data - # Peninsula_data - # SWASH_data + concat_dim: "time" + combine: "nested" SWASH_data: description: SWASH_data driver: netcdf args: - urlpath: "{{ CATALOG_DIR }}/data/SWASH_data/*.nc" + urlpath: "{{ CATALOG_DIR }}/data/parcels-examples/SWASH_data/*.nc" chunks: {} xarray_kwargs: engine: "netcdf4" @@ -58,7 +136,8 @@ sources: description: WOA_data driver: netcdf args: - urlpath: "{{ CATALOG_DIR }}/data/WOA_data/*.nc" + urlpath: "{{ CATALOG_DIR }}/data/parcels-examples/WOA_data/*.nc" chunks: {} xarray_kwargs: engine: "netcdf4" + decode_times: false diff --git a/pixi.toml b/pixi.toml index a15ea96..006c5f5 100644 --- a/pixi.toml +++ b/pixi.toml @@ -23,6 +23,12 @@ setup-data = { depends-on = [ ] }, ], description = "Setup all data to be used in the benchmarks." } +[tasks.test-open-catalogs] +cmd = "python scripts/test_load_all_catalog_entries.py" +depends-on = ["setup-data"] +description = "Go through all the intake catalogues and try to open each dataset." + + [tasks.benchmark] cmd = "asv run" depends-on = ["setup-data"] diff --git a/scripts/test_load_all_catalog_entries.py b/scripts/test_load_all_catalog_entries.py new file mode 100644 index 0000000..86870c5 --- /dev/null +++ b/scripts/test_load_all_catalog_entries.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 +"""Load and verify all catalog entries from both intake catalogs.""" + +import os +import sys +from pathlib import Path + +# Ensure PIXI_PROJECT_ROOT is set so benchmarks/__init__.py can resolve relative paths +os.environ.setdefault("PIXI_PROJECT_ROOT", str(Path(__file__).parent)) + +from benchmarks.catalogs import Catalogs + + +def load_catalog(name: str, catalog) -> list[tuple[str, Exception]]: + entries = list(catalog) + print(f"\n=== {name} ({len(entries)} entries) ===") + errors = [] + for entry_name in entries: + try: + ds = catalog[entry_name].to_dask() + print(f" OK {entry_name}: {list(ds.data_vars)}") + except Exception as exc: + print(f" ERR {entry_name}: {exc}") + errors.append((entry_name, exc)) + return errors + + +def main() -> None: + all_errors = [] + all_errors.extend(load_catalog("parcels-examples", Catalogs.CAT_EXAMPLES)) + all_errors.extend(load_catalog("parcels-benchmarks", Catalogs.CAT_BENCHMARKS)) + + print(f"\n{'=' * 60}") + if all_errors: + print(f"FAILED: {len(all_errors)} error(s)") + for name, exc in all_errors: + print(f" - {name}: {exc}") + sys.exit(1) + else: + print("All catalog entries loaded successfully.") + + +if __name__ == "__main__": + main() From b50f901fbdc6e857e1b7031c1b0d09edca8cf11e Mon Sep 17 00:00:00 2001 From: Vecko <36369090+VeckoTheGecko@users.noreply.github.com> Date: Thu, 2 Apr 2026 17:08:11 +0200 Subject: [PATCH 10/10] Update MOI loading --- benchmarks/moi_curvilinear.py | 52 ++++++++++------------------------- 1 file changed, 14 insertions(+), 38 deletions(-) diff --git a/benchmarks/moi_curvilinear.py b/benchmarks/moi_curvilinear.py index 639c77e..d5a559f 100644 --- a/benchmarks/moi_curvilinear.py +++ b/benchmarks/moi_curvilinear.py @@ -1,47 +1,26 @@ -from glob import glob - import numpy as np import parcels -import xarray as xr from parcels.interpolators import XLinear +from .catalogs import Catalogs + runtime = np.timedelta64(2, "D") dt = np.timedelta64(15, "m") -PARCELS_DATADIR = ... # TODO: Replace with intake - - -def download_dataset(*args, **kwargs): ... # TODO: Replace with intake +def _load_ds(chunk): + """Helper function to load xarray dataset from catalog with or without chunking""" + cat = Catalogs.CAT_BENCHMARKS + chunks = {"time_counter": 1, "depth": 2, "y": chunk, "x": chunk} if chunk else None - -def _load_ds(datapath, chunk): - """Helper function to load xarray dataset from datapath with or without chunking""" - fileU = f"{datapath}/psy4v3r1-daily_U_2025-01-0[1-3].nc" - filenames = { - "U": glob(fileU), - "V": glob(fileU.replace("_U_", "_V_")), - "W": glob(fileU.replace("_U_", "_W_")), - } - mesh_mask = f"{datapath}/PSY4V3R1_mesh_hgr.nc" - fileargs = { - "concat_dim": "time_counter", - "combine": "nested", - "data_vars": "minimal", - "coords": "minimal", - "compat": "override", - } - if chunk: - fileargs["chunks"] = {"time_counter": 1, "depth": 2, "y": chunk, "x": chunk} - - ds_u = xr.open_mfdataset(filenames["U"], **fileargs)[["vozocrtx"]].rename_vars( - {"vozocrtx": "U"} + ds_u = ( + cat.moi_u(chunks=chunks).to_dask()[["vozocrtx"]].rename_vars({"vozocrtx": "U"}) ) - ds_v = xr.open_mfdataset(filenames["V"], **fileargs)[["vomecrty"]].rename_vars( - {"vomecrty": "V"} + ds_v = ( + cat.moi_v(chunks=chunks).to_dask()[["vomecrty"]].rename_vars({"vomecrty": "V"}) ) - da_depth = xr.open_mfdataset(filenames["W"], **fileargs)["depthw"] - ds_mesh = xr.open_dataset(mesh_mask)[["glamf", "gphif"]].isel(t=0) + da_depth = cat.moi_w(chunks=chunks).to_dask()["depthw"] + ds_mesh = cat.moi_mesh(chunks=None).read()[["glamf", "gphif"]].isel(t=0) ds_mesh["depthw"] = da_depth ds = parcels.convert.nemo_to_sgrid(fields=dict(U=ds_u, V=ds_v), coords=ds_mesh) @@ -62,22 +41,19 @@ class MOICurvilinear: "npart", ] - def setup(self, interpolator, chunk, npart): - self.datapath = download_dataset("MOi-curvilinear", data_home=PARCELS_DATADIR) - def time_load_data_3d(self, interpolator, chunk, npart): """Benchmark that times loading the 'U' and 'V' data arrays only for 3-D""" # To have a reasonable runtime, we only consider the time it takes to load two time levels # and two depth levels (at most) - ds = _load_ds(self.datapath, chunk) + ds = _load_ds(chunk) for j in range(min(ds.coords["deptht"].size, 2)): for i in range(min(ds.coords["time"].size, 2)): _u = ds["U"].isel(deptht=j, time=i).compute() _v = ds["V"].isel(deptht=j, time=i).compute() def pset_execute_3d(self, interpolator, chunk, npart): - ds = _load_ds(self.datapath, chunk) + ds = _load_ds(chunk) fieldset = parcels.FieldSet.from_sgrid_conventions(ds) if interpolator == "XLinear": fieldset.U.interp_method = XLinear