diff --git a/examples/PyMPDATA_examples/Jaruga_et_al_2015/fig.ipynb b/examples/PyMPDATA_examples/Jaruga_et_al_2015/fig.ipynb deleted file mode 100644 index aa261a5e..00000000 --- a/examples/PyMPDATA_examples/Jaruga_et_al_2015/fig.ipynb +++ /dev/null @@ -1,623 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "854fc1cb-5e7c-424e-a09a-ace10e519c3a", - "metadata": {}, - "source": [ - "## 2D Boussinesq (buoyancy-driven) flow example\n", - "\n", - "### equations solved:\n", - "conservation of momentum (inviscid and incompressible form of Navier-Stokes equation)\n", - "$$\n", - "\\partial_t v+\\mathrm{\\nabla}\\cdot\\left(\\vec{v}\\otimes \\vec{v}\\right)=-\\mathrm{\\nabla\\pi}-\\vec{g}\\frac{\\theta^\\prime}{\\theta_0}\n", - "$$\n", - "conservation of energy\n", - "$$\n", - "\\partial_t \\theta+ \\mathrm{\\nabla}\\cdot\\left(\\vec{v}\\theta\\right)=0\n", - "$$\n", - "continuity equation(conservation of mass)\n", - "$$\n", - "\\mathrm{\\nabla}\\cdot\\ \\vec{v}=0\n", - "$$" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "9ef2a5c3-3ac9-418b-92dd-e422ba66af66", - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "if 'google.colab' in sys.modules:\n", - " !pip --quiet install open-atmos-jupyter-utils\n", - " from open_atmos_jupyter_utils import pip_install_on_colab\n", - " pip_install_on_colab('PyMPDATA-examples')" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "69583de6-8b30-4a74-8cd0-d3ade00ec579", - "metadata": {}, - "outputs": [ - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[2], line 7\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mwarnings\u001b[39;00m\n\u001b[0;32m 5\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mcollections\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m namedtuple\n\u001b[1;32m----> 7\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m jit\n\u001b[0;32m 8\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01merrors\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m NumbaExperimentalFeatureWarning\n\u001b[0;32m 10\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mnp\u001b[39;00m\n", - "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\numba\\__init__.py:92\u001b[0m\n\u001b[0;32m 89\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtypes\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;241m*\u001b[39m\n\u001b[0;32m 91\u001b[0m \u001b[38;5;66;03m# Re-export decorators\u001b[39;00m\n\u001b[1;32m---> 92\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdecorators\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (cfunc, jit, njit, stencil,\n\u001b[0;32m 93\u001b[0m jit_module)\n\u001b[0;32m 95\u001b[0m \u001b[38;5;66;03m# Re-export vectorize decorators and the thread layer querying function\u001b[39;00m\n\u001b[0;32m 96\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mnp\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mufunc\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (vectorize, guvectorize, threading_layer,\n\u001b[0;32m 97\u001b[0m get_num_threads, set_num_threads,\n\u001b[0;32m 98\u001b[0m set_parallel_chunksize, get_parallel_chunksize,\n\u001b[0;32m 99\u001b[0m get_thread_id)\n", - "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\numba\\core\\decorators.py:12\u001b[0m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mlogging\u001b[39;00m\n\u001b[0;32m 11\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01merrors\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m DeprecationError, NumbaDeprecationWarning\n\u001b[1;32m---> 12\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mstencils\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mstencil\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m stencil\n\u001b[0;32m 13\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m config, extending, sigutils, registry\n\u001b[0;32m 15\u001b[0m _logger \u001b[38;5;241m=\u001b[39m logging\u001b[38;5;241m.\u001b[39mgetLogger(\u001b[38;5;18m__name__\u001b[39m)\n", - "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\numba\\stencils\\stencil.py:11\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mnp\u001b[39;00m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mllvmlite\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m ir \u001b[38;5;28;01mas\u001b[39;00m lir\n\u001b[1;32m---> 11\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m types, typing, utils, ir, config, ir_utils, registry\n\u001b[0;32m 12\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtyping\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtemplates\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (CallableTemplate, signature,\n\u001b[0;32m 13\u001b[0m infer_global, AbstractTemplate)\n\u001b[0;32m 14\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mimputils\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m lower_builtin\n", - "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\numba\\core\\registry.py:6\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mutils\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m threadsafe_cached_property \u001b[38;5;28;01mas\u001b[39;00m cached_property\n\u001b[0;32m 5\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdescriptors\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m TargetDescriptor\n\u001b[1;32m----> 6\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m utils, typing, dispatcher, cpu\n\u001b[0;32m 8\u001b[0m \u001b[38;5;66;03m# -----------------------------------------------------------------------------\u001b[39;00m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;66;03m# Default CPU target descriptors\u001b[39;00m\n\u001b[0;32m 12\u001b[0m \u001b[38;5;28;01mclass\u001b[39;00m \u001b[38;5;21;01mCPUTarget\u001b[39;00m(TargetDescriptor):\n", - "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\numba\\core\\dispatcher.py:14\u001b[0m\n\u001b[0;32m 11\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mabc\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m abstractmethod\n\u001b[0;32m 13\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m _dispatcher\n\u001b[1;32m---> 14\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[0;32m 15\u001b[0m utils, types, errors, typing, serialize, config, compiler, sigutils\n\u001b[0;32m 16\u001b[0m )\n\u001b[0;32m 17\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcompiler_lock\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m global_compiler_lock\n\u001b[0;32m 18\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtypeconv\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mrules\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m default_type_manager\n", - "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\numba\\core\\compiler.py:6\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mwarnings\u001b[39;00m\n\u001b[0;32m 4\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtracing\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m event\n\u001b[1;32m----> 6\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (utils, errors, interpreter, bytecode, postproc, config,\n\u001b[0;32m 7\u001b[0m callconv, cpu)\n\u001b[0;32m 8\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mparfors\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mparfor\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m ParforDiagnostics\n\u001b[0;32m 9\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01merrors\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m CompilerError\n", - "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\numba\\core\\cpu.py:11\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mbase\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m BaseContext\n\u001b[0;32m 9\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (utils, types, config, cgutils, callconv, codegen,\n\u001b[0;32m 10\u001b[0m externals, fastmathpass, intrinsics)\n\u001b[1;32m---> 11\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01moptions\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m TargetOptions, include_default_options\n\u001b[0;32m 12\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mruntime\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m rtsys\n\u001b[0;32m 13\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumba\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcompiler_lock\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m global_compiler_lock\n", - "File \u001b[1;32m:1354\u001b[0m, in \u001b[0;36m_find_and_load\u001b[1;34m(name, import_)\u001b[0m\n", - "File \u001b[1;32m:1325\u001b[0m, in \u001b[0;36m_find_and_load_unlocked\u001b[1;34m(name, import_)\u001b[0m\n", - "File \u001b[1;32m:929\u001b[0m, in \u001b[0;36m_load_unlocked\u001b[1;34m(spec)\u001b[0m\n", - "File \u001b[1;32m:990\u001b[0m, in \u001b[0;36mexec_module\u001b[1;34m(self, module)\u001b[0m\n", - "File \u001b[1;32m:1086\u001b[0m, in \u001b[0;36mget_code\u001b[1;34m(self, fullname)\u001b[0m\n", - "File \u001b[1;32m:1185\u001b[0m, in \u001b[0;36mget_data\u001b[1;34m(self, path)\u001b[0m\n", - "\u001b[1;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [ - "import os\n", - "os.environ[\"NUMBA_DISABLE_JIT\"]=\"1\"\n", - "\n", - "import warnings\n", - "from collections import namedtuple\n", - "\n", - "from numba import jit\n", - "from numba.core.errors import NumbaExperimentalFeatureWarning\n", - "\n", - "import numpy as np\n", - "from matplotlib import colors, pyplot\n", - "import ipywidgets\n", - "from IPython.display import display\n", - "\n", - "from open_atmos_jupyter_utils import show_plot\n", - "from open_atmos_jupyter_utils.show_anim import show_anim\n", - "\n", - "from PyMPDATA import Options, ScalarField, VectorField, Solver, Stepper\n", - "from PyMPDATA.boundary_conditions import Periodic\n", - "from PyMPDATA.impl.enumerations import IMPL_META_AND_DATA, META_AND_DATA_DATA, IMPL_BC\n", - "from PyMPDATA.impl.clock import clock" - ] - }, - { - "cell_type": "markdown", - "id": "8eb61fd1-2b1d-4eb1-afd8-551899676947", - "metadata": {}, - "source": [ - "## Parameters" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "813a03e0-9804-4ba2-8620-6835ec4074e2", - "metadata": {}, - "outputs": [], - "source": [ - "OPTIONS = Options(n_iters=2, infinite_gauge=True, nonoscillatory=True)\n", - "\n", - "SETUP = {\n", - " \"outfreq\": 1,\n", - " \"N\": 200,\n", - " \"M\": 200,\n", - " \"Tht_ref\": 300.,\n", - " \"Tht_dlt\": .5,\n", - " \"g\": 9.81,\n", - " \"r0\": 250.,\n", - " \"x0\": 1000,\n", - " \"y0\": 260,\n", - " \"dt\": 0.75,\n", - " \"prs_tol\": 1e-7,\n", - " \"k_iters\": 4,\n", - "}\n", - "\n", - "SETUP[\"nt\"] = int(600//SETUP[\"dt\"])\n", - "SETUP[\"err_tol\"] = SETUP[\"prs_tol\"] / SETUP[\"dt\"]\n", - "SETUP[\"grid\"] = SETUP[\"N\"], SETUP[\"M\"]\n", - "SETUP[\"dxy\"] = (2000/SETUP[\"N\"], 2000/SETUP[\"M\"])\n", - "SETUP[\"halo\"] = OPTIONS.n_halo\n", - "SETUP[\"grid_with_halo\"] = SETUP[\"N\"] + SETUP[\"halo\"]*2, SETUP[\"M\"] + SETUP[\"halo\"]*2\n", - "\n", - "SETUP = namedtuple(\"Setup\", SETUP.keys())(**SETUP)\n", - "\n", - "assert SETUP.dt * SETUP.nt == 600" - ] - }, - { - "cell_type": "markdown", - "id": "01add99e-16cf-47a6-8eef-8f55b7e3b088", - "metadata": {}, - "source": [ - "## initial condition" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7ce51f39-0c3a-47e6-84fd-6dc618a40394", - "metadata": {}, - "outputs": [], - "source": [ - "xi, yi = np.indices(SETUP.grid)\n", - "\n", - "mesh = np.full(SETUP.grid, fill_value=SETUP.Tht_ref, dtype=float)\n", - "mesh += np.where(\n", - " np.sqrt(\n", - " ((xi+1/2) * SETUP.dxy[0] - SETUP.x0)**2 +\n", - " ((yi+1/2) * SETUP.dxy[1] - SETUP.y0)**2\n", - " ) < SETUP.r0,\n", - " SETUP.Tht_dlt,\n", - " 0\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "c784fff7-1ad7-478c-8434-3e5815a3d30a", - "metadata": {}, - "source": [ - "## PyMPDATA setup" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "849497c5-8731-492e-843b-1a575d34e503", - "metadata": {}, - "outputs": [], - "source": [ - "_U, _W, _T = 0, 1, 2\n", - "\n", - "bcond = (Periodic(), Periodic())\n", - "field_ctor_kwargs = {'halo': SETUP.halo, 'boundary_conditions': bcond}\n", - "\n", - "advector = VectorField(data=(\n", - " np.zeros((SETUP.N+1, SETUP.M)),\n", - " np.zeros((SETUP.N, SETUP.M+1))\n", - "), **field_ctor_kwargs)\n", - "stepper = Stepper(options=OPTIONS, grid=SETUP.grid,n_threads = 1)\n", - "advector.assemble(stepper.traversals)\n", - "\n", - "def new_sf(g):\n", - " field = ScalarField(data=np.zeros(g), **field_ctor_kwargs)\n", - " field.assemble(stepper.traversals)\n", - " return field\n", - "\n", - "solver_ctor_kwargs = {'stepper': stepper, 'advector': advector}\n", - "solvers = {\n", - " _U: Solver(advectee=new_sf(SETUP.grid), **solver_ctor_kwargs),\n", - " _W: Solver(advectee=new_sf(SETUP.grid), **solver_ctor_kwargs),\n", - " _T: Solver(advectee=ScalarField(data=mesh, **field_ctor_kwargs), **solver_ctor_kwargs),\n", - "}\n", - "\n", - "ADVECTEE_DATA = tuple(\n", - " solvers[idx].advectee.data for idx in range(3)\n", - ")\n", - "\n", - "ADVECTOR_DATA = tuple(\n", - " datum for datum in advector.data\n", - ")\n", - "\n", - "ARRAYS = {\n", - " \"rhs_w\": np.zeros(SETUP.grid),\n", - " \"stash\": np.zeros((len(SETUP.grid), *SETUP.grid_with_halo)),\n", - " \"vip_rhs\": np.zeros((len(SETUP.grid), *SETUP.grid_with_halo)),\n", - " \"Phi\": np.zeros(SETUP.grid_with_halo),\n", - " \"tmp_uvw\": np.zeros((len(SETUP.grid), *SETUP.grid_with_halo)),\n", - " \"lap_tmp\": np.zeros((len(SETUP.grid), *SETUP.grid_with_halo)),\n", - " \"lap_err\": np.zeros(SETUP.grid),\n", - " \"err\": np.zeros(SETUP.grid_with_halo),\n", - " \"p_err\": np.zeros((SETUP.k_iters, *SETUP.grid_with_halo)),\n", - " \"lap_p_err\": np.zeros((SETUP.k_iters, *SETUP.grid)),\n", - "}\n", - "ARRAYS = namedtuple(\"Arrays\", ARRAYS.keys())(**ARRAYS)\n", - "\n", - "IDX = {\n", - " \"interior\": (slice(SETUP.halo, -SETUP.halo), slice(SETUP.halo, -SETUP.halo)),\n", - " \"grad_left\": (\n", - " (slice(SETUP.halo + 1, None if SETUP.halo==1 else (-SETUP.halo+1)), slice(SETUP.halo,-SETUP.halo)),\n", - " (slice(SETUP.halo,-SETUP.halo), slice(SETUP.halo+1,None if SETUP.halo==1 else (-SETUP.halo+1)))\n", - " ),\n", - " \"grad_right\": (\n", - " (slice(None if SETUP.halo==1 else (SETUP.halo-1),-SETUP.halo-1), slice(SETUP.halo,-SETUP.halo)),\n", - " (slice(SETUP.halo,-SETUP.halo), slice(None if SETUP.halo==1 else (SETUP.halo-1), -SETUP.halo-1))\n", - " ),\n", - " \"intrp_left\": ( \n", - " (slice(None, -1), slice(None, None)),\n", - " (slice(None, None), slice(None, -1)),\n", - " ),\n", - " \"intrp_right\": ( \n", - " (slice(1, None), slice(None, None)),\n", - " (slice(None, None), slice(1, None)),\n", - " )\n", - "}\n", - "IDX = namedtuple(\"Idx\", IDX.keys())(**IDX)" - ] - }, - { - "cell_type": "markdown", - "id": "615f8939-191e-4335-be45-1d6cc53a2223", - "metadata": {}, - "source": [ - "## JIT-compilable functions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c0ce0be0-346e-4074-9a01-72d635844903", - "metadata": {}, - "outputs": [], - "source": [ - "fill_halos_scalar = stepper.traversals._code[\"fill_halos_scalar\"]\n", - "\n", - "@jit(**OPTIONS.jit_flags)\n", - "def grad(psi, axis):\n", - " return (psi[IDX.grad_left[axis]] - psi[IDX.grad_right[axis]]) / 2 / SETUP.dxy[axis]\n", - " \n", - "@jit(**OPTIONS.jit_flags)\n", - "def calc_grad_Phi(arg, phi):\n", - " for k in (0,1):\n", - " arg[k][IDX.interior] = grad(phi, axis=k)\n", - "\n", - "@jit(**OPTIONS.jit_flags)\n", - "def data(impl):\n", - " return impl[IMPL_META_AND_DATA][META_AND_DATA_DATA]\n", - "\n", - "@jit(**OPTIONS.jit_flags)\n", - "def pressure_solver_loop_body(ARRAYS,converged):\n", - " tmp_den = [1.] * SETUP.k_iters\n", - " alpha = [1.] * SETUP.k_iters\n", - " for v in range(0, SETUP.k_iters):\n", - " tmp_den[v] = np.sum(ARRAYS.lap_p_err[v]**2)\n", - " if tmp_den[v] != 0:\n", - " beta = - np.dot(\n", - " ARRAYS.err[IDX.interior].ravel(),\n", - " ARRAYS.lap_p_err[v].ravel()\n", - " ) / tmp_den[v]\n", - " else:\n", - " beta = .25\n", - " ARRAYS.Phi[IDX.interior][:] += beta * ARRAYS.p_err[v][IDX.interior]\n", - " ARRAYS.err[IDX.interior][:] += beta * ARRAYS.lap_p_err[v]\n", - "\n", - " error = max(\n", - " abs(np.amax(ARRAYS.err[IDX.interior])),\n", - " abs(np.amin(ARRAYS.err[IDX.interior]))\n", - " )\n", - "\n", - " if error <= SETUP.err_tol: \n", - " converged = True\n", - "\n", - " ARRAYS.lap_err[:] = lap(ARRAYS.err,False,ARRAYS)\n", - "\n", - " for l in range(v):\n", - " if tmp_den[l] != 0:\n", - " alpha[l] = - np.dot(ARRAYS.lap_err.ravel(), ARRAYS.lap_p_err[l].ravel()) / tmp_den[l]\n", - " if v < SETUP.k_iters - 1:\n", - " ARRAYS.p_err[v + 1][IDX.interior][:] = ARRAYS.err[IDX.interior]\n", - " ARRAYS.lap_p_err[v + 1][:] = ARRAYS.lap_err\n", - " for l in range(v):\n", - " ARRAYS.p_err[v + 1][IDX.interior][:] += alpha[l] * ARRAYS.p_err[l][IDX.interior]\n", - " ARRAYS.lap_p_err[v + 1][:] += alpha[l] * ARRAYS.lap_p_err[l]\n", - " else:\n", - " ARRAYS.p_err[0][IDX.interior][:] = ARRAYS.err[IDX.interior][:] + alpha[0] * ARRAYS.p_err[0][IDX.interior]\n", - " ARRAYS.lap_p_err[0][:] = ARRAYS.lap_err[:] + alpha[0] * ARRAYS.lap_p_err[0]\n", - " for l in range(1, v+1):\n", - " ARRAYS.p_err[0][IDX.interior][:] += alpha[l] * ARRAYS.p_err[l][IDX.interior]\n", - " ARRAYS.lap_p_err[0][:] += alpha[l] * ARRAYS.lap_p_err[l]\n", - " return converged\n", - "\n", - "@jit(**OPTIONS.jit_flags)\n", - "def calc_gc_interpolate_in_space(ARRAYS,ADVECTOR_DATA):\n", - " for axis in (_U, _W):\n", - " ADVECTOR_DATA[axis][:] = SETUP.dt / SETUP.dxy[axis] * (\n", - " (\n", - " ARRAYS.stash[axis][IDX.intrp_right[axis]] - \n", - " ARRAYS.stash[axis][IDX.intrp_left[axis]]\n", - " ) / 2 + ARRAYS.stash[axis][IDX.intrp_left[axis]]\n", - " )\n", - "\n", - "@jit(**OPTIONS.jit_flags)\n", - "def ini_pressure(ARRAYS,ADVECTEE_DATA):\n", - " for k in (_U, _W):\n", - " ARRAYS.Phi[IDX.interior][:] -= 0.5 * np.power(ADVECTEE_DATA[k][IDX.interior][:], 2)\n", - " ARRAYS.Phi[IDX.interior][:] -= np.sum(ARRAYS.Phi[IDX.interior]) / (SETUP.N * SETUP.M)\n", - "\n", - "@jit(**OPTIONS.jit_flags)\n", - "def lap(Phi, err_init,ARRAYS): \n", - " xchng_pres_old(Phi)\n", - " calc_grad_Phi(ARRAYS.lap_tmp, Phi)\n", - "\n", - " if err_init:\n", - " for k in (_U, _W):\n", - " ARRAYS.lap_tmp[k][:] -= ARRAYS.tmp_uvw[k]\n", - "\n", - " for k in (_U, _W):\n", - " xchng_pres_old(ARRAYS.lap_tmp[k])\n", - " \n", - " return (\n", - " grad(ARRAYS.lap_tmp[0], axis=0) +\n", - " grad(ARRAYS.lap_tmp[1], axis=1)\n", - " )\n", - "\n", - "@jit(**OPTIONS.jit_flags)\n", - "def pressure_solver_loop_init(ARRAYS):\n", - " ARRAYS.p_err[0][IDX.interior][:] = ARRAYS.err[IDX.interior]\n", - " ARRAYS.lap_p_err[0][:] = lap(ARRAYS.p_err[0], False,ARRAYS)\n", - "\n", - "@jit(**OPTIONS.jit_flags)\n", - "def pressure_solver_update(ARRAYS,ADVECTEE_DATA):\n", - " for k in (_U, _W):\n", - " ARRAYS.tmp_uvw[k][:] = ADVECTEE_DATA[k]\n", - " ARRAYS.err[IDX.interior][:] = lap(ARRAYS.Phi, True,ARRAYS)\n", - " pressure_solver_loop_init(ARRAYS)\n", - "\n", - " iters, converged = 0, False\n", - " while not converged: \n", - " converged = pressure_solver_loop_body(ARRAYS,converged)\n", - " iters += 1\n", - " if iters > 10000:\n", - " raise ArithmeticError(\"stuck in pressure solver\")\n", - " \n", - " xchng_pres_old(ARRAYS.Phi)\n", - " calc_grad_Phi(ARRAYS.tmp_uvw, ARRAYS.Phi)\n", - "\n", - "@jit(**OPTIONS.jit_flags)\n", - "def calc_gc_extrapolate_in_time(ARRAYS,ADVECTEE_DATA):\n", - " for k in (_U, _W):\n", - " ARRAYS.stash[k][IDX.interior] = -.5 * ARRAYS.stash[k][IDX.interior] + 1.5 * ADVECTEE_DATA[k][IDX.interior]\n", - " ARRAYS.stash[k][IDX.interior] = -.5 * ARRAYS.stash[k][IDX.interior] + 1.5 * ADVECTEE_DATA[k][IDX.interior]\n", - " xchng_pres_old(ARRAYS.stash[k])\n", - "\n", - "@jit(**OPTIONS.jit_flags)\n", - "def fill_stash(ARRAYS,ADVECTEE_DATA):\n", - " for k in (_U, _W):\n", - " ARRAYS.stash[k][IDX.interior] = ADVECTEE_DATA[k][IDX.interior]\n", - " xchng_pres_old(ARRAYS.stash[k])\n", - " \n", - "@jit(**OPTIONS.jit_flags)\n", - "def xchng_pres_old(data):\n", - " data[0:SETUP.halo, :] = data[-2*SETUP.halo:-SETUP.halo,:]\n", - " data[-SETUP.halo:, :] = data[SETUP.halo:2*SETUP.halo, :]\n", - " data[:,0:SETUP.halo] = data[:,-2*SETUP.halo : -SETUP.halo]\n", - " data[:,-SETUP.halo:] = data[:,SETUP.halo : 2*SETUP.halo]\n", - "\n", - "@jit(**OPTIONS.jit_flags)\n", - "def vip_rhs_apply(ARRAYS,ADVECTEE_DATA):\n", - " for k in (_U, _W):\n", - " ADVECTEE_DATA[k][:] += 0.5 * SETUP.dt * ARRAYS.vip_rhs[k]\n", - " ARRAYS.vip_rhs[k][:] = 0\n", - "\n", - "@jit(**OPTIONS.jit_flags)\n", - "def apply_half_rhs(ARRAYS,ADVECTEE_DATA): \n", - " ADVECTEE_DATA[_W][IDX.interior] += ARRAYS.rhs_w * SETUP.dt/2\n", - "\n", - "@jit(**OPTIONS.jit_flags)\n", - "def finilize_rhs(ARRAYS,ADVECTEE_DATA):\n", - " for k in (_U, _W):\n", - " ARRAYS.vip_rhs[k][:] = -ADVECTEE_DATA[k]\n", - "\n", - "@jit(**OPTIONS.jit_flags)\n", - "def update_rhs(ARRAYS,ADVECTEE_DATA):\n", - " ARRAYS.rhs_w[:] = SETUP.g * (ADVECTEE_DATA[_T][IDX.interior] - SETUP.Tht_ref) / SETUP.Tht_ref\n", - "\n", - "@jit(**OPTIONS.jit_flags)\n", - "def pressure_solver_apply(ARRAYS,ADVECTEE_DATA):\n", - " for k in (_U, _W):\n", - " ADVECTEE_DATA[k][:] -= ARRAYS.tmp_uvw[k]\n", - " ARRAYS.vip_rhs[k][:] += ADVECTEE_DATA[k]\n", - " ARRAYS.vip_rhs[k][:] /= 0.5 * SETUP.dt\n", - "\n", - "\n", - "# note: all code below will be replaced by an implementation of PostStep hook referring to above methods\n", - "MPDATA_STEPPERS = tuple([\n", - " solvers[k]._Solver__stepper._Stepper__call for k in (_U, _W, _T)\n", - "])\n", - "\n", - "from PyMPDATA import solver\n", - "MPDATA_POST_STEP = solver.PostStepNull() \n", - "MPDATA_POST_ITER = solver.PostIterNull()\n", - "\n", - "from PyMPDATA.impl.meta import _Impl\n", - "\n", - "MPDATA_TRAVERSALS_DATA = tuple([\n", - " solvers[k]._Solver__stepper.traversals.data for k in (_U, _W, _T)\n", - "])\n", - "\n", - "MPDATA_FIELDS = tuple([\n", - " tuple([\n", - " _Impl(field=v.impl[IMPL_META_AND_DATA], bc=v.impl[IMPL_BC])\n", - " for v in solvers[k]._Solver__fields.values()\n", - " ]) for k in (_U, _W, _T)\n", - "])\n", - "\n", - "@jit(**OPTIONS.jit_flags)\n", - "def mpdata_advance(steppers, post_step, post_iter, fields, traversals_data):\n", - " n_steps = 1\n", - " mu_coeff = (0,0,0)\n", - " wall_time = 0\n", - " for k in (_U, _W, _T):\n", - " wall_time += steppers[k](\n", - " n_steps, \n", - " mu_coeff, \n", - " post_step,\n", - " post_iter,\n", - " *fields[k],\n", - " traversals_data[k]\n", - " )\n", - " return wall_time\n", - "@jit(**OPTIONS.jit_flags)\n", - "def sstep(ARRAYS,ADVECTOR_DATA, ADVECTEE_DATA,MPDATA_STEPPERS, MPDATA_POST_STEP, MPDATA_POST_ITER, MPDATA_FIELDS, MPDATA_TRAVERSALS_DATA):\n", - " t0 = clock()\n", - " calc_gc_extrapolate_in_time(ARRAYS, ADVECTEE_DATA) \n", - " calc_gc_interpolate_in_space(ARRAYS, ADVECTOR_DATA) \n", - " fill_stash(ARRAYS, ADVECTEE_DATA)\n", - " apply_half_rhs(ARRAYS, ADVECTEE_DATA)\n", - " vip_rhs_apply(ARRAYS, ADVECTEE_DATA)\n", - " mpdata_advance(MPDATA_STEPPERS, MPDATA_POST_STEP, MPDATA_POST_ITER, MPDATA_FIELDS, MPDATA_TRAVERSALS_DATA)\n", - " update_rhs(ARRAYS, ADVECTEE_DATA)\n", - " apply_half_rhs(ARRAYS, ADVECTEE_DATA)\n", - " finilize_rhs(ARRAYS, ADVECTEE_DATA)\n", - " pressure_solver_update(ARRAYS, ADVECTEE_DATA)\n", - " pressure_solver_apply(ARRAYS, ADVECTEE_DATA)\n", - " return clock()-t0" - ] - }, - { - "cell_type": "markdown", - "id": "229c52f6-8072-45fb-a0dd-335c7045583c", - "metadata": {}, - "source": [ - "## Memory allocations, initial condition, and simulation loop\n", - "Progress bar stays at 0 until all functions compile" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1052e101-e702-4bb7-8b3b-708bc7fe47aa", - "metadata": {}, - "outputs": [], - "source": [ - "%%time\n", - "progress = ipywidgets.FloatProgress(max=SETUP.nt, description=\"starting ...\")\n", - "display(progress)\n", - "\n", - "times = np.empty(SETUP.nt)\n", - "\n", - "with warnings.catch_warnings():\n", - " warnings.simplefilter(action=\"ignore\",category=NumbaExperimentalFeatureWarning)\n", - "\n", - " output = np.empty((SETUP.nt//SETUP.outfreq+1, *SETUP.grid))\n", - " for step in range(SETUP.nt + 1):\n", - " if step != 0:\n", - " times[step-1] = sstep(ARRAYS,ADVECTOR_DATA, ADVECTEE_DATA,MPDATA_STEPPERS, MPDATA_POST_STEP, \n", - " MPDATA_POST_ITER, MPDATA_FIELDS, MPDATA_TRAVERSALS_DATA)\n", - " progress.description = 'running ...'\n", - " if step % SETUP.outfreq == 0:\n", - " output[step//SETUP.outfreq] = ADVECTEE_DATA[_T][IDX.interior]\n", - " progress.value = step\n", - " \n", - "print(f\"{np.min(times)=} {np.mean(times)=} {np.max(times)=}\")\n", - "with open(\"output.npy\", 'wb') as f:\n", - " np.save(f, np.array(output))" - ] - }, - { - "cell_type": "markdown", - "id": "2ab14876-a416-4ba8-bd14-eeb6abad82ef", - "metadata": {}, - "source": [ - "## Visualisation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1ab53227-a29b-4df8-86d7-77c4fd1e5584", - "metadata": {}, - "outputs": [], - "source": [ - "freq = int(10)\n", - "progress = ipywidgets.FloatProgress(max=len(output)/freq)\n", - "\n", - "def plot(step,plotflag=False):\n", - " data = output[step]\n", - " grid = data.shape\n", - " x, y = np.indices(grid)\n", - " colorticks = np.linspace(299.95, 300.55, 7, endpoint=True)\n", - " cmap = colors.ListedColormap([\"white\", \"purple\", \"blue\", \"green\",\"orange\",\"yellow\"])\n", - "\n", - " fig = pyplot.figure(figsize=(5,6))\n", - " pyplot.title(\"t/dt=\"+str(step))\n", - " pyplot.xlabel(\"x/dx\")\n", - " pyplot.ylabel(\"y/dy\")\n", - " pyplot.contour(x+1/2, y+1/2, data, levels=colorticks[1:], colors='k',linewidths=0.3)\n", - " pyplot.imshow(data.T, origin=\"lower\", extent=(0, grid[0], 0, grid[1]),\n", - " cmap=cmap, vmin=colorticks[0], vmax=colorticks[-1])\n", - " pyplot.grid()\n", - " cax = pyplot.axes([0.95, 0.262, 0.05,0.466])\n", - " if plotflag:\n", - " pyplot.colorbar(ticks=colorticks,label = \"Temperature[K]\",cax = cax)\n", - " else:\n", - " pyplot.colorbar(ticks=colorticks,label = \"Temperature[K]\")\n", - " progress.value += 1\n", - " return fig\n", - " \n", - "display(progress)\n", - "show_anim(plot, frame_range=range(len(output))[::freq])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e19fba6c-c5b1-43ba-8f99-a23222e0afd1", - "metadata": {}, - "outputs": [], - "source": [ - "show_plot(fig=plot(0,True))\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6ea87f1c-e52a-4e41-a594-5ad1f13c51d8", - "metadata": {}, - "outputs": [], - "source": [ - "show_plot(fig=plot(800,True))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "22a790d5-89e6-43d8-986b-d04a50c842ba", - "metadata": {}, - "outputs": [], - "source": [ - "print(times)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2c52ab6e-2c89-4686-8a6b-43e253d6011f", - "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.12.0" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/PyMPDATA_examples/Jaruga_et_al_2015/fig19.ipynb b/examples/PyMPDATA_examples/Jaruga_et_al_2015/fig19.ipynb index be1f33b3..2f94106d 100644 --- a/examples/PyMPDATA_examples/Jaruga_et_al_2015/fig19.ipynb +++ b/examples/PyMPDATA_examples/Jaruga_et_al_2015/fig19.ipynb @@ -53,7 +53,7 @@ "outputs": [], "source": [ "import os\n", - "#os.environ[\"NUMBA_DISABLE_JIT\"]=\"1\"\n", + "os.environ[\"NUMBA_DISABLE_JIT\"]=\"0\"\n", "\n", "import warnings\n", "from collections import namedtuple\n", @@ -247,9 +247,9 @@ "\n", "ARRAYS, ADVECTOR_DATA, ADVECTEE_DATA, solvers = initialize()\n", "# note: all code below will be replaced by an implementation of PostStep hook referring to above methods\n", - "MPDATA_STEPPERS = tuple([\n", - " solvers[k]._Solver__stepper._Stepper__call for k in (_U, _W, _T)\n", - "])\n", + "MPDATA_STEPPERS = tuple(\n", + " solvers[k]._Solver__stepper._Stepper__call for k in (_U, _W, _T)#pylint: disable=protected-access\n", + ")\n", "\n", "from PyMPDATA import solver\n", "MPDATA_POST_STEP = solver.PostStepNull() \n", @@ -257,16 +257,16 @@ "\n", "from PyMPDATA.impl.meta import _Impl\n", "\n", - "MPDATA_TRAVERSALS_DATA = tuple([\n", - " solvers[k]._Solver__stepper.traversals.data for k in (_U, _W, _T)\n", - "])\n", + "MPDATA_TRAVERSALS_DATA = tuple(\n", + " solvers[k]._Solver__stepper.traversals.data for k in (_U, _W, _T)#pylint: disable=protected-access\n", + ")\n", "\n", - "MPDATA_FIELDS = tuple([\n", - " tuple([\n", - " _Impl(field=v.impl[IMPL_META_AND_DATA], bc=v.impl[IMPL_BC])\n", - " for v in solvers[k]._Solver__fields.values()\n", - " ]) for k in (_U, _W, _T)\n", - "])" + "MPDATA_FIELDS = tuple(\n", + " tuple(\n", + " _Impl(field=v.impl[IMPL_META_AND_DATA], bc=v.impl[IMPL_BC])#pylint: disable=protected-access\n", + " for v in solvers[k]._Solver__fields.values()#pylint: disable=protected-access\n", + " ) for k in (_U, _W, _T)\n", + ")" ] }, { @@ -284,7 +284,7 @@ "metadata": {}, "outputs": [], "source": [ - "fill_halos_scalar = stepper.traversals._code[\"fill_halos_scalar\"]\n", + "fill_halos_scalar = stepper.traversals._code[\"fill_halos_scalar\"]#pylint: disable=protected-access\n", "\n", "@jit(**OPTIONS.jit_flags)\n", "def grad(psi, axis):\n", @@ -503,9 +503,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "np.min(times)=0.0 np.mean(times)=356736821801.375 np.max(times)=822045740000.0\n", - "CPU times: total: 13min 32s\n", - "Wall time: 15min 53s\n" + "np.min(times)=0.0 np.mean(times)=591214069245.125 np.max(times)=1542881119200.0\n", + "CPU times: total: 22min 23s\n", + "Wall time: 27min 56s\n" ] } ], @@ -539,7 +539,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "355f7fce056a4481a58269546f5c0a39", + "model_id": "0af5c6af735a4b87a27f19193d01b4f5", "version_major": 2, "version_minor": 0 }, @@ -565,12 +565,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "b099c274ca68417dbdd2ec6b5f67128b", + "model_id": "3a717d6c9b3d483ba469b19892dd0080", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "HTML(value=\".\\\\tmpbf2uqifb.gif
\")" + "HTML(value=\".\\\\tmpd23cl007.gif
\")" ] }, "metadata": {}, @@ -626,7 +626,7 @@ " \n", " \n", " \n", - " 2025-01-14T23:35:37.028736\n", + " 2025-01-27T12:01:56.043589\n", " image/svg+xml\n", " \n", " \n", @@ -657,25 +657,25 @@ "z\n", "\" style=\"fill: #ffffff\"/>\n", " \n", - " \n", + " \n", " \n", + "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\" id=\"imagea7a59329f5\" transform=\"scale(1 -1) translate(0 -223.2)\" x=\"58.471875\" y=\"-25.965375\" width=\"223.2\" height=\"223.2\"/>\n", " \n", " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#p1708d63023)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -712,11 +712,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1708d63023)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -758,11 +758,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1708d63023)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -794,11 +794,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1708d63023)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -814,11 +814,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1708d63023)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -921,16 +921,16 @@ " \n", " \n", + "\" clip-path=\"url(#p1708d63023)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -944,11 +944,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1708d63023)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -963,11 +963,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1708d63023)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -983,11 +983,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1708d63023)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1003,11 +1003,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1708d63023)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1247,7 +1247,7 @@ "L 143.421129 227.400599 \n", "L 142.421726 226.401196 \n", "z\n", - "\" clip-path=\"url(#p3bec53352c)\" style=\"fill: none; stroke: #000000; stroke-width: 0.3\"/>\n", + "\" clip-path=\"url(#p1708d63023)\" style=\"fill: none; stroke: #000000; stroke-width: 0.3\"/>\n", " \n", + "\" clip-path=\"url(#p1708d63023)\" style=\"fill: none; stroke: #000000; stroke-width: 0.3\"/>\n", " \n", + "\" clip-path=\"url(#p1708d63023)\" style=\"fill: none; stroke: #000000; stroke-width: 0.3\"/>\n", " \n", + "\" clip-path=\"url(#p1708d63023)\" style=\"fill: none; stroke: #000000; stroke-width: 0.3\"/>\n", " \n", - " \n", + "\" clip-path=\"url(#p1708d63023)\" style=\"fill: none; stroke: #000000; stroke-width: 0.3\"/>\n", + " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2a97fe929b)\" style=\"fill: #ffffff\"/>\n", " \n", + "\" clip-path=\"url(#p2a97fe929b)\" style=\"fill: #993399\"/>\n", " \n", + "\" clip-path=\"url(#p2a97fe929b)\" style=\"fill: #00ccff\"/>\n", " \n", + "\" clip-path=\"url(#p2a97fe929b)\" style=\"fill: #66cc00\"/>\n", " \n", + "\" clip-path=\"url(#p2a97fe929b)\" style=\"fill: #fc8727\"/>\n", " \n", + "\" clip-path=\"url(#p2a97fe929b)\" style=\"fill: #ffff00\"/>\n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2228,7 +2228,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2280,7 +2280,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2298,7 +2298,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2316,7 +2316,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2334,7 +2334,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2373,7 +2373,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2625,10 +2625,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2644,12 +2644,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "ea0f651c4b794a8fb14ea1d0bde255e3", + "model_id": "4ad15c2aff9e4790bae40f4fdbc5ae8e", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "HBox(children=(HTML(value=\".\\\\tmpwxi8h680.pdf
\"), HTML(val…" + "HBox(children=(HTML(value=\".\\\\tmpsjwddubr.pdf
\"), HTML(val…" ] }, "metadata": {}, @@ -2677,7 +2677,7 @@ " \n", " \n", " \n", - " 2025-01-14T23:35:37.608201\n", + " 2025-01-27T12:01:57.124534\n", " image/svg+xml\n", " \n", " \n", @@ -2708,25 +2708,25 @@ "z\n", "\" style=\"fill: #ffffff\"/>\n", "
\n", - " \n", + " \n", " \n", + "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cYQNiCNsQBxhA+IIGxBH2IA4wgbEETYgjrABcYQNiCNsQBxhA+IIGxBH2IA4wgbEETYgjrABcYQNiCNsQBxhA+IIGxBH2IA4wgbEETYgjrABcYQNiCNsQBxhA+IIGxBH2IA4wgbEETYgjrABcYQNiCNsQBxhA+IIGxBH2IA4wgbEETYgjrABcYQNiCNsQBxhA+IIGxBH2IA4wgbEETYgjrABcYQNiCNsQBxhA+IIGxBH2IA4wgbEETYgjrABcYQNiCNsQBxhA+IIGxBH2IA4wgbEETYgjrABcYQNiCNsQBxhA+IIGxBH2IA4wgbEETYgjrABcYQNiCNsQBxhA+IIGxBH2IA4wgbEETYgjrABcYQNiCNsQBxhA+IIGxBH2IA4wgbEETYgjrABcYQNiCNsQBxhA+IIGxBH2IA4wgbEETYgjrABcYQNiCNsQBxhA+IIGxBH2IA4wgbEETYgjrABcYQNiCNsQBxhA+IIGxBH2IA4wgbEETYgjrABcYQNiCNsQBxhA+IIGxBH2IA4wgbEETYgjrABcYQNiCNsQBxhA+IIGxBH2IA4wgbEETYgjrABcYQNiCNsQBxhA+IIGxBH2IA4wgbE+T9CAJPHKhU5AgAAAABJRU5ErkJggg==\" id=\"image40d93ffb23\" transform=\"scale(1 -1) translate(0 -223.2)\" x=\"58.471875\" y=\"-25.965375\" width=\"223.2\" height=\"223.2\"/>\n", " \n", " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3d4e041663)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2763,11 +2763,11 @@ " \n", " \n", + "\" clip-path=\"url(#p3d4e041663)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2809,11 +2809,11 @@ " \n", " \n", + "\" clip-path=\"url(#p3d4e041663)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2845,11 +2845,11 @@ " \n", " \n", + "\" clip-path=\"url(#p3d4e041663)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2865,11 +2865,11 @@ " \n", " \n", + "\" clip-path=\"url(#p3d4e041663)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2972,16 +2972,16 @@ " \n", " \n", + "\" clip-path=\"url(#p3d4e041663)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2995,11 +2995,11 @@ " \n", " \n", + "\" clip-path=\"url(#p3d4e041663)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3014,11 +3014,11 @@ " \n", " \n", + "\" clip-path=\"url(#p3d4e041663)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3034,11 +3034,11 @@ " \n", " \n", + "\" clip-path=\"url(#p3d4e041663)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3054,11 +3054,11 @@ " \n", " \n", + "\" clip-path=\"url(#p3d4e041663)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3460,7 +3460,7 @@ "L 130.095756 191.162872 \n", "L 129.965763 190.866868 \n", "z\n", - "\" clip-path=\"url(#pab2dd244fe)\" style=\"fill: none; stroke: #000000; stroke-width: 0.3\"/>\n", + "\" clip-path=\"url(#p3d4e041663)\" style=\"fill: none; stroke: #000000; stroke-width: 0.3\"/>\n", " \n", + "\" clip-path=\"url(#p3d4e041663)\" style=\"fill: none; stroke: #000000; stroke-width: 0.3\"/>\n", " \n", + "\" clip-path=\"url(#p3d4e041663)\" style=\"fill: none; stroke: #000000; stroke-width: 0.3\"/>\n", " \n", + "\" clip-path=\"url(#p3d4e041663)\" style=\"fill: none; stroke: #000000; stroke-width: 0.3\"/>\n", " \n", - " \n", + "\" clip-path=\"url(#p3d4e041663)\" style=\"fill: none; stroke: #000000; stroke-width: 0.3\"/>\n", + " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#p554a595a31)\" style=\"fill: #ffffff\"/>\n", " \n", + "\" clip-path=\"url(#p554a595a31)\" style=\"fill: #993399\"/>\n", " \n", + "\" clip-path=\"url(#p554a595a31)\" style=\"fill: #00ccff\"/>\n", " \n", + "\" clip-path=\"url(#p554a595a31)\" style=\"fill: #66cc00\"/>\n", " \n", + "\" clip-path=\"url(#p554a595a31)\" style=\"fill: #fc8727\"/>\n", " \n", + "\" clip-path=\"url(#p554a595a31)\" style=\"fill: #ffff00\"/>\n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5152,7 +5152,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5204,7 +5204,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5222,7 +5222,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5240,7 +5240,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5258,7 +5258,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5276,7 +5276,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5528,10 +5528,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5547,12 +5547,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "7fb10c776ad24cbb849d494ad5e3c2b5", + "model_id": "7cbfc6e8e4be4be08504996840ea6dcb", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "HBox(children=(HTML(value=\".\\\\tmp23wbb2p1.pdf
\"), HTML(val…" + "HBox(children=(HTML(value=\".\\\\tmps1w037gl.pdf
\"), HTML(val…" ] }, "metadata": {}, @@ -5580,7 +5580,7 @@ " \n", " \n", " \n", - " 2025-01-14T23:35:38.160830\n", + " 2025-01-27T12:01:57.665533\n", " image/svg+xml\n", " \n", " \n", @@ -5611,25 +5611,25 @@ "z\n", "\" style=\"fill: #ffffff\"/>\n", "
\n", - " \n", + " \n", " \n", + "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\" id=\"image6e99ff0fc1\" transform=\"scale(1 -1) translate(0 -223.2)\" x=\"58.471875\" y=\"-25.965375\" width=\"223.2\" height=\"223.2\"/>\n", " \n", " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa3b4035c02)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5666,11 +5666,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa3b4035c02)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5712,11 +5712,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa3b4035c02)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5748,11 +5748,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa3b4035c02)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5768,11 +5768,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa3b4035c02)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5875,16 +5875,16 @@ " \n", " \n", + "\" clip-path=\"url(#pa3b4035c02)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5898,11 +5898,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa3b4035c02)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5917,11 +5917,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa3b4035c02)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5937,11 +5937,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa3b4035c02)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5957,11 +5957,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa3b4035c02)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7028,7 +7028,7 @@ "L 188.889875 114.245972 \n", "L 187.839039 114.103848 \n", "L 187.512614 114.245972 \n", - "\" clip-path=\"url(#pac8003d209)\" style=\"fill: none; stroke: #000000; stroke-width: 0.3\"/>\n", + "\" clip-path=\"url(#pa3b4035c02)\" style=\"fill: none; stroke: #000000; stroke-width: 0.3\"/>\n", " \n", + "\" clip-path=\"url(#pa3b4035c02)\" style=\"fill: none; stroke: #000000; stroke-width: 0.3\"/>\n", " \n", + "\" clip-path=\"url(#pa3b4035c02)\" style=\"fill: none; stroke: #000000; stroke-width: 0.3\"/>\n", " \n", + "\" clip-path=\"url(#pa3b4035c02)\" style=\"fill: none; stroke: #000000; stroke-width: 0.3\"/>\n", " \n", - " \n", + "\" clip-path=\"url(#pa3b4035c02)\" style=\"fill: none; stroke: #000000; stroke-width: 0.3\"/>\n", + " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa7692bd33d)\" style=\"fill: #ffffff\"/>\n", " \n", + "\" clip-path=\"url(#pa7692bd33d)\" style=\"fill: #993399\"/>\n", " \n", + "\" clip-path=\"url(#pa7692bd33d)\" style=\"fill: #00ccff\"/>\n", " \n", + "\" clip-path=\"url(#pa7692bd33d)\" style=\"fill: #66cc00\"/>\n", " \n", + "\" clip-path=\"url(#pa7692bd33d)\" style=\"fill: #fc8727\"/>\n", " \n", + "\" clip-path=\"url(#pa7692bd33d)\" style=\"fill: #ffff00\"/>\n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -10662,7 +10662,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -10714,7 +10714,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -10732,7 +10732,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -10750,7 +10750,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -10768,7 +10768,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -10807,7 +10807,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11059,10 +11059,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11078,12 +11078,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "7f57d758e688441688714e214fced6ac", + "model_id": "5bea6dd7500a43f6b77995e5c9f905ac", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "HBox(children=(HTML(value=\".\\\\tmpbop4tf2u.pdf
\"), HTML(val…" + "HBox(children=(HTML(value=\".\\\\tmpdtj1wi78.pdf
\"), HTML(val…" ] }, "metadata": {}, @@ -11093,14 +11093,6 @@ "source": [ "show_plot(fig=plot(800,True))" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3a107f02-003e-4995-8f08-72181a252580", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": {