From e535ba648d3141a85d01b1e2717cc1c644d4ee1d Mon Sep 17 00:00:00 2001 From: Oliver Elbert Date: Fri, 19 Apr 2024 09:47:18 -0400 Subject: [PATCH 01/75] working baroclinic test case example (#81) --- constraints.txt | 2 +- examples/notebooks/baroclinic_c20.yaml | 100 ++++ examples/notebooks/baroclinic_example.ipynb | 545 ++++++++++++++++++++ 3 files changed, 646 insertions(+), 1 deletion(-) create mode 100644 examples/notebooks/baroclinic_c20.yaml create mode 100644 examples/notebooks/baroclinic_example.ipynb diff --git a/constraints.txt b/constraints.txt index 110d3ebf1..5c88c4ca0 100644 --- a/constraints.txt +++ b/constraints.txt @@ -288,7 +288,7 @@ pickleshare==0.7.5 # via ipython pkgutil-resolve-name==1.3.10 # via jsonschema -platformdirs==3.9.1 +platformdirs==2.6.2 # via # black # virtualenv diff --git a/examples/notebooks/baroclinic_c20.yaml b/examples/notebooks/baroclinic_c20.yaml new file mode 100644 index 000000000..46db5fd04 --- /dev/null +++ b/examples/notebooks/baroclinic_c20.yaml @@ -0,0 +1,100 @@ +stencil_config: + compilation_config: + backend: numpy + rebuild: true + validate_args: true + format_source: false + device_sync: false +initialization: + type: analytic + config: + case: baroclinic +grid_config: + type: generated + config: + eta_file: 'eta79.nc' +performance_config: + collect_performance: false + experiment_name: c20_baroclinic +nx_tile: 20 +nz: 79 +dt_atmos: 225 +minutes: 15 +layout: + - 1 + - 1 +diagnostics_config: + path: output.zarr + names: + - u + - v + - ua + - va + - pt + - delp + - qvapor + - qliquid + - qice + - qrain + - qsnow + - qgraupel + - qcld + z_select: + - level: 30 + names: + - pt +dycore_config: + a_imp: 1.0 + beta: 0. + consv_te: 0. + d2_bg: 0. + d2_bg_k1: 0.2 + d2_bg_k2: 0.1 + d4_bg: 0.15 + d_con: 1.0 + d_ext: 0.0 + dddmp: 0.5 + delt_max: 0.002 + do_sat_adj: true + do_vort_damp: true + fill: true + hord_dp: 6 + hord_mt: 6 + hord_tm: 6 + hord_tr: 8 + hord_vt: 6 + hydrostatic: false + k_split: 1 + ke_bg: 0. + kord_mt: 9 + kord_tm: -9 + kord_tr: 9 + kord_wz: 9 + n_split: 1 + nord: 3 + nwat: 6 + p_fac: 0.05 + rf_cutoff: 3000. + rf_fast: true + tau: 10. + vtdm4: 0.06 + z_tracer: true + do_qa: true + tau_i2s: 1000. + tau_g2v: 1200. + ql_gen: 0.001 + ql_mlt: 0.002 + qs_mlt: 0.000001 + qi_lim: 1.0 + dw_ocean: 0.1 + dw_land: 0.15 + icloud_f: 0 + tau_l2v: 300. + tau_v2l: 90. + fv_sg_adj: 0 + n_sponge: 48 + +physics_config: + hydrostatic: false + nwat: 6 + do_qa: true diff --git a/examples/notebooks/baroclinic_example.ipynb b/examples/notebooks/baroclinic_example.ipynb new file mode 100644 index 000000000..bdd0fbb23 --- /dev/null +++ b/examples/notebooks/baroclinic_example.ipynb @@ -0,0 +1,545 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "88a7130d", + "metadata": {}, + "source": [ + "# Running a baroclinic instability test case\n", + "\n", + "First we set up the mpi environment:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c712d4f3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Starting 6 engines with \n", + "100%|███████████████████████████████████████████████████████| 6/6 [00:05<00:00, 1.08engine/s]\n", + "%autopx enabled\n" + ] + } + ], + "source": [ + "import ipyparallel as ipp\n", + "ntiles = 6\n", + "layout = (1, 1)\n", + "\n", + "num_ranks = ntiles * layout[0] * layout[1]\n", + "cluster = ipp.Cluster(engines=\"mpi\", n=num_ranks).start_and_connect_sync()\n", + "\n", + "# start executing cells on the workers in parallel from here on\n", + "%autopx" + ] + }, + { + "cell_type": "markdown", + "id": "7c115161", + "metadata": {}, + "source": [ + "Double-check the MPI setup:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "3942150f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[stdout:1] I am MPI-rank 1 of a total of 6\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[stdout:5] I am MPI-rank 5 of a total of 6\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[stdout:3] I am MPI-rank 3 of a total of 6\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[stdout:2] I am MPI-rank 2 of a total of 6\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[stdout:0] I am MPI-rank 0 of a total of 6\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[stdout:4] I am MPI-rank 4 of a total of 6\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from mpi4py import MPI\n", + "\n", + "mpi_comm = MPI.COMM_WORLD\n", + "mpi_size = mpi_comm.Get_size()\n", + "mpi_rank = mpi_comm.Get_rank()\n", + "\n", + "print(f\"I am MPI-rank {mpi_rank} of a total of {mpi_size}\")" + ] + }, + { + "cell_type": "markdown", + "id": "793a5c25", + "metadata": {}, + "source": [ + "Next we set up the model driver using the yaml config file:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cb705ca6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "%px: 100%|███████████████████████████████████████████████████| 6/6 [03:10<00:00, 31.74s/tasks]\n" + ] + } + ], + "source": [ + "%%capture\n", + "\n", + "from pace import Driver, DriverConfig\n", + "import yaml\n", + "\n", + "config_file = \"baroclinic_c20.yaml\"\n", + "\n", + "with open(config_file, \"r\") as f:\n", + " driver_config = DriverConfig.from_dict(yaml.safe_load(f))\n", + "driver = Driver(config=driver_config)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "474be0bc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[stdout:0] (27, 27)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "if mpi_rank == 0:\n", + " print(driver.state.grid_data.lon_agrid.shape)" + ] + }, + { + "cell_type": "markdown", + "id": "87ac7255", + "metadata": {}, + "source": [ + "We can inspect the initial model state:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "4337eed3", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from cartopy import crs as ccrs\n", + "from fv3viz import pcolormesh_cube\n", + "from ndsl import CubedSphereCommunicator\n", + "\n", + "communicator = CubedSphereCommunicator.from_layout(\n", + " comm=driver.comm,\n", + " layout=driver.config.layout,\n", + ")\n", + "u_wind = communicator.gather(driver.state.dycore_state.u)\n", + "temperature = communicator.gather(driver.state.dycore_state.pt)\n", + "surface_pressure = communicator.gather(driver.state.dycore_state.ps)\n", + "grid_lon = communicator.gather(driver.state.grid_data.lon)\n", + "grid_lat = communicator.gather(driver.state.grid_data.lat)\n", + "a_lon = communicator.gather(driver.state.grid_data.lon_agrid)\n", + "a_lat = communicator.gather(driver.state.grid_data.lat_agrid)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "60b1e63b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[output:0]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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Gg0aNECVKlVw3XXXoUePHqhduzbuvvtuTJw4ER6PB2+//TYqV66Mo0ePqvq8EydOxOrVq3H99ddj+PDhaNWqFS5cuIA9e/ZgxYoV+OuvvwJuJSCmf//+mDFjBjZv3owePXr4n3/44YexevVq9OvXD5mZmXj33XcD3ifc8Oexxx7D8uXL0aVLFzz44IPIzc3Fc889h8svvxwjRoyQrf/+/fvxxBNPYPjw4ejXrx+A0qmXLVu2xP333y97n72///4bN9xwA1wuF2699VYsX7484PXmzZv7EzA1a9bEuHHj8Nxzz6G4uBitW7fGp59+iq1bt+K9994LOkVSiBpt9evXD126dMGUKVPw119/oUWLFvj666+xatUqjBs3zm/sjRJMU02bNkXnzp3994H78ccfsWLFioANY+QoKipC165dMXDgQPz+++94/fXXcc011+CGG24AUDpSNn/+fNx555248sorMWjQIL9eP//8c3To0KGMwdXymQBgypQpGDRoECIjI9GvX78yt6iRwu12480330Tv3r3RrFkzjBgxAjVq1MCJEyewceNGJCUl4bPPPvMfv2vXLmRmZqJ///666koQhDX4OBd8HNvpmnrL83q9WL58OS5cuIB27dph165dKC4uDpg90LhxY9SuXRvbt29H27ZtsX37dlx++eUB0zd79uyJ0aNH47fffsMVV1xh+PPoxoYdPQnCkezYsYPr3bs3l5aWxkVGRnKNGjXiZs6cGbBN+5EjR7gBAwZwdevW5WJiYri4uDiuVatW3IIFCwK29ebJz8/nJkyYwKWlpXHR0dFc69atJbfql6JTp05cs2bNyjw/bNgwrk6dOv6/+VsoPPfcc7Llfffdd1zbtm252NhYrnr16twjjzziv32B8DYFSohvocCzcOFCrlWrVlxsbCyXmJjIXX755dwjjzzC/fPPP/5j6tSpI7n9OwBuzJgxAc9Jfa5hw4Zx8fHx3OHDh7kePXpwcXFxXNWqVbmpU6dyXq+XaZ04juNWr17NNW/enIuJieHq1q3LzZkzh3v77bfLbAOfkZHB9e3bl0tMTOQABGx9v2vXLq5NmzZcVFQUV7t2be7FF18MeguFYPXIycnhJk+ezDVo0ICLioriKlWqxLVv3557/vnnA7bDD0bz5s25u+++O+A5/hYdwR5i9u7d6//OU1JSuCFDhnAZGRmy5y0p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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "engine": 0 + }, + "output_type": "display_data" + } + ], + "source": [ + "if mpi_rank == 0:\n", + " u_mean = 0.5 * (u_wind.data[:,:,:-1, :] + u_wind.data[:,:, 1:, :])\n", + " \n", + " nx = temperature.shape[1]\n", + " fig = plt.figure(figsize=(12, 6))\n", + " ax = fig.add_subplot(111, projection=ccrs.Robinson())\n", + " f1 = pcolormesh_cube(\n", + " grid_lat.data * 180./np.pi,\n", + " grid_lon.data * 180./np.pi,\n", + " temperature.data[:, :, :, -2],\n", + " cmap=\"viridis\",\n", + " )\n", + " plt.colorbar(f1, label=\"Temperature (K)\")\n", + " ax.set_title(f\"850 hPa Temperature ({nx} x {nx} points per tile)\")\n", + " \n", + "# fig = plt.figure(figsize=(12, 6))\n", + "# ax = fig.add_subplot(111, projection=ccrs.Robinson())\n", + "# f1 = pcolormesh_cube(\n", + "# grid_lat.data * 180./np.pi,\n", + "# grid_lon.data * 180./np.pi,\n", + "# surface_pressure.data[:, :, :]/100.,\n", + "# cmap=\"viridis\",\n", + "# )\n", + "# plt.colorbar(f1, label=\"Surface Pressure (hPa)\")\n", + "# ax.set_title(f\"Surface Pressure ({nx} x {nx} points per tile)\")\n", + " \n", + " \n", + "# fig = plt.figure(figsize=(12, 6))\n", + "# ax = fig.add_subplot(111, projection=ccrs.Robinson())\n", + "# f1 = pcolormesh_cube(\n", + "# grid_lat.data * 180./np.pi,\n", + "# grid_lon.data * 180./np.pi,\n", + "# u_mean[:,:,:,65],\n", + "# cmap=\"bwr\",\n", + "# )\n", + "# plt.colorbar(f1, label=\"U wind (m/s)\")\n", + "# ax.set_title(f\"U Wind ({nx} x {nx} points per tile)\")" + ] + }, + { + "cell_type": "markdown", + "id": "2abf1e02", + "metadata": {}, + "source": [ + "And then we can run the model:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "c962da72", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "%px: 100%|███████████████████████████████████████████████████| 6/6 [00:10<00:00, 1.77s/tasks]\n" + ] + } + ], + "source": [ + "try:\n", + " driver.step_all()\n", + "finally:\n", + " driver.cleanup()" + ] + }, + { + "cell_type": "markdown", + "id": "30a7102a", + "metadata": {}, + "source": [ + "Now let's investigate the model state" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "65213533", + "metadata": {}, + "outputs": [], + "source": [ + "u_wind = communicator.gather(driver.state.dycore_state.u)\n", + "temperature = communicator.gather(driver.state.dycore_state.pt)\n", + "surface_pressure = communicator.gather(driver.state.dycore_state.ps)\n", + "grid_lon = communicator.gather(driver.state.grid_data.lon)\n", + "grid_lat = communicator.gather(driver.state.grid_data.lat)\n", + "a_lon = communicator.gather(driver.state.grid_data.lon_agrid)\n", + "a_lat = communicator.gather(driver.state.grid_data.lat_agrid)\n", + "qvap = communicator.gather(driver.state.dycore_state.qvapor)\n", + "qcld = communicator.gather(driver.state.dycore_state.qcld)\n", + "qrain = communicator.gather(driver.state.dycore_state.qrain)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "09062a68", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[output:0]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "engine": 0 + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[output:0]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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uHFj9+/vuOMOyfJKlSqF+fPno1evXnjzzTfx2GOPwel0YvDgwShatKiqhToYYzhz5oyHgT116hTOnj2L22+/3ef8xo0b46uvvpJV9nvvvYerV69i1KhRuHHjBl5//XXceeed2L9/P0qXLg0A2LhxI7p06YLKlStjypQpuH79Ot588020aNECu3fvDnrv//zzT/Ts2RPDhg3DoEGDsHjxYgwePBgNGzbELbfcglatWuGxxx7DG2+8gf/85z/uz71WrVo4e/YsOnbsiNTUVEycOBHFihXD0aNHJU2cFIcPH0afPn3w8MMPY9CgQViyZAl69eqFdevWuXWdnZ2N1q1b49SpU3jooYdQoUIF/PDDD5g0aRJOnz6NOXPmeJQp9T2T4v3333d/n1zZWFcbIwen04m7774b3333HUaOHIlatWph//79mD17Ng4dOuQzt7Bhw4ZgjOGHH35A9+7dZV+HIIjQxAkBDigbbi+nTCIIjCAIrnz99dfMbrczu93OmjVrxp566im2fv16lpub63He33//zQCwJUuW+JQBgE2ePNn98+TJkxkA1q9fP59zlyxZwgCwn3/+2eP17Oxsn3OnTZvGBEFgx44dc7/WqlUrVrRoUY/XGGPM6XS6/z1s2DBWtmxZdv78eY9z+vbty5KTkyWvJaZixYqsY8eO7Ny5c+zcuXNs7969rG/fvgwAGzNmDGPs5ueRlJTEzp496/H37dq1Y7feeiu7ceOGR/2aN2/OqlWr5n6tXr16rFu3bn7rcfHiRQaAvfLKKwHr6/35i9/HoEGD3D+7Pvs77riD5efnu1+/evUqK1asGBsxYoTH32dmZrLk5GSf17155513GAC2f//+gOcxxlhOTg6rXbs2q1SpEsvLy3O/3q1bN1a5cmWf87OyshgANnHixKBl9+vXjxUpUoQdOnSIvfLKKwwAW7VqVdC/k+L9999nANi7777rfu3nn39mANh7773nc/6ECRMYAI977o1LM/Hx8ezkyZPu13fs2MEAsCeeeML9Wv369VmpUqXYv//+635t7969zGazsYEDB7pfc93Tv//+2/1axYoVGQC2detW92tnz55lsbGx7Mknn3S/tmLFCgaAbd682aOen3/+ueR3VA6ua69cudL92uXLl1nZsmVZgwYN3K+9+OKLLCEhgR06dMjj7ydOnMjsdjs7fvw4Yyzw98wfCQkJHrp3IfVZtW7dmrVu3dr98/vvv89sNhvbtm2bx98uWLCAAWDff/+9x+v//PMPA8BmzJghq24EQYQmly9fZgDY7t9Ls0MnynI9dv9emgFgly9fll2fuXPnsooVK7LY2FjWuHFjtmPHjoDnX7x4kT366KOsTJkyLCYmhlWrVo2tWbNG68diGDQElCA406FDB2zfvh1333039u7di5kzZ6JTp05IS0vzGbKoFCWLpcTHx7v/nZWVhfPnz6N58+ZgjOGXX34BAJw7dw5bt27F0KFDPYbgAXAv6sAYw8qVK3HXXXeBMYbz58+7j06dOuHy5cvYvXt30Pp8/fXXSE1NRWpqKurVq4cVK1ZgwIABmDFjhsd5999/P1JTU90/X7hwAd988w169+6Nq1evuq/977//olOnTjh8+DBOnToFoGAO0W+//YbDhw/7/UxiYmKwZcsWXLx4UcanKI8RI0Z4zIXasGEDLl26hH79+nl8Xna7HU2aNMHmzZsDlvfvv/8CAFJSUoJee/To0fj9998xd+5cREXdHNRx/fp1xMbG+pwfFxfn/n0w5s6di+TkZPTs2RPPPvssBgwYgB49egT9O28OHDiAUaNGoVmzZu4hy+I6aK3nPffc4zFXsnHjxmjSpIk7g3j69Gns2bMHgwcP9sh01a1bFx06dJCVaaxduzZatmzp/jk1NRU1atTAX3/9FfRvXcPBv/zyS+Tl5QU935ty5cq5s9wAkJSUhIEDB+KXX35xZ39XrFiBli1bIiUlxUNz7du3h8PhwNatWz3K9P6e6cWKFStQq1Yt1KxZ06Ned955JwD4fBdcmj9//rzudSMIwnycTJ9DCcuXL8e4ceMwefJk7N69G/Xq1UOnTp38rtuQm5uLDh064OjRo/j0009x8OBBLFq0yOM5ZHVoCChB6ECjRo3w2WefITc3F3v37sXnn3+O2bNno2fPntizZw9q166tqtxKlSrJPvf48eN47rnnsHr1ah+zc/nyZQBwB6+BhqqeO3cOly5dwsKFC7Fw4ULJc+QsbtOkSRO89NJLEAQBRYoUQa1atSTnSXq/xz///BOMMTz77LN49tln/V4/LS0NL7zwAnr06IHq1aujTp066Ny5MwYMGIC6desCKDAaM2bMwJNPPonSpUujadOm6N69OwYOHIgyZcoEfQ/+8K6zy4C6glxv5K5KxoIs0vzKK69g0aJFePHFF9G1a1eP38XHx0vOsXItsS/uIPBH8eLF8cYbb6BXr14oXbo03njjDVn1FpOZmYlu3bohOTkZn376qYdRdtVBaz2rVavm85p4DuGxY8cAADVq1PA5r1atWli/fn3QxXu8O0iAArMipyOhdevWuP/++/H8889j9uzZaNOmDe655x488MADkubXm6pVq/qsSFq9enUABXP6ypQpg8OHD2Pfvn1+TZ33d1RJW6KFw4cP448//pBdL5fmla7AShAEoZbXXnsNI0aMwJAhQwAACxYswJo1a7B48WJMnDjR5/zFixfjwoUL+OGHHxAdHQ0AqqeQmAUZQILQkZiYGDRq1AiNGjVC9erVMWTIEKxYsQKTJ0/2G+BI7efmQk4w7CqjQ4cOuHDhAp5++mnUrFkTCQkJOHXqFAYPHuyxKEQwXOf279/fI3sjxmWwAlGyZElZ21R4v0fX9cePH49OnTpJ/o1r5ctWrVrhyJEj+OKLL/D111/jnXfewezZs7FgwQIMHz4cAPD444/jrrvuwqpVq7B+/Xo8++yzmDZtGr755hs0aNAgYN383Rt/dX7//fcljaU4UyeFa17kxYsXPRaVEbN06VI8/fTTePjhh/F///d/Pr8vW7YsNm/eDMaYh9ZOnz4NoCCrJIf169e763Ly5ElFq81evnwZXbp0waVLl7Bt2zafa5YtW9ajTmJOnz6N4sWLyzJIRuBvtctgJh0oMDOffvopfvzxR/zvf//D+vXrMXToULz66qv48ccf3fs8asHpdKJDhw546qmnJH/vMowu5LYlWnE6nbj11lvx2muvSf4+PT3d42eXoRbPZyUIInxx6DAH0FXelStXPF6PjY31eabk5uZi165dmDRpkvs1m82G9u3b+10sbfXq1WjWrBlGjRqFL774AqmpqXjggQfw9NNPh8wq0mQACcIgXAtduIJd11CnS5cueZznylZoYf/+/Th06BCWLVuGgQMHul8Xr4YJAJUrVwYAyRUTXaSmpqJo0aJwOBym7DPoqmN0dLSs6xcvXhxDhgzBkCFDcO3aNbRq1QpTpkxxG0CgYBGLJ598Ek8++SQOHz6M+vXr49VXX3VvT5CSkuJzX3JzcyWNihSuRTJKlSql6jOrWbMmAODvv//Grbfe6vP7L774AsOHD8d9992HefPmSZZRv359vPPOO/jjjz88Ms47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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "engine": 0 + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[output:0]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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KDGMAtLS0vDOO+9g2bJlmD59Om699Vbs2rUr0odFEARBEEQUwpoEqtm5cyc6duyI6dOnY9myZXj77beRlpbm8NESsYxPkhx5WWXGjBlo0KABUlNT0b59e3zzzTeG2y9atAgtWrRAamoqbrjhBixfvjzsc0mS8Nxzz6FOnTqoUKECevTogX379oVt89JLL+HWW29FxYoVUa1aNcvH7ASUGEYRXbp0wffff4+srCx06NABEyZMwOXLlyN9WARBEARBeBTeJFDJ5cuXMX78eHTs2BE9evTA999/T1VCImZYsGABxo4di+effx7fffcdWrdujV69euHXX3/V3H7Tpk0YMmQIHnzwQWzfvh39+vVDv379sHv37tA2U6ZMwdtvv42ZM2diy5YtSEtLQ69evVBQUBDapqioCAMGDMAjjzzi+O/Iik+S6A7NaGTXrl0YMWIEzpw5g5kzZ6JHjx6a29E0UoIgCIKIX+w+wmrNmjX44x//iJo1a+K9996jR1AQQsjNzUXVqlXRre0EJCamCm27pKQA67ZNxoULF1ClShXT7du3b4+bb74Z06dPB1D66JX69evj0Ucfxfjx48ttP2jQIOTl5eHzzz8PvdehQwdkZmZi5syZkCQJdevWxZNPPolx48YBAC5cuID09HTMmTMHgwcPDmtvzpw5GDNmDM6fP2/jtxYDVQyjlBtvvBGbNm3C448/jrvvvhv3338/Tp06FenDIgiCIAgiBjh16hSGDh2Ku+++G2PGjMHGjRspKSRijqKiImzbti2swOL3+9GjRw9s3rxZ8zubN28uV5Dp1atXaPtDhw4hJycnbJuqVauiffv2um16BUoMo5iEhAQ8+uij+OGHH5Cbm4tmzZphxowZYYvT0IPvCYIgCCI+4en3S0pKMH36dDRr1gwXL17EDz/8gNGjRyMhIcGBIyTiHglAUPDrylzI3NzcsFdhYWG53Z8+fRqBQADp6elh76enpyMnJ0fzkHNycgy3l/+10qZXoMQwBqhfvz4+++wzfPTRR5g6dSratWuHjRs3am5LiSJBEARBEFps3LgR7dq1w7Rp0/Dxxx/js88+Q/369SN9WATBRf369VG1atXQa/LkyZE+JM9DzzGMIe68807s3r0bb7zxBnr16oX+/fvj1VdfRUZG4XR8GAAADn5JREFUhu53tJJDui+RIAiCIOKHnJwcPP30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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "engine": 0 + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[output:0]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5IAAAHvCAYAAAAmUuAkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAACfqElEQVR4nOzdd1gUV9sG8HuXqiBNEexYUDSCKAqixgYIaqJYsUSRKNgTe4u9RGPvBXuNij0WFLFHbCh2xdgbWBBULJSd7w9f9nMpuiy7Oyzcv+uaKzJ75swzy7CZZ0+TCIIggIiIiIiIiEhJUrEDICIiIiIiIt3CRJKIiIiIiIiyhYkkERERERERZQsTSSIiIiIiIsoWJpJERERERESULUwkiYiIiIiIKFuYSBIREREREVG2MJEkIiIiIiKibGEiSURERERERNnCRJKIiIiIiIiyhYkkERERERHlW4sWLYKdnR2MjY3h5uaGc+fOZVn2+vXraNOmDezs7CCRSDB37lyV6vz06RP69u2LwoULw9TUFG3atEFsbKw6L0vjmEgSEREREVG+tGXLFgwaNAjjxo3DxYsXUa1aNXh7e+PFixeZlv/w4QPKlSuHadOmwdbWVuU6Bw4ciH/++QchISE4fvw4nj17htatW2vkGjVFIgiCIHYQRERERERE2ubm5oZatWph4cKFAACZTIZSpUqhf//+GDFixDePtbOzw4ABAzBgwIBs1ZmQkABra2ts2rQJbdu2BQDcunULlStXRkREBGrXrq3+C9UAfbEDICIiIiKi/OXTp09ISkrSSN2CIEAikSjsMzIygpGRkcK+pKQkREZGYuTIkfJ9UqkUnp6eiIiIUOncytQZGRmJ5ORkeHp6yss4ODigdOnSTCSJiIiIiIgy8+nTJ5QtY4qYF6kaqd/U1BTv379X2Ddu3DiMHz9eYd+rV6+QmpoKGxsbhf02Nja4deuWSudWps6YmBgYGhrCwsIiQ5mYmBiVzisGJpJERERERKQ1SUlJiHmRivuRZWBWSL1Ttrx9J0NZl4d4/PgxzMzM5PvTt0ZSzjGRJCIiIiIirTMrJFV7Iimv28xMIZHMTJEiRaCnp5dhttTY2NgsJ9L5HmXqtLW1RVJSEuLj4xVaJXNyXjFw1lYiIiIiItK6VEGmkU1ZhoaGcHFxQXh4uHyfTCZDeHg43N3dVbomZep0cXGBgYGBQpnbt2/j0aNHKp9XDGyRJCIiIiKifGnQoEHw9/dHzZo14erqirlz5yIxMREBAQEAgK5du6JEiRKYOnUqgC/dcm/cuCH/99OnTxEVFQVTU1NUqFBBqTrNzc3RvXt3DBo0CFZWVjAzM0P//v3h7u6uMxPtAEwkiYiIiIhIBDIIkEG9KxFmtz4/Pz+8fPkSY8eORUxMDJydnREaGiqfLOfRo0eQSv+/E+ezZ89QvXp1+c8zZ87EzJkz0aBBAxw7dkypOgFgzpw5kEqlaNOmDT5//gxvb28sXrw4B1eufVxHkoiIiIiItObt27cwNzdHzO3SGplsx7bSIyQkJHx3jCTlDFskiYiIiIhI62SQQfkRjcrXSdrByXaIiIiIiIgoW9giSUREREREWpcqCEhV8yg7dddHWWMiSUREREREWpcbJtsh1bFrKxEREREREWULWySJiIiIiEjrZBCQyhZJncUWSSIiIiIiIsoWtkgSEREREZHWcYykbmOLJBEREREREWULWySJiIiIiEjruPyHbmOLJBEREREREWULWySJiIiIiEjrZP/b1F0naQcTSSIiIiIi0rpUDSz/oe76KGvs2koa1bBhQzRs2FDsMEhkYt4H48ePh0QiEeXc6an6Phw7dgwSiQTHjh1Te0y5jaZ+X3369IGXl5fa66WsdevWDXZ2dmKHoRMye68kEgnGjx+f7bpu3LgBfX19XLt2TT3BERFlgYkkKbh79y569uyJcuXKwdjYGGZmZqhbty7mzZuHjx8/ih2e1kkkEvTr10+lYzdt2oS5c+eqNyANOn36NMaPH4/4+HjRYrCzs4NEIpFvJiYmcHV1xbp160SLKb0HDx7I45s8eXKmZTp37gyJRAJTU1MtR6d+a9asUfid6Ovro0SJEujWrRuePn2qUp0fPnzA+PHjtZYY379/HytWrMCoUaPk+x4/fowJEybA1dUVlpaWKFKkCBo2bIjDhw9nWkd8fDyCgoJgbW0NExMTNGrUCBcvXtR47Dt27ICfnx/KlSuHggULolKlShg8eHCWf6d79uxBjRo1YGxsjNKlS2PcuHFISUnReJzqtn//fpWSqNzs2bNnGD9+PKKiojR6nipVqqB58+YYO3asRs9DpA6pgmY20g4mkiS3b98+ODo6YuvWrfj555+xYMECTJ06FaVLl8bQoUPx+++/ix2iTtHFRHLChAmiJpIA4OzsjPXr12P9+vUYP348EhIS4O/vj+XLl6tU3+jRozXyJYixsTH+/vvvDPsTExOxe/duGBsbZ3jt0KFDOHToULbPVb9+fXz8+BH169dXKVZ1mDhxItavX4+lS5eiadOm2LBhAxo0aIBPnz5lu64PHz5gwoQJmSaSmvh9zZs3D2XLlkWjRo3k+3bv3o2//voLFSpUwOTJkzFmzBi8e/cOXl5eWL16tcLxMpkMzZs3x6ZNm9CvXz9Mnz4dL168QMOGDXHnzh21xppeUFAQbt68iV9++QXz58+Hj48PFi5cCHd39wzv04EDB+Dr6wsLCwssWLAAvr6+mDx5Mvr376/RGLOyfPly3L59W6Vj9+/fjwkTJqg5InE9e/YMEyZMyDSRzMl7lZlevXph586duHv3rtrqJCJKj2MkCcCXb+w7dOiAMmXK4MiRIyhWrJj8tb59++K///7Dvn37RIyQsisxMREmJiZih5FtJUqUwC+//CL/uVu3bihXrhzmzJmDwMDAbNenr68PfX31f9Q1a9YMO3bswOXLl1GtWjX5/t27dyMpKQk+Pj44cuSIwjGGhoYqnUsqlWaamGpT06ZNUbNmTQBAjx49UKRIEfz111/Ys2cP2rdvr7bzqPv3lZycjI0bN6JXr14K+xs1aoRHjx6hSJEi8n29evWCs7Mzxo4di4CAAPn+bdu24fTp0wgJCUHbtm0BAO3bt0fFihUxbtw4bNq0SW3xprdt27YM3aFdXFzg7++PjRs3okePHvL9Q4YMgZOTEw4dOiR/D83MzPDnn3/i999/h4ODg8bizIyBgYFWz5cbqPq5q+73ytPTE5aWlli7di0mTpyo1rqJ1ImT7eg2tkgSAGD69Ol4//49Vq5cqZBEpqlQoYJCi2RKSgomTZqE8uXLw8jICHZ2dhg1ahQ+f/78zfOkdZN78OCBwv7MxoA1bNgQVatWxZUrV9CgQQMULFgQFSpUwLZt2wAAx48fh5ubGwoUKIBKlSpl6JKWNtbqv//+Q7du3WBhYQFzc3MEBATgw4cP2XyHFOPcunUrpkyZgpIlS8LY2BgeHh7477//FGLft28fHj58KO8S+PX4l8+fP2PcuHGoUKECjIyMUKpUKQwbNizD+/fx40f89ttvKFKkCAoVKoQWLVrg6dOnGcbOpF3rjRs30KlTJ1haWqJevXoAgCtXrsiTMWNjY9ja2uLXX3/F69evFY4fOnQoAKBs2bLymL/+PW3YsAEuLi4oUKAArKys0KFDBzx+/DjDexQcHIzy5cujQIECcHV1xcmTJ1V6r9NYW1vDwcEhwzfrJ0+eRLt27VC6dGn5ezhw4MAMrTSZjblL67K8a9cuVK1aFUZGRvjhhx8QGhqqdFzu7u4oW7ZshiRi48aN8PHxgZWVVYZj0o+R9Pf3h7GxMW7evKlQztvbG5aWlnj27BmAb/993LhxA40aNULBggVRokQJTJ8+PcN5Hz58iBYtWsDExARFixbFwIEDcfDgwRyNu/zxxx8BQOH3kpSUhLFjx8LFxQXm5uYwMTHBjz/+iKNHj8rLPHjwANbW1gCACRMmyO+1tPs5s9+Xqp83AHDq1Cm8evUKnp6eCvt/+OEHhSQSAIyMjNCsWTM8efIE7969k+/ftm0bbGxs0Lp1a/k+a2trtG/fHrt37/5mHEeOHIFUKs3QzXDTpk2QSCRYsmTJN+PPbExtq1atAEDhvrlx4wZu3LiBoKAghUS8T58+EARB/rmZlbTP5hMnTqBnz54oXLgwzMzM0LVrV7x58yZD+cWLF+OHH36AkZERihcvjr59+2bozZB+3F9at/CZM2fKPyeMjIxQq1YtnD9/XuG4RYsWAYBCt+o0mzdvhouLCwoVKgQzMzM4Ojpi3rx537y+r889Z84clClTBgUKFECDBg0yHUt469YttG3bFlZWVjA2NkbNmjWxZ8+eTN+z48ePo0+fPihatChKliyZ6fmPHTuGWrVqAQACAgLk17RmzZpM36usPH36FL/++itsbGzkn1urVq3KUM7AwAANGzbE7t27v1snEZGq2CJJAIB//vkH5cqVQ506dZQq36NHD6xduxZt27bF4MGDcfbsWUydOhU3b97Ezp071RbXmzdv8NNPP6FDhw5o164dlixZgg4dOmDjxo0YMGAAevXqhU6dOmHGjBlo27YtHj9+jEKFCinU0b59e5QtWxZTp07FxYsXsWLFChQtWhR//fWXynFNmzYNUqkUQ4YMQUJCAqZPn47OnTvj7NmzAIA//vgDCQkJePLkCebMmQMA8vFyMpkMLVq0wKlTpxAUFITKlSvj6tWrmDNnDqKjo7Fr1y75ebp164atW7eiS5cuqF27No4fP47mzZtnGVe7du1gb2+PP//8E8L/FuQNCwvDvXv3EBAQAFtbW1y/fh3BwcG4fv06zpw5A4lEgtatWyM6Ohp///035syZI3/ATnvgnzJlCsaMGYP27dujR48eePnyJRYsWID69evj0qVLsLCwAACsXLkSPXv2RJ06dTBgwADcu3cPLVq0gJWVFUqVKqXSe52SkoInT57A0tJSYX9ISAg+fPiA3r17o3Dhwjh37hwWLFiAJ0+eICQk5Lv1njp1Cjt27ECfPn1QqFAhzJ8/H23atMGjR49QuHBhpWLr2LEjNmzYgGnTpkEikeDVq1c4dOgQ1q9fr1RSOm/ePBw5cgT+/v6IiIiAnp4eli1bJq+jePHi3zz+zZs38PHxQevWrdG+fXts27YNw4cPh6OjI5o2bQrgSwtJ48aN8fz5c/z++++wtbXFpk2bFJI7VaR9yfD17+Xt27dYsWIFOnbsiMDAQLx79w4rV66Et7c3zp07B2dnZ1hbW2PJkiXo3bs3WrVqJU/OnJycsjxXTj5vTp8+DYlEgurVqyt1XTExMShYsCAKFiwo33fp0iXUqFEDUqnid6+urq4IDg5GdHQ0HB0dM62vcePG6NOnD6ZOnQpfX1/UqFEDz58/R//+/eHp6ZmhpVTZGAEoJMKXLl0CAHmrcZrixYujZMmS8te/p1+/frCwsMD48eNx+/ZtLFmyBA8fPpR/mQF8SfYnTJgAT09P9O7dW17u/Pnz+Pfff7/burZp0ya8e/cOPXv2hEQiwfTp09G6dWvcu3cPBgYG6NmzJ549e4awsDCsX79e4diwsDB07NgRHh4e8s/wmzdv4t9//1Vq+MW6devw7t079O3bF58+fcK8efPQuHFjXL16FTY2NgCA69evo27duihRogRGjBgBExMTbN26Fb6+vti+fbs8kU/Tp08fWFtbY+zYsUhMTMz0vJUrV8bEiRMxduxYBAUFyb+IUfb/uQAQGxuL2rVry78Is7a2xoEDB9C9e3e8ffsWAwYMUCjv4uKC3bt34+3btzAzM1P6PETaJIMEqVDvBGsyNddH3yBQvpeQkCAAEFq2bKlU+aioKAGA0KNHD4X9Q4YMEQAIR44cke9r0KCB0KBBA/nPq1evFgAI9+/fVzj26NGjAgDh6NGjCscCEDZt2iTfd+vWLQGAIJVKhTNnzsj3Hzx4UAAgrF69Wr5v3LhxAgDh119/VThXq1athMKFCyt1rQCEvn37ZoizcuXKwufPn+X7582bJwAQrl69Kt/XvHlzoUyZMhnqXL9+vSCVSoWTJ08q7F+6dKkAQPj3338FQRCEyMhIAYAwYMAAhXLdunUTAAjjxo3LcK0dO3bMcL4PHz5k2Pf3338LAIQTJ07I982YMSPT382DBw8EPT09YcqUKQr7r169Kujr68v3JyUlCUWLFhWcnZ0V3pvg4GABgMJ9kJUyZcoITZo0EV6+fCm8fPlSuHr1qtClS5cMv4esrmvq1KmCRCIRHj58KN+X9t58DYBgaGgo/Pfff/J9ly9fFgAICxYs+GaM9+/fFwAIM2bMEK5duyYAkP8uFy1aJJiamgqJiYmCv7+/YGJionBs+r8HQfj/e3fy5MnCvXv3BFNTU8HX11ehzLf+PtatWyff9/nzZ8HW1lZo06aNfN+sWbMEAMKuXbvk+z5+/Cg4ODhkqDMzaX+zhw8fFl6+fCk8fvxY2LZtm2BtbS0YGRkJjx8/lpdNSUlR+N0LgiC8efNGsLGxUfg7fPnyZYZ7OE3631d2Pm8y88svvyj9937nzh3B2NhY6NKli8J+ExOTDJ8jgiAI+/btEwAIoaGh36w3MTFRqFChgvDDDz8Inz59Epo3by6YmZkp3KfZ0b17d0FPT0+Ijo6W70v7+3306FGG8rVq1RJq1679zTrTfs8uLi5CUlKSfP/06dMFAMLu3bsFQRCEFy9eCIaGhkKTJk2E1NRUebmFCxcKAIRVq1bJ9/n7+yt8Bqb97RQuXFiIi4uT79+9e7cAQPjnn3/k+/r27Zvh71YQBOH3338XzMzMhJSUlG9eT3pp5y5QoIDw5MkT+f6zZ88KAISBAwfK93l4eAiOjo7Cp0+f5PtkMplQp04dwd7eXr4v7T2rV6+eUvGcP38+w/+n0qR/rwRByPA30r17d6FYsWLCq1evFMp16NBBMDc3z/CZuGnTJgGAcPbs2e/GRqRtac+eF2/YCNGPi6l1u3jDRgAgJCQkiH2ZeR67thLevn0LABla8rKyf/9+AMCgQYMU9g8ePBgA1DqW0tTUFB06dJD/XKlSJVhYWKBy5cpwc3OT70/797179zLUkf4b/x9//BGvX7+WX7cqAgICFMa7pX27nNn50wsJCUHlypXh4OCAV69eybfGjRsDgLylKK1Fq0+fPgrHf2vijMxaNwoUKCD/96dPn/Dq1SvUrl0bAJSadXLHjh2QyWRo3769Qry2trawt7eXx3vhwgW8ePECvXr1UnhvunXrBnNz8++eJ82hQ4dgbW0Na2trODo6Yv369QgICMCMGTOyvK7ExES8evUKderUgSAISrW+eHp6onz58vKfnZycYGZmptTvMM0PP/wAJycn+aQ7mzZtQsuWLRVas76nSZMm6NmzJyZOnIjWrVvD2NgYy5YtU+pYU1NThfGkhoaGcHV1VbiG0NBQlChRAi1atJDvMzY2zvZ4U09PT1hbW6NUqVJo27YtTExMsGfPHoWufHp6evLfvUwmQ1xcHFJSUlCzZk2VZzjN6efN69evM7RmZ+bDhw9o164dChQogGnTpim89vHjRxgZGWU4Jm3c6vcmBypYsCDWrFmDmzdvon79+ti3bx/mzJmD0qVLfzeu9DZt2oSVK1di8ODBsLe3V4gRQJZxKjuBUVBQkEKLYu/evaGvry//PRw+fBhJSUkYMGCAQgttYGAgzMzMlPr89/PzU/idZOfz08LCAomJiQgLC1PqetLz9fVFiRIl5D+7urrCzc1Nfn1xcXE4cuQI2rdvj3fv3sk/716/fg1vb2/cuXMnw2zFgYGB0NPTUykeZQmCgO3bt+Pnn3+GIAgKn8Xe3t5ISEjI8DeW9h6/evVKo7ER5YRM0MxG2sFEkuRdXr4eE/QtDx8+hFQqRYUKFRT229rawsLCAg8fPlRbbCVLlswwXsrc3DxDN8m0RCWzsTzpH9bS/ueaVjYuLg4xMTHyLSEh4btxfa/Ob7lz5w6uX78uT5bStooVKwIAXrx4AeD/3+eyZcsqHJ/+ff9a+rLAl+v7/fffYWNjgwIFCsDa2lpeTplrvXPnDgRBgL29fYaYb968qRAvAIWHW+DLWJ1y5cp99zxp3NzcEBYWhtDQUMycORMWFhZ48+ZNholqHj16hG7dusHKygqmpqawtrZGgwYNlL6uzB7iLS0tlfodfq1Tp04ICQnBf//9h9OnT6NTp07ZOh4AZs6cCSsrK0RFRWH+/PkoWrSoUsdl9veR/hoePnyI8uXLZyj3rfsoM4sWLUJYWBi2bduGZs2a4dWrV5kmLWvXroWTkxOMjY1RuHBhWFtbY9++fUr9TjKjjs8bQfj2U0Vqaio6dOiAGzduYNu2bRm6FBcoUCDTcZBpM9Z+/aVGVurWrYvevXvj3Llz8Pb2xq+//vrdY9I7efIkunfvDm9vb0yZMiVDjACyjFOZGIGMf7+mpqYoVqyYvCtz2vtdqVIlhXKGhoYoV66cUr+PnHx+9unTBxUrVkTTpk1RsmRJ/Prrr9ka25z++gCgYsWK8uv777//IAgCxowZk+Hzbty4cQD+/zM6TWafu+r28uVLxMfHIzg4OENcaRNDpY8r7b7PLevoEmUm9X9dW9W9kXZwjCTBzMwMxYsXz/bixar8zymrY1JTUzPdn9W3vFntz+yB8XtlW7dujePHj8v3+/v7yydAyEp2zp+eTCaDo6MjZs+enenrqo4lBDJ/oG3fvj1Onz6NoUOHwtnZGaamppDJZPDx8YFM9v25zWQyGSQSCQ4cOJDpdat7rcQiRYrIJ0bx9vaGg4MDfvrpJ8ybN0/eKpWamgovLy/ExcVh+PDhcHBwgImJCZ4+fYpu3bopdV05+R1+rWPHjhg5ciQCAwNRuHBhNGnSJFvHA1/Gt6U9BF69ehUdO3ZU6jh1XYMyXF1d5ePvfH19Ua9ePXTq1Am3b9+W3wMbNmxAt27d4Ovri6FDh6Jo0aLQ09PD1KlTc7wMgaoPw4ULF/5ughIYGIi9e/di48aN8p4BXytWrBieP3+eYX/avu+NZQW+JHhpExvdvXsXHz58yFbL9eXLl9GiRQtUrVoV27ZtyzCzbdokac+fP8/wGfL8+XO4uroqfS5Ny8l9W7RoUURFReHgwYM4cOAADhw4gNWrV6Nr165Yu3ZtjmNL++wYMmQIvL29My2T/ksNZZN0dcT1yy+/wN/fP9My6ccZp9336SeVIiJSFyaSBAD46aefEBwcjIiICLi7u3+zbJkyZSCTyXDnzh1UrlxZvj82Nhbx8fEoU6ZMlsemffOcfnY/dbZiZtesWbMUHjSVeShURlYPvuXLl8fly5fh4eHxzYfjtPf5/v37Ct+ifz077Pe8efMG4eHhmDBhgsKskZmtffeteAVBQNmyZeWtplnFm1b31w/jycnJuH//vsISGdnRvHlzNGjQAH/++Sd69uwJExMTXL16FdHR0Vi7di26du0qL6tqd7ecKF26NOrWrYtjx47JuwFmR2JiIgICAlClShXUqVMH06dPR6tWreQzPOZUmTJlcOPGDQiCoPA7zs59lF5actioUSMsXLgQI0aMAPBldtNy5cphx44dCudKa8lJk52kMCefNwDg4OCAjRs3IiEhIdMu1kOHDsXq1asxd+7cLBN4Z2dnnDx5EjKZTKE759mzZ1GwYMFv/l2kGTduHG7evImZM2di+PDhGDFiBObPn//d44AviaePjw+KFi2K/fv3Z/rljbOzM4AvXcy/ThqfPXuGJ0+eICgoSKlz3blzR2G9zffv3+P58+do1qwZgP//O799+7ZCT4OkpCTcv38/w+y4qvrWPWJoaIiff/4ZP//8M2QyGfr06YNly5ZhzJgx321pz+yzLzo6Wj5jato1GRgYqO1a0uSkZdDa2hqFChVCamqq0nHdv38fUqlUqfuTSCyaaEFki6T2sGsrAQCGDRsGExMT9OjRA7GxsRlev3v3rnx69bQHirlz5yqUSWth+9asomlj0k6cOCHfl5qaiuDg4BzFnxMuLi7w9PSUb1WqVFFLvSYmJpl252vfvj2ePn2K5cuXZ3jt48eP8ln/0r4NX7x4sUKZBQsWKB1D2jf/6b/pT/+7S4sXyJjkt27dGnp6epgwYUKGegRBkC8jUrNmTVhbW2Pp0qVISkqSl1mzZk2GOrNr+PDheP36tfw9y+y6BEH47hIAmjJ58mSMGzdOpYXfhw8fjkePHmHt2rWYPXs27Ozs4O/vr9TSFsrw9vbG06dPFZYu+PTpU6b3X3Y0bNgQrq6umDt3rryLZ2a/l7NnzyIiIkLh2LSWOGXui5x83gBflmkRBAGRkZEZXpsxYwZmzpyJUaNGfXPGz7Zt2yI2NhY7duyQ73v16hVCQkLw888/Z9rF92tnz57FzJkzMWDAAAwePBhDhw7FwoULFXpCZCUmJgZNmjSBVCrFwYMH5TMpp/fDDz/AwcEBwcHBCj08lixZAolEIl//8nuCg4ORnJyscHxKSop8FmBPT08YGhpi/vz5Cr/nlStXIiEh4bu/D2Vl9Xn09bJFwJc1VtNa4pT5m9m1a5fCGMdz587h7Nmz8usrWrQoGjZsiGXLlmXaCv3y5ctsXcfXsromZejp6aFNmzbYvn17pr2HMosrMjISP/zwQ7bGqBMRZQdbJAnAlwRv06ZN8PPzQ+XKldG1a1dUrVoVSUlJ8oW4u3XrBgCoVq0a/P39ERwcjPj4eDRo0ADnzp3D2rVr4evrq/Btdno//PADateujZEjRyIuLg5WVlbYvHkzUlJStHSl2uPi4oItW7Zg0KBBqFWrFkxNTfHzzz+jS5cu2Lp1K3r16oWjR4+ibt26SE1Nxa1bt7B161YcPHgQNWvWhIuLC9q0aYO5c+fi9evX8uU/oqOjASj37baZmRnq16+P6dOnIzk5GSVKlMChQ4dw//79TOMFvixd0qFDBxgYGODnn39G+fLlMXnyZIwcORIPHjyAr68vChUqhPv372Pnzp0ICgrCkCFDYGBggMmTJ6Nnz55o3Lgx/Pz8cP/+faxevTpbYyQz07RpU1StWhWzZ89G37594eDggPLly2PIkCF4+vQpzMzMsH379myPb1SXBg0ayMdnZseRI0ewePFijBs3DjVq1AAArF69Gg0bNsSYMWMyXRMyu3r27ImFCxeiY8eO+P3331GsWDFs3LhRPlFMTlpJhg4dinbt2mHNmjXo1asXfvrpJ+zYsQOtWrVC8+bNcf/+fSxduhRVqlTB+/fv5ccVKFAAVapUwZYtW1CxYkVYWVmhatWqqFq1aoZz5OTzBgDq1auHwoUL4/Dhwwot5Tt37sSwYcNgb2+PypUrY8OGDQrHeXl5yZeDaNu2LWrXro2AgADcuHEDRYoUweLFi5GamooJEyZ88/yfPn2Cv78/7O3t5eMaJ0yYgH/++QcBAQG4evXqNxew9/Hxwb179zBs2DCcOnUKp06dkr9mY2MDLy8v+c8zZsxAixYt0KRJE3To0AHXrl3DwoUL0aNHD4XW3G9JSkqCh4cH2rdvj9u3b2Px4sWoV6+efLIma2trjBw5EhMmTICPjw9atGghL1erVi2FyZ9yIu3z6LfffoO3tzf09PTQoUMH9OjRA3FxcWjcuDFKliyJhw8fYsGCBXB2dlbqGitUqIB69eqhd+/e+Pz5M+bOnYvChQtj2LBh8jKLFi1CvXr14OjoiMDAQJQrVw6xsbGIiIjAkydPcPnyZZWuqXz58rCwsMDSpUtRqFAhmJiYwM3NTekxltOmTcPRo0fh5uaGwMBAVKlSBXFxcbh48SIOHz6MuLg4ednk5GT5+pZEuZlMkEAmqHn5DzXXR9+gxRliSQdER0cLgYGBgp2dnWBoaCgUKlRIqFu3rrBgwQKFqdCTk5OFCRMmCGXLlhUMDAyEUqVKCSNHjlQoIwiZL3dw9+5dwdPTUzAyMhJsbGyEUaNGCWFhYZkub/DDDz9kiLFMmTJC8+bNM+xHuiUi0pYRePnypUK5rJYgyUz6OtOWYQgJCVEolza1/NfTur9//17o1KmTYGFhIQBQmNo9KSlJ+Ouvv4QffvhBMDIyEiwtLQUXFxdhwoQJCtNVJyYmCn379hWsrKzky0Lcvn1bACBMmzbtu9cqCILw5MkToVWrVoKFhYVgbm4utGvXTnj27Fmmyy9MmjRJKFGihCCVSjO8R9u3bxfq1asnmJiYCCYmJoKDg4PQt29f4fbt2wp1LF68WChbtqxgZGQk1KxZUzhx4kSm90FmsvrdCoIgrFmzRuE9vnHjhuDp6SmYmpoKRYoUEQIDA+VLeGS2DMzX0v9evz6/v7//N2P8evmPb/ne8h9v374VypQpI9SoUUNITk5WKDdw4EBBKpUKERERgiBkvfxHZn8fmS0jcO/ePaF58+ZCgQIFBGtra2Hw4MHC9u3bBQAKy+hkJu3v5fz58xleS01NFcqXLy+UL19eSElJEWQymfDnn38KZcqUEYyMjITq1asLe/fuzTSm06dPCy4uLoKhoaHCvZjZ70vZz5us/Pbbb0KFChUU9qWdJ6st/bIocXFxQvfu3YXChQsLBQsWFBo0aJDpe5LewIEDBT09vQxLMFy4cEHQ19cXevfu/c3jvxVjZn9TO3fuFJydnQUjIyOhZMmSwujRoxWW88hK2u/5+PHjQlBQkGBpaSmYmpoKnTt3Fl6/fp2h/MKFCwUHBwfBwMBAsLGxEXr37i28efNGoUxWy39k9reT/vMoJSVF6N+/v2BtbS1IJBL5PbFt2zahSZMmQtGiRQVDQ0OhdOnSQs+ePYXnz59/8/q+PvesWbOEUqVKCUZGRsKPP/4oXL58OUP5u3fvCl27dhVsbW0FAwMDoUSJEsJPP/0kbNu2LcN7psx9kGb37t1ClSpVBH19fYXPKmWW/xAEQYiNjRX69u0rlCpVSjAwMBBsbW0FDw8PITg4WKHcgQMHBADCnTt3lI6NSJvSlv84da24EPWwpFq3U9eKc/kPLZEIggZmZSAijYmKikL16tWxYcMGdO7cWexwSEfNnTsXAwcOxJMnTxSWQ8iL7t27BwcHBxw4cAAeHh5ih5MrrVmzBgEBATh//rx8UqW85MGDByhbtixmzJiBIUOGiB2Oxvn6+kIikWDnzp1ih0KUqbdv38Lc3BzHr5WAaSH1jrR7/06GBlWfIiEhQb4yAWkGx0gS5WKZrf02d+5cSKVS1K9fX4SISBelv48+ffqEZcuWwd7ePs8nkcCXCVS6d++eYX1Iorzo5s2b2Lt3LyZNmiR2KESUx3GMJFEuNn36dERGRqJRo0bQ19eXT3cfFBSUo2VCKH9p3bo1SpcuDWdnZyQkJGDDhg24desWNm7cKHZoWrNkyRKxQyDSisqVK+fJeQcob0qFFKlqbtfKfEE50gQmkkS5WJ06dRAWFoZJkybh/fv3KF26NMaPH48//vhD7NBIh3h7e2PFihXYuHEjUlNTUaVKFWzevBl+fn5ih0ZERPmYoIHJdgROtqM1HCNJRERERERakzZGMvxqaZioeYxk4jsZPBwfcYykFrBFkoiIiIiItC4VEqRCvS2I6q6PssbJdoiIiIiIiChb2CJJec6rV68QHh6OQ4cO4dGjR2KHoxEf33/C5w+fFfYZFTRS+LmAqbE2QyIi0mllypSBl5cXPDw8UKRIEbHDIcoXUgUpUgU1T7bDQXtaw0SSdF5KSgpOnTqFQ4cO4dChQ7h06RKqVq2KJk2aoE6dOpBI8k4Xh5ndF2f5WiLSLxWScemQ3G7Iyj5ih0BE+ZAgCLh16xb+/PNPdOrUCdWrV0eTJk3QpEkT1KtXD/r6fFwiIkqPk+2QTkpMTMShQ4ewa9cu7N27FwYGBvD29oaXlxc8PT1ha2srdohq4yVtJ3YI9A1hshCxQyAiNYqJicHhw4cRFhaGgwcPIjk5GT/99BN8fX3RpEkTmJiYiB0ikc5Lm2xn35VyMCmkp9a6E9+lornTPU62owVMJElnvHnzBrt27cKuXbtw6NAhlCpVCq1atYKvry/c3NwgleatIb9MIEmTmAATfZ9MJsPZs2exa9cu7Ny5E48fP0aTJk3g6+sLX19fWFpaih0ikU5iIpk3MJGkXO39+/fYs2cP/v77bxw8eBDVqlVD69at4evrCwcHhzzVbTUNE0iizDH5JTGldX/dtWsXduzYgStXrsDb2xsdOnRAixYtYGpqKnaIRDojLZHcc6W8RhLJFk53mUhqARNJynU+ffqE/fv3Y/Pmzdi7dy/Kly+Pjh07ws/PD+XLlxc7vG9iEkiUtzB5zb6cfA7q0vv933//YcuWLdi8eTPu3r2Ln3/+GR06dEDTpk1hbMzJzoi+JS2R3HnZXiOJZKtqd5hIagETScoVBEHA6dOnsXbtWmzZsgXW1tby5LFq1apqOw8TPSLKDXJbwpTbPhtz2/vzPdeuXcPmzZuxefNmvHz5En5+fvD3989zE74RqQsTybyBiSSJ6uHDh1i/fj3Wrl2LV69eoWPHjvD394erqyskEkmue7ghIiLt0bWEUhAEnD17FmvXrsXmzZthbW2Nrl27omvXrihdurTY4RHlGmmJ5PbLFTWSSLapFs1EUgvy1uwkpBM+fPiAdevWwcPDA/b29jhz5gz+/PNPPH/+HIsXL4abmxu/wSUiInhJ2+nUF4oSiQS1a9fGkiVL8Pz5c0yZMgURERGoUKECPDw8sG7dOnz48EHsMImI1IItkqQ1V65cQXBwMDZs2ICSJUsiICAAnTt3/u5SHbr0EEFERJqla62UwJclRTZu3IjVq1fjyZMn6NKlCwIDA+Hk5CR2aESiSGuRDLnsgIJqbpH88C4V7ardYoukFrBFkjQqMTERq1atQu3atVG7dm0kJibiwIEDuHr1KgYPHqzUeo9hshCdfHAgIiL107VWSgCwtbXF4MGDcfXqVRw4cADv37+X/39x1apVSExMFDtEIqJsY4skaURUVBSWLVuGjRs3omzZsujZsyc6deoECwuLHNWraw8PRESkWbr6RWN8fDw2btyI4OBg3L9/H507d0bPnj3h7OwsdmhEGpfWIrk5qopGWiQ7ON9gi6QWMJEktUlKSsKOHTuwcOFCXLp0CR07dkRQUBBq1aql9jGPTCiJiEhdxExGBUHA+fPnERwcjL///hs1atRAv3790Lp1axgYGIgWF5EmMZHMG5hIUo49f/4cwcHBWLZsGQoWLIi+ffuiW7dusLS01Oh5mUwSEVFupUpy+ubNG6xZswaLFi3Chw8f0LNnT/Ts2VOpYSBEuiQtkdwUVVUjiWQn52vZSiQXLVqEGTNmICYmBtWqVcOCBQvg6uqaZfmQkBCMGTMGDx48gL29Pf766y80a9ZM/npWDSjTp0/H0KFDAQB2dnZ4+PChwutTp07FiBEjlIo5N+AYSVJJ2rqPHTt2hJ2dHc6dO4eVK1ciOjoaAwcOVHsSmTYm5uuNiIgot1Ll/1OWlpYYOHAgoqOjsWLFCpw9exZlypRBp06dcPr0afC7f8prUgWJRrbs2LJlCwYNGoRx48bh4sWLqFatGry9vfHixYtMy6c9/3bv3h2XLl2Cr68vfH19ce3aNXmZ58+fK2yrVq2CRCJBmzZtFOqaOHGiQrn+/ftn/00UEVskKVtSUlKwfft2zJw5E3fu3MGvv/6KPn36oEKFCjmum8khERHlJeroMvvff/9h8eLFWLVqFezt7TFkyBC0adMG+vr6aoiQSBxpLZLrLzlqpEWyS/WrePz4sUKLpJGREYyMjDKUd3NzQ61atbBw4UIAgEwmQ6lSpdC/f/9MWwf9/PyQmJiIvXv3yvfVrl0bzs7OWLp0aaYx+fr64t27dwgPD5fvs7Ozw4ABAzBgwABVL1V0bJEkpbx//x7z5s1DhQoVMHLkSHTt2hVPnjzB7Nmzs5VEZtayyBZGIiLKi9Tx/7YKFSpg9uzZePLkCbp27YoRI0bA3t4e8+fPx/v379UQJZF4UiHVyAYApUqVgrm5uXybOnVqhvMnJSUhMjISnp6e8n1SqRSenp6IiIjINOaIiAiF8gDg7e2dZfnY2Fjs27cP3bt3z/DatGnTULhwYVSvXh0zZsxASkqK0u9dbsCvs+ibnj9/jgULFmDJkiWwt7fHjBkz0KpVq29+E8qkkIiISL1MTU3Rv39/9O7dGzt37sSMGTMwbtw49O7dG/3790exYsXEDpEoV8msRTK9V69eITU1FTY2Ngr7bWxscOvWrUzrjYmJybR8TExMpuXXrl2LQoUKoXXr1gr7f/vtN9SoUQNWVlY4ffo0Ro4ciefPn2P27NlKXV9uwESSMnX79m389ddf2LRpE5o0aYLdu3fjxx9/lA8eZrJIRET0fV7SdmqdFVZfXx/t2rVD27ZtcfLkScycORNly5ZFp06dMHz4cFSqVElt5yLSNJkghUxQbwdJ2f9G7ZmZmeWKWVtXrVqFzp07w9jYWGH/oEGD5P92cnKCoaEhevbsialTp2aa9OZG7NpKCm7fvo1ffvkF1apVg0QiQVRUFPbs2YP69eurfQkPIiIiUo1EIkH9+vWxZ88eXLp0CRKJBNWqVUOXLl1w+/ZtscMj0glFihSBnp4eYmNjFfbHxsZmOVuyra2t0uVPnjyJ27dvo0ePHt+Nxc3NDSkpKXjw4IHyFyAyJpIEALh165Y8gSxYsCBu3bqFlStXwsHBIdPyuroANBERkbZpuhdP5cqVsXLlSty8eRPGxsaoVq0afvnlFyaUlOtpcoykMgwNDeHi4qIwCY5MJkN4eDjc3d0zPcbd3V2hPACEhYVlWn7lypVwcXFBtWrVvhtLVFQUpFIpihYtqnT8YmMimc/dunULnTt3hrOzszyBDA4Ohp2dndihERER5RnaGBJStmxZLF++HLdu3ULBggXlCWVWY72I6EsX0+XLl2Pt2rW4efMmevfujcTERAQEBAAAunbtipEjR8rL//777wgNDcWsWbNw69YtjB8/HhcuXEC/fv0U6n379i1CQkIybY2MiIjA3LlzcfnyZdy7dw8bN27EwIED8csvv2h8HXZ14hjJfOrhw4cYM2YMtm7dCn9/f9y6dSvbyWOYLIRjJYmIiJT0rf9nqrOnj52dHYKDgzFq1Cj8+eefcHZ2Rvv27TF58mSULl1abechyikZkO11H5WpMzv8/Pzw8uVLjB07FjExMXB2dkZoaKh8Qp1Hjx5BKv3/trc6depg06ZNGD16NEaNGgV7e3vs2rULVatWVah38+bNEAQBHTt2zHBOIyMjbN68GePHj8fnz59RtmxZDBw4UGHcpC7gOpL5THx8PP78808sXLgQbdu2xcSJE3PU+shEkoiISPNykmg+ePAAY8aMwfbt29G/f3+MHDkSFhYW6guOKJvS1pFccrEWCpiqt13r4/sU9K5xHgkJCblisp28jF1b84mkpCTMnTsX5cuXx8WLF/Hvv/9i3bp1Oe7CyrGSREREmpeTdZjt7Oywfv16nDp1ChcuXECFChUwb948JCUlaSFyIsqr2LU1jxMEASEhIRg5ciQKFiyIDRs2wMfHhzOwEhER5RFZJZPpv+ytUaMGDh8+jAMHDmDYsGGYP38+pk6dinbt2vG5gESRKkiRqublP9RdH2WNiWQeFhUVhX79+uHevXuYNGkSunXrBj09vRzVya6sREREuksikaBZs2Zo0qQJ1q5diwEDBmD+/PlYtGiRUjNLEhGlYcqeB7158wb9+vWDu7s7fvzxR0RHR6N79+7ZTiJV6T5DREREuZ++vj66d++O6Oho1KtXD7Vr10b//v0RHx8vdmiUj8gg0chG2sFEMg+RyWRYtWoVKlWqhDt37iAqKgpTp06FqampUsczaSQiIspfTE1NMW3aNERFReH27duoWLEiVq1aBZksu3NfElF+w66teURkZCT69u2L58+fY+nSpWjVqtU3xzswUSQiIqI0lSpVwsGDB7Fz504MHDgQy5cvx8KFC+Hi4iJ2aJSHcYykbuM7rePev3+PgQMH4scff4SXlxdu3ryJ1q1bZ0gi2dpIRESUv2T3//cSiQStW7fGzZs34enpiR9//BEDBw7E+/fvNRQhEekyJpI6bN++fahSpQoiIyNx8eJFTJo0CQULFlQow8SRiIiIsqNgwYKYNGkSIiMjERkZiR9++AH79u0TOyzKg1Ih1chG2sF3WgfFxMTAz88Pv/zyC8aOHYtjx47BwcFB7LCIiIgoD6lcuTKOHTuG0aNH45dffoGfnx9iYmLEDovyEJkg0chG2sFEUofIZDIsX74clStXhkQiwc2bN9GjRw9IpVn/GtOvIUVERET5R057JkmlUgQGBuLmzZsAviSXy5cvhyAI6gqRiHQUJ9vREQ8ePED37t1x584dbNiwAc2bNxc7JCIiItIRmSWT2fmy2dbWFlu2bMG+ffvQu3dvbN68GStXroSdnZ0ao6T8RqaBrqgytpNpDd/pXE4mk2HJkiVwdHREhQoVcO3atWwnkWyVJCIiovRUWS+6efPmuHbtGipUqAAnJycsXbqUS4UQ5VNskczF7t+/j+7du+Pu3bvYuXMnPD09xQ6JiIiI8jBlWi7NzMywbNkytG3bFj169EBISAhbJ0klMkEKmZqX61B3fZQ1vtO5UForpJOTEypWrIhr167lOIlkqyQRERGpIquWSy8vL1y9ehUVKlSAo6MjlixZwtZJonyELZK5zNOnTxEQEIDbt2+rpRWSS38QERGRunlJ2yFMFiJvnWzXrh26d++OnTt3YvXq1ShRooTYIZIOSIUEqVDvLKvqro+yxhbJXOTvv/9G1apVUaJECVy9elWlJDK7Yx2IiIiIcsrT0xNXrlxB8eLF4ejoiM2bN4sdEhFpGFskc4G4uDj07dsXhw8fxqpVq9CqVatsHc+EkYiIiMRmbm6ONWvWYMeOHQgKCsLu3buxePFiWFpaih0a5VIcI6nb+E6L7NChQ3B0dMS7d+9w9epVpZJItjoSERFRbtW6dWtcu3YNb9++haOjI8LCwsQOiYg0gC2SIvn8+TNGjBiBFStWYNasWQgMDIREknmfbiaLREREpEtsbW2xd+9eLF++HK1bt0aPHj0wbdo0GBkZiR0a5SKpUP+YxlS11kbfwkRSBDdv3kTHjh2hr6+PyMhIVKxYMUMZJo9ERESkyyQSCYKCgtCwYUN06tQJbm5u+Pvvv1G5cmWxQ6Ncgl1bdRvfaS0SBAHBwcGoVasWvL29cfr06UyTSCIiIqK8omLFijh9+jS8vb1Rq1YtLF++HIIgiB0WEeUQWyS15PXr1wgMDMSZM2ewe/dueHh4iB0SERERkcrSlgBRhqGhIf766y94eXmha9euCA0NxfLly2FlZaXhKCk3SxWkSFVzC6K666Os8Z3WglOnTsHZ2Rmpqam4cuWKUkmksh/MRERERGLJ7gSAacuEpKSkoFq1ajh16pQWoiQiTWAiqUEymQxTp06Ft7c3hg8fjl27dqFIkSJih0VERESkEcoklkWKFMGuXbswbNgweHt7Y9q0aZDJZFqOlHIDARLI1LwJap68h7LGrq0a8uLFC3Tt2hV37tzBiRMn4OLiInZIRERERFqVPplM63ElkUjQv39/1KlTB+3bt8fx48exbt06WFtbixEmEamALZIacPz4cTg7O8PMzAwXL15UOYlk91YiIiLKS9K3WLq4uODixYswNTWFs7MzTpw4IXaIpEVpYyTVvZF28J1WI5lMhilTpqBZs2YYPXo0tmzZAnNzc5Xr4xIgRERElJd5SduhrWUPbN26FaNGjULTpk3x559/sqsrkQ5g11Y1efPmDbp27Yrr16/j5MmTqFGjhkr1MHkkIiKi/EYikaBv375wd3dH27ZtcebMGaxbtw4WFhZih0YaJBMkkAnqHdOo7vooa2yRVIOoqCjUrFkTgiAgMjIyW0lkdmc7IyIiIsqratSogcjISKSmpsLFxQWXL18WOyTSoFRINbKRdvCdzqG1a9eiXr16CAgIwJ49e2BpafndY5g4EhEREWXO0tIS//zzD7p164a6deti3bp1YodERJlg11YVff78GQMGDMDWrVuxfft2eHt7f7M8k0YiIiIi5UilUowZMwaurq7o1KkTIiIiMHfuXBgZGYkdGqkRu7bqNiaSKoiJiUHr1q2RlJSEixcvokyZMpmWY/JIREREpDpvb29cvHgRbdq0QePGjbF9+3bY2tqKHRYRgV1bs+3ChQuoWbMmypUrh5MnTzKJJCIiItKgMmXK4OTJk7Czs0OtWrVw4cIFsUMiNZFBqpGNtIPvdDZs2LABDRs2xIABA7B+/XoUKFBA7JCIiIiIdN73voAvUKAANmzYgN9++w0NGzbExo0btRQZEWWFXVuVkJqaihEjRmDFihXYtm0bfHx8vntMmCyErZJERERESkr/3BQmC1H4WSKRYOjQoXB0dETHjh1x+fJlTJ06FXp6etoMk9QoVZAgVc1jGtVdH2WNieR3vH37Fh06dMD9+/dx9uxZVKxYUeyQiIiIiPK8rxPLr5NKHx8fnD17Fi1btsS1a9ewefNmmJmZiREiUb7Grq3f8OjRI9SrVw+pqak4c+ZMtpPI9N+kEREREVH2pV93u2LFijhz5gxSUlJQr149PHr0SOwQSQVps7aqeyPtYCKZhXPnzsHV1RV169bFvn37YG5uLnZIRERERIQviWVbyx5IDSuEOnXqwNXVFefPnxc7LMomQZBCpuZNEJjeaAvf6Uxs27YNjRs3xogRI7B48WLo66vWA5hjJImIiIg0RyqR4r9lr2D+whaNGjXC9u3bxQ6JKN/gGMmvCIKA6dOnY8qUKfj777/x888/Z7sOJo9ERERE2iORSFAa9pixaSI6d+6Mu3fvYujQoZBI2MUxt0uFBKlQ82Q7aq6PssZE8n9SU1MxYMAAbNu2DcePH0f16tWVPpbJIxEREZG4WrRogRMnTqBZs2Z48uQJ5syZwxldiTSIiSSAT58+oUuXLrh69SoiIiJgZ2f33WOYPBIRERHlDmkTHFavXh2nT5+Gj48POnbsiHXr1sHY2Fjk6CgrMgFqnxxHJqi1OvqGfJ9IxsfHw9fXF58+fcKpU6dQpEiRLMsyeSQiIiLK3cqWLYt///0XP/30E5o2bYpdu3Zx0kQiDcjXk+08ffoU9evXh6mpKcLDw7NMItOmmiYiIiKi3K9IkSIIDw9HwYIFUb9+fTx79kzskCgT6p6xNW0j7ci37/S9e/dQr1491KpVC7t27YKJiYnC61+vVUREREREusXExAS7du2Ci4sL6tati/v374sdElGeki8TyVu3bqF+/frw9fXFihUrFJb3YPJIRERElDcYGBhg5cqVaNmyJX788Ufcvn1b7JDoKzJINLKRduS7RPLKlSto0KABunXrhtmzZ0MikbD1kYiIiCiPkkgkmDNnDvz9/VG/fn1cvXpV7JDof1IFiUa27Fq0aBHs7OxgbGwMNzc3nDt37pvlQ0JC4ODgAGNjYzg6OmL//v0Kr3fr1g0SiURh8/HxUSgTFxeHzp07w8zMDBYWFujevTvev3+f7djFlK8SyQsXLqBRo0b47bffMHnyZDTRa8/kkYiIiCiPk0gkmDJlCn777Tc0bNgQkZGRYodEucSWLVswaNAgjBs3DhcvXkS1atXg7e2NFy9eZFr+9OnT6NixI7p3745Lly7B19cXvr6+uHbtmkI5Hx8fPH/+XL79/fffCq937twZ169fR1hYGPbu3YsTJ04gKChIY9epCRJBEPLFJLkRERFo2rQpbN7aoTTsxQ6HiIiIiNQkbfkPZcyZMwcTJkzAgQMH4O7ursGoKCtv376Fubk5OoT/AkNTQ7XWnfQ+CZs9NiAhIQFmZmbfLe/m5oZatWph4cKFAACZTIZSpUqhf//+GDFiRIbyfn5+SExMxN69e+X7ateuDWdnZyxduhTAlxbJ+Ph47Nq1K9Nz3rx5E1WqVMH58+dRs2ZNAEBoaKh8DdTixYtn97JFkS9aJCMjI+Hl4QXbhHJMIomIiIjysYEDB2LKlClo2rQpWybzsLdv3ypsnz9/zlAmKSkJkZGR8PT0lO+TSqXw9PREREREpvVGREQolAcAb2/vDOWPHTuGokWLolKlSujduzdev36tUIeFhYU8iQQAT09PSKVSnD17VqXrFUOeTySvXLmCJk2aoOSnCiglKS92OEREREQksr59+2Ls2LFo0qQJx0yKSAYJZIKat/9NtlOqVCmYm5vLt6lTp2Y4/6tXr5CamgobGxuF/TY2NoiJick05piYmO+W9/Hxwbp16xAeHo6//voLx48fR9OmTZGamiqvo2jRogp16Ovrw8rKKsvz5kb63y+iu27dugVPT08MGjQIf/zxB8dDEhEREREAYNCgQfjw4QM8PT1x/PhxODg4iB0SqdHjx48VurYaGRlp7dwdOnSQ/9vR0RFOTk4oX748jh07Bg8PD63FoWl5tkXy7t278PDwQFBQEP744w8A2es/T0RERES6QdXZ90ePHo0ePXrAw8MDd+/e1UBk9C2CBpb+EP7XImlmZqawZZZIFilSBHp6eoiNjVXYHxsbC1tb20xjtrW1zVZ5AChXrhyKFCmC//77T15H+sl8UlJSEBcX9816cps8mUg+e/YMHh4e6NChAyZNmqTwGpNJIiIiorxJlSXdJk+eDD8/P3h6euLZs2cajI5yG0NDQ7i4uCA8PFy+TyaTITw8PMuJmNzd3RXKA0BYWNg3J2568uQJXr9+jWLFisnriI+PVxije+TIEchkMri5ueXkkrQqz83aGh8fj/r166NmzZpYuXIlJJLM15JhN1ciIiKi/ONbjQmCICAgIACXLl3CiRMnYG5ursXI8p+0WVvbHPaHgYl6Z21NTkzCds+1Ss/aumXLFvj7+2PZsmVwdXXF3LlzsXXrVty6dQs2Njbo2rUrSpQoIR9jefr0aTRo0ADTpk1D8+bNsXnzZvz555+4ePEiqlativfv32PChAlo06YNbG1tcffuXQwbNgzv3r3D1atX5S2jTZs2RWxsLJYuXYrk5GQEBASgZs2a2LRpk1rfD03KU2MkP336hJYtW6J06dIIDg7ONIlkAklERESU/3z9DJg+qZRIJFi+fDl8fX3RsmVLhIaGwtjYWNsh5jsyQQqZoN4Oktmtz8/PDy9fvsTYsWMRExMDZ2dnhIaGyifUefToEaTS/6+zTp062LRpE0aPHo1Ro0bB3t4eu3btQtWqVQEAenp6uHLlCtauXYv4+HgUL14cTZo0waRJkxS6127cuBH9+vWDh4cHpFIp2rRpg/nz56vhHdCePNMimZqainbt2uH58+cIDw9HwYIF5a8xeSQiIiKiNFm1TiYmJsLT0xPFixfH1q1boaenp+XI8oe0FslWYQEaaZHc6bVa6RZJUl2eGCMpCAL69u2LW7duYe/evfIkUtWB10RERESU/5iYmGDv3r24ceMG+vXrhzzS3pJrqX3pj/9tpB15omvrX3/9hX/++QcREREoXLgwk0ciIiIiUknhwoVx8OBBuLu7w87ODsOHDxc7JKJcSecTybQBrlXeuaG73WCxwyEiIiIiHVe6dGns3bsXDRo0gJ2dHfz8/MQOKU9KW7JD3XWSduh019ZTp06hR48eKP/OCYUkFmKHQ0RERES5nLJLwVWvXh1btmxB9+7dcerUKQ1HRaR7dDaRjI6ORsuWLTF79mxcEvjHTURERETq1bRpU8yaNQstW7bEnTt3xA4nz+EYSd2mk4nk69ev0axZMwQGBiIoKAiA8t8uEREREVH+ld25NHr27IkePXqgWbNmeP36tYaiItI9Orf8R1JSEry9vWFlZYWQkBCFdV0ALvVBRERERNnzvQYJmUyGdu3aIS4uDocOHYKBgYGWIsub0pb/aBoaqJHlPw74LOfyH1qgUy2SgiCgf//+iI+Px7p16zIkkQBbJomIiIgoe9KWjMuqQUIqlWLdunV48+YN+vfvz2VB1IRdW3WbTs3aumDBAuzevRvnz5+HiYlJhtfZGklEREREOfH18+TXDRQmJibYs2cPXF1d8cMPP6B///5ihEeUa+hMIhkaGoqRI0ciPDwcpUqVUniNCSQRERERaVrp0qWxc+dOeHp6omLFivD29hY7JJ2miRZEtkhqj04kknfv3kXHjh2xbNky1K5dW76fCSQRERERaZO7uzuWLl2KDh06IDIyEuXKlRM7JCJR5PpE8sOHD2jTpg26du2KX375hckjEREREYmqS5cuOH/+PFq3bo3Tp0+jYMGCYoekkwQAMqi3BZGjV7UnV0+2IwgCevXqBVNTU1yb/4RJJBERERFpxfcmcJw5cyZMTEzQu3dvTr5D+VKuTiSXLl2KQ4cOYevWrZBKcnWoRERERJSPGBoaIiQkBAcPHsSyZcvEDkcncdZW3ZZrs7Nz585hyJAh2Lp1K4oXL85lPYiIiIhIK5R97ixevDi2bNmCwYMH49y5cxqOiih3yZWJ5Nu3b9GxY0eMGzcO9evXl+9nMklEREREmva9dSW/1qBBA4wdOxYdO3bEu3fvtBBd3sEWSd0mEXJhp25/f388ffoUhw4dglSaMdflWEkiIiIi0rasGjVkMhm8vLxQqlQprFmzRrtB6aC3b9/C3Nwc9f/pA30TI7XWnZL4GSd+XoyEhASYmZmptW5SlOtmbd28eTP27t2LK1euZJpEEhERERGJ4evGjK+TSqlUinXr1sHJyQlbtmyBn5+fGOERaVWuSiQfPnyIXr16Yc2aNShRokSG19kSSURERES5QdpzaVpCWaJECaxYsQK//vorateujTJlyogZnk7QRFdUdm3VnlzT5CeTydC1a1d06NABvr6+Cq8p20ediIiIiEgsrVq1Qvv27eHv7w+ZTCZ2OEQalWsSySVLluDx48eYNWsWgOwNciYiIiIiEkP6Z9VZs2bh4cOHWLp0qUgR6Q5BkGhkI+3IFYnkgwcPMGLECCxfvhy+hboxeSQiIiIinfH1s6upqSlWrFiB4cOH48GDB+IFRaRhoieSgiAgMDAQnTp1wjQvfnNDRERERLrNw8MDHTt2RFBQEHLhAgm5hgwSjWykHaInkitXrsStW7cwY8YMsUMhIiIiIlJJ+h51M2bMwM2bN7Fy5UqRIiLSLFETydjYWAwZMgTLli1DG4vuYoZCRERERJQjXyeT5ubmWLZsGYYOHYrY2FgRo8q90mZtVfdG2iFqIjl06FB4eXmhWbNmYoZBRERERKR2zZo1g4eHB4YNGyZ2KLkSJ9vRbaIlksePH8fOnTsxZ84cTq5DRERERHlC+ufaOXPmYMeOHTh+/LhIERFphiiJZFJSEvr06YPx48cjoPRAMUIgIiIiItK4UqVKYdy4cejTpw+Sk5PFDidXYddW3SZKIjlv3jxIpVL89ttvYpyeiIiIiEhj0rdK/v7775BIJJg7d644ARFpgNYTydjYWEyaNAkLFixAM6NO2j49EREREZHGfZ1MGhgYYOHChZg0aRJevHghYlS5C8dI6jatJ5Ljxo2Dp6cnGjZsqO1TExERERGJomHDhvDw8MC4cePEDoVILbSaSF69ehVr167FX3/9xQl2iIiIiChPS/+8O336dKxZswbXrl0TKaLcRdDA+Ei2SGqP1hJJQRAwePBg9O7dG/b29to6LRERERFRrmBvb49evXphyJAhYodClGNaSyQPHTqEyMhIjBkzhq2RRERERJQvpH/uHTt2LM6fP49Dhw6JFFHuIQAQBDVvYl9UPqKVRFIQBIwePRojRoxA+8JB2jglEREREVGuY2lpieHDh2P06NEQBKY9pLu0kkj+888/ePz4Mfr27auN0xERERER5RrpWyX79u2Lhw8fYu/evSJFlDvIINHIRtqh8URSJpNhzJgxGDlyJFqa+mv6dEREREREuZqJiQlGjhyJMWPGQCaTiR2OaLj8h27TeCK5fft2vH79Gj179tT0qYiIiIiIcqX0rZK9evXCq1evsGPHDpEiIsoZjSaSgiBg8uTJGDVqFH4u2EWTpyIiIiIi0hnGxsYYNWoUJk2alG/HSqp76Y+0jbRDo4nkoUOH8Pz5cwQEBGjyNEREREREuV76VsmAgAA8e/YMYWFhIkVEpDqNJpIzZ85Ev379UKBAAU2ehoiIiIhI5xQoUAD9+vXDzJkzxQ5FFGpf+uN/G2mHxhLJS5cu4fTp0+jTpw/XjSQiIiIiQuYzuJ46dQpRUVHiBESkIo0lkrNmzUJAQACKFCmiqVMQEREREem0IkWKICAgIF+2SnLWVt2mkUTyxYsXCAkJwe+//87WSCIiIiKir6R/Pv79998REhKCly9fihQRUfZpJJFcu3Yt6tWrB3t7e01UT0RERESUZ1SsWBF169bF2rVrxQ5Fq9giqdvUnkgKgoDg4GAEBQWxNZKIiIiISAlBQUEIDg7OV0uBcPkP3ab2RPLYsWOIj4+Hr6+vuqsmIiIiIsoT0je4tGrVCnFxcTh+/LhIERFlj9oTyeXLl8Pf3x9GRkbqrpqIiIiIKE8yMjJCt27dsHz5crFD0ZrcsvzHokWLYGdnB2NjY7i5ueHcuXPfLB8SEgIHBwcYGxvD0dER+/fvl7+WnJyM4cOHw9HRESYmJihevDi6du2KZ8+eKdRhZ2cHiUSisE2bNi37wYtIrYlkYmIidu/eja5du7JbKxERERFRNnTp0gW7du1CYmKi2KHkG1u2bMGgQYMwbtw4XLx4EdWqVYO3tzdevHiRafnTp0+jY8eO6N69Oy5dugRfX1/4+vri2rVrAIAPHz7g4sWLGDNmDC5evIgdO3bg9u3baNGiRYa6Jk6ciOfPn8u3/v37a/Ra1U2tieTevXtRpkwZODo6qrNaIiIiIqI8J33Di5OTE0qXLo19+/aJFJF2fWlBVPdkO9mLYfbs2QgMDERAQACqVKmCpUuXomDBgli1alWm5efNmwcfHx8MHToUlStXxqRJk1CjRg0sXLgQAGBubo6wsDC0b98elSpVQu3atbFw4UJERkbi0aNHCnUVKlQItra28s3ExESl91Esak0kt2zZAj8/P0gkHORKRERERJQdEokEHTp0wJYtW8QORee9fftWYfv8+XOGMklJSYiMjISnp6d8n1QqhaenJyIiIjKtNyIiQqE8AHh7e2dZHgASEhIgkUhgYWGhsH/atGkoXLgwqlevjhkzZiAlJSUbVyg+tSWSb9++xf79++Hn58durUREREREKvDz88O+ffvw9u1bsUPROE0u/1GqVCmYm5vLt6lTp2Y4/6tXr5CamgobGxuF/TY2NoiJick05piYmGyV//TpE4YPH46OHTvCzMxMvv+3337D5s2bcfToUfTs2RN//vknhg0blq33T2z66qpo3759qFSpEhwcHNRVJRERERFRnuYlbYcwWYj8ZwcHB1SsWBH79+9Hhw4dRIxMtz1+/FghcRNjItDk5GS0b98egiBgyZIlCq8NGjRI/m8nJycYGhqiZ8+emDp1qs5MWqq2Fsm9e/dmOoiUiIiIiIiU17x5c4SGhoodhsYJGtoAwMzMTGHLLDkrUqQI9PT0EBsbq7A/NjYWtra2mcZsa2urVPm0JPLhw4cICwtTSGoz4+bmhpSUFDx48OCb5XLi5cuXOHXqFE6dOoWXL1/muD61JJIpKSk4cOAAmjdvzm6tREREREQ54OPjg9DQUMhkMrFD0ShNdm1VhqGhIVxcXBAeHi7fJ5PJEB4eDnd390yPcXd3VygPAGFhYQrl05LIO3fu4PDhwyhcuPB3Y4mKioJUKkXRokWVjl9ZiYmJ+PXXX1G8eHHUr18f9evXR/HixdG9e3d8+PBB5XrVkkhGRERAX18ftWrVUkd1RERERET5RvqGmDp16uDjx4+4fPmySBHlH4MGDcLy5cuxdu1a3Lx5E71790ZiYiICAgIAAF27dsXIkSPl5X///XeEhoZi1qxZuHXrFsaPH48LFy6gX79+AL4kkW3btsWFCxewceNGpKamIiYmBjExMUhKSgLwJXeaO3cuLl++jHv37mHjxo0YOHAgfvnlF1haWmrkGo8fP449e/YgPj4e8fHx2L17N44fP47BgwerXK9axkju3bsXzZo1g56enjqqIyIiIiLKtwwMDODp6YkDBw6gevXqYoejOV/3RVVnndng5+eHly9fYuzYsYiJiYGzszNCQ0PlE+o8evQIUun/t73VqVMHmzZtwujRozFq1CjY29tj165dqFq1KgDg6dOn2LNnDwDA2dlZ4VxHjx5Fw4YNYWRkhM2bN2P8+PH4/PkzypYti4EDByqMm1Sn7du3Y9u2bWjYsKF8X7NmzVCgQAG0b98+w/hNZUkEIburrWRUrVo1jBo1ijO2EhERERGp4OsJdwBg+fLlWLduHU6ePClSRJrz9u1bmJubo9zaUdAraKzWulM/fMI9/z+RkJDw3XGJ+UXBggURGRmJypUrK+y/fv06XF1dkZiYqFK9Oe7aGhMTg2vXrsHDw4NJJBERERGRGvj4+CAiIgLx8fFih6I5mhgfmY0xkvmFu7s7xo0bh0+fPsn3ffz4ERMmTMhyLKgycty19fDhw6hevTqKFCmS06qIiIiIiPKl9MuAlCpVCg4ODjh8+DDatm0rYmSk6+bNmwdvb2+ULFkS1apVAwBcvnwZxsbGOHjwoMr15jiRDAsLg5eXV06rISIiIiKirzRt2hShoaF5NpEUhC+buuskRVWrVsWdO3ewceNG3Lp1CwDQsWNHdO7cGQUKFFC53hwlkoIg4PDhw1i/fj27tRIRERERqVHTpk3RtWtXCIIAiYRdNkl1BQsWRGBgoFrrzFEiefv2bbx+/Rp16tQBoNpsP0RERERElFGdOnXw6tUrREdHo1KlSmKHo3bZXfdR2ToJ2LNnD5o2bQoDAwP5LLJZadGihUrnyFEiefToUdSpUwfGxuqdbYmIiIiIKL9JP07S2NgYderUwdGjR/NkIglNTI7DRBIA4Ovri5iYGBQtWhS+vr5ZlpNIJEhNTVXpHDmatfXo0aNo1KhRTqogIiIiIqIsNGrUCEePHhU7DNIxMpkMRYsWlf87q03VJBLIQSIpCAKOHTuGRo0acXwkEREREZEGNGrUCMeOHYMaln7PddIm21H3RorWrVuHz58/Z9iflJSEdevWqVyvyonk9evXkZiYCFdXV5VPTkREREREWXN1dcX79+9x48YNsUMhHRUQEICEhIQM+9+9e4eAgACV61U5kTx69Cjq1asHQ0NDlU9ORERERET/L31PP0NDQ9StWzdvdm8VNLSRgqxm/X3y5AnMzc1VrlflyXY4PpKIiIiISPPSxkn269dP7FBIh1SvXh0SiQQSiQQeHh7Q1///1C81NRX379+Hj4+PyvWrlEjKZDIcP34cw4cP5/hIIiIiIiINatSoEWbOnAmZTAapNEdzZeYqXP5Ds9Jma42KioK3tzdMTU3lrxkaGsLOzg5t2rRRuX6VEskrV64gOTkZLi4uKp+YiIiIiIi+z8XFBUlJSbh69SqqVasmdjikI8aNGwcAsLOzg5+fn9qXbFTpK41Tp07B3d1doXmUiIiIiIhyLn2PPwMDA9SpUwenTp0SKSIN4vhIjfP391d7EgmomEiePXsWtWvXVncsRERERESUCTc3N5w9e1bsMNQqrWurujdSlJqaipkzZ8LV1RW2trawsrJS2FSlciLp5uam8kmJiIiIiEh5eTGRJO2YMGECZs+eDT8/PyQkJGDQoEFo3bo1pFIpxo8fr3K92U4k4+LicOfOHbi6unKiHSIiIiIiLXB1dUV0dDTevHkjdijqw+U/tGLjxo1Yvnw5Bg8eDH19fXTs2BErVqzA2LFjcebMGZXrzXYief78eZQrVw5FihRR+aRERERERKQ8a2trlCtXDufOnRM7FNIxMTExcHR0BACYmpoiISEBAPDTTz9h3759Kteb7UQyKioKNWrUUPmERERERET0bZn1/KtevTouX74sQjSaItHQRl8rWbIknj9/DgAoX748Dh06BOBLA6GRkZHK9WY7kbxy5QqcnJxUPiEREREREWWfk5MTrly5InYYpGNatWqF8PBwAED//v0xZswY2Nvbo2vXrvj1119Vrjfb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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "engine": 0 + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[output:0]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA30AAAHqCAYAAACwdidrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAADUrUlEQVR4nOzdd3wT5R8H8E+66WbvTRmyikCZMqRQ9pLND2gVEGTIEAeigKgsByiyERBli6BsqAzZUMCCsjdI2S1SCm2T+/1RL2Tnktwlafp5v1550V4uT562X558v/c8d6cSBEEAEREREREReSQvV3eAiIiIiIiIlMOij4iIiIiIyIOx6CMiIiIiIvJgLPqIiIiIiIg8GIs+IiIiIiIiD8aij4iIiIiIyIOx6CMiIiIiIvJgLPqIiIiIiIg8mI+rO0BERERERDnLs2fPkJ6erkjbfn5+CAgIUKTt7IpFHxEREREROc2zZ89QumQwku6qFWm/UKFCuHLlCgs/HSz6iIiIiIjIadLT05F0V40rCSURGiLv2WaP/9WgdM1rSE9PZ9Gng0UfERERERE5XWiIl+xFH5nGoo+IiIiIiJxOLWigFuRvk4yxtCYiIiIiIvJgnOkjIiIiIiKn00CABvJO9cndnqfgTB8REREREZEH40wfERERERE5nQYayH0GnvwtegbO9BEREREREXkwzvQREREREZHTqQUBakHec/Dkbs9TsOgjIiIiIiKn44VcnIfLO4mIiIiIiDwYZ/qIiIiIiMjpNBCg5kyfU3Cmj4iIiIiIyINxpo+IiIiIiJyO5/Q5D2f6iIiIiIiIPBhn+oiIiIiIyOl4ywbn4UwfERERERGRB+NMHxEREREROZ3mv4fcbZIxFn1EREREROR0agVu2SB3e56CyztJFk2aNEGTJk1c3Q1yMSXiYMmSJVCpVLh69aqs7Uqxe/duqFQq7N69W7H3UKlUmDBhgs2vmzBhAlQqlfwdckNKxJVGo0GVKlXw2WefydouWVaqVCnExsa6uhvZguHvypHxaO7cuShRogSeP38uXweJKFth0ZdDXbp0CW+++SbKlCmDgIAAhIaGokGDBpg5cybS0tJc3T2nU6lUGDp0qF2vXb58OWbMmCFvhxR04MABTJgwAcnJyS7th1qtxuLFi9GkSRPkyZMH/v7+KFWqFOLi4nDs2DGX9s1WYmGqUqmwb98+o+cFQUDx4sWhUqnQtm1bF/RQXrGxsdqfV6VSwd/fH+XLl8fHH3+MZ8+e2dXm33//jQkTJjituF+xYgVu3Lih9//+6NGjGDp0KCpXroygoCCUKFEC3bp1w/nz5022cebMGbRs2RLBwcHIkycP+vTpg3v37ina76dPn+K7775DixYtULhwYYSEhKBGjRqYM2cO1Gq10f4ajQbTpk1D6dKlERAQgGrVqmHFihWK9lEps2fPxpIlS1zdDVk5azyOjY1Feno65s2bp+j7ENlKLSjzIGNc3pkDbdq0CV27doW/vz/69u2LKlWqID09Hfv27cOYMWPw119/Yf78+a7uZraxfPlynD59GiNGjHB1VyQ5cOAAJk6ciNjYWISHh7ukD2lpaejcuTO2bt2KRo0aYezYsciTJw+uXr2K1atXY+nSpbh+/TqKFSvmkv7ZKyAgAMuXL0fDhg31tu/Zswc3b96Ev7+/0WvS0tLg42P7UDxu3Di8//77dvfVUf7+/li4cCEAICUlBRs2bMCkSZNw6dIl/PTTTza39/fff2PixIlo0qQJSpUqpffc9u3b5eiynunTp6NHjx4ICwvTbps6dSr279+Prl27olq1akhKSsKsWbPw8ssv49ChQ6hSpYp235s3b6JRo0YICwvD559/jidPnuCLL77AqVOncOTIEfj5+cneZwC4fPkyhg0bhmbNmmHUqFEIDQ3Ftm3b8NZbb+HQoUNYunSp3v4ffvghpkyZggEDBqB27drYsGEDevXqBZVKhR49eijSR0vOnTsHLy/7jjfPnj0b+fLl86iZQkvjsSO/K0MBAQHo168fvvrqKwwbNizHrBIgohdY9OUwV65cQY8ePVCyZEn8/vvvKFy4sPa5IUOG4OLFi9i0aZMLe0i2Sk1NRVBQkKu7YZMxY8Zg69at+Prrr42K5fHjx+Prr792Tccc1Lp1a6xZswbffPONXiG3fPly1KxZE/fv3zd6TUBAgF3v5ePjY1exKBcfHx/873//037/1ltvoX79+lixYgW++uorFCxYULb3kruAOnHiBP788098+eWXettHjRqF5cuX671f9+7dUbVqVUyZMgU//vijdvvnn3+O1NRUJCQkoESJEgCAqKgoNG/eHEuWLMHAgQNl7bOoUKFCOHXqFCpXrqzd9uabb+L111/H4sWL8dFHH6FcuXIAgFu3buHLL7/EkCFDMGvWLABA//790bhxY4wZMwZdu3aFt7e3Iv00x9SBD09n7xgt9++qW7dumDZtGnbt2oVXX31V1raJ7MULuTgPl3fmMNOmTcOTJ0+waNEivYJPVK5cObz99tva7zMzMzFp0iSULVtWu/xu7NixVs8LMHcelqlzEpo0aYIqVaogMTERjRs3RmBgIMqVK4e1a9cCyJolqVOnDnLlyoUKFSpg586dem2K5zZdvHhRe7Q0LCwMcXFxePr0qY2/If1+rl69Gp999hmKFSuGgIAANGvWDBcvXtTr+6ZNm3Dt2jXtUjfdWYrnz59j/PjxKFeuHPz9/VG8eHG8++67Rr+/tLQ0DB8+HPny5UNISAjat2+PW7duGZ3vJf6sf//9N3r16oXcuXNrZ5USExMRGxurXbJbqFAhvP7663jw4IHe68eMGQMAKF26tLbPun+nH3/8ETVr1kSuXLmQJ08e9OjRAzdu3DD6Hc2fPx9ly5ZFrly5EBUVhT/++EPS7/bmzZuYN28emjdvbnJ21NvbG++8847VWb7Zs2ejcuXK8Pf3R5EiRTBkyBCjJVLmzh8ydY7YzZs30bFjRwQFBaFAgQIYOXKkzee/9OzZEw8ePMCOHTu029LT07F27Vr06tXL5Gt0/8ZpaWmoWLEiKlasqLfM+uHDhyhcuDDq16+vXcJn6pw+cZny+vXrUaVKFfj7+6Ny5crYunWr0fvu3r0btWrVQkBAAMqWLYt58+Y5dJ6gSqVCw4YNIQgCLl++rN1+7do1vPXWW6hQoQJy5cqFvHnzomvXrnoxt2TJEnTt2hUA0LRpU21ciuOEqb/X3bt38cYbb6BgwYIICAhA9erVjWa5zFm/fj38/PzQqFEjve3169c3KjAjIiJQuXJlnDlzRm/7zz//jLZt22oLPgCIjo5G+fLlsXr1aovvP378eHh5eSE+Pl5v+8CBA+Hn54c///zT7Gvz5cunV/CJOnXqBAB6/dywYQMyMjLw1ltvabepVCoMHjwYN2/exMGDBy32MzY2FsHBwbh8+TJiYmIQFBSEIkWK4JNPPoFgcB+s1NRUjB49GsWLF4e/vz8qVKiAL774wmg/w/+T4mfF/v37MWrUKOTPnx9BQUHo1KmT3lLZUqVK4a+//sKePXu08SHGREZGBiZOnIiIiAgEBAQgb968aNiwod7/Q1PE9967dy/efPNN5M2bF6Ghoejbty8ePXpktP+WLVvwyiuvICgoCCEhIWjTpg3++usvk7+zS5cuoXXr1ggJCUHv3r1Nvr+18Vjq+Y+HDx9Gy5YtERYWhsDAQDRu3Bj79+832q9mzZrIkycPNmzYYLVNIvI8nOnLYX777TeUKVMG9evXl7R///79sXTpUnTp0gWjR4/G4cOHMXnyZJw5cwa//PKLbP169OgR2rZtix49eqBr166YM2cOevTogZ9++gkjRozAoEGD0KtXL0yfPh1dunTBjRs3EBISotdGt27dULp0aUyePBnHjx/HwoULUaBAAUydOtXufk2ZMgVeXl545513kJKSgmnTpqF37944fPgwgKylUykpKbh586Z2dio4OBhA1rk07du3x759+zBw4EBUqlQJp06dwtdff43z589j/fr12veJjY3F6tWr0adPH9StWxd79uxBmzZtzPara9euiIiIwOeff65Nqnbs2IHLly8jLi4OhQoV0i7T/euvv3Do0CGoVCp07twZ58+fx4oVK/D1118jX758AID8+fMDAD777DN89NFH6NatG/r374979+7h22+/RaNGjXDixAnt8qNFixbhzTffRP369TFixAhcvnwZ7du3R548eVC8eHGLv9MtW7YgMzMTffr0sf0P8p8JEyZg4sSJiI6OxuDBg3Hu3DnMmTMHR48exf79++Hr62tTe2lpaWjWrBmuX7+O4cOHo0iRIli2bBl+//13m9opVaoU6tWrhxUrVqBVq1YAsn7elJQU9OjRA998843F1+fKlQtLly5FgwYN8OGHH+Krr74CkDULn5KSgiVLllidmdm3bx/WrVuHt956CyEhIfjmm2/w2muv4fr168ibNy+ArJmuli1bonDhwpg4cSLUajU++eQTbRzYS0xWc+fOrd129OhRHDhwAD169ECxYsVw9epVzJkzB02aNMHff/+NwMBANGrUCMOHD8c333yDsWPHolKlSgCg/ddQWloamjRpgosXL2Lo0KEoXbo01qxZg9jYWCQnJ+sduDLlwIEDqFKliqQ4EQQBd+7c0Su0bt26hbt376JWrVpG+0dFRWHz5s0W2xw3bhx+++03vPHGGzh16hRCQkKwbds2LFiwAJMmTUL16tWt9stQUlISAGj/TwNZf+egoCCj32NUVJT2ecOlyIbUajVatmyJunXrYtq0adi6dSvGjx+P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ysvLcezYMWzatIkNHxGx6aNqHTt2xKZNm2yavwkTJuDUqVOSy3OWj4iISB6tG75Tp05hwoQJ6NSpE27evInjx4+z2SPfoPrjGjS4MYyfYNNHNsTm7/jx4xAEAffeey+GDBmCvXv3QuD/RERERF5BEATs3bsXQ4YMwb333gtBEHD8+HG899576NChg9GbR0Rehk0fSerQoQPefvttFBUVITIyEomJiYiJicFHH32EyspKVS80JyIi8ldq7xsrKyvx0UcfISYmBsOGDUOXLl1QVFSEt99+m80e+R7O9OnGJHD6hmS4du0a3n77bfztb38DAMycORNPPvkk6tWrp2g9PC2UiIgCiVpNn/1+eNasWUhOTla8HybyBlevXkXDhg3R7/+eQ63gUFXXXVl1Azn/WorS0lI0aNBA1XX7MjZ9pEhlZSXS09OxZMkSfPPNN0hOTsbTTz+Nu+++2+N1syEkIiJ/okbD980332DdunV455130L59ezz//PMYPnw4atXiDdjJd1mavk5/1KbpO7WMTZ8djhikSK1atTB69GiMGjUKBQUFWL16Ne655x7069cPzzzzDAYNGoSgIPfOGna2c2RDSEREgcJsNiMzMxOrV6/G7t27MXLkSHzxxReIjY2FyWQyevOIyAex6SO3mEwmxMXFIS4uDhcuXMBbb72FiRMnok6dOpg6dSqSk5PRuHFj1T5PqiFkI0hERN7KnVm+X375Be+88w7Wrl2L3377DVOmTME777yD8PBwDbaQyAuYAah9HIMPZ5fE0ztJNRUVFUhPT8eaNWtw+PBhjB07FpMmTULPnj1VPzLJho+IiNRk1M3IBEHAwYMHkZqairS0NERHR+OZZ57BsGHDEBISYsg2EWlNPL2zf4dZmpzemX12OU/vtMOZPlJNSEgIkpKSkJSUhKNHjyI1NRUDBgxAu3btkJKSgkcffRSNGjXy6DPY7BERkTVfvXP0lStX8P777+Ott95CcXExHn30UeTl5aFr165GbxoR+SE+soE0ERUVhXXr1uHChQuYMWMG3n//fbRs2RJPPPEE8vLy3HrmHxs+IiIS+eKjggRBQF5eHp544gm0bNkS//jHPzBjxgycP38e69atY8NHgYePbNANmz7SVN26dZGcnIz8/HwUFBSgfv36eOihh9C5c2csXboUFy5ccLmOAUGj2PAREREA32z2Lly4gKVLl6Jz58546KGH0KBBAxw4cAD5+flITk5G3bp1jd5EIvJzvKaPdHf9+nVs3boV7777LnJzczFgwACMHz8eDz/8MMLCwmyWZbNHRESA753GWV5ejm3btmHjxo3Izs5G3759MX78eIwYMQJ16tQxevOIDGW5pu+uGdpc0/fvFbymzw5n+kh3derUwbhx45CdnY1vv/0WvXr1wosvvogWLVrgqaeeQkFBgVunfxIRkf/xpZk9QRBQUFCAKVOmoEWLFpg3bx569+6Nb7/9FtnZ2Rg3bhwbPiIyBGf6yCsIgoD8/Hy8++67+PDDD9GsWTOMGTMGY8aMQefOnVX7HM4cEpE38LYmxtvGRm/7+3Hl5MmT2Lx5M9LS0nD58mUkJSVh/PjxiIuL43P1iCRYZvrunK7NTN9/VnKmzw6bPvI65eXl+OKLL5CWlobt27fjzjvvxNixY5GUlIS7777b6M1zytsKJyLyjK81H97Ak3HQl/6+v/32W6SlpSEtLQ3/+c9/8PDDD2PMmDEYNGhQjUsViMgWmz79sekjr3bt2jVs374dmzdvxs6dOxEZGYnhw4cjMTERnTp18ssjqGwciWrypWaA/JMgCDh16hQyMjKQnp6OEydOYNCgQRgzZgyGDBmCevXqGb2JRD7jVtM3DbWCVG76zDeQ/Z9VbPrssOkjn/HLL7/g008/RUZGBnbu3InWrVsjMTERiYmJiI2NRVCQf12iyuaPtMIGikges9mMgoICZGRkICMjA99//z0GDhyIxMREDB06FI0bNzZ6E4l8kqXpa/esNk1f0Wo2fXbY9JFPKisrQ1ZWFjIyMrB9+3aEhIQgISEBAwYMwIABAxAeHm70JqqGzZ93YwNF5F9KSkqQlZWFrKws7Nq1CxUVFRgyZAgSExMxYMAAPl6BSAVs+vTHpo98XmVlJfbv349du3Zh165dOHz4MO655x4kJCSgbdu2fnWntKUT1hm9CZp67u9Tjd4EIgpA4qmbu3btwtdff41u3bohISEBCQkJ6N27N2rVqmX0JhL5FUvTd8cz2jR9361h02eHTR/5ncuXLyMnJwe5ubn45ptvYDabjd4k1f12rRw3rt+w+V5oHdtB87Z6vJEAEZFcd9xxBxISEtCvXz80bdrU6M0h8mts+vTHQ1fkd5o2bYrRo0dj9OjRRm8KERERETkimKtfaq+TavCvO18QERERERGRDc70ERERERGR/gSh+qX2OqkGzvQRERERERH5Mc70ERERERGR/swCAJVn5syc6ZPCpo+IiIiIiPTH0zt1w9M7iYiIiIiI/Bhn+oiIiIiISH8CNJjpU3d1/oIzfURERERERH6MM31ERERERKQ/XtOnG870ERERERER+THO9BERERERkf7MZgBmDdZJ9jjTR0RERERE5Mc400dERERERPrjNX26YdNHRERERET6Y9OnG57eSURERERE5Mc400dERERERPozC1D9aepmzvRJ4UwfERERERGRH+NMHxERERER6U4QzBAEdR+xoPb6/AVn+oiIiIiIiPwYZ/qIiIiIiEh/gqD+NXi8e6ckzvQRERERERH5Mc70ERERERGR/gQN7t7JmT5JbPqIiIiIiEh/ZjNgUvnGK7yRiySe3klEREREROTHONNHRERERET64+mduuFMHxERERERkR/jTB8REREREelOMJshqHxNHx/OLo0zfURERERERH6MM31ERERERKQ/XtOnG870ERERERER+THO9BERERERkf7MAmDiTJ8e2PQREREREZH+BAGA2g9nZ9Mnhad3EhERERER+THO9BERERERke4EswBB5dM7Bc70SeJMHxERERERkR/jTB8REREREelPMEP9a/r4cHYpnOkjIiIiIiLyY2z6iIiIiIhId4JZ0OSl1Nq1a9G2bVuEhYUhJiYGBw8edLr8li1bEBERgbCwMERGRmLHjh22v5cg4KWXXkKLFi1w2223oX///vjmm28Ub5ea2PQREREREVFA+vDDDzFr1izMnz8fhw8fRteuXTFw4ED8+OOPksvn5eVh7NixmDBhAo4cOYLExEQkJibi5MmTlmVef/11rFq1CuvXr8eBAwdQt25dDBw4EOXl5Xr9WjWYBN7ihoiIiIiIdHL16lU0bNgQ92MoaplCVF13pVCBL/EpSktL0aBBA5fLx8TEoEePHlizZg0AwGw2o3Xr1nj22WcxZ86cGssnJSWhrKwMn332meV7sbGxiIqKwvr16yEIAlq2bIk//vGPeO655wAApaWlaN68OTZu3IgxY8ao9Jsqw5k+IiIiIiLSXSUqUCmo/EIFgOrG0vp148aNGp9/8+ZNHDp0CP3797d8LygoCP3790d+fr7kNufn59ssDwADBw60LF9UVISSkhKbZRo2bIiYmBiH69QD795JRERERES6qV27NsLDw/FVyQ7XC7uhXr16aN26tc335s+fj5dfftnme5cuXUJVVRWaN29u8/3mzZvj9OnTkusuKSmRXL6kpMTyc/F7jpYxAps+IiIiIiLSTVhYGIqKinDz5k1N1i8IAkwmk833QkNDNfksX8Gmj4iIiIiIdBUWFoawsDBDt6FZs2YIDg7GxYsXbb5/8eJFhIeHS74nPDzc6fLify9evIgWLVrYLBMVFaXi1ivDa/qIiIiIiCjg1K5dG9HR0cjJybF8z2w2IycnB3FxcZLviYuLs1keALKysizLt2vXDuHh4TbLXL16FQcOHHC4Tj1wpo+IiIiIiALSrFmzMH78eHTv3h09e/bEihUrUFZWhuTkZADA448/jlatWuHVV18FAEyfPh3x8fFYtmwZBg8ejLS0NBQWFiI1NRUAYDKZMGPGDCxatAjt27dHu3bt8Oc//xktW7ZEYmKiUb8mmz4iIiIiIgpMSUlJ+Omnn/DSSy+hpKQEUVFRyMzMtNyI5dy5cwgKunVyZK9evfDBBx9g3rx5mDt3Ltq3b4+MjAx07tzZsszs2bNRVlaGlJQUXLlyBX369EFmZqahp7PyOX1ERERERER+jNf0ERERERER+TE2fURERERERH6MTR8REREREZEfY9NHRERERETkx9j0ERERERER+TE2fURERERERH6MTR8REREREZEfY9NHRERERETkx9j0ERERERER+TE2fURERERERH6MTR8REREREZEf+/+o6NAgC4/6AgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "engine": 0 + }, + "output_type": "display_data" + } + ], + "source": [ + "if mpi_rank == 0:\n", + " rotation = -120.\n", + " nx = temperature.shape[1]\n", + " nz = temperature.shape[3]\n", + " \n", + " u_mean = 0.5 * (u_wind.data[:,:,:-1, :] + u_wind.data[:,:, 1:, :])\n", + " column_qvap = np.sum(qvap, axis=3)/nz\n", + " column_qcld = np.sum(qcld, axis=3)/nz\n", + " column_qrain = np.sum(qrain, axis=3)/nz\n", + " \n", + " fig = plt.figure(figsize=(12, 6))\n", + " ax = fig.add_subplot(111, projection=ccrs.Robinson())\n", + " f1 = pcolormesh_cube(\n", + " grid_lat.data * 180./np.pi,\n", + " grid_lon.data * 180./np.pi + rotation,\n", + " temperature.data[:, :, :, -2],\n", + " cmap=\"viridis\",\n", + " )\n", + " plt.colorbar(f1, label=\"Temperature (K)\")\n", + " ax.set_title(f\"Temperature ({nx} x {nx} points per tile)\")\n", + " \n", + " fig = plt.figure(figsize=(12, 6))\n", + " ax = fig.add_subplot(111, projection=ccrs.Robinson())\n", + " f1 = pcolormesh_cube(\n", + " grid_lat.data * 180./np.pi,\n", + " grid_lon.data * 180./np.pi + rotation,\n", + " surface_pressure.data[:, :, :]/100.,\n", + " cmap=\"viridis\",\n", + " )\n", + " plt.colorbar(f1, label=\"Surface Pressure (hPa)\")\n", + " ax.set_title(f\"Surface Pressure ({nx} x {nx} points per tile)\")\n", + " \n", + " \n", + " fig = plt.figure(figsize=(12, 6))\n", + " ax = fig.add_subplot(111, projection=ccrs.Robinson())\n", + " f1 = pcolormesh_cube(\n", + " grid_lat.data * 180./np.pi,\n", + " grid_lon.data * 180./np.pi + rotation,\n", + " column_qvap,\n", + " cmap=\"viridis\",\n", + " )\n", + " plt.colorbar(f1, label=\"water vapor mixing ratio\")\n", + " ax.set_title(f\"Column-Integrated Water Vapor Mixing Ratio ({nx} x {nx} points per tile)\")\n", + " \n", + "\n", + " fig = plt.figure(figsize=(12, 6))\n", + " ax = fig.add_subplot(111, projection=ccrs.Robinson())\n", + " f1 = pcolormesh_cube(\n", + " grid_lat.data * 180./np.pi,\n", + " grid_lon.data * 180./np.pi + rotation,\n", + " column_qrain,\n", + " cmap=\"viridis\",\n", + " )\n", + " plt.colorbar(f1, label=\"rain mixing ratio\")\n", + " ax.set_title(f\"Column-Integrated Rain Mixing Ratio ({nx} x {nx} points per tile)\")\n", + " \n", + " fig = plt.figure(figsize=(12, 6))\n", + " ax = fig.add_subplot(111, projection=ccrs.Robinson())\n", + " f1 = pcolormesh_cube(\n", + " grid_lat.data * 180./np.pi,\n", + " grid_lon.data * 180./np.pi + rotation,\n", + " column_qcld,\n", + " cmap=\"viridis\",\n", + " )\n", + " plt.colorbar(f1, label=\"cloud mixing ratio\")\n", + " ax.set_title(f\"Column-Integrated Cloud Mixing Ratio ({nx} x {nx} points per tile)\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "34e8724a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From fa6097eebff75dd25e96391c47000f616e5bc66b Mon Sep 17 00:00:00 2001 From: Oliver Elbert Date: Thu, 25 Apr 2024 08:46:46 -0400 Subject: [PATCH 02/75] fixing dockerfile overriding netcdf, mpi4py, and numpy versions with mutually incompatible versions (#84) --- Dockerfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index dca0e1924..e1ab0d48f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -32,9 +32,6 @@ RUN cd / && \ ENV CFLAGS="-I/usr/include -DACCEPT_USE_OF_DEPRECATED_PROJ_API_H=1" RUN python3 -m pip install \ - numpy==1.21.2 \ - netCDF4==1.5.7 \ - mpi4py==3.1.1 \ matplotlib==3.5.2 \ ipyparallel==8.4.1 \ jupyterlab==3.4.4 \ From 74ccf31f65e138183c0b8cb9f4aaaa6c949e12c6 Mon Sep 17 00:00:00 2001 From: MiKyung Lee <58964324+mlee03@users.noreply.github.com> Date: Fri, 10 May 2024 13:39:12 -0400 Subject: [PATCH 03/75] Update notebooks for eta file creations (#85) * updated generate_eta_files * remove notebook, add script * lint --------- Co-authored-by: mlee03 --- examples/generate_eta_files.py | 399 ++++++++++++++++++ .../notebooks/generate_eta_file_netcdf.ipynb | 148 ------- .../notebooks/generate_eta_file_xarray.ipynb | 140 ------ 3 files changed, 399 insertions(+), 288 deletions(-) create mode 100755 examples/generate_eta_files.py delete mode 100644 examples/notebooks/generate_eta_file_netcdf.ipynb delete mode 100644 examples/notebooks/generate_eta_file_xarray.ipynb diff --git a/examples/generate_eta_files.py b/examples/generate_eta_files.py new file mode 100755 index 000000000..1fb4d5ee2 --- /dev/null +++ b/examples/generate_eta_files.py @@ -0,0 +1,399 @@ +import numpy as np +import xarray as xr + + +""" +This notebook uses the python xarray module +to create an eta_file containing ak and bk coefficients +for km=79 and km=91. The coefficients are written out to +eta79.nc and eta91.nc netcdf files respectively + +To run this script: `python3 ./generate_eta_files.py` +""" + +# km = 79 +ak = xr.DataArray( + dims=["km1"], + attrs=dict(units="Pa", _FillValue=False), + data=np.array( + [ + 3.000000e02, + 6.467159e02, + 1.045222e03, + 1.469188e03, + 1.897829e03, + 2.325385e03, + 2.754396e03, + 3.191294e03, + 3.648332e03, + 4.135675e03, + 4.668282e03, + 5.247940e03, + 5.876271e03, + 6.554716e03, + 7.284521e03, + 8.066738e03, + 8.902188e03, + 9.791482e03, + 1.073499e04, + 1.162625e04, + 1.237212e04, + 1.299041e04, + 1.349629e04, + 1.390277e04, + 1.422098e04, + 1.446058e04, + 1.462993e04, + 1.473633e04, + 1.478617e04, + 1.478511e04, + 1.473812e04, + 1.464966e04, + 1.452370e04, + 1.436382e04, + 1.417324e04, + 1.395491e04, + 1.371148e04, + 1.344540e04, + 1.315890e04, + 1.285407e04, + 1.253280e04, + 1.219685e04, + 1.184788e04, + 1.148739e04, + 1.111682e04, + 1.073748e04, + 1.035062e04, + 9.957395e03, + 9.558875e03, + 9.156069e03, + 8.749922e03, + 8.341315e03, + 7.931065e03, + 7.519942e03, + 7.108648e03, + 6.698281e03, + 6.290007e03, + 5.884984e03, + 5.484372e03, + 5.089319e03, + 4.700960e03, + 4.320421e03, + 3.948807e03, + 3.587201e03, + 3.236666e03, + 2.898237e03, + 2.572912e03, + 2.261667e03, + 1.965424e03, + 1.685079e03, + 1.421479e03, + 1.175419e03, + 9.476516e02, + 7.388688e02, + 5.497130e02, + 3.807626e02, + 2.325417e02, + 1.054810e02, + -8.381903e-04, + 0.000000e00, + ] + ), +) +bk = xr.DataArray( + dims=["km1"], + attrs=dict(units="None", _FillValue=False), + data=np.array( + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.00106595, + 0.00412866, + 0.00900663, + 0.01554263, + 0.02359921, + 0.03305481, + 0.0438012, + 0.05574095, + 0.06878554, + 0.08285347, + 0.09786981, + 0.1137643, + 0.130471, + 0.1479275, + 0.1660746, + 0.1848558, + 0.2042166, + 0.2241053, + 0.2444716, + 0.2652672, + 0.286445, + 0.3079604, + 0.3297701, + 0.351832, + 0.3741062, + 0.3965532, + 0.4191364, + 0.4418194, + 0.4645682, + 0.48735, + 0.5101338, + 0.5328897, + 0.5555894, + 0.5782067, + 0.6007158, + 0.6230936, + 0.6452944, + 0.6672683, + 0.6889648, + 0.7103333, + 0.7313231, + 0.7518838, + 0.7719651, + 0.7915173, + 0.8104913, + 0.828839, + 0.846513, + 0.8634676, + 0.8796583, + 0.8950421, + 0.9095779, + 0.9232264, + 0.9359506, + 0.9477157, + 0.9584892, + 0.9682413, + 0.9769447, + 0.9845753, + 0.9911126, + 0.9965372, + 1.0, + ] + ), +) +coefficients = xr.Dataset(data_vars={"ak": ak, "bk": bk}) +coefficients.to_netcdf("eta79.nc") + + +# km = 91 +ak = xr.DataArray( + dims=["km1"], + attrs=dict(units="Pa", _FillValue=False), + data=np.array( + [ + 1.00000000e00, + 1.75000000e00, + 2.75000000e00, + 4.09999990e00, + 5.98951054e00, + 8.62932968e00, + 1.22572632e01, + 1.71510906e01, + 2.36545467e01, + 3.21627693e01, + 4.31310921e01, + 5.71100426e01, + 7.46595764e01, + 9.64470978e01, + 1.23169769e02, + 1.55601318e02, + 1.94594009e02, + 2.41047531e02, + 2.95873840e02, + 3.60046967e02, + 4.34604828e02, + 5.20628723e02, + 6.19154846e02, + 7.31296021e02, + 8.58240906e02, + 1.00106561e03, + 1.16092859e03, + 1.33903992e03, + 1.53650012e03, + 1.75448938e03, + 1.99417834e03, + 2.25667407e03, + 2.54317139e03, + 2.85476392e03, + 3.19258569e03, + 3.55775366e03, + 3.95135107e03, + 4.37428662e03, + 4.82711084e03, + 5.31022168e03, + 5.82387793e03, + 6.36904248e03, + 6.94875244e03, + 7.56691992e03, + 8.22634277e03, + 8.93120996e03, + 9.68446191e03, + 1.04822725e04, + 1.13182793e04, + 1.21840771e04, + 1.30655674e04, + 1.39532207e04, + 1.48307285e04, + 1.56872617e04, + 1.65080645e04, + 1.72810996e04, + 1.79942988e04, + 1.86363223e04, + 1.91961797e04, + 1.96640723e04, + 2.00301914e04, + 2.02853691e04, + 2.04215254e04, + 2.04300684e04, + 2.03028730e04, + 2.00323711e04, + 1.96110664e04, + 1.90313848e04, + 1.82866426e04, + 1.73777930e04, + 1.63224639e04, + 1.51444033e04, + 1.38725674e04, + 1.25404785e04, + 1.11834170e04, + 9.83532715e03, + 8.52630664e03, + 7.28224512e03, + 6.12326074e03, + 5.06350684e03, + 4.11124902e03, + 3.27000122e03, + 2.53922729e03, + 1.91530762e03, + 1.39244995e03, + 9.63134766e02, + 6.20599365e02, + 3.57989502e02, + 1.69421387e02, + 5.10314941e01, + 2.48413086e00, + 0.00000000e00, + ] + ), +) +bk = xr.DataArray( + dims=["km1"], + attrs=dict(units="None", _FillValue=False), + data=np.array( + [ + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 3.50123992e-06, + 2.81484008e-05, + 9.38666999e-05, + 2.28561999e-04, + 5.12343016e-04, + 1.04712998e-03, + 1.95625005e-03, + 3.42317997e-03, + 5.58632007e-03, + 8.65428988e-03, + 1.27844000e-02, + 1.81719996e-02, + 2.49934997e-02, + 3.34198996e-02, + 4.36249003e-02, + 5.57769015e-02, + 7.00351968e-02, + 8.65636021e-02, + 1.05520003e-01, + 1.27051994e-01, + 1.51319996e-01, + 1.78477004e-01, + 2.08675995e-01, + 2.42069006e-01, + 2.78813988e-01, + 3.19043010e-01, + 3.62558991e-01, + 4.08596009e-01, + 4.56384987e-01, + 5.05111992e-01, + 5.53902984e-01, + 6.01903021e-01, + 6.48333013e-01, + 6.92534983e-01, + 7.33981013e-01, + 7.72292018e-01, + 8.07236016e-01, + 8.38724971e-01, + 8.66774976e-01, + 8.91497016e-01, + 9.13065016e-01, + 9.31702971e-01, + 9.47658002e-01, + 9.61175978e-01, + 9.72495019e-01, + 9.81844008e-01, + 9.89410996e-01, + 9.95342016e-01, + 1.00000000e00, + ] + ), +) +coefficients = xr.Dataset(data_vars={"ak": ak, "bk": bk}) +coefficients.to_netcdf("eta91.nc") + +# km = diff --git a/examples/notebooks/generate_eta_file_netcdf.ipynb b/examples/notebooks/generate_eta_file_netcdf.ipynb deleted file mode 100644 index bf9623c79..000000000 --- a/examples/notebooks/generate_eta_file_netcdf.ipynb +++ /dev/null @@ -1,148 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "2c056479", - "metadata": { - "lines_to_next_cell": 0 - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8c96fbff", - "metadata": {}, - "outputs": [], - "source": [ - "import netCDF4 as nc\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6827b1b5", - "metadata": {}, - "outputs": [], - "source": [ - "\"\"\"\n", - "This notebook uses the python netCDF4 module\n", - "to create an eta_file containg\n", - "ak and bk coefficients for km=79\n", - "\"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "45d4a704", - "metadata": {}, - "outputs": [], - "source": [ - "#create a Dataset instance\n", - "coefficients = nc.Dataset(\"eta79.nc\", \"w\", format=\"NETCDF4\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b964a014", - "metadata": {}, - "outputs": [], - "source": [ - "#Set dimensionsion\n", - "km = coefficients.createDimension(\"km\", 80)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d51c395f", - "metadata": {}, - "outputs": [], - "source": [ - "#Create ak and bk variables\n", - "ak = coefficients.createVariable(\"ak\", np.float64, (\"km\"))\n", - "bk = coefficients.createVariable(\"bk\", np.float64, (\"km\"))\n", - "ak.units=\"\"\n", - "bk.units=\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6723352e", - "metadata": {}, - "outputs": [], - "source": [ - "#Assign and write out values of ak\n", - "ak[:] = np.array(\n", - " [ 3.000000e+02, 6.467159e+02, 1.045222e+03, 1.469188e+03, 1.897829e+03,\n", - " 2.325385e+03, 2.754396e+03, 3.191294e+03, 3.648332e+03, 4.135675e+03,\n", - " 4.668282e+03, 5.247940e+03, 5.876271e+03, 6.554716e+03, 7.284521e+03,\n", - " 8.066738e+03, 8.902188e+03, 9.791482e+03, 1.073499e+04, 1.162625e+04,\n", - " 1.237212e+04, 1.299041e+04, 1.349629e+04, 1.390277e+04, 1.422098e+04,\n", - " 1.446058e+04, 1.462993e+04, 1.473633e+04, 1.478617e+04, 1.478511e+04,\n", - " 1.473812e+04, 1.464966e+04, 1.452370e+04, 1.436382e+04, 1.417324e+04,\n", - " 1.395491e+04, 1.371148e+04, 1.344540e+04, 1.315890e+04, 1.285407e+04,\n", - " 1.253280e+04, 1.219685e+04, 1.184788e+04, 1.148739e+04, 1.111682e+04,\n", - " 1.073748e+04, 1.035062e+04, 9.957395e+03, 9.558875e+03, 9.156069e+03,\n", - " 8.749922e+03, 8.341315e+03, 7.931065e+03, 7.519942e+03, 7.108648e+03,\n", - " 6.698281e+03, 6.290007e+03, 5.884984e+03, 5.484372e+03, 5.089319e+03,\n", - " 4.700960e+03, 4.320421e+03, 3.948807e+03, 3.587201e+03, 3.236666e+03,\n", - " 2.898237e+03, 2.572912e+03, 2.261667e+03, 1.965424e+03, 1.685079e+03,\n", - " 1.421479e+03, 1.175419e+03, 9.476516e+02, 7.388688e+02, 5.497130e+02,\n", - " 3.807626e+02, 2.325417e+02, 1.054810e+02, -8.381903e-04, 0.000000e+00] )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "195c9ef5", - "metadata": {}, - "outputs": [], - "source": [ - "#Assign and write out values of bk \n", - "bk[:] = np.array(\n", - " [ 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0.,\n", - " 0., 0.00106595, 0.00412866, 0.00900663, 0.01554263, 0.02359921,\n", - " 0.03305481, 0.0438012, 0.05574095, 0.06878554, 0.08285347, 0.09786981,\n", - " 0.1137643, 0.130471, 0.1479275, 0.1660746, 0.1848558, 0.2042166,\n", - " 0.2241053, 0.2444716, 0.2652672, 0.286445, 0.3079604, 0.3297701,\n", - " 0.351832, 0.3741062, 0.3965532, 0.4191364, 0.4418194, 0.4645682,\n", - " 0.48735, 0.5101338, 0.5328897, 0.5555894, 0.5782067, 0.6007158,\n", - " 0.6230936, 0.6452944, 0.6672683, 0.6889648, 0.7103333, 0.7313231,\n", - " 0.7518838, 0.7719651, 0.7915173, 0.8104913, 0.828839, 0.846513,\n", - " 0.8634676, 0.8796583, 0.8950421, 0.9095779, 0.9232264, 0.9359506,\n", - " 0.9477157, 0.9584892, 0.9682413, 0.9769447, 0.9845753, 0.9911126,\n", - " 0.9965372, 1. ] )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c0f3bd9d", - "metadata": {}, - "outputs": [], - "source": [ - "#Close netcdf file\n", - "coefficients.close()" - ] - } - ], - "metadata": { - "jupytext": { - "cell_metadata_filter": "-all", - "executable": "/usr/bin/env python3", - "main_language": "python", - "notebook_metadata_filter": "-all" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/notebooks/generate_eta_file_xarray.ipynb b/examples/notebooks/generate_eta_file_xarray.ipynb deleted file mode 100644 index a47b09e62..000000000 --- a/examples/notebooks/generate_eta_file_xarray.ipynb +++ /dev/null @@ -1,140 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "6dc5fe4c", - "metadata": { - "lines_to_next_cell": 0 - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "81be9a15", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import xarray as xr" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c74c6c07", - "metadata": {}, - "outputs": [], - "source": [ - "\"\"\"\n", - "This notebook uses the python xarray module\n", - "to create an eta_file containg\n", - "ak and bk coefficients for km=79\n", - "\"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f72c5d5b", - "metadata": {}, - "outputs": [], - "source": [ - "#Assign ak data\n", - "ak=np.array(\n", - " [ 3.000000e+02, 6.467159e+02, 1.045222e+03, 1.469188e+03, 1.897829e+03,\n", - " 2.325385e+03, 2.754396e+03, 3.191294e+03, 3.648332e+03, 4.135675e+03,\n", - " 4.668282e+03, 5.247940e+03, 5.876271e+03, 6.554716e+03, 7.284521e+03,\n", - " 8.066738e+03, 8.902188e+03, 9.791482e+03, 1.073499e+04, 1.162625e+04,\n", - " 1.237212e+04, 1.299041e+04, 1.349629e+04, 1.390277e+04, 1.422098e+04,\n", - " 1.446058e+04, 1.462993e+04, 1.473633e+04, 1.478617e+04, 1.478511e+04,\n", - " 1.473812e+04, 1.464966e+04, 1.452370e+04, 1.436382e+04, 1.417324e+04,\n", - " 1.395491e+04, 1.371148e+04, 1.344540e+04, 1.315890e+04, 1.285407e+04,\n", - " 1.253280e+04, 1.219685e+04, 1.184788e+04, 1.148739e+04, 1.111682e+04,\n", - " 1.073748e+04, 1.035062e+04, 9.957395e+03, 9.558875e+03, 9.156069e+03,\n", - " 8.749922e+03, 8.341315e+03, 7.931065e+03, 7.519942e+03, 7.108648e+03,\n", - " 6.698281e+03, 6.290007e+03, 5.884984e+03, 5.484372e+03, 5.089319e+03,\n", - " 4.700960e+03, 4.320421e+03, 3.948807e+03, 3.587201e+03, 3.236666e+03,\n", - " 2.898237e+03, 2.572912e+03, 2.261667e+03, 1.965424e+03, 1.685079e+03,\n", - " 1.421479e+03, 1.175419e+03, 9.476516e+02, 7.388688e+02, 5.497130e+02,\n", - " 3.807626e+02, 2.325417e+02, 1.054810e+02, -8.381903e-04, 0.000000e+00] )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f5b85c7e", - "metadata": { - "lines_to_next_cell": 2 - }, - "outputs": [], - "source": [ - "#Assign bk data\n", - "bk=np.array(\n", - " [ 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0.,\n", - " 0., 0.00106595, 0.00412866, 0.00900663, 0.01554263, 0.02359921,\n", - " 0.03305481, 0.0438012, 0.05574095, 0.06878554, 0.08285347, 0.09786981,\n", - " 0.1137643, 0.130471, 0.1479275, 0.1660746, 0.1848558, 0.2042166,\n", - " 0.2241053, 0.2444716, 0.2652672, 0.286445, 0.3079604, 0.3297701,\n", - " 0.351832, 0.3741062, 0.3965532, 0.4191364, 0.4418194, 0.4645682,\n", - " 0.48735, 0.5101338, 0.5328897, 0.5555894, 0.5782067, 0.6007158,\n", - " 0.6230936, 0.6452944, 0.6672683, 0.6889648, 0.7103333, 0.7313231,\n", - " 0.7518838, 0.7719651, 0.7915173, 0.8104913, 0.828839, 0.846513,\n", - " 0.8634676, 0.8796583, 0.8950421, 0.9095779, 0.9232264, 0.9359506,\n", - " 0.9477157, 0.9584892, 0.9682413, 0.9769447, 0.9845753, 0.9911126,\n", - " 0.9965372, 1. ] )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c5450f7f", - "metadata": {}, - "outputs": [], - "source": [ - "#Create a Dataset instance\n", - "coefficients = xr.Dataset(\n", - " { \"ak\": ([\"km1\"], ak),\n", - " \"bk\": ([\"km1\"], bk) \n", - " })" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5a0e5487", - "metadata": {}, - "outputs": [], - "source": [ - "#Set attributes for each variable\n", - "coefficients[\"ak\"].attrs[\"units\"]=\"\"\n", - "coefficients[\"bk\"].attrs[\"units\"]=\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "612b0134", - "metadata": {}, - "outputs": [], - "source": [ - "#Write netcdf file\n", - "coefficients.to_netcdf(\"eta79.nc\")" - ] - } - ], - "metadata": { - "jupytext": { - "cell_metadata_filter": "-all", - "executable": "/usr/bin/env python3", - "main_language": "python", - "notebook_metadata_filter": "-all" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 3fa59a8f72dae37e96d7bf2498f77673148829f1 Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Fri, 17 May 2024 15:11:20 -0400 Subject: [PATCH 04/75] Update pace to use python 3.11.9 (#82) * Updates to allow use of python3.11 * Removed main_unit_tests.yml as it is covered by tests in containers * Updated images for unit tests with openmpi and mpich --- .github/workflows/lint.yml | 4 +- .github/workflows/main_unit_tests.yml | 31 -- .github/workflows/main_unit_tests_mpich.yaml | 2 +- .../workflows/main_unit_tests_openmpi.yaml | 2 +- .pre-commit-config.yaml | 3 +- NDSL | 2 +- constraints.txt | 349 +++++++++--------- examples/configs/baroclinic_c12_orch_cpu.yaml | 7 +- pyFV3 | 2 +- requirements_dev.txt | 12 +- requirements_docs.txt | 2 +- setup.cfg | 2 +- setup.py | 3 +- 13 files changed, 198 insertions(+), 223 deletions(-) delete mode 100644 .github/workflows/main_unit_tests.yml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 0cc08080b..23a63e6df 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -11,10 +11,10 @@ jobs: uses: actions/checkout@v3.5.2 with: submodules: 'recursive' - - name: Step Python 3.8.12 + - name: Step Python 3.11.9 uses: actions/setup-python@v4.6.0 with: - python-version: '3.8.12' + python-version: '3.11.9' - name: Install OpenMPI for gt4py run: | sudo apt-get install libopenmpi-dev diff --git a/.github/workflows/main_unit_tests.yml b/.github/workflows/main_unit_tests.yml deleted file mode 100644 index 79e745d62..000000000 --- a/.github/workflows/main_unit_tests.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: "Main unit tests" -on: - pull_request: - types: [opened, synchronize, reopened, ready_for_review, labeled, unlabeled] - -jobs: - main_unit_tests: - runs-on: ubuntu-latest - steps: - - name: Checkout Pace repository - uses: actions/checkout@v3.5.2 - with: - submodules: 'recursive' - - name: Step Python 3.8.12 - uses: actions/setup-python@v4.6.0 - with: - python-version: '3.8.12' - - name: Install OpenMPI & Boost for gt4py - run: | - sudo apt-get install libopenmpi-dev libboost1.74-dev - - name: Install Python packages - run: | - python -m pip install --upgrade pip setuptools wheel - pip install -r requirements_dev.txt -c constraints.txt - - name: Clone datafiles - run: | - mkdir -p tests/main/input && cd tests/main/input - git clone -b store_files https://github.com/mlee03/pace.git tmp && mv tmp/*.nc . && rm -rf tmp - - name: Run all main tests - run: | - python -m pytest -x tests/main diff --git a/.github/workflows/main_unit_tests_mpich.yaml b/.github/workflows/main_unit_tests_mpich.yaml index ee469b7a6..9804bc15f 100644 --- a/.github/workflows/main_unit_tests_mpich.yaml +++ b/.github/workflows/main_unit_tests_mpich.yaml @@ -12,7 +12,7 @@ jobs: main_unit_tests: runs-on: ubuntu-latest container: - image: ghcr.io/noaa-gfdl/pace_mpich:3.8 + image: ghcr.io/noaa-gfdl/pace_mpich:3.11.9 steps: - name: Checkout Pace repository uses: actions/checkout@v4 diff --git a/.github/workflows/main_unit_tests_openmpi.yaml b/.github/workflows/main_unit_tests_openmpi.yaml index edb9b0f05..fcb19de29 100644 --- a/.github/workflows/main_unit_tests_openmpi.yaml +++ b/.github/workflows/main_unit_tests_openmpi.yaml @@ -12,7 +12,7 @@ jobs: main_unit_tests: runs-on: ubuntu-latest container: - image: ghcr.io/noaa-gfdl/pace_openmpi:3.8 + image: ghcr.io/noaa-gfdl/pace_openmpi:3.11.9 steps: - name: Checkout Pace repository uses: actions/checkout@v4 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a6f865f7b..3994470d5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,9 +15,10 @@ repos: args: ["--profile", "black"] - repo: https://github.com/pre-commit/mirrors-mypy - rev: v0.812 + rev: v1.4.1 hooks: - id: mypy + additional_dependencies: [types-pyyaml] name: mypy-pace files: pace args: [--config-file, setup.cfg] diff --git a/NDSL b/NDSL index 61c4cbe51..c52a719af 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit 61c4cbe51dd20e7d9eba50ea9f9b2427a20e0a80 +Subproject commit c52a719af75882752079331abe3ad8ad8dd3e386 diff --git a/constraints.txt b/constraints.txt index 5c88c4ca0..0d520450b 100644 --- a/constraints.txt +++ b/constraints.txt @@ -1,135 +1,132 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # # pip-compile --output-file=constraints.txt requirements_dev.txt requirements_docs.txt requirements_lint.txt # -aenum==3.1.11 +aenum==3.1.15 # via dace -aiohttp==3.7.4.post0 +aiohttp==3.9.5 # via gcsfs +aiosignal==1.3.1 + # via aiohttp alabaster==0.7.12 # via sphinx appdirs==1.4.4 # via fv3config asciitree==0.3.3 # via zarr -asttokens==2.0.5 +asttokens==2.4.1 # via # devtools # stack-data astunparse==1.6.3 - # via - # dace - # gt4py -async-timeout==3.0.1 - # via aiohttp -attrs==22.1.0 + # via dace +attrs==23.2.0 # via # aiohttp # gt4py # jsonschema - # pytest + # referencing babel==2.9.1 # via sphinx -backcall==0.2.0 - # via ipython backports-entry-points-selectable==1.1.1 # via virtualenv -black==22.3.0 +black==24.4.0 # via gt4py -boltons==21.0.0 +boltons==24.0.0 # via gt4py cached-property==1.5.2 # via gt4py -cachetools==4.2.2 +cachetools==5.3.3 # via google-auth -certifi==2021.5.30 +certifi==2024.2.2 # via # netcdf4 # requests cfgv==3.3.1 # via pre-commit -cftime==1.5.0 +cftime==1.6.3 # via - # -r requirements_dev.txt # ndsl # netcdf4 -chardet==4.0.0 - # via aiohttp -charset-normalizer==2.0.4 +charset-normalizer==3.3.2 # via requests -click==8.0.1 +click==8.1.7 # via # black + # dask # gt4py -cloudpickle==2.0.0 +cloudpickle==3.0.0 # via dask -cmake==3.26.4 - # via gt4py +cmake==3.29.2 + # via + # dace + # gt4py +comm==0.2.2 + # via ipykernel commonmark==0.9.1 # via recommonmark -coverage==5.5 +coverage==7.5.0 # via pytest-cov -cytoolz==0.12.1 +cytoolz==0.12.3 # via gt4py -dace - # via ndsl -dacite==1.6.0 +dacite==1.8.1 # via # fv3config # pace -dask==2021.12.0 - # via - # -r requirements_dev.txt - # ndsl -debugpy==1.6.3 +dask==2024.4.2 + # via ndsl +debugpy==1.8.1 # via ipykernel -decorator==5.0.9 +decorator==5.1.1 # via # gcsfs # ipython -deepdiff==6.2.1 +deepdiff==7.0.1 # via gt4py -devtools==0.8.0 +devtools==0.12.2 # via gt4py -dill==0.3.5.1 +dill==0.3.8 # via dace distlib==0.3.2 # via virtualenv +distro==1.9.0 + # via scikit-build docutils==0.16 # via # recommonmark # sphinx # sphinx-rtd-theme -entrypoints==0.4 - # via jupyter-client -executing==0.8.2 +executing==2.0.1 # via # devtools # stack-data -f90nml==1.3.1 +f90nml==1.4.4 # via - # -r requirements_dev.txt # fv3config # ndsl # pyfv3 # pyshield factory-boy==3.3.0 # via gt4py -faker==24.3.0 +faker==24.11.0 # via factory-boy -fasteners==0.16.3 +fasteners==0.19 # via zarr -fastjsonschema==2.16.2 +fastjsonschema==2.19.1 # via nbformat filelock==3.0.12 # via virtualenv fparser==0.1.4 # via dace -frozendict==2.3.4 +frozendict==2.4.2 # via gt4py -fsspec==2021.7.0 +frozenlist==1.4.1 + # via + # aiohttp + # aiosignal +fsspec==2024.3.1 # via # dask # fv3config @@ -137,225 +134,234 @@ fsspec==2021.7.0 # ndsl fv3config==0.9.0 # via -r requirements_dev.txt -gcsfs==2021.7.0 +gcsfs==2024.3.1 # via fv3config -google-auth==2.0.1 +google-api-core==2.18.0 + # via + # google-cloud-core + # google-cloud-storage +google-auth==2.29.0 # via # gcsfs + # google-api-core # google-auth-oauthlib -google-auth-oauthlib==0.4.5 + # google-cloud-core + # google-cloud-storage +google-auth-oauthlib==1.2.0 + # via gcsfs +google-cloud-core==2.4.1 + # via google-cloud-storage +google-cloud-storage==2.16.0 # via gcsfs -gprof2dot==2021.2.21 +google-crc32c==1.5.0 + # via + # google-cloud-storage + # google-resumable-media +google-resumable-media==2.7.0 + # via google-cloud-storage +googleapis-common-protos==1.63.0 + # via google-api-core +gprof2dot==2022.7.29 # via pytest-profiling gridtools-cpp==2.3.2 # via gt4py -gt4py +h5netcdf==1.3.0 # via ndsl -h5netcdf==1.1.0 - # via ndsl -h5py==3.10.0 +h5py==3.11.0 # via h5netcdf identify==2.2.13 # via pre-commit -idna==3.2 +idna==3.7 # via # requests # yarl imagesize==1.2.0 # via sphinx -importlib-resources==5.10.0 - # via - # gt4py - # jsonschema -iniconfig==1.1.1 +importlib-metadata==7.1.0 + # via dask +iniconfig==2.0.0 # via pytest -ipykernel==6.16.2 +ipykernel==6.29.4 # via nbmake -ipython==8.5.0 +ipython==8.23.0 # via ipykernel -jedi==0.18.1 +jedi==0.19.1 # via ipython -jinja2==3.0.1 +jinja2==3.1.3 # via # dace # gt4py # sphinx -jsonschema==4.16.0 +jsonschema==4.21.1 # via nbformat -jupyter-client==7.4.4 +jsonschema-specifications==2023.12.1 + # via jsonschema +jupyter-client==8.6.1 # via # ipykernel # nbclient -jupyter-core==4.11.2 +jupyter-core==5.7.2 # via + # ipykernel # jupyter-client # nbformat -lark==1.1.5 +lark==1.1.9 # via gt4py -locket==0.2.1 +locket==1.0.0 # via partd -mako==1.1.6 +mako==1.3.3 # via gt4py -markupsafe==2.0.1 +markupsafe==2.1.5 # via # jinja2 # mako -matplotlib-inline==0.1.6 +matplotlib-inline==0.1.7 # via # ipykernel # ipython mpi4py==3.1.5 # via - # -r requirements_dev.txt # ndsl # pace -mpmath==1.2.1 +mpmath==1.3.0 # via sympy -multidict==5.1.0 +multidict==6.0.5 # via # aiohttp # yarl -mypy-extensions==0.4.3 +mypy-extensions==1.0.0 # via black -nanobind==1.8.0 +nanobind==1.9.2 # via gt4py nbclient==0.6.8 # via nbmake -nbformat==5.7.0 +nbformat==5.10.4 # via # nbclient # nbmake -nbmake==1.3.4 +nbmake==1.5.3 # via -r requirements_dev.txt -nest-asyncio==1.5.6 +nest-asyncio==1.6.0 # via # ipykernel - # jupyter-client # nbclient -netcdf4==1.6.4 +netcdf4==1.6.5 # via - # -r requirements_dev.txt # ndsl # pace -networkx==2.6.3 +networkx==3.3 # via dace -ninja==1.11.1 +ninja==1.11.1.1 # via gt4py nodeenv==1.6.0 # via pre-commit -numcodecs==0.7.2 +numcodecs==0.12.1 # via zarr -numpy==1.23.3 +numpy==1.26.4 # via - # -r requirements_dev.txt # cftime # dace # gt4py # h5py # netcdf4 # numcodecs - # pace # pandas # pyfv3 # pyshield # scipy # xarray # zarr -oauthlib==3.1.1 +oauthlib==3.2.2 # via requests-oauthlib ordered-set==4.1.0 # via deepdiff -packaging==21.0 +packaging==24.0 # via + # black # dask # gt4py # h5netcdf # ipykernel # pytest + # scikit-build # setuptools-scm # sphinx -pandas==1.3.2 + # xarray +pandas==2.2.2 # via xarray -parso==0.8.3 +parso==0.8.4 # via jedi -partd==1.2.0 +partd==1.4.1 # via dask -pathspec==0.9.0 +pathspec==0.12.1 # via black -pexpect==4.8.0 +pexpect==4.9.0 # via ipython -pickleshare==0.7.5 - # via ipython -pkgutil-resolve-name==1.3.10 - # via jsonschema platformdirs==2.6.2 # via # black + # jupyter-core # virtualenv -pluggy==0.13.1 +pluggy==1.5.0 # via pytest ply==3.11 # via dace pre-commit==2.14.0 # via -r requirements_lint.txt -prompt-toolkit==3.0.31 +prompt-toolkit==3.0.43 # via ipython -psutil==5.9.3 +proto-plus==1.23.0 + # via google-api-core +protobuf==4.25.3 + # via + # google-api-core + # googleapis-common-protos + # proto-plus +psutil==5.9.8 # via ipykernel ptyprocess==0.7.0 # via pexpect pure-eval==0.2.2 # via stack-data -py==1.10.0 - # via pytest -pyasn1==0.4.8 +pyasn1==0.6.0 # via # pyasn1-modules # rsa -pyasn1-modules==0.2.8 +pyasn1-modules==0.4.0 # via google-auth -pybind11==2.11.1 +pybind11==2.12.0 # via gt4py -pydantic==1.7.4 - # via nbmake -pygments==2.10.0 +pygments==2.17.2 # via + # devtools # ipython # nbmake # sphinx -pyparsing==2.4.7 - # via packaging -pyrsistent==0.18.1 - # via jsonschema -pytest==6.2.4 +pytest==8.1.1 # via - # -r requirements_dev.txt # nbmake # pytest-cov # pytest-datadir # pytest-profiling # pytest-regressions - # pytest-subtests -pytest-cov==2.12.1 +pytest-cov==5.0.0 # via -r requirements_dev.txt -pytest-datadir==1.3.1 +pytest-datadir==1.5.0 # via pytest-regressions pytest-profiling==1.7.0 # via -r requirements_dev.txt -pytest-regressions==2.2.0 - # via -r requirements_dev.txt -pytest-subtests==0.5.0 +pytest-regressions==2.5.0 # via -r requirements_dev.txt -python-dateutil==2.8.2 +python-dateutil==2.9.0.post0 # via # faker # jupyter-client # pandas -pytz==2021.1 +pytz==2024.1 # via # babel # pandas -pyyaml==5.4.1 +pyyaml==6.0.1 # via # dace # dask @@ -363,32 +369,41 @@ pyyaml==5.4.1 # pace # pre-commit # pytest-regressions -pyzmq==24.0.1 +pyzmq==26.0.2 # via # ipykernel # jupyter-client recommonmark==0.7.1 # via -r requirements_docs.txt -requests==2.26.0 +referencing==0.35.0 + # via + # jsonschema + # jsonschema-specifications +requests==2.31.0 # via # gcsfs + # google-api-core + # google-cloud-storage # requests-oauthlib # sphinx -requests-oauthlib==1.3.0 +requests-oauthlib==2.0.0 # via google-auth-oauthlib -rsa==4.7.2 - # via google-auth -scipy==1.10.1 +rpds-py==0.18.0 # via - # -r requirements_dev.txt - # ndsl + # jsonschema + # referencing +rsa==4.9 + # via google-auth +scikit-build==0.17.6 + # via dace +scipy==1.13.0 + # via ndsl setuptools-scm==8.0.4 # via fparser six==1.16.0 # via # asttokens # astunparse - # fasteners # pytest-profiling # python-dateutil # virtualenv @@ -419,32 +434,26 @@ sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx -stack-data==0.5.1 +stack-data==0.6.3 # via ipython -sympy==1.9 +sympy==1.12 # via dace tabulate==0.9.0 # via gt4py toml==0.10.2 - # via - # pre-commit - # pytest - # pytest-cov -tomli==1.2.1 - # via - # black - # setuptools-scm -toolz==0.11.1 + # via pre-commit +toolz==0.12.1 # via # cytoolz # dask # partd -tornado==6.2 +tornado==6.4 # via # ipykernel # jupyter-client -traitlets==5.5.0 +traitlets==5.14.3 # via + # comm # ipykernel # ipython # jupyter-client @@ -452,40 +461,42 @@ traitlets==5.5.0 # matplotlib-inline # nbclient # nbformat -typing-extensions==4.3.0 +types-pyyaml==6.0.12.20240311 + # via pace +typing-extensions==4.5.0 # via - # aiohttp - # black - # faker # gt4py + # ipython # setuptools-scm -urllib3==1.26.6 +tzdata==2024.1 + # via pandas +urllib3==2.2.1 # via requests virtualenv==20.7.2 # via pre-commit -wcwidth==0.2.5 +wcwidth==0.2.13 # via prompt-toolkit -websockets==10.3 +websockets==12.0 # via dace -wheel==0.37.0 - # via astunparse -xarray==0.19.0 +wheel==0.43.0 + # via + # astunparse + # scikit-build +xarray==2024.3.0 # via - # -r requirements_dev.txt # ndsl - # pace # pyfv3 # pyshield -xxhash==2.0.2 +xxhash==3.0.0 # via gt4py -yarl==1.6.3 +yarl==1.9.4 # via aiohttp -zarr==2.9.2 +zarr==2.17.2 # via # -r requirements_dev.txt # pace -zipp==3.8.0 - # via importlib-resources +zipp==3.18.1 + # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/examples/configs/baroclinic_c12_orch_cpu.yaml b/examples/configs/baroclinic_c12_orch_cpu.yaml index d70699a1d..6e29da06d 100644 --- a/examples/configs/baroclinic_c12_orch_cpu.yaml +++ b/examples/configs/baroclinic_c12_orch_cpu.yaml @@ -14,7 +14,7 @@ performance_config: nx_tile: 12 nz: 79 dt_atmos: 225 -minutes: 5 +seconds: 225 layout: - 1 - 1 @@ -73,3 +73,8 @@ physics_config: hydrostatic: false nwat: 6 do_qa: true + +grid_config: + type: generated + config: + eta_file: 'tests/main/input/eta79.nc' diff --git a/pyFV3 b/pyFV3 index 67f1b5c6e..2ec1bf3b5 160000 --- a/pyFV3 +++ b/pyFV3 @@ -1 +1 @@ -Subproject commit 67f1b5c6e364cdb617f71c3732851681396cea55 +Subproject commit 2ec1bf3b5004c5c4b9f993f9b3a4f96cf4686323 diff --git a/requirements_dev.txt b/requirements_dev.txt index c8bbf8a02..3511cf1db 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -1,19 +1,9 @@ -pytest -pytest-subtests pytest-regressions pytest-profiling pytest-cov -scipy nbmake -mpi4py -xarray zarr -dask>=2021.10.0 -netCDF4 -cftime -fv3config>=0.9.0 -f90nml>=1.1.0 -numpy>=1.15 +fv3config -e NDSL -e pySHiELD -e pyFV3 diff --git a/requirements_docs.txt b/requirements_docs.txt index 02306dcc9..54bae3b4d 100644 --- a/requirements_docs.txt +++ b/requirements_docs.txt @@ -1,5 +1,5 @@ recommonmark -sphinx>=1.4 +sphinx sphinx-argparse sphinx_rtd_theme sphinx-gallery diff --git a/setup.cfg b/setup.cfg index 7a5ea7d58..e3f40d1fe 100644 --- a/setup.cfg +++ b/setup.cfg @@ -29,6 +29,6 @@ ignore_missing_imports = True follow_imports = normal namespace_packages = True strict_optional = False -mypy_path = model:NDSL:pySHiELD:pyFV3 +mypy_path = NDSL:pySHiELD:pyFV3 warn_unreachable = True explicit_package_bases = True diff --git a/setup.py b/setup.py index 29c9899a6..b9e509fce 100644 --- a/setup.py +++ b/setup.py @@ -15,10 +15,9 @@ def local_pkg(name: str, relative_path: str) -> str: "dacite", "pyyaml", "mpi4py", - "numpy", "netCDF4", - "xarray", "zarr", + "types-pyyaml", ] From 392aa2d70bab68db5d51a02849437b07b97616c8 Mon Sep 17 00:00:00 2001 From: MiKyung Lee <58964324+mlee03@users.noreply.github.com> Date: Wed, 26 Jun 2024 10:23:11 -0400 Subject: [PATCH 05/75] Updated container for Github Action and reusable workflow (#87) * updated generate_eta_files * remove notebook, add script * lint * correct path * update constraints * python3 execute * Update main_unit_tests_mpich.yaml * Update main_unit_tests_mpich.yaml * update input directory * get ..s correct * lint --------- Co-authored-by: mlee03 --- .github/workflows/main_unit_tests_mpich.yaml | 24 ++++++++++------- .../workflows/main_unit_tests_openmpi.yaml | 26 ------------------- constraints.txt | 2 +- 3 files changed, 15 insertions(+), 37 deletions(-) delete mode 100644 .github/workflows/main_unit_tests_openmpi.yaml diff --git a/.github/workflows/main_unit_tests_mpich.yaml b/.github/workflows/main_unit_tests_mpich.yaml index 9804bc15f..7fa3af706 100644 --- a/.github/workflows/main_unit_tests_mpich.yaml +++ b/.github/workflows/main_unit_tests_mpich.yaml @@ -1,5 +1,6 @@ name: "Main unit tests with mpich" on: + push: pull_request: types: [opened, synchronize, reopened, ready_for_review, labeled, unlabeled] @@ -12,15 +13,18 @@ jobs: main_unit_tests: runs-on: ubuntu-latest container: - image: ghcr.io/noaa-gfdl/pace_mpich:3.11.9 + image: ghcr.io/noaa-gfdl/miniforge:mpich steps: - - name: Checkout Pace repository - uses: actions/checkout@v4 - with: + - name: Checkout Pace repository + uses: actions/checkout@v4 + with: submodules: 'recursive' - - name: setup env and run tests (test) - run: | - cp /home/scripts/setup_env.sh . && chmod +x setup_env.sh - cp /home/scripts/run_tests.sh . && chmod +x run_tests.sh - ./setup_env.sh - ./run_tests.sh + - name: setup env and generate input files + run: | + pip3 install --upgrade pip setuptools wheel + pip3 install -r requirements_dev.txt -c constraints.txt + cd tests/main && mkdir -p input && cd input + python3 ../../../examples/generate_eta_files.py + cd ../../../ + - name: + run: pytest -x tests/main diff --git a/.github/workflows/main_unit_tests_openmpi.yaml b/.github/workflows/main_unit_tests_openmpi.yaml deleted file mode 100644 index fcb19de29..000000000 --- a/.github/workflows/main_unit_tests_openmpi.yaml +++ /dev/null @@ -1,26 +0,0 @@ -name: "Main unit tests with openmpi" -on: - pull_request: - types: [opened, synchronize, reopened, ready_for_review, labeled, unlabeled] - -# cancel running jobs if theres a newer push -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - main_unit_tests: - runs-on: ubuntu-latest - container: - image: ghcr.io/noaa-gfdl/pace_openmpi:3.11.9 - steps: - - name: Checkout Pace repository - uses: actions/checkout@v4 - with: - submodules: 'recursive' - - name: setup env and run tests - run: | - cp /home/scripts/setup_env.sh . && chmod +x setup_env.sh - cp /home/scripts/run_tests.sh . && chmod +x run_tests.sh - ./setup_env.sh - ./run_tests.sh diff --git a/constraints.txt b/constraints.txt index 0d520450b..19e157728 100644 --- a/constraints.txt +++ b/constraints.txt @@ -297,7 +297,7 @@ pathspec==0.12.1 # via black pexpect==4.9.0 # via ipython -platformdirs==2.6.2 +platformdirs==3.10.0 # via # black # jupyter-core From 777b332989faf33a946c7bb080621a4829eeb96f Mon Sep 17 00:00:00 2001 From: MiKyung Lee <58964324+mlee03@users.noreply.github.com> Date: Wed, 26 Jun 2024 12:05:48 -0400 Subject: [PATCH 06/75] Updated container for Github Action and reusable workflow - Redo (#89) * test * tet * fix test dir * test * checkout pace * rename * test * rm * remove dir * fix name * test * pyshield * test * fix trigger mistake * test * change lint version * remove push * lint --------- Co-authored-by: mlee03 --- .github/workflows/lint.yml | 4 +- .github/workflows/main_unit_tests.yaml | 82 ++++++++++++++++++++ .github/workflows/main_unit_tests_mpich.yaml | 30 ------- 3 files changed, 84 insertions(+), 32 deletions(-) create mode 100644 .github/workflows/main_unit_tests.yaml delete mode 100644 .github/workflows/main_unit_tests_mpich.yaml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 23a63e6df..a768fdb99 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -11,10 +11,10 @@ jobs: uses: actions/checkout@v3.5.2 with: submodules: 'recursive' - - name: Step Python 3.11.9 + - name: Step Python 3.11.7 uses: actions/setup-python@v4.6.0 with: - python-version: '3.11.9' + python-version: '3.11.7' - name: Install OpenMPI for gt4py run: | sudo apt-get install libopenmpi-dev diff --git a/.github/workflows/main_unit_tests.yaml b/.github/workflows/main_unit_tests.yaml new file mode 100644 index 000000000..9165727e2 --- /dev/null +++ b/.github/workflows/main_unit_tests.yaml @@ -0,0 +1,82 @@ +name: "Pace main unit tests" +on: + workflow_call: + inputs: + ndsl_trigger: + type: boolean + default: false + required: false + fv3_trigger: + type: boolean + default: false + required: false + shield_trigger: + type: boolean + default: false + required: false + pull_request: + types: [opened, synchronize, reopened, ready_for_review, labeled, unlabeled] + + +# cancel running jobs if theres a newer push +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + github_repository: ${{github.event.repository.name}} + +jobs: + main_unit_tests: + runs-on: ubuntu-latest + container: + image: ghcr.io/noaa-gfdl/miniforge:mpich + steps: + - name: Checkout pace if externally triggered + if: ${{ inputs.fv3_trigger || inputs.ndsl_trigger || inputs.shield_trigger }} + uses: actions/checkout@v4 + with: + submodules: 'recursive' + repository: NOAA-GFDL/pace + path: pace + + - name: Checkout repo that triggered the workflow + uses: actions/checkout@v4 + with: + submodules: 'recursive' + path: ${{ env.github_repository }} + + - name: mv PyFV3 to pace + if: ${{inputs.fv3_trigger}} + run: | + rm -r ${GITHUB_WORKSPACE}/pace/pyFV3 + mv ${GITHUB_WORKSPACE}/${{env.github_repository}} ${GITHUB_WORKSPACE}/pace/pyFV3 + + - name: mv NDSL to pace + if: ${{inputs.ndsl_trigger}} + run: | + rm -r ${GITHUB_WORKSPACE}/pace/NDSL + mv ${GITHUB_WORKSPACE}/${{env.github_repository}} ${GITHUB_WORKSPACE}/pace/NDSL + + - name: mv pyShield to pace + if: ${{inputs.shield_trigger}} + run: | + rm -r ${GITHUB_WORKSPACE}/pace/pySHiELD + mv ${GITHUB_WORKSPACE}/${{env.github_repository}} ${GITHUB_WORKSPACE}/pace/pySHiELD + + - name: install packages + run: | + cd ${GITHUB_WORKSPACE}/pace + pip3 install --upgrade pip setuptools wheel + pip3 install -r requirements_dev.txt -c constraints.txt + + - name: prepare input files + run: | + cd ${GITHUB_WORKSPACE}/pace + python3 examples/generate_eta_files.py + mkdir tests/main/input && mv eta*.nc tests/main/input/. + + - name: run tests + run: | + cd ${GITHUB_WORKSPACE}/pace + pytest -x tests/main diff --git a/.github/workflows/main_unit_tests_mpich.yaml b/.github/workflows/main_unit_tests_mpich.yaml deleted file mode 100644 index 7fa3af706..000000000 --- a/.github/workflows/main_unit_tests_mpich.yaml +++ /dev/null @@ -1,30 +0,0 @@ -name: "Main unit tests with mpich" -on: - push: - pull_request: - types: [opened, synchronize, reopened, ready_for_review, labeled, unlabeled] - -# cancel running jobs if theres a newer push -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - main_unit_tests: - runs-on: ubuntu-latest - container: - image: ghcr.io/noaa-gfdl/miniforge:mpich - steps: - - name: Checkout Pace repository - uses: actions/checkout@v4 - with: - submodules: 'recursive' - - name: setup env and generate input files - run: | - pip3 install --upgrade pip setuptools wheel - pip3 install -r requirements_dev.txt -c constraints.txt - cd tests/main && mkdir -p input && cd input - python3 ../../../examples/generate_eta_files.py - cd ../../../ - - name: - run: pytest -x tests/main From e7f5a480a5ee61aeec27fb5e0e9f5e1e3f3f471b Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Mon, 8 Jul 2024 15:56:46 -0400 Subject: [PATCH 07/75] Matching packages between main and develop branches and removal of outdated pull request template (#86) * Changed workflows to use python 3.11.7, added pytest-subtests to requirments_dev.txt * Matched package dependencies between main and develop branches * Updating constraints file * Updating Dockerfile to use 3.11-slim-bookworm base python image --- .github/pull_request_template.md | 31 ----------------------- Dockerfile | 11 +++----- NDSL | 2 +- README.md | 2 +- constraints.txt | 43 +++++++++++++++++++------------- pyFV3 | 2 +- pySHiELD | 2 +- requirements_dev.txt | 10 ++++++++ setup.py | 4 ++- 9 files changed, 46 insertions(+), 61 deletions(-) delete mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md deleted file mode 100644 index 4c592c6a9..000000000 --- a/.github/pull_request_template.md +++ /dev/null @@ -1,31 +0,0 @@ - -## Purpose - -Describe the purpose of this PR and the motivation if relevant to understanding. Include links to related issues, bugs or features. - -Remove the sections below which do not apply. - -## Code changes: - -- Provide a list of relevant code changes and the side effects they have on other code. - -## Requirements changes: - -- Provide a list of any changes made to requirements, e.g. changes to files requirements*.txt, constraints.txt, setup.py, pyproject.toml, pre-commit-config.yaml and a reason if not included in the Purpose section (e.g. incompatibility, updates, etc) - -## Infrastructure changes: - -- Provide a list of changes that impact the infrastructure around running the code -- that is, changes to Makefiles, docker files, git submodules, or .jenkins (testing infrastructure changes). If Jenkins plans are also being manually changed, indicate that as well. - -## Checklist -Before submitting this PR, please make sure: - -- [ ] You have followed the coding standards guidelines established at [Code Review Checklist](https://drive.google.com/file/d/1R0nqOxfYnzaSdoYdt8yjx5J482ETI2Ft/view?usp=sharing). -- [ ] Docstrings and type hints are added to new and updated routines, as appropriate -- [ ] All relevant documentation has been updated or added (e.g. README, CONTRIBUTING docs) -- [ ] For each public change and fix in `pace`, HISTORY has been updated -- [ ] Unit tests are added or updated for non-stencil code changes - -Additionally, if this PR contains code authored by new contributors: - -- [ ] The names of all the new contributors have been added to CONTRIBUTORS.md diff --git a/Dockerfile b/Dockerfile index e1ab0d48f..311ebcb95 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.8.13-bullseye@sha256:2a01d88a1684e6d7f08030cf5ae73b536926c64076cab197e9e3d9f699255283 +FROM python:3.11-slim-bookworm@sha256:7cd3fa11d619688317226bc93dc59bc8966e9aec6bc2a6abb847e8ab7d656706 RUN apt-get update && apt-get install -y make \ software-properties-common \ @@ -13,14 +13,11 @@ RUN apt-get update && apt-get install -y make \ proj-bin \ proj-data \ python3 \ - python3-pip + python3-pip \ + git RUN pip3 install --upgrade setuptools wheel -COPY constraints.txt /pace/constraints.txt - -RUN pip3 install -r /pace/constraints.txt - COPY . /pace RUN cd /pace && \ @@ -36,7 +33,7 @@ RUN python3 -m pip install \ ipyparallel==8.4.1 \ jupyterlab==3.4.4 \ shapely==1.8.5 \ - cartopy==0.18.0 \ + cartopy==0.23.0 \ jupyterlab_code_formatter==1.5.2 \ isort==5.10.1 \ black==22.3.0 \ diff --git a/NDSL b/NDSL index c52a719af..9afe64182 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit c52a719af75882752079331abe3ad8ad8dd3e386 +Subproject commit 9afe6418213e59476cd7dc623a9cff17a7e501b9 diff --git a/README.md b/README.md index 5188c318b..0086cf109 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ make build ```shell make dev -mpirun --mca btl_vader_single_copy_mechanism none -n 6 python3 -m pace.run /examples/configs/baroclinic_c12.yaml +mpirun --mca btl_vader_single_copy_mechanism none -n 6 python -m pace.run /examples/configs/baroclinic_c12.yaml ``` ## History diff --git a/constraints.txt b/constraints.txt index 19e157728..de40e880d 100644 --- a/constraints.txt +++ b/constraints.txt @@ -27,6 +27,7 @@ attrs==23.2.0 # aiohttp # gt4py # jsonschema + # pytest-subtests # referencing babel==2.9.1 # via sphinx @@ -48,6 +49,7 @@ cfgv==3.3.1 # via pre-commit cftime==1.6.3 # via + # -r requirements_dev.txt # ndsl # netcdf4 charset-normalizer==3.3.2 @@ -60,9 +62,7 @@ click==8.1.7 cloudpickle==3.0.0 # via dask cmake==3.29.2 - # via - # dace - # gt4py + # via gt4py comm==0.2.2 # via ipykernel commonmark==0.9.1 @@ -76,7 +76,9 @@ dacite==1.8.1 # fv3config # pace dask==2024.4.2 - # via ndsl + # via + # -r requirements_dev.txt + # ndsl debugpy==1.8.1 # via ipykernel decorator==5.1.1 @@ -91,8 +93,6 @@ dill==0.3.8 # via dace distlib==0.3.2 # via virtualenv -distro==1.9.0 - # via scikit-build docutils==0.16 # via # recommonmark @@ -104,6 +104,7 @@ executing==2.0.1 # stack-data f90nml==1.4.4 # via + # -r requirements_dev.txt # fv3config # ndsl # pyfv3 @@ -221,6 +222,7 @@ matplotlib-inline==0.1.7 # ipython mpi4py==3.1.5 # via + # -r requirements_dev.txt # ndsl # pace mpmath==1.3.0 @@ -245,8 +247,9 @@ nest-asyncio==1.6.0 # via # ipykernel # nbclient -netcdf4==1.6.5 +netcdf4==1.7.0 # via + # -r requirements_dev.txt # ndsl # pace networkx==3.3 @@ -259,12 +262,15 @@ numcodecs==0.12.1 # via zarr numpy==1.26.4 # via + # -r requirements_dev.txt # cftime # dace # gt4py # h5py + # ndsl # netcdf4 # numcodecs + # pace # pandas # pyfv3 # pyshield @@ -283,7 +289,6 @@ packaging==24.0 # h5netcdf # ipykernel # pytest - # scikit-build # setuptools-scm # sphinx # xarray @@ -339,11 +344,13 @@ pygments==2.17.2 # sphinx pytest==8.1.1 # via + # -r requirements_dev.txt # nbmake # pytest-cov # pytest-datadir # pytest-profiling # pytest-regressions + # pytest-subtests pytest-cov==5.0.0 # via -r requirements_dev.txt pytest-datadir==1.5.0 @@ -352,6 +359,8 @@ pytest-profiling==1.7.0 # via -r requirements_dev.txt pytest-regressions==2.5.0 # via -r requirements_dev.txt +pytest-subtests==0.12.1 + # via -r requirements_dev.txt python-dateutil==2.9.0.post0 # via # faker @@ -394,10 +403,10 @@ rpds-py==0.18.0 # referencing rsa==4.9 # via google-auth -scikit-build==0.17.6 - # via dace scipy==1.13.0 - # via ndsl + # via + # -r requirements_dev.txt + # ndsl setuptools-scm==8.0.4 # via fparser six==1.16.0 @@ -461,9 +470,7 @@ traitlets==5.14.3 # matplotlib-inline # nbclient # nbformat -types-pyyaml==6.0.12.20240311 - # via pace -typing-extensions==4.5.0 +typing-extensions==4.12.2 # via # gt4py # ipython @@ -479,19 +486,19 @@ wcwidth==0.2.13 websockets==12.0 # via dace wheel==0.43.0 - # via - # astunparse - # scikit-build + # via astunparse xarray==2024.3.0 # via + # -r requirements_dev.txt # ndsl + # pace # pyfv3 # pyshield xxhash==3.0.0 # via gt4py yarl==1.9.4 # via aiohttp -zarr==2.17.2 +zarr==2.18.2 # via # -r requirements_dev.txt # pace diff --git a/pyFV3 b/pyFV3 index 2ec1bf3b5..8d59c1e44 160000 --- a/pyFV3 +++ b/pyFV3 @@ -1 +1 @@ -Subproject commit 2ec1bf3b5004c5c4b9f993f9b3a4f96cf4686323 +Subproject commit 8d59c1e441cbf1c4d51f6860565b317cecb55ee4 diff --git a/pySHiELD b/pySHiELD index 69fd798e2..693014f3b 160000 --- a/pySHiELD +++ b/pySHiELD @@ -1 +1 @@ -Subproject commit 69fd798e2f01a62f9c3df46beeff073e987b9199 +Subproject commit 693014f3b5c0ca24ee84dd20dfd76a91a63c2d89 diff --git a/requirements_dev.txt b/requirements_dev.txt index 3511cf1db..5c1f8abd4 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -1,9 +1,19 @@ +pytest +pytest-subtests pytest-regressions pytest-profiling pytest-cov +scipy nbmake +mpi4py +xarray zarr +dask +netCDF4 +cftime fv3config +f90nml +numpy -e NDSL -e pySHiELD -e pyFV3 diff --git a/setup.py b/setup.py index b9e509fce..a095679b1 100644 --- a/setup.py +++ b/setup.py @@ -12,12 +12,14 @@ def local_pkg(name: str, relative_path: str) -> str: requirements: List[str] = [ + "ndsl", "dacite", "pyyaml", "mpi4py", + "numpy", "netCDF4", + "xarray", "zarr", - "types-pyyaml", ] From ffbf8512bcc69cde8d3c90e32243c91a50c8162b Mon Sep 17 00:00:00 2001 From: MiKyung Lee <58964324+mlee03@users.noreply.github.com> Date: Tue, 9 Jul 2024 13:00:01 -0400 Subject: [PATCH 08/75] reusable workflow CI - checkout corrrect repository (#90) * fix trigger mistake * fix spacking * update yaml files * rename lint.yaml * remove backup yaml file * simply pull request trigger * beloved lint --------- Co-authored-by: mlee03 --- .github/workflows/{lint.yml => lint.yaml} | 1 - .github/workflows/main_unit_tests.yaml | 55 +++++++---------------- 2 files changed, 17 insertions(+), 39 deletions(-) rename .github/workflows/{lint.yml => lint.yaml} (89%) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yaml similarity index 89% rename from .github/workflows/lint.yml rename to .github/workflows/lint.yaml index a768fdb99..0d15d5926 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yaml @@ -1,7 +1,6 @@ name: "Lint" on: pull_request: - types: [opened, synchronize, reopened, ready_for_review, labeled, unlabeled] jobs: lint: diff --git a/.github/workflows/main_unit_tests.yaml b/.github/workflows/main_unit_tests.yaml index 9165727e2..f5f6739b7 100644 --- a/.github/workflows/main_unit_tests.yaml +++ b/.github/workflows/main_unit_tests.yaml @@ -1,68 +1,46 @@ -name: "Pace main unit tests" +name: "pace main unit tests" on: workflow_call: inputs: - ndsl_trigger: + component_trigger: type: boolean default: false required: false - fv3_trigger: - type: boolean - default: false - required: false - shield_trigger: - type: boolean - default: false + component_name: + type: string + default: '' required: false pull_request: - types: [opened, synchronize, reopened, ready_for_review, labeled, unlabeled] - # cancel running jobs if theres a newer push concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true -env: - github_repository: ${{github.event.repository.name}} - jobs: - main_unit_tests: + pace_main_unit_tests: runs-on: ubuntu-latest container: image: ghcr.io/noaa-gfdl/miniforge:mpich steps: - - name: Checkout pace if externally triggered - if: ${{ inputs.fv3_trigger || inputs.ndsl_trigger || inputs.shield_trigger }} + - name: external trigger Checkout pace/develop + if: ${{ inputs.component_trigger }} uses: actions/checkout@v4 with: submodules: 'recursive' repository: NOAA-GFDL/pace path: pace + ref: develop + + - name: external trigger Remove existing component in pace/develop + if: ${{ inputs.component_trigger }} + run: rm -rf ${GITHUB_WORKSPACE}/pace/${{inputs.component_name}} - - name: Checkout repo that triggered the workflow + - name: Checkout out hash that triggered CI uses: actions/checkout@v4 with: submodules: 'recursive' - path: ${{ env.github_repository }} - - - name: mv PyFV3 to pace - if: ${{inputs.fv3_trigger}} - run: | - rm -r ${GITHUB_WORKSPACE}/pace/pyFV3 - mv ${GITHUB_WORKSPACE}/${{env.github_repository}} ${GITHUB_WORKSPACE}/pace/pyFV3 - - - name: mv NDSL to pace - if: ${{inputs.ndsl_trigger}} - run: | - rm -r ${GITHUB_WORKSPACE}/pace/NDSL - mv ${GITHUB_WORKSPACE}/${{env.github_repository}} ${GITHUB_WORKSPACE}/pace/NDSL - - - name: mv pyShield to pace - if: ${{inputs.shield_trigger}} - run: | - rm -r ${GITHUB_WORKSPACE}/pace/pySHiELD - mv ${GITHUB_WORKSPACE}/${{env.github_repository}} ${GITHUB_WORKSPACE}/pace/pySHiELD + path: pace/${{inputs.component_name}} - name: install packages run: | @@ -73,8 +51,9 @@ jobs: - name: prepare input files run: | cd ${GITHUB_WORKSPACE}/pace + mkdir tests/main/input python3 examples/generate_eta_files.py - mkdir tests/main/input && mv eta*.nc tests/main/input/. + mv *eta*.nc tests/main/input - name: run tests run: | From 4e2521d4823404cd73482eb3843552aecd0988c1 Mon Sep 17 00:00:00 2001 From: Xingqiu Yuan Date: Wed, 10 Jul 2024 14:43:39 -0400 Subject: [PATCH 09/75] add build script for intel oneapi and gcc compiler separately (#88) * add build script for intel oneapi and gcc compiler separately * update the python version and remove the link time optimization option for gcc --- examples/build_scripts/build_gaea_c5_gcc.sh | 36 ++++++++++++++ examples/build_scripts/build_ppan_intel.sh | 53 +++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 examples/build_scripts/build_gaea_c5_gcc.sh create mode 100644 examples/build_scripts/build_ppan_intel.sh diff --git a/examples/build_scripts/build_gaea_c5_gcc.sh b/examples/build_scripts/build_gaea_c5_gcc.sh new file mode 100644 index 000000000..87bac83a9 --- /dev/null +++ b/examples/build_scripts/build_gaea_c5_gcc.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +# Example bash script to install Pace to run bare-metal on Gaea's c4 cluster + +set -e -x + +# module load necessary system software +module rm PrgEnv-intel +module load PrgEnv-gnu +module rm gcc +module load gcc/12.2.0 +module load boost/1.79.0 +module load python/3.11.7 + +export CC=`which gcc` +export CXX=`which g++` +export MPICC=`which mpicc` +export MPICXX=`which mpicxx` +export DACE_compiler_cpu_executable=${CXX} +export GT4PY_EXTRA_COMPILE_ARGS="-O3 -ffast-math -fprefetch-loop-arrays -funroll-all-loops" +export OPENMP_CPPFLAGS="-fopenmp -fopenmp-simd" +export OPENMP_LDFLAGS="-fopenmp -fopenmp-simd" + +# clone Pace and update submodules +git clone --recursive https://github.com/NOAA-GFDL/pace +cd pace + +# create a conda environment for pace +conda create -y --name my_name python=3.11.7 + +# enter the environment and update it +conda activate my_name +pip3 install --upgrade pip setuptools wheel + +# install the Pace dependencies, GT4Py, and Pace +pip3 install -r requirements_dev.txt -c constraints.txt diff --git a/examples/build_scripts/build_ppan_intel.sh b/examples/build_scripts/build_ppan_intel.sh new file mode 100644 index 000000000..c14dad781 --- /dev/null +++ b/examples/build_scripts/build_ppan_intel.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +set -e + +INSTALL_PREFIX=$1 +ENVIRONMENT_NAME=$2 + +PACE_DIR=$(pwd)/../.. +FV3NET_DIR=$INSTALL_PREFIX/fv3net + +# module load necessary system software +module load conda +module load intel_compilers/2021.3.0 + +export CC=`which icpx` +export CXX=`which icpx` +export MPICC=`which mpiicx` +export MPICXX=`which mpiicpx` +export DACE_compiler_cpu_executable=${CXX} +export GT4PY_EXTRA_COMPILE_ARGS="-O3 -funroll-loops -qopt-prefetch=2 -align" +export OPENMP_CPPFLAGS="-qopenmp -qopenmp-simd" +export OPENMP_LDFLAGS="-qopenmp -qopenmp-simd" + +CONDA_PREFIX=$INSTALL_PREFIX/conda +conda config --add pkgs_dirs $CONDA_PREFIX/pkgs +conda config --add envs_dirs $CONDA_PREFIX/envs + +# enter the pace directory +cd $PACE_DIR + +# create a conda environment with cartopy and its dependencies installed +conda create -c conda-forge -y --name $ENVIRONMENT_NAME python=3.11.7 matplotlib==3.5.2 cartopy==0.18.0 + +# enter the environment and update it +conda activate $ENVIRONMENT_NAME +pip3 install --upgrade --no-cache-dir pip setuptools wheel + +# install the Pace dependencies, GT4Py, and Pace +pip3 install --no-cache-dir -r requirements_dev.txt -c constraints.txt + +# clone fv3net +git clone https://github.com/ai2cm/fv3net.git $FV3NET_DIR + +# install jupyter and ipyparallel +pip3 install --no-cache-dir \ + ipyparallel==8.4.1 \ + jupyterlab==3.4.4 \ + jupyterlab_code_formatter==1.5.2 \ + isort==5.10.1 \ + black==22.3.0 + +# install vcm +python3 -m pip install $FV3NET_DIR/external/vcm From 6640a99bb133c7d0dd0d20897e1f76b96170eeb7 Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Fri, 6 Sep 2024 11:05:41 -0400 Subject: [PATCH 10/75] pace/tests/main/grid/test_eta.py moved to NDSL/tests/grid/test_eta.py (#92) * Removed test_eta.py, moved to NDSL/tests/grid --- tests/main/grid/test_eta.py | 156 ------------------------------------ 1 file changed, 156 deletions(-) delete mode 100755 tests/main/grid/test_eta.py diff --git a/tests/main/grid/test_eta.py b/tests/main/grid/test_eta.py deleted file mode 100755 index f21c8896d..000000000 --- a/tests/main/grid/test_eta.py +++ /dev/null @@ -1,156 +0,0 @@ -#!/usr/bin/env python3 - -import os - -import numpy as np -import pytest -import xarray as xr -import yaml - -from pace import Driver, DriverConfig, NullCommConfig - - -""" -This test checks to ensure that ak and bk -values are read-in and stored properly. -In addition, this test checks to ensure that -the function set_hybrid_pressure_coefficients -fail as expected if the computed eta values -vary non-mononitically and if the eta_file -is not provided. -""" - - -def set_answers(eta_file): - - """ - Read in the expected values of ak and bk - arrays from the input eta NetCDF files. - """ - - data = xr.open_dataset(eta_file) - return data["ak"].values, data["bk"].values - - -def write_non_mono_eta_file(in_eta_file, out_eta_file): - """ - Reads in file eta79.nc and alters randomly chosen ak/bk values - This tests the expected failure of set_eta_hybrid_coefficients - for coefficients that lead to non-monotonically increasing - eta values - """ - - data = xr.open_dataset(in_eta_file) - data["ak"].values[10] = data["ak"].values[0] - data["bk"].values[20] = 0.0 - - data.to_netcdf(out_eta_file) - - -@pytest.mark.parametrize("km", [79, 91]) -def test_set_hybrid_pressure_coefficients_correct(km): - - """This test checks to see that the ak and bk arrays - are read-in correctly and are stored as - expected. Both values of km=79 and km=91 are - tested and both tests are expected to pass - with the stored ak and bk values agreeing with the - values read-in directly from the NetCDF file. - """ - - dirname = os.path.dirname(os.path.abspath(__file__)) - config_file = os.path.join(dirname, "../../../examples/configs/baroclinic_c12.yaml") - - with open(config_file, "r") as f: - yaml_config = yaml.safe_load(f) - - yaml_config["nz"] = km - yaml_config["grid_config"]["config"]["eta_file"] = f"tests/main/input/eta{km}.nc" - - driver_config = DriverConfig.from_dict(yaml_config) - driver_config.comm_config = NullCommConfig(rank=0, total_ranks=6) - driver = Driver(config=driver_config) - - p_results = driver.state.grid_data.p.data - ak_results = driver.state.grid_data.ak.data - bk_results = driver.state.grid_data.bk.data - ak_answers, bk_answers = set_answers(f"tests/main/input/eta{km}.nc") - - if ak_answers.size != ak_results.size: - raise ValueError("Unexpected size of bk") - if bk_answers.size != bk_results.size: - raise ValueError("Unexpected size of ak") - - if not np.array_equal(ak_answers, ak_results): - raise ValueError("Unexpected value of ak") - if not np.array_equal(bk_answers, bk_results): - raise ValueError("Unexpected value of bk") - - driver.safety_checker.clear_all_checks() - - -def test_set_hybrid_pressure_coefficients_nofile(): - - """This test checks to see that the program - fails when (1) the eta_file is not specified in the yaml - configuration file; and (2), the computed eta values - increase non-monotonically. For the latter test, the eta_file - is specified in test_config_not_mono.yaml file and - the ak and bk values in the eta_file have been changed nonsensically - to result in erronenous eta values. - """ - - dirname = os.path.dirname(os.path.abspath(__file__)) - config_file = os.path.join(dirname, "../../../examples/configs/baroclinic_c12.yaml") - - with open(config_file, "r") as f: - yaml_config = yaml.safe_load(f) - - del yaml_config["grid_config"]["config"]["eta_file"] - - try: - driver_config = DriverConfig.from_dict(yaml_config) - driver_config.comm_config = NullCommConfig(rank=0, total_ranks=6) - driver = Driver(config=driver_config) - except Exception as error: - if str(error) == "eta file not specified": - pytest.xfail("testing eta file not specified") - else: - pytest.fail(f"ERROR {error}") - - -def test_set_hybrid_pressure_coefficients_not_mono(): - - """This test checks to see that the program - fails when (1) the eta_file is not specified in the yaml - configuration file; and (2), the computed eta values - increase non-monotonically. For the latter test, the eta_file - is specified in test_config_not_mono.yaml file and - the ak and bk values in the eta_file have been changed nonsensically - to result in erronenous eta values. - """ - - dirname = os.path.dirname(os.path.abspath(__file__)) - config_file = os.path.join(dirname, "../../../examples/configs/baroclinic_c12.yaml") - - with open(config_file, "r") as f: - yaml_config = yaml.safe_load(f) - - in_eta_file = "tests/main/input/eta79.nc" - out_eta_file = "eta_not_mono_79.nc" - write_non_mono_eta_file(in_eta_file, out_eta_file) - yaml_config["grid_config"]["config"]["eta_file"] = out_eta_file - - try: - driver_config = DriverConfig.from_dict(yaml_config) - driver_config.comm_config = NullCommConfig(rank=0, total_ranks=6) - driver = Driver(config=driver_config) - except Exception as error: - if os.path.isfile(out_eta_file): - os.remove(out_eta_file) - if str(error) == "ETA values are not monotonically increasing": - pytest.xfail("testing eta values are not monotomincally increasing") - else: - pytest.fail( - "ERROR in testing etav values not are not monotonically increasing" - ) From 6915fc3e629fd229b49217c5946ddd7ff649b45b Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Fri, 13 Sep 2024 14:05:47 -0400 Subject: [PATCH 11/75] Updated constraints to reflect incoming new versions of subrepositories (#94) --- constraints.txt | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/constraints.txt b/constraints.txt index de40e880d..3f6a9431a 100644 --- a/constraints.txt +++ b/constraints.txt @@ -62,13 +62,19 @@ click==8.1.7 cloudpickle==3.0.0 # via dask cmake==3.29.2 - # via gt4py + # via + # dace + # gt4py comm==0.2.2 # via ipykernel commonmark==0.9.1 # via recommonmark +contourpy==1.3.0 + # via matplotlib coverage==7.5.0 # via pytest-cov +cycler==0.12.1 + # via matplotlib cytoolz==0.12.3 # via gt4py dacite==1.8.1 @@ -93,6 +99,8 @@ dill==0.3.8 # via dace distlib==0.3.2 # via virtualenv +distro==1.9.0 + # via scikit-build docutils==0.16 # via # recommonmark @@ -119,6 +127,8 @@ fastjsonschema==2.19.1 # via nbformat filelock==3.0.12 # via virtualenv +fonttools==4.53.1 + # via matplotlib fparser==0.1.4 # via dace frozendict==2.4.2 @@ -164,7 +174,7 @@ googleapis-common-protos==1.63.0 # via google-api-core gprof2dot==2022.7.29 # via pytest-profiling -gridtools-cpp==2.3.2 +gridtools-cpp==2.3.4 # via gt4py h5netcdf==1.3.0 # via ndsl @@ -206,6 +216,8 @@ jupyter-core==5.7.2 # ipykernel # jupyter-client # nbformat +kiwisolver==1.4.7 + # via matplotlib lark==1.1.9 # via gt4py locket==1.0.0 @@ -216,6 +228,8 @@ markupsafe==2.1.5 # via # jinja2 # mako +matplotlib==3.9.2 + # via ndsl matplotlib-inline==0.1.7 # via # ipykernel @@ -264,9 +278,11 @@ numpy==1.26.4 # via # -r requirements_dev.txt # cftime + # contourpy # dace # gt4py # h5py + # matplotlib # ndsl # netcdf4 # numcodecs @@ -284,11 +300,14 @@ ordered-set==4.1.0 packaging==24.0 # via # black + # dace # dask # gt4py # h5netcdf # ipykernel + # matplotlib # pytest + # scikit-build # setuptools-scm # sphinx # xarray @@ -302,7 +321,9 @@ pathspec==0.12.1 # via black pexpect==4.9.0 # via ipython -platformdirs==3.10.0 +pillow==10.4.0 + # via matplotlib +platformdirs==2.6.2 # via # black # jupyter-core @@ -342,6 +363,8 @@ pygments==2.17.2 # ipython # nbmake # sphinx +pyparsing==3.1.4 + # via matplotlib pytest==8.1.1 # via # -r requirements_dev.txt @@ -365,6 +388,7 @@ python-dateutil==2.9.0.post0 # via # faker # jupyter-client + # matplotlib # pandas pytz==2024.1 # via @@ -403,6 +427,8 @@ rpds-py==0.18.0 # referencing rsa==4.9 # via google-auth +scikit-build==0.18.1 + # via dace scipy==1.13.0 # via # -r requirements_dev.txt @@ -486,7 +512,9 @@ wcwidth==0.2.13 websockets==12.0 # via dace wheel==0.43.0 - # via astunparse + # via + # astunparse + # scikit-build xarray==2024.3.0 # via # -r requirements_dev.txt From a8152e550b3464c07700b0c4074661b05dd82649 Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Fri, 13 Dec 2024 11:19:08 -0500 Subject: [PATCH 12/75] Updated README to include directions for generating eta files (#99) * Updated README to include directions for generating eta files * Linting * Updated baroclinic_c2.yaml to generate zarr output --- README.md | 11 ++++++++++- examples/configs/baroclinic_c12.yaml | 4 ++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0086cf109..accd249fc 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,16 @@ Shell scripts to install Pace on specific machines such as Gaea can be found in ### Run -With the environment activated, you can run an example baroclinic test case with the following command: +Located in the directory `examples/configs/` there are several example configurations to exhibit the current functionality of Pace. We suggest a new user start with the `baroclinic_c12.yaml` configuration. + +Before starting any run, including unit tests, the user must ensure that the proper input files are available. For the `baroclinic_c12.yaml` configuration a script to generate these files and place them in the location referenced in the configuration file is available in the `examples/` directory; `generate_eta_files.py`. To generate the files use the following commands from the top level of the clone of Pace: + +```shell +mkdir tests/main/input +python3 examples/generate_eta_files.py +mv *eta*.nc tests/main/input +``` +These commands will generate the files necessary and place them in the `tests/main/input` directory. Once the files are generated the `baroclinic_c12.yaml` configuration can be used to generate a run: ```shell mpirun -n 6 python3 -m pace.run examples/configs/baroclinic_c12.yaml diff --git a/examples/configs/baroclinic_c12.yaml b/examples/configs/baroclinic_c12.yaml index 2b0a2e3f6..b26ff1728 100644 --- a/examples/configs/baroclinic_c12.yaml +++ b/examples/configs/baroclinic_c12.yaml @@ -20,8 +20,8 @@ layout: - 1 - 1 diagnostics_config: - path: output - output_format: netcdf + path: output.zarr + output_format: zarr names: - u - v From ec20c2a6e5f194565893304ce1f2480b8afa55c3 Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Tue, 21 Jan 2025 14:09:25 -0500 Subject: [PATCH 13/75] Update submodules and addition of baroclinic run to workflow (#101) * Updated submodules as of 21 Jan 2025, and added baroclinic run to github workflow --- .github/workflows/main_unit_tests.yaml | 5 +++++ NDSL | 2 +- pyFV3 | 2 +- pySHiELD | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main_unit_tests.yaml b/.github/workflows/main_unit_tests.yaml index f5f6739b7..ab2bb7a00 100644 --- a/.github/workflows/main_unit_tests.yaml +++ b/.github/workflows/main_unit_tests.yaml @@ -59,3 +59,8 @@ jobs: run: | cd ${GITHUB_WORKSPACE}/pace pytest -x tests/main + + - name: run baroclinic + run: | + cd ${GITHUB_WORKSPACE}/pace + mpiexec -np 6 --oversubscribe python -m pace.run examples/configs/baroclinic_c12.yaml diff --git a/NDSL b/NDSL index 9afe64182..a75a1d793 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit 9afe6418213e59476cd7dc623a9cff17a7e501b9 +Subproject commit a75a1d793a6b1c5f2a723f9eca718a6197b3b814 diff --git a/pyFV3 b/pyFV3 index 8d59c1e44..d9106dbe2 160000 --- a/pyFV3 +++ b/pyFV3 @@ -1 +1 @@ -Subproject commit 8d59c1e441cbf1c4d51f6860565b317cecb55ee4 +Subproject commit d9106dbe20ac054fdac723873950910982ff683c diff --git a/pySHiELD b/pySHiELD index 693014f3b..2c3aa90ef 160000 --- a/pySHiELD +++ b/pySHiELD @@ -1 +1 @@ -Subproject commit 693014f3b5c0ca24ee84dd20dfd76a91a63c2d89 +Subproject commit 2c3aa90efbe266cce9b00db6bf3208d1cd22ecfa From 509293840277f05928e704d9bbf2980ed3836e33 Mon Sep 17 00:00:00 2001 From: Oliver Elbert Date: Mon, 27 Jan 2025 15:11:45 -0500 Subject: [PATCH 14/75] Hotfix/update netcdf version for docker files (#102) * Update netcdf version * also upgrade pip * update ndsl --- Dockerfile | 2 +- NDSL | 2 +- constraints.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 311ebcb95..9474e4ff2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ RUN apt-get update && apt-get install -y make \ python3-pip \ git -RUN pip3 install --upgrade setuptools wheel +RUN pip3 install --upgrade pip setuptools wheel COPY . /pace diff --git a/NDSL b/NDSL index a75a1d793..b7db25926 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit a75a1d793a6b1c5f2a723f9eca718a6197b3b814 +Subproject commit b7db25926c9258045457c73df3b560803a90449c diff --git a/constraints.txt b/constraints.txt index 3f6a9431a..ebc16fae1 100644 --- a/constraints.txt +++ b/constraints.txt @@ -261,7 +261,7 @@ nest-asyncio==1.6.0 # via # ipykernel # nbclient -netcdf4==1.7.0 +netcdf4==1.7.1 # via # -r requirements_dev.txt # ndsl From b32a2bdd013aa59ce77b79e8052b462e027052f5 Mon Sep 17 00:00:00 2001 From: Florian Deconinck Date: Mon, 24 Feb 2025 11:36:33 -0500 Subject: [PATCH 15/75] `xarray` to `2025.01.2` to grab the `DataTree` (#103) --- constraints.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/constraints.txt b/constraints.txt index ebc16fae1..44dee2aa8 100644 --- a/constraints.txt +++ b/constraints.txt @@ -515,7 +515,7 @@ wheel==0.43.0 # via # astunparse # scikit-build -xarray==2024.3.0 +xarray==2025.01.2 # via # -r requirements_dev.txt # ndsl From 66acf88c0796135c3b72b3eb6ea881d864dbb8e7 Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Wed, 5 Mar 2025 10:34:25 -0500 Subject: [PATCH 16/75] Update submodules (#104) * Updated submodules to versions as of 15 Jan 2025 * Updated submodules as of 21 Jan 2025, and added baroclinic run to github workflow * Updated submodules as of 5 09:49 March 2025 --- NDSL | 2 +- pyFV3 | 2 +- pySHiELD | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NDSL b/NDSL index b7db25926..c93da232b 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit b7db25926c9258045457c73df3b560803a90449c +Subproject commit c93da232bf7ab7020b57722b454f8eaeb2ff8340 diff --git a/pyFV3 b/pyFV3 index d9106dbe2..3466d2185 160000 --- a/pyFV3 +++ b/pyFV3 @@ -1 +1 @@ -Subproject commit d9106dbe20ac054fdac723873950910982ff683c +Subproject commit 3466d21850945071ee1fce7e7bf3f9960015ddb8 diff --git a/pySHiELD b/pySHiELD index 2c3aa90ef..1784cf438 160000 --- a/pySHiELD +++ b/pySHiELD @@ -1 +1 @@ -Subproject commit 2c3aa90efbe266cce9b00db6bf3208d1cd22ecfa +Subproject commit 1784cf4383bc305f11e3aecef274fc608c2cdad3 From ea391f78beeb76aa1e6947907111abd87a2bb8ec Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Thu, 13 Mar 2025 09:31:31 -0400 Subject: [PATCH 17/75] Feature: Ability to set desired NetCDF output precision from config (#105) * Added configurable options for precision of NetCDF output * Added in method for setting NetCDF output precision * Updated NDSL to use NetCDF precision setting feature --- NDSL | 2 +- pace/diagnostics.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/NDSL b/NDSL index c93da232b..0740e26ef 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit c93da232bf7ab7020b57722b454f8eaeb2ff8340 +Subproject commit 0740e26ef974a50bd29372600294d72acc9f98c8 diff --git a/pace/diagnostics.py b/pace/diagnostics.py index b395b353e..9b38d621d 100644 --- a/pace/diagnostics.py +++ b/pace/diagnostics.py @@ -4,9 +4,12 @@ from datetime import datetime, timedelta from typing import List, Optional, Union +import numpy as np + from ndsl import Quantity from ndsl.constants import RGRAV, Z_DIM, Z_INTERFACE_DIM from ndsl.dsl.dace.orchestration import dace_inhibitor +from ndsl.dsl.typing import Float from ndsl.filesystem import get_fs from ndsl.grid import GridData from ndsl.monitor import Monitor, ZarrMonitor @@ -86,6 +89,7 @@ class DiagnosticsConfig: names: List[str] = dataclasses.field(default_factory=list) derived_names: List[str] = dataclasses.field(default_factory=list) z_select: List[ZSelect] = dataclasses.field(default_factory=list) + precision: str = "Float" def __post_init__(self): if (len(self.names) > 0 or len(self.derived_names) > 0) and self.path is None: @@ -97,6 +101,11 @@ def __post_init__(self): "output_format must be one of 'zarr' or 'netcdf', " f"got {self.output_format}" ) + if self.precision not in ["Float", "float32", "float64"]: + raise ValueError( + "precision must be one of 'Float', 'float32', or 'float64" + f"got {self.precision}" + ) def diagnostics_factory(self, communicator: Communicator) -> Diagnostics: """ @@ -120,10 +129,17 @@ def diagnostics_factory(self, communicator: Communicator) -> Diagnostics: mpi_comm=communicator.comm, ) elif self.output_format == "netcdf": + if self.precision == "Float": + precision = Float + elif self.precision == "float32": + precision = np.float32 + elif self.precision == "float64": + precision = np.float64 monitor = NetCDFMonitor( path=self.path, communicator=communicator, time_chunk_size=self.time_chunk_size, + precision=precision, ) else: raise ValueError( From 81f3c632ff7e603e1801aea39f3bb6e3d176356f Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Mon, 24 Mar 2025 14:30:12 +0100 Subject: [PATCH 18/75] Markdown cleanup/style (#111) * Unrelated: consistent markdown formatting Consistent markdown formatting in the top-level README file. * More md cleanups - consistent whitespace around headers and code blocks - fenced code blocks - for shell commands, only include `$` if you also show the output --------- Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- CONTRIBUTING.md | 26 +++++++++++++++++--------- README.md | 9 ++++++++- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b45b7212c..5671f5617 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,13 +8,13 @@ Contributors names will be added to [`CONTRIBUTORS.md`](https://github.com/Vulca Dependencies for linting are maintained in `requirements_lint.txt`, and can be installed with: ```shell -$ pip install -c constraints.txt -r requirements_lint.txt +pip install -c constraints.txt -r requirements_lint.txt ``` Correcting and checking your code complies with all requirements can be run with: ```shell -$ make lint +make lint ``` We manage the list of syntax requirements using [pre-commit](https://pre-commit.com/). @@ -48,11 +48,13 @@ First, checking you are following the guidelines established at [Code Review Che ox.com/doc/Code-Review-Checklist--BD7zigBMAhMZAPkeNENeuU2UAg-IlsYffZgTwyKEylty7NhY) when writing new code. For code visited in refactors, we want to start adding the following where appropriate: + - Type hints on Python functions (see [`fv3core/utils/typing.py`](https://github.com/VulcanClimateModeling/fv3core/blob/master/fv3core/utils/typing.py) and below) - More descriptive types on stencil definitions - Docstrings on outward facing Python functions: describe what methods are doing, describe the intent (*in*, *out*, or *inout*) of the function arguments ### Docstrings + These should aid us in refactoring and understanding what a function is doing. If it is not completely understood yet what is happening, please consult other team members and GFDL as appropriate. If we still cannot tell what is happening, you can write what is known along with a `TODOC` to indicate it is incomplete. For example: @@ -76,11 +78,12 @@ def stencil(...): """ ``` - ### Type hinting Python functions + These should mostly be lightweight workflow wrappers calling gt4py stencils, though currently exceptions exist where Python code does computations on data fields. New code should be type hinted making use of `fv3core/utils/typing.py` when typing gt4py fields. You may run into code in fv3core before we added this convention. An older code like: + ```python def compute(var1, var2, var3, param1, param2, param3): ``` @@ -91,14 +94,17 @@ would become: def compute(var1: FloatField, var2:IntField, var3: BoolField, param1: float_type, param2: int_type, param3: bool_type): ``` + There is no determined convention for order of arguments, but the code generally follows the convention of listing 3d fields first followed by parameters, as is required by gt4py stencil functions. Another example + ```python def make_storage_from_shape(shape, origin, dtype): ``` Turns into + ```python def make_storage_from_shape( shape: Tuple[int, int, int], @@ -113,8 +119,8 @@ Turns into - Internal functions that are likely to be inlined into a larger stencil do not need this if it will just be removed in the near-term. ### GT4Py stencils -We interface to `gt4py.cartesian.gtscript.stencil` through ndsl.dsl.stencil, specifically the FrozenStencil, that allows us to minimize runtime overhead in calling stencils. +We interface to `gt4py.cartesian.gtscript.stencil` through ndsl.dsl.stencil, specifically the FrozenStencil, that allows us to minimize runtime overhead in calling stencils. ```python @gtstencil @@ -125,20 +131,22 @@ def pt_adjust(pkz:FloatField, dp1: FloatField, q_con: FloatField, pt: FloatField [`fv3core/utils/typing.py`](https://github.com/VulcanClimateModeling/fv3core/blob/master/fv3core/utils/typing.py) defines various field types. For example, `FloatField[IJ]` for a 2D field of default floating point values. - ### GTScript functions -These use the `@gtscript.function` decorator and the arguments do not include type -specifications. They will continue to not have type hinting. -e.g.: +These use the `@gtscript.function` decorator and the arguments do not include type +specifications. They will continue to not have type hinting, e.g.: +```python @gtscript.function def get_bl(al, q): +``` ### Assertions + We can now include assertions of compile time variables inside of gtscript functions with the syntax `compile_assert()`, for example `compile_assert(namelist.grid_type < 3)`. ### State + Some outer functions include a 'state' object that is a SimpleNamespace of variables and a `comm` object that is the `CubedSphereCommunicator` object enabling halo updates. The `state` include pointers to gt4py storages for all variables used in the method. For fields that experience a halo update, the state includes pointers to Quantity objects named `_quantity`, which is a lightweight wrapper around the storage. @@ -147,8 +155,8 @@ A future refactor will simplify this convention, likely through the use of the d As we refactor, we may opt to use this convention more (or a similar one to avoid calling functions while relying on getting the order of a long list of variables correct), but should be considered as part of a refactor on a case-by-case basis. - ### New styles + Propose new style ideas in a meeting or github issue to the team (or subset) with examples and description of how data flow would be altered if relevant. Once an idea is accepted, open a PR with the idea applied to a sample if possible (if not, correct the whole model), and update this doc to reflect the new convention we all should incorporate as we refactor. Share news of this update when the PR is accepted and merged, including guidelines for using the new convention. Implementers and reviewers of new code changes should consider whether the new style should be applied at the same time so we can introduce this change in a piecemeal fashion rather than disrupting every active task. diff --git a/README.md b/README.md index accd249fc..58d674e63 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ git clone --recursive https://github.com/NOAA-GFDL/pace.git or if you have already cloned the repository: -``` +```shell git submodule update --init --recursive ``` @@ -83,6 +83,7 @@ mkdir tests/main/input python3 examples/generate_eta_files.py mv *eta*.nc tests/main/input ``` + These commands will generate the files necessary and place them in the `tests/main/input` directory. Once the files are generated the `baroclinic_c12.yaml` configuration can be used to generate a run: ```shell @@ -142,6 +143,7 @@ This repository was first developed at [AI2](https://github.com/ai2cm/pace) and [license-url]: https://github.com/NOAA-GFDL/pace/blob/main/LICENSE.md ## Running pace in containers + Docker images exist in the Github Container Registry associated with the NOAA-GFDL organization. These images are publicly accessible and can be used to run a Docker container to work with pace. The following are directions on how to setup the pace conda environment interactively in a container. @@ -152,10 +154,13 @@ with any other container management tools: ```shell docker pull ghcr.io/noaa-gfdl/pace_mpich:3.8 ``` + for MPICH installation of MPI; and + ```shell docker pull ghcr.io/noaa-gfdl/pace_openmpi:3.8 ``` + for OpenMPI installation of MPI. If permission issues arise during the pull, a Github personal token @@ -163,6 +168,7 @@ may be required. The steps to create a personal token is found [here](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) Once the token has been generated, the image can be pulled for example with with: + ```shell docker login --username GITHUB_USERNAME --password TOKEN docker pull ghcr.io/noaa-gfdl/pace_mpich:3.8 @@ -171,6 +177,7 @@ docker pull ghcr.io/noaa-gfdl/pace_mpich:3.8 Any container management tools compatible with Docker images can be used to run the container interactively from the pulled image. With Docker, the following command runs the container interactively. + ```shell docker run -it pace_mpich:3.8 ``` From 1d09e7fc91b98c946690cbe265d8947c24ea7ebd Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Mon, 24 Mar 2025 14:41:50 +0100 Subject: [PATCH 19/75] Change deprecated `np.product()` to `np.prod()` (#110) Starting numpy 1.25.0, `np.product()` is deprecated and `np.prod()` should be used instead. Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- tests/main/fv3core/test_selective_validation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/main/fv3core/test_selective_validation.py b/tests/main/fv3core/test_selective_validation.py index 133ff3457..a7929a3cd 100644 --- a/tests/main/fv3core/test_selective_validation.py +++ b/tests/main/fv3core/test_selective_validation.py @@ -16,8 +16,8 @@ def __call__(self, *args, **kwargs): def check_selective_region_and_values(instance, name, array, domain): - validated_gridcells = np.product(domain) - total_gridcells = np.product(array.shape) + validated_gridcells = np.prod(domain) + total_gridcells = np.prod(array.shape) assert np.sum(np.isnan(array)) == total_gridcells - validated_gridcells validation_subset = instance.subset_output(name, array) assert validation_subset.shape == domain From 6c0ed5a716b31e6ead3b927c0660af15eb0f58b5 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Mon, 24 Mar 2025 17:43:41 +0100 Subject: [PATCH 20/75] Don't force `constraints.txt` when running pace tests in external repositories (#109) * Don't use constraints.txt in NDSL pipeline * Avoid installing zarr v3 zarr v3 comes with breaking API changes that will fail tests. * Updated list of contributors --------- Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- .github/workflows/main_unit_tests.yaml | 14 ++++++++++++-- CONTRIBUTORS.md | 1 + requirements_dev.txt | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main_unit_tests.yaml b/.github/workflows/main_unit_tests.yaml index ab2bb7a00..3804edbd2 100644 --- a/.github/workflows/main_unit_tests.yaml +++ b/.github/workflows/main_unit_tests.yaml @@ -23,7 +23,7 @@ jobs: container: image: ghcr.io/noaa-gfdl/miniforge:mpich steps: - - name: external trigger Checkout pace/develop + - name: "External trigger: Checkout pace/develop" if: ${{ inputs.component_trigger }} uses: actions/checkout@v4 with: @@ -32,7 +32,7 @@ jobs: path: pace ref: develop - - name: external trigger Remove existing component in pace/develop + - name: "External trigger: Remove existing component in pace/develop" if: ${{ inputs.component_trigger }} run: rm -rf ${GITHUB_WORKSPACE}/pace/${{inputs.component_name}} @@ -43,11 +43,21 @@ jobs: path: pace/${{inputs.component_name}} - name: install packages + if: ${{ ! inputs.component_trigger }} run: | cd ${GITHUB_WORKSPACE}/pace pip3 install --upgrade pip setuptools wheel pip3 install -r requirements_dev.txt -c constraints.txt + - name: "External trigger: Install packages" + if: ${{ inputs.component_trigger }} + # Ignore `constraints.txt` when running as part of the NDSL pipeline + # to avoid false positives in package dependency resolution. + run: | + cd ${GITHUB_WORKSPACE}/pace + pip3 install --upgrade pip setuptools wheel + pip3 install -r requirements_dev.txt + - name: prepare input files run: | cd ${GITHUB_WORKSPACE}/pace diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 72dda3d5a..ddd763af6 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -3,6 +3,7 @@ List format (alphabetical order): Surname, Name. Employer/Affiliation * Abbott, Tristan. GFDL. +* Cattaneo, Roman. NASA. * Cheeseman, Mark. Vulcan Inc. * Dahm, Johann. Allen Institute for AI. * Davis, Eddie. Allen Institute for AI. diff --git a/requirements_dev.txt b/requirements_dev.txt index 5c1f8abd4..89271475c 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -7,7 +7,7 @@ scipy nbmake mpi4py xarray -zarr +zarr <3.0.0 dask netCDF4 cftime From db31a13b0f3894302a5366edef1ee789901839c9 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Wed, 30 Apr 2025 19:17:18 +0200 Subject: [PATCH 21/75] Proposal: updated dependency handling (#117) * Don't upgrade pip, setuptools, wheels * WIP: dependencies handling * fix linting workflow * fix linting even more * remove editable installs of NDSL/pyFV3/pySHiELD in dev setup * Use pip install -e .[test,lint] directly instead of requirements_dev.txt * forgot to push some changes * re-adding constraints.txt file * add constraints files for dev and test setup * fix typo in readme * Remove hard-coded paths from constraints file * Keep docs/scripts consistent * no need for pip list anymore (we have constraints file now) * actually install extras ;) * Remove constraints* files again * for easier (future) debuggging: print versions of installed packages * one last (tm) update to the readme --------- Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- .github/workflows/lint.yaml | 34 +- .github/workflows/main_unit_tests.yaml | 28 +- CONTRIBUTING.md | 11 +- README.md | 27 +- constraints.txt | 537 -------------------- examples/README.md | 2 + examples/build_scripts/build_gaea_c4.sh | 7 +- examples/build_scripts/build_gaea_c5.sh | 7 +- examples/build_scripts/build_gaea_c5_gcc.sh | 7 +- examples/build_scripts/build_ppan.sh | 7 +- examples/build_scripts/build_ppan_intel.sh | 7 +- examples/create_venv.sh | 5 +- examples/generate_eta_files.py | 20 +- pyproject.toml | 2 +- requirements_dev.txt | 20 - requirements_docs.txt | 1 + requirements_lint.txt | 1 - setup.py | 37 +- 18 files changed, 114 insertions(+), 646 deletions(-) delete mode 100644 constraints.txt delete mode 100644 requirements_dev.txt delete mode 100644 requirements_lint.txt diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 0d15d5926..48ea1b9b3 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -6,21 +6,19 @@ jobs: lint: runs-on: ubuntu-latest steps: - - name: Checkout Pace repository - uses: actions/checkout@v3.5.2 - with: - submodules: 'recursive' - - name: Step Python 3.11.7 - uses: actions/setup-python@v4.6.0 - with: - python-version: '3.11.7' - - name: Install OpenMPI for gt4py - run: | - sudo apt-get install libopenmpi-dev - - name: Install Python packages - run: | - python -m pip install --upgrade pip - pip install -r requirements_dev.txt -r requirements_lint.txt - - name: Run lint via pre-commit - run: | - pre-commit run --all-files + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: 'recursive' + + - name: Step Python 3.11.9 + uses: actions/setup-python@v5 + with: + python-version: '3.11.9' + + - name: Install pre-commit + run: pip install pre-commit + + - name: Run lint via pre-commit + run: | + pre-commit run --all-files diff --git a/.github/workflows/main_unit_tests.yaml b/.github/workflows/main_unit_tests.yaml index 3804edbd2..b98df73c6 100644 --- a/.github/workflows/main_unit_tests.yaml +++ b/.github/workflows/main_unit_tests.yaml @@ -42,35 +42,29 @@ jobs: submodules: 'recursive' path: pace/${{inputs.component_name}} - - name: install packages - if: ${{ ! inputs.component_trigger }} + - name: Install packages run: | cd ${GITHUB_WORKSPACE}/pace - pip3 install --upgrade pip setuptools wheel - pip3 install -r requirements_dev.txt -c constraints.txt + pip install .[test] - - name: "External trigger: Install packages" - if: ${{ inputs.component_trigger }} - # Ignore `constraints.txt` when running as part of the NDSL pipeline - # to avoid false positives in package dependency resolution. + - name: Print versions run: | - cd ${GITHUB_WORKSPACE}/pace - pip3 install --upgrade pip setuptools wheel - pip3 install -r requirements_dev.txt + python --version + pip --version + pip list - - name: prepare input files + - name: Prepare input files run: | cd ${GITHUB_WORKSPACE}/pace mkdir tests/main/input - python3 examples/generate_eta_files.py - mv *eta*.nc tests/main/input + python examples/generate_eta_files.py tests/main/input - - name: run tests + - name: Run tests run: | cd ${GITHUB_WORKSPACE}/pace - pytest -x tests/main + python -m pytest -x tests/main - - name: run baroclinic + - name: Run baroclinic test case run: | cd ${GITHUB_WORKSPACE}/pace mpiexec -np 6 --oversubscribe python -m pace.run examples/configs/baroclinic_c12.yaml diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5671f5617..3205f1250 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,23 +1,22 @@ # Contributing -pace is actively developed by AI2, so please contact us if there is interest in making contributions in the near-term. -Contributors names will be added to [`CONTRIBUTORS.md`](https://github.com/VulcanClimateModeling/fv3core/blob/master/CONTRIBUTORS.md). +pace is actively developed by NOAA/NASA, so please contact us if there is interest in making contributions in the near-term. +Contributors names will be added to [`CONTRIBUTORS.md`](https://github.com/NOAA-GFDL/pace/blob/develop/CONTRIBUTORS.md). ## Linting -Dependencies for linting are maintained in `requirements_lint.txt`, and can be installed with: +We rely on `pre-commit` for linting, which is included in the `[dev]` extra. ```shell -pip install -c constraints.txt -r requirements_lint.txt +pip install -e .[dev] ``` Correcting and checking your code complies with all requirements can be run with: ```shell -make lint +pre-commit run --all-files ``` -We manage the list of syntax requirements using [pre-commit](https://pre-commit.com/). **This runs all checks and is required to pass as one of the continuous integration tests.** The list of checkes includes `black`, `isort`, and `flake8`, among a few others, found in `.pre-commit-config.yaml`. diff --git a/README.md b/README.md index 58d674e63..30e9a0a21 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Pace is an implementation of the FV3GFS / SHiELD atmospheric model developed by 🚧 **WARNING** This repo is under active development - supported features and procedures can change rapidly and without notice. 🚧 -The repository model code is split between [pyFV3](https://github.com/NOAA-GFDL/pyFV3) for the dynamical core and [pySHiELD](https://github.com/NOAA-GFDL/pySHiELD) for the physics parametrization. A full depencies looks like the following: +The repository model code is split between [pyFV3](https://github.com/NOAA-GFDL/pyFV3) for the dynamical core and [pySHiELD](https://github.com/NOAA-GFDL/pySHiELD) for the physics parametrization. A full dependencies looks like the following: ```mermaid flowchart TD @@ -60,14 +60,26 @@ git submodule update --init --recursive We recommend creating a python `venv` or `conda` environment specifically for Pace. ```shell -python3 -m venv venv_name -source venv_name/bin/activate +python -m venv .venv +source .venv/bin/activate ``` -Inside of your pace `venv` or conda environment pip install the Python requirements, GT4Py, and Pace: +Inside of your pace `venv` or `conda` environment, install pace and its dependencies. For developers, we recommend an editable install with the `[dev]` extra: ```shell -pip3 install -r requirements_dev.txt -c constraints.txt +pip install -e .[dev] +``` + +For running tests, we recommend to install pace with the `[test]` extra (avoid pulling other dev dependencies): + +```shell +pip install .[test] +``` + +For just running pace, you don't need any extra: + +```shell +pip install . ``` Shell scripts to install Pace on specific machines such as Gaea can be found in `examples/build_scripts/`. @@ -80,8 +92,7 @@ Before starting any run, including unit tests, the user must ensure that the pro ```shell mkdir tests/main/input -python3 examples/generate_eta_files.py -mv *eta*.nc tests/main/input +python examples/generate_eta_files.py tests/main/input ``` These commands will generate the files necessary and place them in the `tests/main/input` directory. Once the files are generated the `baroclinic_c12.yaml` configuration can be used to generate a run: @@ -93,7 +104,7 @@ mpirun -n 6 python3 -m pace.run examples/configs/baroclinic_c12.yaml mpirun -n 6 --oversubscribe python3 -m pace.run examples/configs/baroclinic_c12.yaml ``` -After the run completes, you will see an output direcotry `output.zarr`. An example to visualize the output is provided in `examples/plot_output.py`. See the [driver example](examples/README.md) section for more details. +After the run completes, you will see an output directory `output.zarr`. An example to visualize the output is provided in `examples/plot_output.py`. See the [driver example](examples/README.md) section for more details. ### Environment variable configuration diff --git a/constraints.txt b/constraints.txt deleted file mode 100644 index 44dee2aa8..000000000 --- a/constraints.txt +++ /dev/null @@ -1,537 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --output-file=constraints.txt requirements_dev.txt requirements_docs.txt requirements_lint.txt -# -aenum==3.1.15 - # via dace -aiohttp==3.9.5 - # via gcsfs -aiosignal==1.3.1 - # via aiohttp -alabaster==0.7.12 - # via sphinx -appdirs==1.4.4 - # via fv3config -asciitree==0.3.3 - # via zarr -asttokens==2.4.1 - # via - # devtools - # stack-data -astunparse==1.6.3 - # via dace -attrs==23.2.0 - # via - # aiohttp - # gt4py - # jsonschema - # pytest-subtests - # referencing -babel==2.9.1 - # via sphinx -backports-entry-points-selectable==1.1.1 - # via virtualenv -black==24.4.0 - # via gt4py -boltons==24.0.0 - # via gt4py -cached-property==1.5.2 - # via gt4py -cachetools==5.3.3 - # via google-auth -certifi==2024.2.2 - # via - # netcdf4 - # requests -cfgv==3.3.1 - # via pre-commit -cftime==1.6.3 - # via - # -r requirements_dev.txt - # ndsl - # netcdf4 -charset-normalizer==3.3.2 - # via requests -click==8.1.7 - # via - # black - # dask - # gt4py -cloudpickle==3.0.0 - # via dask -cmake==3.29.2 - # via - # dace - # gt4py -comm==0.2.2 - # via ipykernel -commonmark==0.9.1 - # via recommonmark -contourpy==1.3.0 - # via matplotlib -coverage==7.5.0 - # via pytest-cov -cycler==0.12.1 - # via matplotlib -cytoolz==0.12.3 - # via gt4py -dacite==1.8.1 - # via - # fv3config - # pace -dask==2024.4.2 - # via - # -r requirements_dev.txt - # ndsl -debugpy==1.8.1 - # via ipykernel -decorator==5.1.1 - # via - # gcsfs - # ipython -deepdiff==7.0.1 - # via gt4py -devtools==0.12.2 - # via gt4py -dill==0.3.8 - # via dace -distlib==0.3.2 - # via virtualenv -distro==1.9.0 - # via scikit-build -docutils==0.16 - # via - # recommonmark - # sphinx - # sphinx-rtd-theme -executing==2.0.1 - # via - # devtools - # stack-data -f90nml==1.4.4 - # via - # -r requirements_dev.txt - # fv3config - # ndsl - # pyfv3 - # pyshield -factory-boy==3.3.0 - # via gt4py -faker==24.11.0 - # via factory-boy -fasteners==0.19 - # via zarr -fastjsonschema==2.19.1 - # via nbformat -filelock==3.0.12 - # via virtualenv -fonttools==4.53.1 - # via matplotlib -fparser==0.1.4 - # via dace -frozendict==2.4.2 - # via gt4py -frozenlist==1.4.1 - # via - # aiohttp - # aiosignal -fsspec==2024.3.1 - # via - # dask - # fv3config - # gcsfs - # ndsl -fv3config==0.9.0 - # via -r requirements_dev.txt -gcsfs==2024.3.1 - # via fv3config -google-api-core==2.18.0 - # via - # google-cloud-core - # google-cloud-storage -google-auth==2.29.0 - # via - # gcsfs - # google-api-core - # google-auth-oauthlib - # google-cloud-core - # google-cloud-storage -google-auth-oauthlib==1.2.0 - # via gcsfs -google-cloud-core==2.4.1 - # via google-cloud-storage -google-cloud-storage==2.16.0 - # via gcsfs -google-crc32c==1.5.0 - # via - # google-cloud-storage - # google-resumable-media -google-resumable-media==2.7.0 - # via google-cloud-storage -googleapis-common-protos==1.63.0 - # via google-api-core -gprof2dot==2022.7.29 - # via pytest-profiling -gridtools-cpp==2.3.4 - # via gt4py -h5netcdf==1.3.0 - # via ndsl -h5py==3.11.0 - # via h5netcdf -identify==2.2.13 - # via pre-commit -idna==3.7 - # via - # requests - # yarl -imagesize==1.2.0 - # via sphinx -importlib-metadata==7.1.0 - # via dask -iniconfig==2.0.0 - # via pytest -ipykernel==6.29.4 - # via nbmake -ipython==8.23.0 - # via ipykernel -jedi==0.19.1 - # via ipython -jinja2==3.1.3 - # via - # dace - # gt4py - # sphinx -jsonschema==4.21.1 - # via nbformat -jsonschema-specifications==2023.12.1 - # via jsonschema -jupyter-client==8.6.1 - # via - # ipykernel - # nbclient -jupyter-core==5.7.2 - # via - # ipykernel - # jupyter-client - # nbformat -kiwisolver==1.4.7 - # via matplotlib -lark==1.1.9 - # via gt4py -locket==1.0.0 - # via partd -mako==1.3.3 - # via gt4py -markupsafe==2.1.5 - # via - # jinja2 - # mako -matplotlib==3.9.2 - # via ndsl -matplotlib-inline==0.1.7 - # via - # ipykernel - # ipython -mpi4py==3.1.5 - # via - # -r requirements_dev.txt - # ndsl - # pace -mpmath==1.3.0 - # via sympy -multidict==6.0.5 - # via - # aiohttp - # yarl -mypy-extensions==1.0.0 - # via black -nanobind==1.9.2 - # via gt4py -nbclient==0.6.8 - # via nbmake -nbformat==5.10.4 - # via - # nbclient - # nbmake -nbmake==1.5.3 - # via -r requirements_dev.txt -nest-asyncio==1.6.0 - # via - # ipykernel - # nbclient -netcdf4==1.7.1 - # via - # -r requirements_dev.txt - # ndsl - # pace -networkx==3.3 - # via dace -ninja==1.11.1.1 - # via gt4py -nodeenv==1.6.0 - # via pre-commit -numcodecs==0.12.1 - # via zarr -numpy==1.26.4 - # via - # -r requirements_dev.txt - # cftime - # contourpy - # dace - # gt4py - # h5py - # matplotlib - # ndsl - # netcdf4 - # numcodecs - # pace - # pandas - # pyfv3 - # pyshield - # scipy - # xarray - # zarr -oauthlib==3.2.2 - # via requests-oauthlib -ordered-set==4.1.0 - # via deepdiff -packaging==24.0 - # via - # black - # dace - # dask - # gt4py - # h5netcdf - # ipykernel - # matplotlib - # pytest - # scikit-build - # setuptools-scm - # sphinx - # xarray -pandas==2.2.2 - # via xarray -parso==0.8.4 - # via jedi -partd==1.4.1 - # via dask -pathspec==0.12.1 - # via black -pexpect==4.9.0 - # via ipython -pillow==10.4.0 - # via matplotlib -platformdirs==2.6.2 - # via - # black - # jupyter-core - # virtualenv -pluggy==1.5.0 - # via pytest -ply==3.11 - # via dace -pre-commit==2.14.0 - # via -r requirements_lint.txt -prompt-toolkit==3.0.43 - # via ipython -proto-plus==1.23.0 - # via google-api-core -protobuf==4.25.3 - # via - # google-api-core - # googleapis-common-protos - # proto-plus -psutil==5.9.8 - # via ipykernel -ptyprocess==0.7.0 - # via pexpect -pure-eval==0.2.2 - # via stack-data -pyasn1==0.6.0 - # via - # pyasn1-modules - # rsa -pyasn1-modules==0.4.0 - # via google-auth -pybind11==2.12.0 - # via gt4py -pygments==2.17.2 - # via - # devtools - # ipython - # nbmake - # sphinx -pyparsing==3.1.4 - # via matplotlib -pytest==8.1.1 - # via - # -r requirements_dev.txt - # nbmake - # pytest-cov - # pytest-datadir - # pytest-profiling - # pytest-regressions - # pytest-subtests -pytest-cov==5.0.0 - # via -r requirements_dev.txt -pytest-datadir==1.5.0 - # via pytest-regressions -pytest-profiling==1.7.0 - # via -r requirements_dev.txt -pytest-regressions==2.5.0 - # via -r requirements_dev.txt -pytest-subtests==0.12.1 - # via -r requirements_dev.txt -python-dateutil==2.9.0.post0 - # via - # faker - # jupyter-client - # matplotlib - # pandas -pytz==2024.1 - # via - # babel - # pandas -pyyaml==6.0.1 - # via - # dace - # dask - # fv3config - # pace - # pre-commit - # pytest-regressions -pyzmq==26.0.2 - # via - # ipykernel - # jupyter-client -recommonmark==0.7.1 - # via -r requirements_docs.txt -referencing==0.35.0 - # via - # jsonschema - # jsonschema-specifications -requests==2.31.0 - # via - # gcsfs - # google-api-core - # google-cloud-storage - # requests-oauthlib - # sphinx -requests-oauthlib==2.0.0 - # via google-auth-oauthlib -rpds-py==0.18.0 - # via - # jsonschema - # referencing -rsa==4.9 - # via google-auth -scikit-build==0.18.1 - # via dace -scipy==1.13.0 - # via - # -r requirements_dev.txt - # ndsl -setuptools-scm==8.0.4 - # via fparser -six==1.16.0 - # via - # asttokens - # astunparse - # pytest-profiling - # python-dateutil - # virtualenv -snowballstemmer==2.1.0 - # via sphinx -sphinx==4.1.2 - # via - # -r requirements_docs.txt - # recommonmark - # sphinx-argparse - # sphinx-gallery - # sphinx-rtd-theme -sphinx-argparse==0.3.1 - # via -r requirements_docs.txt -sphinx-gallery==0.10.1 - # via -r requirements_docs.txt -sphinx-rtd-theme==0.5.2 - # via -r requirements_docs.txt -sphinxcontrib-applehelp==1.0.2 - # via sphinx -sphinxcontrib-devhelp==1.0.2 - # via sphinx -sphinxcontrib-htmlhelp==2.0.0 - # via sphinx -sphinxcontrib-jsmath==1.0.1 - # via sphinx -sphinxcontrib-qthelp==1.0.3 - # via sphinx -sphinxcontrib-serializinghtml==1.1.5 - # via sphinx -stack-data==0.6.3 - # via ipython -sympy==1.12 - # via dace -tabulate==0.9.0 - # via gt4py -toml==0.10.2 - # via pre-commit -toolz==0.12.1 - # via - # cytoolz - # dask - # partd -tornado==6.4 - # via - # ipykernel - # jupyter-client -traitlets==5.14.3 - # via - # comm - # ipykernel - # ipython - # jupyter-client - # jupyter-core - # matplotlib-inline - # nbclient - # nbformat -typing-extensions==4.12.2 - # via - # gt4py - # ipython - # setuptools-scm -tzdata==2024.1 - # via pandas -urllib3==2.2.1 - # via requests -virtualenv==20.7.2 - # via pre-commit -wcwidth==0.2.13 - # via prompt-toolkit -websockets==12.0 - # via dace -wheel==0.43.0 - # via - # astunparse - # scikit-build -xarray==2025.01.2 - # via - # -r requirements_dev.txt - # ndsl - # pace - # pyfv3 - # pyshield -xxhash==3.0.0 - # via gt4py -yarl==1.9.4 - # via aiohttp -zarr==2.18.2 - # via - # -r requirements_dev.txt - # pace -zipp==3.18.1 - # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/examples/README.md b/examples/README.md index 551439678..873e04aa9 100644 --- a/examples/README.md +++ b/examples/README.md @@ -89,12 +89,14 @@ Another example is `baroclinic_init.py`, which initializes a barcolinic wave and ```bash $ mpirun -n 6 python3 baroclinic_init.py ./configs/baroclinic_c12.yaml ``` + ## Docker To run a baroclinic c12 case with Docker in a single command, run `run_docker.sh`. This example will start from the Python 3.8 docker image, install extra dependencies and Python packages, and execute the example, leaving the output in this directory. To visualize the output, two example scripts are provided: + 1. `plot_output.py`: To use it, you must install matplotlib (e.g. with `pip install matplotlib`). 2. `plot_cube.py`: this uses plotting tools in [fv3viz](https://github.com/ai2cm/fv3net/tree/master/external/fv3viz). Note the requirements aren't part of pace by default and need to be installed accordingly. It is recommended to use the post processing docker provided at the top level `docker/postprocessing.Dockerfile`. diff --git a/examples/build_scripts/build_gaea_c4.sh b/examples/build_scripts/build_gaea_c4.sh index def7af3f2..608cf9fbd 100644 --- a/examples/build_scripts/build_gaea_c4.sh +++ b/examples/build_scripts/build_gaea_c4.sh @@ -19,9 +19,8 @@ cd pace # create a conda environment for pace conda create -y --name my_name python=3.8 -# enter the environment and update it +# enter the environment conda activate my_name -pip3 install --upgrade pip setuptools wheel -# install the Pace dependencies, GT4Py, and Pace -pip3 install -r requirements_dev.txt -c constraints.txt +# install Pace dependencies and its dependencies +pip3 install .[test] diff --git a/examples/build_scripts/build_gaea_c5.sh b/examples/build_scripts/build_gaea_c5.sh index 94ad56112..627c8a061 100644 --- a/examples/build_scripts/build_gaea_c5.sh +++ b/examples/build_scripts/build_gaea_c5.sh @@ -19,9 +19,8 @@ cd pace # create a conda environment for pace conda create -y --name my_name python=3.8 -# enter the environment and update it +# enter the environment conda activate my_name -pip3 install --upgrade pip setuptools wheel -# install the Pace dependencies, GT4Py, and Pace -pip3 install -r requirements_dev.txt -c constraints.txt +# install Pace dependencies and its dependencies +pip3 install .[test] diff --git a/examples/build_scripts/build_gaea_c5_gcc.sh b/examples/build_scripts/build_gaea_c5_gcc.sh index 87bac83a9..782ac5f60 100644 --- a/examples/build_scripts/build_gaea_c5_gcc.sh +++ b/examples/build_scripts/build_gaea_c5_gcc.sh @@ -28,9 +28,8 @@ cd pace # create a conda environment for pace conda create -y --name my_name python=3.11.7 -# enter the environment and update it +# enter the environment conda activate my_name -pip3 install --upgrade pip setuptools wheel -# install the Pace dependencies, GT4Py, and Pace -pip3 install -r requirements_dev.txt -c constraints.txt +# install Pace dependencies and its dependencies +pip3 install .[test] diff --git a/examples/build_scripts/build_ppan.sh b/examples/build_scripts/build_ppan.sh index d6bf1bbde..ef88d081c 100644 --- a/examples/build_scripts/build_ppan.sh +++ b/examples/build_scripts/build_ppan.sh @@ -24,12 +24,11 @@ cd $PACE_DIR # create a conda environment with cartopy and its dependencies installed conda create -c conda-forge -y --name $ENVIRONMENT_NAME python=3.8 matplotlib==3.5.2 cartopy==0.18.0 -# enter the environment and update it +# enter the environment conda activate $ENVIRONMENT_NAME -pip3 install --upgrade --no-cache-dir pip setuptools wheel -# install the Pace dependencies, GT4Py, and Pace -pip3 install --no-cache-dir -r requirements_dev.txt -c constraints.txt +# install Pace dependencies and its dependencies +pip3 install --no-cache-dir .[test] # clone fv3net git clone https://github.com/ai2cm/fv3net.git $FV3NET_DIR diff --git a/examples/build_scripts/build_ppan_intel.sh b/examples/build_scripts/build_ppan_intel.sh index c14dad781..f3ee3fdde 100644 --- a/examples/build_scripts/build_ppan_intel.sh +++ b/examples/build_scripts/build_ppan_intel.sh @@ -31,12 +31,11 @@ cd $PACE_DIR # create a conda environment with cartopy and its dependencies installed conda create -c conda-forge -y --name $ENVIRONMENT_NAME python=3.11.7 matplotlib==3.5.2 cartopy==0.18.0 -# enter the environment and update it +# enter the environment conda activate $ENVIRONMENT_NAME -pip3 install --upgrade --no-cache-dir pip setuptools wheel -# install the Pace dependencies, GT4Py, and Pace -pip3 install --no-cache-dir -r requirements_dev.txt -c constraints.txt +# install Pace dependencies and its dependencies +pip3 install --no-cache-dir .[test] # clone fv3net git clone https://github.com/ai2cm/fv3net.git $FV3NET_DIR diff --git a/examples/create_venv.sh b/examples/create_venv.sh index 312932f18..f523ae252 100755 --- a/examples/create_venv.sh +++ b/examples/create_venv.sh @@ -10,10 +10,9 @@ python3 -m venv venv . venv/bin/activate rundir=$(pwd) -cd ${SCRIPT_DIR}/../../ +cd ${SCRIPT_DIR}/../ -pip3 install --upgrade setuptools wheel -pip3 install -r requirements_dev.txt -c constraints.txt +pip install -e .[dev] deactivate cd $rundir diff --git a/examples/generate_eta_files.py b/examples/generate_eta_files.py index 1fb4d5ee2..78f7cf34f 100755 --- a/examples/generate_eta_files.py +++ b/examples/generate_eta_files.py @@ -1,3 +1,6 @@ +import sys +from pathlib import Path + import numpy as np import xarray as xr @@ -6,11 +9,18 @@ This notebook uses the python xarray module to create an eta_file containing ak and bk coefficients for km=79 and km=91. The coefficients are written out to -eta79.nc and eta91.nc netcdf files respectively +`eta79.nc` and `eta91.nc` netcdf files respectively in the +given folder (defaults to `./` if not provided). -To run this script: `python3 ./generate_eta_files.py` +To run this script: `python3 ./generate_eta_files.py ` """ +folder = Path("." if len(sys.argv) < 2 else sys.argv[1]) +if not folder.exists(): + raise ValueError(f"Cannot open folder '{folder}'. Make sure it exists.") +if not folder.is_dir(): + raise ValueError(f"Expected '{folder}' to be a directory.") + # km = 79 ak = xr.DataArray( dims=["km1"], @@ -189,7 +199,7 @@ ), ) coefficients = xr.Dataset(data_vars={"ak": ak, "bk": bk}) -coefficients.to_netcdf("eta79.nc") +coefficients.to_netcdf(Path(folder) / "eta79.nc") # km = 91 @@ -394,6 +404,4 @@ ), ) coefficients = xr.Dataset(data_vars={"ak": ak, "bk": bk}) -coefficients.to_netcdf("eta91.nc") - -# km = +coefficients.to_netcdf(Path(folder) / "eta91.nc") diff --git a/pyproject.toml b/pyproject.toml index b76d062e3..0ccea7b61 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,3 +1,3 @@ [tool.black] line-length = 88 -target_version = ['py36', 'py37', 'py38'] +target_version = ['py38'] diff --git a/requirements_dev.txt b/requirements_dev.txt deleted file mode 100644 index 89271475c..000000000 --- a/requirements_dev.txt +++ /dev/null @@ -1,20 +0,0 @@ -pytest -pytest-subtests -pytest-regressions -pytest-profiling -pytest-cov -scipy -nbmake -mpi4py -xarray -zarr <3.0.0 -dask -netCDF4 -cftime -fv3config -f90nml -numpy --e NDSL --e pySHiELD --e pyFV3 --e . diff --git a/requirements_docs.txt b/requirements_docs.txt index 54bae3b4d..a36d014b8 100644 --- a/requirements_docs.txt +++ b/requirements_docs.txt @@ -1,3 +1,4 @@ +fv3config recommonmark sphinx sphinx-argparse diff --git a/requirements_lint.txt b/requirements_lint.txt deleted file mode 100644 index 416634f52..000000000 --- a/requirements_lint.txt +++ /dev/null @@ -1 +0,0 @@ -pre-commit diff --git a/setup.py b/setup.py index a095679b1..ab282cb75 100644 --- a/setup.py +++ b/setup.py @@ -7,26 +7,42 @@ def local_pkg(name: str, relative_path: str) -> str: """Returns an absolute path to a local package.""" - path = f"{name} @ file://{Path(os.path.abspath(__file__)).parent / relative_path}" - return path + return f"{name} @ file://{Path(os.path.abspath(__file__)).parent / relative_path} " requirements: List[str] = [ - "ndsl", + local_pkg("NDSL", "NDSL"), + local_pkg("pyFV3", "pyFV3"), + local_pkg("pySHiELD", "pySHiELD"), "dacite", - "pyyaml", - "mpi4py", - "numpy", - "netCDF4", + "f90nml", + "numpy < 2.0.0", # numpy 2.x has breaking API changes "xarray", - "zarr", + "zarr < 3.0.0", # zarr 3.x has breaking API changes +] + +test_requirements = [ + "mpi4py", + "nbmake", + "pytest", ] +dev_requirements = [ + *test_requirements, + "pip-tools", # for pip-compile + "pre-commit", +] + +extras_require = { + "dev": dev_requirements, + "test": test_requirements, +} + setup( author="Allen Institute for AI", author_email="oliver.elbert@noaa.gov", - python_requires=">=3.8", + python_requires=">=3.8,<3.12", classifiers=[ "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", @@ -35,8 +51,11 @@ def local_pkg(name: str, relative_path: str) -> str: "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", ], install_requires=requirements, + extras_require=extras_require, name="pace", license="BSD license", packages=find_namespace_packages(include=["pace", "pace.*"]), From 3b44b8c63002422dbddc11ff46d083bdd796b484 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Tue, 13 May 2025 16:49:44 +0200 Subject: [PATCH 22/75] Update NDSL to 2025.03.00 (#120) --- NDSL | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NDSL b/NDSL index 0740e26ef..58738885f 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit 0740e26ef974a50bd29372600294d72acc9f98c8 +Subproject commit 58738885f669480535556d6c309d9af09487246b From 2abfc0531a5ac387d09f41f32bc1268c13da3732 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Tue, 13 May 2025 22:49:01 +0200 Subject: [PATCH 23/75] Update pyFV3 to latest (#121) --- pyFV3 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyFV3 b/pyFV3 index 3466d2185..1b2057fe7 160000 --- a/pyFV3 +++ b/pyFV3 @@ -1 +1 @@ -Subproject commit 3466d21850945071ee1fce7e7bf3f9960015ddb8 +Subproject commit 1b2057fe7fcc1b903f35ff3c4944ea67a0c78830 From cd1f777f8258965291aa046d708ede0597666326 Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Wed, 14 May 2025 12:11:53 -0400 Subject: [PATCH 24/75] Update to Dockerfile and Makefile to reflect recent install method changes (#119) * Changes to Dockerfile and Makefile to reflect most recent changes to install method * Setting version of matplotlib in Dockerfile to be 3.10.0 * Installing using test hook in Dockerfile --- Dockerfile | 4 ++-- Makefile | 6 ------ 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9474e4ff2..377b95846 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,7 +21,7 @@ RUN pip3 install --upgrade pip setuptools wheel COPY . /pace RUN cd /pace && \ - pip3 install -r /pace/requirements_dev.txt -c /pace/constraints.txt + pip3 install .[test] RUN cd / && \ git clone https://github.com/ai2cm/fv3net @@ -29,7 +29,7 @@ RUN cd / && \ ENV CFLAGS="-I/usr/include -DACCEPT_USE_OF_DEPRECATED_PROJ_API_H=1" RUN python3 -m pip install \ - matplotlib==3.5.2 \ + matplotlib==3.10.0 \ ipyparallel==8.4.1 \ jupyterlab==3.4.4 \ shapely==1.8.5 \ diff --git a/Makefile b/Makefile index 587a6b57f..145f7a1c0 100644 --- a/Makefile +++ b/Makefile @@ -124,12 +124,6 @@ savepoint_tests_mpi: build dependencies.svg: dependencies.dot dot -Tsvg $< -o $@ -.PHONY: constraints.txt -constraints.txt: driver/setup.py ndsl/setup.py pyFV3/setup.py pySHiELD/setup.py requirements_docs.txt requirements_lint.txt external/gt4py/setup.cfg requirements_dev.txt - pip-compile $^ --output-file constraints.txt - sed -i.bak '/\@ git+https/d' constraints.txt - rm -f constraints.txt.bak - physics_savepoint_tests: build TARGET=physics $(MAKE) get_test_data $(CONTAINER_CMD) $(CONTAINER_FLAGS) bash -c "$(SAVEPOINT_SETUP) && cd $(PACE_PATH) && pytest --data_path=$(EXPERIMENT_DATA_RUN)/physics/ $(TEST_ARGS) $(PHYSICS_THRESH_ARGS) $(PACE_PATH)/physics/tests/savepoint" From ff42af74c705cd17ffd7374a026d9ccad9ba366f Mon Sep 17 00:00:00 2001 From: Charles Kropiewnicki <79879064+CharlesKrop@users.noreply.github.com> Date: Wed, 14 May 2025 17:34:30 -0400 Subject: [PATCH 25/75] updating NDSL to c38e64fc5b806d0ae1777b565cb520f1b3e5bede (#122) --- NDSL | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NDSL b/NDSL index 58738885f..c38e64fc5 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit 58738885f669480535556d6c309d9af09487246b +Subproject commit c38e64fc5b806d0ae1777b565cb520f1b3e5bede From c917c3859bbda235c1e1d0d45597f90ff8a23e80 Mon Sep 17 00:00:00 2001 From: Charles Kropiewnicki <79879064+CharlesKrop@users.noreply.github.com> Date: Thu, 22 May 2025 12:41:13 -0400 Subject: [PATCH 26/75] Remove Direct GT4Py Imports (#114) * removed direct gt4py imports * linting * added nametag to gtscript imports * linting * changed @function to @gtfunction * new NDSL version * new NDSL branch * new NDSL version, removing extra imports in ndsl.dsl.gt4py that causes crash during tests * new NDSL version... again * Added name to CONTRIBUTORS.md --- CONTRIBUTING.md | 6 ++-- CONTRIBUTORS.md | 3 +- NDSL | 2 +- examples/notebooks/stencil_definition.ipynb | 14 ++++----- tests/main/fv3core/test_dycore_call.py | 2 +- tests/main/fv3core/test_grid.py | 34 ++++++++++----------- 6 files changed, 31 insertions(+), 30 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3205f1250..bc414bf0d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -119,7 +119,7 @@ Turns into ### GT4Py stencils -We interface to `gt4py.cartesian.gtscript.stencil` through ndsl.dsl.stencil, specifically the FrozenStencil, that allows us to minimize runtime overhead in calling stencils. +We interface to `ndsl.dsl.gt4py.stencil` through ndsl.dsl.stencil, specifically the FrozenStencil, that allows us to minimize runtime overhead in calling stencils. ```python @gtstencil @@ -132,11 +132,11 @@ For example, `FloatField[IJ]` for a 2D field of default floating point values. ### GTScript functions -These use the `@gtscript.function` decorator and the arguments do not include type +These use the `@gtfunction` decorator and the arguments do not include type specifications. They will continue to not have type hinting, e.g.: ```python - @gtscript.function + @gtfunction def get_bl(al, q): ``` diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index ddd763af6..a50953083 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -12,8 +12,9 @@ List format (alphabetical order): Surname, Name. Employer/Affiliation * Fuhrer, Oliver. Allen Institute for AI. * George, Rhea. Allen Institute for AI. * Harris, Lucas. GFDL. -* Lee, Mi Kyung. GFDL. +* Kropiewnicki, Charles. NASA. * Kung, Chris. NASA. +* Lee, Mi Kyung. GFDL. * Malatino, Frank. GFDL * McGibbon, Jeremy. Allen Institute for AI. * Niedermayr, Yannick. ETH. diff --git a/NDSL b/NDSL index c38e64fc5..f287122c5 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit c38e64fc5b806d0ae1777b565cb520f1b3e5bede +Subproject commit f287122c5e3ca6aea942480253d2f357c16a40a7 diff --git a/examples/notebooks/stencil_definition.ipynb b/examples/notebooks/stencil_definition.ipynb index 68e6b714e..b6d2d1519 100644 --- a/examples/notebooks/stencil_definition.ipynb +++ b/examples/notebooks/stencil_definition.ipynb @@ -48,12 +48,12 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "c9d04aed-9513-447a-bae8-3c9719a60d9a", "metadata": {}, "outputs": [], "source": [ - "from gt4py.cartesian.gtscript import PARALLEL, computation\n", + "from ndsl.dsl.gt4py import PARALLEL, computation\n", "from ndsl.dsl.typing import FloatField\n", "\n", "def set_field_to_value_def(f: FloatField, value: float):\n", @@ -222,7 +222,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgIAAAGzCAYAAABdO3+BAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA4KklEQVR4nO3df1zV9d3/8edR4YAKxwD5lUj4I/EXdl3+INKMxERqTpOaWtvUmc6FXVPXLLby11qUu1auXYhtc5AVpbbU5a50aopzE690c9ZWTLkoMQWXuwDFQMb5fP9wnG8nUD6Hc4DjOY/77fa+jfP+/Hqfz06e13m9f3wshmEYAgAAfqlLZzcAAAB0HgIBAAD8GIEAAAB+jEAAAAA/RiAAAIAfIxAAAMCPEQgAAODHCAQAAPBjBAIAAPgxAgG0u48++kgWi0UFBQUuH7t//35ZLBbt37+/1X1TU1OVmprq8jXgzJV7DuD6RyAAtxUUFMhisbRYHn/88c5uXrt6+umntW3bNlP7njlzRitXrtSxY8fatU2+5K677pLFYtGiRYuc6svLy7Vq1SqNGTNGN9xwgyIiIpSamqo9e/aYPrfdbteaNWuUkJCgoKAgJSUl6bXXXvP0WwC8XrfObgB8x+rVq5WQkOBUN2zYMMXHx+uzzz5TQEBAJ7Ws/Tz99NO67777NG3atFb3PXPmjFatWqWbbrpJt9xyS7u37Xr35ptv6tChQy1u2759u5599llNmzZNs2fP1j//+U9t3LhRd911l375y19q7ty5rZ7/+9//vp555hnNnz9fo0eP1vbt2/XAAw/IYrFo5syZnn47gNciEIDHZGRkaNSoUS1uCwoK6uDW4HpWV1en73znO3rssce0fPnyZtvvvPNOnTp1ShEREY66hQsX6pZbbtHy5ctbDQQ++eQT/fjHP1ZWVpb+67/+S5L00EMP6Y477tB3v/td3X///eratatn3xTgpegaQLu72hiBDz/8UPfdd5/CwsIUFBSkUaNG6de//rWpc/7sZz9T//79FRwcrDFjxuh3v/ud6fbs3r1b48aNU69evdSzZ08NGjRI3/ve95z2qa+v14oVKzRgwABZrVbFxcVp2bJlqq+vd+xjsVhUW1url156ydEVMmfOnBavuX//fo0ePVqSNHfuXMf+n78nW7Zs0ciRIxUcHKyIiAh99atf1SeffHLN93LkyBFZLBa99NJLzbbt2rVLFotFO3bskCR9/PHHevjhhzVo0CAFBwcrPDxc999/vz766KNW79lNN93U4ntraVyGmXvXmjVr1shut+vRRx9tcfvQoUOdggBJslqtuvvuu3X69GlduHDhmuffvn27Ghoa9PDDDzvqLBaLvvWtb+n06dNXzUQAvoiMADymurpan376qVPdF/+xbvKXv/xFY8eO1Y033qjHH39cPXr00ObNmzVt2jT96le/0r333nvV62zYsEHf/OY3ddttt2nx4sX63//9X335y19WWFiY4uLirtnGv/zlL/rSl76kpKQkrV69WlarVSdPntTvf/97xz52u11f/vKXdfDgQS1YsECDBw/We++9p+eff15/+9vfHGMCXn75ZT300EMaM2aMFixYIEnq379/i9cdPHiwVq9ereXLl2vBggW6/fbbJUm33XabpCvjLObOnavRo0crJydHlZWV+slPfqLf//73+tOf/qRevXq1eN5Ro0apX79+2rx5s2bPnu20bdOmTbrhhhuUnp4uSXr33Xf1hz/8QTNnzlSfPn300UcfKS8vT6mpqfrrX/+q7t27X/PemWH23l3LqVOn9Mwzz+iXv/ylgoODXbp+RUWFunfv3up7+dOf/qQePXpo8ODBTvVjxoxxbB83bpxL1wauWwbgpvz8fENSi8UwDKOsrMyQZOTn5zuOSUtLM4YPH27U1dU56ux2u3HbbbcZAwcOdNTt27fPkGTs27fPMAzDuHz5shEZGWnccsstRn19vWO/n/3sZ4Yk44477rhmW59//nlDkvH3v//9qvu8/PLLRpcuXYzf/e53TvXr1683JBm///3vHXU9evQwZs+efc1rNnn33Xeb3YfPv6dhw4YZn332maN+x44dhiRj+fLl1zxvdna2ERAQYPzjH/9w1NXX1xu9evUyvvGNbzjqLl261OzYQ4cOGZKMjRs3Ouq+eM8NwzDi4+NbfJ933HGH0z135d5dzX333WfcdtttjteSjKysrFaPO3HihBEUFGR87Wtfa3Xfe+65x+jXr1+z+traWkOS8fjjj7d6DsBX0DUAj8nNzdXu3budSkv+8Y9/6J133tFXvvIVXbhwQZ9++qk+/fRTnT9/Xunp6Tpx4sRVU+JHjhzRuXPntHDhQgUGBjrq58yZI5vN1mobm35Zb9++XXa7vcV9tmzZosGDBysxMdHRtk8//VQTJkyQJO3bt6/V67ii6T09/PDDTmMp7rnnHiUmJuo3v/nNNY+fMWOGGhoa9Oabbzrqfvvb36qqqkozZsxw1H3+13VDQ4POnz+vAQMGqFevXvrjH//okffi7r3bt2+ffvWrX2nt2rUuXffSpUu6//77FRwcrGeeeabV/T/77DNZrdZm9U33/7PPPnPp+sD1jK4BeMyYMWOuOljw806ePCnDMPTkk0/qySefbHGfc+fO6cYbb2xW//HHH0uSBg4c6FQfEBCgfv36tXrtGTNm6Be/+IUeeughPf7440pLS9P06dN13333qUuXK3HxiRMn9MEHH6h3795XbZsnNb2nQYMGNduWmJiogwcPXvP4ESNGKDExUZs2bdK8efMkXekWiIiIcHwBS1e+3HJycpSfn69PPvlEhmE4tlVXV3virbh17/75z3/qP/7jP/S1r33NMZ7CjMbGRs2cOVN//etf9fbbbys2NrbVY4KDg1scs1BXV+fYDvgLAgF0uKZf4o8++qij//qLBgwY0C7XDg4O1oEDB7Rv3z795je/0c6dO7Vp0yZNmDBBv/3tb9W1a1fZ7XYNHz5czz33XIvnaG0cQmeYMWOGfvjDH+rTTz9VSEiIfv3rX2vWrFnq1u3//yf+yCOPKD8/X4sXL1ZKSopsNptjqtzVsiNNLBZLi/WNjY1Oo+vduXcbN25USUmJXnzxxWYDGC9cuKCPPvpIkZGRzfr/58+frx07dujVV191CnyuJSYmRvv27ZNhGE7v7ezZs5JkKpgAfAWBADpc0y/3gIAATZw40aVj4+PjJV355fn5f/QbGhpUVlamESNGtHqOLl26KC0tTWlpaXruuef09NNP6/vf/7727duniRMnqn///vrzn/+stLS0q34BNmltu5l9m95TSUlJsy+ykpISx/ZrmTFjhlatWqVf/epXioqKUk1NTbO58G+88YZmz56tH//4x466uro6VVVVtXr+G264ocX9Pv74Y6dMjCv37otOnTqlhoYGjR07ttm2jRs3auPGjdq6davTmg3f/e53lZ+fr7Vr12rWrFmmr3XLLbfoF7/4hT744AMNGTLEUX/48GHHdsBfMEYAHS4yMlKpqal68cUXHb/APu/vf//7VY8dNWqUevfurfXr1+vy5cuO+oKCAlNfaP/4xz+a1TX9o9+UKv7KV76iTz75RD//+c+b7fvZZ5+ptrbW8bpHjx6mrtu0r6Rm+48aNUqRkZFav369U7r67bff1gcffKB77rmn1XMPHjxYw4cP16ZNm7Rp0ybFxMRo/PjxTvt07drVqTtAkn7605+qsbGx1fP3799fxcXFTvd8x44dKi8vd9rPlXv3RTNnztTWrVubFUm6++67tXXrViUnJzv2/9GPfqT//M//1Pe+9z19+9vfvup5q6ur9eGHHzp1f0ydOlUBAQFat26do84wDK1fv1433nijYzYH4A/ICKBT5Obmaty4cRo+fLjmz5+vfv36qbKyUocOHdLp06f15z//ucXjAgIC9NRTT+mb3/ymJkyYoBkzZqisrEz5+fmmxgisXr1aBw4c0D333KP4+HidO3dO69atU58+fRzTxb72ta9p8+bNWrhwofbt26exY8eqsbFRH374oTZv3qxdu3Y5xkKMHDlSe/bs0XPPPafY2FglJCQ4fVl9Xv/+/dWrVy+tX79eISEh6tGjh5KTk5WQkKBnn31Wc+fO1R133KFZs2Y5pg/edNNNWrJkial7OmPGDC1fvlxBQUGaN2+eY8xDky996Ut6+eWXZbPZNGTIEB06dEh79uxReHh4q+d+6KGH9MYbb2jy5Mn6yle+otLSUr3yyivNpku6cu++KDExUYmJiS1uS0hIcMoEbN26VcuWLdPAgQM1ePBgvfLKK07733XXXYqKinLsO3fuXOXn5zvWQujTp48WL16sH/3oR2poaNDo0aO1bds2/e53v9Orr77KYkLwL506ZwE+oWn64Lvvvtvi9pamDxqGYZSWlhpf//rXjejoaCMgIMC48cYbjS996UvGG2+84dinpalshmEY69atMxISEgyr1WqMGjXKOHDgQLOpbC3Zu3evMXXqVCM2NtYIDAw0YmNjjVmzZhl/+9vfnPa7fPmy8eyzzxpDhw41rFarccMNNxgjR440Vq1aZVRXVzv2+/DDD43x48cbwcHBhqRWpxJu377dGDJkiNGtW7dm92TTpk3Gv/3bvxlWq9UICwszHnzwQeP06dPXPN/nnThxwjFt8+DBg822/9///Z8xd+5cIyIiwujZs6eRnp5ufPjhh82mBl7tnv/4xz82brzxRsNqtRpjx441jhw50uI9N3vvzFIL0wdXrFhx1SmrX2x70+fzi5+/xsZG4+mnnzbi4+ONwMBAY+jQocYr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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgIAAAGzCAYAAABdO3+BAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA4KklEQVR4nO3df1zV9d3/8edR4YAKxwD5lUj4I/EXdl3+INKMxERqTpOaWtvUmc6FXVPXLLby11qUu1auXYhtc5AVpbbU5a50aopzE690c9ZWTLkoMQWXuwDFQMb5fP9wnG8nUD6Hc4DjOY/77fa+jfP+/Hqfz06e13m9f3wshmEYAgAAfqlLZzcAAAB0HgIBAAD8GIEAAAB+jEAAAAA/RiAAAIAfIxAAAMCPEQgAAODHCAQAAPBjBAIAAPgxAgG0u48++kgWi0UFBQUuH7t//35ZLBbt37+/1X1TU1OVmprq8jXgzJV7DuD6RyAAtxUUFMhisbRYHn/88c5uXrt6+umntW3bNlP7njlzRitXrtSxY8fatU2+5K677pLFYtGiRYuc6svLy7Vq1SqNGTNGN9xwgyIiIpSamqo9e/aYPrfdbteaNWuUkJCgoKAgJSUl6bXXXvP0WwC8XrfObgB8x+rVq5WQkOBUN2zYMMXHx+uzzz5TQEBAJ7Ws/Tz99NO67777NG3atFb3PXPmjFatWqWbbrpJt9xyS7u37Xr35ptv6tChQy1u2759u5599llNmzZNs2fP1j//+U9t3LhRd911l375y19q7ty5rZ7/+9//vp555hnNnz9fo0eP1vbt2/XAAw/IYrFo5syZnn47gNciEIDHZGRkaNSoUS1uCwoK6uDW4HpWV1en73znO3rssce0fPnyZtvvvPNOnTp1ShEREY66hQsX6pZbbtHy5ctbDQQ++eQT/fjHP1ZWVpb+67/+S5L00EMP6Y477tB3v/td3X///eratatn3xTgpegaQLu72hiBDz/8UPfdd5/CwsIUFBSkUaNG6de//rWpc/7sZz9T//79FRwcrDFjxuh3v/ud6fbs3r1b48aNU69evdSzZ08NGjRI3/ve95z2qa+v14oVKzRgwABZrVbFxcVp2bJlqq+vd+xjsVhUW1url156ydEVMmfOnBavuX//fo0ePVqSNHfuXMf+n78nW7Zs0ciRIxUcHKyIiAh99atf1SeffHLN93LkyBFZLBa99NJLzbbt2rVLFotFO3bskCR9/PHHevjhhzVo0CAFBwcrPDxc999/vz766KNW79lNN93U4ntraVyGmXvXmjVr1shut+vRRx9tcfvQoUOdggBJslqtuvvuu3X69GlduHDhmuffvn27Ghoa9PDDDzvqLBaLvvWtb+n06dNXzUQAvoiMADymurpan376qVPdF/+xbvKXv/xFY8eO1Y033qjHH39cPXr00ObNmzVt2jT96le/0r333nvV62zYsEHf/OY3ddttt2nx4sX63//9X335y19WWFiY4uLirtnGv/zlL/rSl76kpKQkrV69WlarVSdPntTvf/97xz52u11f/vKXdfDgQS1YsECDBw/We++9p+eff15/+9vfHGMCXn75ZT300EMaM2aMFixYIEnq379/i9cdPHiwVq9ereXLl2vBggW6/fbbJUm33XabpCvjLObOnavRo0crJydHlZWV+slPfqLf//73+tOf/qRevXq1eN5Ro0apX79+2rx5s2bPnu20bdOmTbrhhhuUnp4uSXr33Xf1hz/8QTNnzlSfPn300UcfKS8vT6mpqfrrX/+q7t27X/PemWH23l3LqVOn9Mwzz+iXv/ylgoODXbp+RUWFunfv3up7+dOf/qQePXpo8ODBTvVjxoxxbB83bpxL1wauWwbgpvz8fENSi8UwDKOsrMyQZOTn5zuOSUtLM4YPH27U1dU56ux2u3HbbbcZAwcOdNTt27fPkGTs27fPMAzDuHz5shEZGWnccsstRn19vWO/n/3sZ4Yk44477rhmW59//nlDkvH3v//9qvu8/PLLRpcuXYzf/e53TvXr1683JBm///3vHXU9evQwZs+efc1rNnn33Xeb3YfPv6dhw4YZn332maN+x44dhiRj+fLl1zxvdna2ERAQYPzjH/9w1NXX1xu9evUyvvGNbzjqLl261OzYQ4cOGZKMjRs3Ouq+eM8NwzDi4+NbfJ933HGH0z135d5dzX333WfcdtttjteSjKysrFaPO3HihBEUFGR87Wtfa3Xfe+65x+jXr1+z+traWkOS8fjjj7d6DsBX0DUAj8nNzdXu3budSkv+8Y9/6J133tFXvvIVXbhwQZ9++qk+/fRTnT9/Xunp6Tpx4sRVU+JHjhzRuXPntHDhQgUGBjrq58yZI5vN1mobm35Zb9++XXa7vcV9tmzZosGDBysxMdHRtk8//VQTJkyQJO3bt6/V67ii6T09/PDDTmMp7rnnHiUmJuo3v/nNNY+fMWOGGhoa9Oabbzrqfvvb36qqqkozZsxw1H3+13VDQ4POnz+vAQMGqFevXvrjH//okffi7r3bt2+ffvWrX2nt2rUuXffSpUu6//77FRwcrGeeeabV/T/77DNZrdZm9U33/7PPPnPp+sD1jK4BeMyYMWOuOljw806ePCnDMPTkk0/qySefbHGfc+fO6cYbb2xW//HHH0uSBg4c6FQfEBCgfv36tXrtGTNm6Be/+IUeeughPf7440pLS9P06dN13333qUuXK3HxiRMn9MEHH6h3795XbZsnNb2nQYMGNduWmJiogwcPXvP4ESNGKDExUZs2bdK8efMkXekWiIiIcHwBS1e+3HJycpSfn69PPvlEhmE4tlVXV3virbh17/75z3/qP/7jP/S1r33NMZ7CjMbGRs2cOVN//etf9fbbbys2NrbVY4KDg1scs1BXV+fYDvgLAgF0uKZf4o8++qij//qLBgwY0C7XDg4O1oEDB7Rv3z795je/0c6dO7Vp0yZNmDBBv/3tb9W1a1fZ7XYNHz5czz33XIvnaG0cQmeYMWOGfvjDH+rTTz9VSEiIfv3rX2vWrFnq1u3//yf+yCOPKD8/X4sXL1ZKSopsNptjqtzVsiNNLBZLi/WNjY1Oo+vduXcbN25USUmJXnzxxWYDGC9cuKCPPvpIkZGRzfr/58+frx07dujVV191CnyuJSYmRvv27ZNhGE7v7ezZs5JkKpgAfAWBADpc0y/3gIAATZw40aVj4+PjJV355fn5f/QbGhpUVlamESNGtHqOLl26KC0tTWlpaXruuef09NNP6/vf/7727duniRMnqn///vrzn/+stLS0q34BNmltu5l9m95TSUlJsy+ykpISx/ZrmTFjhlatWqVf/epXioqKUk1NTbO58G+88YZmz56tH//4x466uro6VVVVtXr+G264ocX9Pv74Y6dMjCv37otOnTqlhoYGjR07ttm2jRs3auPGjdq6davTmg3f/e53lZ+fr7Vr12rWrFmmr3XLLbfoF7/4hT744AMNGTLEUX/48GHHdsBfMEYAHS4yMlKpqal68cUXHb/APu/vf//7VY8dNWqUevfurfXr1+vy5cuO+oKCAlNfaP/4xz+a1TX9o9+UKv7KV76iTz75RD//+c+b7fvZZ5+ptrbW8bpHjx6mrtu0r6Rm+48aNUqRkZFav369U7r67bff1gcffKB77rmn1XMPHjxYw4cP16ZNm7Rp0ybFxMRo/PjxTvt07drVqTtAkn7605+qsbGx1fP3799fxcXFTvd8x44dKi8vd9rPlXv3RTNnztTWrVubFUm6++67tXXrViUnJzv2/9GPfqT//M//1Pe+9z19+9vfvup5q6ur9eGHHzp1f0ydOlUBAQFat26do84wDK1fv1433nijYzYH4A/ICKBT5Obmaty4cRo+fLjmz5+vfv36qbKyUocOHdLp06f15z//ucXjAgIC9NRTT+mb3/ymJkyYoBkzZqisrEz5+fmmxgisXr1aBw4c0D333KP4+HidO3dO69atU58+fRzTxb72ta9p8+bNWrhwofbt26exY8eqsbFRH374oTZv3qxdu3Y5xkKMHDlSe/bs0XPPPafY2FglJCQ4fVl9Xv/+/dWrVy+tX79eISEh6tGjh5KTk5WQkKBnn31Wc+fO1R133KFZs2Y5pg/edNNNWrJkial7OmPGDC1fvlxBQUGaN2+eY8xDky996Ut6+eWXZbPZNGTIEB06dEh79uxReHh4q+d+6KGH9MYbb2jy5Mn6yle+otLSUr3yyivNpku6cu++KDExUYmJiS1uS0hIcMoEbN26VcuWLdPAgQM1ePBgvfLKK07733XXXYqKinLsO3fuXOXn5zvWQujTp48WL16sH/3oR2poaNDo0aO1bds2/e53v9Orr77KYkLwL506ZwE+oWn64Lvvvtvi9pamDxqGYZSWlhpf//rXjejoaCMgIMC48cYbjS996UvGG2+84dinpalshmEY69atMxISEgyr1WqMGjXKOHDgQLOpbC3Zu3evMXXqVCM2NtYIDAw0YmNjjVmzZhl/+9vfnPa7fPmy8eyzzxpDhw41rFarccMNNxgjR440Vq1aZVRXVzv2+/DDD43x48cbwcHBhqRWpxJu377dGDJkiNGtW7dm92TTpk3Gv/3bvxlWq9UICwszHnzwQeP06dPXPN/nnThxwjFt8+DBg822/9///Z8xd+5cIyIiwujZs6eRnp5ufPjhh82mBl7tnv/4xz82brzxRsNqtRpjx441jhw50uI9N3vvzFIL0wdXrFhx1SmrX2x70+fzi5+/xsZG4+mnnzbi4+ONwMBAY+jQocYr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", "text/plain": [ "
" ] @@ -488,7 +488,7 @@ }, { "data": { - "image/png": "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de2DfX19MWbMGGRkZNg6ijdKT0+Hv78/7r//fgDAv//9bzz88MNo2bIlmjZtiv79+2Pr1q11bnNN11rcnEk37l/T0tLQoUMHNG3aFMOHD8f58+chhMBLL72Etm3bwtfXFw888AB++eWXavX+4x//wKBBg9CsWTP4+/tj1KhR+OGHH+pspwzZHFX72e/ZsyeCgoJs2WP9jbJ27Vq88MILaNOmDZo2bYrCwkIAcnlrbaM1PwICAtCqVSs8+eSTKC0tldr+/fv345577kGLFi3QrFkz9OrVC2+88Ybt70ePHsXkyZPRoUMH+Pj4IDQ0FI8++qjHDXdsDNxyJufixYvo168f8vPzkZSUhG7duuHChQv4+OOPUVJSYnek5oknnkBwcDAWLFiA4uJiTJkyBZ9++imSk5Nx9913IyIiAt9//z1SUlIwderUaqfHHTl58iTGjRuHxx9/HImJiVi1ahUefvhhbNu2DXfffTeAqlPUQ4YMwYULF/DHP/4R7dq1w969ezFv3jxcunQJS5cuRffu3fHBBx/gqaeeQtu2bW1DfIKDg/Hbb79h6NChOHXqFGbMmIGoqCisX78ekydPRn5+Pp588km7Nq1atQqlpaVISkqC2WxGy5Yt8cMPP+COO+5AmzZtMHfuXDRr1gwfffQREhIS8Mknn2D06NF1bmtpaSmuXLlit8zf37/WI2kvv/wyjEYjnnnmGRQUFGDx4sWYOHEi9u/f77B8cHAwli9fjmnTpmH06NEYM2YMANiGlclux8SJE5GSkoL09HTcdttttvorKyvx0UcfYdCgQWjXrp3i11aNr776Cp999hmmT58OAEhNTcW9996LZ599Fm+//TaeeOIJ/Prrr1i8eDEeffRR7Ny50/bcnTt3YuTIkejTpw8WLlwIo9GIVatW4a677sJXX32Ffv362a2roKCg2nvliqNrd911F5544gmkpqYiISEBt912Gy5duoSZM2ciLi6uziFoFRUVOH/+fLWhGq74zM6YMQPNmzfHokWLcOLECSxfvhxnz561hVlNjh49ikGDBqFJkyZISkpCZGQkTp8+jc2bN+PPf/4zAOC7777D3r17MX78eLRt2xZnzpzB8uXLMXToUPz4449o2rSpk68o6Y07M2v16tXw8/NDcnIy/Pz8sHPnTixYsACFhYV49dVXAQBLly7F+++/jw0bNtiGHvXs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AIDD98r6t8ZoxIgRGDNmDKKionD69Gk8//zzGDlyJLKysuDl5eXu5tXIYrFg9uzZuOOOO9CjRw8AVe+RyWRC8+bN7co2lvfI0TYBwO9//3u0b98e4eHhOHr0KJ577jmcOHECn376qRtbS56M2dR4eGI2NdZcAjwvm5hLjY9mOjmeZuTIkbb/79WrF2JiYtC+fXt89NFHmDp1qhtbRjUZP3687f979uyJXr16oWPHjsjMzMSwYcPc2LLaTZ8+HceOHWtU4+rrUtM2JSUl2f6/Z8+eCAsLw7Bhw3D69Gl07NixoZtJ1OgwmxqXxppLgOdlE3Op8dHMcLWgoCB4eXlVm2EjNzcXoaGhbmqV6zRv3hxdunTBqVOn3N0U1azvh6e+V1YdOnRAUFCQpt+zGTNmYMuWLdi1axfatm1rWx4aGory8nLk5+fblW8M71FN2+RITEwMAGj6PaLGjdnUeOghmxpDLgGel03MpcZJM50ck8mEPn36ICMjw7bMYrEgIyMDsbGxbmyZaxQVFeH06dMICwtzd1NUi4qKQmhoqN17VVhYiP3793vEe2X1888/4+rVq5p8z4QQmDFjBjZs2ICdO3ciKirK7u99+vRBkyZN7N6jEydO4Ny5c5p9j+raJkeOHDkCAJp8j8gzMJsaDz1kk5ZzCfC8bGIuNXLunffA3tq1a4XZbBarV68WP/74o0hKShLNmzcXOTk57m6aYk8//bTIzMwU2dnZ4ptvvhFxcXEiKChI5OXlubtpUq5duyYOHz4sDh8+LACI119/XRw+fFicPXtWCCHEyy+/LJo3by42bdokjh49Kh544AERFRUlfvvtNze3vGa1bdO1a9fEM888I7KyskR2drb48ssvxW233SY6d+4sSktL3d30aqZNmyYCAwNFZmamuHTpku1RUlJiK/P444+Ldu3aiZ07d4oDBw6I2NhYERsb68ZW166ubTp16pR48cUXxYEDB0R2drbYtGmT6NChgxg8eLCbW06ejtmkHZ6WTZ6US0J4XjYxlxo3TXVyhBBi2bJlol27dsJkMol+/fqJffv2ubtJThk3bpwICwsTJpNJtGnTRowbN06cOnXK3c2StmvXLgGg2iMxMVEIUTVV5/z580VISIgwm81i2LBh4sSJE+5tdB1q26aSkhIxfPhwERwcLJo0aSLat28vHnvsMc3+iHG0HQDEqlWrbGV+++038cQTT4gWLVqIpk2bitGjR4tLly65r9F1qGubzp07JwYPHixatmwpzGaz6NSpk5gzZ44oKChwb8NJF5hN2uBp2eRJuSSE52UTc6lxMwghhOvPDxEREREREbmHZq7JISIiIiIicgV2coiIiIiIyKOwk0NERERERB6FnRwiIiIiIvIo7OQQEREREZFHYSeHiIiIiIg8Cjs5RERERETkUdjJISIiIiIij8JODhEREREReRR2coiIiIiIyKOwk0NERERERB6FnRwiIiIiIvIo/x8ND78JUUP2OwAAAABJRU5ErkJggg==\n", + "image/png": "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de2DfX19MWbMGGRkZNg6ijdKT0+Hv78/7r//fgDAv//9bzz88MNo2bIlmjZtiv79+2Pr1q11bnNN11rcnEk37l/T0tLQoUMHNG3aFMOHD8f58+chhMBLL72Etm3bwtfXFw888AB++eWXavX+4x//wKBBg9CsWTP4+/tj1KhR+OGHH+pspwzZHFX72e/ZsyeCgoJs2WP9jbJ27Vq88MILaNOmDZo2bYrCwkIAcnlrbaM1PwICAtCqVSs8+eSTKC0tldr+/fv345577kGLFi3QrFkz9OrVC2+88Ybt70ePHsXkyZPRoUMH+Pj4IDQ0FI8++qjHDXdsDNxyJufixYvo168f8vPzkZSUhG7duuHChQv4+OOPUVJSYnek5oknnkBwcDAWLFiA4uJiTJkyBZ9++imSk5Nx9913IyIiAt9//z1SUlIwderUaqfHHTl58iTGjRuHxx9/HImJiVi1ahUefvhhbNu2DXfffTeAqlPUQ4YMwYULF/DHP/4R7dq1w969ezFv3jxcunQJS5cuRffu3fHBBx/gqaeeQtu2bW1DfIKDg/Hbb79h6NChOHXqFGbMmIGoqCisX78ekydPRn5+Pp588km7Nq1atQqlpaVISkqC2WxGy5Yt8cMPP+COO+5AmzZtMHfuXDRr1gwfffQREhIS8Mknn2D06NF1bmtpaSmuXLlit8zf37/WI2kvv/wyjEYjnnnmGRQUFGDx4sWYOHEi9u/f77B8cHAwli9fjmnTpmH06NEYM2YMANiGlclux8SJE5GSkoL09HTcdttttvorKyvx0UcfYdCgQWjXrp3i11aNr776Cp999hmmT58OAEhNTcW9996LZ599Fm+//TaeeOIJ/Prrr1i8eDEeffRR7Ny50/bcnTt3YuTIkejTpw8WLlwIo9GIVatW4a677sJXX32Ffv362a2roKCg2nvliqNrd911F5544gmkpqYiISEBt912Gy5duoSZM2ciLi6uziFoFRUVOH/+fLWhGq74zM6YMQPNmzfHokWLcOLECSxfvhxnz561hVlNjh49ikGDBqFJkyZISkpCZGQkTp8+jc2bN+PPf/4zAOC7777D3r17MX78eLRt2xZnzpzB8uXLMXToUPz4449o2rSpk68o6Y07M2v16tXw8/NDcnIy/Pz8sHPnTixYsACFhYV49dVXAQBLly7F+++/jw0bNtiGHvXs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AIDD98r6t8ZoxIgRGDNmDKKionD69Gk8//zzGDlyJLKysuDl5eXu5tXIYrFg9uzZuOOOO9CjRw8AVe+RyWRC8+bN7co2lvfI0TYBwO9//3u0b98e4eHhOHr0KJ577jmcOHECn376qRtbS56M2dR4eGI2NdZcAjwvm5hLjY9mOjmeZuTIkbb/79WrF2JiYtC+fXt89NFHmDp1qhtbRjUZP3687f979uyJXr16oWPHjsjMzMSwYcPc2LLaTZ8+HceOHWtU4+rrUtM2JSUl2f6/Z8+eCAsLw7Bhw3D69Gl07NixoZtJ1OgwmxqXxppLgOdlE3Op8dHMcLWgoCB4eXlVm2EjNzcXoaGhbmqV6zRv3hxdunTBqVOn3N0U1azvh6e+V1YdOnRAUFCQpt+zGTNmYMuWLdi1axfatm1rWx4aGory8nLk5+fblW8M71FN2+RITEwMAGj6PaLGjdnUeOghmxpDLgGel03MpcZJM50ck8mEPn36ICMjw7bMYrEgIyMDsbGxbmyZaxQVFeH06dMICwtzd1NUi4qKQmhoqN17VVhYiP3793vEe2X1888/4+rVq5p8z4QQmDFjBjZs2ICdO3ciKirK7u99+vRBkyZN7N6jEydO4Ny5c5p9j+raJkeOHDkCAJp8j8gzMJsaDz1kk5ZzCfC8bGIuNXLunffA3tq1a4XZbBarV68WP/74o0hKShLNmzcXOTk57m6aYk8//bTIzMwU2dnZ4ptvvhFxcXEiKChI5OXlubtpUq5duyYOHz4sDh8+LACI119/XRw+fFicPXtWCCHEyy+/LJo3by42bdokjh49Kh544AERFRUlfvvtNze3vGa1bdO1a9fEM888I7KyskR2drb48ssvxW233SY6d+4sSktL3d30aqZNmyYCAwNFZmamuHTpku1RUlJiK/P444+Ldu3aiZ07d4oDBw6I2NhYERsb68ZW166ubTp16pR48cUXxYEDB0R2drbYtGmT6NChgxg8eLCbW06ejtmkHZ6WTZ6US0J4XjYxlxo3TXVyhBBi2bJlol27dsJkMol+/fqJffv2ubtJThk3bpwICwsTJpNJtGnTRowbN06cOnXK3c2StmvXLgGg2iMxMVEIUTVV5/z580VISIgwm81i2LBh4sSJE+5tdB1q26aSkhIxfPhwERwcLJo0aSLat28vHnvsMc3+iHG0HQDEqlWrbGV+++038cQTT4gWLVqIpk2bitGjR4tLly65r9F1qGubzp07JwYPHixatmwpzGaz6NSpk5gzZ44oKChwb8NJF5hN2uBp2eRJuSSE52UTc6lxMwghhOvPDxEREREREbmHZq7JISIiIiIicgV2coiIiIiIyKOwk0NERERERB6FnRwiIiIiIvIo7OQQEREREZFHYSeHiIiIiIg8Cjs5RERERETkUdjJISIiIiIij8JODhEREREReRR2coiIiIiIyKOwk0NERERERB6FnRwiIiIiIvIo/x8ND78JUUP2OwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] @@ -737,7 +737,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABQsAAAF2CAYAAADJMM7PAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABqNUlEQVR4nO3deXxU1f3/8fckkAlbEmNIQjDsKiBbDZIvKIKaEpCi1A3UryBVqErcqK1alUXUuCJWEapVaKlURAu2yheKKLhFEYSfWgGRsikkbE0CARLInN8fmAlDFmbuzNxMbl7Px+M+NHfOvffcGTLvzGfOPddljDECAAAAAAAA0OBF1XUHAAAAAAAAAEQGioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioVAmAwcOFADBw6s624AAByiPuRKQUGBrrrqKp1++ulyuVyaPn16XXcJAGo0efJkuVwun3Xt2rXTjTfe6LNu06ZNGjRokOLj4+VyubRo0SJJ0hdffKF+/fqpWbNmcrlcWrdunT0dr+dqej4BRA6KhTX49NNPNXnyZBUWFtZ1VxCkF198UXPmzAnLvr/99ltNnjxZW7duDcv+w2nnzp2aPHmy33/UhOt34h//+IfOPfdcxcbGqk2bNpo0aZKOHTsW0mMAkYBccQ5ypWZ33323li5dqvvvv19z587V4MGDtXjxYk2ePNnWfmzcuFF33323+vXrp9jYWLlcrlqf03BmUV2cP4DQGj16tL7++ms9+uijmjt3rnr37q2jR4/q6quv1v79+/Xss89q7ty5atu2bV13tV6o7vmcN2+e7V8wrVq1SrfddpsyMjLUuHHjKoXjk73yyivq0qWLYmNjdeaZZ+r5558PWV/q4vyBWhlU66mnnjKSzJYtW+q6KwjSOeecYwYMGBCWfS9YsMBIMh988EGVx0pLS01paWlYjhsKX3zxhZFkZs+e7Vf7cPxOLF682LhcLnPRRReZl156ydx+++0mKirK3HLLLSE7BhApyBXnIFdqlpKSYq6//nqfdePHjzd2/8k5e/ZsExUVZbp162Z69epV6+9euLOoLs4fgH8mTZpU5ffzyJEjpqyszPvzoUOHjCTzwAMP+LRbv369kWRefvllW/rqFDU9n0OHDjVt27a1tS+TJk0yjRs3NhkZGeass86q9b161qxZRpK58sorzUsvvWRuuOEGI8k8/vjjIelLXZw/UJtG9pcnncfj8aisrEyxsbF13RWvkpISNWvWrK67Ue+E8nmLiYkJyX6c7J577lGPHj30r3/9S40aHX87iouL02OPPaY777xTnTt3ruMeAnWDXHGOhpYru3fvVkJCQtiPY4zRkSNH1KRJk2ofv+yyy1RYWKgWLVro6aefrnUUPVkE4ERut9vn5z179khSlfe23bt3V7s+GA0ha2t6PsPhVH9P3Xrrrbr33nvVpEkT5eTk6Lvvvqu23eHDh/XAAw9o6NChevPNNyVJY8eOlcfj0dSpUzVu3DiddtppYTsPoE7UdbUyElV8w3TyUvGNtCQzfvx489e//tV07drVNGrUyCxcuNAYc3zkSN++fU1iYqKJjY015557rlmwYEG1x5k7d64577zzTJMmTUxCQoLp37+/Wbp0qU+bxYsXmwsuuMA0bdrUNG/e3Fx66aXmm2++8WkzevRo06xZM/P999+bIUOGmObNm5vLL7+81nP84YcfzK9+9SvTqlUrExMTY9q1a2duueUWnxELmzdvNldddZU57bTTTJMmTUxmZqZ55513fPbzwQcfGElm/vz55pFHHjGtW7c2brfbXHzxxWbTpk1VjvvZZ5+ZIUOGmISEBNO0aVPTvXt3M336dJ8269evN1deeaU57bTTjNvtNhkZGebtt9/2aTN79mwjyXz88cfm7rvvNklJSaZp06Zm+PDhZvfu3d52bdu2rfI6VowGqdjHihUrzK233mpatmxpEhISjDHGbN261dx6663mrLPOMrGxsSYxMdFcddVVPqMSKrY/eakYDTJgwIAqI08KCgrMr371K5OcnGzcbrfp0aOHmTNnjk+bLVu2GEnmqaeeMn/84x9Nhw4dTExMjOndu7dZtWpVzS/qT/bt22d+85vfmG7duplmzZqZFi1amMGDB5t169ZVed1OXmoaZXiq3wkr/v3vfxtJZsaMGT7rf/zxRyPJTJ061fK+gUhDrhxHrjg3V2rq++jRo6tdX6G8vNw8++yzpmvXrsbtdpvk5GQzbtw4s3//fp8+tG3b1gwdOtQsWbLEZGRkGLfbbZ599tlT9t2Y2kf1BptFZWVlZvLkyaZTp07G7XabxMREc/7555t//etfxhgT8vNfunSp6dmzp3G73aZLly7mrbfeCqg/QEP20Ucfmd69exu32206dOhgZs2aVe3IwrZt25rRo0cbY6rP74rHa8oCYwLLneoyw5jA8vqHH34wl19+uWnWrJlJSkoyv/nNb8yxY8d82paXl5vp06ebbt26GbfbbZKSkkx2drb54osvfNrNnTvXnHvuuSY2NtacdtppZsSIEWb79u2nfH79ybmans8BAwZUu77CkSNHzMSJE03Hjh1NTEyMOeOMM8xvf/tbc+TIEZ8+1Pb31KnUNgr83XffNZLMu+++67P+008/NZLM3Llza913cXGxufPOO03btm1NTEyMadmypcnKyjJr1qwxxpiwnP9ZZ51l3G63Offcc83KlSsD6g9gDCMLq3XFFVfou+++09/+9jc9++yzSkpKkiS1bNnS2+b999/XG2+8oZycHCUlJaldu3aSpOeee06XXXaZrr/+epWVlen111/X1VdfrXfeeUdDhw71bj9lyhRNnjxZ/fr108MPP6yYmBh9/vnnev/99zVo0CBJ0ty5czV69GhlZ2friSee0KFDhzRz5kxdcMEFWrt2rfeYknTs2DFlZ2frggsu0NNPP62mTZvWeH47d+5Unz59VFhYqHHjxqlz58768ccf9eabb+rQoUOKiYlRQUGB+vXrp0OHDumOO+7Q6aefrj//+c+67LLL9Oabb+qXv/ylzz4ff/xxRUVF6Z577lFRUZGefPJJXX/99fr888+9bZYtW6Zf/OIXatWqle68806lpqZq/fr1euedd3TnnXdKkv7973/r/PPPV+vWrXXfffepWbNmeuONNzR8+HC99dZbVY57++2367TTTtOkSZO0detWTZ8+XTk5OZo/f74kafr06br99tvVvHlzPfDAA5KklJQUn33cdtttatmypSZOnKiSkhJJxycr/vTTTzVy5EidccYZ2rp1q2bOnKmBAwfq22+/VdOmTXXhhRfqjjvu0B/+8Af9/ve/V5cuXSTJ+9+THT58WAMHDtT333+vnJwctW/fXgsWLNCNN96owsJC73NQYd68eTpw4IB+/etfy+Vy6cknn9QVV1yh//znP2rcuHGNr+9//vMfLVq0SFdffbXat2+vgoIC/fGPf9SAAQP07bffKi0tTV26dNHDDz+siRMnaty4cerfv78kqV+/ftXu81S/E0VFRTp69GiNfaoQGxur5s2bS5LWrl0rSerdu7dPm7S0NJ1xxhnexwEnIFfIFafnyoUXXqi5c+fqhhtu0M9//nONGjVKktSxY0ft3LlTy5Yt09y5c6vs+9e//rXmzJmjMWPG6I477tCWLVv0wgsvaO3atfrkk098+rVx40Zde+21+vWvf62xY8fq7LPPrrHP/go2iyZPnqzc3FzdfPPN6tOnj4qLi7V69Wp9+eWX+vnPf65f//rXITv/TZs2acSIEbrllls0evRozZ49W1dffbWWLFmin//85371B2iovv76aw0aNEgtW7bU5MmTdezYMU2aNKnK+/fJrrjiCiUkJOjuu+/Wtddeq0svvVTNmzdXSkqKWrdurccee0x33HGHzjvvPO++As2d6jIjkLwuLy9Xdna2MjMz9fTTT+u9997TM888o44dO+rWW2/1trvppps0Z84cDRkyRDfffLOOHTumjz76SJ999pn3PfDRRx/VQw89pGuuuUY333yz9uzZo+eff14XXnih1q5dW+toQH9yrqbns1mzZioqKtIPP/ygZ599VpK8nxk8Ho8uu+wyffzxxxo3bpy6dOmir7/+Ws8++6y+++67KjdHqenvqWDUlBUZGRmKiorS2rVr9b//+781bn/LLbfozTffVE5Ojrp27ap9+/bp448/1vr163XuuefqgQceCNn5r1y5UvPnz9cdd9wht9utF198UYMHD9aqVavUrVs3v/oDSGJkYU1q+xZakomKijL//ve/qzx26NAhn5/LyspMt27dzMUXX+xdt2nTJhMVFWV++ctfmvLycp/2Ho/HGGPMgQMHTEJCghk7dqzP4/n5+SY+Pt5nfcU3W/fdd59f5zZq1CgTFRVV5VukE49/1113GUnmo48+8j524MAB0759e9OuXTtvvytGgHTp0sVn9Mhzzz1nJJmvv/7aGGPMsWPHTPv27U3btm3Nf//732qPaYwxl1xyienevbvPtyQej8f069fPnHnmmd51Fd/EZWVl+Wx/9913m+joaFNYWOhdV9PcUhX7uOCCC6p883by62iMMXl5eUaS+ctf/uJdV9vcUiePAJk+fbqRZP76179615WVlZm+ffua5s2bm+LiYmNM5QiQ008/3Wdkwdtvv20kmX/+859VjnWiI0eOVPl3tWXLFuN2u83DDz/sXRfKOQur+zasuqXiW9oT91fdN5XnnXee+Z//+R+/+gXUF+QKuXIyp+WKMZWjGk5U02iNjz76yEgyr732ms/6JUuWVFlfMaJzyZIltfa1OrX97gWbRT179jRDhw6ttU0oz//EkYRFRUWmVatW5mc/+1lA/QEaouHDh5vY2Fizbds277pvv/3WREdH1zqy0Bjf0dknqsirk0f7B5o7J2eGlbw++b34Zz/7mcnIyPD+/P777xtJ5o477qjy3FRk3tatW010dLR59NFHfR7/+uuvTaNGjaqsP5m/OVfT81nTnH1z5841UVFRPn8/GFM5h+Ann3ziXVfb31OnUtvIwvHjx5vo6OhqH2vZsqUZOXJkrfuOj4+vko0nC9X5SzKrV6/2rtu2bZuJjY01v/zlLwPqD8DdkC0aMGCAunbtWmX9iXPn/Pe//1VRUZH69++vL7/80rt+0aJF8ng8mjhxoqKifF+CijswLVu2TIWFhbr22mu1d+9e7xIdHa3MzEx98MEHVY594jdHNfF4PFq0aJGGDRtW5ZuRE4+/ePFi9enTRxdccIH3sebNm2vcuHHaunWrvv32W5/txowZ4zOXUsVItf/85z+Sjn8bs2XLFt11111VvpGqOOb+/fv1/vvv65prrtGBAwe857xv3z5lZ2dr06ZN+vHHH322HTdunM9dq/r376/y8nJt27btlM9FhbFjxyo6Otpn3Ymv49GjR7Vv3z516tRJCQkJPq9lIBYvXqzU1FRde+213nWNGzfWHXfcoYMHD2rlypU+7UeMGOEz98XJz2lN3G63999VeXm59u3bp+bNm+vss8+23PdTeeaZZ7Rs2bJTLr/73e+82xw+fNjb35PFxsZ6HwcaCnKFXAlUfc+VBQsWKD4+Xj//+c99/k1mZGSoefPmVf5Ntm/fXtnZ2ZaPV51gsyghIUH//ve/tWnTpoCPHej5p6Wl+YxIiouL06hRo7R27Vrl5+cH3R/AqcrLy7V06VINHz5cbdq08a7v0qVLyN9TrOTOyZlhJa9vueUWn5/79+/v897+1ltvyeVyadKkSVW2rci8v//97/J4PLrmmmt8jpuamqozzzyz2uOeKBw5Jx1/r+zSpYs6d+7s06+LL75Ykqr0q6a/p4Jx+PDhGucN9jcrPv/8c+3cuTPgYwd6/n379lVGRob35zZt2ujyyy/X0qVLVV5eHnR/0HBwGbJF7du3r3b9O++8o0ceeUTr1q1TaWmpd/2JHzw2b96sqKioWt/EKv7Iq3gTOFlcXJzPz40aNdIZZ5xxyn7v2bNHxcXF3iHINdm2bZsyMzOrrK+4FGrbtm0++zgxeCV5P4z897//lXT8nCXVetzvv/9exhg99NBDeuihh6pts3v3brVu3drv4/qjutfy8OHDys3N1ezZs/Xjjz/KGON9rKioyO99n2jbtm0688wzq3yQP/E5PZHVc/N4PHruuef04osvasuWLd5QkKTTTz/dUt9P5cRA8lfFHxQn/p5UqG3SesCpyBVyJVD1PVc2bdqkoqIiJScnV/t4xc0DKtT0OxKMYLPo4Ycf1uWXX66zzjpL3bp10+DBg3XDDTeoR48epzx2oOffqVMnn997STrrrLMkSVu3blVqampQ/QGcas+ePTp8+LDOPPPMKo+dffbZWrx4cciOZSV3Tn5vCzSvY2NjfaY1kY6/v5/43r5582alpaUpMTGxxr5v2rRJxphqnydJtU5XIYUn5yr6tX79+irnWMGurCgrK6v2MX+y4sknn9To0aOVnp6ujIwMXXrppRo1apQ6dOhwymMHev7VvX5nnXWWDh06pD179ig1NTWo/qDhoFhoUXVvCB999JEuu+wyXXjhhXrxxRfVqlUrNW7cWLNnz9a8efMC2r/H45F0fL6K1NTUKo9X3K2vwonf+teFk0dQVDgxJE6l4pzvueeeGr/l69SpU8iPW91refvtt2v27Nm666671LdvX8XHx8vlcmnkyJHefoab1XN77LHH9NBDD+lXv/qVpk6dqsTEREVFRemuu+4KW9/3799fY4CeqEmTJoqPj5cktWrVSpK0a9cupaen+7TbtWuX+vTpE/qOAhGMXPFFroRepOWKx+NRcnKyXnvttWofP/mDUTi+RAo2iy688EJt3rxZb7/9tv71r3/pT3/6k5599lnNmjVLN998c63bBnr+/gimPwCCZyV3Tn5vCzSva3pvD5TH45HL5dL//d//VbvPijn0ahKunPN4POrevbumTZtW7eMnv3eHKyvKy8u1e/duny94ysrKtG/fPqWlpdW6/TXXXKP+/ftr4cKF+te//qWnnnpKTzzxhP7+979ryJAhtW4b6Pn7I5j+oOGgWFiDk7+59cdbb72l2NhYLV261OdyltmzZ/u069ixozwej7799lv16tWr2n117NhRkpScnKysrKyA+1KTli1bKi4uTt98802t7dq2bauNGzdWWb9hwwbv44GoOJ9vvvmmxvOp+CajcePGIT1nK6/lm2++qdGjR+uZZ57xrjty5IgKCwst77tt27b66quv5PF4fD6AW31Oa/Lmm2/qoosu0iuvvOKzvrCw0HtTBSnw56W29ldccUWVy92qM3r0aM2ZM0eSvP/2V69e7fNhbOfOnfrhhx80bty4gPoHRDpyhVxxeq7UpKZz6tixo9577z2df/75dTaaPBRZlJiYqDFjxmjMmDE6ePCgLrzwQk2ePNlbnAvV+VeMWDpxf999950k+Uzgf6r+AA1Ny5Yt1aRJk2ovz68ul4IRitwJR1537NhRS5cu1f79+2scXdixY0cZY9S+fXvvqOVA+JtzNantvfL//b//p0suucRS/obCiVlx6aWXetevXr1aHo+nxr+9TtSqVSvddtttuu2227R7926de+65evTRR73FuVCdf3X/zr/77js1bdrU50uoU/UHYM7CGjRr1kyS/H5zk45/q+NyuXwuz9m6dWuVOxQNHz5cUVFRevjhh6t8y1Lx7X52drbi4uL02GOPVXuX2T179vjdrxNFRUVp+PDh+uc//6nVq1dXebzi+JdeeqlWrVqlvLw872MlJSV66aWX1K5du4DngTj33HPVvn17TZ8+vcpzWnHM5ORkDRw4UH/84x+1a9euKvuwes7NmjUL6HWUjr+WJ4+0eP75531e24p9S/79O7n00kuVn5/vvaOmdPxuo88//7yaN2+uAQMGBNTHmlTX9wULFlSZHyXQf+O1tbcyZ+E555yjzp0766WXXvJ5XmfOnCmXy6WrrrrKr34B9QW5Qq44PVdqUtM5XXPNNSovL9fUqVOrbHPs2LGAn2Mrgs2iffv2+fzcvHlzderUyeey5lCd/86dO7Vw4ULvz8XFxfrLX/6iXr16eUcf+dMfoKGJjo5Wdna2Fi1apO3bt3vXr1+/XkuXLg3psUKRO+HI6yuvvFLGGE2ZMqXKYxXv71dccYWio6M1ZcqUKu/5xpgq7y8n8zfnalJxR+STXXPNNfrxxx/18ssvV3ns8OHD3jtIh9PFF1+sxMREzZw502f9zJkz1bRpUw0dOrTGbcvLy6ucV3JystLS0qpkRSjOPy8vz2eOyB07dujtt9/WoEGDFB0d7Xd/AEYW1qBiDrYHHnhAI0eOVOPGjTVs2DDvH3zVGTp0qKZNm6bBgwfruuuu0+7duzVjxgx16tRJX331lbddp06d9MADD2jq1Knq37+/rrjiCrndbn3xxRdKS0tTbm6u4uLiNHPmTN1www0699xzNXLkSLVs2VLbt2/Xu+++q/PPP18vvPCCpXN77LHH9K9//UsDBgzw3n59165dWrBggT7++GMlJCTovvvu09/+9jcNGTJEd9xxhxITE/XnP/9ZW7Zs0VtvvRXwpWlRUVGaOXOmhg0bpl69emnMmDFq1aqVNmzYoH//+9/eoJ4xY4YuuOACde/eXWPHjlWHDh1UUFCgvLw8/fDDD/p//+//BXy+GRkZmjlzph555BF16tRJycnJNc4BUuEXv/iF5s6dq/j4eHXt2lV5eXl67733qszN1KtXL0VHR+uJJ55QUVGR3G63Lr744mrnHxo3bpz++Mc/6sYbb9SaNWvUrl07vfnmm/rkk080ffp0tWjRIuBzq6nvDz/8sMaMGaN+/frp66+/1muvvVZlDoqOHTsqISFBs2bNUosWLdSsWTNlZmbWOM9Hbb8TVuYslKSnnnpKl112mQYNGqSRI0fqm2++0QsvvKCbb77ZO+cW4BTkCrni9FypScW//TvuuEPZ2dmKjo7WyJEjNWDAAP36179Wbm6u1q1bp0GDBqlx48batGmTFixYoOeee87yF0dFRUV6/vnnJUmffPKJJOmFF15QQkKCEhISlJOT420bTBZ17dpVAwcOVEZGhhITE7V69Wq9+eabPvsP1fmfddZZuummm/TFF18oJSVFr776qgoKCnxGGvvTH6AhmjJlipYsWaL+/fvrtttu836xcs455/jkaSgEmzvhyOuLLrpIN9xwg/7whz9o06ZNGjx4sDwejz766CNddNFFysnJUceOHfXII4/o/vvv19atWzV8+HC1aNFCW7Zs0cKFCzVu3Djdc889NR7D35yrSUZGhubPn68JEybovPPOU/PmzTVs2DDdcMMNeuONN3TLLbfogw8+0Pnnn6/y8nJt2LBBb7zxhpYuXVrtDdb8sW3bNs2dO1eSvF94PvLII5KOj86/4YYbJB2/tHnq1KkaP368rr76amVnZ+ujjz7SX//6Vz366KO1zgV54MABnXHGGbrqqqvUs2dPNW/eXO+9956++OILn1GYoTr/bt26KTs7W3fccYfcbrdefPFFSfIWiv3tD1D9vcFh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586duuKKK0LecQCobzxyyWMsLFyyFTbkGgBYZynXyLSwIdMAIEguV+CFQpczcy2gy5CXLFni8/OcOXOUnJysNWvW6MILL1RRUZFeeeUVzZs3TxdffLEkafbs2erSpYs+++wz/c///E/oeg4A9YyxOGeh4YNV2JBrAGCdlVwj08KHTAOAIHEZsldQZ1VUVCRJSkxMlCStWbNGR48eVVZWlrdN586d1aZNG+Xl5VW7j9LSUhUXF/ssAADUBXINAOAUocg0iVwDgIbIcrHQ4/Horrvu0vnnn69u3bpJkvLz8xUTE6OEhASftikpKcrPz692P7m5uYqPj/cu6enpVrsEABHN0iXIPy0IP3INAAJDpkWuUGWaRK4BaECYs9DL8lmNHz9e33zzjV5//fWgOnD//ferqKjIu+zYsSOo/QFApOIGJ5GNXAOAwJBpkStUmSaRawAaEIqFXgHNWVghJydH77zzjj788EOdccYZ3vWpqakqKytTYWGhzzdWBQUFSk1NrXZfbrdbbrfbSjcAoF6xOqKCURjhR64BQOCs5BqZFn6hzDSJXAPQgDBnoVdAZ2WMUU5OjhYuXKj3339f7du393k8IyNDjRs31vLly73rNm7cqO3bt6tv376h6TEA1FOenyaCt7IgPMg1ALCOTIssZBoABImRhV4BjSwcP3685s2bp7ffflstWrTwzm0RHx+vJk2aKD4+XjfddJMmTJigxMRExcXF6fbbb1ffvn25uxaABo+RhZGHXAMA6xhZGFnINAAIEiMLvQIqFs6cOVOSNHDgQJ/1s2fP1o033ihJevbZZxUVFaUrr7xSpaWlys7O1osvvhiSzgIAEErkGgDAKcg0AECoBFQsNMacsk1sbKxmzJihGTNmWO4UADgRIwsjD7kGANYxsjCykGkAECRGFnpZusEJACBwFAsBAE5CsRAA4CgUC72ceVYAEIEqPlRZWQAAiDRkGgDAUVyuwG9u4rKWazNmzFC7du0UGxurzMxMrVq1qsa2L7/8svr376/TTjtNp512mrKysmptHwoUCwHAJkbW7hx56ouKAACwn5VcI9MAABHLprshz58/XxMmTNCkSZP05ZdfqmfPnsrOztbu3burbb9ixQpde+21+uCDD5SXl6f09HQNGjRIP/74Y7BnXCOKhQAAAAAAAIANpk2bprFjx2rMmDHq2rWrZs2apaZN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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAABQsAAAF2CAYAAADJMM7PAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABqNUlEQVR4nO3deXxU1f3/8fckkAlbEmNIQjDsKiBbDZIvKIKaEpCi1A3UryBVqErcqK1alUXUuCJWEapVaKlURAu2yheKKLhFEYSfWgGRsikkbE0CARLInN8fmAlDFmbuzNxMbl7Px+M+NHfOvffcGTLvzGfOPddljDECAAAAAAAA0OBF1XUHAAAAAAAAAEQGioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioVAmAwcOFADBw6s624AAByiPuRKQUGBrrrqKp1++ulyuVyaPn16XXcJAGo0efJkuVwun3Xt2rXTjTfe6LNu06ZNGjRokOLj4+VyubRo0SJJ0hdffKF+/fqpWbNmcrlcWrdunT0dr+dqej4BRA6KhTX49NNPNXnyZBUWFtZ1VxCkF198UXPmzAnLvr/99ltNnjxZW7duDcv+w2nnzp2aPHmy33/UhOt34h//+IfOPfdcxcbGqk2bNpo0aZKOHTsW0mMAkYBccQ5ypWZ33323li5dqvvvv19z587V4MGDtXjxYk2ePNnWfmzcuFF33323+vXrp9jYWLlcrlqf03BmUV2cP4DQGj16tL7++ms9+uijmjt3rnr37q2jR4/q6quv1v79+/Xss89q7ty5atu2bV13tV6o7vmcN2+e7V8wrVq1SrfddpsyMjLUuHHjKoXjk73yyivq0qWLYmNjdeaZZ+r5558PWV/q4vyBWhlU66mnnjKSzJYtW+q6KwjSOeecYwYMGBCWfS9YsMBIMh988EGVx0pLS01paWlYjhsKX3zxhZFkZs+e7Vf7cPxOLF682LhcLnPRRReZl156ydx+++0mKirK3HLLLSE7BhApyBXnIFdqlpKSYq6//nqfdePHjzd2/8k5e/ZsExUVZbp162Z69epV6+9euLOoLs4fgH8mTZpU5ffzyJEjpqyszPvzoUOHjCTzwAMP+LRbv369kWRefvllW/rqFDU9n0OHDjVt27a1tS+TJk0yjRs3NhkZGeass86q9b161qxZRpK58sorzUsvvWRuuOEGI8k8/vjjIelLXZw/UJtG9pcnncfj8aisrEyxsbF13RWvkpISNWvWrK67Ue+E8nmLiYkJyX6c7J577lGPHj30r3/9S40aHX87iouL02OPPaY777xTnTt3ruMeAnWDXHGOhpYru3fvVkJCQtiPY4zRkSNH1KRJk2ofv+yyy1RYWKgWLVro6aefrnUUPVkE4ERut9vn5z179khSlfe23bt3V7s+GA0ha2t6PsPhVH9P3Xrrrbr33nvVpEkT5eTk6Lvvvqu23eHDh/XAAw9o6NChevPNNyVJY8eOlcfj0dSpUzVu3DiddtppYTsPoE7UdbUyElV8w3TyUvGNtCQzfvx489e//tV07drVNGrUyCxcuNAYc3zkSN++fU1iYqKJjY015557rlmwYEG1x5k7d64577zzTJMmTUxCQoLp37+/Wbp0qU+bxYsXmwsuuMA0bdrUNG/e3Fx66aXmm2++8WkzevRo06xZM/P999+bIUOGmObNm5vLL7+81nP84YcfzK9+9SvTqlUrExMTY9q1a2duueUWnxELmzdvNldddZU57bTTTJMmTUxmZqZ55513fPbzwQcfGElm/vz55pFHHjGtW7c2brfbXHzxxWbTpk1VjvvZZ5+ZIUOGmISEBNO0aVPTvXt3M336dJ8269evN1deeaU57bTTjNvtNhkZGebtt9/2aTN79mwjyXz88cfm7rvvNklJSaZp06Zm+PDhZvfu3d52bdu2rfI6VowGqdjHihUrzK233mpatmxpEhISjDHGbN261dx6663mrLPOMrGxsSYxMdFcddVVPqMSKrY/eakYDTJgwIAqI08KCgrMr371K5OcnGzcbrfp0aOHmTNnjk+bLVu2GEnmqaeeMn/84x9Nhw4dTExMjOndu7dZtWpVzS/qT/bt22d+85vfmG7duplmzZqZFi1amMGDB5t169ZVed1OXmoaZXiq3wkr/v3vfxtJZsaMGT7rf/zxRyPJTJ061fK+gUhDrhxHrjg3V2rq++jRo6tdX6G8vNw8++yzpmvXrsbtdpvk5GQzbtw4s3//fp8+tG3b1gwdOtQsWbLEZGRkGLfbbZ599tlT9t2Y2kf1BptFZWVlZvLkyaZTp07G7XabxMREc/7555t//etfxhgT8vNfunSp6dmzp3G73aZLly7mrbfeCqg/QEP20Ucfmd69exu32206dOhgZs2aVe3IwrZt25rRo0cbY6rP74rHa8oCYwLLneoyw5jA8vqHH34wl19+uWnWrJlJSkoyv/nNb8yxY8d82paXl5vp06ebbt26GbfbbZKSkkx2drb54osvfNrNnTvXnHvuuSY2NtacdtppZsSIEWb79u2nfH79ybmans8BAwZUu77CkSNHzMSJE03Hjh1NTEyMOeOMM8xvf/tbc+TIEZ8+1Pb31KnUNgr83XffNZLMu+++67P+008/NZLM3Llza913cXGxufPOO03btm1NTEyMadmypcnKyjJr1qwxxpiwnP9ZZ51l3G63Offcc83KlSsD6g9gDCMLq3XFFVfou+++09/+9jc9++yzSkpKkiS1bNnS2+b999/XG2+8oZycHCUlJaldu3aSpOeee06XXXaZrr/+epWVlen111/X1VdfrXfeeUdDhw71bj9lyhRNnjxZ/fr108MPP6yYmBh9/vnnev/99zVo0CBJ0ty5czV69GhlZ2friSee0KFDhzRz5kxdcMEFWrt2rfeYknTs2DFlZ2frggsu0NNPP62mTZvWeH47d+5Unz59VFhYqHHjxqlz58768ccf9eabb+rQoUOKiYlRQUGB+vXrp0OHDumOO+7Q6aefrj//+c+67LLL9Oabb+qXv/ylzz4ff/xxRUVF6Z577lFRUZGefPJJXX/99fr888+9bZYtW6Zf/OIXatWqle68806lpqZq/fr1euedd3TnnXdKkv7973/r/PPPV+vWrXXfffepWbNmeuONNzR8+HC99dZbVY57++2367TTTtOkSZO0detWTZ8+XTk5OZo/f74kafr06br99tvVvHlzPfDAA5KklJQUn33cdtttatmypSZOnKiSkhJJxycr/vTTTzVy5EidccYZ2rp1q2bOnKmBAwfq22+/VdOmTXXhhRfqjjvu0B/+8Af9/ve/V5cuXSTJ+9+THT58WAMHDtT333+vnJwctW/fXgsWLNCNN96owsJC73NQYd68eTpw4IB+/etfy+Vy6cknn9QVV1yh//znP2rcuHGNr+9//vMfLVq0SFdffbXat2+vgoIC/fGPf9SAAQP07bffKi0tTV26dNHDDz+siRMnaty4cerfv78kqV+/ftXu81S/E0VFRTp69GiNfaoQGxur5s2bS5LWrl0rSerdu7dPm7S0NJ1xxhnexwEnIFfIFafnyoUXXqi5c+fqhhtu0M9//nONGjVKktSxY0ft3LlTy5Yt09y5c6vs+9e//rXmzJmjMWPG6I477tCWLVv0wgsvaO3atfrkk098+rVx40Zde+21+vWvf62xY8fq7LPPrrHP/go2iyZPnqzc3FzdfPPN6tOnj4qLi7V69Wp9+eWX+vnPf65f//rXITv/TZs2acSIEbrllls0evRozZ49W1dffbWWLFmin//85371B2iovv76aw0aNEgtW7bU5MmTdezYMU2aNKnK+/fJrrjiCiUkJOjuu+/Wtddeq0svvVTNmzdXSkqKWrdurccee0x33HGHzjvvPO++As2d6jIjkLwuLy9Xdna2MjMz9fTTT+u9997TM888o44dO+rWW2/1trvppps0Z84cDRkyRDfffLOOHTumjz76SJ999pn3PfDRRx/VQw89pGuuuUY333yz9uzZo+eff14XXnih1q5dW+toQH9yrqbns1mzZioqKtIPP/ygZ599VpK8nxk8Ho8uu+wyffzxxxo3bpy6dOmir7/+Ws8++6y+++67KjdHqenvqWDUlBUZGRmKiorS2rVr9b//+781bn/LLbfozTffVE5Ojrp27ap9+/bp448/1vr163XuuefqgQceCNn5r1y5UvPnz9cdd9wht9utF198UYMHD9aqVavUrVs3v/oDSGJkYU1q+xZakomKijL//ve/qzx26NAhn5/LyspMt27dzMUXX+xdt2nTJhMVFWV++ctfmvLycp/2Ho/HGGPMgQMHTEJCghk7dqzP4/n5+SY+Pt5nfcU3W/fdd59f5zZq1CgTFRVV5VukE49/1113GUnmo48+8j524MAB0759e9OuXTtvvytGgHTp0sVn9Mhzzz1nJJmvv/7aGGPMsWPHTPv27U3btm3Nf//732qPaYwxl1xyienevbvPtyQej8f069fPnHnmmd51Fd/EZWVl+Wx/9913m+joaFNYWOhdV9PcUhX7uOCCC6p883by62iMMXl5eUaS+ctf/uJdV9vcUiePAJk+fbqRZP76179615WVlZm+ffua5s2bm+LiYmNM5QiQ008/3Wdkwdtvv20kmX/+859VjnWiI0eOVPl3tWXLFuN2u83DDz/sXRfKOQur+zasuqXiW9oT91fdN5XnnXee+Z//+R+/+gXUF+QKuXIyp+WKMZWjGk5U02iNjz76yEgyr732ms/6JUuWVFlfMaJzyZIltfa1OrX97gWbRT179jRDhw6ttU0oz//EkYRFRUWmVatW5mc/+1lA/QEaouHDh5vY2Fizbds277pvv/3WREdH1zqy0Bjf0dknqsirk0f7B5o7J2eGlbw++b34Zz/7mcnIyPD+/P777xtJ5o477qjy3FRk3tatW010dLR59NFHfR7/+uuvTaNGjaqsP5m/OVfT81nTnH1z5841UVFRPn8/GFM5h+Ann3ziXVfb31OnUtvIwvHjx5vo6OhqH2vZsqUZOXJkrfuOj4+vko0nC9X5SzKrV6/2rtu2bZuJjY01v/zlLwPqD8DdkC0aMGCAunbtWmX9iXPn/Pe//1VRUZH69++vL7/80rt+0aJF8ng8mjhxoqKifF+CijswLVu2TIWFhbr22mu1d+9e7xIdHa3MzEx98MEHVY594jdHNfF4PFq0aJGGDRtW5ZuRE4+/ePFi9enTRxdccIH3sebNm2vcuHHaunWrvv32W5/txowZ4zOXUsVItf/85z+Sjn8bs2XLFt11111VvpGqOOb+/fv1/vvv65prrtGBAwe857xv3z5lZ2dr06ZN+vHHH322HTdunM9dq/r376/y8nJt27btlM9FhbFjxyo6Otpn3Ymv49GjR7Vv3z516tRJCQkJPq9lIBYvXqzU1FRde+213nWNGzfWHXfcoYMHD2rlypU+7UeMGOEz98XJz2lN3G63999VeXm59u3bp+bNm+vss8+23PdTeeaZZ7Rs2bJTLr/73e+82xw+fNjb35PFxsZ6HwcaCnKFXAlUfc+VBQsWKD4+Xj//+c99/k1mZGSoefPmVf5Ntm/fXtnZ2ZaPV51gsyghIUH//ve/tWnTpoCPHej5p6Wl+YxIiouL06hRo7R27Vrl5+cH3R/AqcrLy7V06VINHz5cbdq08a7v0qVLyN9TrOTOyZlhJa9vueUWn5/79+/v897+1ltvyeVyadKkSVW2rci8v//97/J4PLrmmmt8jpuamqozzzyz2uOeKBw5Jx1/r+zSpYs6d+7s06+LL75Ykqr0q6a/p4Jx+PDhGucN9jcrPv/8c+3cuTPgYwd6/n379lVGRob35zZt2ujyyy/X0qVLVV5eHnR/0HBwGbJF7du3r3b9O++8o0ceeUTr1q1TaWmpd/2JHzw2b96sqKioWt/EKv7Iq3gTOFlcXJzPz40aNdIZZ5xxyn7v2bNHxcXF3iHINdm2bZsyMzOrrK+4FGrbtm0++zgxeCV5P4z897//lXT8nCXVetzvv/9exhg99NBDeuihh6pts3v3brVu3drv4/qjutfy8OHDys3N1ezZs/Xjjz/KGON9rKioyO99n2jbtm0688wzq3yQP/E5PZHVc/N4PHruuef04osvasuWLd5QkKTTTz/dUt9P5cRA8lfFHxQn/p5UqG3SesCpyBVyJVD1PVc2bdqkoqIiJScnV/t4xc0DKtT0OxKMYLPo4Ycf1uWXX66zzjpL3bp10+DBg3XDDTeoR48epzx2oOffqVMnn997STrrrLMkSVu3blVqampQ/QGcas+ePTp8+LDOPPPMKo+dffbZWrx4cciOZSV3Tn5vCzSvY2NjfaY1kY6/v5/43r5582alpaUpMTGxxr5v2rRJxphqnydJtU5XIYUn5yr6tX79+irnWMGurCgrK6v2MX+y4sknn9To0aOVnp6ujIwMXXrppRo1apQ6dOhwymMHev7VvX5nnXWWDh06pD179ig1NTWo/qDhoFhoUXVvCB999JEuu+wyXXjhhXrxxRfVqlUrNW7cWLNnz9a8efMC2r/H45F0fL6K1NTUKo9X3K2vwonf+teFk0dQVDgxJE6l4pzvueeeGr/l69SpU8iPW91refvtt2v27Nm666671LdvX8XHx8vlcmnkyJHefoab1XN77LHH9NBDD+lXv/qVpk6dqsTEREVFRemuu+4KW9/3799fY4CeqEmTJoqPj5cktWrVSpK0a9cupaen+7TbtWuX+vTpE/qOAhGMXPFFroRepOWKx+NRcnKyXnvttWofP/mDUTi+RAo2iy688EJt3rxZb7/9tv71r3/pT3/6k5599lnNmjVLN998c63bBnr+/gimPwCCZyV3Tn5vCzSva3pvD5TH45HL5dL//d//VbvPijn0ahKunPN4POrevbumTZtW7eMnv3eHKyvKy8u1e/duny94ysrKtG/fPqWlpdW6/TXXXKP+/ftr4cKF+te//qWnnnpKTzzxhP7+979ryJAhtW4b6Pn7I5j+oOGgWFiDk7+59cdbb72l2NhYLV261OdyltmzZ/u069ixozwej7799lv16tWr2n117NhRkpScnKysrKyA+1KTli1bKi4uTt98802t7dq2bauNGzdWWb9hwwbv44GoOJ9vvvmmxvOp+CajcePGIT1nK6/lm2++qdGjR+uZZ57xrjty5IgKCwst77tt27b66quv5PF4fD6AW31Oa/Lmm2/qoosu0iuvvOKzvrCw0HtTBSnw56W29ldccUWVy92qM3r0aM2ZM0eSvP/2V69e7fNhbOfOnfrhhx80bty4gPoHRDpyhVxxeq7UpKZz6tixo9577z2df/75dTaaPBRZlJiYqDFjxmjMmDE6ePCgLrzwQk2ePNlbnAvV+VeMWDpxf999950k+Uzgf6r+AA1Ny5Yt1aRJk2ovz68ul4IRitwJR1537NhRS5cu1f79+2scXdixY0cZY9S+fXvvqOVA+JtzNantvfL//b//p0suucRS/obCiVlx6aWXetevXr1aHo+nxr+9TtSqVSvddtttuu2227R7926de+65evTRR73FuVCdf3X/zr/77js1bdrU50uoU/UHYM7CGjRr1kyS/H5zk45/q+NyuXwuz9m6dWuVOxQNHz5cUVFRevjhh6t8y1Lx7X52drbi4uL02GOPVXuX2T179vjdrxNFRUVp+PDh+uc//6nVq1dXebzi+JdeeqlWrVqlvLw872MlJSV66aWX1K5du4DngTj33HPVvn17TZ8+vcpzWnHM5ORkDRw4UH/84x+1a9euKvuwes7NmjUL6HWUjr+WJ4+0eP75531e24p9S/79O7n00kuVn5/vvaOmdPxuo88//7yaN2+uAQMGBNTHmlTX9wULFlSZHyXQf+O1tbcyZ+E555yjzp0766WXXvJ5XmfOnCmXy6WrrrrKr34B9QW5Qq44PVdqUtM5XXPNNSovL9fUqVOrbHPs2LGAn2Mrgs2iffv2+fzcvHlzderUyeey5lCd/86dO7Vw4ULvz8XFxfrLX/6iXr16eUcf+dMfoKGJjo5Wdna2Fi1apO3bt3vXr1+/XkuXLg3psUKRO+HI6yuvvFLGGE2ZMqXKYxXv71dccYWio6M1ZcqUKu/5xpgq7y8n8zfnalJxR+STXXPNNfrxxx/18ssvV3ns8OHD3jtIh9PFF1+sxMREzZw502f9zJkz1bRpUw0dOrTGbcvLy6ucV3JystLS0qpkRSjOPy8vz2eOyB07dujtt9/WoEGDFB0d7Xd/AEYW1qBiDrYHHnhAI0eOVOPGjTVs2DDvH3zVGTp0qKZNm6bBgwfruuuu0+7duzVjxgx16tRJX331lbddp06d9MADD2jq1Knq37+/rrjiCrndbn3xxRdKS0tTbm6u4uLiNHPmTN1www0699xzNXLkSLVs2VLbt2/Xu+++q/PPP18vvPCCpXN77LHH9K9//UsDBgzw3n59165dWrBggT7++GMlJCTovvvu09/+9jcNGTJEd9xxhxITE/XnP/9ZW7Zs0VtvvRXwpWlRUVGaOXOmhg0bpl69emnMmDFq1aqVNmzYoH//+9/eoJ4xY4YuuOACde/eXWPHjlWHDh1UUFCgvLw8/fDDD/p//+//BXy+GRkZmjlzph555BF16tRJycnJNc4BUuEXv/iF5s6dq/j4eHXt2lV5eXl67733qszN1KtXL0VHR+uJJ55QUVGR3G63Lr744mrnHxo3bpz++Mc/6sYbb9SaNWvUrl07vfnmm/rkk080ffp0tWjRIuBzq6nvDz/8sMaMGaN+/frp66+/1muvvVZlDoqOHTsqISFBs2bNUosWLdSsWTNlZmbWOM9Hbb8TVuYslKSnnnpKl112mQYNGqSRI0fqm2++0QsvvKCbb77ZO+cW4BTkCrni9FypScW//TvuuEPZ2dmKjo7WyJEjNWDAAP36179Wbm6u1q1bp0GDBqlx48batGmTFixYoOeee87yF0dFRUV6/vnnJUmffPKJJOmFF15QQkKCEhISlJOT420bTBZ17dpVAwcOVEZGhhITE7V69Wq9+eabPvsP1fmfddZZuummm/TFF18oJSVFr776qgoKCnxGGvvTH6AhmjJlipYsWaL+/fvrtttu836xcs455/jkaSgEmzvhyOuLLrpIN9xwg/7whz9o06ZNGjx4sDwejz766CNddNFFysnJUceOHfXII4/o/vvv19atWzV8+HC1aNFCW7Zs0cKFCzVu3Djdc889NR7D35yrSUZGhubPn68JEybovPPOU/PmzTVs2DDdcMMNeuONN3TLLbfogw8+0Pnnn6/y8nJt2LBBb7zxhpYuXVrtDdb8sW3bNs2dO1eSvF94PvLII5KOj86/4YYbJB2/tHnq1KkaP368rr76amVnZ+ujjz7SX//6Vz366KO1zgV54MABnXHGGbrqqqvUs2dPNW/eXO+9956++OILn1GYoTr/bt26KTs7W3fccYfcbrdefPFFSfIWiv3tD1D9vcFh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586duuKKK0LecQCobzxyyWMsLFyyFTbkGgBYZynXyLSwIdMAIEguV+CFQpczcy2gy5CXLFni8/OcOXOUnJysNWvW6MILL1RRUZFeeeUVzZs3TxdffLEkafbs2erSpYs+++wz/c///E/oeg4A9YyxOGeh4YNV2JBrAGCdlVwj08KHTAOAIHEZsldQZ1VUVCRJSkxMlCStWbNGR48eVVZWlrdN586d1aZNG+Xl5VW7j9LSUhUXF/ssAADUBXINAOAUocg0iVwDgIbIcrHQ4/Horrvu0vnnn69u3bpJkvLz8xUTE6OEhASftikpKcrPz692P7m5uYqPj/cu6enpVrsEABHN0iXIPy0IP3INAAJDpkWuUGWaRK4BaECYs9DL8lmNHz9e33zzjV5//fWgOnD//ferqKjIu+zYsSOo/QFApOIGJ5GNXAOAwJBpkStUmSaRawAaEIqFXgHNWVghJydH77zzjj788EOdccYZ3vWpqakqKytTYWGhzzdWBQUFSk1NrXZfbrdbbrfbSjcAoF6xOqKCURjhR64BQOCs5BqZFn6hzDSJXAPQgDBnoVdAZ2WMUU5OjhYuXKj3339f7du393k8IyNDjRs31vLly73rNm7cqO3bt6tv376h6TEA1FOenyaCt7IgPMg1ALCOTIssZBoABImRhV4BjSwcP3685s2bp7ffflstWrTwzm0RHx+vJk2aKD4+XjfddJMmTJigxMRExcXF6fbbb1ffvn25uxaABo+RhZGHXAMA6xhZGFnINAAIEiMLvQIqFs6cOVOSNHDgQJ/1s2fP1o033ihJevbZZxUVFaUrr7xSpaWlys7O1osvvhiSzgIAEErkGgDAKcg0AECoBFQsNMacsk1sbKxmzJihGTNmWO4UADgRIwsjD7kGANYxsjCykGkAECRGFnpZusEJACBwFAsBAE5CsRAA4CgUC72ceVYAEIEqPlRZWQAAiDRkGgDAUVyuwG9u4rKWazNmzFC7du0UGxurzMxMrVq1qsa2L7/8svr376/TTjtNp512mrKysmptHwoUCwHAJkbW7hx56ouKAACwn5VcI9MAABHLprshz58/XxMmTNCkSZP05ZdfqmfPnsrOztbu3burbb9ixQpde+21+uCDD5SXl6f09HQNGjRIP/74Y7BnXCOKhQAAAAAAAIANpk2bprFjx2rMmDHq2rWrZs2apaZN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", "text/plain": [ "
" ] @@ -1119,7 +1119,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABQsAAAF2CAYAAADJMM7PAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABqNUlEQVR4nO3deXxU1f3/8fckkAlbEmNIQjDsKiBbDZIvKIKaEpCi1A3UryBVqErcqK1alUXUuCJWEapVaKlURAu2yheKKLhFEYSfWgGRsikkbE0CARLInN8fmAlDFmbuzNxMbl7Px+M+NHfOvffcGTLvzGfOPddljDECAAAAAAAA0OBF1XUHAAAAAAAAAEQGioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioVAmAwcOFADBw6s624AAByiPuRKQUGBrrrqKp1++ulyuVyaPn16XXcJAGo0efJkuVwun3Xt2rXTjTfe6LNu06ZNGjRokOLj4+VyubRo0SJJ0hdffKF+/fqpWbNmcrlcWrdunT0dr+dqej4BRA6KhTX49NNPNXnyZBUWFtZ1VxCkF198UXPmzAnLvr/99ltNnjxZW7duDcv+w2nnzp2aPHmy33/UhOt34h//+IfOPfdcxcbGqk2bNpo0aZKOHTsW0mMAkYBccQ5ypWZ33323li5dqvvvv19z587V4MGDtXjxYk2ePNnWfmzcuFF33323+vXrp9jYWLlcrlqf03BmUV2cP4DQGj16tL7++ms9+uijmjt3rnr37q2jR4/q6quv1v79+/Xss89q7ty5atu2bV13tV6o7vmcN2+e7V8wrVq1SrfddpsyMjLUuHHjKoXjk73yyivq0qWLYmNjdeaZZ+r5558PWV/q4vyBWhlU66mnnjKSzJYtW+q6KwjSOeecYwYMGBCWfS9YsMBIMh988EGVx0pLS01paWlYjhsKX3zxhZFkZs+e7Vf7cPxOLF682LhcLnPRRReZl156ydx+++0mKirK3HLLLSE7BhApyBXnIFdqlpKSYq6//nqfdePHjzd2/8k5e/ZsExUVZbp162Z69epV6+9euLOoLs4fgH8mTZpU5ffzyJEjpqyszPvzoUOHjCTzwAMP+LRbv369kWRefvllW/rqFDU9n0OHDjVt27a1tS+TJk0yjRs3NhkZGeass86q9b161qxZRpK58sorzUsvvWRuuOEGI8k8/vjjIelLXZw/UJtG9pcnncfj8aisrEyxsbF13RWvkpISNWvWrK67Ue+E8nmLiYkJyX6c7J577lGPHj30r3/9S40aHX87iouL02OPPaY777xTnTt3ruMeAnWDXHGOhpYru3fvVkJCQtiPY4zRkSNH1KRJk2ofv+yyy1RYWKgWLVro6aefrnUUPVkE4ERut9vn5z179khSlfe23bt3V7s+GA0ha2t6PsPhVH9P3Xrrrbr33nvVpEkT5eTk6Lvvvqu23eHDh/XAAw9o6NChevPNNyVJY8eOlcfj0dSpUzVu3DiddtppYTsPoE7UdbUyElV8w3TyUvGNtCQzfvx489e//tV07drVNGrUyCxcuNAYc3zkSN++fU1iYqKJjY015557rlmwYEG1x5k7d64577zzTJMmTUxCQoLp37+/Wbp0qU+bxYsXmwsuuMA0bdrUNG/e3Fx66aXmm2++8WkzevRo06xZM/P999+bIUOGmObNm5vLL7+81nP84YcfzK9+9SvTqlUrExMTY9q1a2duueUWnxELmzdvNldddZU57bTTTJMmTUxmZqZ55513fPbzwQcfGElm/vz55pFHHjGtW7c2brfbXHzxxWbTpk1VjvvZZ5+ZIUOGmISEBNO0aVPTvXt3M336dJ8269evN1deeaU57bTTjNvtNhkZGebtt9/2aTN79mwjyXz88cfm7rvvNklJSaZp06Zm+PDhZvfu3d52bdu2rfI6VowGqdjHihUrzK233mpatmxpEhISjDHGbN261dx6663mrLPOMrGxsSYxMdFcddVVPqMSKrY/eakYDTJgwIAqI08KCgrMr371K5OcnGzcbrfp0aOHmTNnjk+bLVu2GEnmqaeeMn/84x9Nhw4dTExMjOndu7dZtWpVzS/qT/bt22d+85vfmG7duplmzZqZFi1amMGDB5t169ZVed1OXmoaZXiq3wkr/v3vfxtJZsaMGT7rf/zxRyPJTJ061fK+gUhDrhxHrjg3V2rq++jRo6tdX6G8vNw8++yzpmvXrsbtdpvk5GQzbtw4s3//fp8+tG3b1gwdOtQsWbLEZGRkGLfbbZ599tlT9t2Y2kf1BptFZWVlZvLkyaZTp07G7XabxMREc/7555t//etfxhgT8vNfunSp6dmzp3G73aZLly7mrbfeCqg/QEP20Ucfmd69exu32206dOhgZs2aVe3IwrZt25rRo0cbY6rP74rHa8oCYwLLneoyw5jA8vqHH34wl19+uWnWrJlJSkoyv/nNb8yxY8d82paXl5vp06ebbt26GbfbbZKSkkx2drb54osvfNrNnTvXnHvuuSY2NtacdtppZsSIEWb79u2nfH79ybmans8BAwZUu77CkSNHzMSJE03Hjh1NTEyMOeOMM8xvf/tbc+TIEZ8+1Pb31KnUNgr83XffNZLMu+++67P+008/NZLM3Llza913cXGxufPOO03btm1NTEyMadmypcnKyjJr1qwxxpiwnP9ZZ51l3G63Offcc83KlSsD6g9gDCMLq3XFFVfou+++09/+9jc9++yzSkpKkiS1bNnS2+b999/XG2+8oZycHCUlJaldu3aSpOeee06XXXaZrr/+epWVlen111/X1VdfrXfeeUdDhw71bj9lyhRNnjxZ/fr108MPP6yYmBh9/vnnev/99zVo0CBJ0ty5czV69GhlZ2friSee0KFDhzRz5kxdcMEFWrt2rfeYknTs2DFlZ2frggsu0NNPP62mTZvWeH47d+5Unz59VFhYqHHjxqlz58768ccf9eabb+rQoUOKiYlRQUGB+vXrp0OHDumOO+7Q6aefrj//+c+67LLL9Oabb+qXv/ylzz4ff/xxRUVF6Z577lFRUZGefPJJXX/99fr888+9bZYtW6Zf/OIXatWqle68806lpqZq/fr1euedd3TnnXdKkv7973/r/PPPV+vWrXXfffepWbNmeuONNzR8+HC99dZbVY57++2367TTTtOkSZO0detWTZ8+XTk5OZo/f74kafr06br99tvVvHlzPfDAA5KklJQUn33cdtttatmypSZOnKiSkhJJxycr/vTTTzVy5EidccYZ2rp1q2bOnKmBAwfq22+/VdOmTXXhhRfqjjvu0B/+8Af9/ve/V5cuXSTJ+9+THT58WAMHDtT333+vnJwctW/fXgsWLNCNN96owsJC73NQYd68eTpw4IB+/etfy+Vy6cknn9QVV1yh//znP2rcuHGNr+9//vMfLVq0SFdffbXat2+vgoIC/fGPf9SAAQP07bffKi0tTV26dNHDDz+siRMnaty4cerfv78kqV+/ftXu81S/E0VFRTp69GiNfaoQGxur5s2bS5LWrl0rSerdu7dPm7S0NJ1xxhnexwEnIFfIFafnyoUXXqi5c+fqhhtu0M9//nONGjVKktSxY0ft3LlTy5Yt09y5c6vs+9e//rXmzJmjMWPG6I477tCWLVv0wgsvaO3atfrkk098+rVx40Zde+21+vWvf62xY8fq7LPPrrHP/go2iyZPnqzc3FzdfPPN6tOnj4qLi7V69Wp9+eWX+vnPf65f//rXITv/TZs2acSIEbrllls0evRozZ49W1dffbWWLFmin//85371B2iovv76aw0aNEgtW7bU5MmTdezYMU2aNKnK+/fJrrjiCiUkJOjuu+/Wtddeq0svvVTNmzdXSkqKWrdurccee0x33HGHzjvvPO++As2d6jIjkLwuLy9Xdna2MjMz9fTTT+u9997TM888o44dO+rWW2/1trvppps0Z84cDRkyRDfffLOOHTumjz76SJ999pn3PfDRRx/VQw89pGuuuUY333yz9uzZo+eff14XXnih1q5dW+toQH9yrqbns1mzZioqKtIPP/ygZ599VpK8nxk8Ho8uu+wyffzxxxo3bpy6dOmir7/+Ws8++6y+++67KjdHqenvqWDUlBUZGRmKiorS2rVr9b//+781bn/LLbfozTffVE5Ojrp27ap9+/bp448/1vr163XuuefqgQceCNn5r1y5UvPnz9cdd9wht9utF198UYMHD9aqVavUrVs3v/oDSGJkYU1q+xZakomKijL//ve/qzx26NAhn5/LyspMt27dzMUXX+xdt2nTJhMVFWV++ctfmvLycp/2Ho/HGGPMgQMHTEJCghk7dqzP4/n5+SY+Pt5nfcU3W/fdd59f5zZq1CgTFRVV5VukE49/1113GUnmo48+8j524MAB0759e9OuXTtvvytGgHTp0sVn9Mhzzz1nJJmvv/7aGGPMsWPHTPv27U3btm3Nf//732qPaYwxl1xyienevbvPtyQej8f069fPnHnmmd51Fd/EZWVl+Wx/9913m+joaFNYWOhdV9PcUhX7uOCCC6p883by62iMMXl5eUaS+ctf/uJdV9vcUiePAJk+fbqRZP76179615WVlZm+ffua5s2bm+LiYmNM5QiQ008/3Wdkwdtvv20kmX/+859VjnWiI0eOVPl3tWXLFuN2u83DDz/sXRfKOQur+zasuqXiW9oT91fdN5XnnXee+Z//+R+/+gXUF+QKuXIyp+WKMZWjGk5U02iNjz76yEgyr732ms/6JUuWVFlfMaJzyZIltfa1OrX97gWbRT179jRDhw6ttU0oz//EkYRFRUWmVatW5mc/+1lA/QEaouHDh5vY2Fizbds277pvv/3WREdH1zqy0Bjf0dknqsirk0f7B5o7J2eGlbw++b34Zz/7mcnIyPD+/P777xtJ5o477qjy3FRk3tatW010dLR59NFHfR7/+uuvTaNGjaqsP5m/OVfT81nTnH1z5841UVFRPn8/GFM5h+Ann3ziXVfb31OnUtvIwvHjx5vo6OhqH2vZsqUZOXJkrfuOj4+vko0nC9X5SzKrV6/2rtu2bZuJjY01v/zlLwPqD8DdkC0aMGCAunbtWmX9iXPn/Pe//1VRUZH69++vL7/80rt+0aJF8ng8mjhxoqKifF+CijswLVu2TIWFhbr22mu1d+9e7xIdHa3MzEx98MEHVY594jdHNfF4PFq0aJGGDRtW5ZuRE4+/ePFi9enTRxdccIH3sebNm2vcuHHaunWrvv32W5/txowZ4zOXUsVItf/85z+Sjn8bs2XLFt11111VvpGqOOb+/fv1/vvv65prrtGBAwe857xv3z5lZ2dr06ZN+vHHH322HTdunM9dq/r376/y8nJt27btlM9FhbFjxyo6Otpn3Ymv49GjR7Vv3z516tRJCQkJPq9lIBYvXqzU1FRde+213nWNGzfWHXfcoYMHD2rlypU+7UeMGOEz98XJz2lN3G63999VeXm59u3bp+bNm+vss8+23PdTeeaZZ7Rs2bJTLr/73e+82xw+fNjb35PFxsZ6HwcaCnKFXAlUfc+VBQsWKD4+Xj//+c99/k1mZGSoefPmVf5Ntm/fXtnZ2ZaPV51gsyghIUH//ve/tWnTpoCPHej5p6Wl+YxIiouL06hRo7R27Vrl5+cH3R/AqcrLy7V06VINHz5cbdq08a7v0qVLyN9TrOTOyZlhJa9vueUWn5/79+/v897+1ltvyeVyadKkSVW2rci8v//97/J4PLrmmmt8jpuamqozzzyz2uOeKBw5Jx1/r+zSpYs6d+7s06+LL75Ykqr0q6a/p4Jx+PDhGucN9jcrPv/8c+3cuTPgYwd6/n379lVGRob35zZt2ujyyy/X0qVLVV5eHnR/0HBwGbJF7du3r3b9O++8o0ceeUTr1q1TaWmpd/2JHzw2b96sqKioWt/EKv7Iq3gTOFlcXJzPz40aNdIZZ5xxyn7v2bNHxcXF3iHINdm2bZsyMzOrrK+4FGrbtm0++zgxeCV5P4z897//lXT8nCXVetzvv/9exhg99NBDeuihh6pts3v3brVu3drv4/qjutfy8OHDys3N1ezZs/Xjjz/KGON9rKioyO99n2jbtm0688wzq3yQP/E5PZHVc/N4PHruuef04osvasuWLd5QkKTTTz/dUt9P5cRA8lfFHxQn/p5UqG3SesCpyBVyJVD1PVc2bdqkoqIiJScnV/t4xc0DKtT0OxKMYLPo4Ycf1uWXX66zzjpL3bp10+DBg3XDDTeoR48epzx2oOffqVMnn997STrrrLMkSVu3blVqampQ/QGcas+ePTp8+LDOPPPMKo+dffbZWrx4cciOZSV3Tn5vCzSvY2NjfaY1kY6/v5/43r5582alpaUpMTGxxr5v2rRJxphqnydJtU5XIYUn5yr6tX79+irnWMGurCgrK6v2MX+y4sknn9To0aOVnp6ujIwMXXrppRo1apQ6dOhwymMHev7VvX5nnXWWDh06pD179ig1NTWo/qDhoFhoUXVvCB999JEuu+wyXXjhhXrxxRfVqlUrNW7cWLNnz9a8efMC2r/H45F0fL6K1NTUKo9X3K2vwonf+teFk0dQVDgxJE6l4pzvueeeGr/l69SpU8iPW91refvtt2v27Nm666671LdvX8XHx8vlcmnkyJHefoab1XN77LHH9NBDD+lXv/qVpk6dqsTEREVFRemuu+4KW9/3799fY4CeqEmTJoqPj5cktWrVSpK0a9cupaen+7TbtWuX+vTpE/qOAhGMXPFFroRepOWKx+NRcnKyXnvttWofP/mDUTi+RAo2iy688EJt3rxZb7/9tv71r3/pT3/6k5599lnNmjVLN998c63bBnr+/gimPwCCZyV3Tn5vCzSva3pvD5TH45HL5dL//d//VbvPijn0ahKunPN4POrevbumTZtW7eMnv3eHKyvKy8u1e/duny94ysrKtG/fPqWlpdW6/TXXXKP+/ftr4cKF+te//qWnnnpKTzzxhP7+979ryJAhtW4b6Pn7I5j+oOGgWFiDk7+59cdbb72l2NhYLV261OdyltmzZ/u069ixozwej7799lv16tWr2n117NhRkpScnKysrKyA+1KTli1bKi4uTt98802t7dq2bauNGzdWWb9hwwbv44GoOJ9vvvmmxvOp+CajcePGIT1nK6/lm2++qdGjR+uZZ57xrjty5IgKCwst77tt27b66quv5PF4fD6AW31Oa/Lmm2/qoosu0iuvvOKzvrCw0HtTBSnw56W29ldccUWVy92qM3r0aM2ZM0eSvP/2V69e7fNhbOfOnfrhhx80bty4gPoHRDpyhVxxeq7UpKZz6tixo9577z2df/75dTaaPBRZlJiYqDFjxmjMmDE6ePCgLrzwQk2ePNlbnAvV+VeMWDpxf999950k+Uzgf6r+AA1Ny5Yt1aRJk2ovz68ul4IRitwJR1537NhRS5cu1f79+2scXdixY0cZY9S+fXvvqOVA+JtzNantvfL//b//p0suucRS/obCiVlx6aWXetevXr1aHo+nxr+9TtSqVSvddtttuu2227R7926de+65evTRR73FuVCdf3X/zr/77js1bdrU50uoU/UHYM7CGjRr1kyS/H5zk45/q+NyuXwuz9m6dWuVOxQNHz5cUVFRevjhh6t8y1Lx7X52drbi4uL02GOPVXuX2T179vjdrxNFRUVp+PDh+uc//6nVq1dXebzi+JdeeqlWrVqlvLw872MlJSV66aWX1K5du4DngTj33HPVvn17TZ8+vcpzWnHM5ORkDRw4UH/84x+1a9euKvuwes7NmjUL6HWUjr+WJ4+0eP75531e24p9S/79O7n00kuVn5/vvaOmdPxuo88//7yaN2+uAQMGBNTHmlTX9wULFlSZHyXQf+O1tbcyZ+E555yjzp0766WXXvJ5XmfOnCmXy6WrrrrKr34B9QW5Qq44PVdqUtM5XXPNNSovL9fUqVOrbHPs2LGAn2Mrgs2iffv2+fzcvHlzderUyeey5lCd/86dO7Vw4ULvz8XFxfrLX/6iXr16eUcf+dMfoKGJjo5Wdna2Fi1apO3bt3vXr1+/XkuXLg3psUKRO+HI6yuvvFLGGE2ZMqXKYxXv71dccYWio6M1ZcqUKu/5xpgq7y8n8zfnalJxR+STXXPNNfrxxx/18ssvV3ns8OHD3jtIh9PFF1+sxMREzZw502f9zJkz1bRpUw0dOrTGbcvLy6ucV3JystLS0qpkRSjOPy8vz2eOyB07dujtt9/WoEGDFB0d7Xd/AEYW1qBiDrYHHnhAI0eOVOPGjTVs2DDvH3zVGTp0qKZNm6bBgwfruuuu0+7duzVjxgx16tRJX331lbddp06d9MADD2jq1Knq37+/rrjiCrndbn3xxRdKS0tTbm6u4uLiNHPmTN1www0699xzNXLkSLVs2VLbt2/Xu+++q/PPP18vvPCCpXN77LHH9K9//UsDBgzw3n59165dWrBggT7++GMlJCTovvvu09/+9jcNGTJEd9xxhxITE/XnP/9ZW7Zs0VtvvRXwpWlRUVGaOXOmhg0bpl69emnMmDFq1aqVNmzYoH//+9/eoJ4xY4YuuOACde/eXWPHjlWHDh1UUFCgvLw8/fDDD/p//+//BXy+GRkZmjlzph555BF16tRJycnJNc4BUuEXv/iF5s6dq/j4eHXt2lV5eXl67733qszN1KtXL0VHR+uJJ55QUVGR3G63Lr744mrnHxo3bpz++Mc/6sYbb9SaNWvUrl07vfnmm/rkk080ffp0tWjRIuBzq6nvDz/8sMaMGaN+/frp66+/1muvvVZlDoqOHTsqISFBs2bNUosWLdSsWTNlZmbWOM9Hbb8TVuYslKSnnnpKl112mQYNGqSRI0fqm2++0QsvvKCbb77ZO+cW4BTkCrni9FypScW//TvuuEPZ2dmKjo7WyJEjNWDAAP36179Wbm6u1q1bp0GDBqlx48batGmTFixYoOeee87yF0dFRUV6/vnnJUmffPKJJOmFF15QQkKCEhISlJOT420bTBZ17dpVAwcOVEZGhhITE7V69Wq9+eabPvsP1fmfddZZuummm/TFF18oJSVFr776qgoKCnxGGvvTH6AhmjJlipYsWaL+/fvrtttu836xcs455/jkaSgEmzvhyOuLLrpIN9xwg/7whz9o06ZNGjx4sDwejz766CNddNFFysnJUceOHfXII4/o/vvv19atWzV8+HC1aNFCW7Zs0cKFCzVu3Djdc889NR7D35yrSUZGhubPn68JEybovPPOU/PmzTVs2DDdcMMNeuONN3TLLbfogw8+0Pnnn6/y8nJt2LBBb7zxhpYuXVrtDdb8sW3bNs2dO1eSvF94PvLII5KOj86/4YYbJB2/tHnq1KkaP368rr76amVnZ+ujjz7SX//6Vz366KO1zgV54MABnXHGGbrqqqvUs2dPNW/eXO+9956++OILn1GYoTr/bt26KTs7W3fccYfcbrdefPFFSfIWiv3tD1D9vcFh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586duuKKK0LecQCobzxyyWMsLFyyFTbkGgBYZynXyLSwIdMAIEguV+CFQpczcy2gy5CXLFni8/OcOXOUnJysNWvW6MILL1RRUZFeeeUVzZs3TxdffLEkafbs2erSpYs+++wz/c///E/oeg4A9YyxOGeh4YNV2JBrAGCdlVwj08KHTAOAIHEZsldQZ1VUVCRJSkxMlCStWbNGR48eVVZWlrdN586d1aZNG+Xl5VW7j9LSUhUXF/ssAADUBXINAOAUocg0iVwDgIbIcrHQ4/Horrvu0vnnn69u3bpJkvLz8xUTE6OEhASftikpKcrPz692P7m5uYqPj/cu6enpVrsEABHN0iXIPy0IP3INAAJDpkWuUGWaRK4BaECYs9DL8lmNHz9e33zzjV5//fWgOnD//ferqKjIu+zYsSOo/QFApOIGJ5GNXAOAwJBpkStUmSaRawAaEIqFXgHNWVghJydH77zzjj788EOdccYZ3vWpqakqKytTYWGhzzdWBQUFSk1NrXZfbrdbbrfbSjcAoF6xOqKCURjhR64BQOCs5BqZFn6hzDSJXAPQgDBnoVdAZ2WMUU5OjhYuXKj3339f7du393k8IyNDjRs31vLly73rNm7cqO3bt6tv376h6TEA1FOenyaCt7IgPMg1ALCOTIssZBoABImRhV4BjSwcP3685s2bp7ffflstWrTwzm0RHx+vJk2aKD4+XjfddJMmTJigxMRExcXF6fbbb1ffvn25uxaABo+RhZGHXAMA6xhZGFnINAAIEiMLvQIqFs6cOVOSNHDgQJ/1s2fP1o033ihJevbZZxUVFaUrr7xSpaWlys7O1osvvhiSzgIAEErkGgDAKcg0AECoBFQsNMacsk1sbKxmzJihGTNmWO4UADgRIwsjD7kGANYxsjCykGkAECRGFnpZusEJACBwFAsBAE5CsRAA4CgUC72ceVYAEIEqPlRZWQAAiDRkGgDAUVyuwG9u4rKWazNmzFC7du0UGxurzMxMrVq1qsa2L7/8svr376/TTjtNp512mrKysmptHwoUCwHAJkbW7hx56ouKAACwn5VcI9MAABHLprshz58/XxMmTNCkSZP05ZdfqmfPnsrOztbu3burbb9ixQpde+21+uCDD5SXl6f09HQNGjRIP/74Y7BnXCOKhQAAAAAAAIANpk2bprFjx2rMmDHq2rWrZs2apaZN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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAABQsAAAF2CAYAAADJMM7PAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABqNUlEQVR4nO3deXxU1f3/8fckkAlbEmNIQjDsKiBbDZIvKIKaEpCi1A3UryBVqErcqK1alUXUuCJWEapVaKlURAu2yheKKLhFEYSfWgGRsikkbE0CARLInN8fmAlDFmbuzNxMbl7Px+M+NHfOvffcGTLvzGfOPddljDECAAAAAAAA0OBF1XUHAAAAAAAAAEQGioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioVAmAwcOFADBw6s624AAByiPuRKQUGBrrrqKp1++ulyuVyaPn16XXcJAGo0efJkuVwun3Xt2rXTjTfe6LNu06ZNGjRokOLj4+VyubRo0SJJ0hdffKF+/fqpWbNmcrlcWrdunT0dr+dqej4BRA6KhTX49NNPNXnyZBUWFtZ1VxCkF198UXPmzAnLvr/99ltNnjxZW7duDcv+w2nnzp2aPHmy33/UhOt34h//+IfOPfdcxcbGqk2bNpo0aZKOHTsW0mMAkYBccQ5ypWZ33323li5dqvvvv19z587V4MGDtXjxYk2ePNnWfmzcuFF33323+vXrp9jYWLlcrlqf03BmUV2cP4DQGj16tL7++ms9+uijmjt3rnr37q2jR4/q6quv1v79+/Xss89q7ty5atu2bV13tV6o7vmcN2+e7V8wrVq1SrfddpsyMjLUuHHjKoXjk73yyivq0qWLYmNjdeaZZ+r5558PWV/q4vyBWhlU66mnnjKSzJYtW+q6KwjSOeecYwYMGBCWfS9YsMBIMh988EGVx0pLS01paWlYjhsKX3zxhZFkZs+e7Vf7cPxOLF682LhcLnPRRReZl156ydx+++0mKirK3HLLLSE7BhApyBXnIFdqlpKSYq6//nqfdePHjzd2/8k5e/ZsExUVZbp162Z69epV6+9euLOoLs4fgH8mTZpU5ffzyJEjpqyszPvzoUOHjCTzwAMP+LRbv369kWRefvllW/rqFDU9n0OHDjVt27a1tS+TJk0yjRs3NhkZGeass86q9b161qxZRpK58sorzUsvvWRuuOEGI8k8/vjjIelLXZw/UJtG9pcnncfj8aisrEyxsbF13RWvkpISNWvWrK67Ue+E8nmLiYkJyX6c7J577lGPHj30r3/9S40aHX87iouL02OPPaY777xTnTt3ruMeAnWDXHGOhpYru3fvVkJCQtiPY4zRkSNH1KRJk2ofv+yyy1RYWKgWLVro6aefrnUUPVkE4ERut9vn5z179khSlfe23bt3V7s+GA0ha2t6PsPhVH9P3Xrrrbr33nvVpEkT5eTk6Lvvvqu23eHDh/XAAw9o6NChevPNNyVJY8eOlcfj0dSpUzVu3DiddtppYTsPoE7UdbUyElV8w3TyUvGNtCQzfvx489e//tV07drVNGrUyCxcuNAYc3zkSN++fU1iYqKJjY015557rlmwYEG1x5k7d64577zzTJMmTUxCQoLp37+/Wbp0qU+bxYsXmwsuuMA0bdrUNG/e3Fx66aXmm2++8WkzevRo06xZM/P999+bIUOGmObNm5vLL7+81nP84YcfzK9+9SvTqlUrExMTY9q1a2duueUWnxELmzdvNldddZU57bTTTJMmTUxmZqZ55513fPbzwQcfGElm/vz55pFHHjGtW7c2brfbXHzxxWbTpk1VjvvZZ5+ZIUOGmISEBNO0aVPTvXt3M336dJ8269evN1deeaU57bTTjNvtNhkZGebtt9/2aTN79mwjyXz88cfm7rvvNklJSaZp06Zm+PDhZvfu3d52bdu2rfI6VowGqdjHihUrzK233mpatmxpEhISjDHGbN261dx6663mrLPOMrGxsSYxMdFcddVVPqMSKrY/eakYDTJgwIAqI08KCgrMr371K5OcnGzcbrfp0aOHmTNnjk+bLVu2GEnmqaeeMn/84x9Nhw4dTExMjOndu7dZtWpVzS/qT/bt22d+85vfmG7duplmzZqZFi1amMGDB5t169ZVed1OXmoaZXiq3wkr/v3vfxtJZsaMGT7rf/zxRyPJTJ061fK+gUhDrhxHrjg3V2rq++jRo6tdX6G8vNw8++yzpmvXrsbtdpvk5GQzbtw4s3//fp8+tG3b1gwdOtQsWbLEZGRkGLfbbZ599tlT9t2Y2kf1BptFZWVlZvLkyaZTp07G7XabxMREc/7555t//etfxhgT8vNfunSp6dmzp3G73aZLly7mrbfeCqg/QEP20Ucfmd69exu32206dOhgZs2aVe3IwrZt25rRo0cbY6rP74rHa8oCYwLLneoyw5jA8vqHH34wl19+uWnWrJlJSkoyv/nNb8yxY8d82paXl5vp06ebbt26GbfbbZKSkkx2drb54osvfNrNnTvXnHvuuSY2NtacdtppZsSIEWb79u2nfH79ybmans8BAwZUu77CkSNHzMSJE03Hjh1NTEyMOeOMM8xvf/tbc+TIEZ8+1Pb31KnUNgr83XffNZLMu+++67P+008/NZLM3Llza913cXGxufPOO03btm1NTEyMadmypcnKyjJr1qwxxpiwnP9ZZ51l3G63Offcc83KlSsD6g9gDCMLq3XFFVfou+++09/+9jc9++yzSkpKkiS1bNnS2+b999/XG2+8oZycHCUlJaldu3aSpOeee06XXXaZrr/+epWVlen111/X1VdfrXfeeUdDhw71bj9lyhRNnjxZ/fr108MPP6yYmBh9/vnnev/99zVo0CBJ0ty5czV69GhlZ2friSee0KFDhzRz5kxdcMEFWrt2rfeYknTs2DFlZ2frggsu0NNPP62mTZvWeH47d+5Unz59VFhYqHHjxqlz58768ccf9eabb+rQoUOKiYlRQUGB+vXrp0OHDumOO+7Q6aefrj//+c+67LLL9Oabb+qXv/ylzz4ff/xxRUVF6Z577lFRUZGefPJJXX/99fr888+9bZYtW6Zf/OIXatWqle68806lpqZq/fr1euedd3TnnXdKkv7973/r/PPPV+vWrXXfffepWbNmeuONNzR8+HC99dZbVY57++2367TTTtOkSZO0detWTZ8+XTk5OZo/f74kafr06br99tvVvHlzPfDAA5KklJQUn33cdtttatmypSZOnKiSkhJJxycr/vTTTzVy5EidccYZ2rp1q2bOnKmBAwfq22+/VdOmTXXhhRfqjjvu0B/+8Af9/ve/V5cuXSTJ+9+THT58WAMHDtT333+vnJwctW/fXgsWLNCNN96owsJC73NQYd68eTpw4IB+/etfy+Vy6cknn9QVV1yh//znP2rcuHGNr+9//vMfLVq0SFdffbXat2+vgoIC/fGPf9SAAQP07bffKi0tTV26dNHDDz+siRMnaty4cerfv78kqV+/ftXu81S/E0VFRTp69GiNfaoQGxur5s2bS5LWrl0rSerdu7dPm7S0NJ1xxhnexwEnIFfIFafnyoUXXqi5c+fqhhtu0M9//nONGjVKktSxY0ft3LlTy5Yt09y5c6vs+9e//rXmzJmjMWPG6I477tCWLVv0wgsvaO3atfrkk098+rVx40Zde+21+vWvf62xY8fq7LPPrrHP/go2iyZPnqzc3FzdfPPN6tOnj4qLi7V69Wp9+eWX+vnPf65f//rXITv/TZs2acSIEbrllls0evRozZ49W1dffbWWLFmin//85371B2iovv76aw0aNEgtW7bU5MmTdezYMU2aNKnK+/fJrrjiCiUkJOjuu+/Wtddeq0svvVTNmzdXSkqKWrdurccee0x33HGHzjvvPO++As2d6jIjkLwuLy9Xdna2MjMz9fTTT+u9997TM888o44dO+rWW2/1trvppps0Z84cDRkyRDfffLOOHTumjz76SJ999pn3PfDRRx/VQw89pGuuuUY333yz9uzZo+eff14XXnih1q5dW+toQH9yrqbns1mzZioqKtIPP/ygZ599VpK8nxk8Ho8uu+wyffzxxxo3bpy6dOmir7/+Ws8++6y+++67KjdHqenvqWDUlBUZGRmKiorS2rVr9b//+781bn/LLbfozTffVE5Ojrp27ap9+/bp448/1vr163XuuefqgQceCNn5r1y5UvPnz9cdd9wht9utF198UYMHD9aqVavUrVs3v/oDSGJkYU1q+xZakomKijL//ve/qzx26NAhn5/LyspMt27dzMUXX+xdt2nTJhMVFWV++ctfmvLycp/2Ho/HGGPMgQMHTEJCghk7dqzP4/n5+SY+Pt5nfcU3W/fdd59f5zZq1CgTFRVV5VukE49/1113GUnmo48+8j524MAB0759e9OuXTtvvytGgHTp0sVn9Mhzzz1nJJmvv/7aGGPMsWPHTPv27U3btm3Nf//732qPaYwxl1xyienevbvPtyQej8f069fPnHnmmd51Fd/EZWVl+Wx/9913m+joaFNYWOhdV9PcUhX7uOCCC6p883by62iMMXl5eUaS+ctf/uJdV9vcUiePAJk+fbqRZP76179615WVlZm+ffua5s2bm+LiYmNM5QiQ008/3Wdkwdtvv20kmX/+859VjnWiI0eOVPl3tWXLFuN2u83DDz/sXRfKOQur+zasuqXiW9oT91fdN5XnnXee+Z//+R+/+gXUF+QKuXIyp+WKMZWjGk5U02iNjz76yEgyr732ms/6JUuWVFlfMaJzyZIltfa1OrX97gWbRT179jRDhw6ttU0oz//EkYRFRUWmVatW5mc/+1lA/QEaouHDh5vY2Fizbds277pvv/3WREdH1zqy0Bjf0dknqsirk0f7B5o7J2eGlbw++b34Zz/7mcnIyPD+/P777xtJ5o477qjy3FRk3tatW010dLR59NFHfR7/+uuvTaNGjaqsP5m/OVfT81nTnH1z5841UVFRPn8/GFM5h+Ann3ziXVfb31OnUtvIwvHjx5vo6OhqH2vZsqUZOXJkrfuOj4+vko0nC9X5SzKrV6/2rtu2bZuJjY01v/zlLwPqD8DdkC0aMGCAunbtWmX9iXPn/Pe//1VRUZH69++vL7/80rt+0aJF8ng8mjhxoqKifF+CijswLVu2TIWFhbr22mu1d+9e7xIdHa3MzEx98MEHVY594jdHNfF4PFq0aJGGDRtW5ZuRE4+/ePFi9enTRxdccIH3sebNm2vcuHHaunWrvv32W5/txowZ4zOXUsVItf/85z+Sjn8bs2XLFt11111VvpGqOOb+/fv1/vvv65prrtGBAwe857xv3z5lZ2dr06ZN+vHHH322HTdunM9dq/r376/y8nJt27btlM9FhbFjxyo6Otpn3Ymv49GjR7Vv3z516tRJCQkJPq9lIBYvXqzU1FRde+213nWNGzfWHXfcoYMHD2rlypU+7UeMGOEz98XJz2lN3G63999VeXm59u3bp+bNm+vss8+23PdTeeaZZ7Rs2bJTLr/73e+82xw+fNjb35PFxsZ6HwcaCnKFXAlUfc+VBQsWKD4+Xj//+c99/k1mZGSoefPmVf5Ntm/fXtnZ2ZaPV51gsyghIUH//ve/tWnTpoCPHej5p6Wl+YxIiouL06hRo7R27Vrl5+cH3R/AqcrLy7V06VINHz5cbdq08a7v0qVLyN9TrOTOyZlhJa9vueUWn5/79+/v897+1ltvyeVyadKkSVW2rci8v//97/J4PLrmmmt8jpuamqozzzyz2uOeKBw5Jx1/r+zSpYs6d+7s06+LL75Ykqr0q6a/p4Jx+PDhGucN9jcrPv/8c+3cuTPgYwd6/n379lVGRob35zZt2ujyyy/X0qVLVV5eHnR/0HBwGbJF7du3r3b9O++8o0ceeUTr1q1TaWmpd/2JHzw2b96sqKioWt/EKv7Iq3gTOFlcXJzPz40aNdIZZ5xxyn7v2bNHxcXF3iHINdm2bZsyMzOrrK+4FGrbtm0++zgxeCV5P4z897//lXT8nCXVetzvv/9exhg99NBDeuihh6pts3v3brVu3drv4/qjutfy8OHDys3N1ezZs/Xjjz/KGON9rKioyO99n2jbtm0688wzq3yQP/E5PZHVc/N4PHruuef04osvasuWLd5QkKTTTz/dUt9P5cRA8lfFHxQn/p5UqG3SesCpyBVyJVD1PVc2bdqkoqIiJScnV/t4xc0DKtT0OxKMYLPo4Ycf1uWXX66zzjpL3bp10+DBg3XDDTeoR48epzx2oOffqVMnn997STrrrLMkSVu3blVqampQ/QGcas+ePTp8+LDOPPPMKo+dffbZWrx4cciOZSV3Tn5vCzSvY2NjfaY1kY6/v5/43r5582alpaUpMTGxxr5v2rRJxphqnydJtU5XIYUn5yr6tX79+irnWMGurCgrK6v2MX+y4sknn9To0aOVnp6ujIwMXXrppRo1apQ6dOhwymMHev7VvX5nnXWWDh06pD179ig1NTWo/qDhoFhoUXVvCB999JEuu+wyXXjhhXrxxRfVqlUrNW7cWLNnz9a8efMC2r/H45F0fL6K1NTUKo9X3K2vwonf+teFk0dQVDgxJE6l4pzvueeeGr/l69SpU8iPW91refvtt2v27Nm666671LdvX8XHx8vlcmnkyJHefoab1XN77LHH9NBDD+lXv/qVpk6dqsTEREVFRemuu+4KW9/3799fY4CeqEmTJoqPj5cktWrVSpK0a9cupaen+7TbtWuX+vTpE/qOAhGMXPFFroRepOWKx+NRcnKyXnvttWofP/mDUTi+RAo2iy688EJt3rxZb7/9tv71r3/pT3/6k5599lnNmjVLN998c63bBnr+/gimPwCCZyV3Tn5vCzSva3pvD5TH45HL5dL//d//VbvPijn0ahKunPN4POrevbumTZtW7eMnv3eHKyvKy8u1e/duny94ysrKtG/fPqWlpdW6/TXXXKP+/ftr4cKF+te//qWnnnpKTzzxhP7+979ryJAhtW4b6Pn7I5j+oOGgWFiDk7+59cdbb72l2NhYLV261OdyltmzZ/u069ixozwej7799lv16tWr2n117NhRkpScnKysrKyA+1KTli1bKi4uTt98802t7dq2bauNGzdWWb9hwwbv44GoOJ9vvvmmxvOp+CajcePGIT1nK6/lm2++qdGjR+uZZ57xrjty5IgKCwst77tt27b66quv5PF4fD6AW31Oa/Lmm2/qoosu0iuvvOKzvrCw0HtTBSnw56W29ldccUWVy92qM3r0aM2ZM0eSvP/2V69e7fNhbOfOnfrhhx80bty4gPoHRDpyhVxxeq7UpKZz6tixo9577z2df/75dTaaPBRZlJiYqDFjxmjMmDE6ePCgLrzwQk2ePNlbnAvV+VeMWDpxf999950k+Uzgf6r+AA1Ny5Yt1aRJk2ovz68ul4IRitwJR1537NhRS5cu1f79+2scXdixY0cZY9S+fXvvqOVA+JtzNantvfL//b//p0suucRS/obCiVlx6aWXetevXr1aHo+nxr+9TtSqVSvddtttuu2227R7926de+65evTRR73FuVCdf3X/zr/77js1bdrU50uoU/UHYM7CGjRr1kyS/H5zk45/q+NyuXwuz9m6dWuVOxQNHz5cUVFRevjhh6t8y1Lx7X52drbi4uL02GOPVXuX2T179vjdrxNFRUVp+PDh+uc//6nVq1dXebzi+JdeeqlWrVqlvLw872MlJSV66aWX1K5du4DngTj33HPVvn17TZ8+vcpzWnHM5ORkDRw4UH/84x+1a9euKvuwes7NmjUL6HWUjr+WJ4+0eP75531e24p9S/79O7n00kuVn5/vvaOmdPxuo88//7yaN2+uAQMGBNTHmlTX9wULFlSZHyXQf+O1tbcyZ+E555yjzp0766WXXvJ5XmfOnCmXy6WrrrrKr34B9QW5Qq44PVdqUtM5XXPNNSovL9fUqVOrbHPs2LGAn2Mrgs2iffv2+fzcvHlzderUyeey5lCd/86dO7Vw4ULvz8XFxfrLX/6iXr16eUcf+dMfoKGJjo5Wdna2Fi1apO3bt3vXr1+/XkuXLg3psUKRO+HI6yuvvFLGGE2ZMqXKYxXv71dccYWio6M1ZcqUKu/5xpgq7y8n8zfnalJxR+STXXPNNfrxxx/18ssvV3ns8OHD3jtIh9PFF1+sxMREzZw502f9zJkz1bRpUw0dOrTGbcvLy6ucV3JystLS0qpkRSjOPy8vz2eOyB07dujtt9/WoEGDFB0d7Xd/AEYW1qBiDrYHHnhAI0eOVOPGjTVs2DDvH3zVGTp0qKZNm6bBgwfruuuu0+7duzVjxgx16tRJX331lbddp06d9MADD2jq1Knq37+/rrjiCrndbn3xxRdKS0tTbm6u4uLiNHPmTN1www0699xzNXLkSLVs2VLbt2/Xu+++q/PPP18vvPCCpXN77LHH9K9//UsDBgzw3n59165dWrBggT7++GMlJCTovvvu09/+9jcNGTJEd9xxhxITE/XnP/9ZW7Zs0VtvvRXwpWlRUVGaOXOmhg0bpl69emnMmDFq1aqVNmzYoH//+9/eoJ4xY4YuuOACde/eXWPHjlWHDh1UUFCgvLw8/fDDD/p//+//BXy+GRkZmjlzph555BF16tRJycnJNc4BUuEXv/iF5s6dq/j4eHXt2lV5eXl67733qszN1KtXL0VHR+uJJ55QUVGR3G63Lr744mrnHxo3bpz++Mc/6sYbb9SaNWvUrl07vfnmm/rkk080ffp0tWjRIuBzq6nvDz/8sMaMGaN+/frp66+/1muvvVZlDoqOHTsqISFBs2bNUosWLdSsWTNlZmbWOM9Hbb8TVuYslKSnnnpKl112mQYNGqSRI0fqm2++0QsvvKCbb77ZO+cW4BTkCrni9FypScW//TvuuEPZ2dmKjo7WyJEjNWDAAP36179Wbm6u1q1bp0GDBqlx48batGmTFixYoOeee87yF0dFRUV6/vnnJUmffPKJJOmFF15QQkKCEhISlJOT420bTBZ17dpVAwcOVEZGhhITE7V69Wq9+eabPvsP1fmfddZZuummm/TFF18oJSVFr776qgoKCnxGGvvTH6AhmjJlipYsWaL+/fvrtttu836xcs455/jkaSgEmzvhyOuLLrpIN9xwg/7whz9o06ZNGjx4sDwejz766CNddNFFysnJUceOHfXII4/o/vvv19atWzV8+HC1aNFCW7Zs0cKFCzVu3Djdc889NR7D35yrSUZGhubPn68JEybovPPOU/PmzTVs2DDdcMMNeuONN3TLLbfogw8+0Pnnn6/y8nJt2LBBb7zxhpYuXVrtDdb8sW3bNs2dO1eSvF94PvLII5KOj86/4YYbJB2/tHnq1KkaP368rr76amVnZ+ujjz7SX//6Vz366KO1zgV54MABnXHGGbrqqqvUs2dPNW/eXO+9956++OILn1GYoTr/bt26KTs7W3fccYfcbrdefPFFSfIWiv3tD1D9vcFh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586duuKKK0LecQCobzxyyWMsLFyyFTbkGgBYZynXyLSwIdMAIEguV+CFQpczcy2gy5CXLFni8/OcOXOUnJysNWvW6MILL1RRUZFeeeUVzZs3TxdffLEkafbs2erSpYs+++wz/c///E/oeg4A9YyxOGeh4YNV2JBrAGCdlVwj08KHTAOAIHEZsldQZ1VUVCRJSkxMlCStWbNGR48eVVZWlrdN586d1aZNG+Xl5VW7j9LSUhUXF/ssAADUBXINAOAUocg0iVwDgIbIcrHQ4/Horrvu0vnnn69u3bpJkvLz8xUTE6OEhASftikpKcrPz692P7m5uYqPj/cu6enpVrsEABHN0iXIPy0IP3INAAJDpkWuUGWaRK4BaECYs9DL8lmNHz9e33zzjV5//fWgOnD//ferqKjIu+zYsSOo/QFApOIGJ5GNXAOAwJBpkStUmSaRawAaEIqFXgHNWVghJydH77zzjj788EOdccYZ3vWpqakqKytTYWGhzzdWBQUFSk1NrXZfbrdbbrfbSjcAoF6xOqKCURjhR64BQOCs5BqZFn6hzDSJXAPQgDBnoVdAZ2WMUU5OjhYuXKj3339f7du393k8IyNDjRs31vLly73rNm7cqO3bt6tv376h6TEA1FOenyaCt7IgPMg1ALCOTIssZBoABImRhV4BjSwcP3685s2bp7ffflstWrTwzm0RHx+vJk2aKD4+XjfddJMmTJigxMRExcXF6fbbb1ffvn25uxaABo+RhZGHXAMA6xhZGFnINAAIEiMLvQIqFs6cOVOSNHDgQJ/1s2fP1o033ihJevbZZxUVFaUrr7xSpaWlys7O1osvvhiSzgIAEErkGgDAKcg0AECoBFQsNMacsk1sbKxmzJihGTNmWO4UADgRIwsjD7kGANYxsjCykGkAECRGFnpZusEJACBwFAsBAE5CsRAA4CgUC72ceVYAEIEqPlRZWQAAiDRkGgDAUVyuwG9u4rKWazNmzFC7du0UGxurzMxMrVq1qsa2L7/8svr376/TTjtNp512mrKysmptHwoUCwHAJkbW7hx56ouKAACwn5VcI9MAABHLprshz58/XxMmTNCkSZP05ZdfqmfPnsrOztbu3burbb9ixQpde+21+uCDD5SXl6f09HQNGjRIP/74Y7BnXCOKhQAAAAAAAIANpk2bprFjx2rMmDHq2rWrZs2apaZN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", "text/plain": [ "
" ] @@ -1500,7 +1500,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABQsAAAF2CAYAAADJMM7PAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABqNUlEQVR4nO3deXxU1f3/8fckkAlbEmNIQjDsKiBbDZIvKIKaEpCi1A3UryBVqErcqK1alUXUuCJWEapVaKlURAu2yheKKLhFEYSfWgGRsikkbE0CARLInN8fmAlDFmbuzNxMbl7Px+M+NHfOvffcGTLvzGfOPddljDECAAAAAAAA0OBF1XUHAAAAAAAAAEQGioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioVAmAwcOFADBw6s624AAByiPuRKQUGBrrrqKp1++ulyuVyaPn16XXcJAGo0efJkuVwun3Xt2rXTjTfe6LNu06ZNGjRokOLj4+VyubRo0SJJ0hdffKF+/fqpWbNmcrlcWrdunT0dr+dqej4BRA6KhTX49NNPNXnyZBUWFtZ1VxCkF198UXPmzAnLvr/99ltNnjxZW7duDcv+w2nnzp2aPHmy33/UhOt34h//+IfOPfdcxcbGqk2bNpo0aZKOHTsW0mMAkYBccQ5ypWZ33323li5dqvvvv19z587V4MGDtXjxYk2ePNnWfmzcuFF33323+vXrp9jYWLlcrlqf03BmUV2cP4DQGj16tL7++ms9+uijmjt3rnr37q2jR4/q6quv1v79+/Xss89q7ty5atu2bV13tV6o7vmcN2+e7V8wrVq1SrfddpsyMjLUuHHjKoXjk73yyivq0qWLYmNjdeaZZ+r5558PWV/q4vyBWhlU66mnnjKSzJYtW+q6KwjSOeecYwYMGBCWfS9YsMBIMh988EGVx0pLS01paWlYjhsKX3zxhZFkZs+e7Vf7cPxOLF682LhcLnPRRReZl156ydx+++0mKirK3HLLLSE7BhApyBXnIFdqlpKSYq6//nqfdePHjzd2/8k5e/ZsExUVZbp162Z69epV6+9euLOoLs4fgH8mTZpU5ffzyJEjpqyszPvzoUOHjCTzwAMP+LRbv369kWRefvllW/rqFDU9n0OHDjVt27a1tS+TJk0yjRs3NhkZGeass86q9b161qxZRpK58sorzUsvvWRuuOEGI8k8/vjjIelLXZw/UJtG9pcnncfj8aisrEyxsbF13RWvkpISNWvWrK67Ue+E8nmLiYkJyX6c7J577lGPHj30r3/9S40aHX87iouL02OPPaY777xTnTt3ruMeAnWDXHGOhpYru3fvVkJCQtiPY4zRkSNH1KRJk2ofv+yyy1RYWKgWLVro6aefrnUUPVkE4ERut9vn5z179khSlfe23bt3V7s+GA0ha2t6PsPhVH9P3Xrrrbr33nvVpEkT5eTk6Lvvvqu23eHDh/XAAw9o6NChevPNNyVJY8eOlcfj0dSpUzVu3DiddtppYTsPoE7UdbUyElV8w3TyUvGNtCQzfvx489e//tV07drVNGrUyCxcuNAYc3zkSN++fU1iYqKJjY015557rlmwYEG1x5k7d64577zzTJMmTUxCQoLp37+/Wbp0qU+bxYsXmwsuuMA0bdrUNG/e3Fx66aXmm2++8WkzevRo06xZM/P999+bIUOGmObNm5vLL7+81nP84YcfzK9+9SvTqlUrExMTY9q1a2duueUWnxELmzdvNldddZU57bTTTJMmTUxmZqZ55513fPbzwQcfGElm/vz55pFHHjGtW7c2brfbXHzxxWbTpk1VjvvZZ5+ZIUOGmISEBNO0aVPTvXt3M336dJ8269evN1deeaU57bTTjNvtNhkZGebtt9/2aTN79mwjyXz88cfm7rvvNklJSaZp06Zm+PDhZvfu3d52bdu2rfI6VowGqdjHihUrzK233mpatmxpEhISjDHGbN261dx6663mrLPOMrGxsSYxMdFcddVVPqMSKrY/eakYDTJgwIAqI08KCgrMr371K5OcnGzcbrfp0aOHmTNnjk+bLVu2GEnmqaeeMn/84x9Nhw4dTExMjOndu7dZtWpVzS/qT/bt22d+85vfmG7duplmzZqZFi1amMGDB5t169ZVed1OXmoaZXiq3wkr/v3vfxtJZsaMGT7rf/zxRyPJTJ061fK+gUhDrhxHrjg3V2rq++jRo6tdX6G8vNw8++yzpmvXrsbtdpvk5GQzbtw4s3//fp8+tG3b1gwdOtQsWbLEZGRkGLfbbZ599tlT9t2Y2kf1BptFZWVlZvLkyaZTp07G7XabxMREc/7555t//etfxhgT8vNfunSp6dmzp3G73aZLly7mrbfeCqg/QEP20Ucfmd69exu32206dOhgZs2aVe3IwrZt25rRo0cbY6rP74rHa8oCYwLLneoyw5jA8vqHH34wl19+uWnWrJlJSkoyv/nNb8yxY8d82paXl5vp06ebbt26GbfbbZKSkkx2drb54osvfNrNnTvXnHvuuSY2NtacdtppZsSIEWb79u2nfH79ybmans8BAwZUu77CkSNHzMSJE03Hjh1NTEyMOeOMM8xvf/tbc+TIEZ8+1Pb31KnUNgr83XffNZLMu+++67P+008/NZLM3Llza913cXGxufPOO03btm1NTEyMadmypcnKyjJr1qwxxpiwnP9ZZ51l3G63Offcc83KlSsD6g9gDCMLq3XFFVfou+++09/+9jc9++yzSkpKkiS1bNnS2+b999/XG2+8oZycHCUlJaldu3aSpOeee06XXXaZrr/+epWVlen111/X1VdfrXfeeUdDhw71bj9lyhRNnjxZ/fr108MPP6yYmBh9/vnnev/99zVo0CBJ0ty5czV69GhlZ2friSee0KFDhzRz5kxdcMEFWrt2rfeYknTs2DFlZ2frggsu0NNPP62mTZvWeH47d+5Unz59VFhYqHHjxqlz58768ccf9eabb+rQoUOKiYlRQUGB+vXrp0OHDumOO+7Q6aefrj//+c+67LLL9Oabb+qXv/ylzz4ff/xxRUVF6Z577lFRUZGefPJJXX/99fr888+9bZYtW6Zf/OIXatWqle68806lpqZq/fr1euedd3TnnXdKkv7973/r/PPPV+vWrXXfffepWbNmeuONNzR8+HC99dZbVY57++2367TTTtOkSZO0detWTZ8+XTk5OZo/f74kafr06br99tvVvHlzPfDAA5KklJQUn33cdtttatmypSZOnKiSkhJJxycr/vTTTzVy5EidccYZ2rp1q2bOnKmBAwfq22+/VdOmTXXhhRfqjjvu0B/+8Af9/ve/V5cuXSTJ+9+THT58WAMHDtT333+vnJwctW/fXgsWLNCNN96owsJC73NQYd68eTpw4IB+/etfy+Vy6cknn9QVV1yh//znP2rcuHGNr+9//vMfLVq0SFdffbXat2+vgoIC/fGPf9SAAQP07bffKi0tTV26dNHDDz+siRMnaty4cerfv78kqV+/ftXu81S/E0VFRTp69GiNfaoQGxur5s2bS5LWrl0rSerdu7dPm7S0NJ1xxhnexwEnIFfIFafnyoUXXqi5c+fqhhtu0M9//nONGjVKktSxY0ft3LlTy5Yt09y5c6vs+9e//rXmzJmjMWPG6I477tCWLVv0wgsvaO3atfrkk098+rVx40Zde+21+vWvf62xY8fq7LPPrrHP/go2iyZPnqzc3FzdfPPN6tOnj4qLi7V69Wp9+eWX+vnPf65f//rXITv/TZs2acSIEbrllls0evRozZ49W1dffbWWLFmin//85371B2iovv76aw0aNEgtW7bU5MmTdezYMU2aNKnK+/fJrrjiCiUkJOjuu+/Wtddeq0svvVTNmzdXSkqKWrdurccee0x33HGHzjvvPO++As2d6jIjkLwuLy9Xdna2MjMz9fTTT+u9997TM888o44dO+rWW2/1trvppps0Z84cDRkyRDfffLOOHTumjz76SJ999pn3PfDRRx/VQw89pGuuuUY333yz9uzZo+eff14XXnih1q5dW+toQH9yrqbns1mzZioqKtIPP/ygZ599VpK8nxk8Ho8uu+wyffzxxxo3bpy6dOmir7/+Ws8++6y+++67KjdHqenvqWDUlBUZGRmKiorS2rVr9b//+781bn/LLbfozTffVE5Ojrp27ap9+/bp448/1vr163XuuefqgQceCNn5r1y5UvPnz9cdd9wht9utF198UYMHD9aqVavUrVs3v/oDSGJkYU1q+xZakomKijL//ve/qzx26NAhn5/LyspMt27dzMUXX+xdt2nTJhMVFWV++ctfmvLycp/2Ho/HGGPMgQMHTEJCghk7dqzP4/n5+SY+Pt5nfcU3W/fdd59f5zZq1CgTFRVV5VukE49/1113GUnmo48+8j524MAB0759e9OuXTtvvytGgHTp0sVn9Mhzzz1nJJmvv/7aGGPMsWPHTPv27U3btm3Nf//732qPaYwxl1xyienevbvPtyQej8f069fPnHnmmd51Fd/EZWVl+Wx/9913m+joaFNYWOhdV9PcUhX7uOCCC6p883by62iMMXl5eUaS+ctf/uJdV9vcUiePAJk+fbqRZP76179615WVlZm+ffua5s2bm+LiYmNM5QiQ008/3Wdkwdtvv20kmX/+859VjnWiI0eOVPl3tWXLFuN2u83DDz/sXRfKOQur+zasuqXiW9oT91fdN5XnnXee+Z//+R+/+gXUF+QKuXIyp+WKMZWjGk5U02iNjz76yEgyr732ms/6JUuWVFlfMaJzyZIltfa1OrX97gWbRT179jRDhw6ttU0oz//EkYRFRUWmVatW5mc/+1lA/QEaouHDh5vY2Fizbds277pvv/3WREdH1zqy0Bjf0dknqsirk0f7B5o7J2eGlbw++b34Zz/7mcnIyPD+/P777xtJ5o477qjy3FRk3tatW010dLR59NFHfR7/+uuvTaNGjaqsP5m/OVfT81nTnH1z5841UVFRPn8/GFM5h+Ann3ziXVfb31OnUtvIwvHjx5vo6OhqH2vZsqUZOXJkrfuOj4+vko0nC9X5SzKrV6/2rtu2bZuJjY01v/zlLwPqD8DdkC0aMGCAunbtWmX9iXPn/Pe//1VRUZH69++vL7/80rt+0aJF8ng8mjhxoqKifF+CijswLVu2TIWFhbr22mu1d+9e7xIdHa3MzEx98MEHVY594jdHNfF4PFq0aJGGDRtW5ZuRE4+/ePFi9enTRxdccIH3sebNm2vcuHHaunWrvv32W5/txowZ4zOXUsVItf/85z+Sjn8bs2XLFt11111VvpGqOOb+/fv1/vvv65prrtGBAwe857xv3z5lZ2dr06ZN+vHHH322HTdunM9dq/r376/y8nJt27btlM9FhbFjxyo6Otpn3Ymv49GjR7Vv3z516tRJCQkJPq9lIBYvXqzU1FRde+213nWNGzfWHXfcoYMHD2rlypU+7UeMGOEz98XJz2lN3G63999VeXm59u3bp+bNm+vss8+23PdTeeaZZ7Rs2bJTLr/73e+82xw+fNjb35PFxsZ6HwcaCnKFXAlUfc+VBQsWKD4+Xj//+c99/k1mZGSoefPmVf5Ntm/fXtnZ2ZaPV51gsyghIUH//ve/tWnTpoCPHej5p6Wl+YxIiouL06hRo7R27Vrl5+cH3R/AqcrLy7V06VINHz5cbdq08a7v0qVLyN9TrOTOyZlhJa9vueUWn5/79+/v897+1ltvyeVyadKkSVW2rci8v//97/J4PLrmmmt8jpuamqozzzyz2uOeKBw5Jx1/r+zSpYs6d+7s06+LL75Ykqr0q6a/p4Jx+PDhGucN9jcrPv/8c+3cuTPgYwd6/n379lVGRob35zZt2ujyyy/X0qVLVV5eHnR/0HBwGbJF7du3r3b9O++8o0ceeUTr1q1TaWmpd/2JHzw2b96sqKioWt/EKv7Iq3gTOFlcXJzPz40aNdIZZ5xxyn7v2bNHxcXF3iHINdm2bZsyMzOrrK+4FGrbtm0++zgxeCV5P4z897//lXT8nCXVetzvv/9exhg99NBDeuihh6pts3v3brVu3drv4/qjutfy8OHDys3N1ezZs/Xjjz/KGON9rKioyO99n2jbtm0688wzq3yQP/E5PZHVc/N4PHruuef04osvasuWLd5QkKTTTz/dUt9P5cRA8lfFHxQn/p5UqG3SesCpyBVyJVD1PVc2bdqkoqIiJScnV/t4xc0DKtT0OxKMYLPo4Ycf1uWXX66zzjpL3bp10+DBg3XDDTeoR48epzx2oOffqVMnn997STrrrLMkSVu3blVqampQ/QGcas+ePTp8+LDOPPPMKo+dffbZWrx4cciOZSV3Tn5vCzSvY2NjfaY1kY6/v5/43r5582alpaUpMTGxxr5v2rRJxphqnydJtU5XIYUn5yr6tX79+irnWMGurCgrK6v2MX+y4sknn9To0aOVnp6ujIwMXXrppRo1apQ6dOhwymMHev7VvX5nnXWWDh06pD179ig1NTWo/qDhoFhoUXVvCB999JEuu+wyXXjhhXrxxRfVqlUrNW7cWLNnz9a8efMC2r/H45F0fL6K1NTUKo9X3K2vwonf+teFk0dQVDgxJE6l4pzvueeeGr/l69SpU8iPW91refvtt2v27Nm666671LdvX8XHx8vlcmnkyJHefoab1XN77LHH9NBDD+lXv/qVpk6dqsTEREVFRemuu+4KW9/3799fY4CeqEmTJoqPj5cktWrVSpK0a9cupaen+7TbtWuX+vTpE/qOAhGMXPFFroRepOWKx+NRcnKyXnvttWofP/mDUTi+RAo2iy688EJt3rxZb7/9tv71r3/pT3/6k5599lnNmjVLN998c63bBnr+/gimPwCCZyV3Tn5vCzSva3pvD5TH45HL5dL//d//VbvPijn0ahKunPN4POrevbumTZtW7eMnv3eHKyvKy8u1e/duny94ysrKtG/fPqWlpdW6/TXXXKP+/ftr4cKF+te//qWnnnpKTzzxhP7+979ryJAhtW4b6Pn7I5j+oOGgWFiDk7+59cdbb72l2NhYLV261OdyltmzZ/u069ixozwej7799lv16tWr2n117NhRkpScnKysrKyA+1KTli1bKi4uTt98802t7dq2bauNGzdWWb9hwwbv44GoOJ9vvvmmxvOp+CajcePGIT1nK6/lm2++qdGjR+uZZ57xrjty5IgKCwst77tt27b66quv5PF4fD6AW31Oa/Lmm2/qoosu0iuvvOKzvrCw0HtTBSnw56W29ldccUWVy92qM3r0aM2ZM0eSvP/2V69e7fNhbOfOnfrhhx80bty4gPoHRDpyhVxxeq7UpKZz6tixo9577z2df/75dTaaPBRZlJiYqDFjxmjMmDE6ePCgLrzwQk2ePNlbnAvV+VeMWDpxf999950k+Uzgf6r+AA1Ny5Yt1aRJk2ovz68ul4IRitwJR1537NhRS5cu1f79+2scXdixY0cZY9S+fXvvqOVA+JtzNantvfL//b//p0suucRS/obCiVlx6aWXetevXr1aHo+nxr+9TtSqVSvddtttuu2227R7926de+65evTRR73FuVCdf3X/zr/77js1bdrU50uoU/UHYM7CGjRr1kyS/H5zk45/q+NyuXwuz9m6dWuVOxQNHz5cUVFRevjhh6t8y1Lx7X52drbi4uL02GOPVXuX2T179vjdrxNFRUVp+PDh+uc//6nVq1dXebzi+JdeeqlWrVqlvLw872MlJSV66aWX1K5du4DngTj33HPVvn17TZ8+vcpzWnHM5ORkDRw4UH/84x+1a9euKvuwes7NmjUL6HWUjr+WJ4+0eP75531e24p9S/79O7n00kuVn5/vvaOmdPxuo88//7yaN2+uAQMGBNTHmlTX9wULFlSZHyXQf+O1tbcyZ+E555yjzp0766WXXvJ5XmfOnCmXy6WrrrrKr34B9QW5Qq44PVdqUtM5XXPNNSovL9fUqVOrbHPs2LGAn2Mrgs2iffv2+fzcvHlzderUyeey5lCd/86dO7Vw4ULvz8XFxfrLX/6iXr16eUcf+dMfoKGJjo5Wdna2Fi1apO3bt3vXr1+/XkuXLg3psUKRO+HI6yuvvFLGGE2ZMqXKYxXv71dccYWio6M1ZcqUKu/5xpgq7y8n8zfnalJxR+STXXPNNfrxxx/18ssvV3ns8OHD3jtIh9PFF1+sxMREzZw502f9zJkz1bRpUw0dOrTGbcvLy6ucV3JystLS0qpkRSjOPy8vz2eOyB07dujtt9/WoEGDFB0d7Xd/AEYW1qBiDrYHHnhAI0eOVOPGjTVs2DDvH3zVGTp0qKZNm6bBgwfruuuu0+7duzVjxgx16tRJX331lbddp06d9MADD2jq1Knq37+/rrjiCrndbn3xxRdKS0tTbm6u4uLiNHPmTN1www0699xzNXLkSLVs2VLbt2/Xu+++q/PPP18vvPCCpXN77LHH9K9//UsDBgzw3n59165dWrBggT7++GMlJCTovvvu09/+9jcNGTJEd9xxhxITE/XnP/9ZW7Zs0VtvvRXwpWlRUVGaOXOmhg0bpl69emnMmDFq1aqVNmzYoH//+9/eoJ4xY4YuuOACde/eXWPHjlWHDh1UUFCgvLw8/fDDD/p//+//BXy+GRkZmjlzph555BF16tRJycnJNc4BUuEXv/iF5s6dq/j4eHXt2lV5eXl67733qszN1KtXL0VHR+uJJ55QUVGR3G63Lr744mrnHxo3bpz++Mc/6sYbb9SaNWvUrl07vfnmm/rkk080ffp0tWjRIuBzq6nvDz/8sMaMGaN+/frp66+/1muvvVZlDoqOHTsqISFBs2bNUosWLdSsWTNlZmbWOM9Hbb8TVuYslKSnnnpKl112mQYNGqSRI0fqm2++0QsvvKCbb77ZO+cW4BTkCrni9FypScW//TvuuEPZ2dmKjo7WyJEjNWDAAP36179Wbm6u1q1bp0GDBqlx48batGmTFixYoOeee87yF0dFRUV6/vnnJUmffPKJJOmFF15QQkKCEhISlJOT420bTBZ17dpVAwcOVEZGhhITE7V69Wq9+eabPvsP1fmfddZZuummm/TFF18oJSVFr776qgoKCnxGGvvTH6AhmjJlipYsWaL+/fvrtttu836xcs455/jkaSgEmzvhyOuLLrpIN9xwg/7whz9o06ZNGjx4sDwejz766CNddNFFysnJUceOHfXII4/o/vvv19atWzV8+HC1aNFCW7Zs0cKFCzVu3Djdc889NR7D35yrSUZGhubPn68JEybovPPOU/PmzTVs2DDdcMMNeuONN3TLLbfogw8+0Pnnn6/y8nJt2LBBb7zxhpYuXVrtDdb8sW3bNs2dO1eSvF94PvLII5KOj86/4YYbJB2/tHnq1KkaP368rr76amVnZ+ujjz7SX//6Vz366KO1zgV54MABnXHGGbrqqqvUs2dPNW/eXO+9956++OILn1GYoTr/bt26KTs7W3fccYfcbrdefPFFSfIWiv3tD1D9vcFh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586duuKKK0LecQCobzxyyWMsLFyyFTbkGgBYZynXyLSwIdMAIEguV+CFQpczcy2gy5CXLFni8/OcOXOUnJysNWvW6MILL1RRUZFeeeUVzZs3TxdffLEkafbs2erSpYs+++wz/c///E/oeg4A9YyxOGeh4YNV2JBrAGCdlVwj08KHTAOAIHEZsldQZ1VUVCRJSkxMlCStWbNGR48eVVZWlrdN586d1aZNG+Xl5VW7j9LSUhUXF/ssAADUBXINAOAUocg0iVwDgIbIcrHQ4/Horrvu0vnnn69u3bpJkvLz8xUTE6OEhASftikpKcrPz692P7m5uYqPj/cu6enpVrsEABHN0iXIPy0IP3INAAJDpkWuUGWaRK4BaECYs9DL8lmNHz9e33zzjV5//fWgOnD//ferqKjIu+zYsSOo/QFApOIGJ5GNXAOAwJBpkStUmSaRawAaEIqFXgHNWVghJydH77zzjj788EOdccYZ3vWpqakqKytTYWGhzzdWBQUFSk1NrXZfbrdbbrfbSjcAoF6xOqKCURjhR64BQOCs5BqZFn6hzDSJXAPQgDBnoVdAZ2WMUU5OjhYuXKj3339f7du393k8IyNDjRs31vLly73rNm7cqO3bt6tv376h6TEA1FOenyaCt7IgPMg1ALCOTIssZBoABImRhV4BjSwcP3685s2bp7ffflstWrTwzm0RHx+vJk2aKD4+XjfddJMmTJigxMRExcXF6fbbb1ffvn25uxaABo+RhZGHXAMA6xhZGFnINAAIEiMLvQIqFs6cOVOSNHDgQJ/1s2fP1o033ihJevbZZxUVFaUrr7xSpaWlys7O1osvvhiSzgIAEErkGgDAKcg0AECoBFQsNMacsk1sbKxmzJihGTNmWO4UADgRIwsjD7kGANYxsjCykGkAECRGFnpZusEJACBwFAsBAE5CsRAA4CgUC72ceVYAEIEqPlRZWQAAiDRkGgDAUVyuwG9u4rKWazNmzFC7du0UGxurzMxMrVq1qsa2L7/8svr376/TTjtNp512mrKysmptHwoUCwHAJkbW7hx56ouKAACwn5VcI9MAABHLprshz58/XxMmTNCkSZP05ZdfqmfPnsrOztbu3burbb9ixQpde+21+uCDD5SXl6f09HQNGjRIP/74Y7BnXCOKhQAAAAAAAIANpk2bprFjx2rMmDHq2rWrZs2apaZN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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAABQsAAAF2CAYAAADJMM7PAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABqNUlEQVR4nO3deXxU1f3/8fckkAlbEmNIQjDsKiBbDZIvKIKaEpCi1A3UryBVqErcqK1alUXUuCJWEapVaKlURAu2yheKKLhFEYSfWgGRsikkbE0CARLInN8fmAlDFmbuzNxMbl7Px+M+NHfOvffcGTLvzGfOPddljDECAAAAAAAA0OBF1XUHAAAAAAAAAEQGioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioVAmAwcOFADBw6s624AAByiPuRKQUGBrrrqKp1++ulyuVyaPn16XXcJAGo0efJkuVwun3Xt2rXTjTfe6LNu06ZNGjRokOLj4+VyubRo0SJJ0hdffKF+/fqpWbNmcrlcWrdunT0dr+dqej4BRA6KhTX49NNPNXnyZBUWFtZ1VxCkF198UXPmzAnLvr/99ltNnjxZW7duDcv+w2nnzp2aPHmy33/UhOt34h//+IfOPfdcxcbGqk2bNpo0aZKOHTsW0mMAkYBccQ5ypWZ33323li5dqvvvv19z587V4MGDtXjxYk2ePNnWfmzcuFF33323+vXrp9jYWLlcrlqf03BmUV2cP4DQGj16tL7++ms9+uijmjt3rnr37q2jR4/q6quv1v79+/Xss89q7ty5atu2bV13tV6o7vmcN2+e7V8wrVq1SrfddpsyMjLUuHHjKoXjk73yyivq0qWLYmNjdeaZZ+r5558PWV/q4vyBWhlU66mnnjKSzJYtW+q6KwjSOeecYwYMGBCWfS9YsMBIMh988EGVx0pLS01paWlYjhsKX3zxhZFkZs+e7Vf7cPxOLF682LhcLnPRRReZl156ydx+++0mKirK3HLLLSE7BhApyBXnIFdqlpKSYq6//nqfdePHjzd2/8k5e/ZsExUVZbp162Z69epV6+9euLOoLs4fgH8mTZpU5ffzyJEjpqyszPvzoUOHjCTzwAMP+LRbv369kWRefvllW/rqFDU9n0OHDjVt27a1tS+TJk0yjRs3NhkZGeass86q9b161qxZRpK58sorzUsvvWRuuOEGI8k8/vjjIelLXZw/UJtG9pcnncfj8aisrEyxsbF13RWvkpISNWvWrK67Ue+E8nmLiYkJyX6c7J577lGPHj30r3/9S40aHX87iouL02OPPaY777xTnTt3ruMeAnWDXHGOhpYru3fvVkJCQtiPY4zRkSNH1KRJk2ofv+yyy1RYWKgWLVro6aefrnUUPVkE4ERut9vn5z179khSlfe23bt3V7s+GA0ha2t6PsPhVH9P3Xrrrbr33nvVpEkT5eTk6Lvvvqu23eHDh/XAAw9o6NChevPNNyVJY8eOlcfj0dSpUzVu3DiddtppYTsPoE7UdbUyElV8w3TyUvGNtCQzfvx489e//tV07drVNGrUyCxcuNAYc3zkSN++fU1iYqKJjY015557rlmwYEG1x5k7d64577zzTJMmTUxCQoLp37+/Wbp0qU+bxYsXmwsuuMA0bdrUNG/e3Fx66aXmm2++8WkzevRo06xZM/P999+bIUOGmObNm5vLL7+81nP84YcfzK9+9SvTqlUrExMTY9q1a2duueUWnxELmzdvNldddZU57bTTTJMmTUxmZqZ55513fPbzwQcfGElm/vz55pFHHjGtW7c2brfbXHzxxWbTpk1VjvvZZ5+ZIUOGmISEBNO0aVPTvXt3M336dJ8269evN1deeaU57bTTjNvtNhkZGebtt9/2aTN79mwjyXz88cfm7rvvNklJSaZp06Zm+PDhZvfu3d52bdu2rfI6VowGqdjHihUrzK233mpatmxpEhISjDHGbN261dx6663mrLPOMrGxsSYxMdFcddVVPqMSKrY/eakYDTJgwIAqI08KCgrMr371K5OcnGzcbrfp0aOHmTNnjk+bLVu2GEnmqaeeMn/84x9Nhw4dTExMjOndu7dZtWpVzS/qT/bt22d+85vfmG7duplmzZqZFi1amMGDB5t169ZVed1OXmoaZXiq3wkr/v3vfxtJZsaMGT7rf/zxRyPJTJ061fK+gUhDrhxHrjg3V2rq++jRo6tdX6G8vNw8++yzpmvXrsbtdpvk5GQzbtw4s3//fp8+tG3b1gwdOtQsWbLEZGRkGLfbbZ599tlT9t2Y2kf1BptFZWVlZvLkyaZTp07G7XabxMREc/7555t//etfxhgT8vNfunSp6dmzp3G73aZLly7mrbfeCqg/QEP20Ucfmd69exu32206dOhgZs2aVe3IwrZt25rRo0cbY6rP74rHa8oCYwLLneoyw5jA8vqHH34wl19+uWnWrJlJSkoyv/nNb8yxY8d82paXl5vp06ebbt26GbfbbZKSkkx2drb54osvfNrNnTvXnHvuuSY2NtacdtppZsSIEWb79u2nfH79ybmans8BAwZUu77CkSNHzMSJE03Hjh1NTEyMOeOMM8xvf/tbc+TIEZ8+1Pb31KnUNgr83XffNZLMu+++67P+008/NZLM3Llza913cXGxufPOO03btm1NTEyMadmypcnKyjJr1qwxxpiwnP9ZZ51l3G63Offcc83KlSsD6g9gDCMLq3XFFVfou+++09/+9jc9++yzSkpKkiS1bNnS2+b999/XG2+8oZycHCUlJaldu3aSpOeee06XXXaZrr/+epWVlen111/X1VdfrXfeeUdDhw71bj9lyhRNnjxZ/fr108MPP6yYmBh9/vnnev/99zVo0CBJ0ty5czV69GhlZ2friSee0KFDhzRz5kxdcMEFWrt2rfeYknTs2DFlZ2frggsu0NNPP62mTZvWeH47d+5Unz59VFhYqHHjxqlz58768ccf9eabb+rQoUOKiYlRQUGB+vXrp0OHDumOO+7Q6aefrj//+c+67LLL9Oabb+qXv/ylzz4ff/xxRUVF6Z577lFRUZGefPJJXX/99fr888+9bZYtW6Zf/OIXatWqle68806lpqZq/fr1euedd3TnnXdKkv7973/r/PPPV+vWrXXfffepWbNmeuONNzR8+HC99dZbVY57++2367TTTtOkSZO0detWTZ8+XTk5OZo/f74kafr06br99tvVvHlzPfDAA5KklJQUn33cdtttatmypSZOnKiSkhJJxycr/vTTTzVy5EidccYZ2rp1q2bOnKmBAwfq22+/VdOmTXXhhRfqjjvu0B/+8Af9/ve/V5cuXSTJ+9+THT58WAMHDtT333+vnJwctW/fXgsWLNCNN96owsJC73NQYd68eTpw4IB+/etfy+Vy6cknn9QVV1yh//znP2rcuHGNr+9//vMfLVq0SFdffbXat2+vgoIC/fGPf9SAAQP07bffKi0tTV26dNHDDz+siRMnaty4cerfv78kqV+/ftXu81S/E0VFRTp69GiNfaoQGxur5s2bS5LWrl0rSerdu7dPm7S0NJ1xxhnexwEnIFfIFafnyoUXXqi5c+fqhhtu0M9//nONGjVKktSxY0ft3LlTy5Yt09y5c6vs+9e//rXmzJmjMWPG6I477tCWLVv0wgsvaO3atfrkk098+rVx40Zde+21+vWvf62xY8fq7LPPrrHP/go2iyZPnqzc3FzdfPPN6tOnj4qLi7V69Wp9+eWX+vnPf65f//rXITv/TZs2acSIEbrllls0evRozZ49W1dffbWWLFmin//85371B2iovv76aw0aNEgtW7bU5MmTdezYMU2aNKnK+/fJrrjiCiUkJOjuu+/Wtddeq0svvVTNmzdXSkqKWrdurccee0x33HGHzjvvPO++As2d6jIjkLwuLy9Xdna2MjMz9fTTT+u9997TM888o44dO+rWW2/1trvppps0Z84cDRkyRDfffLOOHTumjz76SJ999pn3PfDRRx/VQw89pGuuuUY333yz9uzZo+eff14XXnih1q5dW+toQH9yrqbns1mzZioqKtIPP/ygZ599VpK8nxk8Ho8uu+wyffzxxxo3bpy6dOmir7/+Ws8++6y+++67KjdHqenvqWDUlBUZGRmKiorS2rVr9b//+781bn/LLbfozTffVE5Ojrp27ap9+/bp448/1vr163XuuefqgQceCNn5r1y5UvPnz9cdd9wht9utF198UYMHD9aqVavUrVs3v/oDSGJkYU1q+xZakomKijL//ve/qzx26NAhn5/LyspMt27dzMUXX+xdt2nTJhMVFWV++ctfmvLycp/2Ho/HGGPMgQMHTEJCghk7dqzP4/n5+SY+Pt5nfcU3W/fdd59f5zZq1CgTFRVV5VukE49/1113GUnmo48+8j524MAB0759e9OuXTtvvytGgHTp0sVn9Mhzzz1nJJmvv/7aGGPMsWPHTPv27U3btm3Nf//732qPaYwxl1xyienevbvPtyQej8f069fPnHnmmd51Fd/EZWVl+Wx/9913m+joaFNYWOhdV9PcUhX7uOCCC6p883by62iMMXl5eUaS+ctf/uJdV9vcUiePAJk+fbqRZP76179615WVlZm+ffua5s2bm+LiYmNM5QiQ008/3Wdkwdtvv20kmX/+859VjnWiI0eOVPl3tWXLFuN2u83DDz/sXRfKOQur+zasuqXiW9oT91fdN5XnnXee+Z//+R+/+gXUF+QKuXIyp+WKMZWjGk5U02iNjz76yEgyr732ms/6JUuWVFlfMaJzyZIltfa1OrX97gWbRT179jRDhw6ttU0oz//EkYRFRUWmVatW5mc/+1lA/QEaouHDh5vY2Fizbds277pvv/3WREdH1zqy0Bjf0dknqsirk0f7B5o7J2eGlbw++b34Zz/7mcnIyPD+/P777xtJ5o477qjy3FRk3tatW010dLR59NFHfR7/+uuvTaNGjaqsP5m/OVfT81nTnH1z5841UVFRPn8/GFM5h+Ann3ziXVfb31OnUtvIwvHjx5vo6OhqH2vZsqUZOXJkrfuOj4+vko0nC9X5SzKrV6/2rtu2bZuJjY01v/zlLwPqD8DdkC0aMGCAunbtWmX9iXPn/Pe//1VRUZH69++vL7/80rt+0aJF8ng8mjhxoqKifF+CijswLVu2TIWFhbr22mu1d+9e7xIdHa3MzEx98MEHVY594jdHNfF4PFq0aJGGDRtW5ZuRE4+/ePFi9enTRxdccIH3sebNm2vcuHHaunWrvv32W5/txowZ4zOXUsVItf/85z+Sjn8bs2XLFt11111VvpGqOOb+/fv1/vvv65prrtGBAwe857xv3z5lZ2dr06ZN+vHHH322HTdunM9dq/r376/y8nJt27btlM9FhbFjxyo6Otpn3Ymv49GjR7Vv3z516tRJCQkJPq9lIBYvXqzU1FRde+213nWNGzfWHXfcoYMHD2rlypU+7UeMGOEz98XJz2lN3G63999VeXm59u3bp+bNm+vss8+23PdTeeaZZ7Rs2bJTLr/73e+82xw+fNjb35PFxsZ6HwcaCnKFXAlUfc+VBQsWKD4+Xj//+c99/k1mZGSoefPmVf5Ntm/fXtnZ2ZaPV51gsyghIUH//ve/tWnTpoCPHej5p6Wl+YxIiouL06hRo7R27Vrl5+cH3R/AqcrLy7V06VINHz5cbdq08a7v0qVLyN9TrOTOyZlhJa9vueUWn5/79+/v897+1ltvyeVyadKkSVW2rci8v//97/J4PLrmmmt8jpuamqozzzyz2uOeKBw5Jx1/r+zSpYs6d+7s06+LL75Ykqr0q6a/p4Jx+PDhGucN9jcrPv/8c+3cuTPgYwd6/n379lVGRob35zZt2ujyyy/X0qVLVV5eHnR/0HBwGbJF7du3r3b9O++8o0ceeUTr1q1TaWmpd/2JHzw2b96sqKioWt/EKv7Iq3gTOFlcXJzPz40aNdIZZ5xxyn7v2bNHxcXF3iHINdm2bZsyMzOrrK+4FGrbtm0++zgxeCV5P4z897//lXT8nCXVetzvv/9exhg99NBDeuihh6pts3v3brVu3drv4/qjutfy8OHDys3N1ezZs/Xjjz/KGON9rKioyO99n2jbtm0688wzq3yQP/E5PZHVc/N4PHruuef04osvasuWLd5QkKTTTz/dUt9P5cRA8lfFHxQn/p5UqG3SesCpyBVyJVD1PVc2bdqkoqIiJScnV/t4xc0DKtT0OxKMYLPo4Ycf1uWXX66zzjpL3bp10+DBg3XDDTeoR48epzx2oOffqVMnn997STrrrLMkSVu3blVqampQ/QGcas+ePTp8+LDOPPPMKo+dffbZWrx4cciOZSV3Tn5vCzSvY2NjfaY1kY6/v5/43r5582alpaUpMTGxxr5v2rRJxphqnydJtU5XIYUn5yr6tX79+irnWMGurCgrK6v2MX+y4sknn9To0aOVnp6ujIwMXXrppRo1apQ6dOhwymMHev7VvX5nnXWWDh06pD179ig1NTWo/qDhoFhoUXVvCB999JEuu+wyXXjhhXrxxRfVqlUrNW7cWLNnz9a8efMC2r/H45F0fL6K1NTUKo9X3K2vwonf+teFk0dQVDgxJE6l4pzvueeeGr/l69SpU8iPW91refvtt2v27Nm666671LdvX8XHx8vlcmnkyJHefoab1XN77LHH9NBDD+lXv/qVpk6dqsTEREVFRemuu+4KW9/3799fY4CeqEmTJoqPj5cktWrVSpK0a9cupaen+7TbtWuX+vTpE/qOAhGMXPFFroRepOWKx+NRcnKyXnvttWofP/mDUTi+RAo2iy688EJt3rxZb7/9tv71r3/pT3/6k5599lnNmjVLN998c63bBnr+/gimPwCCZyV3Tn5vCzSva3pvD5TH45HL5dL//d//VbvPijn0ahKunPN4POrevbumTZtW7eMnv3eHKyvKy8u1e/duny94ysrKtG/fPqWlpdW6/TXXXKP+/ftr4cKF+te//qWnnnpKTzzxhP7+979ryJAhtW4b6Pn7I5j+oOGgWFiDk7+59cdbb72l2NhYLV261OdyltmzZ/u069ixozwej7799lv16tWr2n117NhRkpScnKysrKyA+1KTli1bKi4uTt98802t7dq2bauNGzdWWb9hwwbv44GoOJ9vvvmmxvOp+CajcePGIT1nK6/lm2++qdGjR+uZZ57xrjty5IgKCwst77tt27b66quv5PF4fD6AW31Oa/Lmm2/qoosu0iuvvOKzvrCw0HtTBSnw56W29ldccUWVy92qM3r0aM2ZM0eSvP/2V69e7fNhbOfOnfrhhx80bty4gPoHRDpyhVxxeq7UpKZz6tixo9577z2df/75dTaaPBRZlJiYqDFjxmjMmDE6ePCgLrzwQk2ePNlbnAvV+VeMWDpxf999950k+Uzgf6r+AA1Ny5Yt1aRJk2ovz68ul4IRitwJR1537NhRS5cu1f79+2scXdixY0cZY9S+fXvvqOVA+JtzNantvfL//b//p0suucRS/obCiVlx6aWXetevXr1aHo+nxr+9TtSqVSvddtttuu2227R7926de+65evTRR73FuVCdf3X/zr/77js1bdrU50uoU/UHYM7CGjRr1kyS/H5zk45/q+NyuXwuz9m6dWuVOxQNHz5cUVFRevjhh6t8y1Lx7X52drbi4uL02GOPVXuX2T179vjdrxNFRUVp+PDh+uc//6nVq1dXebzi+JdeeqlWrVqlvLw872MlJSV66aWX1K5du4DngTj33HPVvn17TZ8+vcpzWnHM5ORkDRw4UH/84x+1a9euKvuwes7NmjUL6HWUjr+WJ4+0eP75531e24p9S/79O7n00kuVn5/vvaOmdPxuo88//7yaN2+uAQMGBNTHmlTX9wULFlSZHyXQf+O1tbcyZ+E555yjzp0766WXXvJ5XmfOnCmXy6WrrrrKr34B9QW5Qq44PVdqUtM5XXPNNSovL9fUqVOrbHPs2LGAn2Mrgs2iffv2+fzcvHlzderUyeey5lCd/86dO7Vw4ULvz8XFxfrLX/6iXr16eUcf+dMfoKGJjo5Wdna2Fi1apO3bt3vXr1+/XkuXLg3psUKRO+HI6yuvvFLGGE2ZMqXKYxXv71dccYWio6M1ZcqUKu/5xpgq7y8n8zfnalJxR+STXXPNNfrxxx/18ssvV3ns8OHD3jtIh9PFF1+sxMREzZw502f9zJkz1bRpUw0dOrTGbcvLy6ucV3JystLS0qpkRSjOPy8vz2eOyB07dujtt9/WoEGDFB0d7Xd/AEYW1qBiDrYHHnhAI0eOVOPGjTVs2DDvH3zVGTp0qKZNm6bBgwfruuuu0+7duzVjxgx16tRJX331lbddp06d9MADD2jq1Knq37+/rrjiCrndbn3xxRdKS0tTbm6u4uLiNHPmTN1www0699xzNXLkSLVs2VLbt2/Xu+++q/PPP18vvPCCpXN77LHH9K9//UsDBgzw3n59165dWrBggT7++GMlJCTovvvu09/+9jcNGTJEd9xxhxITE/XnP/9ZW7Zs0VtvvRXwpWlRUVGaOXOmhg0bpl69emnMmDFq1aqVNmzYoH//+9/eoJ4xY4YuuOACde/eXWPHjlWHDh1UUFCgvLw8/fDDD/p//+//BXy+GRkZmjlzph555BF16tRJycnJNc4BUuEXv/iF5s6dq/j4eHXt2lV5eXl67733qszN1KtXL0VHR+uJJ55QUVGR3G63Lr744mrnHxo3bpz++Mc/6sYbb9SaNWvUrl07vfnmm/rkk080ffp0tWjRIuBzq6nvDz/8sMaMGaN+/frp66+/1muvvVZlDoqOHTsqISFBs2bNUosWLdSsWTNlZmbWOM9Hbb8TVuYslKSnnnpKl112mQYNGqSRI0fqm2++0QsvvKCbb77ZO+cW4BTkCrni9FypScW//TvuuEPZ2dmKjo7WyJEjNWDAAP36179Wbm6u1q1bp0GDBqlx48batGmTFixYoOeee87yF0dFRUV6/vnnJUmffPKJJOmFF15QQkKCEhISlJOT420bTBZ17dpVAwcOVEZGhhITE7V69Wq9+eabPvsP1fmfddZZuummm/TFF18oJSVFr776qgoKCnxGGvvTH6AhmjJlipYsWaL+/fvrtttu836xcs455/jkaSgEmzvhyOuLLrpIN9xwg/7whz9o06ZNGjx4sDwejz766CNddNFFysnJUceOHfXII4/o/vvv19atWzV8+HC1aNFCW7Zs0cKFCzVu3Djdc889NR7D35yrSUZGhubPn68JEybovPPOU/PmzTVs2DDdcMMNeuONN3TLLbfogw8+0Pnnn6/y8nJt2LBBb7zxhpYuXVrtDdb8sW3bNs2dO1eSvF94PvLII5KOj86/4YYbJB2/tHnq1KkaP368rr76amVnZ+ujjz7SX//6Vz366KO1zgV54MABnXHGGbrqqqvUs2dPNW/eXO+9956++OILn1GYoTr/bt26KTs7W3fccYfcbrdefPFFSfIWiv3tD1D9vcFh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586duuKKK0LecQCobzxyyWMsLFyyFTbkGgBYZynXyLSwIdMAIEguV+CFQpczcy2gy5CXLFni8/OcOXOUnJysNWvW6MILL1RRUZFeeeUVzZs3TxdffLEkafbs2erSpYs+++wz/c///E/oeg4A9YyxOGeh4YNV2JBrAGCdlVwj08KHTAOAIHEZsldQZ1VUVCRJSkxMlCStWbNGR48eVVZWlrdN586d1aZNG+Xl5VW7j9LSUhUXF/ssAADUBXINAOAUocg0iVwDgIbIcrHQ4/Horrvu0vnnn69u3bpJkvLz8xUTE6OEhASftikpKcrPz692P7m5uYqPj/cu6enpVrsEABHN0iXIPy0IP3INAAJDpkWuUGWaRK4BaECYs9DL8lmNHz9e33zzjV5//fWgOnD//ferqKjIu+zYsSOo/QFApOIGJ5GNXAOAwJBpkStUmSaRawAaEIqFXgHNWVghJydH77zzjj788EOdccYZ3vWpqakqKytTYWGhzzdWBQUFSk1NrXZfbrdbbrfbSjcAoF6xOqKCURjhR64BQOCs5BqZFn6hzDSJXAPQgDBnoVdAZ2WMUU5OjhYuXKj3339f7du393k8IyNDjRs31vLly73rNm7cqO3bt6tv376h6TEA1FOenyaCt7IgPMg1ALCOTIssZBoABImRhV4BjSwcP3685s2bp7ffflstWrTwzm0RHx+vJk2aKD4+XjfddJMmTJigxMRExcXF6fbbb1ffvn25uxaABo+RhZGHXAMA6xhZGFnINAAIEiMLvQIqFs6cOVOSNHDgQJ/1s2fP1o033ihJevbZZxUVFaUrr7xSpaWlys7O1osvvhiSzgIAEErkGgDAKcg0AECoBFQsNMacsk1sbKxmzJihGTNmWO4UADgRIwsjD7kGANYxsjCykGkAECRGFnpZusEJACBwFAsBAE5CsRAA4CgUC72ceVYAEIEqPlRZWQAAiDRkGgDAUVyuwG9u4rKWazNmzFC7du0UGxurzMxMrVq1qsa2L7/8svr376/TTjtNp512mrKysmptHwoUCwHAJkbW7hx56ouKAACwn5VcI9MAABHLprshz58/XxMmTNCkSZP05ZdfqmfPnsrOztbu3burbb9ixQpde+21+uCDD5SXl6f09HQNGjRIP/74Y7BnXCOKhQAAAAAAAIANpk2bprFjx2rMmDHq2rWrZs2apaZN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", "text/plain": [ "
" ] diff --git a/tests/main/fv3core/test_dycore_call.py b/tests/main/fv3core/test_dycore_call.py index eeb3d08b3..ee13e70d2 100644 --- a/tests/main/fv3core/test_dycore_call.py +++ b/tests/main/fv3core/test_dycore_call.py @@ -210,5 +210,5 @@ def test_call_does_not_define_stencils(): def error_func(*args, **kwargs): raise AssertionError("call not allowed") - with unittest.mock.patch("gt4py.cartesian.gtscript.stencil", new=error_func): + with unittest.mock.patch("ndsl.dsl.gt4py.stencil", new=error_func): dycore.step_dynamics(state, timer) diff --git a/tests/main/fv3core/test_grid.py b/tests/main/fv3core/test_grid.py index 0b95f3ea0..572efc2da 100644 --- a/tests/main/fv3core/test_grid.py +++ b/tests/main/fv3core/test_grid.py @@ -2,8 +2,8 @@ import numpy as np import pytest -from gt4py.cartesian import gtscript +import ndsl.dsl.gt4py as gt from ndsl import GridIndexing from ndsl.constants import ( X_DIM, @@ -27,28 +27,28 @@ pytest.param( (0, 0), (0, 0), - gtscript.I[0], - gtscript.I[-1], - gtscript.J[0], - gtscript.J[-1], + gt.I[0], + gt.I[-1], + gt.J[0], + gt.J[-1], id="compute_domain", ), pytest.param( (-1, -1), (2, 2), - gtscript.I[0] + 1, - gtscript.I[-1] - 1, - gtscript.J[0] + 1, - gtscript.J[-1] - 1, + gt.I[0] + 1, + gt.I[-1] - 1, + gt.J[0] + 1, + gt.J[-1] - 1, id="compute_domain_plus_one_halo", ), pytest.param( (-1, 0), (2, 0), - gtscript.I[0] + 1, - gtscript.I[-1] - 1, - gtscript.J[0], - gtscript.J[-1], + gt.I[0] + 1, + gt.I[-1] - 1, + gt.J[0], + gt.J[-1], id="compute_domain_plus_one_x_halo", ), ], @@ -86,19 +86,19 @@ def test_axis_offsets( if west_edge: assert axis_offsets["i_start"] == i_start else: - assert axis_offsets["i_start"] == gtscript.I[0] - np.iinfo(np.int16).max + assert axis_offsets["i_start"] == gt.I[0] - np.iinfo(np.int16).max if east_edge: assert axis_offsets["i_end"] == i_end else: - assert axis_offsets["i_end"] == gtscript.I[-1] + np.iinfo(np.int16).max + assert axis_offsets["i_end"] == gt.I[-1] + np.iinfo(np.int16).max if south_edge: assert axis_offsets["j_start"] == j_start else: - assert axis_offsets["j_start"] == gtscript.J[0] - np.iinfo(np.int16).max + assert axis_offsets["j_start"] == gt.J[0] - np.iinfo(np.int16).max if north_edge: assert axis_offsets["j_end"] == j_end else: - assert axis_offsets["j_end"] == gtscript.J[-1] + np.iinfo(np.int16).max + assert axis_offsets["j_end"] == gt.J[-1] + np.iinfo(np.int16).max @pytest.mark.parametrize( From 8693ca0a927d3989091047aa905d442b6455af96 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Fri, 30 May 2025 17:46:24 +0200 Subject: [PATCH 27/75] No boost dependency anymore (#125) Newer GT4Py versions come with vendored-in boost headers. NDSL picked up this newer boost version and thus pace doesn't need boost in the install notes anymore. Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- .circleci/config.yml | 1 - Dockerfile | 1 - README.md | 11 ----------- docs/installation.rst | 12 ------------ examples/build_scripts/build_gaea_c4.sh | 1 - examples/build_scripts/build_gaea_c5.sh | 1 - examples/build_scripts/build_gaea_c5_gcc.sh | 1 - 7 files changed, 28 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3c7cce288..ebff7167a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -14,7 +14,6 @@ commands: software-properties-common \ libopenmpi3 \ libopenmpi-dev \ - libboost-all-dev \ python3 \ python3-pip \ - run: diff --git a/Dockerfile b/Dockerfile index 377b95846..59a72a6a7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,6 @@ RUN apt-get update && apt-get install -y make \ libgeos-dev \ libopenmpi3 \ libopenmpi-dev \ - libboost-all-dev \ libhdf5-serial-dev \ netcdf-bin \ libnetcdf-dev \ diff --git a/README.md b/README.md index 30e9a0a21..de67184fe 100644 --- a/README.md +++ b/README.md @@ -34,17 +34,6 @@ Pace requires: For GPU backends CUDA and/or ROCm is required depending on the targeted hardware. -For GT stencils backends, you will also need the headers of the boost libraries in your `$PATH`. This could be down like this. - -```shell -cd BOOST/ROOT -wget https://boostorg.jfrog.io/artifactory/main/release/1.79.0/source/boost_1_79_0.tar.gz -tar -xzf boost_1_79_0.tar.gz -mkdir -p boost_1_79_0/include -mv boost_1_79_0/boost boost_1_79_0/include/ -export BOOST_ROOT=BOOST/ROOT/boost_1_79_0 -``` - When cloning Pace you will need to update the repository's submodules as well: ```shell diff --git a/docs/installation.rst b/docs/installation.rst index 44949a0c6..951385a34 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -20,18 +20,6 @@ or if you have already cloned the repository: Pace requires GCC > 9.2, MPI, and Python 3.8 on your system, and CUDA is required to run with a GPU backend. -You will also need the headers of the boost libraries in your `$PATH` (boost itself does not need to be installed). -If installed outside the standard header locations, gt4py requires that `$BOOST_ROOT` be set: - -.. code-block:: console - - $ cd BOOST/ROOT - $ wget https://boostorg.jfrog.io/artifactory/main/release/1.79.0/source/boost_1_79_0.tar.gz - $ tar -xzf boost_1_79_0.tar.gz - $ mkdir -p boost_1_79_0/include - $ mv boost_1_79_0/boost boost_1_79_0/include/ - $ export BOOST_ROOT=BOOST/ROOT/boost_1_79_0 - We recommend creating a python `venv` or conda environment specifically for Pace. diff --git a/examples/build_scripts/build_gaea_c4.sh b/examples/build_scripts/build_gaea_c4.sh index 608cf9fbd..314ca2d1b 100644 --- a/examples/build_scripts/build_gaea_c4.sh +++ b/examples/build_scripts/build_gaea_c4.sh @@ -9,7 +9,6 @@ module rm PrgEnv-intel module load PrgEnv-gnu module rm gcc module load gcc/10.3.0 -module load boost/1.72.0 module load python/3.9 # clone Pace and update submodules diff --git a/examples/build_scripts/build_gaea_c5.sh b/examples/build_scripts/build_gaea_c5.sh index 627c8a061..c8705b4c3 100644 --- a/examples/build_scripts/build_gaea_c5.sh +++ b/examples/build_scripts/build_gaea_c5.sh @@ -9,7 +9,6 @@ module rm PrgEnv-intel module load PrgEnv-gnu module rm gcc module load gcc/12.2.0 -module load boost/1.79.0 module load python/3.9 # clone Pace and update submodules diff --git a/examples/build_scripts/build_gaea_c5_gcc.sh b/examples/build_scripts/build_gaea_c5_gcc.sh index 782ac5f60..fea04652c 100644 --- a/examples/build_scripts/build_gaea_c5_gcc.sh +++ b/examples/build_scripts/build_gaea_c5_gcc.sh @@ -9,7 +9,6 @@ module rm PrgEnv-intel module load PrgEnv-gnu module rm gcc module load gcc/12.2.0 -module load boost/1.79.0 module load python/3.11.7 export CC=`which gcc` From 2ca71a163f280f95015023a2e5d7b7aea54ec532 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Thu, 12 Jun 2025 15:35:10 +0200 Subject: [PATCH 28/75] refactor: Use `pathlib` for manipulating paths (#124) * tests: Use pathlib.Path for eta_files * Udpate more paths from str to Path * Revert changes to pace/comm.py and pace/configs/comm.py --------- Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- changed_from_main.py | 6 +++--- pace/grid.py | 4 ++-- setup.py | 3 +-- tests/__init__.py | 0 tests/main/driver/test_analytic_init.py | 13 ++++++------- tests/main/driver/test_diagnostics.py | 14 +++++--------- tests/main/driver/test_example_configs.py | 14 ++++++-------- tests/main/driver/test_restart_fortran.py | 13 ++++--------- tests/main/driver/test_restart_serial.py | 21 +++++++-------------- tests/main/fv3core/test_cartesian_grid.py | 4 +++- tests/main/fv3core/test_dycore_call.py | 7 ++----- tests/main/physics/test_integration.py | 3 ++- tests/main/test_grid_init.py | 4 +++- tests/mpi/ext_grid/test_external_grid.py | 15 ++++----------- tests/paths.py | 7 +++++++ tests/savepoint/conftest.py | 7 ++----- tests/savepoint/test_checkpoints.py | 16 +++++++--------- 17 files changed, 64 insertions(+), 87 deletions(-) create mode 100644 tests/__init__.py create mode 100644 tests/paths.py diff --git a/changed_from_main.py b/changed_from_main.py index 13119da36..bee6e1fc9 100755 --- a/changed_from_main.py +++ b/changed_from_main.py @@ -8,14 +8,14 @@ This script should depend only on Python 3.6+ standard libraries. """ import argparse -import os import re import subprocess +from pathlib import Path from typing import Any, Dict, Set -DIRNAME = os.path.dirname(os.path.abspath(__file__)) -DEPENDENCIES_DOTFILE = os.path.join(DIRNAME, "dependencies.dot") +DIRNAME = Path(__file__).parent +DEPENDENCIES_DOTFILE = DIRNAME / "dependencies.dot" DEFINITION_PATTERN = re.compile(r"\s*([a-zA-Z0-9]+) \[.*label=\"(.*)\".*\]") DEPENDENCY_PATTERN = re.compile(r"\s*([a-zA-Z0-9]+) -> ([a-zA-Z0-9]+)") diff --git a/pace/grid.py b/pace/grid.py index 0423b7930..9abf3b2cf 100644 --- a/pace/grid.py +++ b/pace/grid.py @@ -94,7 +94,7 @@ class GeneratedGridConfig(GridInitializer): dx_const: Optional[float] = 1000.0 dy_const: Optional[float] = 1000.0 deglat: Optional[float] = 15.0 - eta_file: str = "None" + eta_file: Optional[str] = None def get_grid( self, @@ -214,7 +214,7 @@ class ExternalNetcdfGridConfig(GridInitializer): | | | X----X----X----X----X - The grid data must define the verticies, centroids, and mid-points + The grid data must define the vertices, centroids, and mid-points on edge of the cells contained in the computation. For more information on grid discretization for the FV3 dynamical core please visit: https://www.gfdl.noaa.gov/fv3/ diff --git a/setup.py b/setup.py index ab282cb75..4dc1e5339 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,3 @@ -import os from pathlib import Path from typing import List @@ -7,7 +6,7 @@ def local_pkg(name: str, relative_path: str) -> str: """Returns an absolute path to a local package.""" - return f"{name} @ file://{Path(os.path.abspath(__file__)).parent / relative_path} " + return f"{name} @ file://{Path(__file__).parent / relative_path} " requirements: List[str] = [ diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/main/driver/test_analytic_init.py b/tests/main/driver/test_analytic_init.py index f2d748a73..896c3d6f3 100644 --- a/tests/main/driver/test_analytic_init.py +++ b/tests/main/driver/test_analytic_init.py @@ -1,19 +1,18 @@ -import os +from pathlib import Path from typing import List import pytest import yaml from pace import DriverConfig +from tests.paths import EXAMPLE_CONFIGS_DIR -DIR = os.path.dirname(os.path.abspath(__file__)) - # TODO: Location of test configurations will be changed after refactor, # need to update after -TESTED_CONFIGS: List[str] = [ - "../../../examples/configs/analytic_test.yaml", +TESTED_CONFIGS: List[Path] = [ + EXAMPLE_CONFIGS_DIR / "analytic_test.yaml", ] @@ -23,9 +22,9 @@ pytest.param(TESTED_CONFIGS, id="example configs"), ], ) -def test_analytic_init_config(tested_configs: List[str]): +def test_analytic_init_config(tested_configs: List[Path]): for config_file in tested_configs: - with open(os.path.join(DIR, config_file), "r") as f: + with open(Path(__file__).parent / config_file, "r") as f: config = yaml.safe_load(f) driver_config = DriverConfig.from_dict(config) assert driver_config.initialization.type == "analytic" diff --git a/tests/main/driver/test_diagnostics.py b/tests/main/driver/test_diagnostics.py index a8e4d621c..aa2d415e8 100644 --- a/tests/main/driver/test_diagnostics.py +++ b/tests/main/driver/test_diagnostics.py @@ -1,21 +1,17 @@ -import os +from pathlib import Path import xarray as xr import yaml from pace import DiagnosticsConfig, DriverConfig, NullCommConfig from pace.run import main +from tests.paths import EXAMPLE_CONFIGS_DIR -DIR = os.path.dirname(os.path.abspath(__file__)) - - -def test_diagnostics_can_be_opened(tmpdir): - with open( - os.path.join(DIR, "../../../examples/configs/baroclinic_c12.yaml"), "r" - ) as f: +def test_diagnostics_can_be_opened(tmpdir: Path): + with open(EXAMPLE_CONFIGS_DIR / "baroclinic_c12.yaml", "r") as f: driver_config = DriverConfig.from_dict(yaml.safe_load(f)) - diagnostics_path = os.path.join(tmpdir, "output.zarr") + diagnostics_path = tmpdir / "output.zarr" driver_config.diagnostics_config = DiagnosticsConfig( path=diagnostics_path, names=["u", "v", "ua", "va", "w", "delp", "pt", "qvapor"], diff --git a/tests/main/driver/test_example_configs.py b/tests/main/driver/test_example_configs.py index d99130f5e..02b7eeedd 100644 --- a/tests/main/driver/test_example_configs.py +++ b/tests/main/driver/test_example_configs.py @@ -1,16 +1,14 @@ import os +from pathlib import Path from typing import List import pytest import yaml from pace import DriverConfig +from tests.paths import EXAMPLE_CONFIGS_DIR, JENKINS_CONFIGS_DIR -dirname = os.path.dirname(os.path.abspath(__file__)) - -EXAMPLE_CONFIGS_DIR = os.path.join(dirname, "../../../examples/configs/") - TESTED_CONFIGS: List[str] = [ "baroclinic_c12.yaml", "baroclinic_c12_dp.yaml", @@ -33,7 +31,7 @@ "test_external_C12_2x2.yaml", ] -JENKINS_CONFIGS_DIR = os.path.join(dirname, "../../../.jenkins/driver_configs/") + TESTED_JENKINS_CONFIGS: List[str] = [ "baroclinic_c48_6ranks_dycore_only.yaml", "baroclinic_c192_6ranks.yaml", @@ -62,7 +60,7 @@ ], ) def test_all_configs_tested_or_excluded( - config_dir: str, tested_configs: List[str], excluded_configs: List[str] + config_dir: Path, tested_configs: List[str], excluded_configs: List[str] ): """ If any configs are not tested or excluded, add them to TESTED_CONFIGS or @@ -85,8 +83,8 @@ def test_all_configs_tested_or_excluded( pytest.param(JENKINS_CONFIGS_DIR, TESTED_JENKINS_CONFIGS), ], ) -def test_example_config_can_initialize(path: str, file_list: List[str]): +def test_example_config_can_initialize(path: Path, file_list: List[str]): for file_name in file_list: - with open(os.path.join(path, file_name), "r") as f: + with open(path / file_name, "r") as f: config = DriverConfig.from_dict(yaml.safe_load(f)) assert isinstance(config, DriverConfig) diff --git a/tests/main/driver/test_restart_fortran.py b/tests/main/driver/test_restart_fortran.py index 3821d20b0..2e539a77d 100644 --- a/tests/main/driver/test_restart_fortran.py +++ b/tests/main/driver/test_restart_fortran.py @@ -1,5 +1,3 @@ -import os - import numpy as np import xarray as xr @@ -14,10 +12,7 @@ ) from pace import FortranRestartInit, GeneratedGridConfig from pySHiELD import PHYSICS_PACKAGES - - -DIR = os.path.dirname(os.path.abspath(__file__)) -PACE_DIR = os.path.join(DIR, "../../../") +from tests.paths import REPO_ROOT def test_state_from_fortran_restart(): @@ -42,10 +37,10 @@ def test_state_from_fortran_restart(): ) quantity_factory = QuantityFactory.from_backend(sizer=sizer, backend="numpy") - restart_dir = os.path.join(PACE_DIR, "tests/main/data/c12_restart") + restart_dir = REPO_ROOT / "tests" / "main" / "data" / "c12_restart" (damping_coefficients, driver_grid_data, grid_data,) = GeneratedGridConfig( - restart_path=restart_dir, eta_file=restart_dir + "/fv_core.res.nc" + restart_path=restart_dir, eta_file=restart_dir / "fv_core.res.nc" ).get_grid(quantity_factory, null_communicator) restart_config = FortranRestartInit(path=restart_dir) @@ -57,7 +52,7 @@ def test_state_from_fortran_restart(): grid_data=grid_data, schemes=[PHYSICS_PACKAGES["GFS_microphysics"]], ) - ds = xr.open_dataset(os.path.join(restart_dir, "fv_core.res.tile1.nc")) + ds = xr.open_dataset(restart_dir / "fv_core.res.tile1.nc") np.testing.assert_array_equal( ds["u"].values[0, :].transpose(2, 1, 0), driver_state.dycore_state.u.view[:] ) diff --git a/tests/main/driver/test_restart_serial.py b/tests/main/driver/test_restart_serial.py index 144abab13..654149809 100644 --- a/tests/main/driver/test_restart_serial.py +++ b/tests/main/driver/test_restart_serial.py @@ -1,6 +1,7 @@ import os import shutil from datetime import datetime +from pathlib import Path import numpy as np import xarray as xr @@ -23,9 +24,7 @@ RestartConfig, ) from pySHiELD import PHYSICS_PACKAGES - - -DIR = os.path.dirname(os.path.abspath(__file__)) +from tests.paths import EXAMPLE_CONFIGS_DIR class NullCommConfig(CreatesComm): @@ -50,13 +49,7 @@ def test_default_save_restart(): def test_restart_save_to_disk(): try: - with open( - os.path.join( - DIR, - "../../../examples/configs/baroclinic_c12_write_restart.yaml", - ), - "r", - ) as f: + with open(EXAMPLE_CONFIGS_DIR / "baroclinic_c12_write_restart.yaml", "r") as f: driver_config = DriverConfig.from_dict(yaml.safe_load(f)) backend = "numpy" mpi_comm = NullComm(rank=0, total_ranks=6, fill_value=0.0) @@ -74,7 +67,7 @@ def test_restart_save_to_disk(): ) quantity_factory = QuantityFactory.from_backend(sizer=sizer, backend=backend) - eta_file = driver_config.grid_config.config.eta_file + eta_file = Path(driver_config.grid_config.config.eta_file) (damping_coefficients, driver_grid_data, grid_data,) = GeneratedGridConfig( eta_file=eta_file ).get_grid(quantity_factory, communicator) @@ -98,7 +91,7 @@ def test_restart_save_to_disk(): ) restart_dycore = xr.open_dataset( - f"RESTART/restart_dycore_state_{mpi_comm.rank}.nc" + Path("RESTART") / f"restart_dycore_state_{mpi_comm.rank}.nc" ) for var in driver_state.dycore_state.__dict__.keys(): if isinstance(driver_state.dycore_state.__dict__[var], Quantity): @@ -116,7 +109,7 @@ def test_restart_save_to_disk(): # TODO: the physics state isn't actually needed in the restart folders as # all prognostic state is in dycore state, we could refactor it out restart_physics = xr.open_dataset( - f"RESTART/restart_physics_state_{mpi_comm.rank}.nc" + Path("RESTART") / f"restart_physics_state_{mpi_comm.rank}.nc" ) for var in driver_state.physics_state.__dict__.keys(): if isinstance( @@ -134,7 +127,7 @@ def test_restart_save_to_disk(): should not be in physics restart file" ) # test we can use the saved driver config in the restart to load it - with open("RESTART/restart.yaml", "r") as f: + with open(Path("RESTART") / "restart.yaml", "r") as f: restart_config = DriverConfig.from_dict(yaml.safe_load(f)) ( diff --git a/tests/main/fv3core/test_cartesian_grid.py b/tests/main/fv3core/test_cartesian_grid.py index 0c5b2f62f..349edacd4 100644 --- a/tests/main/fv3core/test_cartesian_grid.py +++ b/tests/main/fv3core/test_cartesian_grid.py @@ -1,3 +1,5 @@ +from pathlib import Path + import numpy as np import pytest @@ -35,7 +37,7 @@ def test_cartesian_grid_generation( dx_const=dx_const, dy_const=dy_const, deglat=deglat, - eta_file="tests/main/input/eta79.nc", + eta_file=Path("tests/main/input/eta79.nc"), ) assert np.all(grid_generator.lat_agrid.data == deglat * PI / 180.0) assert np.all(grid_generator.lon_agrid.data == 0.0) diff --git a/tests/main/fv3core/test_dycore_call.py b/tests/main/fv3core/test_dycore_call.py index ee13e70d2..ce597137e 100644 --- a/tests/main/fv3core/test_dycore_call.py +++ b/tests/main/fv3core/test_dycore_call.py @@ -1,7 +1,7 @@ -import os import unittest.mock from dataclasses import fields from datetime import timedelta +from pathlib import Path from typing import Tuple import pyFV3.initialization.analytic_init as ai @@ -25,9 +25,6 @@ from pyFV3 import DycoreState, DynamicalCore, DynamicalCoreConfig -DIR = os.path.abspath(os.path.dirname(__file__)) - - def setup_dycore() -> Tuple[DynamicalCore, DycoreState, Timer]: backend = "numpy" config = DynamicalCoreConfig( @@ -100,7 +97,7 @@ def setup_dycore() -> Tuple[DynamicalCore, DycoreState, Timer]: sizer=sizer, comm=communicator ) quantity_factory = QuantityFactory.from_backend(sizer=sizer, backend=backend) - eta_file = "tests/main/input/eta79.nc" + eta_file = Path("tests/main/input/eta79.nc") metric_terms = MetricTerms( quantity_factory=quantity_factory, communicator=communicator, diff --git a/tests/main/physics/test_integration.py b/tests/main/physics/test_integration.py index dfd38af1b..2444e3941 100644 --- a/tests/main/physics/test_integration.py +++ b/tests/main/physics/test_integration.py @@ -1,5 +1,6 @@ from dataclasses import fields from datetime import timedelta +from pathlib import Path import numpy as np @@ -71,7 +72,7 @@ def setup_physics(): metric_terms = MetricTerms( quantity_factory=quantity_factory, communicator=communicator, - eta_file="tests/main/input/eta79.nc", + eta_file=Path("tests/main/input/eta79.nc"), ) grid_data = GridData.new_from_metric_terms(metric_terms) physics = Physics( diff --git a/tests/main/test_grid_init.py b/tests/main/test_grid_init.py index 9489cd3bb..b0510c9d1 100644 --- a/tests/main/test_grid_init.py +++ b/tests/main/test_grid_init.py @@ -1,3 +1,5 @@ +from pathlib import Path + import numpy as np import pytest @@ -37,7 +39,7 @@ def test_grid_init_not_decomposition_dependent(rank: int): halo updates for their values in the compute domain. """ nx_tile, ny_tile, nz = 48, 48, 79 - eta_file = "tests/main/input/eta79.nc" + eta_file = Path("tests/main/input/eta79.nc") metric_terms_1by1 = MetricTerms( quantity_factory=get_quantity_factory( layout=(1, 1), nx_tile=nx_tile, ny_tile=ny_tile, nz=nz diff --git a/tests/mpi/ext_grid/test_external_grid.py b/tests/mpi/ext_grid/test_external_grid.py index d4dbc0e54..53f8e8fe3 100644 --- a/tests/mpi/ext_grid/test_external_grid.py +++ b/tests/mpi/ext_grid/test_external_grid.py @@ -1,5 +1,4 @@ import math -import os import numpy as np import pytest @@ -15,12 +14,9 @@ from ndsl.comm.partitioner import get_tile_number from ndsl.constants import PI, RADIUS, X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM from pace import Driver, DriverConfig +from tests.paths import EXAMPLE_CONFIGS_DIR, REPO_ROOT -DIR = os.path.dirname(os.path.abspath(__file__)) -TEST_CONFIGS_DIR = os.path.join(DIR, "../../../examples/configs/") -TEST_DATA_DIR = os.path.join(DIR, "../../../test_input/") - TEST_CONFIG_FILE_RANKS = [ ("test_external_C12_1x1.yaml", 6), ("test_external_C12_2x2.yaml", 24), @@ -80,10 +76,7 @@ def test_extgrid_equals_generated(config_file_path: str, ranks: int): side = int(math.sqrt(size // 6)) cube_comm = get_cube_comm(layout=(side, side), comm=comm) - with open( - os.path.join(TEST_CONFIGS_DIR, config_file_path), - "r", - ) as ext_f: + with open(EXAMPLE_CONFIGS_DIR / config_file_path, "r") as ext_f: ext_config = yaml.safe_load(ext_f) ext_driver_config = DriverConfig.from_dict(ext_config) @@ -91,7 +84,7 @@ def test_extgrid_equals_generated(config_file_path: str, ranks: int): tile_num = get_tile_num(cube_comm) tile_file = TILE_FILE_BASE_NAME + str(tile_num) + ".nc" - ds = xr.open_dataset(os.path.join(TEST_DATA_DIR, tile_file)) + ds = xr.open_dataset(REPO_ROOT / "test_input" / tile_file) lon = ds.x.values lat = ds.y.values dx = ds.dx.values @@ -188,7 +181,7 @@ def test_extgrid_equals_generated(config_file_path: str, ranks: int): print(diffs) - assert not errors, "errors occured in 2x2:\n{}".format("\n".join(errors)) + assert not errors, "errors occurred in 2x2:\n{}".format("\n".join(errors)) surface_area_true = 4 * PI * (RADIUS ** 2) diff --git a/tests/paths.py b/tests/paths.py new file mode 100644 index 000000000..f3b326b68 --- /dev/null +++ b/tests/paths.py @@ -0,0 +1,7 @@ +from pathlib import Path + + +REPO_ROOT = Path(__file__).parent.parent + +EXAMPLE_CONFIGS_DIR = REPO_ROOT / "examples" / "configs" +JENKINS_CONFIGS_DIR = REPO_ROOT / ".jenkins" / "driver_configs" diff --git a/tests/savepoint/conftest.py b/tests/savepoint/conftest.py index 94760f729..b7ebdb7ac 100644 --- a/tests/savepoint/conftest.py +++ b/tests/savepoint/conftest.py @@ -1,11 +1,8 @@ -import os +from pathlib import Path import pytest -DIR = os.path.dirname(os.path.realpath(__file__)) - - @pytest.fixture() def backend(pytestconfig): backend = pytestconfig.getoption("backend") @@ -22,7 +19,7 @@ def data_path(pytestconfig): def threshold_path(pytestconfig): threshold_path = pytestconfig.getoption("threshold_path") if threshold_path is None: - threshold_path = os.path.join(DIR, "thresholds") + threshold_path = Path(__file__).parent / "thresholds" return threshold_path diff --git a/tests/savepoint/test_checkpoints.py b/tests/savepoint/test_checkpoints.py index 28388d0e4..2357e164f 100644 --- a/tests/savepoint/test_checkpoints.py +++ b/tests/savepoint/test_checkpoints.py @@ -1,6 +1,6 @@ import dataclasses -import os from datetime import timedelta +from pathlib import Path from typing import List, Tuple import dacite @@ -35,10 +35,8 @@ from pyFV3.testing import TranslateFVDynamics -def get_grid(data_path: str, rank: int, layout: Tuple[int, int], backend: str) -> Grid: - ds_grid: xr.Dataset = xr.open_dataset(os.path.join(data_path, "Grid-Info.nc")).isel( - savepoint=0 - ) +def get_grid(data_path: Path, rank: int, layout: Tuple[int, int], backend: str) -> Grid: + ds_grid: xr.Dataset = xr.open_dataset(data_path / "Grid-Info.nc").isel(savepoint=0) grid = TranslateGrid( dataset_to_dict(ds_grid.isel(rank=rank)), rank=rank, @@ -64,11 +62,11 @@ def new_state(self) -> Tuple[DycoreState, GridData]: def test_fv_dynamics( - backend: str, data_path: str, calibrate_thresholds: bool, threshold_path: str + backend: str, data_path: Path, calibrate_thresholds: bool, threshold_path: Path ): print("start test call") - namelist = Namelist.from_f90nml(f90nml.read(os.path.join(data_path, "input.nml"))) - threshold_filename = os.path.join(threshold_path, "fv_dynamics.yaml") + namelist = Namelist.from_f90nml(f90nml.read(data_path / "input.nml")) + threshold_filename = threshold_path / "fv_dynamics.yaml" communicator = CubedSphereCommunicator( comm=MPIComm(), partitioner=CubedSpherePartitioner( @@ -106,7 +104,7 @@ def test_fv_dynamics( translate = TranslateFVDynamics( grid=grid, namelist=namelist, stencil_factory=stencil_factory ) - ds = xr.open_dataset(os.path.join(data_path, "FVDynamics-In.nc")).sel( + ds = xr.open_dataset(data_path / "FVDynamics-In.nc").sel( savepoint=0, rank=communicator.rank ) dycore_config = DynamicalCoreConfig.from_namelist(namelist) From a47e440180fd2c07b4a728e1351a699dbd1cb974 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Thu, 12 Jun 2025 15:35:31 +0200 Subject: [PATCH 29/75] Duplicate of pace/comm.py (#126) Removes `pace/config/comm.py` in favor of `pace/comm.py`, which look like duplicates, where `pace/comm.py` is the one actually used and developed. Also deleting `pace/config/__init__.py` since it was the only file left in the folder. Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- pace/configs/__init__.py | 0 pace/configs/comm.py | 182 --------------------------------------- 2 files changed, 182 deletions(-) delete mode 100644 pace/configs/__init__.py delete mode 100644 pace/configs/comm.py diff --git a/pace/configs/__init__.py b/pace/configs/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/pace/configs/comm.py b/pace/configs/comm.py deleted file mode 100644 index 06f60acfe..000000000 --- a/pace/configs/comm.py +++ /dev/null @@ -1,182 +0,0 @@ -import abc -import dataclasses -import os -from typing import Any, ClassVar, List - -import dacite - -from ndsl import MPIComm, NullComm -from ndsl.comm import CachingCommReader, CachingCommWriter - - -class CreatesComm(abc.ABC): - """ - Retrieves and does cleanup for a mpi4py-style Comm object. - """ - - @abc.abstractmethod - def get_comm(self) -> Any: - """ - Get an mpi4py-style Comm object. - """ - ... - - @abc.abstractmethod - def cleanup(self, comm): - """ - Perform any operations that must occur before exiting. - """ - ... - - -@dataclasses.dataclass(frozen=True) -class CommConfig: - """ - Configuration for a mpi4py-style Comm object. - - Attributes: - config: type-specific configuration - type: type of Comm object to create, should be one of "mpi" (default), - "write", "read", or "null_comm" - """ - - config: CreatesComm - type: str = "mpi" - registry: ClassVar = {} - - @classmethod - def register(cls, type_name): - def register_func(func): - cls.registry[type_name] = func - return func - - return register_func - - def get_comm(self): - return self.config.get_comm() - - def cleanup(self, comm): - return self.config.cleanup(comm) - - @classmethod - def from_dict(cls, config: dict): - config.setdefault("config", {}) - comm_type = config.get("type", "mpi") - if comm_type not in cls.registry: - raise ValueError(f"Unknown comm type: {comm_type}") - else: - creates_comm: CreatesComm = dacite.from_dict( - data_class=cls.registry[comm_type], - data=config["config"], - config=dacite.Config(strict=True), - ) - return cls(config=creates_comm, type=comm_type) - - -@CommConfig.register("mpi") -@dataclasses.dataclass -class MPICommConfig(CreatesComm): - """ - Configuration for a true mpi4py Comm object. - """ - - def get_comm(self): - return MPIComm() - - def cleanup(self, comm): - pass - - -@CommConfig.register("null_comm") -@dataclasses.dataclass -class NullCommConfig(CreatesComm): - """ - Configuration for a NullComm object which does not perform halo updates, - instead filling the halos with a constant value. - - Generally used to test whether the code crashes while running in serial when - correctness of the answer is not important. - - Attributes: - rank: rank of the comm - total_ranks: the total number of ranks for the comm to pretend to have - fill_value: the value to fill the halos with - """ - - rank: int - total_ranks: int - fill_value: float - - def get_comm(self): - return NullComm( - rank=self.rank, total_ranks=self.total_ranks, fill_value=self.fill_value - ) - - def cleanup(self, comm): - pass - - -@CommConfig.register("write") -@dataclasses.dataclass -class WriterCommConfig(CreatesComm): - """ - Configuration for a CachingCommWriter object. - - This object will wrap a real mpi4py comm object, but will cache the - communication between the ranks in the comm and write the result to disk - at cleanup. - - This data can later be read in a run using a ReaderCommConfig. - - Attributes: - ranks: which ranks to write data for - path: directory to write data to - """ - - ranks: List[int] - path: str = "." - - def get_comm(self) -> CachingCommWriter: - underlying = MPICommConfig().get_comm() - if underlying.Get_rank() in self.ranks: - return CachingCommWriter(underlying) - else: - return underlying - - def cleanup(self, comm: CachingCommWriter): - os.makedirs(self.path, exist_ok=True) - if comm.Get_rank() in self.ranks: - with open( - os.path.join(self.path, f"comm_{comm.Get_rank()}.pkl"), "wb" - ) as f: - comm.dump(f) - - -@CommConfig.register("read") -@dataclasses.dataclass -class ReaderCommConfig(CreatesComm): - """ - Configuration for a CachingCommReader object. - - This object reads data cached by a WriterCommConfig, and will perform - identical communication as was written by that writer, played back - in the same order. - - This should generally be used within an identical configuration as was used by - the WriterCommConfig, and must be used with a configuration that will result - in an identical communication pattern. - - Attributes: - rank: rank to read data for - path: directory to read data from - """ - - rank: int - path: str = "." - - def get_comm(self) -> CachingCommReader: - with open(os.path.join(self.path, f"comm_{self.rank}.pkl"), "rb") as f: - return CachingCommReader.load(f) - - def cleanup(self, comm: CachingCommWriter): - pass From c710c1e8770325ca55c9a6f49e3cc7093c490c50 Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Thu, 10 Jul 2025 14:42:57 -0400 Subject: [PATCH 30/75] Fix: Updating external grid read-in method to match output from FRE-NCTools (#127) * Updating external grid read-in method to match output from FRENCTools * Updating external grid read-in method to take correct data chunk from file per rank * Using the correct order of dims and indices for chunking data, instead of previous method for external grid data read in * Changing external grid data test configs data file names to match number of grid points used * Added check for ordering of input grid data file * Fixing base file name in test_external_grid * Adding annotations regarding the need to stride input grid data due to supergrid format --- examples/configs/test_external_C12_1x1.yaml | 6 +- examples/configs/test_external_C12_2x2.yaml | 6 +- pace/grid.py | 26 ++++--- tests/mpi/ext_grid/test_external_grid.py | 78 ++++----------------- 4 files changed, 37 insertions(+), 79 deletions(-) diff --git a/examples/configs/test_external_C12_1x1.yaml b/examples/configs/test_external_C12_1x1.yaml index fb615b4ea..77bbedd52 100644 --- a/examples/configs/test_external_C12_1x1.yaml +++ b/examples/configs/test_external_C12_1x1.yaml @@ -9,8 +9,8 @@ grid_config: type: external config: grid_type: 0 - grid_file_path: "../../../test_input/C12.tile" - eta_file: '../../../tests/main/input/eta79.nc' + grid_file_path: "tests/main/input/C12.tile" + eta_file: 'tests/main/input/eta79.nc' initialization: type: analytic config: @@ -21,7 +21,7 @@ performance_config: nx_tile: 12 nz: 79 dt_atmos: 225 -minutes: 15 +seconds: 225 layout: - 1 - 1 diff --git a/examples/configs/test_external_C12_2x2.yaml b/examples/configs/test_external_C12_2x2.yaml index d07d142bf..92ca72fc0 100644 --- a/examples/configs/test_external_C12_2x2.yaml +++ b/examples/configs/test_external_C12_2x2.yaml @@ -9,8 +9,8 @@ grid_config: type: external config: grid_type: 0 - grid_file_path: "../../../test_input/C12.tile" - eta_file: '../../../tests/main/input/eta79.nc' + grid_file_path: "tests/main/input/C12.tile" + eta_file: 'tests/main/input/eta79.nc' initialization: type: analytic config: @@ -21,7 +21,7 @@ performance_config: nx_tile: 12 nz: 79 dt_atmos: 225 -minutes: 15 +seconds: 225 layout: - 2 - 2 diff --git a/pace/grid.py b/pace/grid.py index 9abf3b2cf..29c432d53 100644 --- a/pace/grid.py +++ b/pace/grid.py @@ -198,11 +198,17 @@ def get_grid( class ExternalNetcdfGridConfig(GridInitializer): """ Configuration for grid initialized from external data. - Input is from tile files generated by FRE-NCtools methods + Input is from tile files generated by FRE-NCtools methods. + The output from FRE-NCTools is in the form of supergrid + data, and so the longitude and latitude values must be + strided in order to only collect the D-grid values for + input. + The ExternalNetcdfGridConfig get_grid member method calls the MetricTerms class method from_generated which generates an object of MetricTerms to be used to generate the damping_coefficients, driver_grid_data, and grid_data variables + We do not read in the dx, dy, or area values as there may be inconsistencies in the constants used during calculation of the input data and the model use. An example of two adjacent finite @@ -231,7 +237,7 @@ def get_grid( ) -> Tuple[DampingCoefficients, DriverGridData, GridData]: ndsl_log.info("Using external grid data") - # ToDo: refactor when grid_type is an enum + # TODO: refactor when grid_type is an enum if self.grid_type <= 3: tile_num = ( get_tile_index(communicator.rank, communicator.partitioner.total_ranks) @@ -242,15 +248,19 @@ def get_grid( tile_file = self.grid_file_path ds = xr.open_dataset(tile_file) - lon = ds.x.values - lat = ds.y.values - npx = ds.nxp.values.size - npy = ds.nyp.values.size + if "ordering" in ds and ds.ordering.values[0] == "row_major": + lon = ds.x.values[::2, ::2] + lat = ds.y.values[::2, ::2] + else: + lon = ds.x.values[::2, ::2].T + lat = ds.y.values[::2, ::2].T + npx = ds.nx.values.size / 2 + 1 + npy = ds.ny.values.size / 2 + 1 subtile_slice_grid = communicator.partitioner.tile.subtile_slice( rank=communicator.rank, - global_dims=[Y_INTERFACE_DIM, X_INTERFACE_DIM], - global_extent=(npy, npx), + global_dims=[X_INTERFACE_DIM, Y_INTERFACE_DIM], + global_extent=(npx, npy), overlap=True, ) diff --git a/tests/mpi/ext_grid/test_external_grid.py b/tests/mpi/ext_grid/test_external_grid.py index 53f8e8fe3..f2050c48c 100644 --- a/tests/mpi/ext_grid/test_external_grid.py +++ b/tests/mpi/ext_grid/test_external_grid.py @@ -12,7 +12,7 @@ TilePartitioner, ) from ndsl.comm.partitioner import get_tile_number -from ndsl.constants import PI, RADIUS, X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM +from ndsl.constants import PI, RADIUS, X_INTERFACE_DIM, Y_INTERFACE_DIM from pace import Driver, DriverConfig from tests.paths import EXAMPLE_CONFIGS_DIR, REPO_ROOT @@ -84,42 +84,20 @@ def test_extgrid_equals_generated(config_file_path: str, ranks: int): tile_num = get_tile_num(cube_comm) tile_file = TILE_FILE_BASE_NAME + str(tile_num) + ".nc" - ds = xr.open_dataset(REPO_ROOT / "test_input" / tile_file) - lon = ds.x.values - lat = ds.y.values - dx = ds.dx.values - dy = ds.dy.values - area = ds.area.values - nx = ds.nx.values.size - ny = ds.ny.values.size - npx = ds.nxp.values.size - npy = ds.nyp.values.size + ds = xr.open_dataset(REPO_ROOT / "tests/main/input" / tile_file) + lon = ds.x.values[::2, ::2].T + lat = ds.y.values[::2, ::2].T + nx = ds.nx.values.size / 2 + ny = ds.ny.values.size / 2 + npx = nx + 1 + npy = ny + 1 - subtile_slice_grid = cube_comm.partitioner.tile.subtile_slice( - rank=cube_comm.rank, - global_dims=[Y_INTERFACE_DIM, X_INTERFACE_DIM], - global_extent=(npy, npx), - overlap=True, - ) + print(f"nx = {npx}, ny = {npy}") - subtile_slice_dx = cube_comm.partitioner.tile.subtile_slice( - rank=cube_comm.rank, - global_dims=[Y_INTERFACE_DIM, X_DIM], - global_extent=(npy, nx), - overlap=True, - ) - - subtile_slice_dy = cube_comm.partitioner.tile.subtile_slice( - rank=cube_comm.rank, - global_dims=[Y_DIM, X_INTERFACE_DIM], - global_extent=(ny, npx), - overlap=True, - ) - - subtile_slice_area = cube_comm.partitioner.tile.subtile_slice( + subtile_slice_grid = cube_comm.partitioner.tile.subtile_slice( rank=cube_comm.rank, - global_dims=[Y_DIM, X_DIM], - global_extent=(ny, nx), + global_dims=[X_INTERFACE_DIM, Y_INTERFACE_DIM], + global_extent=(npx, npy), overlap=True, ) @@ -149,39 +127,9 @@ def test_extgrid_equals_generated(config_file_path: str, ranks: int): ) / np.amax(lat_rad[subtile_slice_grid]) diffs.append(f"Lat maximum relative error = {diff_lat}") - if not np.isclose( - ext_driver.state.grid_data.dy.view[:, :], dx[subtile_slice_dx] - ).all(): - errors.append("dx data mismatch") - - diff_dx = np.amax( - ext_driver.state.grid_data.dy.view[:, :] - dx[subtile_slice_dx] - ) / np.amax(dx[subtile_slice_dx]) - diffs.append(f"dx maximum relative error = {diff_dx}") - - if not np.isclose( - ext_driver.state.grid_data.dx.view[:, :], dy[subtile_slice_dy] - ).all(): - errors.append("dy data mismatch") - - diff_dy = np.amax( - ext_driver.state.grid_data.dx.view[:, :] - dy[subtile_slice_dy] - ) / np.amax(dy[subtile_slice_dy]) - diffs.append(f"dy maximum relative error = {diff_dy}") - - if not np.isclose( - ext_driver.state.grid_data.area.view[:, :], area[subtile_slice_area] - ).all(): - errors.append("area data mismatch") - - diff_area = np.amax( - ext_driver.state.grid_data.area.view[:, :] - area[subtile_slice_area] - ) / np.amax(area[subtile_slice_area]) - diffs.append(f"Area maximum relative error = {diff_area}") - print(diffs) - assert not errors, "errors occurred in 2x2:\n{}".format("\n".join(errors)) + assert not errors, "errors occurred in:\n{}".format("\n".join(errors)) surface_area_true = 4 * PI * (RADIUS ** 2) From e902a3843244746734cf5598cd4b3294de545aad Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Thu, 17 Jul 2025 10:29:13 -0400 Subject: [PATCH 31/75] Use of `pyproject.toml` and move to minimal `setup.py` for modernization and introduction of Baroclinic Steady State Test Case (#123) * Addition of metadata and configuration information to pyproject.toml, and minimal setup.py * Linting * Adding conditional statement for checking of local clone of dependency * Linting * Reverting back to using find_pkg in setup.py * Updating author in pyproject.toml * Intermediate steps for refactor of pyFV3 and pySHiELD * Bringing in changes from PR 129 Co-authored-by: Janice Kim Co-authored-by: Frank Malatino <142349306+fmalatino@users.noreply.github.com> * Confirming tests Co-authored-by: Janice Kim Co-authored-by: Frank Malatino <142349306+fmalatino@users.noreply.github.com> * Changing backend of barolinic_c48_no_out.yaml * Adding baroclinic_c48_no_out.yaml to excluded configs in test_example_configs * Adding baroclinic_c48_no_out.yaml to workflow * Adding 54 ranks to be used in workflow * Reducing number of ranks for workflow run to 6 * Removing references to support for Python 3.9-3.10 in pyproject.toml * Removing more references to old Python version support * Removing setup.cfg * Setting black target version to Python 3.11 * New linting tools * Updating versions of tools contained in pyproject.toml and pre-commit-config * Reverting changes to fv_dynamics thresholds * Adding Flake8-pyproject as an additional dependency in pre-commit-config.yaml * Updating configs in examples/notebooks to use 'baroclinic_instability' over 'baroclinic' --------- Co-authored-by: Janice Kim --- .circleci/config.yml | 6 +- .github/dependabot.yml | 12 +- .github/workflows/main_unit_tests.yaml | 76 ++++---- .../baroclinic_c192_54ranks.yaml | 2 +- .../baroclinic_c192_6ranks.yaml | 4 +- .../baroclinic_c48_6ranks_dycore_only.yaml | 2 +- .pre-commit-config.yaml | 79 +++++---- .readthedocs.yaml | 6 +- NDSL | 2 +- README.md | 12 ++ examples/configs/README.md | 6 +- examples/configs/analytic_test.yaml | 4 +- examples/configs/baroclinic_c12.yaml | 6 +- .../configs/baroclinic_c12_comm_read.yaml | 4 +- .../configs/baroclinic_c12_comm_write.yaml | 4 +- examples/configs/baroclinic_c12_dp.yaml | 4 +- .../baroclinic_c12_explicit_physics.yaml | 4 +- .../baroclinic_c12_from_serialbox.yaml | 2 +- .../configs/baroclinic_c12_null_comm.yaml | 4 +- examples/configs/baroclinic_c12_orch_cpu.yaml | 4 +- .../configs/baroclinic_c12_write_restart.yaml | 6 +- examples/configs/baroclinic_c48_no_out.yaml | 81 +++++++++ examples/configs/test_external_C12_1x1.yaml | 4 +- examples/configs/test_external_C12_2x2.yaml | 4 +- .../configs/tropical_read_restart_fortran.yml | 2 +- examples/notebooks/baroclinic_c20.yaml | 4 +- examples/notebooks/driver_write_config.yaml | 10 +- examples/notebooks/functions.py | 4 +- examples/notebooks/serial_debugging.ipynb | 2 +- examples/notebooks/stencil_definition.ipynb | 8 +- pace/diagnostics.py | 11 +- pace/driver.py | 38 ++-- pace/grid.py | 6 +- pace/initialization.py | 31 ++-- pace/registry.py | 4 +- pace/safety_checks.py | 2 +- pace/state.py | 4 +- pyFV3 | 2 +- pySHiELD | 2 +- pyproject.toml | 79 ++++++++- setup.cfg | 34 ---- setup.py | 61 +------ tests/main/driver/test_analytic_init.py | 16 +- tests/main/driver/test_diagnostics_config.py | 2 +- tests/main/driver/test_example_configs.py | 1 + tests/main/driver/test_restart_fortran.py | 8 +- tests/main/driver/test_restart_serial.py | 13 +- tests/main/fv3core/test_config.py | 12 +- tests/main/fv3core/test_dycore_baroclinic.py | 164 ++++++++++++++++++ tests/main/fv3core/test_dycore_call.py | 8 +- tests/main/fv3core/test_init_from_geos.py | 4 +- .../main/fv3core/test_selective_validation.py | 2 +- tests/main/physics/test_integration.py | 2 +- tests/mpi/ext_grid/test_external_grid.py | 2 +- tests/mpi/restart/test_restart.py | 8 +- tests/mpi/test_grid_init.py | 4 +- tests/savepoint/test_checkpoints.py | 4 +- tests/savepoint/thresholds/fv_dynamics.yaml | 1 + tests/savepoint/translate/translate_driver.py | 8 +- 59 files changed, 609 insertions(+), 292 deletions(-) create mode 100644 examples/configs/baroclinic_c48_no_out.yaml delete mode 100644 setup.cfg create mode 100644 tests/main/fv3core/test_dycore_baroclinic.py diff --git a/.circleci/config.yml b/.circleci/config.yml index ebff7167a..dd1ff73d9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -133,7 +133,7 @@ jobs: lint: docker: - - image: cimg/python:3.8 + - image: cimg/python:3.8 resource_class: small steps: - checkout @@ -158,7 +158,7 @@ jobs: doctest: docker: - - image: cimg/python:3.8 + - image: cimg/python:3.8 steps: - checkout - run: @@ -470,7 +470,7 @@ jobs: push_docs: docker: - - image: cimg/python:3.8 + - image: cimg/python:3.8 steps: - checkout - run: diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 8acdddf3d..85aa95013 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,8 +1,8 @@ version: 2 updates: -- package-ecosystem: gitsubmodule - directory: "/" - schedule: - interval: daily - time: "13:00" - open-pull-requests-limit: 10 + - package-ecosystem: gitsubmodule + directory: "/" + schedule: + interval: daily + time: "13:00" + open-pull-requests-limit: 10 diff --git a/.github/workflows/main_unit_tests.yaml b/.github/workflows/main_unit_tests.yaml index b98df73c6..b7a80981c 100644 --- a/.github/workflows/main_unit_tests.yaml +++ b/.github/workflows/main_unit_tests.yaml @@ -23,48 +23,48 @@ jobs: container: image: ghcr.io/noaa-gfdl/miniforge:mpich steps: - - name: "External trigger: Checkout pace/develop" - if: ${{ inputs.component_trigger }} - uses: actions/checkout@v4 - with: - submodules: 'recursive' - repository: NOAA-GFDL/pace - path: pace - ref: develop + - name: "External trigger: Checkout pace/develop" + if: ${{ inputs.component_trigger }} + uses: actions/checkout@v4 + with: + submodules: 'recursive' + repository: NOAA-GFDL/pace + path: pace + ref: develop - - name: "External trigger: Remove existing component in pace/develop" - if: ${{ inputs.component_trigger }} - run: rm -rf ${GITHUB_WORKSPACE}/pace/${{inputs.component_name}} + - name: "External trigger: Remove existing component in pace/develop" + if: ${{ inputs.component_trigger }} + run: rm -rf ${GITHUB_WORKSPACE}/pace/${{inputs.component_name}} - - name: Checkout out hash that triggered CI - uses: actions/checkout@v4 - with: - submodules: 'recursive' - path: pace/${{inputs.component_name}} + - name: Checkout out hash that triggered CI + uses: actions/checkout@v4 + with: + submodules: 'recursive' + path: pace/${{inputs.component_name}} - - name: Install packages - run: | - cd ${GITHUB_WORKSPACE}/pace - pip install .[test] + - name: Install packages + run: | + cd ${GITHUB_WORKSPACE}/pace + pip install .[test] - - name: Print versions - run: | - python --version - pip --version - pip list + - name: Print versions + run: | + python --version + pip --version + pip list - - name: Prepare input files - run: | - cd ${GITHUB_WORKSPACE}/pace - mkdir tests/main/input - python examples/generate_eta_files.py tests/main/input + - name: Prepare input files + run: | + cd ${GITHUB_WORKSPACE}/pace + mkdir tests/main/input + python examples/generate_eta_files.py tests/main/input - - name: Run tests - run: | - cd ${GITHUB_WORKSPACE}/pace - python -m pytest -x tests/main + - name: Run tests + run: | + cd ${GITHUB_WORKSPACE}/pace + python -m pytest -x tests/main - - name: Run baroclinic test case - run: | - cd ${GITHUB_WORKSPACE}/pace - mpiexec -np 6 --oversubscribe python -m pace.run examples/configs/baroclinic_c12.yaml + - name: Run baroclinic test case + run: | + cd ${GITHUB_WORKSPACE}/pace + mpiexec -np 6 --oversubscribe python -m pace.run examples/configs/baroclinic_c48_no_out.yaml diff --git a/.jenkins/driver_configs/baroclinic_c192_54ranks.yaml b/.jenkins/driver_configs/baroclinic_c192_54ranks.yaml index 5c4238630..111695d41 100644 --- a/.jenkins/driver_configs/baroclinic_c192_54ranks.yaml +++ b/.jenkins/driver_configs/baroclinic_c192_54ranks.yaml @@ -8,7 +8,7 @@ stencil_config: initialization: type: analytic config: - case: baroclinic + case: baroclinic_instability diagnostics_config: path: "output.zarr" names: diff --git a/.jenkins/driver_configs/baroclinic_c192_6ranks.yaml b/.jenkins/driver_configs/baroclinic_c192_6ranks.yaml index 8d17fb2da..0bc524468 100644 --- a/.jenkins/driver_configs/baroclinic_c192_6ranks.yaml +++ b/.jenkins/driver_configs/baroclinic_c192_6ranks.yaml @@ -8,7 +8,7 @@ stencil_config: initialization: type: analytic config: - case: baroclinic + case: baroclinic_instability diagnostics_config: path: "output.zarr" names: @@ -18,7 +18,7 @@ diagnostics_config: output_initial_state: true performance_config: collect_performance: true - experiment_name: c192_baroclinic + experiment_name: c192_baroclinic_instability nx_tile: 192 nz: 79 dt_atmos: 200 diff --git a/.jenkins/driver_configs/baroclinic_c48_6ranks_dycore_only.yaml b/.jenkins/driver_configs/baroclinic_c48_6ranks_dycore_only.yaml index e75372da6..6d7f3d866 100644 --- a/.jenkins/driver_configs/baroclinic_c48_6ranks_dycore_only.yaml +++ b/.jenkins/driver_configs/baroclinic_c48_6ranks_dycore_only.yaml @@ -11,7 +11,7 @@ stencil_config: initialization: type: analytic config: - case: baroclinicc + case: baroclinic_instability performance_config: collect_performance: false nx_tile: 48 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3994470d5..2c0511d7d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,47 +2,56 @@ default_language_version: python: python3 repos: -- repo: https://github.com/psf/black - rev: 20.8b1 + - repo: https://github.com/psf/black + rev: 25.1.0 hooks: - - id: black - additional_dependencies: ["click==8.0.4"] + - id: black + additional_dependencies: ["click==8.0.4"] -- repo: https://github.com/pre-commit/mirrors-isort - rev: v5.4.2 + - repo: https://github.com/pre-commit/mirrors-isort + rev: v5.10.1 hooks: - - id: isort - args: ["--profile", "black"] + - id: isort + args: ["--profile", "black"] -- repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.4.1 + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.17.0 hooks: - - id: mypy - additional_dependencies: [types-pyyaml] - name: mypy-pace - files: pace - args: [--config-file, setup.cfg] + - id: mypy + additional_dependencies: [types-pyyaml] + name: mypy-pace + files: pace + args: ["--config-file", "pyproject.toml"] -- repo: https://github.com/pre-commit/pre-commit-hooks - rev: v2.3.0 + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 hooks: - - id: check-toml - - id: check-yaml - - id: end-of-file-fixer - - id: trailing-whitespace -- repo: https://github.com/pycqa/flake8 - rev: 3.9.2 + - id: check-toml + - id: check-yaml + - id: end-of-file-fixer + - id: trailing-whitespace + - repo: https://github.com/pycqa/flake8 + rev: 7.3.0 hooks: - - id: flake8 - name: flake8 - language_version: python3 - args: [--config, setup.cfg] - exclude: | - (?x)^( - .*/__init__.py | - )$ - - id: flake8 - name: flake8 __init__.py files - files: "__init__.py" + - id: flake8 + name: flake8 + language_version: python3 + additional_dependencies: [Flake8-pyproject] + exclude: | + (?x)^( + .*/__init__.py | + )$ + - id: flake8 + name: flake8 __init__.py files + files: "__init__.py" # ignore unused import error in __init__.py files - args: ["--ignore=F401,E203", --config, setup.cfg] + additional_dependencies: [Flake8-pyproject] + + - repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks + rev: v2.15.0 + hooks: + - id: pretty-format-toml + args: [--autofix, --indent, "2"] + - id: pretty-format-yaml + args: [--autofix, --preserve-quotes, --indent, "2", --offset, "2"] + exclude: ^tests/savepoint/thresholds diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 87f7879c7..e20dfe23d 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -13,7 +13,7 @@ build: # Build documentation in the docs/ directory with Sphinx sphinx: - configuration: docs/conf.py + configuration: docs/conf.py # If using Sphinx, optionally build your docs in additional formats such as PDF # formats: @@ -21,5 +21,5 @@ sphinx: # Optionally declare the Python requirements required to build your docs python: - install: - - requirements: requirements_docs.txt + install: + - requirements: requirements_docs.txt diff --git a/NDSL b/NDSL index f287122c5..dafe55df5 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit f287122c5e3ca6aea942480253d2f357c16a40a7 +Subproject commit dafe55df54325232791e2833398cfc7df7512c6c diff --git a/README.md b/README.md index de67184fe..abb2e9e7a 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,18 @@ Inside of your pace `venv` or `conda` environment, install pace and its dependen pip install -e .[dev] ``` +To install editable versions of the submodules of Pace, use the `-e` flag followed by the name of the package (if editing the local version) or path to edited version of the submodule after base installation of Pace: + +```shell +pip install -e . +pip install -e NDSL +# pip install -e /path/to/edited/NDSL +pip install -e pyFV3 +# pip install -e /path/to/edited/pyFV3 +pip install -e pySHiELD +# pip install -e /path/to/edited/pySHiELD +``` + For running tests, we recommend to install pace with the `[test]` extra (avoid pulling other dev dependencies): ```shell diff --git a/examples/configs/README.md b/examples/configs/README.md index 3dabe43c1..56b61e499 100644 --- a/examples/configs/README.md +++ b/examples/configs/README.md @@ -5,10 +5,12 @@ Currently, driver takes in a yaml config containing the following options. Examp Configuration options pertaining to GT4Py stencils such as backend and whether to rebuild stencils. ## initialization_type -Driver initialization type can be either `baroclinic` or `serialbox`. +Driver initialization type can be either `analytic`, `restart`, `fortran_restart`, `serialbox`, or `predefined`. ## initialization_config -**`baroclinic`**: no additional config needs to be specified. +**`analytic`**: `case` can optionally be set to `baroclinic_instability` (default) or `baroclinic_steady`. `start_time` can optionally be set to a datetime (default: 2000-1-1). + +[TODO] Update initialization_config parameters for other initialization types **`serialbox`**: `path` to the test data directory and optionally `serialized_grid` to specify whether to create grid from serialized data or calculate them in Python. The directory should have the necessary serialized data and a fortran namelist which will be used to set options such as dycore_config and physics_config. Currently, the supported serialized dataset is the same as the test case in pace-physics. To obtain this data, run the following command at the top level: ``` diff --git a/examples/configs/analytic_test.yaml b/examples/configs/analytic_test.yaml index 3b9fb9809..ce00af97f 100644 --- a/examples/configs/analytic_test.yaml +++ b/examples/configs/analytic_test.yaml @@ -8,10 +8,10 @@ stencil_config: initialization: type: analytic config: - case: baroclinic + case: baroclinic_instability performance_config: collect_performance: true - experiment_name: c12_baroclinic + experiment_name: c12_baroclinic_instability comm_config: type: null_comm config: diff --git a/examples/configs/baroclinic_c12.yaml b/examples/configs/baroclinic_c12.yaml index b26ff1728..8976542aa 100644 --- a/examples/configs/baroclinic_c12.yaml +++ b/examples/configs/baroclinic_c12.yaml @@ -8,10 +8,10 @@ stencil_config: initialization: type: analytic config: - case: baroclinic + case: baroclinic_instability performance_config: collect_performance: true - experiment_name: c12_baroclinic + experiment_name: c12_baroclinic_instability nx_tile: 12 nz: 79 dt_atmos: 225 @@ -96,6 +96,6 @@ physics_config: do_qa: true grid_config: - type: generated + type: generated config: eta_file: 'tests/main/input/eta79.nc' diff --git a/examples/configs/baroclinic_c12_comm_read.yaml b/examples/configs/baroclinic_c12_comm_read.yaml index 29f7c2618..8cfead552 100644 --- a/examples/configs/baroclinic_c12_comm_read.yaml +++ b/examples/configs/baroclinic_c12_comm_read.yaml @@ -8,10 +8,10 @@ stencil_config: initialization: type: analytic config: - case: baroclinic + case: baroclinic_instability performance_config: collect_performance: false - experiment_name: c12_baroclinic + experiment_name: c12_baroclinic_instability comm_config: type: read config: diff --git a/examples/configs/baroclinic_c12_comm_write.yaml b/examples/configs/baroclinic_c12_comm_write.yaml index 35d44b4b2..1c11655c4 100644 --- a/examples/configs/baroclinic_c12_comm_write.yaml +++ b/examples/configs/baroclinic_c12_comm_write.yaml @@ -8,10 +8,10 @@ stencil_config: initialization: type: analytic config: - case: baroclinic + case: baroclinic_instability performance_config: collect_performance: false - experiment_name: c12_baroclinic + experiment_name: c12_baroclinic_instability comm_config: type: write config: diff --git a/examples/configs/baroclinic_c12_dp.yaml b/examples/configs/baroclinic_c12_dp.yaml index 7a4c05773..e9819f1c2 100644 --- a/examples/configs/baroclinic_c12_dp.yaml +++ b/examples/configs/baroclinic_c12_dp.yaml @@ -15,10 +15,10 @@ grid_config: initialization: type: analytic config: - case: baroclinic + case: baroclinic_instability performance_config: collect_performance: true - experiment_name: c12_baroclinic + experiment_name: c12_baroclinic_instability nx_tile: 12 nz: 79 dt_atmos: 225 diff --git a/examples/configs/baroclinic_c12_explicit_physics.yaml b/examples/configs/baroclinic_c12_explicit_physics.yaml index ceed306b0..b172888d8 100644 --- a/examples/configs/baroclinic_c12_explicit_physics.yaml +++ b/examples/configs/baroclinic_c12_explicit_physics.yaml @@ -8,10 +8,10 @@ stencil_config: initialization: type: analytic config: - case: baroclinic + case: baroclinic_instability performance_config: collect_performance: true - experiment_name: c12_baroclinic + experiment_name: c12_baroclinic_instability nx_tile: 12 nz: 79 dt_atmos: 225 diff --git a/examples/configs/baroclinic_c12_from_serialbox.yaml b/examples/configs/baroclinic_c12_from_serialbox.yaml index d1d55b97d..0f05e7a05 100644 --- a/examples/configs/baroclinic_c12_from_serialbox.yaml +++ b/examples/configs/baroclinic_c12_from_serialbox.yaml @@ -8,7 +8,7 @@ stencil_config: initialization_type: serialbox initialization_config: path: /test_data/8.0.0/c12_6ranks_baroclinic_dycore_microphysics/driver - serialized_grid: True + serialized_grid: true performance_config: collect_performance: false nx_tile: 12 diff --git a/examples/configs/baroclinic_c12_null_comm.yaml b/examples/configs/baroclinic_c12_null_comm.yaml index b2faded5d..6625140a6 100644 --- a/examples/configs/baroclinic_c12_null_comm.yaml +++ b/examples/configs/baroclinic_c12_null_comm.yaml @@ -8,10 +8,10 @@ stencil_config: initialization: type: analytic config: - case: baroclinic + case: baroclinic_instability performance_config: collect_performance: false - experiment_name: c12_baroclinic + experiment_name: c12_baroclinic_instability comm_config: type: null_comm config: diff --git a/examples/configs/baroclinic_c12_orch_cpu.yaml b/examples/configs/baroclinic_c12_orch_cpu.yaml index 6e29da06d..b1f2a39e0 100644 --- a/examples/configs/baroclinic_c12_orch_cpu.yaml +++ b/examples/configs/baroclinic_c12_orch_cpu.yaml @@ -8,7 +8,7 @@ stencil_config: initialization: type: analytic config: - case: baroclinic + case: baroclinic_instability performance_config: collect_performance: false nx_tile: 12 @@ -75,6 +75,6 @@ physics_config: do_qa: true grid_config: - type: generated + type: generated config: eta_file: 'tests/main/input/eta79.nc' diff --git a/examples/configs/baroclinic_c12_write_restart.yaml b/examples/configs/baroclinic_c12_write_restart.yaml index 7bca30327..830a9e054 100644 --- a/examples/configs/baroclinic_c12_write_restart.yaml +++ b/examples/configs/baroclinic_c12_write_restart.yaml @@ -8,10 +8,10 @@ stencil_config: initialization: type: analytic config: - case: baroclinic + case: baroclinic_instability performance_config: collect_performance: false - experiment_name: c12_baroclinic + experiment_name: c12_baroclinic_instability nx_tile: 12 nz: 79 dt_atmos: 225 @@ -94,6 +94,6 @@ physics_config: do_qa: true grid_config: - type: generated + type: generated config: eta_file: "tests/main/input/eta79.nc" diff --git a/examples/configs/baroclinic_c48_no_out.yaml b/examples/configs/baroclinic_c48_no_out.yaml new file mode 100644 index 000000000..75a815262 --- /dev/null +++ b/examples/configs/baroclinic_c48_no_out.yaml @@ -0,0 +1,81 @@ +stencil_config: + compilation_config: + backend: numpy + rebuild: false + validate_args: true + format_source: false + device_sync: false +initialization: + type: analytic + config: + case: baroclinic_instability +performance_config: + collect_performance: true + experiment_name: c12_baroclinic_instability +nx_tile: 48 +nz: 79 +dt_atmos: 225 +seconds: 225 +layout: + - 1 + - 1 +dycore_config: + a_imp: 1.0 + beta: 0. + consv_te: 0. + d2_bg: 0. + d2_bg_k1: 0.2 + d2_bg_k2: 0.1 + d4_bg: 0.15 + d_con: 1.0 + d_ext: 0.0 + dddmp: 0.5 + delt_max: 0.002 + do_sat_adj: true + do_vort_damp: true + fill: true + hord_dp: 6 + hord_mt: 6 + hord_tm: 6 + hord_tr: 8 + hord_vt: 6 + hydrostatic: false + k_split: 1 + ke_bg: 0. + kord_mt: 9 + kord_tm: -9 + kord_tr: 9 + kord_wz: 9 + n_split: 1 + nord: 3 + nwat: 6 + p_fac: 0.05 + rf_cutoff: 3000. + rf_fast: true + tau: 10. + vtdm4: 0.06 + z_tracer: true + do_qa: true + tau_i2s: 1000. + tau_g2v: 1200. + ql_gen: 0.001 + ql_mlt: 0.002 + qs_mlt: 0.000001 + qi_lim: 1.0 + dw_ocean: 0.1 + dw_land: 0.15 + icloud_f: 0 + tau_l2v: 300. + tau_v2l: 90. + fv_sg_adj: 0 + n_sponge: 48 + +physics_config: + hydrostatic: false + nwat: 6 + do_qa: true + +grid_config: + type: generated + config: + eta_file: 'tests/main/input/eta79.nc' diff --git a/examples/configs/test_external_C12_1x1.yaml b/examples/configs/test_external_C12_1x1.yaml index 77bbedd52..e77769206 100644 --- a/examples/configs/test_external_C12_1x1.yaml +++ b/examples/configs/test_external_C12_1x1.yaml @@ -14,10 +14,10 @@ grid_config: initialization: type: analytic config: - case: baroclinic + case: baroclinic_instability performance_config: collect_performance: true - experiment_name: c12_baroclinic + experiment_name: c12_baroclinic_instability nx_tile: 12 nz: 79 dt_atmos: 225 diff --git a/examples/configs/test_external_C12_2x2.yaml b/examples/configs/test_external_C12_2x2.yaml index 92ca72fc0..853306f88 100644 --- a/examples/configs/test_external_C12_2x2.yaml +++ b/examples/configs/test_external_C12_2x2.yaml @@ -14,10 +14,10 @@ grid_config: initialization: type: analytic config: - case: baroclinic + case: baroclinic_instability performance_config: collect_performance: true - experiment_name: c12_baroclinic + experiment_name: c12_baroclinic_instability nx_tile: 12 nz: 79 dt_atmos: 225 diff --git a/examples/configs/tropical_read_restart_fortran.yml b/examples/configs/tropical_read_restart_fortran.yml index 9e0623358..f0b552084 100644 --- a/examples/configs/tropical_read_restart_fortran.yml +++ b/examples/configs/tropical_read_restart_fortran.yml @@ -17,7 +17,7 @@ grid_config: lon_target: 172.5 lat_target: 17.5 ks: 0 - vertical_grid_from_restart: True + vertical_grid_from_restart: true type: generated performance_config: collect_performance: false diff --git a/examples/notebooks/baroclinic_c20.yaml b/examples/notebooks/baroclinic_c20.yaml index 46db5fd04..0c2340cb4 100644 --- a/examples/notebooks/baroclinic_c20.yaml +++ b/examples/notebooks/baroclinic_c20.yaml @@ -8,14 +8,14 @@ stencil_config: initialization: type: analytic config: - case: baroclinic + case: baroclinic_instability grid_config: type: generated config: eta_file: 'eta79.nc' performance_config: collect_performance: false - experiment_name: c20_baroclinic + experiment_name: c20_baroclinic_instability nx_tile: 20 nz: 79 dt_atmos: 225 diff --git a/examples/notebooks/driver_write_config.yaml b/examples/notebooks/driver_write_config.yaml index 525d30bc8..195867108 100644 --- a/examples/notebooks/driver_write_config.yaml +++ b/examples/notebooks/driver_write_config.yaml @@ -2,7 +2,7 @@ comm_config: config: path: comm ranks: - - 0 + - 0 type: write dt_atmos: 225 dycore_config: @@ -56,16 +56,16 @@ dycore_config: vtdm4: 0.06 z_tracer: true initialization_config: {} -initialization_type: baroclinic +initialization_type: baroclinic_instability layout: -- 1 -- 1 + - 1 + - 1 minutes: 60 nx_tile: 12 nz: 79 performance_config: collect_performance: false - experiment_name: c12_baroclinic + experiment_name: c12_baroclinic_instability physics_config: do_qa: true hydrostatic: false diff --git a/examples/notebooks/functions.py b/examples/notebooks/functions.py index 262157395..c603d09d4 100644 --- a/examples/notebooks/functions.py +++ b/examples/notebooks/functions.py @@ -36,7 +36,7 @@ VerticalGridData, ) from ndsl.grid.gnomonic import great_circle_distance_lon_lat -from pyFV3.stencils import FiniteVolumeFluxPrep, FiniteVolumeTransport, TracerAdvection +from pyfv3.stencils import FiniteVolumeFluxPrep, FiniteVolumeTransport, TracerAdvection class GridType(enum.Enum): @@ -184,7 +184,7 @@ def store_namelist_variables(local_variables: Dict[str, Any]) -> Dict[str, Any]: def define_dimensions( - namelistDict: Dict[str, Any] + namelistDict: Dict[str, Any], ) -> Tuple[Dict[str, int], Dict[str, Tuple[Any]], Dict[str, str], int]: """ Use: dimensions = diff --git a/examples/notebooks/serial_debugging.ipynb b/examples/notebooks/serial_debugging.ipynb index 597051a16..ace1a5b4c 100644 --- a/examples/notebooks/serial_debugging.ipynb +++ b/examples/notebooks/serial_debugging.ipynb @@ -29,7 +29,7 @@ "source": [ "from ndsl.constants import X_DIM, Y_DIM, Z_DIM\n", "from pace import Driver, DriverConfig\n", - "from pyFV3.stencils import DGrid2AGrid2CGridVectors\n", + "from pyfv3.stencils import DGrid2AGrid2CGridVectors\n", "import yaml\n", "import dacite\n", "import copy\n", diff --git a/examples/notebooks/stencil_definition.ipynb b/examples/notebooks/stencil_definition.ipynb index b6d2d1519..1e48b14fb 100644 --- a/examples/notebooks/stencil_definition.ipynb +++ b/examples/notebooks/stencil_definition.ipynb @@ -466,7 +466,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "id": "886c8a20", "metadata": {}, "outputs": [ @@ -509,7 +509,7 @@ "source": [ "import copy as cp\n", "import matplotlib.pyplot as plt\n", - "from pyFV3.stencils import FiniteVolumeFluxPrep\n", + "from pyfv3.stencils import FiniteVolumeFluxPrep\n", "from units_config import units\n", "\n", "fvf_prep = FiniteVolumeFluxPrep(\n", @@ -629,7 +629,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "id": "4446b419", "metadata": {}, "outputs": [ @@ -642,7 +642,7 @@ } ], "source": [ - "from pyFV3.stencils import FiniteVolumeTransport, TracerAdvection\n", + "from pyfv3.stencils import FiniteVolumeTransport, TracerAdvection\n", "\n", "grid_type = 0 # cubed-sphere\n", "hord = 6 # horizontal diffusion order\n", diff --git a/pace/diagnostics.py b/pace/diagnostics.py index 9b38d621d..8850bc083 100644 --- a/pace/diagnostics.py +++ b/pace/diagnostics.py @@ -16,7 +16,7 @@ from ndsl.monitor.netcdf_monitor import NetCDFMonitor from ndsl.typing import Communicator from pace.state import DriverState -from pyFV3 import DycoreState +from pyfv3 import DycoreState try: @@ -27,16 +27,13 @@ class Diagnostics(abc.ABC): @abc.abstractmethod - def store(self, time: Union[datetime, timedelta], state: DriverState): - ... + def store(self, time: Union[datetime, timedelta], state: DriverState): ... @abc.abstractmethod - def store_grid(self, grid_data: GridData): - ... + def store_grid(self, grid_data: GridData): ... @abc.abstractmethod - def cleanup(self): - ... + def cleanup(self): ... @dataclasses.dataclass diff --git a/pace/driver.py b/pace/driver.py index 859778c2f..1c2b50b1e 100644 --- a/pace/driver.py +++ b/pace/driver.py @@ -37,9 +37,10 @@ from pace.initialization import InitializerSelector from pace.safety_checks import SafetyChecker from pace.state import DriverState -from pyFV3 import DynamicalCore, DynamicalCoreConfig -from pySHiELD import Physics, PhysicsConfig -from pySHiELD.update import update_atmos_state +from pyfv3 import DynamicalCore, DynamicalCoreConfig +from pyfv3.initialization.analytic_init import AnalyticCase +from pyshield import Physics, PhysicsConfig +from pyshield.update import update_atmos_state try: @@ -266,9 +267,6 @@ def from_dict(cls, kwargs: Dict[str, Any]) -> "DriverConfig": kwargs["comm_config"] = CreatesCommSelector.from_dict( kwargs.get("comm_config", {}) ) - kwargs["initialization"] = InitializerSelector.from_dict( - kwargs["initialization"] - ) if "grid_config" in kwargs: kwargs["grid_config"] = GridInitializerSelector.from_dict( kwargs["grid_config"] @@ -280,6 +278,17 @@ def from_dict(cls, kwargs: Dict[str, Any]) -> "DriverConfig": if grid_type > 3: kwargs["dycore_config"].ntiles = 1 + analytic_hooks = {} + if kwargs["initialization"]["type"] == "analytic": + kwargs["initialization"]["config"]["dycore_config"] = kwargs[ + "dycore_config" + ] + analytic_hooks[AnalyticCase] = AnalyticCase + kwargs["initialization"] = InitializerSelector.from_dict( + kwargs["initialization"], + hooks=analytic_hooks, + ) + if ( isinstance(kwargs["stencil_config"], dict) and "dace_config" in kwargs["stencil_config"].keys() @@ -291,10 +300,10 @@ def from_dict(cls, kwargs: Dict[str, Any]) -> "DriverConfig": isinstance(kwargs["stencil_config"], dict) and "compilation_config" in kwargs["stencil_config"].keys() ): - kwargs["stencil_config"][ - "compilation_config" - ] = CompilationConfig.from_dict( - data=kwargs["stencil_config"]["compilation_config"] + kwargs["stencil_config"]["compilation_config"] = ( + CompilationConfig.from_dict( + data=kwargs["stencil_config"]["compilation_config"] + ) ) return dacite.from_dict( @@ -322,6 +331,9 @@ def write_for_restart( config_dict["dycore_config"].pop(field, None) config_dict["physics_config"].pop(field, None) config_dict["initialization"]["type"] = "restart" + # Remove existing initialization config and repopulate + config_dict["initialization"].pop("config") + config_dict["initialization"]["config"] = {} config_dict["initialization"]["config"]["start_time"] = time config_dict["initialization"]["config"]["path"] = restart_path # convert physics package enum to str @@ -471,7 +483,11 @@ def exit_instead_of_build(self): stencil_compare_comm=stencil_compare_comm, ) ndsl_log.info("setting up grid started") - (damping_coefficients, driver_grid_data, grid_data,) = self.config.get_grid( + ( + damping_coefficients, + driver_grid_data, + grid_data, + ) = self.config.get_grid( quantity_factory=self.quantity_factory, communicator=communicator, ) diff --git a/pace/grid.py b/pace/grid.py index 29c432d53..30494080f 100644 --- a/pace/grid.py +++ b/pace/grid.py @@ -1,5 +1,6 @@ import abc import dataclasses +from pathlib import Path from typing import ClassVar, Optional, Tuple import f90nml @@ -30,8 +31,7 @@ def get_grid( self, quantity_factory: QuantityFactory, communicator: Communicator, - ) -> Tuple[DampingCoefficients, DriverGridData, GridData]: - ... + ) -> Tuple[DampingCoefficients, DriverGridData, GridData]: ... @dataclasses.dataclass @@ -270,7 +270,7 @@ def get_grid( quantity_factory=quantity_factory, communicator=communicator, grid_type=self.grid_type, - eta_file=self.eta_file, + eta_file=Path(self.eta_file), ) horizontal_data = HorizontalGridData.new_from_metric_terms(metric_terms) diff --git a/pace/initialization.py b/pace/initialization.py index 68a3e6396..eaded6958 100644 --- a/pace/initialization.py +++ b/pace/initialization.py @@ -7,7 +7,7 @@ import f90nml -import pyFV3.initialization.analytic_init as analytic_init +import pyfv3.initialization.analytic_init as analytic_init from ndsl import ( CompilationConfig, DaceConfig, @@ -22,16 +22,16 @@ from ndsl.typing import Communicator from pace.registry import Registry from pace.state import DriverState, TendencyState, _restart_driver_state -from pyFV3 import DycoreState -from pyFV3.testing import TranslateFVDynamics -from pySHiELD import PHYSICS_PACKAGES, PhysicsState +from pyfv3 import DycoreState, DynamicalCoreConfig +from pyfv3.initialization.analytic_init import AnalyticCase +from pyfv3.testing import TranslateFVDynamics +from pyshield import PHYSICS_PACKAGES, PhysicsState class Initializer(abc.ABC): @property @abc.abstractmethod - def start_time(self) -> datetime: - ... + def start_time(self) -> datetime: ... @abc.abstractmethod def get_driver_state( @@ -42,8 +42,7 @@ def get_driver_state( driver_grid_data: DriverGridData, grid_data: GridData, schemes: List[PHYSICS_PACKAGES], - ) -> DriverState: - ... + ) -> DriverState: ... IT = TypeVar("IT", bound=Type[Initializer]) @@ -91,8 +90,8 @@ def get_driver_state( ) @classmethod - def from_dict(cls, config: dict): - instance = cls.registry.from_dict(config) + def from_dict(cls, config: dict, hooks={}): + instance = cls.registry.from_dict(config, hooks=hooks) return cls(config=instance, type=config["type"]) @@ -103,8 +102,11 @@ class AnalyticInit(Initializer): Configuration for analytic initialization. """ - case: str = "baroclinic" + case: AnalyticCase = AnalyticCase.baroclinic_instability start_time: datetime = datetime(2000, 1, 1) + dycore_config: DynamicalCoreConfig = dataclasses.field( + default_factory=DynamicalCoreConfig + ) def get_driver_state( self, @@ -119,9 +121,10 @@ def get_driver_state( analytic_init_case=self.case, grid_data=grid_data, quantity_factory=quantity_factory, - adiabatic=False, - hydrostatic=False, - moist_phys=True, + adiabatic=self.dycore_config.adiabatic, + hydrostatic=self.dycore_config.hydrostatic, + moist_phys=self.dycore_config.moist_phys, + sw_dynamics=self.dycore_config.sw_dynamics, comm=communicator, ) physics_state = PhysicsState.init_zeros( diff --git a/pace/registry.py b/pace/registry.py index 2254ec9f1..498493866 100644 --- a/pace/registry.py +++ b/pace/registry.py @@ -105,7 +105,7 @@ def register_func(cls: TT) -> TT: return register_func - def from_dict(self, config: dict) -> T: + def from_dict(self, config: dict, hooks={}) -> T: """ Creates a registered type from the given config dict. @@ -130,6 +130,6 @@ def from_dict(self, config: dict) -> T: instance = dacite.from_dict( data_class=self._types[type_name], data=config["config"], - config=dacite.Config(strict=True), + config=dacite.Config(strict=True, type_hooks=hooks), ) return instance diff --git a/pace/safety_checks.py b/pace/safety_checks.py index 1f583a5fc..33d98fc5b 100644 --- a/pace/safety_checks.py +++ b/pace/safety_checks.py @@ -3,7 +3,7 @@ import numpy as np from ndsl import Quantity -from pyFV3 import DycoreState +from pyfv3 import DycoreState class VariableBounds: diff --git a/pace/state.py b/pace/state.py index 9dc570b60..fa3370b60 100644 --- a/pace/state.py +++ b/pace/state.py @@ -11,8 +11,8 @@ from ndsl.filesystem import get_fs from ndsl.grid import DampingCoefficients, DriverGridData, GridData from ndsl.typing import Communicator -from pyFV3 import DycoreState -from pySHiELD import PHYSICS_PACKAGES, PhysicsState +from pyfv3 import DycoreState +from pyshield import PHYSICS_PACKAGES, PhysicsState @dataclasses.dataclass() diff --git a/pyFV3 b/pyFV3 index 1b2057fe7..95c62c0f9 160000 --- a/pyFV3 +++ b/pyFV3 @@ -1 +1 @@ -Subproject commit 1b2057fe7fcc1b903f35ff3c4944ea67a0c78830 +Subproject commit 95c62c0f9b5a9fc65b1a9afa1bf36ae9923d625a diff --git a/pySHiELD b/pySHiELD index 1784cf438..85e2b8951 160000 --- a/pySHiELD +++ b/pySHiELD @@ -1 +1 @@ -Subproject commit 1784cf4383bc305f11e3aecef274fc608c2cdad3 +Subproject commit 85e2b895130232e9253c03ffd47c92c9f63188a1 diff --git a/pyproject.toml b/pyproject.toml index 0ccea7b61..5cfdedae1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,3 +1,80 @@ +[build-system] +build-backend = "setuptools.build_meta" +requires = ["setuptools >= 77.0.3"] + +[project] +authors = [{name = "NOAA", email = "oliver.elbert@noaa.gov"}] +classifiers = [ + "Development Status :: 2 - Pre-Alpha", + "Intended Audience :: Developers", + "Natural Language :: English", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11" +] +dynamic = ["dependencies"] +license = "Apache-2.0" +license-files = ["LICENSE.md"] +name = "pace" +readme = "README.md" +requires-python = ">=3.11,<3.12" +version = "0.2.0" + +[project.optional-dependencies] +dev = [ + "pace[test]", + "pre-commit", + "flake8-pyproject" +] +test = [ + "mpi4py", + "nbmake", + "pytest" +] + +[project.urls] +Repository = "https://github.com/NOAA-GFDL/pace" + +[tool.aliases] + [tool.black] line-length = 88 -target_version = ['py38'] +target_version = ['py311'] + +[tool.bumpversion] +commit = "True" +current_version = "0.2.0" + +[tool.distutils.bdist_wheel] +universal = 1 + +[tool.flake8] +exclude = ["docs"] +extend-ignore = ["W503", "E302", "E203", "F841", "F401", "E501", "E721"] +max-line-length = 88 + +[tool.isort] +default_section = "THIRDPARTY" +force_grid_wrap = 0 +include_trailing_comma = true +known_first_party = "ndsl,pyfv3,pyshield,fv3gfs,pace" +known_third_party = "f90nml,pytest,xarray,numpy,mpi4py,gt4py" +line_length = 88 +lines_after_imports = 2 +multi_line_output = 3 +sections = "FUTURE,STDLIB,THIRDPARTY,FIRSTPARTY,LOCALFOLDER" +use_parentheses = true + +[tool.mypy] +explicit_package_bases = true +follow_imports = "normal" +ignore_missing_imports = true +mypy_path = "NDSL:pySHiELD:pyFV3" +namespace_packages = true +strict_optional = false +warn_unreachable = true + +[tool.setuptools] +include-package-data = true + +[tool.setuptools.packages.find] +include = ["pace", "pace.*"] diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index e3f40d1fe..000000000 --- a/setup.cfg +++ /dev/null @@ -1,34 +0,0 @@ -[bumpversion] -current_version = 0.2.0 -commit = True - -[bdist_wheel] -universal = 1 - -[flake8] -exclude = docs -ignore = W503,E302,E203,F841 -max-line-length = 88 - -[aliases] - -[tool:isort] -line_length = 88 -force_grid_wrap = 0 -include_trailing_comma = true -multi_line_output = 3 -use_parentheses = true -lines_after_imports = 2 -default_section = THIRDPARTY -sections = FUTURE,STDLIB,THIRDPARTY,FIRSTPARTY,LOCALFOLDER -known_first_party = ndsl,pyFV3,pySHiELD,fv3gfs,pace -known_third_party = f90nml,pytest,xarray,numpy,mpi4py,gt4py - -[mypy] -ignore_missing_imports = True -follow_imports = normal -namespace_packages = True -strict_optional = False -mypy_path = NDSL:pySHiELD:pyFV3 -warn_unreachable = True -explicit_package_bases = True diff --git a/setup.py b/setup.py index 4dc1e5339..f9995dfcf 100644 --- a/setup.py +++ b/setup.py @@ -1,65 +1,22 @@ from pathlib import Path -from typing import List -from setuptools import find_namespace_packages, setup +from setuptools import setup def local_pkg(name: str, relative_path: str) -> str: """Returns an absolute path to a local package.""" - return f"{name} @ file://{Path(__file__).parent / relative_path} " + return f"{name} @ file://{Path(__file__).absolute().parent / relative_path} " -requirements: List[str] = [ - local_pkg("NDSL", "NDSL"), - local_pkg("pyFV3", "pyFV3"), - local_pkg("pySHiELD", "pySHiELD"), +requirements: list[str] = [ + local_pkg("ndsl", "NDSL"), + local_pkg("pyfv3", "pyFV3"), + local_pkg("pyshield", "pySHiELD"), "dacite", "f90nml", - "numpy < 2.0.0", # numpy 2.x has breaking API changes + "numpy < 2.0.0", "xarray", - "zarr < 3.0.0", # zarr 3.x has breaking API changes + "zarr < 3.0.0", ] -test_requirements = [ - "mpi4py", - "nbmake", - "pytest", -] - -dev_requirements = [ - *test_requirements, - "pip-tools", # for pip-compile - "pre-commit", -] - -extras_require = { - "dev": dev_requirements, - "test": test_requirements, -} - - -setup( - author="Allen Institute for AI", - author_email="oliver.elbert@noaa.gov", - python_requires=">=3.8,<3.12", - classifiers=[ - "Development Status :: 2 - Pre-Alpha", - "Intended Audience :: Developers", - "License :: OSI Approved :: BSD License", - "Natural Language :: English", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - ], - install_requires=requirements, - extras_require=extras_require, - name="pace", - license="BSD license", - packages=find_namespace_packages(include=["pace", "pace.*"]), - include_package_data=True, - url="https://github.com/NOAA-GFDL/pace", - version="0.2.0", - zip_safe=False, -) +setup(install_requires=requirements) diff --git a/tests/main/driver/test_analytic_init.py b/tests/main/driver/test_analytic_init.py index 896c3d6f3..6f5405a09 100644 --- a/tests/main/driver/test_analytic_init.py +++ b/tests/main/driver/test_analytic_init.py @@ -5,6 +5,8 @@ import yaml from pace import DriverConfig +from pyfv3 import DynamicalCoreConfig +from pyfv3.initialization.analytic_init import AnalyticCase from tests.paths import EXAMPLE_CONFIGS_DIR @@ -13,6 +15,7 @@ TESTED_CONFIGS: List[Path] = [ EXAMPLE_CONFIGS_DIR / "analytic_test.yaml", + EXAMPLE_CONFIGS_DIR / "baroclinic_c48_6ranks_serialbox_test.yaml", ] @@ -27,4 +30,15 @@ def test_analytic_init_config(tested_configs: List[Path]): with open(Path(__file__).parent / config_file, "r") as f: config = yaml.safe_load(f) driver_config = DriverConfig.from_dict(config) - assert driver_config.initialization.type == "analytic" + # Analytic initialization contains a copy of the dynamical core + # config and analytic case types for addition consistency checks. + # Other initialization types don't require this. + if driver_config.initialization.type == "analytic": + assert ( + type(driver_config.initialization.config.dycore_config) + == DynamicalCoreConfig + ) + assert hasattr(driver_config.initialization.config, "case") + assert type(driver_config.initialization.config.case) == AnalyticCase + else: + assert not hasattr(driver_config.initialization, "dycore_config") diff --git a/tests/main/driver/test_diagnostics_config.py b/tests/main/driver/test_diagnostics_config.py index 9b96c1be2..b51fe7567 100644 --- a/tests/main/driver/test_diagnostics_config.py +++ b/tests/main/driver/test_diagnostics_config.py @@ -5,7 +5,7 @@ from ndsl import QuantityFactory, SubtileGridSizer from pace import DiagnosticsConfig from pace.diagnostics import MonitorDiagnostics, NullDiagnostics, ZSelect -from pyFV3 import DycoreState +from pyfv3 import DycoreState def test_returns_null_diagnostics_if_no_path_given(): diff --git a/tests/main/driver/test_example_configs.py b/tests/main/driver/test_example_configs.py index 02b7eeedd..f8e77c833 100644 --- a/tests/main/driver/test_example_configs.py +++ b/tests/main/driver/test_example_configs.py @@ -25,6 +25,7 @@ # filepath that are not in git "baroclinic_c12_from_serialbox.yaml", "baroclinic_c12_orch_cpu.yaml", + "baroclinic_c48_no_out.yaml", "tropical_read_restart_fortran.yml", "tropicalcyclone_c128.yaml", "test_external_C12_1x1.yaml", diff --git a/tests/main/driver/test_restart_fortran.py b/tests/main/driver/test_restart_fortran.py index 2e539a77d..92e5ed6fe 100644 --- a/tests/main/driver/test_restart_fortran.py +++ b/tests/main/driver/test_restart_fortran.py @@ -11,7 +11,7 @@ TilePartitioner, ) from pace import FortranRestartInit, GeneratedGridConfig -from pySHiELD import PHYSICS_PACKAGES +from pyshield import PHYSICS_PACKAGES from tests.paths import REPO_ROOT @@ -39,7 +39,11 @@ def test_state_from_fortran_restart(): quantity_factory = QuantityFactory.from_backend(sizer=sizer, backend="numpy") restart_dir = REPO_ROOT / "tests" / "main" / "data" / "c12_restart" - (damping_coefficients, driver_grid_data, grid_data,) = GeneratedGridConfig( + ( + damping_coefficients, + driver_grid_data, + grid_data, + ) = GeneratedGridConfig( restart_path=restart_dir, eta_file=restart_dir / "fv_core.res.nc" ).get_grid(quantity_factory, null_communicator) diff --git a/tests/main/driver/test_restart_serial.py b/tests/main/driver/test_restart_serial.py index 654149809..574fe144e 100644 --- a/tests/main/driver/test_restart_serial.py +++ b/tests/main/driver/test_restart_serial.py @@ -23,10 +23,13 @@ GeneratedGridConfig, RestartConfig, ) -from pySHiELD import PHYSICS_PACKAGES +from pyshield import PHYSICS_PACKAGES from tests.paths import EXAMPLE_CONFIGS_DIR +DIR = os.path.dirname(os.path.abspath(__file__)) + + class NullCommConfig(CreatesComm): def __init__(self, layout): self.layout = layout @@ -68,10 +71,14 @@ def test_restart_save_to_disk(): quantity_factory = QuantityFactory.from_backend(sizer=sizer, backend=backend) eta_file = Path(driver_config.grid_config.config.eta_file) - (damping_coefficients, driver_grid_data, grid_data,) = GeneratedGridConfig( + ( + damping_coefficients, + driver_grid_data, + grid_data, + ) = GeneratedGridConfig( eta_file=eta_file ).get_grid(quantity_factory, communicator) - init = AnalyticInit() + init = AnalyticInit(dycore_config=driver_config.dycore_config) driver_state = init.get_driver_state( quantity_factory=quantity_factory, communicator=communicator, diff --git a/tests/main/fv3core/test_config.py b/tests/main/fv3core/test_config.py index b4c6aa822..59a106a83 100644 --- a/tests/main/fv3core/test_config.py +++ b/tests/main/fv3core/test_config.py @@ -4,15 +4,15 @@ import pytest -import pyFV3._config +import pyfv3._config CONFIG_CLASSES = [ - pyFV3._config.SatAdjustConfig, - pyFV3._config.AcousticDynamicsConfig, - pyFV3._config.RiemannConfig, - pyFV3._config.DGridShallowWaterLagrangianDynamicsConfig, - pyFV3._config.DynamicalCoreConfig, + pyfv3._config.SatAdjustConfig, + pyfv3._config.AcousticDynamicsConfig, + pyfv3._config.RiemannConfig, + pyfv3._config.DGridShallowWaterLagrangianDynamicsConfig, + pyfv3._config.DynamicalCoreConfig, ] diff --git a/tests/main/fv3core/test_dycore_baroclinic.py b/tests/main/fv3core/test_dycore_baroclinic.py new file mode 100644 index 000000000..cc992c3a8 --- /dev/null +++ b/tests/main/fv3core/test_dycore_baroclinic.py @@ -0,0 +1,164 @@ +"""Unit tests for Jablonowski & Williamson Baroclinic test cases +Corresponds to Fortran test #12 (Steady State) and #13 (Perturbation) +found in tools/test_cases.F90 of: +https://github.com/NOAA-GFDL/GFDL_atmos_cubed_sphere.git +TODO This is a place holder class for more unit tests in the future. +""" + +from datetime import timedelta + +import pyfv3.initialization.analytic_init as ai +from ndsl import ( + CompilationConfig, + CubedSphereCommunicator, + CubedSpherePartitioner, + DaceConfig, + GridIndexing, + NullComm, + QuantityFactory, + StencilConfig, + StencilFactory, + SubtileGridSizer, + TileCommunicator, + TilePartitioner, +) +from ndsl.grid import DampingCoefficients, GridData, MetricTerms +from ndsl.performance.timer import NullTimer +from pyfv3 import DycoreState, DynamicalCore, DynamicalCoreConfig + + +def setup_dycore_config() -> DynamicalCoreConfig: + config = DynamicalCoreConfig( + layout=(1, 1), + npx=48, + npy=48, + npz=79, + ntiles=6, + nwat=6, + dt_atmos=225, + a_imp=1.0, + beta=0.0, + consv_te=False, # not implemented, needs allreduce + d2_bg=0.0, + d2_bg_k1=0.2, + d2_bg_k2=0.1, + d4_bg=0.15, + d_con=0.0, # Default is 0 in GFDL_atmos_cubed_sphere/model/fv_arrays.F90 + d_ext=0.0, + dddmp=0.5, + # delt_max=0.002, # TODO: What is equiv in SHiELD_build? + do_sat_adj=True, + do_vort_damp=True, + fill=True, + hord_dp=6, + hord_mt=6, + hord_tm=6, + hord_tr=8, + hord_vt=6, + hydrostatic=False, + k_split=1, + ke_bg=0.0, # Default is 0 in GFDL_atmos_cubed_sphere/model/fv_arrays.F90 + kord_mt=9, + kord_tm=-9, + kord_tr=9, + kord_wz=9, + n_split=1, + nord=3, + p_fac=0.05, # Default is 0.05 in GFDL_atmos_cubed_sphere/model/fv_arrays.F90 + rf_fast=True, + rf_cutoff=3000.0, + tau=10.0, + vtdm4=0.06, + z_tracer=True, + do_qa=True, + moist_phys=True, + ) + return config + + +def setup_dycore( + rank=0, usesCubedSphereComm=True, test_case=ai.AnalyticCase.baroclinic_instability +) -> DycoreState: + """Sets up Dycore state for analytic initialization""" + + backend = "numpy" + config = setup_dycore_config() + mpi_comm = NullComm( + rank=rank, total_ranks=6 * config.layout[0] * config.layout[1], fill_value=0.0 + ) + partitioner = CubedSpherePartitioner(TilePartitioner(config.layout)) + + if usesCubedSphereComm: + communicator = CubedSphereCommunicator(mpi_comm, partitioner) + else: + communicator = TileCommunicator(mpi_comm, partitioner) + + dace_config = DaceConfig(communicator=communicator, backend=backend) + stencil_config = StencilConfig( + compilation_config=CompilationConfig( + backend=backend, rebuild=False, validate_args=True + ), + dace_config=dace_config, + ) + sizer = SubtileGridSizer.from_tile_params( + nx_tile=config.npx - 1, + ny_tile=config.npy - 1, + nz=config.npz, + n_halo=3, + extra_dim_lengths={}, + layout=config.layout, + tile_partitioner=partitioner.tile, + tile_rank=communicator.tile.rank, + ) + grid_indexing = GridIndexing.from_sizer_and_communicator( + sizer=sizer, comm=communicator + ) + quantity_factory = QuantityFactory.from_backend(sizer=sizer, backend=backend) + eta_file = "tests/main/input/eta79.nc" + metric_terms = MetricTerms( + quantity_factory=quantity_factory, + communicator=communicator, + eta_file=eta_file, + ) + grid_data = GridData.new_from_metric_terms(metric_terms) + damping_coefficients = DampingCoefficients.new_from_metric_terms(metric_terms) + + state = ai.init_analytic_state( + analytic_init_case=test_case, + grid_data=grid_data, + quantity_factory=quantity_factory, + adiabatic=config.adiabatic, + hydrostatic=config.hydrostatic, + moist_phys=config.moist_phys, + sw_dynamics=config.sw_dynamics, + comm=communicator, + ) + stencil_factory = StencilFactory( + config=stencil_config, + grid_indexing=grid_indexing, + ) + + dycore = DynamicalCore( + comm=communicator, + grid_data=grid_data, + stencil_factory=stencil_factory, + quantity_factory=quantity_factory, + damping_coefficients=damping_coefficients, + config=config, + timestep=timedelta(seconds=config.dt_atmos), + phis=state.phis, + state=state, + ) + return dycore, state, NullTimer() + + +def test_baroclinic_steady_and_instability_are_different(): + """ + Simple test to check that the steady and instability tests produce + different results. + """ + _, state_steady, _ = setup_dycore(test_case=ai.AnalyticCase.baroclinic_steady) + _, state_instability, _ = setup_dycore( + test_case=ai.AnalyticCase.baroclinic_instability + ) + assert not (state_instability.u.field == state_steady.u.field).all() diff --git a/tests/main/fv3core/test_dycore_call.py b/tests/main/fv3core/test_dycore_call.py index ce597137e..fce91634d 100644 --- a/tests/main/fv3core/test_dycore_call.py +++ b/tests/main/fv3core/test_dycore_call.py @@ -4,7 +4,7 @@ from pathlib import Path from typing import Tuple -import pyFV3.initialization.analytic_init as ai +import pyfv3.initialization.analytic_init as ai from ndsl import ( CompilationConfig, CubedSphereCommunicator, @@ -22,7 +22,8 @@ from ndsl.grid import DampingCoefficients, GridData, MetricTerms from ndsl.performance.timer import NullTimer, Timer from ndsl.stencils.testing import assert_same_temporaries, copy_temporaries -from pyFV3 import DycoreState, DynamicalCore, DynamicalCoreConfig +from pyfv3 import DycoreState, DynamicalCore, DynamicalCoreConfig +from pyfv3.initialization.analytic_init import AnalyticCase def setup_dycore() -> Tuple[DynamicalCore, DycoreState, Timer]: @@ -108,12 +109,13 @@ def setup_dycore() -> Tuple[DynamicalCore, DycoreState, Timer]: # create an initial state from the Jablonowski & Williamson Baroclinic # test case perturbation. JRMS2006 state = ai.init_analytic_state( - analytic_init_case="baroclinic", + analytic_init_case=AnalyticCase.baroclinic_instability, grid_data=grid_data, quantity_factory=quantity_factory, adiabatic=config.adiabatic, hydrostatic=config.hydrostatic, moist_phys=config.moist_phys, + sw_dynamics=config.sw_dynamics, comm=communicator, ) stencil_factory = StencilFactory( diff --git a/tests/main/fv3core/test_init_from_geos.py b/tests/main/fv3core/test_init_from_geos.py index 6d1835611..2def90280 100644 --- a/tests/main/fv3core/test_init_from_geos.py +++ b/tests/main/fv3core/test_init_from_geos.py @@ -3,8 +3,8 @@ import pytest # noqa from ndsl import NullComm -from pyFV3 import DynamicalCore -from pyFV3.wrappers import GeosDycoreWrapper +from pyfv3 import DynamicalCore +from pyfv3.wrappers import GeosDycoreWrapper def test_geos_wrapper(): diff --git a/tests/main/fv3core/test_selective_validation.py b/tests/main/fv3core/test_selective_validation.py index a7929a3cd..e681adf02 100644 --- a/tests/main/fv3core/test_selective_validation.py +++ b/tests/main/fv3core/test_selective_validation.py @@ -3,7 +3,7 @@ import numpy as np import pytest -from pyFV3.testing.validation import get_selective_class +from pyfv3.testing.validation import get_selective_class class DummyClass: diff --git a/tests/main/physics/test_integration.py b/tests/main/physics/test_integration.py index 2444e3941..d0400f202 100644 --- a/tests/main/physics/test_integration.py +++ b/tests/main/physics/test_integration.py @@ -20,7 +20,7 @@ ) from ndsl.grid import GridData, MetricTerms from ndsl.stencils.testing import assert_same_temporaries, copy_temporaries -from pySHiELD import PHYSICS_PACKAGES, Physics, PhysicsConfig, PhysicsState +from pyshield import PHYSICS_PACKAGES, Physics, PhysicsConfig, PhysicsState try: diff --git a/tests/mpi/ext_grid/test_external_grid.py b/tests/mpi/ext_grid/test_external_grid.py index f2050c48c..79da0f772 100644 --- a/tests/mpi/ext_grid/test_external_grid.py +++ b/tests/mpi/ext_grid/test_external_grid.py @@ -131,7 +131,7 @@ def test_extgrid_equals_generated(config_file_path: str, ranks: int): assert not errors, "errors occurred in:\n{}".format("\n".join(errors)) - surface_area_true = 4 * PI * (RADIUS ** 2) + surface_area_true = 4 * PI * (RADIUS**2) mpicomm = MPIComm() diff --git a/tests/mpi/restart/test_restart.py b/tests/mpi/restart/test_restart.py index 2c812d87c..05e6dafea 100644 --- a/tests/mpi/restart/test_restart.py +++ b/tests/mpi/restart/test_restart.py @@ -15,7 +15,7 @@ TilePartitioner, ) from pace import DriverConfig, DriverState -from pySHiELD import PHYSICS_PACKAGES +from pyshield import PHYSICS_PACKAGES # The packages we import will import MPI, causing an MPI init, but we don't actually @@ -59,7 +59,11 @@ def test_restart(): mpi_comm = NullComm(rank=0, total_ranks=6, fill_value=0.0) partitioner = CubedSpherePartitioner(TilePartitioner((1, 1))) communicator = CubedSphereCommunicator(mpi_comm, partitioner) - (damping_coefficients, driver_grid_data, grid_data,) = restart_config.get_grid( + ( + damping_coefficients, + driver_grid_data, + grid_data, + ) = restart_config.get_grid( communicator=communicator, ) diff --git a/tests/mpi/test_grid_init.py b/tests/mpi/test_grid_init.py index 2b647dec0..bbb77ff99 100644 --- a/tests/mpi/test_grid_init.py +++ b/tests/mpi/test_grid_init.py @@ -13,8 +13,8 @@ TilePartitioner, ) from ndsl.grid import GridData, MetricTerms -from pyFV3 import DycoreState -from pyFV3.initialization.test_cases.initialize_baroclinic import init_baroclinic_state +from pyfv3 import DycoreState +from pyfv3.initialization.test_cases.initialize_baroclinic import init_baroclinic_state def get_cube_comm(layout, comm: MPIComm): diff --git a/tests/savepoint/test_checkpoints.py b/tests/savepoint/test_checkpoints.py index 2357e164f..990e60f1f 100644 --- a/tests/savepoint/test_checkpoints.py +++ b/tests/savepoint/test_checkpoints.py @@ -31,8 +31,8 @@ from ndsl.grid import DampingCoefficients, GridData from ndsl.stencils.testing import Grid, TranslateGrid, dataset_to_dict from ndsl.testing import perturb -from pyFV3 import DycoreState, DynamicalCore, DynamicalCoreConfig -from pyFV3.testing import TranslateFVDynamics +from pyfv3 import DycoreState, DynamicalCore, DynamicalCoreConfig +from pyfv3.testing import TranslateFVDynamics def get_grid(data_path: Path, rank: int, layout: Tuple[int, int], backend: str) -> Grid: diff --git a/tests/savepoint/thresholds/fv_dynamics.yaml b/tests/savepoint/thresholds/fv_dynamics.yaml index a31c5ac86..05f58d2f3 100644 --- a/tests/savepoint/thresholds/fv_dynamics.yaml +++ b/tests/savepoint/thresholds/fv_dynamics.yaml @@ -1,3 +1,4 @@ +# pretty-format-yaml : ignore savepoints: C_SW-In: - delpd: diff --git a/tests/savepoint/translate/translate_driver.py b/tests/savepoint/translate/translate_driver.py index 43fd345ee..56aeb6a7c 100644 --- a/tests/savepoint/translate/translate_driver.py +++ b/tests/savepoint/translate/translate_driver.py @@ -1,13 +1,13 @@ from ndsl import Namelist, QuantityFactory, SubtileGridSizer from ndsl.constants import N_HALO_DEFAULT from pace import Driver, DriverConfig, TendencyState -from pyFV3 import DynamicalCoreConfig +from pyfv3 import DynamicalCoreConfig # TODO physics should not depend on pyFV3 # but also, driver tests should not be in physics -from pyFV3.testing import TranslateFVDynamics -from pyFV3.testing.validation import enable_selective_validation -from pySHiELD import PHYSICS_PACKAGES, PhysicsConfig, PhysicsState +from pyfv3.testing import TranslateFVDynamics +from pyfv3.testing.validation import enable_selective_validation +from pyshield import PHYSICS_PACKAGES, PhysicsConfig, PhysicsState enable_selective_validation() From cc5d9f4fa95835c146271e4f850f8110ff00948f Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Tue, 22 Jul 2025 10:31:23 -0400 Subject: [PATCH 32/75] Fix: Base Ubuntu runner in workflow (#131) * Removing oversubscribe from unit test * Running unit test on push * Running on Ubuntu runner --- .github/workflows/main_unit_tests.yaml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main_unit_tests.yaml b/.github/workflows/main_unit_tests.yaml index b7a80981c..495c9ff51 100644 --- a/.github/workflows/main_unit_tests.yaml +++ b/.github/workflows/main_unit_tests.yaml @@ -11,6 +11,7 @@ on: default: '' required: false pull_request: + push: # cancel running jobs if theres a newer push concurrency: @@ -20,8 +21,6 @@ concurrency: jobs: pace_main_unit_tests: runs-on: ubuntu-latest - container: - image: ghcr.io/noaa-gfdl/miniforge:mpich steps: - name: "External trigger: Checkout pace/develop" if: ${{ inputs.component_trigger }} @@ -32,6 +31,14 @@ jobs: path: pace ref: develop + - name: Setup Python 3.11 + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Install mpi (MPICH flavor) + run: pip install mpich + - name: "External trigger: Remove existing component in pace/develop" if: ${{ inputs.component_trigger }} run: rm -rf ${GITHUB_WORKSPACE}/pace/${{inputs.component_name}} @@ -67,4 +74,4 @@ jobs: - name: Run baroclinic test case run: | cd ${GITHUB_WORKSPACE}/pace - mpiexec -np 6 --oversubscribe python -m pace.run examples/configs/baroclinic_c48_no_out.yaml + mpiexec -np 6 python -m pace.run examples/configs/baroclinic_c48_no_out.yaml From 449bf4a1bcb19eeb1997299a661a3779ba4ba738 Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Tue, 22 Jul 2025 14:09:19 -0400 Subject: [PATCH 33/75] Fix: Matching `pyFV3` package specifications (#132) * Addition of metadata and configuration information to pyproject.toml, and minimal setup.py * Linting * Adding conditional statement for checking of local clone of dependency * Linting * Reverting back to using find_pkg in setup.py * Updating author in pyproject.toml * Intermediate steps for refactor of pyFV3 and pySHiELD * Bringing in changes from PR 129 Co-authored-by: Janice Kim Co-authored-by: Frank Malatino <142349306+fmalatino@users.noreply.github.com> * Confirming tests Co-authored-by: Janice Kim Co-authored-by: Frank Malatino <142349306+fmalatino@users.noreply.github.com> * Changing backend of barolinic_c48_no_out.yaml * Adding baroclinic_c48_no_out.yaml to excluded configs in test_example_configs * Adding baroclinic_c48_no_out.yaml to workflow * Adding 54 ranks to be used in workflow * Reducing number of ranks for workflow run to 6 * Removing references to support for Python 3.9-3.10 in pyproject.toml * Removing more references to old Python version support * Removing setup.cfg * Setting black target version to Python 3.11 * New linting tools * Updating versions of tools contained in pyproject.toml and pre-commit-config * Reverting changes to fv_dynamics thresholds * Adding Flake8-pyproject as an additional dependency in pre-commit-config.yaml * Updating configs in examples/notebooks to use 'baroclinic_instability' over 'baroclinic' * Testing bumping mpi4py to 4.1 * Testing still * Removing version specification for mpi4py * Matching pyFV3 metadata --------- Co-authored-by: Janice Kim --- .pre-commit-config.yaml | 11 +---------- pace/__init__.py | 27 ++++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2c0511d7d..c022eb48c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,7 +6,6 @@ repos: rev: 25.1.0 hooks: - id: black - additional_dependencies: ["click==8.0.4"] - repo: https://github.com/pre-commit/mirrors-isort rev: v5.10.1 @@ -30,6 +29,7 @@ repos: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace + - repo: https://github.com/pycqa/flake8 rev: 7.3.0 hooks: @@ -37,15 +37,6 @@ repos: name: flake8 language_version: python3 additional_dependencies: [Flake8-pyproject] - exclude: | - (?x)^( - .*/__init__.py | - )$ - - id: flake8 - name: flake8 __init__.py files - files: "__init__.py" - # ignore unused import error in __init__.py files - additional_dependencies: [Flake8-pyproject] - repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks rev: v2.15.0 diff --git a/pace/__init__.py b/pace/__init__.py index d6bd5eb1b..aa60b1a35 100644 --- a/pace/__init__.py +++ b/pace/__init__.py @@ -10,7 +10,7 @@ ) from .diagnostics import Diagnostics, DiagnosticsConfig from .driver import Driver, DriverConfig, RestartConfig -from .grid import GeneratedGridConfig, SerialboxGridConfig +from .grid import ExternalNetcdfGridConfig, GeneratedGridConfig, SerialboxGridConfig from .initialization import ( AnalyticInit, FortranRestartInit, @@ -23,3 +23,28 @@ __version__ = "0.2.0" + +__all__ = [ + "CreatesComm", + "CreatesCommSelector", + "MPICommConfig", + "NullCommConfig", + "ReaderCommConfig", + "WriterCommConfig", + "Diagnostics", + "DiagnosticsConfig", + "Driver", + "DriverConfig", + "RestartConfig", + "GeneratedGridConfig", + "SerialboxGridConfig", + "ExternalNetcdfGridConfig", + "AnalyticInit", + "FortranRestartInit", + "PredefinedStateInit", + "RestartInit", + "Registry", + "SafetyChecker", + "DriverState", + "TendencyState", +] From 5f5016ed28fbe8673e0213231c8cb4cae10826eb Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Thu, 14 Aug 2025 16:28:22 +0200 Subject: [PATCH 34/75] ci: prepare for using a merge-queue in pace (#133) Co-authored-by: Roman Cattaneo <> --- .github/workflows/lint.yaml | 8 +++++++- .github/workflows/main_unit_tests.yaml | 9 ++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 48ea1b9b3..4e0cfc16c 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -1,6 +1,12 @@ name: "Lint" + +# Run these these whenever ... on: - pull_request: + pull_request: # ... a PR is opened / updated + merge_group: # ... the PR is added to the merge queue + push: + branches: + - main # ... when merging into the main branch jobs: lint: diff --git a/.github/workflows/main_unit_tests.yaml b/.github/workflows/main_unit_tests.yaml index 495c9ff51..6d69f1a39 100644 --- a/.github/workflows/main_unit_tests.yaml +++ b/.github/workflows/main_unit_tests.yaml @@ -1,6 +1,8 @@ name: "pace main unit tests" + +# Run these these whenever ... on: - workflow_call: + workflow_call: # ... called from a downstream repo inputs: component_trigger: type: boolean @@ -10,8 +12,9 @@ on: type: string default: '' required: false - pull_request: - push: + pull_request: # ... a PR is opened / updated + merge_group: # ... the PR is added to the merge queue + push: # ... code is pushed to any branch # cancel running jobs if theres a newer push concurrency: From d0444dd0111461321e97f77e37f70b97a97a88cd Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Wed, 20 Aug 2025 21:10:48 +0200 Subject: [PATCH 35/75] ci: only run on push to main branch (#135) Currently, "pace main unit tests" run on push to any branch. In case of `develop`, this is redundant with the merge queue checks. In case of any branch that isn't protected (e.g. isn't the main branch), running ci isn't necessary. This is consistent with the linting workflow and other workflow configurations (e.g. PyFV3 and PySHiELD). Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- .github/workflows/main_unit_tests.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main_unit_tests.yaml b/.github/workflows/main_unit_tests.yaml index 6d69f1a39..ddcb0e658 100644 --- a/.github/workflows/main_unit_tests.yaml +++ b/.github/workflows/main_unit_tests.yaml @@ -14,7 +14,9 @@ on: required: false pull_request: # ... a PR is opened / updated merge_group: # ... the PR is added to the merge queue - push: # ... code is pushed to any branch + push: + branches: + - main # ... when merging into the main branch # cancel running jobs if theres a newer push concurrency: From 7c717b32bd856079443f712e71713b9a0c35ca06 Mon Sep 17 00:00:00 2001 From: Tom Robinson <33458882+thomas-robinson@users.noreply.github.com> Date: Thu, 21 Aug 2025 10:10:34 -0400 Subject: [PATCH 36/75] Adds a dockerfile that will work with the NVHPC compiler and with cuda installed (#137) --- Dockerfile.nvhpc | 71 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 Dockerfile.nvhpc diff --git a/Dockerfile.nvhpc b/Dockerfile.nvhpc new file mode 100644 index 000000000..4b4053f71 --- /dev/null +++ b/Dockerfile.nvhpc @@ -0,0 +1,71 @@ +FROM nvcr.io/nvidia/nvhpc:25.7-devel-cuda12.9-ubuntu22.04 + +# Install Python 3.11 and essential packages +RUN apt-get update && apt-get install -y \ + software-properties-common \ + make \ + git \ + wget \ + curl \ + && add-apt-repository ppa:deadsnakes/ppa \ + && apt-get update && apt-get install -y \ + python3.11 \ + python3.11-dev \ + python3.11-distutils \ + python3-pip \ + libgeos-dev \ + libhdf5-serial-dev \ + netcdf-bin \ + libnetcdf-dev \ + libproj-dev \ + proj-bin \ + proj-data \ + && rm -rf /var/lib/apt/lists/* + +# Set Python 3.11 as default python3 +RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1 \ + && update-alternatives --install /usr/bin/python python /usr/bin/python3.11 1 + +RUN python3 -m pip install --upgrade pip setuptools wheel + +# Set NVHPC compilers as default (PATH and LD_LIBRARY_PATH already set by base image) +ENV CC=nvc +ENV CXX=nvc++ +ENV FC=nvfortran + +COPY . /pace + +RUN cd /pace && \ + NOSWITCHERROR=1 \ + CFLAGS="-noswitcherror" \ + CXXFLAGS="-noswitcherror" \ + python3 -m pip install .[test] + +RUN cd / && \ + git clone https://github.com/ai2cm/fv3net + +ENV CFLAGS="-I/usr/include -DACCEPT_USE_OF_DEPRECATED_PROJ_API_H=1" + +# Install additional packages with CUDA support +RUN python3 -m pip install --no-cache-dir \ + matplotlib==3.10.0 \ + ipyparallel==8.4.1 \ + jupyterlab==3.4.4 \ + shapely==1.8.5 \ + cartopy==0.23.0 \ + jupyterlab_code_formatter==1.5.2 \ + isort==5.10.1 \ + black==22.3.0 \ + cupy-cuda12x \ + /fv3net/external/vcm + +ENV PYTHONPATH=/fv3net/external/fv3viz:/pace/external/gt4py/src + +# NVHPC MPI environment variables +ENV OMPI_ALLOW_RUN_AS_ROOT=1 +ENV OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 + +# CUDA environment variables +ENV CUDA_HOME=/opt/nvidia/hpc_sdk/Linux_x86_64/25.7/cuda +ENV PATH="${CUDA_HOME}/bin:${PATH}" +ENV LD_LIBRARY_PATH="${CUDA_HOME}/lib64:${LD_LIBRARY_PATH}" From fb2c3aaa4a17b1a64f0edefb4b709a7913605fea Mon Sep 17 00:00:00 2001 From: Oliver Elbert Date: Fri, 22 Aug 2025 11:17:42 -0400 Subject: [PATCH 37/75] Fix/physics states (#139) * Update netcdf version * also upgrade pip * update ndsl * update to dockerfile to fix build * docker works * fix to tests of physics restarts * tuple types Co-authored-by: Roman Cattaneo * lint --------- Co-authored-by: Roman Cattaneo --- tests/main/driver/test_restart_serial.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/main/driver/test_restart_serial.py b/tests/main/driver/test_restart_serial.py index 574fe144e..7f9430f85 100644 --- a/tests/main/driver/test_restart_serial.py +++ b/tests/main/driver/test_restart_serial.py @@ -120,8 +120,7 @@ def test_restart_save_to_disk(): ) for var in driver_state.physics_state.__dict__.keys(): if isinstance( - driver_state.physics_state.__dict__[var], - np.ndarray, + driver_state.physics_state.__dict__[var], (np.ndarray, Quantity) ): np.testing.assert_allclose( driver_state.physics_state.__dict__[var].data, From c2b8575ba851bd46a0992927e69fb814aa3293eb Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Tue, 2 Sep 2025 14:13:17 -0400 Subject: [PATCH 38/75] Updating test workflow to use conda environment for addition of `pyRTE-RRTMGP` (#141) * Updating test workflow to use conda environment for addition of pyrte-rrtmgp to pySHiELD * Removing external install of mpich * Trying conda install of mpich to CI * Trying conda install of mpi4py to CI * Updating NDSL * Checking effect of updating NDSL on workflow * For testing * Undoing changes for testing pyshield * More testing in pyshield * Pace tests pass in pyshield call --- .github/workflows/main_unit_tests.yaml | 18 +++++++++++++++--- NDSL | 2 +- pyFV3 | 2 +- pySHiELD | 2 +- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main_unit_tests.yaml b/.github/workflows/main_unit_tests.yaml index ddcb0e658..0eae9c6c6 100644 --- a/.github/workflows/main_unit_tests.yaml +++ b/.github/workflows/main_unit_tests.yaml @@ -36,15 +36,20 @@ jobs: path: pace ref: develop - - name: Setup Python 3.11 - uses: actions/setup-python@v5 + - name: Setup Miniconda + uses: conda-incubator/setup-miniconda@v3 with: - python-version: '3.11' + python-version: 3.11.13 + conda-remove-defaults: true + auto-activate-base: false + activate-environment: pace_test_env - name: Install mpi (MPICH flavor) + shell: bash -l {0} run: pip install mpich - name: "External trigger: Remove existing component in pace/develop" + shell: bash -l {0} if: ${{ inputs.component_trigger }} run: rm -rf ${GITHUB_WORKSPACE}/pace/${{inputs.component_name}} @@ -55,28 +60,35 @@ jobs: path: pace/${{inputs.component_name}} - name: Install packages + shell: bash -l {0} run: | cd ${GITHUB_WORKSPACE}/pace pip install .[test] + pip install numpy==1.26.4 + conda remove sqlite - name: Print versions + shell: bash -l {0} run: | python --version pip --version pip list - name: Prepare input files + shell: bash -l {0} run: | cd ${GITHUB_WORKSPACE}/pace mkdir tests/main/input python examples/generate_eta_files.py tests/main/input - name: Run tests + shell: bash -l {0} run: | cd ${GITHUB_WORKSPACE}/pace python -m pytest -x tests/main - name: Run baroclinic test case + shell: bash -l {0} run: | cd ${GITHUB_WORKSPACE}/pace mpiexec -np 6 python -m pace.run examples/configs/baroclinic_c48_no_out.yaml diff --git a/NDSL b/NDSL index dafe55df5..728134358 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit dafe55df54325232791e2833398cfc7df7512c6c +Subproject commit 728134358fd981f109b3fece56bea39042641ec2 diff --git a/pyFV3 b/pyFV3 index 95c62c0f9..7d3c74ca8 160000 --- a/pyFV3 +++ b/pyFV3 @@ -1 +1 @@ -Subproject commit 95c62c0f9b5a9fc65b1a9afa1bf36ae9923d625a +Subproject commit 7d3c74ca8353d5344e02e58239802ad22a61db2a diff --git a/pySHiELD b/pySHiELD index 85e2b8951..08c1b555d 160000 --- a/pySHiELD +++ b/pySHiELD @@ -1 +1 @@ -Subproject commit 85e2b895130232e9253c03ffd47c92c9f63188a1 +Subproject commit 08c1b555d1fd49a2b899ee1b9b1a29dfeb56c924 From d86ca26fb0919affa22737edc7fbf971ce4a1d34 Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Wed, 3 Sep 2025 13:49:49 -0400 Subject: [PATCH 39/75] Fix: Adding oversubscribe flag for baroclinic instability run in workflow (#142) * Updating test workflow to use conda environment for addition of pyrte-rrtmgp to pySHiELD * Removing external install of mpich * Trying conda install of mpich to CI * Trying conda install of mpi4py to CI * Updating NDSL * Checking effect of updating NDSL on workflow * For testing * Undoing changes for testing pyshield * More testing in pyshield * Pace tests pass in pyshield call * Adding oversubscribe to main_unit_tests --- .github/workflows/main_unit_tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main_unit_tests.yaml b/.github/workflows/main_unit_tests.yaml index 0eae9c6c6..05c64b6e4 100644 --- a/.github/workflows/main_unit_tests.yaml +++ b/.github/workflows/main_unit_tests.yaml @@ -91,4 +91,4 @@ jobs: shell: bash -l {0} run: | cd ${GITHUB_WORKSPACE}/pace - mpiexec -np 6 python -m pace.run examples/configs/baroclinic_c48_no_out.yaml + mpiexec -np 6 --oversubscribe python -m pace.run examples/configs/baroclinic_c48_no_out.yaml From fc8700ba0805a008d0885b40cdc3ee501386c61a Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Mon, 8 Sep 2025 13:25:17 +0200 Subject: [PATCH 40/75] ci: cache pre-commit environment between PR runs (#144) Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- .github/workflows/create_cache.yml | 44 ++++++++++++++++++++++++++++++ .github/workflows/lint.yaml | 14 +++++++--- 2 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/create_cache.yml diff --git a/.github/workflows/create_cache.yml b/.github/workflows/create_cache.yml new file mode 100644 index 000000000..c3cdcea21 --- /dev/null +++ b/.github/workflows/create_cache.yml @@ -0,0 +1,44 @@ +name: "Create GHA cache" + +# GitHub puts the following restrictions on cache sharing. PRs can access +# +# - caches that were created by the PR / earlier runs of the PR +# - caches that were created on the target branch +# +# To get effective cache sharing between PRs, we create caches on the `develop` +# branch (which is where almost all PRs merge into). + +on: + push: + branches: [develop] + +# Cancel running jobs if there's a newer push +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + # GitHub Actions cache of the pre-commit environment + pre-commit: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Setup Python 3.11 + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - uses: actions/cache@v4 + id: cache + with: + path: ~/.cache/pre-commit + key: pre-commit_${{ env.pythonLocation }}_${{ hashFiles('.pre-commit-config.yaml') }} + lookup-only: true # don't actually download the cache + + - name: Populate pre-commit environment (if not cached) + if: steps.cache.outputs.cache-hit != 'true' + run: | + pip install pre-commit + pre-commit install --install-hooks diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 4e0cfc16c..aee1d8e2e 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -17,14 +17,20 @@ jobs: with: submodules: 'recursive' - - name: Step Python 3.11.9 + - name: Step Python 3.11 uses: actions/setup-python@v5 with: - python-version: '3.11.9' + python-version: '3.11' + + # Only restore (don't save) caches on PRs. New caches created from PRs won't be + # accessible from other PRs, see workflows/create-cache.yaml. + - uses: actions/cache/restore@v4 + with: + path: ~/.cache/pre-commit + key: pre-commit_${{ env.pythonLocation }}_${{ hashFiles('.pre-commit-config.yaml') }} - name: Install pre-commit run: pip install pre-commit - name: Run lint via pre-commit - run: | - pre-commit run --all-files + run: pre-commit run --all-files From 8028842f798dccfff8af3684ac4defb33cdccaf3 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Mon, 8 Sep 2025 15:20:10 +0200 Subject: [PATCH 41/75] ci: Update actions/checkout v4 -> v5 (#143) This PR updates actions/checkout from @v4 to @v5. The major version number update was only necessary because of new requirements on the runners (which is a breaking change). Since we use runners provided by GitHub, we don't have to worry. Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- .github/workflows/lint.yaml | 2 +- .github/workflows/main_unit_tests.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index aee1d8e2e..47600cb2e 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: submodules: 'recursive' diff --git a/.github/workflows/main_unit_tests.yaml b/.github/workflows/main_unit_tests.yaml index 05c64b6e4..f66a0ec78 100644 --- a/.github/workflows/main_unit_tests.yaml +++ b/.github/workflows/main_unit_tests.yaml @@ -29,7 +29,7 @@ jobs: steps: - name: "External trigger: Checkout pace/develop" if: ${{ inputs.component_trigger }} - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: submodules: 'recursive' repository: NOAA-GFDL/pace @@ -54,7 +54,7 @@ jobs: run: rm -rf ${GITHUB_WORKSPACE}/pace/${{inputs.component_name}} - name: Checkout out hash that triggered CI - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: submodules: 'recursive' path: pace/${{inputs.component_name}} From a316389eb3a7d683fae18fe94e7bf590fb002097 Mon Sep 17 00:00:00 2001 From: Ryan Mulhall <35538242+rem1776@users.noreply.github.com> Date: Tue, 9 Sep 2025 15:01:02 -0400 Subject: [PATCH 42/75] add workflow to test dockerfile builds (#140) * Create container_build_test.yaml * add recursive checkout and remove nvhpc * precommit edits for added yaml --------- Co-authored-by: rem1776 --- .github/workflows/container_build_test.yaml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/workflows/container_build_test.yaml diff --git a/.github/workflows/container_build_test.yaml b/.github/workflows/container_build_test.yaml new file mode 100644 index 000000000..d2f267fe6 --- /dev/null +++ b/.github/workflows/container_build_test.yaml @@ -0,0 +1,21 @@ +on: + push: + branches: + - 'develop' + schedule: + - cron: '0 0 * * 0' # sundays @ midnight + +jobs: + test-container-builds: + runs-on: ubuntu-latest + steps: + - name: Checkout Files + uses: actions/checkout@v5.0.0 + with: + submodules: recursive + - name: Build Dockerfile + uses: docker/build-push-action@v6.18.0 + with: + context: . + push: false + file: "Dockerfile" From f0925918ffa8a126b734c433dbad2052b525971a Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Thu, 11 Sep 2025 15:55:02 -0400 Subject: [PATCH 43/75] Fix: Workflow maintaining conda environment (#146) * Updating test workflow to use conda environment for addition of pyrte-rrtmgp to pySHiELD * Removing external install of mpich * Trying conda install of mpich to CI * Trying conda install of mpi4py to CI * Updating NDSL * Checking effect of updating NDSL on workflow * For testing * Undoing changes for testing pyshield * More testing in pyshield * Pace tests pass in pyshield call * Adding oversubscribe to main_unit_tests * Keeping sqlite in workflow * Removing oversubscribe --- .github/workflows/main_unit_tests.yaml | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/.github/workflows/main_unit_tests.yaml b/.github/workflows/main_unit_tests.yaml index f66a0ec78..c0b01a964 100644 --- a/.github/workflows/main_unit_tests.yaml +++ b/.github/workflows/main_unit_tests.yaml @@ -26,6 +26,9 @@ concurrency: jobs: pace_main_unit_tests: runs-on: ubuntu-latest + defaults: + run: + shell: bash -el {0} steps: - name: "External trigger: Checkout pace/develop" if: ${{ inputs.component_trigger }} @@ -45,11 +48,9 @@ jobs: activate-environment: pace_test_env - name: Install mpi (MPICH flavor) - shell: bash -l {0} run: pip install mpich - name: "External trigger: Remove existing component in pace/develop" - shell: bash -l {0} if: ${{ inputs.component_trigger }} run: rm -rf ${GITHUB_WORKSPACE}/pace/${{inputs.component_name}} @@ -60,35 +61,29 @@ jobs: path: pace/${{inputs.component_name}} - name: Install packages - shell: bash -l {0} run: | cd ${GITHUB_WORKSPACE}/pace pip install .[test] pip install numpy==1.26.4 - conda remove sqlite - name: Print versions - shell: bash -l {0} run: | python --version pip --version pip list - name: Prepare input files - shell: bash -l {0} run: | cd ${GITHUB_WORKSPACE}/pace mkdir tests/main/input python examples/generate_eta_files.py tests/main/input - name: Run tests - shell: bash -l {0} run: | cd ${GITHUB_WORKSPACE}/pace python -m pytest -x tests/main - name: Run baroclinic test case - shell: bash -l {0} run: | cd ${GITHUB_WORKSPACE}/pace - mpiexec -np 6 --oversubscribe python -m pace.run examples/configs/baroclinic_c48_no_out.yaml + mpiexec -np 6 python -m pace.run examples/configs/baroclinic_c48_no_out.yaml From 246e16b91cdc98e691aeef15a309b3e083e51707 Mon Sep 17 00:00:00 2001 From: Lucas Harris <53020884+lharris4@users.noreply.github.com> Date: Fri, 12 Sep 2025 10:43:43 -0400 Subject: [PATCH 44/75] fixed CubedSphereCommunicator call to use mpi_comm_dsl correctly (#115) Co-authored-by: Lucas M Harris Co-authored-by: Oliver Elbert --- examples/notebooks/grid_generation.ipynb | 524 ++--------------------- 1 file changed, 26 insertions(+), 498 deletions(-) diff --git a/examples/notebooks/grid_generation.ipynb b/examples/notebooks/grid_generation.ipynb index 937b973e9..2f56fa34f 100644 --- a/examples/notebooks/grid_generation.ipynb +++ b/examples/notebooks/grid_generation.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -63,19 +63,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Starting 6 engines with \n", - "100%|███████████████████████████████████████████████████████| 6/6 [00:05<00:00, 1.08engine/s]\n", - "%autopx enabled\n" - ] - } - ], + "outputs": [], "source": [ "import ipyparallel as ipp\n", "\n", @@ -102,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": { "tags": [] }, @@ -114,64 +104,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[stdout:3] I am MPI-rank 3 of a total of 6\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stdout:4] I am MPI-rank 4 of a total of 6\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stdout:1] I am MPI-rank 1 of a total of 6\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stdout:0] I am MPI-rank 0 of a total of 6\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stdout:2] I am MPI-rank 2 of a total of 6\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stdout:5] I am MPI-rank 5 of a total of 6\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from mpi4py import MPI\n", "\n", @@ -197,215 +132,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[stdout:1] 2024-04-17 21:09:45|INFO|rank 1|ndsl.logging:Constant selected: ConstantVersions.GFS\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stdout:5] 2024-04-17 21:09:45|INFO|rank 5|ndsl.logging:Constant selected: ConstantVersions.GFS\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stdout:2] 2024-04-17 21:09:45|INFO|rank 2|ndsl.logging:Constant selected: ConstantVersions.GFS\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stdout:0] 2024-04-17 21:09:45|INFO|rank 0|ndsl.logging:Constant selected: ConstantVersions.GFS\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stdout:3] 2024-04-17 21:09:45|INFO|rank 3|ndsl.logging:Constant selected: ConstantVersions.GFS\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stdout:4] 2024-04-17 21:09:45|INFO|rank 4|ndsl.logging:Constant selected: ConstantVersions.GFS\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[output:3]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "engine": 3 - }, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[output:2]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "engine": 2 - }, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[output:1]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "engine": 1 - }, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[output:4]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "engine": 4 - }, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[output:5]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "engine": 5 - }, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[output:0]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "engine": 0 - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "%px: 100%|███████████████████████████████████████████████████| 6/6 [00:00<00:00, 38.77tasks/s]\n" - ] - } - ], + "outputs": [], "source": [ "from ndsl import (\n", " CubedSphereCommunicator,\n", @@ -414,14 +143,17 @@ " QuantityFactory,\n", " SubtileGridSizer,\n", " TilePartitioner,\n", + " MPIComm\n", ")\n", "\n", + "mpi_comm_ndsl = MPIComm()\n", + "\n", "# create a partitioning of the computational domain on the cube\n", "partitioner = CubedSpherePartitioner(TilePartitioner(layout))\n", "\n", "# create an associated communicator to help with\n", "# halo-updates as well as gather/scatter operations\n", - "communicator = CubedSphereCommunicator(mpi_comm, partitioner)" + "communicator = CubedSphereCommunicator(mpi_comm_ndsl, partitioner)" ] }, { @@ -439,7 +171,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -462,20 +194,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[stdout:0] Size of temperature field on rank 0 is (20, 20)\n", - "Size of u-velocity field on rank 0 is (21, 20)\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# create a field at the cell center\n", "temperature = quantity_factory.zeros(dims=(\"x\", \"y\"), units=\"degrees\", dtype=\"float\")\n", @@ -505,40 +226,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[stdout:0] ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_angle_data', '_contravariant_data', '_fC', '_fC_agrid', '_fC_from_lat', '_horizontal_data', '_vertical_data', 'a11', 'a12', 'a21', 'a22', 'ak', 'area', 'area_64', 'bk', 'cos_sg1', 'cos_sg2', 'cos_sg3', 'cos_sg4', 'cosa', 'cosa_s', 'cosa_u', 'cosa_v', 'dp_ref', 'dx', 'dxa', 'dxc', 'dy', 'dya', 'dyc', 'edge_e', 'edge_n', 'edge_s', 'edge_w', 'ee1', 'ee2', 'es1', 'ew2', 'fC', 'fC_agrid', 'ks', 'lat', 'lat_agrid', 'lon', 'lon_agrid', 'new_from_metric_terms', 'p', 'p_ref', 'ptop', 'rarea', 'rarea_c', 'rdx', 'rdxa', 'rdxc', 'rdy', 'rdya', 'rdyc', 'rsin2', 'rsin_u', 'rsin_v', 'rsina', 'sin_sg1', 'sin_sg2', 'sin_sg3', 'sin_sg4', 'sina_u', 'sina_v']\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stderr:2] /pace/NDSL/ndsl/grid/gnomonic.py:681: RuntimeWarning: invalid value encountered in true_divide\n", - " np.sum(p * q, axis=-1)\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stderr:5] /pace/NDSL/ndsl/grid/gnomonic.py:681: RuntimeWarning: invalid value encountered in true_divide\n", - " np.sum(p * q, axis=-1)\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from ndsl.grid import GridData, MetricTerms\n", "\n", @@ -564,64 +254,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[stdout:2] \n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stdout:1] \n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stdout:3] \n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stdout:4] \n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stdout:5] \n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stdout:0] \n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import numpy as np\n", "from ndsl import Quantity\n", @@ -664,31 +299,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[output:0]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6IAAAH4CAYAAABQclA/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd7wVxfn/P7dyL713qSJVEQFBRUQRQTHYe77YsSf5fmOMiRq7MYlRYw+xxpLYY4y9JYIVRVBEBREsiCIgvVzg7O8Pf3uzd5nZnWfazp4z79eLF3DOM888OzufmXlm9pxTFgRBAI/H4/F4PB6Px+PxeCxRnnUAHo/H4/F4PB6Px+MpLXwi6vF4PB6Px+PxeDweq/hE1OPxeDwej8fj8Xg8VvGJqMfj8Xg8Ho/H4/F4rOITUY/H4/F4PB6Px+PxWMUnoh6Px+PxeDwej8fjsYpPRD0ej8fj8Xg8Ho/HYxWfiHo8Ho/H4/F4PB6Pxyo+EfV4PB6Px+PxeDwej1V8IurxeJS45JJLUFZWhmXLlhmva8yYMRgzZozxeqIsWrQIZWVluOaaa6zWm3eyarcTTjgBPXr0ELZt2rSp2YA8UoTjSpQePXrghBNOyCYgi8Sv89///jfKysrw73//W2s9b7/9Nqqrq/H5559r9SvD+eefjxEjRmQdhsfjsYxPRD2eEmPBggU47bTT0KtXL9TU1KB58+bYY4898Kc//QkbNmzIOjyPRyvr16/HJZdcon0RXygUcPfdd2PSpEnYbrvt0KRJEwwaNAhXXHEFNm7cyCxzxx13oH///qipqUGfPn1w4403ao2Jxccff4zzzjsPO++8M5o1a4ZOnTph4sSJeOedd5j2ixcvxpFHHomWLVuiefPmOOigg/DZZ58Zj7PUeP3113HJJZdg5cqVmcVwwQUX4JhjjkH37t1J5R577DEcddRR6NWrFxo3boy+ffvi5z//Ofda/vnPf2KXXXZBTU0NunXrhosvvhhbtmxpYPOzn/0Ms2fPxj//+U/Zy/F4PDmkMusAPB6PPZ566ikcccQRaNSoESZPnoxBgwahrq4O06dPxy9+8Qt8+OGHmDp1atZhejzS/OUvf0GhUKj///r163HppZcCgNbT9PXr1+PEE0/EyJEjcfrpp6N9+/Z44403cPHFF+Oll17Cyy+/3OBE789//jNOP/10HHbYYfi///s/TJs2DT/5yU+wfv16/PKXv9QWV5zbb78dd9xxBw477DCceeaZWLVqFf785z9j5MiRePbZZ7HvvvvW265duxZ77703Vq1ahV//+teoqqrCddddh7322guzZs1CmzZtjMVZarz++uu49NJLccIJJ6Bly5YN3vvkk09QXm72nGDWrFl48cUX8frrr5PLTpkyBZ07d8aPf/xjdOvWDR988AFuuukmPP3005g5cyZqa2vrbZ955hkcfPDBGDNmDG688UZ88MEHuOKKK7B06VLceuut9XYdO3bEQQcdhGuuuQaTJk3Sco0ej8d9fCLq8ZQICxcuxNFHH43u3bvj5ZdfRqdOnerfO+uss/Dpp5/iqaeeyjDC0mbdunVo0qRJ1mHknqqqKiv1VFdX47XXXsPuu+9e/9qpp56KHj161CejYZK3YcMGXHDBBZg4cSIeeeSRettCoYDLL78cU6ZMQatWrYzEecwxx+CSSy5p8AjySSedhP79++OSSy5pkIjecsstmD9/Pt5++20MHz4cALD//vtj0KBB+OMf/4irrrrKSIzFiqymGzVqZCCahtx1113o1q0bRo4cSS77yCOPbLOpM3ToUBx//PG4//77ccopp9S/fu6552KnnXbC888/j8rKH5aczZs3x1VXXYWf/vSn6NevX73tkUceiSOOOAKfffYZevXqJXdhHo8nV/hHcz2eEuH3v/891q5dizvuuKNBEhqy/fbb46c//SmA/36+7+67797GrqysDJdccsk2ry9btgxHHnkkmjdvjjZt2uCnP/0p8xHF++67D0OHDkVtbS1at26No48+Gl9++eU2dlOnTkXv3r1RW1uLXXfdFdOmTRO+1s2bN+PSSy9Fnz59UFNTgzZt2mDUqFF44YUX6m3Czwd+9tlnGD9+PJo0aYLOnTvjsssuQxAETL9hTI0aNcLw4cMxY8aMbWw+/vhjHH744WjdujVqamowbNiwbR43u/vuu1FWVob//Oc/OPPMM9G+fXt07dq1/v1nnnkGe+65J5o0aYJmzZph4sSJ+PDDD1OvO/Q7ffp0/OQnP0G7du3QsmVLnHbaaairq8PKlSsxefJktGrVCq1atcJ55523zbUWCgVcf/31GDhwIGpqatChQwecdtpp+P777xvYvfPOOxg/fjzatm2L2tpa9OzZEyeddJJ0u0VZuXIlKioqcMMNN9S/tmzZMpSXl6NNmzYNYj7jjDPQsWPH+v9HPyO6aNEitGvXDgBw6aWXoqysjNl/Fy9ejIMPPhhNmzZFu3btcO6552Lr1q2JMVZXVzdIQkMOOeQQAMBHH31U/9orr7yC5cuX48wzz2xge9ZZZ2HdunWJG0AbNmxAv3790K9fvwaPzq9YsQKdOnXC7rvvnhjr0KFDt/kcbJs2bbDnnns2iBH4IcEYPnx4fRIKAP369cPYsWPx0EMPceuIct9992HXXXdF48aN0apVK4wePRrPP/98AxvZ/h1HROcsQp28+uqrOO2009CmTRs0b94ckydP3qafi8YbjicLFizAAQccgGbNmuG4445j1n/JJZfgF7/4BQCgZ8+e9f1y0aJFAMQ/C/vWW29hwoQJaNGiBRo3boy99toLr732Wmo5APjHP/6BffbZZ5vP4YbXu9dee6FZs2Zo3rw5hg8fjgceeKD+fdaTBax+P3fuXMydOxdTpkypT0IB4Mwzz0QQBPWbMiHhpsgTTzwhdA0ejyf/+ETU4ykRnnzySfTq1Yu5eNbBkUceiY0bN+K3v/0tDjjgANxwww2YMmVKA5srr7wSkydPRp8+fXDttdfiZz/7GV566SWMHj26weeL7rjjDpx22mno2LEjfv/732OPPfbApEmTmAkri0suuQSXXnop9t57b9x000244IIL0K1bN8ycObOB3datWzFhwgR06NABv//97zF06FBcfPHFuPjii7fx+cADD+APf/gDTjvtNFxxxRVYtGgRDj30UGzevLne5sMPP8TIkSPx0Ucf4fzzz8cf//hHNGnSBAcffDAef/zxbXyeeeaZmDt3Ln7zm9/g/PPPBwDce++9mDhxIpo2bYrf/e53uOiiizB37lyMGjWqfqGaxjnnnIP58+fj0ksvxaRJkzB16lRcdNFF+NGPfoStW7fiqquuwqhRo/CHP/wB9957b4Oyp512Gn7xi1/Uf274xBNPxP3334/x48fXX+vSpUux3377YdGiRTj//PNx44034rjjjsObb74p1W5xWrZsiUGDBuHVV1+tf2369OkoKyvDihUrMHfu3PrXp02bhj333JPpp127dvWP/x1yyCG49957ce+99+LQQw+tt9m6dSvGjx+PNm3a4JprrsFee+2FP/7xj9KPqH/zzTcAgLZt29a/9t577wEAhg0b1sB26NChKC8vr3+fRW1tLe655x58+umnuOCCC+pfP+uss7Bq1SrcfffdqKiokIozGmOhUMD777+/TYwAsOuuu2LBggVYs2ZNos9LL70U//M//4OqqipcdtlluPTSS7Hddtvh5ZdfrrfR0b9DRHXO4+yzz8ZHH32ESy65BJMnT8b999+Pgw8+uMFGByXeLVu2YPz48Wjfvj2uueYaHHbYYcx6Dz30UBxzzDEAgOuuu66+X4abJiK8/PLLGD16NFavXo2LL74YV111FVauXIl99tkHb7/9dmLZxYsX44svvsAuu+yyzXt33303Jk6ciBUrVuBXv/oVrr76auy888549tlnE31S+n3nzp3RtWvXbfp9ixYt0Lt3b+Fk2uPxFAGBx+MpelatWhUACA466CAh+4ULFwYAgrvuumub9wAEF198cf3/L7744gBAMGnSpAZ2Z555ZgAgmD17dhAEQbBo0aKgoqIiuPLKKxvYffDBB0FlZWX963V1dUH79u2DnXfeOdi0aVO93dSpUwMAwV577ZUa/+DBg4OJEycm2hx//PEBgOCcc86pf61QKAQTJ04Mqqurg++++65BW7Rp0yZYsWJFve0TTzwRAAiefPLJ+tfGjh0b7LjjjsHGjRsb+Nx9992DPn361L921113BQCCUaNGBVu2bKl/fc2aNUHLli2DU089tUGs33zzTdCiRYttXo8T+h0/fnxQKBTqX99tt92CsrKy4PTTT69/bcuWLUHXrl0btOe0adMCAMH999/fwO+zzz7b4PXHH388ABDMmDGDGwul3VicddZZQYcOHer//3//93/B6NGjg/bt2we33nprEARBsHz58qCsrCz405/+VG93/PHHB927d6///3fffbdNn43aAgguu+yyBq8PGTIkGDp0aGJ8PPbdd9+gefPmwffff9/gWioqKpj27dq1C44++uhUv7/61a+C8vLy4NVXXw0efvjhAEBw/fXXS8X46quvBmVlZcFFF11U/1rYTvG2CIIguPnmmwMAwccff8z1OX/+/KC8vDw45JBDgq1btzZ4L+yLlP4djitRunfvHhx//PH1/xfROYtQJ0OHDg3q6urqX//9738fAAieeOIJcrxhXzr//POFYvjDH/4QAAgWLly4zXvx63zllVcCAMErr7wSBMEP7dmnT59tdL5+/fqgZ8+ewbhx4xLrfvHFF5kaXLlyZdCsWbNgxIgRwYYNGxq8F62HxcknnxxUVFQE8+bN2+Yav/jii23shw8fHowcOXKb1/fbb7+gf//+iXV5PJ7iwZ+IejwlwOrVqwEAzZo1M1bHWWed1eD/55xzDgDg6aefBvDDNy0WCgUceeSRWLZsWf2fjh07ok+fPnjllVcA/PDI59KlS3H66aejurq63t8JJ5yAFi1aCMXSsmVLfPjhh5g/f36q7dlnn13/77KyMpx99tmoq6vDiy++2MDuqKOOavA5vvAULvxG0RUrVuDll1/GkUceiTVr1tRf3/LlyzF+/HjMnz8fixcvbuDz1FNPbXCa9cILL2DlypU45phjGrRRRUUFRowYUd9GaZx88skNHrkbMWIEgiDAySefXP9aRUUFhg0b1uAbUR9++GG0aNEC48aNa1B/+HhnWH/45Sr/+te/Ek82RdqNx5577olvv/0Wn3zyCYAfTj5Hjx6NPffcs/4x7enTpyMIAu6JqCinn376NnXLfFPsVVddhRdffBFXX311gy+g2bBhQ4O+HKWmpkbo26ovueQSDBw4EMcffzzOPPNM7LXXXvjJT35CjnHp0qU49thj0bNnT5x33nkNYgTYn0+sqalpYMPiH//4BwqFAn7zm99s80U7YV/U1b9DKDpnMWXKlAafKT7jjDNQWVlZP2bJxHvGGWdIxUJh1qxZmD9/Po499lgsX768Pq5169Zh7NixePXVVxt8YVec5cuXA8A2n0t+4YUXsGbNGpx//vn19zyE9QhvyAMPPIA77rgDP//5z9GnT5/619P6FKs/tWrVyspPgXk8HjfwX1bk8ZQAzZs3B4DUR+tUiC5AAKB3794oLy+vf3xt/vz5CIJgG7uQcEEY/qZd3K6qqmqbL7AIHwcLadGiBWpra3HZZZfhoIMOwg477IBBgwZhwoQJ+J//+R/stNNODezLy8u38bnDDjsAwDaP3XXr1q3B/8NFXPiZsk8//RRBEOCiiy7CRRddxLzGpUuXokuXLvX/79mzZ4P3wwX1Pvvswywf3sc04rGGCfx22223zevRz8TNnz8fq1atQvv27bnxA8Bee+2Fww47DJdeeimuu+46jBkzBgcffDCOPfbYbRadae3GI0wup02bVv8Y3xVXXIF27drV/zbptGnT0Lx5cwwePDjRVxI1NTXbPBLZqlWr1PjiPPjgg7jwwgtx8sknb5OM1NbWoq6ujllu48aNDb5llEd1dTXuvPNODB8+HDU1NbjrrrsSkwMW69atw4EHHog1a9Zg+vTpDT47GsawadMmZoxRGxYLFixAeXk5BgwYwLXR1b9DRHXOIz7GNG3aFJ06dWowZlHiraysbPBZb1OEcR1//PFcm1WrVqV+AVYQ+3z4ggULAACDBg0SjmXatGk4+eSTMX78eFx55ZUN3kvrU6z+FAQBuV97PJ784hNRj6cEaN68OTp37ow5c+YI2fMWAmlf4JLko1AooKysDM888wzzM23xL1QRIf6lS3fddRdOOOEEjB49GgsWLMATTzyB559/Hrfffjuuu+463HbbbQ2+0ZEC73N44WIuPIE499xzMX78eKbt9ttv3+D/8YVY6OPee+9t8AU8IdEv/JCJlfV6dDFaKBTQvn173H///czyYcJWVlaGRx55BG+++SaefPJJPPfcczjppJPwxz/+EW+++WaDe5nWbjw6d+6Mnj174tVXX0WPHj0QBAF22203tGvXDj/96U/x+eefY9q0adh9992VfupC5vOVcV544QVMnjwZEydOxG233bbN+506dcLWrVuxdOnSBkl+XV0dli9fjs6dOwvV89xzzwH4YRE/f/78bTYykqirq8Ohhx6K999/H88999w2yUbr1q3RqFEjLFmyZJuy4WuicfLQ1b9DTOhcJd5GjRoZ/9mVaFx/+MMfsPPOOzNtksbT8Gd4qJstcWbPno1JkyZh0KBBeOSRR7Zpj3B8XrJkyTabYEuWLMGuu+66jc/vv/++wedMPR5PceMTUY+nRDjwwAMxdepUvPHGG9htt90SbcOd9PgPlIenlSziC+NPP/0UhUKh/htMe/fujSAI0LNnz/pTRxbhj6vPnz+/wUnE5s2bsXDhwganX/Fvxxw4cGD9v1u3bo0TTzwRJ554ItauXYvRo0fjkksuabBALRQK+OyzzxrEM2/ePACoj1uU8GS1qqqqwU9iUOjduzcAoH379tI+VOjduzdefPFF7LHHHkKndCNHjsTIkSNx5ZVX4oEHHsBxxx2Hv//971qSAOCHU9FXX30VPXv2xM4774xmzZph8ODBaNGiBZ599lnMnDmz/jdCeZg+XXnrrbdwyCGHYNiwYXjooYeYyVSYLLzzzjs44IAD6l9/5513UCgUuMlElPfffx+XXXYZTjzxRMyaNQunnHIKPvjgA6HH1QuFAiZPnoyXXnoJDz30EPbaa69tbMrLy7HjjjvinXfeYV5jr169Eh/t7927NwqFAubOncu9HhP9W0TnPObPn4+99967/v9r167FkiVL6u+RST2q9MswrubNm0vFFf5kysKFC5l+58yZs82mWZwFCxZgwoQJaN++PZ5++mlm4hvt99Gk8+uvv8ZXX321zZfZhTGpPOHg8Xjyhf+MqMdTIpx33nlo0qQJTjnlFHz77bfbvL9gwQL86U9/AvDDAqdt27YNvrUU+OF3BnncfPPNDf5/4403AvjhdwiBH74psqKiApdeeuk2p2FBENR/bmnYsGFo164dbrvttgaPM959993bJMb77rtvgz/hDnzoK6Rp06bYfvvtmY+I3XTTTQ3iuOmmm1BVVYWxY8dyr5VF+/btMWbMGPz5z39mnip99913qT7Gjx9f/xt7rM9eivhQ4cgjj8TWrVtx+eWXb/Peli1b6tv/+++/3+YehotOVhvLsueee2LRokV48MEH6x/VLS8vx+67745rr70WmzdvTv18aOPGjQFsu6mig48++ggTJ05Ejx498K9//YubvO+zzz5o3bp1/Tf4htx6661o3LgxJk6cmFjP5s2bccIJJ6Bz587405/+hLvvvhvffvst/vd//1coznPOOQcPPvggbrnllgbfGBzn8MMPx4wZMxoko5988glefvllHHHEEYl1HHzwwSgvL8dll122zecTw76iu39TdM5i6tSpDeK49dZbsWXLlvoxy6Qew98XlemXQ4cORe/evXHNNddg7dq15Li6dOmC7bbbbptNh/322w/NmjXDb3/7221+eiuq92+++Qb77bcfysvL8dxzz3G/7XfgwIHo168fpk6d2uBpmltvvRVlZWU4/PDDG9ivWrUKCxYsMPbN7h6Pxz38iajHUyL07t0bDzzwAI466ij0798fkydPxqBBg1BXV4fXX38dDz/8cIPfrjvllFNw9dVX45RTTsGwYcPw6quv1p8Wsli4cCEmTZqECRMm4I033sB9992HY489tn53u3fv3rjiiivwq1/9CosWLcLBBx+MZs2aYeHChXj88ccxZcoUnHvuuaiqqsIVV1yB0047Dfvssw+OOuooLFy4EHfddZfwj5wPGDAAY8aMwdChQ9G6dWu88847eOSRRxp8MRHww+cDn332WRx//PEYMWIEnnnmGTz11FP49a9/Tfop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qKuYp0w+YSHKJLJixQpcffXVeP/999GzZ0906dJlrwElKEhNTz6U/lSOeVHHYXp3QfTdGldIitfGkW7TuRgWg644TO8s5CkfXbh3qjb92DjCbrNvq74iYRrOxR9frzMOF2oe6lyUFaF79uzBokWLsHDhQpx99tkYN24c2rZtSxobky9YiDLCvPHGG7j66quxa9cuHHvssWjTps1efzctSAE9x2HS2tAhTG0IUSDbO2thfkz4CvpT8alqh1qU5qF4jfNlMjeydA8p8siFsVkWkz5Njok2jsrazsOgnSy9lmEqD6mO4a5duxYfffQRWrVqhQkTJuDEE0+kCI/JOSxEmVTs2LED99xzD8aOHYuOHTuiV69eaNSo0Y+uy5Io1THYq4rTLBYNafwAZnPC9feETK3cy8SUxwURz1cec9DvM41fXYW2il2bIjRvueH6nKL7pJFLfSKNX5OLtrIidPPmzZg3bx6qqqrwl7/8BVdffTXq169PFSKTc1iIMlKsWrUK1157LaZPn46jjjoKRxxxROj5fxcEaZRfW4O9n7gjX7a+6CGPBZiHS4LU9vGuOJ95F6GevzyKm6DPKL82vthFNOdt99m8jYGeP5fmFBvfvRD0a+OIeRQ25wNZAbp7924sWrQIn332Gc4//3zce++9PzopxzBJsBBllJg2bRquuuoqbN26FT179kT79u1Rp06d0GtdEKWeTxuFoZ+4SdhWbFk8Qijjz5ZPz6+tVfYgSV88Uwr5l2ehHebXhviMIqlvuCTadflz4XsATPm1JTyjCD5zF3Y/TfilEKDFYhHLly/HJ598ggMPPBATJkzA8ccfTxUiU2KwEGWUqampwcMPP4z/+7//Q4sWLdCrVy+0bNky8nobghSwswOQhrgvG+DinNafLZ+mfYtiu0gshcLc9jFxD869cP959WfDpwtzmQg2x2bbc5GsCK2qqsL8+fOxa9cujB07Fpdeemntb80zjAwsRBkyvv/+e9x111146KGHcMghh6Bnz55o2rRpbJuo3ySlIG6SsV38RBEsGOImdA8d7xTmuUjy+6T2K1KAubIj6hF1L0wWk6WWdybGOo8s5B0gNubp6qt5yAHTPtPMTbZPIHm4UBNkVYB+//33mD9/PqqqqnDzzTfjxhtvROPGjalCbSZKKwAADQRJREFUZEoYFqIMOatWrcLNN9+MV155BV27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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "engine": 0 - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "from cartopy import crs as ccrs\n", @@ -734,31 +347,9 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[output:0]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "engine": 0 - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# convert GT4Py storage into Quantity\n", "area = Quantity(\n", @@ -813,72 +404,9 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[stderr:5] /pace/NDSL/ndsl/grid/gnomonic.py:681: RuntimeWarning: invalid value encountered in true_divide\n", - " np.sum(p * q, axis=-1)\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stderr:2] /pace/NDSL/ndsl/grid/gnomonic.py:681: RuntimeWarning: invalid value encountered in true_divide\n", - " np.sum(p * q, axis=-1)\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[output:0]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6IAAAH4CAYAAABQclA/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd7wVxfn/P7dyL713qSJVEQFBRUQRQTHYe77YsSf5fmOMiRq7MYlRYw+xxpLYY4y9JYIVRVBEBREsiCIgvVzg7O8Pf3uzd5nZnWfazp4z79eLF3DOM888OzufmXlm9pxTFgRBAI/H4/F4PB6Px+PxeCxRnnUAHo/H4/F4PB6Px+MpLXwi6vF4PB6Px+PxeDweq/hE1OPxeDwej8fj8Xg8VvGJqMfj8Xg8Ho/H4/F4rOITUY/H4/F4PB6Px+PxWMUnoh6Px+PxeDwej8fjsYpPRD0ej8fj8Xg8Ho/HYxWfiHo8Ho/H4/F4PB6Pxyo+EfV4PB6Px+PxeDwej1V8IurxeJS45JJLUFZWhmXLlhmva8yYMRgzZozxeqIsWrQIZWVluOaaa6zWm3eyarcTTjgBPXr0ELZt2rSp2YA8UoTjSpQePXrghBNOyCYgi8Sv89///jfKysrw73//W2s9b7/9Nqqrq/H5559r9SvD+eefjxEjRmQdhsfjsYxPRD2eEmPBggU47bTT0KtXL9TU1KB58+bYY4898Kc//QkbNmzIOjyPRyvr16/HJZdcon0RXygUcPfdd2PSpEnYbrvt0KRJEwwaNAhXXHEFNm7cyCxzxx13oH///qipqUGfPn1w4403ao2Jxccff4zzzjsPO++8M5o1a4ZOnTph4sSJeOedd5j2ixcvxpFHHomWLVuiefPmOOigg/DZZ58Zj7PUeP3113HJJZdg5cqVmcVwwQUX4JhjjkH37t1J5R577DEcddRR6NWrFxo3boy+ffvi5z//Ofda/vnPf2KXXXZBTU0NunXrhosvvhhbtmxpYPOzn/0Ms2fPxj//+U/Zy/F4PDmkMusAPB6PPZ566ikcccQRaNSoESZPnoxBgwahrq4O06dPxy9+8Qt8+OGHmDp1atZhejzS/OUvf0GhUKj///r163HppZcCgNbT9PXr1+PEE0/EyJEjcfrpp6N9+/Z44403cPHFF+Oll17Cyy+/3OBE789//jNOP/10HHbYYfi///s/TJs2DT/5yU+wfv16/PKXv9QWV5zbb78dd9xxBw477DCceeaZWLVqFf785z9j5MiRePbZZ7HvvvvW265duxZ77703Vq1ahV//+teoqqrCddddh7322guzZs1CmzZtjMVZarz++uu49NJLccIJJ6Bly5YN3vvkk09QXm72nGDWrFl48cUX8frrr5PLTpkyBZ07d8aPf/xjdOvWDR988AFuuukmPP3005g5cyZqa2vrbZ955hkcfPDBGDNmDG688UZ88MEHuOKKK7B06VLceuut9XYdO3bEQQcdhGuuuQaTJk3Sco0ej8d9fCLq8ZQICxcuxNFHH43u3bvj5ZdfRqdOnerfO+uss/Dpp5/iqaeeyjDC0mbdunVo0qRJ1mHknqqqKiv1VFdX47XXXsPuu+9e/9qpp56KHj161CejYZK3YcMGXHDBBZg4cSIeeeSRettCoYDLL78cU6ZMQatWrYzEecwxx+CSSy5p8AjySSedhP79++OSSy5pkIjecsstmD9/Pt5++20MHz4cALD//vtj0KBB+OMf/4irrrrKSIzFiqymGzVqZCCahtx1113o1q0bRo4cSS77yCOPbLOpM3ToUBx//PG4//77ccopp9S/fu6552KnnXbC888/j8rKH5aczZs3x1VXXYWf/vSn6NevX73tkUceiSOOOAKfffYZevXqJXdhHo8nV/hHcz2eEuH3v/891q5dizvuuKNBEhqy/fbb46c//SmA/36+7+67797GrqysDJdccsk2ry9btgxHHnkkmjdvjjZt2uCnP/0p8xHF++67D0OHDkVtbS1at26No48+Gl9++eU2dlOnTkXv3r1RW1uLXXfdFdOmTRO+1s2bN+PSSy9Fnz59UFNTgzZt2mDUqFF44YUX6m3Czwd+9tlnGD9+PJo0aYLOnTvjsssuQxAETL9hTI0aNcLw4cMxY8aMbWw+/vhjHH744WjdujVqamowbNiwbR43u/vuu1FWVob//Oc/OPPMM9G+fXt07dq1/v1nnnkGe+65J5o0aYJmzZph4sSJ+PDDD1OvO/Q7ffp0/OQnP0G7du3QsmVLnHbaaairq8PKlSsxefJktGrVCq1atcJ55523zbUWCgVcf/31GDhwIGpqatChQwecdtpp+P777xvYvfPOOxg/fjzatm2L2tpa9OzZEyeddJJ0u0VZuXIlKioqcMMNN9S/tmzZMpSXl6NNmzYNYj7jjDPQsWPH+v9HPyO6aNEitGvXDgBw6aWXoqysjNl/Fy9ejIMPPhhNmzZFu3btcO6552Lr1q2JMVZXVzdIQkMOOeQQAMBHH31U/9orr7yC5cuX48wzz2xge9ZZZ2HdunWJG0AbNmxAv3790K9fvwaPzq9YsQKdOnXC7rvvnhjr0KFDt/kcbJs2bbDnnns2iBH4IcEYPnx4fRIKAP369cPYsWPx0EMPceuIct9992HXXXdF48aN0apVK4wePRrPP/98AxvZ/h1HROcsQp28+uqrOO2009CmTRs0b94ckydP3qafi8YbjicLFizAAQccgGbNmuG4445j1n/JJZfgF7/4BQCgZ8+e9f1y0aJFAMQ/C/vWW29hwoQJaNGiBRo3boy99toLr732Wmo5APjHP/6BffbZZ5vP4YbXu9dee6FZs2Zo3rw5hg8fjgceeKD+fdaTBax+P3fuXMydOxdTpkypT0IB4Mwzz0QQBPWbMiHhpsgTTzwhdA0ejyf/+ETU4ykRnnzySfTq1Yu5eNbBkUceiY0bN+K3v/0tDjjgANxwww2YMmVKA5srr7wSkydPRp8+fXDttdfiZz/7GV566SWMHj26weeL7rjjDpx22mno2LEjfv/732OPPfbApEmTmAkri0suuQSXXnop9t57b9x000244IIL0K1bN8ycObOB3datWzFhwgR06NABv//97zF06FBcfPHFuPjii7fx+cADD+APf/gDTjvtNFxxxRVYtGgRDj30UGzevLne5sMPP8TIkSPx0Ucf4fzzz8cf//hHNGnSBAcffDAef/zxbXyeeeaZmDt3Ln7zm9/g/PPPBwDce++9mDhxIpo2bYrf/e53uOiiizB37lyMGjWqfqGaxjnnnIP58+fj0ksvxaRJkzB16lRcdNFF+NGPfoStW7fiqquuwqhRo/CHP/wB9957b4Oyp512Gn7xi1/Uf274xBNPxP3334/x48fXX+vSpUux3377YdGiRTj//PNx44034rjjjsObb74p1W5xWrZsiUGDBuHVV1+tf2369OkoKyvDihUrMHfu3PrXp02bhj333JPpp127dvWP/x1yyCG49957ce+99+LQQw+tt9m6dSvGjx+PNm3a4JprrsFee+2FP/7xj9KPqH/zzTcAgLZt29a/9t577wEAhg0b1sB26NChKC8vr3+fRW1tLe655x58+umnuOCCC+pfP+uss7Bq1SrcfffdqKiokIozGmOhUMD777+/TYwAsOuuu2LBggVYs2ZNos9LL70U//M//4OqqipcdtlluPTSS7Hddtvh5ZdfrrfR0b9DRHXO4+yzz8ZHH32ESy65BJMnT8b999+Pgw8+uMFGByXeLVu2YPz48Wjfvj2uueYaHHbYYcx6Dz30UBxzzDEAgOuuu66+X4abJiK8/PLLGD16NFavXo2LL74YV111FVauXIl99tkHb7/9dmLZxYsX44svvsAuu+yyzXt33303Jk6ciBUrVuBXv/oVrr76auy888549tlnE31S+n3nzp3RtWvXbfp9ixYt0Lt3b+Fk2uPxFAGBx+MpelatWhUACA466CAh+4ULFwYAgrvuumub9wAEF198cf3/L7744gBAMGnSpAZ2Z555ZgAgmD17dhAEQbBo0aKgoqIiuPLKKxvYffDBB0FlZWX963V1dUH79u2DnXfeOdi0aVO93dSpUwMAwV577ZUa/+DBg4OJEycm2hx//PEBgOCcc86pf61QKAQTJ04Mqqurg++++65BW7Rp0yZYsWJFve0TTzwRAAiefPLJ+tfGjh0b7LjjjsHGjRsb+Nx9992DPn361L921113BQCCUaNGBVu2bKl/fc2aNUHLli2DU089tUGs33zzTdCiRYttXo8T+h0/fnxQKBTqX99tt92CsrKy4PTTT69/bcuWLUHXrl0btOe0adMCAMH999/fwO+zzz7b4PXHH388ABDMmDGDGwul3VicddZZQYcOHer//3//93/B6NGjg/bt2we33nprEARBsHz58qCsrCz405/+VG93/PHHB927d6///3fffbdNn43aAgguu+yyBq8PGTIkGDp0aGJ8PPbdd9+gefPmwffff9/gWioqKpj27dq1C44++uhUv7/61a+C8vLy4NVXXw0efvjhAEBw/fXXS8X46quvBmVlZcFFF11U/1rYTvG2CIIguPnmmwMAwccff8z1OX/+/KC8vDw45JBDgq1btzZ4L+yLlP4djitRunfvHhx//PH1/xfROYtQJ0OHDg3q6urqX//9738fAAieeOIJcrxhXzr//POFYvjDH/4QAAgWLly4zXvx63zllVcCAMErr7wSBMEP7dmnT59tdL5+/fqgZ8+ewbhx4xLrfvHFF5kaXLlyZdCsWbNgxIgRwYYNGxq8F62HxcknnxxUVFQE8+bN2+Yav/jii23shw8fHowcOXKb1/fbb7+gf//+iXV5PJ7iwZ+IejwlwOrVqwEAzZo1M1bHWWed1eD/55xzDgDg6aefBvDDNy0WCgUceeSRWLZsWf2fjh07ok+fPnjllVcA/PDI59KlS3H66aejurq63t8JJ5yAFi1aCMXSsmVLfPjhh5g/f36q7dlnn13/77KyMpx99tmoq6vDiy++2MDuqKOOavA5vvAULvxG0RUrVuDll1/GkUceiTVr1tRf3/LlyzF+/HjMnz8fixcvbuDz1FNPbXCa9cILL2DlypU45phjGrRRRUUFRowYUd9GaZx88skNHrkbMWIEgiDAySefXP9aRUUFhg0b1uAbUR9++GG0aNEC48aNa1B/+HhnWH/45Sr/+te/Ek82RdqNx5577olvv/0Wn3zyCYAfTj5Hjx6NPffcs/4x7enTpyMIAu6JqCinn376NnXLfFPsVVddhRdffBFXX311gy+g2bBhQ4O+HKWmpkbo26ovueQSDBw4EMcffzzOPPNM7LXXXvjJT35CjnHp0qU49thj0bNnT5x33nkNYgTYn0+sqalpYMPiH//4BwqFAn7zm99s80U7YV/U1b9DKDpnMWXKlAafKT7jjDNQWVlZP2bJxHvGGWdIxUJh1qxZmD9/Po499lgsX768Pq5169Zh7NixePXVVxt8YVec5cuXA8A2n0t+4YUXsGbNGpx//vn19zyE9QhvyAMPPIA77rgDP//5z9GnT5/619P6FKs/tWrVyspPgXk8HjfwX1bk8ZQAzZs3B4DUR+tUiC5AAKB3794oLy+vf3xt/vz5CIJgG7uQcEEY/qZd3K6qqmqbL7AIHwcLadGiBWpra3HZZZfhoIMOwg477IBBgwZhwoQJ+J//+R/stNNODezLy8u38bnDDjsAwDaP3XXr1q3B/8NFXPiZsk8//RRBEOCiiy7CRRddxLzGpUuXokuXLvX/79mzZ4P3wwX1Pvvswywf3sc04rGGCfx22223zevRz8TNnz8fq1atQvv27bnxA8Bee+2Fww47DJdeeimuu+46jBkzBgcffDCOPfbYbRadae3GI0wup02bVv8Y3xVXXIF27drV/zbptGnT0Lx5cwwePDjRVxI1NTXbPBLZqlWr1PjiPPjgg7jwwgtx8sknb5OM1NbWoq6ujllu48aNDb5llEd1dTXuvPNODB8+HDU1NbjrrrsSkwMW69atw4EHHog1a9Zg+vTpDT47GsawadMmZoxRGxYLFixAeXk5BgwYwLXR1b9DRHXOIz7GNG3aFJ06dWowZlHiraysbPBZb1OEcR1//PFcm1WrVqV+AVYQ+3z4ggULAACDBg0SjmXatGk4+eSTMX78eFx55ZUN3kvrU6z+FAQBuV97PJ784hNRj6cEaN68OTp37ow5c+YI2fMWAmlf4JLko1AooKysDM888wzzM23xL1QRIf6lS3fddRdOOOEEjB49GgsWLMATTzyB559/Hrfffjuuu+463HbbbQ2+0ZEC73N44WIuPIE499xzMX78eKbt9ttv3+D/8YVY6OPee+9t8AU8IdEv/JCJlfV6dDFaKBTQvn173H///czyYcJWVlaGRx55BG+++SaefPJJPPfcczjppJPwxz/+EW+++WaDe5nWbjw6d+6Mnj174tVXX0WPHj0QBAF22203tGvXDj/96U/x+eefY9q0adh9992VfupC5vOVcV544QVMnjwZEydOxG233bbN+506dcLWrVuxdOnSBkl+XV0dli9fjs6dOwvV89xzzwH4YRE/f/78bTYykqirq8Ohhx6K999/H88999w2yUbr1q3RqFEjLFmyZJuy4WuicfLQ1b9DTOhcJd5GjRoZ/9mVaFx/+MMfsPPOOzNtksbT8Gd4qJstcWbPno1JkyZh0KBBeOSRR7Zpj3B8XrJkyTabYEuWLMGuu+66jc/vv/++wedMPR5PceMTUY+nRDjwwAMxdepUvPHGG9htt90SbcOd9PgPlIenlSziC+NPP/0UhUKh/htMe/fujSAI0LNnz/pTRxbhj6vPnz+/wUnE5s2bsXDhwganX/Fvxxw4cGD9v1u3bo0TTzwRJ554ItauXYvRo0fjkksuabBALRQK+OyzzxrEM2/ePACoj1uU8GS1qqqqwU9iUOjduzcAoH379tI+VOjduzdefPFF7LHHHkKndCNHjsTIkSNx5ZVX4oEHHsBxxx2Hv//971qSAOCHU9FXX30VPXv2xM4774xmzZph8ODBaNGiBZ599lnMnDmz/jdCeZg+XXnrrbdwyCGHYNiwYXjooYeYyVSYLLzzzjs44IAD6l9/5513UCgUuMlElPfffx+XXXYZTjzxRMyaNQunnHIKPvjgA6HH1QuFAiZPnoyXXnoJDz30EPbaa69tbMrLy7HjjjvinXfeYV5jr169Eh/t7927NwqFAubOncu9HhP9W0TnPObPn4+99967/v9r167FkiVL6u+RST2q9MswrubNm0vFFf5kysKFC5l+58yZs82mWZwFCxZgwoQJaN++PZ5++mlm4hvt99Gk8+uvv8ZXX321zZfZhTGpPOHg8Xjyhf+MqMdTIpx33nlo0qQJTjnlFHz77bfbvL9gwQL86U9/AvDDAqdt27YNvrUU+OF3BnncfPPNDf5/4403AvjhdwiBH74psqKiApdeeuk2p2FBENR/bmnYsGFo164dbrvttgaPM959993bJMb77rtvgz/hDnzoK6Rp06bYfvvtmY+I3XTTTQ3iuOmmm1BVVYWxY8dyr5VF+/btMWbMGPz5z39mnip99913qT7Gjx9f/xt7rM9eivhQ4cgjj8TWrVtx+eWXb/Peli1b6tv/+++/3+YehotOVhvLsueee2LRokV48MEH6x/VLS8vx+67745rr70WmzdvTv18aOPGjQFsu6mig48++ggTJ05Ejx498K9//YubvO+zzz5o3bp1/Tf4htx6661o3LgxJk6cmFjP5s2bccIJJ6Bz587405/+hLvvvhvffvst/vd//1coznPOOQcPPvggbrnllgbfGBzn8MMPx4wZMxoko5988glefvllHHHEEYl1HHzwwSgvL8dll122zecTw76iu39TdM5i6tSpDeK49dZbsWXLlvoxy6Qew98XlemXQ4cORe/evXHNNddg7dq15Li6dOmC7bbbbptNh/322w/NmjXDb3/7221+eiuq92+++Qb77bcfysvL8dxzz3G/7XfgwIHo168fpk6d2uBpmltvvRVlZWU4/PDDG9ivWrUKCxYsMPbN7h6Pxz38iajHUyL07t0bDzzwAI466ij0798fkydPxqBBg1BXV4fXX38dDz/8cIPfrjvllFNw9dVX45RTTsGwYcPw6quv1p8Wsli4cCEmTZqECRMm4I033sB9992HY489tn53u3fv3rjiiivwq1/9CosWLcLBBx+MZs2aYeHChXj88ccxZcoUnHvuuaiqqsIVV1yB0047Dfvssw+OOuooLFy4EHfddZfwj5wPGDAAY8aMwdChQ9G6dWu88847eOSRRxp8MRHww+cDn332WRx//PEYMWIEnnnmGTz11FP49a9/Tfop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qKuYp0w+YSHKJLJixQpcffXVeP/999GzZ0906dJlrwElKEhNTz6U/lSOeVHHYXp3QfTdGldIitfGkW7TuRgWg644TO8s5CkfXbh3qjb92DjCbrNvq74iYRrOxR9frzMOF2oe6lyUFaF79uzBokWLsHDhQpx99tkYN24c2rZtSxobky9YiDLCvPHGG7j66quxa9cuHHvssWjTps1efzctSAE9x2HS2tAhTG0IUSDbO2thfkz4CvpT8alqh1qU5qF4jfNlMjeydA8p8siFsVkWkz5Njok2jsrazsOgnSy9lmEqD6mO4a5duxYfffQRWrVqhQkTJuDEE0+kCI/JOSxEmVTs2LED99xzD8aOHYuOHTuiV69eaNSo0Y+uy5Io1THYq4rTLBYNafwAZnPC9feETK3cy8SUxwURz1cec9DvM41fXYW2il2bIjRvueH6nKL7pJFLfSKNX5OLtrIidPPmzZg3bx6qqqrwl7/8BVdffTXq169PFSKTc1iIMlKsWrUK1157LaZPn46jjjoKRxxxROj5fxcEaZRfW4O9n7gjX7a+6CGPBZiHS4LU9vGuOJ95F6GevzyKm6DPKL82vthFNOdt99m8jYGeP5fmFBvfvRD0a+OIeRQ25wNZAbp7924sWrQIn332Gc4//3zce++9PzopxzBJsBBllJg2bRquuuoqbN26FT179kT79u1Rp06d0GtdEKWeTxuFoZ+4SdhWbFk8Qijjz5ZPz6+tVfYgSV88Uwr5l2ehHebXhviMIqlvuCTadflz4XsATPm1JTyjCD5zF3Y/TfilEKDFYhHLly/HJ598ggMPPBATJkzA8ccfTxUiU2KwEGWUqampwcMPP4z/+7//Q4sWLdCrVy+0bNky8nobghSwswOQhrgvG+DinNafLZ+mfYtiu0gshcLc9jFxD869cP959WfDpwtzmQg2x2bbc5GsCK2qqsL8+fOxa9cujB07Fpdeemntb80zjAwsRBkyvv/+e9x111146KGHcMghh6Bnz55o2rRpbJuo3ySlIG6SsV38RBEsGOImdA8d7xTmuUjy+6T2K1KAubIj6hF1L0wWk6WWdybGOo8s5B0gNubp6qt5yAHTPtPMTbZPIHm4UBNkVYB+//33mD9/PqqqqnDzzTfjxhtvROPGjalCbSZKKwAADQRJREFUZEoYFqIMOatWrcLNN9+MV155BV27dkX37t3RsGHD2DYUu6QUX8wi256CtJO1LpHq2rtEun3K+qUomG2KA1nf1ELBhSOrWfHLOfdjOOfE/FLnm0faZ2gz3zxU8o7iPmZJgG7btg2ffvopKisrMXLkSPz5z39G69atqUJkGBaijD4WLFiA66+/Hp988gm6deuGsrIyoW9SE90l1XmsxrQwpZ6kVQqIUizSPES/vMKPrmem8z7oWJVPyjnX8s3z7aLfPOWbLj8y98jWLqjft2v5ZvLUje57oHveTms/ywK0pqYGn3/+OT7//HOcfPLJuO+++9C5c2eqEBmmFhaijFaKxSLeeust3HDDDaiqqkLXrl3RpUuX1II00n4O3rdy6f0dP7YKJtu+48j6F1jYPhYWhc0vLHE11wC7X+jmmk0Zv1GUkgj1+48jq+/IuvKeZxQ2F1ZlRGhNTQ2++OILVFRUoEuXLhg3bhz/HiijFRaijBEKhQJee+013HbbbVi3bp2yIHXxXRMgfVw2V+jDEC3kRLFxbI7yM7j4TFSPhrnwmQA3npOKEHUhfkpU88zVL+Wiek6qecJ59j+oj6e78LlcyTNAXoBWVFTgiy++QFlZGe6++26ccsopkb+CwDBUsBBljFIoFPD666/j1ltvTS1IPfIkTG2vlEeh850i02TpnZ4k0sblogD10PWupC3yskAApIsrC33FBRFIgY0FF12I9v8sCU/beaYiQCsqKtC1a1fcfffdOPnkk1mAMsZgIcpYwROkt912G9auXYuuXbsKv0Pqx0VRCogJU1dFKOBG4eJKke5KHEHiBICrMQNuxcZ5Hk9UbK6KT8Ct++nKGO9CnocR9qxc+OLAKFwSxcFY0opQvwA98sgjcffdd2PAgAEsQBnjsBBlrFIsFmt3SNeuXYsuXbqgrKws8Vt2w3BVlAJuT65huFK4uFhUetiOx09W8sul5wm4k+eAO6IlDJcK8ChczC3AnVhciCMM18cu13Jf9Qjutm3b8MUXX+DLL7+sFaAnnXQSC1DGGixEGScoFot48803cffdd2P+/Pno3LkzunbtimbNmknbdEmYyhy9sT3ZuVIIAO4VdX5sP6e0uNAHXHiOAOd5XAxpcCVeV56lC8/RjwvxpM0r12K1/SxVBeh3332HiooKLF26FAMGDMAtt9yCfv36sQBlrMNClHGOefPmYezYsXj99dfRsWNHdO3aFa1atVKyaUOUyk5mLnwTn2sFOuBGMRXEZBGsunNg4idBRHy7+PxcjAmwl1Oivm3uZnFOiWMqpqS5S2WsMh27K89PRYAWi0VUVVVh8eLFWLNmDS644ALcdNNNOOKII6jDZBhpWIgyzrJy5Urcd999mDhxItq0aYOysjK0b9+eZAVPlzDVPYGaEqkuClHA/eLTQ1cuUdlO8kHpy9VnBrgpGgD6e2biOSf50vFzHa4+N9fiAmjHdNv5pOtzuPTcVARooVDAihUrsHjxYmzevBnXXHMNrrvuOrRt25Y6TIZRhoUo4zwbN27Eo48+inHjxqFu3bro3LkzOnXqhAYNGpDYVxWlrkxmlMWB6wWVh2vxqeSCS+9KUe2euvysPFxddAHk+qHNne8wKPLalTE2DpfHTCB9nrtwMicM6jHWteelIkB37tyJL7/8EpWVlWjUqBFuuukmXHbZZWjatCl1mAxDBgtRJjPs3LkTzz//PO69916sWrUKhx12GMrKytC8eXNSP0FhGjZRZaEw8pApKFwvqgD3Y0wSYS4JT1HSiJwsiFDAbSEKxOe5a6JTFNHcz8o46/pYBETnucndTWpEhGXWxCeQXoBu3LgRS5YswdKlS9G9e3fceOONOPfcc1P/CgHD2ICFKJM5isUi5syZg3HjxuG1117DQQcdhMMPP5zs2K6fsN3S2jgcm8xkSPMFEi5+XtcLwCwXeaKI5pCrn9VlIerqrhQ1Wf6cLo9BWR/f05DFsVZFgBYKBaxcuRKVlZVYv349hg0bhuuuuw49e/akDpNhtMJClMk069atw6OPPopHHnkEderUQadOndC5c2epn38RgYUpHa6/M5bFe2GTrN4vaiGa1ftgiyzfL2oRmuV7YYOs3i8VAbp9+/ba3c8mTZpgzJgxGDVqFH7605+SxccwJmEhyuSCmpoavPLKK7j//vvx2Wef1QrSli1bGvGfdYFq6gicycKBEhv3g/Mm2g81xUJBmw+T9ySLOeORpdzRmS9BPzrIyrF5D1u7nTqfcRrxWSwWsWHDBlRWVmLZsmXo06cPbrjhBgwePBj16tXTFiPDmICFKJM7PvnkEzz44IOYNGkS9t9/f3Ts2BGHHnoo9tlnH+OxuC5Qs/IOVhRZPtIXhcvvjmZV/PgplZxx4TNkfaHFT97zxoXYs3i8No6wz5NGgO7YsQNLly7F8uXLsW3bNlx88cX49a9/jS5dulCGyTBWYSHK5JZNmzbhhRdewMMPP4zKykp06tQJhx9+OFq2bGn9R5xtC9SsC9A4XCuuKHDl9xpN+jWFy+/4yWLrmbm8iEJBHscWwM58kKdFijBkj98Wi0WsX78eS5cuxbJly3DUUUfh2muvxdChQ9GoUSMdoTKMVViIMiXB/Pnz8eijj+K5555DixYt0LFjR3Tq1MnKLmkUceIU0PN7gnmY8KPIo8Dw0F3E5V18+slzngBmf4eR2r5L5D1PALO/h0zpwyVkf35lx44dtUdvd+7ciZEjR+KKK65AWVmZjjAZxhlYiDIlxZYtWzBp0iQ89NBDWLx4ce2x3QMOOMD6LmkUVAI1r6v5cZTSZ1YVp6W0SBHE5W/OpUZWmJaS6AxSCiI0SNqxs9QEpx/Z3c9CoYC1a9di+fLlWLFiBY455hhce+21OPvss7HvvvvqCJVhnIOFKFOyLFy4EE888QSeffZZ1KlTBx06dMBhhx2G/fbbz3ZoQogK1FISY2GU8udPEg+lLD79lJIQ9RMnSktZePopRRHqJ2z8zPuxWlFkdz83btyIpUuXYsWKFWjUqBEuvfRSjBw5Ep07d9YRJsM4DQtRpuTZtWsXpk6diokTJ+Ktt95C27Zt0aFDB2tfcKRKkkBl3EOleLP1TcR5KjjzJkRtfjt1Hu9jXj4TjxXqyO5+bt++HcuWLcOKFSuwceNGDBkyBKNGjcKAAQP4m2+ZkoaFKMP4qK6uxgsvvICJEyfWHt3t0KED2rVrVzKThUkhm7UCxfWfn9F5P019dhs5YVOIZvlnQAAzP61jGpunKLL625hBsvZzSEnI7H7u3r0bq1evxsqVK7Fy5Ur06tULl19+Oc477zw0b95cV6gMkylYiDJMBBUVFXjyySfx3HPPYdOmTejQoQMOOeQQHHDAAajruCBxlSyKXJ2FYdaEuA5cEGKiQtSFWPOObWErKkLzvDDjGrZErczu5549e/D111/Xis82bdpgxIgRuOSSS3DooYcqxcsweYSFKMMkUCgUMHfuXPzjH//ApEmTsHv3bhx88MHo2LEjWrdu7eyXHJUapo8kc4HoLiwSGNOnFzgX9GPjRIqI+CwUCqiqqsKKFSuwcuVKNG/eHMOHD8eFF16Io446imsEhomBhSjDpGD37t1477338Oyzz+KVV15BgwYN0L59exx88MFo3bo175TmFBvv3XJha468vQuYFVgsmsf11wtUSPOFQaoUCgWsW7cOa9aswapVq1C/fn388pe/xEUXXYTevXtzLcAwgrAQZRhJampqUF5ejpdeegmvv/46CoUC2rdvj/bt2+PAAw9E/fr1bYfIZATezbVP3r6wiAIWiuHkVcyZFHJZpKamBmvXrsXatWuxevVqNGnSBGeffTbOO+889O/fn+d8hpGAhSjDELB7927MmTMHr7zyCl5++WVUV1fjoIMOwoEHHoh27dqhcePGtkNkShgWuslkVYhmVSyymGOywJYtW7BmzRqsW7cOq1evxkEHHYShQ4finHPOwdFHH807nwyjCAtRhiGmWCxi0aJFePXVVzFlyhRUVFSgTZs2aN26NQ488EC0bduWV06ZXJEHoatLiOZVcOmExRxji5qaGlRVVWHdunXYsGEDqqur0bNnTwwdOhRDhgzh3/pkGGJYiDKMZqqrqzFjxgy8+eabKC8vR3V1Ndq1a4eGDRuiQYMGtsNjGOdZtGiR7RAyR7du3WyHwDCZoVgsYvPmzVi7di3atWuH0047Daeffjr69++P/fbbz3Z4DJNbWIgyjEGKxSIqKysxY8YMrF69Gjt37rQdEsMwDMOUPGVlZTj11FPRoUMH26EwTMnAQpRhGIZhGIZhGIYxCr+8wjAMwzAMwzAMwxiFhSjDMAzDMAzDMAxjFBaiDMMwDMMwDMMwjFFYiDIMwzAMwzAMwzBGYSHKMAzDMAzDMAzDGIWFKMMwDMMwDMMwDGMUFqIMwzAMwzAMwzCMUViIMgzDMAzDMAzDMEb5fwr+FTglFuDDAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "engine": 0 - }, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[output:0]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "engine": 0 - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import functions as func\n", "\n", @@ -938,7 +466,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.13" + "version": "3.11.9" }, "vscode": { "interpreter": { From 38bfce6f1d8bd41e5c839449518eff24170cbc09 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Fri, 12 Sep 2025 17:00:48 +0200 Subject: [PATCH 45/75] refactor: use new versions of environment variables (#147) The old ones are currently deprecated and expected to be removed in the future (after a grace period). See https://github.com/NOAA-GFDL/NDSL/pull/193 for more details. Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- README.md | 6 +++--- doc_primer_orchestration.md | 2 +- docs/overview.rst | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index abb2e9e7a..8d74b1d73 100644 --- a/README.md +++ b/README.md @@ -109,12 +109,12 @@ After the run completes, you will see an output directory `output.zarr`. An exam ### Environment variable configuration -- `PACE_CONSTANTS`: Pace is bundled with various constants. +- `NDSL_CONSTANTS`: Pace is bundled with various constants. - `GFDL` NOAA's FV3 dynamical core constants (original port) - `GFS` Constant as defined in NOAA GFS - `GEOS` Constant as defined in GEOS v13 -- `PACE_FLOAT_PRECISION`: default precision of the field & scalars in the numerics. Default to 64. -- `PACE_LOGLEVEL`: logging level to display (DEBUG, INFO, WARNING, ERROR, CRITICAL). Default to INFO. +- `NDSL_LITERAL_PRECISION`: default precision of the field & scalars in the numerics. Default to 64. +- `NDSL_LOGLEVEL`: logging level to display (DEBUG, INFO, WARNING, ERROR, CRITICAL). Default to INFO. ## Quickstart - Docker diff --git a/doc_primer_orchestration.md b/doc_primer_orchestration.md index f669155e1..e98f25e3b 100644 --- a/doc_primer_orchestration.md +++ b/doc_primer_orchestration.md @@ -45,7 +45,7 @@ DaCe has many configuration options. When executing, it drops or reads a `dace.c `ndsl.dsl.dace.dace_config` carries a set of tested options for DaCe, with doc. It also takes care of removing the `dace.conf` that will be generated automatically when using DaCe. -Orchestration can be debugged by using the env var `PACE_DACE_DEBUG`. +Orchestration can be debugged by using the env var `NDSL_DACE_DEBUG`. When set to `True`, this will drop a few checks: - `sdfg_nan_checker`, which drops a NaN check after _every_ computation on field _written_, diff --git a/docs/overview.rst b/docs/overview.rst index c3a6c5541..52e21bb0a 100644 --- a/docs/overview.rst +++ b/docs/overview.rst @@ -11,4 +11,4 @@ A few environment variable change the behavior of the model: - Build: will build the program then exit. This _build no matter what_. (backend must be `dace:gpu` or `dace:cpu`) - BuildAndRun: same as above but after build the program will keep executing (backend must be `dace:gpu` or `dace:cpu`) - Run: load pre-compiled program and execute, fail if the .so is not present (_no hashs check!_) (backend must be `dace:gpu` or `dace:cpu`) -- PACE_FLOAT_PRECISION=64 control the floating point precision throughout the program. +- NDSL_LITERAL_PRECISION=64 control the floating point precision throughout the program. From 1c98cf9880f39cc95618c5ed322805a6ae2dd956 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Tue, 16 Sep 2025 20:30:21 +0200 Subject: [PATCH 46/75] refactor: change tests to use gt4py storage (#148) Move pace tests away from numpy allocated memory over to gt4py allocated memory. This is forward compatible with expected changes in NDSL, e.g. https://github.com/NOAA-GFDL/NDSL/pull/228 Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- tests/main/test_grid_init.py | 4 ++-- tests/mpi/test_grid_init.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/main/test_grid_init.py b/tests/main/test_grid_init.py index b0510c9d1..08ebe9143 100644 --- a/tests/main/test_grid_init.py +++ b/tests/main/test_grid_init.py @@ -25,9 +25,9 @@ def get_cube_comm(layout, rank: int): def get_quantity_factory(layout, nx_tile, ny_tile, nz): nx = nx_tile // layout[0] ny = ny_tile // layout[1] - return QuantityFactory( + return QuantityFactory.from_backend( sizer=SubtileGridSizer(nx=nx, ny=ny, nz=nz, n_halo=3, extra_dim_lengths={}), - numpy=np, + backend="numpy", ) diff --git a/tests/mpi/test_grid_init.py b/tests/mpi/test_grid_init.py index bbb77ff99..36865d067 100644 --- a/tests/mpi/test_grid_init.py +++ b/tests/mpi/test_grid_init.py @@ -27,9 +27,9 @@ def get_cube_comm(layout, comm: MPIComm): def get_quantity_factory(layout, nx_tile, ny_tile, nz): nx = nx_tile // layout[0] ny = ny_tile // layout[1] - return QuantityFactory( + return QuantityFactory.from_backend( sizer=SubtileGridSizer(nx=nx, ny=ny, nz=nz, n_halo=3, extra_dim_lengths={}), - numpy=np, + backend="numpy", ) From 8a3232006b89651970449b873ec44a8ae782f7f0 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Tue, 23 Sep 2025 15:47:54 +0200 Subject: [PATCH 47/75] Use eta files shipped with NDSL (#149) Some tests and examples in pace depend on eta files for 79 and 91 layers. These eta files are now shipped with NDSL starting with https://github.com/NOAA-GFDL/NDSL/pull/171 Since pace depends on NDSL, there's no need for a script to generate these eta files: They are already present in the NDSL/ directory that is pulled in as a submodule. Tests and examples thus don't have to generate eta files anymore before they can run. This simplifies workflows (e.g. the GHA one), but also on-boarding of new users. The PR includes a buch of typo fixes and markdown improvements. Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- .github/workflows/main_unit_tests.yaml | 6 - README.md | 9 - examples/README.md | 20 +- examples/configs/README.md | 18 +- examples/configs/baroclinic_c12.yaml | 2 +- examples/configs/baroclinic_c12_orch_cpu.yaml | 2 +- .../configs/baroclinic_c12_write_restart.yaml | 2 +- examples/configs/baroclinic_c48_no_out.yaml | 2 +- examples/configs/test_external_C12_1x1.yaml | 2 +- examples/configs/test_external_C12_2x2.yaml | 2 +- examples/generate_eta_files.py | 407 ------------------ examples/plot_pcolormesh_cube.py | 4 +- tests/main/fv3core/test_cartesian_grid.py | 2 +- tests/main/fv3core/test_dycore_baroclinic.py | 2 +- tests/main/fv3core/test_dycore_call.py | 2 +- tests/main/fv3core/test_init_from_geos.py | 2 +- tests/main/physics/test_integration.py | 2 +- tests/main/test_grid_init.py | 2 +- 18 files changed, 41 insertions(+), 447 deletions(-) delete mode 100755 examples/generate_eta_files.py diff --git a/.github/workflows/main_unit_tests.yaml b/.github/workflows/main_unit_tests.yaml index c0b01a964..dc3c59323 100644 --- a/.github/workflows/main_unit_tests.yaml +++ b/.github/workflows/main_unit_tests.yaml @@ -72,12 +72,6 @@ jobs: pip --version pip list - - name: Prepare input files - run: | - cd ${GITHUB_WORKSPACE}/pace - mkdir tests/main/input - python examples/generate_eta_files.py tests/main/input - - name: Run tests run: | cd ${GITHUB_WORKSPACE}/pace diff --git a/README.md b/README.md index 8d74b1d73..ae87cc40e 100644 --- a/README.md +++ b/README.md @@ -89,15 +89,6 @@ Shell scripts to install Pace on specific machines such as Gaea can be found in Located in the directory `examples/configs/` there are several example configurations to exhibit the current functionality of Pace. We suggest a new user start with the `baroclinic_c12.yaml` configuration. -Before starting any run, including unit tests, the user must ensure that the proper input files are available. For the `baroclinic_c12.yaml` configuration a script to generate these files and place them in the location referenced in the configuration file is available in the `examples/` directory; `generate_eta_files.py`. To generate the files use the following commands from the top level of the clone of Pace: - -```shell -mkdir tests/main/input -python examples/generate_eta_files.py tests/main/input -``` - -These commands will generate the files necessary and place them in the `tests/main/input` directory. Once the files are generated the `baroclinic_c12.yaml` configuration can be used to generate a run: - ```shell mpirun -n 6 python3 -m pace.run examples/configs/baroclinic_c12.yaml diff --git a/examples/README.md b/examples/README.md index 873e04aa9..06778c235 100644 --- a/examples/README.md +++ b/examples/README.md @@ -6,14 +6,14 @@ This directory serves as a demo of how you can develop and run individual compon The easiest way of running these demos is using a Docker container. If you do not already have Docker installed, it can be downloaded directly from [Docker](https://www.docker.com/). Once Docker is set up, you can build and run the container from the root Pace directory: -``` +```shell make build make notebook ``` Once the docker container is running, you can connect to the Jupyter notebook server by copying and pasting the URLs into any browser on your machine. An example output is shown below: -``` +```none Serving notebooks from local directory: /notebooks Jupyter Server 1.19.1 is running at: http://0d7f58225e26:8888/lab?token=e23ef7f3a334d97d8a74d499839b0dcfa91c879f7effa968 @@ -40,29 +40,29 @@ If you prefer to run outside of a Docker container, you will need to install sev ## Building an environment to run these examples on the GFDL Post Processing and Analysis Cluster (PP/AN) -Within the `build_scripts` directory are a couple scripts relevant for setting up an environment to run these notebook examples on the [GFDL Post Processing and Analysis Cluster (PP/AN)](https://www.noaa.gov/organization/information-technology/ppan). To create an environment, log in to either the `jhan` or `jhanbigmem` node on the analysis cluster clone this repository, and then navigate to the `build_scripts` directory: +Within the `build_scripts` directory are a couple scripts relevant for setting up an environment to run these notebook examples on the [GFDL Post Processing and Analysis Cluster (PP/AN)](https://www.noaa.gov/organization/information-technology/ppan). To create an environment, log in to either the `jhan` or `jhanbigmem` node on the analysis cluster clone this repository, and then navigate to the `build_scripts` directory: -``` +```shell $ ssh analysis $ git clone --recursive https://github.com/NOAA-GFDL/pace.git $ cd pace/examples/build_scripts ``` -From there, run the installation script. This script takes two arguments. The first is to a directory you would like to install all the software into, and the second is a name you would like to give the conda environment the script creates. Since conda environments can take up a reasonable amount of space, it is recommended that you install things in your `/work` directory rather than your `/home` directory: +From there, run the installation script. This script takes two arguments. The first is to a directory you would like to install all the software into, and the second is a name you would like to give the conda environment the script creates. Since conda environments can take up a reasonable amount of space, it is recommended that you install things in your `/work` directory rather than your `/home` directory: -``` +```shell $ bash build_ppan.sh /work/$USER/pace-software pace ``` -This will take a few minutes to complete, but assuming it finishes succesfully you should then be able to activate the environment and run the example notebooks. To do so, first source the `activate_ppan.sh` script. This loads some modules, activates the appropriate conda environment, and sets some environment variables necessary for running the examples. You will then be able to start JupyterLab following [GFDL's recommended approach](https://wiki.gfdl.noaa.gov/index.php/Python_at_GFDL#Using_Jupyter_Hubs_or_Notebooks_on_GFDL_Workstations_and_PPAN): +This will take a few minutes to complete, but assuming it finishes successfully you should then be able to activate the environment and run the example notebooks. To do so, first source the `activate_ppan.sh` script. This loads some modules, activates the appropriate conda environment, and sets some environment variables necessary for running the examples. You will then be able to start JupyterLab following [GFDL's recommended approach](https://wiki.gfdl.noaa.gov/index.php/Python_at_GFDL#Using_Jupyter_Hubs_or_Notebooks_on_GFDL_Workstations_and_PPAN): -``` +```shell $ source activate_ppan.sh /work/$USER/pace-software pace $ cd .. $ jhp launch lab ``` -It will take a minute or so for the server to start up. If you are on GFDL's network or have [configured your proxy settings appropriately](https://wiki.gfdl.noaa.gov/index.php/Creating_a_GFDL_SSH_Tunnel), you will then be able to navigate to the URL produced by the command in your local browser. This will take you to the JupyterLab interface, where you can open and run the example notebooks. Note that it can take some time to initially connect to the notebook kernel, so be patient. +It will take a minute or so for the server to start up. If you are on GFDL's network or have [configured your proxy settings appropriately](https://wiki.gfdl.noaa.gov/index.php/Creating_a_GFDL_SSH_Tunnel), you will then be able to navigate to the URL produced by the command in your local browser. This will take you to the JupyterLab interface, where you can open and run the example notebooks. Note that it can take some time to initially connect to the notebook kernel, so be patient. # Driver Examples @@ -84,7 +84,7 @@ We have also included a utility to convert the zarr output of the run to netcdf, $ python3 zarr_to_nc.py output.zarr output.nc ``` -Another example is `baroclinic_init.py`, which initializes a barcolinic wave and writes out the grid and the initial state. To run this script with the c12 6ranks example: +Another example is `baroclinic_init.py`, which initializes a baroclinic wave and writes out the grid and the initial state. To run this script with the c12 6ranks example: ```bash $ mpirun -n 6 python3 baroclinic_init.py ./configs/baroclinic_c12.yaml diff --git a/examples/configs/README.md b/examples/configs/README.md index 56b61e499..8825d9143 100644 --- a/examples/configs/README.md +++ b/examples/configs/README.md @@ -1,53 +1,69 @@ # Driver Configurations + Currently, driver takes in a yaml config containing the following options. Example configuration file can be found in examples/configs. ## stencil_config + Configuration options pertaining to GT4Py stencils such as backend and whether to rebuild stencils. ## initialization_type + Driver initialization type can be either `analytic`, `restart`, `fortran_restart`, `serialbox`, or `predefined`. ## initialization_config + **`analytic`**: `case` can optionally be set to `baroclinic_instability` (default) or `baroclinic_steady`. `start_time` can optionally be set to a datetime (default: 2000-1-1). [TODO] Update initialization_config parameters for other initialization types **`serialbox`**: `path` to the test data directory and optionally `serialized_grid` to specify whether to create grid from serialized data or calculate them in Python. The directory should have the necessary serialized data and a fortran namelist which will be used to set options such as dycore_config and physics_config. Currently, the supported serialized dataset is the same as the test case in pace-physics. To obtain this data, run the following command at the top level: -``` + +```shell make -C physics get_test_data ``` + [TODO] Update this once driver specific savepoints are added. ## performance_config + Configuration for doing performance timing. \ timer: true if performance timing is desired \ json_dump: true if timing output should be saved as a json file \ experiment_name: default to test if not specified ## diagnostics_config + Diagnostics configuration specifies where and what variables to save from the model. Currently, we support writing to `zarr` format. ## dycore_config + Dynamical core configuration \ To override this with a Fortran nml file, use `namelist_override`. See serialbox example yaml for more information. ## physics_config + Physics configuration ## dt_atmos* + Time step in seconds ## days/hours/minutes/seconds* + Simulation runtime \ \ *Note that this is required for serialbox initialization, time information in the nml file will not be used. ## ----**The following options need to match .nml file when using namelist_override**---- + ## nx_tile + Number of grid cells in the x-direction on one tile of the domain. This number is then duplicated in the y-direction since we only support `nx = ny`. ## nz + Number of vertical levels ## layout + Processor layout on each tile diff --git a/examples/configs/baroclinic_c12.yaml b/examples/configs/baroclinic_c12.yaml index 8976542aa..fc9418b15 100644 --- a/examples/configs/baroclinic_c12.yaml +++ b/examples/configs/baroclinic_c12.yaml @@ -98,4 +98,4 @@ physics_config: grid_config: type: generated config: - eta_file: 'tests/main/input/eta79.nc' + eta_file: 'NDSL/tests/data/eta/eta79.nc' diff --git a/examples/configs/baroclinic_c12_orch_cpu.yaml b/examples/configs/baroclinic_c12_orch_cpu.yaml index b1f2a39e0..7cb6b3edd 100644 --- a/examples/configs/baroclinic_c12_orch_cpu.yaml +++ b/examples/configs/baroclinic_c12_orch_cpu.yaml @@ -77,4 +77,4 @@ physics_config: grid_config: type: generated config: - eta_file: 'tests/main/input/eta79.nc' + eta_file: 'NDSL/tests/data/eta/eta79.nc' diff --git a/examples/configs/baroclinic_c12_write_restart.yaml b/examples/configs/baroclinic_c12_write_restart.yaml index 830a9e054..588784413 100644 --- a/examples/configs/baroclinic_c12_write_restart.yaml +++ b/examples/configs/baroclinic_c12_write_restart.yaml @@ -96,4 +96,4 @@ physics_config: grid_config: type: generated config: - eta_file: "tests/main/input/eta79.nc" + eta_file: "NDSL/tests/data/eta/eta79.nc" diff --git a/examples/configs/baroclinic_c48_no_out.yaml b/examples/configs/baroclinic_c48_no_out.yaml index 75a815262..24f3139eb 100644 --- a/examples/configs/baroclinic_c48_no_out.yaml +++ b/examples/configs/baroclinic_c48_no_out.yaml @@ -78,4 +78,4 @@ physics_config: grid_config: type: generated config: - eta_file: 'tests/main/input/eta79.nc' + eta_file: 'NDSL/tests/data/eta/eta79.nc' diff --git a/examples/configs/test_external_C12_1x1.yaml b/examples/configs/test_external_C12_1x1.yaml index e77769206..b26edbfe4 100644 --- a/examples/configs/test_external_C12_1x1.yaml +++ b/examples/configs/test_external_C12_1x1.yaml @@ -10,7 +10,7 @@ grid_config: config: grid_type: 0 grid_file_path: "tests/main/input/C12.tile" - eta_file: 'tests/main/input/eta79.nc' + eta_file: 'NDSL/tests/data/eta/eta79.nc' initialization: type: analytic config: diff --git a/examples/configs/test_external_C12_2x2.yaml b/examples/configs/test_external_C12_2x2.yaml index 853306f88..fc84c85b8 100644 --- a/examples/configs/test_external_C12_2x2.yaml +++ b/examples/configs/test_external_C12_2x2.yaml @@ -10,7 +10,7 @@ grid_config: config: grid_type: 0 grid_file_path: "tests/main/input/C12.tile" - eta_file: 'tests/main/input/eta79.nc' + eta_file: 'NDSL/tests/data/eta/eta79.nc' initialization: type: analytic config: diff --git a/examples/generate_eta_files.py b/examples/generate_eta_files.py deleted file mode 100755 index 78f7cf34f..000000000 --- a/examples/generate_eta_files.py +++ /dev/null @@ -1,407 +0,0 @@ -import sys -from pathlib import Path - -import numpy as np -import xarray as xr - - -""" -This notebook uses the python xarray module -to create an eta_file containing ak and bk coefficients -for km=79 and km=91. The coefficients are written out to -`eta79.nc` and `eta91.nc` netcdf files respectively in the -given folder (defaults to `./` if not provided). - -To run this script: `python3 ./generate_eta_files.py ` -""" - -folder = Path("." if len(sys.argv) < 2 else sys.argv[1]) -if not folder.exists(): - raise ValueError(f"Cannot open folder '{folder}'. Make sure it exists.") -if not folder.is_dir(): - raise ValueError(f"Expected '{folder}' to be a directory.") - -# km = 79 -ak = xr.DataArray( - dims=["km1"], - attrs=dict(units="Pa", _FillValue=False), - data=np.array( - [ - 3.000000e02, - 6.467159e02, - 1.045222e03, - 1.469188e03, - 1.897829e03, - 2.325385e03, - 2.754396e03, - 3.191294e03, - 3.648332e03, - 4.135675e03, - 4.668282e03, - 5.247940e03, - 5.876271e03, - 6.554716e03, - 7.284521e03, - 8.066738e03, - 8.902188e03, - 9.791482e03, - 1.073499e04, - 1.162625e04, - 1.237212e04, - 1.299041e04, - 1.349629e04, - 1.390277e04, - 1.422098e04, - 1.446058e04, - 1.462993e04, - 1.473633e04, - 1.478617e04, - 1.478511e04, - 1.473812e04, - 1.464966e04, - 1.452370e04, - 1.436382e04, - 1.417324e04, - 1.395491e04, - 1.371148e04, - 1.344540e04, - 1.315890e04, - 1.285407e04, - 1.253280e04, - 1.219685e04, - 1.184788e04, - 1.148739e04, - 1.111682e04, - 1.073748e04, - 1.035062e04, - 9.957395e03, - 9.558875e03, - 9.156069e03, - 8.749922e03, - 8.341315e03, - 7.931065e03, - 7.519942e03, - 7.108648e03, - 6.698281e03, - 6.290007e03, - 5.884984e03, - 5.484372e03, - 5.089319e03, - 4.700960e03, - 4.320421e03, - 3.948807e03, - 3.587201e03, - 3.236666e03, - 2.898237e03, - 2.572912e03, - 2.261667e03, - 1.965424e03, - 1.685079e03, - 1.421479e03, - 1.175419e03, - 9.476516e02, - 7.388688e02, - 5.497130e02, - 3.807626e02, - 2.325417e02, - 1.054810e02, - -8.381903e-04, - 0.000000e00, - ] - ), -) -bk = xr.DataArray( - dims=["km1"], - attrs=dict(units="None", _FillValue=False), - data=np.array( - [ - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.00106595, - 0.00412866, - 0.00900663, - 0.01554263, - 0.02359921, - 0.03305481, - 0.0438012, - 0.05574095, - 0.06878554, - 0.08285347, - 0.09786981, - 0.1137643, - 0.130471, - 0.1479275, - 0.1660746, - 0.1848558, - 0.2042166, - 0.2241053, - 0.2444716, - 0.2652672, - 0.286445, - 0.3079604, - 0.3297701, - 0.351832, - 0.3741062, - 0.3965532, - 0.4191364, - 0.4418194, - 0.4645682, - 0.48735, - 0.5101338, - 0.5328897, - 0.5555894, - 0.5782067, - 0.6007158, - 0.6230936, - 0.6452944, - 0.6672683, - 0.6889648, - 0.7103333, - 0.7313231, - 0.7518838, - 0.7719651, - 0.7915173, - 0.8104913, - 0.828839, - 0.846513, - 0.8634676, - 0.8796583, - 0.8950421, - 0.9095779, - 0.9232264, - 0.9359506, - 0.9477157, - 0.9584892, - 0.9682413, - 0.9769447, - 0.9845753, - 0.9911126, - 0.9965372, - 1.0, - ] - ), -) -coefficients = xr.Dataset(data_vars={"ak": ak, "bk": bk}) -coefficients.to_netcdf(Path(folder) / "eta79.nc") - - -# km = 91 -ak = xr.DataArray( - dims=["km1"], - attrs=dict(units="Pa", _FillValue=False), - data=np.array( - [ - 1.00000000e00, - 1.75000000e00, - 2.75000000e00, - 4.09999990e00, - 5.98951054e00, - 8.62932968e00, - 1.22572632e01, - 1.71510906e01, - 2.36545467e01, - 3.21627693e01, - 4.31310921e01, - 5.71100426e01, - 7.46595764e01, - 9.64470978e01, - 1.23169769e02, - 1.55601318e02, - 1.94594009e02, - 2.41047531e02, - 2.95873840e02, - 3.60046967e02, - 4.34604828e02, - 5.20628723e02, - 6.19154846e02, - 7.31296021e02, - 8.58240906e02, - 1.00106561e03, - 1.16092859e03, - 1.33903992e03, - 1.53650012e03, - 1.75448938e03, - 1.99417834e03, - 2.25667407e03, - 2.54317139e03, - 2.85476392e03, - 3.19258569e03, - 3.55775366e03, - 3.95135107e03, - 4.37428662e03, - 4.82711084e03, - 5.31022168e03, - 5.82387793e03, - 6.36904248e03, - 6.94875244e03, - 7.56691992e03, - 8.22634277e03, - 8.93120996e03, - 9.68446191e03, - 1.04822725e04, - 1.13182793e04, - 1.21840771e04, - 1.30655674e04, - 1.39532207e04, - 1.48307285e04, - 1.56872617e04, - 1.65080645e04, - 1.72810996e04, - 1.79942988e04, - 1.86363223e04, - 1.91961797e04, - 1.96640723e04, - 2.00301914e04, - 2.02853691e04, - 2.04215254e04, - 2.04300684e04, - 2.03028730e04, - 2.00323711e04, - 1.96110664e04, - 1.90313848e04, - 1.82866426e04, - 1.73777930e04, - 1.63224639e04, - 1.51444033e04, - 1.38725674e04, - 1.25404785e04, - 1.11834170e04, - 9.83532715e03, - 8.52630664e03, - 7.28224512e03, - 6.12326074e03, - 5.06350684e03, - 4.11124902e03, - 3.27000122e03, - 2.53922729e03, - 1.91530762e03, - 1.39244995e03, - 9.63134766e02, - 6.20599365e02, - 3.57989502e02, - 1.69421387e02, - 5.10314941e01, - 2.48413086e00, - 0.00000000e00, - ] - ), -) -bk = xr.DataArray( - dims=["km1"], - attrs=dict(units="None", _FillValue=False), - data=np.array( - [ - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 3.50123992e-06, - 2.81484008e-05, - 9.38666999e-05, - 2.28561999e-04, - 5.12343016e-04, - 1.04712998e-03, - 1.95625005e-03, - 3.42317997e-03, - 5.58632007e-03, - 8.65428988e-03, - 1.27844000e-02, - 1.81719996e-02, - 2.49934997e-02, - 3.34198996e-02, - 4.36249003e-02, - 5.57769015e-02, - 7.00351968e-02, - 8.65636021e-02, - 1.05520003e-01, - 1.27051994e-01, - 1.51319996e-01, - 1.78477004e-01, - 2.08675995e-01, - 2.42069006e-01, - 2.78813988e-01, - 3.19043010e-01, - 3.62558991e-01, - 4.08596009e-01, - 4.56384987e-01, - 5.05111992e-01, - 5.53902984e-01, - 6.01903021e-01, - 6.48333013e-01, - 6.92534983e-01, - 7.33981013e-01, - 7.72292018e-01, - 8.07236016e-01, - 8.38724971e-01, - 8.66774976e-01, - 8.91497016e-01, - 9.13065016e-01, - 9.31702971e-01, - 9.47658002e-01, - 9.61175978e-01, - 9.72495019e-01, - 9.81844008e-01, - 9.89410996e-01, - 9.95342016e-01, - 1.00000000e00, - ] - ), -) -coefficients = xr.Dataset(data_vars={"ak": ak, "bk": bk}) -coefficients.to_netcdf(Path(folder) / "eta91.nc") diff --git a/examples/plot_pcolormesh_cube.py b/examples/plot_pcolormesh_cube.py index 16992dfad..0a5833541 100644 --- a/examples/plot_pcolormesh_cube.py +++ b/examples/plot_pcolormesh_cube.py @@ -120,7 +120,7 @@ def gather_fortran_data_at_klevel(path: str, cn: int, var: str, klevel: int): Assuming the fileout has this format: atmos_custom_fine_inst.tile%RANK.nc where %RANK is the tile number starting from 1 Args: - path: direcotry to Fortran output files + path: directory to Fortran output files cn: resolution (e.g., 12, 48) var: variable name to be extracted klevel: index number in the k-axis to be read @@ -163,7 +163,7 @@ def gather_fortran_wrapper_at_klevel( + args.diff_init ) > 1: raise RuntimeError( - "Scirpt called with confilicting options between: \ + "Script called with conflicting options between: \ Diff init, diff python and diff to fortran" ) if args.fortran_data_path is not None: diff --git a/tests/main/fv3core/test_cartesian_grid.py b/tests/main/fv3core/test_cartesian_grid.py index 349edacd4..1f3c5bdb1 100644 --- a/tests/main/fv3core/test_cartesian_grid.py +++ b/tests/main/fv3core/test_cartesian_grid.py @@ -37,7 +37,7 @@ def test_cartesian_grid_generation( dx_const=dx_const, dy_const=dy_const, deglat=deglat, - eta_file=Path("tests/main/input/eta79.nc"), + eta_file=Path("NDSL/tests/data/eta/eta79.nc"), ) assert np.all(grid_generator.lat_agrid.data == deglat * PI / 180.0) assert np.all(grid_generator.lon_agrid.data == 0.0) diff --git a/tests/main/fv3core/test_dycore_baroclinic.py b/tests/main/fv3core/test_dycore_baroclinic.py index cc992c3a8..950b119e9 100644 --- a/tests/main/fv3core/test_dycore_baroclinic.py +++ b/tests/main/fv3core/test_dycore_baroclinic.py @@ -114,7 +114,7 @@ def setup_dycore( sizer=sizer, comm=communicator ) quantity_factory = QuantityFactory.from_backend(sizer=sizer, backend=backend) - eta_file = "tests/main/input/eta79.nc" + eta_file = "NDSL/tests/data/eta/eta79.nc" metric_terms = MetricTerms( quantity_factory=quantity_factory, communicator=communicator, diff --git a/tests/main/fv3core/test_dycore_call.py b/tests/main/fv3core/test_dycore_call.py index fce91634d..80d8ab70c 100644 --- a/tests/main/fv3core/test_dycore_call.py +++ b/tests/main/fv3core/test_dycore_call.py @@ -98,7 +98,7 @@ def setup_dycore() -> Tuple[DynamicalCore, DycoreState, Timer]: sizer=sizer, comm=communicator ) quantity_factory = QuantityFactory.from_backend(sizer=sizer, backend=backend) - eta_file = Path("tests/main/input/eta79.nc") + eta_file = Path("NDSL/tests/data/eta/eta79.nc") metric_terms = MetricTerms( quantity_factory=quantity_factory, communicator=communicator, diff --git a/tests/main/fv3core/test_init_from_geos.py b/tests/main/fv3core/test_init_from_geos.py index 2def90280..266b97623 100644 --- a/tests/main/fv3core/test_init_from_geos.py +++ b/tests/main/fv3core/test_init_from_geos.py @@ -76,7 +76,7 @@ def test_geos_wrapper(): "n_sponge": 48, }, "grid_config": { - "config": {"eta_file": "tests/main/input/eta91.nc"}, + "config": {"eta_file": "NDSL/tests/data/eta/eta91.nc"}, }, } diff --git a/tests/main/physics/test_integration.py b/tests/main/physics/test_integration.py index d0400f202..76168041d 100644 --- a/tests/main/physics/test_integration.py +++ b/tests/main/physics/test_integration.py @@ -72,7 +72,7 @@ def setup_physics(): metric_terms = MetricTerms( quantity_factory=quantity_factory, communicator=communicator, - eta_file=Path("tests/main/input/eta79.nc"), + eta_file=Path("NDSL/tests/data/eta/eta79.nc"), ) grid_data = GridData.new_from_metric_terms(metric_terms) physics = Physics( diff --git a/tests/main/test_grid_init.py b/tests/main/test_grid_init.py index 08ebe9143..9031c826f 100644 --- a/tests/main/test_grid_init.py +++ b/tests/main/test_grid_init.py @@ -39,7 +39,7 @@ def test_grid_init_not_decomposition_dependent(rank: int): halo updates for their values in the compute domain. """ nx_tile, ny_tile, nz = 48, 48, 79 - eta_file = Path("tests/main/input/eta79.nc") + eta_file = Path("NDSL/tests/data/eta/eta79.nc") metric_terms_1by1 = MetricTerms( quantity_factory=get_quantity_factory( layout=(1, 1), nx_tile=nx_tile, ny_tile=ny_tile, nz=nz From 68301fdf670ba665c50d274393a77600d2140f14 Mon Sep 17 00:00:00 2001 From: Janice Kim Date: Thu, 9 Oct 2025 18:41:39 -0400 Subject: [PATCH 48/75] Update submodules as of Sep 19 2025 (#150) --- NDSL | 2 +- pyFV3 | 2 +- pySHiELD | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NDSL b/NDSL index 728134358..0618ecacf 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit 728134358fd981f109b3fece56bea39042641ec2 +Subproject commit 0618ecacfbabb3387689dc4656735809a9a517b6 diff --git a/pyFV3 b/pyFV3 index 7d3c74ca8..f3608d934 160000 --- a/pyFV3 +++ b/pyFV3 @@ -1 +1 @@ -Subproject commit 7d3c74ca8353d5344e02e58239802ad22a61db2a +Subproject commit f3608d934d8a1dceceb8dbe280d79b4a48385daa diff --git a/pySHiELD b/pySHiELD index 08c1b555d..6b2af6895 160000 --- a/pySHiELD +++ b/pySHiELD @@ -1 +1 @@ -Subproject commit 08c1b555d1fd49a2b899ee1b9b1a29dfeb56c924 +Subproject commit 6b2af68956511bc41c11598f6b27b9c28d1f517c From c584ef02d09eaefb6b2a40ef1a0148cdf3e1489c Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Thu, 16 Oct 2025 14:59:00 +0200 Subject: [PATCH 49/75] ci: fix test runs that broke out of nowhere (#151) * let's see if any PR will break CI * front-load numpy * replace miniconda with plain python 3.11 * cleanup and todo for further cleanup --------- Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- .github/workflows/main_unit_tests.yaml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.github/workflows/main_unit_tests.yaml b/.github/workflows/main_unit_tests.yaml index dc3c59323..cc0d3228d 100644 --- a/.github/workflows/main_unit_tests.yaml +++ b/.github/workflows/main_unit_tests.yaml @@ -39,17 +39,21 @@ jobs: path: pace ref: develop - - name: Setup Miniconda - uses: conda-incubator/setup-miniconda@v3 + - name: Setup Python 3.11 + uses: actions/setup-python@v5 with: - python-version: 3.11.13 - conda-remove-defaults: true - auto-activate-base: false - activate-environment: pace_test_env + python-version: '3.11' - name: Install mpi (MPICH flavor) run: pip install mpich + - name: Install numpy==1.26.4 + # Front-load installing numpy to force its usage in the radiation + # scheme of pySHiELD. + # TODO: This is an ugly hack and it should be cleaned up latest once + # we add support for numpy >= 2.0 + run: pip install numpy==1.26.4 + - name: "External trigger: Remove existing component in pace/develop" if: ${{ inputs.component_trigger }} run: rm -rf ${GITHUB_WORKSPACE}/pace/${{inputs.component_name}} @@ -64,7 +68,6 @@ jobs: run: | cd ${GITHUB_WORKSPACE}/pace pip install .[test] - pip install numpy==1.26.4 - name: Print versions run: | From 20b6fbe5452ad62b9122c3f438243c297b223671 Mon Sep 17 00:00:00 2001 From: Janice Kim Date: Tue, 21 Oct 2025 07:19:04 -0400 Subject: [PATCH 50/75] Temporary Dycore dacite Config + Dycore Config Type Check Tweak [see: PyFV3 PR #88] (#152) * Tmp dycore dacite config related to PyFV3 PR #88 + NDSL Issue #64 * test_config.py tweak for type checks --------- Co-authored-by: Florian Deconinck --- pace/driver.py | 13 ++++++++++++- tests/main/fv3core/test_config.py | 4 +++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/pace/driver.py b/pace/driver.py index 1c2b50b1e..6c07383e0 100644 --- a/pace/driver.py +++ b/pace/driver.py @@ -239,10 +239,21 @@ def from_dict(cls, kwargs: Dict[str, Any]) -> "DriverConfig": "as it is determined based on top-level configuration" ) + # TODO - After pyFV3 PR #88, replace dycore dacite cmd with: + # kwargs["dycore_config"] = DynamicalCoreConfig.from_dict( + # kwargs.get("dycore_config", {}) + # ) + dycore_dacite_config = dacite.Config( + strict=True, + type_hooks={ + Tuple[int, int]: lambda x: tuple(x), + Tuple[str, ...]: lambda x: tuple(x) if x is not None else None, + }, + ) kwargs["dycore_config"] = dacite.from_dict( data_class=DynamicalCoreConfig, data=kwargs.get("dycore_config", {}), - config=dacite.Config(strict=True), + config=dycore_dacite_config, ) if isinstance(kwargs["physics_config"], dict): diff --git a/tests/main/fv3core/test_config.py b/tests/main/fv3core/test_config.py index 59a106a83..5bddc03f9 100644 --- a/tests/main/fv3core/test_config.py +++ b/tests/main/fv3core/test_config.py @@ -42,7 +42,9 @@ def assert_types_match(classes): types = collections.defaultdict(set) for cls in classes: for name, field in cls.__dataclass_fields__.items(): - types[name].add(field.type) + # Get type hints in case we're using postponed evaluation of types + # Example: ' instead of 'bool' + types[name].add(typing.get_type_hints(cls)[name]) for name, attr in cls.__dict__.items(): if isinstance(attr, property): types[name].add( From aa27d69e792d84f613ab18d9386a1099e28727a4 Mon Sep 17 00:00:00 2001 From: Florian Deconinck Date: Thu, 23 Oct 2025 13:52:02 -0400 Subject: [PATCH 51/75] GridSizer API: Use `fom_tile_params` instead of direct constructor of `dataclass` (#154) * Use `fom_tile_params` instead of direct constructor of dataclass * Typo * Typo + one more normalizing * Missing `layout` kwarg --- tests/main/driver/test_diagnostics_config.py | 18 ++++++++++++++++-- tests/main/test_grid_init.py | 9 ++++++++- tests/mpi/test_grid_init.py | 4 +++- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/tests/main/driver/test_diagnostics_config.py b/tests/main/driver/test_diagnostics_config.py index b51fe7567..142833493 100644 --- a/tests/main/driver/test_diagnostics_config.py +++ b/tests/main/driver/test_diagnostics_config.py @@ -43,7 +43,14 @@ def test_zselect_raises_error_if_not_3d(tmpdir): ) result = config.diagnostics_factory(unittest.mock.MagicMock()) quantity_factory = QuantityFactory.from_backend( - sizer=SubtileGridSizer(nx=12, ny=12, nz=79, n_halo=3, extra_dim_lengths={}), + sizer=SubtileGridSizer.from_tile_params( + nx_tile=12, + ny_tile=12, + nz=79, + n_halo=3, + extra_dim_lengths={}, + layout=(1, 1), + ), backend="numpy", ) state = DycoreState.init_zeros(quantity_factory) @@ -58,7 +65,14 @@ def test_zselect_raises_error_if_3rd_dim_not_z(tmpdir): ) result = config.diagnostics_factory(unittest.mock.MagicMock()) quantity_factory = QuantityFactory.from_backend( - sizer=SubtileGridSizer(nx=12, ny=12, nz=79, n_halo=3, extra_dim_lengths={}), + sizer=SubtileGridSizer.from_tile_params( + nx_tile=12, + ny_tile=12, + nz=79, + n_halo=3, + extra_dim_lengths={}, + layout=(1, 1), + ), backend="numpy", ) state = DycoreState.init_zeros(quantity_factory) diff --git a/tests/main/test_grid_init.py b/tests/main/test_grid_init.py index 9031c826f..1361d2e5f 100644 --- a/tests/main/test_grid_init.py +++ b/tests/main/test_grid_init.py @@ -26,7 +26,14 @@ def get_quantity_factory(layout, nx_tile, ny_tile, nz): nx = nx_tile // layout[0] ny = ny_tile // layout[1] return QuantityFactory.from_backend( - sizer=SubtileGridSizer(nx=nx, ny=ny, nz=nz, n_halo=3, extra_dim_lengths={}), + sizer=SubtileGridSizer.from_tile_params( + nx_tile=nx, + ny_tile=ny, + nz=nz, + n_halo=3, + extra_dim_lengths={}, + layout=(1, 1), + ), backend="numpy", ) diff --git a/tests/mpi/test_grid_init.py b/tests/mpi/test_grid_init.py index 36865d067..b0aefab0e 100644 --- a/tests/mpi/test_grid_init.py +++ b/tests/mpi/test_grid_init.py @@ -28,7 +28,9 @@ def get_quantity_factory(layout, nx_tile, ny_tile, nz): nx = nx_tile // layout[0] ny = ny_tile // layout[1] return QuantityFactory.from_backend( - sizer=SubtileGridSizer(nx=nx, ny=ny, nz=nz, n_halo=3, extra_dim_lengths={}), + sizer=SubtileGridSizer.from_tile_params( + nx=nx, ny=ny, nz=nz, n_halo=3, extra_dim_lengths={}, layout=(1, 1) + ), backend="numpy", ) From 85a792c3b69e6696ccdb906a4de0ce1202c2d08c Mon Sep 17 00:00:00 2001 From: Janice Kim Date: Mon, 27 Oct 2025 11:30:50 -0400 Subject: [PATCH 52/75] Tmp dacite.Config for PhysicsConfig + PyFV3 module update + Clean-up (#153) * Tmp physics dacite config related to NDSL Issue #64 Clean up after pyFV3 PR #88 * Updating pyFV3 submodule * Updating pyFV3 submodule after PyFV3 PR #90 --- pace/driver.py | 21 +++++++++------------ pyFV3 | 2 +- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/pace/driver.py b/pace/driver.py index 6c07383e0..6ea2d40f1 100644 --- a/pace/driver.py +++ b/pace/driver.py @@ -238,29 +238,26 @@ def from_dict(cls, kwargs: Dict[str, Any]) -> "DriverConfig": f"you cannot set {derived_name} directly in dycore_config, " "as it is determined based on top-level configuration" ) + kwargs["dycore_config"] = DynamicalCoreConfig.from_dict( + kwargs.get("dycore_config", {}) + ) - # TODO - After pyFV3 PR #88, replace dycore dacite cmd with: - # kwargs["dycore_config"] = DynamicalCoreConfig.from_dict( - # kwargs.get("dycore_config", {}) + if isinstance(kwargs["physics_config"], dict): + # TODO - After pySHiELD PR #68, replace physics dacite cmd with: + # kwargs["physics_config"] = PhysicsConfig.from_dict( + # kwargs.get("physics_config", {}) # ) - dycore_dacite_config = dacite.Config( + phys_dacite_config = dacite.Config( strict=True, type_hooks={ Tuple[int, int]: lambda x: tuple(x), Tuple[str, ...]: lambda x: tuple(x) if x is not None else None, }, ) - kwargs["dycore_config"] = dacite.from_dict( - data_class=DynamicalCoreConfig, - data=kwargs.get("dycore_config", {}), - config=dycore_dacite_config, - ) - - if isinstance(kwargs["physics_config"], dict): kwargs["physics_config"] = dacite.from_dict( data_class=PhysicsConfig, data=kwargs.get("physics_config", {}), - config=dacite.Config(strict=True), + config=phys_dacite_config, ) kwargs["layout"] = tuple(kwargs["layout"]) diff --git a/pyFV3 b/pyFV3 index f3608d934..a0c972d69 160000 --- a/pyFV3 +++ b/pyFV3 @@ -1 +1 @@ -Subproject commit f3608d934d8a1dceceb8dbe280d79b4a48385daa +Subproject commit a0c972d69399c18f1c22ba764bf3001765b20ea3 From 6866e55a1c0e4403095e0c7631b3fc13988ab071 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Thu, 30 Oct 2025 10:59:37 +0100 Subject: [PATCH 53/75] Update to NDSL 2025.10.00+ (sync pyFV3, pySHiELD to develop) (#156) This PR updates NDSL to a few commits after version 2025.10.00 and syncs pyFV3 and pySHiELD to their current `develop` branch. The release version of NDSL was raisning type issues that were only caught in pace. We are working on streamlining this experience for future releases of NDSL. Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- NDSL | 2 +- pyFV3 | 2 +- pySHiELD | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NDSL b/NDSL index 0618ecacf..cd5dd0dba 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit 0618ecacfbabb3387689dc4656735809a9a517b6 +Subproject commit cd5dd0dba69b3058af78ee933b188f02c2b2416d diff --git a/pyFV3 b/pyFV3 index a0c972d69..bca221087 160000 --- a/pyFV3 +++ b/pyFV3 @@ -1 +1 @@ -Subproject commit a0c972d69399c18f1c22ba764bf3001765b20ea3 +Subproject commit bca221087a3daaa3a161e2bb6923cc02ae8955a4 diff --git a/pySHiELD b/pySHiELD index 6b2af6895..d2f4fb14c 160000 --- a/pySHiELD +++ b/pySHiELD @@ -1 +1 @@ -Subproject commit 6b2af68956511bc41c11598f6b27b9c28d1f517c +Subproject commit d2f4fb14c6a252634f190392c3375288574e2d92 From 8842f2f9c012136d384eca46ea99cea7d6132384 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Thu, 30 Oct 2025 19:30:06 +0100 Subject: [PATCH 54/75] refactor: avoid deprecation warnings after update (#157) * refactor: extra_dim_lengths -> data_dimensions Change `extra_dim_lengths` -> `data_dimensions` when creating a `SubtileGridSizer`. We can remove empty dictionaries `{}` because that's now the default. Previously that default wasn't re-entrant so many places specified the option explicitly. Now there's no need anymore for this. * refactor: drop dependency on deprecated ndsl.filesystem --------- Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- docs/physics/state.rst | 1 - examples/notebooks/functions.py | 1 - examples/notebooks/grid_generation.ipynb | 1 - pace/diagnostics.py | 97 +++++++++---------- pace/driver.py | 3 - pace/state.py | 29 +++--- tests/main/driver/test_analytic_init.py | 5 +- tests/main/driver/test_diagnostics_config.py | 2 - tests/main/driver/test_restart_fortran.py | 1 - tests/main/driver/test_restart_serial.py | 1 - tests/main/fv3core/test_dycore_baroclinic.py | 1 - tests/main/fv3core/test_dycore_call.py | 1 - tests/main/physics/test_integration.py | 1 - tests/main/test_grid_init.py | 1 - tests/mpi/test_grid_init.py | 2 +- tests/savepoint/test_checkpoints.py | 1 - tests/savepoint/translate/translate_driver.py | 1 - 17 files changed, 62 insertions(+), 87 deletions(-) diff --git a/docs/physics/state.rst b/docs/physics/state.rst index 1b6038876..e56dfb07b 100644 --- a/docs/physics/state.rst +++ b/docs/physics/state.rst @@ -30,7 +30,6 @@ You can initialize a zero-filled PhysicsState and MicrophysicsState from other P ... ny_tile=12, ... nz=79, ... n_halo=3, - ... extra_dim_lengths={}, ... layout=layout, ... tile_partitioner=partitioner.tile, ... tile_rank=communicator.tile.rank, diff --git a/examples/notebooks/functions.py b/examples/notebooks/functions.py index c603d09d4..0c81ff584 100644 --- a/examples/notebooks/functions.py +++ b/examples/notebooks/functions.py @@ -263,7 +263,6 @@ def configure_domain( ny_tile=dimensions["ny"], nz=dimensions["nz"], n_halo=dimensions["nhalo"], - extra_dim_lengths={}, layout=dimensions["layout"], tile_partitioner=partitioner.tile, tile_rank=communicator.tile.rank, diff --git a/examples/notebooks/grid_generation.ipynb b/examples/notebooks/grid_generation.ipynb index 2f56fa34f..eb331536e 100644 --- a/examples/notebooks/grid_generation.ipynb +++ b/examples/notebooks/grid_generation.ipynb @@ -182,7 +182,6 @@ " ny_tile=ny,\n", " nz=nz,\n", " n_halo=nhalo,\n", - " extra_dim_lengths={},\n", " layout=layout,\n", " tile_partitioner=partitioner.tile,\n", " tile_rank=communicator.tile.rank,\n", diff --git a/pace/diagnostics.py b/pace/diagnostics.py index 8850bc083..35895e03e 100644 --- a/pace/diagnostics.py +++ b/pace/diagnostics.py @@ -2,7 +2,7 @@ import dataclasses import warnings from datetime import datetime, timedelta -from typing import List, Optional, Union +from pathlib import Path import numpy as np @@ -10,7 +10,6 @@ from ndsl.constants import RGRAV, Z_DIM, Z_INTERFACE_DIM from ndsl.dsl.dace.orchestration import dace_inhibitor from ndsl.dsl.typing import Float -from ndsl.filesystem import get_fs from ndsl.grid import GridData from ndsl.monitor import Monitor, ZarrMonitor from ndsl.monitor.netcdf_monitor import NetCDFMonitor @@ -27,7 +26,7 @@ class Diagnostics(abc.ABC): @abc.abstractmethod - def store(self, time: Union[datetime, timedelta], state: DriverState): ... + def store(self, time: datetime | timedelta, state: DriverState): ... @abc.abstractmethod def store_grid(self, grid_data: GridData): ... @@ -39,7 +38,7 @@ def cleanup(self): ... @dataclasses.dataclass class ZSelect: level: int - names: List[str] + names: list[str] def select_data(self, state: DycoreState): output = {} @@ -77,15 +76,15 @@ class DiagnosticsConfig: output_format is "netcdf" names: state variables to save as diagnostics derived_names: derived diagnostics to save - z_select: save a veritcal slice of a 3D state + z_select: save a vertical slice of a 3D state """ - path: Optional[str] = None + path: str | None = None output_format: str = "zarr" time_chunk_size: int = 1 - names: List[str] = dataclasses.field(default_factory=list) - derived_names: List[str] = dataclasses.field(default_factory=list) - z_select: List[ZSelect] = dataclasses.field(default_factory=list) + names: list[str] = dataclasses.field(default_factory=list) + derived_names: list[str] = dataclasses.field(default_factory=list) + z_select: list[ZSelect] = dataclasses.field(default_factory=list) precision: str = "Float" def __post_init__(self): @@ -113,43 +112,43 @@ def diagnostics_factory(self, communicator: Communicator) -> Diagnostics: or to coordinate filesystem access between ranks """ if self.path is None: - diagnostics: Diagnostics = NullDiagnostics() + return NullDiagnostics() + + if not Path(self.path).exists(): + Path(self.path).mkdir() + + if self.output_format == "zarr": + store = zarr_storage.DirectoryStore(path=self.path) + monitor: Monitor = ZarrMonitor( + store=store, + partitioner=communicator.partitioner, + mpi_comm=communicator.comm, + ) + elif self.output_format == "netcdf": + if self.precision == "Float": + precision = Float + elif self.precision == "float32": + precision = np.float32 + elif self.precision == "float64": + precision = np.float64 + monitor = NetCDFMonitor( + path=self.path, + communicator=communicator, + time_chunk_size=self.time_chunk_size, + precision=precision, + ) else: - fs = get_fs(self.path) - if not fs.exists(self.path): - fs.makedirs(self.path, exist_ok=True) - if self.output_format == "zarr": - store = zarr_storage.DirectoryStore(path=self.path) - monitor: Monitor = ZarrMonitor( - store=store, - partitioner=communicator.partitioner, - mpi_comm=communicator.comm, - ) - elif self.output_format == "netcdf": - if self.precision == "Float": - precision = Float - elif self.precision == "float32": - precision = np.float32 - elif self.precision == "float64": - precision = np.float64 - monitor = NetCDFMonitor( - path=self.path, - communicator=communicator, - time_chunk_size=self.time_chunk_size, - precision=precision, - ) - else: - raise ValueError( - "output_format must be one of 'zarr' or 'netcdf', " - f"got {self.output_format}" - ) - diagnostics = MonitorDiagnostics( - monitor=monitor, - names=self.names, - derived_names=self.derived_names, - z_select=self.z_select, + raise ValueError( + "output_format must be one of 'zarr' or 'netcdf', " + f"got {self.output_format}" ) - return diagnostics + + return MonitorDiagnostics( + monitor=monitor, + names=self.names, + derived_names=self.derived_names, + z_select=self.z_select, + ) class MonitorDiagnostics(Diagnostics): @@ -158,9 +157,9 @@ class MonitorDiagnostics(Diagnostics): def __init__( self, monitor: Monitor, - names: List[str], - derived_names: List[str], - z_select: List[ZSelect], + names: list[str], + derived_names: list[str], + z_select: list[ZSelect], ): """ Args: @@ -174,7 +173,7 @@ def __init__( self.monitor = monitor @dace_inhibitor - def store(self, time: Union[datetime, timedelta], state: DriverState): + def store(self, time: datetime | timedelta, state: DriverState): monitor_state = {"time": time} for name in self.names: try: @@ -226,7 +225,7 @@ def cleanup(self): class NullDiagnostics(Diagnostics): """Diagnostics that do nothing.""" - def store(self, time: Union[datetime, timedelta], state: DriverState): + def store(self, time: datetime | timedelta, state: DriverState): pass def store_grid(self, grid_data: GridData): diff --git a/pace/driver.py b/pace/driver.py index 6ea2d40f1..fdc44a21e 100644 --- a/pace/driver.py +++ b/pace/driver.py @@ -173,7 +173,6 @@ def get_grid( ny_tile=self.nx_tile, nz=self.nz, n_halo=N_HALO_DEFAULT, - extra_dim_lengths={}, layout=self.layout, tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.tile.rank, @@ -203,7 +202,6 @@ def get_driver_state( ny_tile=self.nx_tile, nz=self.nz, n_halo=N_HALO_DEFAULT, - extra_dim_lengths={}, layout=self.layout, tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.tile.rank, @@ -767,7 +765,6 @@ def _setup_factories( ny_tile=config.nx_tile, nz=config.nz, n_halo=N_HALO_DEFAULT, - extra_dim_lengths={}, layout=config.layout, tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.tile.rank, diff --git a/pace/state.py b/pace/state.py index fa3370b60..9caa1dc6c 100644 --- a/pace/state.py +++ b/pace/state.py @@ -1,6 +1,6 @@ import dataclasses -from dataclasses import fields -from typing import List +from pathlib import Path +from typing import Self import xarray as xr @@ -8,7 +8,6 @@ from ndsl import Quantity, QuantityFactory, SubtileGridSizer from ndsl.constants import N_HALO_DEFAULT, X_DIM, Y_DIM, Z_DIM from ndsl.dsl.typing import Float -from ndsl.filesystem import get_fs from ndsl.grid import DampingCoefficients, DriverGridData, GridData from ndsl.typing import Communicator from pyfv3 import DycoreState @@ -18,7 +17,7 @@ @dataclasses.dataclass() class TendencyState: """ - Accumulated tendencies from physical parameterizations to be applied + Accumulated tendencies from physical parametrizations to be applied to the dynamical core model state. """ @@ -48,7 +47,7 @@ class TendencyState: ) @classmethod - def init_zeros(cls, quantity_factory: QuantityFactory) -> "TendencyState": + def init_zeros(cls, quantity_factory: QuantityFactory) -> Self: initial_quantities = {} for _field in dataclasses.fields(cls): initial_quantities[_field.name] = quantity_factory.zeros( @@ -79,8 +78,8 @@ def load_state_from_restart( damping_coefficients: DampingCoefficients, driver_grid_data: DriverGridData, grid_data: GridData, - schemes: List[PHYSICS_PACKAGES], - ) -> "DriverState": + schemes: list[PHYSICS_PACKAGES], + ) -> Self: comm = driver_config.comm_config.get_comm() communicator = Communicator.from_layout(comm=comm, layout=driver_config.layout) sizer = SubtileGridSizer.from_tile_params( @@ -88,7 +87,6 @@ def load_state_from_restart( ny_tile=driver_config.nx_tile, nz=driver_config.nz, n_halo=N_HALO_DEFAULT, - extra_dim_lengths={}, layout=driver_config.layout, tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.tile.rank, @@ -110,8 +108,6 @@ def load_state_from_restart( return state def save_state(self, comm, restart_path: str = "RESTART"): - from pathlib import Path - Path(restart_path).mkdir(parents=True, exist_ok=True) current_rank = str(comm.Get_rank()) self.dycore_state.xr_dataset.to_netcdf( @@ -165,7 +161,7 @@ def _overwrite_state_from_restart( """ ds = xr.open_dataset(path + f"/{restart_file_prefix}_{rank}.nc") - for _field in fields(type(state)): + for _field in dataclasses.fields(type(state)): if "units" in _field.metadata.keys(): state.__dict__[_field.name].data[:] = gt_utils.asarray( ds[_field.name].data[:], to_type=state.__dict__[_field.name].np.ndarray @@ -180,14 +176,11 @@ def _restart_driver_state( damping_coefficients: DampingCoefficients, driver_grid_data: DriverGridData, grid_data: GridData, - schemes: List[PHYSICS_PACKAGES], + schemes: list[PHYSICS_PACKAGES], ): - fs = get_fs(path) - - restart_files = fs.ls(path) - is_fortran_restart = any( - fname.endswith("fv_core.res.nc") for fname in restart_files - ) + # It's a restart from a FORTRAN run if we find any files in the restart directory + # that ends in "fv_core.res.nc". + is_fortran_restart = any(fname for fname in Path(path).glob("**/*fv_core.res.nc")) if is_fortran_restart: dycore_state = DycoreState.from_fortran_restart( diff --git a/tests/main/driver/test_analytic_init.py b/tests/main/driver/test_analytic_init.py index 6f5405a09..8bd2dd1c2 100644 --- a/tests/main/driver/test_analytic_init.py +++ b/tests/main/driver/test_analytic_init.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import List import pytest import yaml @@ -13,7 +12,7 @@ # TODO: Location of test configurations will be changed after refactor, # need to update after -TESTED_CONFIGS: List[Path] = [ +TESTED_CONFIGS: list[Path] = [ EXAMPLE_CONFIGS_DIR / "analytic_test.yaml", EXAMPLE_CONFIGS_DIR / "baroclinic_c48_6ranks_serialbox_test.yaml", ] @@ -25,7 +24,7 @@ pytest.param(TESTED_CONFIGS, id="example configs"), ], ) -def test_analytic_init_config(tested_configs: List[Path]): +def test_analytic_init_config(tested_configs: list[Path]): for config_file in tested_configs: with open(Path(__file__).parent / config_file, "r") as f: config = yaml.safe_load(f) diff --git a/tests/main/driver/test_diagnostics_config.py b/tests/main/driver/test_diagnostics_config.py index 142833493..cd0b2ca06 100644 --- a/tests/main/driver/test_diagnostics_config.py +++ b/tests/main/driver/test_diagnostics_config.py @@ -48,7 +48,6 @@ def test_zselect_raises_error_if_not_3d(tmpdir): ny_tile=12, nz=79, n_halo=3, - extra_dim_lengths={}, layout=(1, 1), ), backend="numpy", @@ -70,7 +69,6 @@ def test_zselect_raises_error_if_3rd_dim_not_z(tmpdir): ny_tile=12, nz=79, n_halo=3, - extra_dim_lengths={}, layout=(1, 1), ), backend="numpy", diff --git a/tests/main/driver/test_restart_fortran.py b/tests/main/driver/test_restart_fortran.py index 92e5ed6fe..c658fc027 100644 --- a/tests/main/driver/test_restart_fortran.py +++ b/tests/main/driver/test_restart_fortran.py @@ -30,7 +30,6 @@ def test_state_from_fortran_restart(): ny_tile=12, nz=63, n_halo=3, - extra_dim_lengths={}, layout=layout, tile_partitioner=partitioner.tile, tile_rank=0, diff --git a/tests/main/driver/test_restart_serial.py b/tests/main/driver/test_restart_serial.py index 7f9430f85..aa9fe693e 100644 --- a/tests/main/driver/test_restart_serial.py +++ b/tests/main/driver/test_restart_serial.py @@ -63,7 +63,6 @@ def test_restart_save_to_disk(): ny_tile=12, nz=79, n_halo=3, - extra_dim_lengths={}, layout=(1, 1), tile_partitioner=partitioner.tile, tile_rank=communicator.tile.rank, diff --git a/tests/main/fv3core/test_dycore_baroclinic.py b/tests/main/fv3core/test_dycore_baroclinic.py index 950b119e9..afebd877e 100644 --- a/tests/main/fv3core/test_dycore_baroclinic.py +++ b/tests/main/fv3core/test_dycore_baroclinic.py @@ -105,7 +105,6 @@ def setup_dycore( ny_tile=config.npy - 1, nz=config.npz, n_halo=3, - extra_dim_lengths={}, layout=config.layout, tile_partitioner=partitioner.tile, tile_rank=communicator.tile.rank, diff --git a/tests/main/fv3core/test_dycore_call.py b/tests/main/fv3core/test_dycore_call.py index 80d8ab70c..e41f69726 100644 --- a/tests/main/fv3core/test_dycore_call.py +++ b/tests/main/fv3core/test_dycore_call.py @@ -89,7 +89,6 @@ def setup_dycore() -> Tuple[DynamicalCore, DycoreState, Timer]: ny_tile=config.npy - 1, nz=config.npz, n_halo=3, - extra_dim_lengths={}, layout=config.layout, tile_partitioner=partitioner.tile, tile_rank=communicator.tile.rank, diff --git a/tests/main/physics/test_integration.py b/tests/main/physics/test_integration.py index 76168041d..6e215ea5d 100644 --- a/tests/main/physics/test_integration.py +++ b/tests/main/physics/test_integration.py @@ -43,7 +43,6 @@ def setup_physics(): ny_tile=physics_config.npy - 1, nz=physics_config.npz, n_halo=3, - extra_dim_lengths={}, layout=layout, tile_partitioner=partitioner.tile, tile_rank=communicator.tile.rank, diff --git a/tests/main/test_grid_init.py b/tests/main/test_grid_init.py index 1361d2e5f..32f05aed2 100644 --- a/tests/main/test_grid_init.py +++ b/tests/main/test_grid_init.py @@ -31,7 +31,6 @@ def get_quantity_factory(layout, nx_tile, ny_tile, nz): ny_tile=ny, nz=nz, n_halo=3, - extra_dim_lengths={}, layout=(1, 1), ), backend="numpy", diff --git a/tests/mpi/test_grid_init.py b/tests/mpi/test_grid_init.py index b0aefab0e..7e0ab41ac 100644 --- a/tests/mpi/test_grid_init.py +++ b/tests/mpi/test_grid_init.py @@ -29,7 +29,7 @@ def get_quantity_factory(layout, nx_tile, ny_tile, nz): ny = ny_tile // layout[1] return QuantityFactory.from_backend( sizer=SubtileGridSizer.from_tile_params( - nx=nx, ny=ny, nz=nz, n_halo=3, extra_dim_lengths={}, layout=(1, 1) + nx=nx, ny=ny, nz=nz, n_halo=3, layout=(1, 1) ), backend="numpy", ) diff --git a/tests/savepoint/test_checkpoints.py b/tests/savepoint/test_checkpoints.py index 990e60f1f..2a2f22fde 100644 --- a/tests/savepoint/test_checkpoints.py +++ b/tests/savepoint/test_checkpoints.py @@ -89,7 +89,6 @@ def test_fv_dynamics( n_halo=3, tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.rank, - extra_dim_lengths={}, layout=namelist.layout, ), comm=communicator, diff --git a/tests/savepoint/translate/translate_driver.py b/tests/savepoint/translate/translate_driver.py index 56aeb6a7c..f3499c56d 100644 --- a/tests/savepoint/translate/translate_driver.py +++ b/tests/savepoint/translate/translate_driver.py @@ -31,7 +31,6 @@ def compute_parallel(self, inputs, communicator): ny_tile=self.namelist.npy - 1, nz=self.namelist.npz, n_halo=N_HALO_DEFAULT, - extra_dim_lengths={}, layout=self.namelist.layout, tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.tile.rank, From db1159c91448fc00be5a45fde85e8adb2a2f07a9 Mon Sep 17 00:00:00 2001 From: Janice Kim Date: Thu, 30 Oct 2025 15:30:37 -0400 Subject: [PATCH 55/75] Removing ndsl.Namelist from Pace (#158) * Removing ndsl.Namelist * Cleanup from pySHiELD PR 68 --- pace/driver.py | 17 ++--------------- pace/grid.py | 9 +++++---- pace/initialization.py | 16 +++++++++------- 3 files changed, 16 insertions(+), 26 deletions(-) diff --git a/pace/driver.py b/pace/driver.py index fdc44a21e..4760ff588 100644 --- a/pace/driver.py +++ b/pace/driver.py @@ -241,21 +241,8 @@ def from_dict(cls, kwargs: Dict[str, Any]) -> "DriverConfig": ) if isinstance(kwargs["physics_config"], dict): - # TODO - After pySHiELD PR #68, replace physics dacite cmd with: - # kwargs["physics_config"] = PhysicsConfig.from_dict( - # kwargs.get("physics_config", {}) - # ) - phys_dacite_config = dacite.Config( - strict=True, - type_hooks={ - Tuple[int, int]: lambda x: tuple(x), - Tuple[str, ...]: lambda x: tuple(x) if x is not None else None, - }, - ) - kwargs["physics_config"] = dacite.from_dict( - data_class=PhysicsConfig, - data=kwargs.get("physics_config", {}), - config=phys_dacite_config, + kwargs["physics_config"] = PhysicsConfig.from_dict( + kwargs.get("physics_config", {}) ) kwargs["layout"] = tuple(kwargs["layout"]) diff --git a/pace/grid.py b/pace/grid.py index 30494080f..f91434c6d 100644 --- a/pace/grid.py +++ b/pace/grid.py @@ -6,7 +6,7 @@ import f90nml import xarray as xr -from ndsl import Namelist, QuantityFactory, ndsl_log +from ndsl import QuantityFactory, ndsl_log from ndsl.comm.partitioner import get_tile_index from ndsl.constants import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM from ndsl.grid import ( @@ -22,6 +22,7 @@ from ndsl.grid.stretch_transformation import direct_transform from ndsl.stencils.testing import TranslateGrid, grid from ndsl.typing import Communicator +from ndsl.utils import grid_params_from_f90nml from pace.registry import Registry @@ -151,8 +152,8 @@ def _f90_namelist(self) -> f90nml.Namelist: return f90nml.read(self.path + "/input.nml") @property - def _namelist(self) -> Namelist: - return Namelist.from_f90nml(self._f90_namelist) + def _grid_params(self) -> dict: + return grid_params_from_f90nml(self._f90_namelist) def _serializer(self, communicator: Communicator): import serialbox @@ -171,7 +172,7 @@ def _get_serialized_grid( ) -> grid.Grid: # type: ignore ser = self._serializer(communicator) grid = TranslateGrid.new_from_serialized_data( - ser, communicator.rank, self._namelist.layout, backend + ser, communicator.rank, self._grid_params["layout"], backend ).python_grid() return grid diff --git a/pace/initialization.py b/pace/initialization.py index eaded6958..b3eed4924 100644 --- a/pace/initialization.py +++ b/pace/initialization.py @@ -11,7 +11,6 @@ from ndsl import ( CompilationConfig, DaceConfig, - Namelist, QuantityFactory, StencilConfig, StencilFactory, @@ -20,6 +19,7 @@ from ndsl.grid import DampingCoefficients, DriverGridData, GridData from ndsl.stencils.testing import TranslateGrid, grid from ndsl.typing import Communicator +from ndsl.utils import grid_params_from_f90nml from pace.registry import Registry from pace.state import DriverState, TendencyState, _restart_driver_state from pyfv3 import DycoreState, DynamicalCoreConfig @@ -253,8 +253,8 @@ def _f90_namelist(self) -> f90nml.Namelist: return f90nml.read(self.path + "/input.nml") @property - def _namelist(self) -> Namelist: - return Namelist.from_f90nml(self._f90_namelist) + def _grid_params(self) -> dict: + return grid_params_from_f90nml(self._f90_namelist) def _get_serialized_grid( self, @@ -263,7 +263,7 @@ def _get_serialized_grid( ) -> grid.Grid: # type: ignore ser = self._serializer(communicator) grid = TranslateGrid.new_from_serialized_data( - ser, communicator.rank, self._namelist.layout, backend + ser, communicator.rank, self._grid_params["layout"], backend ).python_grid() return grid @@ -318,8 +318,8 @@ def _initialize_dycore_state( dace_config = DaceConfig( communicator, backend, - tile_nx=self._namelist.npx, - tile_nz=self._namelist.npz, + tile_nx=self._grid_params["npx"], + tile_nz=self._grid_params["npz"], ) stencil_config = StencilConfig( compilation_config=CompilationConfig( @@ -330,7 +330,9 @@ def _initialize_dycore_state( stencil_factory = StencilFactory( config=stencil_config, grid_indexing=grid.grid_indexing ) - translate_object = TranslateFVDynamics(grid, self._namelist, stencil_factory) + translate_object = TranslateFVDynamics( + grid, self._f90_namelist, stencil_factory + ) input_data = translate_object.collect_input_data(ser, savepoint_in) dycore_state = translate_object.state_from_inputs(input_data) return dycore_state From 4dcfa8820bf4447af330b62d5e788dc3dd7879d0 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Mon, 10 Nov 2025 11:11:19 -0500 Subject: [PATCH 56/75] Updating benchmark config files to match changes --- NDSL | 2 +- examples/configs/baroclinic_c3072_cpu.yaml | 8 ++++---- examples/configs/baroclinic_c3072_gpu.yaml | 8 ++++---- examples/configs/baroclinic_c384_cpu.yaml | 8 ++++---- examples/configs/baroclinic_c384_gpu.yaml | 8 ++++---- pyFV3 | 2 +- pySHiELD | 2 +- 7 files changed, 19 insertions(+), 19 deletions(-) diff --git a/NDSL b/NDSL index cd5dd0dba..51874161d 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit cd5dd0dba69b3058af78ee933b188f02c2b2416d +Subproject commit 51874161dbf32b24a1c54550019b637920145c2d diff --git a/examples/configs/baroclinic_c3072_cpu.yaml b/examples/configs/baroclinic_c3072_cpu.yaml index 7f8d117b9..1870c3a37 100644 --- a/examples/configs/baroclinic_c3072_cpu.yaml +++ b/examples/configs/baroclinic_c3072_cpu.yaml @@ -8,10 +8,10 @@ stencil_config: initialization: type: analytic config: - case: baroclinic + case: baroclinic_instability performance_config: collect_performance: true - experiment_name: c3072_baroclinic + experiment_name: c3072_baroclinic_instability nx_tile: 3072 nz: 79 dt_atmos: 225 @@ -96,6 +96,6 @@ physics_config: do_qa: true grid_config: - type: generated + type: generated config: - eta_file: 'tests/main/input/eta79.nc' + eta_file: 'NDSL/tests/data/eta/eta79.nc' diff --git a/examples/configs/baroclinic_c3072_gpu.yaml b/examples/configs/baroclinic_c3072_gpu.yaml index 89bebdd77..db6b6acea 100644 --- a/examples/configs/baroclinic_c3072_gpu.yaml +++ b/examples/configs/baroclinic_c3072_gpu.yaml @@ -8,10 +8,10 @@ stencil_config: initialization: type: analytic config: - case: baroclinic + case: baroclinic_instability performance_config: collect_performance: true - experiment_name: c3072_baroclinic + experiment_name: c3072_baroclinic_instability nx_tile: 3072 nz: 79 dt_atmos: 225 @@ -96,6 +96,6 @@ physics_config: do_qa: true grid_config: - type: generated + type: generated config: - eta_file: 'tests/main/input/eta79.nc' + eta_file: 'NDSL/tests/data/eta/eta79.nc' diff --git a/examples/configs/baroclinic_c384_cpu.yaml b/examples/configs/baroclinic_c384_cpu.yaml index e5427e862..184a13fea 100644 --- a/examples/configs/baroclinic_c384_cpu.yaml +++ b/examples/configs/baroclinic_c384_cpu.yaml @@ -8,10 +8,10 @@ stencil_config: initialization: type: analytic config: - case: baroclinic + case: baroclinic_instability performance_config: collect_performance: true - experiment_name: c384_baroclinic + experiment_name: c384_baroclinic_instability nx_tile: 384 nz: 79 dt_atmos: 450 @@ -96,6 +96,6 @@ physics_config: do_qa: true grid_config: - type: generated + type: generated config: - eta_file: 'tests/main/input/eta79.nc' + eta_file: 'NDSL/tests/data/eta/eta79.nc' diff --git a/examples/configs/baroclinic_c384_gpu.yaml b/examples/configs/baroclinic_c384_gpu.yaml index 084ddd787..982edd549 100644 --- a/examples/configs/baroclinic_c384_gpu.yaml +++ b/examples/configs/baroclinic_c384_gpu.yaml @@ -8,10 +8,10 @@ stencil_config: initialization: type: analytic config: - case: baroclinic + case: baroclinic_instability performance_config: collect_performance: true - experiment_name: c384_baroclinic + experiment_name: c384_baroclinic_instability nx_tile: 384 nz: 79 dt_atmos: 450 @@ -96,6 +96,6 @@ physics_config: do_qa: true grid_config: - type: generated + type: generated config: - eta_file: 'tests/main/input/eta79.nc' + eta_file: 'NDSL/tests/data/eta/eta79.nc' diff --git a/pyFV3 b/pyFV3 index bca221087..e30f31a21 160000 --- a/pyFV3 +++ b/pyFV3 @@ -1 +1 @@ -Subproject commit bca221087a3daaa3a161e2bb6923cc02ae8955a4 +Subproject commit e30f31a212b25d414d4738f2ba3f05dbf7c5e7cc diff --git a/pySHiELD b/pySHiELD index d2f4fb14c..ae64d42e7 160000 --- a/pySHiELD +++ b/pySHiELD @@ -1 +1 @@ -Subproject commit d2f4fb14c6a252634f190392c3375288574e2d92 +Subproject commit ae64d42e74ada8fb5be026765a3a1d6525ebddf6 From c495c1881542dd2367696595b12d4adeda31779b Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Wed, 19 Nov 2025 11:42:22 -0500 Subject: [PATCH 57/75] Updating submodules --- NDSL | 2 +- pyFV3 | 2 +- pySHiELD | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NDSL b/NDSL index 51874161d..3812e0212 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit 51874161dbf32b24a1c54550019b637920145c2d +Subproject commit 3812e02120f02a93d0321735b5837eab46a4bb2b diff --git a/pyFV3 b/pyFV3 index e30f31a21..cfc664b3e 160000 --- a/pyFV3 +++ b/pyFV3 @@ -1 +1 @@ -Subproject commit e30f31a212b25d414d4738f2ba3f05dbf7c5e7cc +Subproject commit cfc664b3eed79531b47c6c4d00f19fb5aeadf2fa diff --git a/pySHiELD b/pySHiELD index ae64d42e7..987d9eb2b 160000 --- a/pySHiELD +++ b/pySHiELD @@ -1 +1 @@ -Subproject commit ae64d42e74ada8fb5be026765a3a1d6525ebddf6 +Subproject commit 987d9eb2b52c093ba7f9bfb3abb11ba082bce725 From e5254d442118d8a98555fdbec8761dd3989ad2bf Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Fri, 12 Dec 2025 10:33:15 -0500 Subject: [PATCH 58/75] Fixes for Dockerfile to specify NDSL version and black specification (#159) * Fixes for Dockerfile to specify NDSL version and black specification * Testing Dockerfile changes, will be undone * Undoing changes to test Dockerfile build --- Dockerfile | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 59a72a6a7..937e67564 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,19 +15,21 @@ RUN apt-get update && apt-get install -y make \ python3-pip \ git -RUN pip3 install --upgrade pip setuptools wheel +RUN pip install --upgrade pip setuptools wheel COPY . /pace +ENV SETUPTOOLS_SCM_PRETEND_VERSION_FOR_NDSL=2025.10.00 + RUN cd /pace && \ - pip3 install .[test] + pip install .[test] RUN cd / && \ git clone https://github.com/ai2cm/fv3net ENV CFLAGS="-I/usr/include -DACCEPT_USE_OF_DEPRECATED_PROJ_API_H=1" -RUN python3 -m pip install \ +RUN python -m pip install \ matplotlib==3.10.0 \ ipyparallel==8.4.1 \ jupyterlab==3.4.4 \ @@ -35,7 +37,7 @@ RUN python3 -m pip install \ cartopy==0.23.0 \ jupyterlab_code_formatter==1.5.2 \ isort==5.10.1 \ - black==22.3.0 \ + black>=22.3.0 \ /fv3net/external/vcm ENV PYTHONPATH=/fv3net/external/fv3viz:/pace/external/gt4py/src From cea3046d89f0f67455e560f23c9ea5cd3b764416 Mon Sep 17 00:00:00 2001 From: Florian Deconinck Date: Mon, 15 Dec 2025 09:42:24 -0500 Subject: [PATCH 59/75] Update to 2025.11.00 (#161) * Update to 2025.11.00 RC * Update to 2025.11.00 released (tag) --- NDSL | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NDSL b/NDSL index cd5dd0dba..2368e5d8b 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit cd5dd0dba69b3058af78ee933b188f02c2b2416d +Subproject commit 2368e5d8bc2cb3ddeb4395f33f7f33c35a59e18b From 14be4f520ce8588274e8a5dfaff35079b90de673 Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Mon, 15 Dec 2025 11:16:48 -0500 Subject: [PATCH 60/75] [Fix]: Amending Makefile to match testing data downloads of submodules (#163) * Amending Makefile to match testing data downloads of submodules * Downloading all necessary files through the Makefile now * Separating getting standard and physics data, and creating method for getting both. * Simplifying get_test_data in Makefile --- Makefile | 67 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 50 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index 145f7a1c0..fc5d7105a 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,9 @@ SHELL := /bin/bash include docker/Makefile.image_names -include Makefile.data_download ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) + + define BROWSER_PYSCRIPT import os, webbrowser, sys @@ -35,6 +36,19 @@ BUILD_FLAGS ?= ### Testing variables +NUM_RANKS ?=6 +MPIRUN_ARGS ?=--oversubscribe --mca btl_vader_single_copy_mechanism none +MPIRUN_CALL ?=mpirun -np $(NUM_RANKS) $(MPIRUN_ARGS) +TEST_ARGS ?=-v +FV3CORE_THRESH_ARGS=--threshold_overrides_file=$(PACE_PATH)/pyFV3/tests/savepoint/translate/overrides/standard.yaml +PHYSICS_THRESH_ARGS=--threshold_overrides_file=$(PACE_PATH)/pySHiELD/tests/savepoint/translate/overrides/standard.yaml + +TEST_DATA_LOC ?=test_data/ +TEST_DATA_VERSION ?=8.1.3 +TEST_DATA_HOST ?= https://portal.nccs.nasa.gov/datashare/astg/smt/pace-regression-data/ +TEST_RESOLUTION ?= c12 +TEST_CONFIG ?= $(TEST_DATA_LOC)$(TEST_RESOLUTION)_$(NUM_RANKS)ranks + RUN_FLAGS ?=--rm ifeq ("$(CONTAINER_CMD)","") PACE_PATH?=$(ROOT_DIR) @@ -46,31 +60,24 @@ else endif endif ifeq ("$(CONTAINER_CMD)","") - EXPERIMENT_DATA_RUN=$(EXPERIMENT_DATA) + EXPERIMENT_DATA_RUN=$(TEST_CONFIG) else ifeq ("$(CONTAINER_CMD)","srun") - EXPERIMENT_DATA_RUN=$(EXPERIMENT_DATA) + EXPERIMENT_DATA_RUN=$(TEST_CONFIG) else - EXPERIMENT_DATA_RUN=$(PACE_PATH)/test_data/$(FORTRAN_SERIALIZED_DATA_VERSION)/$(EXPERIMENT) + EXPERIMENT_DATA_RUN=$(TEST_CONFIG) endif endif ifeq ($(DEV),y) VOLUMES += -v $(ROOT_DIR):/pace else - VOLUMES += -v $(EXPERIMENT_DATA):$(EXPERIMENT_DATA_RUN) + VOLUMES += -v $(EXPERIMENT_DATA_RUN) endif ifeq ($(CONTAINER_CMD),docker) CONTAINER_FLAGS=run $(RUN_FLAGS) $(VOLUMES) --env GT_CACHE_ROOT=/pace/.gt_cache $(PACE_IMAGE) else CONTAINER_FLAGS= endif -NUM_RANKS ?=6 -MPIRUN_ARGS ?=--oversubscribe --mca btl_vader_single_copy_mechanism none -MPIRUN_CALL ?=mpirun -np $(NUM_RANKS) $(MPIRUN_ARGS) -TEST_ARGS ?=-v -TEST_TYPE=$(word 3, $(subst _, ,$(EXPERIMENT))) -FV3CORE_THRESH_ARGS=--threshold_overrides_file=$(PACE_PATH)/fv3core/tests/savepoint/translate/overrides/$(TEST_TYPE).yaml -PHYSICS_THRESH_ARGS=--threshold_overrides_file=$(PACE_PATH)/physics/tests/savepoint/translate/overrides/$(TEST_TYPE).yaml ### @@ -108,6 +115,32 @@ notebook: DEV=y \ $(MAKE) enter +get_standard_test_data: + if [ ! -d $(TEST_DATA_LOC) ]; then \ + mkdir -p $(TEST_DATA_LOC); \ + fi ; \ + if [ ! -f $(TEST_CONFIG)_standard/dycore/input.nml ] ; then \ + wget $(TEST_DATA_HOST)/8.1.3_c12_6ranks_standard.tar.gz; \ + tar -xzvf $(ROOT_DIR)/8.1.3_c12_6ranks_standard.tar.gz; \ + mv $(ROOT_DIR)/8.1.3/* $(TEST_DATA_LOC); \ + rm -rf 8.1.3*; \ + fi + +get_physics_test_data: + if [ ! -d $(TEST_DATA_LOC) ]; then \ + mkdir -p $(TEST_DATA_LOC); \ + fi ; \ + if [ ! -f $(TEST_CONFIG)_baroclinic/physics/input.nml ] ; then \ + wget $(TEST_DATA_HOST)/8.1.3_c12_6ranks_baroclinic.physics.tar.gz ; \ + tar -xzvf $(ROOT_DIR)/8.1.3_c12_6ranks_baroclinic.physics.tar.gz; \ + mv $(ROOT_DIR)/8.1.3/* $(TEST_DATA_LOC); \ + rm -rf 8.1.3*; \ + fi + +get_test_data: + $(MAKE) get_standard_test_data; \ + $(MAKE) get_physics_test_data + test_util: if [ $(shell $(CHECK_CHANGED_SCRIPT) util) != false ]; then \ $(MAKE) -C util test; \ @@ -115,22 +148,22 @@ test_util: savepoint_tests: build ## dycore-only savepoint tests TARGET=dycore $(MAKE) get_test_data - $(CONTAINER_CMD) $(CONTAINER_FLAGS) bash -c "$(SAVEPOINT_SETUP) && cd $(PACE_PATH) && pytest --data_path=$(EXPERIMENT_DATA_RUN)/dycore/ $(TEST_ARGS) $(FV3CORE_THRESH_ARGS) $(PACE_PATH)/fv3core/tests/savepoint" + $(CONTAINER_CMD) $(CONTAINER_FLAGS) bash -c "$(SAVEPOINT_SETUP) && cd $(PACE_PATH) && pytest --data_path=$(TEST_DATA_LOC)/standard/dycore/ $(TEST_ARGS) $(FV3CORE_THRESH_ARGS) $(PACE_PATH)/pyFV3/tests/savepoint" savepoint_tests_mpi: build TARGET=dycore $(MAKE) get_test_data - $(CONTAINER_CMD) $(CONTAINER_FLAGS) bash -c "$(SAVEPOINT_SETUP) && cd $(PACE_PATH) && $(MPIRUN_CALL) python3 -m mpi4py -m pytest --maxfail=1 --data_path=$(EXPERIMENT_DATA_RUN)/dycore/ $(TEST_ARGS) $(FV3CORE_THRESH_ARGS) -m parallel $(PACE_PATH)/fv3core/tests/savepoint" + $(CONTAINER_CMD) $(CONTAINER_FLAGS) bash -c "$(SAVEPOINT_SETUP) && cd $(PACE_PATH) && $(MPIRUN_CALL) python3 -m mpi4py -m pytest --maxfail=1 --data_path=$(TEST_DATA_LOC)/dycore/ $(TEST_ARGS) $(FV3CORE_THRESH_ARGS) -m parallel $(PACE_PATH)/pyFV3/tests/savepoint" dependencies.svg: dependencies.dot dot -Tsvg $< -o $@ physics_savepoint_tests: build TARGET=physics $(MAKE) get_test_data - $(CONTAINER_CMD) $(CONTAINER_FLAGS) bash -c "$(SAVEPOINT_SETUP) && cd $(PACE_PATH) && pytest --data_path=$(EXPERIMENT_DATA_RUN)/physics/ $(TEST_ARGS) $(PHYSICS_THRESH_ARGS) $(PACE_PATH)/physics/tests/savepoint" + $(CONTAINER_CMD) $(CONTAINER_FLAGS) bash -c "$(SAVEPOINT_SETUP) && cd $(PACE_PATH) && pytest --data_path=$(EXPERIMENT_DATA_RUN)/physics/ $(TEST_ARGS) $(PHYSICS_THRESH_ARGS) $(PACE_PATH)/pySHiELD/tests/savepoint" physics_savepoint_tests_mpi: build TARGET=physics $(MAKE) get_test_data - $(CONTAINER_CMD) $(CONTAINER_FLAGS) bash -c "$(SAVEPOINT_SETUP) && cd $(PACE_PATH) && $(MPIRUN_CALL) python -m mpi4py -m pytest --maxfail=1 --data_path=$(EXPERIMENT_DATA_RUN)/physics/ $(TEST_ARGS) $(PHYSICS_THRESH_ARGS) -m parallel $(PACE_PATH)/physics/tests/savepoint" + $(CONTAINER_CMD) $(CONTAINER_FLAGS) bash -c "$(SAVEPOINT_SETUP) && cd $(PACE_PATH) && $(MPIRUN_CALL) python -m mpi4py -m pytest --maxfail=1 --data_path=$(EXPERIMENT_DATA_RUN)/physics/ $(TEST_ARGS) $(PHYSICS_THRESH_ARGS) -m parallel $(PACE_PATH)/pySHiELD/tests/savepoint" test_main: build $(CONTAINER_CMD) $(CONTAINER_FLAGS) bash -c "$(SAVEPOINT_SETUP) && cd $(PACE_PATH) && pytest $(TEST_ARGS) $(PACE_PATH)/tests/main" @@ -147,7 +180,7 @@ test_mpi_54rank: driver_savepoint_tests_mpi: build TARGET=pace $(MAKE) get_test_data - $(CONTAINER_CMD) $(CONTAINER_FLAGS) bash -c "$(SAVEPOINT_SETUP) && cd $(PACE_PATH) && $(MPIRUN_CALL) python -m mpi4py -m pytest --maxfail=1 --data_path=$(EXPERIMENT_DATA_RUN)/pace/ $(TEST_ARGS) $(PHYSICS_THRESH_ARGS) -m parallel $(PACE_PATH)/physics/tests/savepoint" + $(CONTAINER_CMD) $(CONTAINER_FLAGS) bash -c "$(SAVEPOINT_SETUP) && cd $(PACE_PATH) && $(MPIRUN_CALL) python -m mpi4py -m pytest --maxfail=1 --data_path=$(EXPERIMENT_DATA_RUN)/physics/ $(TEST_ARGS) $(PHYSICS_THRESH_ARGS) -m parallel $(PACE_PATH)/pySHiELD/tests/savepoint" docs: ## generate Sphinx HTML documentation $(MAKE) -C docs html From 57a67509a13ad3de0a70eac86d8f883ac843fd9a Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Tue, 13 Jan 2026 17:33:28 +0100 Subject: [PATCH 61/75] refactor: prefer `get_tile_index()` over `get_tile_number()` (#167) `get_tile_number()` is deprecated and replaced by the zero-index version called `get_tile_index()`. This removes a `FutureWarning`. Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- tests/mpi/ext_grid/test_external_grid.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/mpi/ext_grid/test_external_grid.py b/tests/mpi/ext_grid/test_external_grid.py index 79da0f772..a867d1827 100644 --- a/tests/mpi/ext_grid/test_external_grid.py +++ b/tests/mpi/ext_grid/test_external_grid.py @@ -11,7 +11,7 @@ MPIComm, TilePartitioner, ) -from ndsl.comm.partitioner import get_tile_number +from ndsl.comm.partitioner import get_tile_index from ndsl.constants import PI, RADIUS, X_INTERFACE_DIM, Y_INTERFACE_DIM from pace import Driver, DriverConfig from tests.paths import EXAMPLE_CONFIGS_DIR, REPO_ROOT @@ -33,7 +33,7 @@ def get_cube_comm(layout, comm: MPIComm): def get_tile_num(comm: MPIComm): - return get_tile_number(comm.rank, comm.partitioner.total_ranks) + return get_tile_index(comm.rank, comm.partitioner.total_ranks) + 1 # TODO: Location of test configurations and data will be changed From 421ecb9db725cc5166baeff65d48ec3b0db4cca9 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Tue, 13 Jan 2026 17:47:27 +0100 Subject: [PATCH 62/75] refactor: use new constructor of `QuantityFactory` (#169) Prefer the new constructor of `QuantityFactor` over the deprecated call to `QuantityFactor.from_backend(...)`. This removes a bunch of deprecation warnings in tests. Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- docs/physics/state.rst | 2 +- examples/notebooks/functions.py | 2 +- examples/notebooks/grid_generation.ipynb | 2 +- pace/driver.py | 6 +++--- pace/state.py | 2 +- tests/main/driver/test_diagnostics_config.py | 4 ++-- tests/main/driver/test_restart_fortran.py | 2 +- tests/main/driver/test_restart_serial.py | 2 +- tests/main/fv3core/test_dycore_baroclinic.py | 2 +- tests/main/fv3core/test_dycore_call.py | 2 +- tests/main/physics/test_integration.py | 2 +- tests/main/test_grid_init.py | 2 +- tests/mpi/test_grid_init.py | 2 +- tests/savepoint/translate/translate_driver.py | 2 +- 14 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/physics/state.rst b/docs/physics/state.rst index e56dfb07b..e9d5e37a1 100644 --- a/docs/physics/state.rst +++ b/docs/physics/state.rst @@ -35,7 +35,7 @@ You can initialize a zero-filled PhysicsState and MicrophysicsState from other P ... tile_rank=communicator.tile.rank, ... ) - >>> quantity_factory = QuantityFactory.from_backend(sizer=sizer, backend="numpy") + >>> quantity_factory = QuantityFactory(sizer=sizer, backend="numpy") >>> physics_state = PhysicsState.init_zeros( ... quantity_factory=quantity_factory, schemes=["GFS_microphysics"] ... ) diff --git a/examples/notebooks/functions.py b/examples/notebooks/functions.py index 0c81ff584..0c1356cca 100644 --- a/examples/notebooks/functions.py +++ b/examples/notebooks/functions.py @@ -268,7 +268,7 @@ def configure_domain( tile_rank=communicator.tile.rank, ) - quantity_factory = QuantityFactory.from_backend(sizer=sizer, backend=backend) + quantity_factory = QuantityFactory(sizer=sizer, backend=backend) metric_terms = MetricTerms( quantity_factory=quantity_factory, diff --git a/examples/notebooks/grid_generation.ipynb b/examples/notebooks/grid_generation.ipynb index eb331536e..e7ab6441e 100644 --- a/examples/notebooks/grid_generation.ipynb +++ b/examples/notebooks/grid_generation.ipynb @@ -188,7 +188,7 @@ ")\n", "\n", "# useful for easily allocating distributed data storages (fields)\n", - "quantity_factory = QuantityFactory.from_backend(sizer=sizer, backend=backend)" + "quantity_factory = QuantityFactory(sizer=sizer, backend=backend)" ] }, { diff --git a/pace/driver.py b/pace/driver.py index 4760ff588..8fa464426 100644 --- a/pace/driver.py +++ b/pace/driver.py @@ -177,7 +177,7 @@ def get_grid( tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.tile.rank, ) - quantity_factory = QuantityFactory.from_backend( + quantity_factory = QuantityFactory( sizer, backend=self.stencil_config.compilation_config.backend ) @@ -207,7 +207,7 @@ def get_driver_state( tile_rank=communicator.tile.rank, ) if quantity_factory is None: - quantity_factory = QuantityFactory.from_backend( + quantity_factory = QuantityFactory( sizer, backend=self.stencil_config.compilation_config.backend ) if stencil_factory is None: @@ -760,7 +760,7 @@ def _setup_factories( grid_indexing = GridIndexing.from_sizer_and_communicator( sizer=sizer, comm=communicator ) - quantity_factory = QuantityFactory.from_backend( + quantity_factory = QuantityFactory( sizer, backend=config.stencil_config.compilation_config.backend ) stencil_factory = StencilFactory( diff --git a/pace/state.py b/pace/state.py index 9caa1dc6c..d3d3b0dc1 100644 --- a/pace/state.py +++ b/pace/state.py @@ -91,7 +91,7 @@ def load_state_from_restart( tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.tile.rank, ) - quantity_factory = QuantityFactory.from_backend( + quantity_factory = QuantityFactory( sizer, backend=driver_config.stencil_config.compilation_config.backend ) diff --git a/tests/main/driver/test_diagnostics_config.py b/tests/main/driver/test_diagnostics_config.py index cd0b2ca06..a84a475b9 100644 --- a/tests/main/driver/test_diagnostics_config.py +++ b/tests/main/driver/test_diagnostics_config.py @@ -42,7 +42,7 @@ def test_zselect_raises_error_if_not_3d(tmpdir): z_select=[ZSelect(level=0, names=["phis"])], ) result = config.diagnostics_factory(unittest.mock.MagicMock()) - quantity_factory = QuantityFactory.from_backend( + quantity_factory = QuantityFactory( sizer=SubtileGridSizer.from_tile_params( nx_tile=12, ny_tile=12, @@ -63,7 +63,7 @@ def test_zselect_raises_error_if_3rd_dim_not_z(tmpdir): z_select=[ZSelect(level=0, names=["foo"])], ) result = config.diagnostics_factory(unittest.mock.MagicMock()) - quantity_factory = QuantityFactory.from_backend( + quantity_factory = QuantityFactory( sizer=SubtileGridSizer.from_tile_params( nx_tile=12, ny_tile=12, diff --git a/tests/main/driver/test_restart_fortran.py b/tests/main/driver/test_restart_fortran.py index c658fc027..b355e206a 100644 --- a/tests/main/driver/test_restart_fortran.py +++ b/tests/main/driver/test_restart_fortran.py @@ -35,7 +35,7 @@ def test_state_from_fortran_restart(): tile_rank=0, ) - quantity_factory = QuantityFactory.from_backend(sizer=sizer, backend="numpy") + quantity_factory = QuantityFactory(sizer=sizer, backend="numpy") restart_dir = REPO_ROOT / "tests" / "main" / "data" / "c12_restart" ( diff --git a/tests/main/driver/test_restart_serial.py b/tests/main/driver/test_restart_serial.py index aa9fe693e..ddbed2331 100644 --- a/tests/main/driver/test_restart_serial.py +++ b/tests/main/driver/test_restart_serial.py @@ -67,7 +67,7 @@ def test_restart_save_to_disk(): tile_partitioner=partitioner.tile, tile_rank=communicator.tile.rank, ) - quantity_factory = QuantityFactory.from_backend(sizer=sizer, backend=backend) + quantity_factory = QuantityFactory(sizer=sizer, backend=backend) eta_file = Path(driver_config.grid_config.config.eta_file) ( diff --git a/tests/main/fv3core/test_dycore_baroclinic.py b/tests/main/fv3core/test_dycore_baroclinic.py index afebd877e..c3f214e1b 100644 --- a/tests/main/fv3core/test_dycore_baroclinic.py +++ b/tests/main/fv3core/test_dycore_baroclinic.py @@ -112,7 +112,7 @@ def setup_dycore( grid_indexing = GridIndexing.from_sizer_and_communicator( sizer=sizer, comm=communicator ) - quantity_factory = QuantityFactory.from_backend(sizer=sizer, backend=backend) + quantity_factory = QuantityFactory(sizer=sizer, backend=backend) eta_file = "NDSL/tests/data/eta/eta79.nc" metric_terms = MetricTerms( quantity_factory=quantity_factory, diff --git a/tests/main/fv3core/test_dycore_call.py b/tests/main/fv3core/test_dycore_call.py index e41f69726..e797828f2 100644 --- a/tests/main/fv3core/test_dycore_call.py +++ b/tests/main/fv3core/test_dycore_call.py @@ -96,7 +96,7 @@ def setup_dycore() -> Tuple[DynamicalCore, DycoreState, Timer]: grid_indexing = GridIndexing.from_sizer_and_communicator( sizer=sizer, comm=communicator ) - quantity_factory = QuantityFactory.from_backend(sizer=sizer, backend=backend) + quantity_factory = QuantityFactory(sizer=sizer, backend=backend) eta_file = Path("NDSL/tests/data/eta/eta79.nc") metric_terms = MetricTerms( quantity_factory=quantity_factory, diff --git a/tests/main/physics/test_integration.py b/tests/main/physics/test_integration.py index 6e215ea5d..ff75d74fa 100644 --- a/tests/main/physics/test_integration.py +++ b/tests/main/physics/test_integration.py @@ -50,7 +50,7 @@ def setup_physics(): grid_indexing = GridIndexing.from_sizer_and_communicator( sizer=sizer, comm=communicator ) - quantity_factory = QuantityFactory.from_backend(sizer=sizer, backend=backend) + quantity_factory = QuantityFactory(sizer=sizer, backend=backend) dace_config = DaceConfig( communicator=communicator, backend=backend, diff --git a/tests/main/test_grid_init.py b/tests/main/test_grid_init.py index 32f05aed2..2c28a217a 100644 --- a/tests/main/test_grid_init.py +++ b/tests/main/test_grid_init.py @@ -25,7 +25,7 @@ def get_cube_comm(layout, rank: int): def get_quantity_factory(layout, nx_tile, ny_tile, nz): nx = nx_tile // layout[0] ny = ny_tile // layout[1] - return QuantityFactory.from_backend( + return QuantityFactory( sizer=SubtileGridSizer.from_tile_params( nx_tile=nx, ny_tile=ny, diff --git a/tests/mpi/test_grid_init.py b/tests/mpi/test_grid_init.py index 7e0ab41ac..e472ab88f 100644 --- a/tests/mpi/test_grid_init.py +++ b/tests/mpi/test_grid_init.py @@ -27,7 +27,7 @@ def get_cube_comm(layout, comm: MPIComm): def get_quantity_factory(layout, nx_tile, ny_tile, nz): nx = nx_tile // layout[0] ny = ny_tile // layout[1] - return QuantityFactory.from_backend( + return QuantityFactory( sizer=SubtileGridSizer.from_tile_params( nx=nx, ny=ny, nz=nz, n_halo=3, layout=(1, 1) ), diff --git a/tests/savepoint/translate/translate_driver.py b/tests/savepoint/translate/translate_driver.py index f3499c56d..231f2f921 100644 --- a/tests/savepoint/translate/translate_driver.py +++ b/tests/savepoint/translate/translate_driver.py @@ -36,7 +36,7 @@ def compute_parallel(self, inputs, communicator): tile_rank=communicator.tile.rank, ) - quantity_factory = QuantityFactory.from_backend( + quantity_factory = QuantityFactory( sizer, backend=self.stencil_config.compilation_config.backend ) physics_state = PhysicsState.init_zeros( From 0aa69af2274319ffa95344763ff621e551970b2d Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Tue, 13 Jan 2026 17:53:12 +0100 Subject: [PATCH 63/75] refactor: prefer `backend` over `gt4py_backend` (#170) On `Quantities`, we currently allow both `backend` and `gt4py_backend` where the later is deprecated and about to be removed. See https://github.com/NOAA-GFDL/NDSL/pull/312 and https://github.com/NOAA-GFDL/NDSL/pull/314 for context. Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- examples/notebooks/functions.py | 8 ++++---- examples/notebooks/grid_generation.ipynb | 6 +++--- pace/grid.py | 6 +----- pace/initialization.py | 8 +++----- tests/main/driver/test_safety_checks.py | 4 ++-- 5 files changed, 13 insertions(+), 19 deletions(-) diff --git a/examples/notebooks/functions.py b/examples/notebooks/functions.py index 0c1356cca..f891792f6 100644 --- a/examples/notebooks/functions.py +++ b/examples/notebooks/functions.py @@ -106,7 +106,7 @@ def init_quantity( units=units, origin=(nhalo, nhalo, 0)[:skip_z], extent=(nx, ny, nz)[:skip_z], - gt4py_backend=backend, + backend=backend, ) if grid == VariableGrid.CellCorners: @@ -116,7 +116,7 @@ def init_quantity( units=units, origin=(nhalo, nhalo, 0)[:skip_z], extent=(nx + 1, ny + 1, nz)[:skip_z], - gt4py_backend=backend, + backend=backend, ) elif grid == VariableGrid.StaggeredInX: @@ -126,7 +126,7 @@ def init_quantity( units=units, origin=(nhalo, nhalo, 0)[:skip_z], extent=(nx + 1, ny, nz)[:skip_z], - gt4py_backend=backend, + backend=backend, ) elif grid == VariableGrid.StaggeredInY: @@ -136,7 +136,7 @@ def init_quantity( units=units, origin=(nhalo, nhalo, 0)[:skip_z], extent=(nx, ny + 1, nz)[:skip_z], - gt4py_backend=backend, + backend=backend, ) return variable diff --git a/examples/notebooks/grid_generation.ipynb b/examples/notebooks/grid_generation.ipynb index e7ab6441e..fd82da2d6 100644 --- a/examples/notebooks/grid_generation.ipynb +++ b/examples/notebooks/grid_generation.ipynb @@ -267,7 +267,7 @@ " units=\"degrees\",\n", " origin=(nhalo, nhalo),\n", " extent=(nx + 1, ny + 1),\n", - " gt4py_backend=backend,\n", + " backend=backend,\n", ")\n", "lat = Quantity(\n", " metric_terms.lat.data * 180 / np.pi,\n", @@ -275,7 +275,7 @@ " units=\"degrees\",\n", " origin=(nhalo, nhalo),\n", " extent=(nx + 1, ny + 1),\n", - " gt4py_backend=backend,\n", + " backend=backend,\n", ")\n", "\n", "# gather the distributed fields into a global field on the root rank\n", @@ -357,7 +357,7 @@ " units=\"m2\",\n", " origin=(nhalo, nhalo),\n", " extent=(nx, ny),\n", - " gt4py_backend=backend,\n", + " backend=backend,\n", ")\n", "\n", "# rescale to 10^3 km2\n", diff --git a/pace/grid.py b/pace/grid.py index f91434c6d..2e6813343 100644 --- a/pace/grid.py +++ b/pace/grid.py @@ -181,12 +181,8 @@ def get_grid( quantity_factory: QuantityFactory, communicator: Communicator, ) -> Tuple[DampingCoefficients, DriverGridData, GridData]: - backend = quantity_factory.zeros( - dims=[X_DIM, Y_DIM], units="unknown" - ).gt4py_backend - ndsl_log.info("Using serialized grid data") - grid = self._get_serialized_grid(communicator, backend) + grid = self._get_serialized_grid(communicator, quantity_factory.backend) grid_data = grid.grid_data driver_grid_data = grid.driver_grid_data damping_coefficients = grid.damping_coefficients diff --git a/pace/initialization.py b/pace/initialization.py index b3eed4924..f4eff6224 100644 --- a/pace/initialization.py +++ b/pace/initialization.py @@ -286,11 +286,9 @@ def get_driver_state( grid_data: GridData, schemes: List[PHYSICS_PACKAGES], ) -> DriverState: - backend = quantity_factory.zeros( - dims=[X_DIM, Y_DIM], units="unknown" - ).gt4py_backend - - dycore_state = self._initialize_dycore_state(communicator, backend) + dycore_state = self._initialize_dycore_state( + communicator, quantity_factory.backend + ) physics_state = PhysicsState.init_zeros( quantity_factory=quantity_factory, schemes=schemes, diff --git a/tests/main/driver/test_safety_checks.py b/tests/main/driver/test_safety_checks.py index 77560b888..9eec5c733 100644 --- a/tests/main/driver/test_safety_checks.py +++ b/tests/main/driver/test_safety_checks.py @@ -65,7 +65,7 @@ def test_check_state_domain_only(): "unknown", origin=(1, 1, 0), extent=(3, 3, 2), - gt4py_backend="numpy", + backend="numpy", ) dycore_state = unittest.mock.MagicMock(u=u_quantity) checker.check_state(dycore_state) @@ -83,7 +83,7 @@ def test_check_nan_value(): "unknown", origin=(0, 0, 0), extent=(4, 4, 2), - gt4py_backend="numpy", + backend="numpy", ) dycore_state = unittest.mock.MagicMock(u=u_quantity) with pytest.raises(RuntimeError): From 516427e08cae14e9f3b8130ac17b41261e6b1779 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Tue, 13 Jan 2026 19:41:36 +0100 Subject: [PATCH 64/75] refactor: move `NullComm` from NDSL to pace (#168) We decided to remove `NullComm` from NDSL in favor of `MPIComm` and `LocalComm`, see https://github.com/NOAA-GFDL/NDSL/pull/318 for context. pace exposes a `NullCommConfig` and is heavily relying on `NullComm` in tests. We thus suggest to move `NullComm` to `pace/comm.py`. Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- pace/__init__.py | 2 + pace/comm.py | 121 ++++++++++++++++++- tests/main/driver/test_driver.py | 4 +- tests/main/driver/test_restart_fortran.py | 3 +- tests/main/driver/test_restart_serial.py | 18 +-- tests/main/fv3core/test_cartesian_grid.py | 3 +- tests/main/fv3core/test_dycore_baroclinic.py | 2 +- tests/main/fv3core/test_dycore_call.py | 2 +- tests/main/fv3core/test_init_from_geos.py | 2 +- tests/main/physics/test_integration.py | 2 +- tests/main/test_comm.py | 10 ++ tests/main/test_grid_init.py | 2 +- tests/mpi/restart/test_restart.py | 3 +- 13 files changed, 141 insertions(+), 33 deletions(-) create mode 100644 tests/main/test_comm.py diff --git a/pace/__init__.py b/pace/__init__.py index aa60b1a35..6703b854e 100644 --- a/pace/__init__.py +++ b/pace/__init__.py @@ -4,6 +4,7 @@ CreatesComm, CreatesCommSelector, MPICommConfig, + NullComm, NullCommConfig, ReaderCommConfig, WriterCommConfig, @@ -25,6 +26,7 @@ __version__ = "0.2.0" __all__ = [ + "NullComm", "CreatesComm", "CreatesCommSelector", "MPICommConfig", diff --git a/pace/comm.py b/pace/comm.py index 87bfcf8eb..d031ad208 100644 --- a/pace/comm.py +++ b/pace/comm.py @@ -1,13 +1,126 @@ import abc +import copy import dataclasses import os -from typing import Any, ClassVar, List - -from ndsl import MPIComm, NullComm -from ndsl.comm import CachingCommReader, CachingCommWriter, Comm +from typing import Any, ClassVar, List, Mapping, TypeVar, cast + +from ndsl import MPIComm +from ndsl.comm import ( + CachingCommReader, + CachingCommWriter, + Comm, + ReductionOperator, + Request, +) from pace.registry import Registry +T = TypeVar("T") + + +class NullAsyncResult(Request): + def __init__(self, recvbuf: Any = None) -> None: + self._recvbuf = recvbuf + + def wait(self) -> None: + if self._recvbuf is not None: + self._recvbuf[:] = 0.0 + + +class NullComm(Comm[T]): + """ + A class with a subset of the mpi4py Comm API, but which + 'receives' a fill value (default zero) instead of using MPI. + """ + + default_fill_value: T = cast(T, 0) + + def __init__(self, rank: int, total_ranks: int, fill_value: T = default_fill_value): + """ + Args: + rank: rank to mock + total_ranks: number of total MPI ranks to mock + fill_value: fill halos with this value when performing + halo updates. + """ + self.rank = rank + self.total_ranks = total_ranks + self._fill_value = fill_value + self._split_comms: Mapping[Any, list[NullComm]] = {} + + def __repr__(self) -> str: + return f"NullComm(rank={self.rank}, total_ranks={self.total_ranks})" + + def Get_rank(self) -> int: + return self.rank + + def Get_size(self) -> int: + return self.total_ranks + + def bcast(self, value: T | None, root: int = 0) -> T | None: + return value + + def barrier(self) -> None: + return + + def Barrier(self) -> None: + return + + def Scatter(self, sendbuf, recvbuf, root: int = 0, **kwargs: dict): # type: ignore[no-untyped-def] + if recvbuf is not None: + recvbuf[:] = self._fill_value + + def Gather(self, sendbuf, recvbuf, root: int = 0, **kwargs: dict): # type: ignore[no-untyped-def] + if recvbuf is not None: + recvbuf[:] = self._fill_value + + def allgather(self, sendobj: T) -> list[T]: + return [copy.deepcopy(sendobj) for _ in range(self.total_ranks)] + + def Send(self, sendbuf, dest, tag: int = 0, **kwargs: dict): # type: ignore[no-untyped-def] + pass + + def Isend(self, sendbuf, dest, tag: int = 0, **kwargs: dict) -> Request: # type: ignore[no-untyped-def] + return NullAsyncResult() + + def Recv(self, recvbuf, source, tag: int = 0, **kwargs: dict): # type: ignore[no-untyped-def] + recvbuf[:] = self._fill_value + + def Irecv(self, recvbuf, source, tag: int = 0, **kwargs: dict) -> Request: # type: ignore[no-untyped-def] + return NullAsyncResult(recvbuf) + + def sendrecv(self, sendbuf, dest, **kwargs: dict): # type: ignore[no-untyped-def] + return sendbuf + + def Split(self, color, key) -> Comm: # type: ignore[no-untyped-def] + # key argument is ignored, assumes we're calling the ranks from least to + # greatest when mocking Split + self._split_comms[color] = self._split_comms.get(color, []) # type: ignore[index] + rank = len(self._split_comms[color]) + total_ranks = rank + 1 + new_comm = NullComm( + rank=rank, total_ranks=total_ranks, fill_value=self._fill_value + ) + for comm in self._split_comms[color]: + # won't know how many ranks there are until everything is split + comm.total_ranks = total_ranks + self._split_comms[color].append(new_comm) + return new_comm + + def allreduce( + self, sendobj: T, op: ReductionOperator = ReductionOperator.NO_OP + ) -> T: + return self._fill_value + + def Allreduce(self, sendobj: T, recvobj: T, op: ReductionOperator) -> T: + # TODO: what about reduction operator `op`? + recvobj = sendobj + return recvobj + + def Allreduce_inplace(self, obj: T, op: ReductionOperator) -> T: + raise NotImplementedError("NullComm.Allreduce_inplace") + + class CreatesComm(abc.ABC): """ Retrieves and does cleanup for a mpi4py-style Comm object. diff --git a/tests/main/driver/test_driver.py b/tests/main/driver/test_driver.py index d5020809b..c48b6510c 100644 --- a/tests/main/driver/test_driver.py +++ b/tests/main/driver/test_driver.py @@ -4,14 +4,14 @@ import pytest -from ndsl import NullComm, StencilConfig +from ndsl import StencilConfig from ndsl.performance.report import ( TimeReport, gather_hit_counts, gather_timing_data, get_sypd, ) -from pace import CreatesCommSelector, DriverConfig, NullCommConfig +from pace import CreatesCommSelector, DriverConfig, NullComm, NullCommConfig def get_driver_config( diff --git a/tests/main/driver/test_restart_fortran.py b/tests/main/driver/test_restart_fortran.py index b355e206a..d075916fe 100644 --- a/tests/main/driver/test_restart_fortran.py +++ b/tests/main/driver/test_restart_fortran.py @@ -5,12 +5,11 @@ CubedSphereCommunicator, CubedSpherePartitioner, LocalComm, - NullComm, QuantityFactory, SubtileGridSizer, TilePartitioner, ) -from pace import FortranRestartInit, GeneratedGridConfig +from pace import FortranRestartInit, GeneratedGridConfig, NullComm from pyshield import PHYSICS_PACKAGES from tests.paths import REPO_ROOT diff --git a/tests/main/driver/test_restart_serial.py b/tests/main/driver/test_restart_serial.py index ddbed2331..b846a8e91 100644 --- a/tests/main/driver/test_restart_serial.py +++ b/tests/main/driver/test_restart_serial.py @@ -10,7 +10,6 @@ from ndsl import ( CubedSphereCommunicator, CubedSpherePartitioner, - NullComm, Quantity, QuantityFactory, SubtileGridSizer, @@ -18,9 +17,9 @@ ) from pace import ( AnalyticInit, - CreatesComm, DriverConfig, GeneratedGridConfig, + NullComm, RestartConfig, ) from pyshield import PHYSICS_PACKAGES @@ -30,21 +29,6 @@ DIR = os.path.dirname(os.path.abspath(__file__)) -class NullCommConfig(CreatesComm): - def __init__(self, layout): - self.layout = layout - - def get_comm(self): - return NullComm( - rank=0, - total_ranks=6 * self.layout[0] * self.layout[1], - fill_value=0.0, - ) - - def cleanup(self, comm): - pass - - def test_default_save_restart(): restart_config = RestartConfig() assert restart_config.save_restart is False diff --git a/tests/main/fv3core/test_cartesian_grid.py b/tests/main/fv3core/test_cartesian_grid.py index 1f3c5bdb1..6e1d940b7 100644 --- a/tests/main/fv3core/test_cartesian_grid.py +++ b/tests/main/fv3core/test_cartesian_grid.py @@ -3,9 +3,10 @@ import numpy as np import pytest -from ndsl import NullComm, TileCommunicator, TilePartitioner +from ndsl import TileCommunicator, TilePartitioner from ndsl.constants import PI from ndsl.grid import MetricTerms +from pace import NullComm @pytest.mark.parametrize("npx", [8]) diff --git a/tests/main/fv3core/test_dycore_baroclinic.py b/tests/main/fv3core/test_dycore_baroclinic.py index c3f214e1b..57e5847ae 100644 --- a/tests/main/fv3core/test_dycore_baroclinic.py +++ b/tests/main/fv3core/test_dycore_baroclinic.py @@ -14,7 +14,6 @@ CubedSpherePartitioner, DaceConfig, GridIndexing, - NullComm, QuantityFactory, StencilConfig, StencilFactory, @@ -24,6 +23,7 @@ ) from ndsl.grid import DampingCoefficients, GridData, MetricTerms from ndsl.performance.timer import NullTimer +from pace import NullComm from pyfv3 import DycoreState, DynamicalCore, DynamicalCoreConfig diff --git a/tests/main/fv3core/test_dycore_call.py b/tests/main/fv3core/test_dycore_call.py index e797828f2..163f0efd2 100644 --- a/tests/main/fv3core/test_dycore_call.py +++ b/tests/main/fv3core/test_dycore_call.py @@ -11,7 +11,6 @@ CubedSpherePartitioner, DaceConfig, GridIndexing, - NullComm, Quantity, QuantityFactory, StencilConfig, @@ -22,6 +21,7 @@ from ndsl.grid import DampingCoefficients, GridData, MetricTerms from ndsl.performance.timer import NullTimer, Timer from ndsl.stencils.testing import assert_same_temporaries, copy_temporaries +from pace import NullComm from pyfv3 import DycoreState, DynamicalCore, DynamicalCoreConfig from pyfv3.initialization.analytic_init import AnalyticCase diff --git a/tests/main/fv3core/test_init_from_geos.py b/tests/main/fv3core/test_init_from_geos.py index 266b97623..b1c05a676 100644 --- a/tests/main/fv3core/test_init_from_geos.py +++ b/tests/main/fv3core/test_init_from_geos.py @@ -2,7 +2,7 @@ import numpy as np import pytest # noqa -from ndsl import NullComm +from pace import NullComm from pyfv3 import DynamicalCore from pyfv3.wrappers import GeosDycoreWrapper diff --git a/tests/main/physics/test_integration.py b/tests/main/physics/test_integration.py index ff75d74fa..9a4c1823c 100644 --- a/tests/main/physics/test_integration.py +++ b/tests/main/physics/test_integration.py @@ -11,7 +11,6 @@ DaceConfig, DaCeOrchestration, GridIndexing, - NullComm, QuantityFactory, StencilConfig, StencilFactory, @@ -20,6 +19,7 @@ ) from ndsl.grid import GridData, MetricTerms from ndsl.stencils.testing import assert_same_temporaries, copy_temporaries +from pace import NullComm from pyshield import PHYSICS_PACKAGES, Physics, PhysicsConfig, PhysicsState diff --git a/tests/main/test_comm.py b/tests/main/test_comm.py new file mode 100644 index 000000000..a552201aa --- /dev/null +++ b/tests/main/test_comm.py @@ -0,0 +1,10 @@ +from ndsl import CubedSphereCommunicator, CubedSpherePartitioner, TilePartitioner +from pace import NullComm + + +def test_can_create_cube_communicator(): + null_comm = NullComm(rank=2, total_ranks=24) + partitioner = CubedSpherePartitioner(TilePartitioner(layout=(2, 2))) + communicator = CubedSphereCommunicator(null_comm, partitioner) + + assert communicator.tile.partitioner diff --git a/tests/main/test_grid_init.py b/tests/main/test_grid_init.py index 2c28a217a..5bbe6f0d5 100644 --- a/tests/main/test_grid_init.py +++ b/tests/main/test_grid_init.py @@ -6,13 +6,13 @@ from ndsl import ( CubedSphereCommunicator, CubedSpherePartitioner, - NullComm, Quantity, QuantityFactory, SubtileGridSizer, TilePartitioner, ) from ndsl.grid import MetricTerms +from pace import NullComm def get_cube_comm(layout, rank: int): diff --git a/tests/mpi/restart/test_restart.py b/tests/mpi/restart/test_restart.py index 05e6dafea..44dee3d2a 100644 --- a/tests/mpi/restart/test_restart.py +++ b/tests/mpi/restart/test_restart.py @@ -10,11 +10,10 @@ from ndsl import ( CubedSphereCommunicator, CubedSpherePartitioner, - NullComm, Quantity, TilePartitioner, ) -from pace import DriverConfig, DriverState +from pace import DriverConfig, DriverState, NullComm from pyshield import PHYSICS_PACKAGES From 003e938cc3d5763c6be923b3d24a030cf9518236 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Fri, 16 Jan 2026 13:53:03 +0100 Subject: [PATCH 65/75] Update pyFV3 and pySHiELD submodules (#173) This PR updates pyFV3 and pySHiELD submodules in pace to include the latest changes. These changes are necessary to fully remove deprecated code in NDSL (which is planned for the upcoming 2026.01.00 release). We are also temporarily skipping `mypy` checking for `translate_fvdynamics.py`. There are type issue in the translate test system which we will address in the next release of NDSL. Once we update pyFV3 to NDSL version 2026.01.00, we should be able to remove that exception again. For context see https://github.com/NOAA-GFDL/NDSL/pull/360. Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- pyFV3 | 2 +- pySHiELD | 2 +- pyproject.toml | 10 ++++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/pyFV3 b/pyFV3 index bca221087..3c2c3d4d3 160000 --- a/pyFV3 +++ b/pyFV3 @@ -1 +1 @@ -Subproject commit bca221087a3daaa3a161e2bb6923cc02ae8955a4 +Subproject commit 3c2c3d4d3ad07f41b7e70b3d5c731a9f06dcf2a8 diff --git a/pySHiELD b/pySHiELD index d2f4fb14c..9e2cee13b 160000 --- a/pySHiELD +++ b/pySHiELD @@ -1 +1 @@ -Subproject commit d2f4fb14c6a252634f190392c3375288574e2d92 +Subproject commit 9e2cee13b69467e31d9eae012c16b0cd5c434c0d diff --git a/pyproject.toml b/pyproject.toml index 5cfdedae1..7711fece2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -73,6 +73,16 @@ namespace_packages = true strict_optional = false warn_unreachable = true +[[tool.mypy.overrides]] +ignore_errors = true +module = [ + # We currently can't type stencils + "pyshield.stencils.*", + # Will be fixed with NDSL version 2026.01.00, see + # https://github.com/NOAA-GFDL/NDSL/pull/360 + "pyfv3.testing.translate_fvdynamics" +] + [tool.setuptools] include-package-data = true From 667dea06196fbc41ce106f37e9cb03483679eb2b Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Fri, 16 Jan 2026 21:29:51 +0100 Subject: [PATCH 66/75] update pyFV3 to propagate `NullComm` -> `LocalComm` (#174) Co-authored-by: Roman Cattaneo <> --- pyFV3 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyFV3 b/pyFV3 index 3c2c3d4d3..22c14abaf 160000 --- a/pyFV3 +++ b/pyFV3 @@ -1 +1 @@ -Subproject commit 3c2c3d4d3ad07f41b7e70b3d5c731a9f06dcf2a8 +Subproject commit 22c14abaf5cd480f71d5b6a79241f573216a6e0a From 1372853a2d27957af5d3549018493fbe24e73a53 Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Fri, 16 Jan 2026 18:18:34 -0500 Subject: [PATCH 67/75] refactor: update actions in workflows, checkout@v6, cache@v5 (#171) --- .github/workflows/container_build_test.yaml | 2 +- .github/workflows/create_cache.yml | 6 +++--- .github/workflows/lint.yaml | 6 +++--- .github/workflows/main_unit_tests.yaml | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/container_build_test.yaml b/.github/workflows/container_build_test.yaml index d2f267fe6..bfbbffd92 100644 --- a/.github/workflows/container_build_test.yaml +++ b/.github/workflows/container_build_test.yaml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Files - uses: actions/checkout@v5.0.0 + uses: actions/checkout@v6 with: submodules: recursive - name: Build Dockerfile diff --git a/.github/workflows/create_cache.yml b/.github/workflows/create_cache.yml index c3cdcea21..fa1b21a65 100644 --- a/.github/workflows/create_cache.yml +++ b/.github/workflows/create_cache.yml @@ -23,14 +23,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Setup Python 3.11 - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: '3.11' - - uses: actions/cache@v4 + - uses: actions/cache@v5 id: cache with: path: ~/.cache/pre-commit diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 47600cb2e..7cc8e5c88 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -13,18 +13,18 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: 'recursive' - name: Step Python 3.11 - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: '3.11' # Only restore (don't save) caches on PRs. New caches created from PRs won't be # accessible from other PRs, see workflows/create-cache.yaml. - - uses: actions/cache/restore@v4 + - uses: actions/cache/restore@v5 with: path: ~/.cache/pre-commit key: pre-commit_${{ env.pythonLocation }}_${{ hashFiles('.pre-commit-config.yaml') }} diff --git a/.github/workflows/main_unit_tests.yaml b/.github/workflows/main_unit_tests.yaml index cc0d3228d..ec0444726 100644 --- a/.github/workflows/main_unit_tests.yaml +++ b/.github/workflows/main_unit_tests.yaml @@ -32,7 +32,7 @@ jobs: steps: - name: "External trigger: Checkout pace/develop" if: ${{ inputs.component_trigger }} - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: 'recursive' repository: NOAA-GFDL/pace @@ -40,7 +40,7 @@ jobs: ref: develop - name: Setup Python 3.11 - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: '3.11' @@ -59,7 +59,7 @@ jobs: run: rm -rf ${GITHUB_WORKSPACE}/pace/${{inputs.component_name}} - name: Checkout out hash that triggered CI - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: 'recursive' path: pace/${{inputs.component_name}} From 495d905e08ac8be6681a42b043b01dbc6d57f496 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Wed, 21 Jan 2026 14:01:47 +0100 Subject: [PATCH 68/75] Update NDSL 2026.01.00 (#175) Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- NDSL | 2 +- pace/diagnostics.py | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/NDSL b/NDSL index 2368e5d8b..3d8fa05ee 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit 2368e5d8bc2cb3ddeb4395f33f7f33c35a59e18b +Subproject commit 3d8fa05ee7b78182afd2e749532582ffaa25b595 diff --git a/pace/diagnostics.py b/pace/diagnostics.py index 35895e03e..6afdc7685 100644 --- a/pace/diagnostics.py +++ b/pace/diagnostics.py @@ -58,6 +58,7 @@ def select_data(self, state: DycoreState): origin=getattr(state, name).origin[0:2], extent=getattr(state, name).extent[0:2], units=getattr(state, name).units, + backend=getattr(state, name).backend, ) return output @@ -235,7 +236,7 @@ def cleanup(self): pass -def _compute_column_integral(name: str, q_in: Quantity, delp: Quantity): +def _compute_column_integral(name: str, q_in: Quantity, delp: Quantity) -> Quantity: """ Compute column integrated mixing ratio (e.g., total liquid water path) @@ -243,19 +244,25 @@ def _compute_column_integral(name: str, q_in: Quantity, delp: Quantity): name: name of the tracer q_in: tracer mixing ratio delp: pressure thickness of atmospheric layer + + Returns: + The column integral. """ - assert len(q_in.dims) > 2 + if len(q_in.dims) <= 2: + raise RuntimeError("This function assumes that q_in is at least 3-dimensional.") + if q_in.dims[2] != Z_DIM: - raise NotImplementedError( - "this function assumes the z-dimension is the third dimension" + raise RuntimeError( + "This function assumes the z-dimension is the third dimension" ) + k_slice = slice(q_in.origin[2], q_in.origin[2] + q_in.extent[2]) - column_integral = Quantity( + return Quantity( RGRAV * q_in.np.sum(q_in.data[:, :, k_slice] * delp.data[:, :, k_slice], axis=2), dims=tuple(q_in.dims[:2]) + tuple(q_in.dims[3:]), origin=q_in.metadata.origin[0:2], extent=(q_in.metadata.extent[0], q_in.metadata.extent[1]), units="kg/m**2", + backend=q_in.backend, ) - return column_integral From 2404cc946a47f627055460ea3f62491b0e7a7798 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Wed, 21 Jan 2026 21:50:14 +0100 Subject: [PATCH 69/75] refactor: get rid of deprecation warnings from NDSL 2026.01.00 (#177) * refactor: get rid of deprecation warnings from NDSL 2026.01.00 * fixup: keep line beaks as-is --------- Co-authored-by: Roman Cattaneo <1116746+romanc@users.noreply.github.com> --- docs/physics/state.rst | 4 +++- examples/notebooks/functions.py | 1 + examples/notebooks/grid_generation.ipynb | 1 + pace/driver.py | 3 +++ pace/state.py | 1 + pyFV3 | 2 +- pySHiELD | 2 +- tests/main/driver/test_diagnostics_config.py | 8 ++++++-- tests/main/driver/test_restart_fortran.py | 4 +++- tests/main/driver/test_restart_serial.py | 1 + tests/main/fv3core/test_dycore_baroclinic.py | 1 + tests/main/fv3core/test_dycore_call.py | 1 + tests/main/physics/test_integration.py | 1 + tests/main/test_grid_init.py | 5 ++++- tests/mpi/test_grid_init.py | 6 ++++-- tests/savepoint/test_checkpoints.py | 1 + tests/savepoint/translate/translate_driver.py | 1 + 17 files changed, 34 insertions(+), 9 deletions(-) diff --git a/docs/physics/state.rst b/docs/physics/state.rst index e9d5e37a1..ae250a457 100644 --- a/docs/physics/state.rst +++ b/docs/physics/state.rst @@ -23,6 +23,7 @@ You can initialize a zero-filled PhysicsState and MicrophysicsState from other P ... ) >>> from pace.physics import PhysicsState >>> layout = (1, 1) + >>> backend = "numpy" >>> partitioner = CubedSpherePartitioner(TilePartitioner(layout)) >>> communicator = CubedSphereCommunicator(NullComm(rank=0, total_ranks=6), partitioner) >>> sizer = SubtileGridSizer.from_tile_params( @@ -33,9 +34,10 @@ You can initialize a zero-filled PhysicsState and MicrophysicsState from other P ... layout=layout, ... tile_partitioner=partitioner.tile, ... tile_rank=communicator.tile.rank, + ... backend=backend ... ) - >>> quantity_factory = QuantityFactory(sizer=sizer, backend="numpy") + >>> quantity_factory = QuantityFactory(sizer=sizer, backend=backend) >>> physics_state = PhysicsState.init_zeros( ... quantity_factory=quantity_factory, schemes=["GFS_microphysics"] ... ) diff --git a/examples/notebooks/functions.py b/examples/notebooks/functions.py index f891792f6..f11fc913a 100644 --- a/examples/notebooks/functions.py +++ b/examples/notebooks/functions.py @@ -266,6 +266,7 @@ def configure_domain( layout=dimensions["layout"], tile_partitioner=partitioner.tile, tile_rank=communicator.tile.rank, + backend=backend, ) quantity_factory = QuantityFactory(sizer=sizer, backend=backend) diff --git a/examples/notebooks/grid_generation.ipynb b/examples/notebooks/grid_generation.ipynb index fd82da2d6..5f341db04 100644 --- a/examples/notebooks/grid_generation.ipynb +++ b/examples/notebooks/grid_generation.ipynb @@ -185,6 +185,7 @@ " layout=layout,\n", " tile_partitioner=partitioner.tile,\n", " tile_rank=communicator.tile.rank,\n", + " backend=backend,\n", ")\n", "\n", "# useful for easily allocating distributed data storages (fields)\n", diff --git a/pace/driver.py b/pace/driver.py index 8fa464426..f6f825d81 100644 --- a/pace/driver.py +++ b/pace/driver.py @@ -176,6 +176,7 @@ def get_grid( layout=self.layout, tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.tile.rank, + backend=self.stencil_config.backend, ) quantity_factory = QuantityFactory( sizer, backend=self.stencil_config.compilation_config.backend @@ -205,6 +206,7 @@ def get_driver_state( layout=self.layout, tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.tile.rank, + backend=self.stencil_config.backend, ) if quantity_factory is None: quantity_factory = QuantityFactory( @@ -755,6 +757,7 @@ def _setup_factories( layout=config.layout, tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.tile.rank, + backend=config.stencil_config.backend, ) grid_indexing = GridIndexing.from_sizer_and_communicator( diff --git a/pace/state.py b/pace/state.py index d3d3b0dc1..45c205600 100644 --- a/pace/state.py +++ b/pace/state.py @@ -90,6 +90,7 @@ def load_state_from_restart( layout=driver_config.layout, tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.tile.rank, + backend=driver_config.stencil_config.backend, ) quantity_factory = QuantityFactory( sizer, backend=driver_config.stencil_config.compilation_config.backend diff --git a/pyFV3 b/pyFV3 index 22c14abaf..64ddc3a6c 160000 --- a/pyFV3 +++ b/pyFV3 @@ -1 +1 @@ -Subproject commit 22c14abaf5cd480f71d5b6a79241f573216a6e0a +Subproject commit 64ddc3a6c12d216ce46393c414754d4651ccebda diff --git a/pySHiELD b/pySHiELD index 9e2cee13b..66df9db17 160000 --- a/pySHiELD +++ b/pySHiELD @@ -1 +1 @@ -Subproject commit 9e2cee13b69467e31d9eae012c16b0cd5c434c0d +Subproject commit 66df9db174aef33a2702961299c890fc75e347dc diff --git a/tests/main/driver/test_diagnostics_config.py b/tests/main/driver/test_diagnostics_config.py index a84a475b9..1b3d7bced 100644 --- a/tests/main/driver/test_diagnostics_config.py +++ b/tests/main/driver/test_diagnostics_config.py @@ -42,6 +42,7 @@ def test_zselect_raises_error_if_not_3d(tmpdir): z_select=[ZSelect(level=0, names=["phis"])], ) result = config.diagnostics_factory(unittest.mock.MagicMock()) + backend = "numpy" quantity_factory = QuantityFactory( sizer=SubtileGridSizer.from_tile_params( nx_tile=12, @@ -49,8 +50,9 @@ def test_zselect_raises_error_if_not_3d(tmpdir): nz=79, n_halo=3, layout=(1, 1), + backend=backend, ), - backend="numpy", + backend=backend, ) state = DycoreState.init_zeros(quantity_factory) result.z_select[0].select_data(state) @@ -63,6 +65,7 @@ def test_zselect_raises_error_if_3rd_dim_not_z(tmpdir): z_select=[ZSelect(level=0, names=["foo"])], ) result = config.diagnostics_factory(unittest.mock.MagicMock()) + backend = "numpy" quantity_factory = QuantityFactory( sizer=SubtileGridSizer.from_tile_params( nx_tile=12, @@ -70,8 +73,9 @@ def test_zselect_raises_error_if_3rd_dim_not_z(tmpdir): nz=79, n_halo=3, layout=(1, 1), + backend=backend, ), - backend="numpy", + backend=backend, ) state = DycoreState.init_zeros(quantity_factory) foo = quantity_factory.zeros(dims=["z", "x", "y"], units="-") diff --git a/tests/main/driver/test_restart_fortran.py b/tests/main/driver/test_restart_fortran.py index d075916fe..cdb7c5241 100644 --- a/tests/main/driver/test_restart_fortran.py +++ b/tests/main/driver/test_restart_fortran.py @@ -16,6 +16,7 @@ def test_state_from_fortran_restart(): layout = (1, 1) + backend = "numpy" partitioner = CubedSpherePartitioner(TilePartitioner(layout)) # need a local communicator to mock "scatter" for the restart data, # but need null communicator to handle grid initialization @@ -32,9 +33,10 @@ def test_state_from_fortran_restart(): layout=layout, tile_partitioner=partitioner.tile, tile_rank=0, + backend=backend, ) - quantity_factory = QuantityFactory(sizer=sizer, backend="numpy") + quantity_factory = QuantityFactory(sizer=sizer, backend=backend) restart_dir = REPO_ROOT / "tests" / "main" / "data" / "c12_restart" ( diff --git a/tests/main/driver/test_restart_serial.py b/tests/main/driver/test_restart_serial.py index b846a8e91..52600f2b9 100644 --- a/tests/main/driver/test_restart_serial.py +++ b/tests/main/driver/test_restart_serial.py @@ -50,6 +50,7 @@ def test_restart_save_to_disk(): layout=(1, 1), tile_partitioner=partitioner.tile, tile_rank=communicator.tile.rank, + backend=backend, ) quantity_factory = QuantityFactory(sizer=sizer, backend=backend) diff --git a/tests/main/fv3core/test_dycore_baroclinic.py b/tests/main/fv3core/test_dycore_baroclinic.py index 57e5847ae..533b12a62 100644 --- a/tests/main/fv3core/test_dycore_baroclinic.py +++ b/tests/main/fv3core/test_dycore_baroclinic.py @@ -108,6 +108,7 @@ def setup_dycore( layout=config.layout, tile_partitioner=partitioner.tile, tile_rank=communicator.tile.rank, + backend=backend, ) grid_indexing = GridIndexing.from_sizer_and_communicator( sizer=sizer, comm=communicator diff --git a/tests/main/fv3core/test_dycore_call.py b/tests/main/fv3core/test_dycore_call.py index 163f0efd2..9fa95184d 100644 --- a/tests/main/fv3core/test_dycore_call.py +++ b/tests/main/fv3core/test_dycore_call.py @@ -92,6 +92,7 @@ def setup_dycore() -> Tuple[DynamicalCore, DycoreState, Timer]: layout=config.layout, tile_partitioner=partitioner.tile, tile_rank=communicator.tile.rank, + backend=backend, ) grid_indexing = GridIndexing.from_sizer_and_communicator( sizer=sizer, comm=communicator diff --git a/tests/main/physics/test_integration.py b/tests/main/physics/test_integration.py index 9a4c1823c..dc5ba8163 100644 --- a/tests/main/physics/test_integration.py +++ b/tests/main/physics/test_integration.py @@ -46,6 +46,7 @@ def setup_physics(): layout=layout, tile_partitioner=partitioner.tile, tile_rank=communicator.tile.rank, + backend=backend, ) grid_indexing = GridIndexing.from_sizer_and_communicator( sizer=sizer, comm=communicator diff --git a/tests/main/test_grid_init.py b/tests/main/test_grid_init.py index 5bbe6f0d5..006244365 100644 --- a/tests/main/test_grid_init.py +++ b/tests/main/test_grid_init.py @@ -25,6 +25,8 @@ def get_cube_comm(layout, rank: int): def get_quantity_factory(layout, nx_tile, ny_tile, nz): nx = nx_tile // layout[0] ny = ny_tile // layout[1] + backend = "numpy" + return QuantityFactory( sizer=SubtileGridSizer.from_tile_params( nx_tile=nx, @@ -32,8 +34,9 @@ def get_quantity_factory(layout, nx_tile, ny_tile, nz): nz=nz, n_halo=3, layout=(1, 1), + backend=backend, ), - backend="numpy", + backend=backend, ) diff --git a/tests/mpi/test_grid_init.py b/tests/mpi/test_grid_init.py index e472ab88f..337ae6ee0 100644 --- a/tests/mpi/test_grid_init.py +++ b/tests/mpi/test_grid_init.py @@ -27,11 +27,13 @@ def get_cube_comm(layout, comm: MPIComm): def get_quantity_factory(layout, nx_tile, ny_tile, nz): nx = nx_tile // layout[0] ny = ny_tile // layout[1] + backend = "numpy" + return QuantityFactory( sizer=SubtileGridSizer.from_tile_params( - nx=nx, ny=ny, nz=nz, n_halo=3, layout=(1, 1) + nx=nx, ny=ny, nz=nz, n_halo=3, layout=(1, 1), backend=backend ), - backend="numpy", + backend=backend, ) diff --git a/tests/savepoint/test_checkpoints.py b/tests/savepoint/test_checkpoints.py index 2a2f22fde..f4c36847c 100644 --- a/tests/savepoint/test_checkpoints.py +++ b/tests/savepoint/test_checkpoints.py @@ -90,6 +90,7 @@ def test_fv_dynamics( tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.rank, layout=namelist.layout, + backend=backend, ), comm=communicator, ), diff --git a/tests/savepoint/translate/translate_driver.py b/tests/savepoint/translate/translate_driver.py index 231f2f921..59016e913 100644 --- a/tests/savepoint/translate/translate_driver.py +++ b/tests/savepoint/translate/translate_driver.py @@ -34,6 +34,7 @@ def compute_parallel(self, inputs, communicator): layout=self.namelist.layout, tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.tile.rank, + backend=self.stencil_config.backend, ) quantity_factory = QuantityFactory( From e632e019156e86a66ce2a7d8082302d6fc337529 Mon Sep 17 00:00:00 2001 From: Florian Deconinck Date: Mon, 26 Jan 2026 10:11:30 -0500 Subject: [PATCH 70/75] Swap string dimensioons for they constant (#176) --- examples/notebooks/functions.py | 22 ++++++++++---------- tests/main/driver/test_diagnostics_config.py | 3 ++- tests/main/driver/test_safety_checks.py | 5 +++-- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/examples/notebooks/functions.py b/examples/notebooks/functions.py index f11fc913a..4fe0887c3 100644 --- a/examples/notebooks/functions.py +++ b/examples/notebooks/functions.py @@ -25,7 +25,7 @@ SubtileGridSizer, TilePartitioner, ) -from ndsl.constants import RADIUS +from ndsl.constants import RADIUS, X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM from ndsl.grid import ( AngleGridData, ContravariantGridData, @@ -102,7 +102,7 @@ def init_quantity( if grid == VariableGrid.CellCenters: variable = Quantity( data=empty, - dims=("x", "y", "z")[:skip_z], + dims=(X_DIM, Y_DIM, Z_DIM)[:skip_z], units=units, origin=(nhalo, nhalo, 0)[:skip_z], extent=(nx, ny, nz)[:skip_z], @@ -112,7 +112,7 @@ def init_quantity( if grid == VariableGrid.CellCorners: variable = Quantity( data=empty, - dims=("x_interface", "y_interface", "z")[:skip_z], + dims=(X_INTERFACE_DIM, Y_INTERFACE_DIM, Z_DIM)[:skip_z], units=units, origin=(nhalo, nhalo, 0)[:skip_z], extent=(nx + 1, ny + 1, nz)[:skip_z], @@ -122,7 +122,7 @@ def init_quantity( elif grid == VariableGrid.StaggeredInX: variable = Quantity( data=empty, - dims=("x_interface", "y", "z")[:skip_z], + dims=(X_INTERFACE_DIM, Y_DIM, Z_DIM)[:skip_z], units=units, origin=(nhalo, nhalo, 0)[:skip_z], extent=(nx + 1, ny, nz)[:skip_z], @@ -132,7 +132,7 @@ def init_quantity( elif grid == VariableGrid.StaggeredInY: variable = Quantity( data=empty, - dims=("x", "y_interface", "z")[:skip_z], + dims=(X_DIM, Y_INTERFACE_DIM, Z_DIM)[:skip_z], units=units, origin=(nhalo, nhalo, 0)[:skip_z], extent=(nx, ny + 1, nz)[:skip_z], @@ -646,20 +646,20 @@ def calculate_winds_from_streamfunction_grid( if isinstance(u_grid.data, np.ndarray) and isinstance(v_grid.data, np.ndarray): if grid == GridType.AGrid: if not ( - u_grid.metadata.dims == ("x", "y", "z") - and v_grid.metadata.dims == ("x", "y", "z") + u_grid.metadata.dims == (X_DIM, Y_DIM, Z_DIM) + and v_grid.metadata.dims == (X_DIM, Y_DIM, Z_DIM) ): print("Incorrect wind input dimensions for A-grid.") elif grid == GridType.CGrid: if not ( - u_grid.metadata.dims == ("x", "y_interface", "z") - and v_grid.metadata.dims == ("x_interface", "y", "z") + u_grid.metadata.dims == (X_DIM, Y_INTERFACE_DIM, Z_DIM) + and v_grid.metadata.dims == (X_INTERFACE_DIM, Y_DIM, Z_DIM) ): print("Incorrect wind input dimensions for C-grid.") elif grid == GridType.DGrid: if not ( - u_grid.metadata.dims == ("x_interface", "y", "z") - and v_grid.metadata.dims == ("x", "y_interface", "z") + u_grid.metadata.dims == (X_INTERFACE_DIM, Y_DIM, Z_DIM) + and v_grid.metadata.dims == (X_DIM, Y_INTERFACE_DIM, Z_DIM) ): print("Incorrect wind input dimensions for D-grid.") else: diff --git a/tests/main/driver/test_diagnostics_config.py b/tests/main/driver/test_diagnostics_config.py index 1b3d7bced..55e43cc2a 100644 --- a/tests/main/driver/test_diagnostics_config.py +++ b/tests/main/driver/test_diagnostics_config.py @@ -3,6 +3,7 @@ import pytest from ndsl import QuantityFactory, SubtileGridSizer +from ndsl.constants import X_DIM, Y_DIM, Z_DIM from pace import DiagnosticsConfig from pace.diagnostics import MonitorDiagnostics, NullDiagnostics, ZSelect from pyfv3 import DycoreState @@ -78,6 +79,6 @@ def test_zselect_raises_error_if_3rd_dim_not_z(tmpdir): backend=backend, ) state = DycoreState.init_zeros(quantity_factory) - foo = quantity_factory.zeros(dims=["z", "x", "y"], units="-") + foo = quantity_factory.zeros(dims=[Z_DIM, X_DIM, Y_DIM], units="-") state.foo = foo result.z_select[0].select_data(state) diff --git a/tests/main/driver/test_safety_checks.py b/tests/main/driver/test_safety_checks.py index 9eec5c733..4fa3d6be2 100644 --- a/tests/main/driver/test_safety_checks.py +++ b/tests/main/driver/test_safety_checks.py @@ -4,6 +4,7 @@ import pytest from ndsl import Quantity +from ndsl.constants import X_DIM, Y_DIM, Z_DIM from pace import SafetyChecker @@ -61,7 +62,7 @@ def test_check_state_domain_only(): u_data[0:1, 0:1, :] = 100 u_quantity = Quantity( u_data, - ("x", "y", "z"), + (X_DIM, Y_DIM, Z_DIM), "unknown", origin=(1, 1, 0), extent=(3, 3, 2), @@ -79,7 +80,7 @@ def test_check_nan_value(): u_data[2, 2, 1] = np.nan u_quantity = Quantity( u_data, - ("x", "y", "z"), + (X_DIM, Y_DIM, Z_DIM), "unknown", origin=(0, 0, 0), extent=(4, 4, 2), From fd67bfae4f2b694168c65cfccc36624f625c64d9 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Thu, 5 Feb 2026 16:01:43 +0100 Subject: [PATCH 71/75] ci: expose python version for translate tests (#178) With NDSL supporting more than one version of python, we'd like to have the possibility to run pyFV3 translate tests with different versions of python. This PR adds an optional input variable to the `workflow_call` which allows calling workflows to specify the python version. The PR also removes usage of the `component_trigger` input variable. The input is redundant with `component_name`, which is a non-empty string whenever `component_trigger` is true. I keep the input around until we update all calling workflows to not set it anymore. Co-authored-by: Roman Cattaneo <> --- .github/workflows/main_unit_tests.yaml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main_unit_tests.yaml b/.github/workflows/main_unit_tests.yaml index ec0444726..f8402a513 100644 --- a/.github/workflows/main_unit_tests.yaml +++ b/.github/workflows/main_unit_tests.yaml @@ -12,6 +12,10 @@ on: type: string default: '' required: false + python_version: + type: string + default: '' + required: false pull_request: # ... a PR is opened / updated merge_group: # ... the PR is added to the merge queue push: @@ -29,9 +33,12 @@ jobs: defaults: run: shell: bash -el {0} + env: + python_default: '3.11' + steps: - name: "External trigger: Checkout pace/develop" - if: ${{ inputs.component_trigger }} + if: ${{ inputs.component_name }} uses: actions/checkout@v6 with: submodules: 'recursive' @@ -39,10 +46,10 @@ jobs: path: pace ref: develop - - name: Setup Python 3.11 + - name: 'Setup Python ${{ inputs.python_version && inputs.python_version || env.python_default }}' uses: actions/setup-python@v6 with: - python-version: '3.11' + python-version: ${{ inputs.python_version && inputs.python_version || env.python_default }} - name: Install mpi (MPICH flavor) run: pip install mpich @@ -55,7 +62,7 @@ jobs: run: pip install numpy==1.26.4 - name: "External trigger: Remove existing component in pace/develop" - if: ${{ inputs.component_trigger }} + if: ${{ inputs.component_name }} run: rm -rf ${GITHUB_WORKSPACE}/pace/${{inputs.component_name}} - name: Checkout out hash that triggered CI From 41d6d859f31950b76429bdcaa3b04aa4c0bc019e Mon Sep 17 00:00:00 2001 From: Florian Deconinck Date: Thu, 5 Mar 2026 10:28:08 -0500 Subject: [PATCH 72/75] [Update] NDSL 2026.02.00 breaking change & update to DaCe V2 (#180) * [TMP] Move NDSL to `NDSL_Backend` and update CI external trigger * [TMP] Move submodules to `update/2026.02.00` worthy branches * Move to `Backend` object * Lint * X/Y/Z_DIM -> I/J/K_DIM * update pyFV3 and pySHiELD to latest version of 2026.02.00 branch * update pyFV3 (Backend in GEOSDycoreWrapper) * ci: NDSL 2026.02.00 and switch to python 3.12 * update pyFV3 and pySHiELD to latest develop This propagates the breaking changes from NDSL 2026.02.00 * removed debug print of config --------- Co-authored-by: Roman Cattaneo --- .github/workflows/create_cache.yml | 4 +- .github/workflows/lint.yaml | 4 +- .github/workflows/main_unit_tests.yaml | 3 +- .../baroclinic_c192_54ranks.yaml | 2 +- .../baroclinic_c192_6ranks.yaml | 2 +- .../baroclinic_c48_6ranks_dycore_only.yaml | 2 +- ...inic_c48_6ranks_dycore_only_serialbox.yaml | 2 +- NDSL | 2 +- docs/util/communication.rst | 2 +- examples/configs/analytic_test.yaml | 2 +- examples/configs/baroclinic_c12.yaml | 2 +- .../configs/baroclinic_c12_comm_read.yaml | 2 +- .../configs/baroclinic_c12_comm_write.yaml | 2 +- examples/configs/baroclinic_c12_dp.yaml | 2 +- .../baroclinic_c12_explicit_physics.yaml | 2 +- .../baroclinic_c12_from_serialbox.yaml | 2 +- .../configs/baroclinic_c12_null_comm.yaml | 7 +- examples/configs/baroclinic_c12_orch_cpu.yaml | 2 +- .../baroclinic_c12_read_restart_fortran.yml | 2 +- .../configs/baroclinic_c12_write_restart.yaml | 2 +- .../baroclinic_c48_6ranks_serialbox_test.yaml | 2 +- examples/configs/baroclinic_c48_no_out.yaml | 2 +- examples/configs/test_external_C12_1x1.yaml | 2 +- examples/configs/test_external_C12_2x2.yaml | 2 +- .../configs/tropical_read_restart_fortran.yml | 2 +- examples/configs/tropicalcyclone_c128.yaml | 2 +- examples/notebooks/functions.py | 29 +- examples/notebooks/serial_debugging.ipynb | 950 ++--- examples/notebooks/stencil_definition.ipynb | 3152 ++++++++--------- pace/diagnostics.py | 15 +- pace/grid.py | 7 +- pace/initialization.py | 7 +- pace/state.py | 8 +- pyFV3 | 2 +- pySHiELD | 2 +- pyproject.toml | 10 +- tests/main/conftest.py | 2 +- tests/main/driver/test_diagnostics_config.py | 9 +- tests/main/driver/test_restart_fortran.py | 3 +- tests/main/driver/test_restart_serial.py | 3 +- tests/main/driver/test_safety_checks.py | 11 +- tests/main/fv3core/test_cartesian_grid.py | 3 +- tests/main/fv3core/test_dycore_baroclinic.py | 3 +- tests/main/fv3core/test_dycore_call.py | 3 +- tests/main/fv3core/test_grid.py | 64 +- tests/main/fv3core/test_init_from_geos.py | 5 +- tests/main/physics/test_integration.py | 5 +- tests/main/test_grid_init.py | 3 +- tests/mpi/ext_grid/test_external_grid.py | 4 +- tests/mpi/test_grid_init.py | 3 +- tests/savepoint/conftest.py | 5 +- tests/savepoint/test_checkpoints.py | 5 +- 52 files changed, 2197 insertions(+), 2178 deletions(-) diff --git a/.github/workflows/create_cache.yml b/.github/workflows/create_cache.yml index fa1b21a65..a577fb3a9 100644 --- a/.github/workflows/create_cache.yml +++ b/.github/workflows/create_cache.yml @@ -25,10 +25,10 @@ jobs: - name: Checkout repository uses: actions/checkout@v6 - - name: Setup Python 3.11 + - name: Setup Python 3.12 uses: actions/setup-python@v6 with: - python-version: '3.11' + python-version: '3.12' - uses: actions/cache@v5 id: cache diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 7cc8e5c88..6f79dd1a5 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -17,10 +17,10 @@ jobs: with: submodules: 'recursive' - - name: Step Python 3.11 + - name: Step Python 3.12 uses: actions/setup-python@v6 with: - python-version: '3.11' + python-version: '3.12' # Only restore (don't save) caches on PRs. New caches created from PRs won't be # accessible from other PRs, see workflows/create-cache.yaml. diff --git a/.github/workflows/main_unit_tests.yaml b/.github/workflows/main_unit_tests.yaml index f8402a513..6bfa0920c 100644 --- a/.github/workflows/main_unit_tests.yaml +++ b/.github/workflows/main_unit_tests.yaml @@ -34,7 +34,7 @@ jobs: run: shell: bash -el {0} env: - python_default: '3.11' + python_default: '3.12' steps: - name: "External trigger: Checkout pace/develop" @@ -44,7 +44,6 @@ jobs: submodules: 'recursive' repository: NOAA-GFDL/pace path: pace - ref: develop - name: 'Setup Python ${{ inputs.python_version && inputs.python_version || env.python_default }}' uses: actions/setup-python@v6 diff --git a/.jenkins/driver_configs/baroclinic_c192_54ranks.yaml b/.jenkins/driver_configs/baroclinic_c192_54ranks.yaml index 111695d41..f627e90a4 100644 --- a/.jenkins/driver_configs/baroclinic_c192_54ranks.yaml +++ b/.jenkins/driver_configs/baroclinic_c192_54ranks.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: dace:gpu + backend: st:dace:gpu:KJI rebuild: false validate_args: true format_source: false diff --git a/.jenkins/driver_configs/baroclinic_c192_6ranks.yaml b/.jenkins/driver_configs/baroclinic_c192_6ranks.yaml index 0bc524468..7a0db1c05 100644 --- a/.jenkins/driver_configs/baroclinic_c192_6ranks.yaml +++ b/.jenkins/driver_configs/baroclinic_c192_6ranks.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: dace:gpu + backend: st:dace:gpu:KJI rebuild: false validate_args: true format_source: false diff --git a/.jenkins/driver_configs/baroclinic_c48_6ranks_dycore_only.yaml b/.jenkins/driver_configs/baroclinic_c48_6ranks_dycore_only.yaml index 6d7f3d866..68eab3913 100644 --- a/.jenkins/driver_configs/baroclinic_c48_6ranks_dycore_only.yaml +++ b/.jenkins/driver_configs/baroclinic_c48_6ranks_dycore_only.yaml @@ -2,7 +2,7 @@ dycore_only: true disable_step_physics: true stencil_config: compilation_config: - backend: gt:gpu + backend: st:gt:gpu:KJI rebuild: false validate_args: true format_source: false diff --git a/.jenkins/driver_configs/baroclinic_c48_6ranks_dycore_only_serialbox.yaml b/.jenkins/driver_configs/baroclinic_c48_6ranks_dycore_only_serialbox.yaml index 0c112346d..2db6d3b69 100644 --- a/.jenkins/driver_configs/baroclinic_c48_6ranks_dycore_only_serialbox.yaml +++ b/.jenkins/driver_configs/baroclinic_c48_6ranks_dycore_only_serialbox.yaml @@ -2,7 +2,7 @@ dycore_only: true disable_step_physics: true stencil_config: compilation_config: - backend: gt:gpu + backend: st:gt:gpu:KJI rebuild: false validate_args: true format_source: false diff --git a/NDSL b/NDSL index 3d8fa05ee..2430f879b 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit 3d8fa05ee7b78182afd2e749532582ffaa25b595 +Subproject commit 2430f879bb996e4ff301ecd1d9bf72804fb0e4c4 diff --git a/docs/util/communication.rst b/docs/util/communication.rst index 9b36eb3d5..ac561bc48 100644 --- a/docs/util/communication.rst +++ b/docs/util/communication.rst @@ -68,7 +68,7 @@ To see how the boundary and other objects operate, we will need some data to ope >>> import numpy as np >>> quantity = pace.util.Quantity( ... data=np.zeros((6, 6)), - ... dims=[pace.util.X_DIM, pace.util.Y_DIM], + ... dims=[pace.util.I_DIM, pace.util.J_DIM], ... units="m", ... origin=(1, 1), ... extent=(4, 4), diff --git a/examples/configs/analytic_test.yaml b/examples/configs/analytic_test.yaml index ce00af97f..afcf2853a 100644 --- a/examples/configs/analytic_test.yaml +++ b/examples/configs/analytic_test.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: numpy + backend: st:numpy:cpu:IJK rebuild: false validate_args: true format_source: false diff --git a/examples/configs/baroclinic_c12.yaml b/examples/configs/baroclinic_c12.yaml index fc9418b15..43ee19517 100644 --- a/examples/configs/baroclinic_c12.yaml +++ b/examples/configs/baroclinic_c12.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: numpy + backend: st:numpy:cpu:IJK rebuild: false validate_args: true format_source: false diff --git a/examples/configs/baroclinic_c12_comm_read.yaml b/examples/configs/baroclinic_c12_comm_read.yaml index 8cfead552..37a975447 100644 --- a/examples/configs/baroclinic_c12_comm_read.yaml +++ b/examples/configs/baroclinic_c12_comm_read.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: numpy + backend: st:numpy:cpu:IJK rebuild: false validate_args: true format_source: false diff --git a/examples/configs/baroclinic_c12_comm_write.yaml b/examples/configs/baroclinic_c12_comm_write.yaml index 1c11655c4..ecd47dfe6 100644 --- a/examples/configs/baroclinic_c12_comm_write.yaml +++ b/examples/configs/baroclinic_c12_comm_write.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: numpy + backend: st:numpy:cpu:IJK rebuild: false validate_args: true format_source: false diff --git a/examples/configs/baroclinic_c12_dp.yaml b/examples/configs/baroclinic_c12_dp.yaml index e9819f1c2..d95912a12 100644 --- a/examples/configs/baroclinic_c12_dp.yaml +++ b/examples/configs/baroclinic_c12_dp.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: numpy + backend: st:numpy:cpu:IJK rebuild: false validate_args: true format_source: false diff --git a/examples/configs/baroclinic_c12_explicit_physics.yaml b/examples/configs/baroclinic_c12_explicit_physics.yaml index b172888d8..eb095ea0e 100644 --- a/examples/configs/baroclinic_c12_explicit_physics.yaml +++ b/examples/configs/baroclinic_c12_explicit_physics.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: numpy + backend: st:numpy:cpu:IJK rebuild: false validate_args: true format_source: false diff --git a/examples/configs/baroclinic_c12_from_serialbox.yaml b/examples/configs/baroclinic_c12_from_serialbox.yaml index 0f05e7a05..b55d32259 100644 --- a/examples/configs/baroclinic_c12_from_serialbox.yaml +++ b/examples/configs/baroclinic_c12_from_serialbox.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: gtc:numpy + backend: st:numpy:cpu:IJK rebuild: false validate_args: true format_source: false diff --git a/examples/configs/baroclinic_c12_null_comm.yaml b/examples/configs/baroclinic_c12_null_comm.yaml index 6625140a6..c5460e27c 100644 --- a/examples/configs/baroclinic_c12_null_comm.yaml +++ b/examples/configs/baroclinic_c12_null_comm.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: numpy + backend: st:numpy:cpu:IJK rebuild: false validate_args: true format_source: false @@ -94,3 +94,8 @@ physics_config: hydrostatic: false nwat: 6 do_qa: true + +grid_config: + type: generated + config: + eta_file: './eta79.nc' diff --git a/examples/configs/baroclinic_c12_orch_cpu.yaml b/examples/configs/baroclinic_c12_orch_cpu.yaml index 7cb6b3edd..15a589414 100644 --- a/examples/configs/baroclinic_c12_orch_cpu.yaml +++ b/examples/configs/baroclinic_c12_orch_cpu.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: dace:cpu + backend: st:dace:cpu:KIJ rebuild: false validate_args: true format_source: false diff --git a/examples/configs/baroclinic_c12_read_restart_fortran.yml b/examples/configs/baroclinic_c12_read_restart_fortran.yml index a28f3129c..616583e14 100644 --- a/examples/configs/baroclinic_c12_read_restart_fortran.yml +++ b/examples/configs/baroclinic_c12_read_restart_fortran.yml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: numpy + backend: st:numpy:cpu:IJK rebuild: false validate_args: true format_source: false diff --git a/examples/configs/baroclinic_c12_write_restart.yaml b/examples/configs/baroclinic_c12_write_restart.yaml index 588784413..d2dcacba7 100644 --- a/examples/configs/baroclinic_c12_write_restart.yaml +++ b/examples/configs/baroclinic_c12_write_restart.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: numpy + backend: st:numpy:cpu:IJK rebuild: false validate_args: true format_source: false diff --git a/examples/configs/baroclinic_c48_6ranks_serialbox_test.yaml b/examples/configs/baroclinic_c48_6ranks_serialbox_test.yaml index cd240cd75..0f35b2649 100644 --- a/examples/configs/baroclinic_c48_6ranks_serialbox_test.yaml +++ b/examples/configs/baroclinic_c48_6ranks_serialbox_test.yaml @@ -2,7 +2,7 @@ dycore_only: true disable_step_physics: true stencil_config: compilation_config: - backend: gt:gpu + backend: st:gt:gpu:KJI rebuild: false validate_args: true format_source: false diff --git a/examples/configs/baroclinic_c48_no_out.yaml b/examples/configs/baroclinic_c48_no_out.yaml index 24f3139eb..6d5b0b1ae 100644 --- a/examples/configs/baroclinic_c48_no_out.yaml +++ b/examples/configs/baroclinic_c48_no_out.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: numpy + backend: st:numpy:cpu:IJK rebuild: false validate_args: true format_source: false diff --git a/examples/configs/test_external_C12_1x1.yaml b/examples/configs/test_external_C12_1x1.yaml index b26edbfe4..8d7e0d143 100644 --- a/examples/configs/test_external_C12_1x1.yaml +++ b/examples/configs/test_external_C12_1x1.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: numpy + backend: st:numpy:cpu:IJK rebuild: false validate_args: true format_source: false diff --git a/examples/configs/test_external_C12_2x2.yaml b/examples/configs/test_external_C12_2x2.yaml index fc84c85b8..28ba4d5e3 100644 --- a/examples/configs/test_external_C12_2x2.yaml +++ b/examples/configs/test_external_C12_2x2.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: numpy + backend: st:numpy:cpu:IJK rebuild: false validate_args: true format_source: false diff --git a/examples/configs/tropical_read_restart_fortran.yml b/examples/configs/tropical_read_restart_fortran.yml index f0b552084..5a72c54a4 100644 --- a/examples/configs/tropical_read_restart_fortran.yml +++ b/examples/configs/tropical_read_restart_fortran.yml @@ -2,7 +2,7 @@ dycore_only: true disable_step_physics: true stencil_config: compilation_config: - backend: numpy + backend: st:numpy:cpu:IJK rebuild: false validate_args: true format_source: false diff --git a/examples/configs/tropicalcyclone_c128.yaml b/examples/configs/tropicalcyclone_c128.yaml index fe8d519ba..2d466c4c6 100644 --- a/examples/configs/tropicalcyclone_c128.yaml +++ b/examples/configs/tropicalcyclone_c128.yaml @@ -2,7 +2,7 @@ dycore_only: true disable_step_physics: true stencil_config: compilation_config: - backend: numpy + backend: st:numpy:cpu:IJK rebuild: false validate_args: true format_source: false diff --git a/examples/notebooks/functions.py b/examples/notebooks/functions.py index 4fe0887c3..9d1a684aa 100644 --- a/examples/notebooks/functions.py +++ b/examples/notebooks/functions.py @@ -25,7 +25,8 @@ SubtileGridSizer, TilePartitioner, ) -from ndsl.constants import RADIUS, X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM +from ndsl.config import Backend, backend_python +from ndsl.constants import I_DIM, I_INTERFACE_DIM, J_DIM, J_INTERFACE_DIM, K_DIM, RADIUS from ndsl.grid import ( AngleGridData, ContravariantGridData, @@ -62,7 +63,7 @@ def init_quantity( grid: VariableGrid, dims: VariableDims = VariableDims.XYZ, units: str = "", - backend: str = "numpy", + backend: Backend = backend_python, ) -> Quantity: """ Use: output = init_quantity(dimensions, grid, dims, units) @@ -102,7 +103,7 @@ def init_quantity( if grid == VariableGrid.CellCenters: variable = Quantity( data=empty, - dims=(X_DIM, Y_DIM, Z_DIM)[:skip_z], + dims=(I_DIM, J_DIM, K_DIM)[:skip_z], units=units, origin=(nhalo, nhalo, 0)[:skip_z], extent=(nx, ny, nz)[:skip_z], @@ -112,7 +113,7 @@ def init_quantity( if grid == VariableGrid.CellCorners: variable = Quantity( data=empty, - dims=(X_INTERFACE_DIM, Y_INTERFACE_DIM, Z_DIM)[:skip_z], + dims=(I_INTERFACE_DIM, J_INTERFACE_DIM, K_DIM)[:skip_z], units=units, origin=(nhalo, nhalo, 0)[:skip_z], extent=(nx + 1, ny + 1, nz)[:skip_z], @@ -122,7 +123,7 @@ def init_quantity( elif grid == VariableGrid.StaggeredInX: variable = Quantity( data=empty, - dims=(X_INTERFACE_DIM, Y_DIM, Z_DIM)[:skip_z], + dims=(I_INTERFACE_DIM, J_DIM, K_DIM)[:skip_z], units=units, origin=(nhalo, nhalo, 0)[:skip_z], extent=(nx + 1, ny, nz)[:skip_z], @@ -132,7 +133,7 @@ def init_quantity( elif grid == VariableGrid.StaggeredInY: variable = Quantity( data=empty, - dims=(X_DIM, Y_INTERFACE_DIM, Z_DIM)[:skip_z], + dims=(I_DIM, J_INTERFACE_DIM, K_DIM)[:skip_z], units=units, origin=(nhalo, nhalo, 0)[:skip_z], extent=(nx, ny + 1, nz)[:skip_z], @@ -310,13 +311,13 @@ def configure_domain( def configure_stencil( domain_configuration: Dict[str, Any], - backend: str = "numpy", + backend: Backend = backend_python, single_layer: bool = True, ) -> Dict[str, Any]: """ Use: stencil_configuration = configure_stencil( - domain_configuration, backend="numpy", single_layer=True) + domain_configuration, backend=Backend("st:numpy:cpu:IJK"), single_layer=True) Inputs: - domain configuration (Dict) from configure_domain() @@ -646,20 +647,20 @@ def calculate_winds_from_streamfunction_grid( if isinstance(u_grid.data, np.ndarray) and isinstance(v_grid.data, np.ndarray): if grid == GridType.AGrid: if not ( - u_grid.metadata.dims == (X_DIM, Y_DIM, Z_DIM) - and v_grid.metadata.dims == (X_DIM, Y_DIM, Z_DIM) + u_grid.metadata.dims == (I_DIM, J_DIM, K_DIM) + and v_grid.metadata.dims == (I_DIM, J_DIM, K_DIM) ): print("Incorrect wind input dimensions for A-grid.") elif grid == GridType.CGrid: if not ( - u_grid.metadata.dims == (X_DIM, Y_INTERFACE_DIM, Z_DIM) - and v_grid.metadata.dims == (X_INTERFACE_DIM, Y_DIM, Z_DIM) + u_grid.metadata.dims == (I_DIM, J_INTERFACE_DIM, K_DIM) + and v_grid.metadata.dims == (I_INTERFACE_DIM, J_DIM, K_DIM) ): print("Incorrect wind input dimensions for C-grid.") elif grid == GridType.DGrid: if not ( - u_grid.metadata.dims == (X_INTERFACE_DIM, Y_DIM, Z_DIM) - and v_grid.metadata.dims == (X_DIM, Y_INTERFACE_DIM, Z_DIM) + u_grid.metadata.dims == (I_INTERFACE_DIM, J_DIM, K_DIM) + and v_grid.metadata.dims == (I_DIM, J_INTERFACE_DIM, K_DIM) ): print("Incorrect wind input dimensions for D-grid.") else: diff --git a/examples/notebooks/serial_debugging.ipynb b/examples/notebooks/serial_debugging.ipynb index ace1a5b4c..02a41dea9 100644 --- a/examples/notebooks/serial_debugging.ipynb +++ b/examples/notebooks/serial_debugging.ipynb @@ -1,477 +1,477 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "6c0756ec", - "metadata": {}, - "source": [ - "# Serial debugging example\n", - "\n", - "This example shows how you can use write and read comm configurations to save communication data from a mpi-enabled run to disk, and then debug that run in serial inside a jupyter notebook.\n", - "\n", - "This example is being run on April 22nd, 2022. It uses internal, unstable APIs and may not work for future versions of the code." - ] - }, - { - "cell_type": "markdown", - "id": "47acc297", - "metadata": {}, - "source": [ - "First let's import the packages we will use below." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ee1201d3", - "metadata": {}, - "outputs": [], - "source": [ - "from ndsl.constants import X_DIM, Y_DIM, Z_DIM\n", - "from pace import Driver, DriverConfig\n", - "from pyfv3.stencils import DGrid2AGrid2CGridVectors\n", - "import yaml\n", - "import dacite\n", - "import copy\n", - "import subprocess\n", - "import matplotlib.pyplot as plt # pip install matplotlib" - ] - }, - { - "cell_type": "markdown", - "id": "3f567c84", - "metadata": {}, - "source": [ - "We will base this example on a baroclinic c12 configuration using 6 ranks, but this same code can run with any configuration, even one that was run at scale on an HPC system." - ] - }, - { - "cell_type": "markdown", - "id": "82621ab9", - "metadata": {}, - "source": [ - "## Step 1: writing communication data\n", - "\n", - "First we modify the configuration into one that will write all communications on rank 0 into a directory called \"comm\". This could be modified to write communications for more ranks by adding them to the \"ranks\" list." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9ed813d4", - "metadata": {}, - "outputs": [], - "source": [ - "with open(\"../configs/baroclinic_c12.yaml\", \"r\") as f:\n", - " base_config = yaml.safe_load(f)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4fcfc5d4", - "metadata": {}, - "outputs": [], - "source": [ - "write_config = copy.deepcopy(base_config)\n", - "write_config[\"comm_config\"] = {\n", - " \"type\": \"write\",\n", - " \"config\": {\n", - " \"path\": \"comm\",\n", - " \"ranks\": [0]\n", - " }\n", - "}\n", - "# diagnostics involve communication that interacts with the disk, must be disabled\n", - "write_config.pop(\"diagnostics_config\")\n", - "with open(\"driver_write_config.yaml\", \"w\") as f:\n", - " yaml.dump(write_config, f)" - ] - }, - { - "cell_type": "markdown", - "id": "c798f50c", - "metadata": {}, - "source": [ - "With this configuration written to disk, we run:\n", - "\n", - "```bash\n", - "mpirun -n 6 python3 -m pace.driver.run driver_write_config.yaml\n", - "```\n", - "\n", - "This produces output files in a \"comm\" directory. You could instead run a \"write\" configuration through another method like submitting a batch job to an HPC system. The important part is to recover the \"comm\" directory that gets written by this configuration, so it can be referenced in our read configuration below. Here we see it includes data for rank 0 only." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e428f254", - "metadata": {}, - "outputs": [], - "source": [ - "%%bash\n", - "ls comm" - ] - }, - { - "cell_type": "markdown", - "id": "b56dfc04", - "metadata": {}, - "source": [ - "## Step 2: reading communication data into a Driver object\n", - "\n", - "We can take the \"write\" configuration and modify its comm config to create a \"read\" configuration. The rank used can be any rank which has data inside the communication cache indicated by the path." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9bd52cf2", - "metadata": {}, - "outputs": [], - "source": [ - "read_config = copy.deepcopy(write_config)\n", - "read_config[\"comm_config\"] = {\n", - " \"type\": \"read\",\n", - " \"config\": {\n", - " \"path\": \"comm\",\n", - " \"rank\": 0\n", - " }\n", - "}" - ] - }, - { - "cell_type": "markdown", - "id": "7348f957", - "metadata": {}, - "source": [ - "From this configuration, we can create a driver object, and start inspecting its state. Let's take a look at the evolution of the wind and pressure fields over the first two timesteps.\n", - "\n", - "Keep in mind that we will be looking at rank 0, whose y-axis exactly follows latitude lines and x-axis approximately follows longitude lines." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "59ada075", - "metadata": {}, - "outputs": [], - "source": [ - "driver = Driver(config=DriverConfig.from_dict(read_config))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7c05df92", - "metadata": {}, - "outputs": [], - "source": [ - "dycore_state = driver.state.dycore_state\n", - "# make a copy of the initial state to do experiments with later\n", - "initial_state = copy.deepcopy(dycore_state)" - ] - }, - { - "cell_type": "markdown", - "id": "3c5e4822", - "metadata": {}, - "source": [ - "We'll also define a plot helper routine to make it easier to quickly inspect different variables, without copying code. We'll look at level 50 of the models' 79 levels, which lies somewhere in the middle of the troposphere." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7600cdee", - "metadata": {}, - "outputs": [], - "source": [ - "def plot(state, varname):\n", - " data = getattr(state, varname)\n", - " # temporary workaround for bug where view goes out-of-sync with storage\n", - " data.view._data = data.storage.data\n", - " plt.figure(figsize=(5, 5))\n", - " # imshow by default puts x on the left and y on the bottom axis, so we transpose\n", - " # view by default selects the compute domain, ignoring halos\n", - " im = plt.imshow(data.view[:, :, 50].T)\n", - " plt.xlabel(\"x\")\n", - " plt.ylabel(\"y\")\n", - " plt.colorbar(im)\n", - " plt.title(f\"{varname} ({data.units})\")" - ] - }, - { - "cell_type": "markdown", - "id": "21cf07ca", - "metadata": {}, - "source": [ - "First we'll look at the initial winds. Notice that for the winds only `u` and `v`, which contain the d-grid covariant winds, have data - this is intentional, as it is the prognostic variable used by the model. The C-grid winds in `uc`/`vc` will be diagnosed from these and then marched forward by half a timestep, before being used to advect the d-grid variables.\n", - "\n", - "This initialization case involves zonally uniform zonal winds with no meridional winds, so it makes sense that `v` is initialized with near-zero values." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "00d9d714", - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "plot(dycore_state, \"u\")\n", - "plot(dycore_state, \"v\")\n", - "plot(dycore_state, \"ua\")\n", - "plot(dycore_state, \"va\")\n", - "plot(dycore_state, \"uc\")\n", - "plot(dycore_state, \"vc\")\n", - "plot(dycore_state, \"delp\")" - ] - }, - { - "cell_type": "markdown", - "id": "46a473bc", - "metadata": {}, - "source": [ - "We can step the model forward by one timestep, and see how this affects the evolution of the model state." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fd1bda0b", - "metadata": {}, - "outputs": [], - "source": [ - "driver.step(timestep=driver.config.timestep)" - ] - }, - { - "cell_type": "markdown", - "id": "1da919ba", - "metadata": {}, - "source": [ - "`u` appears mostly unchanged, since its initial values are quite significant and are most of the signal in the plot. The changes to `v` are quite small." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3ec20047", - "metadata": {}, - "outputs": [], - "source": [ - "plot(dycore_state, \"u\")\n", - "plot(dycore_state, \"v\")" - ] - }, - { - "cell_type": "markdown", - "id": "0a12d6b9", - "metadata": {}, - "source": [ - "The other wind variables now contain their intermediate values used to evolve the model forward. `ua` and `va` contain the contravariant winds defined on the a-grid, in other words the winds in directions perpendicular to finite volume gridcell faces defined on cell centers." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3d912f43", - "metadata": {}, - "outputs": [], - "source": [ - "plot(dycore_state, \"ua\")\n", - "plot(dycore_state, \"va\")" - ] - }, - { - "cell_type": "markdown", - "id": "7adfb3b2", - "metadata": {}, - "source": [ - "`uc` and `vc` do not make much sense, comparing with the winds above. Note the very small magnitudes (1e-29 scaling on the colorbar). I don't have an explanation - it's likely these variables have been repurposed for a secondary use after they are no longer needed in the model, for memory efficiency reasons. In gt4py and dace we do not need this kind of manual memory optimization, and we are slowly refactoring re-usage of variables over time." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "aabd448a", - "metadata": {}, - "outputs": [], - "source": [ - "plot(dycore_state, \"uc\")\n", - "plot(dycore_state, \"vc\")" - ] - }, - { - "cell_type": "markdown", - "id": "5aa4fcb0", - "metadata": {}, - "source": [ - "And finally, we can see the evolved pressure thickness field." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "77084f49", - "metadata": {}, - "outputs": [], - "source": [ - "plot(dycore_state, \"delp\")" - ] - }, - { - "cell_type": "markdown", - "id": "dfedd87f", - "metadata": {}, - "source": [ - "## Inspecting behavior of an internal component" - ] - }, - { - "cell_type": "markdown", - "id": "c5297e4d", - "metadata": {}, - "source": [ - "The reader-comm driver will play back communications exactly as they occurred when the reference data was created, so we cannot run communication code different from what happened at that time. But we can run code that does not rely on communications. For example, let's look at how the d-grid winds (`u` and `v`) are remapped to a-grid and c-grid winds by `DGrid2AGrid2CGridVectors`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "401fdab2", - "metadata": {}, - "outputs": [], - "source": [ - "d2a2c = DGrid2AGrid2CGridVectors(\n", - " stencil_factory=driver.stencil_factory,\n", - " grid_data=driver.state.grid_data,\n", - " nested=False,\n", - " grid_type=0,\n", - " dord4=True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0d5cf970", - "metadata": {}, - "outputs": [], - "source": [ - "remap_state = copy.deepcopy(initial_state)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "61d20a45", - "metadata": {}, - "outputs": [], - "source": [ - "# need temporaries for c-grid contravariant wind multiplied by timestep\n", - "utc = driver.quantity_factory.zeros(dims=[X_DIM, Y_DIM, Z_DIM], units=\"m/s\")\n", - "vtc = driver.quantity_factory.zeros(dims=[X_DIM, Y_DIM, Z_DIM], units=\"m/s\")\n", - "d2a2c(\n", - " uc=remap_state.uc,\n", - " vc=remap_state.vc,\n", - " u=remap_state.u,\n", - " v=remap_state.v,\n", - " ua=remap_state.ua,\n", - " va=remap_state.va,\n", - " utc=utc,\n", - " vtc=vtc\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "ff396d96", - "metadata": {}, - "source": [ - "`u`, `ua`, and `uc` all look quite similar, since the magnitude of `u` is large and there is no component from `v` to factor in when converting between covariant and contravariant winds." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a645e6d7", - "metadata": {}, - "outputs": [], - "source": [ - "plot(remap_state, \"u\")\n", - "plot(remap_state, \"ua\")\n", - "plot(remap_state, \"uc\")" - ] - }, - { - "cell_type": "markdown", - "id": "59cc76ff", - "metadata": {}, - "source": [ - "`v` is more interesting. While the initial wind has no projection onto the meridional direction (no covariant component in the meridional direction), it does have a contravariant component along this direction, as we see in `va`, the contravariant y-wind on the a-grid." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7e579390", - "metadata": {}, - "outputs": [], - "source": [ - "plot(remap_state, \"v\")\n", - "plot(remap_state, \"va\")" - ] - }, - { - "cell_type": "markdown", - "id": "4361238f", - "metadata": {}, - "source": [ - "`vc` is even more interesting, as it contains the covariant wind on the c-grid, which at y-edges lies on the boundary of two tile faces. At this location, the wind borders on two different coordinate systems, and the covariant wind is not well-defined. Despite the covariant y-wind being zero on the entire tile (including the edge, if we considered only rank 0's coordinate system), it contains non-zero values at the tile edge where it has to consider the coordinate systems of neighboring tiles.\n", - "\n", - "This is one of many examples where the FV3 code contains special logic for handling advection at tile edges." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1a2f575f", - "metadata": {}, - "outputs": [], - "source": [ - "plot(remap_state, \"vc\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "91857b67", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "cells": [ + { + "cell_type": "markdown", + "id": "6c0756ec", + "metadata": {}, + "source": [ + "# Serial debugging example\n", + "\n", + "This example shows how you can use write and read comm configurations to save communication data from a mpi-enabled run to disk, and then debug that run in serial inside a jupyter notebook.\n", + "\n", + "This example is being run on April 22nd, 2022. It uses internal, unstable APIs and may not work for future versions of the code." + ] + }, + { + "cell_type": "markdown", + "id": "47acc297", + "metadata": {}, + "source": [ + "First let's import the packages we will use below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ee1201d3", + "metadata": {}, + "outputs": [], + "source": [ + "from ndsl.constants import I_DIM, J_DIM, K_DIM\n", + "from pace import Driver, DriverConfig\n", + "from pyfv3.stencils import DGrid2AGrid2CGridVectors\n", + "import yaml\n", + "import dacite\n", + "import copy\n", + "import subprocess\n", + "import matplotlib.pyplot as plt # pip install matplotlib" + ] + }, + { + "cell_type": "markdown", + "id": "3f567c84", + "metadata": {}, + "source": [ + "We will base this example on a baroclinic c12 configuration using 6 ranks, but this same code can run with any configuration, even one that was run at scale on an HPC system." + ] + }, + { + "cell_type": "markdown", + "id": "82621ab9", + "metadata": {}, + "source": [ + "## Step 1: writing communication data\n", + "\n", + "First we modify the configuration into one that will write all communications on rank 0 into a directory called \"comm\". This could be modified to write communications for more ranks by adding them to the \"ranks\" list." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9ed813d4", + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"../configs/baroclinic_c12.yaml\", \"r\") as f:\n", + " base_config = yaml.safe_load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4fcfc5d4", + "metadata": {}, + "outputs": [], + "source": [ + "write_config = copy.deepcopy(base_config)\n", + "write_config[\"comm_config\"] = {\n", + " \"type\": \"write\",\n", + " \"config\": {\n", + " \"path\": \"comm\",\n", + " \"ranks\": [0]\n", + " }\n", + "}\n", + "# diagnostics involve communication that interacts with the disk, must be disabled\n", + "write_config.pop(\"diagnostics_config\")\n", + "with open(\"driver_write_config.yaml\", \"w\") as f:\n", + " yaml.dump(write_config, f)" + ] + }, + { + "cell_type": "markdown", + "id": "c798f50c", + "metadata": {}, + "source": [ + "With this configuration written to disk, we run:\n", + "\n", + "```bash\n", + "mpirun -n 6 python3 -m pace.driver.run driver_write_config.yaml\n", + "```\n", + "\n", + "This produces output files in a \"comm\" directory. You could instead run a \"write\" configuration through another method like submitting a batch job to an HPC system. The important part is to recover the \"comm\" directory that gets written by this configuration, so it can be referenced in our read configuration below. Here we see it includes data for rank 0 only." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e428f254", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "ls comm" + ] + }, + { + "cell_type": "markdown", + "id": "b56dfc04", + "metadata": {}, + "source": [ + "## Step 2: reading communication data into a Driver object\n", + "\n", + "We can take the \"write\" configuration and modify its comm config to create a \"read\" configuration. The rank used can be any rank which has data inside the communication cache indicated by the path." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9bd52cf2", + "metadata": {}, + "outputs": [], + "source": [ + "read_config = copy.deepcopy(write_config)\n", + "read_config[\"comm_config\"] = {\n", + " \"type\": \"read\",\n", + " \"config\": {\n", + " \"path\": \"comm\",\n", + " \"rank\": 0\n", + " }\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "7348f957", + "metadata": {}, + "source": [ + "From this configuration, we can create a driver object, and start inspecting its state. Let's take a look at the evolution of the wind and pressure fields over the first two timesteps.\n", + "\n", + "Keep in mind that we will be looking at rank 0, whose y-axis exactly follows latitude lines and x-axis approximately follows longitude lines." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "59ada075", + "metadata": {}, + "outputs": [], + "source": [ + "driver = Driver(config=DriverConfig.from_dict(read_config))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7c05df92", + "metadata": {}, + "outputs": [], + "source": [ + "dycore_state = driver.state.dycore_state\n", + "# make a copy of the initial state to do experiments with later\n", + "initial_state = copy.deepcopy(dycore_state)" + ] + }, + { + "cell_type": "markdown", + "id": "3c5e4822", + "metadata": {}, + "source": [ + "We'll also define a plot helper routine to make it easier to quickly inspect different variables, without copying code. We'll look at level 50 of the models' 79 levels, which lies somewhere in the middle of the troposphere." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7600cdee", + "metadata": {}, + "outputs": [], + "source": [ + "def plot(state, varname):\n", + " data = getattr(state, varname)\n", + " # temporary workaround for bug where view goes out-of-sync with storage\n", + " data.view._data = data.storage.data\n", + " plt.figure(figsize=(5, 5))\n", + " # imshow by default puts x on the left and y on the bottom axis, so we transpose\n", + " # view by default selects the compute domain, ignoring halos\n", + " im = plt.imshow(data.view[:, :, 50].T)\n", + " plt.xlabel(\"x\")\n", + " plt.ylabel(\"y\")\n", + " plt.colorbar(im)\n", + " plt.title(f\"{varname} ({data.units})\")" + ] + }, + { + "cell_type": "markdown", + "id": "21cf07ca", + "metadata": {}, + "source": [ + "First we'll look at the initial winds. Notice that for the winds only `u` and `v`, which contain the d-grid covariant winds, have data - this is intentional, as it is the prognostic variable used by the model. The C-grid winds in `uc`/`vc` will be diagnosed from these and then marched forward by half a timestep, before being used to advect the d-grid variables.\n", + "\n", + "This initialization case involves zonally uniform zonal winds with no meridional winds, so it makes sense that `v` is initialized with near-zero values." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "00d9d714", + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "plot(dycore_state, \"u\")\n", + "plot(dycore_state, \"v\")\n", + "plot(dycore_state, \"ua\")\n", + "plot(dycore_state, \"va\")\n", + "plot(dycore_state, \"uc\")\n", + "plot(dycore_state, \"vc\")\n", + "plot(dycore_state, \"delp\")" + ] + }, + { + "cell_type": "markdown", + "id": "46a473bc", + "metadata": {}, + "source": [ + "We can step the model forward by one timestep, and see how this affects the evolution of the model state." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fd1bda0b", + "metadata": {}, + "outputs": [], + "source": [ + "driver.step(timestep=driver.config.timestep)" + ] + }, + { + "cell_type": "markdown", + "id": "1da919ba", + "metadata": {}, + "source": [ + "`u` appears mostly unchanged, since its initial values are quite significant and are most of the signal in the plot. The changes to `v` are quite small." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3ec20047", + "metadata": {}, + "outputs": [], + "source": [ + "plot(dycore_state, \"u\")\n", + "plot(dycore_state, \"v\")" + ] + }, + { + "cell_type": "markdown", + "id": "0a12d6b9", + "metadata": {}, + "source": [ + "The other wind variables now contain their intermediate values used to evolve the model forward. `ua` and `va` contain the contravariant winds defined on the a-grid, in other words the winds in directions perpendicular to finite volume gridcell faces defined on cell centers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3d912f43", + "metadata": {}, + "outputs": [], + "source": [ + "plot(dycore_state, \"ua\")\n", + "plot(dycore_state, \"va\")" + ] + }, + { + "cell_type": "markdown", + "id": "7adfb3b2", + "metadata": {}, + "source": [ + "`uc` and `vc` do not make much sense, comparing with the winds above. Note the very small magnitudes (1e-29 scaling on the colorbar). I don't have an explanation - it's likely these variables have been repurposed for a secondary use after they are no longer needed in the model, for memory efficiency reasons. In gt4py and dace we do not need this kind of manual memory optimization, and we are slowly refactoring re-usage of variables over time." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aabd448a", + "metadata": {}, + "outputs": [], + "source": [ + "plot(dycore_state, \"uc\")\n", + "plot(dycore_state, \"vc\")" + ] + }, + { + "cell_type": "markdown", + "id": "5aa4fcb0", + "metadata": {}, + "source": [ + "And finally, we can see the evolved pressure thickness field." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "77084f49", + "metadata": {}, + "outputs": [], + "source": [ + "plot(dycore_state, \"delp\")" + ] + }, + { + "cell_type": "markdown", + "id": "dfedd87f", + "metadata": {}, + "source": [ + "## Inspecting behavior of an internal component" + ] + }, + { + "cell_type": "markdown", + "id": "c5297e4d", + "metadata": {}, + "source": [ + "The reader-comm driver will play back communications exactly as they occurred when the reference data was created, so we cannot run communication code different from what happened at that time. But we can run code that does not rely on communications. For example, let's look at how the d-grid winds (`u` and `v`) are remapped to a-grid and c-grid winds by `DGrid2AGrid2CGridVectors`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "401fdab2", + "metadata": {}, + "outputs": [], + "source": [ + "d2a2c = DGrid2AGrid2CGridVectors(\n", + " stencil_factory=driver.stencil_factory,\n", + " grid_data=driver.state.grid_data,\n", + " nested=False,\n", + " grid_type=0,\n", + " dord4=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0d5cf970", + "metadata": {}, + "outputs": [], + "source": [ + "remap_state = copy.deepcopy(initial_state)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61d20a45", + "metadata": {}, + "outputs": [], + "source": [ + "# need temporaries for c-grid contravariant wind multiplied by timestep\n", + "utc = driver.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units=\"m/s\")\n", + "vtc = driver.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units=\"m/s\")\n", + "d2a2c(\n", + " uc=remap_state.uc,\n", + " vc=remap_state.vc,\n", + " u=remap_state.u,\n", + " v=remap_state.v,\n", + " ua=remap_state.ua,\n", + " va=remap_state.va,\n", + " utc=utc,\n", + " vtc=vtc\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "ff396d96", + "metadata": {}, + "source": [ + "`u`, `ua`, and `uc` all look quite similar, since the magnitude of `u` is large and there is no component from `v` to factor in when converting between covariant and contravariant winds." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a645e6d7", + "metadata": {}, + "outputs": [], + "source": [ + "plot(remap_state, \"u\")\n", + "plot(remap_state, \"ua\")\n", + "plot(remap_state, \"uc\")" + ] + }, + { + "cell_type": "markdown", + "id": "59cc76ff", + "metadata": {}, + "source": [ + "`v` is more interesting. While the initial wind has no projection onto the meridional direction (no covariant component in the meridional direction), it does have a contravariant component along this direction, as we see in `va`, the contravariant y-wind on the a-grid." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7e579390", + "metadata": {}, + "outputs": [], + "source": [ + "plot(remap_state, \"v\")\n", + "plot(remap_state, \"va\")" + ] + }, + { + "cell_type": "markdown", + "id": "4361238f", + "metadata": {}, + "source": [ + "`vc` is even more interesting, as it contains the covariant wind on the c-grid, which at y-edges lies on the boundary of two tile faces. At this location, the wind borders on two different coordinate systems, and the covariant wind is not well-defined. Despite the covariant y-wind being zero on the entire tile (including the edge, if we considered only rank 0's coordinate system), it contains non-zero values at the tile edge where it has to consider the coordinate systems of neighboring tiles.\n", + "\n", + "This is one of many examples where the FV3 code contains special logic for handling advection at tile edges." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1a2f575f", + "metadata": {}, + "outputs": [], + "source": [ + "plot(remap_state, \"vc\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "91857b67", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/examples/notebooks/stencil_definition.ipynb b/examples/notebooks/stencil_definition.ipynb index 1e48b14fb..5b71caa62 100644 --- a/examples/notebooks/stencil_definition.ipynb +++ b/examples/notebooks/stencil_definition.ipynb @@ -1,1579 +1,1579 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "559427b6-c6c4-4e98-9ab4-f321f8c4999d", - "metadata": { - "tags": [] - }, - "source": [ - "# Defining, compiling, and running stencils\n", - "\n", - "This notebook demonstrates how stencils can be defined, compiled and executed." - ] - }, - { - "cell_type": "markdown", - "id": "777c9dae-cb6f-49a8-963a-a85031d169af", - "metadata": {}, - "source": [ - "## Configuration\n", - "\n", - "First, let's define the configuration such as the size of the computational domain as well as the number of halo points and the GT4Py backend we are using." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "5e09b7ff-ead1-40da-a79f-9929fd7c9e93", - "metadata": {}, - "outputs": [], - "source": [ - "nx = 20\n", - "ny = 20\n", - "nz = 79\n", - "nhalo = 3\n", - "backend = \"numpy\"" - ] - }, - { - "cell_type": "markdown", - "id": "3acf8ab8-73b5-45f3-9605-6f5929ebdbb3", - "metadata": {}, - "source": [ - "## Stencil definition using GT4Py\n", - "\n", - "Next, we'll define the actual stencil that we want to compile and run. We use the GT4Py domain-specific language (GTScripts) for this. For demonstration purposes, we start with a very simple stencil that simply sets a field to a constant value at every grid cell." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c9d04aed-9513-447a-bae8-3c9719a60d9a", - "metadata": {}, - "outputs": [], - "source": [ - "from ndsl.dsl.gt4py import PARALLEL, computation\n", - "from ndsl.dsl.typing import FloatField\n", - "\n", - "def set_field_to_value_def(f: FloatField, value: float):\n", - " with computation(PARALLEL), interval(...):\n", - " f = value" - ] - }, - { - "cell_type": "markdown", - "id": "e3ff42c6-2fcb-4cbf-af4e-a41d5bbb0c95", - "metadata": { - "tags": [] - }, - "source": [ - "## Setup helpers for building stencils\n", - "\n", - "The `ndsl` package contains provides a helper class for compiling stencils. The helper class is called a stencil factory. In order to setup a stencil factory, several configuration objects have to be defined and passed in.\n", - "\n", - "- `DaceConfig`: configuration of DaCe backend\n", - "- `CompilationConfig`: specification of how to compile\n", - "- `StencilConfig`: wrapper to carry DaCe and compilation configuration\n", - "- `GridIndexing`: helper class which provides indexing (e.g. compute domain and origin)\n", - "- `StencilFactory`: helper class to build stencils from GT4Py stencil definitions" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "108a7b90-178d-461c-b313-cf0f1dcb4b94", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "from ndsl import DaceConfig, DaCeOrchestration, GridIndexing, StencilConfig, StencilFactory, CompilationConfig, RunMode\n", - "\n", - "dace_config = DaceConfig(\n", - " communicator=None, backend=backend, orchestration=DaCeOrchestration.Python\n", - ")\n", - "\n", - "compilation_config = CompilationConfig(\n", - " backend=backend,\n", - " rebuild=True,\n", - " validate_args=True,\n", - " format_source=False,\n", - " device_sync=False,\n", - " run_mode=RunMode.BuildAndRun,\n", - " use_minimal_caching=False,\n", - ")\n", - "\n", - "stencil_config = StencilConfig(\n", - " compare_to_numpy=False,\n", - " compilation_config=compilation_config,\n", - " dace_config=dace_config,\n", - ")\n", - "\n", - "grid_indexing = GridIndexing(\n", - " domain=(nx, ny, nz),\n", - " n_halo=nhalo,\n", - " south_edge=True,\n", - " north_edge=True,\n", - " west_edge=True,\n", - " east_edge=True,\n", - ")\n", - "\n", - "stencil_factory = StencilFactory(config=stencil_config, grid_indexing=grid_indexing)" - ] - }, - { - "cell_type": "markdown", - "id": "7d5797e0-b80a-4b27-be30-5d138deda105", - "metadata": {}, - "source": [ - "## Wrap stencil into a Python class\n", - "\n", - "Using the stencil factory we can now wrap the compiled GT4Py stencil into a Python class. The init section is responsible for compiling the stencil, the call section will simply execute the compiled stencil with the arguments passed." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "51a5b99a-3cfc-437d-bf10-a1203499f28c", - "metadata": {}, - "outputs": [], - "source": [ - "from ndsl import StencilFactory\n", - "from ndsl.dsl.typing import FloatField\n", - "\n", - "\n", - "class SetFieldToValue:\n", - " def __init__(self, stencil_factory: StencilFactory):\n", - " grid_indexing = stencil_factory.grid_indexing\n", - " self._set_field_to_value_stencil = stencil_factory.from_origin_domain(\n", - " set_field_to_value_def,\n", - " origin=grid_indexing.origin_compute(),\n", - " domain=grid_indexing.domain_compute(),\n", - " )\n", - "\n", - " def __call__(\n", - " self,\n", - " f: FloatField,\n", - " value: float,\n", - " ):\n", - " self._set_field_to_value_stencil(f, value)" - ] - }, - { - "cell_type": "markdown", - "id": "cb397fe7-9ae0-46c0-8056-d35cde629a4b", - "metadata": {}, - "source": [ - "## Compiling and running the stencil\n", - "\n", - "To compile and run the stencil we first have to instanciate the wrapper class. This will compile the stencil and return a callable object. Next we have to define a GT4Py data storage (field). This could also be done using the `ndsl.quantity.Quantity` class, but here we use plain GT4Py data storages for simplicity. Finally, we can call the stencil and pass in the field and value." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "c27da0c5-bf57-4196-83be-65b32cfccbf9", - "metadata": {}, - "outputs": [], - "source": [ - "set_field_to_value = SetFieldToValue(stencil_factory)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "b545d4e6-a98f-440f-ab46-be2f9c182c31", - "metadata": {}, - "outputs": [], - "source": [ - "import gt4py.storage as gt_storage\n", - "\n", - "field = gt_storage.zeros(\n", - " backend=backend,\n", - " dtype=float,\n", - " shape=(nx + 2 * nhalo, ny + 2 * nhalo, nz),\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "e993525f-fe88-42e0-823a-9712539621a5", - "metadata": {}, - "outputs": [], - "source": [ - "value = 42.0\n", - "set_field_to_value(field, value)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "a8ddf9b5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Min and max values: 42.0 0.0\n" - ] + "cells": [ + { + "cell_type": "markdown", + "id": "559427b6-c6c4-4e98-9ab4-f321f8c4999d", + "metadata": { + "tags": [] + }, + "source": [ + "# Defining, compiling, and running stencils\n", + "\n", + "This notebook demonstrates how stencils can be defined, compiled and executed." + ] + }, + { + "cell_type": "markdown", + "id": "777c9dae-cb6f-49a8-963a-a85031d169af", + "metadata": {}, + "source": [ + "## Configuration\n", + "\n", + "First, let's define the configuration such as the size of the computational domain as well as the number of halo points and the GT4Py backend we are using." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "5e09b7ff-ead1-40da-a79f-9929fd7c9e93", + "metadata": {}, + "outputs": [], + "source": [ + "nx = 20\n", + "ny = 20\n", + "nz = 79\n", + "nhalo = 3\n", + "backend = \"numpy\"" + ] + }, + { + "cell_type": "markdown", + "id": "3acf8ab8-73b5-45f3-9605-6f5929ebdbb3", + "metadata": {}, + "source": [ + "## Stencil definition using GT4Py\n", + "\n", + "Next, we'll define the actual stencil that we want to compile and run. We use the GT4Py domain-specific language (GTScripts) for this. For demonstration purposes, we start with a very simple stencil that simply sets a field to a constant value at every grid cell." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c9d04aed-9513-447a-bae8-3c9719a60d9a", + "metadata": {}, + "outputs": [], + "source": [ + "from ndsl.dsl.gt4py import PARALLEL, computation\n", + "from ndsl.dsl.typing import FloatField\n", + "\n", + "def set_field_to_value_def(f: FloatField, value: float):\n", + " with computation(PARALLEL), interval(...):\n", + " f = value" + ] + }, + { + "cell_type": "markdown", + "id": "e3ff42c6-2fcb-4cbf-af4e-a41d5bbb0c95", + "metadata": { + "tags": [] + }, + "source": [ + "## Setup helpers for building stencils\n", + "\n", + "The `ndsl` package contains provides a helper class for compiling stencils. The helper class is called a stencil factory. In order to setup a stencil factory, several configuration objects have to be defined and passed in.\n", + "\n", + "- `DaceConfig`: configuration of DaCe backend\n", + "- `CompilationConfig`: specification of how to compile\n", + "- `StencilConfig`: wrapper to carry DaCe and compilation configuration\n", + "- `GridIndexing`: helper class which provides indexing (e.g. compute domain and origin)\n", + "- `StencilFactory`: helper class to build stencils from GT4Py stencil definitions" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "108a7b90-178d-461c-b313-cf0f1dcb4b94", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from ndsl import DaceConfig, DaCeOrchestration, GridIndexing, StencilConfig, StencilFactory, CompilationConfig, RunMode\n", + "\n", + "dace_config = DaceConfig(\n", + " communicator=None, backend=backend, orchestration=DaCeOrchestration.Python\n", + ")\n", + "\n", + "compilation_config = CompilationConfig(\n", + " backend=backend,\n", + " rebuild=True,\n", + " validate_args=True,\n", + " format_source=False,\n", + " device_sync=False,\n", + " run_mode=RunMode.BuildAndRun,\n", + " use_minimal_caching=False,\n", + ")\n", + "\n", + "stencil_config = StencilConfig(\n", + " compare_to_numpy=False,\n", + " compilation_config=compilation_config,\n", + " dace_config=dace_config,\n", + ")\n", + "\n", + "grid_indexing = GridIndexing(\n", + " domain=(nx, ny, nz),\n", + " n_halo=nhalo,\n", + " south_edge=True,\n", + " north_edge=True,\n", + " west_edge=True,\n", + " east_edge=True,\n", + ")\n", + "\n", + "stencil_factory = StencilFactory(config=stencil_config, grid_indexing=grid_indexing)" + ] + }, + { + "cell_type": "markdown", + "id": "7d5797e0-b80a-4b27-be30-5d138deda105", + "metadata": {}, + "source": [ + "## Wrap stencil into a Python class\n", + "\n", + "Using the stencil factory we can now wrap the compiled GT4Py stencil into a Python class. The init section is responsible for compiling the stencil, the call section will simply execute the compiled stencil with the arguments passed." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "51a5b99a-3cfc-437d-bf10-a1203499f28c", + "metadata": {}, + "outputs": [], + "source": [ + "from ndsl import StencilFactory\n", + "from ndsl.dsl.typing import FloatField\n", + "\n", + "\n", + "class SetFieldToValue:\n", + " def __init__(self, stencil_factory: StencilFactory):\n", + " grid_indexing = stencil_factory.grid_indexing\n", + " self._set_field_to_value_stencil = stencil_factory.from_origin_domain(\n", + " set_field_to_value_def,\n", + " origin=grid_indexing.origin_compute(),\n", + " domain=grid_indexing.domain_compute(),\n", + " )\n", + "\n", + " def __call__(\n", + " self,\n", + " f: FloatField,\n", + " value: float,\n", + " ):\n", + " self._set_field_to_value_stencil(f, value)" + ] + }, + { + "cell_type": "markdown", + "id": "cb397fe7-9ae0-46c0-8056-d35cde629a4b", + "metadata": {}, + "source": [ + "## Compiling and running the stencil\n", + "\n", + "To compile and run the stencil we first have to instanciate the wrapper class. This will compile the stencil and return a callable object. Next we have to define a GT4Py data storage (field). This could also be done using the `ndsl.quantity.Quantity` class, but here we use plain GT4Py data storages for simplicity. Finally, we can call the stencil and pass in the field and value." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "c27da0c5-bf57-4196-83be-65b32cfccbf9", + "metadata": {}, + "outputs": [], + "source": [ + "set_field_to_value = SetFieldToValue(stencil_factory)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "b545d4e6-a98f-440f-ab46-be2f9c182c31", + "metadata": {}, + "outputs": [], + "source": [ + "import gt4py.storage as gt_storage\n", + "\n", + "field = gt_storage.zeros(\n", + " backend=backend,\n", + " dtype=float,\n", + " shape=(nx + 2 * nhalo, ny + 2 * nhalo, nz),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e993525f-fe88-42e0-823a-9712539621a5", + "metadata": {}, + "outputs": [], + "source": [ + "value = 42.0\n", + "set_field_to_value(field, value)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a8ddf9b5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Min and max values: 42.0 0.0\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgIAAAGzCAYAAABdO3+BAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA4KklEQVR4nO3df1zV9d3/8edR4YAKxwD5lUj4I/EXdl3+INKMxERqTpOaWtvUmc6FXVPXLLby11qUu1auXYhtc5AVpbbU5a50aopzE690c9ZWTLkoMQWXuwDFQMb5fP9wnG8nUD6Hc4DjOY/77fa+jfP+/Hqfz06e13m9f3wshmEYAgAAfqlLZzcAAAB0HgIBAAD8GIEAAAB+jEAAAAA/RiAAAIAfIxAAAMCPEQgAAODHCAQAAPBjBAIAAPgxAgG0u48++kgWi0UFBQUuH7t//35ZLBbt37+/1X1TU1OVmprq8jXgzJV7DuD6RyAAtxUUFMhisbRYHn/88c5uXrt6+umntW3bNlP7njlzRitXrtSxY8fatU2+5K677pLFYtGiRYuc6svLy7Vq1SqNGTNGN9xwgyIiIpSamqo9e/aYPrfdbteaNWuUkJCgoKAgJSUl6bXXXvP0WwC8XrfObgB8x+rVq5WQkOBUN2zYMMXHx+uzzz5TQEBAJ7Ws/Tz99NO67777NG3atFb3PXPmjFatWqWbbrpJt9xyS7u37Xr35ptv6tChQy1u2759u5599llNmzZNs2fP1j//+U9t3LhRd911l375y19q7ty5rZ7/+9//vp555hnNnz9fo0eP1vbt2/XAAw/IYrFo5syZnn47gNciEIDHZGRkaNSoUS1uCwoK6uDW4HpWV1en73znO3rssce0fPnyZtvvvPNOnTp1ShEREY66hQsX6pZbbtHy5ctbDQQ++eQT/fjHP1ZWVpb+67/+S5L00EMP6Y477tB3v/td3X///eratatn3xTgpegaQLu72hiBDz/8UPfdd5/CwsIUFBSkUaNG6de//rWpc/7sZz9T//79FRwcrDFjxuh3v/ud6fbs3r1b48aNU69evdSzZ08NGjRI3/ve95z2qa+v14oVKzRgwABZrVbFxcVp2bJlqq+vd+xjsVhUW1url156ydEVMmfOnBavuX//fo0ePVqSNHfuXMf+n78nW7Zs0ciRIxUcHKyIiAh99atf1SeffHLN93LkyBFZLBa99NJLzbbt2rVLFotFO3bskCR9/PHHevjhhzVo0CAFBwcrPDxc999/vz766KNW79lNN93U4ntraVyGmXvXmjVr1shut+vRRx9tcfvQoUOdggBJslqtuvvuu3X69GlduHDhmuffvn27Ghoa9PDDDzvqLBaLvvWtb+n06dNXzUQAvoiMADymurpan376qVPdF/+xbvKXv/xFY8eO1Y033qjHH39cPXr00ObNmzVt2jT96le/0r333nvV62zYsEHf/OY3ddttt2nx4sX63//9X335y19WWFiY4uLirtnGv/zlL/rSl76kpKQkrV69WlarVSdPntTvf/97xz52u11f/vKXdfDgQS1YsECDBw/We++9p+eff15/+9vfHGMCXn75ZT300EMaM2aMFixYIEnq379/i9cdPHiwVq9ereXLl2vBggW6/fbbJUm33XabpCvjLObOnavRo0crJydHlZWV+slPfqLf//73+tOf/qRevXq1eN5Ro0apX79+2rx5s2bPnu20bdOmTbrhhhuUnp4uSXr33Xf1hz/8QTNnzlSfPn300UcfKS8vT6mpqfrrX/+q7t27X/PemWH23l3LqVOn9Mwzz+iXv/ylgoODXbp+RUWFunfv3up7+dOf/qQePXpo8ODBTvVjxoxxbB83bpxL1wauWwbgpvz8fENSi8UwDKOsrMyQZOTn5zuOSUtLM4YPH27U1dU56ux2u3HbbbcZAwcOdNTt27fPkGTs27fPMAzDuHz5shEZGWnccsstRn19vWO/n/3sZ4Yk44477rhmW59//nlDkvH3v//9qvu8/PLLRpcuXYzf/e53TvXr1683JBm///3vHXU9evQwZs+efc1rNnn33Xeb3YfPv6dhw4YZn332maN+x44dhiRj+fLl1zxvdna2ERAQYPzjH/9w1NXX1xu9evUyvvGNbzjqLl261OzYQ4cOGZKMjRs3Ouq+eM8NwzDi4+NbfJ933HGH0z135d5dzX333WfcdtttjteSjKysrFaPO3HihBEUFGR87Wtfa3Xfe+65x+jXr1+z+traWkOS8fjjj7d6DsBX0DUAj8nNzdXu3budSkv+8Y9/6J133tFXvvIVXbhwQZ9++qk+/fRTnT9/Xunp6Tpx4sRVU+JHjhzRuXPntHDhQgUGBjrq58yZI5vN1mobm35Zb9++XXa7vcV9tmzZosGDBysxMdHRtk8//VQTJkyQJO3bt6/V67ii6T09/PDDTmMp7rnnHiUmJuo3v/nNNY+fMWOGGhoa9Oabbzrqfvvb36qqqkozZsxw1H3+13VDQ4POnz+vAQMGqFevXvrjH//okffi7r3bt2+ffvWrX2nt2rUuXffSpUu6//77FRwcrGeeeabV/T/77DNZrdZm9U33/7PPPnPp+sD1jK4BeMyYMWOuOljw806ePCnDMPTkk0/qySefbHGfc+fO6cYbb2xW//HHH0uSBg4c6FQfEBCgfv36tXrtGTNm6Be/+IUeeughPf7440pLS9P06dN13333qUuXK3HxiRMn9MEHH6h3795XbZsnNb2nQYMGNduWmJiogwcPXvP4ESNGKDExUZs2bdK8efMkXekWiIiIcHwBS1e+3HJycpSfn69PPvlEhmE4tlVXV3virbh17/75z3/qP/7jP/S1r33NMZ7CjMbGRs2cOVN//etf9fbbbys2NrbVY4KDg1scs1BXV+fYDvgLAgF0uKZf4o8++qij//qLBgwY0C7XDg4O1oEDB7Rv3z795je/0c6dO7Vp0yZNmDBBv/3tb9W1a1fZ7XYNHz5czz33XIvnaG0cQmeYMWOGfvjDH+rTTz9VSEiIfv3rX2vWrFnq1u3//yf+yCOPKD8/X4sXL1ZKSopsNptjqtzVsiNNLBZLi/WNjY1Oo+vduXcbN25USUmJXnzxxWYDGC9cuKCPPvpIkZGRzfr/58+frx07dujVV191CnyuJSYmRvv27ZNhGE7v7ezZs5JkKpgAfAWBADpc0y/3gIAATZw40aVj4+PjJV355fn5f/QbGhpUVlamESNGtHqOLl26KC0tTWlpaXruuef09NNP6/vf/7727duniRMnqn///vrzn/+stLS0q34BNmltu5l9m95TSUlJsy+ykpISx/ZrmTFjhlatWqVf/epXioqKUk1NTbO58G+88YZmz56tH//4x466uro6VVVVtXr+G264ocX9Pv74Y6dMjCv37otOnTqlhoYGjR07ttm2jRs3auPGjdq6davTmg3f/e53lZ+fr7Vr12rWrFmmr3XLLbfoF7/4hT744AMNGTLEUX/48GHHdsBfMEYAHS4yMlKpqal68cUXHb/APu/vf//7VY8dNWqUevfurfXr1+vy5cuO+oKCAlNfaP/4xz+a1TX9o9+UKv7KV76iTz75RD//+c+b7fvZZ5+ptrbW8bpHjx6mrtu0r6Rm+48aNUqRkZFav369U7r67bff1gcffKB77rmn1XMPHjxYw4cP16ZNm7Rp0ybFxMRo/PjxTvt07drVqTtAkn7605+qsbGx1fP3799fxcXFTvd8x44dKi8vd9rPlXv3RTNnztTWrVubFUm6++67tXXrViUnJzv2/9GPfqT//M//1Pe+9z19+9vfvup5q6ur9eGHHzp1f0ydOlUBAQFat26do84wDK1fv1433nijYzYH4A/ICKBT5Obmaty4cRo+fLjmz5+vfv36qbKyUocOHdLp06f15z//ucXjAgIC9NRTT+mb3/ymJkyYoBkzZqisrEz5+fmmxgisXr1aBw4c0D333KP4+HidO3dO69atU58+fRzTxb72ta9p8+bNWrhwofbt26exY8eqsbFRH374oTZv3qxdu3Y5xkKMHDlSe/bs0XPPPafY2FglJCQ4fVl9Xv/+/dWrVy+tX79eISEh6tGjh5KTk5WQkKBnn31Wc+fO1R133KFZs2Y5pg/edNNNWrJkial7OmPGDC1fvlxBQUGaN2+eY8xDky996Ut6+eWXZbPZNGTIEB06dEh79uxReHh4q+d+6KGH9MYbb2jy5Mn6yle+otLSUr3yyivNpku6cu++KDExUYmJiS1uS0hIcMoEbN26VcuWLdPAgQM1ePBgvfLKK07733XXXYqKinLsO3fuXOXn5zvWQujTp48WL16sH/3oR2poaNDo0aO1bds2/e53v9Orr77KYkLwL506ZwE+oWn64Lvvvtvi9pamDxqGYZSWlhpf//rXjejoaCMgIMC48cYbjS996UvGG2+84dinpalshmEY69atMxISEgyr1WqMGjXKOHDgQLOpbC3Zu3evMXXqVCM2NtYIDAw0YmNjjVmzZhl/+9vfnPa7fPmy8eyzzxpDhw41rFarccMNNxgjR440Vq1aZVRXVzv2+/DDD43x48cbwcHBhqRWpxJu377dGDJkiNGtW7dm92TTpk3Gv/3bvxlWq9UICwszHnzwQeP06dPXPN/nnThxwjFt8+DBg822/9///Z8xd+5cIyIiwujZs6eRnp5ufPjhh82mBl7tnv/4xz82brzxRsNqtRpjx441jhw50uI9N3vvzFIL0wdXrFhx1SmrX2x70+fzi5+/xsZG4+mnnzbi4+ONwMBAY+jQocYr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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "print(\"Min and max values:\", field.max(), field.min())\n", + "\n", + "fig = plt.figure()\n", + "fig.patch.set_facecolor(\"white\")\n", + "ax = fig.add_subplot(111)\n", + "ax.set_facecolor(\".4\")\n", + "\n", + "f1 = ax.pcolormesh(field[:, :, 0])\n", + "\n", + "cbar = plt.colorbar(f1)\n", + "ax.set_title(\"Field set to value %.1f\" % value)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "6562a18e", + "metadata": {}, + "source": [ + "## Building and Running Pre-defined Stencils for Tracer Advection\n", + "\n", + "In this portion, we build and run the stencils required for calculating tracer advection. This will include:\n", + "- `FiniteVolumeFluxPrep`: calculates/updates Courant number and total mass flux fields based on input wind field.\n", + "- `FiniteVolumeTransport`: calculates tracer fluxes for horizontal finite volume flux transport.\n", + "- `TracerAdvection`: performs horizontal advection on tracers." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "a45c6f83", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Starting 6 engines with \n", + "100%|███████████████████████████████████████████████████████| 6/6 [00:05<00:00, 1.09engine/s]\n", + "%autopx enabled\n" + ] + } + ], + "source": [ + "import ipyparallel as ipp\n", + "\n", + "layout = (1, 1)\n", + "ntiles = 6\n", + "# spinup cluster of MPI-workers\n", + "num_ranks = ntiles * layout[0] * layout[1]\n", + "\n", + "tracer_center = (0, 0)\n", + "test_case = \"b\"\n", + "timestep = 900.0\n", + "\n", + "cluster = ipp.Cluster(engines=\"mpi\", n=num_ranks).start_and_connect_sync()\n", + "\n", + "# broadcast configuration to all workers\n", + "ar = cluster[:].push(\n", + " {\n", + " \"ntiles\": ntiles,\n", + " \"nx\": nx,\n", + " \"ny\": ny,\n", + " \"nz\": nz,\n", + " \"nhalo\": nhalo,\n", + " \"layout\": layout,\n", + " \"backend\": backend,\n", + " \"tracer_center\": tracer_center,\n", + " \"test_case\": test_case,\n", + " \"timestep\": timestep\n", + " }\n", + ")\n", + "\n", + "# start executing cells on the workers in parallel from here on\n", + "%autopx" + ] + }, + { + "cell_type": "markdown", + "id": "b5546849", + "metadata": {}, + "source": [ + "### Getting initial state\n", + "\n", + "Before we can build and run stencils associated with tracer advection, we need to have the grid configuration and initial fields for u- and v- winds on the C grid. \n", + "\n", + "More details on these processes are described in `grid_generation.ipynb` and `initial_condition_definition.ipynb`, and here they are shortened by using helper functions inside `functions.py`." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "d35b55bb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[stderr:5] /pace/NDSL/ndsl/grid/gnomonic.py:681: RuntimeWarning: invalid value encountered in true_divide\n", + " np.sum(p * q, axis=-1)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[stderr:2] /pace/NDSL/ndsl/grid/gnomonic.py:681: RuntimeWarning: invalid value encountered in true_divide\n", + " np.sum(p * q, axis=-1)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import functions as func\n", + "from mpi4py import MPI\n", + "import importlib\n", + "\n", + "importlib.reload(func)\n", + "\n", + "mpi_comm = MPI.COMM_WORLD\n", + "mpi_rank = mpi_comm.Get_rank()\n", + "\n", + "namelist_dict = func.store_namelist_variables(locals())\n", + "dimensions = func.define_dimensions(namelist_dict)\n", + "\n", + "domain_configuration = func.configure_domain(mpi_comm, dimensions)\n", + "\n", + "initial_state = func.create_initial_state_advection(\n", + " domain_configuration[\"metric_terms\"], dimensions, tracer_center, test_case\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "9965c31a", + "metadata": {}, + "source": [ + "For the stencils used in the tracer advection process, we will need some additional classes, such as `DampingCoefficients` and `GridIndexing`.\n", + "\n", + "If we want to run tracer advection in a single layer instead of extending it to 79 identical conditions, we want to create `GridData` with the `single_layer=True`." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "3c865c63", + "metadata": {}, + "outputs": [], + "source": [ + "from ndsl import DaceConfig, DaCeOrchestration, GridIndexing, StencilConfig, StencilFactory, CompilationConfig, RunMode\n", + "from ndsl.grid import AngleGridData, ContravariantGridData, DampingCoefficients, GridData, HorizontalGridData, MetricTerms, VerticalGridData\n", + "\n", + "\n", + "if nz == 1:\n", + " single_layer = True\n", + "else:\n", + " single_layer = False\n", + "\n", + "if single_layer:\n", + " horizontal_grid_data = HorizontalGridData.new_from_metric_terms(domain_configuration[\"metric_terms\"])\n", + " vertical_grid_data = VerticalGridData(ptop=0, ks=0, ak=[10], bk=[0], p_ref=0)\n", + " contravariant_grid_data = ContravariantGridData.new_from_metric_terms(domain_configuration[\"metric_terms\"])\n", + " angle_grid_data = AngleGridData.new_from_metric_terms(domain_configuration[\"metric_terms\"])\n", + "\n", + " grid_data = GridData(horizontal_grid_data, vertical_grid_data, contravariant_grid_data, angle_grid_data)\n", + " \n", + "else:\n", + " grid_data = GridData.new_from_metric_terms(domain_configuration[\"metric_terms\"])\n", + "\n", + "\n", + "damping_coefficients = DampingCoefficients.new_from_metric_terms(domain_configuration[\"metric_terms\"])\n", + "\n", + "dace_config = DaceConfig(\n", + " communicator=None, backend=backend, orchestration=DaCeOrchestration.Python\n", + ")\n", + "\n", + "compilation_config = CompilationConfig(\n", + " backend=backend,\n", + " rebuild=True,\n", + " validate_args=True,\n", + " format_source=False,\n", + " device_sync=False,\n", + " run_mode=RunMode.BuildAndRun,\n", + " use_minimal_caching=False,\n", + " communicator=domain_configuration[\"communicator\"],\n", + ")\n", + "\n", + "stencil_config = StencilConfig(\n", + " compare_to_numpy=False,\n", + " compilation_config=compilation_config,\n", + " dace_config=dace_config,\n", + ")\n", + "\n", + "grid_indexing = GridIndexing.from_sizer_and_communicator(\n", + " sizer=domain_configuration[\"sizer\"], comm=domain_configuration[\"communicator\"]\n", + ")\n", + "\n", + "stencil_factory = StencilFactory(config=stencil_config, grid_indexing=grid_indexing)\n" + ] + }, + { + "cell_type": "markdown", + "id": "6eea64a5", + "metadata": {}, + "source": [ + "### 1. Finite Volume Flux Prep\n", + "\n", + "In order to run the stencil, we first need to build it (initialize an instance of the class). \n", + "\n", + "For building the `FiniteVolumeFluxPrep` stencil, we need `stencil_factory` and `grid_data` from the configuration dictionary. \n", + "\n", + "For running the stencil, we require the following inputs:\n", + "- `uc (in)`: covariant x-velocity on the C-grid (stored in `initial_state` as `u_Cgrid`)\n", + "- `vc (in)`: covariant y-velocity on the C-grid (stored in `initial_state` as `v_Cgrid`)\n", + "- `crx (out)`: Courant number, x-direction\n", + "- `cry (out)`: Courant number, y-direction\n", + "- `x_area_flux (out)`: flux of area in x-direction, in units of m^2\n", + "- `y_area_flux (out)`: flux of area in y-direction, in units of m^2\n", + "- `uc_contra (out)`: contravariant x-velocity on C-grid\n", + "- `vc_contra (out)`: contravariant y-velocity on C-grid\n", + "- `dt (in)`: acoustic timestep in seconds\n", + "\n", + "We need to create empty storages or quantities to initialize the output variables, and their values get updated when we run the stencil.\n", + "We plot the empty storage of `crx` on the first (zeroth) rank, run `FiniteVolumeFluxPrep`, then plot the updated storage for comparison." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "886c8a20", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "%px: 83%|██████████████████████████████████████████▌ | 5/6 [00:00<00:00, 48.19tasks/s]" + ] + }, + { + "data": { + "text/plain": [ + "[output:0]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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de2DfX19MWbMGGRkZNg6ijdKT0+Hv78/7r//fgDAv//9bzz88MNo2bIlmjZtiv79+2Pr1q11bnNN11rcnEk37l/T0tLQoUMHNG3aFMOHD8f58+chhMBLL72Etm3bwtfXFw888AB++eWXavX+4x//wKBBg9CsWTP4+/tj1KhR+OGHH+pspwzZHFX72e/ZsyeCgoJs2WP9jbJ27Vq88MILaNOmDZo2bYrCwkIAcnlrbaM1PwICAtCqVSs8+eSTKC0tldr+/fv345577kGLFi3QrFkz9OrVC2+88Ybt70ePHsXkyZPRoUMH+Pj4IDQ0FI8++qjHDXdsDNxyJufixYvo168f8vPzkZSUhG7duuHChQv4+OOPUVJSYnek5oknnkBwcDAWLFiA4uJiTJkyBZ9++imSk5Nx9913IyIiAt9//z1SUlIwderUaqfHHTl58iTGjRuHxx9/HImJiVi1ahUefvhhbNu2DXfffTeAqlPUQ4YMwYULF/DHP/4R7dq1w969ezFv3jxcunQJS5cuRffu3fHBBx/gqaeeQtu2bW1DfIKDg/Hbb79h6NChOHXqFGbMmIGoqCisX78ekydPRn5+Pp588km7Nq1atQqlpaVISkqC2WxGy5Yt8cMPP+COO+5AmzZtMHfuXDRr1gwfffQREhIS8Mknn2D06NF1bmtpaSmuXLlit8zf37/WI2kvv/wyjEYjnnnmGRQUFGDx4sWYOHEi9u/f77B8cHAwli9fjmnTpmH06NEYM2YMANiGlclux8SJE5GSkoL09HTcdttttvorKyvx0UcfYdCgQWjXrp3i11aNr776Cp999hmmT58OAEhNTcW9996LZ599Fm+//TaeeOIJ/Prrr1i8eDEeffRR7Ny50/bcnTt3YuTIkejTpw8WLlwIo9GIVatW4a677sJXX32Ffv362a2roKCg2nvliqNrd911F5544gmkpqYiISEBt912Gy5duoSZM2ciLi6uziFoFRUVOH/+fLWhGq74zM6YMQPNmzfHokWLcOLECSxfvhxnz561hVlNjh49ikGDBqFJkyZISkpCZGQkTp8+jc2bN+PPf/4zAOC7777D3r17MX78eLRt2xZnzpzB8uXLMXToUPz4449o2rSpk68o6Y07M2v16tXw8/NDcnIy/Pz8sHPnTixYsACFhYV49dVXAQBLly7F+++/jw0bNtiGHvXs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AIDD98r6t8ZoxIgRGDNmDKKionD69Gk8//zzGDlyJLKysuDl5eXu5tXIYrFg9uzZuOOOO9CjRw8AVe+RyWRC8+bN7co2lvfI0TYBwO9//3u0b98e4eHhOHr0KJ577jmcOHECn376qRtbS56M2dR4eGI2NdZcAjwvm5hLjY9mOjmeZuTIkbb/79WrF2JiYtC+fXt89NFHmDp1qhtbRjUZP3687f979uyJXr16oWPHjsjMzMSwYcPc2LLaTZ8+HceOHWtU4+rrUtM2JSUl2f6/Z8+eCAsLw7Bhw3D69Gl07NixoZtJ1OgwmxqXxppLgOdlE3Op8dHMcLWgoCB4eXlVm2EjNzcXoaGhbmqV6zRv3hxdunTBqVOn3N0U1azvh6e+V1YdOnRAUFCQpt+zGTNmYMuWLdi1axfatm1rWx4aGory8nLk5+fblW8M71FN2+RITEwMAGj6PaLGjdnUeOghmxpDLgGel03MpcZJM50ck8mEPn36ICMjw7bMYrEgIyMDsbGxbmyZaxQVFeH06dMICwtzd1NUi4qKQmhoqN17VVhYiP3793vEe2X1888/4+rVq5p8z4QQmDFjBjZs2ICdO3ciKirK7u99+vRBkyZN7N6jEydO4Ny5c5p9j+raJkeOHDkCAJp8j8gzMJsaDz1kk5ZzCfC8bGIuNXLunffA3tq1a4XZbBarV68WP/74o0hKShLNmzcXOTk57m6aYk8//bTIzMwU2dnZ4ptvvhFxcXEiKChI5OXlubtpUq5duyYOHz4sDh8+LACI119/XRw+fFicPXtWCCHEyy+/LJo3by42bdokjh49Kh544AERFRUlfvvtNze3vGa1bdO1a9fEM888I7KyskR2drb48ssvxW233SY6d+4sSktL3d30aqZNmyYCAwNFZmamuHTpku1RUlJiK/P444+Ldu3aiZ07d4oDBw6I2NhYERsb68ZW166ubTp16pR48cUXxYEDB0R2drbYtGmT6NChgxg8eLCbW06ejtmkHZ6WTZ6US0J4XjYxlxo3TXVyhBBi2bJlol27dsJkMol+/fqJffv2ubtJThk3bpwICwsTJpNJtGnTRowbN06cOnXK3c2StmvXLgGg2iMxMVEIUTVV5/z580VISIgwm81i2LBh4sSJE+5tdB1q26aSkhIxfPhwERwcLJo0aSLat28vHnvsMc3+iHG0HQDEqlWrbGV+++038cQTT4gWLVqIpk2bitGjR4tLly65r9F1qGubzp07JwYPHixatmwpzGaz6NSpk5gzZ44oKChwb8NJF5hN2uBp2eRJuSSE52UTc6lxMwghhOvPDxEREREREbmHZq7JISIiIiIicgV2coiIiIiIyKOwk0NERERERB6FnRwiIiIiIvIo7OQQEREREZFHYSeHiIiIiIg8Cjs5RERERETkUdjJISIiIiIij8JODhEREREReRR2coiIiIiIyKOwk0NERERERB6FnRwiIiIiIvIo/x8ND78JUUP2OwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": { + "engine": 0 + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "%px: 100%|███████████████████████████████████████████████████| 6/6 [00:00<00:00, 11.28tasks/s]\n" + ] + } + ], + "source": [ + "import copy as cp\n", + "import matplotlib.pyplot as plt\n", + "from pyfv3.stencils import FiniteVolumeFluxPrep\n", + "from units_config import units\n", + "\n", + "fvf_prep = FiniteVolumeFluxPrep(\n", + " stencil_factory, grid_data, grid_type=0\n", + ")\n", + "\n", + "crx = domain_configuration[\"quantity_factory\"].zeros(\n", + " dims=(\"x_interface\", \"y\", \"z\"), units=units[\"courant\"], dtype=\"float\"\n", + ")\n", + "cry = domain_configuration[\"quantity_factory\"].zeros(\n", + " dims=(\"x\", \"y_interface\", \"z\"), units=units[\"courant\"], dtype=\"float\"\n", + ")\n", + "\n", + "x_area_flux = domain_configuration[\"quantity_factory\"].zeros(\n", + " dims=(\"x_interface\", \"y\", \"z\"), units=units[\"area\"], dtype=\"float\"\n", + ")\n", + "y_area_flux = domain_configuration[\"quantity_factory\"].zeros(\n", + " dims=(\"x\", \"y_interface\", \"z\"), units=units[\"area\"], dtype=\"float\"\n", + ")\n", + "\n", + "uc_contra = domain_configuration[\"quantity_factory\"].zeros(\n", + " dims=(\"x_interface\", \"y\", \"z\"), units=units[\"wind\"], dtype=\"float\"\n", + ")\n", + "vc_contra = domain_configuration[\"quantity_factory\"].zeros(\n", + " dims=(\"x\", \"y_interface\", \"z\"), units=units[\"wind\"], dtype=\"float\"\n", + ")\n", + "\n", + "crx_before = cp.deepcopy(crx)\n", + "\n", + "fvf_prep(\n", + " initial_state[\"u_cgrid\"],\n", + " initial_state[\"v_cgrid\"],\n", + " crx,\n", + " cry,\n", + " x_area_flux,\n", + " y_area_flux,\n", + " uc_contra,\n", + " vc_contra,\n", + " timestep,\n", + ")\n", + "\n", + "if mpi_rank == 0:\n", + " fig = plt.figure(figsize=(10, 4))\n", + " fig.patch.set_facecolor(\"white\")\n", + " ax_before = fig.add_subplot(121)\n", + " ax_after = fig.add_subplot(122)\n", + "\n", + " f1 = ax_before.pcolormesh(\n", + " crx_before.data[:, :, 0], vmin=-0, vmax=0.1, cmap=\"YlOrRd\"\n", + " )\n", + " plt.colorbar(f1, ax=ax_before)\n", + " f2 = ax_after.pcolormesh(crx.data[:, :, 0], vmin=-0, vmax=0.1, cmap=\"YlOrRd\")\n", + " plt.colorbar(f2, ax=ax_after)\n", + "\n", + " ax_before.set_title(\"crx before FiniteVolumeFluxPrep call\")\n", + " ax_after.set_title(\"crx after FiniteVolumeFluxPrep call\")\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "aadc97e9", + "metadata": {}, + "source": [ + "Since our layer have thickness of delp Pa, we can use that information and the `x_area_flux` and `y_area_flux` variables provided by `FiniteVolumeFluxPrep` to calculate mass fluxes that are required as input to `TracerAdvection`.\n", + "\n", + "We are assuming that density is 1 (kg /m3)." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "4869723d", + "metadata": {}, + "outputs": [], + "source": [ + "mfxd = domain_configuration[\"quantity_factory\"].zeros(\n", + " dims=(\"x_interface\", \"y\", \"z\"), units=units[\"mass\"], dtype=\"float\"\n", + ")\n", + "mfyd = domain_configuration[\"quantity_factory\"].zeros(\n", + " dims=(\"x\", \"y_interface\", \"z\"), units=units[\"mass\"], dtype=\"float\"\n", + ")\n", + "\n", + "density = 1.0\n", + "\n", + "mfxd.data[:] = x_area_flux.data[:] * initial_state[\"delp\"].data[:] * density\n", + "mfyd.data[:] = y_area_flux.data[:] * initial_state[\"delp\"].data[:] * density\n" + ] + }, + { + "cell_type": "markdown", + "id": "8cbf898b", + "metadata": {}, + "source": [ + "### 2. Tracer Advection and its Inputs\n", + "\n", + "In order to build the `TracerAdvection` stencil, it needs an input of a different stencil, `FiniteVolumeTransport`. \n", + "\n", + "For building the `FiniteVolumeTransport` stencil, we need `stencil_factory`, `grid_data`, and `damping_coefficients` from the configuration dictionary. We do not actually need to run it, as it get run within `TracerAdvection`, but if we did, we would get output tracer mass fluxes. \n", + "\n", + "For building `TracerAdvection`, we need `stencil_factory`, the pre-built `FiniteVolumeTransport` stencil, `grid_data`, and the cubed-sphere communicator stored under configuration as `communicator`. We also need a dictionary that includes all the tracers we want to follow at their initial state.\n", + "\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4446b419", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "%px: 100%|███████████████████████████████████████████████████| 6/6 [00:20<00:00, 3.38s/tasks]\n" + ] + } + ], + "source": [ + "from pyfv3.stencils import FiniteVolumeTransport, TracerAdvection\n", + "\n", + "grid_type = 0 # cubed-sphere\n", + "hord = 6 # horizontal diffusion order\n", + "\n", + "tracers = {\"tracer\": initial_state[\"tracer\"]}\n", + "\n", + "fvtp_2d = FiniteVolumeTransport(\n", + " stencil_factory,\n", + " domain_configuration[\"quantity_factory\"],\n", + " grid_data,\n", + " damping_coefficients,\n", + " grid_type,\n", + " hord,\n", + ")\n", + "\n", + "tracer_advection = TracerAdvection(\n", + " stencil_factory,\n", + " domain_configuration[\"quantity_factory\"],\n", + " fvtp_2d,\n", + " grid_data,\n", + " domain_configuration[\"communicator\"],\n", + " tracers,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "de2681d7", + "metadata": {}, + "source": [ + "To run a single step of `TracerAdvection`, we need to provide it the following inputs:\n", + "- `tracers`: a dictionary of all tracers we want to advect\n", + "- `delp`: pressure thickness of layers\n", + "- `mfxd`: mass flux in the x-direction\n", + "- `mfyd`: mass flux in the y-direction\n", + "- `crx`: Courant number in the x-direction\n", + "- `cry`: Courant number in the y-direction\n", + "- `timestep`: the timestep that is applied. \n", + "\n", + "Within `TracerAdvection`, the time step is split into 3 equal sub-steps, and all fields are divided by three, then advection is calculated for each of the substeps. \n", + "\n", + "All fields but `delp` are updated. Mass fluxes and Courant numbers are divided by 3 and then returned. So if we want to continue advecting with the initial wind field, we actually need to re-set those fields to initial conditions after each step." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "8043021f", + "metadata": { + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [], + "source": [ + "tracer_initial = cp.deepcopy(tracers)\n", + "mfxd_initial = cp.deepcopy(mfxd)\n", + "mfyd_initial = cp.deepcopy(mfyd)\n", + "crx_initial = cp.deepcopy(crx)\n", + "cry_initial = cp.deepcopy(cry)\n", + "\n", + "tracer_state = [tracer_initial[\"tracer\"]]\n", + "\n", + "nSteps = 10\n", + "\n", + "for step in range(nSteps):\n", + " tracer_advection(tracers, initial_state[\"delp\"], mfxd, mfyd, crx, cry)\n", + "\n", + " tracer_state.append(tracers[\"tracer\"])\n", + "\n", + " mfxd = cp.deepcopy(mfxd_initial)\n", + " mfyd = cp.deepcopy(mfyd_initial)\n", + " crx = cp.deepcopy(crx_initial)\n", + " cry = cp.deepcopy(cry_initial)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "f1e2588c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[output:0]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABQsAAAF2CAYAAADJMM7PAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABqNUlEQVR4nO3deXxU1f3/8fckkAlbEmNIQjDsKiBbDZIvKIKaEpCi1A3UryBVqErcqK1alUXUuCJWEapVaKlURAu2yheKKLhFEYSfWgGRsikkbE0CARLInN8fmAlDFmbuzNxMbl7Px+M+NHfOvffcGTLvzGfOPddljDECAAAAAAAA0OBF1XUHAAAAAAAAAEQGioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioVAmAwcOFADBw6s624AAByiPuRKQUGBrrrqKp1++ulyuVyaPn16XXcJAGo0efJkuVwun3Xt2rXTjTfe6LNu06ZNGjRokOLj4+VyubRo0SJJ0hdffKF+/fqpWbNmcrlcWrdunT0dr+dqej4BRA6KhTX49NNPNXnyZBUWFtZ1VxCkF198UXPmzAnLvr/99ltNnjxZW7duDcv+w2nnzp2aPHmy33/UhOt34h//+IfOPfdcxcbGqk2bNpo0aZKOHTsW0mMAkYBccQ5ypWZ33323li5dqvvvv19z587V4MGDtXjxYk2ePNnWfmzcuFF33323+vXrp9jYWLlcrlqf03BmUV2cP4DQGj16tL7++ms9+uijmjt3rnr37q2jR4/q6quv1v79+/Xss89q7ty5atu2bV13tV6o7vmcN2+e7V8wrVq1SrfddpsyMjLUuHHjKoXjk73yyivq0qWLYmNjdeaZZ+r5558PWV/q4vyBWhlU66mnnjKSzJYtW+q6KwjSOeecYwYMGBCWfS9YsMBIMh988EGVx0pLS01paWlYjhsKX3zxhZFkZs+e7Vf7cPxOLF682LhcLnPRRReZl156ydx+++0mKirK3HLLLSE7BhApyBXnIFdqlpKSYq6//nqfdePHjzd2/8k5e/ZsExUVZbp162Z69epV6+9euLOoLs4fgH8mTZpU5ffzyJEjpqyszPvzoUOHjCTzwAMP+LRbv369kWRefvllW/rqFDU9n0OHDjVt27a1tS+TJk0yjRs3NhkZGeass86q9b161qxZRpK58sorzUsvvWRuuOEGI8k8/vjjIelLXZw/UJtG9pcnncfj8aisrEyxsbF13RWvkpISNWvWrK67Ue+E8nmLiYkJyX6c7J577lGPHj30r3/9S40aHX87iouL02OPPaY777xTnTt3ruMeAnWDXHGOhpYru3fvVkJCQtiPY4zRkSNH1KRJk2ofv+yyy1RYWKgWLVro6aefrnUUPVkE4ERut9vn5z179khSlfe23bt3V7s+GA0ha2t6PsPhVH9P3Xrrrbr33nvVpEkT5eTk6Lvvvqu23eHDh/XAAw9o6NChevPNNyVJY8eOlcfj0dSpUzVu3DiddtppYTsPoE7UdbUyElV8w3TyUvGNtCQzfvx489e//tV07drVNGrUyCxcuNAYc3zkSN++fU1iYqKJjY015557rlmwYEG1x5k7d64577zzTJMmTUxCQoLp37+/Wbp0qU+bxYsXmwsuuMA0bdrUNG/e3Fx66aXmm2++8WkzevRo06xZM/P999+bIUOGmObNm5vLL7+81nP84YcfzK9+9SvTqlUrExMTY9q1a2duueUWnxELmzdvNldddZU57bTTTJMmTUxmZqZ55513fPbzwQcfGElm/vz55pFHHjGtW7c2brfbXHzxxWbTpk1VjvvZZ5+ZIUOGmISEBNO0aVPTvXt3M336dJ8269evN1deeaU57bTTjNvtNhkZGebtt9/2aTN79mwjyXz88cfm7rvvNklJSaZp06Zm+PDhZvfu3d52bdu2rfI6VowGqdjHihUrzK233mpatmxpEhISjDHGbN261dx6663mrLPOMrGxsSYxMdFcddVVPqMSKrY/eakYDTJgwIAqI08KCgrMr371K5OcnGzcbrfp0aOHmTNnjk+bLVu2GEnmqaeeMn/84x9Nhw4dTExMjOndu7dZtWpVzS/qT/bt22d+85vfmG7duplmzZqZFi1amMGDB5t169ZVed1OXmoaZXiq3wkr/v3vfxtJZsaMGT7rf/zxRyPJTJ061fK+gUhDrhxHrjg3V2rq++jRo6tdX6G8vNw8++yzpmvXrsbtdpvk5GQzbtw4s3//fp8+tG3b1gwdOtQsWbLEZGRkGLfbbZ599tlT9t2Y2kf1BptFZWVlZvLkyaZTp07G7XabxMREc/7555t//etfxhgT8vNfunSp6dmzp3G73aZLly7mrbfeCqg/QEP20Ucfmd69exu32206dOhgZs2aVe3IwrZt25rRo0cbY6rP74rHa8oCYwLLneoyw5jA8vqHH34wl19+uWnWrJlJSkoyv/nNb8yxY8d82paXl5vp06ebbt26GbfbbZKSkkx2drb54osvfNrNnTvXnHvuuSY2NtacdtppZsSIEWb79u2nfH79ybmans8BAwZUu77CkSNHzMSJE03Hjh1NTEyMOeOMM8xvf/tbc+TIEZ8+1Pb31KnUNgr83XffNZLMu+++67P+008/NZLM3Llza913cXGxufPOO03btm1NTEyMadmypcnKyjJr1qwxxpiwnP9ZZ51l3G63Offcc83KlSsD6g9gDCMLq3XFFVfou+++09/+9jc9++yzSkpKkiS1bNnS2+b999/XG2+8oZycHCUlJaldu3aSpOeee06XXXaZrr/+epWVlen111/X1VdfrXfeeUdDhw71bj9lyhRNnjxZ/fr108MPP6yYmBh9/vnnev/99zVo0CBJ0ty5czV69GhlZ2friSee0KFDhzRz5kxdcMEFWrt2rfeYknTs2DFlZ2frggsu0NNPP62mTZvWeH47d+5Unz59VFhYqHHjxqlz58768ccf9eabb+rQoUOKiYlRQUGB+vXrp0OHDumOO+7Q6aefrj//+c+67LLL9Oabb+qXv/ylzz4ff/xxRUVF6Z577lFRUZGefPJJXX/99fr888+9bZYtW6Zf/OIXatWqle68806lpqZq/fr1euedd3TnnXdKkv7973/r/PPPV+vWrXXfffepWbNmeuONNzR8+HC99dZbVY57++2367TTTtOkSZO0detWTZ8+XTk5OZo/f74kafr06br99tvVvHlzPfDAA5KklJQUn33cdtttatmypSZOnKiSkhJJxycr/vTTTzVy5EidccYZ2rp1q2bOnKmBAwfq22+/VdOmTXXhhRfqjjvu0B/+8Af9/ve/V5cuXSTJ+9+THT58WAMHDtT333+vnJwctW/fXgsWLNCNN96owsJC73NQYd68eTpw4IB+/etfy+Vy6cknn9QVV1yh//znP2rcuHGNr+9//vMfLVq0SFdffbXat2+vgoIC/fGPf9SAAQP07bffKi0tTV26dNHDDz+siRMnaty4cerfv78kqV+/ftXu81S/E0VFRTp69GiNfaoQGxur5s2bS5LWrl0rSerdu7dPm7S0NJ1xxhnexwEnIFfIFafnyoUXXqi5c+fqhhtu0M9//nONGjVKktSxY0ft3LlTy5Yt09y5c6vs+9e//rXmzJmjMWPG6I477tCWLVv0wgsvaO3atfrkk098+rVx40Zde+21+vWvf62xY8fq7LPPrrHP/go2iyZPnqzc3FzdfPPN6tOnj4qLi7V69Wp9+eWX+vnPf65f//rXITv/TZs2acSIEbrllls0evRozZ49W1dffbWWLFmin//85371B2iovv76aw0aNEgtW7bU5MmTdezYMU2aNKnK+/fJrrjiCiUkJOjuu+/Wtddeq0svvVTNmzdXSkqKWrdurccee0x33HGHzjvvPO++As2d6jIjkLwuLy9Xdna2MjMz9fTTT+u9997TM888o44dO+rWW2/1trvppps0Z84cDRkyRDfffLOOHTumjz76SJ999pn3PfDRRx/VQw89pGuuuUY333yz9uzZo+eff14XXnih1q5dW+toQH9yrqbns1mzZioqKtIPP/ygZ599VpK8nxk8Ho8uu+wyffzxxxo3bpy6dOmir7/+Ws8++6y+++67KjdHqenvqWDUlBUZGRmKiorS2rVr9b//+781bn/LLbfozTffVE5Ojrp27ap9+/bp448/1vr163XuuefqgQceCNn5r1y5UvPnz9cdd9wht9utF198UYMHD9aqVavUrVs3v/oDSGJkYU1q+xZakomKijL//ve/qzx26NAhn5/LyspMt27dzMUXX+xdt2nTJhMVFWV++ctfmvLycp/2Ho/HGGPMgQMHTEJCghk7dqzP4/n5+SY+Pt5nfcU3W/fdd59f5zZq1CgTFRVV5VukE49/1113GUnmo48+8j524MAB0759e9OuXTtvvytGgHTp0sVn9Mhzzz1nJJmvv/7aGGPMsWPHTPv27U3btm3Nf//732qPaYwxl1xyienevbvPtyQej8f069fPnHnmmd51Fd/EZWVl+Wx/9913m+joaFNYWOhdV9PcUhX7uOCCC6p883by62iMMXl5eUaS+ctf/uJdV9vcUiePAJk+fbqRZP76179615WVlZm+ffua5s2bm+LiYmNM5QiQ008/3Wdkwdtvv20kmX/+859VjnWiI0eOVPl3tWXLFuN2u83DDz/sXRfKOQur+zasuqXiW9oT91fdN5XnnXee+Z//+R+/+gXUF+QKuXIyp+WKMZWjGk5U02iNjz76yEgyr732ms/6JUuWVFlfMaJzyZIltfa1OrX97gWbRT179jRDhw6ttU0oz//EkYRFRUWmVatW5mc/+1lA/QEaouHDh5vY2Fizbds277pvv/3WREdH1zqy0Bjf0dknqsirk0f7B5o7J2eGlbw++b34Zz/7mcnIyPD+/P777xtJ5o477qjy3FRk3tatW010dLR59NFHfR7/+uuvTaNGjaqsP5m/OVfT81nTnH1z5841UVFRPn8/GFM5h+Ann3ziXVfb31OnUtvIwvHjx5vo6OhqH2vZsqUZOXJkrfuOj4+vko0nC9X5SzKrV6/2rtu2bZuJjY01v/zlLwPqD8DdkC0aMGCAunbtWmX9iXPn/Pe//1VRUZH69++vL7/80rt+0aJF8ng8mjhxoqKifF+CijswLVu2TIWFhbr22mu1d+9e7xIdHa3MzEx98MEHVY594jdHNfF4PFq0aJGGDRtW5ZuRE4+/ePFi9enTRxdccIH3sebNm2vcuHHaunWrvv32W5/txowZ4zOXUsVItf/85z+Sjn8bs2XLFt11111VvpGqOOb+/fv1/vvv65prrtGBAwe857xv3z5lZ2dr06ZN+vHHH322HTdunM9dq/r376/y8nJt27btlM9FhbFjxyo6Otpn3Ymv49GjR7Vv3z516tRJCQkJPq9lIBYvXqzU1FRde+213nWNGzfWHXfcoYMHD2rlypU+7UeMGOEz98XJz2lN3G63999VeXm59u3bp+bNm+vss8+23PdTeeaZZ7Rs2bJTLr/73e+82xw+fNjb35PFxsZ6HwcaCnKFXAlUfc+VBQsWKD4+Xj//+c99/k1mZGSoefPmVf5Ntm/fXtnZ2ZaPV51gsyghIUH//ve/tWnTpoCPHej5p6Wl+YxIiouL06hRo7R27Vrl5+cH3R/AqcrLy7V06VINHz5cbdq08a7v0qVLyN9TrOTOyZlhJa9vueUWn5/79+/v897+1ltvyeVyadKkSVW2rci8v//97/J4PLrmmmt8jpuamqozzzyz2uOeKBw5Jx1/r+zSpYs6d+7s06+LL75Ykqr0q6a/p4Jx+PDhGucN9jcrPv/8c+3cuTPgYwd6/n379lVGRob35zZt2ujyyy/X0qVLVV5eHnR/0HBwGbJF7du3r3b9O++8o0ceeUTr1q1TaWmpd/2JHzw2b96sqKioWt/EKv7Iq3gTOFlcXJzPz40aNdIZZ5xxyn7v2bNHxcXF3iHINdm2bZsyMzOrrK+4FGrbtm0++zgxeCV5P4z897//lXT8nCXVetzvv/9exhg99NBDeuihh6pts3v3brVu3drv4/qjutfy8OHDys3N1ezZs/Xjjz/KGON9rKioyO99n2jbtm0688wzq3yQP/E5PZHVc/N4PHruuef04osvasuWLd5QkKTTTz/dUt9P5cRA8lfFHxQn/p5UqG3SesCpyBVyJVD1PVc2bdqkoqIiJScnV/t4xc0DKtT0OxKMYLPo4Ycf1uWXX66zzjpL3bp10+DBg3XDDTeoR48epzx2oOffqVMnn997STrrrLMkSVu3blVqampQ/QGcas+ePTp8+LDOPPPMKo+dffbZWrx4cciOZSV3Tn5vCzSvY2NjfaY1kY6/v5/43r5582alpaUpMTGxxr5v2rRJxphqnydJtU5XIYUn5yr6tX79+irnWMGurCgrK6v2MX+y4sknn9To0aOVnp6ujIwMXXrppRo1apQ6dOhwymMHev7VvX5nnXWWDh06pD179ig1NTWo/qDhoFhoUXVvCB999JEuu+wyXXjhhXrxxRfVqlUrNW7cWLNnz9a8efMC2r/H45F0fL6K1NTUKo9X3K2vwonf+teFk0dQVDgxJE6l4pzvueeeGr/l69SpU8iPW91refvtt2v27Nm666671LdvX8XHx8vlcmnkyJHefoab1XN77LHH9NBDD+lXv/qVpk6dqsTEREVFRemuu+4KW9/3799fY4CeqEmTJoqPj5cktWrVSpK0a9cupaen+7TbtWuX+vTpE/qOAhGMXPFFroRepOWKx+NRcnKyXnvttWofP/mDUTi+RAo2iy688EJt3rxZb7/9tv71r3/pT3/6k5599lnNmjVLN998c63bBnr+/gimPwCCZyV3Tn5vCzSva3pvD5TH45HL5dL//d//VbvPijn0ahKunPN4POrevbumTZtW7eMnv3eHKyvKy8u1e/duny94ysrKtG/fPqWlpdW6/TXXXKP+/ftr4cKF+te//qWnnnpKTzzxhP7+979ryJAhtW4b6Pn7I5j+oOGgWFiDk7+59cdbb72l2NhYLV261OdyltmzZ/u069ixozwej7799lv16tWr2n117NhRkpScnKysrKyA+1KTli1bKi4uTt98802t7dq2bauNGzdWWb9hwwbv44GoOJ9vvvmmxvOp+CajcePGIT1nK6/lm2++qdGjR+uZZ57xrjty5IgKCwst77tt27b66quv5PF4fD6AW31Oa/Lmm2/qoosu0iuvvOKzvrCw0HtTBSnw56W29ldccUWVy92qM3r0aM2ZM0eSvP/2V69e7fNhbOfOnfrhhx80bty4gPoHRDpyhVxxeq7UpKZz6tixo9577z2df/75dTaaPBRZlJiYqDFjxmjMmDE6ePCgLrzwQk2ePNlbnAvV+VeMWDpxf999950k+Uzgf6r+AA1Ny5Yt1aRJk2ovz68ul4IRitwJR1537NhRS5cu1f79+2scXdixY0cZY9S+fXvvqOVA+JtzNantvfL//b//p0suucRS/obCiVlx6aWXetevXr1aHo+nxr+9TtSqVSvddtttuu2227R7926de+65evTRR73FuVCdf3X/zr/77js1bdrU50uoU/UHYM7CGjRr1kyS/H5zk45/q+NyuXwuz9m6dWuVOxQNHz5cUVFRevjhh6t8y1Lx7X52drbi4uL02GOPVXuX2T179vjdrxNFRUVp+PDh+uc//6nVq1dXebzi+JdeeqlWrVqlvLw872MlJSV66aWX1K5du4DngTj33HPVvn17TZ8+vcpzWnHM5ORkDRw4UH/84x+1a9euKvuwes7NmjUL6HWUjr+WJ4+0eP75531e24p9S/79O7n00kuVn5/vvaOmdPxuo88//7yaN2+uAQMGBNTHmlTX9wULFlSZHyXQf+O1tbcyZ+E555yjzp0766WXXvJ5XmfOnCmXy6WrrrrKr34B9QW5Qq44PVdqUtM5XXPNNSovL9fUqVOrbHPs2LGAn2Mrgs2iffv2+fzcvHlzderUyeey5lCd/86dO7Vw4ULvz8XFxfrLX/6iXr16eUcf+dMfoKGJjo5Wdna2Fi1apO3bt3vXr1+/XkuXLg3psUKRO+HI6yuvvFLGGE2ZMqXKYxXv71dccYWio6M1ZcqUKu/5xpgq7y8n8zfnalJxR+STXXPNNfrxxx/18ssvV3ns8OHD3jtIh9PFF1+sxMREzZw502f9zJkz1bRpUw0dOrTGbcvLy6ucV3JystLS0qpkRSjOPy8vz2eOyB07dujtt9/WoEGDFB0d7Xd/AEYW1qBiDrYHHnhAI0eOVOPGjTVs2DDvH3zVGTp0qKZNm6bBgwfruuuu0+7duzVjxgx16tRJX331lbddp06d9MADD2jq1Knq37+/rrjiCrndbn3xxRdKS0tTbm6u4uLiNHPmTN1www0699xzNXLkSLVs2VLbt2/Xu+++q/PPP18vvPCCpXN77LHH9K9//UsDBgzw3n59165dWrBggT7++GMlJCTovvvu09/+9jcNGTJEd9xxhxITE/XnP/9ZW7Zs0VtvvRXwpWlRUVGaOXOmhg0bpl69emnMmDFq1aqVNmzYoH//+9/eoJ4xY4YuuOACde/eXWPHjlWHDh1UUFCgvLw8/fDDD/p//+//BXy+GRkZmjlzph555BF16tRJycnJNc4BUuEXv/iF5s6dq/j4eHXt2lV5eXl67733qszN1KtXL0VHR+uJJ55QUVGR3G63Lr744mrnHxo3bpz++Mc/6sYbb9SaNWvUrl07vfnmm/rkk080ffp0tWjRIuBzq6nvDz/8sMaMGaN+/frp66+/1muvvVZlDoqOHTsqISFBs2bNUosWLdSsWTNlZmbWOM9Hbb8TVuYslKSnnnpKl112mQYNGqSRI0fqm2++0QsvvKCbb77ZO+cW4BTkCrni9FypScW//TvuuEPZ2dmKjo7WyJEjNWDAAP36179Wbm6u1q1bp0GDBqlx48batGmTFixYoOeee87yF0dFRUV6/vnnJUmffPKJJOmFF15QQkKCEhISlJOT420bTBZ17dpVAwcOVEZGhhITE7V69Wq9+eabPvsP1fmfddZZuummm/TFF18oJSVFr776qgoKCnxGGvvTH6AhmjJlipYsWaL+/fvrtttu836xcs455/jkaSgEmzvhyOuLLrpIN9xwg/7whz9o06ZNGjx4sDwejz766CNddNFFysnJUceOHfXII4/o/vvv19atWzV8+HC1aNFCW7Zs0cKFCzVu3Djdc889NR7D35yrSUZGhubPn68JEybovPPOU/PmzTVs2DDdcMMNeuONN3TLLbfogw8+0Pnnn6/y8nJt2LBBb7zxhpYuXVrtDdb8sW3bNs2dO1eSvF94PvLII5KOj86/4YYbJB2/tHnq1KkaP368rr76amVnZ+ujjz7SX//6Vz366KO1zgV54MABnXHGGbrqqqvUs2dPNW/eXO+9956++OILn1GYoTr/bt26KTs7W3fccYfcbrdefPFFSfIWiv3tD1D9vcFh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586duuKKK0LecQCobzxyyWMsLFyyFTbkGgBYZynXyLSwIdMAIEguV+CFQpczcy2gy5CXLFni8/OcOXOUnJysNWvW6MILL1RRUZFeeeUVzZs3TxdffLEkafbs2erSpYs+++wz/c///E/oeg4A9YyxOGeh4YNV2JBrAGCdlVwj08KHTAOAIHEZsldQZ1VUVCRJSkxMlCStWbNGR48eVVZWlrdN586d1aZNG+Xl5VW7j9LSUhUXF/ssAADUBXINAOAUocg0iVwDgIbIcrHQ4/Horrvu0vnnn69u3bpJkvLz8xUTE6OEhASftikpKcrPz692P7m5uYqPj/cu6enpVrsEABHN0iXIPy0IP3INAAJDpkWuUGWaRK4BaECYs9DL8lmNHz9e33zzjV5//fWgOnD//ferqKjIu+zYsSOo/QFApOIGJ5GNXAOAwJBpkStUmSaRawAaEIqFXgHNWVghJydH77zzjj788EOdccYZ3vWpqakqKytTYWGhzzdWBQUFSk1NrXZfbrdbbrfbSjcAoF6xOqKCURjhR64BQOCs5BqZFn6hzDSJXAPQgDBnoVdAZ2WMUU5OjhYuXKj3339f7du393k8IyNDjRs31vLly73rNm7cqO3bt6tv376h6TEA1FOenyaCt7IgPMg1ALCOTIssZBoABImRhV4BjSwcP3685s2bp7ffflstWrTwzm0RHx+vJk2aKD4+XjfddJMmTJigxMRExcXF6fbbb1ffvn25uxaABo+RhZGHXAMA6xhZGFnINAAIEiMLvQIqFs6cOVOSNHDgQJ/1s2fP1o033ihJevbZZxUVFaUrr7xSpaWlys7O1osvvhiSzgIAEErkGgDAKcg0AECoBFQsNMacsk1sbKxmzJihGTNmWO4UADgRIwsjD7kGANYxsjCykGkAECRGFnpZusEJACBwFAsBAE5CsRAA4CgUC72ceVYAEIEqPlRZWQAAiDRkGgDAUVyuwG9u4rKWazNmzFC7du0UGxurzMxMrVq1qsa2L7/8svr376/TTjtNp512mrKysmptHwoUCwHAJkbW7hx56ouKAACwn5VcI9MAABHLprshz58/XxMmTNCkSZP05ZdfqmfPnsrOztbu3burbb9ixQpde+21+uCDD5SXl6f09HQNGjRIP/74Y7BnXCOKhQAAAAAAAIANpk2bprFjx2rMmDHq2rWrZs2apaZNm+rVV1+ttv1rr72m2267Tb169VLnzp31pz/9SR6PR8uXLw9bHykWAoBNuAwZAOAkZBoAwFFsGFlYVlamNWvWKCsr64TDRikrK0t5eXl+7ePQoUM6evSoEhMTAzp2ILjBCQDYhBucAACchBucAAAcJYgbnBQXF/usdrvdcrvdVZrv3btX5eXlSklJ8VmfkpKiDRs2+HXIe++9V2lpaT4Fx1BjZCEA2ISRhQAAJyHTAACOEsTIwvT0dMXHx3uX3NzcsHTx8ccf1+uvv66FCxcqNjY2LMeQGFkIALZhZCEAwEkYWQgAcJQgRhbu2LFDcXFx3tXVjSqUpKSkJEVHR6ugoMBnfUFBgVJTU2s91NNPP63HH39c7733nnr06BFYPwPEyEIAsIkxLssLAACRhkwDADhKECML4+LifJaaioUxMTHKyMjwuTlJxc1K+vbtW2PXnnzySU2dOlVLlixR7969Q3ve1WBkIQAAAAAAAGCDCRMmaPTo0erdu7f69Omj6dOnq6SkRGPGjJEkjRo1Sq1bt/ZeyvzEE09o4sSJmjdvntq1a6f8/HxJUvPmzdW8efOw9JFiIQDYxCOXPLJwGbKFbQAACDcruUamAQAiVhCXIQdixIgR2rNnjyZOnKj8/Hz16tVLS5Ys8d70ZPv27Yo6Yb8zZ85UWVmZrrrqKp/9TJo0SZMnTw74+P6gWAgANmHOQgCAkzBnIQDAUWwqFkpSTk6OcnJyqn1sxYoVPj9v3brV0jGCQbEQAGxida4m5ncCAEQiK7lGpgEAIpbLFXjxz+XMXKNYCAA2YWQhAMBJGFkIAHAUG0cWRjqKhQBgE0YWAgCchJGFAABHoVjo5cyzAgAAAAAAABAwRhYCgE2MxcuQGYUBAIhEVnKNTAOAyGYCuGu9SyaMPakDjCz0olgIADYxkoyFPHVYBAMAHMJKrpFpAICIRbHQi2IhANjEI5dcAXxTd+J2AABEGiu5RqYBACIWxUIvioUAYBNucAIAcBJucAIAcBSKhV4UCwHAJh7jksvChyQr8xwCABBuVnKNTAMARCyKhV7OPCsAAAAAAAAAAWNkIQDYxBiLNzhhNngAQASykmtkGgAgYjGy0ItiIQDYhDkLAQBOwpyFAABHoVjoRbEQAGxCsRAA4CQUCwEAjuJyBV78czkz1ygWAoBNuMEJAMBJuMEJAMBRGFnoRbEQAGzCnIUAACdhzkIAgKNQLPSiWIgGJ6pJE/8aBjCc2JSW+t+2vNzvtgAA1MbVqLHfbaOaxPrdNpCsIgMBAKFy9Jj/n8EaRwWQKUeO+NcuJsb/fTZyZjnFJb7VAcVCALDN8REYVuYsDENnAAAIkpVcI9MAABGLkYVeFAsBwCbc4AQA4CTc4AQA4CgUC70oFgKATcxPi5XtAACINFZyjUwDAEQsioVeFAsBwCaMLAQAOAkjCwEAjkKx0MuZZwUAkcgEsQRoxowZateunWJjY5WZmalVq1bV2r6wsFDjx49Xq1at5Ha7ddZZZ2nx4sWBHxgA0HDYlGkSuQYAsEFFsTDQxYEYWQgADjN//nxNmDBBs2bNUmZmpqZPn67s7Gxt3LhRycnJVdqXlZXp5z//uZKTk/Xmm2+qdevW2rZtmxISEuzvPAAAJyHXAACwF8VCALCLxcuQFeA206ZN09ixYzVmzBhJ0qxZs/Tuu+/q1Vdf1X333Vel/auvvqr9+/fr008/VePGjSVJ7dq1C7yfAICGxUquWchBcg0AYAsuQ/Zy5lkBQAQyxvoiScXFxT5LaWlplWOUlZVpzZo1ysrK8q6LiopSVlaW8vLyqu3XP/7xD/Xt21fjx49XSkqKunXrpscee0zl5eVheR4AAM4Q7kyTyDUAgI1crsAvQXY5cy5eioUAYJOKieCtLJKUnp6u+Ph475Kbm1vlGHv37lV5eblSUlJ81qekpCg/P7/afv3nP//Rm2++qfLyci1evFgPPfSQnnnmGT3yyCOhfxIAAI4R7kyTyDUAgI2Ys9CLy5ABwC7GZenyq4ptduzYobi4OO9qt9sdkm55PB4lJyfrpZdeUnR0tDIyMvTjjz/qqaee0qRJk0JyDACAA1nJtTBnmkSuAQAs4jJkL4qFAGCTEy+/CnQ7SYqLi/P5YFWdpKQkRUdHq6CgwGd9QUGBUlNTq92mVatWaty4saKjo73runTpovz8fJWVlSkmJibwTgMAHM9KrgWSaRK5BgCwEcVCL4qFiFhRgfwhd04nv5se6HjqP0wlydPY/8M333HE77aNvtnqd9vywkL/OwFIiomJUUZGhpYvX67hw4dLOj7CYvny5crJyal2m/PPP1/z5s2Tx+NR1E9h991336lVq1Z8oALqQKPkln63PdKjrd9tD7b2P9galfpfAYrbWOx3W9eGLX618xypfv66ahmP/21R75BrQGQ6cND/UcU//OD/fps29b9t2yT/P4Npwwb/2/rrrLP8bxvIiTm0+IT6hX+FAGAXE8QSgAkTJujll1/Wn//8Z61fv1633nqrSkpKvHeRHDVqlO6//35v+1tvvVX79+/XnXfeqe+++07vvvuuHnvsMY0fPz648wUAOJsNmSaRawAAmzBnoRcjCwHAJidO7B7odoEYMWKE9uzZo4kTJyo/P1+9evXSkiVLvJPDb9++3TvSQjo+yfzSpUt19913q0ePHmrdurXuvPNO3XvvvQH3FQDQcFjJNSs5SK4BAGzBZcheFAsBwE4WRlRYkZOTU+PlWStWrKiyrm/fvvrss8/C3CsAgOOQawAAp6BY6EWxEABsYtfIQgAA7GDXyEIAAGxBsdCLYiEA2MXiXE12jdoAACAgVnKNTAMARCqKhV7OPCsAAAAAAAAAAQu4WPjhhx9q2LBhSktLk8vl0qJFi3wev/HGG+VyuXyWwYMHh6q/AFCPuYJYEA5kGgAEg0yLNOQaAATB5Qr8TsguZ+ZawMXCkpIS9ezZUzNmzKixzeDBg7Vr1y7v8re//S2oTgKAI5ggFoQFmQYAQSDTIg65BgBBCLRQaOWy5Xoi4DkLhwwZoiFDhtTaxu12KzU11XKnAMCRmLMw4pBpABAE5iyMOOQaAASBOQu9wnJWK1asUHJyss4++2zdeuut2rdvX41tS0tLVVxc7LMAgCMZl/UFdSaQTJPINQANCJlWL5FrAFADRhZ6hfxuyIMHD9YVV1yh9u3ba/Pmzfr973+vIUOGKC8vT9HR0VXa5+bmasqUKaHuBhzA1bmj3223XZrgd9vGff7rV7tG0R6/97l93el+t23jau9326i8b/xua44d9bst6oYxxxcr26FuBJppErmGmkU1bepXu5I+/ufE9qv8z6rEpP1+ty0sifW77cHPE/xue8b+JP8a7qm9eHEiz+EjfreV8f/5wqlZyTUyrW6RaziVo8f8K+h/+63/+9ywwf+2/fr531Z+5qokaedO/9rl5/u/z+bN/W8byGjeQPbr0EJVnWFkoVfIi4UjR470/n/37t3Vo0cPdezYUStWrNAll1xSpf3999+vCRMmeH8uLi5Wenp6qLsFAEDAAs00iVwDAEQucg0A4I+wl0A7dOigpKQkff/999U+7na7FRcX57MAgCNxg5N671SZJpFrABoQMq3eI9cA4ARchuwV8pGFJ/vhhx+0b98+tWrVKtyHAoDIZnWuJuZ3ihhkGgCcwEqukWkRhVwDgBNwGbJXwMXCgwcP+nzztGXLFq1bt06JiYlKTEzUlClTdOWVVyo1NVWbN2/W7373O3Xq1EnZ2dkh7TgA1Dcuc3yxsh3Cg0wDAOus5BqZFl7kGgAEgWKhV8DFwtWrV+uiiy7y/lwxf8Xo0aM1c+ZMffXVV/rzn/+swsJCpaWladCgQZo6darcbnfoeg0A9ZHVy6/4YBU2ZBoABMFKrpFpYUWuAUAQKBZ6BVwsHDhwoEwttzFbunRpUB0CAMfiMuSIQ6YBQBC4DDnikGsAEASXK/Din8uZuebMEigAAAAAAACAgIX9BicAgJ9wGTIAwEm4DBkA4CRchuxFsRAA7EKxEADgJBQLAQBOQrHQi2IhANiFYiEAwEkoFgIAnIRioRfFQgCwCzc4AQA4CTc4AQA4CcVCL4qFsJWrUWO/2x7sGOd326jeRX63fbnHXL/aNXaV+73PX7v+1++2xRuT/G6b+FVTv9uWF/n/HKBuuMzxxcp2AOq/qMTT/Gq3/2z//zz7de9lfrfNav6t322/PNzW77aPFQ/1u215SoJf7aKKDvi9T1dpqd9tjf/RDj9YyTUyDYhshw75127rVv/3GUjbbt38b2vk/5cPrv37/Wv4ww/+d2DvXv/bJiT437ap/58B/S1UBfRcNeQh4BQLvZx5VgAAAAAAAEAEmjFjhtq1a6fY2FhlZmZq1apVtbZfsGCBOnfurNjYWHXv3l2LFy8Oa/8oFgKAXUwQCwAAkYZMAwA4ScXIwkCXAM2fP18TJkzQpEmT9OWXX6pnz57Kzs7W7t27q23/6aef6tprr9VNN92ktWvXavjw4Ro+fLi++eabYM+4RhQLAQAAAAAA0LDZVCycNm2axo4dqzFjxqhr166aNWuWmjZtqldffbXa9s8995wGDx6s3/72t+rSpYumTp2qc889Vy+88EKwZ1wjioUAYBOXKud3Cmip644DAFANS7lW150GAKAmQRQLi4uLfZbSGuZULisr05o1a5SVlXXCYaOUlZWlvLy8arfJy8vzaS9J2dnZNbYPBYqFAGCXirtGWlkAAIg0ZBoAwEGMXJYWSUpPT1d8fLx3yc3NrfYYe/fuVXl5uVJSUnzWp6SkKD8/v9pt8vPzA2ofCtwNGQDsYnWuJuZ3AgBEIiu5RqYBACKUx3N8CXQbSdqxY4fi4uK8691udwh7Zj+KhQAAAAAAAIBFcXFxPsXCmiQlJSk6OloFBQU+6wsKCpSamlrtNqmpqQG1DwUuQwYAu3A3ZACAk5BpAAAHqRhZGOgSiJiYGGVkZGj58uUnHNej5cuXq2/fvtVu07dvX5/2krRs2bIa24cCIwsBwCYVk7tb2Q4AgEhjJdfINABApArmMuRATJgwQaNHj1bv3r3Vp08fTZ8+XSUlJRozZowkadSoUWrdurV33sM777xTAwYM0DPPPKOhQ4fq9ddf1+rVq/XSSy8FfnA/USwEALswZyEAwEmYsxAA4CB2FQtHjBihPXv2aOLEicrPz1evXr20ZMkS701Mtm/frqioyguB+/Xrp3nz5unBBx/U73//e5155platGiRunXrFvjB/USxEADsQrEQAOAkFAsBAA5iV7FQknJycpSTk1PtYytWrKiy7uqrr9bVV19t7WAWUCwEAJtwGTIAwEm4DBkA4CR2FgsjHTc4AQAAAAAAACCJkYUAYB/jOr5Y2Q4AgEhjJdfINABAhGJkYSWKhQBgF+YsBAA4CXMWAgAchGJhJYqFAGAT5iwEADgJcxYCAJzEmMCLf8ahuUaxEADswshCAICTMLIQAOAgjCysxA1OAAAAAAAAAEhiZCEA2MfiZciMwgAARCQruUamAQAiFCMLK1EsBAC7cBkyAMBJuAwZAOAgFAsrUSwEALtQLAQAOAnFQgCAg1AsrESxELYyx4763bb55mK/2+5bfZrfbcdG3eBXu0bR/v/WH1x3ut9t22w97HdbT8khv9si8nE3ZKBh8+z/r1/tEje29nuff1w9wO+2C5LO9bvtgZJYv9vGrW/sd9vogny/2nnKyvzep/HwJllXuBsy4DxNm/rXrl07//d55Ij/bePi/G/rCuTbh8RE/9oFkD9KSvK/baz/uaqo0N9aIqDnqgGjWFiJYiEAAAAAAAAaNIqFlbgbMgAAAAAAAABJjCwEAPswZyEAwEmYsxAA4CCMLKxEsRAAbMKchQAAJ2HOQgCAk1AsrESxEADsxIckAICTkGsAAIcwJvDin3FoDlIsBAC7cBkyAMBJuAwZAOAgjCysRLEQAGzCZcgAACfhMmQAgJNQLKzE3ZABAAAAAAAASGJkIQDYh8uQAQBOwmXIAAAHYWRhJUYWAoBNKi7XsrIEasaMGWrXrp1iY2OVmZmpVatW+bXd66+/LpfLpeHDhwd+UABAg2JXpknkGgAg/CqKhYEuTkSxEADsYoJYAjB//nxNmDBBkyZN0pdffqmePXsqOztbu3fvrnW7rVu36p577lH//v0DOyAAoGGyIdMkcg0AYA+KhZW4DBkRy2zY7HfbNtGd/G57YGO8X+08jf3epdrsOOR320bfbPW7bfmxo/53ApHPpsuQp02bprFjx2rMmDGSpFmzZundd9/Vq6++qvvuu6/abcrLy3X99ddrypQp+uijj1RYWGihowBq4znkX1Y0W7XF7322P9LW77YHWyf63Tap1P83nriNhX639eze61+7I6V+71PGoX+l1wc2XYZMrgH2adzIv1/Srl1dfu8zLs7/48fE+N9WfuaqJCktLbTtAm3btKn/baMY01VXuAy5Ev8KAcAmwV6GXFxc7LOUllb9MF1WVqY1a9YoKyvLuy4qKkpZWVnKy8ursW8PP/ywkpOTddNNN4X8vAEAzhTuTJPINQCAfRhZWIliIQDUE+np6YqPj/cuubm5Vdrs3btX5eXlSklJ8VmfkpKi/Pz8avf78ccf65VXXtHLL78cln4DAHAyfzJNItcAAKgLXIYMAHYJ8jLkHTt2KO6E6zjcbnfQXTpw4IBuuOEGvfzyy0pKSgp6fwCABiSIy5DDkWkSuQYAsI7LkCtRLAQAuwRZLIyLi/P5YFWdpKQkRUdHq6CgwGd9QUGBUlNTq7TfvHmztm7dqmHDhnnXeX5KvEaNGmnjxo3q2LGjhU4DABwviGKhP5kmkWsAAPsYE3jxz1j5fFcPcBkyANgk2DkL/RETE6OMjAwtX77cu87j8Wj58uXq27dvlfadO3fW119/rXXr1nmXyy67TBdddJHWrVun9PT0UJw6AMCBwp1pErkGALAPcxZWYmQhANjFprshT5gwQaNHj1bv3r3Vp08fTZ8+XSUlJd67SI4aNUqtW7dWbm6uYmNj1a1bN5/tExISJKnKegAAfNh0N2RyDQBgBy5DrhTwyMIPP/xQw4YNU1pamlwulxYtWuTzuDFGEydOVKtWrdSkSRNlZWVp06ZNoeovANRbdowslKQRI0bo6aef1sSJE9WrVy+tW7dOS5Ys8U4Ov337du3atSsMZ1j/kGkAYJ0dmSaRa4Eg1wDAOkYWVgq4WFhSUqKePXtqxowZ1T7+5JNP6g9/+INmzZqlzz//XM2aNVN2draOHDkSdGcBAP7JycnRtm3bVFpaqs8//1yZmZnex1asWKE5c+bUuO2cOXOqfLhwKjINAOoHcs0/5BoAIBQCvgx5yJAhGjJkSLWPGWM0ffp0Pfjgg7r88sslSX/5y1+UkpKiRYsWaeTIkcH1FgDqM5suQ4b/yDQACIJNlyHDf+QaAFjHZciVQnqDky1btig/P19ZWVnedfHx8crMzFReXl6125SWlqq4uNhnAQBHMkEssJ2VTJPINQANCJlWr5BrAFA7LkOuFNIbnOTn50uSd/6QCikpKd7HTpabm6spU6aEshtwCE9Zmf+N137rd9MWG5r419Dl8nufprTU77bl5eV+t4WzuH5arGwH+1nJNIlcQ/CO7d7jd9vGKwr9bnt6k1i/25oAsiqQDAxkv4h8VnKNTKs75BpCqUVz/yv/nTv7/5t/7FgAnYjyP9fUubN/7WJi/N9nI+4X6zSMLKwU0pGFVtx///0qKiryLjt27KjrLgFAeDCysEEg1wA0GGRag0CuAWgoGFlYKaSl8NTUVElSQUGBWrVq5V1fUFCgXr16VbuN2+2W2+0OZTcAICJZvQuklW0QPCuZJpFrABoOK7lGptUdcg0AasfIwkohHVnYvn17paamavny5d51xcXF+vzzz9W3b99QHgoAgLAi0wAATkKuAQD8FfDIwoMHD+r777/3/rxlyxatW7dOiYmJatOmje666y498sgjOvPMM9W+fXs99NBDSktL0/Dhw0PZbwCof7gbcsQh0wAgCNwNOeKQawBgnTGBjxQ0Ds21gIuFq1ev1kUXXeT9ecKECZKk0aNHa86cOfrd736nkpISjRs3ToWFhbrgggu0ZMkSxcYGMPkoADiVQ8OkviLTACBI5FpEIdcAwDouQ64UcLFw4MCBMrWUTl0ulx5++GE9/PDDQXUMAJyGOQsjD5kGANYxZ2HkIdcAwDqKhZW41zcA2IXLkAEATsJlyAAAB6FYWIliIQDYhJGFAAAnYWQhAMBJKBZWCundkAEAAAAAAADUX4wsBAC7cBkyAMBJuAwZAOAgjCysRLEQAGzCZcgAACfhMmQAgJNQLKxEsRANjufw4bruAhoqRhYCCDFz7KjfbcsP+N8W8AsjCwGEWONGgbxJBDCrWtOmAfeloTJy+d3W5bA3dYqFlSgWAoBdKBYCAJyEYiEAwEEoFlaiWAgANuEyZACAk3AZMgDASSgWVuJuyAAAAAAAAAAkMbIQAOzDZcgAACfhMmQAgIMYE/hIQePQXGNkIQDYxGWM5QUAgEhDpgEAnKTiMuRAl3DZv3+/rr/+esXFxSkhIUE33XSTDh48WGv722+/XWeffbaaNGmiNm3a6I477lBRUVHAx2ZkIQDYhZGFAAAnYWQhAMBBIm3Owuuvv167du3SsmXLdPToUY0ZM0bjxo3TvHnzqm2/c+dO7dy5U08//bS6du2qbdu26ZZbbtHOnTv15ptvBnRsioUAYBNucAIAcBJucAIAcJJIKhauX79eS5Ys0RdffKHevXtLkp5//nldeumlevrpp5WWllZlm27duumtt97y/tyxY0c9+uij+t///V8dO3ZMjRr5XwLkMmQAsIsJYgEAINKQaQAAB4mky5Dz8vKUkJDgLRRKUlZWlqKiovT555/7vZ+ioiLFxcUFVCiUGFkIAAAAAAAAWFZcXOzzs9vtltvttry//Px8JScn+6xr1KiREhMTlZ+f79c+9u7dq6lTp2rcuHEBH5+RhQBgk4rLtawsAABEGjINAOAkwYwsTE9PV3x8vHfJzc2t9hj33XefXC5XrcuGDRuCPpfi4mINHTpUXbt21eTJkwPenpGFAGAXbnACAHASbnACAI7jasBv1MHMWbhjxw7FxcV519c0qvA3v/mNbrzxxlr32aFDB6Wmpmr37t0+648dO6b9+/crNTW11u0PHDigwYMHq0WLFlq4cKEaN2586hM5CcVCALAJNzgBADgJNzgBADhJMMXCuLg4n2JhTVq2bKmWLVuesl3fvn1VWFioNWvWKCMjQ5L0/vvvy+PxKDMzs8btiouLlZ2dLbfbrX/84x+KjY3170ROwmXIAGAXbnACAHASMg0A4CCRdIOTLl26aPDgwRo7dqxWrVqlTz75RDk5ORo5cqT3Tsg//vijOnfurFWrVkk6XigcNGiQSkpK9Morr6i4uFj5+fnKz89XeXl5QMdnZCEA2IgRFQAAJyHXAABOYUzgxT8Txhx87bXXlJOTo0suuURRUVG68sor9Yc//MH7+NGjR7Vx40YdOnRIkvTll19675TcqVMnn31t2bJF7dq18/vYFAsBAAAAAACACJKYmKh58+bV+Hi7du1kTqhWDhw40OfnYFAsBAC7GGPtq6dwfl0FAIBVVnKNTAMARKhg5ix0GoqFAGATbnACAHASbnACAHASioWVKBYCgF2sTuzOBysAQCSykmtkGgAgQlEsrESxEABs4vIcX6xsBwBApLGSa2QaACBSUSysRLEQAOzCyEIAgJMwshAA4CAUCytF1XUHAAAAAAAAAEQGRhYCgE24wQkAwEm4wQkAwEkYWViJYiEA2MWY44uV7QAAiDRWco1MAwBEKIqFlSgWAoBNGFkIAHASRhYCAJyEYmElioUAYBducAIAcBJucAIAcBBjAi/+OXXAPMVCALAJIwsBAE7CyEIAgJMwsrASd0MGAAAAAAAAIImRhQBgH25wAgBwEm5wAgBwEEYWVqJYCAA24TJkAICTcBkyAMBJKBZWolgIAHbhBicAACfhBicAAAehWFiJYiEA2ISRhQAAJ2FkIQDASSgWVqJYCAB28Zjji5XtAACINFZyjUwDAEQoioWVuBsyAAAAAAAAAEmMLAQA+zBnIQDASZizEADgIIwsrESxEABs4pLFOQtD3hMAAIJnJdfINABApKJYWInLkAHALsZYXwI0Y8YMtWvXTrGxscrMzNSqVatqbPvyyy+rf//+Ou2003TaaacpKyur1vYAAEiyLdMkcg0AEH7GVBYM/V0sxlrEo1gIADapuGuklSUQ8+fP14QJEzRp0iR9+eWX6tmzp7Kzs7V79+5q269YsULXXnutPvjgA+Xl5Sk9PV2DBg3Sjz/+GIKzBgA4lR2ZJpFrAAB7BFootDISsb6gWAgADjNt2jSNHTtWY8aMUdeuXTVr1iw1bdpUr776arXtX3vtNd12223q1auXOnfurD/96U/yeDxavny5zT0HAKAqcg0AAHtRLAQAu5ggFj+VlZVpzZo1ysrK8q6LiopSVlaW8vLy/NrHoUOHdPToUSUmJvp/YABAwxPmTJPINQCAfRhZWIkbnACATVzGyGVhUouKbYqLi33Wu91uud1un3V79+5VeXm5UlJSfNanpKRow4YNfh3v3nvvVVpams8HMwAATmYl1wLJNIlcAwDYhxucVAr5yMLJkyfL5XL5LJ07dw71YQCg/vEEsUhKT09XfHy8d8nNzQ15Fx9//HG9/vrrWrhwoWJjY0O+//qIXAOAGkR4pknk2snINACoGSMLK4VlZOE555yj9957r/IgjRjACADBjizcsWOH4uLivOurG4GRlJSk6OhoFRQU+KwvKChQampqrcd5+umn9fjjj+u9995Tjx49Au6nk5FrAFBVMCML/ck0iVwLBzINAKrHyMJKYUmGRo0anTK8AaDBsTBXk3c7SXFxcT4frKoTExOjjIwMLV++XMOHD5ck76TuOTk5NW735JNP6tFHH9XSpUvVu3dvC510NnINAKphJdcCyDSJXAsHMg0AqkexsFJYbnCyadMmpaWlqUOHDrr++uu1ffv2GtuWlpaquLjYZwEAWDdhwgS9/PLL+vOf/6z169fr1ltvVUlJicaMGSNJGjVqlO6//35v+yeeeEIPPfSQXn31VbVr1075+fnKz8/XwYMH6+oUIg65BgB1h1wLrUAyTSLXAKAhCnmxMDMzU3PmzNGSJUs0c+ZMbdmyRf3799eBAweqbZ+bm+szX0l6enqouwQAkcEY60sARowYoaeffloTJ05Ur169tG7dOi1ZssQ7Ofz27du1a9cub/uZM2eqrKxMV111lVq1auVdnn766ZCefn1FrgFADWzINIlcC6VAM00i1wA0HMxZWMlljIXEDkBhYaHatm2radOm6aabbqryeGlpqUpLS70/FxcXKz09XQN1uRq5GoezawBQq2PmqFbobRUVFfl1qVRNiouLFR8frwH9HlKjRoFPrn7s2BGt/HRq0P1AaJBrAOqrSMg1Mi2ynCrTpJpzraiwkNcQfjFy+d3WZWnOHjRExcXFik9ICEmeVOTaNdcUKSYmsH2VlRXrjTfiHZdrYZ/NNiEhQWeddZa+//77ah93u901TmgMAI5icUSFpW0QNuQaAPzESq6RaRHlVJkmkWsAGg5jAh8p6NRYC8uchSc6ePCgNm/erFatWoX7UAAQ0Vwe6wsiB7kGAMeRafUfmQYAlbgMuVLIi4X33HOPVq5cqa1bt+rTTz/VL3/5S0VHR+vaa68N9aEAoH6xac5ChBa5BgA1INPqHTINAGpGsbBSyC9D/uGHH3Tttddq3759atmypS644AJ99tlnatmyZagPBQBA2JFrAACnINMAAP4IebHw9ddfD/UuAcAZzE+Lle1QZ8g1AKiBlVwj0+oUmQYANbMyUpCRhQCAoLiMkcvC5VdWtgEAINys5BqZBgCIVBQLK1EsBAC7cDdkAICTcDdkAICDUCysRLEQAOxiJFkJEz5XAQAikZVcI9MAABGKYmElioUAYBMuQwYAOAmXIQMAnIRiYaWouu4AAAAAAAAAgMjAyEIAsIuRxTkLQ94TAACCZyXXyDQAtTBy+d3WxRtKWDTk14CRhZUoFgKAXbjBCQDASbjBCQDAQYwJvPjn1FijWAgAdvFIAXxR57sdAACRxkqukWkAgAjFyMJKFAsBwCbc4AQA4CTc4AQA4CQUCytRLAQAu3AZMgDASbgMGQDgIBQLK3E3ZAAAAAAAAACSGFkIAPZhZCEAwEkYWQgAcBBGFlaiWAgAdqFYCABwEoqFAAAHoVhYiWIhANiFuyEDAJyEuyEDAByEYmElioUAYBPuhgwAcBLuhgwAcBKKhZW4wQkA2KXici0rCwAAkYZMAwA4SEWxMNAlXPbv36/rr79ecXFxSkhI0E033aSDBw/6ta0xRkOGDJHL5dKiRYsCPjbFQgAAAAAAEBYuGb8XAJWuv/56/fvf/9ayZcv0zjvv6MMPP9S4ceP82nb69OlyuazMgXUclyEDgF08RnJZ+CPIwx9OAIAIZCXXyDQAQIQyJvCRguEaML9+/XotWbJEX3zxhXr37i1Jev7553XppZfq6aefVlpaWo3brlu3Ts8884xWr16tVq1aWTo+IwsBwC5chgwAcBIyDQDgIMFchlxcXOyzlJaWBtWXvLw8JSQkeAuFkpSVlaWoqCh9/vnnNW536NAhXXfddZoxY4ZSU1MtH59iIQDYxuqHKj5YAQAiEZkGAHCOYIqF6enpio+P9y65ublB9SU/P1/Jyck+6xo1aqTExETl5+fXuN3dd9+tfv366fLLLw/q+FyGDAB2sTqiglEYAIBIZCXXyDQAQITyeKRAp/mrKBbu2LFDcXFx3vVut7va9vfdd5+eeOKJWve5fv36wDrxk3/84x96//33tXbtWkvbn4hiIQDYxWNxRAXzOwEAIpGVXCPTAAARKphiYVxcnE+xsCa/+c1vdOONN9bapkOHDkpNTdXu3bt91h87dkz79++v8fLi999/X5s3b1ZCQoLP+iuvvFL9+/fXihUrTtm/ChQLAQAAAAAAgDBr2bKlWrZsecp2ffv2VWFhodasWaOMjAxJx4uBHo9HmZmZ1W5z33336eabb/ZZ1717dz377LMaNmxYQP2kWAgAdjGe44uV7QAAiDRWco1MAwBEqGBGFoZaly5dNHjwYI0dO1azZs3S0aNHlZOTo5EjR3rvhPzjjz/qkksu0V/+8hf16dNHqamp1Y46bNOmjdq3bx/Q8SkWAoBdmLMQAOAkzFkIAHCQSCoWStJrr72mnJwcXXLJJYqKitKVV16pP/zhD97Hjx49qo0bN+rQoUMhPzbFQgCwC3MWAgCchDkLAQAOEmnFwsTERM2bN6/Gx9u1aydzii/hTvV4TSgWAoBdGFkIAHASRhYCABwk0oqFdYliIQDYxchisTDkPQEAIHhWco1MA1ALF28Sda4hvwbGBF78c+p3YFF13QEAAAAAAAAAkYGRhQBgFy5DBgA4CZchAwAcxMolxVyGDAAIjscjiQQCADiElVwj0wAAEYpiYSWKhQBgF0YWAgCchJGFAAAHoVhYiWIhANiFYiEAwEkoFgIAHIRiYSWKhQBgF4+RpdtAevhgBQCIQFZyjUwDAEQoioWVuBsyAAAAAAAAAEmMLAQA2xjjkTGBf/VkZRsAAMLNSq6RaQCASMXIwkoUCwHALsZYu/yK+Z0AAJHISq6RaQCACEWxsBLFQgCwi7E4ZyEfrAAAkchKrpFpAIAIRbGwEsVCALCLxyO5LKQJl2wBACKRlVwj0wAAEcqYwIt/Tv0OjGIhANiFkYUAACdhZCEAwEE8HsnlCmwbp8Yad0MGAAAAAAAAIImRhQBgG+PxyFi4DJk7RwIAIpGVXCPTAACRipGFlSgWAoBduAwZAOAkXIYMAHAQioWVKBYCgF08RnJRLAQAOISVXCPTAAARimJhJYqFAGAXYyRZuRuyQxMIAFC/Wck1Mg0AEKEoFlaiWAgANjEeI2NhZKFxagIBAOo1K7lGpgEAIhXFwkphuxvyjBkz1K5dO8XGxiozM1OrVq0K16EAACcJ9D14wYIF6ty5s2JjY9W9e3ctXrzYpp7WD2QaANQtci20yDUAQG3CUiycP3++JkyYoEmTJunLL79Uz549lZ2drd27d4fjcABQPxiP9SUAgb4Hf/rpp7r22mt10003ae3atRo+fLiGDx+ub775JhRnXe+RaQBQAxsyTSLXQo1cA4DqeTzWFidymTBcC5CZmanzzjtPL7zwgiTJ4/EoPT1dt99+u+67775aty0uLlZ8fLwG6nI1cjUOddcAwG/HzFGt0NsqKipSXFyc5f1439dcv7T0vnbMHNUKs9DvfgT6HjxixAiVlJTonXfe8a77n//5H/Xq1UuzZs0KuL9OE0ymSeQagMgRCbkWaKZJ5FqohSrXigoLg/p3BADBKC4uVnxCQtCZ5t1XfLxcriK5XIHty5hiGRMfkn5EkpDPWVhWVqY1a9bo/vvv966LiopSVlaW8vLyqrQvLS1VaWmp9+eioiJJ0jEdlRx67TeA+uGYjkoK3fxKx0yppREVFf0oLi72We92u+V2u33WBfoeLEl5eXmaMGGCz7rs7GwtWrQo4L46jZXnk1wDEKkiIdcCyTSJXAu1UObaya8hANip4j0olOPfjhf+Au5JyI4fSUJeLNy7d6/Ky8uVkpLisz4lJUUbNmyo0j43N1dTpkypsv5jMa8IgMhw4MABxcfHW94+JiZGqamp+jjf+vta8+bNlZ6e7rNu0qRJmjx5ss+6QN+DJSk/P7/a9vn5+Zb76xRWnk9yDUCkq+tc8zfTJHIt1EKZa+lt2oSljwAQiGAzTarMtfz89FM3rkZqaqpiYmKC6kOkqfO7Id9///0+3/wVFhaqbdu22r59e9AveCQpLi5Wenq6duzY4aihqZxX/cJ5BcYYowMHDigtLS2o/cTGxmrLli0qKysLqi+uk27NVd0IDNQ9cq1+47zqF84rMJGSa2Ra/UKu1W+cV/3CefkvVJkmBZ9rMTExio2NDbofkSTkxcKkpCRFR0eroKDAZ31BQYFSU1OrtK/pkoP4+HhH/XJUiIuL47zqEc6rfgnHeYXqj+DY2FhbAiTQ92Dp+DdhgbRvSKw8n+SaM3Be9Qvn5T9yrWEj106N95P6hfOqX0J9XqH8wsKuXKsvQn435JiYGGVkZGj58uXedR6PR8uXL1ffvn1DfTgAwAmsvAf37dvXp70kLVu2jPdskWkAUNfItdAi1wAA/gjLZcgTJkzQ6NGj1bt3b/Xp00fTp09XSUmJxowZE47DAQBOcKr34FGjRql169bKzc2VJN15550aMGCAnnnmGQ0dOlSvv/66Vq9erZdeeqkuTyNikGkAULfItdAi1wAApxKWYuGIESO0Z88eTZw4Ufn5+erVq5eWLFlSZSLd6rjdbk2aNMlx85ZwXvUL51W/OPW8rDrVe/D27dsVFVU5sLxfv36aN2+eHnzwQf3+97/XmWeeqUWLFqlbt251dQoRJZhMk5z775Pzql84r/rFqedlFbkWWuRa9Tiv+oXzql+cel5O5jKhvM80AAAAAAAAgHor5HMWAgAAAAAAAKifKBYCAAAAAAAAkESxEAAAAAAAAMBPKBYCAAAAAAAAkBSBxcIZM2aoXbt2io2NVWZmplatWlXXXQrK5MmT5XK5fJbOnTvXdbcC9uGHH2rYsGFKS0uTy+XSokWLfB43xmjixIlq1aqVmjRpoqysLG3atKluOhuAU53XjTfeWOX1Gzx4cN10NgC5ubk677zz1KJFCyUnJ2v48OHauHGjT5sjR45o/PjxOv3009W8eXNdeeWVKigoqKMe+8ef8xo4cGCV1+yWW26pox6joXNapknkWqRzYq6RaWQaIofTco1Mi2xOzDSJXCPX6oeIKhbOnz9fEyZM0KRJk/Tll1+qZ8+eys7O1u7du+u6a0E555xztGvXLu/y8ccf13WXAlZSUqKePXtqxowZ1T7+5JNP6g9/+INmzZqlzz//XM2aNVN2draOHDlic08Dc6rzkqTBgwf7vH5/+9vfbOyhNStXrtT48eP12WefadmyZTp69KgGDRqkkpISb5u7775b//znP7VgwQKtXLlSO3fu1BVXXFGHvT41f85LksaOHevzmj355JN11GM0ZE7NNIlci2ROzDUyjUxDZHBqrpFpkcuJmSaRa+RaPWEiSJ8+fcz48eO9P5eXl5u0tDSTm5tbh70KzqRJk0zPnj3ruhshJcksXLjQ+7PH4zGpqanmqaee8q4rLCw0brfb/O1vf6uDHlpz8nkZY8zo0aPN5ZdfXif9CaXdu3cbSWblypXGmOOvT+PGjc2CBQu8bdavX28kmby8vLrqZsBOPi9jjBkwYIC58847665TwE+cmGnGkGvkWt0j04C64cRcI9PItEhAriESRczIwrKyMq1Zs0ZZWVnedVFRUcrKylJeXl4d9ix4mzZtUlpamjp06KDrr79e27dvr+suhdSWLVuUn5/v89rFx8crMzOz3r92krRixQolJyfr7LPP1q233qp9+/bVdZcCVlRUJElKTEyUJK1Zs0ZHjx71ec06d+6sNm3a1KvX7OTzqvDaa68pKSlJ3bp10/33369Dhw7VRffQgDk50yRyrb6r77lGppFpsJ+Tc41Mq9/qe6ZJ5Bq5Fpka1XUHKuzdu1fl5eVKSUnxWZ+SkqINGzbUUa+Cl5mZqTlz5ujss8/Wrl27NGXKFPXv31/ffPONWrRoUdfdC4n8/HxJqva1q3isvho8eLCuuOIKtW/fXps3b9bvf/97DRkyRHl5eYqOjq7r7vnF4/Horrvu0vnnn69u3bpJOv6axcTEKCEhwadtfXrNqjsvSbruuuvUtm1bpaWl6auvvtK9996rjRs36u9//3sd9hYNjVMzTSLX6st7ZE3qe66RaWQa6oZTc41Mqx/vkTWp75kmkWvkWuSKmGKhUw0ZMsT7/z169FBmZqbatm2rN954QzfddFMd9gz+GDlypPf/u3fvrh49eqhjx45asWKFLrnkkjrsmf/Gjx+vb775pl7Ov1Kbms5r3Lhx3v/v3r27WrVqpUsuuUSbN29Wx44d7e4m4DjkWv1W33ONTCPTgFAi0+q3+p5pErlGrkWuiLkMOSkpSdHR0VXu8FNQUKDU1NQ66lXoJSQk6KyzztL3339f110JmYrXx+mvnSR16NBBSUlJ9eb1y8nJ0TvvvKMPPvhAZ5xxhnd9amqqysrKVFhY6NO+vrxmNZ1XdTIzMyWp3rxmcIaGkmkSuVbf1adcI9PINNSdhpJrZFr9Vp8yTSLXJHItkkVMsTAmJkYZGRlavny5d53H49Hy5cvVt2/fOuxZaB08eFCbN29Wq1at6rorIdO+fXulpqb6vHbFxcX6/PPPHfXaSdIPP/ygffv2RfzrZ4xRTk6OFi5cqPfff1/t27f3eTwjI0ONGzf2ec02btyo7du3R/Rrdqrzqs66deskKeJfMzhLQ8k0iVyr7+pDrpFplcg01JWGkmtkWv1WHzJNItdORK5FsLq8u8rJXn/9deN2u82cOXPMt99+a8aNG2cSEhJMfn5+XXfNst/85jdmxYoVZsuWLeaTTz4xWVlZJikpyezevbuuuxaQAwcOmLVr15q1a9caSWbatGlm7dq1Ztu2bcYYYx5//HGTkJBg3n77bfPVV1+Zyy+/3LRv394cPny4jnteu9rO68CBA+aee+4xeXl5ZsuWLea9994z5557rjnzzDPNkSNH6rrrtbr11ltNfHy8WbFihdm1a5d3OXTokLfNLbfcYtq0aWPef/99s3r1atO3b1/Tt2/fOuz1qZ3qvL7//nvz8MMPm9WrV5stW7aYt99+23To0MFceOGFddxzNEROzDRjyDVyzX5kGpmGyODEXCPTyLS6QK6Ra/VBRBULjTHm+eefN23atDExMTGmT58+5rPPPqvrLgVlxIgRplWrViYmJsa0bt3ajBgxwnz//fd13a2AffDBB0ZSlWX06NHGGGM8Ho956KGHTEpKinG73eaSSy4xGzdurNtO+6G28zp06JAZNGiQadmypWncuLFp27atGTt2bL34g6i6c5JkZs+e7W1z+PBhc9ttt5nTTjvNNG3a1Pzyl780u3btqrtO++FU57V9+3Zz4YUXmsTERON2u02nTp3Mb3/7W1NUVFS3HUeD5bRMM4Zci3ROzDUyjUxD5HBarpFpkc2JmWYMuUau1Q8uY4yxPi4RAAAAAAAAgFNEzJyFAAAAAAAAAOoWxUIAAAAAAAAAkigWAgAAAAAAAPgJxUIAAAAAAAAAkigWAgAAAAAAAPgJxUIAAAAAAAAAkigWAgAAAAAAAPgJxUIAAAAAAAAAkigWAgAAAAAAAPgJxUIAAAAAAAAAkigWAgAAAAAAAPgJxUIAAAAAAAAAkqT/D95FLoBGPoWwAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "engine": 0 + }, + "output_type": "display_data" + } + ], + "source": [ + "if mpi_rank == 0:\n", + " fig = plt.figure(figsize=(16, 4))\n", + " fig.patch.set_facecolor(\"white\")\n", + " ax_before = fig.add_subplot(131)\n", + " ax_after = fig.add_subplot(132)\n", + " ax_diff = fig.add_subplot(133)\n", + "\n", + " f1 = ax_before.pcolormesh(\n", + " tracer_state[0].data[:, :, 0].T, vmin=-0, vmax=1, cmap=\"viridis\"\n", + " )\n", + " plt.colorbar(f1, ax=ax_before)\n", + " f2 = ax_after.pcolormesh(\n", + " tracer_state[-1].data[:, :, 0].T, vmin=-0, vmax=1, cmap=\"viridis\"\n", + " )\n", + " plt.colorbar(f2, ax=ax_after)\n", + " f3 = ax_diff.pcolormesh(\n", + " (tracer_state[-1].data[:, :, 0] - tracer_state[0].data[:, :, 0]).T,\n", + " vmin=-0.5,\n", + " vmax=0.5,\n", + " cmap=\"bwr\",\n", + " )\n", + " plt.colorbar(f3, ax=ax_diff)\n", + "\n", + " ax_before.set_title(\"tracer concentration at t=0\")\n", + " ax_after.set_title(\"tracer concentration after %s steps\" % nSteps)\n", + " ax_diff.set_title(\"difference after %s steps\" % nSteps)\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "d41c4b7b", + "metadata": {}, + "source": [ + "## Recreating this with functions.py\n", + "\n", + "You can reproduce the above steps in a more succinct manner by using the following syntax.\n", + "\n", + "In this case, we are using 79 layers, and things are not as fast as they could be - the same calculation is repeated at every vertical level." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "5d38b817", + "metadata": { + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[1:execute]\n", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)\n", + "Cell \u001b[0;32mIn [15], line 23\u001b[0m\n", + "\u001b[1;32m 20\u001b[0m stencil_configuration \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mconfigure_stencil(domain_configuration, backend\u001b[38;5;241m=\u001b[39mbackend)\n", + "\u001b[1;32m 21\u001b[0m stencil_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mquantity_factory\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m domain_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mquantity_factory\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", + "\u001b[0;32m---> 23\u001b[0m tracer_advection_data, tracer_advection \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprepare_everything_for_advection\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 24\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minitial_state\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimestep\u001b[49m\n", + "\u001b[1;32m 25\u001b[0m \u001b[43m)\u001b[49m\n", + "\u001b[1;32m 27\u001b[0m tracer_advection_data_initial \u001b[38;5;241m=\u001b[39m cp\u001b[38;5;241m.\u001b[39mdeepcopy(tracer_advection_data)\n", + "\u001b[1;32m 29\u001b[0m tracer_state \u001b[38;5;241m=\u001b[39m [cp\u001b[38;5;241m.\u001b[39mdeepcopy(tracer_advection_data_initial[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracers\u001b[39m\u001b[38;5;124m\"\u001b[39m][\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m])]\n", + "\n", + "File \u001b[0;32m/pace/examples/notebooks/functions.py:987\u001b[0m, in \u001b[0;36mprepare_everything_for_advection\u001b[0;34m(stencil_configuration, initial_state, dimensions, timestep)\u001b[0m\n", + "\u001b[1;32m 962\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n", + "\u001b[1;32m 963\u001b[0m \u001b[38;5;124;03mUse: tracer_advection_data, tracer_advection =\u001b[39;00m\n", + "\u001b[1;32m 964\u001b[0m \u001b[38;5;124;03m prepare_everything_for_advection(stencil_configuration, initial_state,\u001b[39;00m\n", + "\u001b[0;32m (...)\u001b[0m\n", + "\u001b[1;32m 982\u001b[0m \n", + "\u001b[1;32m 983\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n", + "\u001b[1;32m 985\u001b[0m tracers \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m: initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m]}\n", + "\u001b[0;32m--> 987\u001b[0m flux_prep \u001b[38;5;241m=\u001b[39m \u001b[43mrun_finite_volume_fluxprep\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 988\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m,\u001b[49m\n", + "\u001b[1;32m 989\u001b[0m \u001b[43m \u001b[49m\u001b[43minitial_state\u001b[49m\u001b[43m,\u001b[49m\n", + "\u001b[1;32m 990\u001b[0m \u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\n", + "\u001b[1;32m 991\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimestep\u001b[49m\u001b[43m,\u001b[49m\n", + "\u001b[1;32m 992\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 994\u001b[0m tracer_advection \u001b[38;5;241m=\u001b[39m build_tracer_advection(stencil_configuration, tracers)\n", + "\u001b[1;32m 996\u001b[0m tracer_advection_data \u001b[38;5;241m=\u001b[39m {\n", + "\u001b[1;32m 997\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracers\u001b[39m\u001b[38;5;124m\"\u001b[39m: tracers,\n", + "\u001b[1;32m 998\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelp\u001b[39m\u001b[38;5;124m\"\u001b[39m: initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelp\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[0;32m (...)\u001b[0m\n", + "\u001b[1;32m 1002\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcry\u001b[39m\u001b[38;5;124m\"\u001b[39m: flux_prep[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcry\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[1;32m 1003\u001b[0m }\n", + "\n", + "File \u001b[0;32m/pace/examples/notebooks/functions.py:877\u001b[0m, in \u001b[0;36mrun_finite_volume_fluxprep\u001b[0;34m(stencil_configuration, initial_state, dimensions, timestep, density)\u001b[0m\n", + "\u001b[1;32m 872\u001b[0m vc_contra \u001b[38;5;241m=\u001b[39m init_quantity(\n", + "\u001b[1;32m 873\u001b[0m dimensions, VariableGrid\u001b[38;5;241m.\u001b[39mStaggeredInY, VariableDims\u001b[38;5;241m.\u001b[39mXYZ, units\u001b[38;5;241m=\u001b[39munits[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124marea\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", + "\u001b[1;32m 874\u001b[0m )\n", + "\u001b[1;32m 876\u001b[0m \u001b[38;5;66;03m# intialize and run\u001b[39;00m\n", + "\u001b[0;32m--> 877\u001b[0m fvf_prep \u001b[38;5;241m=\u001b[39m \u001b[43mFiniteVolumeFluxPrep\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 878\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstencil_factory\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mgrid_data\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\n", + "\u001b[1;32m 879\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 881\u001b[0m fvf_prep(\n", + "\u001b[1;32m 882\u001b[0m initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mu_cgrid\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[1;32m 883\u001b[0m initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mv_cgrid\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[0;32m (...)\u001b[0m\n", + "\u001b[1;32m 890\u001b[0m timestep,\n", + "\u001b[1;32m 891\u001b[0m ) \u001b[38;5;66;03m# this will modify empty quantities, but not change uc, vc\u001b[39;00m\n", + "\u001b[1;32m 893\u001b[0m mfxd \u001b[38;5;241m=\u001b[39m init_quantity(\n", + "\u001b[1;32m 894\u001b[0m dimensions, VariableGrid\u001b[38;5;241m.\u001b[39mStaggeredInX, VariableDims\u001b[38;5;241m.\u001b[39mXYZ, units\u001b[38;5;241m=\u001b[39munits[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124marea\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", + "\u001b[1;32m 895\u001b[0m )\n", + "\n", + "\u001b[0;31mTypeError\u001b[0m: __init__() missing 1 required positional argument: 'grid_type'\n" + ] + }, + { + "data": { + "text/plain": [ + "[stderr:2] /pace/NDSL/ndsl/grid/gnomonic.py:681: RuntimeWarning: invalid value encountered in true_divide\n", + " np.sum(p * q, axis=-1)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[4:execute]\n", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)\n", + "Cell \u001b[0;32mIn [15], line 23\u001b[0m\n", + "\u001b[1;32m 20\u001b[0m stencil_configuration \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mconfigure_stencil(domain_configuration, backend\u001b[38;5;241m=\u001b[39mbackend)\n", + "\u001b[1;32m 21\u001b[0m stencil_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mquantity_factory\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m domain_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mquantity_factory\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", + "\u001b[0;32m---> 23\u001b[0m tracer_advection_data, tracer_advection \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprepare_everything_for_advection\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 24\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minitial_state\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimestep\u001b[49m\n", + "\u001b[1;32m 25\u001b[0m \u001b[43m)\u001b[49m\n", + "\u001b[1;32m 27\u001b[0m tracer_advection_data_initial \u001b[38;5;241m=\u001b[39m cp\u001b[38;5;241m.\u001b[39mdeepcopy(tracer_advection_data)\n", + "\u001b[1;32m 29\u001b[0m tracer_state \u001b[38;5;241m=\u001b[39m [cp\u001b[38;5;241m.\u001b[39mdeepcopy(tracer_advection_data_initial[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracers\u001b[39m\u001b[38;5;124m\"\u001b[39m][\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m])]\n", + "\n", + "File \u001b[0;32m/pace/examples/notebooks/functions.py:987\u001b[0m, in \u001b[0;36mprepare_everything_for_advection\u001b[0;34m(stencil_configuration, initial_state, dimensions, timestep)\u001b[0m\n", + "\u001b[1;32m 962\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n", + "\u001b[1;32m 963\u001b[0m \u001b[38;5;124;03mUse: tracer_advection_data, tracer_advection =\u001b[39;00m\n", + "\u001b[1;32m 964\u001b[0m \u001b[38;5;124;03m prepare_everything_for_advection(stencil_configuration, initial_state,\u001b[39;00m\n", + "\u001b[0;32m (...)\u001b[0m\n", + "\u001b[1;32m 982\u001b[0m \n", + "\u001b[1;32m 983\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n", + "\u001b[1;32m 985\u001b[0m tracers \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m: initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m]}\n", + "\u001b[0;32m--> 987\u001b[0m flux_prep \u001b[38;5;241m=\u001b[39m \u001b[43mrun_finite_volume_fluxprep\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 988\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m,\u001b[49m\n", + "\u001b[1;32m 989\u001b[0m \u001b[43m \u001b[49m\u001b[43minitial_state\u001b[49m\u001b[43m,\u001b[49m\n", + "\u001b[1;32m 990\u001b[0m \u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\n", + "\u001b[1;32m 991\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimestep\u001b[49m\u001b[43m,\u001b[49m\n", + "\u001b[1;32m 992\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 994\u001b[0m tracer_advection \u001b[38;5;241m=\u001b[39m build_tracer_advection(stencil_configuration, tracers)\n", + "\u001b[1;32m 996\u001b[0m tracer_advection_data \u001b[38;5;241m=\u001b[39m {\n", + "\u001b[1;32m 997\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracers\u001b[39m\u001b[38;5;124m\"\u001b[39m: tracers,\n", + "\u001b[1;32m 998\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelp\u001b[39m\u001b[38;5;124m\"\u001b[39m: initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelp\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[0;32m (...)\u001b[0m\n", + "\u001b[1;32m 1002\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcry\u001b[39m\u001b[38;5;124m\"\u001b[39m: flux_prep[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcry\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[1;32m 1003\u001b[0m }\n", + "\n", + "File \u001b[0;32m/pace/examples/notebooks/functions.py:877\u001b[0m, in \u001b[0;36mrun_finite_volume_fluxprep\u001b[0;34m(stencil_configuration, initial_state, dimensions, timestep, density)\u001b[0m\n", + "\u001b[1;32m 872\u001b[0m vc_contra \u001b[38;5;241m=\u001b[39m init_quantity(\n", + "\u001b[1;32m 873\u001b[0m dimensions, VariableGrid\u001b[38;5;241m.\u001b[39mStaggeredInY, VariableDims\u001b[38;5;241m.\u001b[39mXYZ, units\u001b[38;5;241m=\u001b[39munits[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124marea\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", + "\u001b[1;32m 874\u001b[0m )\n", + "\u001b[1;32m 876\u001b[0m \u001b[38;5;66;03m# intialize and run\u001b[39;00m\n", + "\u001b[0;32m--> 877\u001b[0m fvf_prep \u001b[38;5;241m=\u001b[39m \u001b[43mFiniteVolumeFluxPrep\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 878\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstencil_factory\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mgrid_data\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\n", + "\u001b[1;32m 879\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 881\u001b[0m fvf_prep(\n", + "\u001b[1;32m 882\u001b[0m initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mu_cgrid\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[1;32m 883\u001b[0m initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mv_cgrid\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[0;32m (...)\u001b[0m\n", + "\u001b[1;32m 890\u001b[0m timestep,\n", + "\u001b[1;32m 891\u001b[0m ) \u001b[38;5;66;03m# this will modify empty quantities, but not change uc, vc\u001b[39;00m\n", + "\u001b[1;32m 893\u001b[0m mfxd \u001b[38;5;241m=\u001b[39m init_quantity(\n", + "\u001b[1;32m 894\u001b[0m dimensions, VariableGrid\u001b[38;5;241m.\u001b[39mStaggeredInX, VariableDims\u001b[38;5;241m.\u001b[39mXYZ, units\u001b[38;5;241m=\u001b[39munits[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124marea\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", + "\u001b[1;32m 895\u001b[0m )\n", + "\n", + "\u001b[0;31mTypeError\u001b[0m: __init__() missing 1 required positional argument: 'grid_type'\n" + ] + }, + { + "data": { + "text/plain": [ + "[stderr:5] /pace/NDSL/ndsl/grid/gnomonic.py:681: RuntimeWarning: invalid value encountered in true_divide\n", + " np.sum(p * q, axis=-1)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[0:execute]\n", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)\n", + "Cell \u001b[0;32mIn [15], line 23\u001b[0m\n", + "\u001b[1;32m 20\u001b[0m stencil_configuration \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mconfigure_stencil(domain_configuration, backend\u001b[38;5;241m=\u001b[39mbackend)\n", + "\u001b[1;32m 21\u001b[0m stencil_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mquantity_factory\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m domain_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mquantity_factory\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", + "\u001b[0;32m---> 23\u001b[0m tracer_advection_data, tracer_advection \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprepare_everything_for_advection\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 24\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minitial_state\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimestep\u001b[49m\n", + "\u001b[1;32m 25\u001b[0m \u001b[43m)\u001b[49m\n", + "\u001b[1;32m 27\u001b[0m tracer_advection_data_initial \u001b[38;5;241m=\u001b[39m cp\u001b[38;5;241m.\u001b[39mdeepcopy(tracer_advection_data)\n", + "\u001b[1;32m 29\u001b[0m tracer_state \u001b[38;5;241m=\u001b[39m [cp\u001b[38;5;241m.\u001b[39mdeepcopy(tracer_advection_data_initial[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracers\u001b[39m\u001b[38;5;124m\"\u001b[39m][\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m])]\n", + "\n", + "File \u001b[0;32m/pace/examples/notebooks/functions.py:987\u001b[0m, in \u001b[0;36mprepare_everything_for_advection\u001b[0;34m(stencil_configuration, initial_state, dimensions, timestep)\u001b[0m\n", + "\u001b[1;32m 962\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n", + "\u001b[1;32m 963\u001b[0m \u001b[38;5;124;03mUse: tracer_advection_data, tracer_advection =\u001b[39;00m\n", + "\u001b[1;32m 964\u001b[0m \u001b[38;5;124;03m prepare_everything_for_advection(stencil_configuration, initial_state,\u001b[39;00m\n", + "\u001b[0;32m (...)\u001b[0m\n", + "\u001b[1;32m 982\u001b[0m \n", + "\u001b[1;32m 983\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n", + "\u001b[1;32m 985\u001b[0m tracers \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m: initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m]}\n", + "\u001b[0;32m--> 987\u001b[0m flux_prep \u001b[38;5;241m=\u001b[39m \u001b[43mrun_finite_volume_fluxprep\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 988\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m,\u001b[49m\n", + "\u001b[1;32m 989\u001b[0m \u001b[43m \u001b[49m\u001b[43minitial_state\u001b[49m\u001b[43m,\u001b[49m\n", + "\u001b[1;32m 990\u001b[0m \u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\n", + "\u001b[1;32m 991\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimestep\u001b[49m\u001b[43m,\u001b[49m\n", + "\u001b[1;32m 992\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 994\u001b[0m tracer_advection \u001b[38;5;241m=\u001b[39m build_tracer_advection(stencil_configuration, tracers)\n", + "\u001b[1;32m 996\u001b[0m tracer_advection_data \u001b[38;5;241m=\u001b[39m {\n", + "\u001b[1;32m 997\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracers\u001b[39m\u001b[38;5;124m\"\u001b[39m: tracers,\n", + "\u001b[1;32m 998\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelp\u001b[39m\u001b[38;5;124m\"\u001b[39m: initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelp\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[0;32m (...)\u001b[0m\n", + "\u001b[1;32m 1002\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcry\u001b[39m\u001b[38;5;124m\"\u001b[39m: flux_prep[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcry\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[1;32m 1003\u001b[0m }\n", + "\n", + "File \u001b[0;32m/pace/examples/notebooks/functions.py:877\u001b[0m, in \u001b[0;36mrun_finite_volume_fluxprep\u001b[0;34m(stencil_configuration, initial_state, dimensions, timestep, density)\u001b[0m\n", + "\u001b[1;32m 872\u001b[0m vc_contra \u001b[38;5;241m=\u001b[39m init_quantity(\n", + "\u001b[1;32m 873\u001b[0m dimensions, VariableGrid\u001b[38;5;241m.\u001b[39mStaggeredInY, VariableDims\u001b[38;5;241m.\u001b[39mXYZ, units\u001b[38;5;241m=\u001b[39munits[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124marea\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", + "\u001b[1;32m 874\u001b[0m )\n", + "\u001b[1;32m 876\u001b[0m \u001b[38;5;66;03m# intialize and run\u001b[39;00m\n", + "\u001b[0;32m--> 877\u001b[0m fvf_prep \u001b[38;5;241m=\u001b[39m \u001b[43mFiniteVolumeFluxPrep\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 878\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstencil_factory\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mgrid_data\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\n", + "\u001b[1;32m 879\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 881\u001b[0m fvf_prep(\n", + "\u001b[1;32m 882\u001b[0m initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mu_cgrid\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[1;32m 883\u001b[0m initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mv_cgrid\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[0;32m (...)\u001b[0m\n", + "\u001b[1;32m 890\u001b[0m timestep,\n", + "\u001b[1;32m 891\u001b[0m ) \u001b[38;5;66;03m# this will modify empty quantities, but not change uc, vc\u001b[39;00m\n", + "\u001b[1;32m 893\u001b[0m mfxd \u001b[38;5;241m=\u001b[39m init_quantity(\n", + "\u001b[1;32m 894\u001b[0m dimensions, VariableGrid\u001b[38;5;241m.\u001b[39mStaggeredInX, VariableDims\u001b[38;5;241m.\u001b[39mXYZ, units\u001b[38;5;241m=\u001b[39munits[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124marea\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", + "\u001b[1;32m 895\u001b[0m )\n", + "\n", + "\u001b[0;31mTypeError\u001b[0m: __init__() missing 1 required positional argument: 'grid_type'\n", + "[2:execute]\n", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)\n", + "Cell \u001b[0;32mIn [15], line 23\u001b[0m\n", + "\u001b[1;32m 20\u001b[0m stencil_configuration \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mconfigure_stencil(domain_configuration, backend\u001b[38;5;241m=\u001b[39mbackend)\n", + "\u001b[1;32m 21\u001b[0m stencil_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mquantity_factory\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m domain_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mquantity_factory\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", + "\u001b[0;32m---> 23\u001b[0m tracer_advection_data, tracer_advection \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprepare_everything_for_advection\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 24\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minitial_state\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimestep\u001b[49m\n", + "\u001b[1;32m 25\u001b[0m \u001b[43m)\u001b[49m\n", + "\u001b[1;32m 27\u001b[0m tracer_advection_data_initial \u001b[38;5;241m=\u001b[39m cp\u001b[38;5;241m.\u001b[39mdeepcopy(tracer_advection_data)\n", + "\u001b[1;32m 29\u001b[0m tracer_state \u001b[38;5;241m=\u001b[39m [cp\u001b[38;5;241m.\u001b[39mdeepcopy(tracer_advection_data_initial[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracers\u001b[39m\u001b[38;5;124m\"\u001b[39m][\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m])]\n", + "\n", + "File \u001b[0;32m/pace/examples/notebooks/functions.py:987\u001b[0m, in \u001b[0;36mprepare_everything_for_advection\u001b[0;34m(stencil_configuration, initial_state, dimensions, timestep)\u001b[0m\n", + "\u001b[1;32m 962\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n", + "\u001b[1;32m 963\u001b[0m \u001b[38;5;124;03mUse: tracer_advection_data, tracer_advection =\u001b[39;00m\n", + "\u001b[1;32m 964\u001b[0m \u001b[38;5;124;03m prepare_everything_for_advection(stencil_configuration, initial_state,\u001b[39;00m\n", + "\u001b[0;32m (...)\u001b[0m\n", + "\u001b[1;32m 982\u001b[0m \n", + "\u001b[1;32m 983\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n", + "\u001b[1;32m 985\u001b[0m tracers \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m: initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m]}\n", + "\u001b[0;32m--> 987\u001b[0m flux_prep \u001b[38;5;241m=\u001b[39m \u001b[43mrun_finite_volume_fluxprep\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 988\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m,\u001b[49m\n", + "\u001b[1;32m 989\u001b[0m \u001b[43m \u001b[49m\u001b[43minitial_state\u001b[49m\u001b[43m,\u001b[49m\n", + "\u001b[1;32m 990\u001b[0m \u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\n", + "\u001b[1;32m 991\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimestep\u001b[49m\u001b[43m,\u001b[49m\n", + "\u001b[1;32m 992\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 994\u001b[0m tracer_advection \u001b[38;5;241m=\u001b[39m build_tracer_advection(stencil_configuration, tracers)\n", + "\u001b[1;32m 996\u001b[0m tracer_advection_data \u001b[38;5;241m=\u001b[39m {\n", + "\u001b[1;32m 997\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracers\u001b[39m\u001b[38;5;124m\"\u001b[39m: tracers,\n", + "\u001b[1;32m 998\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelp\u001b[39m\u001b[38;5;124m\"\u001b[39m: initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelp\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[0;32m (...)\u001b[0m\n", + "\u001b[1;32m 1002\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcry\u001b[39m\u001b[38;5;124m\"\u001b[39m: flux_prep[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcry\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[1;32m 1003\u001b[0m }\n", + "\n", + "File \u001b[0;32m/pace/examples/notebooks/functions.py:877\u001b[0m, in \u001b[0;36mrun_finite_volume_fluxprep\u001b[0;34m(stencil_configuration, initial_state, dimensions, timestep, density)\u001b[0m\n", + "\u001b[1;32m 872\u001b[0m vc_contra \u001b[38;5;241m=\u001b[39m init_quantity(\n", + "\u001b[1;32m 873\u001b[0m dimensions, VariableGrid\u001b[38;5;241m.\u001b[39mStaggeredInY, VariableDims\u001b[38;5;241m.\u001b[39mXYZ, units\u001b[38;5;241m=\u001b[39munits[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124marea\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", + "\u001b[1;32m 874\u001b[0m )\n", + "\u001b[1;32m 876\u001b[0m \u001b[38;5;66;03m# intialize and run\u001b[39;00m\n", + "\u001b[0;32m--> 877\u001b[0m fvf_prep \u001b[38;5;241m=\u001b[39m \u001b[43mFiniteVolumeFluxPrep\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 878\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstencil_factory\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mgrid_data\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\n", + "\u001b[1;32m 879\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 881\u001b[0m fvf_prep(\n", + "\u001b[1;32m 882\u001b[0m initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mu_cgrid\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[1;32m 883\u001b[0m initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mv_cgrid\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[0;32m (...)\u001b[0m\n", + "\u001b[1;32m 890\u001b[0m timestep,\n", + "\u001b[1;32m 891\u001b[0m ) \u001b[38;5;66;03m# this will modify empty quantities, but not change uc, vc\u001b[39;00m\n", + "\u001b[1;32m 893\u001b[0m mfxd \u001b[38;5;241m=\u001b[39m init_quantity(\n", + "\u001b[1;32m 894\u001b[0m dimensions, VariableGrid\u001b[38;5;241m.\u001b[39mStaggeredInX, VariableDims\u001b[38;5;241m.\u001b[39mXYZ, units\u001b[38;5;241m=\u001b[39munits[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124marea\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", + "\u001b[1;32m 895\u001b[0m )\n", + "\n", + "\u001b[0;31mTypeError\u001b[0m: __init__() missing 1 required positional argument: 'grid_type'\n", + "[5:execute] TypeError: __init__() missing 1 required positional argument: 'grid_type'\n", + "[3:execute] TypeError: __init__() missing 1 required positional argument: 'grid_type'\n" + ] + }, + { + "ename": "AlreadyDisplayedError", + "evalue": "6 errors", + "output_type": "error", + "traceback": [ + "6 errors" + ] + } + ], + "source": [ + "mpi_comm = MPI.COMM_WORLD\n", + "mpi_rank = mpi_comm.Get_rank()\n", + "\n", + "nz = 79\n", + "if nz == 1:\n", + " single_layer = True\n", + "else:\n", + " single_layer = False\n", + "\n", + "namelist_dict = func.store_namelist_variables(locals())\n", + "dimensions = func.define_dimensions(namelist_dict)\n", + "\n", + "\n", + "domain_configuration = func.configure_domain(mpi_comm, dimensions, single_layer=single_layer)\n", + "\n", + "initial_state = func.create_initial_state_advection(\n", + " domain_configuration[\"metric_terms\"], dimensions, tracer_center, test_case\n", + ")\n", + "\n", + "stencil_configuration = func.configure_stencil(domain_configuration, backend=backend)\n", + "stencil_configuration[\"quantity_factory\"] = domain_configuration[\"quantity_factory\"]\n", + "\n", + "tracer_advection_data, tracer_advection = func.prepare_everything_for_advection(\n", + " stencil_configuration, initial_state, dimensions, timestep\n", + ")\n", + "\n", + "tracer_advection_data_initial = cp.deepcopy(tracer_advection_data)\n", + "\n", + "tracer_state = [cp.deepcopy(tracer_advection_data_initial[\"tracers\"][\"tracer\"])]\n", + "\n", + "nSteps = 10\n", + "for step in range(nSteps):\n", + " tracer_advection_data = func.run_advection_step_with_reset(\n", + " tracer_advection_data_initial, tracer_advection_data, tracer_advection\n", + " )\n", + "\n", + " tracer_state.append(cp.deepcopy(tracer_advection_data[\"tracers\"][\"tracer\"]))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "fe879468", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[output:0]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABQsAAAF2CAYAAADJMM7PAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABqNUlEQVR4nO3deXxU1f3/8fckkAlbEmNIQjDsKiBbDZIvKIKaEpCi1A3UryBVqErcqK1alUXUuCJWEapVaKlURAu2yheKKLhFEYSfWgGRsikkbE0CARLInN8fmAlDFmbuzNxMbl7Px+M+NHfOvffcGTLvzGfOPddljDECAAAAAAAA0OBF1XUHAAAAAAAAAEQGioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioVAmAwcOFADBw6s624AAByiPuRKQUGBrrrqKp1++ulyuVyaPn16XXcJAGo0efJkuVwun3Xt2rXTjTfe6LNu06ZNGjRokOLj4+VyubRo0SJJ0hdffKF+/fqpWbNmcrlcWrdunT0dr+dqej4BRA6KhTX49NNPNXnyZBUWFtZ1VxCkF198UXPmzAnLvr/99ltNnjxZW7duDcv+w2nnzp2aPHmy33/UhOt34h//+IfOPfdcxcbGqk2bNpo0aZKOHTsW0mMAkYBccQ5ypWZ33323li5dqvvvv19z587V4MGDtXjxYk2ePNnWfmzcuFF33323+vXrp9jYWLlcrlqf03BmUV2cP4DQGj16tL7++ms9+uijmjt3rnr37q2jR4/q6quv1v79+/Xss89q7ty5atu2bV13tV6o7vmcN2+e7V8wrVq1SrfddpsyMjLUuHHjKoXjk73yyivq0qWLYmNjdeaZZ+r5558PWV/q4vyBWhlU66mnnjKSzJYtW+q6KwjSOeecYwYMGBCWfS9YsMBIMh988EGVx0pLS01paWlYjhsKX3zxhZFkZs+e7Vf7cPxOLF682LhcLnPRRReZl156ydx+++0mKirK3HLLLSE7BhApyBXnIFdqlpKSYq6//nqfdePHjzd2/8k5e/ZsExUVZbp162Z69epV6+9euLOoLs4fgH8mTZpU5ffzyJEjpqyszPvzoUOHjCTzwAMP+LRbv369kWRefvllW/rqFDU9n0OHDjVt27a1tS+TJk0yjRs3NhkZGeass86q9b161qxZRpK58sorzUsvvWRuuOEGI8k8/vjjIelLXZw/UJtG9pcnncfj8aisrEyxsbF13RWvkpISNWvWrK67Ue+E8nmLiYkJyX6c7J577lGPHj30r3/9S40aHX87iouL02OPPaY777xTnTt3ruMeAnWDXHGOhpYru3fvVkJCQtiPY4zRkSNH1KRJk2ofv+yyy1RYWKgWLVro6aefrnUUPVkE4ERut9vn5z179khSlfe23bt3V7s+GA0ha2t6PsPhVH9P3Xrrrbr33nvVpEkT5eTk6Lvvvqu23eHDh/XAAw9o6NChevPNNyVJY8eOlcfj0dSpUzVu3DiddtppYTsPoE7UdbUyElV8w3TyUvGNtCQzfvx489e//tV07drVNGrUyCxcuNAYc3zkSN++fU1iYqKJjY015557rlmwYEG1x5k7d64577zzTJMmTUxCQoLp37+/Wbp0qU+bxYsXmwsuuMA0bdrUNG/e3Fx66aXmm2++8WkzevRo06xZM/P999+bIUOGmObNm5vLL7+81nP84YcfzK9+9SvTqlUrExMTY9q1a2duueUWnxELmzdvNldddZU57bTTTJMmTUxmZqZ55513fPbzwQcfGElm/vz55pFHHjGtW7c2brfbXHzxxWbTpk1VjvvZZ5+ZIUOGmISEBNO0aVPTvXt3M336dJ8269evN1deeaU57bTTjNvtNhkZGebtt9/2aTN79mwjyXz88cfm7rvvNklJSaZp06Zm+PDhZvfu3d52bdu2rfI6VowGqdjHihUrzK233mpatmxpEhISjDHGbN261dx6663mrLPOMrGxsSYxMdFcddVVPqMSKrY/eakYDTJgwIAqI08KCgrMr371K5OcnGzcbrfp0aOHmTNnjk+bLVu2GEnmqaeeMn/84x9Nhw4dTExMjOndu7dZtWpVzS/qT/bt22d+85vfmG7duplmzZqZFi1amMGDB5t169ZVed1OXmoaZXiq3wkr/v3vfxtJZsaMGT7rf/zxRyPJTJ061fK+gUhDrhxHrjg3V2rq++jRo6tdX6G8vNw8++yzpmvXrsbtdpvk5GQzbtw4s3//fp8+tG3b1gwdOtQsWbLEZGRkGLfbbZ599tlT9t2Y2kf1BptFZWVlZvLkyaZTp07G7XabxMREc/7555t//etfxhgT8vNfunSp6dmzp3G73aZLly7mrbfeCqg/QEP20Ucfmd69exu32206dOhgZs2aVe3IwrZt25rRo0cbY6rP74rHa8oCYwLLneoyw5jA8vqHH34wl19+uWnWrJlJSkoyv/nNb8yxY8d82paXl5vp06ebbt26GbfbbZKSkkx2drb54osvfNrNnTvXnHvuuSY2NtacdtppZsSIEWb79u2nfH79ybmans8BAwZUu77CkSNHzMSJE03Hjh1NTEyMOeOMM8xvf/tbc+TIEZ8+1Pb31KnUNgr83XffNZLMu+++67P+008/NZLM3Llza913cXGxufPOO03btm1NTEyMadmypcnKyjJr1qwxxpiwnP9ZZ51l3G63Offcc83KlSsD6g9gDCMLq3XFFVfou+++09/+9jc9++yzSkpKkiS1bNnS2+b999/XG2+8oZycHCUlJaldu3aSpOeee06XXXaZrr/+epWVlen111/X1VdfrXfeeUdDhw71bj9lyhRNnjxZ/fr108MPP6yYmBh9/vnnev/99zVo0CBJ0ty5czV69GhlZ2friSee0KFDhzRz5kxdcMEFWrt2rfeYknTs2DFlZ2frggsu0NNPP62mTZvWeH47d+5Unz59VFhYqHHjxqlz58768ccf9eabb+rQoUOKiYlRQUGB+vXrp0OHDumOO+7Q6aefrj//+c+67LLL9Oabb+qXv/ylzz4ff/xxRUVF6Z577lFRUZGefPJJXX/99fr888+9bZYtW6Zf/OIXatWqle68806lpqZq/fr1euedd3TnnXdKkv7973/r/PPPV+vWrXXfffepWbNmeuONNzR8+HC99dZbVY57++2367TTTtOkSZO0detWTZ8+XTk5OZo/f74kafr06br99tvVvHlzPfDAA5KklJQUn33cdtttatmypSZOnKiSkhJJxycr/vTTTzVy5EidccYZ2rp1q2bOnKmBAwfq22+/VdOmTXXhhRfqjjvu0B/+8Af9/ve/V5cuXSTJ+9+THT58WAMHDtT333+vnJwctW/fXgsWLNCNN96owsJC73NQYd68eTpw4IB+/etfy+Vy6cknn9QVV1yh//znP2rcuHGNr+9//vMfLVq0SFdffbXat2+vgoIC/fGPf9SAAQP07bffKi0tTV26dNHDDz+siRMnaty4cerfv78kqV+/ftXu81S/E0VFRTp69GiNfaoQGxur5s2bS5LWrl0rSerdu7dPm7S0NJ1xxhnexwEnIFfIFafnyoUXXqi5c+fqhhtu0M9//nONGjVKktSxY0ft3LlTy5Yt09y5c6vs+9e//rXmzJmjMWPG6I477tCWLVv0wgsvaO3atfrkk098+rVx40Zde+21+vWvf62xY8fq7LPPrrHP/go2iyZPnqzc3FzdfPPN6tOnj4qLi7V69Wp9+eWX+vnPf65f//rXITv/TZs2acSIEbrllls0evRozZ49W1dffbWWLFmin//85371B2iovv76aw0aNEgtW7bU5MmTdezYMU2aNKnK+/fJrrjiCiUkJOjuu+/Wtddeq0svvVTNmzdXSkqKWrdurccee0x33HGHzjvvPO++As2d6jIjkLwuLy9Xdna2MjMz9fTTT+u9997TM888o44dO+rWW2/1trvppps0Z84cDRkyRDfffLOOHTumjz76SJ999pn3PfDRRx/VQw89pGuuuUY333yz9uzZo+eff14XXnih1q5dW+toQH9yrqbns1mzZioqKtIPP/ygZ599VpK8nxk8Ho8uu+wyffzxxxo3bpy6dOmir7/+Ws8++6y+++67KjdHqenvqWDUlBUZGRmKiorS2rVr9b//+781bn/LLbfozTffVE5Ojrp27ap9+/bp448/1vr163XuuefqgQceCNn5r1y5UvPnz9cdd9wht9utF198UYMHD9aqVavUrVs3v/oDSGJkYU1q+xZakomKijL//ve/qzx26NAhn5/LyspMt27dzMUXX+xdt2nTJhMVFWV++ctfmvLycp/2Ho/HGGPMgQMHTEJCghk7dqzP4/n5+SY+Pt5nfcU3W/fdd59f5zZq1CgTFRVV5VukE49/1113GUnmo48+8j524MAB0759e9OuXTtvvytGgHTp0sVn9Mhzzz1nJJmvv/7aGGPMsWPHTPv27U3btm3Nf//732qPaYwxl1xyienevbvPtyQej8f069fPnHnmmd51Fd/EZWVl+Wx/9913m+joaFNYWOhdV9PcUhX7uOCCC6p883by62iMMXl5eUaS+ctf/uJdV9vcUiePAJk+fbqRZP76179615WVlZm+ffua5s2bm+LiYmNM5QiQ008/3Wdkwdtvv20kmX/+859VjnWiI0eOVPl3tWXLFuN2u83DDz/sXRfKOQur+zasuqXiW9oT91fdN5XnnXee+Z//+R+/+gXUF+QKuXIyp+WKMZWjGk5U02iNjz76yEgyr732ms/6JUuWVFlfMaJzyZIltfa1OrX97gWbRT179jRDhw6ttU0oz//EkYRFRUWmVatW5mc/+1lA/QEaouHDh5vY2Fizbds277pvv/3WREdH1zqy0Bjf0dknqsirk0f7B5o7J2eGlbw++b34Zz/7mcnIyPD+/P777xtJ5o477qjy3FRk3tatW010dLR59NFHfR7/+uuvTaNGjaqsP5m/OVfT81nTnH1z5841UVFRPn8/GFM5h+Ann3ziXVfb31OnUtvIwvHjx5vo6OhqH2vZsqUZOXJkrfuOj4+vko0nC9X5SzKrV6/2rtu2bZuJjY01v/zlLwPqD8DdkC0aMGCAunbtWmX9iXPn/Pe//1VRUZH69++vL7/80rt+0aJF8ng8mjhxoqKifF+CijswLVu2TIWFhbr22mu1d+9e7xIdHa3MzEx98MEHVY594jdHNfF4PFq0aJGGDRtW5ZuRE4+/ePFi9enTRxdccIH3sebNm2vcuHHaunWrvv32W5/txowZ4zOXUsVItf/85z+Sjn8bs2XLFt11111VvpGqOOb+/fv1/vvv65prrtGBAwe857xv3z5lZ2dr06ZN+vHHH322HTdunM9dq/r376/y8nJt27btlM9FhbFjxyo6Otpn3Ymv49GjR7Vv3z516tRJCQkJPq9lIBYvXqzU1FRde+213nWNGzfWHXfcoYMHD2rlypU+7UeMGOEz98XJz2lN3G63999VeXm59u3bp+bNm+vss8+23PdTeeaZZ7Rs2bJTLr/73e+82xw+fNjb35PFxsZ6HwcaCnKFXAlUfc+VBQsWKD4+Xj//+c99/k1mZGSoefPmVf5Ntm/fXtnZ2ZaPV51gsyghIUH//ve/tWnTpoCPHej5p6Wl+YxIiouL06hRo7R27Vrl5+cH3R/AqcrLy7V06VINHz5cbdq08a7v0qVLyN9TrOTOyZlhJa9vueUWn5/79+/v897+1ltvyeVyadKkSVW2rci8v//97/J4PLrmmmt8jpuamqozzzyz2uOeKBw5Jx1/r+zSpYs6d+7s06+LL75Ykqr0q6a/p4Jx+PDhGucN9jcrPv/8c+3cuTPgYwd6/n379lVGRob35zZt2ujyyy/X0qVLVV5eHnR/0HBwGbJF7du3r3b9O++8o0ceeUTr1q1TaWmpd/2JHzw2b96sqKioWt/EKv7Iq3gTOFlcXJzPz40aNdIZZ5xxyn7v2bNHxcXF3iHINdm2bZsyMzOrrK+4FGrbtm0++zgxeCV5P4z897//lXT8nCXVetzvv/9exhg99NBDeuihh6pts3v3brVu3drv4/qjutfy8OHDys3N1ezZs/Xjjz/KGON9rKioyO99n2jbtm0688wzq3yQP/E5PZHVc/N4PHruuef04osvasuWLd5QkKTTTz/dUt9P5cRA8lfFHxQn/p5UqG3SesCpyBVyJVD1PVc2bdqkoqIiJScnV/t4xc0DKtT0OxKMYLPo4Ycf1uWXX66zzjpL3bp10+DBg3XDDTeoR48epzx2oOffqVMnn997STrrrLMkSVu3blVqampQ/QGcas+ePTp8+LDOPPPMKo+dffbZWrx4cciOZSV3Tn5vCzSvY2NjfaY1kY6/v5/43r5582alpaUpMTGxxr5v2rRJxphqnydJtU5XIYUn5yr6tX79+irnWMGurCgrK6v2MX+y4sknn9To0aOVnp6ujIwMXXrppRo1apQ6dOhwymMHev7VvX5nnXWWDh06pD179ig1NTWo/qDhoFhoUXVvCB999JEuu+wyXXjhhXrxxRfVqlUrNW7cWLNnz9a8efMC2r/H45F0fL6K1NTUKo9X3K2vwonf+teFk0dQVDgxJE6l4pzvueeeGr/l69SpU8iPW91refvtt2v27Nm666671LdvX8XHx8vlcmnkyJHefoab1XN77LHH9NBDD+lXv/qVpk6dqsTEREVFRemuu+4KW9/3799fY4CeqEmTJoqPj5cktWrVSpK0a9cupaen+7TbtWuX+vTpE/qOAhGMXPFFroRepOWKx+NRcnKyXnvttWofP/mDUTi+RAo2iy688EJt3rxZb7/9tv71r3/pT3/6k5599lnNmjVLN998c63bBnr+/gimPwCCZyV3Tn5vCzSva3pvD5TH45HL5dL//d//VbvPijn0ahKunPN4POrevbumTZtW7eMnv3eHKyvKy8u1e/duny94ysrKtG/fPqWlpdW6/TXXXKP+/ftr4cKF+te//qWnnnpKTzzxhP7+979ryJAhtW4b6Pn7I5j+oOGgWFiDk7+59cdbb72l2NhYLV261OdyltmzZ/u069ixozwej7799lv16tWr2n117NhRkpScnKysrKyA+1KTli1bKi4uTt98802t7dq2bauNGzdWWb9hwwbv44GoOJ9vvvmmxvOp+CajcePGIT1nK6/lm2++qdGjR+uZZ57xrjty5IgKCwst77tt27b66quv5PF4fD6AW31Oa/Lmm2/qoosu0iuvvOKzvrCw0HtTBSnw56W29ldccUWVy92qM3r0aM2ZM0eSvP/2V69e7fNhbOfOnfrhhx80bty4gPoHRDpyhVxxeq7UpKZz6tixo9577z2df/75dTaaPBRZlJiYqDFjxmjMmDE6ePCgLrzwQk2ePNlbnAvV+VeMWDpxf999950k+Uzgf6r+AA1Ny5Yt1aRJk2ovz68ul4IRitwJR1537NhRS5cu1f79+2scXdixY0cZY9S+fXvvqOVA+JtzNantvfL//b//p0suucRS/obCiVlx6aWXetevXr1aHo+nxr+9TtSqVSvddtttuu2227R7926de+65evTRR73FuVCdf3X/zr/77js1bdrU50uoU/UHYM7CGjRr1kyS/H5zk45/q+NyuXwuz9m6dWuVOxQNHz5cUVFRevjhh6t8y1Lx7X52drbi4uL02GOPVXuX2T179vjdrxNFRUVp+PDh+uc//6nVq1dXebzi+JdeeqlWrVqlvLw872MlJSV66aWX1K5du4DngTj33HPVvn17TZ8+vcpzWnHM5ORkDRw4UH/84x+1a9euKvuwes7NmjUL6HWUjr+WJ4+0eP75531e24p9S/79O7n00kuVn5/vvaOmdPxuo88//7yaN2+uAQMGBNTHmlTX9wULFlSZHyXQf+O1tbcyZ+E555yjzp0766WXXvJ5XmfOnCmXy6WrrrrKr34B9QW5Qq44PVdqUtM5XXPNNSovL9fUqVOrbHPs2LGAn2Mrgs2iffv2+fzcvHlzderUyeey5lCd/86dO7Vw4ULvz8XFxfrLX/6iXr16eUcf+dMfoKGJjo5Wdna2Fi1apO3bt3vXr1+/XkuXLg3psUKRO+HI6yuvvFLGGE2ZMqXKYxXv71dccYWio6M1ZcqUKu/5xpgq7y8n8zfnalJxR+STXXPNNfrxxx/18ssvV3ns8OHD3jtIh9PFF1+sxMREzZw502f9zJkz1bRpUw0dOrTGbcvLy6ucV3JystLS0qpkRSjOPy8vz2eOyB07dujtt9/WoEGDFB0d7Xd/AEYW1qBiDrYHHnhAI0eOVOPGjTVs2DDvH3zVGTp0qKZNm6bBgwfruuuu0+7duzVjxgx16tRJX331lbddp06d9MADD2jq1Knq37+/rrjiCrndbn3xxRdKS0tTbm6u4uLiNHPmTN1www0699xzNXLkSLVs2VLbt2/Xu+++q/PPP18vvPCCpXN77LHH9K9//UsDBgzw3n59165dWrBggT7++GMlJCTovvvu09/+9jcNGTJEd9xxhxITE/XnP/9ZW7Zs0VtvvRXwpWlRUVGaOXOmhg0bpl69emnMmDFq1aqVNmzYoH//+9/eoJ4xY4YuuOACde/eXWPHjlWHDh1UUFCgvLw8/fDDD/p//+//BXy+GRkZmjlzph555BF16tRJycnJNc4BUuEXv/iF5s6dq/j4eHXt2lV5eXl67733qszN1KtXL0VHR+uJJ55QUVGR3G63Lr744mrnHxo3bpz++Mc/6sYbb9SaNWvUrl07vfnmm/rkk080ffp0tWjRIuBzq6nvDz/8sMaMGaN+/frp66+/1muvvVZlDoqOHTsqISFBs2bNUosWLdSsWTNlZmbWOM9Hbb8TVuYslKSnnnpKl112mQYNGqSRI0fqm2++0QsvvKCbb77ZO+cW4BTkCrni9FypScW//TvuuEPZ2dmKjo7WyJEjNWDAAP36179Wbm6u1q1bp0GDBqlx48batGmTFixYoOeee87yF0dFRUV6/vnnJUmffPKJJOmFF15QQkKCEhISlJOT420bTBZ17dpVAwcOVEZGhhITE7V69Wq9+eabPvsP1fmfddZZuummm/TFF18oJSVFr776qgoKCnxGGvvTH6AhmjJlipYsWaL+/fvrtttu836xcs455/jkaSgEmzvhyOuLLrpIN9xwg/7whz9o06ZNGjx4sDwejz766CNddNFFysnJUceOHfXII4/o/vvv19atWzV8+HC1aNFCW7Zs0cKFCzVu3Djdc889NR7D35yrSUZGhubPn68JEybovPPOU/PmzTVs2DDdcMMNeuONN3TLLbfogw8+0Pnnn6/y8nJt2LBBb7zxhpYuXVrtDdb8sW3bNs2dO1eSvF94PvLII5KOj86/4YYbJB2/tHnq1KkaP368rr76amVnZ+ujjz7SX//6Vz366KO1zgV54MABnXHGGbrqqqvUs2dPNW/eXO+9956++OILn1GYoTr/bt26KTs7W3fccYfcbrdefPFFSfIWiv3tD1D9vcFh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586duuKKK0LecQCobzxyyWMsLFyyFTbkGgBYZynXyLSwIdMAIEguV+CFQpczcy2gy5CXLFni8/OcOXOUnJysNWvW6MILL1RRUZFeeeUVzZs3TxdffLEkafbs2erSpYs+++wz/c///E/oeg4A9YyxOGeh4YNV2JBrAGCdlVwj08KHTAOAIHEZsldQZ1VUVCRJSkxMlCStWbNGR48eVVZWlrdN586d1aZNG+Xl5VW7j9LSUhUXF/ssAADUBXINAOAUocg0iVwDgIbIcrHQ4/Horrvu0vnnn69u3bpJkvLz8xUTE6OEhASftikpKcrPz692P7m5uYqPj/cu6enpVrsEABHN0iXIPy0IP3INAAJDpkWuUGWaRK4BaECYs9DL8lmNHz9e33zzjV5//fWgOnD//ferqKjIu+zYsSOo/QFApOIGJ5GNXAOAwJBpkStUmSaRawAaEIqFXgHNWVghJydH77zzjj788EOdccYZ3vWpqakqKytTYWGhzzdWBQUFSk1NrXZfbrdbbrfbSjcAoF6xOqKCURjhR64BQOCs5BqZFn6hzDSJXAPQgDBnoVdAZ2WMUU5OjhYuXKj3339f7du393k8IyNDjRs31vLly73rNm7cqO3bt6tv376h6TEA1FOenyaCt7IgPMg1ALCOTIssZBoABImRhV4BjSwcP3685s2bp7ffflstWrTwzm0RHx+vJk2aKD4+XjfddJMmTJigxMRExcXF6fbbb1ffvn25uxaABo+RhZGHXAMA6xhZGFnINAAIEiMLvQIqFs6cOVOSNHDgQJ/1s2fP1o033ihJevbZZxUVFaUrr7xSpaWlys7O1osvvhiSzgIAEErkGgDAKcg0AECoBFQsNMacsk1sbKxmzJihGTNmWO4UADgRIwsjD7kGANYxsjCykGkAECRGFnpZusEJACBwFAsBAE5CsRAA4CgUC72ceVYAEIEqPlRZWQAAiDRkGgDAUVyuwG9u4rKWazNmzFC7du0UGxurzMxMrVq1qsa2L7/8svr376/TTjtNp512mrKysmptHwoUCwHAJkbW7hx56ouKAACwn5VcI9MAABHLprshz58/XxMmTNCkSZP05ZdfqmfPnsrOztbu3burbb9ixQpde+21+uCDD5SXl6f09HQNGjRIP/74Y7BnXCOKhQAAAAAAAIANpk2bprFjx2rMmDHq2rWrZs2apaZN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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "engine": 0 + }, + "output_type": "display_data" + } + ], + "source": [ + "if mpi_rank == 0:\n", + " fig = plt.figure(figsize=(16, 4))\n", + " fig.patch.set_facecolor(\"white\")\n", + " ax_before = fig.add_subplot(131)\n", + " ax_after = fig.add_subplot(132)\n", + " ax_diff = fig.add_subplot(133)\n", + "\n", + " f1 = ax_before.pcolormesh(\n", + " tracer_state[0].data[:, :, 0].T, vmin=-0, vmax=1, cmap=\"viridis\"\n", + " )\n", + " plt.colorbar(f1, ax=ax_before)\n", + " f2 = ax_after.pcolormesh(\n", + " tracer_state[-1].data[:, :, 0].T, vmin=-0, vmax=1, cmap=\"viridis\"\n", + " )\n", + " plt.colorbar(f2, ax=ax_after)\n", + " f3 = ax_diff.pcolormesh(\n", + " (tracer_state[-1].data[:, :, 0] - tracer_state[0].data[:, :, 0]).T,\n", + " vmin=-0.5,\n", + " vmax=0.5,\n", + " cmap=\"bwr\",\n", + " )\n", + " plt.colorbar(f3, ax=ax_diff)\n", + "\n", + " ax_before.set_title(\"tracer concentration at t=0\")\n", + " ax_after.set_title(\"tracer concentration after %s steps\" % nSteps)\n", + " ax_diff.set_title(\"difference after %s steps\" % nSteps)\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "79388634", + "metadata": {}, + "source": [ + "For a faster calculation, we can set the number of vertical levels to 1. This will increase computation speed more significantly once we add more time steps, or more points in the x- and y- dimensions. " + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "ced9db5c", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[0:execute]\n", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)\n", + "Cell \u001b[0;32mIn [17], line 14\u001b[0m\n", + "\u001b[1;32m 10\u001b[0m namelist_dict \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mstore_namelist_variables(\u001b[38;5;28mlocals\u001b[39m())\n", + "\u001b[1;32m 11\u001b[0m dimensions \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mdefine_dimensions(namelist_dict)\n", + "\u001b[0;32m---> 14\u001b[0m domain_configuration \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfigure_domain\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmpi_comm\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msingle_layer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msingle_layer\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 16\u001b[0m initial_state \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mcreate_initial_state_advection(\n", + "\u001b[1;32m 17\u001b[0m domain_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetric_terms\u001b[39m\u001b[38;5;124m\"\u001b[39m], dimensions, tracer_center, test_case\n", + "\u001b[1;32m 18\u001b[0m )\n", + "\u001b[1;32m 20\u001b[0m stencil_configuration \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mconfigure_stencil(domain_configuration, backend\u001b[38;5;241m=\u001b[39mbackend)\n", + "\n", + "File \u001b[0;32m/pace/examples/notebooks/functions.py:269\u001b[0m, in \u001b[0;36mconfigure_domain\u001b[0;34m(mpi_comm, dimensions, single_layer, backend)\u001b[0m\n", + "\u001b[1;32m 256\u001b[0m sizer \u001b[38;5;241m=\u001b[39m SubtileGridSizer\u001b[38;5;241m.\u001b[39mfrom_tile_params(\n", + "\u001b[1;32m 257\u001b[0m nx_tile\u001b[38;5;241m=\u001b[39mdimensions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnx\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[1;32m 258\u001b[0m ny_tile\u001b[38;5;241m=\u001b[39mdimensions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mny\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[0;32m (...)\u001b[0m\n", + "\u001b[1;32m 264\u001b[0m tile_rank\u001b[38;5;241m=\u001b[39mcommunicator\u001b[38;5;241m.\u001b[39mtile\u001b[38;5;241m.\u001b[39mrank,\n", + "\u001b[1;32m 265\u001b[0m )\n", + "\u001b[1;32m 267\u001b[0m quantity_factory \u001b[38;5;241m=\u001b[39m QuantityFactory\u001b[38;5;241m.\u001b[39mfrom_backend(sizer\u001b[38;5;241m=\u001b[39msizer, backend\u001b[38;5;241m=\u001b[39mbackend)\n", + "\u001b[0;32m--> 269\u001b[0m metric_terms \u001b[38;5;241m=\u001b[39m \u001b[43mMetricTerms\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 270\u001b[0m \u001b[43m \u001b[49m\u001b[43mquantity_factory\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquantity_factory\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcommunicator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcommunicator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meta_file\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43meta79.nc\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n", + "\u001b[1;32m 271\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 273\u001b[0m \u001b[38;5;66;03m# workaround for single layer\u001b[39;00m\n", + "\u001b[1;32m 274\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m single_layer:\n", + "\n", + "File \u001b[0;32m/pace/NDSL/ndsl/grid/generation.py:304\u001b[0m, in \u001b[0;36mMetricTerms.__init__\u001b[0;34m(self, quantity_factory, communicator, grid_type, dx_const, dy_const, deglat, extdgrid, eta_file)\u001b[0m\n", + "\u001b[1;32m 297\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_area \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\u001b[1;32m 298\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_area_c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\u001b[1;32m 299\u001b[0m (\n", + "\u001b[1;32m 300\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ks,\n", + "\u001b[1;32m 301\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ptop,\n", + "\u001b[1;32m 302\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ak,\n", + "\u001b[1;32m 303\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bk,\n", + "\u001b[0;32m--> 304\u001b[0m ) \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_set_hybrid_pressure_coefficients\u001b[49m\u001b[43m(\u001b[49m\u001b[43meta_file\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 305\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ec1 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\u001b[1;32m 306\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ec2 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\n", + "File \u001b[0;32m/pace/NDSL/ndsl/grid/generation.py:2172\u001b[0m, in \u001b[0;36mMetricTerms._set_hybrid_pressure_coefficients\u001b[0;34m(self, eta_file)\u001b[0m\n", + "\u001b[1;32m 2162\u001b[0m ak \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mquantity_factory\u001b[38;5;241m.\u001b[39mzeros(\n", + "\u001b[1;32m 2163\u001b[0m [K_INTERFACE_DIM],\n", + "\u001b[1;32m 2164\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPa\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n", + "\u001b[1;32m 2165\u001b[0m dtype\u001b[38;5;241m=\u001b[39mFloat,\n", + "\u001b[1;32m 2166\u001b[0m )\n", + "\u001b[1;32m 2167\u001b[0m bk \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mquantity_factory\u001b[38;5;241m.\u001b[39mzeros(\n", + "\u001b[1;32m 2168\u001b[0m [K_INTERFACE_DIM],\n", + "\u001b[1;32m 2169\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n", + "\u001b[1;32m 2170\u001b[0m dtype\u001b[38;5;241m=\u001b[39mFloat,\n", + "\u001b[1;32m 2171\u001b[0m )\n", + "\u001b[0;32m-> 2172\u001b[0m pressure_coefficients \u001b[38;5;241m=\u001b[39m \u001b[43meta\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_hybrid_pressure_coefficients\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 2173\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_npz\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meta_file\u001b[49m\n", + "\u001b[1;32m 2174\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 2175\u001b[0m ks \u001b[38;5;241m=\u001b[39m pressure_coefficients\u001b[38;5;241m.\u001b[39mks\n", + "\u001b[1;32m 2176\u001b[0m ptop \u001b[38;5;241m=\u001b[39m pressure_coefficients\u001b[38;5;241m.\u001b[39mptop\n", + "\n", + "File \u001b[0;32m/pace/NDSL/ndsl/grid/eta.py:60\u001b[0m, in \u001b[0;36mset_hybrid_pressure_coefficients\u001b[0;34m(km, eta_file)\u001b[0m\n", + "\u001b[1;32m 58\u001b[0m \u001b[38;5;66;03m# check size of ak and bk array is km+1\u001b[39;00m\n", + "\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ak\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m!=\u001b[39m km:\n", + "\u001b[0;32m---> 60\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msize of ak array is not equal to km=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkm\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[1;32m 61\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m bk\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m!=\u001b[39m km:\n", + "\u001b[1;32m 62\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msize of bk array is not equal to km=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkm\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", + "\n", + "\u001b[0;31mValueError\u001b[0m: size of ak array is not equal to km=1\n", + "[4:execute]\n", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)\n", + "Cell \u001b[0;32mIn [17], line 14\u001b[0m\n", + "\u001b[1;32m 10\u001b[0m namelist_dict \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mstore_namelist_variables(\u001b[38;5;28mlocals\u001b[39m())\n", + "\u001b[1;32m 11\u001b[0m dimensions \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mdefine_dimensions(namelist_dict)\n", + "\u001b[0;32m---> 14\u001b[0m domain_configuration \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfigure_domain\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmpi_comm\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msingle_layer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msingle_layer\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 16\u001b[0m initial_state \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mcreate_initial_state_advection(\n", + "\u001b[1;32m 17\u001b[0m domain_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetric_terms\u001b[39m\u001b[38;5;124m\"\u001b[39m], dimensions, tracer_center, test_case\n", + "\u001b[1;32m 18\u001b[0m )\n", + "\u001b[1;32m 20\u001b[0m stencil_configuration \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mconfigure_stencil(domain_configuration, backend\u001b[38;5;241m=\u001b[39mbackend)\n", + "\n", + "File \u001b[0;32m/pace/examples/notebooks/functions.py:269\u001b[0m, in \u001b[0;36mconfigure_domain\u001b[0;34m(mpi_comm, dimensions, single_layer, backend)\u001b[0m\n", + "\u001b[1;32m 256\u001b[0m sizer \u001b[38;5;241m=\u001b[39m SubtileGridSizer\u001b[38;5;241m.\u001b[39mfrom_tile_params(\n", + "\u001b[1;32m 257\u001b[0m nx_tile\u001b[38;5;241m=\u001b[39mdimensions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnx\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[1;32m 258\u001b[0m ny_tile\u001b[38;5;241m=\u001b[39mdimensions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mny\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[0;32m (...)\u001b[0m\n", + "\u001b[1;32m 264\u001b[0m tile_rank\u001b[38;5;241m=\u001b[39mcommunicator\u001b[38;5;241m.\u001b[39mtile\u001b[38;5;241m.\u001b[39mrank,\n", + "\u001b[1;32m 265\u001b[0m )\n", + "\u001b[1;32m 267\u001b[0m quantity_factory \u001b[38;5;241m=\u001b[39m QuantityFactory\u001b[38;5;241m.\u001b[39mfrom_backend(sizer\u001b[38;5;241m=\u001b[39msizer, backend\u001b[38;5;241m=\u001b[39mbackend)\n", + "\u001b[0;32m--> 269\u001b[0m metric_terms \u001b[38;5;241m=\u001b[39m \u001b[43mMetricTerms\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 270\u001b[0m \u001b[43m \u001b[49m\u001b[43mquantity_factory\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquantity_factory\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcommunicator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcommunicator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meta_file\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43meta79.nc\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n", + "\u001b[1;32m 271\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 273\u001b[0m \u001b[38;5;66;03m# workaround for single layer\u001b[39;00m\n", + "\u001b[1;32m 274\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m single_layer:\n", + "\n", + "File \u001b[0;32m/pace/NDSL/ndsl/grid/generation.py:304\u001b[0m, in \u001b[0;36mMetricTerms.__init__\u001b[0;34m(self, quantity_factory, communicator, grid_type, dx_const, dy_const, deglat, extdgrid, eta_file)\u001b[0m\n", + "\u001b[1;32m 297\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_area \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\u001b[1;32m 298\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_area_c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\u001b[1;32m 299\u001b[0m (\n", + "\u001b[1;32m 300\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ks,\n", + "\u001b[1;32m 301\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ptop,\n", + "\u001b[1;32m 302\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ak,\n", + "\u001b[1;32m 303\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bk,\n", + "\u001b[0;32m--> 304\u001b[0m ) \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_set_hybrid_pressure_coefficients\u001b[49m\u001b[43m(\u001b[49m\u001b[43meta_file\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 305\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ec1 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\u001b[1;32m 306\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ec2 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\n", + "File \u001b[0;32m/pace/NDSL/ndsl/grid/generation.py:2172\u001b[0m, in \u001b[0;36mMetricTerms._set_hybrid_pressure_coefficients\u001b[0;34m(self, eta_file)\u001b[0m\n", + "\u001b[1;32m 2162\u001b[0m ak \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mquantity_factory\u001b[38;5;241m.\u001b[39mzeros(\n", + "\u001b[1;32m 2163\u001b[0m [K_INTERFACE_DIM],\n", + "\u001b[1;32m 2164\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPa\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n", + "\u001b[1;32m 2165\u001b[0m dtype\u001b[38;5;241m=\u001b[39mFloat,\n", + "\u001b[1;32m 2166\u001b[0m )\n", + "\u001b[1;32m 2167\u001b[0m bk \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mquantity_factory\u001b[38;5;241m.\u001b[39mzeros(\n", + "\u001b[1;32m 2168\u001b[0m [K_INTERFACE_DIM],\n", + "\u001b[1;32m 2169\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n", + "\u001b[1;32m 2170\u001b[0m dtype\u001b[38;5;241m=\u001b[39mFloat,\n", + "\u001b[1;32m 2171\u001b[0m )\n", + "\u001b[0;32m-> 2172\u001b[0m pressure_coefficients \u001b[38;5;241m=\u001b[39m \u001b[43meta\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_hybrid_pressure_coefficients\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 2173\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_npz\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meta_file\u001b[49m\n", + "\u001b[1;32m 2174\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 2175\u001b[0m ks \u001b[38;5;241m=\u001b[39m pressure_coefficients\u001b[38;5;241m.\u001b[39mks\n", + "\u001b[1;32m 2176\u001b[0m ptop \u001b[38;5;241m=\u001b[39m pressure_coefficients\u001b[38;5;241m.\u001b[39mptop\n", + "\n", + "File \u001b[0;32m/pace/NDSL/ndsl/grid/eta.py:60\u001b[0m, in \u001b[0;36mset_hybrid_pressure_coefficients\u001b[0;34m(km, eta_file)\u001b[0m\n", + "\u001b[1;32m 58\u001b[0m \u001b[38;5;66;03m# check size of ak and bk array is km+1\u001b[39;00m\n", + "\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ak\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m!=\u001b[39m km:\n", + "\u001b[0;32m---> 60\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msize of ak array is not equal to km=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkm\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[1;32m 61\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m bk\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m!=\u001b[39m km:\n", + "\u001b[1;32m 62\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msize of bk array is not equal to km=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkm\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", + "\n", + "\u001b[0;31mValueError\u001b[0m: size of ak array is not equal to km=1\n", + "[5:execute]\n", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)\n", + "Cell \u001b[0;32mIn [17], line 14\u001b[0m\n", + "\u001b[1;32m 10\u001b[0m namelist_dict \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mstore_namelist_variables(\u001b[38;5;28mlocals\u001b[39m())\n", + "\u001b[1;32m 11\u001b[0m dimensions \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mdefine_dimensions(namelist_dict)\n", + "\u001b[0;32m---> 14\u001b[0m domain_configuration \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfigure_domain\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmpi_comm\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msingle_layer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msingle_layer\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 16\u001b[0m initial_state \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mcreate_initial_state_advection(\n", + "\u001b[1;32m 17\u001b[0m domain_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetric_terms\u001b[39m\u001b[38;5;124m\"\u001b[39m], dimensions, tracer_center, test_case\n", + "\u001b[1;32m 18\u001b[0m )\n", + "\u001b[1;32m 20\u001b[0m stencil_configuration \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mconfigure_stencil(domain_configuration, backend\u001b[38;5;241m=\u001b[39mbackend)\n", + "\n", + "File \u001b[0;32m/pace/examples/notebooks/functions.py:269\u001b[0m, in \u001b[0;36mconfigure_domain\u001b[0;34m(mpi_comm, dimensions, single_layer, backend)\u001b[0m\n", + "\u001b[1;32m 256\u001b[0m sizer \u001b[38;5;241m=\u001b[39m SubtileGridSizer\u001b[38;5;241m.\u001b[39mfrom_tile_params(\n", + "\u001b[1;32m 257\u001b[0m nx_tile\u001b[38;5;241m=\u001b[39mdimensions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnx\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[1;32m 258\u001b[0m ny_tile\u001b[38;5;241m=\u001b[39mdimensions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mny\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[0;32m (...)\u001b[0m\n", + "\u001b[1;32m 264\u001b[0m tile_rank\u001b[38;5;241m=\u001b[39mcommunicator\u001b[38;5;241m.\u001b[39mtile\u001b[38;5;241m.\u001b[39mrank,\n", + "\u001b[1;32m 265\u001b[0m )\n", + "\u001b[1;32m 267\u001b[0m quantity_factory \u001b[38;5;241m=\u001b[39m QuantityFactory\u001b[38;5;241m.\u001b[39mfrom_backend(sizer\u001b[38;5;241m=\u001b[39msizer, backend\u001b[38;5;241m=\u001b[39mbackend)\n", + "\u001b[0;32m--> 269\u001b[0m metric_terms \u001b[38;5;241m=\u001b[39m \u001b[43mMetricTerms\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 270\u001b[0m \u001b[43m \u001b[49m\u001b[43mquantity_factory\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquantity_factory\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcommunicator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcommunicator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meta_file\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43meta79.nc\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n", + "\u001b[1;32m 271\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 273\u001b[0m \u001b[38;5;66;03m# workaround for single layer\u001b[39;00m\n", + "\u001b[1;32m 274\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m single_layer:\n", + "\n", + "File \u001b[0;32m/pace/NDSL/ndsl/grid/generation.py:304\u001b[0m, in \u001b[0;36mMetricTerms.__init__\u001b[0;34m(self, quantity_factory, communicator, grid_type, dx_const, dy_const, deglat, extdgrid, eta_file)\u001b[0m\n", + "\u001b[1;32m 297\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_area \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\u001b[1;32m 298\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_area_c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\u001b[1;32m 299\u001b[0m (\n", + "\u001b[1;32m 300\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ks,\n", + "\u001b[1;32m 301\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ptop,\n", + "\u001b[1;32m 302\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ak,\n", + "\u001b[1;32m 303\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bk,\n", + "\u001b[0;32m--> 304\u001b[0m ) \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_set_hybrid_pressure_coefficients\u001b[49m\u001b[43m(\u001b[49m\u001b[43meta_file\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 305\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ec1 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\u001b[1;32m 306\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ec2 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\n", + "File \u001b[0;32m/pace/NDSL/ndsl/grid/generation.py:2172\u001b[0m, in \u001b[0;36mMetricTerms._set_hybrid_pressure_coefficients\u001b[0;34m(self, eta_file)\u001b[0m\n", + "\u001b[1;32m 2162\u001b[0m ak \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mquantity_factory\u001b[38;5;241m.\u001b[39mzeros(\n", + "\u001b[1;32m 2163\u001b[0m [K_INTERFACE_DIM],\n", + "\u001b[1;32m 2164\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPa\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n", + "\u001b[1;32m 2165\u001b[0m dtype\u001b[38;5;241m=\u001b[39mFloat,\n", + "\u001b[1;32m 2166\u001b[0m )\n", + "\u001b[1;32m 2167\u001b[0m bk \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mquantity_factory\u001b[38;5;241m.\u001b[39mzeros(\n", + "\u001b[1;32m 2168\u001b[0m [K_INTERFACE_DIM],\n", + "\u001b[1;32m 2169\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n", + "\u001b[1;32m 2170\u001b[0m dtype\u001b[38;5;241m=\u001b[39mFloat,\n", + "\u001b[1;32m 2171\u001b[0m )\n", + "\u001b[0;32m-> 2172\u001b[0m pressure_coefficients \u001b[38;5;241m=\u001b[39m \u001b[43meta\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_hybrid_pressure_coefficients\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 2173\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_npz\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meta_file\u001b[49m\n", + "\u001b[1;32m 2174\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 2175\u001b[0m ks \u001b[38;5;241m=\u001b[39m pressure_coefficients\u001b[38;5;241m.\u001b[39mks\n", + "\u001b[1;32m 2176\u001b[0m ptop \u001b[38;5;241m=\u001b[39m pressure_coefficients\u001b[38;5;241m.\u001b[39mptop\n", + "\n", + "File \u001b[0;32m/pace/NDSL/ndsl/grid/eta.py:60\u001b[0m, in \u001b[0;36mset_hybrid_pressure_coefficients\u001b[0;34m(km, eta_file)\u001b[0m\n", + "\u001b[1;32m 58\u001b[0m \u001b[38;5;66;03m# check size of ak and bk array is km+1\u001b[39;00m\n", + "\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ak\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m!=\u001b[39m km:\n", + "\u001b[0;32m---> 60\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msize of ak array is not equal to km=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkm\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[1;32m 61\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m bk\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m!=\u001b[39m km:\n", + "\u001b[1;32m 62\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msize of bk array is not equal to km=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkm\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", + "\n", + "\u001b[0;31mValueError\u001b[0m: size of ak array is not equal to km=1\n", + "[3:execute]\n", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)\n", + "Cell \u001b[0;32mIn [17], line 14\u001b[0m\n", + "\u001b[1;32m 10\u001b[0m namelist_dict \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mstore_namelist_variables(\u001b[38;5;28mlocals\u001b[39m())\n", + "\u001b[1;32m 11\u001b[0m dimensions \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mdefine_dimensions(namelist_dict)\n", + "\u001b[0;32m---> 14\u001b[0m domain_configuration \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfigure_domain\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmpi_comm\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msingle_layer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msingle_layer\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 16\u001b[0m initial_state \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mcreate_initial_state_advection(\n", + "\u001b[1;32m 17\u001b[0m domain_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetric_terms\u001b[39m\u001b[38;5;124m\"\u001b[39m], dimensions, tracer_center, test_case\n", + "\u001b[1;32m 18\u001b[0m )\n", + "\u001b[1;32m 20\u001b[0m stencil_configuration \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mconfigure_stencil(domain_configuration, backend\u001b[38;5;241m=\u001b[39mbackend)\n", + "\n", + "File \u001b[0;32m/pace/examples/notebooks/functions.py:269\u001b[0m, in \u001b[0;36mconfigure_domain\u001b[0;34m(mpi_comm, dimensions, single_layer, backend)\u001b[0m\n", + "\u001b[1;32m 256\u001b[0m sizer \u001b[38;5;241m=\u001b[39m SubtileGridSizer\u001b[38;5;241m.\u001b[39mfrom_tile_params(\n", + "\u001b[1;32m 257\u001b[0m nx_tile\u001b[38;5;241m=\u001b[39mdimensions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnx\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[1;32m 258\u001b[0m ny_tile\u001b[38;5;241m=\u001b[39mdimensions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mny\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", + "\u001b[0;32m (...)\u001b[0m\n", + "\u001b[1;32m 264\u001b[0m tile_rank\u001b[38;5;241m=\u001b[39mcommunicator\u001b[38;5;241m.\u001b[39mtile\u001b[38;5;241m.\u001b[39mrank,\n", + "\u001b[1;32m 265\u001b[0m )\n", + "\u001b[1;32m 267\u001b[0m quantity_factory \u001b[38;5;241m=\u001b[39m QuantityFactory\u001b[38;5;241m.\u001b[39mfrom_backend(sizer\u001b[38;5;241m=\u001b[39msizer, backend\u001b[38;5;241m=\u001b[39mbackend)\n", + "\u001b[0;32m--> 269\u001b[0m metric_terms \u001b[38;5;241m=\u001b[39m \u001b[43mMetricTerms\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 270\u001b[0m \u001b[43m \u001b[49m\u001b[43mquantity_factory\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquantity_factory\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcommunicator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcommunicator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meta_file\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43meta79.nc\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n", + "\u001b[1;32m 271\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 273\u001b[0m \u001b[38;5;66;03m# workaround for single layer\u001b[39;00m\n", + "\u001b[1;32m 274\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m single_layer:\n", + "\n", + "File \u001b[0;32m/pace/NDSL/ndsl/grid/generation.py:304\u001b[0m, in \u001b[0;36mMetricTerms.__init__\u001b[0;34m(self, quantity_factory, communicator, grid_type, dx_const, dy_const, deglat, extdgrid, eta_file)\u001b[0m\n", + "\u001b[1;32m 297\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_area \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\u001b[1;32m 298\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_area_c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\u001b[1;32m 299\u001b[0m (\n", + "\u001b[1;32m 300\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ks,\n", + "\u001b[1;32m 301\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ptop,\n", + "\u001b[1;32m 302\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ak,\n", + "\u001b[1;32m 303\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bk,\n", + "\u001b[0;32m--> 304\u001b[0m ) \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_set_hybrid_pressure_coefficients\u001b[49m\u001b[43m(\u001b[49m\u001b[43meta_file\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 305\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ec1 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\u001b[1;32m 306\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ec2 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\n", + "File \u001b[0;32m/pace/NDSL/ndsl/grid/generation.py:2172\u001b[0m, in \u001b[0;36mMetricTerms._set_hybrid_pressure_coefficients\u001b[0;34m(self, eta_file)\u001b[0m\n", + "\u001b[1;32m 2162\u001b[0m ak \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mquantity_factory\u001b[38;5;241m.\u001b[39mzeros(\n", + "\u001b[1;32m 2163\u001b[0m [K_INTERFACE_DIM],\n", + "\u001b[1;32m 2164\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPa\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n", + "\u001b[1;32m 2165\u001b[0m dtype\u001b[38;5;241m=\u001b[39mFloat,\n", + "\u001b[1;32m 2166\u001b[0m )\n", + "\u001b[1;32m 2167\u001b[0m bk \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mquantity_factory\u001b[38;5;241m.\u001b[39mzeros(\n", + "\u001b[1;32m 2168\u001b[0m [K_INTERFACE_DIM],\n", + "\u001b[1;32m 2169\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n", + "\u001b[1;32m 2170\u001b[0m dtype\u001b[38;5;241m=\u001b[39mFloat,\n", + "\u001b[1;32m 2171\u001b[0m )\n", + "\u001b[0;32m-> 2172\u001b[0m pressure_coefficients \u001b[38;5;241m=\u001b[39m \u001b[43meta\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_hybrid_pressure_coefficients\u001b[49m\u001b[43m(\u001b[49m\n", + "\u001b[1;32m 2173\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_npz\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meta_file\u001b[49m\n", + "\u001b[1;32m 2174\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;32m 2175\u001b[0m ks \u001b[38;5;241m=\u001b[39m pressure_coefficients\u001b[38;5;241m.\u001b[39mks\n", + "\u001b[1;32m 2176\u001b[0m ptop \u001b[38;5;241m=\u001b[39m pressure_coefficients\u001b[38;5;241m.\u001b[39mptop\n", + "\n", + "File \u001b[0;32m/pace/NDSL/ndsl/grid/eta.py:60\u001b[0m, in \u001b[0;36mset_hybrid_pressure_coefficients\u001b[0;34m(km, eta_file)\u001b[0m\n", + "\u001b[1;32m 58\u001b[0m \u001b[38;5;66;03m# check size of ak and bk array is km+1\u001b[39;00m\n", + "\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ak\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m!=\u001b[39m km:\n", + "\u001b[0;32m---> 60\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msize of ak array is not equal to km=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkm\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[1;32m 61\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m bk\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m!=\u001b[39m km:\n", + "\u001b[1;32m 62\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msize of bk array is not equal to km=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkm\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", + "\n", + "\u001b[0;31mValueError\u001b[0m: size of ak array is not equal to km=1\n", + "[1:execute] ValueError: size of ak array is not equal to km=1\n", + "[2:execute] ValueError: size of ak array is not equal to km=1\n" + ] + }, + { + "ename": "AlreadyDisplayedError", + "evalue": "6 errors", + "output_type": "error", + "traceback": [ + "6 errors" + ] + } + ], + "source": [ + "mpi_comm = MPI.COMM_WORLD\n", + "mpi_rank = mpi_comm.Get_rank()\n", + "\n", + "nz = 1\n", + "if nz == 1:\n", + " single_layer = True\n", + "else:\n", + " single_layer = False\n", + "\n", + "namelist_dict = func.store_namelist_variables(locals())\n", + "dimensions = func.define_dimensions(namelist_dict)\n", + "\n", + "\n", + "domain_configuration = func.configure_domain(mpi_comm, dimensions, single_layer=single_layer)\n", + "\n", + "initial_state = func.create_initial_state_advection(\n", + " domain_configuration[\"metric_terms\"], dimensions, tracer_center, test_case\n", + ")\n", + "\n", + "stencil_configuration = func.configure_stencil(domain_configuration, backend=backend)\n", + "stencil_configuration[\"quantity_factory\"] = domain_configuration[\"quantity_factory\"]\n", + "\n", + "tracer_advection_data, tracer_advection = func.prepare_everything_for_advection(\n", + " stencil_configuration, initial_state, dimensions, timestep\n", + ")\n", + "\n", + "tracer_advection_data_initial = cp.deepcopy(tracer_advection_data)\n", + "\n", + "tracer_state = [cp.deepcopy(tracer_advection_data_initial[\"tracers\"][\"tracer\"])]\n", + "\n", + "nSteps = 10\n", + "for step in range(nSteps):\n", + " tracer_advection_data = func.run_advection_step_with_reset(\n", + " tracer_advection_data_initial, tracer_advection_data, tracer_advection\n", + " )\n", + "\n", + " tracer_state.append(cp.deepcopy(tracer_advection_data[\"tracers\"][\"tracer\"]))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "783a781e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[output:0]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABQsAAAF2CAYAAADJMM7PAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABqNUlEQVR4nO3deXxU1f3/8fckkAlbEmNIQjDsKiBbDZIvKIKaEpCi1A3UryBVqErcqK1alUXUuCJWEapVaKlURAu2yheKKLhFEYSfWgGRsikkbE0CARLInN8fmAlDFmbuzNxMbl7Px+M+NHfOvffcGTLvzGfOPddljDECAAAAAAAA0OBF1XUHAAAAAAAAAEQGioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioVAmAwcOFADBw6s624AAByiPuRKQUGBrrrqKp1++ulyuVyaPn16XXcJAGo0efJkuVwun3Xt2rXTjTfe6LNu06ZNGjRokOLj4+VyubRo0SJJ0hdffKF+/fqpWbNmcrlcWrdunT0dr+dqej4BRA6KhTX49NNPNXnyZBUWFtZ1VxCkF198UXPmzAnLvr/99ltNnjxZW7duDcv+w2nnzp2aPHmy33/UhOt34h//+IfOPfdcxcbGqk2bNpo0aZKOHTsW0mMAkYBccQ5ypWZ33323li5dqvvvv19z587V4MGDtXjxYk2ePNnWfmzcuFF33323+vXrp9jYWLlcrlqf03BmUV2cP4DQGj16tL7++ms9+uijmjt3rnr37q2jR4/q6quv1v79+/Xss89q7ty5atu2bV13tV6o7vmcN2+e7V8wrVq1SrfddpsyMjLUuHHjKoXjk73yyivq0qWLYmNjdeaZZ+r5558PWV/q4vyBWhlU66mnnjKSzJYtW+q6KwjSOeecYwYMGBCWfS9YsMBIMh988EGVx0pLS01paWlYjhsKX3zxhZFkZs+e7Vf7cPxOLF682LhcLnPRRReZl156ydx+++0mKirK3HLLLSE7BhApyBXnIFdqlpKSYq6//nqfdePHjzd2/8k5e/ZsExUVZbp162Z69epV6+9euLOoLs4fgH8mTZpU5ffzyJEjpqyszPvzoUOHjCTzwAMP+LRbv369kWRefvllW/rqFDU9n0OHDjVt27a1tS+TJk0yjRs3NhkZGeass86q9b161qxZRpK58sorzUsvvWRuuOEGI8k8/vjjIelLXZw/UJtG9pcnncfj8aisrEyxsbF13RWvkpISNWvWrK67Ue+E8nmLiYkJyX6c7J577lGPHj30r3/9S40aHX87iouL02OPPaY777xTnTt3ruMeAnWDXHGOhpYru3fvVkJCQtiPY4zRkSNH1KRJk2ofv+yyy1RYWKgWLVro6aefrnUUPVkE4ERut9vn5z179khSlfe23bt3V7s+GA0ha2t6PsPhVH9P3Xrrrbr33nvVpEkT5eTk6Lvvvqu23eHDh/XAAw9o6NChevPNNyVJY8eOlcfj0dSpUzVu3DiddtppYTsPoE7UdbUyElV8w3TyUvGNtCQzfvx489e//tV07drVNGrUyCxcuNAYc3zkSN++fU1iYqKJjY015557rlmwYEG1x5k7d64577zzTJMmTUxCQoLp37+/Wbp0qU+bxYsXmwsuuMA0bdrUNG/e3Fx66aXmm2++8WkzevRo06xZM/P999+bIUOGmObNm5vLL7+81nP84YcfzK9+9SvTqlUrExMTY9q1a2duueUWnxELmzdvNldddZU57bTTTJMmTUxmZqZ55513fPbzwQcfGElm/vz55pFHHjGtW7c2brfbXHzxxWbTpk1VjvvZZ5+ZIUOGmISEBNO0aVPTvXt3M336dJ8269evN1deeaU57bTTjNvtNhkZGebtt9/2aTN79mwjyXz88cfm7rvvNklJSaZp06Zm+PDhZvfu3d52bdu2rfI6VowGqdjHihUrzK233mpatmxpEhISjDHGbN261dx6663mrLPOMrGxsSYxMdFcddVVPqMSKrY/eakYDTJgwIAqI08KCgrMr371K5OcnGzcbrfp0aOHmTNnjk+bLVu2GEnmqaeeMn/84x9Nhw4dTExMjOndu7dZtWpVzS/qT/bt22d+85vfmG7duplmzZqZFi1amMGDB5t169ZVed1OXmoaZXiq3wkr/v3vfxtJZsaMGT7rf/zxRyPJTJ061fK+gUhDrhxHrjg3V2rq++jRo6tdX6G8vNw8++yzpmvXrsbtdpvk5GQzbtw4s3//fp8+tG3b1gwdOtQsWbLEZGRkGLfbbZ599tlT9t2Y2kf1BptFZWVlZvLkyaZTp07G7XabxMREc/7555t//etfxhgT8vNfunSp6dmzp3G73aZLly7mrbfeCqg/QEP20Ucfmd69exu32206dOhgZs2aVe3IwrZt25rRo0cbY6rP74rHa8oCYwLLneoyw5jA8vqHH34wl19+uWnWrJlJSkoyv/nNb8yxY8d82paXl5vp06ebbt26GbfbbZKSkkx2drb54osvfNrNnTvXnHvuuSY2NtacdtppZsSIEWb79u2nfH79ybmans8BAwZUu77CkSNHzMSJE03Hjh1NTEyMOeOMM8xvf/tbc+TIEZ8+1Pb31KnUNgr83XffNZLMu+++67P+008/NZLM3Llza913cXGxufPOO03btm1NTEyMadmypcnKyjJr1qwxxpiwnP9ZZ51l3G63Offcc83KlSsD6g9gDCMLq3XFFVfou+++09/+9jc9++yzSkpKkiS1bNnS2+b999/XG2+8oZycHCUlJaldu3aSpOeee06XXXaZrr/+epWVlen111/X1VdfrXfeeUdDhw71bj9lyhRNnjxZ/fr108MPP6yYmBh9/vnnev/99zVo0CBJ0ty5czV69GhlZ2friSee0KFDhzRz5kxdcMEFWrt2rfeYknTs2DFlZ2frggsu0NNPP62mTZvWeH47d+5Unz59VFhYqHHjxqlz58768ccf9eabb+rQoUOKiYlRQUGB+vXrp0OHDumOO+7Q6aefrj//+c+67LLL9Oabb+qXv/ylzz4ff/xxRUVF6Z577lFRUZGefPJJXX/99fr888+9bZYtW6Zf/OIXatWqle68806lpqZq/fr1euedd3TnnXdKkv7973/r/PPPV+vWrXXfffepWbNmeuONNzR8+HC99dZbVY57++2367TTTtOkSZO0detWTZ8+XTk5OZo/f74kafr06br99tvVvHlzPfDAA5KklJQUn33cdtttatmypSZOnKiSkhJJxycr/vTTTzVy5EidccYZ2rp1q2bOnKmBAwfq22+/VdOmTXXhhRfqjjvu0B/+8Af9/ve/V5cuXSTJ+9+THT58WAMHDtT333+vnJwctW/fXgsWLNCNN96owsJC73NQYd68eTpw4IB+/etfy+Vy6cknn9QVV1yh//znP2rcuHGNr+9//vMfLVq0SFdffbXat2+vgoIC/fGPf9SAAQP07bffKi0tTV26dNHDDz+siRMnaty4cerfv78kqV+/ftXu81S/E0VFRTp69GiNfaoQGxur5s2bS5LWrl0rSerdu7dPm7S0NJ1xxhnexwEnIFfIFafnyoUXXqi5c+fqhhtu0M9//nONGjVKktSxY0ft3LlTy5Yt09y5c6vs+9e//rXmzJmjMWPG6I477tCWLVv0wgsvaO3atfrkk098+rVx40Zde+21+vWvf62xY8fq7LPPrrHP/go2iyZPnqzc3FzdfPPN6tOnj4qLi7V69Wp9+eWX+vnPf65f//rXITv/TZs2acSIEbrllls0evRozZ49W1dffbWWLFmin//85371B2iovv76aw0aNEgtW7bU5MmTdezYMU2aNKnK+/fJrrjiCiUkJOjuu+/Wtddeq0svvVTNmzdXSkqKWrdurccee0x33HGHzjvvPO++As2d6jIjkLwuLy9Xdna2MjMz9fTTT+u9997TM888o44dO+rWW2/1trvppps0Z84cDRkyRDfffLOOHTumjz76SJ999pn3PfDRRx/VQw89pGuuuUY333yz9uzZo+eff14XXnih1q5dW+toQH9yrqbns1mzZioqKtIPP/ygZ599VpK8nxk8Ho8uu+wyffzxxxo3bpy6dOmir7/+Ws8++6y+++67KjdHqenvqWDUlBUZGRmKiorS2rVr9b//+781bn/LLbfozTffVE5Ojrp27ap9+/bp448/1vr163XuuefqgQceCNn5r1y5UvPnz9cdd9wht9utF198UYMHD9aqVavUrVs3v/oDSGJkYU1q+xZakomKijL//ve/qzx26NAhn5/LyspMt27dzMUXX+xdt2nTJhMVFWV++ctfmvLycp/2Ho/HGGPMgQMHTEJCghk7dqzP4/n5+SY+Pt5nfcU3W/fdd59f5zZq1CgTFRVV5VukE49/1113GUnmo48+8j524MAB0759e9OuXTtvvytGgHTp0sVn9Mhzzz1nJJmvv/7aGGPMsWPHTPv27U3btm3Nf//732qPaYwxl1xyienevbvPtyQej8f069fPnHnmmd51Fd/EZWVl+Wx/9913m+joaFNYWOhdV9PcUhX7uOCCC6p883by62iMMXl5eUaS+ctf/uJdV9vcUiePAJk+fbqRZP76179615WVlZm+ffua5s2bm+LiYmNM5QiQ008/3Wdkwdtvv20kmX/+859VjnWiI0eOVPl3tWXLFuN2u83DDz/sXRfKOQur+zasuqXiW9oT91fdN5XnnXee+Z//+R+/+gXUF+QKuXIyp+WKMZWjGk5U02iNjz76yEgyr732ms/6JUuWVFlfMaJzyZIltfa1OrX97gWbRT179jRDhw6ttU0oz//EkYRFRUWmVatW5mc/+1lA/QEaouHDh5vY2Fizbds277pvv/3WREdH1zqy0Bjf0dknqsirk0f7B5o7J2eGlbw++b34Zz/7mcnIyPD+/P777xtJ5o477qjy3FRk3tatW010dLR59NFHfR7/+uuvTaNGjaqsP5m/OVfT81nTnH1z5841UVFRPn8/GFM5h+Ann3ziXVfb31OnUtvIwvHjx5vo6OhqH2vZsqUZOXJkrfuOj4+vko0nC9X5SzKrV6/2rtu2bZuJjY01v/zlLwPqD8DdkC0aMGCAunbtWmX9iXPn/Pe//1VRUZH69++vL7/80rt+0aJF8ng8mjhxoqKifF+CijswLVu2TIWFhbr22mu1d+9e7xIdHa3MzEx98MEHVY594jdHNfF4PFq0aJGGDRtW5ZuRE4+/ePFi9enTRxdccIH3sebNm2vcuHHaunWrvv32W5/txowZ4zOXUsVItf/85z+Sjn8bs2XLFt11111VvpGqOOb+/fv1/vvv65prrtGBAwe857xv3z5lZ2dr06ZN+vHHH322HTdunM9dq/r376/y8nJt27btlM9FhbFjxyo6Otpn3Ymv49GjR7Vv3z516tRJCQkJPq9lIBYvXqzU1FRde+213nWNGzfWHXfcoYMHD2rlypU+7UeMGOEz98XJz2lN3G63999VeXm59u3bp+bNm+vss8+23PdTeeaZZ7Rs2bJTLr/73e+82xw+fNjb35PFxsZ6HwcaCnKFXAlUfc+VBQsWKD4+Xj//+c99/k1mZGSoefPmVf5Ntm/fXtnZ2ZaPV51gsyghIUH//ve/tWnTpoCPHej5p6Wl+YxIiouL06hRo7R27Vrl5+cH3R/AqcrLy7V06VINHz5cbdq08a7v0qVLyN9TrOTOyZlhJa9vueUWn5/79+/v897+1ltvyeVyadKkSVW2rci8v//97/J4PLrmmmt8jpuamqozzzyz2uOeKBw5Jx1/r+zSpYs6d+7s06+LL75Ykqr0q6a/p4Jx+PDhGucN9jcrPv/8c+3cuTPgYwd6/n379lVGRob35zZt2ujyyy/X0qVLVV5eHnR/0HBwGbJF7du3r3b9O++8o0ceeUTr1q1TaWmpd/2JHzw2b96sqKioWt/EKv7Iq3gTOFlcXJzPz40aNdIZZ5xxyn7v2bNHxcXF3iHINdm2bZsyMzOrrK+4FGrbtm0++zgxeCV5P4z897//lXT8nCXVetzvv/9exhg99NBDeuihh6pts3v3brVu3drv4/qjutfy8OHDys3N1ezZs/Xjjz/KGON9rKioyO99n2jbtm0688wzq3yQP/E5PZHVc/N4PHruuef04osvasuWLd5QkKTTTz/dUt9P5cRA8lfFHxQn/p5UqG3SesCpyBVyJVD1PVc2bdqkoqIiJScnV/t4xc0DKtT0OxKMYLPo4Ycf1uWXX66zzjpL3bp10+DBg3XDDTeoR48epzx2oOffqVMnn997STrrrLMkSVu3blVqampQ/QGcas+ePTp8+LDOPPPMKo+dffbZWrx4cciOZSV3Tn5vCzSvY2NjfaY1kY6/v5/43r5582alpaUpMTGxxr5v2rRJxphqnydJtU5XIYUn5yr6tX79+irnWMGurCgrK6v2MX+y4sknn9To0aOVnp6ujIwMXXrppRo1apQ6dOhwymMHev7VvX5nnXWWDh06pD179ig1NTWo/qDhoFhoUXVvCB999JEuu+wyXXjhhXrxxRfVqlUrNW7cWLNnz9a8efMC2r/H45F0fL6K1NTUKo9X3K2vwonf+teFk0dQVDgxJE6l4pzvueeeGr/l69SpU8iPW91refvtt2v27Nm666671LdvX8XHx8vlcmnkyJHefoab1XN77LHH9NBDD+lXv/qVpk6dqsTEREVFRemuu+4KW9/3799fY4CeqEmTJoqPj5cktWrVSpK0a9cupaen+7TbtWuX+vTpE/qOAhGMXPFFroRepOWKx+NRcnKyXnvttWofP/mDUTi+RAo2iy688EJt3rxZb7/9tv71r3/pT3/6k5599lnNmjVLN998c63bBnr+/gimPwCCZyV3Tn5vCzSva3pvD5TH45HL5dL//d//VbvPijn0ahKunPN4POrevbumTZtW7eMnv3eHKyvKy8u1e/duny94ysrKtG/fPqWlpdW6/TXXXKP+/ftr4cKF+te//qWnnnpKTzzxhP7+979ryJAhtW4b6Pn7I5j+oOGgWFiDk7+59cdbb72l2NhYLV261OdyltmzZ/u069ixozwej7799lv16tWr2n117NhRkpScnKysrKyA+1KTli1bKi4uTt98802t7dq2bauNGzdWWb9hwwbv44GoOJ9vvvmmxvOp+CajcePGIT1nK6/lm2++qdGjR+uZZ57xrjty5IgKCwst77tt27b66quv5PF4fD6AW31Oa/Lmm2/qoosu0iuvvOKzvrCw0HtTBSnw56W29ldccUWVy92qM3r0aM2ZM0eSvP/2V69e7fNhbOfOnfrhhx80bty4gPoHRDpyhVxxeq7UpKZz6tixo9577z2df/75dTaaPBRZlJiYqDFjxmjMmDE6ePCgLrzwQk2ePNlbnAvV+VeMWDpxf999950k+Uzgf6r+AA1Ny5Yt1aRJk2ovz68ul4IRitwJR1537NhRS5cu1f79+2scXdixY0cZY9S+fXvvqOVA+JtzNantvfL//b//p0suucRS/obCiVlx6aWXetevXr1aHo+nxr+9TtSqVSvddtttuu2227R7926de+65evTRR73FuVCdf3X/zr/77js1bdrU50uoU/UHYM7CGjRr1kyS/H5zk45/q+NyuXwuz9m6dWuVOxQNHz5cUVFRevjhh6t8y1Lx7X52drbi4uL02GOPVXuX2T179vjdrxNFRUVp+PDh+uc//6nVq1dXebzi+JdeeqlWrVqlvLw872MlJSV66aWX1K5du4DngTj33HPVvn17TZ8+vcpzWnHM5ORkDRw4UH/84x+1a9euKvuwes7NmjUL6HWUjr+WJ4+0eP75531e24p9S/79O7n00kuVn5/vvaOmdPxuo88//7yaN2+uAQMGBNTHmlTX9wULFlSZHyXQf+O1tbcyZ+E555yjzp0766WXXvJ5XmfOnCmXy6WrrrrKr34B9QW5Qq44PVdqUtM5XXPNNSovL9fUqVOrbHPs2LGAn2Mrgs2iffv2+fzcvHlzderUyeey5lCd/86dO7Vw4ULvz8XFxfrLX/6iXr16eUcf+dMfoKGJjo5Wdna2Fi1apO3bt3vXr1+/XkuXLg3psUKRO+HI6yuvvFLGGE2ZMqXKYxXv71dccYWio6M1ZcqUKu/5xpgq7y8n8zfnalJxR+STXXPNNfrxxx/18ssvV3ns8OHD3jtIh9PFF1+sxMREzZw502f9zJkz1bRpUw0dOrTGbcvLy6ucV3JystLS0qpkRSjOPy8vz2eOyB07dujtt9/WoEGDFB0d7Xd/AEYW1qBiDrYHHnhAI0eOVOPGjTVs2DDvH3zVGTp0qKZNm6bBgwfruuuu0+7duzVjxgx16tRJX331lbddp06d9MADD2jq1Knq37+/rrjiCrndbn3xxRdKS0tTbm6u4uLiNHPmTN1www0699xzNXLkSLVs2VLbt2/Xu+++q/PPP18vvPCCpXN77LHH9K9//UsDBgzw3n59165dWrBggT7++GMlJCTovvvu09/+9jcNGTJEd9xxhxITE/XnP/9ZW7Zs0VtvvRXwpWlRUVGaOXOmhg0bpl69emnMmDFq1aqVNmzYoH//+9/eoJ4xY4YuuOACde/eXWPHjlWHDh1UUFCgvLw8/fDDD/p//+//BXy+GRkZmjlzph555BF16tRJycnJNc4BUuEXv/iF5s6dq/j4eHXt2lV5eXl67733qszN1KtXL0VHR+uJJ55QUVGR3G63Lr744mrnHxo3bpz++Mc/6sYbb9SaNWvUrl07vfnmm/rkk080ffp0tWjRIuBzq6nvDz/8sMaMGaN+/frp66+/1muvvVZlDoqOHTsqISFBs2bNUosWLdSsWTNlZmbWOM9Hbb8TVuYslKSnnnpKl112mQYNGqSRI0fqm2++0QsvvKCbb77ZO+cW4BTkCrni9FypScW//TvuuEPZ2dmKjo7WyJEjNWDAAP36179Wbm6u1q1bp0GDBqlx48batGmTFixYoOeee87yF0dFRUV6/vnnJUmffPKJJOmFF15QQkKCEhISlJOT420bTBZ17dpVAwcOVEZGhhITE7V69Wq9+eabPvsP1fmfddZZuummm/TFF18oJSVFr776qgoKCnxGGvvTH6AhmjJlipYsWaL+/fvrtttu836xcs455/jkaSgEmzvhyOuLLrpIN9xwg/7whz9o06ZNGjx4sDwejz766CNddNFFysnJUceOHfXII4/o/vvv19atWzV8+HC1aNFCW7Zs0cKFCzVu3Djdc889NR7D35yrSUZGhubPn68JEybovPPOU/PmzTVs2DDdcMMNeuONN3TLLbfogw8+0Pnnn6/y8nJt2LBBb7zxhpYuXVrtDdb8sW3bNs2dO1eSvF94PvLII5KOj86/4YYbJB2/tHnq1KkaP368rr76amVnZ+ujjz7SX//6Vz366KO1zgV54MABnXHGGbrqqqvUs2dPNW/eXO+9956++OILn1GYoTr/bt26KTs7W3fccYfcbrdefPFFSfIWiv3tD1D9vcFh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586duuKKK0LecQCobzxyyWMsLFyyFTbkGgBYZynXyLSwIdMAIEguV+CFQpczcy2gy5CXLFni8/OcOXOUnJysNWvW6MILL1RRUZFeeeUVzZs3TxdffLEkafbs2erSpYs+++wz/c///E/oeg4A9YyxOGeh4YNV2JBrAGCdlVwj08KHTAOAIHEZsldQZ1VUVCRJSkxMlCStWbNGR48eVVZWlrdN586d1aZNG+Xl5VW7j9LSUhUXF/ssAADUBXINAOAUocg0iVwDgIbIcrHQ4/Horrvu0vnnn69u3bpJkvLz8xUTE6OEhASftikpKcrPz692P7m5uYqPj/cu6enpVrsEABHN0iXIPy0IP3INAAJDpkWuUGWaRK4BaECYs9DL8lmNHz9e33zzjV5//fWgOnD//ferqKjIu+zYsSOo/QFApOIGJ5GNXAOAwJBpkStUmSaRawAaEIqFXgHNWVghJydH77zzjj788EOdccYZ3vWpqakqKytTYWGhzzdWBQUFSk1NrXZfbrdbbrfbSjcAoF6xOqKCURjhR64BQOCs5BqZFn6hzDSJXAPQgDBnoVdAZ2WMUU5OjhYuXKj3339f7du393k8IyNDjRs31vLly73rNm7cqO3bt6tv376h6TEA1FOenyaCt7IgPMg1ALCOTIssZBoABImRhV4BjSwcP3685s2bp7ffflstWrTwzm0RHx+vJk2aKD4+XjfddJMmTJigxMRExcXF6fbbb1ffvn25uxaABo+RhZGHXAMA6xhZGFnINAAIEiMLvQIqFs6cOVOSNHDgQJ/1s2fP1o033ihJevbZZxUVFaUrr7xSpaWlys7O1osvvhiSzgIAEErkGgDAKcg0AECoBFQsNMacsk1sbKxmzJihGTNmWO4UADgRIwsjD7kGANYxsjCykGkAECRGFnpZusEJACBwFAsBAE5CsRAA4CgUC72ceVYAEIEqPlRZWQAAiDRkGgDAUVyuwG9u4rKWazNmzFC7du0UGxurzMxMrVq1qsa2L7/8svr376/TTjtNp512mrKysmptHwoUCwHAJkbW7hx56ouKAACwn5VcI9MAABHLprshz58/XxMmTNCkSZP05ZdfqmfPnsrOztbu3burbb9ixQpde+21+uCDD5SXl6f09HQNGjRIP/74Y7BnXCOKhQAAAAAAAIANpk2bprFjx2rMmDHq2rWrZs2apaZN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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "engine": 0 + }, + "output_type": "display_data" + } + ], + "source": [ + "if mpi_rank == 0:\n", + " fig = plt.figure(figsize=(16, 4))\n", + " fig.patch.set_facecolor(\"white\")\n", + " ax_before = fig.add_subplot(131)\n", + " ax_after = fig.add_subplot(132)\n", + " ax_diff = fig.add_subplot(133)\n", + "\n", + " f1 = ax_before.pcolormesh(\n", + " tracer_state[0].data[:, :, 0].T, vmin=-0, vmax=1, cmap=\"viridis\"\n", + " )\n", + " plt.colorbar(f1, ax=ax_before)\n", + " f2 = ax_after.pcolormesh(\n", + " tracer_state[-1].data[:, :, 0].T, vmin=-0, vmax=1, cmap=\"viridis\"\n", + " )\n", + " plt.colorbar(f2, ax=ax_after)\n", + " f3 = ax_diff.pcolormesh(\n", + " (tracer_state[-1].data[:, :, 0] - tracer_state[0].data[:, :, 0]).T,\n", + " vmin=-0.5,\n", + " vmax=0.5,\n", + " cmap=\"bwr\",\n", + " )\n", + " plt.colorbar(f3, ax=ax_diff)\n", + "\n", + " ax_before.set_title(\"tracer concentration at t=0\")\n", + " ax_after.set_title(\"tracer concentration after %s steps\" % nSteps)\n", + " ax_diff.set_title(\"difference after %s steps\" % nSteps)\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6b0cc550-95f0-4b79-9916-6d5859cb8420", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + }, + "vscode": { + "interpreter": { + "hash": "5aaa1d64d2aec5fc9d71d95fe114c55e361597d915cf108c460e747a228aecec" + } + } }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgIAAAGzCAYAAABdO3+BAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA4KklEQVR4nO3df1zV9d3/8edR4YAKxwD5lUj4I/EXdl3+INKMxERqTpOaWtvUmc6FXVPXLLby11qUu1auXYhtc5AVpbbU5a50aopzE690c9ZWTLkoMQWXuwDFQMb5fP9wnG8nUD6Hc4DjOY/77fa+jfP+/Hqfz06e13m9f3wshmEYAgAAfqlLZzcAAAB0HgIBAAD8GIEAAAB+jEAAAAA/RiAAAIAfIxAAAMCPEQgAAODHCAQAAPBjBAIAAPgxAgG0u48++kgWi0UFBQUuH7t//35ZLBbt37+/1X1TU1OVmprq8jXgzJV7DuD6RyAAtxUUFMhisbRYHn/88c5uXrt6+umntW3bNlP7njlzRitXrtSxY8fatU2+5K677pLFYtGiRYuc6svLy7Vq1SqNGTNGN9xwgyIiIpSamqo9e/aYPrfdbteaNWuUkJCgoKAgJSUl6bXXXvP0WwC8XrfObgB8x+rVq5WQkOBUN2zYMMXHx+uzzz5TQEBAJ7Ws/Tz99NO67777NG3atFb3PXPmjFatWqWbbrpJt9xyS7u37Xr35ptv6tChQy1u2759u5599llNmzZNs2fP1j//+U9t3LhRd911l375y19q7ty5rZ7/+9//vp555hnNnz9fo0eP1vbt2/XAAw/IYrFo5syZnn47gNciEIDHZGRkaNSoUS1uCwoK6uDW4HpWV1en73znO3rssce0fPnyZtvvvPNOnTp1ShEREY66hQsX6pZbbtHy5ctbDQQ++eQT/fjHP1ZWVpb+67/+S5L00EMP6Y477tB3v/td3X///eratatn3xTgpegaQLu72hiBDz/8UPfdd5/CwsIUFBSkUaNG6de//rWpc/7sZz9T//79FRwcrDFjxuh3v/ud6fbs3r1b48aNU69evdSzZ08NGjRI3/ve95z2qa+v14oVKzRgwABZrVbFxcVp2bJlqq+vd+xjsVhUW1url156ydEVMmfOnBavuX//fo0ePVqSNHfuXMf+n78nW7Zs0ciRIxUcHKyIiAh99atf1SeffHLN93LkyBFZLBa99NJLzbbt2rVLFotFO3bskCR9/PHHevjhhzVo0CAFBwcrPDxc999/vz766KNW79lNN93U4ntraVyGmXvXmjVr1shut+vRRx9tcfvQoUOdggBJslqtuvvuu3X69GlduHDhmuffvn27Ghoa9PDDDzvqLBaLvvWtb+n06dNXzUQAvoiMADymurpan376qVPdF/+xbvKXv/xFY8eO1Y033qjHH39cPXr00ObNmzVt2jT96le/0r333nvV62zYsEHf/OY3ddttt2nx4sX63//9X335y19WWFiY4uLirtnGv/zlL/rSl76kpKQkrV69WlarVSdPntTvf/97xz52u11f/vKXdfDgQS1YsECDBw/We++9p+eff15/+9vfHGMCXn75ZT300EMaM2aMFixYIEnq379/i9cdPHiwVq9ereXLl2vBggW6/fbbJUm33XabpCvjLObOnavRo0crJydHlZWV+slPfqLf//73+tOf/qRevXq1eN5Ro0apX79+2rx5s2bPnu20bdOmTbrhhhuUnp4uSXr33Xf1hz/8QTNnzlSfPn300UcfKS8vT6mpqfrrX/+q7t27X/PemWH23l3LqVOn9Mwzz+iXv/ylgoODXbp+RUWFunfv3up7+dOf/qQePXpo8ODBTvVjxoxxbB83bpxL1wauWwbgpvz8fENSi8UwDKOsrMyQZOTn5zuOSUtLM4YPH27U1dU56ux2u3HbbbcZAwcOdNTt27fPkGTs27fPMAzDuHz5shEZGWnccsstRn19vWO/n/3sZ4Yk44477rhmW59//nlDkvH3v//9qvu8/PLLRpcuXYzf/e53TvXr1683JBm///3vHXU9evQwZs+efc1rNnn33Xeb3YfPv6dhw4YZn332maN+x44dhiRj+fLl1zxvdna2ERAQYPzjH/9w1NXX1xu9evUyvvGNbzjqLl261OzYQ4cOGZKMjRs3Ouq+eM8NwzDi4+NbfJ933HGH0z135d5dzX333WfcdtttjteSjKysrFaPO3HihBEUFGR87Wtfa3Xfe+65x+jXr1+z+traWkOS8fjjj7d6DsBX0DUAj8nNzdXu3budSkv+8Y9/6J133tFXvvIVXbhwQZ9++qk+/fRTnT9/Xunp6Tpx4sRVU+JHjhzRuXPntHDhQgUGBjrq58yZI5vN1mobm35Zb9++XXa7vcV9tmzZosGDBysxMdHRtk8//VQTJkyQJO3bt6/V67ii6T09/PDDTmMp7rnnHiUmJuo3v/nNNY+fMWOGGhoa9Oabbzrqfvvb36qqqkozZsxw1H3+13VDQ4POnz+vAQMGqFevXvrjH//okffi7r3bt2+ffvWrX2nt2rUuXffSpUu6//77FRwcrGeeeabV/T/77DNZrdZm9U33/7PPPnPp+sD1jK4BeMyYMWOuOljw806ePCnDMPTkk0/qySefbHGfc+fO6cYbb2xW//HHH0uSBg4c6FQfEBCgfv36tXrtGTNm6Be/+IUeeughPf7440pLS9P06dN13333qUuXK3HxiRMn9MEHH6h3795XbZsnNb2nQYMGNduWmJiogwcPXvP4ESNGKDExUZs2bdK8efMkXekWiIiIcHwBS1e+3HJycpSfn69PPvlEhmE4tlVXV3virbh17/75z3/qP/7jP/S1r33NMZ7CjMbGRs2cOVN//etf9fbbbys2NrbVY4KDg1scs1BXV+fYDvgLAgF0uKZf4o8++qij//qLBgwY0C7XDg4O1oEDB7Rv3z795je/0c6dO7Vp0yZNmDBBv/3tb9W1a1fZ7XYNHz5czz33XIvnaG0cQmeYMWOGfvjDH+rTTz9VSEiIfv3rX2vWrFnq1u3//yf+yCOPKD8/X4sXL1ZKSopsNptjqtzVsiNNLBZLi/WNjY1Oo+vduXcbN25USUmJXnzxxWYDGC9cuKCPPvpIkZGRzfr/58+frx07dujVV191CnyuJSYmRvv27ZNhGE7v7ezZs5JkKpgAfAWBADpc0y/3gIAATZw40aVj4+PjJV355fn5f/QbGhpUVlamESNGtHqOLl26KC0tTWlpaXruuef09NNP6/vf/7727duniRMnqn///vrzn/+stLS0q34BNmltu5l9m95TSUlJsy+ykpISx/ZrmTFjhlatWqVf/epXioqKUk1NTbO58G+88YZmz56tH//4x466uro6VVVVtXr+G264ocX9Pv74Y6dMjCv37otOnTqlhoYGjR07ttm2jRs3auPGjdq6davTmg3f/e53lZ+fr7Vr12rWrFmmr3XLLbfoF7/4hT744AMNGTLEUX/48GHHdsBfMEYAHS4yMlKpqal68cUXHb/APu/vf//7VY8dNWqUevfurfXr1+vy5cuO+oKCAlNfaP/4xz+a1TX9o9+UKv7KV76iTz75RD//+c+b7fvZZ5+ptrbW8bpHjx6mrtu0r6Rm+48aNUqRkZFav369U7r67bff1gcffKB77rmn1XMPHjxYw4cP16ZNm7Rp0ybFxMRo/PjxTvt07drVqTtAkn7605+qsbGx1fP3799fxcXFTvd8x44dKi8vd9rPlXv3RTNnztTWrVubFUm6++67tXXrViUnJzv2/9GPfqT//M//1Pe+9z19+9vfvup5q6ur9eGHHzp1f0ydOlUBAQFat26do84wDK1fv1433nijYzYH4A/ICKBT5Obmaty4cRo+fLjmz5+vfv36qbKyUocOHdLp06f15z//ucXjAgIC9NRTT+mb3/ymJkyYoBkzZqisrEz5+fmmxgisXr1aBw4c0D333KP4+HidO3dO69atU58+fRzTxb72ta9p8+bNWrhwofbt26exY8eqsbFRH374oTZv3qxdu3Y5xkKMHDlSe/bs0XPPPafY2FglJCQ4fVl9Xv/+/dWrVy+tX79eISEh6tGjh5KTk5WQkKBnn31Wc+fO1R133KFZs2Y5pg/edNNNWrJkial7OmPGDC1fvlxBQUGaN2+eY8xDky996Ut6+eWXZbPZNGTIEB06dEh79uxReHh4q+d+6KGH9MYbb2jy5Mn6yle+otLSUr3yyivNpku6cu++KDExUYmJiS1uS0hIcMoEbN26VcuWLdPAgQM1ePBgvfLKK07733XXXYqKinLsO3fuXOXn5zvWQujTp48WL16sH/3oR2poaNDo0aO1bds2/e53v9Orr77KYkLwL506ZwE+oWn64Lvvvtvi9pamDxqGYZSWlhpf//rXjejoaCMgIMC48cYbjS996UvGG2+84dinpalshmEY69atMxISEgyr1WqMGjXKOHDgQLOpbC3Zu3evMXXqVCM2NtYIDAw0YmNjjVmzZhl/+9vfnPa7fPmy8eyzzxpDhw41rFarccMNNxgjR440Vq1aZVRXVzv2+/DDD43x48cbwcHBhqRWpxJu377dGDJkiNGtW7dm92TTpk3Gv/3bvxlWq9UICwszHnzwQeP06dPXPN/nnThxwjFt8+DBg822/9///Z8xd+5cIyIiwujZs6eRnp5ufPjhh82mBl7tnv/4xz82brzxRsNqtRpjx441jhw50uI9N3vvzFIL0wdXrFhx1SmrX2x70+fzi5+/xsZG4+mnnzbi4+ONwMBAY+jQocYr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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "\n", - "print(\"Min and max values:\", field.max(), field.min())\n", - "\n", - "fig = plt.figure()\n", - "fig.patch.set_facecolor(\"white\")\n", - "ax = fig.add_subplot(111)\n", - "ax.set_facecolor(\".4\")\n", - "\n", - "f1 = ax.pcolormesh(field[:, :, 0])\n", - "\n", - "cbar = plt.colorbar(f1)\n", - "ax.set_title(\"Field set to value %.1f\" % value)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "6562a18e", - "metadata": {}, - "source": [ - "## Building and Running Pre-defined Stencils for Tracer Advection\n", - "\n", - "In this portion, we build and run the stencils required for calculating tracer advection. This will include:\n", - "- `FiniteVolumeFluxPrep`: calculates/updates Courant number and total mass flux fields based on input wind field.\n", - "- `FiniteVolumeTransport`: calculates tracer fluxes for horizontal finite volume flux transport.\n", - "- `TracerAdvection`: performs horizontal advection on tracers." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "a45c6f83", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Starting 6 engines with \n", - "100%|███████████████████████████████████████████████████████| 6/6 [00:05<00:00, 1.09engine/s]\n", - "%autopx enabled\n" - ] - } - ], - "source": [ - "import ipyparallel as ipp\n", - "\n", - "layout = (1, 1)\n", - "ntiles = 6\n", - "# spinup cluster of MPI-workers\n", - "num_ranks = ntiles * layout[0] * layout[1]\n", - "\n", - "tracer_center = (0, 0)\n", - "test_case = \"b\"\n", - "timestep = 900.0\n", - "\n", - "cluster = ipp.Cluster(engines=\"mpi\", n=num_ranks).start_and_connect_sync()\n", - "\n", - "# broadcast configuration to all workers\n", - "ar = cluster[:].push(\n", - " {\n", - " \"ntiles\": ntiles,\n", - " \"nx\": nx,\n", - " \"ny\": ny,\n", - " \"nz\": nz,\n", - " \"nhalo\": nhalo,\n", - " \"layout\": layout,\n", - " \"backend\": backend,\n", - " \"tracer_center\": tracer_center,\n", - " \"test_case\": test_case,\n", - " \"timestep\": timestep\n", - " }\n", - ")\n", - "\n", - "# start executing cells on the workers in parallel from here on\n", - "%autopx" - ] - }, - { - "cell_type": "markdown", - "id": "b5546849", - "metadata": {}, - "source": [ - "### Getting initial state\n", - "\n", - "Before we can build and run stencils associated with tracer advection, we need to have the grid configuration and initial fields for u- and v- winds on the C grid. \n", - "\n", - "More details on these processes are described in `grid_generation.ipynb` and `initial_condition_definition.ipynb`, and here they are shortened by using helper functions inside `functions.py`." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "d35b55bb", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[stderr:5] /pace/NDSL/ndsl/grid/gnomonic.py:681: RuntimeWarning: invalid value encountered in true_divide\n", - " np.sum(p * q, axis=-1)\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[stderr:2] /pace/NDSL/ndsl/grid/gnomonic.py:681: RuntimeWarning: invalid value encountered in true_divide\n", - " np.sum(p * q, axis=-1)\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import functions as func\n", - "from mpi4py import MPI\n", - "import importlib\n", - "\n", - "importlib.reload(func)\n", - "\n", - "mpi_comm = MPI.COMM_WORLD\n", - "mpi_rank = mpi_comm.Get_rank()\n", - "\n", - "namelist_dict = func.store_namelist_variables(locals())\n", - "dimensions = func.define_dimensions(namelist_dict)\n", - "\n", - "domain_configuration = func.configure_domain(mpi_comm, dimensions)\n", - "\n", - "initial_state = func.create_initial_state_advection(\n", - " domain_configuration[\"metric_terms\"], dimensions, tracer_center, test_case\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "9965c31a", - "metadata": {}, - "source": [ - "For the stencils used in the tracer advection process, we will need some additional classes, such as `DampingCoefficients` and `GridIndexing`.\n", - "\n", - "If we want to run tracer advection in a single layer instead of extending it to 79 identical conditions, we want to create `GridData` with the `single_layer=True`." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "3c865c63", - "metadata": {}, - "outputs": [], - "source": [ - "from ndsl import DaceConfig, DaCeOrchestration, GridIndexing, StencilConfig, StencilFactory, CompilationConfig, RunMode\n", - "from ndsl.grid import AngleGridData, ContravariantGridData, DampingCoefficients, GridData, HorizontalGridData, MetricTerms, VerticalGridData\n", - "\n", - "\n", - "if nz == 1:\n", - " single_layer = True\n", - "else:\n", - " single_layer = False\n", - "\n", - "if single_layer:\n", - " horizontal_grid_data = HorizontalGridData.new_from_metric_terms(domain_configuration[\"metric_terms\"])\n", - " vertical_grid_data = VerticalGridData(ptop=0, ks=0, ak=[10], bk=[0], p_ref=0)\n", - " contravariant_grid_data = ContravariantGridData.new_from_metric_terms(domain_configuration[\"metric_terms\"])\n", - " angle_grid_data = AngleGridData.new_from_metric_terms(domain_configuration[\"metric_terms\"])\n", - "\n", - " grid_data = GridData(horizontal_grid_data, vertical_grid_data, contravariant_grid_data, angle_grid_data)\n", - " \n", - "else:\n", - " grid_data = GridData.new_from_metric_terms(domain_configuration[\"metric_terms\"])\n", - "\n", - "\n", - "damping_coefficients = DampingCoefficients.new_from_metric_terms(domain_configuration[\"metric_terms\"])\n", - "\n", - "dace_config = DaceConfig(\n", - " communicator=None, backend=backend, orchestration=DaCeOrchestration.Python\n", - ")\n", - "\n", - "compilation_config = CompilationConfig(\n", - " backend=backend,\n", - " rebuild=True,\n", - " validate_args=True,\n", - " format_source=False,\n", - " device_sync=False,\n", - " run_mode=RunMode.BuildAndRun,\n", - " use_minimal_caching=False,\n", - " communicator=domain_configuration[\"communicator\"],\n", - ")\n", - "\n", - "stencil_config = StencilConfig(\n", - " compare_to_numpy=False,\n", - " compilation_config=compilation_config,\n", - " dace_config=dace_config,\n", - ")\n", - "\n", - "grid_indexing = GridIndexing.from_sizer_and_communicator(\n", - " sizer=domain_configuration[\"sizer\"], comm=domain_configuration[\"communicator\"]\n", - ")\n", - "\n", - "stencil_factory = StencilFactory(config=stencil_config, grid_indexing=grid_indexing)\n" - ] - }, - { - "cell_type": "markdown", - "id": "6eea64a5", - "metadata": {}, - "source": [ - "### 1. Finite Volume Flux Prep\n", - "\n", - "In order to run the stencil, we first need to build it (initialize an instance of the class). \n", - "\n", - "For building the `FiniteVolumeFluxPrep` stencil, we need `stencil_factory` and `grid_data` from the configuration dictionary. \n", - "\n", - "For running the stencil, we require the following inputs:\n", - "- `uc (in)`: covariant x-velocity on the C-grid (stored in `initial_state` as `u_Cgrid`)\n", - "- `vc (in)`: covariant y-velocity on the C-grid (stored in `initial_state` as `v_Cgrid`)\n", - "- `crx (out)`: Courant number, x-direction\n", - "- `cry (out)`: Courant number, y-direction\n", - "- `x_area_flux (out)`: flux of area in x-direction, in units of m^2\n", - "- `y_area_flux (out)`: flux of area in y-direction, in units of m^2\n", - "- `uc_contra (out)`: contravariant x-velocity on C-grid\n", - "- `vc_contra (out)`: contravariant y-velocity on C-grid\n", - "- `dt (in)`: acoustic timestep in seconds\n", - "\n", - "We need to create empty storages or quantities to initialize the output variables, and their values get updated when we run the stencil.\n", - "We plot the empty storage of `crx` on the first (zeroth) rank, run `FiniteVolumeFluxPrep`, then plot the updated storage for comparison." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "886c8a20", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "%px: 83%|██████████████████████████████████████████▌ | 5/6 [00:00<00:00, 48.19tasks/s]" - ] - }, - { - "data": { - "text/plain": [ - "[output:0]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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de2DfX19MWbMGGRkZNg6ijdKT0+Hv78/7r//fgDAv//9bzz88MNo2bIlmjZtiv79+2Pr1q11bnNN11rcnEk37l/T0tLQoUMHNG3aFMOHD8f58+chhMBLL72Etm3bwtfXFw888AB++eWXavX+4x//wKBBg9CsWTP4+/tj1KhR+OGHH+pspwzZHFX72e/ZsyeCgoJs2WP9jbJ27Vq88MILaNOmDZo2bYrCwkIAcnlrbaM1PwICAtCqVSs8+eSTKC0tldr+/fv345577kGLFi3QrFkz9OrVC2+88Ybt70ePHsXkyZPRoUMH+Pj4IDQ0FI8++qjHDXdsDNxyJufixYvo168f8vPzkZSUhG7duuHChQv4+OOPUVJSYnek5oknnkBwcDAWLFiA4uJiTJkyBZ9++imSk5Nx9913IyIiAt9//z1SUlIwderUaqfHHTl58iTGjRuHxx9/HImJiVi1ahUefvhhbNu2DXfffTeAqlPUQ4YMwYULF/DHP/4R7dq1w969ezFv3jxcunQJS5cuRffu3fHBBx/gqaeeQtu2bW1DfIKDg/Hbb79h6NChOHXqFGbMmIGoqCisX78ekydPRn5+Pp588km7Nq1atQqlpaVISkqC2WxGy5Yt8cMPP+COO+5AmzZtMHfuXDRr1gwfffQREhIS8Mknn2D06NF1bmtpaSmuXLlit8zf37/WI2kvv/wyjEYjnnnmGRQUFGDx4sWYOHEi9u/f77B8cHAwli9fjmnTpmH06NEYM2YMANiGlclux8SJE5GSkoL09HTcdttttvorKyvx0UcfYdCgQWjXrp3i11aNr776Cp999hmmT58OAEhNTcW9996LZ599Fm+//TaeeOIJ/Prrr1i8eDEeffRR7Ny50/bcnTt3YuTIkejTpw8WLlwIo9GIVatW4a677sJXX32Ffv362a2roKCg2nvliqNrd911F5544gmkpqYiISEBt912Gy5duoSZM2ciLi6uziFoFRUVOH/+fLWhGq74zM6YMQPNmzfHokWLcOLECSxfvhxnz561hVlNjh49ikGDBqFJkyZISkpCZGQkTp8+jc2bN+PPf/4zAOC7777D3r17MX78eLRt2xZnzpzB8uXLMXToUPz4449o2rSpk68o6Y07M2v16tXw8/NDcnIy/Pz8sHPnTixYsACFhYV49dVXAQBLly7F+++/jw0bNtiGHvXs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AIDD98r6t8ZoxIgRGDNmDKKionD69Gk8//zzGDlyJLKysuDl5eXu5tXIYrFg9uzZuOOOO9CjRw8AVe+RyWRC8+bN7co2lvfI0TYBwO9//3u0b98e4eHhOHr0KJ577jmcOHECn376qRtbS56M2dR4eGI2NdZcAjwvm5hLjY9mOjmeZuTIkbb/79WrF2JiYtC+fXt89NFHmDp1qhtbRjUZP3687f979uyJXr16oWPHjsjMzMSwYcPc2LLaTZ8+HceOHWtU4+rrUtM2JSUl2f6/Z8+eCAsLw7Bhw3D69Gl07NixoZtJ1OgwmxqXxppLgOdlE3Op8dHMcLWgoCB4eXlVm2EjNzcXoaGhbmqV6zRv3hxdunTBqVOn3N0U1azvh6e+V1YdOnRAUFCQpt+zGTNmYMuWLdi1axfatm1rWx4aGory8nLk5+fblW8M71FN2+RITEwMAGj6PaLGjdnUeOghmxpDLgGel03MpcZJM50ck8mEPn36ICMjw7bMYrEgIyMDsbGxbmyZaxQVFeH06dMICwtzd1NUi4qKQmhoqN17VVhYiP3793vEe2X1888/4+rVq5p8z4QQmDFjBjZs2ICdO3ciKirK7u99+vRBkyZN7N6jEydO4Ny5c5p9j+raJkeOHDkCAJp8j8gzMJsaDz1kk5ZzCfC8bGIuNXLunffA3tq1a4XZbBarV68WP/74o0hKShLNmzcXOTk57m6aYk8//bTIzMwU2dnZ4ptvvhFxcXEiKChI5OXlubtpUq5duyYOHz4sDh8+LACI119/XRw+fFicPXtWCCHEyy+/LJo3by42bdokjh49Kh544AERFRUlfvvtNze3vGa1bdO1a9fEM888I7KyskR2drb48ssvxW233SY6d+4sSktL3d30aqZNmyYCAwNFZmamuHTpku1RUlJiK/P444+Ldu3aiZ07d4oDBw6I2NhYERsb68ZW166ubTp16pR48cUXxYEDB0R2drbYtGmT6NChgxg8eLCbW06ejtmkHZ6WTZ6US0J4XjYxlxo3TXVyhBBi2bJlol27dsJkMol+/fqJffv2ubtJThk3bpwICwsTJpNJtGnTRowbN06cOnXK3c2StmvXLgGg2iMxMVEIUTVV5/z580VISIgwm81i2LBh4sSJE+5tdB1q26aSkhIxfPhwERwcLJo0aSLat28vHnvsMc3+iHG0HQDEqlWrbGV+++038cQTT4gWLVqIpk2bitGjR4tLly65r9F1qGubzp07JwYPHixatmwpzGaz6NSpk5gzZ44oKChwb8NJF5hN2uBp2eRJuSSE52UTc6lxMwghhOvPDxEREREREbmHZq7JISIiIiIicgV2coiIiIiIyKOwk0NERERERB6FnRwiIiIiIvIo7OQQEREREZFHYSeHiIiIiIg8Cjs5RERERETkUdjJISIiIiIij8JODhEREREReRR2coiIiIiIyKOwk0NERERERB6FnRwiIiIiIvIo/x8ND78JUUP2OwAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": { - "engine": 0 - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "%px: 100%|███████████████████████████████████████████████████| 6/6 [00:00<00:00, 11.28tasks/s]\n" - ] - } - ], - "source": [ - "import copy as cp\n", - "import matplotlib.pyplot as plt\n", - "from pyfv3.stencils import FiniteVolumeFluxPrep\n", - "from units_config import units\n", - "\n", - "fvf_prep = FiniteVolumeFluxPrep(\n", - " stencil_factory, grid_data, grid_type=0\n", - ")\n", - "\n", - "crx = domain_configuration[\"quantity_factory\"].zeros(\n", - " dims=(\"x_interface\", \"y\", \"z\"), units=units[\"courant\"], dtype=\"float\"\n", - ")\n", - "cry = domain_configuration[\"quantity_factory\"].zeros(\n", - " dims=(\"x\", \"y_interface\", \"z\"), units=units[\"courant\"], dtype=\"float\"\n", - ")\n", - "\n", - "x_area_flux = domain_configuration[\"quantity_factory\"].zeros(\n", - " dims=(\"x_interface\", \"y\", \"z\"), units=units[\"area\"], dtype=\"float\"\n", - ")\n", - "y_area_flux = domain_configuration[\"quantity_factory\"].zeros(\n", - " dims=(\"x\", \"y_interface\", \"z\"), units=units[\"area\"], dtype=\"float\"\n", - ")\n", - "\n", - "uc_contra = domain_configuration[\"quantity_factory\"].zeros(\n", - " dims=(\"x_interface\", \"y\", \"z\"), units=units[\"wind\"], dtype=\"float\"\n", - ")\n", - "vc_contra = domain_configuration[\"quantity_factory\"].zeros(\n", - " dims=(\"x\", \"y_interface\", \"z\"), units=units[\"wind\"], dtype=\"float\"\n", - ")\n", - "\n", - "crx_before = cp.deepcopy(crx)\n", - "\n", - "fvf_prep(\n", - " initial_state[\"u_cgrid\"],\n", - " initial_state[\"v_cgrid\"],\n", - " crx,\n", - " cry,\n", - " x_area_flux,\n", - " y_area_flux,\n", - " uc_contra,\n", - " vc_contra,\n", - " timestep,\n", - ")\n", - "\n", - "if mpi_rank == 0:\n", - " fig = plt.figure(figsize=(10, 4))\n", - " fig.patch.set_facecolor(\"white\")\n", - " ax_before = fig.add_subplot(121)\n", - " ax_after = fig.add_subplot(122)\n", - "\n", - " f1 = ax_before.pcolormesh(\n", - " crx_before.data[:, :, 0], vmin=-0, vmax=0.1, cmap=\"YlOrRd\"\n", - " )\n", - " plt.colorbar(f1, ax=ax_before)\n", - " f2 = ax_after.pcolormesh(crx.data[:, :, 0], vmin=-0, vmax=0.1, cmap=\"YlOrRd\")\n", - " plt.colorbar(f2, ax=ax_after)\n", - "\n", - " ax_before.set_title(\"crx before FiniteVolumeFluxPrep call\")\n", - " ax_after.set_title(\"crx after FiniteVolumeFluxPrep call\")\n", - " plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "aadc97e9", - "metadata": {}, - "source": [ - "Since our layer have thickness of delp Pa, we can use that information and the `x_area_flux` and `y_area_flux` variables provided by `FiniteVolumeFluxPrep` to calculate mass fluxes that are required as input to `TracerAdvection`.\n", - "\n", - "We are assuming that density is 1 (kg /m3)." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "4869723d", - "metadata": {}, - "outputs": [], - "source": [ - "mfxd = domain_configuration[\"quantity_factory\"].zeros(\n", - " dims=(\"x_interface\", \"y\", \"z\"), units=units[\"mass\"], dtype=\"float\"\n", - ")\n", - "mfyd = domain_configuration[\"quantity_factory\"].zeros(\n", - " dims=(\"x\", \"y_interface\", \"z\"), units=units[\"mass\"], dtype=\"float\"\n", - ")\n", - "\n", - "density = 1.0\n", - "\n", - "mfxd.data[:] = x_area_flux.data[:] * initial_state[\"delp\"].data[:] * density\n", - "mfyd.data[:] = y_area_flux.data[:] * initial_state[\"delp\"].data[:] * density\n" - ] - }, - { - "cell_type": "markdown", - "id": "8cbf898b", - "metadata": {}, - "source": [ - "### 2. Tracer Advection and its Inputs\n", - "\n", - "In order to build the `TracerAdvection` stencil, it needs an input of a different stencil, `FiniteVolumeTransport`. \n", - "\n", - "For building the `FiniteVolumeTransport` stencil, we need `stencil_factory`, `grid_data`, and `damping_coefficients` from the configuration dictionary. We do not actually need to run it, as it get run within `TracerAdvection`, but if we did, we would get output tracer mass fluxes. \n", - "\n", - "For building `TracerAdvection`, we need `stencil_factory`, the pre-built `FiniteVolumeTransport` stencil, `grid_data`, and the cubed-sphere communicator stored under configuration as `communicator`. We also need a dictionary that includes all the tracers we want to follow at their initial state.\n", - "\n", - "" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4446b419", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "%px: 100%|███████████████████████████████████████████████████| 6/6 [00:20<00:00, 3.38s/tasks]\n" - ] - } - ], - "source": [ - "from pyfv3.stencils import FiniteVolumeTransport, TracerAdvection\n", - "\n", - "grid_type = 0 # cubed-sphere\n", - "hord = 6 # horizontal diffusion order\n", - "\n", - "tracers = {\"tracer\": initial_state[\"tracer\"]}\n", - "\n", - "fvtp_2d = FiniteVolumeTransport(\n", - " stencil_factory,\n", - " domain_configuration[\"quantity_factory\"],\n", - " grid_data,\n", - " damping_coefficients,\n", - " grid_type,\n", - " hord,\n", - ")\n", - "\n", - "tracer_advection = TracerAdvection(\n", - " stencil_factory,\n", - " domain_configuration[\"quantity_factory\"],\n", - " fvtp_2d,\n", - " grid_data,\n", - " domain_configuration[\"communicator\"],\n", - " tracers,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "de2681d7", - "metadata": {}, - "source": [ - "To run a single step of `TracerAdvection`, we need to provide it the following inputs:\n", - "- `tracers`: a dictionary of all tracers we want to advect\n", - "- `delp`: pressure thickness of layers\n", - "- `mfxd`: mass flux in the x-direction\n", - "- `mfyd`: mass flux in the y-direction\n", - "- `crx`: Courant number in the x-direction\n", - "- `cry`: Courant number in the y-direction\n", - "- `timestep`: the timestep that is applied. \n", - "\n", - "Within `TracerAdvection`, the time step is split into 3 equal sub-steps, and all fields are divided by three, then advection is calculated for each of the substeps. \n", - "\n", - "All fields but `delp` are updated. Mass fluxes and Courant numbers are divided by 3 and then returned. So if we want to continue advecting with the initial wind field, we actually need to re-set those fields to initial conditions after each step." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "8043021f", - "metadata": { - "jupyter": { - "outputs_hidden": true - }, - "tags": [] - }, - "outputs": [], - "source": [ - "tracer_initial = cp.deepcopy(tracers)\n", - "mfxd_initial = cp.deepcopy(mfxd)\n", - "mfyd_initial = cp.deepcopy(mfyd)\n", - "crx_initial = cp.deepcopy(crx)\n", - "cry_initial = cp.deepcopy(cry)\n", - "\n", - "tracer_state = [tracer_initial[\"tracer\"]]\n", - "\n", - "nSteps = 10\n", - "\n", - "for step in range(nSteps):\n", - " tracer_advection(tracers, initial_state[\"delp\"], mfxd, mfyd, crx, cry)\n", - "\n", - " tracer_state.append(tracers[\"tracer\"])\n", - "\n", - " mfxd = cp.deepcopy(mfxd_initial)\n", - " mfyd = cp.deepcopy(mfyd_initial)\n", - " crx = cp.deepcopy(crx_initial)\n", - " cry = cp.deepcopy(cry_initial)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "f1e2588c", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[output:0]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABQsAAAF2CAYAAADJMM7PAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABqNUlEQVR4nO3deXxU1f3/8fckkAlbEmNIQjDsKiBbDZIvKIKaEpCi1A3UryBVqErcqK1alUXUuCJWEapVaKlURAu2yheKKLhFEYSfWgGRsikkbE0CARLInN8fmAlDFmbuzNxMbl7Px+M+NHfOvffcGTLvzGfOPddljDECAAAAAAAA0OBF1XUHAAAAAAAAAEQGioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioVAmAwcOFADBw6s624AAByiPuRKQUGBrrrqKp1++ulyuVyaPn16XXcJAGo0efJkuVwun3Xt2rXTjTfe6LNu06ZNGjRokOLj4+VyubRo0SJJ0hdffKF+/fqpWbNmcrlcWrdunT0dr+dqej4BRA6KhTX49NNPNXnyZBUWFtZ1VxCkF198UXPmzAnLvr/99ltNnjxZW7duDcv+w2nnzp2aPHmy33/UhOt34h//+IfOPfdcxcbGqk2bNpo0aZKOHTsW0mMAkYBccQ5ypWZ33323li5dqvvvv19z587V4MGDtXjxYk2ePNnWfmzcuFF33323+vXrp9jYWLlcrlqf03BmUV2cP4DQGj16tL7++ms9+uijmjt3rnr37q2jR4/q6quv1v79+/Xss89q7ty5atu2bV13tV6o7vmcN2+e7V8wrVq1SrfddpsyMjLUuHHjKoXjk73yyivq0qWLYmNjdeaZZ+r5558PWV/q4vyBWhlU66mnnjKSzJYtW+q6KwjSOeecYwYMGBCWfS9YsMBIMh988EGVx0pLS01paWlYjhsKX3zxhZFkZs+e7Vf7cPxOLF682LhcLnPRRReZl156ydx+++0mKirK3HLLLSE7BhApyBXnIFdqlpKSYq6//nqfdePHjzd2/8k5e/ZsExUVZbp162Z69epV6+9euLOoLs4fgH8mTZpU5ffzyJEjpqyszPvzoUOHjCTzwAMP+LRbv369kWRefvllW/rqFDU9n0OHDjVt27a1tS+TJk0yjRs3NhkZGeass86q9b161qxZRpK58sorzUsvvWRuuOEGI8k8/vjjIelLXZw/UJtG9pcnncfj8aisrEyxsbF13RWvkpISNWvWrK67Ue+E8nmLiYkJyX6c7J577lGPHj30r3/9S40aHX87iouL02OPPaY777xTnTt3ruMeAnWDXHGOhpYru3fvVkJCQtiPY4zRkSNH1KRJk2ofv+yyy1RYWKgWLVro6aefrnUUPVkE4ERut9vn5z179khSlfe23bt3V7s+GA0ha2t6PsPhVH9P3Xrrrbr33nvVpEkT5eTk6Lvvvqu23eHDh/XAAw9o6NChevPNNyVJY8eOlcfj0dSpUzVu3DiddtppYTsPoE7UdbUyElV8w3TyUvGNtCQzfvx489e//tV07drVNGrUyCxcuNAYc3zkSN++fU1iYqKJjY015557rlmwYEG1x5k7d64577zzTJMmTUxCQoLp37+/Wbp0qU+bxYsXmwsuuMA0bdrUNG/e3Fx66aXmm2++8WkzevRo06xZM/P999+bIUOGmObNm5vLL7+81nP84YcfzK9+9SvTqlUrExMTY9q1a2duueUWnxELmzdvNldddZU57bTTTJMmTUxmZqZ55513fPbzwQcfGElm/vz55pFHHjGtW7c2brfbXHzxxWbTpk1VjvvZZ5+ZIUOGmISEBNO0aVPTvXt3M336dJ8269evN1deeaU57bTTjNvtNhkZGebtt9/2aTN79mwjyXz88cfm7rvvNklJSaZp06Zm+PDhZvfu3d52bdu2rfI6VowGqdjHihUrzK233mpatmxpEhISjDHGbN261dx6663mrLPOMrGxsSYxMdFcddVVPqMSKrY/eakYDTJgwIAqI08KCgrMr371K5OcnGzcbrfp0aOHmTNnjk+bLVu2GEnmqaeeMn/84x9Nhw4dTExMjOndu7dZtWpVzS/qT/bt22d+85vfmG7duplmzZqZFi1amMGDB5t169ZVed1OXmoaZXiq3wkr/v3vfxtJZsaMGT7rf/zxRyPJTJ061fK+gUhDrhxHrjg3V2rq++jRo6tdX6G8vNw8++yzpmvXrsbtdpvk5GQzbtw4s3//fp8+tG3b1gwdOtQsWbLEZGRkGLfbbZ599tlT9t2Y2kf1BptFZWVlZvLkyaZTp07G7XabxMREc/7555t//etfxhgT8vNfunSp6dmzp3G73aZLly7mrbfeCqg/QEP20Ucfmd69exu32206dOhgZs2aVe3IwrZt25rRo0cbY6rP74rHa8oCYwLLneoyw5jA8vqHH34wl19+uWnWrJlJSkoyv/nNb8yxY8d82paXl5vp06ebbt26GbfbbZKSkkx2drb54osvfNrNnTvXnHvuuSY2NtacdtppZsSIEWb79u2nfH79ybmans8BAwZUu77CkSNHzMSJE03Hjh1NTEyMOeOMM8xvf/tbc+TIEZ8+1Pb31KnUNgr83XffNZLMu+++67P+008/NZLM3Llza913cXGxufPOO03btm1NTEyMadmypcnKyjJr1qwxxpiwnP9ZZ51l3G63Offcc83KlSsD6g9gDCMLq3XFFVfou+++09/+9jc9++yzSkpKkiS1bNnS2+b999/XG2+8oZycHCUlJaldu3aSpOeee06XXXaZrr/+epWVlen111/X1VdfrXfeeUdDhw71bj9lyhRNnjxZ/fr108MPP6yYmBh9/vnnev/99zVo0CBJ0ty5czV69GhlZ2friSee0KFDhzRz5kxdcMEFWrt2rfeYknTs2DFlZ2frggsu0NNPP62mTZvWeH47d+5Unz59VFhYqHHjxqlz58768ccf9eabb+rQoUOKiYlRQUGB+vXrp0OHDumOO+7Q6aefrj//+c+67LLL9Oabb+qXv/ylzz4ff/xxRUVF6Z577lFRUZGefPJJXX/99fr888+9bZYtW6Zf/OIXatWqle68806lpqZq/fr1euedd3TnnXdKkv7973/r/PPPV+vWrXXfffepWbNmeuONNzR8+HC99dZbVY57++2367TTTtOkSZO0detWTZ8+XTk5OZo/f74kafr06br99tvVvHlzPfDAA5KklJQUn33cdtttatmypSZOnKiSkhJJxycr/vTTTzVy5EidccYZ2rp1q2bOnKmBAwfq22+/VdOmTXXhhRfqjjvu0B/+8Af9/ve/V5cuXSTJ+9+THT58WAMHDtT333+vnJwctW/fXgsWLNCNN96owsJC73NQYd68eTpw4IB+/etfy+Vy6cknn9QVV1yh//znP2rcuHGNr+9//vMfLVq0SFdffbXat2+vgoIC/fGPf9SAAQP07bffKi0tTV26dNHDDz+siRMnaty4cerfv78kqV+/ftXu81S/E0VFRTp69GiNfaoQGxur5s2bS5LWrl0rSerdu7dPm7S0NJ1xxhnexwEnIFfIFafnyoUXXqi5c+fqhhtu0M9//nONGjVKktSxY0ft3LlTy5Yt09y5c6vs+9e//rXmzJmjMWPG6I477tCWLVv0wgsvaO3atfrkk098+rVx40Zde+21+vWvf62xY8fq7LPPrrHP/go2iyZPnqzc3FzdfPPN6tOnj4qLi7V69Wp9+eWX+vnPf65f//rXITv/TZs2acSIEbrllls0evRozZ49W1dffbWWLFmin//85371B2iovv76aw0aNEgtW7bU5MmTdezYMU2aNKnK+/fJrrjiCiUkJOjuu+/Wtddeq0svvVTNmzdXSkqKWrdurccee0x33HGHzjvvPO++As2d6jIjkLwuLy9Xdna2MjMz9fTTT+u9997TM888o44dO+rWW2/1trvppps0Z84cDRkyRDfffLOOHTumjz76SJ999pn3PfDRRx/VQw89pGuuuUY333yz9uzZo+eff14XXnih1q5dW+toQH9yrqbns1mzZioqKtIPP/ygZ599VpK8nxk8Ho8uu+wyffzxxxo3bpy6dOmir7/+Ws8++6y+++67KjdHqenvqWDUlBUZGRmKiorS2rVr9b//+781bn/LLbfozTffVE5Ojrp27ap9+/bp448/1vr163XuuefqgQceCNn5r1y5UvPnz9cdd9wht9utF198UYMHD9aqVavUrVs3v/oDSGJkYU1q+xZakomKijL//ve/qzx26NAhn5/LyspMt27dzMUXX+xdt2nTJhMVFWV++ctfmvLycp/2Ho/HGGPMgQMHTEJCghk7dqzP4/n5+SY+Pt5nfcU3W/fdd59f5zZq1CgTFRVV5VukE49/1113GUnmo48+8j524MAB0759e9OuXTtvvytGgHTp0sVn9Mhzzz1nJJmvv/7aGGPMsWPHTPv27U3btm3Nf//732qPaYwxl1xyienevbvPtyQej8f069fPnHnmmd51Fd/EZWVl+Wx/9913m+joaFNYWOhdV9PcUhX7uOCCC6p883by62iMMXl5eUaS+ctf/uJdV9vcUiePAJk+fbqRZP76179615WVlZm+ffua5s2bm+LiYmNM5QiQ008/3Wdkwdtvv20kmX/+859VjnWiI0eOVPl3tWXLFuN2u83DDz/sXRfKOQur+zasuqXiW9oT91fdN5XnnXee+Z//+R+/+gXUF+QKuXIyp+WKMZWjGk5U02iNjz76yEgyr732ms/6JUuWVFlfMaJzyZIltfa1OrX97gWbRT179jRDhw6ttU0oz//EkYRFRUWmVatW5mc/+1lA/QEaouHDh5vY2Fizbds277pvv/3WREdH1zqy0Bjf0dknqsirk0f7B5o7J2eGlbw++b34Zz/7mcnIyPD+/P777xtJ5o477qjy3FRk3tatW010dLR59NFHfR7/+uuvTaNGjaqsP5m/OVfT81nTnH1z5841UVFRPn8/GFM5h+Ann3ziXVfb31OnUtvIwvHjx5vo6OhqH2vZsqUZOXJkrfuOj4+vko0nC9X5SzKrV6/2rtu2bZuJjY01v/zlLwPqD8DdkC0aMGCAunbtWmX9iXPn/Pe//1VRUZH69++vL7/80rt+0aJF8ng8mjhxoqKifF+CijswLVu2TIWFhbr22mu1d+9e7xIdHa3MzEx98MEHVY594jdHNfF4PFq0aJGGDRtW5ZuRE4+/ePFi9enTRxdccIH3sebNm2vcuHHaunWrvv32W5/txowZ4zOXUsVItf/85z+Sjn8bs2XLFt11111VvpGqOOb+/fv1/vvv65prrtGBAwe857xv3z5lZ2dr06ZN+vHHH322HTdunM9dq/r376/y8nJt27btlM9FhbFjxyo6Otpn3Ymv49GjR7Vv3z516tRJCQkJPq9lIBYvXqzU1FRde+213nWNGzfWHXfcoYMHD2rlypU+7UeMGOEz98XJz2lN3G63999VeXm59u3bp+bNm+vss8+23PdTeeaZZ7Rs2bJTLr/73e+82xw+fNjb35PFxsZ6HwcaCnKFXAlUfc+VBQsWKD4+Xj//+c99/k1mZGSoefPmVf5Ntm/fXtnZ2ZaPV51gsyghIUH//ve/tWnTpoCPHej5p6Wl+YxIiouL06hRo7R27Vrl5+cH3R/AqcrLy7V06VINHz5cbdq08a7v0qVLyN9TrOTOyZlhJa9vueUWn5/79+/v897+1ltvyeVyadKkSVW2rci8v//97/J4PLrmmmt8jpuamqozzzyz2uOeKBw5Jx1/r+zSpYs6d+7s06+LL75Ykqr0q6a/p4Jx+PDhGucN9jcrPv/8c+3cuTPgYwd6/n379lVGRob35zZt2ujyyy/X0qVLVV5eHnR/0HBwGbJF7du3r3b9O++8o0ceeUTr1q1TaWmpd/2JHzw2b96sqKioWt/EKv7Iq3gTOFlcXJzPz40aNdIZZ5xxyn7v2bNHxcXF3iHINdm2bZsyMzOrrK+4FGrbtm0++zgxeCV5P4z897//lXT8nCXVetzvv/9exhg99NBDeuihh6pts3v3brVu3drv4/qjutfy8OHDys3N1ezZs/Xjjz/KGON9rKioyO99n2jbtm0688wzq3yQP/E5PZHVc/N4PHruuef04osvasuWLd5QkKTTTz/dUt9P5cRA8lfFHxQn/p5UqG3SesCpyBVyJVD1PVc2bdqkoqIiJScnV/t4xc0DKtT0OxKMYLPo4Ycf1uWXX66zzjpL3bp10+DBg3XDDTeoR48epzx2oOffqVMnn997STrrrLMkSVu3blVqampQ/QGcas+ePTp8+LDOPPPMKo+dffbZWrx4cciOZSV3Tn5vCzSvY2NjfaY1kY6/v5/43r5582alpaUpMTGxxr5v2rRJxphqnydJtU5XIYUn5yr6tX79+irnWMGurCgrK6v2MX+y4sknn9To0aOVnp6ujIwMXXrppRo1apQ6dOhwymMHev7VvX5nnXWWDh06pD179ig1NTWo/qDhoFhoUXVvCB999JEuu+wyXXjhhXrxxRfVqlUrNW7cWLNnz9a8efMC2r/H45F0fL6K1NTUKo9X3K2vwonf+teFk0dQVDgxJE6l4pzvueeeGr/l69SpU8iPW91refvtt2v27Nm666671LdvX8XHx8vlcmnkyJHefoab1XN77LHH9NBDD+lXv/qVpk6dqsTEREVFRemuu+4KW9/3799fY4CeqEmTJoqPj5cktWrVSpK0a9cupaen+7TbtWuX+vTpE/qOAhGMXPFFroRepOWKx+NRcnKyXnvttWofP/mDUTi+RAo2iy688EJt3rxZb7/9tv71r3/pT3/6k5599lnNmjVLN998c63bBnr+/gimPwCCZyV3Tn5vCzSva3pvD5TH45HL5dL//d//VbvPijn0ahKunPN4POrevbumTZtW7eMnv3eHKyvKy8u1e/duny94ysrKtG/fPqWlpdW6/TXXXKP+/ftr4cKF+te//qWnnnpKTzzxhP7+979ryJAhtW4b6Pn7I5j+oOGgWFiDk7+59cdbb72l2NhYLV261OdyltmzZ/u069ixozwej7799lv16tWr2n117NhRkpScnKysrKyA+1KTli1bKi4uTt98802t7dq2bauNGzdWWb9hwwbv44GoOJ9vvvmmxvOp+CajcePGIT1nK6/lm2++qdGjR+uZZ57xrjty5IgKCwst77tt27b66quv5PF4fD6AW31Oa/Lmm2/qoosu0iuvvOKzvrCw0HtTBSnw56W29ldccUWVy92qM3r0aM2ZM0eSvP/2V69e7fNhbOfOnfrhhx80bty4gPoHRDpyhVxxeq7UpKZz6tixo9577z2df/75dTaaPBRZlJiYqDFjxmjMmDE6ePCgLrzwQk2ePNlbnAvV+VeMWDpxf999950k+Uzgf6r+AA1Ny5Yt1aRJk2ovz68ul4IRitwJR1537NhRS5cu1f79+2scXdixY0cZY9S+fXvvqOVA+JtzNantvfL//b//p0suucRS/obCiVlx6aWXetevXr1aHo+nxr+9TtSqVSvddtttuu2227R7926de+65evTRR73FuVCdf3X/zr/77js1bdrU50uoU/UHYM7CGjRr1kyS/H5zk45/q+NyuXwuz9m6dWuVOxQNHz5cUVFRevjhh6t8y1Lx7X52drbi4uL02GOPVXuX2T179vjdrxNFRUVp+PDh+uc//6nVq1dXebzi+JdeeqlWrVqlvLw872MlJSV66aWX1K5du4DngTj33HPVvn17TZ8+vcpzWnHM5ORkDRw4UH/84x+1a9euKvuwes7NmjUL6HWUjr+WJ4+0eP75531e24p9S/79O7n00kuVn5/vvaOmdPxuo88//7yaN2+uAQMGBNTHmlTX9wULFlSZHyXQf+O1tbcyZ+E555yjzp0766WXXvJ5XmfOnCmXy6WrrrrKr34B9QW5Qq44PVdqUtM5XXPNNSovL9fUqVOrbHPs2LGAn2Mrgs2iffv2+fzcvHlzderUyeey5lCd/86dO7Vw4ULvz8XFxfrLX/6iXr16eUcf+dMfoKGJjo5Wdna2Fi1apO3bt3vXr1+/XkuXLg3psUKRO+HI6yuvvFLGGE2ZMqXKYxXv71dccYWio6M1ZcqUKu/5xpgq7y8n8zfnalJxR+STXXPNNfrxxx/18ssvV3ns8OHD3jtIh9PFF1+sxMREzZw502f9zJkz1bRpUw0dOrTGbcvLy6ucV3JystLS0qpkRSjOPy8vz2eOyB07dujtt9/WoEGDFB0d7Xd/AEYW1qBiDrYHHnhAI0eOVOPGjTVs2DDvH3zVGTp0qKZNm6bBgwfruuuu0+7duzVjxgx16tRJX331lbddp06d9MADD2jq1Knq37+/rrjiCrndbn3xxRdKS0tTbm6u4uLiNHPmTN1www0699xzNXLkSLVs2VLbt2/Xu+++q/PPP18vvPCCpXN77LHH9K9//UsDBgzw3n59165dWrBggT7++GMlJCTovvvu09/+9jcNGTJEd9xxhxITE/XnP/9ZW7Zs0VtvvRXwpWlRUVGaOXOmhg0bpl69emnMmDFq1aqVNmzYoH//+9/eoJ4xY4YuuOACde/eXWPHjlWHDh1UUFCgvLw8/fDDD/p//+//BXy+GRkZmjlzph555BF16tRJycnJNc4BUuEXv/iF5s6dq/j4eHXt2lV5eXl67733qszN1KtXL0VHR+uJJ55QUVGR3G63Lr744mrnHxo3bpz++Mc/6sYbb9SaNWvUrl07vfnmm/rkk080ffp0tWjRIuBzq6nvDz/8sMaMGaN+/frp66+/1muvvVZlDoqOHTsqISFBs2bNUosWLdSsWTNlZmbWOM9Hbb8TVuYslKSnnnpKl112mQYNGqSRI0fqm2++0QsvvKCbb77ZO+cW4BTkCrni9FypScW//TvuuEPZ2dmKjo7WyJEjNWDAAP36179Wbm6u1q1bp0GDBqlx48batGmTFixYoOeee87yF0dFRUV6/vnnJUmffPKJJOmFF15QQkKCEhISlJOT420bTBZ17dpVAwcOVEZGhhITE7V69Wq9+eabPvsP1fmfddZZuummm/TFF18oJSVFr776qgoKCnxGGvvTH6AhmjJlipYsWaL+/fvrtttu836xcs455/jkaSgEmzvhyOuLLrpIN9xwg/7whz9o06ZNGjx4sDwejz766CNddNFFysnJUceOHfXII4/o/vvv19atWzV8+HC1aNFCW7Zs0cKFCzVu3Djdc889NR7D35yrSUZGhubPn68JEybovPPOU/PmzTVs2DDdcMMNeuONN3TLLbfogw8+0Pnnn6/y8nJt2LBBb7zxhpYuXVrtDdb8sW3bNs2dO1eSvF94PvLII5KOj86/4YYbJB2/tHnq1KkaP368rr76amVnZ+ujjz7SX//6Vz366KO1zgV54MABnXHGGbrqqqvUs2dPNW/eXO+9956++OILn1GYoTr/bt26KTs7W3fccYfcbrdefPFFSfIWiv3tD1D9vcFh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586duuKKK0LecQCobzxyyWMsLFyyFTbkGgBYZynXyLSwIdMAIEguV+CFQpczcy2gy5CXLFni8/OcOXOUnJysNWvW6MILL1RRUZFeeeUVzZs3TxdffLEkafbs2erSpYs+++wz/c///E/oeg4A9YyxOGeh4YNV2JBrAGCdlVwj08KHTAOAIHEZsldQZ1VUVCRJSkxMlCStWbNGR48eVVZWlrdN586d1aZNG+Xl5VW7j9LSUhUXF/ssAADUBXINAOAUocg0iVwDgIbIcrHQ4/Horrvu0vnnn69u3bpJkvLz8xUTE6OEhASftikpKcrPz692P7m5uYqPj/cu6enpVrsEABHN0iXIPy0IP3INAAJDpkWuUGWaRK4BaECYs9DL8lmNHz9e33zzjV5//fWgOnD//ferqKjIu+zYsSOo/QFApOIGJ5GNXAOAwJBpkStUmSaRawAaEIqFXgHNWVghJydH77zzjj788EOdccYZ3vWpqakqKytTYWGhzzdWBQUFSk1NrXZfbrdbbrfbSjcAoF6xOqKCURjhR64BQOCs5BqZFn6hzDSJXAPQgDBnoVdAZ2WMUU5OjhYuXKj3339f7du393k8IyNDjRs31vLly73rNm7cqO3bt6tv376h6TEA1FOenyaCt7IgPMg1ALCOTIssZBoABImRhV4BjSwcP3685s2bp7ffflstWrTwzm0RHx+vJk2aKD4+XjfddJMmTJigxMRExcXF6fbbb1ffvn25uxaABo+RhZGHXAMA6xhZGFnINAAIEiMLvQIqFs6cOVOSNHDgQJ/1s2fP1o033ihJevbZZxUVFaUrr7xSpaWlys7O1osvvhiSzgIAEErkGgDAKcg0AECoBFQsNMacsk1sbKxmzJihGTNmWO4UADgRIwsjD7kGANYxsjCykGkAECRGFnpZusEJACBwFAsBAE5CsRAA4CgUC72ceVYAEIEqPlRZWQAAiDRkGgDAUVyuwG9u4rKWazNmzFC7du0UGxurzMxMrVq1qsa2L7/8svr376/TTjtNp512mrKysmptHwoUCwHAJkbW7hx56ouKAACwn5VcI9MAABHLprshz58/XxMmTNCkSZP05ZdfqmfPnsrOztbu3burbb9ixQpde+21+uCDD5SXl6f09HQNGjRIP/74Y7BnXCOKhQAAAAAAAIANpk2bprFjx2rMmDHq2rWrZs2apaZN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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "engine": 0 - }, - "output_type": "display_data" - } - ], - "source": [ - "if mpi_rank == 0:\n", - " fig = plt.figure(figsize=(16, 4))\n", - " fig.patch.set_facecolor(\"white\")\n", - " ax_before = fig.add_subplot(131)\n", - " ax_after = fig.add_subplot(132)\n", - " ax_diff = fig.add_subplot(133)\n", - "\n", - " f1 = ax_before.pcolormesh(\n", - " tracer_state[0].data[:, :, 0].T, vmin=-0, vmax=1, cmap=\"viridis\"\n", - " )\n", - " plt.colorbar(f1, ax=ax_before)\n", - " f2 = ax_after.pcolormesh(\n", - " tracer_state[-1].data[:, :, 0].T, vmin=-0, vmax=1, cmap=\"viridis\"\n", - " )\n", - " plt.colorbar(f2, ax=ax_after)\n", - " f3 = ax_diff.pcolormesh(\n", - " (tracer_state[-1].data[:, :, 0] - tracer_state[0].data[:, :, 0]).T,\n", - " vmin=-0.5,\n", - " vmax=0.5,\n", - " cmap=\"bwr\",\n", - " )\n", - " plt.colorbar(f3, ax=ax_diff)\n", - "\n", - " ax_before.set_title(\"tracer concentration at t=0\")\n", - " ax_after.set_title(\"tracer concentration after %s steps\" % nSteps)\n", - " ax_diff.set_title(\"difference after %s steps\" % nSteps)\n", - " plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "d41c4b7b", - "metadata": {}, - "source": [ - "## Recreating this with functions.py\n", - "\n", - "You can reproduce the above steps in a more succinct manner by using the following syntax.\n", - "\n", - "In this case, we are using 79 layers, and things are not as fast as they could be - the same calculation is repeated at every vertical level." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "5d38b817", - "metadata": { - "jupyter": { - "outputs_hidden": true - }, - "tags": [] - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[1:execute]\n", - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)\n", - "Cell \u001b[0;32mIn [15], line 23\u001b[0m\n", - "\u001b[1;32m 20\u001b[0m stencil_configuration \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mconfigure_stencil(domain_configuration, backend\u001b[38;5;241m=\u001b[39mbackend)\n", - "\u001b[1;32m 21\u001b[0m stencil_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mquantity_factory\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m domain_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mquantity_factory\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", - "\u001b[0;32m---> 23\u001b[0m tracer_advection_data, tracer_advection \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprepare_everything_for_advection\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 24\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minitial_state\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimestep\u001b[49m\n", - "\u001b[1;32m 25\u001b[0m \u001b[43m)\u001b[49m\n", - "\u001b[1;32m 27\u001b[0m tracer_advection_data_initial \u001b[38;5;241m=\u001b[39m cp\u001b[38;5;241m.\u001b[39mdeepcopy(tracer_advection_data)\n", - "\u001b[1;32m 29\u001b[0m tracer_state \u001b[38;5;241m=\u001b[39m [cp\u001b[38;5;241m.\u001b[39mdeepcopy(tracer_advection_data_initial[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracers\u001b[39m\u001b[38;5;124m\"\u001b[39m][\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m])]\n", - "\n", - "File \u001b[0;32m/pace/examples/notebooks/functions.py:987\u001b[0m, in \u001b[0;36mprepare_everything_for_advection\u001b[0;34m(stencil_configuration, initial_state, dimensions, timestep)\u001b[0m\n", - "\u001b[1;32m 962\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n", - "\u001b[1;32m 963\u001b[0m \u001b[38;5;124;03mUse: tracer_advection_data, tracer_advection =\u001b[39;00m\n", - "\u001b[1;32m 964\u001b[0m \u001b[38;5;124;03m prepare_everything_for_advection(stencil_configuration, initial_state,\u001b[39;00m\n", - "\u001b[0;32m (...)\u001b[0m\n", - "\u001b[1;32m 982\u001b[0m \n", - "\u001b[1;32m 983\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n", - "\u001b[1;32m 985\u001b[0m tracers \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m: initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m]}\n", - "\u001b[0;32m--> 987\u001b[0m flux_prep \u001b[38;5;241m=\u001b[39m \u001b[43mrun_finite_volume_fluxprep\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 988\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m,\u001b[49m\n", - "\u001b[1;32m 989\u001b[0m \u001b[43m \u001b[49m\u001b[43minitial_state\u001b[49m\u001b[43m,\u001b[49m\n", - "\u001b[1;32m 990\u001b[0m \u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\n", - "\u001b[1;32m 991\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimestep\u001b[49m\u001b[43m,\u001b[49m\n", - "\u001b[1;32m 992\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 994\u001b[0m tracer_advection \u001b[38;5;241m=\u001b[39m build_tracer_advection(stencil_configuration, tracers)\n", - "\u001b[1;32m 996\u001b[0m tracer_advection_data \u001b[38;5;241m=\u001b[39m {\n", - "\u001b[1;32m 997\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracers\u001b[39m\u001b[38;5;124m\"\u001b[39m: tracers,\n", - "\u001b[1;32m 998\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelp\u001b[39m\u001b[38;5;124m\"\u001b[39m: initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelp\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[0;32m (...)\u001b[0m\n", - "\u001b[1;32m 1002\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcry\u001b[39m\u001b[38;5;124m\"\u001b[39m: flux_prep[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcry\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[1;32m 1003\u001b[0m }\n", - "\n", - "File \u001b[0;32m/pace/examples/notebooks/functions.py:877\u001b[0m, in \u001b[0;36mrun_finite_volume_fluxprep\u001b[0;34m(stencil_configuration, initial_state, dimensions, timestep, density)\u001b[0m\n", - "\u001b[1;32m 872\u001b[0m vc_contra \u001b[38;5;241m=\u001b[39m init_quantity(\n", - "\u001b[1;32m 873\u001b[0m dimensions, VariableGrid\u001b[38;5;241m.\u001b[39mStaggeredInY, VariableDims\u001b[38;5;241m.\u001b[39mXYZ, units\u001b[38;5;241m=\u001b[39munits[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124marea\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", - "\u001b[1;32m 874\u001b[0m )\n", - "\u001b[1;32m 876\u001b[0m \u001b[38;5;66;03m# intialize and run\u001b[39;00m\n", - "\u001b[0;32m--> 877\u001b[0m fvf_prep \u001b[38;5;241m=\u001b[39m \u001b[43mFiniteVolumeFluxPrep\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 878\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstencil_factory\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mgrid_data\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\n", - "\u001b[1;32m 879\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 881\u001b[0m fvf_prep(\n", - "\u001b[1;32m 882\u001b[0m initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mu_cgrid\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[1;32m 883\u001b[0m initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mv_cgrid\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[0;32m (...)\u001b[0m\n", - "\u001b[1;32m 890\u001b[0m timestep,\n", - "\u001b[1;32m 891\u001b[0m ) \u001b[38;5;66;03m# this will modify empty quantities, but not change uc, vc\u001b[39;00m\n", - "\u001b[1;32m 893\u001b[0m mfxd \u001b[38;5;241m=\u001b[39m init_quantity(\n", - "\u001b[1;32m 894\u001b[0m dimensions, VariableGrid\u001b[38;5;241m.\u001b[39mStaggeredInX, VariableDims\u001b[38;5;241m.\u001b[39mXYZ, units\u001b[38;5;241m=\u001b[39munits[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124marea\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", - "\u001b[1;32m 895\u001b[0m )\n", - "\n", - "\u001b[0;31mTypeError\u001b[0m: __init__() missing 1 required positional argument: 'grid_type'\n" - ] - }, - { - "data": { - "text/plain": [ - "[stderr:2] /pace/NDSL/ndsl/grid/gnomonic.py:681: RuntimeWarning: invalid value encountered in true_divide\n", - " np.sum(p * q, axis=-1)\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[4:execute]\n", - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)\n", - "Cell \u001b[0;32mIn [15], line 23\u001b[0m\n", - "\u001b[1;32m 20\u001b[0m stencil_configuration \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mconfigure_stencil(domain_configuration, backend\u001b[38;5;241m=\u001b[39mbackend)\n", - "\u001b[1;32m 21\u001b[0m stencil_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mquantity_factory\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m domain_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mquantity_factory\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", - "\u001b[0;32m---> 23\u001b[0m tracer_advection_data, tracer_advection \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprepare_everything_for_advection\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 24\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minitial_state\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimestep\u001b[49m\n", - "\u001b[1;32m 25\u001b[0m \u001b[43m)\u001b[49m\n", - "\u001b[1;32m 27\u001b[0m tracer_advection_data_initial \u001b[38;5;241m=\u001b[39m cp\u001b[38;5;241m.\u001b[39mdeepcopy(tracer_advection_data)\n", - "\u001b[1;32m 29\u001b[0m tracer_state \u001b[38;5;241m=\u001b[39m [cp\u001b[38;5;241m.\u001b[39mdeepcopy(tracer_advection_data_initial[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracers\u001b[39m\u001b[38;5;124m\"\u001b[39m][\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m])]\n", - "\n", - "File \u001b[0;32m/pace/examples/notebooks/functions.py:987\u001b[0m, in \u001b[0;36mprepare_everything_for_advection\u001b[0;34m(stencil_configuration, initial_state, dimensions, timestep)\u001b[0m\n", - "\u001b[1;32m 962\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n", - "\u001b[1;32m 963\u001b[0m \u001b[38;5;124;03mUse: tracer_advection_data, tracer_advection =\u001b[39;00m\n", - "\u001b[1;32m 964\u001b[0m \u001b[38;5;124;03m prepare_everything_for_advection(stencil_configuration, initial_state,\u001b[39;00m\n", - "\u001b[0;32m (...)\u001b[0m\n", - "\u001b[1;32m 982\u001b[0m \n", - "\u001b[1;32m 983\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n", - "\u001b[1;32m 985\u001b[0m tracers \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m: initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m]}\n", - "\u001b[0;32m--> 987\u001b[0m flux_prep \u001b[38;5;241m=\u001b[39m \u001b[43mrun_finite_volume_fluxprep\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 988\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m,\u001b[49m\n", - "\u001b[1;32m 989\u001b[0m \u001b[43m \u001b[49m\u001b[43minitial_state\u001b[49m\u001b[43m,\u001b[49m\n", - "\u001b[1;32m 990\u001b[0m \u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\n", - "\u001b[1;32m 991\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimestep\u001b[49m\u001b[43m,\u001b[49m\n", - "\u001b[1;32m 992\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 994\u001b[0m tracer_advection \u001b[38;5;241m=\u001b[39m build_tracer_advection(stencil_configuration, tracers)\n", - "\u001b[1;32m 996\u001b[0m tracer_advection_data \u001b[38;5;241m=\u001b[39m {\n", - "\u001b[1;32m 997\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracers\u001b[39m\u001b[38;5;124m\"\u001b[39m: tracers,\n", - "\u001b[1;32m 998\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelp\u001b[39m\u001b[38;5;124m\"\u001b[39m: initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelp\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[0;32m (...)\u001b[0m\n", - "\u001b[1;32m 1002\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcry\u001b[39m\u001b[38;5;124m\"\u001b[39m: flux_prep[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcry\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[1;32m 1003\u001b[0m }\n", - "\n", - "File \u001b[0;32m/pace/examples/notebooks/functions.py:877\u001b[0m, in \u001b[0;36mrun_finite_volume_fluxprep\u001b[0;34m(stencil_configuration, initial_state, dimensions, timestep, density)\u001b[0m\n", - "\u001b[1;32m 872\u001b[0m vc_contra \u001b[38;5;241m=\u001b[39m init_quantity(\n", - "\u001b[1;32m 873\u001b[0m dimensions, VariableGrid\u001b[38;5;241m.\u001b[39mStaggeredInY, VariableDims\u001b[38;5;241m.\u001b[39mXYZ, units\u001b[38;5;241m=\u001b[39munits[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124marea\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", - "\u001b[1;32m 874\u001b[0m )\n", - "\u001b[1;32m 876\u001b[0m \u001b[38;5;66;03m# intialize and run\u001b[39;00m\n", - "\u001b[0;32m--> 877\u001b[0m fvf_prep \u001b[38;5;241m=\u001b[39m \u001b[43mFiniteVolumeFluxPrep\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 878\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstencil_factory\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mgrid_data\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\n", - "\u001b[1;32m 879\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 881\u001b[0m fvf_prep(\n", - "\u001b[1;32m 882\u001b[0m initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mu_cgrid\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[1;32m 883\u001b[0m initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mv_cgrid\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[0;32m (...)\u001b[0m\n", - "\u001b[1;32m 890\u001b[0m timestep,\n", - "\u001b[1;32m 891\u001b[0m ) \u001b[38;5;66;03m# this will modify empty quantities, but not change uc, vc\u001b[39;00m\n", - "\u001b[1;32m 893\u001b[0m mfxd \u001b[38;5;241m=\u001b[39m init_quantity(\n", - "\u001b[1;32m 894\u001b[0m dimensions, VariableGrid\u001b[38;5;241m.\u001b[39mStaggeredInX, VariableDims\u001b[38;5;241m.\u001b[39mXYZ, units\u001b[38;5;241m=\u001b[39munits[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124marea\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", - "\u001b[1;32m 895\u001b[0m )\n", - "\n", - "\u001b[0;31mTypeError\u001b[0m: __init__() missing 1 required positional argument: 'grid_type'\n" - ] - }, - { - "data": { - "text/plain": [ - "[stderr:5] /pace/NDSL/ndsl/grid/gnomonic.py:681: RuntimeWarning: invalid value encountered in true_divide\n", - " np.sum(p * q, axis=-1)\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[0:execute]\n", - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)\n", - "Cell \u001b[0;32mIn [15], line 23\u001b[0m\n", - "\u001b[1;32m 20\u001b[0m stencil_configuration \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mconfigure_stencil(domain_configuration, backend\u001b[38;5;241m=\u001b[39mbackend)\n", - "\u001b[1;32m 21\u001b[0m stencil_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mquantity_factory\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m domain_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mquantity_factory\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", - "\u001b[0;32m---> 23\u001b[0m tracer_advection_data, tracer_advection \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprepare_everything_for_advection\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 24\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minitial_state\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimestep\u001b[49m\n", - "\u001b[1;32m 25\u001b[0m \u001b[43m)\u001b[49m\n", - "\u001b[1;32m 27\u001b[0m tracer_advection_data_initial \u001b[38;5;241m=\u001b[39m cp\u001b[38;5;241m.\u001b[39mdeepcopy(tracer_advection_data)\n", - "\u001b[1;32m 29\u001b[0m tracer_state \u001b[38;5;241m=\u001b[39m [cp\u001b[38;5;241m.\u001b[39mdeepcopy(tracer_advection_data_initial[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracers\u001b[39m\u001b[38;5;124m\"\u001b[39m][\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m])]\n", - "\n", - "File \u001b[0;32m/pace/examples/notebooks/functions.py:987\u001b[0m, in \u001b[0;36mprepare_everything_for_advection\u001b[0;34m(stencil_configuration, initial_state, dimensions, timestep)\u001b[0m\n", - "\u001b[1;32m 962\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n", - "\u001b[1;32m 963\u001b[0m \u001b[38;5;124;03mUse: tracer_advection_data, tracer_advection =\u001b[39;00m\n", - "\u001b[1;32m 964\u001b[0m \u001b[38;5;124;03m prepare_everything_for_advection(stencil_configuration, initial_state,\u001b[39;00m\n", - "\u001b[0;32m (...)\u001b[0m\n", - "\u001b[1;32m 982\u001b[0m \n", - "\u001b[1;32m 983\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n", - "\u001b[1;32m 985\u001b[0m tracers \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m: initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m]}\n", - "\u001b[0;32m--> 987\u001b[0m flux_prep \u001b[38;5;241m=\u001b[39m \u001b[43mrun_finite_volume_fluxprep\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 988\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m,\u001b[49m\n", - "\u001b[1;32m 989\u001b[0m \u001b[43m \u001b[49m\u001b[43minitial_state\u001b[49m\u001b[43m,\u001b[49m\n", - "\u001b[1;32m 990\u001b[0m \u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\n", - "\u001b[1;32m 991\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimestep\u001b[49m\u001b[43m,\u001b[49m\n", - "\u001b[1;32m 992\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 994\u001b[0m tracer_advection \u001b[38;5;241m=\u001b[39m build_tracer_advection(stencil_configuration, tracers)\n", - "\u001b[1;32m 996\u001b[0m tracer_advection_data \u001b[38;5;241m=\u001b[39m {\n", - "\u001b[1;32m 997\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracers\u001b[39m\u001b[38;5;124m\"\u001b[39m: tracers,\n", - "\u001b[1;32m 998\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelp\u001b[39m\u001b[38;5;124m\"\u001b[39m: initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelp\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[0;32m (...)\u001b[0m\n", - "\u001b[1;32m 1002\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcry\u001b[39m\u001b[38;5;124m\"\u001b[39m: flux_prep[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcry\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[1;32m 1003\u001b[0m }\n", - "\n", - "File \u001b[0;32m/pace/examples/notebooks/functions.py:877\u001b[0m, in \u001b[0;36mrun_finite_volume_fluxprep\u001b[0;34m(stencil_configuration, initial_state, dimensions, timestep, density)\u001b[0m\n", - "\u001b[1;32m 872\u001b[0m vc_contra \u001b[38;5;241m=\u001b[39m init_quantity(\n", - "\u001b[1;32m 873\u001b[0m dimensions, VariableGrid\u001b[38;5;241m.\u001b[39mStaggeredInY, VariableDims\u001b[38;5;241m.\u001b[39mXYZ, units\u001b[38;5;241m=\u001b[39munits[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124marea\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", - "\u001b[1;32m 874\u001b[0m )\n", - "\u001b[1;32m 876\u001b[0m \u001b[38;5;66;03m# intialize and run\u001b[39;00m\n", - "\u001b[0;32m--> 877\u001b[0m fvf_prep \u001b[38;5;241m=\u001b[39m \u001b[43mFiniteVolumeFluxPrep\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 878\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstencil_factory\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mgrid_data\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\n", - "\u001b[1;32m 879\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 881\u001b[0m fvf_prep(\n", - "\u001b[1;32m 882\u001b[0m initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mu_cgrid\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[1;32m 883\u001b[0m initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mv_cgrid\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[0;32m (...)\u001b[0m\n", - "\u001b[1;32m 890\u001b[0m timestep,\n", - "\u001b[1;32m 891\u001b[0m ) \u001b[38;5;66;03m# this will modify empty quantities, but not change uc, vc\u001b[39;00m\n", - "\u001b[1;32m 893\u001b[0m mfxd \u001b[38;5;241m=\u001b[39m init_quantity(\n", - "\u001b[1;32m 894\u001b[0m dimensions, VariableGrid\u001b[38;5;241m.\u001b[39mStaggeredInX, VariableDims\u001b[38;5;241m.\u001b[39mXYZ, units\u001b[38;5;241m=\u001b[39munits[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124marea\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", - "\u001b[1;32m 895\u001b[0m )\n", - "\n", - "\u001b[0;31mTypeError\u001b[0m: __init__() missing 1 required positional argument: 'grid_type'\n", - "[2:execute]\n", - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)\n", - "Cell \u001b[0;32mIn [15], line 23\u001b[0m\n", - "\u001b[1;32m 20\u001b[0m stencil_configuration \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mconfigure_stencil(domain_configuration, backend\u001b[38;5;241m=\u001b[39mbackend)\n", - "\u001b[1;32m 21\u001b[0m stencil_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mquantity_factory\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m domain_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mquantity_factory\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", - "\u001b[0;32m---> 23\u001b[0m tracer_advection_data, tracer_advection \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprepare_everything_for_advection\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 24\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minitial_state\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimestep\u001b[49m\n", - "\u001b[1;32m 25\u001b[0m \u001b[43m)\u001b[49m\n", - "\u001b[1;32m 27\u001b[0m tracer_advection_data_initial \u001b[38;5;241m=\u001b[39m cp\u001b[38;5;241m.\u001b[39mdeepcopy(tracer_advection_data)\n", - "\u001b[1;32m 29\u001b[0m tracer_state \u001b[38;5;241m=\u001b[39m [cp\u001b[38;5;241m.\u001b[39mdeepcopy(tracer_advection_data_initial[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracers\u001b[39m\u001b[38;5;124m\"\u001b[39m][\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m])]\n", - "\n", - "File \u001b[0;32m/pace/examples/notebooks/functions.py:987\u001b[0m, in \u001b[0;36mprepare_everything_for_advection\u001b[0;34m(stencil_configuration, initial_state, dimensions, timestep)\u001b[0m\n", - "\u001b[1;32m 962\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n", - "\u001b[1;32m 963\u001b[0m \u001b[38;5;124;03mUse: tracer_advection_data, tracer_advection =\u001b[39;00m\n", - "\u001b[1;32m 964\u001b[0m \u001b[38;5;124;03m prepare_everything_for_advection(stencil_configuration, initial_state,\u001b[39;00m\n", - "\u001b[0;32m (...)\u001b[0m\n", - "\u001b[1;32m 982\u001b[0m \n", - "\u001b[1;32m 983\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n", - "\u001b[1;32m 985\u001b[0m tracers \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m: initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracer\u001b[39m\u001b[38;5;124m\"\u001b[39m]}\n", - "\u001b[0;32m--> 987\u001b[0m flux_prep \u001b[38;5;241m=\u001b[39m \u001b[43mrun_finite_volume_fluxprep\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 988\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m,\u001b[49m\n", - "\u001b[1;32m 989\u001b[0m \u001b[43m \u001b[49m\u001b[43minitial_state\u001b[49m\u001b[43m,\u001b[49m\n", - "\u001b[1;32m 990\u001b[0m \u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\n", - "\u001b[1;32m 991\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimestep\u001b[49m\u001b[43m,\u001b[49m\n", - "\u001b[1;32m 992\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 994\u001b[0m tracer_advection \u001b[38;5;241m=\u001b[39m build_tracer_advection(stencil_configuration, tracers)\n", - "\u001b[1;32m 996\u001b[0m tracer_advection_data \u001b[38;5;241m=\u001b[39m {\n", - "\u001b[1;32m 997\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtracers\u001b[39m\u001b[38;5;124m\"\u001b[39m: tracers,\n", - "\u001b[1;32m 998\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelp\u001b[39m\u001b[38;5;124m\"\u001b[39m: initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelp\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[0;32m (...)\u001b[0m\n", - "\u001b[1;32m 1002\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcry\u001b[39m\u001b[38;5;124m\"\u001b[39m: flux_prep[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcry\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[1;32m 1003\u001b[0m }\n", - "\n", - "File \u001b[0;32m/pace/examples/notebooks/functions.py:877\u001b[0m, in \u001b[0;36mrun_finite_volume_fluxprep\u001b[0;34m(stencil_configuration, initial_state, dimensions, timestep, density)\u001b[0m\n", - "\u001b[1;32m 872\u001b[0m vc_contra \u001b[38;5;241m=\u001b[39m init_quantity(\n", - "\u001b[1;32m 873\u001b[0m dimensions, VariableGrid\u001b[38;5;241m.\u001b[39mStaggeredInY, VariableDims\u001b[38;5;241m.\u001b[39mXYZ, units\u001b[38;5;241m=\u001b[39munits[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124marea\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", - "\u001b[1;32m 874\u001b[0m )\n", - "\u001b[1;32m 876\u001b[0m \u001b[38;5;66;03m# intialize and run\u001b[39;00m\n", - "\u001b[0;32m--> 877\u001b[0m fvf_prep \u001b[38;5;241m=\u001b[39m \u001b[43mFiniteVolumeFluxPrep\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 878\u001b[0m \u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstencil_factory\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstencil_configuration\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mgrid_data\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\n", - "\u001b[1;32m 879\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 881\u001b[0m fvf_prep(\n", - "\u001b[1;32m 882\u001b[0m initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mu_cgrid\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[1;32m 883\u001b[0m initial_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mv_cgrid\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[0;32m (...)\u001b[0m\n", - "\u001b[1;32m 890\u001b[0m timestep,\n", - "\u001b[1;32m 891\u001b[0m ) \u001b[38;5;66;03m# this will modify empty quantities, but not change uc, vc\u001b[39;00m\n", - "\u001b[1;32m 893\u001b[0m mfxd \u001b[38;5;241m=\u001b[39m init_quantity(\n", - "\u001b[1;32m 894\u001b[0m dimensions, VariableGrid\u001b[38;5;241m.\u001b[39mStaggeredInX, VariableDims\u001b[38;5;241m.\u001b[39mXYZ, units\u001b[38;5;241m=\u001b[39munits[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124marea\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", - "\u001b[1;32m 895\u001b[0m )\n", - "\n", - "\u001b[0;31mTypeError\u001b[0m: __init__() missing 1 required positional argument: 'grid_type'\n", - "[5:execute] TypeError: __init__() missing 1 required positional argument: 'grid_type'\n", - "[3:execute] TypeError: __init__() missing 1 required positional argument: 'grid_type'\n" - ] - }, - { - "ename": "AlreadyDisplayedError", - "evalue": "6 errors", - "output_type": "error", - "traceback": [ - "6 errors" - ] - } - ], - "source": [ - "mpi_comm = MPI.COMM_WORLD\n", - "mpi_rank = mpi_comm.Get_rank()\n", - "\n", - "nz = 79\n", - "if nz == 1:\n", - " single_layer = True\n", - "else:\n", - " single_layer = False\n", - "\n", - "namelist_dict = func.store_namelist_variables(locals())\n", - "dimensions = func.define_dimensions(namelist_dict)\n", - "\n", - "\n", - "domain_configuration = func.configure_domain(mpi_comm, dimensions, single_layer=single_layer)\n", - "\n", - "initial_state = func.create_initial_state_advection(\n", - " domain_configuration[\"metric_terms\"], dimensions, tracer_center, test_case\n", - ")\n", - "\n", - "stencil_configuration = func.configure_stencil(domain_configuration, backend=backend)\n", - "stencil_configuration[\"quantity_factory\"] = domain_configuration[\"quantity_factory\"]\n", - "\n", - "tracer_advection_data, tracer_advection = func.prepare_everything_for_advection(\n", - " stencil_configuration, initial_state, dimensions, timestep\n", - ")\n", - "\n", - "tracer_advection_data_initial = cp.deepcopy(tracer_advection_data)\n", - "\n", - "tracer_state = [cp.deepcopy(tracer_advection_data_initial[\"tracers\"][\"tracer\"])]\n", - "\n", - "nSteps = 10\n", - "for step in range(nSteps):\n", - " tracer_advection_data = func.run_advection_step_with_reset(\n", - " tracer_advection_data_initial, tracer_advection_data, tracer_advection\n", - " )\n", - "\n", - " tracer_state.append(cp.deepcopy(tracer_advection_data[\"tracers\"][\"tracer\"]))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "fe879468", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[output:0]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABQsAAAF2CAYAAADJMM7PAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABqNUlEQVR4nO3deXxU1f3/8fckkAlbEmNIQjDsKiBbDZIvKIKaEpCi1A3UryBVqErcqK1alUXUuCJWEapVaKlURAu2yheKKLhFEYSfWgGRsikkbE0CARLInN8fmAlDFmbuzNxMbl7Px+M+NHfOvffcGTLvzGfOPddljDECAAAAAAAA0OBF1XUHAAAAAAAAAEQGioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioVAmAwcOFADBw6s624AAByiPuRKQUGBrrrqKp1++ulyuVyaPn16XXcJAGo0efJkuVwun3Xt2rXTjTfe6LNu06ZNGjRokOLj4+VyubRo0SJJ0hdffKF+/fqpWbNmcrlcWrdunT0dr+dqej4BRA6KhTX49NNPNXnyZBUWFtZ1VxCkF198UXPmzAnLvr/99ltNnjxZW7duDcv+w2nnzp2aPHmy33/UhOt34h//+IfOPfdcxcbGqk2bNpo0aZKOHTsW0mMAkYBccQ5ypWZ33323li5dqvvvv19z587V4MGDtXjxYk2ePNnWfmzcuFF33323+vXrp9jYWLlcrlqf03BmUV2cP4DQGj16tL7++ms9+uijmjt3rnr37q2jR4/q6quv1v79+/Xss89q7ty5atu2bV13tV6o7vmcN2+e7V8wrVq1SrfddpsyMjLUuHHjKoXjk73yyivq0qWLYmNjdeaZZ+r5558PWV/q4vyBWhlU66mnnjKSzJYtW+q6KwjSOeecYwYMGBCWfS9YsMBIMh988EGVx0pLS01paWlYjhsKX3zxhZFkZs+e7Vf7cPxOLF682LhcLnPRRReZl156ydx+++0mKirK3HLLLSE7BhApyBXnIFdqlpKSYq6//nqfdePHjzd2/8k5e/ZsExUVZbp162Z69epV6+9euLOoLs4fgH8mTZpU5ffzyJEjpqyszPvzoUOHjCTzwAMP+LRbv369kWRefvllW/rqFDU9n0OHDjVt27a1tS+TJk0yjRs3NhkZGeass86q9b161qxZRpK58sorzUsvvWRuuOEGI8k8/vjjIelLXZw/UJtG9pcnncfj8aisrEyxsbF13RWvkpISNWvWrK67Ue+E8nmLiYkJyX6c7J577lGPHj30r3/9S40aHX87iouL02OPPaY777xTnTt3ruMeAnWDXHGOhpYru3fvVkJCQtiPY4zRkSNH1KRJk2ofv+yyy1RYWKgWLVro6aefrnUUPVkE4ERut9vn5z179khSlfe23bt3V7s+GA0ha2t6PsPhVH9P3Xrrrbr33nvVpEkT5eTk6Lvvvqu23eHDh/XAAw9o6NChevPNNyVJY8eOlcfj0dSpUzVu3DiddtppYTsPoE7UdbUyElV8w3TyUvGNtCQzfvx489e//tV07drVNGrUyCxcuNAYc3zkSN++fU1iYqKJjY015557rlmwYEG1x5k7d64577zzTJMmTUxCQoLp37+/Wbp0qU+bxYsXmwsuuMA0bdrUNG/e3Fx66aXmm2++8WkzevRo06xZM/P999+bIUOGmObNm5vLL7+81nP84YcfzK9+9SvTqlUrExMTY9q1a2duueUWnxELmzdvNldddZU57bTTTJMmTUxmZqZ55513fPbzwQcfGElm/vz55pFHHjGtW7c2brfbXHzxxWbTpk1VjvvZZ5+ZIUOGmISEBNO0aVPTvXt3M336dJ8269evN1deeaU57bTTjNvtNhkZGebtt9/2aTN79mwjyXz88cfm7rvvNklJSaZp06Zm+PDhZvfu3d52bdu2rfI6VowGqdjHihUrzK233mpatmxpEhISjDHGbN261dx6663mrLPOMrGxsSYxMdFcddVVPqMSKrY/eakYDTJgwIAqI08KCgrMr371K5OcnGzcbrfp0aOHmTNnjk+bLVu2GEnmqaeeMn/84x9Nhw4dTExMjOndu7dZtWpVzS/qT/bt22d+85vfmG7duplmzZqZFi1amMGDB5t169ZVed1OXmoaZXiq3wkr/v3vfxtJZsaMGT7rf/zxRyPJTJ061fK+gUhDrhxHrjg3V2rq++jRo6tdX6G8vNw8++yzpmvXrsbtdpvk5GQzbtw4s3//fp8+tG3b1gwdOtQsWbLEZGRkGLfbbZ599tlT9t2Y2kf1BptFZWVlZvLkyaZTp07G7XabxMREc/7555t//etfxhgT8vNfunSp6dmzp3G73aZLly7mrbfeCqg/QEP20Ucfmd69exu32206dOhgZs2aVe3IwrZt25rRo0cbY6rP74rHa8oCYwLLneoyw5jA8vqHH34wl19+uWnWrJlJSkoyv/nNb8yxY8d82paXl5vp06ebbt26GbfbbZKSkkx2drb54osvfNrNnTvXnHvuuSY2NtacdtppZsSIEWb79u2nfH79ybmans8BAwZUu77CkSNHzMSJE03Hjh1NTEyMOeOMM8xvf/tbc+TIEZ8+1Pb31KnUNgr83XffNZLMu+++67P+008/NZLM3Llza913cXGxufPOO03btm1NTEyMadmypcnKyjJr1qwxxpiwnP9ZZ51l3G63Offcc83KlSsD6g9gDCMLq3XFFVfou+++09/+9jc9++yzSkpKkiS1bNnS2+b999/XG2+8oZycHCUlJaldu3aSpOeee06XXXaZrr/+epWVlen111/X1VdfrXfeeUdDhw71bj9lyhRNnjxZ/fr108MPP6yYmBh9/vnnev/99zVo0CBJ0ty5czV69GhlZ2friSee0KFDhzRz5kxdcMEFWrt2rfeYknTs2DFlZ2frggsu0NNPP62mTZvWeH47d+5Unz59VFhYqHHjxqlz58768ccf9eabb+rQoUOKiYlRQUGB+vXrp0OHDumOO+7Q6aefrj//+c+67LLL9Oabb+qXv/ylzz4ff/xxRUVF6Z577lFRUZGefPJJXX/99fr888+9bZYtW6Zf/OIXatWqle68806lpqZq/fr1euedd3TnnXdKkv7973/r/PPPV+vWrXXfffepWbNmeuONNzR8+HC99dZbVY57++2367TTTtOkSZO0detWTZ8+XTk5OZo/f74kafr06br99tvVvHlzPfDAA5KklJQUn33cdtttatmypSZOnKiSkhJJxycr/vTTTzVy5EidccYZ2rp1q2bOnKmBAwfq22+/VdOmTXXhhRfqjjvu0B/+8Af9/ve/V5cuXSTJ+9+THT58WAMHDtT333+vnJwctW/fXgsWLNCNN96owsJC73NQYd68eTpw4IB+/etfy+Vy6cknn9QVV1yh//znP2rcuHGNr+9//vMfLVq0SFdffbXat2+vgoIC/fGPf9SAAQP07bffKi0tTV26dNHDDz+siRMnaty4cerfv78kqV+/ftXu81S/E0VFRTp69GiNfaoQGxur5s2bS5LWrl0rSerdu7dPm7S0NJ1xxhnexwEnIFfIFafnyoUXXqi5c+fqhhtu0M9//nONGjVKktSxY0ft3LlTy5Yt09y5c6vs+9e//rXmzJmjMWPG6I477tCWLVv0wgsvaO3atfrkk098+rVx40Zde+21+vWvf62xY8fq7LPPrrHP/go2iyZPnqzc3FzdfPPN6tOnj4qLi7V69Wp9+eWX+vnPf65f//rXITv/TZs2acSIEbrllls0evRozZ49W1dffbWWLFmin//85371B2iovv76aw0aNEgtW7bU5MmTdezYMU2aNKnK+/fJrrjiCiUkJOjuu+/Wtddeq0svvVTNmzdXSkqKWrdurccee0x33HGHzjvvPO++As2d6jIjkLwuLy9Xdna2MjMz9fTTT+u9997TM888o44dO+rWW2/1trvppps0Z84cDRkyRDfffLOOHTumjz76SJ999pn3PfDRRx/VQw89pGuuuUY333yz9uzZo+eff14XXnih1q5dW+toQH9yrqbns1mzZioqKtIPP/ygZ599VpK8nxk8Ho8uu+wyffzxxxo3bpy6dOmir7/+Ws8++6y+++67KjdHqenvqWDUlBUZGRmKiorS2rVr9b//+781bn/LLbfozTffVE5Ojrp27ap9+/bp448/1vr163XuuefqgQceCNn5r1y5UvPnz9cdd9wht9utF198UYMHD9aqVavUrVs3v/oDSGJkYU1q+xZakomKijL//ve/qzx26NAhn5/LyspMt27dzMUXX+xdt2nTJhMVFWV++ctfmvLycp/2Ho/HGGPMgQMHTEJCghk7dqzP4/n5+SY+Pt5nfcU3W/fdd59f5zZq1CgTFRVV5VukE49/1113GUnmo48+8j524MAB0759e9OuXTtvvytGgHTp0sVn9Mhzzz1nJJmvv/7aGGPMsWPHTPv27U3btm3Nf//732qPaYwxl1xyienevbvPtyQej8f069fPnHnmmd51Fd/EZWVl+Wx/9913m+joaFNYWOhdV9PcUhX7uOCCC6p883by62iMMXl5eUaS+ctf/uJdV9vcUiePAJk+fbqRZP76179615WVlZm+ffua5s2bm+LiYmNM5QiQ008/3Wdkwdtvv20kmX/+859VjnWiI0eOVPl3tWXLFuN2u83DDz/sXRfKOQur+zasuqXiW9oT91fdN5XnnXee+Z//+R+/+gXUF+QKuXIyp+WKMZWjGk5U02iNjz76yEgyr732ms/6JUuWVFlfMaJzyZIltfa1OrX97gWbRT179jRDhw6ttU0oz//EkYRFRUWmVatW5mc/+1lA/QEaouHDh5vY2Fizbds277pvv/3WREdH1zqy0Bjf0dknqsirk0f7B5o7J2eGlbw++b34Zz/7mcnIyPD+/P777xtJ5o477qjy3FRk3tatW010dLR59NFHfR7/+uuvTaNGjaqsP5m/OVfT81nTnH1z5841UVFRPn8/GFM5h+Ann3ziXVfb31OnUtvIwvHjx5vo6OhqH2vZsqUZOXJkrfuOj4+vko0nC9X5SzKrV6/2rtu2bZuJjY01v/zlLwPqD8DdkC0aMGCAunbtWmX9iXPn/Pe//1VRUZH69++vL7/80rt+0aJF8ng8mjhxoqKifF+CijswLVu2TIWFhbr22mu1d+9e7xIdHa3MzEx98MEHVY594jdHNfF4PFq0aJGGDRtW5ZuRE4+/ePFi9enTRxdccIH3sebNm2vcuHHaunWrvv32W5/txowZ4zOXUsVItf/85z+Sjn8bs2XLFt11111VvpGqOOb+/fv1/vvv65prrtGBAwe857xv3z5lZ2dr06ZN+vHHH322HTdunM9dq/r376/y8nJt27btlM9FhbFjxyo6Otpn3Ymv49GjR7Vv3z516tRJCQkJPq9lIBYvXqzU1FRde+213nWNGzfWHXfcoYMHD2rlypU+7UeMGOEz98XJz2lN3G63999VeXm59u3bp+bNm+vss8+23PdTeeaZZ7Rs2bJTLr/73e+82xw+fNjb35PFxsZ6HwcaCnKFXAlUfc+VBQsWKD4+Xj//+c99/k1mZGSoefPmVf5Ntm/fXtnZ2ZaPV51gsyghIUH//ve/tWnTpoCPHej5p6Wl+YxIiouL06hRo7R27Vrl5+cH3R/AqcrLy7V06VINHz5cbdq08a7v0qVLyN9TrOTOyZlhJa9vueUWn5/79+/v897+1ltvyeVyadKkSVW2rci8v//97/J4PLrmmmt8jpuamqozzzyz2uOeKBw5Jx1/r+zSpYs6d+7s06+LL75Ykqr0q6a/p4Jx+PDhGucN9jcrPv/8c+3cuTPgYwd6/n379lVGRob35zZt2ujyyy/X0qVLVV5eHnR/0HBwGbJF7du3r3b9O++8o0ceeUTr1q1TaWmpd/2JHzw2b96sqKioWt/EKv7Iq3gTOFlcXJzPz40aNdIZZ5xxyn7v2bNHxcXF3iHINdm2bZsyMzOrrK+4FGrbtm0++zgxeCV5P4z897//lXT8nCXVetzvv/9exhg99NBDeuihh6pts3v3brVu3drv4/qjutfy8OHDys3N1ezZs/Xjjz/KGON9rKioyO99n2jbtm0688wzq3yQP/E5PZHVc/N4PHruuef04osvasuWLd5QkKTTTz/dUt9P5cRA8lfFHxQn/p5UqG3SesCpyBVyJVD1PVc2bdqkoqIiJScnV/t4xc0DKtT0OxKMYLPo4Ycf1uWXX66zzjpL3bp10+DBg3XDDTeoR48epzx2oOffqVMnn997STrrrLMkSVu3blVqampQ/QGcas+ePTp8+LDOPPPMKo+dffbZWrx4cciOZSV3Tn5vCzSvY2NjfaY1kY6/v5/43r5582alpaUpMTGxxr5v2rRJxphqnydJtU5XIYUn5yr6tX79+irnWMGurCgrK6v2MX+y4sknn9To0aOVnp6ujIwMXXrppRo1apQ6dOhwymMHev7VvX5nnXWWDh06pD179ig1NTWo/qDhoFhoUXVvCB999JEuu+wyXXjhhXrxxRfVqlUrNW7cWLNnz9a8efMC2r/H45F0fL6K1NTUKo9X3K2vwonf+teFk0dQVDgxJE6l4pzvueeeGr/l69SpU8iPW91refvtt2v27Nm666671LdvX8XHx8vlcmnkyJHefoab1XN77LHH9NBDD+lXv/qVpk6dqsTEREVFRemuu+4KW9/3799fY4CeqEmTJoqPj5cktWrVSpK0a9cupaen+7TbtWuX+vTpE/qOAhGMXPFFroRepOWKx+NRcnKyXnvttWofP/mDUTi+RAo2iy688EJt3rxZb7/9tv71r3/pT3/6k5599lnNmjVLN998c63bBnr+/gimPwCCZyV3Tn5vCzSva3pvD5TH45HL5dL//d//VbvPijn0ahKunPN4POrevbumTZtW7eMnv3eHKyvKy8u1e/duny94ysrKtG/fPqWlpdW6/TXXXKP+/ftr4cKF+te//qWnnnpKTzzxhP7+979ryJAhtW4b6Pn7I5j+oOGgWFiDk7+59cdbb72l2NhYLV261OdyltmzZ/u069ixozwej7799lv16tWr2n117NhRkpScnKysrKyA+1KTli1bKi4uTt98802t7dq2bauNGzdWWb9hwwbv44GoOJ9vvvmmxvOp+CajcePGIT1nK6/lm2++qdGjR+uZZ57xrjty5IgKCwst77tt27b66quv5PF4fD6AW31Oa/Lmm2/qoosu0iuvvOKzvrCw0HtTBSnw56W29ldccUWVy92qM3r0aM2ZM0eSvP/2V69e7fNhbOfOnfrhhx80bty4gPoHRDpyhVxxeq7UpKZz6tixo9577z2df/75dTaaPBRZlJiYqDFjxmjMmDE6ePCgLrzwQk2ePNlbnAvV+VeMWDpxf999950k+Uzgf6r+AA1Ny5Yt1aRJk2ovz68ul4IRitwJR1537NhRS5cu1f79+2scXdixY0cZY9S+fXvvqOVA+JtzNantvfL//b//p0suucRS/obCiVlx6aWXetevXr1aHo+nxr+9TtSqVSvddtttuu2227R7926de+65evTRR73FuVCdf3X/zr/77js1bdrU50uoU/UHYM7CGjRr1kyS/H5zk45/q+NyuXwuz9m6dWuVOxQNHz5cUVFRevjhh6t8y1Lx7X52drbi4uL02GOPVXuX2T179vjdrxNFRUVp+PDh+uc//6nVq1dXebzi+JdeeqlWrVqlvLw872MlJSV66aWX1K5du4DngTj33HPVvn17TZ8+vcpzWnHM5ORkDRw4UH/84x+1a9euKvuwes7NmjUL6HWUjr+WJ4+0eP75531e24p9S/79O7n00kuVn5/vvaOmdPxuo88//7yaN2+uAQMGBNTHmlTX9wULFlSZHyXQf+O1tbcyZ+E555yjzp0766WXXvJ5XmfOnCmXy6WrrrrKr34B9QW5Qq44PVdqUtM5XXPNNSovL9fUqVOrbHPs2LGAn2Mrgs2iffv2+fzcvHlzderUyeey5lCd/86dO7Vw4ULvz8XFxfrLX/6iXr16eUcf+dMfoKGJjo5Wdna2Fi1apO3bt3vXr1+/XkuXLg3psUKRO+HI6yuvvFLGGE2ZMqXKYxXv71dccYWio6M1ZcqUKu/5xpgq7y8n8zfnalJxR+STXXPNNfrxxx/18ssvV3ns8OHD3jtIh9PFF1+sxMREzZw502f9zJkz1bRpUw0dOrTGbcvLy6ucV3JystLS0qpkRSjOPy8vz2eOyB07dujtt9/WoEGDFB0d7Xd/AEYW1qBiDrYHHnhAI0eOVOPGjTVs2DDvH3zVGTp0qKZNm6bBgwfruuuu0+7duzVjxgx16tRJX331lbddp06d9MADD2jq1Knq37+/rrjiCrndbn3xxRdKS0tTbm6u4uLiNHPmTN1www0699xzNXLkSLVs2VLbt2/Xu+++q/PPP18vvPCCpXN77LHH9K9//UsDBgzw3n59165dWrBggT7++GMlJCTovvvu09/+9jcNGTJEd9xxhxITE/XnP/9ZW7Zs0VtvvRXwpWlRUVGaOXOmhg0bpl69emnMmDFq1aqVNmzYoH//+9/eoJ4xY4YuuOACde/eXWPHjlWHDh1UUFCgvLw8/fDDD/p//+//BXy+GRkZmjlzph555BF16tRJycnJNc4BUuEXv/iF5s6dq/j4eHXt2lV5eXl67733qszN1KtXL0VHR+uJJ55QUVGR3G63Lr744mrnHxo3bpz++Mc/6sYbb9SaNWvUrl07vfnmm/rkk080ffp0tWjRIuBzq6nvDz/8sMaMGaN+/frp66+/1muvvVZlDoqOHTsqISFBs2bNUosWLdSsWTNlZmbWOM9Hbb8TVuYslKSnnnpKl112mQYNGqSRI0fqm2++0QsvvKCbb77ZO+cW4BTkCrni9FypScW//TvuuEPZ2dmKjo7WyJEjNWDAAP36179Wbm6u1q1bp0GDBqlx48batGmTFixYoOeee87yF0dFRUV6/vnnJUmffPKJJOmFF15QQkKCEhISlJOT420bTBZ17dpVAwcOVEZGhhITE7V69Wq9+eabPvsP1fmfddZZuummm/TFF18oJSVFr776qgoKCnxGGvvTH6AhmjJlipYsWaL+/fvrtttu836xcs455/jkaSgEmzvhyOuLLrpIN9xwg/7whz9o06ZNGjx4sDwejz766CNddNFFysnJUceOHfXII4/o/vvv19atWzV8+HC1aNFCW7Zs0cKFCzVu3Djdc889NR7D35yrSUZGhubPn68JEybovPPOU/PmzTVs2DDdcMMNeuONN3TLLbfogw8+0Pnnn6/y8nJt2LBBb7zxhpYuXVrtDdb8sW3bNs2dO1eSvF94PvLII5KOj86/4YYbJB2/tHnq1KkaP368rr76amVnZ+ujjz7SX//6Vz366KO1zgV54MABnXHGGbrqqqvUs2dPNW/eXO+9956++OILn1GYoTr/bt26KTs7W3fccYfcbrdefPFFSfIWiv3tD1D9vcFh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586duuKKK0LecQCobzxyyWMsLFyyFTbkGgBYZynXyLSwIdMAIEguV+CFQpczcy2gy5CXLFni8/OcOXOUnJysNWvW6MILL1RRUZFeeeUVzZs3TxdffLEkafbs2erSpYs+++wz/c///E/oeg4A9YyxOGeh4YNV2JBrAGCdlVwj08KHTAOAIHEZsldQZ1VUVCRJSkxMlCStWbNGR48eVVZWlrdN586d1aZNG+Xl5VW7j9LSUhUXF/ssAADUBXINAOAUocg0iVwDgIbIcrHQ4/Horrvu0vnnn69u3bpJkvLz8xUTE6OEhASftikpKcrPz692P7m5uYqPj/cu6enpVrsEABHN0iXIPy0IP3INAAJDpkWuUGWaRK4BaECYs9DL8lmNHz9e33zzjV5//fWgOnD//ferqKjIu+zYsSOo/QFApOIGJ5GNXAOAwJBpkStUmSaRawAaEIqFXgHNWVghJydH77zzjj788EOdccYZ3vWpqakqKytTYWGhzzdWBQUFSk1NrXZfbrdbbrfbSjcAoF6xOqKCURjhR64BQOCs5BqZFn6hzDSJXAPQgDBnoVdAZ2WMUU5OjhYuXKj3339f7du393k8IyNDjRs31vLly73rNm7cqO3bt6tv376h6TEA1FOenyaCt7IgPMg1ALCOTIssZBoABImRhV4BjSwcP3685s2bp7ffflstWrTwzm0RHx+vJk2aKD4+XjfddJMmTJigxMRExcXF6fbbb1ffvn25uxaABo+RhZGHXAMA6xhZGFnINAAIEiMLvQIqFs6cOVOSNHDgQJ/1s2fP1o033ihJevbZZxUVFaUrr7xSpaWlys7O1osvvhiSzgIAEErkGgDAKcg0AECoBFQsNMacsk1sbKxmzJihGTNmWO4UADgRIwsjD7kGANYxsjCykGkAECRGFnpZusEJACBwFAsBAE5CsRAA4CgUC72ceVYAEIEqPlRZWQAAiDRkGgDAUVyuwG9u4rKWazNmzFC7du0UGxurzMxMrVq1qsa2L7/8svr376/TTjtNp512mrKysmptHwoUCwHAJkbW7hx56ouKAACwn5VcI9MAABHLprshz58/XxMmTNCkSZP05ZdfqmfPnsrOztbu3burbb9ixQpde+21+uCDD5SXl6f09HQNGjRIP/74Y7BnXCOKhQAAAAAAAIANpk2bprFjx2rMmDHq2rWrZs2apaZN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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "engine": 0 - }, - "output_type": "display_data" - } - ], - "source": [ - "if mpi_rank == 0:\n", - " fig = plt.figure(figsize=(16, 4))\n", - " fig.patch.set_facecolor(\"white\")\n", - " ax_before = fig.add_subplot(131)\n", - " ax_after = fig.add_subplot(132)\n", - " ax_diff = fig.add_subplot(133)\n", - "\n", - " f1 = ax_before.pcolormesh(\n", - " tracer_state[0].data[:, :, 0].T, vmin=-0, vmax=1, cmap=\"viridis\"\n", - " )\n", - " plt.colorbar(f1, ax=ax_before)\n", - " f2 = ax_after.pcolormesh(\n", - " tracer_state[-1].data[:, :, 0].T, vmin=-0, vmax=1, cmap=\"viridis\"\n", - " )\n", - " plt.colorbar(f2, ax=ax_after)\n", - " f3 = ax_diff.pcolormesh(\n", - " (tracer_state[-1].data[:, :, 0] - tracer_state[0].data[:, :, 0]).T,\n", - " vmin=-0.5,\n", - " vmax=0.5,\n", - " cmap=\"bwr\",\n", - " )\n", - " plt.colorbar(f3, ax=ax_diff)\n", - "\n", - " ax_before.set_title(\"tracer concentration at t=0\")\n", - " ax_after.set_title(\"tracer concentration after %s steps\" % nSteps)\n", - " ax_diff.set_title(\"difference after %s steps\" % nSteps)\n", - " plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "79388634", - "metadata": {}, - "source": [ - "For a faster calculation, we can set the number of vertical levels to 1. This will increase computation speed more significantly once we add more time steps, or more points in the x- and y- dimensions. " - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "ced9db5c", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[0:execute]\n", - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)\n", - "Cell \u001b[0;32mIn [17], line 14\u001b[0m\n", - "\u001b[1;32m 10\u001b[0m namelist_dict \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mstore_namelist_variables(\u001b[38;5;28mlocals\u001b[39m())\n", - "\u001b[1;32m 11\u001b[0m dimensions \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mdefine_dimensions(namelist_dict)\n", - "\u001b[0;32m---> 14\u001b[0m domain_configuration \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfigure_domain\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmpi_comm\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msingle_layer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msingle_layer\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 16\u001b[0m initial_state \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mcreate_initial_state_advection(\n", - "\u001b[1;32m 17\u001b[0m domain_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetric_terms\u001b[39m\u001b[38;5;124m\"\u001b[39m], dimensions, tracer_center, test_case\n", - "\u001b[1;32m 18\u001b[0m )\n", - "\u001b[1;32m 20\u001b[0m stencil_configuration \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mconfigure_stencil(domain_configuration, backend\u001b[38;5;241m=\u001b[39mbackend)\n", - "\n", - "File \u001b[0;32m/pace/examples/notebooks/functions.py:269\u001b[0m, in \u001b[0;36mconfigure_domain\u001b[0;34m(mpi_comm, dimensions, single_layer, backend)\u001b[0m\n", - "\u001b[1;32m 256\u001b[0m sizer \u001b[38;5;241m=\u001b[39m SubtileGridSizer\u001b[38;5;241m.\u001b[39mfrom_tile_params(\n", - "\u001b[1;32m 257\u001b[0m nx_tile\u001b[38;5;241m=\u001b[39mdimensions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnx\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[1;32m 258\u001b[0m ny_tile\u001b[38;5;241m=\u001b[39mdimensions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mny\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[0;32m (...)\u001b[0m\n", - "\u001b[1;32m 264\u001b[0m tile_rank\u001b[38;5;241m=\u001b[39mcommunicator\u001b[38;5;241m.\u001b[39mtile\u001b[38;5;241m.\u001b[39mrank,\n", - "\u001b[1;32m 265\u001b[0m )\n", - "\u001b[1;32m 267\u001b[0m quantity_factory \u001b[38;5;241m=\u001b[39m QuantityFactory\u001b[38;5;241m.\u001b[39mfrom_backend(sizer\u001b[38;5;241m=\u001b[39msizer, backend\u001b[38;5;241m=\u001b[39mbackend)\n", - "\u001b[0;32m--> 269\u001b[0m metric_terms \u001b[38;5;241m=\u001b[39m \u001b[43mMetricTerms\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 270\u001b[0m \u001b[43m \u001b[49m\u001b[43mquantity_factory\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquantity_factory\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcommunicator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcommunicator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meta_file\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43meta79.nc\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n", - "\u001b[1;32m 271\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 273\u001b[0m \u001b[38;5;66;03m# workaround for single layer\u001b[39;00m\n", - "\u001b[1;32m 274\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m single_layer:\n", - "\n", - "File \u001b[0;32m/pace/NDSL/ndsl/grid/generation.py:304\u001b[0m, in \u001b[0;36mMetricTerms.__init__\u001b[0;34m(self, quantity_factory, communicator, grid_type, dx_const, dy_const, deglat, extdgrid, eta_file)\u001b[0m\n", - "\u001b[1;32m 297\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_area \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\u001b[1;32m 298\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_area_c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\u001b[1;32m 299\u001b[0m (\n", - "\u001b[1;32m 300\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ks,\n", - "\u001b[1;32m 301\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ptop,\n", - "\u001b[1;32m 302\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ak,\n", - "\u001b[1;32m 303\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bk,\n", - "\u001b[0;32m--> 304\u001b[0m ) \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_set_hybrid_pressure_coefficients\u001b[49m\u001b[43m(\u001b[49m\u001b[43meta_file\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 305\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ec1 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\u001b[1;32m 306\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ec2 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\n", - "File \u001b[0;32m/pace/NDSL/ndsl/grid/generation.py:2172\u001b[0m, in \u001b[0;36mMetricTerms._set_hybrid_pressure_coefficients\u001b[0;34m(self, eta_file)\u001b[0m\n", - "\u001b[1;32m 2162\u001b[0m ak \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mquantity_factory\u001b[38;5;241m.\u001b[39mzeros(\n", - "\u001b[1;32m 2163\u001b[0m [Z_INTERFACE_DIM],\n", - "\u001b[1;32m 2164\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPa\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n", - "\u001b[1;32m 2165\u001b[0m dtype\u001b[38;5;241m=\u001b[39mFloat,\n", - "\u001b[1;32m 2166\u001b[0m )\n", - "\u001b[1;32m 2167\u001b[0m bk \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mquantity_factory\u001b[38;5;241m.\u001b[39mzeros(\n", - "\u001b[1;32m 2168\u001b[0m [Z_INTERFACE_DIM],\n", - "\u001b[1;32m 2169\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n", - "\u001b[1;32m 2170\u001b[0m dtype\u001b[38;5;241m=\u001b[39mFloat,\n", - "\u001b[1;32m 2171\u001b[0m )\n", - "\u001b[0;32m-> 2172\u001b[0m pressure_coefficients \u001b[38;5;241m=\u001b[39m \u001b[43meta\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_hybrid_pressure_coefficients\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 2173\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_npz\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meta_file\u001b[49m\n", - "\u001b[1;32m 2174\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 2175\u001b[0m ks \u001b[38;5;241m=\u001b[39m pressure_coefficients\u001b[38;5;241m.\u001b[39mks\n", - "\u001b[1;32m 2176\u001b[0m ptop \u001b[38;5;241m=\u001b[39m pressure_coefficients\u001b[38;5;241m.\u001b[39mptop\n", - "\n", - "File \u001b[0;32m/pace/NDSL/ndsl/grid/eta.py:60\u001b[0m, in \u001b[0;36mset_hybrid_pressure_coefficients\u001b[0;34m(km, eta_file)\u001b[0m\n", - "\u001b[1;32m 58\u001b[0m \u001b[38;5;66;03m# check size of ak and bk array is km+1\u001b[39;00m\n", - "\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ak\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m!=\u001b[39m km:\n", - "\u001b[0;32m---> 60\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msize of ak array is not equal to km=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkm\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[1;32m 61\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m bk\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m!=\u001b[39m km:\n", - "\u001b[1;32m 62\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msize of bk array is not equal to km=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkm\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", - "\n", - "\u001b[0;31mValueError\u001b[0m: size of ak array is not equal to km=1\n", - "[4:execute]\n", - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)\n", - "Cell \u001b[0;32mIn [17], line 14\u001b[0m\n", - "\u001b[1;32m 10\u001b[0m namelist_dict \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mstore_namelist_variables(\u001b[38;5;28mlocals\u001b[39m())\n", - "\u001b[1;32m 11\u001b[0m dimensions \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mdefine_dimensions(namelist_dict)\n", - "\u001b[0;32m---> 14\u001b[0m domain_configuration \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfigure_domain\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmpi_comm\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msingle_layer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msingle_layer\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 16\u001b[0m initial_state \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mcreate_initial_state_advection(\n", - "\u001b[1;32m 17\u001b[0m domain_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetric_terms\u001b[39m\u001b[38;5;124m\"\u001b[39m], dimensions, tracer_center, test_case\n", - "\u001b[1;32m 18\u001b[0m )\n", - "\u001b[1;32m 20\u001b[0m stencil_configuration \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mconfigure_stencil(domain_configuration, backend\u001b[38;5;241m=\u001b[39mbackend)\n", - "\n", - "File \u001b[0;32m/pace/examples/notebooks/functions.py:269\u001b[0m, in \u001b[0;36mconfigure_domain\u001b[0;34m(mpi_comm, dimensions, single_layer, backend)\u001b[0m\n", - "\u001b[1;32m 256\u001b[0m sizer \u001b[38;5;241m=\u001b[39m SubtileGridSizer\u001b[38;5;241m.\u001b[39mfrom_tile_params(\n", - "\u001b[1;32m 257\u001b[0m nx_tile\u001b[38;5;241m=\u001b[39mdimensions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnx\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[1;32m 258\u001b[0m ny_tile\u001b[38;5;241m=\u001b[39mdimensions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mny\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[0;32m (...)\u001b[0m\n", - "\u001b[1;32m 264\u001b[0m tile_rank\u001b[38;5;241m=\u001b[39mcommunicator\u001b[38;5;241m.\u001b[39mtile\u001b[38;5;241m.\u001b[39mrank,\n", - "\u001b[1;32m 265\u001b[0m )\n", - "\u001b[1;32m 267\u001b[0m quantity_factory \u001b[38;5;241m=\u001b[39m QuantityFactory\u001b[38;5;241m.\u001b[39mfrom_backend(sizer\u001b[38;5;241m=\u001b[39msizer, backend\u001b[38;5;241m=\u001b[39mbackend)\n", - "\u001b[0;32m--> 269\u001b[0m metric_terms \u001b[38;5;241m=\u001b[39m \u001b[43mMetricTerms\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 270\u001b[0m \u001b[43m \u001b[49m\u001b[43mquantity_factory\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquantity_factory\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcommunicator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcommunicator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meta_file\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43meta79.nc\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n", - "\u001b[1;32m 271\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 273\u001b[0m \u001b[38;5;66;03m# workaround for single layer\u001b[39;00m\n", - "\u001b[1;32m 274\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m single_layer:\n", - "\n", - "File \u001b[0;32m/pace/NDSL/ndsl/grid/generation.py:304\u001b[0m, in \u001b[0;36mMetricTerms.__init__\u001b[0;34m(self, quantity_factory, communicator, grid_type, dx_const, dy_const, deglat, extdgrid, eta_file)\u001b[0m\n", - "\u001b[1;32m 297\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_area \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\u001b[1;32m 298\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_area_c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\u001b[1;32m 299\u001b[0m (\n", - "\u001b[1;32m 300\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ks,\n", - "\u001b[1;32m 301\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ptop,\n", - "\u001b[1;32m 302\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ak,\n", - "\u001b[1;32m 303\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bk,\n", - "\u001b[0;32m--> 304\u001b[0m ) \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_set_hybrid_pressure_coefficients\u001b[49m\u001b[43m(\u001b[49m\u001b[43meta_file\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 305\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ec1 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\u001b[1;32m 306\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ec2 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\n", - "File \u001b[0;32m/pace/NDSL/ndsl/grid/generation.py:2172\u001b[0m, in \u001b[0;36mMetricTerms._set_hybrid_pressure_coefficients\u001b[0;34m(self, eta_file)\u001b[0m\n", - "\u001b[1;32m 2162\u001b[0m ak \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mquantity_factory\u001b[38;5;241m.\u001b[39mzeros(\n", - "\u001b[1;32m 2163\u001b[0m [Z_INTERFACE_DIM],\n", - "\u001b[1;32m 2164\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPa\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n", - "\u001b[1;32m 2165\u001b[0m dtype\u001b[38;5;241m=\u001b[39mFloat,\n", - "\u001b[1;32m 2166\u001b[0m )\n", - "\u001b[1;32m 2167\u001b[0m bk \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mquantity_factory\u001b[38;5;241m.\u001b[39mzeros(\n", - "\u001b[1;32m 2168\u001b[0m [Z_INTERFACE_DIM],\n", - "\u001b[1;32m 2169\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n", - "\u001b[1;32m 2170\u001b[0m dtype\u001b[38;5;241m=\u001b[39mFloat,\n", - "\u001b[1;32m 2171\u001b[0m )\n", - "\u001b[0;32m-> 2172\u001b[0m pressure_coefficients \u001b[38;5;241m=\u001b[39m \u001b[43meta\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_hybrid_pressure_coefficients\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 2173\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_npz\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meta_file\u001b[49m\n", - "\u001b[1;32m 2174\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 2175\u001b[0m ks \u001b[38;5;241m=\u001b[39m pressure_coefficients\u001b[38;5;241m.\u001b[39mks\n", - "\u001b[1;32m 2176\u001b[0m ptop \u001b[38;5;241m=\u001b[39m pressure_coefficients\u001b[38;5;241m.\u001b[39mptop\n", - "\n", - "File \u001b[0;32m/pace/NDSL/ndsl/grid/eta.py:60\u001b[0m, in \u001b[0;36mset_hybrid_pressure_coefficients\u001b[0;34m(km, eta_file)\u001b[0m\n", - "\u001b[1;32m 58\u001b[0m \u001b[38;5;66;03m# check size of ak and bk array is km+1\u001b[39;00m\n", - "\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ak\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m!=\u001b[39m km:\n", - "\u001b[0;32m---> 60\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msize of ak array is not equal to km=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkm\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[1;32m 61\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m bk\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m!=\u001b[39m km:\n", - "\u001b[1;32m 62\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msize of bk array is not equal to km=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkm\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", - "\n", - "\u001b[0;31mValueError\u001b[0m: size of ak array is not equal to km=1\n", - "[5:execute]\n", - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)\n", - "Cell \u001b[0;32mIn [17], line 14\u001b[0m\n", - "\u001b[1;32m 10\u001b[0m namelist_dict \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mstore_namelist_variables(\u001b[38;5;28mlocals\u001b[39m())\n", - "\u001b[1;32m 11\u001b[0m dimensions \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mdefine_dimensions(namelist_dict)\n", - "\u001b[0;32m---> 14\u001b[0m domain_configuration \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfigure_domain\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmpi_comm\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msingle_layer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msingle_layer\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 16\u001b[0m initial_state \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mcreate_initial_state_advection(\n", - "\u001b[1;32m 17\u001b[0m domain_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetric_terms\u001b[39m\u001b[38;5;124m\"\u001b[39m], dimensions, tracer_center, test_case\n", - "\u001b[1;32m 18\u001b[0m )\n", - "\u001b[1;32m 20\u001b[0m stencil_configuration \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mconfigure_stencil(domain_configuration, backend\u001b[38;5;241m=\u001b[39mbackend)\n", - "\n", - "File \u001b[0;32m/pace/examples/notebooks/functions.py:269\u001b[0m, in \u001b[0;36mconfigure_domain\u001b[0;34m(mpi_comm, dimensions, single_layer, backend)\u001b[0m\n", - "\u001b[1;32m 256\u001b[0m sizer \u001b[38;5;241m=\u001b[39m SubtileGridSizer\u001b[38;5;241m.\u001b[39mfrom_tile_params(\n", - "\u001b[1;32m 257\u001b[0m nx_tile\u001b[38;5;241m=\u001b[39mdimensions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnx\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[1;32m 258\u001b[0m ny_tile\u001b[38;5;241m=\u001b[39mdimensions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mny\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[0;32m (...)\u001b[0m\n", - "\u001b[1;32m 264\u001b[0m tile_rank\u001b[38;5;241m=\u001b[39mcommunicator\u001b[38;5;241m.\u001b[39mtile\u001b[38;5;241m.\u001b[39mrank,\n", - "\u001b[1;32m 265\u001b[0m )\n", - "\u001b[1;32m 267\u001b[0m quantity_factory \u001b[38;5;241m=\u001b[39m QuantityFactory\u001b[38;5;241m.\u001b[39mfrom_backend(sizer\u001b[38;5;241m=\u001b[39msizer, backend\u001b[38;5;241m=\u001b[39mbackend)\n", - "\u001b[0;32m--> 269\u001b[0m metric_terms \u001b[38;5;241m=\u001b[39m \u001b[43mMetricTerms\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 270\u001b[0m \u001b[43m \u001b[49m\u001b[43mquantity_factory\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquantity_factory\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcommunicator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcommunicator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meta_file\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43meta79.nc\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n", - "\u001b[1;32m 271\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 273\u001b[0m \u001b[38;5;66;03m# workaround for single layer\u001b[39;00m\n", - "\u001b[1;32m 274\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m single_layer:\n", - "\n", - "File \u001b[0;32m/pace/NDSL/ndsl/grid/generation.py:304\u001b[0m, in \u001b[0;36mMetricTerms.__init__\u001b[0;34m(self, quantity_factory, communicator, grid_type, dx_const, dy_const, deglat, extdgrid, eta_file)\u001b[0m\n", - "\u001b[1;32m 297\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_area \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\u001b[1;32m 298\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_area_c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\u001b[1;32m 299\u001b[0m (\n", - "\u001b[1;32m 300\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ks,\n", - "\u001b[1;32m 301\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ptop,\n", - "\u001b[1;32m 302\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ak,\n", - "\u001b[1;32m 303\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bk,\n", - "\u001b[0;32m--> 304\u001b[0m ) \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_set_hybrid_pressure_coefficients\u001b[49m\u001b[43m(\u001b[49m\u001b[43meta_file\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 305\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ec1 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\u001b[1;32m 306\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ec2 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\n", - "File \u001b[0;32m/pace/NDSL/ndsl/grid/generation.py:2172\u001b[0m, in \u001b[0;36mMetricTerms._set_hybrid_pressure_coefficients\u001b[0;34m(self, eta_file)\u001b[0m\n", - "\u001b[1;32m 2162\u001b[0m ak \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mquantity_factory\u001b[38;5;241m.\u001b[39mzeros(\n", - "\u001b[1;32m 2163\u001b[0m [Z_INTERFACE_DIM],\n", - "\u001b[1;32m 2164\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPa\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n", - "\u001b[1;32m 2165\u001b[0m dtype\u001b[38;5;241m=\u001b[39mFloat,\n", - "\u001b[1;32m 2166\u001b[0m )\n", - "\u001b[1;32m 2167\u001b[0m bk \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mquantity_factory\u001b[38;5;241m.\u001b[39mzeros(\n", - "\u001b[1;32m 2168\u001b[0m [Z_INTERFACE_DIM],\n", - "\u001b[1;32m 2169\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n", - "\u001b[1;32m 2170\u001b[0m dtype\u001b[38;5;241m=\u001b[39mFloat,\n", - "\u001b[1;32m 2171\u001b[0m )\n", - "\u001b[0;32m-> 2172\u001b[0m pressure_coefficients \u001b[38;5;241m=\u001b[39m \u001b[43meta\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_hybrid_pressure_coefficients\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 2173\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_npz\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meta_file\u001b[49m\n", - "\u001b[1;32m 2174\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 2175\u001b[0m ks \u001b[38;5;241m=\u001b[39m pressure_coefficients\u001b[38;5;241m.\u001b[39mks\n", - "\u001b[1;32m 2176\u001b[0m ptop \u001b[38;5;241m=\u001b[39m pressure_coefficients\u001b[38;5;241m.\u001b[39mptop\n", - "\n", - "File \u001b[0;32m/pace/NDSL/ndsl/grid/eta.py:60\u001b[0m, in \u001b[0;36mset_hybrid_pressure_coefficients\u001b[0;34m(km, eta_file)\u001b[0m\n", - "\u001b[1;32m 58\u001b[0m \u001b[38;5;66;03m# check size of ak and bk array is km+1\u001b[39;00m\n", - "\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ak\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m!=\u001b[39m km:\n", - "\u001b[0;32m---> 60\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msize of ak array is not equal to km=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkm\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[1;32m 61\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m bk\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m!=\u001b[39m km:\n", - "\u001b[1;32m 62\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msize of bk array is not equal to km=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkm\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", - "\n", - "\u001b[0;31mValueError\u001b[0m: size of ak array is not equal to km=1\n", - "[3:execute]\n", - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)\n", - "Cell \u001b[0;32mIn [17], line 14\u001b[0m\n", - "\u001b[1;32m 10\u001b[0m namelist_dict \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mstore_namelist_variables(\u001b[38;5;28mlocals\u001b[39m())\n", - "\u001b[1;32m 11\u001b[0m dimensions \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mdefine_dimensions(namelist_dict)\n", - "\u001b[0;32m---> 14\u001b[0m domain_configuration \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfigure_domain\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmpi_comm\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msingle_layer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msingle_layer\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 16\u001b[0m initial_state \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mcreate_initial_state_advection(\n", - "\u001b[1;32m 17\u001b[0m domain_configuration[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetric_terms\u001b[39m\u001b[38;5;124m\"\u001b[39m], dimensions, tracer_center, test_case\n", - "\u001b[1;32m 18\u001b[0m )\n", - "\u001b[1;32m 20\u001b[0m stencil_configuration \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39mconfigure_stencil(domain_configuration, backend\u001b[38;5;241m=\u001b[39mbackend)\n", - "\n", - "File \u001b[0;32m/pace/examples/notebooks/functions.py:269\u001b[0m, in \u001b[0;36mconfigure_domain\u001b[0;34m(mpi_comm, dimensions, single_layer, backend)\u001b[0m\n", - "\u001b[1;32m 256\u001b[0m sizer \u001b[38;5;241m=\u001b[39m SubtileGridSizer\u001b[38;5;241m.\u001b[39mfrom_tile_params(\n", - "\u001b[1;32m 257\u001b[0m nx_tile\u001b[38;5;241m=\u001b[39mdimensions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnx\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[1;32m 258\u001b[0m ny_tile\u001b[38;5;241m=\u001b[39mdimensions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mny\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n", - "\u001b[0;32m (...)\u001b[0m\n", - "\u001b[1;32m 264\u001b[0m tile_rank\u001b[38;5;241m=\u001b[39mcommunicator\u001b[38;5;241m.\u001b[39mtile\u001b[38;5;241m.\u001b[39mrank,\n", - "\u001b[1;32m 265\u001b[0m )\n", - "\u001b[1;32m 267\u001b[0m quantity_factory \u001b[38;5;241m=\u001b[39m QuantityFactory\u001b[38;5;241m.\u001b[39mfrom_backend(sizer\u001b[38;5;241m=\u001b[39msizer, backend\u001b[38;5;241m=\u001b[39mbackend)\n", - "\u001b[0;32m--> 269\u001b[0m metric_terms \u001b[38;5;241m=\u001b[39m \u001b[43mMetricTerms\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 270\u001b[0m \u001b[43m \u001b[49m\u001b[43mquantity_factory\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquantity_factory\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcommunicator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcommunicator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meta_file\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43meta79.nc\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n", - "\u001b[1;32m 271\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 273\u001b[0m \u001b[38;5;66;03m# workaround for single layer\u001b[39;00m\n", - "\u001b[1;32m 274\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m single_layer:\n", - "\n", - "File \u001b[0;32m/pace/NDSL/ndsl/grid/generation.py:304\u001b[0m, in \u001b[0;36mMetricTerms.__init__\u001b[0;34m(self, quantity_factory, communicator, grid_type, dx_const, dy_const, deglat, extdgrid, eta_file)\u001b[0m\n", - "\u001b[1;32m 297\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_area \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\u001b[1;32m 298\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_area_c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\u001b[1;32m 299\u001b[0m (\n", - "\u001b[1;32m 300\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ks,\n", - "\u001b[1;32m 301\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ptop,\n", - "\u001b[1;32m 302\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ak,\n", - "\u001b[1;32m 303\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bk,\n", - "\u001b[0;32m--> 304\u001b[0m ) \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_set_hybrid_pressure_coefficients\u001b[49m\u001b[43m(\u001b[49m\u001b[43meta_file\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 305\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ec1 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\u001b[1;32m 306\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_ec2 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\n", - "File \u001b[0;32m/pace/NDSL/ndsl/grid/generation.py:2172\u001b[0m, in \u001b[0;36mMetricTerms._set_hybrid_pressure_coefficients\u001b[0;34m(self, eta_file)\u001b[0m\n", - "\u001b[1;32m 2162\u001b[0m ak \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mquantity_factory\u001b[38;5;241m.\u001b[39mzeros(\n", - "\u001b[1;32m 2163\u001b[0m [Z_INTERFACE_DIM],\n", - "\u001b[1;32m 2164\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPa\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n", - "\u001b[1;32m 2165\u001b[0m dtype\u001b[38;5;241m=\u001b[39mFloat,\n", - "\u001b[1;32m 2166\u001b[0m )\n", - "\u001b[1;32m 2167\u001b[0m bk \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mquantity_factory\u001b[38;5;241m.\u001b[39mzeros(\n", - "\u001b[1;32m 2168\u001b[0m [Z_INTERFACE_DIM],\n", - "\u001b[1;32m 2169\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n", - "\u001b[1;32m 2170\u001b[0m dtype\u001b[38;5;241m=\u001b[39mFloat,\n", - "\u001b[1;32m 2171\u001b[0m )\n", - "\u001b[0;32m-> 2172\u001b[0m pressure_coefficients \u001b[38;5;241m=\u001b[39m \u001b[43meta\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_hybrid_pressure_coefficients\u001b[49m\u001b[43m(\u001b[49m\n", - "\u001b[1;32m 2173\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_npz\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meta_file\u001b[49m\n", - "\u001b[1;32m 2174\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 2175\u001b[0m ks \u001b[38;5;241m=\u001b[39m pressure_coefficients\u001b[38;5;241m.\u001b[39mks\n", - "\u001b[1;32m 2176\u001b[0m ptop \u001b[38;5;241m=\u001b[39m pressure_coefficients\u001b[38;5;241m.\u001b[39mptop\n", - "\n", - "File \u001b[0;32m/pace/NDSL/ndsl/grid/eta.py:60\u001b[0m, in \u001b[0;36mset_hybrid_pressure_coefficients\u001b[0;34m(km, eta_file)\u001b[0m\n", - "\u001b[1;32m 58\u001b[0m \u001b[38;5;66;03m# check size of ak and bk array is km+1\u001b[39;00m\n", - "\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ak\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m!=\u001b[39m km:\n", - "\u001b[0;32m---> 60\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msize of ak array is not equal to km=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkm\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[1;32m 61\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m bk\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m!=\u001b[39m km:\n", - "\u001b[1;32m 62\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msize of bk array is not equal to km=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkm\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", - "\n", - "\u001b[0;31mValueError\u001b[0m: size of ak array is not equal to km=1\n", - "[1:execute] ValueError: size of ak array is not equal to km=1\n", - "[2:execute] ValueError: size of ak array is not equal to km=1\n" - ] - }, - { - "ename": "AlreadyDisplayedError", - "evalue": "6 errors", - "output_type": "error", - "traceback": [ - "6 errors" - ] - } - ], - "source": [ - "mpi_comm = MPI.COMM_WORLD\n", - "mpi_rank = mpi_comm.Get_rank()\n", - "\n", - "nz = 1\n", - "if nz == 1:\n", - " single_layer = True\n", - "else:\n", - " single_layer = False\n", - "\n", - "namelist_dict = func.store_namelist_variables(locals())\n", - "dimensions = func.define_dimensions(namelist_dict)\n", - "\n", - "\n", - "domain_configuration = func.configure_domain(mpi_comm, dimensions, single_layer=single_layer)\n", - "\n", - "initial_state = func.create_initial_state_advection(\n", - " domain_configuration[\"metric_terms\"], dimensions, tracer_center, test_case\n", - ")\n", - "\n", - "stencil_configuration = func.configure_stencil(domain_configuration, backend=backend)\n", - "stencil_configuration[\"quantity_factory\"] = domain_configuration[\"quantity_factory\"]\n", - "\n", - "tracer_advection_data, tracer_advection = func.prepare_everything_for_advection(\n", - " stencil_configuration, initial_state, dimensions, timestep\n", - ")\n", - "\n", - "tracer_advection_data_initial = cp.deepcopy(tracer_advection_data)\n", - "\n", - "tracer_state = [cp.deepcopy(tracer_advection_data_initial[\"tracers\"][\"tracer\"])]\n", - "\n", - "nSteps = 10\n", - "for step in range(nSteps):\n", - " tracer_advection_data = func.run_advection_step_with_reset(\n", - " tracer_advection_data_initial, tracer_advection_data, tracer_advection\n", - " )\n", - "\n", - " tracer_state.append(cp.deepcopy(tracer_advection_data[\"tracers\"][\"tracer\"]))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "783a781e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[output:0]" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABQsAAAF2CAYAAADJMM7PAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABqNUlEQVR4nO3deXxU1f3/8fckkAlbEmNIQjDsKiBbDZIvKIKaEpCi1A3UryBVqErcqK1alUXUuCJWEapVaKlURAu2yheKKLhFEYSfWgGRsikkbE0CARLInN8fmAlDFmbuzNxMbl7Px+M+NHfOvffcGTLvzGfOPddljDECAAAAAAAA0OBF1XUHAAAAAAAAAEQGioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioUAAAAAAAAAJFEsBAAAAAAAAPATioVAmAwcOFADBw6s624AAByiPuRKQUGBrrrqKp1++ulyuVyaPn16XXcJAGo0efJkuVwun3Xt2rXTjTfe6LNu06ZNGjRokOLj4+VyubRo0SJJ0hdffKF+/fqpWbNmcrlcWrdunT0dr+dqej4BRA6KhTX49NNPNXnyZBUWFtZ1VxCkF198UXPmzAnLvr/99ltNnjxZW7duDcv+w2nnzp2aPHmy33/UhOt34h//+IfOPfdcxcbGqk2bNpo0aZKOHTsW0mMAkYBccQ5ypWZ33323li5dqvvvv19z587V4MGDtXjxYk2ePNnWfmzcuFF33323+vXrp9jYWLlcrlqf03BmUV2cP4DQGj16tL7++ms9+uijmjt3rnr37q2jR4/q6quv1v79+/Xss89q7ty5atu2bV13tV6o7vmcN2+e7V8wrVq1SrfddpsyMjLUuHHjKoXjk73yyivq0qWLYmNjdeaZZ+r5558PWV/q4vyBWhlU66mnnjKSzJYtW+q6KwjSOeecYwYMGBCWfS9YsMBIMh988EGVx0pLS01paWlYjhsKX3zxhZFkZs+e7Vf7cPxOLF682LhcLnPRRReZl156ydx+++0mKirK3HLLLSE7BhApyBXnIFdqlpKSYq6//nqfdePHjzd2/8k5e/ZsExUVZbp162Z69epV6+9euLOoLs4fgH8mTZpU5ffzyJEjpqyszPvzoUOHjCTzwAMP+LRbv369kWRefvllW/rqFDU9n0OHDjVt27a1tS+TJk0yjRs3NhkZGeass86q9b161qxZRpK58sorzUsvvWRuuOEGI8k8/vjjIelLXZw/UJtG9pcnncfj8aisrEyxsbF13RWvkpISNWvWrK67Ue+E8nmLiYkJyX6c7J577lGPHj30r3/9S40aHX87iouL02OPPaY777xTnTt3ruMeAnWDXHGOhpYru3fvVkJCQtiPY4zRkSNH1KRJk2ofv+yyy1RYWKgWLVro6aefrnUUPVkE4ERut9vn5z179khSlfe23bt3V7s+GA0ha2t6PsPhVH9P3Xrrrbr33nvVpEkT5eTk6Lvvvqu23eHDh/XAAw9o6NChevPNNyVJY8eOlcfj0dSpUzVu3DiddtppYTsPoE7UdbUyElV8w3TyUvGNtCQzfvx489e//tV07drVNGrUyCxcuNAYc3zkSN++fU1iYqKJjY015557rlmwYEG1x5k7d64577zzTJMmTUxCQoLp37+/Wbp0qU+bxYsXmwsuuMA0bdrUNG/e3Fx66aXmm2++8WkzevRo06xZM/P999+bIUOGmObNm5vLL7+81nP84YcfzK9+9SvTqlUrExMTY9q1a2duueUWnxELmzdvNldddZU57bTTTJMmTUxmZqZ55513fPbzwQcfGElm/vz55pFHHjGtW7c2brfbXHzxxWbTpk1VjvvZZ5+ZIUOGmISEBNO0aVPTvXt3M336dJ8269evN1deeaU57bTTjNvtNhkZGebtt9/2aTN79mwjyXz88cfm7rvvNklJSaZp06Zm+PDhZvfu3d52bdu2rfI6VowGqdjHihUrzK233mpatmxpEhISjDHGbN261dx6663mrLPOMrGxsSYxMdFcddVVPqMSKrY/eakYDTJgwIAqI08KCgrMr371K5OcnGzcbrfp0aOHmTNnjk+bLVu2GEnmqaeeMn/84x9Nhw4dTExMjOndu7dZtWpVzS/qT/bt22d+85vfmG7duplmzZqZFi1amMGDB5t169ZVed1OXmoaZXiq3wkr/v3vfxtJZsaMGT7rf/zxRyPJTJ061fK+gUhDrhxHrjg3V2rq++jRo6tdX6G8vNw8++yzpmvXrsbtdpvk5GQzbtw4s3//fp8+tG3b1gwdOtQsWbLEZGRkGLfbbZ599tlT9t2Y2kf1BptFZWVlZvLkyaZTp07G7XabxMREc/7555t//etfxhgT8vNfunSp6dmzp3G73aZLly7mrbfeCqg/QEP20Ucfmd69exu32206dOhgZs2aVe3IwrZt25rRo0cbY6rP74rHa8oCYwLLneoyw5jA8vqHH34wl19+uWnWrJlJSkoyv/nNb8yxY8d82paXl5vp06ebbt26GbfbbZKSkkx2drb54osvfNrNnTvXnHvuuSY2NtacdtppZsSIEWb79u2nfH79ybmans8BAwZUu77CkSNHzMSJE03Hjh1NTEyMOeOMM8xvf/tbc+TIEZ8+1Pb31KnUNgr83XffNZLMu+++67P+008/NZLM3Llza913cXGxufPOO03btm1NTEyMadmypcnKyjJr1qwxxpiwnP9ZZ51l3G63Offcc83KlSsD6g9gDCMLq3XFFVfou+++09/+9jc9++yzSkpKkiS1bNnS2+b999/XG2+8oZycHCUlJaldu3aSpOeee06XXXaZrr/+epWVlen111/X1VdfrXfeeUdDhw71bj9lyhRNnjxZ/fr108MPP6yYmBh9/vnnev/99zVo0CBJ0ty5czV69GhlZ2friSee0KFDhzRz5kxdcMEFWrt2rfeYknTs2DFlZ2frggsu0NNPP62mTZvWeH47d+5Unz59VFhYqHHjxqlz58768ccf9eabb+rQoUOKiYlRQUGB+vXrp0OHDumOO+7Q6aefrj//+c+67LLL9Oabb+qXv/ylzz4ff/xxRUVF6Z577lFRUZGefPJJXX/99fr888+9bZYtW6Zf/OIXatWqle68806lpqZq/fr1euedd3TnnXdKkv7973/r/PPPV+vWrXXfffepWbNmeuONNzR8+HC99dZbVY57++2367TTTtOkSZO0detWTZ8+XTk5OZo/f74kafr06br99tvVvHlzPfDAA5KklJQUn33cdtttatmypSZOnKiSkhJJxycr/vTTTzVy5EidccYZ2rp1q2bOnKmBAwfq22+/VdOmTXXhhRfqjjvu0B/+8Af9/ve/V5cuXSTJ+9+THT58WAMHDtT333+vnJwctW/fXgsWLNCNN96owsJC73NQYd68eTpw4IB+/etfy+Vy6cknn9QVV1yh//znP2rcuHGNr+9//vMfLVq0SFdffbXat2+vgoIC/fGPf9SAAQP07bffKi0tTV26dNHDDz+siRMnaty4cerfv78kqV+/ftXu81S/E0VFRTp69GiNfaoQGxur5s2bS5LWrl0rSerdu7dPm7S0NJ1xxhnexwEnIFfIFafnyoUXXqi5c+fqhhtu0M9//nONGjVKktSxY0ft3LlTy5Yt09y5c6vs+9e//rXmzJmjMWPG6I477tCWLVv0wgsvaO3atfrkk098+rVx40Zde+21+vWvf62xY8fq7LPPrrHP/go2iyZPnqzc3FzdfPPN6tOnj4qLi7V69Wp9+eWX+vnPf65f//rXITv/TZs2acSIEbrllls0evRozZ49W1dffbWWLFmin//85371B2iovv76aw0aNEgtW7bU5MmTdezYMU2aNKnK+/fJrrjiCiUkJOjuu+/Wtddeq0svvVTNmzdXSkqKWrdurccee0x33HGHzjvvPO++As2d6jIjkLwuLy9Xdna2MjMz9fTTT+u9997TM888o44dO+rWW2/1trvppps0Z84cDRkyRDfffLOOHTumjz76SJ999pn3PfDRRx/VQw89pGuuuUY333yz9uzZo+eff14XXnih1q5dW+toQH9yrqbns1mzZioqKtIPP/ygZ599VpK8nxk8Ho8uu+wyffzxxxo3bpy6dOmir7/+Ws8++6y+++67KjdHqenvqWDUlBUZGRmKiorS2rVr9b//+781bn/LLbfozTffVE5Ojrp27ap9+/bp448/1vr163XuuefqgQceCNn5r1y5UvPnz9cdd9wht9utF198UYMHD9aqVavUrVs3v/oDSGJkYU1q+xZakomKijL//ve/qzx26NAhn5/LyspMt27dzMUXX+xdt2nTJhMVFWV++ctfmvLycp/2Ho/HGGPMgQMHTEJCghk7dqzP4/n5+SY+Pt5nfcU3W/fdd59f5zZq1CgTFRVV5VukE49/1113GUnmo48+8j524MAB0759e9OuXTtvvytGgHTp0sVn9Mhzzz1nJJmvv/7aGGPMsWPHTPv27U3btm3Nf//732qPaYwxl1xyienevbvPtyQej8f069fPnHnmmd51Fd/EZWVl+Wx/9913m+joaFNYWOhdV9PcUhX7uOCCC6p883by62iMMXl5eUaS+ctf/uJdV9vcUiePAJk+fbqRZP76179615WVlZm+ffua5s2bm+LiYmNM5QiQ008/3Wdkwdtvv20kmX/+859VjnWiI0eOVPl3tWXLFuN2u83DDz/sXRfKOQur+zasuqXiW9oT91fdN5XnnXee+Z//+R+/+gXUF+QKuXIyp+WKMZWjGk5U02iNjz76yEgyr732ms/6JUuWVFlfMaJzyZIltfa1OrX97gWbRT179jRDhw6ttU0oz//EkYRFRUWmVatW5mc/+1lA/QEaouHDh5vY2Fizbds277pvv/3WREdH1zqy0Bjf0dknqsirk0f7B5o7J2eGlbw++b34Zz/7mcnIyPD+/P777xtJ5o477qjy3FRk3tatW010dLR59NFHfR7/+uuvTaNGjaqsP5m/OVfT81nTnH1z5841UVFRPn8/GFM5h+Ann3ziXVfb31OnUtvIwvHjx5vo6OhqH2vZsqUZOXJkrfuOj4+vko0nC9X5SzKrV6/2rtu2bZuJjY01v/zlLwPqD8DdkC0aMGCAunbtWmX9iXPn/Pe//1VRUZH69++vL7/80rt+0aJF8ng8mjhxoqKifF+CijswLVu2TIWFhbr22mu1d+9e7xIdHa3MzEx98MEHVY594jdHNfF4PFq0aJGGDRtW5ZuRE4+/ePFi9enTRxdccIH3sebNm2vcuHHaunWrvv32W5/txowZ4zOXUsVItf/85z+Sjn8bs2XLFt11111VvpGqOOb+/fv1/vvv65prrtGBAwe857xv3z5lZ2dr06ZN+vHHH322HTdunM9dq/r376/y8nJt27btlM9FhbFjxyo6Otpn3Ymv49GjR7Vv3z516tRJCQkJPq9lIBYvXqzU1FRde+213nWNGzfWHXfcoYMHD2rlypU+7UeMGOEz98XJz2lN3G63999VeXm59u3bp+bNm+vss8+23PdTeeaZZ7Rs2bJTLr/73e+82xw+fNjb35PFxsZ6HwcaCnKFXAlUfc+VBQsWKD4+Xj//+c99/k1mZGSoefPmVf5Ntm/fXtnZ2ZaPV51gsyghIUH//ve/tWnTpoCPHej5p6Wl+YxIiouL06hRo7R27Vrl5+cH3R/AqcrLy7V06VINHz5cbdq08a7v0qVLyN9TrOTOyZlhJa9vueUWn5/79+/v897+1ltvyeVyadKkSVW2rci8v//97/J4PLrmmmt8jpuamqozzzyz2uOeKBw5Jx1/r+zSpYs6d+7s06+LL75Ykqr0q6a/p4Jx+PDhGucN9jcrPv/8c+3cuTPgYwd6/n379lVGRob35zZt2ujyyy/X0qVLVV5eHnR/0HBwGbJF7du3r3b9O++8o0ceeUTr1q1TaWmpd/2JHzw2b96sqKioWt/EKv7Iq3gTOFlcXJzPz40aNdIZZ5xxyn7v2bNHxcXF3iHINdm2bZsyMzOrrK+4FGrbtm0++zgxeCV5P4z897//lXT8nCXVetzvv/9exhg99NBDeuihh6pts3v3brVu3drv4/qjutfy8OHDys3N1ezZs/Xjjz/KGON9rKioyO99n2jbtm0688wzq3yQP/E5PZHVc/N4PHruuef04osvasuWLd5QkKTTTz/dUt9P5cRA8lfFHxQn/p5UqG3SesCpyBVyJVD1PVc2bdqkoqIiJScnV/t4xc0DKtT0OxKMYLPo4Ycf1uWXX66zzjpL3bp10+DBg3XDDTeoR48epzx2oOffqVMnn997STrrrLMkSVu3blVqampQ/QGcas+ePTp8+LDOPPPMKo+dffbZWrx4cciOZSV3Tn5vCzSvY2NjfaY1kY6/v5/43r5582alpaUpMTGxxr5v2rRJxphqnydJtU5XIYUn5yr6tX79+irnWMGurCgrK6v2MX+y4sknn9To0aOVnp6ujIwMXXrppRo1apQ6dOhwymMHev7VvX5nnXWWDh06pD179ig1NTWo/qDhoFhoUXVvCB999JEuu+wyXXjhhXrxxRfVqlUrNW7cWLNnz9a8efMC2r/H45F0fL6K1NTUKo9X3K2vwonf+teFk0dQVDgxJE6l4pzvueeeGr/l69SpU8iPW91refvtt2v27Nm666671LdvX8XHx8vlcmnkyJHefoab1XN77LHH9NBDD+lXv/qVpk6dqsTEREVFRemuu+4KW9/3799fY4CeqEmTJoqPj5cktWrVSpK0a9cupaen+7TbtWuX+vTpE/qOAhGMXPFFroRepOWKx+NRcnKyXnvttWofP/mDUTi+RAo2iy688EJt3rxZb7/9tv71r3/pT3/6k5599lnNmjVLN998c63bBnr+/gimPwCCZyV3Tn5vCzSva3pvD5TH45HL5dL//d//VbvPijn0ahKunPN4POrevbumTZtW7eMnv3eHKyvKy8u1e/duny94ysrKtG/fPqWlpdW6/TXXXKP+/ftr4cKF+te//qWnnnpKTzzxhP7+979ryJAhtW4b6Pn7I5j+oOGgWFiDk7+59cdbb72l2NhYLV261OdyltmzZ/u069ixozwej7799lv16tWr2n117NhRkpScnKysrKyA+1KTli1bKi4uTt98802t7dq2bauNGzdWWb9hwwbv44GoOJ9vvvmmxvOp+CajcePGIT1nK6/lm2++qdGjR+uZZ57xrjty5IgKCwst77tt27b66quv5PF4fD6AW31Oa/Lmm2/qoosu0iuvvOKzvrCw0HtTBSnw56W29ldccUWVy92qM3r0aM2ZM0eSvP/2V69e7fNhbOfOnfrhhx80bty4gPoHRDpyhVxxeq7UpKZz6tixo9577z2df/75dTaaPBRZlJiYqDFjxmjMmDE6ePCgLrzwQk2ePNlbnAvV+VeMWDpxf999950k+Uzgf6r+AA1Ny5Yt1aRJk2ovz68ul4IRitwJR1537NhRS5cu1f79+2scXdixY0cZY9S+fXvvqOVA+JtzNantvfL//b//p0suucRS/obCiVlx6aWXetevXr1aHo+nxr+9TtSqVSvddtttuu2227R7926de+65evTRR73FuVCdf3X/zr/77js1bdrU50uoU/UHYM7CGjRr1kyS/H5zk45/q+NyuXwuz9m6dWuVOxQNHz5cUVFRevjhh6t8y1Lx7X52drbi4uL02GOPVXuX2T179vjdrxNFRUVp+PDh+uc//6nVq1dXebzi+JdeeqlWrVqlvLw872MlJSV66aWX1K5du4DngTj33HPVvn17TZ8+vcpzWnHM5ORkDRw4UH/84x+1a9euKvuwes7NmjUL6HWUjr+WJ4+0eP75531e24p9S/79O7n00kuVn5/vvaOmdPxuo88//7yaN2+uAQMGBNTHmlTX9wULFlSZHyXQf+O1tbcyZ+E555yjzp0766WXXvJ5XmfOnCmXy6WrrrrKr34B9QW5Qq44PVdqUtM5XXPNNSovL9fUqVOrbHPs2LGAn2Mrgs2iffv2+fzcvHlzderUyeey5lCd/86dO7Vw4ULvz8XFxfrLX/6iXr16eUcf+dMfoKGJjo5Wdna2Fi1apO3bt3vXr1+/XkuXLg3psUKRO+HI6yuvvFLGGE2ZMqXKYxXv71dccYWio6M1ZcqUKu/5xpgq7y8n8zfnalJxR+STXXPNNfrxxx/18ssvV3ns8OHD3jtIh9PFF1+sxMREzZw502f9zJkz1bRpUw0dOrTGbcvLy6ucV3JystLS0qpkRSjOPy8vz2eOyB07dujtt9/WoEGDFB0d7Xd/AEYW1qBiDrYHHnhAI0eOVOPGjTVs2DDvH3zVGTp0qKZNm6bBgwfruuuu0+7duzVjxgx16tRJX331lbddp06d9MADD2jq1Knq37+/rrjiCrndbn3xxRdKS0tTbm6u4uLiNHPmTN1www0699xzNXLkSLVs2VLbt2/Xu+++q/PPP18vvPCCpXN77LHH9K9//UsDBgzw3n59165dWrBggT7++GMlJCTovvvu09/+9jcNGTJEd9xxhxITE/XnP/9ZW7Zs0VtvvRXwpWlRUVGaOXOmhg0bpl69emnMmDFq1aqVNmzYoH//+9/eoJ4xY4YuuOACde/eXWPHjlWHDh1UUFCgvLw8/fDDD/p//+//BXy+GRkZmjlzph555BF16tRJycnJNc4BUuEXv/iF5s6dq/j4eHXt2lV5eXl67733qszN1KtXL0VHR+uJJ55QUVGR3G63Lr744mrnHxo3bpz++Mc/6sYbb9SaNWvUrl07vfnmm/rkk080ffp0tWjRIuBzq6nvDz/8sMaMGaN+/frp66+/1muvvVZlDoqOHTsqISFBs2bNUosWLdSsWTNlZmbWOM9Hbb8TVuYslKSnnnpKl112mQYNGqSRI0fqm2++0QsvvKCbb77ZO+cW4BTkCrni9FypScW//TvuuEPZ2dmKjo7WyJEjNWDAAP36179Wbm6u1q1bp0GDBqlx48batGmTFixYoOeee87yF0dFRUV6/vnnJUmffPKJJOmFF15QQkKCEhISlJOT420bTBZ17dpVAwcOVEZGhhITE7V69Wq9+eabPvsP1fmfddZZuummm/TFF18oJSVFr776qgoKCnxGGvvTH6AhmjJlipYsWaL+/fvrtttu836xcs455/jkaSgEmzvhyOuLLrpIN9xwg/7whz9o06ZNGjx4sDwejz766CNddNFFysnJUceOHfXII4/o/vvv19atWzV8+HC1aNFCW7Zs0cKFCzVu3Djdc889NR7D35yrSUZGhubPn68JEybovPPOU/PmzTVs2DDdcMMNeuONN3TLLbfogw8+0Pnnn6/y8nJt2LBBb7zxhpYuXVrtDdb8sW3bNs2dO1eSvF94PvLII5KOj86/4YYbJB2/tHnq1KkaP368rr76amVnZ+ujjz7SX//6Vz366KO1zgV54MABnXHGGbrqqqvUs2dPNW/eXO+9956++OILn1GYoTr/bt26KTs7W3fccYfcbrdefPFFSfIWiv3tD1D9vcFh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586duuKKK0LecQCobzxyyWMsLFyyFTbkGgBYZynXyLSwIdMAIEguV+CFQpczcy2gy5CXLFni8/OcOXOUnJysNWvW6MILL1RRUZFeeeUVzZs3TxdffLEkafbs2erSpYs+++wz/c///E/oeg4A9YyxOGeh4YNV2JBrAGCdlVwj08KHTAOAIHEZsldQZ1VUVCRJSkxMlCStWbNGR48eVVZWlrdN586d1aZNG+Xl5VW7j9LSUhUXF/ssAADUBXINAOAUocg0iVwDgIbIcrHQ4/Horrvu0vnnn69u3bpJkvLz8xUTE6OEhASftikpKcrPz692P7m5uYqPj/cu6enpVrsEABHN0iXIPy0IP3INAAJDpkWuUGWaRK4BaECYs9DL8lmNHz9e33zzjV5//fWgOnD//ferqKjIu+zYsSOo/QFApOIGJ5GNXAOAwJBpkStUmSaRawAaEIqFXgHNWVghJydH77zzjj788EOdccYZ3vWpqakqKytTYWGhzzdWBQUFSk1NrXZfbrdbbrfbSjcAoF6xOqKCURjhR64BQOCs5BqZFn6hzDSJXAPQgDBnoVdAZ2WMUU5OjhYuXKj3339f7du393k8IyNDjRs31vLly73rNm7cqO3bt6tv376h6TEA1FOenyaCt7IgPMg1ALCOTIssZBoABImRhV4BjSwcP3685s2bp7ffflstWrTwzm0RHx+vJk2aKD4+XjfddJMmTJigxMRExcXF6fbbb1ffvn25uxaABo+RhZGHXAMA6xhZGFnINAAIEiMLvQIqFs6cOVOSNHDgQJ/1s2fP1o033ihJevbZZxUVFaUrr7xSpaWlys7O1osvvhiSzgIAEErkGgDAKcg0AECoBFQsNMacsk1sbKxmzJihGTNmWO4UADgRIwsjD7kGANYxsjCykGkAECRGFnpZusEJACBwFAsBAE5CsRAA4CgUC72ceVYAEIEqPlRZWQAAiDRkGgDAUVyuwG9u4rKWazNmzFC7du0UGxurzMxMrVq1qsa2L7/8svr376/TTjtNp512mrKysmptHwoUCwHAJkbW7hx56ouKAACwn5VcI9MAABHLprshz58/XxMmTNCkSZP05ZdfqmfPnsrOztbu3burbb9ixQpde+21+uCDD5SXl6f09HQNGjRIP/74Y7BnXCOKhQAAAAAAAIANpk2bprFjx2rMmDHq2rWrZs2apaZN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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "engine": 0 - }, - "output_type": "display_data" - } - ], - "source": [ - "if mpi_rank == 0:\n", - " fig = plt.figure(figsize=(16, 4))\n", - " fig.patch.set_facecolor(\"white\")\n", - " ax_before = fig.add_subplot(131)\n", - " ax_after = fig.add_subplot(132)\n", - " ax_diff = fig.add_subplot(133)\n", - "\n", - " f1 = ax_before.pcolormesh(\n", - " tracer_state[0].data[:, :, 0].T, vmin=-0, vmax=1, cmap=\"viridis\"\n", - " )\n", - " plt.colorbar(f1, ax=ax_before)\n", - " f2 = ax_after.pcolormesh(\n", - " tracer_state[-1].data[:, :, 0].T, vmin=-0, vmax=1, cmap=\"viridis\"\n", - " )\n", - " plt.colorbar(f2, ax=ax_after)\n", - " f3 = ax_diff.pcolormesh(\n", - " (tracer_state[-1].data[:, :, 0] - tracer_state[0].data[:, :, 0]).T,\n", - " vmin=-0.5,\n", - " vmax=0.5,\n", - " cmap=\"bwr\",\n", - " )\n", - " plt.colorbar(f3, ax=ax_diff)\n", - "\n", - " ax_before.set_title(\"tracer concentration at t=0\")\n", - " ax_after.set_title(\"tracer concentration after %s steps\" % nSteps)\n", - " ax_diff.set_title(\"difference after %s steps\" % nSteps)\n", - " plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6b0cc550-95f0-4b79-9916-6d5859cb8420", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.13" - }, - "vscode": { - "interpreter": { - "hash": "5aaa1d64d2aec5fc9d71d95fe114c55e361597d915cf108c460e747a228aecec" - } - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/pace/diagnostics.py b/pace/diagnostics.py index 6afdc7685..5a4b9d541 100644 --- a/pace/diagnostics.py +++ b/pace/diagnostics.py @@ -7,7 +7,7 @@ import numpy as np from ndsl import Quantity -from ndsl.constants import RGRAV, Z_DIM, Z_INTERFACE_DIM +from ndsl.constants import K_DIM, K_INTERFACE_DIM, RGRAV from ndsl.dsl.dace.orchestration import dace_inhibitor from ndsl.dsl.typing import Float from ndsl.grid import GridData @@ -46,7 +46,7 @@ def select_data(self, state: DycoreState): if name not in state.__dict__.keys(): raise ValueError(f"Invalid state variable {name} for level select") assert len(getattr(state, name).dims) > 2 - if getattr(state, name).dims[2] != (Z_DIM or Z_INTERFACE_DIM): + if getattr(state, name).dims[2] != (K_DIM or K_INTERFACE_DIM): raise ValueError( f"z_select only works for state variables with dimension (x, y, z). \ \n {name} has dimension {getattr(state, name).dims}" @@ -95,13 +95,11 @@ def __post_init__(self): ) if self.output_format not in ["zarr", "netcdf"]: raise ValueError( - "output_format must be one of 'zarr' or 'netcdf', " - f"got {self.output_format}" + f"output_format must be one of 'zarr' or 'netcdf', got {self.output_format}" ) if self.precision not in ["Float", "float32", "float64"]: raise ValueError( - "precision must be one of 'Float', 'float32', or 'float64" - f"got {self.precision}" + f"precision must be one of 'Float', 'float32', or 'float64got {self.precision}" ) def diagnostics_factory(self, communicator: Communicator) -> Diagnostics: @@ -140,8 +138,7 @@ def diagnostics_factory(self, communicator: Communicator) -> Diagnostics: ) else: raise ValueError( - "output_format must be one of 'zarr' or 'netcdf', " - f"got {self.output_format}" + f"output_format must be one of 'zarr' or 'netcdf', got {self.output_format}" ) return MonitorDiagnostics( @@ -251,7 +248,7 @@ def _compute_column_integral(name: str, q_in: Quantity, delp: Quantity) -> Quant if len(q_in.dims) <= 2: raise RuntimeError("This function assumes that q_in is at least 3-dimensional.") - if q_in.dims[2] != Z_DIM: + if q_in.dims[2] != K_DIM: raise RuntimeError( "This function assumes the z-dimension is the third dimension" ) diff --git a/pace/grid.py b/pace/grid.py index 2e6813343..5419f99fa 100644 --- a/pace/grid.py +++ b/pace/grid.py @@ -8,7 +8,8 @@ from ndsl import QuantityFactory, ndsl_log from ndsl.comm.partitioner import get_tile_index -from ndsl.constants import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM +from ndsl.config import Backend +from ndsl.constants import I_DIM, I_INTERFACE_DIM, J_DIM, J_INTERFACE_DIM from ndsl.grid import ( AngleGridData, ContravariantGridData, @@ -168,7 +169,7 @@ def _serializer(self, communicator: Communicator): def _get_serialized_grid( self, communicator: Communicator, - backend: str, + backend: Backend, ) -> grid.Grid: # type: ignore ser = self._serializer(communicator) grid = TranslateGrid.new_from_serialized_data( @@ -256,7 +257,7 @@ def get_grid( subtile_slice_grid = communicator.partitioner.tile.subtile_slice( rank=communicator.rank, - global_dims=[X_INTERFACE_DIM, Y_INTERFACE_DIM], + global_dims=[I_INTERFACE_DIM, J_INTERFACE_DIM], global_extent=(npx, npy), overlap=True, ) diff --git a/pace/initialization.py b/pace/initialization.py index f4eff6224..eaab682da 100644 --- a/pace/initialization.py +++ b/pace/initialization.py @@ -15,7 +15,8 @@ StencilConfig, StencilFactory, ) -from ndsl.constants import X_DIM, Y_DIM +from ndsl.config import Backend +from ndsl.constants import I_DIM, J_DIM from ndsl.grid import DampingCoefficients, DriverGridData, GridData from ndsl.stencils.testing import TranslateGrid, grid from ndsl.typing import Communicator @@ -259,7 +260,7 @@ def _grid_params(self) -> dict: def _get_serialized_grid( self, communicator: Communicator, - backend: str, + backend: Backend, ) -> grid.Grid: # type: ignore ser = self._serializer(communicator) grid = TranslateGrid.new_from_serialized_data( @@ -307,7 +308,7 @@ def get_driver_state( def _initialize_dycore_state( self, communicator: Communicator, - backend: str, + backend: Backend, ) -> DycoreState: grid = self._get_serialized_grid(communicator=communicator, backend=backend) diff --git a/pace/state.py b/pace/state.py index 45c205600..ff36e9dc4 100644 --- a/pace/state.py +++ b/pace/state.py @@ -6,7 +6,7 @@ import ndsl.dsl.gt4py_utils as gt_utils from ndsl import Quantity, QuantityFactory, SubtileGridSizer -from ndsl.constants import N_HALO_DEFAULT, X_DIM, Y_DIM, Z_DIM +from ndsl.constants import I_DIM, J_DIM, K_DIM, N_HALO_DEFAULT from ndsl.dsl.typing import Float from ndsl.grid import DampingCoefficients, DriverGridData, GridData from ndsl.typing import Communicator @@ -24,7 +24,7 @@ class TendencyState: u_dt: Quantity = dataclasses.field( metadata={ "name": "eastward_wind_tendency_due_to_physics", - "dims": [X_DIM, Y_DIM, Z_DIM], + "dims": [I_DIM, J_DIM, K_DIM], "units": "m/s**2", "intent": "inout", } @@ -32,7 +32,7 @@ class TendencyState: v_dt: Quantity = dataclasses.field( metadata={ "name": "northward_wind_tendency_due_to_physics", - "dims": [X_DIM, Y_DIM, Z_DIM], + "dims": [I_DIM, J_DIM, K_DIM], "units": "m/s**2", "intent": "inout", } @@ -40,7 +40,7 @@ class TendencyState: pt_dt: Quantity = dataclasses.field( metadata={ "name": "temperature_tendency_due_to_physics", - "dims": [X_DIM, Y_DIM, Z_DIM], + "dims": [I_DIM, J_DIM, K_DIM], "units": "K/s", "intent": "inout", } diff --git a/pyFV3 b/pyFV3 index 64ddc3a6c..731933a1b 160000 --- a/pyFV3 +++ b/pyFV3 @@ -1 +1 @@ -Subproject commit 64ddc3a6c12d216ce46393c414754d4651ccebda +Subproject commit 731933a1b971392e58a574c6d34c7d893888899b diff --git a/pySHiELD b/pySHiELD index 66df9db17..80558ac38 160000 --- a/pySHiELD +++ b/pySHiELD @@ -1 +1 @@ -Subproject commit 66df9db174aef33a2702961299c890fc75e347dc +Subproject commit 80558ac38417e313aab1e241b5a0e0eb66f1b135 diff --git a/pyproject.toml b/pyproject.toml index 7711fece2..fc4d0617d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,14 +9,15 @@ classifiers = [ "Intended Audience :: Developers", "Natural Language :: English", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.11" + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12" ] dynamic = ["dependencies"] license = "Apache-2.0" license-files = ["LICENSE.md"] name = "pace" readme = "README.md" -requires-python = ">=3.11,<3.12" +requires-python = ">=3.11,<3.13" version = "0.2.0" [project.optional-dependencies] @@ -77,10 +78,7 @@ warn_unreachable = true ignore_errors = true module = [ # We currently can't type stencils - "pyshield.stencils.*", - # Will be fixed with NDSL version 2026.01.00, see - # https://github.com/NOAA-GFDL/NDSL/pull/360 - "pyfv3.testing.translate_fvdynamics" + "pyshield.stencils.*" ] [tool.setuptools] diff --git a/tests/main/conftest.py b/tests/main/conftest.py index 4680742f1..f3e91b54c 100644 --- a/tests/main/conftest.py +++ b/tests/main/conftest.py @@ -8,4 +8,4 @@ def backend(pytestconfig): def pytest_addoption(parser): - parser.addoption("--backend", action="store", default="numpy") + parser.addoption("--backend", action="store", default="st:numpy:cpu:IJK") diff --git a/tests/main/driver/test_diagnostics_config.py b/tests/main/driver/test_diagnostics_config.py index 55e43cc2a..1f1ead4bf 100644 --- a/tests/main/driver/test_diagnostics_config.py +++ b/tests/main/driver/test_diagnostics_config.py @@ -3,7 +3,8 @@ import pytest from ndsl import QuantityFactory, SubtileGridSizer -from ndsl.constants import X_DIM, Y_DIM, Z_DIM +from ndsl.config import Backend +from ndsl.constants import I_DIM, J_DIM, K_DIM from pace import DiagnosticsConfig from pace.diagnostics import MonitorDiagnostics, NullDiagnostics, ZSelect from pyfv3 import DycoreState @@ -43,7 +44,7 @@ def test_zselect_raises_error_if_not_3d(tmpdir): z_select=[ZSelect(level=0, names=["phis"])], ) result = config.diagnostics_factory(unittest.mock.MagicMock()) - backend = "numpy" + backend = Backend("st:numpy:cpu:IJK") quantity_factory = QuantityFactory( sizer=SubtileGridSizer.from_tile_params( nx_tile=12, @@ -66,7 +67,7 @@ def test_zselect_raises_error_if_3rd_dim_not_z(tmpdir): z_select=[ZSelect(level=0, names=["foo"])], ) result = config.diagnostics_factory(unittest.mock.MagicMock()) - backend = "numpy" + backend = Backend("st:numpy:cpu:IJK") quantity_factory = QuantityFactory( sizer=SubtileGridSizer.from_tile_params( nx_tile=12, @@ -79,6 +80,6 @@ def test_zselect_raises_error_if_3rd_dim_not_z(tmpdir): backend=backend, ) state = DycoreState.init_zeros(quantity_factory) - foo = quantity_factory.zeros(dims=[Z_DIM, X_DIM, Y_DIM], units="-") + foo = quantity_factory.zeros(dims=[K_DIM, I_DIM, J_DIM], units="-") state.foo = foo result.z_select[0].select_data(state) diff --git a/tests/main/driver/test_restart_fortran.py b/tests/main/driver/test_restart_fortran.py index cdb7c5241..cc5aebf91 100644 --- a/tests/main/driver/test_restart_fortran.py +++ b/tests/main/driver/test_restart_fortran.py @@ -9,6 +9,7 @@ SubtileGridSizer, TilePartitioner, ) +from ndsl.config import Backend from pace import FortranRestartInit, GeneratedGridConfig, NullComm from pyshield import PHYSICS_PACKAGES from tests.paths import REPO_ROOT @@ -16,7 +17,7 @@ def test_state_from_fortran_restart(): layout = (1, 1) - backend = "numpy" + backend = Backend("st:numpy:cpu:IJK") partitioner = CubedSpherePartitioner(TilePartitioner(layout)) # need a local communicator to mock "scatter" for the restart data, # but need null communicator to handle grid initialization diff --git a/tests/main/driver/test_restart_serial.py b/tests/main/driver/test_restart_serial.py index 52600f2b9..da6794513 100644 --- a/tests/main/driver/test_restart_serial.py +++ b/tests/main/driver/test_restart_serial.py @@ -15,6 +15,7 @@ SubtileGridSizer, TilePartitioner, ) +from ndsl.config import Backend from pace import ( AnalyticInit, DriverConfig, @@ -38,7 +39,7 @@ def test_restart_save_to_disk(): try: with open(EXAMPLE_CONFIGS_DIR / "baroclinic_c12_write_restart.yaml", "r") as f: driver_config = DriverConfig.from_dict(yaml.safe_load(f)) - backend = "numpy" + backend = Backend("st:numpy:cpu:IJK") mpi_comm = NullComm(rank=0, total_ranks=6, fill_value=0.0) partitioner = CubedSpherePartitioner(TilePartitioner((1, 1))) communicator = CubedSphereCommunicator(mpi_comm, partitioner) diff --git a/tests/main/driver/test_safety_checks.py b/tests/main/driver/test_safety_checks.py index 4fa3d6be2..e17c93b76 100644 --- a/tests/main/driver/test_safety_checks.py +++ b/tests/main/driver/test_safety_checks.py @@ -4,7 +4,8 @@ import pytest from ndsl import Quantity -from ndsl.constants import X_DIM, Y_DIM, Z_DIM +from ndsl.config import Backend +from ndsl.constants import I_DIM, J_DIM, K_DIM from pace import SafetyChecker @@ -62,11 +63,11 @@ def test_check_state_domain_only(): u_data[0:1, 0:1, :] = 100 u_quantity = Quantity( u_data, - (X_DIM, Y_DIM, Z_DIM), + (I_DIM, J_DIM, K_DIM), "unknown", origin=(1, 1, 0), extent=(3, 3, 2), - backend="numpy", + backend=Backend("st:numpy:cpu:IJK"), ) dycore_state = unittest.mock.MagicMock(u=u_quantity) checker.check_state(dycore_state) @@ -80,11 +81,11 @@ def test_check_nan_value(): u_data[2, 2, 1] = np.nan u_quantity = Quantity( u_data, - (X_DIM, Y_DIM, Z_DIM), + (I_DIM, J_DIM, K_DIM), "unknown", origin=(0, 0, 0), extent=(4, 4, 2), - backend="numpy", + backend=Backend("st:numpy:cpu:IJK"), ) dycore_state = unittest.mock.MagicMock(u=u_quantity) with pytest.raises(RuntimeError): diff --git a/tests/main/fv3core/test_cartesian_grid.py b/tests/main/fv3core/test_cartesian_grid.py index 6e1d940b7..003f79a66 100644 --- a/tests/main/fv3core/test_cartesian_grid.py +++ b/tests/main/fv3core/test_cartesian_grid.py @@ -4,6 +4,7 @@ import pytest from ndsl import TileCommunicator, TilePartitioner +from ndsl.config import Backend from ndsl.constants import PI from ndsl.grid import MetricTerms from pace import NullComm @@ -15,7 +16,7 @@ @pytest.mark.parametrize("dx_const", [1e2, 1e3]) @pytest.mark.parametrize("dy_const", [2e2, 3e3]) @pytest.mark.parametrize("deglat", [0.0, 15.0]) -@pytest.mark.parametrize("backend", ["numpy"]) +@pytest.mark.parametrize("backend", [Backend("st:numpy:cpu:IJK")]) def test_cartesian_grid_generation( npx: int, npy: int, diff --git a/tests/main/fv3core/test_dycore_baroclinic.py b/tests/main/fv3core/test_dycore_baroclinic.py index 533b12a62..838a8fad7 100644 --- a/tests/main/fv3core/test_dycore_baroclinic.py +++ b/tests/main/fv3core/test_dycore_baroclinic.py @@ -21,6 +21,7 @@ TileCommunicator, TilePartitioner, ) +from ndsl.config import Backend from ndsl.grid import DampingCoefficients, GridData, MetricTerms from ndsl.performance.timer import NullTimer from pace import NullComm @@ -81,7 +82,7 @@ def setup_dycore( ) -> DycoreState: """Sets up Dycore state for analytic initialization""" - backend = "numpy" + backend = Backend("st:numpy:cpu:IJK") config = setup_dycore_config() mpi_comm = NullComm( rank=rank, total_ranks=6 * config.layout[0] * config.layout[1], fill_value=0.0 diff --git a/tests/main/fv3core/test_dycore_call.py b/tests/main/fv3core/test_dycore_call.py index 9fa95184d..7cc9552ff 100644 --- a/tests/main/fv3core/test_dycore_call.py +++ b/tests/main/fv3core/test_dycore_call.py @@ -18,6 +18,7 @@ SubtileGridSizer, TilePartitioner, ) +from ndsl.config import Backend from ndsl.grid import DampingCoefficients, GridData, MetricTerms from ndsl.performance.timer import NullTimer, Timer from ndsl.stencils.testing import assert_same_temporaries, copy_temporaries @@ -27,7 +28,7 @@ def setup_dycore() -> Tuple[DynamicalCore, DycoreState, Timer]: - backend = "numpy" + backend = Backend("st:numpy:cpu:IJK") config = DynamicalCoreConfig( layout=(1, 1), npx=13, diff --git a/tests/main/fv3core/test_grid.py b/tests/main/fv3core/test_grid.py index 572efc2da..7f5530a10 100644 --- a/tests/main/fv3core/test_grid.py +++ b/tests/main/fv3core/test_grid.py @@ -6,12 +6,12 @@ import ndsl.dsl.gt4py as gt from ndsl import GridIndexing from ndsl.constants import ( - X_DIM, - X_INTERFACE_DIM, - Y_DIM, - Y_INTERFACE_DIM, - Z_DIM, - Z_INTERFACE_DIM, + I_DIM, + I_INTERFACE_DIM, + J_DIM, + J_INTERFACE_DIM, + K_DIM, + K_INTERFACE_DIM, ) from ndsl.dsl.typing import Index3D @@ -280,7 +280,7 @@ def test_domain_compute( pytest.param( 3, (4, 4, 7), - [X_DIM, Y_DIM, Z_DIM], + [I_DIM, J_DIM, K_DIM], (0, 0, 0), (3, 3, 0), (4, 4, 7), @@ -289,7 +289,7 @@ def test_domain_compute( pytest.param( 3, (4, 4, 7), - [X_DIM, Y_DIM, Z_DIM], + [I_DIM, J_DIM, K_DIM], tuple(), (3, 3, 0), (4, 4, 7), @@ -298,7 +298,7 @@ def test_domain_compute( pytest.param( 3, (4, 4, 7), - [Z_DIM, Y_DIM, X_DIM], + [K_DIM, J_DIM, I_DIM], (0, 0, 0), (0, 3, 3), (7, 4, 4), @@ -307,7 +307,7 @@ def test_domain_compute( pytest.param( 3, (4, 4, 7), - [X_DIM, Z_DIM], + [I_DIM, K_DIM], (0, 0), (3, 0), (4, 7), @@ -316,7 +316,7 @@ def test_domain_compute( pytest.param( 3, (4, 4, 7), - [X_DIM, Y_DIM, Z_DIM], + [I_DIM, J_DIM, K_DIM], (1, 0, 0), (2, 3, 0), (6, 4, 7), @@ -325,7 +325,7 @@ def test_domain_compute( pytest.param( 3, (4, 4, 7), - [X_DIM, Y_DIM, Z_DIM], + [I_DIM, J_DIM, K_DIM], (0, 1, 0), (3, 2, 0), (4, 6, 7), @@ -335,7 +335,7 @@ def test_domain_compute( pytest.param( 3, (4, 4, 7), - [X_DIM, Y_DIM, Z_DIM], + [I_DIM, J_DIM, K_DIM], (0, 0, 1), (3, 3, -1), (4, 4, 9), @@ -344,7 +344,7 @@ def test_domain_compute( pytest.param( 3, (4, 4, 7), - [X_DIM, Y_DIM, Z_DIM], + [I_DIM, J_DIM, K_DIM], (2, 2), (1, 1, 0), (8, 8, 7), @@ -353,7 +353,7 @@ def test_domain_compute( pytest.param( 3, (4, 4, 7), - [X_DIM, Y_DIM], + [I_DIM, J_DIM], (2, 2), (1, 1), (8, 8), @@ -362,7 +362,7 @@ def test_domain_compute( pytest.param( 3, (4, 4, 7), - [X_INTERFACE_DIM, Y_DIM, Z_DIM], + [I_INTERFACE_DIM, J_DIM, K_DIM], (0, 0, 0), (3, 3, 0), (5, 4, 7), @@ -371,7 +371,7 @@ def test_domain_compute( pytest.param( 3, (4, 4, 7), - [X_DIM, Y_INTERFACE_DIM, Z_DIM], + [I_DIM, J_INTERFACE_DIM, K_DIM], (0, 0, 0), (3, 3, 0), (4, 5, 7), @@ -380,7 +380,7 @@ def test_domain_compute( pytest.param( 3, (4, 4, 7), - [X_DIM, Y_DIM, Z_INTERFACE_DIM], + [I_DIM, J_DIM, K_INTERFACE_DIM], (0, 0, 0), (3, 3, 0), (4, 4, 8), @@ -389,7 +389,7 @@ def test_domain_compute( pytest.param( 3, (4, 4, 7), - [X_INTERFACE_DIM, Y_DIM, Z_DIM], + [I_INTERFACE_DIM, J_DIM, K_DIM], (0, 3), (3, 0, 0), (5, 10, 7), @@ -398,7 +398,7 @@ def test_domain_compute( pytest.param( 1, (4, 4, 7), - [X_DIM, Y_DIM, Z_DIM], + [I_DIM, J_DIM, K_DIM], (0, 0, 0), (1, 1, 0), (4, 4, 7), @@ -407,7 +407,7 @@ def test_domain_compute( pytest.param( 3, (2, 3, 6), - [X_DIM, Y_DIM, Z_DIM], + [I_DIM, J_DIM, K_DIM], (0, 0, 0), (3, 3, 0), (2, 3, 6), @@ -456,7 +456,7 @@ def test_get_origin_domain( pytest.param( 3, (4, 4, 7), - [X_DIM, Y_DIM, Z_DIM], + [I_DIM, J_DIM, K_DIM], (0, 0, 0), (3, 3, 0), (4, 4, 7), @@ -465,7 +465,7 @@ def test_get_origin_domain( pytest.param( 3, (4, 4, 7), - [X_DIM, Y_DIM, Z_DIM], + [I_DIM, J_DIM, K_DIM], tuple(), (3, 3, 0), (4, 4, 7), @@ -518,7 +518,7 @@ def test_get_origin_domain_restricted_vertical( pytest.param( 3, (5, 6, 7), - [X_DIM, Y_DIM, Z_DIM], + [I_DIM, J_DIM, K_DIM], (0, 0, 0), (8, 9, 7), id="compute", @@ -526,7 +526,7 @@ def test_get_origin_domain_restricted_vertical( pytest.param( 3, (5, 6, 7), - [X_DIM, Y_DIM, Z_DIM], + [I_DIM, J_DIM, K_DIM], tuple(), (8, 9, 7), id="compute_empty_halo", @@ -534,7 +534,7 @@ def test_get_origin_domain_restricted_vertical( pytest.param( 3, (5, 6, 7), - [Z_DIM, Y_DIM, X_DIM], + [K_DIM, J_DIM, I_DIM], (0, 0, 0), (7, 9, 8), id="compute_reverse", @@ -542,7 +542,7 @@ def test_get_origin_domain_restricted_vertical( pytest.param( 0, (4, 4, 7), - [X_DIM, Y_DIM, Z_DIM], + [I_DIM, J_DIM, K_DIM], (0, 0, 0), (4, 4, 7), id="no_halos_anywhere", @@ -550,7 +550,7 @@ def test_get_origin_domain_restricted_vertical( pytest.param( 3, (4, 4, 7), - [X_INTERFACE_DIM, Y_DIM, Z_DIM], + [I_INTERFACE_DIM, J_DIM, K_DIM], (0, 0, 0), (8, 7, 7), id="x_interface", @@ -558,7 +558,7 @@ def test_get_origin_domain_restricted_vertical( pytest.param( 3, (4, 4, 7), - [X_DIM, Y_INTERFACE_DIM, Z_DIM], + [I_DIM, J_INTERFACE_DIM, K_DIM], (0, 0, 0), (7, 8, 7), id="y_interface", @@ -566,7 +566,7 @@ def test_get_origin_domain_restricted_vertical( pytest.param( 3, (4, 4, 7), - [X_DIM, Y_DIM, Z_INTERFACE_DIM], + [I_DIM, J_DIM, K_INTERFACE_DIM], (0, 0, 0), (7, 7, 8), id="z_interface", @@ -574,7 +574,7 @@ def test_get_origin_domain_restricted_vertical( pytest.param( 3, (4, 4, 7), - [X_DIM, Y_DIM, Z_DIM], + [I_DIM, J_DIM, K_DIM], (3, 3), (10, 10, 7), id="halos_required", @@ -582,7 +582,7 @@ def test_get_origin_domain_restricted_vertical( pytest.param( 3, (4, 4, 7), - [X_DIM, Y_DIM, Z_DIM], + [I_DIM, J_DIM, K_DIM], (0, 3), (7, 10, 7), id="y_halos_required", diff --git a/tests/main/fv3core/test_init_from_geos.py b/tests/main/fv3core/test_init_from_geos.py index b1c05a676..3947ddd93 100644 --- a/tests/main/fv3core/test_init_from_geos.py +++ b/tests/main/fv3core/test_init_from_geos.py @@ -2,6 +2,7 @@ import numpy as np import pytest # noqa +from ndsl.config import Backend from pace import NullComm from pyfv3 import DynamicalCore from pyfv3.wrappers import GeosDycoreWrapper @@ -11,7 +12,7 @@ def test_geos_wrapper(): namelist_dict = { "stencil_config": { "compilation_config": { - "backend": "numpy", + "backend": "st:numpy:cpu:IJK", "rebuild": False, "validate_args": True, "format_source": False, @@ -83,7 +84,7 @@ def test_geos_wrapper(): namelist = f90nml.namelist.Namelist(namelist_dict) comm = NullComm(rank=0, total_ranks=6, fill_value=0.0) - backend = "numpy" + backend = Backend("st:numpy:cpu:IJK") wrapper = GeosDycoreWrapper( namelist=namelist, diff --git a/tests/main/physics/test_integration.py b/tests/main/physics/test_integration.py index dc5ba8163..af9321442 100644 --- a/tests/main/physics/test_integration.py +++ b/tests/main/physics/test_integration.py @@ -17,6 +17,7 @@ SubtileGridSizer, TilePartitioner, ) +from ndsl.config import Backend from ndsl.grid import GridData, MetricTerms from ndsl.stencils.testing import assert_same_temporaries, copy_temporaries from pace import NullComm @@ -30,7 +31,7 @@ def setup_physics(): - backend = "numpy" + backend = Backend("st:numpy:cpu:IJK") layout = (1, 1) physics_config = PhysicsConfig( dt_atmos=225, hydrostatic=False, npx=13, npy=13, npz=79, nwat=6, do_qa=True @@ -55,7 +56,7 @@ def setup_physics(): dace_config = DaceConfig( communicator=communicator, backend=backend, - orchestration=DaCeOrchestration.Python, + orchestration=DaCeOrchestration.BuildAndRun, ) stencil_config = StencilConfig( compilation_config=CompilationConfig( diff --git a/tests/main/test_grid_init.py b/tests/main/test_grid_init.py index 006244365..4fb6a80ab 100644 --- a/tests/main/test_grid_init.py +++ b/tests/main/test_grid_init.py @@ -11,6 +11,7 @@ SubtileGridSizer, TilePartitioner, ) +from ndsl.config import Backend from ndsl.grid import MetricTerms from pace import NullComm @@ -25,7 +26,7 @@ def get_cube_comm(layout, rank: int): def get_quantity_factory(layout, nx_tile, ny_tile, nz): nx = nx_tile // layout[0] ny = ny_tile // layout[1] - backend = "numpy" + backend = Backend("st:numpy:cpu:IJK") return QuantityFactory( sizer=SubtileGridSizer.from_tile_params( diff --git a/tests/mpi/ext_grid/test_external_grid.py b/tests/mpi/ext_grid/test_external_grid.py index a867d1827..70f0d38a7 100644 --- a/tests/mpi/ext_grid/test_external_grid.py +++ b/tests/mpi/ext_grid/test_external_grid.py @@ -12,7 +12,7 @@ TilePartitioner, ) from ndsl.comm.partitioner import get_tile_index -from ndsl.constants import PI, RADIUS, X_INTERFACE_DIM, Y_INTERFACE_DIM +from ndsl.constants import I_INTERFACE_DIM, J_INTERFACE_DIM, PI, RADIUS from pace import Driver, DriverConfig from tests.paths import EXAMPLE_CONFIGS_DIR, REPO_ROOT @@ -96,7 +96,7 @@ def test_extgrid_equals_generated(config_file_path: str, ranks: int): subtile_slice_grid = cube_comm.partitioner.tile.subtile_slice( rank=cube_comm.rank, - global_dims=[X_INTERFACE_DIM, Y_INTERFACE_DIM], + global_dims=[I_INTERFACE_DIM, J_INTERFACE_DIM], global_extent=(npx, npy), overlap=True, ) diff --git a/tests/mpi/test_grid_init.py b/tests/mpi/test_grid_init.py index 337ae6ee0..16cc7c005 100644 --- a/tests/mpi/test_grid_init.py +++ b/tests/mpi/test_grid_init.py @@ -12,6 +12,7 @@ TileCommunicator, TilePartitioner, ) +from ndsl.config import Backend from ndsl.grid import GridData, MetricTerms from pyfv3 import DycoreState from pyfv3.initialization.test_cases.initialize_baroclinic import init_baroclinic_state @@ -27,7 +28,7 @@ def get_cube_comm(layout, comm: MPIComm): def get_quantity_factory(layout, nx_tile, ny_tile, nz): nx = nx_tile // layout[0] ny = ny_tile // layout[1] - backend = "numpy" + backend = Backend("st:numpy:cpu:IJK") return QuantityFactory( sizer=SubtileGridSizer.from_tile_params( diff --git a/tests/savepoint/conftest.py b/tests/savepoint/conftest.py index b7ebdb7ac..9a62e96ce 100644 --- a/tests/savepoint/conftest.py +++ b/tests/savepoint/conftest.py @@ -37,7 +37,10 @@ def dperiodic(pytestconfig): def pytest_addoption(parser): parser.addoption( - "--backend", action="store", default="numpy", help="gt4py backend name" + "--backend", + action="store", + default="st:numpy:cpu:IJK", + help="gt4py backend name", ) parser.addoption( "--data_path", action="store", default="./", help="location of reference data" diff --git a/tests/savepoint/test_checkpoints.py b/tests/savepoint/test_checkpoints.py index f4c36847c..2a80abd32 100644 --- a/tests/savepoint/test_checkpoints.py +++ b/tests/savepoint/test_checkpoints.py @@ -28,6 +28,7 @@ ThresholdCalibrationCheckpointer, ValidationCheckpointer, ) +from ndsl.config import Backend from ndsl.grid import DampingCoefficients, GridData from ndsl.stencils.testing import Grid, TranslateGrid, dataset_to_dict from ndsl.testing import perturb @@ -35,7 +36,9 @@ from pyfv3.testing import TranslateFVDynamics -def get_grid(data_path: Path, rank: int, layout: Tuple[int, int], backend: str) -> Grid: +def get_grid( + data_path: Path, rank: int, layout: Tuple[int, int], backend: Backend +) -> Grid: ds_grid: xr.Dataset = xr.open_dataset(data_path / "Grid-Info.nc").isel(savepoint=0) grid = TranslateGrid( dataset_to_dict(ds_grid.isel(rank=rank)), From 562c3942201961b93cdeccf9e0eee65cbee64d85 Mon Sep 17 00:00:00 2001 From: Roman Cattaneo Date: Tue, 10 Mar 2026 19:07:35 +0100 Subject: [PATCH 73/75] tests: minor cleanup in tests (#181) * tests: minor cleanup in tests - add `__init__.py` files where missing - `List` -> `list` and `Tuple` -> `tuple` - NDSL has no `Namelist` anymore - cleanup unused import and code in `test_init_from_geos.py` * remove stale reference to ndsl.Namelist --- tests/main/__init__.py | 0 tests/main/driver/test_driver.py | 4 ++-- tests/main/driver/test_example_configs.py | 13 ++++++------- tests/main/fv3core/__init__.py | 0 tests/main/fv3core/test_dycore_call.py | 3 +-- tests/main/fv3core/test_init_from_geos.py | 6 ------ tests/main/physics/__init__.py | 0 tests/mpi/__init__.py | 0 tests/mpi/ext_grid/__init__.py | 0 tests/mpi/restart/__init__.py | 0 tests/savepoint/__init__.py | 0 tests/savepoint/test_checkpoints.py | 10 ++++------ tests/savepoint/translate/translate_driver.py | 4 +++- 13 files changed, 16 insertions(+), 24 deletions(-) create mode 100644 tests/main/__init__.py create mode 100644 tests/main/fv3core/__init__.py create mode 100644 tests/main/physics/__init__.py create mode 100644 tests/mpi/__init__.py create mode 100644 tests/mpi/ext_grid/__init__.py create mode 100644 tests/mpi/restart/__init__.py create mode 100644 tests/savepoint/__init__.py diff --git a/tests/main/__init__.py b/tests/main/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/main/driver/test_driver.py b/tests/main/driver/test_driver.py index c48b6510c..6e3f08e8b 100644 --- a/tests/main/driver/test_driver.py +++ b/tests/main/driver/test_driver.py @@ -1,6 +1,6 @@ import unittest.mock from datetime import datetime, timedelta -from typing import Literal, Tuple +from typing import Literal import pytest @@ -22,7 +22,7 @@ def get_driver_config( hours: int = 0, minutes: int = 0, seconds: int = 0, - layout: Tuple[int, int] = (1, 1), + layout: tuple[int, int] = (1, 1), frequency: int = 1, output_initial_state=False, start_time_type: Literal["timedelta", "datetime"] = "timedelta", diff --git a/tests/main/driver/test_example_configs.py b/tests/main/driver/test_example_configs.py index f8e77c833..e16ce84c9 100644 --- a/tests/main/driver/test_example_configs.py +++ b/tests/main/driver/test_example_configs.py @@ -1,6 +1,5 @@ import os from pathlib import Path -from typing import List import pytest import yaml @@ -9,7 +8,7 @@ from tests.paths import EXAMPLE_CONFIGS_DIR, JENKINS_CONFIGS_DIR -TESTED_CONFIGS: List[str] = [ +TESTED_CONFIGS: list[str] = [ "baroclinic_c12.yaml", "baroclinic_c12_dp.yaml", "baroclinic_c12_explicit_physics.yaml", @@ -20,7 +19,7 @@ "baroclinic_c48_6ranks_serialbox_test.yaml", "analytic_test.yaml", ] -EXCLUDED_CONFIGS: List[str] = [ +EXCLUDED_CONFIGS: list[str] = [ # We don't test serialbox example because it loads namelist # filepath that are not in git "baroclinic_c12_from_serialbox.yaml", @@ -33,13 +32,13 @@ ] -TESTED_JENKINS_CONFIGS: List[str] = [ +TESTED_JENKINS_CONFIGS: list[str] = [ "baroclinic_c48_6ranks_dycore_only.yaml", "baroclinic_c192_6ranks.yaml", "baroclinic_c192_54ranks.yaml", ] -EXCLUDED_JENKINS_CONFIGS: List[str] = [ +EXCLUDED_JENKINS_CONFIGS: list[str] = [ # We don't test serialbox example because it loads namelist # filepath that are not in git "baroclinic_c48_6ranks_dycore_only_serialbox.yaml", @@ -61,7 +60,7 @@ ], ) def test_all_configs_tested_or_excluded( - config_dir: Path, tested_configs: List[str], excluded_configs: List[str] + config_dir: Path, tested_configs: list[str], excluded_configs: list[str] ): """ If any configs are not tested or excluded, add them to TESTED_CONFIGS or @@ -84,7 +83,7 @@ def test_all_configs_tested_or_excluded( pytest.param(JENKINS_CONFIGS_DIR, TESTED_JENKINS_CONFIGS), ], ) -def test_example_config_can_initialize(path: Path, file_list: List[str]): +def test_example_config_can_initialize(path: Path, file_list: list[str]): for file_name in file_list: with open(path / file_name, "r") as f: config = DriverConfig.from_dict(yaml.safe_load(f)) diff --git a/tests/main/fv3core/__init__.py b/tests/main/fv3core/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/main/fv3core/test_dycore_call.py b/tests/main/fv3core/test_dycore_call.py index 7cc9552ff..43262c84c 100644 --- a/tests/main/fv3core/test_dycore_call.py +++ b/tests/main/fv3core/test_dycore_call.py @@ -2,7 +2,6 @@ from dataclasses import fields from datetime import timedelta from pathlib import Path -from typing import Tuple import pyfv3.initialization.analytic_init as ai from ndsl import ( @@ -27,7 +26,7 @@ from pyfv3.initialization.analytic_init import AnalyticCase -def setup_dycore() -> Tuple[DynamicalCore, DycoreState, Timer]: +def setup_dycore() -> tuple[DynamicalCore, DycoreState, Timer]: backend = Backend("st:numpy:cpu:IJK") config = DynamicalCoreConfig( layout=(1, 1), diff --git a/tests/main/fv3core/test_init_from_geos.py b/tests/main/fv3core/test_init_from_geos.py index 3947ddd93..4b24c5787 100644 --- a/tests/main/fv3core/test_init_from_geos.py +++ b/tests/main/fv3core/test_init_from_geos.py @@ -1,6 +1,5 @@ import f90nml import numpy as np -import pytest # noqa from ndsl.config import Backend from pace import NullComm @@ -108,11 +107,6 @@ def test_geos_wrapper(): namelist["nx_tile"] + 2 * nhalo + 1, namelist["nz"], ) - shape_z_interface = ( - namelist["nx_tile"] + 2 * nhalo, - namelist["nx_tile"] + 2 * nhalo, - namelist["nz"] + 1, - ) shape2d = ( namelist["nx_tile"] + 2 * nhalo, namelist["nx_tile"] + 2 * nhalo, diff --git a/tests/main/physics/__init__.py b/tests/main/physics/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/mpi/__init__.py b/tests/mpi/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/mpi/ext_grid/__init__.py b/tests/mpi/ext_grid/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/mpi/restart/__init__.py b/tests/mpi/restart/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/savepoint/__init__.py b/tests/savepoint/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/savepoint/test_checkpoints.py b/tests/savepoint/test_checkpoints.py index 2a80abd32..316c42050 100644 --- a/tests/savepoint/test_checkpoints.py +++ b/tests/savepoint/test_checkpoints.py @@ -1,7 +1,6 @@ import dataclasses from datetime import timedelta from pathlib import Path -from typing import List, Tuple import dacite import f90nml @@ -14,7 +13,6 @@ CubedSpherePartitioner, GridIndexing, MPIComm, - Namelist, Quantity, QuantityFactory, StencilConfig, @@ -37,7 +35,7 @@ def get_grid( - data_path: Path, rank: int, layout: Tuple[int, int], backend: Backend + data_path: Path, rank: int, layout: tuple[int, int], backend: Backend ) -> Grid: ds_grid: xr.Dataset = xr.open_dataset(data_path / "Grid-Info.nc").isel(savepoint=0) grid = TranslateGrid( @@ -58,7 +56,7 @@ def __init__( self._ds = ds self._translate = translate - def new_state(self) -> Tuple[DycoreState, GridData]: + def new_state(self) -> tuple[DycoreState, GridData]: input_data = dataset_to_dict(self._ds.copy()) state, grid_data = self._translate.prepare_data(input_data) return state, grid_data @@ -68,7 +66,7 @@ def test_fv_dynamics( backend: str, data_path: Path, calibrate_thresholds: bool, threshold_path: Path ): print("start test call") - namelist = Namelist.from_f90nml(f90nml.read(data_path / "input.nml")) + namelist = f90nml.read(data_path / "input.nml") threshold_filename = threshold_path / "fv_dynamics.yaml" communicator = CubedSphereCommunicator( comm=MPIComm(), @@ -202,7 +200,7 @@ def set_manual_thresholds(thresholds: SavepointThresholds): entry[name] = Threshold(relative=0.0, absolute=0.0) -def merge_thresholds(all_thresholds: List[SavepointThresholds]): +def merge_thresholds(all_thresholds: list[SavepointThresholds]): thresholds = all_thresholds[0] for other_thresholds in all_thresholds[1:]: for savepoint_name in thresholds.savepoints: diff --git a/tests/savepoint/translate/translate_driver.py b/tests/savepoint/translate/translate_driver.py index 59016e913..4c85368e1 100644 --- a/tests/savepoint/translate/translate_driver.py +++ b/tests/savepoint/translate/translate_driver.py @@ -1,4 +1,6 @@ -from ndsl import Namelist, QuantityFactory, SubtileGridSizer +from f90nml import Namelist + +from ndsl import QuantityFactory, SubtileGridSizer from ndsl.constants import N_HALO_DEFAULT from pace import Driver, DriverConfig, TendencyState from pyfv3 import DynamicalCoreConfig From de2f8cd1e46b71f6fe61e3ad130f8ff9cda92aec Mon Sep 17 00:00:00 2001 From: Frank Malatino <142349306+fmalatino@users.noreply.github.com> Date: Mon, 16 Mar 2026 09:27:46 -0400 Subject: [PATCH 74/75] Changing submodule names to reflect new repository names (#179) * Changing submodule names to reflect new repository names, and updating to latest versions * Updating linting tools * Re-adding back in flake8 checks * removing comments * Adding in type hinting for hooks variable in from_dict methods * Updating submodules * Removing optional None type hints * Reverting back to full typing --- .gitmodules | 4 ++-- .pre-commit-config.yaml | 10 +++++----- NDSL | 2 +- pace/diagnostics.py | 4 +++- pace/driver.py | 7 ++++--- pace/initialization.py | 4 +++- pace/registry.py | 4 +++- pyFV3 | 2 +- pySHiELD | 2 +- pyproject.toml | 1 + tests/main/fv3core/test_config.py | 2 +- 11 files changed, 25 insertions(+), 17 deletions(-) diff --git a/.gitmodules b/.gitmodules index 9f16caae1..f7a49695f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -5,9 +5,9 @@ branch = develop [submodule "pyFV3"] path = pyFV3 - url = https://github.com/NOAA-GFDL/PyFV3.git + url = https://github.com/NOAA-GFDL/pyFV3.git branch = develop [submodule "pySHiELD"] path = pySHiELD - url = https://github.com/NOAA-GFDL/PySHiELD.git + url = https://github.com/NOAA-GFDL/pySHiELD.git branch = develop diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c022eb48c..020150f2b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,7 @@ default_language_version: repos: - repo: https://github.com/psf/black - rev: 25.1.0 + rev: 25.9.0 hooks: - id: black @@ -14,16 +14,16 @@ repos: args: ["--profile", "black"] - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.17.0 + rev: v1.18.2 hooks: - id: mypy - additional_dependencies: [types-pyyaml] + additional_dependencies: [types-PyYAML] name: mypy-pace files: pace args: ["--config-file", "pyproject.toml"] - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: v6.0.0 hooks: - id: check-toml - id: check-yaml @@ -36,7 +36,7 @@ repos: - id: flake8 name: flake8 language_version: python3 - additional_dependencies: [Flake8-pyproject] + additional_dependencies: [Flake8-pyproject, flake8-bugbear] - repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks rev: v2.15.0 diff --git a/NDSL b/NDSL index 2430f879b..ada2d5379 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit 2430f879bb996e4ff301ecd1d9bf72804fb0e4c4 +Subproject commit ada2d5379540aba26681b2a1ea2588dd6895fc48 diff --git a/pace/diagnostics.py b/pace/diagnostics.py index 5a4b9d541..d2c128b15 100644 --- a/pace/diagnostics.py +++ b/pace/diagnostics.py @@ -197,7 +197,9 @@ def _get_derived_state(self, state: DriverState): state.dycore_state.delp, ) else: - warnings.warn(f"{name} is not a supported diagnostic variable.") + warnings.warn( + f"{name} is not a supported diagnostic variable.", stacklevel=2 + ) return output def _get_z_select_state(self, state: DycoreState): diff --git a/pace/driver.py b/pace/driver.py index f6f825d81..1bcb3ed29 100644 --- a/pace/driver.py +++ b/pace/driver.py @@ -150,7 +150,8 @@ def n_timesteps(self) -> int: if self.total_time < self.timestep: warnings.warn( f"No simulation possible: you asked for {self.total_time} " - f"simulation time but the timestep is {self.timestep}" + f"simulation time but the timestep is {self.timestep}", + stacklevel=2, ) return floor(self.total_time.total_seconds() / self.timestep.total_seconds()) @@ -442,7 +443,7 @@ def exit_function(*args, **kwargs): ) exit(0) - setattr(self, "step_all", exit_function) + self.step_all = exit_function # type: ignore[method-assign] elif self.config.stencil_config.compilation_config.run_mode == RunMode.Run: def exit_instead_of_build(self): @@ -457,7 +458,7 @@ def exit_instead_of_build(self): from gt4py.stencil_builder import StencilBuilder - setattr(StencilBuilder, "build", exit_instead_of_build) + StencilBuilder.build = exit_instead_of_build # type: ignore["method-assign"] self.config.stencil_config.dace_config = DaceConfig( communicator=communicator, diff --git a/pace/initialization.py b/pace/initialization.py index eaab682da..36377c162 100644 --- a/pace/initialization.py +++ b/pace/initialization.py @@ -91,7 +91,9 @@ def get_driver_state( ) @classmethod - def from_dict(cls, config: dict, hooks={}): + def from_dict(cls, config: dict, hooks: dict | None = None): + if not hooks: + hooks = {} instance = cls.registry.from_dict(config, hooks=hooks) return cls(config=instance, type=config["type"]) diff --git a/pace/registry.py b/pace/registry.py index 498493866..ac1b53c79 100644 --- a/pace/registry.py +++ b/pace/registry.py @@ -105,7 +105,7 @@ def register_func(cls: TT) -> TT: return register_func - def from_dict(self, config: dict, hooks={}) -> T: + def from_dict(self, config: dict, hooks: dict | None = None) -> T: """ Creates a registered type from the given config dict. @@ -116,6 +116,8 @@ def from_dict(self, config: dict, hooks={}) -> T: It can also have a "config" key, which is a dict used to initialize the dataclass. By default this is an empty dict. """ + if not hooks: + hooks = {} config.setdefault("config", {}) if self.default_type is not None: type_name = config.get("type", self.default_type) diff --git a/pyFV3 b/pyFV3 index 731933a1b..20b000712 160000 --- a/pyFV3 +++ b/pyFV3 @@ -1 +1 @@ -Subproject commit 731933a1b971392e58a574c6d34c7d893888899b +Subproject commit 20b00071263506d4f45dedf3ab538b501f400103 diff --git a/pySHiELD b/pySHiELD index 80558ac38..49edb6766 160000 --- a/pySHiELD +++ b/pySHiELD @@ -1 +1 @@ -Subproject commit 80558ac38417e313aab1e241b5a0e0eb66f1b135 +Subproject commit 49edb676674407c6b9c1795807d4c86d27acb69e diff --git a/pyproject.toml b/pyproject.toml index fc4d0617d..8fe8cf67b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -78,6 +78,7 @@ warn_unreachable = true ignore_errors = true module = [ # We currently can't type stencils + "pyfv3.stencils.*", "pyshield.stencils.*" ] diff --git a/tests/main/fv3core/test_config.py b/tests/main/fv3core/test_config.py index 5bddc03f9..663778f81 100644 --- a/tests/main/fv3core/test_config.py +++ b/tests/main/fv3core/test_config.py @@ -41,7 +41,7 @@ def value(self) -> int: def assert_types_match(classes): types = collections.defaultdict(set) for cls in classes: - for name, field in cls.__dataclass_fields__.items(): + for name, _field in cls.__dataclass_fields__.items(): # Get type hints in case we're using postponed evaluation of types # Example: ' instead of 'bool' types[name].add(typing.get_type_hints(cls)[name]) From 6c8855ab90bb248740e826633ec2bf329b3ed194 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Wed, 18 Mar 2026 14:15:05 -0400 Subject: [PATCH 75/75] Updating to latest submodule versions and changes to branch --- NDSL | 2 +- examples/configs/baroclinic_c3072_cpu.yaml | 2 +- examples/configs/baroclinic_c3072_gpu.yaml | 2 +- examples/configs/baroclinic_c384_cpu.yaml | 2 +- examples/configs/baroclinic_c384_gpu.yaml | 2 +- pyFV3 | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/NDSL b/NDSL index ada2d5379..eb8c61819 160000 --- a/NDSL +++ b/NDSL @@ -1 +1 @@ -Subproject commit ada2d5379540aba26681b2a1ea2588dd6895fc48 +Subproject commit eb8c61819816a22c7b791533512d5ac89693d007 diff --git a/examples/configs/baroclinic_c3072_cpu.yaml b/examples/configs/baroclinic_c3072_cpu.yaml index 1870c3a37..dae4593b4 100644 --- a/examples/configs/baroclinic_c3072_cpu.yaml +++ b/examples/configs/baroclinic_c3072_cpu.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: dace:cpu + backend: st:dace:cpu:KIJ rebuild: false validate_args: false format_source: false diff --git a/examples/configs/baroclinic_c3072_gpu.yaml b/examples/configs/baroclinic_c3072_gpu.yaml index db6b6acea..5fa337933 100644 --- a/examples/configs/baroclinic_c3072_gpu.yaml +++ b/examples/configs/baroclinic_c3072_gpu.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: dace:gpu + backend: st:dace:gpu:KIJ rebuild: false validate_args: false format_source: false diff --git a/examples/configs/baroclinic_c384_cpu.yaml b/examples/configs/baroclinic_c384_cpu.yaml index 184a13fea..1d1dba68c 100644 --- a/examples/configs/baroclinic_c384_cpu.yaml +++ b/examples/configs/baroclinic_c384_cpu.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: dace:cpu + backend: st:dace:cpu:KIJ rebuild: false validate_args: false format_source: false diff --git a/examples/configs/baroclinic_c384_gpu.yaml b/examples/configs/baroclinic_c384_gpu.yaml index 982edd549..9ccfc28d9 100644 --- a/examples/configs/baroclinic_c384_gpu.yaml +++ b/examples/configs/baroclinic_c384_gpu.yaml @@ -1,6 +1,6 @@ stencil_config: compilation_config: - backend: dace:gpu + backend: st:dace:gpu:KJI rebuild: false validate_args: false format_source: false diff --git a/pyFV3 b/pyFV3 index 20b000712..f7a49e61e 160000 --- a/pyFV3 +++ b/pyFV3 @@ -1 +1 @@ -Subproject commit 20b00071263506d4f45dedf3ab538b501f400103 +Subproject commit f7a49e61e963651b4dfcacdb3716af272fd552ab