From f8be3d0321fd139b94d74f06ba1bfcbde6d99d11 Mon Sep 17 00:00:00 2001 From: Rajeev Jain Date: Mon, 10 Nov 2025 14:01:13 -0600 Subject: [PATCH 01/10] =?UTF-8?q?o=20Add=20another=20example=20to=20zonal?= =?UTF-8?q?=20averaging,=20also=20wrap=20the=20isel=20logic=20in=20a=20try?= =?UTF-8?q?/except=20so=20that=20if=20a=20caller=20passes=20a=20dimension?= =?UTF-8?q?=20name=20that=20doesn=E2=80=99t=20exist=20then=20raise=20Value?= =?UTF-8?q?Error;=20test=20case=20for=20the=20same?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/user-guide/zonal-average.ipynb | 335 ++++++++++++++++++++++++---- test/core/test_dataarray.py | 17 ++ uxarray/core/dataarray.py | 79 ++++--- 3 files changed, 353 insertions(+), 78 deletions(-) diff --git a/docs/user-guide/zonal-average.ipynb b/docs/user-guide/zonal-average.ipynb index 290d073c1..bc5c422e8 100644 --- a/docs/user-guide/zonal-average.ipynb +++ b/docs/user-guide/zonal-average.ipynb @@ -10,6 +10,21 @@ "This section demonstrates how to perform Zonal Averaging using UXarray, covering both non-conservative and conservative methods.\n" ] }, + { + "cell_type": "markdown", + "id": "191f3851", + "metadata": {}, + "source": [ + "## Notebook Roadmap\n", + "\n", + "- [1. Zonal Mean Basics](#1-zonal-mean-basics) — terminology and the two averaging flavors available in UXarray.\n", + "- [2. Non-Conservative Zonal Averaging](#2-non-conservative-zonal-averaging) — default sampling, plotting, and tuning latitude spacing.\n", + "- [3. Conservative Zonal Averaging](#3-conservative-zonal-averaging) — area-weighted bands, conservation checks, and comparisons.\n", + "- [4. Combined Plots](#4-combined-plots) — pair global maps with their zonal means for context.\n", + "- [5. HEALPix Zonal Averaging (Conservative vs Non-Conservative)](#5-healpix-zonal-averaging-conservative-vs-non-conservative) — run the same workflow on a different grid.\n", + "- [6. 2D Zonal Means on NE30 (RELHUM)](#6-2d-zonal-means-on-ne30-relhum) — build latitude–height slices and inspect the differences.\n" + ] + }, { "cell_type": "code", "execution_count": 1, @@ -1206,7 +1221,9 @@ "id": "d938d659b89bc9cb", "metadata": {}, "source": [ - "## What is a Zonal Average/Mean?\n", + "## 1. Zonal Mean Basics\n", + "\n", + "### Step 1.1: Understand the two averaging flavors\n", "\n", "A zonal average (or zonal mean) is a statistical measure that represents the average of a variable along lines of constant latitude or over latitudinal bands.\n", "\n", @@ -1216,7 +1233,7 @@ "\n", "```{seealso}\n", "[NCL Zonal Average](https://www.ncl.ucar.edu/Applications/zonal.shtml)\n", - "```" + "```\n" ] }, { @@ -1224,11 +1241,13 @@ "id": "non_conservative_header", "metadata": {}, "source": [ - "## Non-Conservative Zonal Averaging\n", + "## 2. Non-Conservative Zonal Averaging\n", "\n", "The non-conservative method samples values at specific lines of constant latitude. This is the default behavior and is suitable for visualization and general analysis where exact conservation is not required.\n", "\n", - "Let's first visualize our data field and then demonstrate zonal averaging:" + "### Step 2.1: Visualize the global field and latitude bands\n", + "\n", + "Let's first visualize our data field and then demonstrate zonal averaging:\n" ] }, { @@ -1249,12 +1268,12 @@ "output_type": "stream", "text": [ "Latitude bands for zonal averaging:\n", - "Band 1: -90\u00b0 to -60\u00b0\n", - "Band 2: -60\u00b0 to -30\u00b0\n", - "Band 3: -30\u00b0 to 0\u00b0\n", - "Band 4: 0\u00b0 to 30\u00b0\n", - "Band 5: 30\u00b0 to 60\u00b0\n", - "Band 6: 60\u00b0 to 90\u00b0\n" + "Band 1: -90° to -60°\n", + "Band 2: -60° to -30°\n", + "Band 3: -30° to 0°\n", + "Band 4: 0° to 30°\n", + "Band 5: 30° to 60°\n", + "Band 6: 60° to 90°\n" ] } ], @@ -1266,7 +1285,17 @@ "print(\"Latitude bands for zonal averaging:\")\n", "lat_bands = np.arange(-90, 91, 30)\n", "for i, lat in enumerate(lat_bands[:-1]):\n", - " print(f\"Band {i + 1}: {lat}\u00b0 to {lat_bands[i + 1]}\u00b0\")" + " print(f\"Band {i + 1}: {lat}° to {lat_bands[i + 1]}°\")" + ] + }, + { + "cell_type": "markdown", + "id": "0de05a0f", + "metadata": {}, + "source": [ + "### Step 2.2: Compute the default zonal mean\n", + "\n", + "Calling `.zonal_mean()` with no arguments samples every 10° between -90° and 90° and returns one value per latitude line.\n" ] }, { @@ -1472,7 +1501,7 @@ "\n", ".xr-section-summary-in + label:before {\n", " display: inline-block;\n", - " content: \"\u25ba\";\n", + " content: \"►\";\n", " font-size: 11px;\n", " width: 15px;\n", " text-align: center;\n", @@ -1483,7 +1512,7 @@ "}\n", "\n", ".xr-section-summary-in:checked + label:before {\n", - " content: \"\u25bc\";\n", + " content: \"▼\";\n", "}\n", "\n", ".xr-section-summary-in:checked + label > span {\n", @@ -1782,7 +1811,9 @@ "id": "65194a38c76e8a62", "metadata": {}, "source": [ - "The default latitude range is between -90 and 90 degrees with a step size of 10 degrees. " + "### Step 2.3: Inspect the default sampling\n", + "\n", + "The default latitude range is between -90 and 90 degrees with a step size of 10 degrees. The plot below shows the resulting profile so you can see how many points are sampled across the globe.\n" ] }, { @@ -1844,11 +1875,13 @@ "id": "ba2d641a3076c692", "metadata": {}, "source": [ + "### Step 2.4: Customize the `lat` parameter\n", + "\n", "The range of latitudes can be modified by using the `lat` parameter. It accepts:\n", "\n", "* **Single scalar**: e.g., `lat=45`\n", "* **List/array**: e.g., `lat=[10, 20]` or `lat=np.array([10, 20])`\n", - "* **Tuple**: e.g., `(min_lat, max_lat, step)`" + "* **Tuple**: e.g., `(min_lat, max_lat, step)`\n" ] }, { @@ -1877,6 +1910,16 @@ "zonal_mean_psi_large = uxds[\"psi\"].zonal_mean(lat=(-90, 90, 1))" ] }, + { + "cell_type": "markdown", + "id": "f1654453", + "metadata": {}, + "source": [ + "### Step 2.5: Visualize the higher-resolution sampling\n", + "\n", + "A 1° step resolves more structure, so the plot below uses the denser coordinate returned from the customized call.\n" + ] + }, { "cell_type": "code", "execution_count": 6, @@ -1936,14 +1979,18 @@ "id": "conservative_header", "metadata": {}, "source": [ - "## Conservative Zonal Averaging\n", + "## 3. Conservative Zonal Averaging\n", "\n", "Conservative zonal averaging preserves integral quantities (mass, energy, momentum) by computing area-weighted averages over latitude bands. This is essential for climate model analysis, energy budget calculations, and any application requiring physical conservation.\n", "\n", - "### Key Differences from Non-Conservative:\n", + "Key differences from non-conservative sampling:\n", "- **Non-conservative**: Samples at specific latitude lines\n", "- **Conservative**: Averages over latitude bands between adjacent lines\n", - "- **Conservation**: Preserves global integrals to machine precision" + "- **Conservation**: Preserves global integrals to machine precision\n", + "\n", + "### Step 3.1: Configure latitude bands and compute the zonal mean\n", + "\n", + "We pass latitude band edges to `.zonal_mean(..., conservative=True)` so each band carries the correct area weight.\n" ] }, { @@ -2148,7 +2195,7 @@ "\n", ".xr-section-summary-in + label:before {\n", " display: inline-block;\n", - " content: \"\u25ba\";\n", + " content: \"►\";\n", " font-size: 11px;\n", " width: 15px;\n", " text-align: center;\n", @@ -2159,7 +2206,7 @@ "}\n", "\n", ".xr-section-summary-in:checked + label:before {\n", - " content: \"\u25bc\";\n", + " content: \"▼\";\n", "}\n", "\n", ".xr-section-summary-in:checked + label > span {\n", @@ -2453,9 +2500,9 @@ "id": "conservation_verification", "metadata": {}, "source": [ - "### Conservation Verification\n", + "### Step 3.2: Verify conservation\n", "\n", - "A key advantage of conservative zonal averaging is that it preserves global integrals." + "A key advantage of conservative zonal averaging is that it preserves global integrals.\n" ] }, { @@ -2505,12 +2552,12 @@ "id": "signature_behavior", "metadata": {}, "source": [ - "### Understanding the lat Parameter\n", + "### Step 3.3: Understand the `lat` parameter signature\n", "\n", "Both conservative and non-conservative modes can use the same `lat` parameter, but they interpret it differently:\n", "\n", "- **Non-conservative**: Creates sample points at the specified latitudes\n", - "- **Conservative**: Uses the latitudes as band edges, creating bands between adjacent points" + "- **Conservative**: Uses the latitudes as band edges, creating bands between adjacent points\n" ] }, { @@ -2572,14 +2619,14 @@ "id": "visual_comparison", "metadata": {}, "source": [ - "### Visual Comparison: Conservative vs Non-Conservative\n", + "### Step 3.4: Visual comparison (lines vs bands)\n", "\n", "The differences between methods reflect their fundamental approaches:\n", "\n", "- **Conservative**: More accurate for physical quantities because it accounts for the actual area of each face within latitude bands\n", "- **Non-conservative**: Faster but approximates by sampling at specific latitude lines\n", "\n", - "The differences you see indicate how much area-weighting matters for your specific data and grid resolution." + "The differences you see indicate how much area-weighting matters for your specific data and grid resolution.\n" ] }, { @@ -2658,7 +2705,7 @@ "id": "understanding_differences", "metadata": {}, "source": [ - "### Understanding the Differences\n", + "### Step 3.5: Quantify the differences\n", "\n", "The differences between conservative and non-conservative results depend on several factors:\n", "\n", @@ -2673,7 +2720,7 @@ "**When differences matter most:**\n", "- Variable resolution grids (where face sizes vary significantly)\n", "- Physical conservation requirements\n", - "- Quantitative analysis and budget calculations" + "- Quantitative analysis and budget calculations\n" ] }, { @@ -2717,9 +2764,11 @@ "id": "4b91ebb8f733a318", "metadata": {}, "source": [ - "## Combined Plots\n", + "## 4. Combined Plots\n", "\n", - "It is often desired to plot the zonal average along side other plots, such as color or contour plots. " + "### Step 4.1: Pair a global map with its zonal mean\n", + "\n", + "It is often desired to plot the zonal average alongside other plots, such as color or contour plots, so you can see both the spatial distribution and its latitude summary in one glance.\n" ] }, { @@ -2792,7 +2841,9 @@ "id": "4f923644", "metadata": {}, "source": [ - "## HEALPix Zonal Averaging: Conservative vs Non-Conservative Methods\n", + "## 5. HEALPix Zonal Averaging (Conservative vs Non-Conservative)\n", + "\n", + "### Step 5.1: Compare conservative and non-conservative averages on HEALPix\n", "\n", "This example demonstrates the key differences between conservative (area-weighted) and non-conservative (point-sampling) zonal averaging on a HEALPix grid.\n" ] @@ -2825,7 +2876,7 @@ "data = np.sin(np.deg2rad(uxgrid.face_lat.values))\n", "uxda = ux.UxDataArray(data, uxgrid=uxgrid, dims=[\"n_face\"], name=\"val\")\n", "\n", - "# Define analysis region: 20\u00b0 latitude band centered at 42\u00b0N\n", + "# Define analysis region: 20° latitude band centered at 42°N\n", "band_edges = np.array([32.0, 52.0]) # Southern USA to Canada\n", "lat_center = 42.0 # Approximate latitude of Chicago/Boston\n", "\n", @@ -2842,7 +2893,7 @@ "z_noncons = uxda.zonal_mean(lat=lat_center)\n", "\n", "# Calculate theoretical values for validation\n", - "theoretical_point = np.sin(np.deg2rad(lat_center)) # Exact at 42\u00b0N\n", + "theoretical_point = np.sin(np.deg2rad(lat_center)) # Exact at 42°N\n", "# For band average: integrate sin(lat)*cos(lat) / integrate cos(lat)\n", "lat_s, lat_n = np.deg2rad(band_edges)\n", "theoretical_band = (\n", @@ -2854,36 +2905,230 @@ "print(\"ZONAL AVERAGING ON HEALPix GRID: Conservative vs Non-Conservative\")\n", "print(\"=\" * 65)\n", "print(\"\\nTest function: sin(latitude)\")\n", - "print(f\"Analysis band: {band_edges[0]:.0f}\u00b0N to {band_edges[1]:.0f}\u00b0N\")\n", - "print(f\"Center latitude: {lat_center:.0f}\u00b0N\")\n", - "print(\"Grid resolution: HEALPix zoom level 3 (~1.8\u00b0 spacing)\")\n", + "print(f\"Analysis band: {band_edges[0]:.0f}°N to {band_edges[1]:.0f}°N\")\n", + "print(f\"Center latitude: {lat_center:.0f}°N\")\n", + "print(\"Grid resolution: HEALPix zoom level 3 (~1.8° spacing)\")\n", "\n", "print(\"\\n\" + \"-\" * 65)\n", "print(\"RESULTS:\")\n", "print(\"-\" * 65)\n", "print(f\"Conservative (band average): {float(z_cons.values[0]):.4f}\")\n", - "print(f\" \u2192 Theoretical value: {theoretical_band:.4f}\")\n", - "print(\" \u2192 Physical meaning: Area-weighted average over 20\u00b0 band\")\n", - "print(\" \u2192 Use case: Flux calculations, energy budgets\\n\")\n", + "print(f\" → Theoretical value: {theoretical_band:.4f}\")\n", + "print(\" → Physical meaning: Area-weighted average over 20° band\")\n", + "print(\" → Use case: Flux calculations, energy budgets\\n\")\n", "\n", "print(f\"Non-conservative (point value): {float(z_noncons.values[0]):.4f}\")\n", - "print(f\" \u2192 Theoretical value: {theoretical_point:.4f}\")\n", - "print(f\" \u2192 Physical meaning: Value at exactly {lat_center}\u00b0N\")\n", - "print(\" \u2192 Use case: Station comparisons, spot measurements\")\n", + "print(f\" → Theoretical value: {theoretical_point:.4f}\")\n", + "print(f\" → Physical meaning: Value at exactly {lat_center}°N\")\n", + "print(\" → Use case: Station comparisons, spot measurements\")\n", "\n", "print(\"\\n\" + \"-\" * 65)\n", "print(\"KEY INSIGHTS:\")\n", "print(\"-\" * 65)\n", "difference = float(z_noncons.values[0]) - float(z_cons.values[0])\n", "print(\n", - " f\"\u2022 Difference between methods: {difference:.4f} ({difference / float(z_noncons.values[0]) * 100:.1f}%)\"\n", + " f\"• Difference between methods: {difference:.4f} ({difference / float(z_noncons.values[0]) * 100:.1f}%)\"\n", ")\n", - "print(\"\u2022 Conservative < Non-conservative because sin(lat) increases toward\")\n", + "print(\"• Conservative < Non-conservative because sin(lat) increases toward\")\n", "print(\" the pole, and southern portion of band has lower values\")\n", - "print(\"\u2022 Both methods are 'correct' - choose based on your application:\")\n", + "print(\"• Both methods are 'correct' - choose based on your application:\")\n", "print(\" - Conservative: preserves integrated quantities\")\n", "print(\" - Non-conservative: provides local values\")" ] + }, + { + "cell_type": "markdown", + "id": "9bae1538", + "metadata": {}, + "source": [ + "## 6. 2D Zonal Means on NE30 (RELHUM)\n", + "\n", + "Everything above uses a single-level field. The CAM-SE NE30 grid ships with a multi-level relative humidity field, so we can see how zonal averaging builds a latitude–height cross section. Each step below walks through the process with extra explanations for first-time users.\n" + ] + }, + { + "cell_type": "markdown", + "id": "4fcf1856", + "metadata": {}, + "source": [ + "### Step 6.1: Load the NE30 grid and prepare the field\n", + "\n", + "We point UXarray to the grid and data files under `test/meshfiles/scrip/ne30pg2/`, open the `RELHUM` variable, and drop the leading time dimension so the array is only `(level, face)`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1a6cbff1", + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "\n", + "import xarray as xr\n", + "\n", + "grid_path = Path(\"../../test/meshfiles/scrip/ne30pg2/grid.nc\")\n", + "data_path = Path(\"../../test/meshfiles/scrip/ne30pg2/data.nc\")\n", + "\n", + "ne30_ds = ux.open_dataset(grid_path, data_path)\n", + "relhum = ne30_ds[\"RELHUM\"]\n", + "\n", + "for dim in (\"time\", \"t\", \"step\"):\n", + " if dim in relhum.dims:\n", + " relhum = relhum.isel({dim: 0})\n", + "\n", + "level_dim = \"level\" if \"level\" in relhum.dims else relhum.dims[0]\n", + "levels = relhum.coords.get(\n", + " level_dim,\n", + " xr.DataArray(np.arange(relhum.sizes[level_dim]), dims=level_dim),\n", + ").values\n", + "\n", + "relhum" + ] + }, + { + "cell_type": "markdown", + "id": "37c55c53", + "metadata": {}, + "source": [ + "### Step 6.2: Build latitude samples and compute both zonal means\n", + "\n", + "Sampling every 10 degrees gives us clearly separated latitude bands while staying light on compute. The non-conservative average uses those values as **centers**, while the conservative option treats them as **band edges** so that each band carries the correct area weight. Adjust the spacing if you need higher detail or faster turnaround." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2285f261", + "metadata": {}, + "outputs": [], + "source": [ + "lat_edges_deg = np.arange(-90.0, 90.0 + 10.0, 10.0)\n", + "lat_centers_deg = 0.5 * (lat_edges_deg[:-1] + lat_edges_deg[1:])\n", + "\n", + "\n", + "def stack_zonal_means(data_array, lat_values, *, conservative):\n", + " slices = []\n", + " for lev in range(data_array.sizes[level_dim]):\n", + " zonal_slice = data_array.isel({level_dim: lev}).zonal_mean(\n", + " lat=lat_values, conservative=conservative\n", + " )\n", + " slices.append(zonal_slice)\n", + " zonal = xr.concat(slices, dim=level_dim)\n", + " return zonal.assign_coords({level_dim: levels}).rename({\"latitudes\": \"lat\"})\n", + "\n", + "\n", + "zonal_nc = stack_zonal_means(relhum, lat_centers_deg, conservative=False)\n", + "zonal_c = stack_zonal_means(relhum, lat_edges_deg, conservative=True)\n", + "zonal_diff = zonal_c - zonal_nc\n", + "\n", + "zonal_nc" + ] + }, + { + "cell_type": "markdown", + "id": "bbbfb613", + "metadata": {}, + "source": [ + "### Step 6.3: Visualize the latitude–level slices\n", + "\n", + "Placing the two 2D sections next to each other shows the smoothing introduced by area weighting, while a third panel plotting the signed difference (conservative − non-conservative) highlights where the methods diverge. Because every panel uses the same color scale (and the difference plot uses a diverging palette), the contrast is easy to spot." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b752c490", + "metadata": {}, + "outputs": [], + "source": [ + "fig, axes = plt.subplots(1, 3, figsize=(15, 4), sharey=True, constrained_layout=True)\n", + "\n", + "value_min = float(min(zonal_nc.min().values, zonal_c.min().values))\n", + "value_max = float(max(zonal_nc.max().values, zonal_c.max().values))\n", + "\n", + "mesh_nc = axes[0].pcolormesh(\n", + " zonal_nc[\"lat\"],\n", + " levels,\n", + " zonal_nc.transpose(level_dim, \"lat\"),\n", + " shading=\"nearest\",\n", + " cmap=\"viridis\",\n", + " vmin=value_min,\n", + " vmax=value_max,\n", + ")\n", + "axes[0].set_title(\"Non-conservative (centers)\")\n", + "axes[0].set_xlabel(\"Latitude (deg)\")\n", + "axes[0].set_ylabel(level_dim)\n", + "axes[0].set_xlim(-90, 90)\n", + "\n", + "mesh_c = axes[1].pcolormesh(\n", + " zonal_c[\"lat\"],\n", + " levels,\n", + " zonal_c.transpose(level_dim, \"lat\"),\n", + " shading=\"nearest\",\n", + " cmap=\"viridis\",\n", + " vmin=value_min,\n", + " vmax=value_max,\n", + ")\n", + "axes[1].set_title(\"Conservative (bands)\")\n", + "axes[1].set_xlabel(\"Latitude (deg)\")\n", + "axes[1].set_xlim(-90, 90)\n", + "\n", + "diff_max = float(np.nanmax(np.abs(zonal_diff.values)))\n", + "if diff_max == 0:\n", + " diff_max = 1e-6\n", + "mesh_diff = axes[2].pcolormesh(\n", + " zonal_diff[\"lat\"],\n", + " levels,\n", + " zonal_diff.transpose(level_dim, \"lat\"),\n", + " shading=\"nearest\",\n", + " cmap=\"RdBu_r\",\n", + " vmin=-diff_max,\n", + " vmax=diff_max,\n", + ")\n", + "axes[2].set_title(\"Difference (conservative - non)\")\n", + "axes[2].set_xlabel(\"Latitude (deg)\")\n", + "axes[2].set_xlim(-90, 90)\n", + "\n", + "cbar_field = fig.colorbar(\n", + " mesh_nc, ax=[axes[0], axes[1]], orientation=\"vertical\", fraction=0.04, pad=0.02\n", + ")\n", + "cbar_field.set_label(\"RELHUM zonal mean\")\n", + "\n", + "cbar_diff = fig.colorbar(\n", + " mesh_diff, ax=[axes[2]], orientation=\"vertical\", fraction=0.08, pad=0.02\n", + ")\n", + "cbar_diff.set_label(\"RELHUM difference\")" + ] + }, + { + "cell_type": "markdown", + "id": "6530ad41", + "metadata": {}, + "source": [ + "### Step 6.4: Spot-check the difference numerically\n", + "\n", + "Visuals are helpful, but printing quick summary statistics and a few sample latitude bands makes it clear how large the conservative correction is." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2f6ff242", + "metadata": {}, + "outputs": [], + "source": [ + "abs_diff = np.abs(zonal_diff)\n", + "max_abs = float(abs_diff.max())\n", + "mean_abs = float(abs_diff.mean())\n", + "per_level_max = abs_diff.max(dim=\"lat\")\n", + "\n", + "print(f\"Max absolute difference: {max_abs:.3f}\")\n", + "print(f\"Mean absolute difference: {mean_abs:.3f}\")\n", + "\n", + "preview_levels = per_level_max.isel({level_dim: slice(0, 5)})\n", + "preview_levels" + ] } ], "metadata": { diff --git a/test/core/test_dataarray.py b/test/core/test_dataarray.py index e27fe10e0..c1d00a7e5 100644 --- a/test/core/test_dataarray.py +++ b/test/core/test_dataarray.py @@ -93,3 +93,20 @@ def test_geodataframe_caching(gridpath, datasetpath): # override will recompute the grid assert gdf_start is not gdf_end + +def test_isel_invalid_dim(gridpath): + """Tests that isel raises a ValueError with a helpful message when an + invalid dimension is provided.""" + uxds = ux.open_dataset( + gridpath("ugrid", "outCSne30", "outCSne30.ug"), + ) + + # create a UxDataArray with an extra dimension + data = np.random.rand(2, uxds.uxgrid.n_face) + uxda = UxDataArray(data, dims=["time", "n_face"], uxgrid=uxds.uxgrid) + + with pytest.raises(ValueError, match="Dimensions {\'invalid_dim\'} do not exist. Available dimensions: \('time', 'n_face'\)"): + uxda.isel(invalid_dim=0) + + with pytest.raises(ValueError, match="Dimensions {\'level\'} do not exist. Available dimensions: \('time', 'n_face'\)"): + uxda.isel(level=0) diff --git a/uxarray/core/dataarray.py b/uxarray/core/dataarray.py index d638893e5..9980a7e9c 100644 --- a/uxarray/core/dataarray.py +++ b/uxarray/core/dataarray.py @@ -1572,44 +1572,57 @@ def isel( indexers, indexers_kwargs, "isel", ignore_grid ) - # Grid Branch - if not ignore_grid: - if len(grid_dims) == 1: - # pop off the one grid‐dim indexer - grid_dim = grid_dims.pop() - grid_indexer = indexers.pop(grid_dim) - - sliced_grid = self.uxgrid.isel( - **{grid_dim: grid_indexer}, inverse_indices=inverse_indices - ) + try: + # Grid Branch + if not ignore_grid: + if len(grid_dims) == 1: + # pop off the one grid‐dim indexer + grid_dim = grid_dims.pop() + grid_indexer = indexers.pop(grid_dim) + + sliced_grid = self.uxgrid.isel( + **{grid_dim: grid_indexer}, inverse_indices=inverse_indices + ) + + da = self._slice_from_grid(sliced_grid) - da = self._slice_from_grid(sliced_grid) + # if there are any remaining indexers, apply them + if indexers: + xarr = super(UxDataArray, da).isel( + indexers=indexers, drop=drop, missing_dims=missing_dims + ) + # re‐wrap so the grid sticks around + return type(self)(xarr, uxgrid=sliced_grid) - # if there are any remaining indexers, apply them - if indexers: - xarr = super(UxDataArray, da).isel( - indexers=indexers, drop=drop, missing_dims=missing_dims + # no other dims, return the grid‐sliced da + return da + else: + return type(self)( + super().isel( + indexers=indexers or None, + drop=drop, + missing_dims=missing_dims, + ), + uxgrid=self.uxgrid, ) - # re‐wrap so the grid sticks around - return type(self)(xarr, uxgrid=sliced_grid) - # no other dims, return the grid‐sliced da - return da + return super().isel( + indexers=indexers or None, + drop=drop, + missing_dims=missing_dims, + ) + except ValueError as e: + if "Dimensions" in str(e) and "do not exist" in str(e): + # The error message from xarray is quite good, but we can add to it. + # e.g. "Dimensions {'level'} do not exist. Expected one of ('n_face', 'time', 'lev')" + # Let's just append the available dimensions. + original_error_msg = str(e) + raise ValueError( + f"{original_error_msg}. Available dimensions: {self.dims}" + ) from e else: - return type(self)( - super().isel( - indexers=indexers or None, - drop=drop, - missing_dims=missing_dims, - ), - uxgrid=self.uxgrid, - ) - - return super().isel( - indexers=indexers or None, - drop=drop, - missing_dims=missing_dims, - ) + # re-raise other ValueErrors + raise e @classmethod def from_xarray(cls, da: xr.DataArray, uxgrid: Grid, ugrid_dims: dict = None): From c8266157ab3cf599f5deb034f75aebcb910d31eb Mon Sep 17 00:00:00 2001 From: Rajeev Jain Date: Mon, 10 Nov 2025 14:28:25 -0600 Subject: [PATCH 02/10] o Fix missed datasetpath --- test/core/test_dataarray.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/test/core/test_dataarray.py b/test/core/test_dataarray.py index c1d00a7e5..49061748f 100644 --- a/test/core/test_dataarray.py +++ b/test/core/test_dataarray.py @@ -94,19 +94,26 @@ def test_geodataframe_caching(gridpath, datasetpath): # override will recompute the grid assert gdf_start is not gdf_end -def test_isel_invalid_dim(gridpath): +def test_isel_invalid_dim(gridpath, datasetpath): """Tests that isel raises a ValueError with a helpful message when an invalid dimension is provided.""" uxds = ux.open_dataset( gridpath("ugrid", "outCSne30", "outCSne30.ug"), + datasetpath("ugrid", "outCSne30", "outCSne30_var2.nc"), ) # create a UxDataArray with an extra dimension data = np.random.rand(2, uxds.uxgrid.n_face) uxda = UxDataArray(data, dims=["time", "n_face"], uxgrid=uxds.uxgrid) - with pytest.raises(ValueError, match="Dimensions {\'invalid_dim\'} do not exist. Available dimensions: \('time', 'n_face'\)"): + with pytest.raises( + ValueError, + match=r"Dimensions \{'invalid_dim'\} do not exist\..*Available dimensions: \('time', 'n_face'\)", + ): uxda.isel(invalid_dim=0) - with pytest.raises(ValueError, match="Dimensions {\'level\'} do not exist. Available dimensions: \('time', 'n_face'\)"): + with pytest.raises( + ValueError, + match=r"Dimensions \{'level'\} do not exist\..*Available dimensions: \('time', 'n_face'\)", + ): uxda.isel(level=0) From 9147d45e6eb9f15946c21210481de56caf5e0de7 Mon Sep 17 00:00:00 2001 From: Rajeev Jain Date: Fri, 14 Nov 2025 10:26:21 -0600 Subject: [PATCH 03/10] o Add comment about crossection notebook and some more fixes --- docs/user-guide/zonal-average.ipynb | 4695 +++++++++++++++++++-------- 1 file changed, 3256 insertions(+), 1439 deletions(-) diff --git a/docs/user-guide/zonal-average.ipynb b/docs/user-guide/zonal-average.ipynb index bc5c422e8..137e6784e 100644 --- a/docs/user-guide/zonal-average.ipynb +++ b/docs/user-guide/zonal-average.ipynb @@ -27,7 +27,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 33, "id": "185e2061bc4c75b9", "metadata": { "execution": { @@ -64,517 +64,16 @@ }, { "data": { - "application/javascript": [ - "(function(root) {\n", - " function now() {\n", - " return new Date();\n", - " }\n", - "\n", - " const force = true;\n", - " const py_version = '3.8.0'.replace('rc', '-rc.').replace('.dev', '-dev.');\n", - " const reloading = false;\n", - " const Bokeh = root.Bokeh;\n", - "\n", - " // Set a timeout for this load but only if we are not already initializing\n", - " if (typeof (root._bokeh_timeout) === \"undefined\" || (force || !root._bokeh_is_initializing)) {\n", - " root._bokeh_timeout = Date.now() + 5000;\n", - " root._bokeh_failed_load = false;\n", - " }\n", - "\n", - " function run_callbacks() {\n", - " try {\n", - " root._bokeh_onload_callbacks.forEach(function(callback) {\n", - " if (callback != null)\n", - " callback();\n", - " });\n", - " } finally {\n", - " delete root._bokeh_onload_callbacks;\n", - " }\n", - " console.debug(\"Bokeh: all callbacks have finished\");\n", - " }\n", - "\n", - " function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n", - " if (css_urls == null) css_urls = [];\n", - " if (js_urls == null) js_urls = [];\n", - " if (js_modules == null) js_modules = [];\n", - " if (js_exports == null) js_exports = {};\n", - "\n", - " root._bokeh_onload_callbacks.push(callback);\n", - "\n", - " if (root._bokeh_is_loading > 0) {\n", - " // Don't load bokeh if it is still initializing\n", - " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", - " return null;\n", - " } else if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n", - " // There is nothing to load\n", - " run_callbacks();\n", - " return null;\n", - " }\n", - "\n", - " function on_load() {\n", - " root._bokeh_is_loading--;\n", - " if (root._bokeh_is_loading === 0) {\n", - " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", - " run_callbacks()\n", - " }\n", - " }\n", - " window._bokeh_on_load = on_load\n", - "\n", - " function on_error(e) {\n", - " const src_el = e.srcElement\n", - " console.error(\"failed to load \" + (src_el.href || src_el.src));\n", - " }\n", - "\n", - " const skip = [];\n", - " if (window.requirejs) {\n", - " window.requirejs.config({'packages': {}, 'paths': {}, 'shim': {}});\n", - " root._bokeh_is_loading = css_urls.length + 0;\n", - " } else {\n", - " root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n", - " }\n", - "\n", - " const existing_stylesheets = []\n", - " const links = document.getElementsByTagName('link')\n", - " for (let i = 0; i < links.length; i++) {\n", - " const link = links[i]\n", - " if (link.href != null) {\n", - " existing_stylesheets.push(link.href)\n", - " }\n", - " }\n", - " for (let i = 0; i < css_urls.length; i++) {\n", - " const url = css_urls[i];\n", - " const escaped = encodeURI(url)\n", - " if (existing_stylesheets.indexOf(escaped) !== -1) {\n", - " on_load()\n", - " continue;\n", - " }\n", - " const element = document.createElement(\"link\");\n", - " element.onload = on_load;\n", - " element.onerror = on_error;\n", - " element.rel = \"stylesheet\";\n", - " element.type = \"text/css\";\n", - " element.href = url;\n", - " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", - " document.body.appendChild(element);\n", - " } var existing_scripts = []\n", - " const scripts = document.getElementsByTagName('script')\n", - " for (let i = 0; i < scripts.length; i++) {\n", - " var script = scripts[i]\n", - " if (script.src != null) {\n", - " existing_scripts.push(script.src)\n", - " }\n", - " }\n", - " for (let i = 0; i < js_urls.length; i++) {\n", - " const url = js_urls[i];\n", - " const escaped = encodeURI(url)\n", - " if (skip.indexOf(escaped) !== -1 || existing_scripts.indexOf(escaped) !== -1) {\n", - " if (!window.requirejs) {\n", - " on_load();\n", - " }\n", - " continue;\n", - " }\n", - " const element = document.createElement('script');\n", - " element.onload = on_load;\n", - " element.onerror = on_error;\n", - " element.async = false;\n", - " element.src = url;\n", - " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", - " document.head.appendChild(element);\n", - " }\n", - " for (let i = 0; i < js_modules.length; i++) {\n", - " const url = js_modules[i];\n", - " const escaped = encodeURI(url)\n", - " if (skip.indexOf(escaped) !== -1 || existing_scripts.indexOf(escaped) !== -1) {\n", - " if (!window.requirejs) {\n", - " on_load();\n", - " }\n", - " continue;\n", - " }\n", - " var element = document.createElement('script');\n", - " element.onload = on_load;\n", - " element.onerror = on_error;\n", - " element.async = false;\n", - " element.src = url;\n", - " element.type = \"module\";\n", - " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", - " document.head.appendChild(element);\n", - " }\n", - " for (const name in js_exports) {\n", - " const url = js_exports[name];\n", - " const escaped = encodeURI(url)\n", - " if (skip.indexOf(escaped) >= 0 || root[name] != null) {\n", - " if (!window.requirejs) {\n", - " on_load();\n", - " }\n", - " continue;\n", - " }\n", - " var element = document.createElement('script');\n", - " element.onerror = on_error;\n", - " element.async = false;\n", - " element.type = \"module\";\n", - " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", - " element.textContent = `\n", - " import ${name} from \"${url}\"\n", - " window.${name} = ${name}\n", - " window._bokeh_on_load()\n", - " `\n", - " document.head.appendChild(element);\n", - " }\n", - " if (!js_urls.length && !js_modules.length) {\n", - " on_load()\n", - " }\n", - " };\n", - "\n", - " function inject_raw_css(css) {\n", - " const element = document.createElement(\"style\");\n", - " element.appendChild(document.createTextNode(css));\n", - " document.body.appendChild(element);\n", - " }\n", - "\n", - " const js_urls = [\"https://cdn.holoviz.org/panel/1.8.1/dist/bundled/reactiveesm/es-module-shims@^1.10.0/dist/es-module-shims.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-3.8.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.8.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.8.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.8.0.min.js\", \"https://cdn.holoviz.org/panel/1.8.1/dist/panel.min.js\"];\n", - " const js_modules = [];\n", - " const js_exports = {};\n", - " const css_urls = [];\n", - " const inline_js = [ function(Bokeh) {\n", - " Bokeh.set_log_level(\"info\");\n", - " },\n", - "function(Bokeh) {} // ensure no trailing comma for IE\n", - " ];\n", - "\n", - " function run_inline_js() {\n", - " if ((root.Bokeh !== undefined) || (force === true)) {\n", - " for (let i = 0; i < inline_js.length; i++) {\n", - " try {\n", - " inline_js[i].call(root, root.Bokeh);\n", - " } catch(e) {\n", - " if (!reloading) {\n", - " throw e;\n", - " }\n", - " }\n", - " }\n", - " // Cache old bokeh versions\n", - " if (Bokeh != undefined && !reloading) {\n", - " var NewBokeh = root.Bokeh;\n", - " if (Bokeh.versions === undefined) {\n", - " Bokeh.versions = new Map();\n", - " }\n", - " if (NewBokeh.version !== Bokeh.version) {\n", - " Bokeh.versions.set(NewBokeh.version, NewBokeh)\n", - " }\n", - " root.Bokeh = Bokeh;\n", - " }\n", - " } else if (Date.now() < root._bokeh_timeout) {\n", - " setTimeout(run_inline_js, 100);\n", - " } else if (!root._bokeh_failed_load) {\n", - " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", - " root._bokeh_failed_load = true;\n", - " }\n", - " root._bokeh_is_initializing = false\n", - " }\n", - "\n", - " function load_or_wait() {\n", - " // Implement a backoff loop that tries to ensure we do not load multiple\n", - " // versions of Bokeh and its dependencies at the same time.\n", - " // In recent versions we use the root._bokeh_is_initializing flag\n", - " // to determine whether there is an ongoing attempt to initialize\n", - " // bokeh, however for backward compatibility we also try to ensure\n", - " // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n", - " // before older versions are fully initialized.\n", - " if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n", - " // If the timeout and bokeh was not successfully loaded we reset\n", - " // everything and try loading again\n", - " root._bokeh_timeout = Date.now() + 5000;\n", - " root._bokeh_is_initializing = false;\n", - " root._bokeh_onload_callbacks = undefined;\n", - " root._bokeh_is_loading = 0\n", - " console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n", - " load_or_wait();\n", - " } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n", - " setTimeout(load_or_wait, 100);\n", - " } else {\n", - " root._bokeh_is_initializing = true\n", - " root._bokeh_onload_callbacks = []\n", - " const bokeh_loaded = root.Bokeh != null && (root.Bokeh.version === py_version || (root.Bokeh.versions !== undefined && root.Bokeh.versions.has(py_version)));\n", - " if (!reloading && !bokeh_loaded) {\n", - " if (root.Bokeh) {\n", - " root.Bokeh = undefined;\n", - " }\n", - " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", - " }\n", - " load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n", - " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", - " run_inline_js();\n", - " });\n", - " }\n", - " }\n", - " // Give older versions of the autoload script a head-start to ensure\n", - " // they initialize before we start loading newer version.\n", - " setTimeout(load_or_wait, 100)\n", - "}(window));" - ], - "application/vnd.holoviews_load.v0+json": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n const py_version = '3.8.0'.replace('rc', '-rc.').replace('.dev', '-dev.');\n const reloading = false;\n const Bokeh = root.Bokeh;\n\n // Set a timeout for this load but only if we are not already initializing\n if (typeof (root._bokeh_timeout) === \"undefined\" || (force || !root._bokeh_is_initializing)) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks;\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n if (js_exports == null) js_exports = {};\n\n root._bokeh_onload_callbacks.push(callback);\n\n if (root._bokeh_is_loading > 0) {\n // Don't load bokeh if it is still initializing\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n } else if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n // There is nothing to load\n run_callbacks();\n return null;\n }\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n window._bokeh_on_load = on_load\n\n function on_error(e) {\n const src_el = e.srcElement\n console.error(\"failed to load \" + (src_el.href || src_el.src));\n }\n\n const skip = [];\n if (window.requirejs) {\n window.requirejs.config({'packages': {}, 'paths': {}, 'shim': {}});\n root._bokeh_is_loading = css_urls.length + 0;\n } else {\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n }\n\n const existing_stylesheets = []\n const links = document.getElementsByTagName('link')\n for (let i = 0; i < links.length; i++) {\n const link = links[i]\n if (link.href != null) {\n existing_stylesheets.push(link.href)\n }\n }\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const escaped = encodeURI(url)\n if (existing_stylesheets.indexOf(escaped) !== -1) {\n on_load()\n continue;\n }\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n } var existing_scripts = []\n const scripts = document.getElementsByTagName('script')\n for (let i = 0; i < scripts.length; i++) {\n var script = scripts[i]\n if (script.src != null) {\n existing_scripts.push(script.src)\n }\n }\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const escaped = encodeURI(url)\n if (skip.indexOf(escaped) !== -1 || existing_scripts.indexOf(escaped) !== -1) {\n if (!window.requirejs) {\n on_load();\n }\n continue;\n }\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (let i = 0; i < js_modules.length; i++) {\n const url = js_modules[i];\n const escaped = encodeURI(url)\n if (skip.indexOf(escaped) !== -1 || existing_scripts.indexOf(escaped) !== -1) {\n if (!window.requirejs) {\n on_load();\n }\n continue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (const name in js_exports) {\n const url = js_exports[name];\n const escaped = encodeURI(url)\n if (skip.indexOf(escaped) >= 0 || root[name] != null) {\n if (!window.requirejs) {\n on_load();\n }\n continue;\n }\n var element = document.createElement('script');\n element.onerror = on_error;\n element.async = false;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n element.textContent = `\n import ${name} from \"${url}\"\n window.${name} = ${name}\n window._bokeh_on_load()\n `\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.holoviz.org/panel/1.8.1/dist/bundled/reactiveesm/es-module-shims@^1.10.0/dist/es-module-shims.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-3.8.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.8.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.8.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.8.0.min.js\", \"https://cdn.holoviz.org/panel/1.8.1/dist/panel.min.js\"];\n const js_modules = [];\n const js_exports = {};\n const css_urls = [];\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (let i = 0; i < inline_js.length; i++) {\n try {\n inline_js[i].call(root, root.Bokeh);\n } catch(e) {\n if (!reloading) {\n throw e;\n }\n }\n }\n // Cache old bokeh versions\n if (Bokeh != undefined && !reloading) {\n var NewBokeh = root.Bokeh;\n if (Bokeh.versions === undefined) {\n Bokeh.versions = new Map();\n }\n if (NewBokeh.version !== Bokeh.version) {\n Bokeh.versions.set(NewBokeh.version, NewBokeh)\n }\n root.Bokeh = Bokeh;\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n }\n root._bokeh_is_initializing = false\n }\n\n function load_or_wait() {\n // Implement a backoff loop that tries to ensure we do not load multiple\n // versions of Bokeh and its dependencies at the same time.\n // In recent versions we use the root._bokeh_is_initializing flag\n // to determine whether there is an ongoing attempt to initialize\n // bokeh, however for backward compatibility we also try to ensure\n // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n // before older versions are fully initialized.\n if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n // If the timeout and bokeh was not successfully loaded we reset\n // everything and try loading again\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_is_initializing = false;\n root._bokeh_onload_callbacks = undefined;\n root._bokeh_is_loading = 0\n console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n load_or_wait();\n } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n setTimeout(load_or_wait, 100);\n } else {\n root._bokeh_is_initializing = true\n root._bokeh_onload_callbacks = []\n const bokeh_loaded = root.Bokeh != null && (root.Bokeh.version === py_version || (root.Bokeh.versions !== undefined && root.Bokeh.versions.has(py_version)));\n if (!reloading && !bokeh_loaded) {\n if (root.Bokeh) {\n root.Bokeh = undefined;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n }\n load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n }\n // Give older versions of the autoload script a head-start to ensure\n // they initialize before we start loading newer version.\n setTimeout(load_or_wait, 100)\n}(window));" + "application/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n const py_version = '3.7.3'.replace('rc', '-rc.').replace('.dev', '-dev.');\n const reloading = false;\n const Bokeh = root.Bokeh;\n\n // Set a timeout for this load but only if we are not already initializing\n if (typeof (root._bokeh_timeout) === \"undefined\" || (force || !root._bokeh_is_initializing)) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks;\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n if (js_exports == null) js_exports = {};\n\n root._bokeh_onload_callbacks.push(callback);\n\n if (root._bokeh_is_loading > 0) {\n // Don't load bokeh if it is still initializing\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n } else if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n // There is nothing to load\n run_callbacks();\n return null;\n }\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n window._bokeh_on_load = on_load\n\n function on_error(e) {\n const src_el = e.srcElement\n console.error(\"failed to load \" + (src_el.href || src_el.src));\n }\n\n const skip = [];\n if (window.requirejs) {\n window.requirejs.config({'packages': {}, 'paths': {}, 'shim': {}});\n root._bokeh_is_loading = css_urls.length + 0;\n } else {\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n }\n\n const existing_stylesheets = []\n const links = document.getElementsByTagName('link')\n for (let i = 0; i < links.length; i++) {\n const link = links[i]\n if (link.href != null) {\n existing_stylesheets.push(link.href)\n }\n }\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const escaped = encodeURI(url)\n if (existing_stylesheets.indexOf(escaped) !== -1) {\n on_load()\n continue;\n }\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n } var existing_scripts = []\n const scripts = document.getElementsByTagName('script')\n for (let i = 0; i < scripts.length; i++) {\n var script = scripts[i]\n if (script.src != null) {\n existing_scripts.push(script.src)\n }\n }\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const escaped = encodeURI(url)\n if (skip.indexOf(escaped) !== -1 || existing_scripts.indexOf(escaped) !== -1) {\n if (!window.requirejs) {\n on_load();\n }\n continue;\n }\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (let i = 0; i < js_modules.length; i++) {\n const url = js_modules[i];\n const escaped = encodeURI(url)\n if (skip.indexOf(escaped) !== -1 || existing_scripts.indexOf(escaped) !== -1) {\n if (!window.requirejs) {\n on_load();\n }\n continue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (const name in js_exports) {\n const url = js_exports[name];\n const escaped = encodeURI(url)\n if (skip.indexOf(escaped) >= 0 || root[name] != null) {\n if (!window.requirejs) {\n on_load();\n }\n continue;\n }\n var element = document.createElement('script');\n element.onerror = on_error;\n element.async = false;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n element.textContent = `\n import ${name} from \"${url}\"\n window.${name} = ${name}\n window._bokeh_on_load()\n `\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.holoviz.org/panel/1.8.2/dist/bundled/reactiveesm/es-module-shims@^1.10.0/dist/es-module-shims.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.7.3.min.js\", \"https://cdn.holoviz.org/panel/1.8.2/dist/panel.min.js\"];\n const js_modules = [];\n const js_exports = {};\n const css_urls = [];\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (let i = 0; i < inline_js.length; i++) {\n try {\n inline_js[i].call(root, root.Bokeh);\n } catch(e) {\n if (!reloading) {\n throw e;\n }\n }\n }\n // Cache old bokeh versions\n if (Bokeh != undefined && !reloading) {\n var NewBokeh = root.Bokeh;\n if (Bokeh.versions === undefined) {\n Bokeh.versions = new Map();\n }\n if (NewBokeh.version !== Bokeh.version) {\n Bokeh.versions.set(NewBokeh.version, NewBokeh)\n }\n root.Bokeh = Bokeh;\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n }\n root._bokeh_is_initializing = false\n }\n\n function load_or_wait() {\n // Implement a backoff loop that tries to ensure we do not load multiple\n // versions of Bokeh and its dependencies at the same time.\n // In recent versions we use the root._bokeh_is_initializing flag\n // to determine whether there is an ongoing attempt to initialize\n // bokeh, however for backward compatibility we also try to ensure\n // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n // before older versions are fully initialized.\n if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n // If the timeout and bokeh was not successfully loaded we reset\n // everything and try loading again\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_is_initializing = false;\n root._bokeh_onload_callbacks = undefined;\n root._bokeh_is_loading = 0\n console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n load_or_wait();\n } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n setTimeout(load_or_wait, 100);\n } else {\n root._bokeh_is_initializing = true\n root._bokeh_onload_callbacks = []\n const bokeh_loaded = root.Bokeh != null && (root.Bokeh.version === py_version || (root.Bokeh.versions !== undefined && root.Bokeh.versions.has(py_version)));\n if (!reloading && !bokeh_loaded) {\n if (root.Bokeh) {\n root.Bokeh = undefined;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n }\n load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n }\n // Give older versions of the autoload script a head-start to ensure\n // they initialize before we start loading newer version.\n setTimeout(load_or_wait, 100)\n}(window));", + "application/vnd.holoviews_load.v0+json": "" }, "metadata": {}, "output_type": "display_data" }, { "data": { - "application/javascript": [ - "\n", - "if ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n", - " window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n", - "}\n", - "\n", - "\n", - " function JupyterCommManager() {\n", - " }\n", - "\n", - " JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n", - " if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n", - " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n", - " comm_manager.register_target(comm_id, function(comm) {\n", - " comm.on_msg(msg_handler);\n", - " });\n", - " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n", - " window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n", - " comm.onMsg = msg_handler;\n", - " });\n", - " } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n", - " google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n", - " var messages = comm.messages[Symbol.asyncIterator]();\n", - " function processIteratorResult(result) {\n", - " var message = result.value;\n", - " var content = {data: message.data, comm_id};\n", - " var buffers = []\n", - " for (var buffer of message.buffers || []) {\n", - " buffers.push(new DataView(buffer))\n", - " }\n", - " var metadata = message.metadata || {};\n", - " var msg = {content, buffers, metadata}\n", - " msg_handler(msg);\n", - " return messages.next().then(processIteratorResult);\n", - " }\n", - " return messages.next().then(processIteratorResult);\n", - " })\n", - " }\n", - " }\n", - "\n", - " JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n", - " if (comm_id in window.PyViz.comms) {\n", - " return window.PyViz.comms[comm_id];\n", - " } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n", - " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n", - " var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n", - " if (msg_handler) {\n", - " comm.on_msg(msg_handler);\n", - " }\n", - " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n", - " var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n", - " let retries = 0;\n", - " const open = () => {\n", - " if (comm.active) {\n", - " comm.open();\n", - " } else if (retries > 3) {\n", - " console.warn('Comm target never activated')\n", - " } else {\n", - " retries += 1\n", - " setTimeout(open, 500)\n", - " }\n", - " }\n", - " if (comm.active) {\n", - " comm.open();\n", - " } else {\n", - " setTimeout(open, 500)\n", - " }\n", - " if (msg_handler) {\n", - " comm.onMsg = msg_handler;\n", - " }\n", - " } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n", - " var comm_promise = google.colab.kernel.comms.open(comm_id)\n", - " comm_promise.then((comm) => {\n", - " window.PyViz.comms[comm_id] = comm;\n", - " if (msg_handler) {\n", - " var messages = comm.messages[Symbol.asyncIterator]();\n", - " function processIteratorResult(result) {\n", - " var message = result.value;\n", - " var content = {data: message.data};\n", - " var metadata = message.metadata || {comm_id};\n", - " var msg = {content, metadata}\n", - " msg_handler(msg);\n", - " return messages.next().then(processIteratorResult);\n", - " }\n", - " return messages.next().then(processIteratorResult);\n", - " }\n", - " })\n", - " var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n", - " return comm_promise.then((comm) => {\n", - " comm.send(data, metadata, buffers, disposeOnDone);\n", - " });\n", - " };\n", - " var comm = {\n", - " send: sendClosure\n", - " };\n", - " }\n", - " window.PyViz.comms[comm_id] = comm;\n", - " return comm;\n", - " }\n", - " window.PyViz.comm_manager = new JupyterCommManager();\n", - " \n", - "\n", - "\n", - "var JS_MIME_TYPE = 'application/javascript';\n", - "var HTML_MIME_TYPE = 'text/html';\n", - "var EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\n", - "var CLASS_NAME = 'output';\n", - "\n", - "/**\n", - " * Render data to the DOM node\n", - " */\n", - "function render(props, node) {\n", - " var div = document.createElement(\"div\");\n", - " var script = document.createElement(\"script\");\n", - " node.appendChild(div);\n", - " node.appendChild(script);\n", - "}\n", - "\n", - "/**\n", - " * Handle when a new output is added\n", - " */\n", - "function handle_add_output(event, handle) {\n", - " var output_area = handle.output_area;\n", - " var output = handle.output;\n", - " if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", - " return\n", - " }\n", - " var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", - " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", - " if (id !== undefined) {\n", - " var nchildren = toinsert.length;\n", - " var html_node = toinsert[nchildren-1].children[0];\n", - " html_node.innerHTML = output.data[HTML_MIME_TYPE];\n", - " var scripts = [];\n", - " var nodelist = html_node.querySelectorAll(\"script\");\n", - " for (var i in nodelist) {\n", - " if (nodelist.hasOwnProperty(i)) {\n", - " scripts.push(nodelist[i])\n", - " }\n", - " }\n", - "\n", - " scripts.forEach( function (oldScript) {\n", - " var newScript = document.createElement(\"script\");\n", - " var attrs = [];\n", - " var nodemap = oldScript.attributes;\n", - " for (var j in nodemap) {\n", - " if (nodemap.hasOwnProperty(j)) {\n", - " attrs.push(nodemap[j])\n", - " }\n", - " }\n", - " attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n", - " newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n", - " oldScript.parentNode.replaceChild(newScript, oldScript);\n", - " });\n", - " if (JS_MIME_TYPE in output.data) {\n", - " toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n", - " }\n", - " output_area._hv_plot_id = id;\n", - " if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n", - " window.PyViz.plot_index[id] = Bokeh.index[id];\n", - " } else {\n", - " window.PyViz.plot_index[id] = null;\n", - " }\n", - " } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", - " var bk_div = document.createElement(\"div\");\n", - " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", - " var script_attrs = bk_div.children[0].attributes;\n", - " for (var i = 0; i < script_attrs.length; i++) {\n", - " toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n", - " }\n", - " // store reference to server id on output_area\n", - " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", - " }\n", - "}\n", - "\n", - "/**\n", - " * Handle when an output is cleared or removed\n", - " */\n", - "function handle_clear_output(event, handle) {\n", - " var id = handle.cell.output_area._hv_plot_id;\n", - " var server_id = handle.cell.output_area._bokeh_server_id;\n", - " if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n", - " var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n", - " if (server_id !== null) {\n", - " comm.send({event_type: 'server_delete', 'id': server_id});\n", - " return;\n", - " } else if (comm !== null) {\n", - " comm.send({event_type: 'delete', 'id': id});\n", - " }\n", - " delete PyViz.plot_index[id];\n", - " if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n", - " var doc = window.Bokeh.index[id].model.document\n", - " doc.clear();\n", - " const i = window.Bokeh.documents.indexOf(doc);\n", - " if (i > -1) {\n", - " window.Bokeh.documents.splice(i, 1);\n", - " }\n", - " }\n", - "}\n", - "\n", - "/**\n", - " * Handle kernel restart event\n", - " */\n", - "function handle_kernel_cleanup(event, handle) {\n", - " delete PyViz.comms[\"hv-extension-comm\"];\n", - " window.PyViz.plot_index = {}\n", - "}\n", - "\n", - "/**\n", - " * Handle update_display_data messages\n", - " */\n", - "function handle_update_output(event, handle) {\n", - " handle_clear_output(event, {cell: {output_area: handle.output_area}})\n", - " handle_add_output(event, handle)\n", - "}\n", - "\n", - "function register_renderer(events, OutputArea) {\n", - " function append_mime(data, metadata, element) {\n", - " // create a DOM node to render to\n", - " var toinsert = this.create_output_subarea(\n", - " metadata,\n", - " CLASS_NAME,\n", - " EXEC_MIME_TYPE\n", - " );\n", - " this.keyboard_manager.register_events(toinsert);\n", - " // Render to node\n", - " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", - " render(props, toinsert[0]);\n", - " element.append(toinsert);\n", - " return toinsert\n", - " }\n", - "\n", - " events.on('output_added.OutputArea', handle_add_output);\n", - " events.on('output_updated.OutputArea', handle_update_output);\n", - " events.on('clear_output.CodeCell', handle_clear_output);\n", - " events.on('delete.Cell', handle_clear_output);\n", - " events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n", - "\n", - " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", - " safe: true,\n", - " index: 0\n", - " });\n", - "}\n", - "\n", - "if (window.Jupyter !== undefined) {\n", - " try {\n", - " var events = require('base/js/events');\n", - " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", - " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", - " register_renderer(events, OutputArea);\n", - " }\n", - " } catch(err) {\n", - " }\n", - "}\n" - ], - "application/vnd.holoviews_load.v0+json": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n let retries = 0;\n const open = () => {\n if (comm.active) {\n comm.open();\n } else if (retries > 3) {\n console.warn('Comm target never activated')\n } else {\n retries += 1\n setTimeout(open, 500)\n }\n }\n if (comm.active) {\n comm.open();\n } else {\n setTimeout(open, 500)\n }\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n })\n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n" + "application/javascript": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n let retries = 0;\n const open = () => {\n if (comm.active) {\n comm.open();\n } else if (retries > 3) {\n console.warn('Comm target never activated')\n } else {\n retries += 1\n setTimeout(open, 500)\n }\n }\n if (comm.active) {\n comm.open();\n } else {\n setTimeout(open, 500)\n }\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n })\n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n", + "application/vnd.holoviews_load.v0+json": "" }, "metadata": {}, "output_type": "display_data" @@ -583,12 +82,12 @@ "data": { "application/vnd.holoviews_exec.v0+json": "", "text/html": [ - "
\n", - "
\n", + "
\n", + "
\n", "
\n", "" + ], + "text/plain": [ + ":Image [x,y] (x_y psi)" + ] + }, + "execution_count": 34, + "metadata": { + "application/vnd.holoviews_exec.v0+json": { + "id": "f8248ec6-62b8-4594-a002-0b841d96ac54" + } + }, + "output_type": "execute_result" + } + ], + "source": [ + "# Display the global field\n", + "uxds[\"psi\"].plot(cmap=\"inferno\", periodic_elements=\"split\", title=\"Global Field\")" + ] + }, + { + "cell_type": "markdown", + "id": "0de05a0f", + "metadata": {}, + "source": [ + "### Step 2.2: Compute the default zonal mean\n", + "\n", + "Calling `.zonal_mean()` with no arguments samples every 10° between -90° and 90° and returns one value per latitude line.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "d342f8f449543994", + "metadata": { + "execution": { + "iopub.execute_input": "2025-09-26T15:41:07.890787Z", + "iopub.status.busy": "2025-09-26T15:41:07.890560Z", + "iopub.status.idle": "2025-09-26T15:41:07.996723Z", + "shell.execute_reply": "2025-09-26T15:41:07.996295Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'psi_zonal_mean' (latitudes: 6)> Size: 48B\n",
-       "array([1.10364701, 1.03868616, 1.00588496, 0.99347061, 0.96125331,\n",
+       "array([1.10364701, 1.03897837, 1.00563134, 0.99327248, 0.96134106,\n",
        "       0.89634629])\n",
        "Coordinates:\n",
        "  * latitudes  (latitudes) float64 48B -75.0 -45.0 -15.0 15.0 45.0 75.0\n",
        "Attributes:\n",
        "    zonal_mean:      True\n",
        "    conservative:    True\n",
-       "    lat_band_edges:  [-90. -60. -30.   0.  30.  60.  90.]
" + " lat_band_edges: [-90. -60. -30. 0. 30. 60. 90.]
" ], "text/plain": [ " Size: 48B\n", - "array([1.10364701, 1.03868616, 1.00588496, 0.99347061, 0.96125331,\n", + "array([1.10364701, 1.03897837, 1.00563134, 0.99327248, 0.96134106,\n", " 0.89634629])\n", "Coordinates:\n", " * latitudes (latitudes) float64 48B -75.0 -45.0 -15.0 15.0 45.0 75.0\n", @@ -2483,7 +1588,7 @@ " lat_band_edges: [-90. -60. -30. 0. 30. 60. 90.]" ] }, - "execution_count": 7, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -2507,7 +1612,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 41, "id": "conservation_test", "metadata": { "execution": { @@ -2526,14 +1631,6 @@ "Conservative full sphere: 1.000000001829\n", "Conservation error: 2.96e-10\n" ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/_f/dc3kjt3n3ms9ntb5fcj5mplm0000gq/T/ipykernel_18893/1814533177.py:3: DeprecationWarning: zonal_mean returns an xarray.DataArray (no grid topology). Returning UxDataArray is deprecated and will be removed.\n", - " full_sphere_conservative = uxds[\"psi\"].zonal_mean(lat=[-90, 90], conservative=True)\n" - ] } ], "source": [ @@ -2562,7 +1659,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 42, "id": "signature_demo", "metadata": { "execution": { @@ -2578,23 +1675,13 @@ "output_type": "stream", "text": [ "Non-conservative with lat=(-90, 90, 30):\n", - "Sample points: [-90 -60 -30 0 30 60 90]\n", + "Sample points: [-90. -60. -30. 0. 30. 60. 90.]\n", "Count: 7 points\n", "\n", "Conservative with lat=(-90, 90, 30):\n", "Band centers: [-75. -45. -15. 15. 45. 75.]\n", "Count: 6 bands\n" ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/_f/dc3kjt3n3ms9ntb5fcj5mplm0000gq/T/ipykernel_18893/162242150.py:5: DeprecationWarning: zonal_mean returns an xarray.DataArray (no grid topology). Returning UxDataArray is deprecated and will be removed.\n", - " non_cons_lines = uxds[\"psi\"].zonal_mean(lat=lat_tuple)\n", - "/var/folders/_f/dc3kjt3n3ms9ntb5fcj5mplm0000gq/T/ipykernel_18893/162242150.py:11: DeprecationWarning: zonal_mean returns an xarray.DataArray (no grid topology). Returning UxDataArray is deprecated and will be removed.\n", - " cons_bands = uxds[\"psi\"].zonal_mean(lat=lat_tuple, conservative=True)\n" - ] } ], "source": [ @@ -2631,7 +1718,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 43, "id": "comparison_plot", "metadata": { "execution": { @@ -2642,17 +1729,9 @@ } }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/_f/dc3kjt3n3ms9ntb5fcj5mplm0000gq/T/ipykernel_18893/523619492.py:3: DeprecationWarning: zonal_mean returns an xarray.DataArray (no grid topology). Returning UxDataArray is deprecated and will be removed.\n", - " non_conservative_comparison = uxds[\"psi\"].zonal_mean(lat=band_centers)\n" - ] - }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA94AAAJOCAYAAABBfN/cAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAwbVJREFUeJzs3QWcVFUbBvBnYenubkmRFBGVkhBJQREQCQnFApGQUCSlEQNJlfhARUBSQQkJAUEkpbu7O3a+33MPd5mZnYVd2N2Jff6/737L3Lk7c+6cmXXee8553yCHw+GAiIiIiIiIiESLONHzsCIiIiIiIiJCCrxFREREREREopECbxEREREREZFopMBbREREREREJBop8BYRERERERGJRgq8RURERERERKKRAm8RERERERGRaKTAW0RERERERCQaKfAWERERERERiUYKvEVEJMJy5syJ5s2be7sZIg+tZ8+eCAoK8nYzfNb48eOt12f//v3ebopP0PtFRKKKAm8RCXh79uzBW2+9hdy5cyNhwoRInjw5nn32WXzxxRe4du2at5vnc1auXGl92Tx//jxiC36x5jZ06NBwA5F//vkH3nL9+nV8/vnnKF26NFKkSGG9j/Ply4f33nsPO3fu9Fq7fNXVq1et9/Cff/4JX8Ag1n6P3W/je80fde7c2Wp/gwYNvN0UERGfFeRwOBzeboSISHSZN28e6tevjwQJEqBp06YoXLgwbt68iRUrVmD69OnW6O2YMWO83UyfMmTIEHTq1An79u2zRrid3bhxA3HixEG8ePEQSOwRrQwZMmDv3r1InDhx6H0Mht544w2sXbsWTz75ZIy37fTp06hWrRrWrVuHmjVronLlykiaNCl27NiBH3/8EcePH7fe0+L6mqVLlw6ffvqpFYA7u337trXx4kVMuXLlCn755ReP9925cwcffvghLl++jDVr1qBo0aLwJvv97unz7wm/RmbPnh3BwcE4ceKEtSVLlgyBwhvvFxEJTMHeboCISHThF8eGDRsiR44cWLx4MTJlyhR637vvvovdu3dbgbm/4pf5JEmSxOhz8gJGoCpWrBg2bNiAUaNGWYGQr+DFofXr12PatGl4+eWXXe7r06cPunfvDn8VEhJiXTSIyaCGASK3mMTP6euvv+7xvo8//hhnz561Zlt4O+h+GJxVcPjwYetv7AsvvIAZM2agWbNmMdoGBsZ8L8WPHz8g3i8iEpg01VxEAtagQYOsUaRvv/3WJei2PfbYY2jXrp3LlzcGMnny5LECTI72dOvWzRrldcb9HHnkqPlTTz1lBQ2cxj5x4kSX427duoVevXohb9681jFp0qTBc889hz/++MPluO3bt+OVV15B6tSpreM4qjp79myP052XLl2Kd955B+nTp0fWrFmtYMze72706NHWfVu2bLFub9q0yQri7Cn3GTNmRIsWLXDmzJnQ3+HoIEe7KVeuXKFTYO31ns5rvDn1mvdNmDAhzHMvWLDAum/u3Lmh+44cOWI9H0eV+fo+/vjj+O677/AgnKVQsWLFMPv5RTtLlizWa2fjCHDJkiWtETcuKXjiiSesJQURweUHzz//vPW+icgSBAYaZcuWtYKqlClTok6dOti2bZvH9aG8yMPXjcdxqjhHFDkd+kH+/vtv6+JQy5YtwwTdxNeRMxSis118v/J9y2M40p4/f37rc+GMnxGOLvMzxTZly5bNmn7s/tnhc3J6/OTJk63+57Fz5syx3vt8bncXL1603qsdO3a0bjNI79Gjh9XHbC/Pkee6ZMmS0N/he5Wj3cTPn/0etke+3dfsRub9xX3Dhw+32s528b3MZSznzp3Dw1i0aBH69++P6tWro3379i73nTx50up3Pgefi0G5+2fNnsLO9wBn7th/u0qVKmXN0HAWkc//w2BfFipUyHoNORuDt20c/WbQyn5wxxkbbPvXX38duo/LWz744APr/cPz4Ptp4MCB1uvu6ZzZF/Y5b926NULvDxvPu0mTJtbfCb63ebFg48aNYab8e1rjbb+PZ86cab1/7L9n8+fP93hhgn/T+Zqzrfy7rHXjIrEUp5qLiASiLFmyOHLnzh3h45s1a8alN45XXnnFMWLECEfTpk2t2y+99JLLcTly5HDkz5/fkSFDBke3bt0cX3/9taNEiRKOoKAgx5YtW0KP433c17p1a8fYsWMdQ4cOdTRq1MgxYMCA0GN4fIoUKRyFChVyDBw40HqscuXKWb83Y8aM0OO+//57qy08rnz58o6vvvrKepyrV686kiZN6njnnXfCnE/FihUdjz/+eOjtIUOGOMqWLevo3bu3Y8yYMY527do5EiVK5HjqqaccISEh1jEbN2602sjn+vzzzx2TJk2ytsuXL4eeO18nG1/f6tWrh3nuN954w5Eq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7axUqZJp25VMnz5dHn/8cQkPD3fbPmzYMMmfP79ERERImzZt5Pz586ke++GHH5oh6vrY0qVLy7hx49z2r1692gxP1/3333+/6enX171p0ybXedP73333nVSoUEHCwsLMhYCkpCQZOnSoFC9eXLJlyyblypWTL7/80u25f/31V6lbt645H9rOFi1ayLFjx1z79XiNlz4+Ojpaatasac6hU/369c1rBwDgZpB4AwCQgYKDg+W9996TrVu3mmHKixcvNkO01UMPPWSS68jISDl06JC5aQKc1rBzNXnyZHOM8/616Nmzpyxbtkzmzp0rP/zwg0laN2zY4HZM586dZc2aNSah3LJlizRt2lTq1KkjO3fuTPd5V6xYYZLi5GbMmGEuHLz99tvy888/m0Q/ZVI9bdo0GTBggAwZMkR+++03c+zrr79uzo2Ki4szya0mv9rOwYMHS+/evdOdc62Jvj5P2bJlTdI9depUmTBhgjnfXbt2lebNm5vXr06dOiWPPfaY3HvvvaZ9sbGx8tdff8kzzzxj9uu5fe655+TFF180z6nnqnHjxqZH3alixYry559/yp49e645BgAApGIBAIBr1qpVK6tBgwbXfPzMmTOt6Oho1/3JkydbUVFRqY679dZbrXfffdd1Xz+iZ8+efdXv3aVLF6t69erm6/j4eCtr1qzWjBkzXPuPHz9uZcuWzRyn9u7da4WEhFgHDhxwe54aNWpYffv2Tfd1aJunTp3qtq1y5cpWx44d3bZVqlTJKleunOt+yZIlrc8++8ztmMGDB5vHqvHjx5vzc+7cOdf+Dz74wLz+jRs3mvtLliwx9+fMmeM65vz581b27Nmt1atXuz13mzZtrOeee871fWrVquW2f//+/ea5duzYYa1fv958vWfPnnRf9+nTp80xS5cuTfcYAACuJkvqVBwAANyohQsXmp7Y7du3m95cnYusw6/Pnj3r8TncOgc7ISHBDB13ypMnj5QqVcp1/5dffjFVye+4445Uw891qHV6zp07l2qYufYSt2/f3m1b5cqVZcmSJeZrHbKtbdIh6G3btnUdo+ckKirKfL1jxw7Te538ubWXOS3Je9z/+OMPc051+Hty+vq1h1tt3rzZtEWHmaek7apVq5bUqFHD9LbrXG69//TTT0vu3Lldx+kQdKXfCwCAG0XiDQBABtHhyE8++aR06NDBDK3WpFfnImviqQnhzSbeOow9+TBolZiYeF3PofPNtSr5+vXrU1UnTytBTV5o7OTJk9f9vdQHH3zgdjFA3UhldJ2PnvK558+fb+aqJ6dzwJ3H6DD2d955J9Vz6bB4bcOCBQvMHHMdlj927Fjp16+f/Pjjj2beuDpx4oSr+B0AADeKxBsAgAyiyawW/NKCZpokO+dBJ5c1a9YrroPtFBoamuo4Tf60WFhyWoBMj1UlS5Y0X2viWLRoUbNNk+Xff/9dqlevbu5rb7A+75EjR6Rq1arX/Nr0cdu2bXPbpgXT9HtpMTentWvXur7WYmYFCxY0y3E1a9YszefV3vhPP/3U9Lg7E+ZrmdNepkwZc/y+fftcry2l++67T2bNmmWK02XJkvafPFq07eGHHzY3nYt+6623yuzZs6Vbt25mv55vPad33XXXVdsEAEB6SLwBALhOWpXcWXHbSYdp33bbbaYHWntOtad11apVpvBXcpoEak/sokWLTBVu7QVPqydcj9NjNCHUBFOHP2uhsBEjRpiCYjqkWxNWTQydQ6u1x1p717XAmrYnX758pgfXeRFA6RBzTYI1WdYLBPrYo0ePmu+lQ77r1auX5mvWodjOgmhOXbp0MZXWdQi4tlMLqWmRsxIlSriOGTRokLzyyitmaLkWcNMEWwud6QUBTW6ff/5500Zdw1yLp2kiPXLkSFdSnB6toq6F6bSgml7sqFKliomLnnMtXteqVSvp1KmT6W3XAmpa4E5HIOgQdS0qp5XWtR36unWIuZ4rvYig50IvKCQvKqcXKJxDzgEAuCFXnQUOAADcCpzpx2fKmxb1UqNHj7ZuueUWU9Csdu3apiCZ7j958qTrOdq3b28Kiun2gQMHpllc7euvv7Zuu+02K0uWLGaf04ABA6z8+fObYmddu3a1Onfu7Cqu5iyw1rx5c1N4TI8bPny42e8srqYSEhLM8xQrVswKDQ017W3UqJG1ZcuWdF+3FmkLDw+3tm/f7rZ9yJAhVt68ea2cOXOac9OrVy+34mpq2rRpVvny5U3ht9y5c1vVqlWzvvrqK9f+VatWWWXLljX7K1SoYIqx6blxfi9ncbXk51AlJSVZY8aMsUqVKmVeR0xMjDnny5Ytcx3z+++/m9eWK1cuE5PSpUtbr776qnnstm3bzPH6uLCwMOuOO+6wxo4d6/Y99Lk///zzdM8LAADXIkj/ubGUHQAABBLtSdeCcRMnTvTo99Gec+d6577sadZ1w7t3726WXEtvqDoAANeCdbwBAMA10SHhOgdah3ZnJB06r0Xodu/eLXPmzDHreOta274e3q1V2XUtdZJuAMDNoscbAAD41PDhw2XcuHFy+PBhU228YcOGpiq8p5dfAwDAW0i8AQAAAADwIIaaAwAAAADgQSTeAAAAAAB4EIk3AAAAAAAeROINAAAAAIAHkXgDAAAAAOBBJN4AAAAAAHgQiTcAAAAAAB5E4g0AAAAAgAeReAMAAAAAIJ7z/1hTP5sDg1L+AAAAAElFTkSuQmCC", + "image/png": "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l5QOQFKZZcvAySl+K1c6OcHSpfDKK0keloiIiMgzy8kJ4tsD2K0bDBliTg18VEeKxQK+vtC1K8QxNPlJTZ48mcqVK1OhQgVGjhxJyZIliYqKYt26dXz99dccOnSI2rVrExQURIcOHZgwYQJRUVH06NGDatWqxbkwWFx+//131q9fT506dciUKRN//fUXly9fpmjRooC5CFivXr3w8fGhfv36REREsHPnTq5du0bfvn0f+dpVq1YlW7ZsdOjQgbx589oNny5YsCBnzpxh3rx5lC9fnpUrV7J06VK75wcGBnLy5El2795Nrly58PLyinMbsfTp09OsWTOGDBnCoUOHaN++ve1coUKF6NChAx07dmT8+PGUKVOGy5cvs379ekqWLEmjRo3ijL1evXqxFpAD8PDwoFOnTowbN47Q0FB69epFmzZtbEl8wYIFmT17NuXKlSM0NJQBAwbg6en5yPfpQW+88Qbjx49nwIABdO7cmT179thWdI/xzjvv0KBBAwoVKsS1a9fYuHGjrc3AXG3+3LlzdkP7Uwv1eEvCXL0a7+0isFrhv1UMRURERMQBeHhATOJlscRdJ6Z81qxETboB8uXLx99//02NGjXo168fJUqUoE6dOqxfv56vv/76v8tbWL58ORkzZqRq1arUrl2bfPnyMX/+/Hhfx9vbm82bN9OoUSOKFy/OkCFDGD9+PA0aNADMIc0zZszgu+++IygoiGrVqjFz5sx49XhbLBbat2/Pnj177HqhAV566SX69OlDz549KV26NNu3b2fIkCF2dVq2bEn9+vWpUaMGfn5+/PDDDw+9VocOHdizZw9VqlQhd+7cdue+++47OnbsSL9+/ShcuDDNmjXjzz//jFXvwdc7cOCAbe52jAIFCtCiRQsaNmxI3bp1KVmypN32at988w3Xrl3jueee49VXX6VXr174+/s/9r26X+7cuVm8eDHLly+nXLlyTJ06lY8//tiuTnR0NG+99RZFixalfv36FCpUyC6OH374gbp165InT54EXdsRWIz4rnLwDAkNDcXHx4cbN27g7e2d0uE8FavVSnBwMP7+/jg5JcL3LC1bmr3e8e3xbtYMFi9++uumIYneJvLU1CaOR23ieNQmjkdt4niSs03u3LnDyZMnyZs3b5yLZT3WihXmejzXrt0bzRjzZ8aMZtLdpEmix53cDMMgKioKFxcX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hHciIiIikvYsW2YeDxMaCqdPm6MTH5yJefQo3Lpl/j0qCiIjYcCA2Lu/NmtmHk+jefPmlC5dmmHDhvHNN9/EOv/ZZ59Rq1YthgwZAkChQoU4ePAgn376KZ07d7bVa9iwIT169ADg3Xff5fPPP2fjxo0ULlw4zutOnjwZHx8f5s2bZ9vOqlChQrbz48aN491336Vdu3YAjBkzho0bNzJhwgQmT55sq9e/f39b7+2IESMoXrw4x48fp0iRIpw5c4aWLVsS9F8nU758+WzPmzRpEmXKlOHjjz+2lX377bcEBARw9OhRWywFCxZk7Nixtjr58+cnffr0LF26lFdffRWAuXPn8tJLL9mS2ZYtW9rd67fffoufnx8HDx6kRIkS+P03WT9z5swP3fEpY8aMNGjQgLlz51KrVi0AFi1aRJYsWahRo4btft977z06depku79Ro0YxcOBAhg0bFufrnj59mhw5csR57lHu3r3LlClTyJ8/PwA9e/Zk5MiRtvPDhg1j/PjxtGjRAjB79WO+DOjUqRNnzpyhYMGCvPjii1gsFvLkyRPrGjly5OD06dMJji2hlHhLgvj5mYtsPG6+T2gofPON+Yv97l1znlAsmTKZi6o1bQr3favGrVvQuDHMn//0v9VFREREniG3bj164bTwcDOpjlkY934xyXbM36OizGmDd+/GvkZiGDNmDDVr1rTrwYxx6NAhmjZtaldWuXJlJkyYQHR0NM7OzgCULFnSdt5isZAtWzaC/1vIt0GDBraezDx58nDgwAF2795NlSpV4txDOjQ0lPPnz1O5cuVY192zZ49d2f3XzZ49OwDBwcEUKVKEXr168eabb7J27Vpq165Ny5YtbfX37NnDxo0bbT3g9ztx4oQt8S5btqzdORcXF9q0acOcOXN49dVXCQ8PZ/ny5XZDpI8dO8bQoUP5/fffuXLliq2n+8yZMwla76pDhw50796dr776Cnd3d+bMmUO7du1sW2ft2bOHbdu22fVwR0dHc+fOHW7dukW6mP2F73P79u0E7XkdI126dLakG8z3OqZ9w8PDOXHiBN26daN79+62OlFRUbYF2jp37kydOnUoXLgw9evXp3HjxtStW9fuGp6entxKrA/1IyjxlgTz84vf6paffw6TJ0OePPDA7457vLxg5Upo0wZ++uleeWQktGoFM2fCK68kRtgiIiIiaV66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Ow5549mNYLFY+Oeff546qJQWGhqKj48PN27cwNvbO6XDeSpWq5Xg4GD8/f1xSuahoxI3tYnjeWbb5O5d+OEHc8Pto0cfXi8wEN57z1wFzd09WUJ7VJtERZmd8+vXw++/m4/v5+QEZctC+/bm0HUwk+6XX47fnPHMmc0t0JV823tmf04cmNrE8ahNHI/axPGkpTZJSN4Yrx7vB+d1i4hIGuDqau7d1aEDLFoEH35o350c49QpeOMNGDUKBg40e8zj2jM8mbi4QPny5nHzprkz2vr19747sFrhzz/NBdtihIaaSbe7+6NDv33brBcaqsRbREREEk/q/opBRESenrMztG0Le/bAkiXmimVxOXcOevc2x3R/+imEhSVvnHHw8jIXYx8/Hr76Clq1MldK9/c3p6rfLzzcDNnVFdKnj/tIwe8TREREJA17orVgz549y4oVKzhz5gyRkZF25z777LNECUxERJKZkxM0b26uar56tdnD/dtvsetdumT2fH/yCfTpA2+//fA9w5NRQAB06gSvvmoOLX9wZ7QbN8zR9Zcvm/O4s2SBjBmTfQF3EREReQYlOPFev349L730Evny5ePw4cOUKFGCU6dOYRgGzz2sl0RERFIPi8XsRm7QADZuNBPwTZti1wsJgSFDYNw4M/l+5x1zgnQKc3KCrFnty65fN4eRu7iYC7TduGEeLi7mkPJs2VJs/TgRERF5BiT4e/5BgwbRv39/9u3bh4eHB4sXL+bff/+lWrVqtG7dOiliFBGRlGCxQM2aZvK9ZQvUqxd3vRs3zPnhefKYPeFx7RWewnx9IXduM8G+f324qCi4cMEcZX/6NDwwiEtEREQkUSQ48T506BAdO3YEwMXFhdu3b5MhQwZGjhzJmDFjEj1AERFxAC++CGvWmMuIv/RS3HXCw82533nzmr3f584la4iP4+pq9oSXKgVFi5pDzWOGo1ut5vcFhw/HXiVdRERE5GklOPFOnz69bV539uzZOXHihO3clStXEi8yERFxPBUqmJtm79oFrVvHnkgN5pjuiRMhXz5zNfS49gpPYV5eZnilS0P27Ob6cjHlLk+0+omIiIjIwyU48X7++efZunUrAA0bNqRfv3589NFHdO3aleeffz7RAxQREQdUujQsWGBuP/bKK3GvUBYZCVOnmptpd+0Kx44le5iP4+pqLspWqhTkzBl7brhh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h0KFLr+PjzengfXpYwakp02DI0dcEIjNZo4W+/lnWL/eHGB+rfWcc+aYQ83r1IF583QUmYhkO+kuvE+dOkW5cuVStZcrV45Tp05lSFAiIiIicmMeftisBR82DKKiICjo8rWYGJg+HV58EaZMcWFQVavCV1+Zo8g6drz2NuzLlpkHqFzZ/IQgOdmFQYqIZJ50F96VK1dmzJgxqdrHjBlD5cqVMyQoEREREblxNhuULw+dO8PUqdCzJ9xxh/M086v3QLPbzStTlSoFH30E+/ebY8audRj5n3+axexlysDo0XDhQiYHJiKSudK9xnvYsGE8/PDD/PLLL9SoUQOAVatW8ffffzNv3rwMD1BEREREbpyfnzkP/N574eRJs+x67drUe5+tXQvjxsF995n14LfckolBRUTA22+bdd2ffGKOIjt0KHW//fvhlVfMmeGvvAKdOkFoaCYGJiKSOdI94l2nTh127txJkyZNOHPmDGfOnKFp06bs2LGD2rVrZ0aMIiIiIpIBQkPhiSfMNHSfq4ZffvnFFOYzZkCHDubEr3nz4OzZTAwoTx7zQXv2wOefQxrLGQET2IAB5iiyLl3gwIFMDEpEJOOle8QboHDhwtq9XERERCSbsCyzGbm3N6SkmLadO81rwgSIjDSj4FWrpi7YM4SfH7RpY85B+/57sxP66tWp+124AB98YKart2hhzg+//fZMCEhEJGNd94h3vXr1mDVr1jWvnzhxglKlSmVIUCIiIiLiOjab2fV88mSz8/mV/6RLToZff4U334TnnoPffsvEQLy8zNFiK1fC0qXQsGHa/ZKTzeL1ihWhUSNYsSITgxIRuXnXXXgvXryY5s2bM2DAgDSvp6SksH///gwLTERERERcKyQEHnvMDCp/+KH5fUjI5euxsVCggAsCsdnMovQffzSHkbdsaYbj0/LDD1C7tjmsfO5cF+wQJyKSfula4z127FhGjRpFkyZNOH/+fGbFJCIiIiJuVrKkGf2eNAn694eaNc1O6cWKOfebPRveessMUiclZUIglSrBF1/AX3/Byy9DYGDa/X79FR591IyCT56cScGIiNyYdBXejz32GKtXr2bLli3cfffd7NmzJ7PiEhEREREP4ONjdkDv3dssvb6SZcGCBWZH9CFDzBLtcePMcd2WlcGBlChhhuH37zc/CcifP+1+W7eaOfGlS8OoUXDu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RETEHUJDzW7ntWs7t587Z44hmzfPqXnsWDh1Co4fh169YPVqF8YqN0WFt4iIiIiIiLsEB5tzvqOinNvj480i72+/dTR17Aj/+9/ly4MHwzffgGW5Lly5MSq8RURERERE3CkoCL77Dpo2dW5PSoKnnoJJkwDInx+GDoV7773cZepUeO89SEx0XbiSfiq8RURERERE3M3fH77+Gp591rndboc2bWDMGAD8/KBHD2jV6nKXZcugd28zDV08kwpvERERERERT+DjY0a3O3RIfe3ll2HIEABsNmjWDPr1g4AAc3nXLrPp2q5drgtXrp8KbxEREREREU/h5QUffWR2T7ta377Qp49jUffdd8OwYRAebi6fOgX797swVrluKrxFREREREQ8ic1mFnO//Xbqa0OHwiuvmCnoQMmS8P77UKGC2Yutfn3XhirXx8fdAYiIiIiIiMhVbDYzlzx3bujSxfnamDHmyLEJE8DHh5AQU6N7e6e+TUpK2u3iWhrxFhERERER8VSvvgqffWamoF9p0iRo0cKxnbmvb+ouy5dDt27m3G9xLxXeIiIiIiIinuz55+Grr8zma1eaMcPML794MdWX7NoFo0bBnj2m+N6+3SWRyjWo8BYREREREfF0zZvDnDnm2LEr/fQTPPQQnD3r1BwQAKGh5vdnzpg92RYtckmkkgYV3iIiIiIiIlnBww+bQjtXLuf2pUvNrmpXHORdtCiMGAGVKpn3yclmE7ZJkxz7sokLqfAWERERERHJKu67D375BfLmdW5fuxbq1oVjxxxNefLAoEHQsOHlbjNnmo3YLlxwSbTyDxXeIiIiIiIiWcndd8OSJZcP8L7kzz+hdm04cMDR5OMDHTqY16XN1377DXr2hKNHXRdyTqfjxERERERERLKaypXNtuX168PBg5fbd+0yxXd0NJQp42hu2BCKFDHHgJ87Z2rz3r3NiWVX74Z+teDg1DW+pI8KbxERERERkayobFlTfNerZ7Yvv+TAAVN8L1wIt9/uaK5c2az7fvNN02XHDnjyyf/+mNBQ+PJLFd83Q1PNRUREREREsqoSJUzxXaGCc/vRo1CnDvz+u1Nz4cKm+H7pJUhIMJuk58177Ze/P5w8CXFxLniWbEyFt4iIiIiISFZWuLDZ2fyOO5zbT52C++83hfkVcuW6PBAeGGje58oFsbGm0L70Plcuc11unkcU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LC8vL+vo0aOOPmPHjrWCg4OthIQEl8ec3SUlJVlFihSxPv3002v2UU7cY968eVa5cuWsLVu2WIC1YcMGx7WPP/7Yypcvn9P3/7XXXrPKli3rhkhzpmHDhlklS5Z0vFdOXO+uu+6yOnXq5HifkpJiFS5c2BoyZIgbo8qZYmJiLMBaunSpZVmWdebMGcvX19f69ttvHX22bdtmAdaqVavcFWaOcPbsWet///uftXDhQqtOnTrWq6++almWcuIur732mlWrVq1rXrfb7VbBggWt4cOHO9rOnDlj+fv7W1999ZUrQsxxHn74Yev55593amvatKnVsmVLy7JyXk404p1NhYaGUrZsWaZMmcL58+dJTk5m/PjxREREUK1aNQBWrVpFxYoVKVCggOProqKiiIuLY8uWLe4KPdtav349hw4dwsvLi6pVq1KoUCEeeughNm/e7OijnLjesWPHaNeuHVOnTiUoKCjV9VWrVnHvvffi5+fnaIuKimLHjh2cPn3alaHmWLGxseTPn9/xXjlxrcTERNatW0f9+vUdbV5eXtSvX59Vq1a5MbKcKTY2FsDxd2LdunUkJSU55adcuXIUK1ZM+clknTp14uGHH3b63oNy4i7ff/891atXp1mzZkRERFC1alUmTJjguL53716OHj3qlJeQkBAiIyOVl0xyzz33EB0dzc6dOwHYuHEjK1as4KGHHgJyXk5UeGdTNpuNX375hQ0bNpAnTx4CAgIYOXIk8+fPd0y5OXr0qFOBBzjeX5qOLhlnz549AAwcOJDXX3+dH374gXz58lG3bl1OnToFKCeuZlkWzz33HO3bt6d69epp9lFO3Ouvv/5i9OjRvPTSS4425cS1Tpw4QUpKSprfc32/Xctut9OlSxdq1qzJ7bffDpg/835+fuTNm9epr/KTuaZPn8769esZMmRIqmvKiXvs2bOHsWPH8r///Y+ff/6ZDh068MorrzB58mTg8v8f9N8y1+nduzdPPfUU5cqVw9fXl6pVq9KlSxdatmwJ5LycqPDOYnr37o3NZvvX1/bt27Esi06dOhEREcHy5ctZu3YtjRs3plGjRhw5csTdj5GtXG9O7HY7AP369ePxxx+nWrVqTJw4EZvNxrfffuvmp8herjcno0eP5uzZs/Tp08fdIWd715uTKx06dIgHH3yQZs2a0a5dOzdFLuI5OnXqxObNm5k+fbq7Q8nR/v77b1599VWmTZtGQECAu8ORf9jtdu644w7eeecdqlatyosvvki7du0YN26cu0PLsb755humTZvGl19+yfr165k8eTLvvfee44chOY2PuwOQ9OnevTvPPffcv/YpVaoUixYt4ocffuD06dMEBwcD8PHHH7Nw4UImT55M7969KViwYKpdaS/tuFmwYMFMiT87ut6cXPqBR4UKFRzt/v7+lCpVigMHDgAoJxkkPX9PVq1ahb+/v9O16tWr07JlSyZPnkzBggVT7USrnKTf9ebkksOHD3Pfffdxzz33pNo0TTlxrbCwMLy9vdP8nuv77TqdO3fmhx9+YNmyZdxyyy2O9oIFC5KYmMiZM2ecRliVn8yzbt06YmJiuOOOOxxtKSkpLFu2jDFjxvDzzz8rJ25QqFAhp39jAZQvX56ZM2cCl///cOzYMQoVKuToc+zYMapUqeKyOHOSnj17Oka9ASpWrMj+/fsZMmQIrVu3znE5UeGdxYSHhxMeHv6f/S5cuACYdXhX8vLycoy81qhRg8GDBxMTE0NERAQACxcuJDg4ONV/uOTarjcn1apVw9/fnx07dlCrVi0AkpKS2LdvH8WLFweUk4xyvTn58MMPefvttx3vDx8+TFRUFF9//TWRkZGAyUm/fv1ISkrC19cXMDkpW7as006p8u+uNydgRrrvu+8+x6yQq/87ppy4lp+fH9WqVSM6Otpx/KHdbic6OprOnTu7N7gcwLIsXn75ZWbPns2SJUsoWbKk0/Vq1arh6+tLdHQ0jz/+OAA7duzgwIED1KhRwx0hZ3v16tXjzz//dGpr06YN5cqV47XXXqNo0aLKiRvUrFkz1VF7O3fudPwbq2TJkhQsWJDo6GhHURcXF8eaNWvo0KGDq8PNES5cuJDq/+He3t6OWiTH5cTNm7tJJjl+/LgVGhpqNW3a1Prjjz+sHTt2WD169LB8fX2tP/74w7Isy0pOTrZuv/12q0GDBtYff/xhzZ8/3woPD7f69Onj5uizr1dffdUqUqSI9fPPP1vbt2+32rZta0VERFinTp2yLEs5cbe9e/em2tX8zJkzVoECBaxnn33W2rx5szV9+nQrKCjIGj9+vPsCzcYOHjxolSlTxqpXr5518OBB68iRI47XJcqJ602fPt3y9/e3Jk2aZG3dutV68cUXrbx58zqdwCCZo0OHDlZISIi1ZMkSp78PFy5ccPRp3769VaxYMWvRokXW77//btWoUcOqUaOGG6POea7c1dyylBN3WLt2reXj42MNHjzY2rVrlzVt2jQrKCjI+uKLLxx9hg4dauXNm9f67rvvrE2bNlmPPfaYVbJkSevixYtujDz7at26tVWkSBHrhx9+sPbu3WvNmjXLCgsLs3r16uXok5NyosI7G/vtt9+sBg0aWPnz57fy5Mlj3X333da8efOc+uzbt8966KGHrMDAQCssLMzq3r27lZSU5KaIs7/ExESre/fuVkREhJUnTx6rfv361ubNm536KCfuk1bhbVmWtXHjRqtWrVqWv7+/VaRIEWvo0KHuCTAHmDhxogWk+bqScuJ6o0ePtooVK2b5+flZd911l7V69Wp3h5QjXOvvw8SJEx19Ll68aHXs2NHKly+fFRQUZDVp0sTph1WS+a4uvJUT95g7d651++23W/7+/la5cuWsTz75xOm63W633njjDatAgQKWv7+/Va9ePWvHjh1uijb7i4uLs1599VWrWLFiVkBAgFWqVCmrX79+TseB5qSc2CzLstwx0i4iIiIiIiKSE2hXcxEREREREZFMpMJbREREREREJBOp8BYRERERERHJRCq8RURERERERDKRCm8RERERERGRTKTCW0RERERERCQTqfAWERERERERyUQqvEVEREREREQykQpvERERD1CiRAlGjRqVKfeuW7cuXbp0uen7REdHU758eVJSUq7ZZ+DAgVSpUuWmP8sT9O7dm5dfftndYYiISDagwltERCQdnnvuORo3bnzDXz9p0iTy5s2bqv23337jxRdfdLy32WzMmTPnhj8nM/Tq1YvXX38db29vd4fiEj169GDy5Mns2bPH3aGIiEgWp8JbRETEA4SHhxMUFOTuMK5pxYoV7N69m8cff9zdoWBZFsnJyZn+OWFhYURFRTF27NhM/ywREcneVHiLiIhkoJEjR1KxYkVy5cpF0aJF6dixI+fOnQNgyZIltGnThtjYWGw2GzabjYEDBwLOU81LlCgBQJMmTbDZbI73aY22d+nShbp16zrenz9/nlatWpE7d24KFSrEiBEjUsWYkJBAjx49KFKkCLly5SIyMpIlS5b863NNnz6dBx54gICAAKf2oUOHUqBAAfLkyUPbtm2Jj49P9bWffvop5cuXJyAggHLlyvHxxx87XV+5ciVVqlQhICCA6tWrM2fOHGw2G3/88Yfj+2az2fjpp5+oVq0a/v7+rFixArvdzpAhQyhZsiSBgYFUrlyZGTNmON178+bNPPTQQ+TOnZsCBQrw7LPPcuLECcf1GTNmULFiRQIDAwkNDaV+/fqcP3/ecb1Ro0ZMnz79X783IiIi/0WFt4iISAby8vLiww8/ZMuWLUyePJlFixbRq1cvAO655x5GjRpFcHAwR44c4ciRI/To0SPVPX777TcAJk6cyJEjRxzvr0fPnj1ZunQp3333HQsWLGDJkiWsX7/eqU/nzp1ZtWoV06dPZ9OmTTRr1owHH3yQXbt2XfO+y5cvp3r16k5t33zzDQMHDuSdd97h999/p1ChQqmK6mnTptG/f38GDx7Mtm3beOedd3jjjTeYPHkyAHFxcTRq1IiKFSuyfv163nrrLV577bU0Y+jduzdDhw5l27ZtVKpUiSFDhjBlyhTGjRvHli1b6Nq1K8888wxLly4F4MyZM9x///1UrVqV33//nfnz53Ps2DGaN28OwJEjR2jRogXPP/8827ZtY8mSJTRt2hTLshyfedddd3Hw4EH27dt3fQkQERFJiyUiIiLXrXXr1tZjjz123f2//fZbKzQ01PF+4sSJVkhISKp+xYsXt95//33He8CaPXv2f372q6++atWpU8eyLMs6e/as5efnZ33zzTeO6ydPnrQCAwOtV1991bIsy9q/f7/l7e1tHTp0yOk+9erVs/r06XPN5wgJCbGmTJni1FajRg2rY8eOTm2RkZFW5cqVHe9Lly5tffnll0593nrrLatGjRqWZVnW2LFjrdDQUOvixYuO6xMmTLAAa8OGDZZlWdbixYstwJozZ46jT3x8vBUUFGStXLnS6d5t27a1WrRo4ficBg0aOF3/+++/LcDasWOHtW7dOguw9u3bd83njo2NtQBryZIl1+wjIiLyX3zcWfSLiIhkN7/88gtDhgxh+/btxMXFkZycTHx8PBcuXMj0Ndy7d+8mMTGRyMhIR1v+/PkpW7as4/2ff/5JSkoKt956q9PXJiQkEBoaes17X7x4MdU0823bttG+fXuntho1arB48WLATHvfvXs3bdu2pV27do4+ycnJhISEALBjxw4qVarkdO+77rorzRiuHHH/66+/uHDhAg888IBTn8TERKpWrQrAxo0bWbx4Mblz5051r927d9OgQQPq1atHxYoViYqKokGDBjzxxBPky5fP0S8wMBCACxcuXOM7IyIi8t9UeIuIiGSQffv28cgjj9ChQwcGDx5M/vz5WbFiBW3btiUxMfGmC28vLy+nadAASUlJ6brHuXPn8Pb2Zt26dal2J0+rQL0kLCyM06dPp/uzACZMmOD0wwDghnZGz5UrV6p7//jjjxQpUsSpn7+/v6NPo0aNePfdd1Pdq1ChQnh7e7Nw4UJWrlzJggULGD16NP369WPNmjWULFkSgFOnTgFm8zsREZEbpcJbREQkg6xbtw673c6IESPw8jLbqHzzzTdOffz8/P71HOxLfH19U/ULDw9n8+bNTm1//PEHvr6+AJQuXRpfX1/WrFlDsWLFADh9+jQ7d+6kTp06AFStWpWUlBRiYmKoXbv2dT9b1apV2bp1q1Nb+fLlWbNmDa1atXK0rV692vH7AgUKULhwYfbs2UPLli3TvG/ZsmX54osvSEhIcBTM17OmvUKFCvj7+3PgwAHHs13tjjvuYObMmZQoUQIfn7T/yWOz2ahZsyY1a9akf//+FC9enNmzZ9OtWzfAbM7m6+vLbbfd9p8xiYiIXIsKbxERkXSKjY117Lh9SWhoKGXKlCEpKYnRo0fTqFEjfv31V8aNG+fUr0SJEpw7d47o6GgqV65MUFBQmiPhJUqUIDo6mpo1a+Lv70++fPm4//77GT58OFOmTKFGjRp88cUXbN682TG1Onfu3LRt25aePXsSGhpKREQE/fr1c/wQAODWW2+lZcuWtGrVihEjRlC1alWOHz9OdHQ0lSpV4uGHH07zmaOiohwbol3y6quv8txzz1G9enVq1qzJtGnT2LJlC6VKlXL0GTRoEK+88gohISE8+OCDJCQk8Pvvv3P69Gm6devG008/Tb9+/XjxxRfp3bs3Bw4c4L333gNMUXwtefLkoUePHnTt2hW73U6tWrWIjY3l119/JTg4mNatW9OpUycmTJhAixYt6NWrF/nz5+evv/5i+vTpfPrpp/z+++9ER0fToEEDIiIiWLNmDcePH6d8+fKOz1m+fDm1a9d2TDkXERG5Ie5eZC4iIpKVtG7d2gJSvdq2bWtZlmWNHDnSKlSokBUYGGhFRUVZU6ZMsQDr9OnTjnu0b9/eCg0NtQBrwIABlmWl3lzt+++/t8qUKWP5+PhYxYsXd7T379/fKlCggBUSEmJ17drV6ty5s2NzNcsyG6w988wzVlBQkFWgQAFr2LBhVp06dRybq1mWZSUmJlr9+/e3SpQoYfn6+lqFChWymjRpYm3atOmaz33y5EkrICDA2r59u1P74MGDrbCwMCt37txW69atrV69ejltrmZZljVt2jSrSpUqlp+fn5UvXz7r3nvvtWbNmuW4/uuvv1qVKlWy/Pz8rGrVqllffvmlBTg+69Lmald+Dy3Lsux2uzVq1CirbNmylq+vrxUeHm5FRUVZS5cudfTZuXOn1aRJEytv3rxWYGCgVa5cOatLly6W3W63tm7dakVFRVnh4eGWv7+/deutt1qjR492+oyyZctaX3311TW/LyIiItfDZllXLRYTERERSUPPnj2Ji4tj/Pjxmfo506ZNc5x37s6R5p9++onu3buzadOma05VFxERuR46x1tERESuS79+/ShevDh2uz1D7ztlyhRWrFjB3r17mTNnDq+99hrNmzd3+/Tu8+fPM3HiRBXdIiJy0zTiLSIiIm41bNgwPv74Y44ePUqhQoVo3LgxgwcPzvTj10RERFxFhbeIiIiIiIhIJtJUcxEREREREZFMpMJbREREREREJBOp8BYRERERERHJRCq8RURERERERDKRCm8RERERERGRTKTCW0RERERERCQTqfAWERERERERyUQqvEVEREREREQykQpvERERERERkUz0f5NsMJwDS6uyAAAAAElFTkSuQmCC", "text/plain": [ "
" ] @@ -2725,7 +1804,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 44, "id": "difference_analysis", "metadata": { "execution": { @@ -2740,9 +1819,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "Maximum absolute difference: 0.010437\n", - "Mean absolute difference: 0.006088\n", - "Relative difference (max): 1.044%\n" + "Maximum absolute difference: 0.010691\n", + "Mean absolute difference: 0.006063\n", + "Relative difference (max): 1.069%\n" ] } ], @@ -2773,7 +1852,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 52, "id": "cb2255761173d53e", "metadata": { "execution": { @@ -2785,59 +1864,133 @@ }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Global Field:\n" - ] + "data": {}, + "metadata": {}, + "output_type": "display_data" }, { "data": { - "image/png": "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9aWPP3ZHjzpyRJoxwx1lyv7aMgAgl30svD7//HMngGjTpo169uzp3MifeOKJqlmzpt577z1dazMTBdiKFSucadPHjBnjvNdvv/2mm2++WXv37tVzzz3n7GPNsNq3b6927drplVde0a+//up0NC9Tpox69+4d8DQBAMKveZSNEmXNoKwWw36bst+vrA/GVVdJQ4ZISUnSli3pr6leXRoxwu2TAQCRLtc1Fv/884+OP/5453mpUqWcZdOyZUt9//33gU+hpAsuuEBjx451Agd774svvlj33HOPJtpPS/+yoMZqMN588001bNhQV199tfr27athw4blS5oAAOGpWDF3noulS92haL2suVTGoMJs2OD2ycjw3xEARKxcBxZ2Y79mzRrn+UknnaSPrX7435oMqx0oKLt27fKZkG/OnDk655xznKFvvTp06KCVK1dqx44dBZYuAEB4OPFE6Ysv3KChSJGs9/FOrte/P82iACDXTaGs+ZPNsm2jQz3wwAPq3LmzXnrpJR06dKjAagdWrVqlkSNHpjWDMps3b3b6YGRUqVKltG3ZdSxPSUlxHl7eka2s6ZU9wpWdm81LEs7niIJDeUI4lymbtunIkex/h7PgwkaTmjkzVW3aFGjSEKJlCuEhUspUai7OL9eBxV026Pe/rD+D9X9YsGCB0/ehSZMmuTqWBSZPW8+4o1i+fLlTM+K1YcMGp2nUFVdc4fSzyKuhQ4c6nc/9bd261RlON5wLidX62BciOjrXFVeAD8oTwrlMrVyZIOm/a+RXrkxWgwbh+/9GqCtMZQrhIVLK1O7du/MvsPBnnbbtsX79eqeT9Kuvvprj195999264YYbjrqPtz+H2bhxo9q2betM0Of/PpUrV9YWv8av3mXblp0HH3xQAwYM8KmxsBGlKlas6PQhCecvQ1RUlHOe4fxlQMGgPCGcy5SNGJWz/UopMTF8/98IdYWpTCE8REqZSkiwH1cKKLDw2r59u954441cBRb2QdgjJ6ymwoKKZs2aOR25/T/A5s2b6//+7/+cJlneCfymTp2qevXqHXV+DRsy1x7+7PjhXEiMfRki4TxRMChPCNcy1bq1O/qTddT29qnwZ79ftW5taS3o1CEUyxTCRySUqehcnFtI5IIFFTa87XHHHef0q7BmStZvwh5e3bp1czpu23wXS5cu1UcffaQRI0b41EYAAJBb1nHbhpT1DkmblaJF6bwNACERWFjNg3XYnjZtmqpXr64qVaqkPbxKly6tb775xhmxymo1rJnVI488whwWAIA8s3kqJkyQqlXzXR/zb72/DZY4aFBQkgYAhUaUx3qcBICNFHXqqafqSIj/ZGN9LCxIsc444d7HIikpSYmJiWFdfYeCQXlCpJQp+y9u1ixp0ybJftsqXlw6+2x3lm6rzfjuOzEyVCFVWMsUQleklKnkXNwb57iPRZf/mFZ0586dOU8hAAAh2izKP3B44gnpvvvc/hfdu0u//CIdpWsfAIStHAcWFqn81/brr78+EGkCACBk3H23NHmyW1uxfr10yy3SRx9l3x8DABTpgYWNxAQAAHxZC4i335ZsKqcdO6Tx46VOnaQePYKdMgAoWOHbIAwAgAJiw9GOGZO+fMcd0p9/BjNFAFDwCCwAAAiAK66QevZ0n+/ZI117rdupGwAiBYEFAAABYvNdnHCC+3zePGnIkGCnCAAKDoEFAAABUrKk9N577uhRxgKL2bODnSoAKBgEFgAABNCZZ0qPPuo+T011m0QlJwc7VQCQ/wgsAAAIsAcfdCfOM3/95XbmBoBwR2ABAECAWVOod9+VvJPUjhsnffBBsFMFAPmLwAIAgHxQq5Y0enT68m23SWvXBjNFAJC/CCwAAMgn1r+iWzf3+a5dUvfu0pEjwU4VAOQPAgsAAPLRqFFSzZru81mzpKefDnaKACB/EFgAAJCPypRx+1hE//s/7qBB0k8/BTtVABB4BBYAAOSzVq3ckaLM4cNuEymbnRsAwgmBBQAABcBqKk4/3X3+xx/SXXcFO0UAEFgEFgAAFIDYWHdW7uLF3eXXX5cmTgx2qgAgcGICeCwAAHAUdepIL74o9erlLt90kztKlDWPqlLFbTJlc2AAQCiixgIAgALUs6d0+eXu8x07pCuvdIekbdvWnfuCWgwAoYrAAgCAAhQVJXXunPW2DRukrl0JLgCEJgILAAAKkDV9Gjgw620ej/u3f38m0gMQeuhjkZ3Nm6W9e9OXExKksmXdhrBbt2be3xrHmm3bpEOHMg9iXrSoe7zkZN9tcXFS+fJSaqq0ZUvm4yYmug1u//lHSknx3VaypFSihLR/v7Rzp++2mBipYkX3+aZNmY9brpz7117nf1zrWViqlLve3jcjG4i9UiX3uaXX0u1/3Ph49zwz5p+xPLC8sPyxfMouDy1/LZ+zykMbn3H3bt9t9n72vva/cFJS5uNaei3d27dLBw/6brPztPPNKg+tp2WFCtnnoeWv5bO1ZThwwHebfS72+WSVh/Z52ueaXR5aebBykVUeFismlS6ddR7az6CVK2efh1Z+rRxnlYfe8p1dHtpx7fhZ5aGlx16/b5+bT97B+jOWb7tbsu9UduU7qzz0lm9bb9uzK992XO/dmJd9bvb52VTHlq6syredh51PduXb8sH/zs5bvi3//McKDbdrhDcP7XX2+oK+RiQlKdryyj4Db5kKk2vEvNnSzvUl7ANSnFJUTr55eMRTROvWJTqT6bWpHybXCEuXfRftO5lRQV4jUlPTy5Qdl2tEaF8jCsN9RGqqorx5Gs73Ebv98usoCCyyM3asW9C8mjSRunRxP6QxYzLv/+ij7t9PP5XWr/fdZq+z1y9dKn31le+2E06Qund3P+Csjnvvve4XdMoUaeVK320dOkjNm0urV0vjx2f+ct1yS/rQI/4Xv1tvdf9+/720eLHvtpYtpXbt3C/BW2/5brMLxYAB7nMb3sT/AnfDDW4j4fnzpR9+8N126qnSxRe7XyD/c7UvycMPu8+tDYD/F/CKK6SGDaVff3XzIqN69aRrrnG/lFnloQ0eb5+l5f2ff/puu/BC6Ywz3LEf/dseVK/u9qw0WR23b1/3QjR9uvTLL77b2rRxH+vWSe++67vNXmOvNW+/nfk/NevVWaOGNGeO+8jIxqrs1Mm9GPinyc7RO1D+xx9n/o/L8sjyatEiado0320NGrgNve0ClNW52s+rdvH7/HPpr798t9ln2rSpYlatUtSPP7oXJi8rC1YmrPxldVwrS1ampk6Vli3z3XbeeW5P1rVrpQ8+yHwx7tMn/bvq/5+llX37DlgZ9J+JzL4z9t2xi/Ebb2S+4N53n/v8ww8zX8yvu0468URpwQJpxgzfbeF2jbj9dvc/LrtGLFxY4NeIqFdfVbG9exVl52ZlKoyuESV/lZqpjWaqjWpona6T7zXiH5XTSPV1T3F+mFwj7LNdsUL67DPfbQV4jYjyeNLLlP0fyDUipK8RheE+wspUzFlnuekN5/uIFL//Y48iyuPx/6kvsiUnJ6t06dLatXKlSlmkGKa/NKSWK6ekHTuUGBenaGoswvuXhgL4NTI1IUFJf/2lxPh4RVNjERbXiGD/GpmalKRt27apQoUK6WUqTK4Rs2dLHbqW0J7saixURFuVqG+/lc5rFB7XiMJQY5GamppepqixCPlrRGG4j7AytTUlRRVr1XLvpXaG531E8u7dKl2vnnbt2qVS9rkeBYFFdoFFDjIvlNmXISkpSYmJib43gsAxoDwh0MK5TNm9i/3AaR21j/Y/8EUXuT/E2/0F8i6cyxSCI1LKVHIu7o3DNxcAACiE7MfGESPc5xlbDvr74gvpnHOkjRsLLGkAkCcEFgAAFDBrMj9hglStmu96axY9aJDbUsFYd4czz8zc/BoACiMCCwAAghRcWD9n67f5/vvu3zVr3D681g+jZk13P+vHa31hJ08OdooB4OgILAAACGKzKBv4xQaksb+27B2Ead48d0AqY31Nrc9FVgPLAEBhQWABAEAhZAPRWC2G1Wx4O33bKKk2eqj/IDAAUBgQWAAAUEjZyJA2vcA996Sve+45d0oJ/1FSASDYCCwAACjEbBTLZ5+VXn45vanUJ59IbdtmPW0BAAQLgQUAACHAmkHZELTeeS1sYmKb9Nd/QmoACBYCCwAAQsQFF0g//CBVr+4u26hSLVpI06YFO2UAQGABAEBIOflkd8SoU05xl3ftcgOOsWODnTIAkY7AAgCAEFO1qvT99+4QtObwYenGG6WBAxkxCkDwEFgAABCCrK/Fp59Kd96Zvu6JJ6Rrr5UOHAhmygBEKgILAABClI0S9eKL0ogRUlSUu+7DD6V27aRt24KdOgCRhsACAIAQ17evW3th816YH3+UmjeXfv892CkDEEkILAAACAMXX+z2u6hc2V1etcoNLmbNCnbKAEQKAgsAAMJEs2buiFGNG7vL//zjNot6771gpwxAJCCwAAAgjBx3nDvXRfv27vLBg9J110mPPy55PMFOHYBwRmABAECYKVXKnaW7d+/0dY88IvXs6QYaAJAfCCwAAAhDsbHSK69IzzyTvu7tt6UOHaQdO4KZMgDhisACAIAwZUPQ3nuvNH68lJDgrpsxw+3UvXp1sFMHINyEXGCRkpKipk2bKioqSosXL/bZ9ssvv6hVq1ZKSEhQjRo19EzGn2kAAIhQXbtK06dLFSu6yytXSmedJc2dKx054gYbH3zg/rVlAIiIwOK+++5T1apVM61PTk5W+/btVbNmTS1YsEDPPvusHn30Ub366qtBSScAAIWJBRI2YtRJJ7nLW7dK55wjVaoktW0rdevm/q1VS5o4MdipBRCKQiqw+Prrr/XNN9/oueeey7Ttvffe08GDB/Xmm2+qYcOGuvrqq9W3b18NGzYsKGkFAKCwqV1bmj3bDSDMoUPS9u2++2zY4NZwEFwACNvAYsuWLbr55ps1btw4FfNOLZrBnDlzdM455yguLi5tXYcOHbRy5UrtoJcaAACOsmWlL79Mn6Xbn3dI2v79aRYFIHdiFAI8Ho9uuOEG3XrrrTrttNP0119/Zdpn8+bNqm0/xWRQyep3/91W1q6k2fTZsEfGJlUmNTXVeYQrOzfL13A+RxQcyhMCjTKVv+bMkfbty/63RQsu1q2TZs5MVZs2CguUKQRapJSp1FycX1ADiwceeEBPP/30UfdZvny50/xp9+7devDBBwOehqFDh2rw4MGZ1m/dulUHDhxQOBeSXbt2OV+I6OiQqbhCIUV5QqBRpvLXypU2RFSZ/9xv1qw9atBgn8IBZQqBFillavfu3aERWNx9991OTcTRHH/88fruu++cpk7x8fE+26z24tprr9Xbb7+typUrO82lMvIu27bsWLAyYMAAnxoLG1GqYsWKKmUzDIXxl8FG1rLzDOcvAwoG5QmBRpnKX/Xq5Wy/wYNLatWqknroIU+OX1NYUaYQaJFSphK8Y1UX9sDCPgh7/JcXX3xRQ4YMSVveuHGj03/io48+0plnnumsa968uf7v//5Phw4dUqzNCiRp6tSpqlevXrbNoIwFK/4Bi7ECEs6FxNiXIRLOEwWD8oRAo0zln9atperV3Y7a3j4VWfF4ovTuuzZASpSuukoaOFBq2FAhizKFQIuEMhWdi3MLiVw47rjj1KhRo7RH3bp1nfUnnHCCqtuVUTZMXjen43avXr20dOlSJ+gYMWKET20EAACQihSRRoxIn0QvI1u2hw0/W66cu86Cjw8/lBo1kq64wuaNKvg0Ayj8QiKwyInSpUs7fTHWrFmjZs2aOc2sHnnkEfXu3TvYSQMAoNDp0kWaMEGqVs13vf1eZ+vfe0+ysVKsK2TGxgW27eSTpcsukxYuLPBkAyjEojzW4wQ+fSwsSLHOOOHexyIpKUmJiYlhXX2HgkF5QqBRpgqODSk7a5a0aZNUpYrUqpVbo5HR3r3SmDHSM89Y/0XfbRddJD38sHTGGSrUKFMItEgpU8m5uDcO31wAAAD/yYIIG1L2mmvcv/5BhSleXLKWxWvWuE2oqlZN3/bFF5J1d7zgAnfyPQCRi8ACAADkSNGiUt++0p9/SqNHSzVqpG+bMkU6+2ypXTub/yKYqQQQLAQWAAAgV2z0ydtuk1atkl59VapVK33btGluzYeNPPXdd0cfdQpAeCGwAAAAxyQuTrr5Zun336U337TRGtO3ff+9dN55UsuWbm0GAQYQ/ggsAABAntj0UT17SitWSOPG+U7AZ/0urP/FWWdJX35JgAGEMwILAAAQEDEx0nXXSUuXSh98IDVokL5t/nx3BKnTTpM+/dRG1AlmSgHkBwILAAAQUDay1NVXS7/+Ko0fLzVpkr7N5r6wOTBOOcWdE4MAAwgfBBYAACBf2ND+XbtKixa5tRSnnpq+zWbvtlm8LeiwWb1tPg0AoY3AAgAA5HuAcckl0s8/u/NeZJxMz5pN2RwaDRtK774rHT4czJQCyAsCCwAAUCCioqROnaS5c6XJk6UWLdK3rVwpde8unXSSNHasdOhQMFMK4FgQWAAAgAIPMDp0kH74wZ33wua88LLJ9268UapbV3rtNengwWCmFEBuEFgAAICgBRjnnivNmOE+bN4Lr7/+knr3lk48UXr5ZSklJZgpBZATBBYAACDorNbi22/dWgyrzfBat066/XZ38r0XX5T27w9mKgEcDYEFAAAoNM4+2+1/MW+eO++F14YNUr9+Uu3a0rBh0t69wUwlgKwQWAAAgELHRo76/HN3JKlLL01fv2WLdPfdboDx9NPS7t3BTCWAjAgsAABAodWsmTRpkrR4sTsnhtfWrdIDD0i1aklPPCHt2hXMVAIwBBYAAKDQO/lkdxZvm83bZvW2jt/mn3+kgQPdAGPwYGnHjmCnFIhcBBYAACBkNGokffCBtGyZO++FTb5ndu6UHn3UDTAefljavj39NTart406NWlSgvOXWb6B/EFgAQAAQo5NpPfOO+7Eej17SkWKuOuTk6UhQ9wAw5pK2WR79vy886J1++1lnL+2PHFisM8ACD8EFgAAIGTZPBdvvin98Yd0881SbKy7fs8et3O3Tba3fr3va2yEKeuvQXABBBaBBQAACHk2StSrr0qrVrnzXngDjKx4PO7f/v1pFgUEEoEFAAAIG8cdJ40aJb333tH3s+DCJt9r0UJ66CHp44+l33+XUlMLKqVA+IkJdgIAAAAC7fDhnO03f7778CpeXGrSRGraNP1hHcaLFcu3pAJhg8ACAACEnSpVju11NqP3nDnuw8tGnqpXzzfYsEdiYsCSC4QFAgsAABB2WrWSqld3O2p7+1RkZPNg2PaZM925MWwCPu9jzRrffa151PLl7sOGus0YvPgHG9aZ3DsELhBpCCwAAEDYseFnR4xwR3+yICJjcOGdXG/4cLfTtz0uvjh9u82J8csvvsHGb79Jhw75vsemTe7j66/T19GUCpGMwAIAAISlLl2kCROkfv18h5y1mgoLKmx7VsqUkc45x314HTworVjhG2zYw3+mb5pSIZJFeTxZVRBGruTkZJUuXVq7du1SqVKlFK5SU1OVlJSkxMRERVNnizyiPCHQKFMIJBtSdubMVK1cmax69UqpdevotAn18sI7spR/sOHflCo7NKUKbZFynUrOxb0xNRYAACCsWRDRpo3UoMEBJSaWCtiNuzWpsuFt7fFfTamWLnVrPTKiKRXCDYEFAABAANGUCpGKwAIAACCfxcW5NRH2uP763DWlYlQqhAoCCwAAgCDISVOqJUvSR6WiKRUKOwILAACAQt6Uyoa69W9KtWjRsTelOvlkqVKlgjsnRAYCCwAAgEIuNlZq3Nh9dO+e3pTKhtH1b0q1evWxN6U64QS3sztwLAgsAAAAQrQpVY0a7qNz5/T1u3ZlPcEfTamQ3wgsAAAAwkjp0lKrVu4jUE2p6tbNXLtBUyr4I7AAAAAIc3ltSmVBiT0+/DB9feXKWY9KRVOqyEVgAQAAEIHy2pRq82Zp8mT34WVNpvybUlkwQ1OqyEBgAQAAgFw3pbLHP//4vnbfPmnuXPfhRVOqyEFgAQAAgKOiKRVygsACAAAAuUZTKvgjsAAAAEDA0JQqchFYAAAAIF/RlCoyEFgAAACgwNGUKvwQWAAAAKDQoClV6AqpwOLLL7/UY489pl9++UUJCQlq3bq1Pv3007Ttf//9t2677TZNnz5dJUqUUI8ePTR06FDFxITUaQIAACCXTamWLHH//vln/jelOnJEmjlTWrkyQfXqSa1b0wTLhMwd9yeffKKbb75ZTz75pM4991wdPnxYv1m92L+OHDmiTp06qXLlypo9e7Y2bdqk66+/XrGxsc5rAAAAEP5NqZKTMzel+vXXwDWlmjhR6tfPgppoSWWcddWrSyNGSF26KKJFeTwW7xVuFkTUqlVLgwcPVq9evbLc5+uvv9ZFF12kjRs3qtK/dVuvvPKK7r//fm3dulVxcXE5eq/k5GSVLl1au3btUqlSpRSuUlNTlZSUpMTEREVbHSGQB5QnBBplCoFGmYps1pRq5UrfYGPRosxNqbKSsSmVNYJ5992sgxwzYUL4BRe5uTcOiW/WwoULtWHDBudCcMopp6hKlSrq2LGjT43FnDlz1Lhx47SgwnTo0MHJjKVLlwYp5QAAACgMTakaNZKuu0567jnp22+lbdukdeukzz+XHn9cuvxy6YQTMr/W25TKmlFlFVQY78/0/fu7zaQiVUg0hVr977hjjz76qIYNG+bUXjz//PNq06aNfv/9d5UrV06bN2/2CSqMd9m2ZSclJcV5eFkgYlI3blTq7t3pOyYkSGXLWvWJtHVr5gNVqeL+tVJqYXFGZcpIRYtKe/e69XMZWU1K+fJuqd2yJfNxExPdRnsWUmdIp6NkSalECWn/fmnnTt9tFlJXrOg+37Qp02FTy5WTVValZnXc4sUli0htvX8ob2G7N58tvZbujMqVk+Lj3fO0883I8sDywvLH8im7PLT8tXzOKg/37JEyfi7G3s/e177JSUmZj2vptXRv3565HtTO0843qzy0q1CFCtnmoZO/ls87dkgHDvhus8/FPp+s8tA+T/tcs8tDKw9WLrLKQ6uLtV5tWeWh/VxiDUazy0Mrv1aOs8pDb/nOLg/tuHb8rPKwdGmlJiTIs3evUjdscPPav3zbFTer76G3fGeVh97ybette3bl247rX/Fqn5t9fja0iPXky6p823nY+WRXvi0f/P938JZvyz/Lx4zC7BqRlof2Ont9AV8jUpOSFLV9u1Itr7xlimtEyF4jnHTZd9G+kxkV4DXCaizSypQdl2tESF8jAnUfUTVKqnpWvC68MP0aYZuXL5fsd+mlS6M06/dK+uW3aJU4+I/i5Fu+k1VK+1RcCdqvMp6dOrROmjMxVS1ahM81wud+uDAHFg888ICefvrpo+6zfPly52Jg/u///k+XWzgpaezYsapevbrGjx+vW2655ZjTYJ27rYmVv32jRinGCva/DtWvr5ROnRS1Y4eKv/FGpv333HOP87foe++piF/hOXDhhTrcoIFiFy1S/LRpPtsO16ypA1dc4RScEiNHZjru3ttvl6dYMSVMmqQYv95IKW3a6NBppylm5UolWLidwZHERO2//nrnefERIxTlV+j2XH+9dsbGKm7ePMVnqPkxB884QwfPOUdF1q1T0Y8+8tmWWqKE9t16q/O82Jgxiva7cO6/6iodqVFDcd9/r7j58322HWrcWCkdOih62zYVe+stn22e6GjtHTDAzcN33lERv/+4DnTurMP16in2558VP2OGbx6ecIIOXHaZovbtU/HRozPl4Z4773QuUgnjxytm7VrfPDzvPB065RTFLFumhK++8s3DKlW0/9prneclXngh03H39uolT9myiv/yS8XaFShjHrZo4TyKrFmjop984puHZcpo3003Oc8tvVF+F+R911yj1GrVFDd9uuIWLPDNw6ZNldKunaK3bFGxceN88zAuTnv79nWeFxs7VtF+/yHuv/RSHTnxRMXOnav4H37wzcO6dXXg4osVtXu3io8ZkzkP7SeYmBinPFi5yOhA+/Y62KiRUhYv1v7ZsxXlrQ+2PKxRwykTdnEqMXx45jy85RZ5SpZUwmefKeb33322pbRsqUNnnaUiq1apaIZBGpw8LF9e+3r2dPPwpZcU5Xcjs697d6VWqqT4b79VrNV3Z3CwWTMdbNtW0Rs2qNgHH/jmYdGi2tunj5uHr7+uaL//aPdffrmO1K6tuNmznUdG4XaN2HfDDUqtUEHxU6Yo1honF/A1oqiV4QMHtD8hwSlTXCNC+xpxuEkTxdjAK99845uHBXiNsB/TvGXKyj7XiNC+RuTnfYT13W7070PVpD1P3alD0fGad8dn+u2zjT6v/UoX6iedoTr6Q1000VkX/9YB7Zt3OGyuEfv8A9LC2sfC+j5s9/81wM/xxx+vH3/80emwPWvWLLVs2TJt25lnnql27drpiSee0COPPKLPPvtMizNcINasWeO83ppSWROqnNZY1KhRQzuWL1cpixTDuMZi686dqhgbq2hqLPg1MgA1FlvXrlXFuDjftsvUWITsNaIw1FjY/w/ly5dPL1NcI0L2GlFYaizSyhQ1FiF/jQjGfcQP/9uuq7oczr7GQm4ejv84vGosknfvVtn69XPUxyIkOm/bzb51tho1alRa5+1Dhw45NRaPP/64evfundZ520aDsn3Nq6++qnvvvdfprBWfofbhv96LzttA7lCeEGiUKQQaZQp5ZXFHrVqStfrN7u45IcGNE+xvuAi7ztt2ErfeeqsGDRqkb775RitXrnTmqzBXWPWfpPbt26tBgwbq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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Display the global field\n", - "print(\"Global Field:\")\n", - "uxds[\"psi\"].plot(cmap=\"inferno\", periodic_elements=\"split\", title=\"Global Field\")\n", - "\n", - "# Create zonal average plot\n", - "fig, ax = plt.subplots(1, 1, figsize=(8, 6))\n", - "\n", - "ax.plot(\n", - " zonal_mean_psi.values,\n", - " zonal_mean_psi.coords[\"latitudes\"],\n", - " \"o-\",\n", - " linewidth=2,\n", - " markersize=6,\n", - " color=\"blue\",\n", - " label=\"Zonal Mean\",\n", - ")\n", - "\n", - "ax.set_xlabel(\"Zonal Mean Value\")\n", - "ax.set_ylabel(\"Latitude (degrees)\")\n", - "ax.set_title(\"Zonal Average\")\n", - "ax.grid(True, alpha=0.3)\n", - "ax.set_ylim(-90, 90)\n", - "ax.legend()\n", - "\n", - "# Add reference latitude lines\n", - "sample_bands = [-60, -30, 0, 30, 60]\n", - "for lat_band in sample_bands:\n", - " ax.axhline(y=lat_band, color=\"red\", linestyle=\"--\", alpha=0.5, linewidth=1)\n", - "\n", - "plt.tight_layout()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", + "application/vnd.holoviews_exec.v0+json": "", + "text/html": [ + "
\n", + "
\n", + "
\n", + "" + ], + "text/plain": [ + ":Layout\n", + " .Image.I :Image [x,y] (x_y psi)\n", + " .Overlay.I :Overlay\n", + " .Curve.I :Curve [zonal_mean] (latitudes)\n", + " .Scatter.I :Scatter [zonal_mean] (latitudes)" + ] + }, + "execution_count": 52, + "metadata": { + "application/vnd.holoviews_exec.v0+json": { + "id": "7922485d-7955-42d6-8d67-38dae0e029d9" + } + }, + "output_type": "execute_result" + } + ], + "source": [ + "# Pair the map and the zonal profile using hvplot\n", + "zonal_df = zonal_mean_psi.to_dataframe(name=\"zonal_mean\").reset_index()\n", + "map_panel = (\n", + " uxds[\"psi\"]\n", + " .plot(cmap=\"inferno\", periodic_elements=\"split\")\n", + " .opts(title=\"Global Field\", colorbar=True, width=525, height=400)\n", + ")\n", + "profile_line = zonal_df.hvplot(\n", + " x=\"zonal_mean\",\n", + " y=\"latitudes\",\n", + " line_width=2,\n", + " xlabel=\"Zonal Mean Value\",\n", + " ylabel=\"Latitude (degrees)\",\n", + " title=\"Latitude Profile\",\n", + " ylim=(-90, 90),\n", + " width=400,\n", + " height=400,\n", + ")\n", + "profile_points = zonal_df.hvplot.scatter(\n", + " x=\"zonal_mean\",\n", + " y=\"latitudes\",\n", + " color=\"blue\",\n", + " size=6,\n", + ")\n", + "profile_panel = (profile_line * profile_points).opts(show_grid=True)\n", + "(map_panel + profile_panel).cols(2)" + ] + }, + { + "cell_type": "markdown", "id": "4f923644", "metadata": {}, "source": [ @@ -2850,7 +2003,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 46, "id": "52d24b6b", "metadata": { "execution": { @@ -2860,16 +2013,49 @@ "shell.execute_reply": "2025-09-26T15:41:08.652469Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=================================================================\n", + "ZONAL AVERAGING ON HEALPix GRID: Conservative vs Non-Conservative\n", + "=================================================================\n", + "\n", + "Test function: sin(latitude)\n", + "Analysis band: 32°N to 52°N\n", + "Center latitude: 42°N\n", + "Grid resolution: HEALPix zoom level 3 (~1.8° spacing)\n", + "\n", + "-----------------------------------------------------------------\n", + "RESULTS:\n", + "-----------------------------------------------------------------\n", + "Conservative (band average): 0.6528\n", + " → Theoretical value: 0.6590\n", + " → Physical meaning: Area-weighted average over 20° band\n", + " → Use case: Flux calculations, energy budgets\n", + "\n", + "Non-conservative (point value): 0.6687\n", + " → Theoretical value: 0.6691\n", + " → Physical meaning: Value at exactly 42.0°N\n", + " → Use case: Station comparisons, spot measurements\n", + "\n", + "-----------------------------------------------------------------\n", + "KEY INSIGHTS:\n", + "-----------------------------------------------------------------\n", + "• Difference between methods: 0.0159 (2.4%)\n", + "• Conservative < Non-conservative because sin(lat) increases toward\n", + " the pole, and southern portion of band has lower values\n", + "• Both methods are 'correct' - choose based on your application:\n", + " - Conservative: preserves integrated quantities\n", + " - Non-conservative: provides local values\n" + ] + } + ], "source": [ "# HEALPix Zonal Averaging: Conservative vs Non-Conservative Methods\n", "# This example demonstrates the key differences between conservative (area-weighted)\n", "# and non-conservative (point-sampling) zonal averaging on a HEALPix grid.\n", - "\n", - "import numpy as np\n", - "\n", - "import uxarray as ux\n", - "\n", "# Create HEALPix grid with synthetic data\n", "# Using sin(latitude) as test function - varies smoothly with latitude\n", "uxgrid = ux.Grid.from_healpix(zoom=3, pixels_only=False)\n", @@ -2948,175 +2134,2806 @@ }, { "cell_type": "markdown", - "id": "4fcf1856", - "metadata": {}, - "source": [ - "### Step 6.1: Load the NE30 grid and prepare the field\n", - "\n", - "We point UXarray to the grid and data files under `test/meshfiles/scrip/ne30pg2/`, open the `RELHUM` variable, and drop the leading time dimension so the array is only `(level, face)`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1a6cbff1", - "metadata": {}, - "outputs": [], - "source": [ - "from pathlib import Path\n", - "\n", - "import xarray as xr\n", - "\n", - "grid_path = Path(\"../../test/meshfiles/scrip/ne30pg2/grid.nc\")\n", - "data_path = Path(\"../../test/meshfiles/scrip/ne30pg2/data.nc\")\n", - "\n", - "ne30_ds = ux.open_dataset(grid_path, data_path)\n", - "relhum = ne30_ds[\"RELHUM\"]\n", - "\n", - "for dim in (\"time\", \"t\", \"step\"):\n", - " if dim in relhum.dims:\n", - " relhum = relhum.isel({dim: 0})\n", - "\n", - "level_dim = \"level\" if \"level\" in relhum.dims else relhum.dims[0]\n", - "levels = relhum.coords.get(\n", - " level_dim,\n", - " xr.DataArray(np.arange(relhum.sizes[level_dim]), dims=level_dim),\n", - ").values\n", - "\n", - "relhum" - ] - }, - { - "cell_type": "markdown", - "id": "37c55c53", - "metadata": {}, - "source": [ - "### Step 6.2: Build latitude samples and compute both zonal means\n", - "\n", - "Sampling every 10 degrees gives us clearly separated latitude bands while staying light on compute. The non-conservative average uses those values as **centers**, while the conservative option treats them as **band edges** so that each band carries the correct area weight. Adjust the spacing if you need higher detail or faster turnaround." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2285f261", + "id": "zonal_vs_cross_section_note", "metadata": {}, - "outputs": [], "source": [ - "lat_edges_deg = np.arange(-90.0, 90.0 + 10.0, 10.0)\n", - "lat_centers_deg = 0.5 * (lat_edges_deg[:-1] + lat_edges_deg[1:])\n", - "\n", - "\n", - "def stack_zonal_means(data_array, lat_values, *, conservative):\n", - " slices = []\n", - " for lev in range(data_array.sizes[level_dim]):\n", - " zonal_slice = data_array.isel({level_dim: lev}).zonal_mean(\n", - " lat=lat_values, conservative=conservative\n", - " )\n", - " slices.append(zonal_slice)\n", - " zonal = xr.concat(slices, dim=level_dim)\n", - " return zonal.assign_coords({level_dim: levels}).rename({\"latitudes\": \"lat\"})\n", - "\n", - "\n", - "zonal_nc = stack_zonal_means(relhum, lat_centers_deg, conservative=False)\n", - "zonal_c = stack_zonal_means(relhum, lat_edges_deg, conservative=True)\n", - "zonal_diff = zonal_c - zonal_nc\n", - "\n", - "zonal_nc" + "```{tip}\n", + "`zonal_mean()` collapses longitude to build latitude-only diagnostics.\n", + "Use `.cross_section()` for path-based transects (great-circle or constant lat/lon lines) and see the [Cross-Sections](./cross-sections.ipynb) notebook for examples.\n", + "```\n" ] }, { "cell_type": "markdown", - "id": "bbbfb613", + "id": "4fcf1856", "metadata": {}, "source": [ - "### Step 6.3: Visualize the latitude–level slices\n", + "### Step 6.1: Load the NE30 grid and prepare the field\n", "\n", - "Placing the two 2D sections next to each other shows the smoothing introduced by area weighting, while a third panel plotting the signed difference (conservative − non-conservative) highlights where the methods diverge. Because every panel uses the same color scale (and the difference plot uses a diverging palette), the contrast is easy to spot." + "We point UXarray to the grid and data files under `test/meshfiles/scrip/ne30pg2/`, open the `RELHUM` variable, and drop the leading time dimension so the array is only `(level, face)`." ] }, { "cell_type": "code", - "execution_count": null, - "id": "b752c490", - "metadata": {}, - "outputs": [], - "source": [ - "fig, axes = plt.subplots(1, 3, figsize=(15, 4), sharey=True, constrained_layout=True)\n", - "\n", - "value_min = float(min(zonal_nc.min().values, zonal_c.min().values))\n", - "value_max = float(max(zonal_nc.max().values, zonal_c.max().values))\n", - "\n", - "mesh_nc = axes[0].pcolormesh(\n", - " zonal_nc[\"lat\"],\n", - " levels,\n", - " zonal_nc.transpose(level_dim, \"lat\"),\n", - " shading=\"nearest\",\n", - " cmap=\"viridis\",\n", - " vmin=value_min,\n", - " vmax=value_max,\n", - ")\n", - "axes[0].set_title(\"Non-conservative (centers)\")\n", - "axes[0].set_xlabel(\"Latitude (deg)\")\n", - "axes[0].set_ylabel(level_dim)\n", - "axes[0].set_xlim(-90, 90)\n", - "\n", - "mesh_c = axes[1].pcolormesh(\n", - " zonal_c[\"lat\"],\n", - " levels,\n", - " zonal_c.transpose(level_dim, \"lat\"),\n", - " shading=\"nearest\",\n", - " cmap=\"viridis\",\n", - " vmin=value_min,\n", - " vmax=value_max,\n", - ")\n", - "axes[1].set_title(\"Conservative (bands)\")\n", - "axes[1].set_xlabel(\"Latitude (deg)\")\n", - "axes[1].set_xlim(-90, 90)\n", - "\n", - "diff_max = float(np.nanmax(np.abs(zonal_diff.values)))\n", - "if diff_max == 0:\n", - " diff_max = 1e-6\n", - "mesh_diff = axes[2].pcolormesh(\n", - " zonal_diff[\"lat\"],\n", - " levels,\n", - " zonal_diff.transpose(level_dim, \"lat\"),\n", - " shading=\"nearest\",\n", - " cmap=\"RdBu_r\",\n", - " vmin=-diff_max,\n", - " vmax=diff_max,\n", - ")\n", - "axes[2].set_title(\"Difference (conservative - non)\")\n", - "axes[2].set_xlabel(\"Latitude (deg)\")\n", - "axes[2].set_xlim(-90, 90)\n", - "\n", - "cbar_field = fig.colorbar(\n", - " mesh_nc, ax=[axes[0], axes[1]], orientation=\"vertical\", fraction=0.04, pad=0.02\n", - ")\n", - "cbar_field.set_label(\"RELHUM zonal mean\")\n", - "\n", - "cbar_diff = fig.colorbar(\n", - " mesh_diff, ax=[axes[2]], orientation=\"vertical\", fraction=0.08, pad=0.02\n", - ")\n", - "cbar_diff.set_label(\"RELHUM difference\")" - ] - }, - { - "cell_type": "markdown", - "id": "6530ad41", + "execution_count": 47, + "id": "1a6cbff1", "metadata": {}, - "source": [ - "### Step 6.4: Spot-check the difference numerically\n", - "\n", - "Visuals are helpful, but printing quick summary statistics and a few sample latitude bands makes it clear how large the conservative correction is." - ] + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.UxDataArray 'RELHUM' (lev: 72, n_face: 21600)> Size: 6MB\n",
+       "[1555200 values with dtype=float32]\n",
+       "Coordinates:\n",
+       "  * lev      (lev) float64 576B 0.1238 0.1828 0.2699 ... 986.2 993.8 998.5\n",
+       "    time     object 8B ...\n",
+       "Dimensions without coordinates: n_face\n",
+       "Attributes:\n",
+       "    mdims:          1\n",
+       "    units:          percent\n",
+       "    long_name:      Relative humidity\n",
+       "    standard_name:  relative_humidity\n",
+       "    cell_methods:   time: mean
" + ], + "text/plain": [ + " Size: 6MB\n", + "[1555200 values with dtype=float32]\n", + "Coordinates:\n", + " * lev (lev) float64 576B 0.1238 0.1828 0.2699 ... 986.2 993.8 998.5\n", + " time object 8B ...\n", + "Dimensions without coordinates: n_face\n", + "Attributes:\n", + " mdims: 1\n", + " units: percent\n", + " long_name: Relative humidity\n", + " standard_name: relative_humidity\n", + " cell_methods: time: mean" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grid_path = Path(\"../../test/meshfiles/scrip/ne30pg2/grid.nc\")\n", + "data_path = Path(\"../../test/meshfiles/scrip/ne30pg2/data.nc\")\n", + "\n", + "ne30_ds = ux.open_dataset(grid_path, data_path)\n", + "relhum = ne30_ds[\"RELHUM\"]\n", + "\n", + "for dim in (\"time\", \"t\", \"step\"):\n", + " if dim in relhum.dims:\n", + " relhum = relhum.isel({dim: 0})\n", + "\n", + "level_dim = \"level\" if \"level\" in relhum.dims else relhum.dims[0]\n", + "levels = relhum.coords.get(\n", + " level_dim,\n", + " xr.DataArray(np.arange(relhum.sizes[level_dim]), dims=level_dim),\n", + ").values\n", + "\n", + "relhum" + ] + }, + { + "cell_type": "markdown", + "id": "37c55c53", + "metadata": {}, + "source": [ + "### Step 6.2: Build latitude samples and compute both zonal means\n", + "\n", + "Sampling every 10 degrees gives us clearly separated latitude bands while staying light on compute. The non-conservative average uses those values as **centers**, while the conservative option treats them as **band edges** so that each band carries the correct area weight. Adjust the spacing if you need higher detail or faster turnaround." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "2285f261", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'RELHUM_zonal_mean' (lev: 72, lat: 18)> Size: 5kB\n",
+       "array([[1.39507087e-04, 1.46236242e-04, 1.57333357e-04, ...,\n",
+       "        1.38013987e-04, 1.37959549e-04, 1.37912750e-04],\n",
+       "       [1.46500082e-04, 1.56465467e-04, 1.59396877e-04, ...,\n",
+       "        1.38380448e-04, 1.37978277e-04, 1.37925847e-04],\n",
+       "       [1.39333293e-04, 1.40268996e-04, 1.41239536e-04, ...,\n",
+       "        1.41590019e-04, 1.37986484e-04, 1.37942334e-04],\n",
+       "       ...,\n",
+       "       [9.95636673e+01, 9.57479248e+01, 9.42285156e+01, ...,\n",
+       "        1.00770416e+02, 1.01268219e+02, 1.04364807e+02],\n",
+       "       [9.75083466e+01, 9.47997131e+01, 9.26638336e+01, ...,\n",
+       "        9.82491531e+01, 9.99979477e+01, 1.02430000e+02],\n",
+       "       [9.58398132e+01, 9.40848160e+01, 9.15409851e+01, ...,\n",
+       "        9.66513596e+01, 9.93786469e+01, 1.01074776e+02]],\n",
+       "      shape=(72, 18), dtype=float32)\n",
+       "Coordinates:\n",
+       "  * lev      (lev) float64 576B 0.1238 0.1828 0.2699 ... 986.2 993.8 998.5\n",
+       "  * lat      (lat) float64 144B -85.0 -75.0 -65.0 -55.0 ... 55.0 65.0 75.0 85.0\n",
+       "Attributes:\n",
+       "    zonal_mean:    True\n",
+       "    conservative:  False
" + ], + "text/plain": [ + " Size: 5kB\n", + "array([[1.39507087e-04, 1.46236242e-04, 1.57333357e-04, ...,\n", + " 1.38013987e-04, 1.37959549e-04, 1.37912750e-04],\n", + " [1.46500082e-04, 1.56465467e-04, 1.59396877e-04, ...,\n", + " 1.38380448e-04, 1.37978277e-04, 1.37925847e-04],\n", + " [1.39333293e-04, 1.40268996e-04, 1.41239536e-04, ...,\n", + " 1.41590019e-04, 1.37986484e-04, 1.37942334e-04],\n", + " ...,\n", + " [9.95636673e+01, 9.57479248e+01, 9.42285156e+01, ...,\n", + " 1.00770416e+02, 1.01268219e+02, 1.04364807e+02],\n", + " [9.75083466e+01, 9.47997131e+01, 9.26638336e+01, ...,\n", + " 9.82491531e+01, 9.99979477e+01, 1.02430000e+02],\n", + " [9.58398132e+01, 9.40848160e+01, 9.15409851e+01, ...,\n", + " 9.66513596e+01, 9.93786469e+01, 1.01074776e+02]],\n", + " shape=(72, 18), dtype=float32)\n", + "Coordinates:\n", + " * lev (lev) float64 576B 0.1238 0.1828 0.2699 ... 986.2 993.8 998.5\n", + " * lat (lat) float64 144B -85.0 -75.0 -65.0 -55.0 ... 55.0 65.0 75.0 85.0\n", + "Attributes:\n", + " zonal_mean: True\n", + " conservative: False" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lat_edges_deg = np.arange(-90.0, 90.0 + 10.0, 10.0)\n", + "lat_centers_deg = 0.5 * (lat_edges_deg[:-1] + lat_edges_deg[1:])\n", + "\n", + "\n", + "def stack_zonal_means(data_array, lat_values, *, conservative):\n", + " slices = []\n", + " for lev in range(data_array.sizes[level_dim]):\n", + " zonal_slice = data_array.isel({level_dim: lev}).zonal_mean(\n", + " lat=lat_values, conservative=conservative\n", + " )\n", + " slices.append(zonal_slice)\n", + " zonal = xr.concat(slices, dim=level_dim)\n", + " return zonal.assign_coords({level_dim: levels}).rename({\"latitudes\": \"lat\"})\n", + "\n", + "\n", + "zonal_nc = stack_zonal_means(relhum, lat_centers_deg, conservative=False)\n", + "zonal_c = stack_zonal_means(relhum, lat_edges_deg, conservative=True)\n", + "zonal_diff = zonal_c - zonal_nc\n", + "\n", + "zonal_nc" + ] + }, + { + "cell_type": "markdown", + "id": "bbbfb613", + "metadata": {}, + "source": [ + "### Step 6.3: Visualize the latitude–level slices\n", + "\n", + "Placing the two 2D sections next to each other shows the smoothing introduced by area weighting, while a third panel plotting the signed difference (conservative − non-conservative) highlights where the methods diverge. Because every panel uses the same color scale (and the difference plot uses a diverging palette), the contrast is easy to spot." + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "b752c490", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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nDhRRUREqPbt23vnczqdKiUlRSUnJ6upU6eqF154QU2aNEldfPHF6vfff/fON3XqVKVpmurXr59auHChmjRpkqpWrZqqV6+et2wF+y8pKUlVr15d3X///WrJkiVq3bp16uWXX1YA1Jdffumzzb///rsCoJ555hnvtIsvvlgNGjRIzZ49W82fP19dffXVCoBasGCBd5633npL1apVSzVu3FitXLlSrVy5Um3cuNFn27ds2aKUUmrr1q0KgFqzZo3PurOzs1VkZKQaPny4d9rLL7+sNE1TPXr0UPPnz1czZsxQ9erVU3FxcerAgQPn/Pw+++wzBUC9/fbbhd6bOHGiAqA6deqknnnmGTV37lx12223qTFjxpR63QMHDlQOh0M1a9ZM3XXXXWrRokWqb9++CoBauHChUkqprKwstWjRIgVA3XDDDd59tHv3bqWUUj/88IOKjY1VTZs2VTNmzFALFixQXbp0UZqm+RxHBd+Xpk2bqq5du6r58+erp59+Wiml1G233aZsNpsaNWqUeuGFF9SMGTNU79691SuvvOKz7S6XS4WHh6uHH374nPuPiAKjZs2aqn79+iWe39914OOPP640TVNDhw5Vy5YtU88995y69dZbvecWpcp+jsrJyVFRUVHqvvvuK7Q9V1xxhU89/+yzz6rLLrtMTZ48WS1dulQ9+OCDKjw8XLVv314ZhqGUUmr37t3q1ltvVQDU7NmzvefUrKws77YPHDjQG7N+/fqqZ8+ehdY9ePBgVaVKFZWfn6+UOl2n16pVS9WuXVtNnjxZLVq0SF133XXe9ZxPw4YN1Y033lhoekE90ahRI3XHHXeoBQsWqGuvvVYBUOPGjfOZt1atWuq+++5TCxYsULNmzVLt27dXANS7777rMx8A1apVK1WjRg01ZcoUNWfOHFW/fn0VERGh/v77b+983333nQoPD1d16tRR06dPV1OmTFGJiYmqZcuW6szbhB9++EHZbDbVrl07NXfuXLV48WL1yCOPqC5duhTanqlTpypd11VGRsZ59wkRUTA4856zKIcOHfLWrQUmTJjgPU9mZWWplStXqsaNG6tatWp56520tDS1cuVKVa1aNdW6dWuf+sjj8airr77aey+5ZMkSNWLECBUWFqauv/56n/UDUE2aNFHVq1dXkyZNUs8//7z65ptvSlwvlfReUymlNm7cqGw2m6pb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j6pWrVqp6OhoFRkZqVq1aqUWLlxYqFwdOnRQt99++7l3HBEF3K+//qqGDh2q6tWrp2w2m4qOjladO3dW8+fP96nf/F0HTp06VbVv317FxcWp8PBw1bhxY/XUU0+p/Px8n+XKco4606ZNmxQApWmaOnToUKH3//zzT3XDDTeouLg4FRsbq26++Wb1119/FTpnKqXUlClTVM2aNZWu6z51Ut26ddXAgQMLxd67d68CoACozz77rMjyHT16VA0fPlzVrl1bWa1WlZSUpLp166aWLl1a7DYVcDqdqlq1amrKlCk+0wvqif3796urr75aRUREqMTERDVhwgTl8Xh85v3Xv/6lGjVqpOx2u2rcuLFavnx5kfUJADV8+PBCZShq2z/55BNv3VO/fn21ePHiQjE3b96srr/+epWcnKxsNptKTk5Wt956q/r11199Yq1fv14BUHv37j3v/iAiChYF9VPBy2azqaSkJHXVVVepuXPnqszMzELLFHXuLe7eqrg6Nz8/X82YMUM1a9bMe8/Rtm1bNWnSJJWRkeGdr7hzulIlq5dKeq9Z4LPPPlNXXXWV976hZcuWav78+T7zlKTeL87Ro0dVWFiYWrlyZaH3SrLuDz/8UHXu3FmFh4ermJgY1bt3b7Vnzx6feQo+n+PHj/tML/isC64JSlq/+eOzUkopwzBU7dq1FQA1derUIt+fNm2aqlu3rrLb7apNmzbq3XffVQMHDlR169b1mbe4e8eijs0CnTt3VgDU3XffXWwZly5dqtq2bavCw8NVdHS0atGihRo9erT666+/il2mtEr6+Sgl076zaNEiFRERUeR3m6g8aEqZGBWKiKgC8Hg8aNq0KW655ZYiH9+rbL799ltcdNFF+Prrr4vNt09EROZNmTIFy5cvx969e8s0WHiw6tOnDzRNw1tvvVXeRSEioiA2ZMgQ/Prrr/j000/LuyhUCbVp0waXX345Zs+eXd5FIQIAsHGeiCq11atX495778XBgwcRFRVV3sUpV/3794dhGFizZk15F4WIqELKyspC/fr1MXv2bL/mLg4GP/30E1q0aIFvv/32nI/VExERHTx4EBdccAE2b96Mzp07l3dxqBLZsGEDbrrpJvz2229ISEgo7+IQAWDjPBERERERERERERFRwJVuNEoiIiIiIiIiIiIiIiqzcm2c37p1K3r37o3k5GRomoZ1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2jSNGzfumMf07dtXS5cu1aJFi7R7924VFRVJkubOnauXXnpJ8+bN00033aTOnTvX2S28dgfrzp07pyXv2gHYgAEDEvfn5eWpb9++2rp1ayK3TMt76dKlWr58ufLy8pJ+N3ToUI0ZM0bz5s1T586d6+wQ7pF3fXOu9cknn+gf/uEfdPbZZ+unP/1p0nFB5Xwi2rdvr6ysrCPmla6cjmby5MlatGiRXnvtNXXv3j1xf+fOnVVVVaU9e/YkfaOfzn/DypUr9emnn+orX/lK4r5YLKbXXntN//M//6PFixdnXM6S1KVLl6TzhSSddtpp+t3vfifpi/fpzp071aVLl8QxO3fu1ODBgwPL88uuv/76xCoESRo0aJA++ugjzZ49W2PHjs3YvOuDOkWdaqyca1Gn/ISpTknUqiA15TqFYIRxPMBYILixwInkXStM4wHGAn4YCwSL8UATkc6G983Zs88+a9Fo1CoqKpLuP+WUU2zmzJlm9sUmNYfvFv7II49YUVGRHTx4MNB8a5WVlVleXl7S5jpVVVXWsWPHxE7rmZj3Rx99ZGvWrEncFi9ebJLsySeftG3btpnZF5vUVFVVJR538803p3WTmo8//tj69etn3/nOd6ympqbO7zMxZ7NDm+tMnjw58XMsFrNu3bplzOY68XjcJk2aZF27drWNGzfW+X3tJjVPPvlk4r7169endZOa8vLypPfwmjVrbOjQoXbFFVfYmjVrMjJnM7N/+Zd/qbOxztSpU2348OFm9sUGNXPmzEn8vvY8k84Natq2bWtz585Num/WrFnWr18/M8vcvBsTdSpY1KlgUad8UKuCQ51CUMI4HmAsELwwjgcYC/hgLBAsxgNNA5PzafLZZ59Zu3bt7LLLLrPVq1fbhg0b7LrrrrOcnBxbvXq1mZnV1NTYwIED7aKLLrLVq1fbCy+8YB06dLCbb745rblPmTLFunXrZosXL7b169fb+PHjrWPHjrZr166MzvtwmzdvNil55/s9e/ZYp06d7Morr7S1a9fawoULrbCwMDGAC9rHH39sJ598sl144YX28ccf244dOxK3TM251sKFCy0vL88ee+wxe++99+zqq6+21q1bW2lpaVrzqnXNNddYcXGxvfLKK0mv6/79+xPHTJw40Xr27GlLly61t956y4YPH54ozJni8F3vzTIz5xUrVlh2drbNnDnTPvjgA5s/f74VFhbar371q8Qxd911l7Vu3dqeeeYZe/fdd+3b3/629enTxw4cOJC2vMeOHWvdunWzRYsW2ebNm+2pp56y9u3b2w033JDReTcm6lR6Uad8UaeCQ63yQZ1CUMI6HmAsEJywjgcYCwSHsYAfxgNNA5PzafTmm2/aRRddZG3btrVWrVrZWWedZc8//3zSMVu2bLGLL77YCgoKrH379jZt2jSrrq5OU8aHVFVV2bRp06xjx47WqlUrGzFihK1duzbpmEzM+3BHGuiYmb3zzjt27rnnWl5ennXr1s3uuuuu9CRoZiUlJSbpiLfDZVLOh3vwwQetZ8+elpuba2eeeaa98cYb6U4p4Wiva0lJSeKYAwcO2LXXXmtt2rSxwsJCu/TSS5MGmJngy4OcTM35D3/4gw0cONDy8vKsf//+9tOf/jTp9/F43G677Tbr1KmT5eXl2YUXXmgbNmxIU7aHlJeX25QpU6xnz56Wn59vffv2tVtuucUqKysTx2Ri3o2NOpU+1Cl/1KlgUKt8UKcQpDCOBxgLBCfM4wHGAsFgLOCH8UDTEDEza+ROOQAAAAAAAAAA4Bii6U4AAAAAAAAAAIDmhsl5AAAAAAAAAAACxuQ8AAAAAAAAAAABY3IeAAAAAAAAAICAMTkPAAAAAAAAAEDAmJwHAAAAAAAAACBgTM4DAAAAAAAAABAwJucBAAAAAAAAAAgYk/NAM9S7d2/df//9LrHPP/98TZ06tcFxlixZotNOO02xWOyox8yYMUODBw9u8HMd7r333lP37t21b9++Ro0LAKg/6tTRUacAAM0BY4GjYywANC1MzgMZbNy4cRo1alTKj3/sscfUunXrOve/+eabuvrqqxM/RyIRPf300yk/j4cbbrhBt956q7KysgJ93gEDBuiss87SfffdF+jzAkAYUaeoUwCA5o2xAGMBAA3D5DzQDHXo0EGFhYXpTuOoli1bpg8//FCjR49Oy/NfddVVevjhh1VTU5OW5weA5o46dWzUKQBAU8dY4NgYCwBNB5PzQIjdd999GjRokFq0aKEePXro2muv1d69eyVJr7zyiq666iqVlZUpEokoEoloxowZkpIvEezdu7ck6dJLL1UkEkn8fKQVEFOnTtX555+f+Hnfvn367ne/q5YtW6pLly6699576+RYWVmp6667Tt26dVOLFi00bNgwvfLKK8f8dy1cuFBf//rXlZ+fn3T/XXfdpU6dOqlVq1YaP368Dh48WOexP/vZz3TaaacpPz9f/fv319y5c5N+/+c//1mDBw9Wfn6+hg4dqqefflqRSESrV69OHPP1r39du3bt0quvvnrMPAEAx0adok4BAJo3xgKMBQAcG5PzQIhFo1E98MADWrdunebNm6elS5fqhhtukCSdffbZuv/++1VUVKQdO3Zox44duu666+rEePPNNyVJJSUl2rFjR+Ln+rj++uv16quv6plnntGLL76oV155RatWrUo6ZvLkyVq+fLkWLlyod999V5dffrm+8Y1v6IMPPjhq3Ndff11Dhw5Nuu+3v/2tZsyYoVmzZumtt95Sly5d6gxi5s+fr9tvv10zZ87U+++/r1mzZum2227TvHnzJEnl5eX61re+pUGDBmnVqlW64447dOONN9Z5/tzcXA0ePFivv/56vV8LAEBd1CnqFACgeWMswFgAwLFlpzsBAKk7fBOb3r17684779TEiRM1d+5c5ebmqri4WJFIRJ07dz5qjA4dOkiSWrdufczjvmzv3r36+c9/rl/96le68MILJUnz5s1T9+7dE8ds3bpVJSUl2rp1q7p27SpJuu666/TCCy+opKREs2bNOmLsjz76KHF8rfvvv1/jx4/X+PHjJUl33nmnXn755aSVCNOnT9e9996ryy67TJLUp08fvffee3rkkUc0duxYLViwQJFIRI8++qjy8/M1YMAAbd++XRMmTKiTQ9euXfXRRx/V+/UAANRFnaJOAQCaN8YCjAUAHBuT80CIvfzyy5o9e7bWr1+v8vJy1dTU6ODBg9q/f797f74PP/xQVVVVGjZsWOK+tm3b6tRTT038vGbNGsViMZ1yyilJj62srFS7du2OGvvAgQN1Lg98//33NXHixKT7hg8frj/96U+SDl2u+OGHH2r8+PFJA5eamhoVFxdLkjZs2KDTTz89KfaZZ555xBwKCgq0f//+o+YIADg+6hR1CgDQvDEWYCwA4NiYnAdCasuWLfrHf/xHXXPNNZo5c6batm2rZcuWafz48aqqqmrwQCcajcrMku6rrq4+oRh79+5VVlaWVq5cWWcH+5YtWx71ce3bt9fu3btP+Lkk6dFHH00afEmq89z1sWvXLp100kkn/DgAwCHUqbrPJVGnAADNB2OBus8lMRYAkIye80BIrVy5UvF4XPfee6/OOussnXLKKfrkk0+SjsnNzVUsFjturJycnDrHdejQQTt27Ei67/ANaE466STl5OToL3/5S+K+3bt3a+PGjYmfhwwZolgspk8//VQnn3xy0u1YlyMOGTJE7733XtJ9p512WtJzSdIbb7yR+O9OnTqpa9eu2rRpU53n6tOnjyTp1FNP1Zo1a1RZWZl43NH6Fa5du1ZDhgw5ao4AgGOjTlGnAADNG2MBxgIAjo/JeSDDlZWVafXq1Um3bdu26eSTT1Z1dbUefPBBbdq0Sb/85S/1k5/8JOmxvXv31t69e7VkyRJ9/vnnR73krXfv3lqyZIlKS0sT3/5fcMEFeuutt/T444/rgw8+0PTp07V27drEY1q2bKnx48fr+uuv19KlS7V27VqNGzdO0egXp5VTTjlFY8aM0Xe/+1099dRT2rx5s1asWKHZs2frueeeO+q/eeTIkVq2bFnSfVOmTNEvfvELlZSUaOPGjZo+fbrWrVuXdMx//Md/aPbs2XrggQe0ceNGrVmzRiUlJbrvvvskSf/6r/+qeDyuq6++Wu+//74WL16sOXPmSJIikUgizpYtW7R9+3aNGDHiqDkCAA6hTh1CnQIANFeMBQ5hLAAgJQYgY40dO9Yk1bmNHz/ezMzuu+8+69KlixUUFNjIkSPt8ccfN0m2e/fuRIyJEydau3btTJJNnz7dzMx69eplP/7xjxPHPPvss3byySdbdna29erVK3H/7bffbp06dbLi4mL74Q9/aJMnT7avfe1rid9XVFTYFVdcYYWFhdapUye7++677Wtf+5pNmTIlcUxVVZXdfvvt1rt3b8vJybEuXbrYpZdeau++++5R/91/+9vfLD8/39avX590/8yZM619+/bWsmVLGzt2rN1www32d3/3d0nHzJ8/3wYPHmy5ubnWpk0bO++88+ypp55K/P5///d/7fTTT7fc3Fw744wzbMGCBSYp6blmzZplI0eOPGp+AIBDqFPUKQBA88ZYgLEAgIaJmH2pQRcAZIDrr79e5eXleuSRR1yfZ/78+brqqqtUVlamgoICVVVVqV+/flqwYIHOOecc1+cGAIQXdQoAgOaNsQCAxkBbGwAZ6ZZbblGvXr0Uj8cbNe7jjz+uZcuWafPmzXr66ad144036p//+Z9VUFAgSdq6dav+/d//nUEOAOCYqFMAADRvjAUANAZWzgNoVu6++27NnTtXpaWl6tKli0aNGqWZM2eqsLAw3akBAECdAgCgmWMsADQvTM4DAAAAAAAAABAw2toAAAAAAAAAABAwJucBAAAAAAAAAAgYk/MAAAAAAAAAAASMyXkAAAAAAAAAAALG5DwAAAAAAAAAAAFjch4AAAAAAAAAgIAxOQ8AAAAAAAAAQMCYnAcAAAAAAAAAIGD/B3FQU7QtFobwAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axes = plt.subplots(1, 3, figsize=(15, 4), sharey=True, constrained_layout=True)\n", + "\n", + "value_min = float(min(zonal_nc.min().values, zonal_c.min().values))\n", + "value_max = float(max(zonal_nc.max().values, zonal_c.max().values))\n", + "\n", + "mesh_nc = axes[0].pcolormesh(\n", + " zonal_nc[\"lat\"],\n", + " levels,\n", + " zonal_nc.transpose(level_dim, \"lat\"),\n", + " shading=\"nearest\",\n", + " cmap=\"viridis\",\n", + " vmin=value_min,\n", + " vmax=value_max,\n", + ")\n", + "axes[0].set_title(\"Non-conservative (centers)\")\n", + "axes[0].set_xlabel(\"Latitude (deg)\")\n", + "axes[0].set_ylabel(level_dim)\n", + "axes[0].set_xlim(-90, 90)\n", + "\n", + "mesh_c = axes[1].pcolormesh(\n", + " zonal_c[\"lat\"],\n", + " levels,\n", + " zonal_c.transpose(level_dim, \"lat\"),\n", + " shading=\"nearest\",\n", + " cmap=\"viridis\",\n", + " vmin=value_min,\n", + " vmax=value_max,\n", + ")\n", + "axes[1].set_title(\"Conservative (bands)\")\n", + "axes[1].set_xlabel(\"Latitude (deg)\")\n", + "axes[1].set_xlim(-90, 90)\n", + "\n", + "diff_max = float(np.nanmax(np.abs(zonal_diff.values)))\n", + "if diff_max == 0:\n", + " diff_max = 1e-6\n", + "mesh_diff = axes[2].pcolormesh(\n", + " zonal_diff[\"lat\"],\n", + " levels,\n", + " zonal_diff.transpose(level_dim, \"lat\"),\n", + " shading=\"nearest\",\n", + " cmap=\"RdBu_r\",\n", + " vmin=-diff_max,\n", + " vmax=diff_max,\n", + ")\n", + "axes[2].set_title(\"Difference (conservative - non)\")\n", + "axes[2].set_xlabel(\"Latitude (deg)\")\n", + "axes[2].set_xlim(-90, 90)\n", + "\n", + "cbar_field = fig.colorbar(\n", + " mesh_nc, ax=[axes[0], axes[1]], orientation=\"vertical\", fraction=0.04, pad=0.02\n", + ")\n", + "cbar_field.set_label(\"RELHUM zonal mean\")\n", + "\n", + "cbar_diff = fig.colorbar(\n", + " mesh_diff, ax=[axes[2]], orientation=\"vertical\", fraction=0.08, pad=0.02\n", + ")\n", + "cbar_diff.set_label(\"RELHUM difference\")" + ] + }, + { + "cell_type": "markdown", + "id": "6530ad41", + "metadata": {}, + "source": [ + "### Step 6.4: Spot-check the difference numerically\n", + "\n", + "Visuals are helpful, but printing quick summary statistics and a few sample latitude bands makes it clear how large the conservative correction is." + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 50, "id": "2f6ff242", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Max absolute difference: 6.528\n", + "Mean absolute difference: 0.488\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'RELHUM_zonal_mean' (lev: 5)> Size: 20B\n",
+       "array([2.2769236e-06, 3.7543796e-06, 2.1681481e-06, 4.8164511e-06,\n",
+       "       2.9139337e-06], dtype=float32)\n",
+       "Coordinates:\n",
+       "  * lev      (lev) float64 40B 0.1238 0.1828 0.2699 0.3986 0.5885
" + ], + "text/plain": [ + " Size: 20B\n", + "array([2.2769236e-06, 3.7543796e-06, 2.1681481e-06, 4.8164511e-06,\n", + " 2.9139337e-06], dtype=float32)\n", + "Coordinates:\n", + " * lev (lev) float64 40B 0.1238 0.1828 0.2699 0.3986 0.5885" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "abs_diff = np.abs(zonal_diff)\n", "max_abs = float(abs_diff.max())\n", From dd1ce2d11d22905fa0c38511fd8062cee80370c8 Mon Sep 17 00:00:00 2001 From: Rajeev Jain Date: Mon, 17 Nov 2025 16:05:25 -0600 Subject: [PATCH 04/10] Clarify NE30 zonal mean narrative --- docs/user-guide/zonal-average.ipynb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/user-guide/zonal-average.ipynb b/docs/user-guide/zonal-average.ipynb index 137e6784e..5f7093027 100644 --- a/docs/user-guide/zonal-average.ipynb +++ b/docs/user-guide/zonal-average.ipynb @@ -2129,7 +2129,8 @@ "source": [ "## 6. 2D Zonal Means on NE30 (RELHUM)\n", "\n", - "Everything above uses a single-level field. The CAM-SE NE30 grid ships with a multi-level relative humidity field, so we can see how zonal averaging builds a latitude–height cross section. Each step below walks through the process with extra explanations for first-time users.\n" + "Everything above uses a single-level field. For the NE30 multi-level RELHUM data, we can see how a zonal mean collapses every longitude in each latitude ring—averaging the native face values with area weights—so the result becomes a latitude–height diagnostic, unlike a cross section that samples only a single path. Each step below walks through the process with extra explanations for first-time users.\n", + "\n" ] }, { @@ -2138,9 +2139,10 @@ "metadata": {}, "source": [ "```{tip}\n", - "`zonal_mean()` collapses longitude to build latitude-only diagnostics.\n", - "Use `.cross_section()` for path-based transects (great-circle or constant lat/lon lines) and see the [Cross-Sections](./cross-sections.ipynb) notebook for examples.\n", - "```\n" + "`zonal_mean()` averages the native cell values around each latitude ring (or band, for conservative mode) using area weights, so the result varies only with latitude plus any remaining vertical/time axes.\n", + "Use `.cross_section()` for path-based slices because it interpolates along a specified great-circle or constant-lon/lat line instead of averaging the entire ring; see the [Cross-Sections](./cross-sections.ipynb) notebook for those interpolation-based examples.\n", + "```\n", + "\n" ] }, { From a9d281bfe849e52971b6ed91ea5a3ee58bb2f662 Mon Sep 17 00:00:00 2001 From: Rajeev Jain Date: Mon, 17 Nov 2025 16:08:46 -0600 Subject: [PATCH 05/10] Clean up default latitude list --- docs/user-guide/zonal-average.ipynb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/user-guide/zonal-average.ipynb b/docs/user-guide/zonal-average.ipynb index 5f7093027..6474da80e 100644 --- a/docs/user-guide/zonal-average.ipynb +++ b/docs/user-guide/zonal-average.ipynb @@ -936,7 +936,8 @@ "# Inspect default latitude samples\n", "default_lats = zonal_mean_psi.coords[\"latitudes\"].values\n", "print(\"Default sample latitudes (10-degree spacing):\")\n", - "print(\", \".join(f\"{lat:.0f} deg\" for lat in default_lats))" + "print(f\"({', '.join(f'{lat:.0f}' for lat in default_lats)}) deg latitude\")\n", + "\n" ] }, { From 0bf0cb90c506f52e0ed60d8bc0528c18fe0fbaa4 Mon Sep 17 00:00:00 2001 From: Rajeev Jain Date: Tue, 18 Nov 2025 09:34:36 -0600 Subject: [PATCH 06/10] o Fix comments and text --- docs/user-guide/zonal-average.ipynb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/user-guide/zonal-average.ipynb b/docs/user-guide/zonal-average.ipynb index 6474da80e..de923ef5f 100644 --- a/docs/user-guide/zonal-average.ipynb +++ b/docs/user-guide/zonal-average.ipynb @@ -936,8 +936,7 @@ "# Inspect default latitude samples\n", "default_lats = zonal_mean_psi.coords[\"latitudes\"].values\n", "print(\"Default sample latitudes (10-degree spacing):\")\n", - "print(f\"({', '.join(f'{lat:.0f}' for lat in default_lats)}) deg latitude\")\n", - "\n" + "print(f\"({', '.join(f'{lat:.0f}' for lat in default_lats)}) deg latitude\")" ] }, { From bf52cd36c8b7608fc8c488ee8f5acff4177b16e8 Mon Sep 17 00:00:00 2001 From: Rajeev Jain Date: Thu, 20 Nov 2025 08:57:20 -0600 Subject: [PATCH 07/10] o Update documentation - Zonal notebook. --- uxarray/core/dataarray.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/uxarray/core/dataarray.py b/uxarray/core/dataarray.py index 64b6c096b..ae17dfdc3 100644 --- a/uxarray/core/dataarray.py +++ b/uxarray/core/dataarray.py @@ -514,7 +514,12 @@ def integrate( return uxda def zonal_mean(self, lat=(-90, 90, 10), conservative: bool = False, **kwargs): - """Compute non-conservative or conservative averages along lines of constant latitude or latitude bands. + """Compute non-conservative or conservative averages of a face-centered variable along lines of constant latitude or latitude bands. + + A zonal mean in UXarray operates differently depending on the ``conservative`` flag: + + - **Non-conservative**: Calculates the mean by sampling face values at specific latitude lines and weighting each face by the length of its intersection with that latitude. + - **Conservative**: Averages over latitude bands between adjacent lines and weights by the native face areas, preserving global integrals by construction. Parameters ---------- From 9619236e2fc16b3d861519025f7a3cb5d3e2f9c4 Mon Sep 17 00:00:00 2001 From: Rajeev Jain Date: Thu, 20 Nov 2025 08:58:15 -0600 Subject: [PATCH 08/10] o Update documentation - Zonal notebook. --- docs/user-guide/zonal-average.ipynb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/user-guide/zonal-average.ipynb b/docs/user-guide/zonal-average.ipynb index de923ef5f..7de45361d 100644 --- a/docs/user-guide/zonal-average.ipynb +++ b/docs/user-guide/zonal-average.ipynb @@ -228,14 +228,14 @@ "\n", "### Step 1.1: Understand the two averaging flavors\n", "\n", - "A zonal average (or zonal mean) is a statistical measure that represents the average of a variable along lines of constant latitude or over latitudinal bands.\n", + "A zonal average (or zonal mean) is a statistical measure that represents the average of a face-centered variable along lines of constant latitude or over latitudinal bands.\n", "\n", "UXarray provides two types of zonal averaging:\n", - "- **Non-conservative**: Samples values at specific latitude lines\n", + "- **Non-conservative**: Calculates the mean by sampling face values at specific latitude lines and weighting each contribution by the line where the face intersects that latitude.\n", "- **Conservative**: Preserves integral quantities by weighting faces by their area overlap with latitude bands\n", "\n", "```{seealso}\n", - "[NCL Zonal Average](https://www.ncl.ucar.edu/Applications/zonal.shtml)\n", + "[NCL Zonal Average](https://www.ncl.ucar.edu/Application/zonal.shtml) — NCL reference with conventional rectilinear grids.\n", "```\n" ] }, @@ -246,11 +246,12 @@ "source": [ "## 2. Non-Conservative Zonal Averaging\n", "\n", - "The non-conservative method samples values at specific lines of constant latitude. This is the default behavior and is suitable for visualization and general analysis where exact conservation is not required.\n", + "The non-conservative method samples face values at specific lines of constant latitude and weights each contribution by the length of the intersection between the face and that latitude circle. This is the default behavior and is suitable for visualization and general analysis where exact conservation is not required.\n", "\n", "### Step 2.1: Visualize the global field\n", "\n", - "Let's first visualize our data field and then demonstrate zonal averaging:\n" + "The non-conservative method samples face values at specific lines of constant latitude and calculates the average using intersection-line weights. Let's first visualize our data field and then demonstrate zonal averaging:\n", + "\n" ] }, { @@ -2129,7 +2130,7 @@ "source": [ "## 6. 2D Zonal Means on NE30 (RELHUM)\n", "\n", - "Everything above uses a single-level field. For the NE30 multi-level RELHUM data, we can see how a zonal mean collapses every longitude in each latitude ring—averaging the native face values with area weights—so the result becomes a latitude–height diagnostic, unlike a cross section that samples only a single path. Each step below walks through the process with extra explanations for first-time users.\n", + "Everything above uses a single-level field. For the NE30 multi-level RELHUM data, we can see how a zonal mean collapses every longitude in each latitude ring—averaging the native face values with intersection-line (non-conservative) or area (conservative) weights—so the result becomes a latitude–height diagnostic, unlike a cross section that interpolates to create a 2D output over a single path. Each step below walks through the process with extra explanations for first-time users.\n", "\n" ] }, @@ -2139,8 +2140,7 @@ "metadata": {}, "source": [ "```{tip}\n", - "`zonal_mean()` averages the native cell values around each latitude ring (or band, for conservative mode) using area weights, so the result varies only with latitude plus any remaining vertical/time axes.\n", - "Use `.cross_section()` for path-based slices because it interpolates along a specified great-circle or constant-lon/lat line instead of averaging the entire ring; see the [Cross-Sections](./cross-sections.ipynb) notebook for those interpolation-based examples.\n", + "`zonal_mean()` works directly on the native cell values to build latitude-only diagnostics. When you instead need interpolation along a specified great-circle or constant-lon/lat path, use `.cross_section()` to construct that transect and see the [Cross-Sections](./cross-sections.ipynb) guide for path-based examples.\n", "```\n", "\n" ] From 5cbbafa14c4cfe4e270fbaf7d8183f3ab04fdfff Mon Sep 17 00:00:00 2001 From: erogluorhan Date: Thu, 20 Nov 2025 14:45:50 -0700 Subject: [PATCH 09/10] Fix broken URL --- docs/user-guide/zonal-average.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user-guide/zonal-average.ipynb b/docs/user-guide/zonal-average.ipynb index 7de45361d..055e8ce25 100644 --- a/docs/user-guide/zonal-average.ipynb +++ b/docs/user-guide/zonal-average.ipynb @@ -235,7 +235,7 @@ "- **Conservative**: Preserves integral quantities by weighting faces by their area overlap with latitude bands\n", "\n", "```{seealso}\n", - "[NCL Zonal Average](https://www.ncl.ucar.edu/Application/zonal.shtml) — NCL reference with conventional rectilinear grids.\n", + "[NCL Zonal Average](https://www.ncl.ucar.edu/Applications/zonal.shtml) — NCL reference with conventional rectilinear grids.\n", "```\n" ] }, From a3d50c67052f69e461a1d3708729aceb8d5bf4ed Mon Sep 17 00:00:00 2001 From: erogluorhan Date: Thu, 20 Nov 2025 14:58:32 -0700 Subject: [PATCH 10/10] A few small rephrasing --- docs/user-guide/zonal-average.ipynb | 181 ++-------------------------- uxarray/core/dataarray.py | 6 +- 2 files changed, 13 insertions(+), 174 deletions(-) diff --git a/docs/user-guide/zonal-average.ipynb b/docs/user-guide/zonal-average.ipynb index 055e8ce25..4d4eb2f65 100644 --- a/docs/user-guide/zonal-average.ipynb +++ b/docs/user-guide/zonal-average.ipynb @@ -18,7 +18,7 @@ "## Notebook Roadmap\n", "\n", "- [1. Zonal Mean Basics](#1-zonal-mean-basics) — terminology and the two averaging flavors available in UXarray.\n", - "- [2. Non-Conservative Zonal Averaging](#2-non-conservative-zonal-averaging) — default sampling, plotting, and tuning latitude spacing.\n", + "- [2. Non-Conservative Zonal Averaging](#2-non-conservative-zonal-averaging) — default sampling, intersection-weighted averaging,plotting, and tuning latitude spacing.\n", "- [3. Conservative Zonal Averaging](#3-conservative-zonal-averaging) — area-weighted bands, conservation checks, and comparisons.\n", "- [4. Combined Plots](#4-combined-plots) — pair global maps with their zonal means for context.\n", "- [5. HEALPix Zonal Averaging (Conservative vs Non-Conservative)](#5-healpix-zonal-averaging-conservative-vs-non-conservative) — run the same workflow on a different grid.\n", @@ -27,7 +27,6 @@ }, { "cell_type": "code", - "execution_count": 33, "id": "185e2061bc4c75b9", "metadata": { "execution": { @@ -35,173 +34,11 @@ "iopub.status.busy": "2025-09-26T15:41:01.836130Z", "iopub.status.idle": "2025-09-26T15:41:05.102704Z", "shell.execute_reply": "2025-09-26T15:41:05.102291Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n const py_version = '3.7.3'.replace('rc', '-rc.').replace('.dev', '-dev.');\n const reloading = false;\n const Bokeh = root.Bokeh;\n\n // Set a timeout for this load but only if we are not already initializing\n if (typeof (root._bokeh_timeout) === \"undefined\" || (force || !root._bokeh_is_initializing)) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks;\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n if (js_exports == null) js_exports = {};\n\n root._bokeh_onload_callbacks.push(callback);\n\n if (root._bokeh_is_loading > 0) {\n // Don't load bokeh if it is still initializing\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n } else if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n // There is nothing to load\n run_callbacks();\n return null;\n }\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n window._bokeh_on_load = on_load\n\n function on_error(e) {\n const src_el = e.srcElement\n console.error(\"failed to load \" + (src_el.href || src_el.src));\n }\n\n const skip = [];\n if (window.requirejs) {\n window.requirejs.config({'packages': {}, 'paths': {}, 'shim': {}});\n root._bokeh_is_loading = css_urls.length + 0;\n } else {\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n }\n\n const existing_stylesheets = []\n const links = document.getElementsByTagName('link')\n for (let i = 0; i < links.length; i++) {\n const link = links[i]\n if (link.href != null) {\n existing_stylesheets.push(link.href)\n }\n }\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const escaped = encodeURI(url)\n if (existing_stylesheets.indexOf(escaped) !== -1) {\n on_load()\n continue;\n }\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n } var existing_scripts = []\n const scripts = document.getElementsByTagName('script')\n for (let i = 0; i < scripts.length; i++) {\n var script = scripts[i]\n if (script.src != null) {\n existing_scripts.push(script.src)\n }\n }\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const escaped = encodeURI(url)\n if (skip.indexOf(escaped) !== -1 || existing_scripts.indexOf(escaped) !== -1) {\n if (!window.requirejs) {\n on_load();\n }\n continue;\n }\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (let i = 0; i < js_modules.length; i++) {\n const url = js_modules[i];\n const escaped = encodeURI(url)\n if (skip.indexOf(escaped) !== -1 || existing_scripts.indexOf(escaped) !== -1) {\n if (!window.requirejs) {\n on_load();\n }\n continue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (const name in js_exports) {\n const url = js_exports[name];\n const escaped = encodeURI(url)\n if (skip.indexOf(escaped) >= 0 || root[name] != null) {\n if (!window.requirejs) {\n on_load();\n }\n continue;\n }\n var element = document.createElement('script');\n element.onerror = on_error;\n element.async = false;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n element.textContent = `\n import ${name} from \"${url}\"\n window.${name} = ${name}\n window._bokeh_on_load()\n `\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.holoviz.org/panel/1.8.2/dist/bundled/reactiveesm/es-module-shims@^1.10.0/dist/es-module-shims.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.7.3.min.js\", \"https://cdn.holoviz.org/panel/1.8.2/dist/panel.min.js\"];\n const js_modules = [];\n const js_exports = {};\n const css_urls = [];\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (let i = 0; i < inline_js.length; i++) {\n try {\n inline_js[i].call(root, root.Bokeh);\n } catch(e) {\n if (!reloading) {\n throw e;\n }\n }\n }\n // Cache old bokeh versions\n if (Bokeh != undefined && !reloading) {\n var NewBokeh = root.Bokeh;\n if (Bokeh.versions === undefined) {\n Bokeh.versions = new Map();\n }\n if (NewBokeh.version !== Bokeh.version) {\n Bokeh.versions.set(NewBokeh.version, NewBokeh)\n }\n root.Bokeh = Bokeh;\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n }\n root._bokeh_is_initializing = false\n }\n\n function load_or_wait() {\n // Implement a backoff loop that tries to ensure we do not load multiple\n // versions of Bokeh and its dependencies at the same time.\n // In recent versions we use the root._bokeh_is_initializing flag\n // to determine whether there is an ongoing attempt to initialize\n // bokeh, however for backward compatibility we also try to ensure\n // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n // before older versions are fully initialized.\n if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n // If the timeout and bokeh was not successfully loaded we reset\n // everything and try loading again\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_is_initializing = false;\n root._bokeh_onload_callbacks = undefined;\n root._bokeh_is_loading = 0\n console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n load_or_wait();\n } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n setTimeout(load_or_wait, 100);\n } else {\n root._bokeh_is_initializing = true\n root._bokeh_onload_callbacks = []\n const bokeh_loaded = root.Bokeh != null && (root.Bokeh.version === py_version || (root.Bokeh.versions !== undefined && root.Bokeh.versions.has(py_version)));\n if (!reloading && !bokeh_loaded) {\n if (root.Bokeh) {\n root.Bokeh = undefined;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n }\n load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n }\n // Give older versions of the autoload script a head-start to ensure\n // they initialize before we start loading newer version.\n setTimeout(load_or_wait, 100)\n}(window));", - "application/vnd.holoviews_load.v0+json": "" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/javascript": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n let retries = 0;\n const open = () => {\n if (comm.active) {\n comm.open();\n } else if (retries > 3) {\n console.warn('Comm target never activated')\n } else {\n retries += 1\n setTimeout(open, 500)\n }\n }\n if (comm.active) {\n comm.open();\n } else {\n setTimeout(open, 500)\n }\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n })\n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n", - "application/vnd.holoviews_load.v0+json": "" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.holoviews_exec.v0+json": "", - "text/html": [ - "
\n", - "
\n", - "
\n", - "" - ] - }, - "metadata": { - "application/vnd.holoviews_exec.v0+json": { - "id": "6a3813ab-0447-4652-9490-44b2c7d3a050" - } - }, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" }, - { - "data": { - "application/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = false;\n const py_version = '3.7.3'.replace('rc', '-rc.').replace('.dev', '-dev.');\n const reloading = true;\n const Bokeh = root.Bokeh;\n\n // Set a timeout for this load but only if we are not already initializing\n if (typeof (root._bokeh_timeout) === \"undefined\" || (force || !root._bokeh_is_initializing)) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks;\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n if (js_exports == null) js_exports = {};\n\n root._bokeh_onload_callbacks.push(callback);\n\n if (root._bokeh_is_loading > 0) {\n // Don't load bokeh if it is still initializing\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n } else if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n // There is nothing to load\n run_callbacks();\n return null;\n }\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n window._bokeh_on_load = on_load\n\n function on_error(e) {\n const src_el = e.srcElement\n console.error(\"failed to load \" + (src_el.href || src_el.src));\n }\n\n const skip = [];\n if (window.requirejs) {\n window.requirejs.config({'packages': {}, 'paths': {}, 'shim': {}});\n root._bokeh_is_loading = css_urls.length + 0;\n } else {\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n }\n\n const existing_stylesheets = []\n const links = document.getElementsByTagName('link')\n for (let i = 0; i < links.length; i++) {\n const link = links[i]\n if (link.href != null) {\n existing_stylesheets.push(link.href)\n }\n }\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const escaped = encodeURI(url)\n if (existing_stylesheets.indexOf(escaped) !== -1) {\n on_load()\n continue;\n }\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n } var existing_scripts = []\n const scripts = document.getElementsByTagName('script')\n for (let i = 0; i < scripts.length; i++) {\n var script = scripts[i]\n if (script.src != null) {\n existing_scripts.push(script.src)\n }\n }\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const escaped = encodeURI(url)\n if (skip.indexOf(escaped) !== -1 || existing_scripts.indexOf(escaped) !== -1) {\n if (!window.requirejs) {\n on_load();\n }\n continue;\n }\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (let i = 0; i < js_modules.length; i++) {\n const url = js_modules[i];\n const escaped = encodeURI(url)\n if (skip.indexOf(escaped) !== -1 || existing_scripts.indexOf(escaped) !== -1) {\n if (!window.requirejs) {\n on_load();\n }\n continue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (const name in js_exports) {\n const url = js_exports[name];\n const escaped = encodeURI(url)\n if (skip.indexOf(escaped) >= 0 || root[name] != null) {\n if (!window.requirejs) {\n on_load();\n }\n continue;\n }\n var element = document.createElement('script');\n element.onerror = on_error;\n element.async = false;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n element.textContent = `\n import ${name} from \"${url}\"\n window.${name} = ${name}\n window._bokeh_on_load()\n `\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.holoviz.org/panel/1.8.2/dist/bundled/reactiveesm/es-module-shims@^1.10.0/dist/es-module-shims.min.js\"];\n const js_modules = [];\n const js_exports = {};\n const css_urls = [];\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (let i = 0; i < inline_js.length; i++) {\n try {\n inline_js[i].call(root, root.Bokeh);\n } catch(e) {\n if (!reloading) {\n throw e;\n }\n }\n }\n // Cache old bokeh versions\n if (Bokeh != undefined && !reloading) {\n var NewBokeh = root.Bokeh;\n if (Bokeh.versions === undefined) {\n Bokeh.versions = new Map();\n }\n if (NewBokeh.version !== Bokeh.version) {\n Bokeh.versions.set(NewBokeh.version, NewBokeh)\n }\n root.Bokeh = Bokeh;\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n }\n root._bokeh_is_initializing = false\n }\n\n function load_or_wait() {\n // Implement a backoff loop that tries to ensure we do not load multiple\n // versions of Bokeh and its dependencies at the same time.\n // In recent versions we use the root._bokeh_is_initializing flag\n // to determine whether there is an ongoing attempt to initialize\n // bokeh, however for backward compatibility we also try to ensure\n // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n // before older versions are fully initialized.\n if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n // If the timeout and bokeh was not successfully loaded we reset\n // everything and try loading again\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_is_initializing = false;\n root._bokeh_onload_callbacks = undefined;\n root._bokeh_is_loading = 0\n console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n load_or_wait();\n } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n setTimeout(load_or_wait, 100);\n } else {\n root._bokeh_is_initializing = true\n root._bokeh_onload_callbacks = []\n const bokeh_loaded = root.Bokeh != null && (root.Bokeh.version === py_version || (root.Bokeh.versions !== undefined && root.Bokeh.versions.has(py_version)));\n if (!reloading && !bokeh_loaded) {\n if (root.Bokeh) {\n root.Bokeh = undefined;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n }\n load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n }\n // Give older versions of the autoload script a head-start to ensure\n // they initialize before we start loading newer version.\n setTimeout(load_or_wait, 100)\n}(window));", - "application/vnd.holoviews_load.v0+json": "" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/javascript": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n let retries = 0;\n const open = () => {\n if (comm.active) {\n comm.open();\n } else if (retries > 3) {\n console.warn('Comm target never activated')\n } else {\n retries += 1\n setTimeout(open, 500)\n }\n }\n if (comm.active) {\n comm.open();\n } else {\n setTimeout(open, 500)\n }\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n })\n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n", - "application/vnd.holoviews_load.v0+json": "" - }, - "metadata": {}, - "output_type": "display_data" + "jupyter": { + "is_executing": true } - ], + }, "source": [ "from pathlib import Path\n", "\n", @@ -217,7 +54,9 @@ " \"../../test/meshfiles/ugrid/outCSne30/outCSne30.ug\",\n", " \"../../test/meshfiles/ugrid/outCSne30/outCSne30_vortex.nc\",\n", ")" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "markdown", @@ -231,8 +70,8 @@ "A zonal average (or zonal mean) is a statistical measure that represents the average of a face-centered variable along lines of constant latitude or over latitudinal bands.\n", "\n", "UXarray provides two types of zonal averaging:\n", - "- **Non-conservative**: Calculates the mean by sampling face values at specific latitude lines and weighting each contribution by the line where the face intersects that latitude.\n", - "- **Conservative**: Preserves integral quantities by weighting faces by their area overlap with latitude bands\n", + "- **Non-conservative**: Calculates the mean by sampling face values at specific latitude lines and weighting each contribution by the length of the line where each face intersects that latitude.\n", + "- **Conservative**: Preserves integral quantities by calculating the mean by sampling face values within latitude bands and weighting contributions by their area overlap with latitude bands.\n", "\n", "```{seealso}\n", "[NCL Zonal Average](https://www.ncl.ucar.edu/Applications/zonal.shtml) — NCL reference with conventional rectilinear grids.\n", @@ -246,7 +85,7 @@ "source": [ "## 2. Non-Conservative Zonal Averaging\n", "\n", - "The non-conservative method samples face values at specific lines of constant latitude and weights each contribution by the length of the intersection between the face and that latitude circle. This is the default behavior and is suitable for visualization and general analysis where exact conservation is not required.\n", + "The non-conservative method samples face values at specific lines of constant latitude and weights each contribution by the length of the intersection between the face and that latitude. This is the default behavior and is suitable for visualization and general analysis where exact conservation is not required.\n", "\n", "### Step 2.1: Visualize the global field\n", "\n", diff --git a/uxarray/core/dataarray.py b/uxarray/core/dataarray.py index ae17dfdc3..7ad62050c 100644 --- a/uxarray/core/dataarray.py +++ b/uxarray/core/dataarray.py @@ -518,8 +518,8 @@ def zonal_mean(self, lat=(-90, 90, 10), conservative: bool = False, **kwargs): A zonal mean in UXarray operates differently depending on the ``conservative`` flag: - - **Non-conservative**: Calculates the mean by sampling face values at specific latitude lines and weighting each face by the length of its intersection with that latitude. - - **Conservative**: Averages over latitude bands between adjacent lines and weights by the native face areas, preserving global integrals by construction. + - **Non-conservative**: Calculates the mean by sampling face values at specific latitude lines and weighting each contribution by the length of the line where each face intersects that latitude. + - **Conservative**: Preserves integral quantities by calculating the mean by sampling face values within latitude bands and weighting contributions by their area overlap with latitude bands. Parameters ---------- @@ -531,7 +531,7 @@ def zonal_mean(self, lat=(-90, 90, 10), conservative: bool = False, **kwargs): - array-like: For non-conservative, latitudes to sample. For conservative, band edges. conservative : bool, default=False If True, performs conservative (area-weighted) zonal averaging over latitude bands. - If False, performs traditional (non-conservative) averaging at latitude lines. + If False, performs non-conservative (intersection-weighted) averaging at latitude lines. Returns -------