{ "cells": [ { "cell_type": "markdown", "id": "0", "metadata": {}, "source": [ "# ERA5 → EOPF HEALPix Converter\n", "\n", "Converts ERA5 reanalysis surface fields (Gaussian N256/N320) to EOPF-compliant HEALPix zarr (level 7, ~50 km).\n", "\n", "**Pipeline**: download GRIB via CDS (2 MARS requests) → PSFResampler → write zarr → inject STAC → push S3" ] }, { "cell_type": "code", "execution_count": null, "id": "1", "metadata": {}, "outputs": [], "source": [ "import logging\n", "from pathlib import Path\n", "\n", "from healpix_convert.converters.era5 import ERA5Converter\n", "\n", "logging.basicConfig(level=logging.INFO, format=\"%(asctime)s %(levelname)s %(message)s\")" ] }, { "cell_type": "markdown", "id": "2", "metadata": {}, "source": [ "## Configuration" ] }, { "cell_type": "code", "execution_count": null, "id": "3", "metadata": {}, "outputs": [], "source": [ "DATE = \"2025-01-01\"\n", "TIME = \"00:00:00\"\n", "LOCAL_DIR = Path(\".\")\n", "OUTPUT = LOCAL_DIR / f\"S00__ADF_ECMWA_{DATE.replace('-', '')}.zarr\"\n", "PUSH_S3 = False # set True to push to S3\n", "\n", "converter = ERA5Converter(\n", " date=DATE,\n", " time=TIME,\n", " local_dir=LOCAL_DIR,\n", ")" ] }, { "cell_type": "markdown", "id": "4", "metadata": {}, "source": [ "## Step 1 — Prepare (download + PSFResampler)" ] }, { "cell_type": "code", "execution_count": null, "id": "5", "metadata": {}, "outputs": [], "source": [ "result = converter.prepare(output_path=str(OUTPUT))\n", "print(f\"Chunks: {result.n_chunks} | Timesteps: {result.n_times}\")" ] }, { "cell_type": "markdown", "id": "6", "metadata": {}, "source": [ "## Step 2 — Convert (all spatial chunks)" ] }, { "cell_type": "code", "execution_count": null, "id": "7", "metadata": {}, "outputs": [], "source": [ "for i in range(result.n_chunks):\n", " converter.convert_group(i)\n", " if (i + 1) % 20 == 0:\n", " print(f\" {i+1}/{result.n_chunks}\")" ] }, { "cell_type": "markdown", "id": "8", "metadata": {}, "source": [ "## Step 3 — Consolidate (STAC metadata)" ] }, { "cell_type": "code", "execution_count": null, "id": "9", "metadata": {}, "outputs": [], "source": [ "converter.consolidate()\n", "print(f\"Done: {OUTPUT}\")" ] }, { "cell_type": "markdown", "id": "10", "metadata": {}, "source": [ "## Validation" ] }, { "cell_type": "code", "execution_count": null, "id": "11", "metadata": {}, "outputs": [], "source": [ "import healpy as hp\n", "import matplotlib.pyplot as plt\n", "import xarray as xr\n", "\n", "ds = xr.open_zarr(str(OUTPUT), consolidated=True)\n", "print(ds)\n", "\n", "var = \"t2m\"\n", "data = ds[var].isel(time=0).values\n", "hp.mollview(\n", " hp.reorder(data - 273.15, n2r=True),\n", " flip=\"geo\",\n", " nest=False,\n", " cmap=\"RdBu_r\",\n", " min=-50,\n", " max=50,\n", " unit=\"°C\",\n", " title=f\"ERA5 {var} — HEALPix level 7\",\n", ")\n", "plt.show()" ] } ], "metadata": { "language_info": { "name": "python", "pygments_lexer": "ipython3" } }, "nbformat": 4, "nbformat_minor": 5 }