diff --git a/docs/Makefile b/docs/Makefile
index c0618dfc..2811ca1a 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -7,15 +7,15 @@ SPHINXBUILD ?= sphinx-build
SPHINXPROJ = shenfun
SOURCEDIR = source
BUILDDIR = build
-DEMO = Poisson/poisson.rst \
- KleinGordon/kleingordon.rst \
- Poisson3D/poisson3d.rst \
+DEMO = Poisson/poisson.ipynb \
+ KleinGordon/kleingordon.ipynb \
+ Poisson3D/poisson3d.ipynb \
PolarHelmholtz/polarhelmholtz.ipynb \
SphereHelmholtz/sphericalhelmholtz.ipynb \
- KuramatoSivashinsky/kuramatosivashinsky.rst \
- Stokes/stokes.rst \
- DrivenCavity/drivencavity.rst \
- RayleighBenard/rayleighbenard.rst \
+ KuramatoSivashinsky/kuramatosivashinsky.ipynb \
+ Stokes/stokes.ipynb \
+ DrivenCavity/drivencavity.ipynb \
+ RayleighBenard/rayleighbenard.ipynb \
Functions/functions.ipynb \
Integration/surfaceintegration.ipynb \
Moebius/moebius.ipynb \
@@ -50,24 +50,13 @@ help:
./recite.sh $(notdir $@)
%.ipynb:
- doconce format ipynb demos/$(basename $@).do.txt
- python add_metadata.py demos/$(basename $@).ipynb
jupyter nbconvert --inplace --execute demos/${basename $@}.ipynb
cp demos/$(basename $@).ipynb source/
%.ipynb2:
- doconce format ipynb demos/$(basename $@).do.txt
- python add_metadata.py demos/$(basename $@).ipynb
jupyter nbconvert --inplace --clear-output demos/${basename $@}.ipynb
- #jupyter nbconvert --inplace --execute demos/${basename $@}.ipynb
- doconce subst 'XXX' ' ' demos/$(basename $@).ipynb
- doconce subst "
" "a>" demos/$(basename $@).ipynb
- #doconce subst '' '' demos/$(basename $@).ipynb
- #python add_metadata.py demos/$(basename $@).ipynb
cp demos/$(basename $@).ipynb ../../shenfun-demos/content/
- cp demos/$(basename $@).ipynb notebooks/
-
+
publish:
cd demos && publish export papers.bib && cd ..
cp demos/papers.bib source/
diff --git a/docs/demos/DrivenCavity/drivencavity.ipynb b/docs/demos/DrivenCavity/drivencavity.ipynb
new file mode 100644
index 00000000..e04f2391
--- /dev/null
+++ b/docs/demos/DrivenCavity/drivencavity.ipynb
@@ -0,0 +1,1517 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "20be7199",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "\n",
+ "# Demo - Lid driven cavity\n",
+ "**Mikael Mortensen** (email: `mikaem@math.uio.no`), Department of Mathematics, University of Oslo.\n",
+ "\n",
+ "Date: **May 6, 2019**\n",
+ "\n",
+ "**Summary.** The lid driven cavity is a classical benchmark for Navier Stokes solvers.\n",
+ "This is a demonstration of how the Python module [shenfun](https://github.com/spectralDNS/shenfun) can be used to solve the lid\n",
+ "driven cavity problem with full spectral accuracy using a mixed (coupled) basis\n",
+ "in a 2D tensor product domain. The demo also shows how to use mixed\n",
+ "tensor product spaces for vector valued equations. Note that the regular\n",
+ "lid driven cavity, where the top wall has constant velocity and the\n",
+ "remaining three walls are stationary, has a singularity at the two\n",
+ "upper corners, where the velocity is discontinuous.\n",
+ "Due to their global nature, spectral methods\n",
+ "are usually not very good at handling problems with discontinuities, and\n",
+ "for this reason we will also look at a regularized lid driven cavity,\n",
+ "where the top lid moves according to $(1-x)^2(1+x)^2$, thus removing\n",
+ "the corner discontinuities.\n",
+ "\n",
+ "\n",
+ "\n",
+ "
\n",
+ "\n",
+ "
Figure 1: Velocity vectors for the lid driven cavity at Reynolds number 100.
\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ffa812f1",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Navier Stokes equations\n",
+ "
\n",
+ "\n",
+ "The nonlinear steady Navier Stokes equations are given in strong form as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "853e2f60",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\begin{align*}\n",
+ "\\nu \\nabla^2 \\boldsymbol{u} - \\nabla p &= \\nabla \\cdot \\boldsymbol{u} \\boldsymbol{u} \\quad \\text{in } \\Omega , \\\\ \n",
+ "\\nabla \\cdot \\boldsymbol{u} &= 0 \\quad \\text{in } \\Omega, \\\\ \n",
+ "\\int_{\\Omega} p dx &= 0, \\\\ \n",
+ "\\boldsymbol{u}(x, y=1) = (1, 0) \\, &\\text{ or }\\, \\boldsymbol{u}(x, y=1) = ((1-x)^2(1+x)^2, 0), \\\\ \n",
+ "\\boldsymbol{u}(x, y=-1) &= (0, 0), \\\\ \n",
+ "\\boldsymbol{u}(x=\\pm 1, y) &= (0, 0),\n",
+ "\\end{align*}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "282c8f88",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\boldsymbol{u}, p$ and $\\nu$ are, respectively, the\n",
+ "fluid velocity vector, pressure and kinematic viscosity. The domain\n",
+ "$\\Omega = (-1, 1)^2$ and the nonlinear term $\\boldsymbol{u} \\boldsymbol{u}$ is the\n",
+ "outer product of vector $\\boldsymbol{u}$ with itself. Note that the final\n",
+ "$\\int_{\\Omega} p dx = 0$ is there because there is no Dirichlet boundary\n",
+ "condition on the pressure and the system of equations would otherwise be\n",
+ "ill conditioned.\n",
+ "\n",
+ "We want to solve these steady nonlinear Navier Stokes equations with the Galerkin\n",
+ "method, using the [shenfun](https://github.com/spectralDNS/shenfun) Python\n",
+ "package. The first thing we need to do then is to import all of shenfun's\n",
+ "functionality"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ab478fd9",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:01.761472Z",
+ "iopub.status.busy": "2024-05-24T12:37:01.761132Z",
+ "iopub.status.idle": "2024-05-24T12:37:02.592257Z",
+ "shell.execute_reply": "2024-05-24T12:37:02.591704Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "%matplotlib inline\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "from shenfun import *"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9ae78d5e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that MPI for Python ([mpi4py](https://bitbucket.org/mpi4py/mpi4py))\n",
+ "is a requirement for shenfun, but the current solver cannot be used with more\n",
+ "than one processor."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a178b88b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Tensor product spaces\n",
+ "
\n",
+ "\n",
+ "With the Galerkin method we need function spaces for both velocity and\n",
+ "pressure, as well as for the\n",
+ "nonlinear right hand side. A Dirichlet space will be used for velocity,\n",
+ "whereas there is no boundary restriction on the pressure space. For both\n",
+ "two-dimensional spaces we will use one basis function for the $x$-direction,\n",
+ "$\\mathcal{X}_k(x)$, and one for the $y$-direction, $\\mathcal{Y}_l(y)$. And\n",
+ "then we create two-dimensional basis functions like"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "027c6861",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "v_{kl}(x, y) = \\mathcal{X}_k(x) \\mathcal{Y}_l(y), \\label{eq:nstestfunction} \\tag{1}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e5e81b40",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and solutions (trial functions) as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "481b9ff7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " u(x, y) = \\sum_{k}\\sum_{l} \\hat{u}_{kl} v_{kl}(x, y). \\label{eq:nstrialfunction} \\tag{2}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7d65380f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "For the homogeneous Dirichlet boundary condition the basis functions\n",
+ "$\\mathcal{X}_k(x)$ and $\\mathcal{Y}_l(y)$ are chosen as composite\n",
+ "Legendre polynomials (we could also use Chebyshev):"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "182499a2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\mathcal{X}_k(x) = L_k(x) - L_{k+2}(x), \\quad \\forall \\, k \\in \\boldsymbol{k}^{N_0-2}, \\label{eq:D0} \\tag{3} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "dbf64c5f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\mathcal{Y}_l(y) = L_l(y) - L_{l+2}(y), \\quad \\forall \\, l \\in \\boldsymbol{l}^{N_1-2}, \\label{eq:D1} \\tag{4}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b5c336dd",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\boldsymbol{k}^{N_0-2} = (0, 1, \\ldots, N_0-3)$, $\\boldsymbol{l}^{N_1-2} = (0, 1, \\ldots, N_1-3)$\n",
+ "and $N = (N_0, N_1)$ is the number\n",
+ "of quadrature points in each direction. Note that $N_0$ and $N_1$ do not need\n",
+ "to be the same. The basis funciton ([3](#eq:D0)) satisfies\n",
+ "the homogeneous Dirichlet boundary conditions at $x=\\pm 1$ and ([4](#eq:D1)) the same\n",
+ "at $y=\\pm 1$. As such, the basis function $v_{kl}(x, y)$ satisfies the homogeneous Dirichlet boundary\n",
+ "condition for the entire domain.\n",
+ "\n",
+ "With shenfun we create these homogeneous spaces, $D_0^{N_0}(x)=\\text{span}\\{L_k-L_{k+2}\\}_{k=0}^{N_0-2}$ and\n",
+ "$D_0^{N_1}(y)=\\text{span}\\{L_l-L_{l+2}\\}_{l=0}^{N_1-2}$ as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f1e8664d",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:02.595414Z",
+ "iopub.status.busy": "2024-05-24T12:37:02.595158Z",
+ "iopub.status.idle": "2024-05-24T12:37:02.619319Z",
+ "shell.execute_reply": "2024-05-24T12:37:02.618530Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "N = (45, 45)\n",
+ "family = 'Legendre' # or use 'Chebyshev'\n",
+ "quad = 'GL' # for Chebyshev use 'GC' or 'GL'\n",
+ "D0X = FunctionSpace(N[0], family, quad=quad, bc=(0, 0))\n",
+ "D0Y = FunctionSpace(N[1], family, quad=quad, bc=(0, 0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "53084c3b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The spaces are here the same, but we will use `D0X` in the $x$-direction and\n",
+ "`D0Y` in the $y$-direction. But before we use these bases in\n",
+ "tensor product spaces, they remain identical as long as $N_0 = N_1$.\n",
+ "\n",
+ "Special attention is required by the moving lid. To get a solution\n",
+ "with nonzero boundary condition at $y=1$ we need to add one more basis function\n",
+ "that satisfies that solution. In general, a nonzero boundary condition\n",
+ "can be added on both sides of the domain using the following basis"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "68d54031",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\mathcal{Y}_l(y) = L_l(y) - L_{l+2}(y), \\quad \\forall \\, l \\in \\boldsymbol{l}^{N_1-2}. \n",
+ "\\label{_auto1} \\tag{5}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f2e3221a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\mathcal{Y}_{N_1-2}(y) = (L_0+L_1)/2 \\quad \\left(=(1+y)/2\\right), \n",
+ "\\label{_auto2} \\tag{6}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "de119ec2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\mathcal{Y}_{N_1-1}(y) = (L_0-L_1)/2 \\quad \\left(=(1-y)/2\\right).\n",
+ "\\label{_auto3} \\tag{7}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7ac8f98b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "And then the unknown component $N_1-2$ decides the value at $y=1$, whereas\n",
+ "the unknown at $N_1-1$ decides the value at $y=-1$. Here we only need to\n",
+ "add the $N_1-2$ component, but for generality this is implemented in shenfun\n",
+ "using both additional basis functions. We create the space\n",
+ "$D_1^{N_1}(y)=\\text{span}\\{\\mathcal{Y}_l(y)\\}_{l=0}^{N_1-1}$ as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "496fa575",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:02.625766Z",
+ "iopub.status.busy": "2024-05-24T12:37:02.624855Z",
+ "iopub.status.idle": "2024-05-24T12:37:02.630379Z",
+ "shell.execute_reply": "2024-05-24T12:37:02.628970Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "D1Y = FunctionSpace(N[1], family, quad=quad, bc=(0, 1))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "53280b56",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where `bc=(0, 1)` fixes the values for $y=-1$ and $y=1$, respectively.\n",
+ "For a regularized lid driven cavity the velocity of the top lid is\n",
+ "$(1-x)^2(1+x)^2$ and not unity. To implement this boundary condition\n",
+ "instead, we can make use of [sympy](https://www.sympy.org) and\n",
+ "quite straight forward do"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "522a6cb6",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:02.636290Z",
+ "iopub.status.busy": "2024-05-24T12:37:02.635531Z",
+ "iopub.status.idle": "2024-05-24T12:37:02.639151Z",
+ "shell.execute_reply": "2024-05-24T12:37:02.638734Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "import sympy\n",
+ "x = sympy.symbols('x')\n",
+ "#D1Y = FunctionSpace(N[1], family, quad=quad, bc=(0, (1-x)**2*(1+x)**2))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "eeab4c31",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Uncomment the last line to run the regularized boundary conditions.\n",
+ "Otherwise, there is no difference at all between the regular and the\n",
+ "regularized lid driven cavity implementations.\n",
+ "\n",
+ "The pressure basis that comes with no restrictions for the boundary is a\n",
+ "little trickier. The reason for this has to do with\n",
+ "inf-sup stability. The obvious choice of basis functions are the\n",
+ "regular Legendre polynomials $L_k(x)$ in $x$ and $L_l(y)$ in the\n",
+ "$y$-directions. The problem is that for the natural choice of\n",
+ "$(k, l) \\in \\boldsymbol{k}^{N_0} \\times \\boldsymbol{l}^{N_1}$\n",
+ "there are nullspaces and the problem is not well-defined. It turns out\n",
+ "that the proper choice for the pressure basis is simply the regular\n",
+ "Legendre basis functions, but for\n",
+ "$(k, l) \\in \\boldsymbol{k}^{N_0-2} \\times \\boldsymbol{l}^{N_1-2}$.\n",
+ "The bases $P^{N_0}(x)=\\text{span}\\{L_k(x)\\}_{k=0}^{N_0-3}$ and\n",
+ "$P^{N_1}(y)=\\text{span}\\{L_l(y)\\}_{l=0}^{N_1-3}$ are created as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "395ae9db",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:02.641461Z",
+ "iopub.status.busy": "2024-05-24T12:37:02.641396Z",
+ "iopub.status.idle": "2024-05-24T12:37:02.646911Z",
+ "shell.execute_reply": "2024-05-24T12:37:02.645999Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "PX = FunctionSpace(N[0], family, quad=quad)\n",
+ "PY = FunctionSpace(N[1], family, quad=quad)\n",
+ "PX.slice = lambda: slice(0, N[0]-2)\n",
+ "PY.slice = lambda: slice(0, N[1]-2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b046d361",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that we still use these spaces with the same $N_0 \\cdot N_1$\n",
+ "quadrature points in real space, but the two highest frequencies have\n",
+ "been set to zero.\n",
+ "\n",
+ "We have now created all relevant function spaces for the problem at hand.\n",
+ "It remains to combine these spaces into tensor product spaces, and to\n",
+ "combine tensor product spaces into mixed (coupled) tensor product\n",
+ "spaces. From the Dirichlet bases we create two different tensor\n",
+ "product spaces, whereas one is enough for the pressure"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9bd40c28",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "V_{1}^{\\boldsymbol{N}}(\\boldsymbol{x}) = D_0^{N_0}(x) \\otimes D_1^{N_1}(y), \n",
+ "\\label{_auto4} \\tag{8}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8b9eeee7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "V_{0}^{\\boldsymbol{N}}(\\boldsymbol{x}) = D_0^{N_0}(x) \\otimes D_0^{N_1}(y), \n",
+ "\\label{_auto5} \\tag{9}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "41f3ed7e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "P^{\\boldsymbol{N}}(\\boldsymbol{x}) = P^{N_0}(x) \\otimes P^{N_1}(y).\n",
+ "\\label{_auto6} \\tag{10}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e27ae020",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "With shenfun the tensor product spaces are created as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "76747afc",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:02.651785Z",
+ "iopub.status.busy": "2024-05-24T12:37:02.651528Z",
+ "iopub.status.idle": "2024-05-24T12:37:02.680042Z",
+ "shell.execute_reply": "2024-05-24T12:37:02.679352Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "V1 = TensorProductSpace(comm, (D0X, D1Y))\n",
+ "V0 = TensorProductSpace(comm, (D0X, D0Y))\n",
+ "P = TensorProductSpace(comm, (PX, PY), modify_spaces_inplace=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2ff12ff2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where ``modify_spaces_inplace=True`` makes use of ``PX`` and\n",
+ "``PY`` directly. These spaces have now been modified to fit in\n",
+ "the TensorProductSpace ``P``, along two different directions and as such\n",
+ "the original spaces have been modified. The default behavior in shenfun\n",
+ "is to make copies of the 1D spaces under the hood, and thus leave ``PX``\n",
+ "and ``PY`` untouched. In that case the two new and modified spaces would be accessible\n",
+ "from ``P.bases``.\n",
+ "\n",
+ "Note that all these tensor product spaces are scalar valued.\n",
+ "The velocity is a vector, and a vector requires a mixed vector basis like\n",
+ "$W_1^{\\boldsymbol{N}} = V_1^{\\boldsymbol{N}} \\times V_0^{\\boldsymbol{N}}$. The vector basis is created\n",
+ "in shenfun as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9cdaa7ab",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:02.685079Z",
+ "iopub.status.busy": "2024-05-24T12:37:02.684937Z",
+ "iopub.status.idle": "2024-05-24T12:37:02.688920Z",
+ "shell.execute_reply": "2024-05-24T12:37:02.687442Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "W1 = VectorSpace([V1, V0])\n",
+ "W0 = VectorSpace([V0, V0])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d6ac99c7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the second vector basis, $W_0^{\\boldsymbol{N}} = V_0^{\\boldsymbol{N}} \\times V_0^{\\boldsymbol{N}}$, uses\n",
+ "homogeneous boundary conditions throughout."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8a6e6122",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Mixed variational form\n",
+ "
\n",
+ "\n",
+ "We now formulate a variational problem using the\n",
+ "Galerkin method: Find\n",
+ "$\\boldsymbol{u} \\in W_1^{\\boldsymbol{N}}$ and $p \\in P^{\\boldsymbol{N}}$ such that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9247bcd5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\int_{\\Omega} (\\nu \\nabla^2 \\boldsymbol{u} - \\nabla p ) \\cdot \\boldsymbol{v} \\, dxdy = \\int_{\\Omega} (\\nabla \\cdot \\boldsymbol{u}\\boldsymbol{u}) \\cdot \\boldsymbol{v}\\, dxdy \\quad\\forall \\boldsymbol{v} \\, \\in \\, W_0^{\\boldsymbol{N}}, \\label{eq:nsvarform} \\tag{11} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "10e0c889",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\int_{\\Omega} \\nabla \\cdot \\boldsymbol{u} \\, q \\, dxdy = 0 \\quad\\forall q \\, \\in \\, P^{\\boldsymbol{N}}.\n",
+ "\\label{_auto7} \\tag{12}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0ecae3eb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that we are using test functions $\\boldsymbol{v}$ with homogeneous\n",
+ "boundary conditions.\n",
+ "\n",
+ "The first obvious issue with Eq ([11](#eq:nsvarform)) is the nonlinearity.\n",
+ "In other words we will\n",
+ "need to linearize and iterate to be able to solve these equations with\n",
+ "the Galerkin method. To this end we will introduce the solution on\n",
+ "iteration $k \\in [0, 1, \\ldots]$ as $\\boldsymbol{u}^k$ and compute the nonlinearity\n",
+ "using only known solutions\n",
+ "$\\int_{\\Omega} (\\nabla \\cdot \\boldsymbol{u}^k\\boldsymbol{u}^k) \\cdot \\boldsymbol{v}\\, dxdy$.\n",
+ "Using further integration by parts we end up with the equations to solve\n",
+ "for iteration number $k+1$ (using $\\boldsymbol{u} = \\boldsymbol{u}^{k+1}$ and $p=p^{k+1}$\n",
+ "for simplicity)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6194c91b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "-\\int_{\\Omega} \\nu \\nabla \\boldsymbol{u} \\, \\colon \\nabla \\boldsymbol{v} \\, dxdy + \\int_{\\Omega} p \\nabla \\cdot \\boldsymbol{v} \\, dxdy = \\int_{\\Omega} (\\nabla \\cdot \\boldsymbol{u}^k\\boldsymbol{u}^k) \\cdot \\boldsymbol{v}\\, dxdy \\quad\\forall \\boldsymbol{v} \\, \\in \\, W_0^{\\boldsymbol{N}}, \\label{eq:nsvarform2} \\tag{13} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9a1bc12e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\int_{\\Omega} \\nabla \\cdot \\boldsymbol{u} \\, q \\, dxdy = 0 \\quad\\forall q \\, \\in \\, P^{\\boldsymbol{N}}.\n",
+ "\\label{_auto8} \\tag{14}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3ad1369a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the nonlinear term may also be integrated by parts and\n",
+ "evaluated as $\\int_{\\Omega}-\\boldsymbol{u}^k\\boldsymbol{u}^k \\, \\colon \\nabla \\boldsymbol{v} \\, dxdy$. All\n",
+ "boundary integrals disappear since we are using test functions with\n",
+ "homogeneous boundary conditions.\n",
+ "\n",
+ "Since we are to solve for $\\boldsymbol{u}$ and $p$ at the same time, we formulate a\n",
+ "mixed (coupled) problem: find $(\\boldsymbol{u}, p) \\in W_1^{\\boldsymbol{N}} \\times P^{\\boldsymbol{N}}$\n",
+ "such that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9d7704be",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "a((\\boldsymbol{u}, p), (\\boldsymbol{v}, q)) = L((\\boldsymbol{v}, q)) \\quad \\forall (\\boldsymbol{v}, q) \\in W_0^{\\boldsymbol{N}} \\times P^{\\boldsymbol{N}},\n",
+ "\\label{_auto9} \\tag{15}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1004cd02",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where bilinear ($a$) and linear ($L$) forms are given as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9bd71ce1",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " a((\\boldsymbol{u}, p), (\\boldsymbol{v}, q)) = -\\int_{\\Omega} \\nu \\nabla \\boldsymbol{u} \\, \\colon \\nabla \\boldsymbol{v} \\, dxdy + \\int_{\\Omega} p \\nabla \\cdot \\boldsymbol{v} \\, dxdy + \\int_{\\Omega} \\nabla \\cdot \\boldsymbol{u} \\, q \\, dxdy, \n",
+ "\\label{_auto10} \\tag{16}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "068f2a78",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " L((\\boldsymbol{v}, q); \\boldsymbol{u}^{k}) = \\int_{\\Omega} (\\nabla \\cdot \\boldsymbol{u}^{k}\\boldsymbol{u}^{k}) \\cdot \\boldsymbol{v}\\, dxdy.\n",
+ "\\label{_auto11} \\tag{17}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "55eeb8fb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the bilinear form will assemble to a block matrix, whereas the right hand side\n",
+ "linear form will assemble to a block vector. The bilinear form does not change\n",
+ "with the solution and as such it does not need to be reassembled inside\n",
+ "an iteration loop.\n",
+ "\n",
+ "The algorithm used to solve the equations are:\n",
+ "\n",
+ " * Set $k = 0$\n",
+ "\n",
+ " * Guess $\\boldsymbol{u}^0 = (0, 0)$\n",
+ "\n",
+ " * while not converged:\n",
+ "\n",
+ " * assemble $L((\\boldsymbol{v}, q); \\boldsymbol{u}^{k})$\n",
+ "\n",
+ " * solve $a((\\boldsymbol{u}, p), (\\boldsymbol{v}, q)) = L((\\boldsymbol{v}, q); \\boldsymbol{u}^{k})$ for $\\boldsymbol{u}^{k+1}, p^{k+1}$\n",
+ "\n",
+ " * compute error = $\\int_{\\Omega} (\\boldsymbol{u}^{k+1}-\\boldsymbol{u}^{k})^2 \\, dxdy$\n",
+ "\n",
+ " * if error $<$ some tolerance then converged = True\n",
+ "\n",
+ " * $k$ += $1$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "352eed28",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Implementation of solver\n",
+ "\n",
+ "We will now implement the coupled variational problem described in previous\n",
+ "sections. First of all, since we want to solve for the velocity and pressure\n",
+ "in a coupled solver, we have to\n",
+ "create a mixed tensor product space $VQ = W_1^{\\boldsymbol{N}} \\times P^{\\boldsymbol{N}}$ that\n",
+ "couples velocity and pressure"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "53b8bee6",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:02.694219Z",
+ "iopub.status.busy": "2024-05-24T12:37:02.694096Z",
+ "iopub.status.idle": "2024-05-24T12:37:02.696046Z",
+ "shell.execute_reply": "2024-05-24T12:37:02.695694Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "VQ = CompositeSpace([W1, P]) # Coupling velocity and pressure"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "eb737566",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We can now create test- and trialfunctions for the coupled space $VQ$,\n",
+ "and then split them up into components afterwards:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8aa77ff2",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:02.701366Z",
+ "iopub.status.busy": "2024-05-24T12:37:02.700775Z",
+ "iopub.status.idle": "2024-05-24T12:37:02.705052Z",
+ "shell.execute_reply": "2024-05-24T12:37:02.703879Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "up = TrialFunction(VQ)\n",
+ "vq = TestFunction(VQ)\n",
+ "u, p = up\n",
+ "v, q = vq"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "980d2ae6",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ ":::{note}\n",
+ "The test function `v` is using homogeneous Dirichlet boundary conditions even\n",
+ "though it is derived from `VQ`, which contains `W1`. It is currently not (and will\n",
+ "probably never be) possible to use test functions with inhomogeneous\n",
+ "boundary conditions.\n",
+ ":::\n",
+ "\n",
+ "With the basisfunctions in place we may assemble the different blocks of the\n",
+ "final coefficient matrix. For this we also need to specify the kinematic\n",
+ "viscosity, which is given here in terms of the Reynolds number:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "31f39748",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:02.709539Z",
+ "iopub.status.busy": "2024-05-24T12:37:02.709325Z",
+ "iopub.status.idle": "2024-05-24T12:37:02.732543Z",
+ "shell.execute_reply": "2024-05-24T12:37:02.731445Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "Re = 100.\n",
+ "nu = 2./Re\n",
+ "if family.lower() == 'legendre':\n",
+ " A = inner(grad(v), -nu*grad(u))\n",
+ " G = inner(div(v), p)\n",
+ "else:\n",
+ " A = inner(v, nu*div(grad(u)))\n",
+ " G = inner(v, -grad(p))\n",
+ "D = inner(q, div(u))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "89cba222",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The assembled subsystems `A, G` and `D` are lists containg the different blocks of\n",
+ "the complete, coupled, coefficient matrix. `A` actually contains 4\n",
+ "tensor product matrices of type [TPMatrix](https://shenfun.readthedocs.io/en/latest/shenfun.html#shenfun.matrixbase.TPMatrix). The first two\n",
+ "matrices are for vector component zero of the test function `v[0]` and\n",
+ "trial function `u[0]`, the\n",
+ "matrices 2 and 3 are for components 1. The first two matrices are as such for"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b2f5defb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ " A[0:2] = inner(grad(v[0]), -nu*grad(u[0]))\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "62fb6b73",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Breaking it down the inner product is mathematically"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e8508c5a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\label{eq:partialeq1} \\tag{18}\n",
+ "\\int_{\\Omega}-\\nu \\left(\\frac{\\partial \\boldsymbol{v}[0]}{\\partial x}, \\frac{\\partial \\boldsymbol{v}[0]}{\\partial y}\\right) \\cdot \\left(\\frac{\\partial \\boldsymbol{u}[0]}{\\partial x}, \\frac{\\partial \\boldsymbol{u}[0]}{\\partial y}\\right) dx dy .\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "232abb61",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We can now insert for test function $\\boldsymbol{v}[0]$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9eb8662d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\boldsymbol{v}[0]_{kl} = \\mathcal{X}_k \\mathcal{Y}_l, \\quad (k, l) \\in \\boldsymbol{k}^{N_0-2} \\times \\boldsymbol{l}^{N_1-2}\n",
+ "\\label{_auto12} \\tag{19}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4e50aac5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and trialfunction"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ced7ddd5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\boldsymbol{u}[0]_{mn} = \\sum_{m=0}^{N_0-3} \\sum_{n=0}^{N_1-1} \\hat{\\boldsymbol{u}}[0]_{mn} \\mathcal{X}_m \\mathcal{Y}_n,\n",
+ "\\label{_auto13} \\tag{20}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4cf2aa34",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\hat{\\boldsymbol{u}}$ are the unknown degrees of freedom for the velocity vector.\n",
+ "Notice that the sum over the second\n",
+ "index runs all the way to $N_1-1$, whereas the other indices runs to either\n",
+ "$N_0-3$ or $N_1-3$. This is because of the additional basis functions required\n",
+ "for the inhomogeneous boundary condition.\n",
+ "\n",
+ "Inserting for these basis functions into ([18](#eq:partialeq1)), we obtain after a few trivial\n",
+ "manipulations"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ff48c66d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " -\\sum_{m=0}^{N_0-3} \\sum_{n=0}^{N_1-1} \\nu \\Big( \\underbrace{\\int_{-1}^{1} \\frac{\\partial \\mathcal{X}_k}{\\partial x} \\frac{\\partial \\mathcal{X}_m}{\\partial x} dx \\int_{-1}^{1} \\mathcal{Y}_l \\mathcal{Y}_n dy}_{A[0]} + \\underbrace{\\int_{-1}^{1} \\mathcal{X}_k X_m dx \\int_{-1}^{1} \\frac{\\partial \\mathcal{Y}_l}{\\partial y} \\frac{\\partial \\mathcal{Y}_n}{\\partial y} dy}_{A[1]} \\Big) \\hat{\\boldsymbol{u}}[0]_{mn}.\n",
+ "\\label{_auto14} \\tag{21}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e5db0d4c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We see that each tensor product matrix (both A[0] and A[1]) is composed as\n",
+ "outer products of two smaller matrices, one for each dimension.\n",
+ "The first tensor product matrix, A[0], is"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "57725c54",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\underbrace{\\int_{-1}^{1} \\frac{\\partial \\mathcal{X}_k}{\\partial x} \\frac{\\partial \\mathcal{X}_m}{\\partial x} dx}_{c_{km}} \\underbrace{\\int_{-1}^{1} \\mathcal{Y}_l \\mathcal{Y}_n dy}_{f_{ln}}\n",
+ "\\label{_auto15} \\tag{22}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6c7aa78d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $C\\in \\mathbb{R}^{N_0-2 \\times N_1-2}$ and $F \\in \\mathbb{R}^{N_0-2 \\times N_1}$.\n",
+ "Note that due to the inhomogeneous boundary conditions this last matrix $F$\n",
+ "is actually not square. However, remember that all contributions from the two highest\n",
+ "degrees of freedom ($\\hat{\\boldsymbol{u}}[0]_{m,N_1-2}$ and $\\hat{\\boldsymbol{u}}[0]_{m,N_1-1}$) are already\n",
+ "known and they can, as such, be moved directly over to the right hand side of the\n",
+ "linear algebra system that is to be solved. More precisely, we can split the\n",
+ "tensor product matrix into two contributions and obtain"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7a9bb9a5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\sum_{m=0}^{N_0-3}\\sum_{n=0}^{N_1-1} c_{km}f_{ln} \\hat{\\boldsymbol{u}}[0]_{m, n} = \\sum_{m=0}^{N_0-3}\\sum_{n=0}^{N_1-3}c_{km}f_{ln}\\hat{\\boldsymbol{u}}[0]_{m, n} + \\sum_{m=0}^{N_0-3}\\sum_{n=N_1-2}^{N_1-1}c_{km}f_{ln}\\hat{\\boldsymbol{u}}[0]_{m, n}, \\quad \\forall (k, l) \\in \\boldsymbol{k}^{N_0-2} \\times \\boldsymbol{l}^{N_1-2},\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "479af7cb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where the first term on the right hand side is square and the second term is known and\n",
+ "can be moved to the right hand side of the linear algebra equation system.\n",
+ "\n",
+ "At this point all matrices, both regular and boundary matrices, are\n",
+ "contained within the three lists A, G and D. We can now create a solver\n",
+ "for block matrices that incorporates these boundary conditions\n",
+ "automatically"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7e7fa5c6",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:02.741024Z",
+ "iopub.status.busy": "2024-05-24T12:37:02.740461Z",
+ "iopub.status.idle": "2024-05-24T12:37:02.743649Z",
+ "shell.execute_reply": "2024-05-24T12:37:02.743228Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "sol = la.BlockMatrixSolver(A+G+D)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8fc81725",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "In the solver `sol` there is now a regular block matrix found in\n",
+ "`sol.mat`, which is the symmetric"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2bdc1587",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\begin{bmatrix}\n",
+ " A[0]+A[1] & 0 & G[0] \\\\ \n",
+ " 0 & A[2]+A[3] & G[1] \\\\ \n",
+ " D[0] & D[1] & 0\n",
+ " \\end{bmatrix}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "98bab253",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The boundary matrices are similarly collected in a boundary block matrix\n",
+ "in `sol.bc_mat`. This matrix is used under the hood to modify the\n",
+ "right hand side.\n",
+ "\n",
+ "We now have all the matrices we need in order to solve the Navier Stokes equations.\n",
+ "However, we also need some work arrays for iterations"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "bd70fd5d",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:02.748478Z",
+ "iopub.status.busy": "2024-05-24T12:37:02.748287Z",
+ "iopub.status.idle": "2024-05-24T12:37:02.754294Z",
+ "shell.execute_reply": "2024-05-24T12:37:02.752368Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# Create Function to hold solution. Use set_boundary_dofs to fix the degrees\n",
+ "# of freedom in uh_hat that determines the boundary conditions.\n",
+ "uh_hat = Function(VQ).set_boundary_dofs()\n",
+ "ui_hat = uh_hat[0]\n",
+ "\n",
+ "# New solution (iterative)\n",
+ "uh_new = Function(VQ).set_boundary_dofs()\n",
+ "ui_new = uh_new[0]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e6879887",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The nonlinear right hand side also requires some additional attention.\n",
+ "Nonlinear terms are usually computed in physical space before transforming\n",
+ "to spectral. For this we need to evaluate the velocity vector on the\n",
+ "quadrature mesh. We also need a rank 2 Array to hold the outer\n",
+ "product $\\boldsymbol{u}\\boldsymbol{u}$. The required arrays and spaces are\n",
+ "created as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "38b7fc85",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:02.758467Z",
+ "iopub.status.busy": "2024-05-24T12:37:02.758100Z",
+ "iopub.status.idle": "2024-05-24T12:37:02.761979Z",
+ "shell.execute_reply": "2024-05-24T12:37:02.761600Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "bh_hat = Function(VQ)\n",
+ "\n",
+ "# Create arrays to hold velocity vector solution\n",
+ "ui = Array(W1)\n",
+ "\n",
+ "# Create work arrays for nonlinear part\n",
+ "QT = CompositeSpace([W1, W0]) # for uiuj\n",
+ "uiuj = Array(QT)\n",
+ "uiuj_hat = Function(QT)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fcb47ed7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The right hand side $L((\\boldsymbol{v}, q);\\boldsymbol{u}^{k});$ is computed in its\n",
+ "own function `compute_rhs` as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "bf45c299",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:02.763955Z",
+ "iopub.status.busy": "2024-05-24T12:37:02.763889Z",
+ "iopub.status.idle": "2024-05-24T12:37:02.766473Z",
+ "shell.execute_reply": "2024-05-24T12:37:02.766041Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "def compute_rhs(ui_hat, bh_hat):\n",
+ " global ui, uiuj, uiuj_hat, V1, bh_hat0\n",
+ " bh_hat.fill(0)\n",
+ " ui = W1.backward(ui_hat, ui)\n",
+ " uiuj = outer(ui, ui, uiuj)\n",
+ " uiuj_hat = uiuj.forward(uiuj_hat)\n",
+ " bi_hat = bh_hat[0]\n",
+ " bi_hat = inner(v, div(uiuj_hat), output_array=bi_hat)\n",
+ " #bi_hat = inner(grad(v), -uiuj_hat, output_array=bi_hat)\n",
+ " return bh_hat"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "880ad1d9",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Here [outer()](https://shenfun.readthedocs.io/en/latest/shenfun.utilities.html#shenfun.utilities.outer) is a shenfun function that computes the\n",
+ "outer product of two vectors and returns the product in a rank two\n",
+ "array (here `uiuj`). With `uiuj` forward transformed to `uiuj_hat`\n",
+ "we can assemble the linear form either as `inner(v, div(uiuj_hat)` or\n",
+ "`inner(grad(v), -uiuj_hat)`.\n",
+ "\n",
+ "Now all that remains is to guess an initial solution and solve\n",
+ "iteratively until convergence. For initial solution we simply set the\n",
+ "velocity and pressure to zero. With an initial solution we are ready\n",
+ "to start iterating.\n",
+ "However, for convergence it is necessary to add some underrelaxation $\\alpha$,\n",
+ "and update the solution each time step as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7222104f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\begin{align*}\n",
+ "\\hat{\\boldsymbol{u}}^{k+1} &= \\alpha \\hat{\\boldsymbol{u}}^* + (1-\\alpha)\\hat{\\boldsymbol{u}}^{k},\\\\ \n",
+ "\\hat{p}^{k+1} &= \\alpha \\hat{p}^* + (1-\\alpha)\\hat{p}^{k},\n",
+ "\\end{align*}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "387876a5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\hat{\\boldsymbol{u}}^*$ and $\\hat{p}^*$ are the newly computed velocity\n",
+ "and pressure returned from `M.solve`. Without underrelaxation the solution\n",
+ "will quickly blow up. The iteration loop goes as follows"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "cf3cb47b",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:02.771196Z",
+ "iopub.status.busy": "2024-05-24T12:37:02.770737Z",
+ "iopub.status.idle": "2024-05-24T12:37:05.592939Z",
+ "shell.execute_reply": "2024-05-24T12:37:05.592568Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "converged = False\n",
+ "count = 0\n",
+ "alfa = 0.5\n",
+ "while not converged:\n",
+ " count += 1\n",
+ " bh_hat = compute_rhs(ui_hat, bh_hat)\n",
+ " uh_new = sol(bh_hat, u=uh_new, constraints=((2, 0, 0),))\n",
+ " error = np.linalg.norm(ui_hat-ui_new)\n",
+ " uh_hat[:] = alfa*uh_new + (1-alfa)*uh_hat\n",
+ " converged = abs(error) < 1e-8 or count >= 100\n",
+ " print('Iteration %d Error %2.4e' %(count, error))\n",
+ "\n",
+ "up = uh_hat.backward()\n",
+ "u, p = up\n",
+ "\n",
+ "X = V0.local_mesh(True)\n",
+ "plt.figure()\n",
+ "plt.quiver(X[0], X[1], u[0], u[1])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f392e652",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the `constraints=((2, 0, 0),)` keyword argument\n",
+ "ensures that the pressure integrates to zero, i.e., $\\int_{\\Omega} p \\omega dxdy=0$.\n",
+ "Here the number 2 tells us that block component 2 in the mixed space\n",
+ "(the pressure) should be integrated, dof 0 should be fixed, and it\n",
+ "should be fixed to 0.\n",
+ "\n",
+ "The last three lines plots velocity vectors, like also seen in the [figure 1](#fig:drivencavity)\n",
+ "in the top of this demo. The solution is apparently nice\n",
+ "and smooth, but hidden underneath are Gibbs oscillations from the\n",
+ "corner discontinuities. This is painfully obvious when switching from\n",
+ "Legendre to Chebyshev polynomials. With Chebyshev the same plot looks\n",
+ "like the [Figure 2](#fig:drivencavitycheb) below. However, choosing instead the\n",
+ "regularized lid, with no discontinuities, the solutions will be nice and\n",
+ "smooth, both for Legendre and Chebyshev polynomials.\n",
+ "\n",
+ "\n",
+ "\n",
+ "
\n",
+ "\n",
+ "
Figure 2: Velocity vectors for Re=100 using Chebyshev.
\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b02c599f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Complete solver\n",
+ "
\n",
+ "\n",
+ "A complete solver can be found in demo [NavierStokesDrivenCavity.py](https://github.com/spectralDNS/shenfun/blob/master/demo/NavierStokesDrivenCavity.py)."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/demos/Functions/functions.ipynb b/docs/demos/Functions/functions.ipynb
new file mode 100644
index 00000000..57e3059c
--- /dev/null
+++ b/docs/demos/Functions/functions.ipynb
@@ -0,0 +1,1327 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "f3038a60",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "\n",
+ "# Demo - Working with Functions\n",
+ "**Mikael Mortensen** (email: `mikaem@math.uio.no`), Department of Mathematics, University of Oslo.\n",
+ "\n",
+ "Date: **August 7, 2020**\n",
+ "\n",
+ "**Summary.** This is a demonstration of how the Python module [shenfun](https://github.com/spectralDNS/shenfun) can be used to work with\n",
+ "global spectral functions in one and several dimensions."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "be63430d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Construction\n",
+ "\n",
+ "A global spectral function $u(x)$ can be represented on the real line as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "75869282",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "u(x) = \\sum_{k=0}^{N-1} \\hat{u}_k \\psi_k(x), \\quad x \\in \\Omega = [a, b],\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "174c39e0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where the domain $\\Omega$ has to be defined such that $b > a$.\n",
+ "The array $\\{\\hat{u}_k\\}_{k=0}^{N-1}$ contains the\n",
+ "expansion coefficient for the series, often referred to as the\n",
+ "degrees of freedom. There is one degree of freedom per basis function and\n",
+ "$\\psi_k(x)$ is the $k$'th basis function.\n",
+ "We can use any number of basis functions,\n",
+ "and the span of the chosen basis is then a function space. Also part of the\n",
+ "function space is the domain, which is\n",
+ "specified when a function space is created. To create a function space\n",
+ "$T=\\text{span}\\{T_k\\}_{k=0}^{N-1}$ for\n",
+ "the first N Chebyshev polynomials of the first kind on the default domain $[-1, 1]$,\n",
+ "do"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f17eb498",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:24.305451Z",
+ "iopub.status.busy": "2024-05-24T12:37:24.305372Z",
+ "iopub.status.idle": "2024-05-24T12:37:24.897648Z",
+ "shell.execute_reply": "2024-05-24T12:37:24.897199Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "from shenfun import *\n",
+ "N = 8\n",
+ "T = FunctionSpace(N, 'Chebyshev', domain=(-1, 1))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "51d18e17",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The function $u(x)$ can now be created with all N coefficients\n",
+ "equal to zero as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b77b3fc9",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:24.900143Z",
+ "iopub.status.busy": "2024-05-24T12:37:24.899852Z",
+ "iopub.status.idle": "2024-05-24T12:37:24.901950Z",
+ "shell.execute_reply": "2024-05-24T12:37:24.901605Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "u = Function(T)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "791e8067",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "When using Chebyshev polynomials the computational domain is always\n",
+ "$[-1, 1]$. However, we can still use a different physical domain,\n",
+ "like"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8ec4daad",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:24.903967Z",
+ "iopub.status.busy": "2024-05-24T12:37:24.903849Z",
+ "iopub.status.idle": "2024-05-24T12:37:24.906523Z",
+ "shell.execute_reply": "2024-05-24T12:37:24.905958Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "T = FunctionSpace(N, 'Chebyshev', domain=(0, 1))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c08835aa",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and under the hood shenfun will then map this domain to the reference\n",
+ "domain through"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ab3b7822",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "u(x) = \\sum_{k=0}^{N-1} \\hat{u}_k \\psi_k(2(x-0.5))\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ca3cb4d4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Approximating analytical functions\n",
+ "\n",
+ "The `u` function above was created with only zero\n",
+ "valued coefficients, which is the default. Alternatively,\n",
+ "a [Function](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.Function) may be initialized using a constant\n",
+ "value"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "761f5f53",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:24.909043Z",
+ "iopub.status.busy": "2024-05-24T12:37:24.908934Z",
+ "iopub.status.idle": "2024-05-24T12:37:24.911054Z",
+ "shell.execute_reply": "2024-05-24T12:37:24.910669Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "T = FunctionSpace(N, 'Chebyshev', domain=(-1, 1))\n",
+ "u = Function(T, val=1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "36f77fe7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "but that is not very useful. A third method to initialize\n",
+ "a [Function](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.Function) is to interpolate using an analytical\n",
+ "Sympy function."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b9ad36a9",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:24.913202Z",
+ "iopub.status.busy": "2024-05-24T12:37:24.913100Z",
+ "iopub.status.idle": "2024-05-24T12:37:24.921840Z",
+ "shell.execute_reply": "2024-05-24T12:37:24.921468Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "import sympy as sp\n",
+ "x = sp.Symbol('x', real=True)\n",
+ "u = Function(T, buffer=4*x**3-3*x)\n",
+ "print(u)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4a9048d9",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Here the analytical Sympy function will first be evaluated\n",
+ "on the entire quadrature mesh of the `T` function space,\n",
+ "and then forward transformed to get the coefficients. This\n",
+ "corresponds to a finite-dimensional projection to `T`.\n",
+ "The projection is\n",
+ "\n",
+ "Find $u_h \\in T$, such that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "27a6add1",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "(u_h - u, v)^{N}_w = 0 \\quad \\forall v \\in T, \\label{eq:proj1} \\tag{1} \n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e76306fe",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $v$ is a test function and\n",
+ "$u_h=\\sum_{k=0}^{N-1} \\hat{u}_k T_k$ is a trial function. The\n",
+ "notation $(\\cdot, \\cdot)^N_w$ represents a discrete version of\n",
+ "the weighted inner product $(u, v)_w$ defined as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3ed95d25",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "(u, v)_{\\omega} = \\int_{\\Omega} u \\overline{v} \\omega d\\Omega,\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a26f170f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\omega(x)$ is a weight functions and $\\overline{v}$ is the\n",
+ "complex conjugate of $v$. If $v$ is\n",
+ "a real function, then $\\overline{v}=v$.\n",
+ "With quadrature we approximate the integral such that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b801c1d1",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "(u, v)_{\\omega} \\approx (u, v)^N_{\\omega} = \\sum_{j\\in\\mathcal{I}^N} u(x_j) v(x_j) w_j.\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c2a63677",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where the index set $\\mathcal{I}^N = \\{0, 1, \\ldots, N-1\\}$ and $\\{x_j\\}_{j\\in \\mathcal{I}^N}$ and $\\{w_j\\}_{j\\in \\mathcal{I}^N}$\n",
+ "are the quadrature points and weights.\n",
+ "\n",
+ "A linear system of equations arise when inserting for the chosen\n",
+ "basis functions in Eq. ([1](#eq:proj1)). We get"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "aee62172",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\sum_{k\\in \\mathcal{I}^N} \\left( T_k, T_i\\right)^N_{\\omega} \\hat{u}_k =\n",
+ "\\left(u, T_i\\right)^N_{\\omega}\\, \\forall \\, i \\in \\mathcal{I}^N,\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0b6dffc4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "In matrix notation the solution becomes"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "35773a2f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\boldsymbol{\\hat{u}} = A^{-1} \\boldsymbol{\\tilde{u}},\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "09d7d46b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where we use two column vectors $\\boldsymbol{\\hat{u}}=(\\hat{u}_i)^T_{i\\in \\mathcal{I}^N}$,\n",
+ "$\\boldsymbol{\\tilde{u}}=\\left(\\tilde{u}_i\\right)^T_{i \\in \\mathcal{I}^N}$,\n",
+ "$\\tilde{u}_i = (u, T_i)^N_{\\omega}$ and the matrix\n",
+ "$A=(a_{ik}) \\in \\mathbb{R}^{N \\times N}$, that is diagonal with\n",
+ "$a_{ik}=\\left( T_k, T_i\\right)^N_{\\omega}$. For the default\n",
+ "Gauss-Chebyshev quadrature this matrix is $a_{ik} = c_i \\pi/2 \\delta_{ik}$,\n",
+ "where $c_0=2$ and $c_i=1$ for $i>0$."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a93601a6",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Adaptive function size\n",
+ "\n",
+ "The number of basis functions can also be left open during creation\n",
+ "of the function space, through"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6b3431b4",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:24.925102Z",
+ "iopub.status.busy": "2024-05-24T12:37:24.924966Z",
+ "iopub.status.idle": "2024-05-24T12:37:24.928595Z",
+ "shell.execute_reply": "2024-05-24T12:37:24.927405Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "T = FunctionSpace(0, 'Chebyshev', domain=(-1, 1))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b919c637",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "This is useful if you want to approximate a function and\n",
+ "are uncertain how many basis functions that are required.\n",
+ "For example, you may want to approximate the function $\\cos(20 x)$.\n",
+ "You can then find the required [Function](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.Function) using"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9a55e6d5",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:24.931772Z",
+ "iopub.status.busy": "2024-05-24T12:37:24.931577Z",
+ "iopub.status.idle": "2024-05-24T12:37:24.960845Z",
+ "shell.execute_reply": "2024-05-24T12:37:24.960343Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "u = Function(T, buffer=sp.cos(20*x))\n",
+ "print(len(u))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "07d341ea",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We see that $N=45$ is required to resolve this function. This agrees\n",
+ "well with what is reported also by [Chebfun](https://www.chebfun.org/docs/guide/guide01.html).\n",
+ "Note that in this process a new [FunctionSpace()](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.FunctionSpace) has been\n",
+ "created under the hood. The function space of `u` can be\n",
+ "extracted using"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d6cdcdb9",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:24.964705Z",
+ "iopub.status.busy": "2024-05-24T12:37:24.964158Z",
+ "iopub.status.idle": "2024-05-24T12:37:24.967976Z",
+ "shell.execute_reply": "2024-05-24T12:37:24.967525Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "Tu = u.function_space()\n",
+ "print(Tu.N)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cd42b044",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "To further show that shenfun is compatible with Chebfun we can also\n",
+ "approximate the Bessel function"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f3f6e277",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:24.970095Z",
+ "iopub.status.busy": "2024-05-24T12:37:24.970019Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.000706Z",
+ "shell.execute_reply": "2024-05-24T12:37:24.999982Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "T1 = FunctionSpace(0, 'Chebyshev', domain=(0, 100))\n",
+ "u = Function(T1, buffer=sp.besselj(0, x))\n",
+ "print(len(u))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "527bcff6",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "which gives 83 basis functions, in close agreement with Chebfun (89).\n",
+ "The difference lies only in the cut-off criteria. We cut frequencies\n",
+ "with a relative tolerance of 1e-12 by default, but if we make this criteria\n",
+ "a little bit stronger, then we will also arrive at a slightly higher number:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f909dbb0",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:25.004338Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.004225Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.015645Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.015180Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "u = Function(T1, buffer=sp.besselj(0, x), reltol=1e-14)\n",
+ "print(len(u))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "631b5bda",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Plotting the function on its quadrature points looks\n",
+ "a bit ragged, though:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "24ce622f",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:25.017665Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.017590Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.314535Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.312802Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "%matplotlib inline\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "Tu = u.function_space()\n",
+ "plt.plot(Tu.mesh(), u.backward());"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0c9b4803",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "To improve the quality of this plot we can instead evaluate the\n",
+ "function on more points"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "aa3f4008",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:25.322315Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.321796Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.406543Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.402731Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "xj = np.linspace(0, 100, 1000)\n",
+ "plt.plot(xj, u(xj));"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f56c9597",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Alternatively, we can refine the function, which simply\n",
+ "pads zeros to $\\hat{u}$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "39cb107e",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:25.413155Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.412715Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.621446Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.620380Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "up = u.refine(200)\n",
+ "Tp = up.function_space()\n",
+ "plt.plot(Tp.mesh(), up.backward());"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "df254f80",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The padded expansion coefficients are now given as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "760bd263",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:25.625839Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.625660Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.633356Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.630655Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "print(up)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2773efbb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## More features\n",
+ "\n",
+ "Since we have used a regular Chebyshev basis above, there\n",
+ "are many more features that could be explored simply by going through\n",
+ "[Numpy's Chebyshev module](https://numpy.org/doc/stable/reference/routines.polynomials.chebyshev.html).\n",
+ "For example, we can create a Chebyshev series like"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ef085fb4",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:25.637493Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.636911Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.641331Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.640169Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "import numpy.polynomial.chebyshev as cheb\n",
+ "c = cheb.Chebyshev(u, domain=(0, 100))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a07fd640",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The Chebyshev series in Numpy has a wide range of possibilities,\n",
+ "see [here](https://numpy.org/doc/stable/reference/generated/numpy.polynomial.chebyshev.Chebyshev.html#numpy.polynomial.chebyshev.Chebyshev).\n",
+ "However, we may also work directly with the Chebyshev\n",
+ "coefficients already in `u`. To find the roots of the\n",
+ "polynomial that approximates the Bessel function on\n",
+ "domain $[0, 100]$, we can do"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "66dcc5f2",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:25.645719Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.645526Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.651103Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.650379Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "z = Tu.map_true_domain(cheb.chebroots(u))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a20a2384",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the roots are found on the reference domain $[-1, 1]$\n",
+ "and as such we need to move the result to the physical domain using\n",
+ "`map_true_domain`. The resulting roots `z` are both real and imaginary,\n",
+ "so to extract the real roots we need to filter a little bit"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "33dc7c82",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:25.655373Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.655119Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.660950Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.658643Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "z2 = z[np.where((z.imag == 0)*(z.real > 0)*(z.real < 100))].real\n",
+ "print(z2[:5])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "04171337",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Here `np.where` returns the indices where the condition is true. The condition\n",
+ "is that the imaginary part is zero, whereas the real part is within the\n",
+ "true domain $[0, 100]$.\n",
+ "\n",
+ ":::{note}\n",
+ "Using directly `cheb.chebroots(c)` does not seem to work (even though the\n",
+ "series has been generated with the non-standard domain) because\n",
+ "Numpy only looks for roots in the reference domain $[-1, 1]$.\n",
+ ":::\n",
+ "\n",
+ "We could also use a function space with boundary conditions built\n",
+ "in, like"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "23287700",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:25.663414Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.663322Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.713724Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.713011Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "Td = FunctionSpace(0, 'C', bc=(sp.besselj(0, 0), sp.besselj(0, 100)), domain=(0, 100))\n",
+ "ud = Function(Td, buffer=sp.besselj(0, x))\n",
+ "print(len(ud))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "28a0c752",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "As we can see this leads to a function space of dimension\n",
+ "very similar to the orthogonal space.\n",
+ "\n",
+ "The major advantages of working with a space with boundary conditions\n",
+ "built in only comes to life when solving differential equations. As\n",
+ "long as we are only interested in approximating functions, we are better off\n",
+ "sticking to the orthogonal spaces. This goes for Legendre as\n",
+ "well as Chebyshev."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cbfe6a4e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Multidimensional functions\n",
+ "\n",
+ "Multidimensional tensor product spaces are created\n",
+ "by taking the tensor products of one-dimensional function spaces.\n",
+ "For example"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "00e8b329",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:25.718425Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.718290Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.738958Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.738633Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "C0 = FunctionSpace(20, 'C')\n",
+ "C1 = FunctionSpace(20, 'C')\n",
+ "T = TensorProductSpace(comm, (C0, C1))\n",
+ "u = Function(T)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0ca369f5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Here $\\text{T} = \\text{C0} \\otimes \\text{C1}$, the basis function is\n",
+ "$T_i(x) T_j(y)$ and the Function `u` is"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c6501f71",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "u(x, y) = \\sum_{i=0}^{N-1} \\sum_{j=0}^{N-1} \\hat{u}_{ij} T_i(x) T_j(y).\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9baa4116",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The multidimensional Functions work more or less exactly like for the\n",
+ "1D case. We can here interpolate 2D Sympy functions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f8c1a6c4",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:25.742441Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.742326Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.860399Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.858077Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "y = sp.Symbol('y', real=True)\n",
+ "u = Function(T, buffer=sp.cos(10*x)*sp.cos(10*y))\n",
+ "X = T.local_mesh(True)\n",
+ "plt.contourf(X[0], X[1], u.backward());"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "99390331",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Like for 1D the coefficients are computed through projection,\n",
+ "where the exact function is evaluated on all quadrature points\n",
+ "in the mesh.\n",
+ "\n",
+ "The Cartesian mesh represents the quadrature points of the\n",
+ "two function spaces, and can be visualized as follows"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6f50c502",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:25.864167Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.863483Z",
+ "iopub.status.idle": "2024-05-24T12:37:26.030734Z",
+ "shell.execute_reply": "2024-05-24T12:37:26.030410Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "X = T.mesh()\n",
+ "for xj in X[0]:\n",
+ " for yj in X[1]:\n",
+ " plt.plot((xj, xj), (X[1][0, 0], X[1][0, -1]), 'k')\n",
+ " plt.plot((X[0][0], X[0][-1]), (yj, yj), 'k')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "205be2c5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We may alternatively plot on a uniform mesh"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f40fd289",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:26.033855Z",
+ "iopub.status.busy": "2024-05-24T12:37:26.033556Z",
+ "iopub.status.idle": "2024-05-24T12:37:26.123275Z",
+ "shell.execute_reply": "2024-05-24T12:37:26.122760Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "X = T.local_mesh(bcast=True, kind='uniform')\n",
+ "plt.contourf(X[0], X[1], u.backward(mesh='uniform'));"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "88538f19",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Curvilinear coordinates\n",
+ "\n",
+ "With shenfun it is possible to use curvilinear coordinates,\n",
+ "and not necessarily with orthogonal basis vectors. With\n",
+ "curvilinear coordinates the computational coordinates are\n",
+ "always straight lines, rectangles and cubes. But the physical\n",
+ "coordinates can be very complex.\n",
+ "\n",
+ "Consider the unit disc with polar coordinates. Here\n",
+ "the position vector $\\mathbf{r}$ is given by"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "45580ada",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\mathbf{r} = r\\cos \\theta \\mathbf{i} + r\\sin \\theta \\mathbf{j}.\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "42e1822a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The physical domain is $\\Omega = \\{(x, y): x^2 + y^2 < 1\\}$,\n",
+ "whereas the computational domain is the Cartesian product\n",
+ "$D = [0, 1] \\times [0, 2 \\pi] = \\{(r, \\theta) | r \\in [0, 1] \\text{ and } \\theta \\in [0, 2 \\pi]\\}$.\n",
+ "\n",
+ "We create this domain in shenfun through"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "abe72e5b",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:26.127527Z",
+ "iopub.status.busy": "2024-05-24T12:37:26.127418Z",
+ "iopub.status.idle": "2024-05-24T12:37:26.297581Z",
+ "shell.execute_reply": "2024-05-24T12:37:26.297216Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "r, theta = psi = sp.symbols('x,y', real=True, positive=True)\n",
+ "rv = (r*sp.cos(theta), r*sp.sin(theta))\n",
+ "B0 = FunctionSpace(20, 'C', domain=(0, 1))\n",
+ "F0 = FunctionSpace(20, 'F')\n",
+ "T = TensorProductSpace(comm, (B0, F0), coordinates=(psi, rv))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cf97987a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that we are using a Fourier space for the azimuthal\n",
+ "direction, since the solution here needs to be periodic.\n",
+ "We can now create functions on the space using an\n",
+ "analytical function in computational coordinates"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0a65ffc2",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:26.299837Z",
+ "iopub.status.busy": "2024-05-24T12:37:26.299661Z",
+ "iopub.status.idle": "2024-05-24T12:37:26.309064Z",
+ "shell.execute_reply": "2024-05-24T12:37:26.308249Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "u = Function(T, buffer=(1-r)*r*sp.sin(sp.cos(theta)))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "02962d83",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "However, when this is plotted it may not be what you expect"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c32f1808",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:26.311147Z",
+ "iopub.status.busy": "2024-05-24T12:37:26.311031Z",
+ "iopub.status.idle": "2024-05-24T12:37:26.379378Z",
+ "shell.execute_reply": "2024-05-24T12:37:26.377774Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "X = T.local_mesh(True)\n",
+ "plt.contourf(X[0], X[1], u.backward(), 100);"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4ef74e8d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We see that the function has been plotted in computational coordinates,\n",
+ "and not on the disc, as you probably expected. To plot on\n",
+ "the disc we need the physical mesh, and not the computational"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a42a0a42",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:26.386950Z",
+ "iopub.status.busy": "2024-05-24T12:37:26.386314Z",
+ "iopub.status.idle": "2024-05-24T12:37:26.483051Z",
+ "shell.execute_reply": "2024-05-24T12:37:26.481112Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "X = T.local_cartesian_mesh()\n",
+ "plt.contourf(X[0], X[1], u.backward(), 100);"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e45366c2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ ":::{note}\n",
+ "The periodic plot does not wrap all around the circle. This is\n",
+ "not wrong, we have simply not used the same point twice, but it\n",
+ "does not look very good. To overcome this problem we can wrap the\n",
+ "grid all the way around and re-plot.\n",
+ ":::"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b9f6cc53",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:26.487365Z",
+ "iopub.status.busy": "2024-05-24T12:37:26.487223Z",
+ "iopub.status.idle": "2024-05-24T12:37:26.580996Z",
+ "shell.execute_reply": "2024-05-24T12:37:26.579877Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "up = u.backward()\n",
+ "xp, yp, up = wrap_periodic([X[0], X[1], up], axes=[1])\n",
+ "plt.contourf(xp, yp, up, 100);"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "39be30cc",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Adaptive functions in multiple dimensions\n",
+ "\n",
+ "If you want to find a good resolution for a function in multiple\n",
+ "dimensions, the procedure is exactly like in 1D. First create function\n",
+ "spaces with 0 quadrature points, and then call [Function](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.Function)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f896255d",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:26.586756Z",
+ "iopub.status.busy": "2024-05-24T12:37:26.585661Z",
+ "iopub.status.idle": "2024-05-24T12:37:26.695543Z",
+ "shell.execute_reply": "2024-05-24T12:37:26.693180Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "B0 = FunctionSpace(0, 'C', domain=(0, 1))\n",
+ "F0 = FunctionSpace(0, 'F')\n",
+ "T = TensorProductSpace(comm, (B0, F0), coordinates=(psi, rv))\n",
+ "u = Function(T, buffer=((1-r)*r)**2*sp.sin(sp.cos(theta)))\n",
+ "print(u.shape)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d0e41011",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The algorithm used to find the approximation in multiple dimensions\n",
+ "simply treat the problem one direction at the time. So in this case\n",
+ "we would first find a space in the first direction by using\n",
+ "a function ` ~ ((1-r)*r)**2`, and then along the second using\n",
+ "a function ` ~ sp.sin(sp.cos(theta))`.\n",
+ "\n",
+ ""
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/demos/Integration/surfaceintegration.ipynb b/docs/demos/Integration/surfaceintegration.ipynb
new file mode 100644
index 00000000..74dcfd23
--- /dev/null
+++ b/docs/demos/Integration/surfaceintegration.ipynb
@@ -0,0 +1,1161 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "f69832df",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "\n",
+ "# Demo - Integration of functions\n",
+ "**Mikael Mortensen** (email: `mikaem@math.uio.no`), Department of Mathematics, University of Oslo.\n",
+ "\n",
+ "Date: **August 7, 2020**\n",
+ "\n",
+ "**Summary.** This is a demonstration of how the Python module [shenfun](https://github.com/spectralDNS/shenfun) can be used to\n",
+ "integrate over 1D curves and 2D surfaces in 3D space.\n",
+ "We make use of\n",
+ "curvilinear coordinates, and reproduce some integrals\n",
+ "performed by Behnam Hashemi with [Chebfun](http://www.chebfun.org/examples/approx3/SurfaceIntegral3D.html).\n",
+ "\n",
+ ":::{note}\n",
+ "For all the examples below we could just as well\n",
+ "use Legendre polynomials instead of Chebyshev.\n",
+ "Just replace 'C' with 'L' when creating function spaces.\n",
+ "The accuracy ought to be similar.\n",
+ ":::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fc9ceef2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## The inner product\n",
+ "\n",
+ "A lesser known fact about [shenfun](https://github.com/spectralDNS/shenfun) is\n",
+ "that it can be used to perform regular, unweighted, integrals with\n",
+ "spectral accuracy. With the newly added curvilinear coordinates\n",
+ "feature, we can now also integrate over highly complex lines and surfaces\n",
+ "embedded in a higher dimensional space.\n",
+ "\n",
+ "To integrate over a domain in shenfun we use the\n",
+ "[inner()](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.inner.inner)\n",
+ "function, with a constant test function. The [inner()](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.inner.inner)\n",
+ "function in shenfun is defined as an integral over the\n",
+ "entire domain $\\Omega$ in question"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3ab8310f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "(u, v)_w = \\int_{\\Omega} u \\overline{v} w d\\Omega,\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "43bf0ffb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "for trial function $u$, test function $v$ and weight $w$.\n",
+ "Also, $\\overline{v}$ represents the complex conjugate of $v$, in case\n",
+ "we are working with complex functions (like Fourier exponentials).\n",
+ "\n",
+ "The functions and weights take on different form, but if\n",
+ "the test function $v$ is chosen to be a constant, e.g., $v=1$,\n",
+ "then the weight is also constant, $w=1$, and the inner product becomes\n",
+ "an unweighted integral of $u$ over the domain"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8cc37f68",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "(u, 1)_w = \\int_{\\Omega} u d\\Omega.\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0819d555",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the integral in the inner product either can be computed\n",
+ "exactly using Sympy, adaptively using Scipy or with quadrature\n",
+ "using Shenfun. The quadrature can be computed with any fixed resolution,\n",
+ "see [inner()](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.inner.inner)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "dacc0e7d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Curve integrals\n",
+ "\n",
+ "For example, if we create some function space on the line from\n",
+ "0 to 1, then we can get the length of this domain using `inner`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "239b46e9",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:29.095433Z",
+ "iopub.status.busy": "2024-05-24T12:37:29.095328Z",
+ "iopub.status.idle": "2024-05-24T12:37:29.619934Z",
+ "shell.execute_reply": "2024-05-24T12:37:29.618171Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "from shenfun import *\n",
+ "B = FunctionSpace(10, 'C', domain=(0, 1))\n",
+ "u = Array(B, val=1)\n",
+ "length = inner(u, 1)\n",
+ "print('Length of domain =', length)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4e59fb61",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that we cannot simply do `inner(1, 1)`, because the\n",
+ "`inner` function does not know about the domain, which is part\n",
+ "of the [FunctionSpace](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.FunctionSpace). So to integrate `u=1`, we need to\n",
+ "create `u` as an [Array](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.Array) with the constant value 1.\n",
+ "\n",
+ "Since the function space `B` is Cartesian the computed\n",
+ "length is simply the domain length.\n",
+ "Not very impressive, but the same goes for multidimensional\n",
+ "tensor product domains"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c247086b",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:29.622827Z",
+ "iopub.status.busy": "2024-05-24T12:37:29.622618Z",
+ "iopub.status.idle": "2024-05-24T12:37:29.633687Z",
+ "shell.execute_reply": "2024-05-24T12:37:29.633005Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "F = FunctionSpace(10, 'F', domain=(0, 2*np.pi))\n",
+ "T = TensorProductSpace(comm, (B, F))\n",
+ "area = inner(1, Array(T, val=1))\n",
+ "print('Area of domain =', area)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "16e1cce2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Still not very impressive, but moving to curvilinear coordinates\n",
+ "it all starts to become more interesting. Lets\n",
+ "look at a spiral $C$ embedded in $\\mathbb{R}^3$, parametrized\n",
+ "by one single parameter $t$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0bea4158",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\begin{align*}\n",
+ "x(t) &= \\sin 2t \\\\ \n",
+ "y(t) &= \\cos 2t \\\\ \n",
+ "z(t) &= \\frac{t}{2} \\\\ \n",
+ "0 \\le & t \\le 2\\pi\n",
+ "\\end{align*}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b13e1f89",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "What is the length of this spiral? The spiral can be\n",
+ "seen as the red curve in the figure a few cells below.\n",
+ "\n",
+ "The integral over the parametrized curve $C$ can\n",
+ "be written as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "158ad02c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\int_C ds = \\int_{t=0}^{2\\pi} \\sqrt{\\left(\\frac{d x}{d t}\\right)^2 + \\left(\\frac{d y}{d t}\\right)^2 + \\left(\\frac{d z}{d t}\\right)^2} dt.\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e5871ca3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We can find this integral easily using shenfun. Create\n",
+ "a function space in curvilinear coordinates, providing\n",
+ "the position vector $\\mathbf{r} = x(t)\\mathbf{i} + y(t) \\mathbf{j} + z(t) \\mathbf{k}$\n",
+ "as input. Also, choose to work with covariant basis vectors, which\n",
+ "is really not important unless you work with vector equations. The\n",
+ "alternative is the default 'normal', where the basis vectors\n",
+ "are normalized to unit length."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ab2ff2d7",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:29.639262Z",
+ "iopub.status.busy": "2024-05-24T12:37:29.638874Z",
+ "iopub.status.idle": "2024-05-24T12:37:29.865919Z",
+ "shell.execute_reply": "2024-05-24T12:37:29.865077Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "import sympy as sp\n",
+ "from shenfun import *\n",
+ "config['basisvectors'] = 'covariant'\n",
+ "t = sp.Symbol('x', real=True, positive=True)\n",
+ "rv = (sp.sin(2*t), sp.cos(2*t), 0.5*t)\n",
+ "C = FunctionSpace(100, 'C', domain=(0, 2*np.pi), coordinates=((t,), rv))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "99693b79",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Then compute the arclength using [inner()](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.inner.inner), again by using a constant\n",
+ "testfunction 1, and a constant [Array](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.Array) u=1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b86162bf",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:29.869354Z",
+ "iopub.status.busy": "2024-05-24T12:37:29.869219Z",
+ "iopub.status.idle": "2024-05-24T12:37:29.943484Z",
+ "shell.execute_reply": "2024-05-24T12:37:29.943016Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "length = inner(1, Array(C, val=1))\n",
+ "print('Length of spiral =', length)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7c5ffdd2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The arclength is found to be slightly longer than $4 \\pi$. Looking at the\n",
+ "spiral below, the result looks reasonable."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0d9a6b65",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:29.947584Z",
+ "iopub.status.busy": "2024-05-24T12:37:29.947060Z",
+ "iopub.status.idle": "2024-05-24T12:37:30.262307Z",
+ "shell.execute_reply": "2024-05-24T12:37:30.260469Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "%matplotlib inline\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "fig = plt.figure(figsize=(4, 3))\n",
+ "X = C.cartesian_mesh(kind='uniform')\n",
+ "ax = fig.add_subplot(111, projection='3d')\n",
+ "p = ax.plot(X[0], X[1], X[2], 'r')\n",
+ "hx = ax.set_xticks(np.linspace(-1, 1, 5))\n",
+ "hy = ax.set_yticks(np.linspace(-1, 1, 5))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5fb91f88",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The term $\\sqrt{\\left(\\frac{d x}{d t}\\right)^2 + \\left(\\frac{d y}{d t}\\right)^2 + \\left(\\frac{d z}{d t}\\right)^2}$\n",
+ "is actually here a constant $\\sqrt{4.25}$, found in shenfun as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b12c0f09",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:30.272963Z",
+ "iopub.status.busy": "2024-05-24T12:37:30.272739Z",
+ "iopub.status.idle": "2024-05-24T12:37:30.277663Z",
+ "shell.execute_reply": "2024-05-24T12:37:30.276492Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "C.coors.sg"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "231ddeac",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We could also integrate a non-constant function over the spiral.\n",
+ "For example, lets integrate the function $f(x, y, z)= \\sin^2 x$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d549c0c8",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\int_C \\sin^2 x ds = \\int_{t=0}^{2\\pi} \\sin^2 (\\sin 2t) \\sqrt{\\left(\\frac{d x}{d t}\\right)^2 + \\left(\\frac{d y}{d t}\\right)^2 + \\left(\\frac{d z}{d t}\\right)^2} dt\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "70f98c31",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:30.282411Z",
+ "iopub.status.busy": "2024-05-24T12:37:30.282314Z",
+ "iopub.status.idle": "2024-05-24T12:37:30.287922Z",
+ "shell.execute_reply": "2024-05-24T12:37:30.286973Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "inner(1, Array(C, buffer=sp.sin(rv[0])**2))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "79f71b48",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "which can be easily verified using, e.g., Wolfram Alpha"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "feb65bc7",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:30.293347Z",
+ "iopub.status.busy": "2024-05-24T12:37:30.293234Z",
+ "iopub.status.idle": "2024-05-24T12:37:30.301585Z",
+ "shell.execute_reply": "2024-05-24T12:37:30.299955Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "from IPython.display import IFrame\n",
+ "IFrame(\"https://www.wolframalpha.com/input/?i=integrate+sin%5E2%28sin%282t%29%29+sqrt%284.25%29+from+t%3D0+to+2pi\", width=\"500px\", height=\"350px\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f0402f37",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Surface integrals\n",
+ "\n",
+ "Consider a 3D function $f(x,y,z) \\in \\mathbb{R}^3$ and\n",
+ "a 2D surface (not neccessarily plane) $S(u, v)$,\n",
+ "parametrized in two new coordinates $u$ and $v$. A position\n",
+ "vector $\\mathbf{r}$ can be used to parametrize $S$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d2282d36",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\mathbf{r} = x(u, v) \\,\\mathbf{i} + y(u, v) \\,\\mathbf{j} + z(u, v) \\,\\mathbf{k},\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "309a3f3f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\mathbf{i}, \\mathbf{j}, \\mathbf{k}$ are the Cartesian unit vectors.\n",
+ "The two new coordinates $u$ and $v$ are functions of $x, y, z$,\n",
+ "and they each have a one-dimensional domain"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9e1f19ca",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "u \\in D_u \\quad v \\in D_v.\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "73f360d4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The exact size of the domain depends on the problem at hand. The computational\n",
+ "domain of the surface $S$ is $D=D_u \\times D_v$.\n",
+ "\n",
+ "A surface integral of $f$ over $S$ can now be written"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a9a5dbe0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\int_S f(x, y, z) dS = \\int_D f(x(u, v), y(u, v), z(u, v)) \\left|\\frac{\\partial \\mathbf{r}}{\\partial u} \\times \\frac{\\partial \\mathbf{r}}{\\partial v} \\right| dudv,\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d4873da3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $dS$ is a surface area element. With shenfun such integrals\n",
+ "are trivial, even for highly complex domains."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c6775cbe",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Example 1\n",
+ "\n",
+ "Consider first the surface integral of $f(x,y,z)=x^2$\n",
+ "over the unit sphere. We use regular spherical coordinates,"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "82604644",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\begin{align*}\n",
+ "0 &\\le \\theta \\le \\pi \\\\ \n",
+ "0 &\\le \\phi \\le 2\\pi \\\\ \n",
+ "x(\\theta, \\phi) &= \\sin \\theta \\cos \\phi \\\\ \n",
+ "y(\\theta, \\phi) &= \\sin \\theta \\sin \\phi \\\\ \n",
+ "z(\\theta, \\phi) &= \\cos \\theta\n",
+ "\\end{align*}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bcf630fd",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The straight forward implementation of a function space for\n",
+ "the unit sphere reads"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "5a4c60c4",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:30.307215Z",
+ "iopub.status.busy": "2024-05-24T12:37:30.306907Z",
+ "iopub.status.idle": "2024-05-24T12:37:30.509139Z",
+ "shell.execute_reply": "2024-05-24T12:37:30.508243Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "import sympy as sp\n",
+ "\n",
+ "theta, phi = psi =sp.symbols('x,y', real=True, positive=True)\n",
+ "rv = (sp.sin(theta)*sp.cos(phi), sp.sin(theta)*sp.sin(phi), sp.cos(theta))\n",
+ "\n",
+ "B0 = FunctionSpace(0, 'C', domain=(0, np.pi))\n",
+ "B1 = FunctionSpace(0, 'F', dtype='d')\n",
+ "T = TensorProductSpace(comm, (B0, B1), coordinates=(psi, rv, sp.Q.positive(sp.sin(theta))))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "39dc8175",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where `sp.Q.positive(sp.sin(theta))` is a restriction that\n",
+ "helps `Sympy` in computing the Jacobian required for the integral.\n",
+ "We can now approximate the function $f$ on this surface"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8bd8dca7",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:30.513561Z",
+ "iopub.status.busy": "2024-05-24T12:37:30.513425Z",
+ "iopub.status.idle": "2024-05-24T12:37:30.660833Z",
+ "shell.execute_reply": "2024-05-24T12:37:30.659114Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "f = Array(T, buffer=rv[0]**2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c1b22719",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and we can integrate over $S$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "10a07f12",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:30.667258Z",
+ "iopub.status.busy": "2024-05-24T12:37:30.667151Z",
+ "iopub.status.idle": "2024-05-24T12:37:30.670566Z",
+ "shell.execute_reply": "2024-05-24T12:37:30.670263Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "I = inner(1, f)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "007dc278",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and finally compare to the exact result, which is $4 \\pi / 3$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7b8f9179",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:30.672382Z",
+ "iopub.status.busy": "2024-05-24T12:37:30.672311Z",
+ "iopub.status.idle": "2024-05-24T12:37:30.675604Z",
+ "shell.execute_reply": "2024-05-24T12:37:30.674377Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "print('Error =', abs(I-4*np.pi/3))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1382ae60",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that we can here achieve better accuracy by using\n",
+ "more quadrature points. For example by refining `f`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6ac0a284",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:30.678450Z",
+ "iopub.status.busy": "2024-05-24T12:37:30.678337Z",
+ "iopub.status.idle": "2024-05-24T12:37:30.816866Z",
+ "shell.execute_reply": "2024-05-24T12:37:30.815613Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "T = T.get_refined(2*np.array(f.global_shape))\n",
+ "f = Array(T, buffer=rv[0]**2)\n",
+ "print('Error =', abs(inner(1, f)-4*np.pi/3))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8b74e9dc",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Not bad at all:-)\n",
+ "\n",
+ "To go a little deeper into the integral, we can get the\n",
+ "term $\\left|\\frac{\\partial \\mathbf{r}}{\\partial u} \\times \\frac{\\partial \\mathbf{r}}{\\partial v} \\right|$\n",
+ "as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "dc0793f7",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:30.819288Z",
+ "iopub.status.busy": "2024-05-24T12:37:30.819155Z",
+ "iopub.status.idle": "2024-05-24T12:37:30.822928Z",
+ "shell.execute_reply": "2024-05-24T12:37:30.821197Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "print(T.coors.sg)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0b5dcced",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Here the printed variable is `x`, but this is because `theta`\n",
+ "is named `x` internally by `Sympy`. This is because of the definition\n",
+ "used above: `theta, phi = sp.symbols('x,y', real=True, positive=True)`.\n",
+ "\n",
+ "Note that $\\mathbf{b}_u = \\frac{\\partial \\mathbf{r}}{\\partial u}$ and\n",
+ "$\\mathbf{b}_v = \\frac{\\partial \\mathbf{r}}{\\partial v}$ are the two\n",
+ "basis vectors used by shenfun for the surface $S$. The basis\n",
+ "vectors are obtainable as `T.coors.b`, and can also be printed\n",
+ "in latex using:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "985cee68",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:30.827054Z",
+ "iopub.status.busy": "2024-05-24T12:37:30.826526Z",
+ "iopub.status.idle": "2024-05-24T12:37:30.834909Z",
+ "shell.execute_reply": "2024-05-24T12:37:30.833751Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "from IPython.display import Math\n",
+ "Math(T.coors.latex_basis_vectors(symbol_names={theta: '\\\\theta', phi: '\\\\phi'}))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "29294d79",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where we tell latex to print `theta` as $\\theta$, and not `x`:-)\n",
+ "\n",
+ "From the basis vectors it should be easy to see that $\\left| \\mathbf{b}_{\\theta} \\times \\mathbf{b}_{\\phi} \\right| = \\sin \\theta$."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4b3a42b8",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Example 2\n",
+ "\n",
+ "Next, we solve [Example 5](http://www.math24.net/surface-integrals-of-first-kind.html)\n",
+ "from the online resources at math24.net. Here"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "11067437",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "f = \\sqrt{1+x^2+y^2}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e3d6ffcd",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and the surface is defined by"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9f68a0da",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\mathbf{r} = u \\cos v \\mathbf{i} + u \\sin v \\mathbf{j} + v \\mathbf{k}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1fd1537c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "with $0 \\le u \\le 2, 0 \\le v \\le 2\\pi$.\n",
+ "\n",
+ "The implementation is only a few lines, and we end by comparing\n",
+ "to the exact solution $14 \\pi /3$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "40e3a695",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:30.838953Z",
+ "iopub.status.busy": "2024-05-24T12:37:30.838820Z",
+ "iopub.status.idle": "2024-05-24T12:37:30.990399Z",
+ "shell.execute_reply": "2024-05-24T12:37:30.989744Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "u, v = psi =sp.symbols('x,y', real=True, positive=True)\n",
+ "rv = (u*sp.cos(v), u*sp.sin(v), v)\n",
+ "B0 = FunctionSpace(0, 'C', domain=(0, 2))\n",
+ "B1 = FunctionSpace(0, 'C', domain=(0, np.pi))\n",
+ "T = TensorProductSpace(comm, (B0, B1), coordinates=(psi, rv))\n",
+ "f = Array(T, buffer=sp.sqrt(1+rv[0]**2+rv[1]**2))\n",
+ "print('Error =', abs(inner(1, f)-14*np.pi/3))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "80153aef",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "In this case the integral measure is"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "dc0793f7_1",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:30.994138Z",
+ "iopub.status.busy": "2024-05-24T12:37:30.994014Z",
+ "iopub.status.idle": "2024-05-24T12:37:30.996861Z",
+ "shell.execute_reply": "2024-05-24T12:37:30.996305Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "print(T.coors.sg)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ed8752ba",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Example 3\n",
+ "\n",
+ "In this third example we use a surface that\n",
+ "looks like a seashell. Again, the example is taken from\n",
+ "[chebfun](http://www.chebfun.org/examples/approx3/SurfaceIntegral3D.html).\n",
+ "\n",
+ "The surface of the seashell is parametrized with position\n",
+ "vector"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9d475c23",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\begin{align*}\n",
+ "\\mathbf{r} &= \\left(\\left(\\frac{5}{4}-\\frac{5 v}{8 \\pi}\\right) \\cos 2v(1+\\cos u) + \\cos 2v \\right) \\mathbf{i} \\\\ \n",
+ " &+\\left(\\left(\\frac{5}{4}-\\frac{5 v}{8 \\pi}\\right) \\sin 2v (1+\\cos u) + \\sin 2v \\right) \\mathbf{j},\\\\ \n",
+ " &+\\left(\\frac{10 v}{2 \\pi} + \\left(\\frac{5}{4}-\\frac{5 v}{8 \\pi}\\right) \\sin u + 15\\right) \\mathbf{k}\n",
+ "\\end{align*}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d845d419",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "for $0 \\le u \\le 2 \\pi, -2 \\pi \\le v \\le 2 \\pi$.\n",
+ "\n",
+ "The function $f$ is now defined as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2735adb0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "f(x,y,z) = x+y+z\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ceb7c81d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The implementation is"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "89c0e257",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:31.011160Z",
+ "iopub.status.busy": "2024-05-24T12:37:31.011061Z",
+ "iopub.status.idle": "2024-05-24T12:37:34.282054Z",
+ "shell.execute_reply": "2024-05-24T12:37:34.281286Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "rv = (5*(1-v/(2*sp.pi))*sp.cos(2*v)*(1+sp.cos(u))/4 + sp.cos(2*v),\n",
+ " 5*(1-v/(2*sp.pi))*sp.sin(2*v)*(1+sp.cos(u))/4 + sp.sin(2*v),\n",
+ " 10*v/(2*sp.pi) + 5*(1-v/(2*sp.pi))*sp.sin(u)/4 + 15)\n",
+ "\n",
+ "B0 = FunctionSpace(100, 'C', domain=(0, 2*np.pi))\n",
+ "B1 = FunctionSpace(100, 'C', domain=(-2*np.pi, 2*np.pi))\n",
+ "T = TensorProductSpace(comm, (B0, B1), coordinates=(psi, rv, sp.Q.positive(v-2*sp.pi)))\n",
+ "\n",
+ "f = rv[0]+rv[1]+rv[2]\n",
+ "fb = Array(T, buffer=f)\n",
+ "I = inner(1, fb)\n",
+ "print(I)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "737091ab",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "which agrees very well with chebfun's result. The basis vectors\n",
+ "for the surface of the seashell are"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "60cc5783",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:34.286063Z",
+ "iopub.status.busy": "2024-05-24T12:37:34.285874Z",
+ "iopub.status.idle": "2024-05-24T12:37:34.293189Z",
+ "shell.execute_reply": "2024-05-24T12:37:34.292493Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "Math(T.coors.latex_basis_vectors(symbol_names={u: 'u', v: 'v'}))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "feec2b32",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "which, if nothing else, shows the power of symbolic\n",
+ "computing in Sympy.\n",
+ "\n",
+ "We can plot the\n",
+ "seashell using either plotly or mayavi. Here we choose\n",
+ "plotly since it integrates well with the executable\n",
+ "jupyter book."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0aceb331",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:34.295369Z",
+ "iopub.status.busy": "2024-05-24T12:37:34.295236Z",
+ "iopub.status.idle": "2024-05-24T12:37:34.576905Z",
+ "shell.execute_reply": "2024-05-24T12:37:34.573387Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "import plotly\n",
+ "fig = surf3D(fb, colorscale=plotly.colors.sequential.Jet)\n",
+ "fig.update_layout(scene_camera_eye=dict(x=1.6, y=-1.4, z=0))\n",
+ "fig.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3e83de81",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ ""
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/demos/KleinGordon/kleingordon.ipynb b/docs/demos/KleinGordon/kleingordon.ipynb
new file mode 100644
index 00000000..e2048ce9
--- /dev/null
+++ b/docs/demos/KleinGordon/kleingordon.ipynb
@@ -0,0 +1,1384 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "755b1597",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "\n",
+ "# Demo - Cubic nonlinear Klein-Gordon equation\n",
+ "**Mikael Mortensen** (email: `mikaem@math.uio.no`), Department of Mathematics, University of Oslo.\n",
+ "\n",
+ "Date: **April 13, 2018**\n",
+ "\n",
+ "**Summary.** This is a demonstration of how the Python module [shenfun](https://github.com/spectralDNS/shenfun) can be used to solve the time-dependent,\n",
+ "nonlinear Klein-Gordon equation, in a triply periodic domain. The demo is implemented in\n",
+ "a single Python file [KleinGordon.py](https://github.com/spectralDNS/shenfun/blob/master/demo/KleinGordon.py), and it may be run\n",
+ "in parallel using MPI. The Klein-Gordon equation is solved using a mixed\n",
+ "formulation. The discretization, and some background on the spectral Galerkin\n",
+ "method is given first, before we turn to the actual details of the `shenfun`\n",
+ "implementation.\n",
+ "\n",
+ "
\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "
Figure 1
\n",
+ "\n",
+ "\n",
+ "Movie showing the evolution of the solution $u$ from the Klein-Gordon equation, in a slice through the center of the domain, computed with the code described in this demo."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8ae995a4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## The nonlinear Klein-Gordon equation\n",
+ "\n",
+ "The cubic nonlinear Klein-Gordon equation is a wave equation important for many\n",
+ "scientific applications such as solid state physics, nonlinear optics and\n",
+ "quantum field theory [[abdul08]](#abdul08). The equation is given as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "83b245d3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\frac{\\partial^2 u}{\\partial t^2} = \\nabla^2 u - \\gamma(u - u|u|^2) \\quad\n",
+ "\\text{for} \\, u \\in\n",
+ "\\Omega, \\label{eq:kg} \\tag{1}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "10fb3c95",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "with initial conditions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e4bb65b4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u(\\boldsymbol{x}, t=0) = u^0 \\quad \\text{and} \\quad \\frac{\\partial u(\\boldsymbol{x},\n",
+ "t=0)}{\\partial t} = u_t^0. \\label{eq:init} \\tag{2}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "10adb615",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The spatial coordinates are here denoted as $\\boldsymbol{x} = (x, y, z)$, and\n",
+ "$t$ is time. The parameter $\\gamma=\\pm 1$ determines whether the equations are focusing\n",
+ "($+1$) or defocusing ($-1$) (in the movie we have used $\\gamma=1$).\n",
+ "The domain $\\Omega=[-2\\pi, 2\\pi)^3$ is triply\n",
+ "periodic and initial conditions will here be set as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "40131bb3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u^0 = 0.1 \\exp \\left( -\\boldsymbol{x} \\cdot \\boldsymbol{x} \\right), \n",
+ "\\label{_auto1} \\tag{3}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "53595408",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "u_t^0 = 0.\n",
+ "\\label{_auto2} \\tag{4}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4c365136",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We will solve these equations using a mixed formulation and a spectral Galerkin\n",
+ "method. The mixed formulation reads"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "66f1256e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\frac{\\partial f}{\\partial t} = \\nabla^2 u - \\gamma (u - u|u|^2), \\label{eq:df} \\tag{5}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8eb65116",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\frac{\\partial u}{\\partial t} = f. \\label{eq:du} \\tag{6}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ea17eddc",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The energy of the solution can be computed as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9e81800c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "E(u) = \\int_{\\Omega} \\left( \\frac{1}{2} f^2 + \\frac{1}{2}|\\nabla u|^2 + \\gamma(\\frac{1}{2}u^2 - \\frac{1}{4}u^4) \\right) dx\n",
+ "\\label{_auto3} \\tag{7}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b53f8a5b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and it is crucial that this energy remains constant in time.\n",
+ "\n",
+ "The movie above is showing the solution $u$, computed with the\n",
+ "code shown below."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c6e00bc7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Spectral Galerkin formulation\n",
+ "
\n",
+ "The PDEs in ([5](#eq:df)) and ([6](#eq:du)) can be solved with many different\n",
+ "numerical methods. We will here use the [shenfun](https://github.com/spectralDNS/shenfun) software and this software makes use of\n",
+ "the spectral Galerkin method. Being a Galerkin method, we need to reshape the\n",
+ "governing equations into proper variational forms, and this is done by\n",
+ "multiplying ([5](#eq:df)) and ([6](#eq:du)) with the complex conjugate of proper\n",
+ "test functions and then integrating\n",
+ "over the domain. To this end we make use of the triply periodic tensor product\n",
+ "function space $W^{\\boldsymbol{N}}(\\Omega)$ (defined in Eq. ([14](#eq:kg:Wn)))\n",
+ "and use testfunctions $g \\in W^{\\boldsymbol{N}}$\n",
+ "with Eq. ([5](#eq:df)) and $v \\in W^{\\boldsymbol{N}}$ with Eq. ([6](#eq:du)),\n",
+ "and obtain"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fedc6701",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\frac{\\partial}{\\partial t} \\int_{\\Omega} f\\, \\overline{g}\\, w \\,d\\Omega = \\int_{\\Omega}\n",
+ "\\left(\\nabla^2 u - \\gamma( u\\, - u|u|^2) \\right) \\overline{g} \\, w \\,d\\Omega, \\label{eq:df_var} \\tag{8} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "08ad1175",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\frac{\\partial }{\\partial t} \\int_{\\Omega} u\\, \\overline{v}\\, w \\, dx =\n",
+ "\\int_{\\Omega} f\\, \\overline{v} \\, w \\, d\\Omega. \\label{eq:kg:du_var} \\tag{9}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fbf5fa50",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the overline is used to indicate a complex conjugate, and\n",
+ "$w$ is a weight function associated with the test functions. The functions\n",
+ "$f$ and $u$ are now\n",
+ "to be considered as trial functions, and the integrals over the\n",
+ "domain are referred to as inner products. With inner product notation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4979f581",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\left(u, v\\right) = \\int_{\\Omega} u \\, \\overline{v} \\, w\\, dx.\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3e695b09",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and an integration by parts on the Laplacian, the variational problem can be\n",
+ "formulated as:"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "36f5f08f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\frac{\\partial}{\\partial t} (f, g) = -(\\nabla u, \\nabla g)\n",
+ "-\\gamma \\left( u - u|u|^2, g \\right), \\label{eq:df_var2} \\tag{10} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "781f3602",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\frac{\\partial }{\\partial t} (u, v) = (f, v). \\label{eq:kg:du_var2} \\tag{11}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "24226db7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The time and space discretizations are\n",
+ "still left open. There are numerous different approaches that one could take for\n",
+ "discretizing in time, and the first two terms on the right hand side of\n",
+ "([10](#eq:df_var2)) can easily be treated implicitly as well as explicitly. However,\n",
+ "the approach we will follow in Sec. ([Runge-Kutta integrator](#sec:rk)) is a fully explicit 4th order [Runge-Kutta](https://en.wikipedia.org/wiki/Runge-Kutta_methods) method. Also note that\n",
+ "the inner product in the demo will be computed numerically with quadrature\n",
+ "through fast Fourier transforms, and the integrals are thus not computed exactly\n",
+ "for all terms."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1465f0a3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Discretization\n",
+ "To find a numerical solution we need to discretize the continuous problem\n",
+ "([10](#eq:df_var2)) and ([11](#eq:kg:du_var2)) in space as well as time. Since the\n",
+ "problem is triply periodic, Fourier exponentials are normally the best choice\n",
+ "for trial and test functions, and as such we use basis functions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4d5445cd",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\phi_l(x) = e^{\\imath \\underline{l} x}, \\quad -\\infty < l < \\infty,\n",
+ "\\label{_auto4} \\tag{12}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5f2a57dd",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $l$ is the wavenumber, and\n",
+ "$\\underline{l}=\\frac{2\\pi}{L}l$ is the scaled wavenumber, scaled with domain\n",
+ "length $L$ (here $4\\pi$). Since we want to solve these equations on a computer, we need to choose\n",
+ "a finite number of test functions. A function space $V^N$ can be defined as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b90d937b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "V^N(x) = \\text{span} \\{\\phi_l(x)\\}_{l\\in \\boldsymbol{l}}, \\label{eq:kg:Vn} \\tag{13}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "01bd92d5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $N$ is chosen as an even positive integer and $\\boldsymbol{l} = -N/2,\n",
+ "-N/2+1, \\ldots, N/2-1$. And now, since $\\Omega$ is a\n",
+ "three-dimensional domain, we can create tensor products of such bases to get,\n",
+ "e.g., for three dimensions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "59d5f2f3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "W^{\\boldsymbol{N}}(x, y, z) = V^N(x) \\otimes V^N(y) \\otimes V^N(z), \\label{eq:kg:Wn} \\tag{14}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "68961d5f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\boldsymbol{N} = (N, N, N)$. Obviously, it is not necessary to use the\n",
+ "same number ($N$) of basis functions for each direction, but it is done here\n",
+ "for simplicity. A 3D tensor product basis function is now defined as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "04821397",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\Phi_{lmn}(x,y,z) = e^{\\imath \\underline{l} x} e^{\\imath \\underline{m} y}\n",
+ "e^{\\imath \\underline{n} z} = e^{\\imath\n",
+ "(\\underline{l}x + \\underline{m}y + \\underline{n}z)},\n",
+ "\\label{_auto5} \\tag{15}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e9a3ffab",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where the indices for $y$- and $z$-direction are $\\underline{m}=\\frac{2\\pi}{L}m,\n",
+ "\\underline{n}=\\frac{2\\pi}{L}n$, and $\\boldsymbol{m}$ and $\\boldsymbol{n}$ are the same as\n",
+ "$\\boldsymbol{l}$ due to using the same number of basis functions for each direction. One\n",
+ "distinction, though, is that for the $z$-direction expansion coefficients are only stored for\n",
+ "$n=0, 1, \\ldots, N/2$ due to Hermitian symmetry (real input data). However, for simplicity,\n",
+ "we still write the sum in Eq. ([16](#eq:usg)) over the entire range of basis functions.\n",
+ "\n",
+ "We now look for solutions of the form"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "382c00cb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u(x, y, z, t) = \\sum_{l=-N/2}^{N/2-1}\\sum_{m=-N/2}^{N/2-1}\\sum_{n=-N/2}^{N/2-1}\n",
+ "\\hat{u}_{lmn} (t)\\Phi_{lmn}(x,y,z). \\label{eq:usg} \\tag{16}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "016c1249",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The expansion coefficients $\\hat{\\boldsymbol{u}} = \\{\\hat{u}_{lmn}(t)\\}_{(l,m,n) \\in \\boldsymbol{l} \\times \\boldsymbol{m} \\times \\boldsymbol{n}}$\n",
+ "can be related directly to the solution $u(x, y, z, t)$ using Fast\n",
+ "Fourier Transforms (FFTs) if we are satisfied with obtaining\n",
+ "the solution in quadrature points corresponding to"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "84463f92",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " x_i = \\frac{4 \\pi i}{N}-2\\pi \\quad \\forall \\, i \\in \\boldsymbol{i},\n",
+ "\\text{where}\\, \\boldsymbol{i}=(0,1,\\ldots,N-1), \n",
+ "\\label{_auto6} \\tag{17}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1f16ed28",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " y_j = \\frac{4 \\pi j}{N}-2\\pi \\quad \\forall \\, j \\in \\boldsymbol{j},\n",
+ "\\text{where}\\, \\boldsymbol{j}=(0,1,\\ldots,N-1), \n",
+ "\\label{_auto7} \\tag{18}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "28257dfb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " z_k = \\frac{4 \\pi k}{N}-2\\pi \\quad \\forall \\, k \\in \\boldsymbol{k},\n",
+ "\\text{where}\\, \\boldsymbol{k}=(0,1,\\ldots,N-1).\n",
+ "\\label{_auto8} \\tag{19}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "df5dd8f4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that these points are different from the standard (like $2\\pi j/N$) since\n",
+ "the domain\n",
+ "is set to $[-2\\pi, 2\\pi]^3$ and not the more common $[0, 2\\pi]^3$. We have"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e5ad43ee",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\boldsymbol{u} = \\mathcal{F}_x^{-1}\\left(\\mathcal{F}_y^{-1}\\left(\\mathcal{F}_z^{-1}\\left(\\hat{\\boldsymbol{u}}\\right)\\right)\\right) \\label{eq:uxyz} \\tag{20}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "332d71ce",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "with $\\boldsymbol{u} = \\{u(x_i, y_j, z_k)\\}_{(i,j,k)\\in \\boldsymbol{i} \\times \\boldsymbol{j} \\times \\boldsymbol{k}}$\n",
+ "and where $\\mathcal{F}_x^{-1}$ is the inverse Fourier transform along the direction $x$, for\n",
+ "all indices in the other direction. Note that the three\n",
+ "inverse FFTs are performed sequentially, one direction at the time, and that there is no\n",
+ "scaling factor due to\n",
+ "the definition used for the inverse [Fourier transform](https://mpi4py-fft.readthedocs.io/en/latest/dft.html)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e18610fd",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u(x_j) = \\sum_{l=-N/2}^{N/2-1} \\hat{u}_l e^{\\imath \\underline{l}\n",
+ "x_j}, \\quad \\,\\, \\forall \\, j \\in \\, \\boldsymbol{j}.\n",
+ "\\label{_auto9} \\tag{21}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f384ac43",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that this differs from the definition used by, e.g.,\n",
+ "[Numpy](https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.fft.html).\n",
+ "\n",
+ "The inner products used in Eqs. ([10](#eq:df_var2)), ([11](#eq:kg:du_var2)) may be\n",
+ "computed using forward FFTs. However, there is a tiny detail that deserves\n",
+ "a comment. The regular Fourier inner product is given as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "928dbba0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\int_{0}^{L} e^{\\imath \\underline{k}x} e^{- \\imath \\underline{l}x} dx = L\\, \\delta_{kl}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "157f8783",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where a weight function is chosen as $w(x) = 1$ and $\\delta_{kl}$ equals unity\n",
+ "for $k=l$ and zero otherwise. In Shenfun we choose instead to use a weight\n",
+ "function $w(x)=1/L$, such that the weighted inner product integrates to\n",
+ "unity:"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6b9f5897",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\int_{0}^{L} e^{\\imath \\underline{k}x} e^{- \\imath \\underline{l}x} \\frac{1}{L} dx = \\delta_{kl}.\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "84026af7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "With this weight function the (discrete) scalar product and the forward transform\n",
+ "are the same and we obtain:"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "98b58094",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\left(u, v \\right) = \\boldsymbol{\\hat{u}} =\n",
+ "\\left(\\frac{1}{N}\\right)^3\n",
+ "\\mathcal{F}_z\\left(\\mathcal{F}_y\\left(\\mathcal{F}_x\\left(\\boldsymbol{u}\\right)\\right)\\right).\n",
+ "\\label{_auto10} \\tag{22}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "736c335d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "From this we see that the variational forms ([10](#eq:df_var2)) and ([11](#eq:kg:du_var2))\n",
+ "may be written in terms of the Fourier transformed quantities $\\hat{\\boldsymbol{u}}$ and\n",
+ "$\\hat{\\boldsymbol{f}}$. Expanding the exact derivatives of the nabla operator, we have"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e0edb86f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "(\\nabla u, \\nabla v) =\n",
+ "\\left((\\underline{l}^2+\\underline{m}^2+\\underline{n}^2)\\hat{u}_{lmn}\\right), \n",
+ "\\label{_auto11} \\tag{23}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3d2ba41c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "(u, v) = \\left(\\hat{u}_{lmn}\\right), \n",
+ "\\label{_auto12} \\tag{24}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6ecb4c2c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "(u|u|^2, v) = \\left(\\widehat{u|u|^2}_{lmn}\\right)\n",
+ "\\label{_auto13} \\tag{25}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fdc7f2d9",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where the indices on the right hand side run over $(l, m, n) \\in \\boldsymbol{l} \\times \\boldsymbol{m} \\times \\boldsymbol{n}$.\n",
+ "The equations to be solved for each wavenumber can now be found directly as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "19dc93b3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\frac{\\partial \\hat{f}_{lmn}}{\\partial t} =\n",
+ "\\left(-(\\underline{l}^2+\\underline{m}^2+\\underline{n}^2+\\gamma)\\hat{u}_{lnm} + \\gamma \\widehat{u|u|^2}_{lnm}\\right), \\label{eq:df_var3} \\tag{26} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "95c68d2a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\frac{\\partial \\hat{u}_{lnm}}{\\partial t} = \\hat{f}_{lnm}. \\label{eq:kg:du_var3} \\tag{27}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "04ae7faf",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "There is more than one way to arrive at these equations. Taking the 3D Fourier\n",
+ "transform of both equations ([5](#eq:df)) and ([6](#eq:du)) is one obvious way.\n",
+ "With the Python module [shenfun](https://github.com/spectralDNS/shenfun), one can work with the\n",
+ "inner products as seen in ([10](#eq:df_var2)) and ([11](#eq:kg:du_var2)), or the Fourier\n",
+ "transforms directly. See for example Sec. [Runge-Kutta integrator](#sec:rk) for how $(\\nabla u, \\nabla\n",
+ "v)$ can be\n",
+ "implemented. In short, [shenfun](https://shenfun.readthedocs.io/en/latest/shenfun.html#module-shenfun) contains all the tools required to work with\n",
+ "the spectral Galerkin method, and we will now see how [shenfun](https://shenfun.readthedocs.io/en/latest/shenfun.html#module-shenfun) can be used to solve\n",
+ "the Klein-Gordon equation.\n",
+ "\n",
+ "For completion, we note that the discretized problem to solve can be formulated\n",
+ "with the Galerkin method as:\n",
+ "for all $t>0$, find $(f, u) \\in W^N \\times W^N$ such that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4df82afa",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\frac{\\partial}{\\partial t} (f, g) = -(\\nabla u, \\nabla g)\n",
+ "-\\gamma \\left( u - u|u|^2, g \\right) \\quad \\forall \\, g \\in W^{N}, \\label{eq:dff} \\tag{28} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b08ed918",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\frac{\\partial }{\\partial t} (u, v) = (f, v) \\quad \\forall \\, v \\in W^N. \\label{eq:kg:duu} \\tag{29}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a339ed0f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $u(x, y, z, 0)$ and $f(x, y, z, 0)$ are given as the initial conditions\n",
+ "according to Eq. ([2](#eq:init))."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "847c4d2e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Implementation\n",
+ "\n",
+ "To solve the Klein-Gordon equations we need to make use of the Fourier function\n",
+ "spaces defined in\n",
+ "[shenfun](https://shenfun.readthedocs.io/en/latest/shenfun.html#module-shenfun), and these are found in submodule\n",
+ "[shenfun.fourier.bases](https://shenfun.readthedocs.io/en/latest/shenfun.fourier.html#module-shenfun.fourier.bases).\n",
+ "The triply periodic domain allows for Fourier in all three directions, and we\n",
+ "can as such create one instance of this space using [FunctionSpace()](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.FunctionSpace) with\n",
+ "family ``Fourier``\n",
+ "for each direction. However, since the initial data are real, we\n",
+ "can take advantage of Hermitian symmetries and thus make use of a\n",
+ "real to complex class for one (but only one) of the directions, by specifying\n",
+ "``dtype='d'``. We can only make use of the\n",
+ "real-to-complex class for the direction that we choose to transform first with the forward\n",
+ "FFT, and the reason is obviously that the output from a forward transform of\n",
+ "real data is now complex. We may start implementing the solver as follows"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "82b448d1",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:26.278317Z",
+ "iopub.status.busy": "2024-05-24T12:36:26.277928Z",
+ "iopub.status.idle": "2024-05-24T12:36:26.919575Z",
+ "shell.execute_reply": "2024-05-24T12:36:26.917868Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "from shenfun import *\n",
+ "import numpy as np\n",
+ "import sympy as sp\n",
+ "\n",
+ "# Set size of discretization\n",
+ "N = (32, 32, 32)\n",
+ "\n",
+ "# Defocusing or focusing\n",
+ "gamma = 1\n",
+ "\n",
+ "rank = comm.Get_rank()\n",
+ "\n",
+ "# Create function spaces\n",
+ "K0 = FunctionSpace(N[0], 'F', domain=(-2*np.pi, 2*np.pi), dtype='D')\n",
+ "K1 = FunctionSpace(N[1], 'F', domain=(-2*np.pi, 2*np.pi), dtype='D')\n",
+ "K2 = FunctionSpace(N[2], 'F', domain=(-2*np.pi, 2*np.pi), dtype='d')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6be0674c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We now have three instances `K0`, `K1` and `K2`, corresponding to the space\n",
+ "([13](#eq:kg:Vn)), that each can be used to solve\n",
+ "one-dimensional problems. However, we want to solve a 3D problem, and for this\n",
+ "we need a tensor product space, like ([14](#eq:kg:Wn)), created as a tensor\n",
+ "product of these three spaces"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "31bae268",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:26.923540Z",
+ "iopub.status.busy": "2024-05-24T12:36:26.923329Z",
+ "iopub.status.idle": "2024-05-24T12:36:26.946586Z",
+ "shell.execute_reply": "2024-05-24T12:36:26.945459Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "T = TensorProductSpace(comm, (K0, K1, K2), **{'planner_effort':\n",
+ " 'FFTW_MEASURE'})"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bf3976b2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Here the `planner_effort`, which is a flag used by [FFTW](http://www.fftw.org), is optional. Possibel choices are from the list\n",
+ "(`FFTW_ESTIMATE`, `FFTW_MEASURE`, `FFTW_PATIENT`, `FFTW_EXHAUSTIVE`), and the\n",
+ "flag determines how much effort FFTW puts in looking for an optimal algorithm\n",
+ "for the current platform. Note that it is also possible to use FFTW [wisdom](http://www.fftw.org/fftw3_doc/Wisdom.html#Wisdom) with\n",
+ "`shenfun`, and as such, for production, one may perform exhaustive planning once\n",
+ "and then simply import the result of that planning later, as wisdom.\n",
+ "\n",
+ "The [TensorProductSpace](https://shenfun.readthedocs.io/en/latest/shenfun.html#shenfun.tensorproductspace.TensorProductSpace) instance `T` contains pretty much all we need for\n",
+ "computing inner products or fast transforms between real and wavenumber space.\n",
+ "However, since we are going to solve for a mixed system, it is convenient to also use the\n",
+ "[CompositeSpace](https://shenfun.readthedocs.io/en/latest/shenfun.html#shenfun.tensorproductspace.CompositeSpace) class"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7eb29c91",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:26.951144Z",
+ "iopub.status.busy": "2024-05-24T12:36:26.950928Z",
+ "iopub.status.idle": "2024-05-24T12:36:26.955036Z",
+ "shell.execute_reply": "2024-05-24T12:36:26.954215Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "TT = CompositeSpace([T, T])\n",
+ "TV = VectorSpace(T)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5e029c38",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Here the space `TV` will be used to compute gradients, which\n",
+ "explains why it is a vector.\n",
+ "\n",
+ "We need containers for the solution as well as intermediate work arrays for,\n",
+ "e.g., the Runge-Kutta method. Arrays are created using\n",
+ "[Sympy](http://www.sympy.org/en/index.html) for\n",
+ "initialization. Below `f` is initialized to 0,\n",
+ "whereas `u = 0.1*sp.exp(-(x**2 + y**2 + z**2))`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ce384d37",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:26.958453Z",
+ "iopub.status.busy": "2024-05-24T12:36:26.958340Z",
+ "iopub.status.idle": "2024-05-24T12:36:27.131100Z",
+ "shell.execute_reply": "2024-05-24T12:36:27.130042Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# Use sympy to set up initial condition\n",
+ "x, y, z = sp.symbols(\"x,y,z\", real=True)\n",
+ "ue = 0.1*sp.exp(-(x**2 + y**2 + z**2))\n",
+ "\n",
+ "fu = Array(TT, buffer=(0, ue)) # Solution array in physical space\n",
+ "f, u = fu # Split solution array by creating two views u and f\n",
+ "dfu = Function(TT) # Array for right hand sides\n",
+ "df, du = dfu # Split into views\n",
+ "Tp = T.get_dealiased((1.5, 1.5, 1.5))\n",
+ "up = Array(Tp) # Work array\n",
+ "\n",
+ "fu_hat = Function(TT) # Solution in spectral space\n",
+ "fu_hat = fu.forward()\n",
+ "f_hat, u_hat = fu_hat\n",
+ "\n",
+ "gradu = Array(TV) # Solution array for gradient"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0f7e0745",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The [Array](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.Array) class is a subclass of Numpy's [ndarray](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html),\n",
+ "without much more functionality than constructors that return arrays of the\n",
+ "correct shape according to the basis used in the construction. The\n",
+ "[Array](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.Array) represents the left hand side of ([16](#eq:usg)),\n",
+ "evaluated on the quadrature mesh. A different type\n",
+ "of array is returned by the [Function](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.Function)\n",
+ "class, that subclasses both Nympy's ndarray as well as an internal\n",
+ "[BasisFunction](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.BasisFunction)\n",
+ "class. An instance of the [Function](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.Function) represents the entire\n",
+ "spectral Galerkin function ([16](#eq:usg))."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cf89575c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Runge-Kutta integrator\n",
+ "\n",
+ "
\n",
+ "\n",
+ "We use an explicit fourth order Runge-Kutta integrator,\n",
+ "imported from [shenfun.utilities.integrators](https://shenfun.readthedocs.io/en/latest/shenfun.utilities.html#module-shenfun.utilities.integrators). The solver\n",
+ "requires one function to compute nonlinear terms,\n",
+ "and one to compute linear. But here we will make\n",
+ "just one function that computes both, and call it\n",
+ "`NonlinearRHS`:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e982a934",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:27.133933Z",
+ "iopub.status.busy": "2024-05-24T12:36:27.133807Z",
+ "iopub.status.idle": "2024-05-24T12:36:27.148529Z",
+ "shell.execute_reply": "2024-05-24T12:36:27.148100Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "uh = TrialFunction(T)\n",
+ "vh = TestFunction(T)\n",
+ "L = inner(grad(vh), -grad(uh)) + [inner(vh, -gamma*uh)]\n",
+ "L = la.SolverDiagonal(L).mat.scale\n",
+ "\n",
+ "def NonlinearRHS(self, fu, fu_hat, dfu_hat, **par):\n",
+ " global count, up\n",
+ " dfu_hat.fill(0)\n",
+ " f_hat, u_hat = fu_hat\n",
+ " df_hat, du_hat = dfu_hat\n",
+ " up = Tp.backward(u_hat, up)\n",
+ " df_hat = Tp.forward(gamma*up**3, df_hat)\n",
+ " df_hat += L*u_hat\n",
+ " du_hat[:] = f_hat\n",
+ " return dfu_hat"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "29c06ebf",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that `L` now is an array that represents the linear\n",
+ "coefficients in ([27](#eq:kg:du_var3)).\n",
+ "\n",
+ "All that is left is to write a function that is called\n",
+ "on each time step, which will allow us to store intermediate\n",
+ "solutions, compute intermediate energies, and plot\n",
+ "intermediate solutions. Since we will plot the same plot\n",
+ "many times, we create the figure first, and then simply update\n",
+ "the plotted arrays in the `update` function."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "1f4ce1d4",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:27.150490Z",
+ "iopub.status.busy": "2024-05-24T12:36:27.150385Z",
+ "iopub.status.idle": "2024-05-24T12:36:27.471764Z",
+ "shell.execute_reply": "2024-05-24T12:36:27.470806Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "%matplotlib inline\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "X = T.local_mesh(True)\n",
+ "if rank == 0:\n",
+ " plt.figure()\n",
+ " image = plt.contourf(X[1][..., 0], X[0][..., 0], u[..., N[2]//2], 100)\n",
+ " plt.draw()\n",
+ " plt.pause(1e-6)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "09b92d8a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The actual `update` function is"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0547e688",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:27.474593Z",
+ "iopub.status.busy": "2024-05-24T12:36:27.474345Z",
+ "iopub.status.idle": "2024-05-24T12:36:27.481967Z",
+ "shell.execute_reply": "2024-05-24T12:36:27.481560Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# Get wavenumbers\n",
+ "K = np.array(T.local_wavenumbers(True, True, True))\n",
+ "\n",
+ "def update(self, fu, fu_hat, t, tstep, **params):\n",
+ " global gradu\n",
+ "\n",
+ " transformed = False\n",
+ " if rank == 0 and tstep % params['plot_tstep'] == 0 and params['plot_tstep'] > 0:\n",
+ " fu = fu_hat.backward(fu)\n",
+ " f, u = fu[:]\n",
+ " self.image = plt.contourf(X[1][..., 0], X[0][..., 0], u[..., N[2]//2], 100)\n",
+ " display(self.image, clear=True)\n",
+ " plt.pause(1e-6)\n",
+ " transformed = True\n",
+ "\n",
+ " if tstep % params['Compute_energy'] == 0:\n",
+ " if transformed is False:\n",
+ " fu = fu_hat.backward(fu)\n",
+ " f, u = fu\n",
+ " f_hat, u_hat = fu_hat\n",
+ " ekin = 0.5*energy_fourier(f_hat, T)\n",
+ " es = 0.5*energy_fourier(1j*(K*u_hat), T)\n",
+ " eg = gamma*np.sum(0.5*u**2 - 0.25*u**4)/np.prod(np.array(N))\n",
+ " eg = comm.allreduce(eg)\n",
+ " gradu = TV.backward(1j*(K[0]*u_hat[0]+K[1]*u_hat[1]+K[2]*u_hat[2]), gradu)\n",
+ " ep = comm.allreduce(np.sum(f*gradu)/np.prod(np.array(N)))\n",
+ " ea = comm.allreduce(np.sum(np.array(X)*(0.5*f**2 + 0.5*gradu**2 - (0.5*u**2 - 0.25*u**4)*f))/np.prod(np.array(N)))\n",
+ " if rank == 0:\n",
+ " params['energy'][0] += \"Time = %2.2f Total energy = %2.8e Linear momentum %2.8e Angular momentum %2.8e \\n\" %(t, ekin+es+eg, ep, ea)\n",
+ " print(params['energy'][0])\n",
+ " comm.barrier()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2654c25b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "With all functions in place, the actual integrator\n",
+ "can be created and called as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b5ab745a",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:27.484111Z",
+ "iopub.status.busy": "2024-05-24T12:36:27.484008Z",
+ "iopub.status.idle": "2024-05-24T12:36:31.573499Z",
+ "shell.execute_reply": "2024-05-24T12:36:31.572872Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "par = {'Compute_energy': 10,\n",
+ " 'plot_tstep': 10,\n",
+ " 'end_time': 1}\n",
+ "dt = 0.005\n",
+ "integrator = RK4(TT, N=NonlinearRHS, update=update, energy=[\"\"], **par)\n",
+ "integrator.setup(dt)\n",
+ "fu_hat = integrator.solve(fu, fu_hat, dt, (0, par['end_time']))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "57859b90",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "A complete solver is found [here](https://github.com/spectralDNS/shenfun/blob/master/demo/KleinGordon.py).\n",
+ "\n",
+ "\n",
+ "\n",
+ "1.
**A.-M. Wazwaz**. New Travelling Wave Solutions to the Boussinesq and the Klein-Gordon Equations, *Communications in Nonlinear Science and Numerical Simulation*, 13(5), pp. 889-901, [doi: 10.1016/j.cnsns.2006.08.005](https://dx.doi.org/10.1016/j.cnsns.2006.08.005), 2008."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/demos/KuramatoSivashinsky/kuramatosivashinsky.ipynb b/docs/demos/KuramatoSivashinsky/kuramatosivashinsky.ipynb
new file mode 100644
index 00000000..02787a75
--- /dev/null
+++ b/docs/demos/KuramatoSivashinsky/kuramatosivashinsky.ipynb
@@ -0,0 +1,961 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "0495226a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "\n",
+ "# Demo - Kuramato-Sivashinsky equation\n",
+ "**Mikael Mortensen** (email: `mikaem@math.uio.no`), Department of Mathematics, University of Oslo.\n",
+ "\n",
+ "Date: **April 13, 2018**\n",
+ "\n",
+ "**Summary.** This is a demonstration of how the Python module [shenfun](https://github.com/spectralDNS/shenfun) can be used to solve the time-dependent,\n",
+ "nonlinear Kuramato-Sivashinsky equation, in a doubly periodic domain. The demo is implemented in\n",
+ "a single Python file [KuramatoSivashinsky.py](https://github.com/spectralDNS/shenfun/blob/master/demo/Kuramato_Sivashinsky.py), and it may be run\n",
+ "in parallel using MPI.\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "
Figure 1: Movie showing the evolution of the solution of the Kuramato-Sivashinsky equation.
\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1b82a490",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## The Kuramato-Sivashinsky equation\n",
+ "\n",
+ "The Kuramato-Sivashinsky (KS) equation is known for its chaotic bahaviour, and it is\n",
+ "often used in study of turbulence or turbulent combustion. We will here solve\n",
+ "the KS equation in a doubly periodic domain $\\Omega=[-30\\pi, 30\\pi)^2$, starting from a\n",
+ "single Gaussian pulse"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "40f1ebeb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\frac{\\partial u(\\boldsymbol{x},t)}{\\partial t} + \\nabla^2 u(\\boldsymbol{x},t) + \\nabla^4\n",
+ "u(\\boldsymbol{x},t) + |\\nabla u(\\boldsymbol{x},t)|^2 = 0 \\quad \\text{for }\\, \\boldsymbol{x} \\in \\Omega\n",
+ "\\label{eq:ks} \\tag{1} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0bf3843e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "u(\\boldsymbol{x}, 0) = \\exp(-0.01 \\boldsymbol{x} \\cdot \\boldsymbol{x}) \\notag\n",
+ "\\label{_auto1} \\tag{2}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a3f91340",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Spectral Galerkin method\n",
+ "\n",
+ "
\n",
+ "The PDE in ([1](#eq:ks)) can be solved with many different\n",
+ "numerical methods. We will here use the [shenfun](https://github.com/spectralDNS/shenfun) software and this software makes use of\n",
+ "the spectral Galerkin method. Being a Galerkin method, we need to reshape the\n",
+ "governing equations into proper variational forms, and this is done by\n",
+ "multiplying ([1](#eq:ks)) with the complex conjugate of a proper\n",
+ "test function and then integrating\n",
+ "over the domain. To this end we use testfunction $v\\in W^N(\\Omega)$, where $W^N(\\Omega)$\n",
+ "is a suitable function space (defined in Eq. ([7](#eq:Wn))), and obtain"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "36175e5e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\frac{\\partial}{\\partial t} \\int_{\\Omega} u\\, \\overline{v}\\, w \\,dx = -\\int_{\\Omega}\n",
+ "\\left(\\nabla^2 u + \\nabla^4 u \\ + |\\nabla u|^2 \\right) \\overline{v} \\, w \\,dx.\n",
+ "\\label{eq:du_var} \\tag{3}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0b70e9df",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the overline is used to indicate a complex conjugate, whereas $w$\n",
+ "is a weight function. The function $u$\n",
+ "is now to be considered a trial function, and the integrals over the\n",
+ "domain are often referred to as inner products. With inner product notation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ce485733",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\left(u, v\\right) = \\int_{\\Omega} u \\, \\overline{v} \\, w \\, dx.\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "571d5c61",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "the variational problem can be formulated as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e0115f99",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\frac{\\partial}{\\partial t} (u, v) = -\\left(\\nabla^2 u + \\nabla^4 u + |\\nabla u|^2,\n",
+ "v \\right). \\label{eq:du_var2} \\tag{4}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4bd736f6",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The space and time discretizations are\n",
+ "still left open. There are numerous different approaches that one could take for\n",
+ "discretizing in time. Here we will use a fourth order exponential Runge-Kutta\n",
+ "method."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a3163d74",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Discretization\n",
+ "\n",
+ "We discretize the model equation in space using continuously differentiable\n",
+ "Fourier basis functions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1316d7f3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\phi_l(x) = e^{\\imath \\underline{l} x}, \\quad -\\infty < l < \\infty,\n",
+ "\\label{_auto2} \\tag{5}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cbfa19f1",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $l$ is the wavenumber, and $\\underline{l}=\\frac{2\\pi}{L}l$ is the scaled wavenumber, scaled with domain\n",
+ "length $L$ (here $60\\pi$). Since we want to solve these equations on a computer, we need to choose\n",
+ "a finite number of test functions. A discrete function space $V^N$ can be defined as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fdce7ce9",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "V^N(x) = \\text{span} \\{\\phi_l(x)\\}_{l\\in \\boldsymbol{l}}, \\label{eq:Vn} \\tag{6}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "621c6e53",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $N$ is chosen as an even positive integer and $\\boldsymbol{l} = (-N/2,\n",
+ "-N/2+1, \\ldots, N/2-1)$. And now, since $\\Omega$ is a\n",
+ "two-dimensional domain, we can create a tensor product of two such one-dimensional\n",
+ "spaces:"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d595ac98",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "W^{\\boldsymbol{N}}(x, y) = V^N(x) \\otimes V^N(y), \\label{eq:Wn} \\tag{7}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "aa8262e9",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\boldsymbol{N} = (N, N)$. Obviously, it is not necessary to use the\n",
+ "same number ($N$) of basis functions for each direction, but it is done here\n",
+ "for simplicity. A 2D tensor product basis function is now defined as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "46887195",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\Phi_{lm}(x,y) = e^{\\imath \\underline{l} x} e^{\\imath \\underline{m} y}\n",
+ "= e^{\\imath (\\underline{l}x + \\underline{m}y )},\n",
+ "\\label{_auto3} \\tag{8}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "90815bf3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where the indices for $y$-direction are $\\underline{m}=\\frac{2\\pi}{L}m$, and\n",
+ "$\\boldsymbol{m}$ is the same set as $\\boldsymbol{l}$ due to using the same number of basis functions for each direction. One\n",
+ "distinction, though, is that for the $y$-direction expansion coefficients are only stored for\n",
+ "$m=(0, 1, \\ldots, N/2)$ due to Hermitian symmetry (real input data).\n",
+ "\n",
+ "We now look for solutions of the form"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "74359e27",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u(x, y) = \\sum_{l=-N/2}^{N/2-1}\\sum_{m=-N/2}^{N/2-1}\n",
+ "\\hat{u}_{lm} \\Phi_{lm}(x,y).\n",
+ "\\label{_auto4} \\tag{9}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4d8a5f2b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The expansion coefficients $\\hat{u}_{lm}$ can be related directly to the solution $u(x,\n",
+ "y)$ using Fast Fourier Transforms (FFTs) if we are satisfied with obtaining\n",
+ "the solution in quadrature points corresponding to"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fa50c86c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " x_i = \\frac{60 \\pi i}{N}-30\\pi \\quad \\forall \\, i \\in \\boldsymbol{i},\n",
+ "\\text{where}\\, \\boldsymbol{i}=(0,1,\\ldots,N-1), \n",
+ "\\label{_auto5} \\tag{10}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "66c43e0d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " y_j = \\frac{60 \\pi j}{N}-30\\pi \\quad \\forall \\, j \\in \\boldsymbol{j},\n",
+ "\\text{where}\\, \\boldsymbol{j}=(0,1,\\ldots,N-1).\n",
+ "\\label{_auto6} \\tag{11}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bdd44fd7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that these points are different from the standard (like $2\\pi j/N$) since\n",
+ "the domain\n",
+ "is set to $[-30\\pi, 30\\pi]^2$ and not the more common $[0, 2\\pi]^2$. We now have"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ae46333a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\boldsymbol{u} =\n",
+ "\\mathcal{F}_x^{-1}\\left(\\mathcal{F}_y^{-1}\\left(\\boldsymbol{\\hat{u}}\\right)\\right),\n",
+ "\\label{_auto7} \\tag{12}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9ce62293",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\boldsymbol{u} = \\{u(x_i, y_j)\\}_{(i,j)\\in \\boldsymbol{i} \\times \\boldsymbol{j}}$,\n",
+ "$\\boldsymbol{\\hat{u}} = \\{\\hat{u}_{lm}\\}_{(l,m)\\in \\boldsymbol{l} \\times \\boldsymbol{m}}$\n",
+ "and $\\mathcal{F}_x^{-1}$ is the inverse Fourier transform along direction\n",
+ "$x$, for all indices in the other direction. Note that the two\n",
+ "inverse FFTs are performed sequentially, one direction at the time, and that\n",
+ "there is no scaling factor due\n",
+ "the definition used for the inverse\n",
+ "[Fourier transform](https://mpi4py-fft.readthedocs.io/en/latest/dft.html):"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2da0c841",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u(x_j) = \\sum_{l=-N/2}^{N/2-1} \\hat{u}_l e^{\\imath \\underline{l}\n",
+ "x_j}, \\quad \\,\\, \\forall \\, j \\in \\, \\boldsymbol{j}.\n",
+ "\\label{_auto8} \\tag{13}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bde1ab80",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that this differs from the definition used by, e.g.,\n",
+ "[Numpy](https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.fft.html).\n",
+ "\n",
+ "The inner products used in Eq. ([4](#eq:du_var2)) may be\n",
+ "computed using forward FFTs (using weight functions $w=1/L$):"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ff7d3819",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\boldsymbol{\\hat{u}} =\n",
+ "\\frac{1}{N^2}\n",
+ "\\mathcal{F}_y\\left(\\mathcal{F}_x\\left(\\boldsymbol{u}\\right)\\right),\n",
+ "\\label{_auto9} \\tag{14}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e3dcec3c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "From this we see that the variational forms\n",
+ "may be written in terms of the Fourier transformed $\\hat{u}$. Expanding the\n",
+ "exact derivatives of the nabla operator, we have"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "125917d9",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "(\\nabla^2 u, v) =\n",
+ "\\left(-(\\underline{l}^2+\\underline{m}^2)\\hat{u}_{lm}\\right), \n",
+ "\\label{_auto10} \\tag{15}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "de4984ae",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "(\\nabla^4 u, v) = \\left((\\underline{l}^2+\\underline{m}^2)^2\\hat{u}_{lm}\\right), \n",
+ "\\label{_auto11} \\tag{16}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c7b90c06",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "(|\\nabla u|^2, v) = \\left(\\widehat{|\\nabla u|^2}_{lm}\\right),\n",
+ "\\label{_auto12} \\tag{17}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "72605910",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where the indices on the right hand side run over $\\boldsymbol{l} \\times \\boldsymbol{m}$.\n",
+ "We find that the equation to be solved for each wavenumber can be found directly as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f50b3d25",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\frac{\\partial \\hat{u}_{lm}}{\\partial t} =\n",
+ "\\left(\\underline{l}^2+\\underline{m}^2 -\n",
+ "(\\underline{l}^2+\\underline{m}^2)^2\\right)\\hat{u}_{lm} - \\widehat{|\\nabla u|^2}_{lm},\n",
+ "\\label{eq:du_var3} \\tag{18}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "20229c39",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Implementation\n",
+ "\n",
+ "The model equation ([1](#eq:ks)) is implemented in shenfun using Fourier basis functions for\n",
+ "both $x$ and $y$ directions. We start the solver by implementing necessary\n",
+ "functionality from required modules like [Numpy](https://numpy.org), [Sympy](https://sympy.org)\n",
+ "and [matplotlib](https://matplotlib.org), in\n",
+ "addition to [shenfun](https://github.com/spectralDNS/shenfun):"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0c1a7c93",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:48.231256Z",
+ "iopub.status.busy": "2024-05-24T12:36:48.231055Z",
+ "iopub.status.idle": "2024-05-24T12:36:49.052248Z",
+ "shell.execute_reply": "2024-05-24T12:36:49.051521Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "from sympy import symbols, exp, lambdify\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "import time\n",
+ "from shenfun import *"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b9d76d97",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The size of the problem (in real space) is then specified, before creating\n",
+ "the [TensorProductSpace](https://shenfun.readthedocs.io/en/latest/shenfun.html#shenfun.tensorproductspace.TensorProductSpace), which is using a tensor product of two\n",
+ "one-dimensional Fourier function spaces. We also\n",
+ "create a [VectorSpace](https://shenfun.readthedocs.io/en/latest/shenfun.html#shenfun.tensorproductspace.VectorSpace), since this is required for computing the\n",
+ "gradient of the scalar field `u`. The gradient is required for the nonlinear\n",
+ "term."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "063c35c2",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:49.056546Z",
+ "iopub.status.busy": "2024-05-24T12:36:49.056261Z",
+ "iopub.status.idle": "2024-05-24T12:36:49.629121Z",
+ "shell.execute_reply": "2024-05-24T12:36:49.624514Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# Size of discretization\n",
+ "N = (128, 128)\n",
+ "\n",
+ "K0 = FunctionSpace(N[0], 'F', domain=(-30*np.pi, 30*np.pi), dtype='D')\n",
+ "K1 = FunctionSpace(N[1], 'F', domain=(-30*np.pi, 30*np.pi), dtype='d')\n",
+ "T = TensorProductSpace(comm, (K0, K1), **{'planner_effort': 'FFTW_MEASURE'})\n",
+ "TV = VectorSpace([T, T])\n",
+ "Tp = T.get_dealiased((1.5, 1.5))\n",
+ "TVp = VectorSpace(Tp)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a3411ce3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Test and trialfunctions are required for assembling the variational forms:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "3102955a",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:49.632923Z",
+ "iopub.status.busy": "2024-05-24T12:36:49.632713Z",
+ "iopub.status.idle": "2024-05-24T12:36:49.637407Z",
+ "shell.execute_reply": "2024-05-24T12:36:49.635009Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "u = TrialFunction(T)\n",
+ "v = TestFunction(T)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7ad972cb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and some arrays are required to hold the solution. We also create an array\n",
+ "`gradu`, that will be used to compute the gradient in the nonlinear term.\n",
+ "Finally, the wavenumbers are collected in an array `K`. Here one feature is worth\n",
+ "mentioning. The gradient in spectral space can be computed as `1j*K*U_hat`.\n",
+ "However, since this is an odd derivative, and we are using an even number `N`\n",
+ "for the size of the domain, the highest wavenumber must be set to zero. This is\n",
+ "the purpose of the last keyword argument to `local_wavenumbers` below."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b9035407",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:49.643702Z",
+ "iopub.status.busy": "2024-05-24T12:36:49.643494Z",
+ "iopub.status.idle": "2024-05-24T12:36:49.665807Z",
+ "shell.execute_reply": "2024-05-24T12:36:49.664650Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "x, y = symbols(\"x,y\", real=True)\n",
+ "ue = exp(-0.01*(x**2+y**2))\n",
+ "U = Array(T, buffer=ue)\n",
+ "U_hat = Function(T)\n",
+ "U_hat = U.forward(U_hat)\n",
+ "mask = T.get_mask_nyquist()\n",
+ "U_hat.mask_nyquist(mask)\n",
+ "gradu = Array(TVp)\n",
+ "K = np.array(T.local_wavenumbers(True, True, eliminate_highest_freq=True))\n",
+ "X = T.local_mesh(True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5681887e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that using this `K` in computing derivatives has the same effect as\n",
+ "achieved by symmetrizing the Fourier series by replacing the first sum below\n",
+ "with the second when computing odd derivatives."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "573e1d22",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u = \\sum_{k=-N/2}^{N/2-1} \\hat{u}_k e^{\\imath k x}\n",
+ "\\label{_auto13} \\tag{19}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "434519b9",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "u = \\sideset{}{'}\\sum_{k=-N/2}^{N/2} \\hat{u}_k e^{\\imath k x}\n",
+ "\\label{_auto14} \\tag{20}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "06e92d12",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Here $\\sideset{}{'}\\sum$ means that the first and last items in the sum are\n",
+ "divided by two. Note that the two sums are equal as they stand (due to aliasing), but only the\n",
+ "latter (known as the Fourier interpolant) gives the correct (zero) derivative of\n",
+ "the basis with the highest wavenumber.\n",
+ "\n",
+ "Shenfun has a few integrators implemented in the [shenfun.utilities.integrators](https://shenfun.readthedocs.io/en/latest/shenfun.utilities.html#module-shenfun.utilities.integrators)\n",
+ "submodule. Two such integrators are the 4th order explicit Runge-Kutta method\n",
+ "`RK4`, and the exponential 4th order Runge-Kutta method `ETDRK4`. Both these\n",
+ "integrators need two methods provided by the problem being solved, representing\n",
+ "the linear and nonlinear terms in the problem equation. We define two methods\n",
+ "below, called `LinearRHS` and `NonlinearRHS`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "80301cc6",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:49.669821Z",
+ "iopub.status.busy": "2024-05-24T12:36:49.669721Z",
+ "iopub.status.idle": "2024-05-24T12:36:49.673327Z",
+ "shell.execute_reply": "2024-05-24T12:36:49.672288Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "def LinearRHS(self, u,**params):\n",
+ " # Assemble diagonal bilinear forms\n",
+ " return -(div(grad(u))+div(grad(div(grad(u)))))\n",
+ "\n",
+ "def NonlinearRHS(self, U, U_hat, dU, gradu, **params):\n",
+ " # Assemble nonlinear term\n",
+ " gradu = TVp.backward(1j*K*U_hat, gradu)\n",
+ " dU = Tp.forward(0.5*(gradu[0]*gradu[0]+gradu[1]*gradu[1]), dU)\n",
+ " dU.mask_nyquist(mask)\n",
+ " dU *= -1\n",
+ " return dU"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "762040be",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The code should, hopefully, be self-explanatory.\n",
+ "\n",
+ "All that remains now is to setup the\n",
+ "integrator plus some plotting functionality for visualizing the results. Note\n",
+ "that visualization is only nice when running the code in serial. For parallel,\n",
+ "it is recommended to use [HDF5File](https://shenfun.readthedocs.io/en/latest/mpi4py_fft.io.html#mpi4py_fft.io.h5py_file.HDF5File), to store intermediate results to the HDF5\n",
+ "format, for later viewing in, e.g., Paraview.\n",
+ "\n",
+ "We create an update function for plotting intermediate results with a\n",
+ "cool colormap:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8f63facd",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:49.676464Z",
+ "iopub.status.busy": "2024-05-24T12:36:49.676184Z",
+ "iopub.status.idle": "2024-05-24T12:36:49.679948Z",
+ "shell.execute_reply": "2024-05-24T12:36:49.678987Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "from IPython.display import display\n",
+ "\n",
+ "# Integrate using an exponential time integrator\n",
+ "def update(self, u, u_hat, t, tstep, **params):\n",
+ " if tstep % params['plot_step'] == 0 and params['plot_step'] > 0:\n",
+ " u = u_hat.backward(u)\n",
+ " self.image = plt.contourf(X[0], X[1], u, 256, cmap=plt.get_cmap('hot'))\n",
+ " self.image.axes.set_title(f'Energy {dx(u**2)}')\n",
+ " display(self.image, clear=True)\n",
+ " plt.pause(1e-6)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2d717922",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Now all that remains is to create the integrator and call it"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ab20ac9d",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:49.682688Z",
+ "iopub.status.busy": "2024-05-24T12:36:49.682515Z",
+ "iopub.status.idle": "2024-05-24T12:36:55.442780Z",
+ "shell.execute_reply": "2024-05-24T12:36:55.441648Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "par = {'plot_step': 100, 'gradu': gradu}\n",
+ "dt = 0.01\n",
+ "end_time = 10\n",
+ "integrator = ETDRK4(T, L=LinearRHS, N=NonlinearRHS, update=update, image=None, **par)\n",
+ "#integrator = RK4(T, L=LinearRHS, N=NonlinearRHS, update=update, **par)\n",
+ "integrator.setup(dt)\n",
+ "U_hat = integrator.solve(U, U_hat, dt, (0, end_time))"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "shenfun",
+ "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.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/demos/MixingBases/mixingbases.ipynb b/docs/demos/MixingBases/mixingbases.ipynb
new file mode 100644
index 00000000..05590caa
--- /dev/null
+++ b/docs/demos/MixingBases/mixingbases.ipynb
@@ -0,0 +1,652 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "d22ffe10",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "\n",
+ "# Demo - Mixed bases for the Helmholtz problem\n",
+ "**Mikael Mortensen** (email: `mikaem@math.uio.no`), Department of Mathematics, University of Oslo.\n",
+ "\n",
+ "Date: **March 22, 2021**\n",
+ "\n",
+ "**Summary.** This demo shows how to solve the Helmholtz equation using different\n",
+ "bases for test and trial spaces. The use of different bases leads for\n",
+ "some optimal combinations to highly sparse and well-conditioned\n",
+ "coefficient matrices."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e66d8420",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## The Helmholtz problem\n",
+ "\n",
+ "We will consider Helmholtz equation with homogeneous Dirichlet boundary conditions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fc92d314",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\alpha u - u^{''} = f \\quad \\text{in} \\, {I}=(-1, 1), \\quad u(\\pm 1) = 0,\n",
+ "\\label{_auto1} \\tag{1}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "df92a93f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\alpha \\in \\mathbb{R^+}$. The relevant function space for the Dirichlet problem is"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c0ee2909",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " S_N=\\text{span}\\{T_k\\}_{k=0}^{N-1}, \\quad V_{N} = \\{v \\in {S}_N\\,|\\, v(\\pm 1) = 0\\},\n",
+ "\\label{_auto2} \\tag{2}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cfb1e1a0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and the Chebyshev-Galerkin (CG) method is to find $u_N \\in V_N$ such that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c0137bd8",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\label{eq:dirGalerkin} \\tag{3}\n",
+ " \\alpha (u_N, v)_{\\omega^{\\sigma}} -(u^{''}_N, v)_{\\omega^{\\sigma}} = (f, v)_{\\omega^{\\sigma}}, \\forall \\, v \\in V_N,\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "118ec8b5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $(u,v)_{\\omega^{\\sigma}}=\\int_{{I}}uv\\omega^{\\sigma} dx$ is the scalar product in the weighted space $L^2_{\\omega^{\\sigma}}({I})$.\n",
+ "\n",
+ "Shenfun has implemented three different Chebyshev Dirichlet\n",
+ "basis functions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8a6ae7d4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\label{eq:shen} \\tag{4}\n",
+ "\\phi_k = T_k-T_{k+2}, \\quad k=0,1, \\ldots, N-3,\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "56b8b2b8",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\label{eq:heinrichs} \\tag{5}\n",
+ "\\varphi_k = (1-x^2)T_k, \\quad k=0,1, \\ldots, N-3,\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4bb15362",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\label{eq:dirichletU} \\tag{6}\n",
+ "\\psi_k = U_k-\\frac{k+1}{k+3}U_{k+2}, \\quad k=0,1, \\ldots, N-3.\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f0bf61eb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "These three bases are all linearly dependent and they are all bases\n",
+ "for $V_N$."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0df870c4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Implementation\n",
+ "\n",
+ "We can get all three function spaces as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f1f9ca5d",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:51.609457Z",
+ "iopub.status.busy": "2024-05-24T12:37:51.609305Z",
+ "iopub.status.idle": "2024-05-24T12:37:52.333091Z",
+ "shell.execute_reply": "2024-05-24T12:37:52.331537Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "from shenfun import *\n",
+ "N = 40\n",
+ "V0 = FunctionSpace(N, 'C', basis='ShenDirichlet')\n",
+ "V1 = FunctionSpace(N, 'C', basis='Heinrichs')\n",
+ "V2 = FunctionSpace(N, 'U', basis='CompactDirichlet')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e31306bc",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $V0 = \\text{span}\\{\\phi_k\\}_{k=0}^{N-3}$,\n",
+ "$V1 = \\text{span}\\{\\varphi_k\\}_{k=0}^{N-3}$ and\n",
+ "$V2 = \\text{span}\\{\\psi_k\\}_{k=0}^{N-3}$. Now, to solve the Helmholtz problem we simply need to choose\n",
+ "test and trial bases. Shen's original method is using\n",
+ "`V0` for both. To assemble the stiffness and mass matrices\n",
+ "for this choice do"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c0a4b817",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:52.340208Z",
+ "iopub.status.busy": "2024-05-24T12:37:52.339832Z",
+ "iopub.status.idle": "2024-05-24T12:37:52.345709Z",
+ "shell.execute_reply": "2024-05-24T12:37:52.344619Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "u = TrialFunction(V0)\n",
+ "v = TestFunction(V0)\n",
+ "A = inner(v, div(grad(u)))\n",
+ "B = inner(v, u)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ebc3bfe4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "A manufactured solution can be chosen using [Sympy](https://www.sympy.org)\n",
+ "We choose"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "116f1647",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u(x) = \\sin \\left( 2 \\pi \\cos \\left( 2 \\pi x \\right) \\right)\n",
+ "\\label{_auto3} \\tag{7}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3ac72ba9",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "implemented as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b621fdd7",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:52.350040Z",
+ "iopub.status.busy": "2024-05-24T12:37:52.349833Z",
+ "iopub.status.idle": "2024-05-24T12:37:52.356609Z",
+ "shell.execute_reply": "2024-05-24T12:37:52.356261Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "import sympy as sp\n",
+ "x = sp.Symbol('x', real=True)\n",
+ "ue = sp.sin(2*sp.pi*sp.cos(2*sp.pi*x))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8ed01c45",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The right hand side $f$ of Helmholtz equation is"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b7648fc4",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:52.358262Z",
+ "iopub.status.busy": "2024-05-24T12:37:52.358166Z",
+ "iopub.status.idle": "2024-05-24T12:37:52.748000Z",
+ "shell.execute_reply": "2024-05-24T12:37:52.747339Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "alpha = 1\n",
+ "f = sp.simplify(alpha*ue-ue.diff(x, 2))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5c02f31e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "To solve the problem we can do"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "341119de",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:52.754670Z",
+ "iopub.status.busy": "2024-05-24T12:37:52.754529Z",
+ "iopub.status.idle": "2024-05-24T12:37:52.780628Z",
+ "shell.execute_reply": "2024-05-24T12:37:52.777201Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "fj = Array(V0, buffer=f) # Get f on quadrature mesh\n",
+ "f_hat = inner(v, fj) # Compute right hand side\n",
+ "M = alpha*B - A # Get coefficient matrix\n",
+ "u_hat = Function(V0) # Container for the solution\n",
+ "sol = la.Solver(M) # Solver\n",
+ "u_hat = sol(f_hat, u_hat) # Solve"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ff687ebc",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Compare with exact solution."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c29b3b52",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:52.791460Z",
+ "iopub.status.busy": "2024-05-24T12:37:52.791020Z",
+ "iopub.status.idle": "2024-05-24T12:37:52.852240Z",
+ "shell.execute_reply": "2024-05-24T12:37:52.849580Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "uj = Array(V0, buffer=ue)\n",
+ "error = inner(1, (u_hat.backward()-uj)**2)\n",
+ "print('Error =', error)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d3104bb4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Now that was the solution for test and trial bases from the same\n",
+ "basis ([4](#eq:shen)). Let us create a function that takes any\n",
+ "test and any trial basis, any manufactured solution and any $\\alpha$\n",
+ "in the Helmholtz equation. We let the function return either\n",
+ "the L2-error norm, the condition number of the Helmholtz\n",
+ "coefficient matrix, or the matrix itself."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e7fc2aff",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:52.855887Z",
+ "iopub.status.busy": "2024-05-24T12:37:52.855234Z",
+ "iopub.status.idle": "2024-05-24T12:37:52.862642Z",
+ "shell.execute_reply": "2024-05-24T12:37:52.861860Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "def main(N, test, trial, alpha=1, method=0, ue=sp.sin(2*sp.pi*sp.cos(2*sp.pi*x))):\n",
+ " \"\"\"Solve Helmholtz problem and return L2-error, condition number or matrix\n",
+ "\n",
+ " Parameters\n",
+ " ----------\n",
+ " N : int\n",
+ " Number of quadrature points\n",
+ " test, trial : int\n",
+ " Test and trial functions.\n",
+ " 0 = :math:`T_k-T_{k+2}`\n",
+ " 1 = :math:`(1-x^2)T_k`\n",
+ " 2 = :math:`U_k-\\frac{k+1}{k+3}U_{k+2}`\n",
+ " alpha : Helmholtz parameter\n",
+ " method : int\n",
+ " 0 = Return L2-error norm\n",
+ " 1 = Return condition number of matrix\n",
+ " 2 = Return Helmholtz matrix\n",
+ " ue : Sympy function, optional\n",
+ " The manufactured solution with homogeneous boundary conditions.\n",
+ "\n",
+ " Note\n",
+ " ----\n",
+ " Inhomogeneous boundary conditions require a small rewrite, but is\n",
+ " not difficult.\n",
+ "\n",
+ " \"\"\"\n",
+ " bases = {0: ('C', 'ShenDirichlet'), 1: ('C', 'Heinrichs'), 2: ('U', 'CompactDirichlet')}\n",
+ " test = FunctionSpace(N, bases[test][0], basis=bases[test][1])\n",
+ " trial= FunctionSpace(N, bases[trial][0], basis=bases[trial][1])\n",
+ " # Check that boundary conditions are homogeneous\n",
+ " assert abs(ue.subs(x, -1)) < 1e-8 and abs(ue.subs(x, 1)) < 1e-8\n",
+ " u = TrialFunction(trial)\n",
+ " v = TestFunction(test)\n",
+ " f = sp.simplify(alpha*ue-ue.diff(x, 2))\n",
+ " fj = Array(test, buffer=f) # Get f on quadrature mesh\n",
+ " f_hat = inner(v, fj) # Compute right hand side\n",
+ " B = inner(v, u)\n",
+ " A = inner(v, div(grad(u)))\n",
+ " M = alpha*B-A\n",
+ " if method == 1:\n",
+ " return np.linalg.cond(M.diags('csr').toarray())\n",
+ " if method == 2:\n",
+ " return M\n",
+ "\n",
+ " u_hat = Function(trial)\n",
+ " sol = la.Solver(M)\n",
+ " u_hat = sol(f_hat, u_hat)\n",
+ " uj = Array(trial, buffer=ue)\n",
+ " error = np.sqrt(inner(1, (u_hat.backward()-uj)**2))\n",
+ " return error"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "311641c8",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Let us first try basis ([4](#eq:shen)) as test function and\n",
+ "([5](#eq:heinrichs)) as trial function. Use otherwise\n",
+ "default parameters."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6a61d76e",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:52.865623Z",
+ "iopub.status.busy": "2024-05-24T12:37:52.865527Z",
+ "iopub.status.idle": "2024-05-24T12:37:53.192373Z",
+ "shell.execute_reply": "2024-05-24T12:37:53.191860Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "error = main(100, 0, 1)\n",
+ "print(error)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "19538c44",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "So the error is small in deed. Perhaps more interesting, let's\n",
+ "look at the sparsity pattern of the coefficient matrix"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "21ff1456",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:53.197472Z",
+ "iopub.status.busy": "2024-05-24T12:37:53.197343Z",
+ "iopub.status.idle": "2024-05-24T12:37:53.909816Z",
+ "shell.execute_reply": "2024-05-24T12:37:53.908747Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "M = main(100, 0, 1, method=2)\n",
+ "import plotly.express as px\n",
+ "z = np.where(abs(M.diags().toarray()) > 1e-6, 0, 1).astype(bool)\n",
+ "fig = px.imshow(z, binary_string=True)\n",
+ "fig.show()\n",
+ "#plt.spy(M.diags(), markersize=0.2) # or use matplotlib"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "07f47d49",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The coefficient matrix has 4 non-zero diagonals. You can now experiment\n",
+ "with different test and trial functions, but you will not get a better\n",
+ "result than that. Try basis ([5](#eq:heinrichs)) for both test and trial\n",
+ "function, and you'll get 5 nonzero diagonals.\n",
+ "\n",
+ "To see the convergence rate call `main` for a range of\n",
+ "different mesh sizes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "2e593550",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:53.922707Z",
+ "iopub.status.busy": "2024-05-24T12:37:53.922459Z",
+ "iopub.status.idle": "2024-05-24T12:37:55.101281Z",
+ "shell.execute_reply": "2024-05-24T12:37:55.099980Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "error = []\n",
+ "N = (2**4, 2**6, 2**8, 2**10)\n",
+ "for n in N:\n",
+ " error.append(main(n, 0, 1))\n",
+ "fig = px.line(x=N, y=error, log_y=True)\n",
+ "fig.update_layout(yaxis=dict(showexponent='all', exponentformat='e'))\n",
+ "fig.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3e83de81",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ ""
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/demos/Moebius/moebius.ipynb b/docs/demos/Moebius/moebius.ipynb
new file mode 100644
index 00000000..e6487081
--- /dev/null
+++ b/docs/demos/Moebius/moebius.ipynb
@@ -0,0 +1,1051 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "a36d0733",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "\n",
+ "# Demo - Eigenvalues on the Möbius strip\n",
+ "**Mikael Mortensen** (email: `mikaem@math.uio.no`), Department of Mathematics, University of Oslo.\n",
+ "\n",
+ "Date: **October 15, 2020**\n",
+ "\n",
+ "**Summary.** This is a demonstration of how the Python module [shenfun](https://github.com/spectralDNS/shenfun) can be used to\n",
+ "compute eigenvalues and vectors of the Laplace-Beltrami\n",
+ "operator on a Möbius strip. The absolute value of the eigenvector\n",
+ "corresponding to the eigth smallest eigenvalue $\\lambda=8.054788196$\n",
+ "is shown in the figure below, read on to see how it was computed.\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "
Figure 1
\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e10f07d5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## The Möbius strip\n",
+ "\n",
+ "A Möbius strip is the simplest non-orientable surface embedded in\n",
+ "$\\mathbb{R}^3$. There are several realizations possible, and we\n",
+ "will here consider the one parametrized by [[Kalvoda2020]](#Kalvoda2020)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "aace7270",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " x(\\theta, t) = \\left(R-t\\cos\\frac{\\theta}{2R}\\right) \\cos \\frac{\\theta}{R}, \n",
+ "\\label{_auto1} \\tag{1}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1bc99e64",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " y(\\theta, t) = \\left(R-t\\cos\\frac{\\theta}{2R}\\right) \\sin \\frac{\\theta}{R}, \n",
+ "\\label{_auto2} \\tag{2}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b12752a5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " z(\\theta, t) = -t \\sin \\frac{\\theta}{2 R},\n",
+ "\\label{_auto3} \\tag{3}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "eeaf8367",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $R$ is the main radius of the strip. $\\theta$ is the parameter that determines\n",
+ "the angle for moving around the strip, like the angle of a circle.\n",
+ "For one trip around the strip move $\\theta$ from $\\theta_0$ to $\\theta_0+2\\pi R$.\n",
+ "A function in Cartesian coordinates $u(\\mathbf{x})$ for $\\mathbf{x} \\in \\mathbb{R}^3$\n",
+ "is mapped to computational coordinates as $u(\\mathbf{x}) = \\tilde{u}(\\theta, t)$.\n",
+ "By moving once around the strip a function can be seen to be twisted periodic,\n",
+ "such that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "24159786",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\tilde{u}(\\theta_0, t) = \\tilde{u}(\\theta_0 + 2\\pi R, -t), \n",
+ "\\label{_auto4} \\tag{4}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3d69bbdd",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " \\frac{\\partial \\tilde{u}}{\\partial \\theta}(\\theta_0, t) = \\frac{\\partial \\tilde{u}}{\\partial \\theta}(\\theta_0 + 2\\pi R, -t).\n",
+ "\\label{_auto5} \\tag{5}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cdaec92b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The twisted condition does not lend itself easily to a regular tensor\n",
+ "product basis. On the other hand, by moving twice around the strip,\n",
+ "regular periodic boundary conditions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c17b95fe",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\tilde{u}(\\theta_0, t) = \\tilde{u}(\\theta_0 + 4\\pi R, t),\n",
+ "\\label{_auto6} \\tag{6}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "63e6eb39",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "will apply [[Kalvoda2020]](#Kalvoda2020), and we can discretize using Fourier\n",
+ "exponentials in the $\\theta$-direction. Since the reference domain of periodic Fourier\n",
+ "exponentials is $[-\\pi, \\pi)$ we define $\\varphi = \\theta /(2 R)$, such that\n",
+ "the computational domain is $(\\varphi, t) \\in \\mathbb{I}^2 = [-\\pi, \\pi) \\times (-1, 1)$,\n",
+ "with the parametrization"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "851f9be7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " x(\\varphi, t) = \\left(R-t\\cos {\\varphi}\\right) \\cos {2 \\varphi}, \n",
+ "\\label{_auto7} \\tag{7}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "60def052",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " y(\\varphi, t) = \\left(R-t\\cos {\\varphi}\\right) \\sin {2 \\varphi}, \n",
+ "\\label{_auto8} \\tag{8}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ac99c073",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " z(\\varphi, t) = -t \\sin {\\varphi}.\n",
+ "\\label{_auto9} \\tag{9}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "86946617",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the reference domain corresponds to $(\\theta, t) \\in = [-2\\pi R, 2\\pi R) \\times (-1, 1)$.\n",
+ "It is also trivial to adjust the $t$-domain with an affine map for a more narrow or\n",
+ "wider strip, but this added complexity is not discussed here. One can simply\n",
+ "choose the width of the strip below when choosing function space for the\n",
+ "$t$-direction.\n",
+ "\n",
+ "For the $t$-direction, a mixed Legendre,\n",
+ "$\\psi_{i} = L_{i} - L_{i+2}$, or Chebyshev, $\\psi_{i} = T_{i} - T_{i+2}$,\n",
+ "basis can be used and we obtain a regular tensor product basis.\n",
+ "The Legendre basis leads to more sparse matrices, and will be chosen\n",
+ "as default, but Chebyshev also works just fine.\n",
+ "Note that the same problem is\n",
+ "solved by Kalvoda et al. [[Kalvoda2020]](#Kalvoda2020) using a tensor product\n",
+ "basis with Fourier exponentials for the $\\theta$-direction and a mix\n",
+ "of cosines and sines for the $t$-direction. Kalvoda et al. cannot\n",
+ "make use of tensor product matrices and integrates using a\n",
+ "two-dimensional quadrature scheme over the entire domain, leading\n",
+ "to a dense matrix. We will here only use 1D quadrature and\n",
+ "tensor products to get the coefficient matrix."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c77d91c1",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## The Laplace Beltrami operator\n",
+ "\n",
+ "We consider the eigenvalue problem of the\n",
+ "Laplace Beltrami operator by solving"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "85cf3c0c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " -\\nabla^2 u(\\mathbf{x}) = \\lambda u(\\mathbf{x}), \\quad \\text{ for } \\mathbf{x} \\in \\Omega,\n",
+ "\\label{_auto10} \\tag{10}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c079b32b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $u$ is the solution, $\\lambda$ the eigenvalues and $\\Omega$ the Möbius\n",
+ "strip. We consider only homogeneous Dirichlet boundary conditions on the boundary.\n",
+ "\n",
+ "To solve this problem with the spectral Galerkin method we\n",
+ "choose an appropriate space $V$ and find $u\\in V$ such that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2e00a064",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\int_{\\Omega} -\\nabla^2 u \\, v^* \\omega d\\sigma = \\int_{\\Omega} \\lambda u v^* \\omega d\\sigma, \\quad \\forall v \\in V\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "659c1475",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $v^*$ is the complex conjugate of the test function $v$.\n",
+ "\n",
+ "With shenfun it is enough to operate in general coordinates as above\n",
+ "and let the curvilinear mathematics all happen under the hood.\n",
+ "However, for this example it is interesting to see what the\n",
+ "Laplace-Beltrami operator looks like in computational coordinates.\n",
+ "This is quite a bit of work by hand, and the starting point\n",
+ "is the position vector"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a9152953",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\mathbf{r} = x(\\varphi, t) \\mathbf{i} + y(\\varphi, t) \\mathbf{j} + z(\\varphi, t) \\mathbf{k}.\n",
+ "\\label{_auto11} \\tag{11}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e19d947e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "From the position vector we compute the he covariant\n",
+ "basis vectors $\\mathbf{b}_i = \\partial \\mathbf{r} / \\partial X^{i}$,\n",
+ "where $\\mathbf{X} = (X^{i})_{i\\in(1,2)} = (\\varphi, t)$,\n",
+ "and get the covariant metric tensor $g_{ij}=\\mathbf{b}_i \\cdot \\mathbf{b}_j$\n",
+ "and its determinant $g = \\text{det}(g_{ij})$. We get"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "88f9eed6",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " {g} = (2R-2t\\cos \\varphi)^2+t^2.\n",
+ "\\label{_auto12} \\tag{12}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d478e8e2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0382744f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "(g_{ij}) =\n",
+ "\\begin{pmatrix}\n",
+ " g & 0 \\\\ \n",
+ " 0 & 1\n",
+ "\\end{pmatrix}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1edbc444",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Likewise, the contravariant metric tensor $g^{ij}$ is the\n",
+ "inverse of the covariant"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8e3ccac6",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "(g^{ij}) =\n",
+ "\\begin{pmatrix}\n",
+ " \\frac{1}{g} & 0 \\\\ \n",
+ " 0 & 1\n",
+ "\\end{pmatrix}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a3d85733",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Please note that all these metrics and other terms are computed\n",
+ "under the hood by shenfun, and a user does not normally have to worry\n",
+ "about these.\n",
+ "\n",
+ "It can be shown that the Laplace-Beltrami operator in curvilinear coordinates\n",
+ "is given as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d2caccd3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\nabla^2 \\tilde{u} = \\frac{1}{\\sqrt{g}}\\frac{\\partial}{\\partial X^{i}}\\left( g^{ij}\\sqrt{g} \\frac{\\partial \\tilde{u}}{\\partial X^{j}}\\right),\n",
+ "\\label{_auto13} \\tag{13}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "856b5034",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "with summation on repeated indices.\n",
+ "Using this and the surface element $d\\sigma=\\sqrt{g} d\\varphi dt$, the\n",
+ "variational form in computational coordinates becomes"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fbdc9605",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " -\\int_{\\mathbb{I}^2}\\frac{\\partial}{\\partial X^{i}}\\left( g^{ij}\\sqrt{g} \\frac{\\partial \\tilde{u}}{\\partial X^{j}}\\right) \\, \\tilde{v}^*\\, \\tilde{\\omega} d\\varphi dt = \\int_{\\mathbb{I}^2} \\lambda \\tilde{u} \\tilde{v}^*\\, \\tilde{\\omega}\\sqrt{g} d\\varphi dt,\n",
+ "\\label{_auto14} \\tag{14}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "346133c3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Summing and expanding some derivatives, we get"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2fa380d8",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\begin{align*}\n",
+ " -\\int_{\\mathbb{I}^2} \\Big\\{ \\frac{1}{\\sqrt{g}}\\frac{\\partial^2 \\tilde{u}}{\\partial \\varphi^2 } &+\\frac{4 t \\sin \\varphi \\left(t \\cos {\\varphi} -R \\right) }{g^{\\frac{3}{2}}}\\frac{\\partial \\tilde{u}}{\\partial \\varphi } \\notag \\\\ \n",
+ " & +\\sqrt{g}\\frac{\\partial^2 \\tilde{u}}{\\partial t^2 }\n",
+ " +\\frac{4 \\cos {\\varphi} (t \\cos \\varphi -R) + t}{ \\sqrt{g}}\\frac{\\partial \\tilde{u}}{\\partial t } \\Big\\} \\tilde{v}^* \\tilde{\\omega} d\\varphi dt \\notag \\\\ \n",
+ " &= \\int_{\\mathbb{I}^2} \\lambda \\tilde{u} \\tilde{v}^* \\tilde{\\omega} \\sqrt{g} d\\varphi dt,\n",
+ "\\end{align*}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8eb40114",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the variational problem contains unseparable variable coefficients,\n",
+ "like $1/\\sqrt{g}$ and $\\sqrt{g}$ and as such cannot\n",
+ "easily be solved using efficient tensor product algebra.\n",
+ "However, note that both $g$ and $g^2$ are separable (i.e., they can\n",
+ "be written as products of simpler functions separated by the arguments\n",
+ "$g(\\varphi, t) = \\sum_k g_1^k(\\varphi)g_2^k(t)$),\n",
+ "and using the unconventional weight $\\tilde{\\omega} = g^{3/2}$ we get"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c2f7c6b4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\begin{align*}\n",
+ " -\\int_{\\mathbb{I}^2} \\Big\\{ g \\frac{\\partial^2 \\tilde{u}}{\\partial \\varphi^2 } &+ {4 t \\sin \\varphi \\left(t \\cos {\\varphi} -R \\right) } \\frac{\\partial \\tilde{u}}{\\partial \\varphi } \\notag \\\\ \n",
+ " & + g^2 \\frac{\\partial^2 \\tilde{u}}{\\partial t^2 }\n",
+ " +g \\left({4 \\cos {\\varphi} (t \\cos \\varphi -R) + t} \\right) \\frac{\\partial \\tilde{u}}{\\partial t } \\Big\\} \\tilde{v}^* d\\varphi dt \\notag \\\\ \n",
+ " &= \\int_{\\mathbb{I}^2} \\lambda g^{2} \\tilde{u} \\tilde{v}^* d\\varphi dt,\n",
+ "\\end{align*}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1c9b6780",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where the left hand side can be assembled using tensor product matrices,\n",
+ "where no single 1D matrix has more than 9 diagonals.\n",
+ "\n",
+ "Fortunately we do not have to do all this by hand since we have a\n",
+ "software that automatically assembles such matrices for us.\n",
+ "Now let's see how this problem can be handled with shenfun."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "13451900",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Implementation\n",
+ "\n",
+ "First we need to create function spaces for each direction $\\varphi$\n",
+ "and $t$, and then a tensor product space from the two. We use the\n",
+ "parametrization given above and shenfun will then automatically\n",
+ "differentiate to create basis functions and metrics, like $g$.\n",
+ "One important factor, though. Sympy's [simplify](https://docs.sympy.org/latest/modules/simplify/simplify.html)\n",
+ "will sometimes have problems finding the best possible simplification\n",
+ "of a term, like $g$. And in this particular case we need\n",
+ "to discourage the use of powers, or else sympy will end up with a\n",
+ "much more complicated $g$ than we get below."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e3a23ab5",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:37.171159Z",
+ "iopub.status.busy": "2024-05-24T12:37:37.171038Z",
+ "iopub.status.idle": "2024-05-24T12:37:39.065982Z",
+ "shell.execute_reply": "2024-05-24T12:37:39.065026Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "from shenfun import *\n",
+ "import sympy as sp\n",
+ "from IPython.display import Math, Latex, display\n",
+ "from scipy.sparse.linalg import eigs\n",
+ "config['basisvectors'] = 'covariant'\n",
+ "\n",
+ "phi, t = psi = sp.symbols('x,y', real=True)\n",
+ "\n",
+ "RR = sp.Rational(132, 20)/sp.pi # Same as Kalvoda et al\n",
+ "#RR = 2\n",
+ "# Use a symbolic R first, then later substitute for the value in RR\n",
+ "R = sp.Symbol('R', real=True, positive=True)\n",
+ "rv = ((R-t*sp.cos(phi))*sp.cos(2*phi),\n",
+ " (R-t*sp.cos(phi))*sp.sin(2*phi),\n",
+ " -t*sp.sin(phi))\n",
+ "\n",
+ "def discourage_powers(expr):\n",
+ " POW = sp.Symbol('POW')\n",
+ " count = sp.count_ops(expr, visual=True)\n",
+ " count = count.replace(POW, 100)\n",
+ " count = count.replace(sp.Symbol, type(sp.S.One))\n",
+ " return count\n",
+ "\n",
+ "N = (80, 40)\n",
+ "B0 = FunctionSpace(N[0], 'F', domain=(-np.pi, np.pi), dtype='D')\n",
+ "B1 = FunctionSpace(N[1], 'L', bc=(0, 0), domain=(-0.75, 0.75)) # Use same domain as Kalvoda et al\n",
+ "T = TensorProductSpace(comm, (B0, B1), coordinates=(psi, rv, True, (), discourage_powers), axes=(1, 0))\n",
+ "\n",
+ "u = TrialFunction(T)\n",
+ "v = TestFunction(T)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0aeb1ce8",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note the `discourage_powers` function. Try to turn it off (if\n",
+ "you are watching this in an interactive setting) and see what happens\n",
+ "to, e.g., `T.coors.sg`, which is $\\sqrt{g}$.\n",
+ "\n",
+ "We can now check to see what the Laplace-Beltrami operator\n",
+ "looks like when computed with shenfun:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "64eca61f",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:39.070341Z",
+ "iopub.status.busy": "2024-05-24T12:37:39.070123Z",
+ "iopub.status.idle": "2024-05-24T12:37:40.239472Z",
+ "shell.execute_reply": "2024-05-24T12:37:40.238667Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "g = sp.Function('g')(phi, t)\n",
+ "replace = [(T.coors.sg**2, g)]\n",
+ "Math((div(grad(u))).tolatex(funcname='f', symbol_names={phi:'\\\\varphi', t:'t'}, replace=replace))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c452170c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Not surprisingly, this is the same (except not multiplied by $\\sqrt{g}$) as what\n",
+ "is seen in the variational form above.\n",
+ "\n",
+ "At this point we replace the symbol R with a number in order to\n",
+ "assemble floating point matrices. The number R can be changed\n",
+ "above as the variable `RR`. For now it is set to use a value used also\n",
+ "by Kalvoda et al., such that we can doublecheck our eigenvalues.\n",
+ "We multiply forms with\n",
+ "$g^{3/2}$ before assembling to get separable variational forms,\n",
+ "leading to sparse tensor product matrices."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "5568ddd3",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:40.243819Z",
+ "iopub.status.busy": "2024-05-24T12:37:40.243126Z",
+ "iopub.status.idle": "2024-05-24T12:37:45.447890Z",
+ "shell.execute_reply": "2024-05-24T12:37:45.447177Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "T.coors.subs(R, RR)\n",
+ "M = inner(v*T.coors.sg**3, -div(grad(u)))\n",
+ "B = inner(v*T.coors.sg**3, u)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5d2d4f1d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Here `M` and `B` are lists of instances of the tensor product\n",
+ "matrix class [TPMatrix](https://shenfun.readthedocs.io/en/latest/shenfun.html#shenfun.matrixbase.TPMatrix)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "012ce144",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:45.451324Z",
+ "iopub.status.busy": "2024-05-24T12:37:45.451107Z",
+ "iopub.status.idle": "2024-05-24T12:37:45.457623Z",
+ "shell.execute_reply": "2024-05-24T12:37:45.456845Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "print(f'Number of matrices for M = {len(M)} and B = {len(B)}')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b9a0e776",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "So quite a few matrices, but they are all sparse. We solve by\n",
+ "using a Kronecker product solver [Solver2D](https://shenfun.readthedocs.io/en/latest/shenfun.html#shenfun.la.Solver2D) that flattens the\n",
+ "tensor product matrices and solution vector C-style."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c49c9da3",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:45.461979Z",
+ "iopub.status.busy": "2024-05-24T12:37:45.461853Z",
+ "iopub.status.idle": "2024-05-24T12:37:45.509512Z",
+ "shell.execute_reply": "2024-05-24T12:37:45.508584Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "mm = la.Solver2D(M)\n",
+ "bb = la.Solver2D(B)\n",
+ "Mc = mm.mat.copy()\n",
+ "Bc = bb.mat.copy()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "14c43ce3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Finally, solve the eigenvalue problem using a sparse eigenvalue solver\n",
+ "from scipy, which is wrapping ARPACK. Note that ARPACK is better at\n",
+ "finding large than small eigenvalues and for this reason we use a shift-inverted\n",
+ "version, see [https://docs.scipy.org/doc/scipy/reference/tutorial/arpack.html](https://docs.scipy.org/doc/scipy/reference/tutorial/arpack.html)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "414ed1ba",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:45.514216Z",
+ "iopub.status.busy": "2024-05-24T12:37:45.513770Z",
+ "iopub.status.idle": "2024-05-24T12:37:45.913357Z",
+ "shell.execute_reply": "2024-05-24T12:37:45.912704Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "f = eigs(Mc, k=40, M=Bc, which='LM', sigma=0)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6e97a182",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We have now found all eigenvalues on the Möbius strip with two rotations. So\n",
+ "some of the eigenvalues/eigenvectors will not have the correct twisted\n",
+ "periodic boundary conditions. To get only the correct eigenvalues, we filter a little\n",
+ "bit, checking the boundary:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a3bde988",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:45.919641Z",
+ "iopub.status.busy": "2024-05-24T12:37:45.919203Z",
+ "iopub.status.idle": "2024-05-24T12:37:46.026567Z",
+ "shell.execute_reply": "2024-05-24T12:37:46.025606Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "u_hat = Function(T)\n",
+ "eigvals = []\n",
+ "for i in range(f[1].shape[1]):\n",
+ " u_hat[:, :-2] = np.reshape(f[1][:, i], T.dims())\n",
+ " tt = u_hat.eval(np.array([[-np.pi, 0, -np.pi, 0], [0.5, -0.5, 0.65, -0.65]]))\n",
+ " dt = Dx(u_hat, 0, 1).eval(np.array([[-np.pi, 0, -np.pi, 0], [0.5, -0.5, 0.65, -0.65]]))\n",
+ " # Check for twisted periodic\n",
+ " if abs(tt[0]-tt[1]+tt[2]-tt[3]) < 1e-7 and abs(dt[0]-dt[1]+dt[2]-dt[3]) < 1e-8:\n",
+ " eigvals.append((i, f[0][i].real))\n",
+ " print(f'Twisted eigenvalue {len(eigvals):2d} {i:2d} {f[0][i].real:2.12e} Error {np.linalg.norm(Mc*f[1][:, i] - f[0][i]*Bc*f[1][:, i]):2.4e}')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ba3f01ab",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "These are the lowest true eigenvalues of the Möbius strip.\n",
+ "We note that they are very similar to Table 2 in [[Kalvoda2020]](#Kalvoda2020). We can now\n",
+ "plot the eigenvectors using, e.g., mayavi or plotly.\n",
+ "Choose the eigenvalue number first and then the rest follows"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ab3e23af",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:46.029624Z",
+ "iopub.status.busy": "2024-05-24T12:37:46.029438Z",
+ "iopub.status.idle": "2024-05-24T12:37:48.270078Z",
+ "shell.execute_reply": "2024-05-24T12:37:48.269173Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "l = 7\n",
+ "u_hat[:, :-2] = np.reshape(f[1][:, eigvals[l][0]], T.dims())\n",
+ "u_hat2 = u_hat.refine([2*N[0], 2*N[1]])\n",
+ "N0 = u_hat2.function_space().shape(False)[0]//2+1\n",
+ "fig = surf3D(u_hat2, slices=(slice(0, N0), slice(None)))\n",
+ "fig.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f5d256cd",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Or make subplot of several of the eigenvectors:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d8db1163",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:48.286444Z",
+ "iopub.status.busy": "2024-05-24T12:37:48.286228Z",
+ "iopub.status.idle": "2024-05-24T12:37:48.449232Z",
+ "shell.execute_reply": "2024-05-24T12:37:48.448749Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import plotly\n",
+ "from plotly.subplots import make_subplots\n",
+ "import plotly.graph_objects as go\n",
+ "rows = 3\n",
+ "cols = 2\n",
+ "fig = make_subplots(rows=rows, cols=cols, start_cell=\"top-left\", specs=[[dict(type='surface')]*cols]*rows,\n",
+ " subplot_titles=(f'$\\\\lambda_1={eigvals[0][1]:2.5f}$', f'$\\\\lambda_3={eigvals[2][1]:2.5f}$',\n",
+ " f'$\\\\lambda_5={eigvals[4][1]:2.5f}$', f'$\\\\lambda_7={eigvals[6][1]:2.5f}$',\n",
+ " f'$\\\\lambda_9={eigvals[8][1]:2.5f}$', f'$\\\\lambda_{{11}}={eigvals[10][1]:2.5f}$'))\n",
+ "N0 = T.shape(False)[0]//2+1 # Remember, data is for two rounds around the strip, we need only 1\n",
+ "x, y, z = T.local_cartesian_mesh()\n",
+ "x, y, z = x[:N0], y[:N0], z[:N0]\n",
+ "d = {'visible': False, 'showgrid': False, 'zeroline': False}\n",
+ "for l in range(rows*cols):\n",
+ " u_hat[:, :-2] = np.reshape(f[1][:, eigvals[2*l][0]], T.dims())\n",
+ " s = go.Surface(x=x, y=y, z=z, surfacecolor=abs(u_hat.backward()[:N0]),\n",
+ " colorscale=plotly.colors.sequential.Jet,\n",
+ " showscale=False)\n",
+ " fig.add_trace(s, row=l//cols+1, col=l%cols+1)\n",
+ " scene = 'scene' if l == 0 else f'scene{l+1}'\n",
+ " fig.update_layout({scene: {'xaxis': d, 'yaxis': d, 'zaxis': d, 'camera': {'eye': dict(x=0.85, y=0.85, z=0.85)}}})\n",
+ "fig.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5ebf31d6",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Finally, plot the sparsity pattern of the coefficient matrix. You\n",
+ "need to zoom in order to see the pattern properly and for\n",
+ "this reason we use plotly instead of the more convenient\n",
+ "matplotlib [spy](https://matplotlib.org/3.3.1/api/_as_gen/matplotlib.pyplot.spy.html)\n",
+ "function (`%matplotlib notebook` does not work in an\n",
+ "interactive jupyterlab and as such a jupyter book session).\n",
+ "If you are curious, then please change basis to Chebyshev and\n",
+ "note the difference from Legendre. Otherwise, results should be very\n",
+ "much alike."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b6e92933",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:48.475989Z",
+ "iopub.status.busy": "2024-05-24T12:37:48.475786Z",
+ "iopub.status.idle": "2024-05-24T12:37:49.046941Z",
+ "shell.execute_reply": "2024-05-24T12:37:49.045911Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "import plotly.express as px\n",
+ "z = np.where(abs(mm.mat.toarray()) > 1e-6, 0, 1).astype(bool)\n",
+ "fig = px.imshow(z, binary_string=True)\n",
+ "fig.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "880a1632",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "\n",
+ "1.
**T. Kalvoda, D. Krejcirik and K. Zahradová**. Effective Quantum Dynamics on the Möbius Strip, *Journal of Physics A: Mathematical and Theoretical*, 53(37), pp. 375201, [doi: 10.1088/1751-8121/ab8b3a](https://dx.doi.org/10.1088/1751-8121/ab8b3a), 2020."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/demos/Poisson/poisson.ipynb b/docs/demos/Poisson/poisson.ipynb
new file mode 100644
index 00000000..23912169
--- /dev/null
+++ b/docs/demos/Poisson/poisson.ipynb
@@ -0,0 +1,961 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "191f070c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "\n",
+ "# Demo - 1D Poisson's equation\n",
+ "**Mikael Mortensen** (email: `mikaem@math.uio.no`), Department of Mathematics, University of Oslo.\n",
+ "\n",
+ "Date: **April 13, 2018**\n",
+ "\n",
+ "**Summary.** This is a demonstration of how the Python module [shenfun](https://github.com/spectralDNS/shenfun) can be used to solve Poisson's\n",
+ "equation with Dirichlet boundary conditions in one dimension. Spectral convergence, as\n",
+ "shown in the figure below, is demonstrated.\n",
+ "The demo is implemented in slightly more generic terms (more boundary conditions)\n",
+ "in [poisson1D.py](https://github.com/spectralDNS/shenfun/blob/master/demo/poisson1D.py), and\n",
+ "the numerical method is is described in more detail by J. Shen [[shen1]](#shen1) and [[shen95]](#shen95).\n",
+ "\n",
+ "\n",
+ "\n",
+ "
\n",
+ "\n",
+ "
Figure 1: Convergence of 1D Poisson solvers for both Legendre and Chebyshev modified basis function.
\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5c9e928b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Poisson's equation\n",
+ "\n",
+ "Poisson's equation is given as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "88a950ff",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\nabla^2 u(x) = f(x) \\quad \\text{for }\\, x \\in (-1, 1), \\label{eq:poisson} \\tag{1}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "04929b21",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "u(-1)=a, u(1)=b, \\notag\n",
+ "\\label{_auto1} \\tag{2}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6dff101a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $u(x)$ is the solution, $f(x)$ is a function and $a, b$ are two possibly\n",
+ "non-zero constants.\n",
+ "\n",
+ "To solve Eq. ([1](#eq:poisson)) with the Galerkin method we need smooth continuously\n",
+ "differentiable basis functions, $v_k$, that satisfy the given boundary conditions.\n",
+ "And then we look for solutions like"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "40cbe4bb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u(x) = \\sum_{k=0}^{N-1} \\hat{u}_k v_k(x), \\label{eq:u} \\tag{3}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "75b794d4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $N$ is the size of the discretized problem,\n",
+ "$\\{\\hat{u}_k\\}_{k=0}^{N-1}$ are the unknown expansion\n",
+ "coefficients, and the function space is $\\text{span}\\{v_k\\}_{k=0}^{N-1}$.\n",
+ "\n",
+ "The basis functions of the function space can, for example, be constructed from\n",
+ "[Chebyshev](https://en.wikipedia.org/wiki/Chebyshev_polynomials), $T_k(x)$, or\n",
+ "[Legendre](https://en.wikipedia.org/wiki/Legendre_polynomials), $L_k(x)$, polynomials\n",
+ "and we use the common notation $\\phi_k(x)$ to represent either one of them. It turns out that\n",
+ "it is easiest to use basis functions with homogeneous Dirichlet boundary conditions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "daad7929",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "v_k(x) = \\phi_k(x) - \\phi_{k+2}(x),\n",
+ "\\label{_auto2} \\tag{4}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "49939654",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "for $k=0, 1, \\ldots N-3$. This gives the function space\n",
+ "$V^N_0 = \\text{span}\\{v_k(x)\\}_{k=0}^{N-3}$.\n",
+ "We can then add two more linear basis functions (that belong to the kernel of Poisson's equation)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c2eb52a2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "v_{N-2} = \\frac{1}{2}(\\phi_0 - \\phi_1), \n",
+ "\\label{_auto3} \\tag{5}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "19b3c0c6",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "v_{N-1} = \\frac{1}{2}(\\phi_0 + \\phi_1).\n",
+ "\\label{_auto4} \\tag{6}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f9753564",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "which gives the inhomogeneous space $V^N = \\text{span}\\{v_k\\}_{k=0}^{N-1}$.\n",
+ "With the two linear basis functions it is easy to see that the last two degrees\n",
+ "of freedom, $\\hat{u}_{N-2}$ and $\\hat{u}_{N-1}$, now are given as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7ee320eb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u(-1) = \\sum_{k=0}^{N-1} \\hat{u}_k v_k(-1) = \\hat{u}_{N-2} = a,\n",
+ "\\label{eq:dirichleta} \\tag{7} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5bfbba11",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "u(+1) = \\sum_{k=0}^{N-1} \\hat{u}_k v_k(+1) = \\hat{u}_{N-1} = b,\n",
+ "\\label{eq:dirichletb} \\tag{8}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a377dc2d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and, as such, we only have to solve for $\\{\\hat{u}_k\\}_{k=0}^{N-3}$, just like\n",
+ "for a problem with homogeneous boundary conditions (for homogeneous boundary condition\n",
+ "we simply have $\\hat{u}_{N-2} = \\hat{u}_{N-1} = 0$).\n",
+ "We now formulate a variational problem using the Galerkin method: Find $u \\in V^N$ such that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bc16986e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\int_{-1}^1 \\nabla^2 u \\, v \\, w\\, dx = \\int_{-1}^1 f \\, v\\, w\\, dx \\quad \\forall v \\, \\in \\, V^N_0. \\label{eq:varform} \\tag{9}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c56593b5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that since we only have $N-3$ unknowns we are only using the homogeneous test\n",
+ "functions from $V^N_0$.\n",
+ "\n",
+ "The weighted integrals, weighted by $w(x)$, are called inner products, and a\n",
+ "common notation is"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e7f282db",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\int_{-1}^1 u \\, v \\, w\\, dx = \\left( u, v\\right)_w.\n",
+ "\\label{_auto5} \\tag{10}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2aae170f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The integral can either be computed exactly, or with quadrature. The advantage\n",
+ "of the latter is that it is generally faster, and that non-linear terms may be\n",
+ "computed just as quickly as linear. For a linear problem, it does not make much\n",
+ "of a difference, if any at all. Approximating the integral with quadrature, we\n",
+ "obtain"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0597485b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\begin{align*}\n",
+ "\\int_{-1}^1 u \\, v \\, w\\, dx &\\approx \\left( u, v \\right)_w^N, \\\\ \n",
+ "&\\approx \\sum_{j=0}^{N-1} u(x_j) v(x_j) w(x_j),\n",
+ "\\end{align*}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1820492f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\{w(x_j)\\}_{j=0}^{N-1}$ are quadrature weights.\n",
+ "The quadrature points $\\{x_j\\}_{j=0}^{N-1}$\n",
+ "are specific to the chosen basis, and even within basis there are two different\n",
+ "choices based on which quadrature rule is selected, either Gauss or Gauss-Lobatto.\n",
+ "\n",
+ "Inserting for test and trialfunctions, we get the following bilinear form and\n",
+ "matrix $A=(a_{jk})\\in\\mathbb{R}^{N-2\\times N-2}$ for the Laplacian"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0f03aa15",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\begin{align*}\n",
+ "\\left( \\nabla^2u, v \\right)_w^N &= \\left( \\nabla^2\\sum_{k=0}^{N-3}\\hat{u}_k v_{k}, v_j \\right)_w^N, \\quad j=0,1,\\ldots, N-3\\\\ \n",
+ " &= \\sum_{k=0}^{N-3}\\left(\\nabla^2 v_{k}, v_j \\right)_w^N \\hat{u}_k, \\\\ \n",
+ " &= \\sum_{k=0}^{N-3}a_{jk} \\hat{u}_k.\n",
+ "\\end{align*}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "08f3c800",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the sum runs over $k=0, 1, \\ldots, N-3$ since\n",
+ "the second derivatives of $v_{N-2}$ and $v_{N-1}$ are zero.\n",
+ "The right hand side linear form and vector is computed as $\\tilde{f}_j = (f,\n",
+ "v_j)_w^N$, for $j=0,1,\\ldots, N-3$, where a tilde is used because this is not\n",
+ "a complete transform of the function $f$, but only an inner product.\n",
+ "\n",
+ "By defining the column vectors $\\boldsymbol{\\hat{u}}=(\\hat{u}_0, \\hat{u}_1, \\ldots, \\hat{u}_{N-3})^T$\n",
+ "and $\\boldsymbol{\\tilde{f}}=(\\tilde{f}_0, \\tilde{f}_1, \\ldots, \\tilde{f}_{N-3})^T$\n",
+ "we get the linear system of equations"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "65e0bcc0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "A \\hat{\\boldsymbol{u}} = \\tilde{\\boldsymbol{f}}.\n",
+ "\\label{_auto6} \\tag{11}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "998ba60a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Now, when the expansion coefficients $\\boldsymbol{\\hat{u}}$ are found by\n",
+ "solving this linear system, they may be\n",
+ "transformed to real space $u(x)$ using ([3](#eq:u)), and here the contributions\n",
+ "from $\\hat{u}_{N-2}$ and $\\hat{u}_{N-1}$ must be accounted for. Note that the matrix\n",
+ "$A$ (different for Legendre or Chebyshev) has a very special structure that\n",
+ "allows for a solution to be found very efficiently in order of $\\mathcal{O}(N)$\n",
+ "operations, see [[shen1]](#shen1) and [[shen95]](#shen95). These solvers are implemented in\n",
+ "shenfun for both bases."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "81e844aa",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Method of manufactured solutions\n",
+ "\n",
+ "In this demo we will use the method of manufactured\n",
+ "solutions to demonstrate spectral accuracy of the `shenfun` Dirichlet bases. To\n",
+ "this end we choose an analytical function that satisfies the given boundary\n",
+ "conditions:"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a7b27de2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u_e(x) = \\sin(k\\pi x)(1-x^2) + a(1-x)/2 + b(1+x)/2, \\label{eq:u_e} \\tag{12}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "14a5e799",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $k$ is an integer and $a$ and $b$ are constants. Now, feeding $u_e$ through\n",
+ "the Laplace operator, we see that the last two linear terms disappear, whereas the\n",
+ "first term results in"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d45e3287",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\nabla^2 u_e(x) = \\frac{d^2 u_e}{dx^2}, \n",
+ "\\label{_auto7} \\tag{13}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d0f28dd7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " = -4k \\pi x \\cos(k\\pi x) - 2\\sin(k\\pi x) - k^2 \\pi^2 (1 -\n",
+ "x^2) \\sin(k \\pi x). \\label{eq:solution} \\tag{14}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "91f8eb49",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Now, setting $f_e(x) = \\nabla^2 u_e(x)$ and solving for $\\nabla^2 u(x) = f_e(x)$,\n",
+ "we can compare the numerical solution $u(x)$ with the analytical solution $u_e(x)$\n",
+ "and compute error norms."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fc08f897",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Implementation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "dc126f5a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Preamble\n",
+ "\n",
+ "We will solve Poisson's equation using the [shenfun](https://github.com/spectralDNS/shenfun) Python module. The first thing needed\n",
+ "is then to import some of this module's functionality\n",
+ "plus some other helper modules, like [Numpy](https://numpy.org) and [Sympy](https://sympy.org):"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "659b5c0d",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:22.136214Z",
+ "iopub.status.busy": "2024-05-24T12:36:22.135738Z",
+ "iopub.status.idle": "2024-05-24T12:36:22.727867Z",
+ "shell.execute_reply": "2024-05-24T12:36:22.726320Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "from shenfun import inner, div, grad, TestFunction, TrialFunction, Function, \\\n",
+ " project, Dx, Array, FunctionSpace, dx\n",
+ "import numpy as np\n",
+ "from sympy import symbols, cos, sin, exp, lambdify"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cfc9c744",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We use `Sympy` for the manufactured solution and `Numpy` for testing."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "40d4aa04",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Manufactured solution\n",
+ "\n",
+ "The exact solution $u_e(x)$ and the right hand side $f_e(x)$ are created using\n",
+ "`Sympy` as follows"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "38c3edf0",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:22.732881Z",
+ "iopub.status.busy": "2024-05-24T12:36:22.732459Z",
+ "iopub.status.idle": "2024-05-24T12:36:22.760490Z",
+ "shell.execute_reply": "2024-05-24T12:36:22.759813Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "a = -1\n",
+ "b = 1\n",
+ "k = 4\n",
+ "x = symbols(\"x\")\n",
+ "ue = sin(k*np.pi*x)*(1-x**2) + a*(1 - x)/2. + b*(1 + x)/2.\n",
+ "fe = ue.diff(x, 2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a66d4067",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "These solutions are now valid for a continuous domain. The next step is thus to\n",
+ "discretize, using a discrete mesh $\\{x_j\\}_{j=0}^{N-1}$ and a finite number of\n",
+ "basis functions.\n",
+ "\n",
+ "Note that it is not mandatory to use `Sympy` for the manufactured solution. Since the\n",
+ "solution is known ([14](#eq:solution)), we could just as well simply use `Numpy`\n",
+ "to compute $f_e$ at $\\{x_j\\}_{j=0}^{N-1}$. However, with `Sympy` it is much\n",
+ "easier to experiment and quickly change the solution."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e2cfe44f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Discretization\n",
+ "\n",
+ "We create a basis with a given number of basis functions, and extract the computational\n",
+ "mesh from the basis itself"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9328ec31",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:22.764302Z",
+ "iopub.status.busy": "2024-05-24T12:36:22.764200Z",
+ "iopub.status.idle": "2024-05-24T12:36:22.776711Z",
+ "shell.execute_reply": "2024-05-24T12:36:22.776055Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "N = 32\n",
+ "SD = FunctionSpace(N, 'Chebyshev', bc=(a, b))\n",
+ "#SD = FunctionSpace(N, 'Legendre', bc=(a, b))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "db6ef1ac",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that we can either choose a Legendre or a Chebyshev basis."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "37f9d1b5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Variational formulation\n",
+ "\n",
+ "The variational problem ([9](#eq:varform)) can be assembled using `shenfun`'s\n",
+ "[TrialFunction](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.TrialFunction), [TestFunction](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.TestFunction) and [inner()](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.inner.inner) functions."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d3f0a739",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:22.781790Z",
+ "iopub.status.busy": "2024-05-24T12:36:22.781550Z",
+ "iopub.status.idle": "2024-05-24T12:36:22.797059Z",
+ "shell.execute_reply": "2024-05-24T12:36:22.796536Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "u = TrialFunction(SD)\n",
+ "v = TestFunction(SD)\n",
+ "# Assemble left hand side matrix\n",
+ "A = inner(v, div(grad(u)))\n",
+ "# Assemble right hand side\n",
+ "fj = Array(SD, buffer=fe)\n",
+ "f_hat = Function(SD)\n",
+ "f_hat = inner(v, fj, output_array=f_hat)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5ecdef9b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the `sympy` function `fe` can be used to initialize the [Array](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.Array)\n",
+ "`fj`. We wrap this Numpy array in an [Array](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.Array) class\n",
+ "(`fj = Array(SD, buffer=fe)`), because an Array\n",
+ "is required as input to the [inner()](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.inner.inner) function."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ee8d601e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Solve linear equations\n",
+ "\n",
+ "Finally, solve linear equation system and transform solution from spectral\n",
+ "$\\boldsymbol{\\hat{u}}$ vector to the real space $\\{u(x_j)\\}_{j=0}^{N-1}$\n",
+ "and then check how the solution corresponds with the exact solution $u_e$.\n",
+ "To this end we compute the $L_2$-errornorm using the `shenfun` function\n",
+ "[dx()](https://shenfun.readthedocs.io/en/latest/shenfun.utilities.html#shenfun.utilities.dx)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "3efea157",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:22.801607Z",
+ "iopub.status.busy": "2024-05-24T12:36:22.800978Z",
+ "iopub.status.idle": "2024-05-24T12:36:22.818568Z",
+ "shell.execute_reply": "2024-05-24T12:36:22.817851Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "u_hat = A.solve(f_hat)\n",
+ "uj = SD.backward(u_hat)\n",
+ "ua = Array(SD, buffer=ue)\n",
+ "print(\"Error=%2.16e\" %(np.sqrt(dx((uj-ua)**2))))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3c8908a6",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Convergence test\n",
+ "\n",
+ "To do a convergence test we will now create a function `main`, that takes the\n",
+ "number of quadrature points as parameter, and prints out\n",
+ "the error."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c69c9d1e",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:22.824094Z",
+ "iopub.status.busy": "2024-05-24T12:36:22.823418Z",
+ "iopub.status.idle": "2024-05-24T12:36:22.832489Z",
+ "shell.execute_reply": "2024-05-24T12:36:22.831137Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "def main(N, family='Chebyshev'):\n",
+ " SD = FunctionSpace(N, family=family, bc=(a, b))\n",
+ " u = TrialFunction(SD)\n",
+ " v = TestFunction(SD)\n",
+ "\n",
+ " # Get f on quad points\n",
+ " fj = Array(SD, buffer=fe)\n",
+ "\n",
+ " # Compute right hand side of Poisson's equation\n",
+ " f_hat = Function(SD)\n",
+ " f_hat = inner(v, fj, output_array=f_hat)\n",
+ "\n",
+ " # Get left hand side of Poisson's equation\n",
+ " A = inner(v, div(grad(u)))\n",
+ "\n",
+ " f_hat = A.solve(f_hat)\n",
+ " uj = SD.backward(f_hat)\n",
+ "\n",
+ " # Compare with analytical solution\n",
+ " ua = Array(SD, buffer=ue)\n",
+ " l2_error = np.linalg.norm(uj-ua)\n",
+ " return l2_error"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8199b9c0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "For example, we find the error of a Chebyshev discretization\n",
+ "using 12 quadrature points as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e2444fa7",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:22.834406Z",
+ "iopub.status.busy": "2024-05-24T12:36:22.834268Z",
+ "iopub.status.idle": "2024-05-24T12:36:22.844487Z",
+ "shell.execute_reply": "2024-05-24T12:36:22.843460Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "main(12, 'Chebyshev')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "41161308",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "To get the convergence we call `main` for a list\n",
+ "of $N=[12, 16, \\ldots, 48]$, and collect the errornorms in\n",
+ "arrays to be plotted. The error can be plotted using\n",
+ "[matplotlib](https://matplotlib.org), and the generated\n",
+ "figure is also shown in this demos summary."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "be4c522a",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:22.848466Z",
+ "iopub.status.busy": "2024-05-24T12:36:22.848366Z",
+ "iopub.status.idle": "2024-05-24T12:36:23.839597Z",
+ "shell.execute_reply": "2024-05-24T12:36:23.837516Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "%matplotlib inline\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "N = range(12, 50, 4)\n",
+ "error = {}\n",
+ "for basis in ('legendre', 'chebyshev'):\n",
+ " error[basis] = []\n",
+ " for i in range(len(N)):\n",
+ " errN = main(N[i], basis)\n",
+ " error[basis].append(errN)\n",
+ "\n",
+ "plt.figure(figsize=(6, 4))\n",
+ "for basis, col in zip(('legendre', 'chebyshev'), ('r', 'b')):\n",
+ " plt.semilogy(N, error[basis], col, linewidth=2)\n",
+ "plt.title('Convergence of Poisson solvers 1D')\n",
+ "plt.xlabel('N')\n",
+ "plt.ylabel('Error norm')\n",
+ "plt.legend(('Legendre', 'Chebyshev'))\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "09bd3e41",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The spectral convergence is evident and we can see that\n",
+ "after $N=40$ roundoff errors dominate as the errornorm trails off around $10^{-14}$."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d778fc61",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Complete solver\n",
+ "
\n",
+ "\n",
+ "A complete solver, that can use any family of bases (Chebyshev, Legendre, Jacobi, Chebyshev second kind),\n",
+ "and any kind of boundary condition, can be found [here](https://github.com/spectralDNS/shenfun/blob/master/demo/poisson1D.py).\n",
+ "\n",
+ "\n",
+ "\n",
+ "1.
**J. Shen**. Efficient Spectral-Galerkin Method I. Direct Solvers of Second- and Fourth-Order Equations Using Legendre Polynomials, *SIAM Journal on Scientific Computing*, 15(6), pp. 1489-1505, [doi: 10.1137/0915089](https://dx.doi.org/10.1137/0915089), 1994.\n",
+ "\n",
+ "2.
**J. Shen**. Efficient Spectral-Galerkin Method II. Direct Solvers of Second- and Fourth-Order Equations Using Chebyshev Polynomials, *SIAM Journal on Scientific Computing*, 16(1), pp. 74-87, [doi: 10.1137/0916006](https://dx.doi.org/10.1137/0916006), 1995."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/demos/Poisson3D/poisson3d.ipynb b/docs/demos/Poisson3D/poisson3d.ipynb
new file mode 100644
index 00000000..1dd32e0a
--- /dev/null
+++ b/docs/demos/Poisson3D/poisson3d.ipynb
@@ -0,0 +1,1440 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "8da58369",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "\n",
+ "# Demo - 3D Poisson's equation\n",
+ "**Mikael Mortensen** (email: `mikaem@math.uio.no`), Department of Mathematics, University of Oslo.\n",
+ "\n",
+ "Date: **April 13, 2018**\n",
+ "\n",
+ "**Summary.** This is a demonstration of how the Python module [shenfun](https://github.com/spectralDNS/shenfun) can be used to solve a 3D Poisson\n",
+ "equation in a 3D tensor product domain that has homogeneous Dirichlet boundary\n",
+ "conditions in one direction and periodicity in the\n",
+ "remaining two. The solver described runs with MPI without any further\n",
+ "considerations required from the user. Spectral convergence, as shown in [Figure 1](#fig:3d:ct0), is demonstrated.\n",
+ "The demo is implemented in slightly more generic terms (more boundary conditions) in\n",
+ "[poisson3D.py](https://github.com/spectralDNS/shenfun/blob/master/demo/poisson3D.py), and the numerical method is is described in more detail by J. Shen [[shen1]](#shen1) and [[shen95]](#shen95).\n",
+ "\n",
+ "\n",
+ "\n",
+ "
\n",
+ "\n",
+ "
Figure 1: Convergence of 3D Poisson solvers for both Legendre and Chebyshev modified basis function.
\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f0074255",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Poisson's equation\n",
+ "
\n",
+ "\n",
+ "Poisson's equation is given as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "89ac398c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\nabla^2 u(\\boldsymbol{x}) = f(\\boldsymbol{x}) \\quad \\text{for }\\, \\boldsymbol{x}=(x, y, z) \\in \\Omega, \\label{eq:3d:poisson} \\tag{1}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "daa1a9ef",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "u(\\pm 1 ,y, z) =0, \n",
+ "\\label{_auto1} \\tag{2}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9d4a83ba",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "u(x, 2\\pi, z) = u(x, 0, z), \n",
+ "\\label{_auto2} \\tag{3}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e210d64c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "u(x, y, 2\\pi) = u(x, y, 0),\n",
+ "\\label{_auto3} \\tag{4}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4e547b1b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $u(\\boldsymbol{x})$ is the solution and $f(\\boldsymbol{x})$ is a function. The domain\n",
+ "$\\Omega = (-1, 1)\\times [0, 2\\pi)^2$.\n",
+ "\n",
+ "To solve Eq. ([1](#eq:3d:poisson)) with the Galerkin method we will make use of\n",
+ "smooth basis functions, $v(\\boldsymbol{x})$, that satisfy the given boundary\n",
+ "conditions. To this end we will use one basis function for the $x$-direction,\n",
+ "$\\mathcal{X}(x)$,\n",
+ "one for the $y$-direction, $\\mathcal{Y}(y)$, and one for the $z$-direction,\n",
+ "$\\mathcal{Z}(z)$. And\n",
+ "then we create three-dimensional basis functions like"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "db6636f2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "v(x, y, z) = \\mathcal{X}(x) \\mathcal{Y}(y) \\mathcal{Z} (z).\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "551b7efa",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The basis functions $\\mathcal{Y}(y)$ and $\\mathcal{Z}(z)$ are chosen as Fourier exponentials, since these\n",
+ "functions are periodic. Likewise, the basis functions $\\mathcal{X}(x)$ are chosen as\n",
+ "modified Legendre or Chebyshev polynomials, using $\\phi_l(x)$ to refer to either\n",
+ "one"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ef225f31",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\mathcal{X}_l(x) = \\phi_l(x) - \\phi_{l+2}(x), \\forall \\, l \\in \\boldsymbol{l}^{N_0},\n",
+ "\\label{_auto4} \\tag{5}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e3f328da",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\mathcal{Y}_m(y) = e^{\\imath m y}, \\forall \\, m \\in \\boldsymbol{m}^{N_1}, \n",
+ "\\label{_auto5} \\tag{6}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8da83855",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\mathcal{Z}_n(z) = e^{\\imath n z}, \\forall \\, n \\in \\boldsymbol{n}^{N_2},\n",
+ "\\label{_auto6} \\tag{7}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "be2ba56e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where the size of the discretized problem is $\\boldsymbol{N} = (N_0, N_1, N_2)$,\n",
+ "$\\boldsymbol{l}^{N_0} = (0, 1, \\ldots, N_0-3)$, $\\boldsymbol{m}^{N_1} =\n",
+ "(-N_1/2, -N_1/2+1, \\ldots, N_1/2-1)$ and $\\boldsymbol{n}^{N_2} = (-N_2/2, -N_2/2+1,\n",
+ "\\ldots, N_2/2-1)$. However, due to [Hermitian symmetry](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.fft.rfft.html#numpy.fft.rfft), we only store $N_2/2+1$\n",
+ "wavenumbers in the $z$-direction, such that $\\boldsymbol{n}^{N_2} = (0, 1, \\ldots,\n",
+ "N_2/2)$. We refer to the Cartesian wavenumber mesh on vector form as $\\boldsymbol{k}$:"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "552b4035",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\boldsymbol{k} = \\{(l, m, n)\\, | \\,(l, m, n) \\in \\boldsymbol{l}^{N_0} \\times \\boldsymbol{m}^{N_1} \\times \\boldsymbol{n}^{N_2}\\}.\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f3af3fa7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We have the one-dimensional spaces"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1035ba0c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "V^{N_0} = \\text{span}\\{ \\mathcal{X}_l \\}_{l\\in\\boldsymbol{l}^{N_0}}, \n",
+ "\\label{_auto7} \\tag{8}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bc0ac2da",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "V^{N_1} = \\text{span}\\{ \\mathcal{Y}_m \\}_{m\\in\\boldsymbol{m}^{N_1}}, \n",
+ "\\label{_auto8} \\tag{9}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "92916e18",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "V^{N_2} = \\text{span}\\{ \\mathcal{Z}_n \\}_{n\\in\\boldsymbol{n}^{N_2}},\n",
+ "\\label{_auto9} \\tag{10}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "dbcb49ab",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and from these we create a tensor product space $W^{\\boldsymbol{N}}(\\boldsymbol{x})$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fd8d4ee7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "W^{\\boldsymbol{N}}(\\boldsymbol{x}) = V^{N_0}(x) \\otimes V^{N_1}(y) \\otimes V^{N_2}(z).\n",
+ "\\label{_auto10} \\tag{11}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a8e11dc8",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "And then we look for discrete solutions $u \\in W^{\\boldsymbol{N}}$ like"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "acaedc94",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u(\\boldsymbol{x}) = \\sum_{l\\in \\boldsymbol{l}^{N_0}} \\sum_{m\\in \\boldsymbol{m}^{N_1}}\\sum_{n\\in\n",
+ "\\boldsymbol{n}^{N_2}}\\hat{u}_{lmn} \\mathcal{X}_l(x) \\mathcal{Y}_m(y) \\mathcal{Z}_n(z), \\label{eq:3d:u} \\tag{12} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "423c7214",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " = \\sum_{\\boldsymbol{\\textsf{k}} \\in \\boldsymbol{k}}\\hat{u}_{\\boldsymbol{\\textsf{k}}} v_{\\boldsymbol{\\textsf{k}}}(\\boldsymbol{x}),\n",
+ "\\label{_auto11} \\tag{13}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5ccbfa50",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\hat{u}_{lmn}$ are components of the expansion coefficients for $u$ and\n",
+ "the second form, $\\{\\hat{u}_{\\boldsymbol{\\textsf{k}}}\\}_{\\boldsymbol{\\textsf{k}}\\in\\boldsymbol{k}}$, is a shorter,\n",
+ "simplified notation, with sans-serif $\\boldsymbol{\\textsf{k}}=(l, m, n)$.\n",
+ "The expansion coefficients are the unknowns in the spectral Galerkin method.\n",
+ "\n",
+ "We now formulate a variational problem using the Galerkin method: Find $u \\in\n",
+ "W^{\\boldsymbol{N}}$ such that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8dc22608",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\int_{\\Omega} \\nabla^2 u \\, \\overline{v} \\, w\\, \\boldsymbol{dx} = \\int_{\\Omega} f \\,\n",
+ "\\overline{v}\\, w\\, \\boldsymbol{dx} \\quad\n",
+ "\\forall v \\, \\in \\, W^{\\boldsymbol{N}}. \\label{eq:3d:varform} \\tag{14}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2dc04875",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Here $\\boldsymbol{dx}=dxdydz$, and the overline represents a complex conjugate, which is needed here because\n",
+ "the Fourier exponentials are complex functions.\n",
+ "The weighted integrals, weighted by $w(\\boldsymbol{x})$, are called inner products, and a common notation is"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "92d21ff5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\int_{\\Omega} u \\, \\overline{v} \\, w\\, \\boldsymbol{dx} = \\langle u, v\\rangle _w.\n",
+ "\\label{_auto12} \\tag{15}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "96f41098",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The integral can either be computed exactly, or with quadrature. The advantage\n",
+ "of the latter is that it is faster (through Fast Fourier transforms),\n",
+ "and that non-linear terms may be computed just as quickly as linear.\n",
+ "For a linear problem, it does not make much of a difference, if any at all.\n",
+ "Approximating the integral with quadrature, we obtain"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e83fdfbe",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\begin{align*}\n",
+ "\\int_{\\Omega} u \\, \\overline{v} \\, w\\, \\boldsymbol{dx} &\\approx \\langle u, v\n",
+ "\\rangle_w^{\\boldsymbol{N}}, \\\\ \n",
+ "&\\approx \\sum_{i=0}^{N_0-1} \\sum_{j=0}^{N_1-1}\\sum_{k=0}^{N_2-1} u(x_i, y_j, z_k) \\overline{v}(x_i, y_j, z_k) w(x_i, y_j, z_k),\n",
+ "\\end{align*}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c9146845",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $w(\\boldsymbol{x})$ now are the quadrature weights. The quadrature points\n",
+ "$\\{x_i\\}_{i=0}^{N_0-1}$ are specific to the chosen basis, and even within basis there\n",
+ "are two different choices based on which quadrature rule is selected, either\n",
+ "Gauss or Gauss-Lobatto. The quadrature points for the Fourier bases are simply\n",
+ "uniformly distributed throughout the domain.\n",
+ "\n",
+ "Inserting for test function ([12](#eq:3d:u)) and trialfunction\n",
+ "$v_{pqr} = \\mathcal{X}_{p} \\mathcal{Y}_q \\mathcal{Z}_r$ on the\n",
+ "left hand side of ([14](#eq:3d:varform)), we get (with summation on repeated indices\n",
+ "to avoid too much clutter)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "21fc36e3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\begin{align*}\n",
+ "\\langle \\nabla^2u, v \\rangle_w^{\\boldsymbol{N}} &= \\left\\langle \\nabla^2\\sum_{l\\in \\boldsymbol{l}^{N_0}}\n",
+ "\\sum_{m\\in \\boldsymbol{m}^{N_1}}\\sum_{n\\in \\boldsymbol{n}^{N_2}}\\hat{u}_{lmn}\n",
+ "\\mathcal{X}_{l} \\mathcal{Y}_m \\mathcal{Z}_n,\n",
+ "\\mathcal{X}_{p} \\mathcal{Y}_q \\mathcal{Z}_r \\right\\rangle_w^{\\boldsymbol{N}}, \\\\ \n",
+ " &= \\left[\\left(\\mathcal{X}_l^{''}, \\mathcal{X}_p \\right)_w^N - (m^2+n^2)\\left(\\mathcal{X}_l, \\mathcal{X}_p \\right)_w^N \\right]\\delta_{mq} \\delta_{nr} \\hat{u}_{lmn}, \\\\ \n",
+ " &= \\left( a_{pl} - (m^2 + n^2)b_{pl}\\right) \\hat{u}_{lqr}, \\quad \\forall (p,q,r) \\in \\boldsymbol{k},\n",
+ "\\end{align*}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bad9c02f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where the notation $(\\cdot, \\cdot)_w^{N_0}$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f5ec1f67",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "b_{pl} = \\left( \\mathcal{X}_l, \\mathcal{X}_p \\right)_w^{N_0} = \\sum_{i=0}^{N_0-1} \\mathcal{X}_l(x_i)\n",
+ "\\mathcal{X}_p(x_i) w(x_i),\n",
+ "\\label{_auto13} \\tag{16}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d98f0d68",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "is used to represent a discrete $L_2$ inner product along only the first, nonperiodic,\n",
+ "direction. The delta functions above come from integrating over the two periodic\n",
+ "directions, where we use constant weight functions $w=1/(2\\pi)$ in the\n",
+ "inner products"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "31a7b9e0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\int_0^{2\\pi} \\mathcal{Y}_m(y) \\overline{\\mathcal{Y}}_q(y) \\frac{1}{2\\pi} dy = \\delta_{mq}, \\label{eq:delta0} \\tag{17}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9fd98dac",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\int_0^{2\\pi} \\mathcal{Z}_n(z) \\overline{\\mathcal{Z}}_r(z) \\frac{1}{2\\pi} dz = \\delta_{nr}. \\label{eq:delta1} \\tag{18}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ca9501a2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The Kronecker delta-function $\\delta_{ij}$ is one for $i=j$ and\n",
+ "zero otherwise.\n",
+ "\n",
+ "The right hand side of Eq. ([14](#eq:3d:varform)) is computed as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f7ae0369",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\tilde{f}_{pqr} = \\left\\langle f, \\mathcal{X}_{p}\n",
+ "\\mathcal{Y}_q \\mathcal{Z}_r \\right \\rangle_w^{\\boldsymbol{N}},\n",
+ "\\label{_auto14} \\tag{19}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "654013fb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where a tilde is used because this is not a complete transform of the function\n",
+ "$f$, but only an inner product.\n",
+ "\n",
+ "The linear system of equations to solve for the expansion coefficients can now\n",
+ "be found as follows"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a41c8cd2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\left(a_{lp} - (m^2+n^2)b_{lp}\\right) \\hat{u}_{pmn} =\n",
+ "\\tilde{f}_{lmn}\\quad \\forall \\, (l,m,n) \\in \\boldsymbol{k}. \\label{eq:AB} \\tag{20}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f6850f1c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Now, when $\\hat{\\boldsymbol{u}} = \\{\\hat{u}_{\\boldsymbol{\\textsf{k}}}\\}_{\\boldsymbol{\\textsf{k}} \\in \\boldsymbol{k}}$ is\n",
+ "found by solving this linear system over the\n",
+ "entire computational mesh, it may be\n",
+ "transformed to real space $u(\\boldsymbol{x})$ using ([12](#eq:3d:u)). Note that the matrices\n",
+ "$A \\in \\mathbb{R}^{N_0-2 \\times N_0-2}$ and $B \\in \\mathbb{R}^{N_0-2 \\times N_0-2}$\n",
+ "differ for Legendre or Chebyshev bases, but\n",
+ "for either case they have a\n",
+ "special structure that allows for a solution to be found very efficiently\n",
+ "in the order of $\\mathcal{O}(N_0-3)$ operations given $m$ and $n$, see\n",
+ "[[shen1]](#shen1) and [[shen95]](#shen95). Fast solvers for ([20](#eq:AB)) are implemented in `shenfun` for both bases."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cc81feaf",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Method of manufactured solutions\n",
+ "\n",
+ "In this demo we will use the method of manufactured\n",
+ "solutions to demonstrate spectral accuracy of the `shenfun` bases. To\n",
+ "this end we choose a smooth analytical function that satisfies the given boundary\n",
+ "conditions:"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f7eae13e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u_e(x, y, z) = \\left(\\cos(4x) + \\sin(2y) + \\sin(4z)\\right)(1-x^2). \\label{eq:3d:u_e} \\tag{21}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7cc93b44",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Sending $u_e$ through the Laplace operator, we obtain the right hand side"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b64405fc",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\nabla^2 u_e(x,y,z) = -16(1 - x^2) \\cos(4 x) + 16 x \\sin(4 x) - 2 \\cos(4 x)\n",
+ " - (1-x^2)(4 \\sin(2y) + 16\\sin(4z)). \\label{eq:3d:solution} \\tag{22}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bc33b415",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Now, setting $f_e(\\boldsymbol{x}) = \\nabla^2 u_e(\\boldsymbol{x})$ and solving for $\\nabla^2\n",
+ "u(\\boldsymbol{x}) = f_e(\\boldsymbol{x})$, we can compare the numerical solution $u(\\boldsymbol{x})$ with\n",
+ "the analytical solution $u_e(\\boldsymbol{x})$ and compute error norms."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fc08f897",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Implementation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "09a2f0ce",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Preamble\n",
+ "\n",
+ "We will solve the Poisson problem using the [shenfun](https://github.com/spectralDNS/shenfun) Python module. The first thing needed\n",
+ "is then to import some of this module's functionality\n",
+ "plus some other helper modules, like [Numpy](https://numpy.org) and [Sympy](https://sympy.org):"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "edf17730",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:33.748091Z",
+ "iopub.status.busy": "2024-05-24T12:36:33.747969Z",
+ "iopub.status.idle": "2024-05-24T12:36:34.269454Z",
+ "shell.execute_reply": "2024-05-24T12:36:34.267728Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "from sympy import symbols, cos, sin, exp, lambdify\n",
+ "import numpy as np\n",
+ "from shenfun.tensorproductspace import TensorProductSpace\n",
+ "from shenfun import inner, div, grad, TestFunction, TrialFunction, Function, \\\n",
+ " project, Dx, FunctionSpace, comm, Array, chebyshev, dx, la"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c73b4c22",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We use `Sympy` for the manufactured solution and `Numpy` for testing. MPI for\n",
+ "Python (`mpi4py`) is required for running the solver with MPI."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5f7917d3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Manufactured solution\n",
+ "\n",
+ "The exact solution $u_e(x, y, z)$ and the right hand side $f_e(x, y, z)$ are created using `Sympy` as follows"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "31c9285d",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:34.276484Z",
+ "iopub.status.busy": "2024-05-24T12:36:34.275848Z",
+ "iopub.status.idle": "2024-05-24T12:36:34.305900Z",
+ "shell.execute_reply": "2024-05-24T12:36:34.304019Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "x, y, z = symbols(\"x,y,z\")\n",
+ "ue = (cos(4*x) + sin(2*y) + sin(4*z))*(1-x**2)\n",
+ "fe = ue.diff(x, 2) + ue.diff(y, 2) + ue.diff(z, 2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bd9f1e6e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "These solutions are now valid for a continuous domain. The next step is thus to\n",
+ "discretize, using the computational mesh"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "dd64ad46",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "(x_i, y_j, z_k)\\, \\forall \\, (i, j, k) \\in [0, 1,\\ldots, N_0-1] \\times [0, 1, \\ldots, N_1-1] \\times [0, 1, \\ldots, N_2-1]\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "61577524",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and a finite number of basis functions.\n",
+ "\n",
+ "Note that it is not mandatory to use `Sympy` for the manufactured solution. Since the\n",
+ "solution is known ([22](#eq:3d:solution)), we could just as well simply use `Numpy`\n",
+ "to compute $f_e$. However, with `Sympy` it is much\n",
+ "easier to experiment and quickly change the solution."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "995b9608",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Discretization and MPI\n",
+ "\n",
+ "We create three function spaces with given size, one for each dimension of the problem.\n",
+ "From these three spaces a [TensorProductSpace](https://shenfun.readthedocs.io/en/latest/shenfun.html#shenfun.tensorproductspace.TensorProductSpace) is created."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d7ae8f20",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:34.313301Z",
+ "iopub.status.busy": "2024-05-24T12:36:34.313171Z",
+ "iopub.status.idle": "2024-05-24T12:36:34.329047Z",
+ "shell.execute_reply": "2024-05-24T12:36:34.328465Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# Size of discretization\n",
+ "N = [14, 15, 16]\n",
+ "\n",
+ "SD = FunctionSpace(N[0], 'Chebyshev', bc=(0, 0))\n",
+ "#SD = FunctionSpace(N[0], 'Legendre', bc=(0, 0))\n",
+ "K1 = FunctionSpace(N[1], 'Fourier', dtype='D')\n",
+ "K2 = FunctionSpace(N[2], 'Fourier', dtype='d')\n",
+ "T = TensorProductSpace(comm, (SD, K1, K2), axes=(0, 1, 2))\n",
+ "X = T.local_mesh()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "072f1919",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that we can either choose a Legendre or a Chebyshev basis for the\n",
+ "nonperiodic direction. The\n",
+ "[TensorProductSpace](https://shenfun.readthedocs.io/en/latest/shenfun.html#shenfun.tensorproductspace.TensorProductSpace) class takes an MPI communicator as first argument and the\n",
+ "computational mesh is distributed internally using the `pencil` method. The\n",
+ "`T.local_mesh` method returns the mesh local to each processor. The `axes`\n",
+ "keyword determines the order of transforms going back and forth between real and\n",
+ "spectral space. With `axes=(0, 1, 2)` and a forward transform (from real space\n",
+ "to spectral, i.e., from $u$ to $\\hat{u}$) axis 2 is transformed first and then 1\n",
+ "and 0, respectively.\n",
+ "\n",
+ "The manufactured solution is created with Dirichlet boundary conditions in the\n",
+ "$x$-direction, and for this reason `SD` is the first space in `T`. We could just\n",
+ "as well have put the nonperiodic direction along either $y$- or $z$-direction,\n",
+ "though, but this would then require that the order of the transformed axes be\n",
+ "changed as well. For example, putting the Dirichlet direction along $y$, we\n",
+ "would need to create the tensorproductspace as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "28775815",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "```Python\n",
+ " T = TensorProductSpace(comm, (K1, SD, K2), axes=(1, 0, 2))\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3ee1fe90",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "such that the Dirichlet direction is the last to be transformed. The reason for\n",
+ "this is that only the Dirichlet direction leads to matrices that need to be\n",
+ "inverted (or solved). And for this we need the entire data array along the Dirichlet\n",
+ "direction to be local to the processor. If the `SD` basis is the last to be\n",
+ "transformed, then the data will be aligned in this direction, whereas the other\n",
+ "two directions may both, or just one of them, be distributed.\n",
+ "\n",
+ "Note that `X` is a list containing local values of the arrays $\\{x_i\\}_{i=0}^{N_0-1}$,\n",
+ "$\\{y_j\\}_{j=0}^{N_1-1}$ and $\\{z_k\\}_{k=0}^{N_2-1}$.\n",
+ "Now, it's not possible to run a jupyter notebook with more than one process,\n",
+ "but we can imagine running [the complete solver](https://github.com/spectralDNS/shenfun/blob/master/demo/poisson3D.py)\n",
+ "with 4 procesors and a processor mesh of shape $2\\times 2$.\n",
+ "We would then get the following local slices for\n",
+ "each processor in spectral space"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ef84f575",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "```Python\n",
+ " print(comm.Get_rank(), T.local_slice())\n",
+ " 3 [slice(0, 14, None), slice(8, 15, None), slice(5, 9, None)]\n",
+ " 1 [slice(0, 14, None), slice(0, 8, None), slice(5, 9, None)]\n",
+ " 2 [slice(0, 14, None), slice(8, 15, None), slice(0, 5, None)]\n",
+ " 0 [slice(0, 14, None), slice(0, 8, None), slice(0, 5, None)]\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "dce94b33",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where the global shape is $\\boldsymbol{N}=(14, 15, 9)$ after taking advantage of\n",
+ "Hermitian symmetry in the $z$-direction. So, all processors have the complete first dimension available locally, as they\n",
+ "should. Furthermore, processor three owns the slices from $8:15$ and $5:9$ along\n",
+ "axes $y$ and $z$, respectively. Processor 2 owns slices $0:8$ and $0:5$ etc. In\n",
+ "real space the mesh is distributed differently. First of all the global mesh\n",
+ "shape is $\\boldsymbol{N}=(14, 15, 16)$, and it is distributed along the first two\n",
+ "dimensions. The local slices can be inspected as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "dce14f99",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "```Python\n",
+ " print(comm.Get_rank(), T.local_slice(False))\n",
+ " 0 [slice(0, 7, None), slice(0, 8, None), slice(0, 16, None)]\n",
+ " 1 [slice(0, 7, None), slice(8, 15, None), slice(0, 16, None)]\n",
+ " 2 [slice(7, 14, None), slice(0, 8, None), slice(0, 16, None)]\n",
+ " 3 [slice(7, 14, None), slice(8, 15, None), slice(0, 16, None)]\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2d326fe7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Since two directions are distributed, both in spectral and real space, we say\n",
+ "that we have a two-dimensional decomposition (here a $2\\times 2$ shaped\n",
+ "processor mesh) and the\n",
+ "MPI distribution is of type *pencil*. It is also possible to choose a *slab*\n",
+ "decomposition, where only one dimension of the array is distributed. This choice\n",
+ "needs to be made when creating the tensorproductspace as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "28b8a840",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "```Python\n",
+ " T = TensorProductSpace(comm, (SD, K1, K2), axes=(0, 1, 2), slab=True)\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "38b546dd",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "which would lead to a mesh that is distributed along $x$-direction in real space\n",
+ "and $y$-direction in spectral space. The local slices would then be"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f68d8c78",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ " print(comm.Get_rank(), T.local_slice()) # spectral space\n",
+ " 1 [slice(0, 14, None), slice(4, 8, None), slice(0, 9, None)]\n",
+ " 2 [slice(0, 14, None), slice(8, 12, None), slice(0, 9, None)]\n",
+ " 0 [slice(0, 14, None), slice(0, 4, None), slice(0, 9, None)]\n",
+ " 3 [slice(0, 14, None), slice(12, 15, None), slice(0, 9, None)]\n",
+ " print(comm.Get_rank(), T.local_slice(False)) # real space\n",
+ " 3 [slice(11, 14, None), slice(0, 15, None), slice(0, 16, None)]\n",
+ " 0 [slice(0, 4, None), slice(0, 15, None), slice(0, 16, None)]\n",
+ " 2 [slice(8, 11, None), slice(0, 15, None), slice(0, 16, None)]\n",
+ " 1 [slice(4, 8, None), slice(0, 15, None), slice(0, 16, None)]\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f4c9f423",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the *slab* decomposition is usually the fastest choice. However, the maximum\n",
+ "number of processors with *slab* is $\\min \\{N_0, N_1\\}$, whereas a *pencil*\n",
+ "approach can be used with up to $\\min \\{N_1(N_2/2+1), N_0 N_1\\}$ processors."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3530d3aa",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Variational formulation\n",
+ "\n",
+ "The variational problem ([14](#eq:3d:varform)) can be assembled using `shenfun`'s\n",
+ "form language, which is perhaps surprisingly similar to FEniCS."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4c0bbdd5",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:34.354941Z",
+ "iopub.status.busy": "2024-05-24T12:36:34.354656Z",
+ "iopub.status.idle": "2024-05-24T12:36:34.377303Z",
+ "shell.execute_reply": "2024-05-24T12:36:34.374818Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "u = TrialFunction(T)\n",
+ "v = TestFunction(T)\n",
+ "# Get f on quad points\n",
+ "fj = Array(T, buffer=fe)\n",
+ "# Compute right hand side of Poisson equation\n",
+ "f_hat = inner(v, fj)\n",
+ "# Get left hand side of Poisson equation\n",
+ "matrices = inner(v, div(grad(u)))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8d0bf840",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The Laplacian operator is recognized as `div(grad)`. The `matrices` object is a\n",
+ "list of two tensor product matrices, stored as instances of the class [TPMatrix](https://shenfun.readthedocs.io/en/latest/shenfun.html#shenfun.matrixbase.TPMatrix).\n",
+ "The two tensor product matrices represents"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "956b3de7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "a_{pl} \\delta_{mq} \\delta_{nr}\\, \\text{ and }\\, -(m^2 + n^2)b_{pl} \\delta_{mq} \\delta_{nr}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "debfb9d2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "from Eqs. ([20](#eq:AB)), ([17](#eq:delta0)) and ([18](#eq:delta1)).\n",
+ "The second matrix ($-(m^2 + n^2)b_{pl} \\delta_{mq} \\delta_{nr}$) has an\n",
+ "attribute `scale` that is equal to $-(m^2+n^2)$.\n",
+ "This `scale` is stored as a numpy array of shape $(1, 15, 9)$, representing the set\n",
+ "$\\{-(m^2+n^2): (m, n) \\in \\boldsymbol{m}^{N_1} \\times \\boldsymbol{n}^{N_2}\\}$. Note that $\\boldsymbol{n}^{N_2}$ is stored\n",
+ "simply as an array of length $N_2/2+1$ (here 9), since the transform in direction $z$\n",
+ "takes a real signal and transforms it taking advantage of Hermitian symmetry,\n",
+ "see [rfft](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.fft.rfft.html)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "42f47488",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Solve linear equations\n",
+ "\n",
+ "Finally, solve linear equation system and transform solution from spectral\n",
+ "$\\hat{u}_{\\boldsymbol{\\textsf{k}}}$ vector to the real space $u(\\boldsymbol{x})$ and then check how the solution corresponds with the exact solution $u_e$."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "abc14f5d",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:34.387713Z",
+ "iopub.status.busy": "2024-05-24T12:36:34.387515Z",
+ "iopub.status.idle": "2024-05-24T12:36:34.407210Z",
+ "shell.execute_reply": "2024-05-24T12:36:34.402354Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# Create Helmholtz linear algebra solver\n",
+ "Solver = chebyshev.la.Helmholtz\n",
+ "#Solver = la.SolverGeneric1ND # For Legendre\n",
+ "H = Solver(matrices)\n",
+ "\n",
+ "# Solve and transform to real space\n",
+ "u_hat = Function(T) # Solution spectral space\n",
+ "u_hat = H(u_hat, f_hat) # Solve\n",
+ "uq = T.backward(u_hat)\n",
+ "\n",
+ "# Compare with analytical solution\n",
+ "uj = Array(T, buffer=ue)\n",
+ "error = comm.reduce(np.linalg.norm(uj-uq)**2)\n",
+ "if comm.Get_rank() == 0:\n",
+ " print(\"Error=%2.16e\" %(np.sqrt(error)))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3c8908a6",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Convergence test\n",
+ "\n",
+ "To do a convergence test we will now create a function `main`, that takes the\n",
+ "number of quadrature points as parameter, and prints out\n",
+ "the error."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "88433058",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:34.414789Z",
+ "iopub.status.busy": "2024-05-24T12:36:34.414577Z",
+ "iopub.status.idle": "2024-05-24T12:36:34.420760Z",
+ "shell.execute_reply": "2024-05-24T12:36:34.420018Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "def main(N, family='Chebyshev'):\n",
+ " Solver = chebyshev.la.Helmholtz if family.lower() == 'chebyshev' else la.SolverGeneric1ND\n",
+ " SD = FunctionSpace(N, family=family, bc=(0, 0))\n",
+ " K1 = FunctionSpace(N, family='F', dtype='D')\n",
+ " K2 = FunctionSpace(N, family='F', dtype='d')\n",
+ " T = TensorProductSpace(comm, (SD, K1, K2), axes=(0, 1, 2))\n",
+ "\n",
+ " u = TrialFunction(T)\n",
+ " v = TestFunction(T)\n",
+ "\n",
+ " # Get f on quad points\n",
+ " fj = Array(T, buffer=fe)\n",
+ "\n",
+ " # Compute right hand side of Poisson's equation\n",
+ " f_hat = Function(T)\n",
+ " f_hat = inner(v, fj, output_array=f_hat)\n",
+ " if family == 'legendre':\n",
+ " f_hat *= -1.\n",
+ "\n",
+ " # Get left hand side of Poisson equation\n",
+ " if family.lower() == 'chebyshev':\n",
+ " matrices = inner(v, div(grad(u)))\n",
+ " else:\n",
+ " matrices = inner(grad(v), grad(u))\n",
+ "\n",
+ " # Create Helmholtz linear algebra solver\n",
+ " H = Solver(matrices)\n",
+ "\n",
+ " # Solve and transform to real space\n",
+ " u_hat = Function(T) # Solution spectral space\n",
+ " u_hat = H(f_hat, u_hat) # Solve\n",
+ "\n",
+ " uj = Array(T)\n",
+ " uj = u_hat.backward(uj)\n",
+ "\n",
+ " # Compare with analytical solution\n",
+ " ua = Array(T, buffer=ue)\n",
+ " #l2_error = np.linalg.norm(uj-ua)\n",
+ " L2_error = np.sqrt(dx((uj-ua)**2))\n",
+ " return L2_error"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8199b9c0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "For example, we find the error of a Chebyshev discretization\n",
+ "using 12 quadrature points as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e2444fa7",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:34.426574Z",
+ "iopub.status.busy": "2024-05-24T12:36:34.426367Z",
+ "iopub.status.idle": "2024-05-24T12:36:34.449511Z",
+ "shell.execute_reply": "2024-05-24T12:36:34.448639Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "main(12, 'Chebyshev')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "41161308",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "To get the convergence we call `main` for a list\n",
+ "of $N=[12, 16, \\ldots, 48]$, and collect the errornorms in\n",
+ "arrays to be plotted. The error can be plotted using\n",
+ "[matplotlib](https://matplotlib.org), and the generated\n",
+ "figure is also shown in this demos summary."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "be4c522a",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:34.454817Z",
+ "iopub.status.busy": "2024-05-24T12:36:34.454583Z",
+ "iopub.status.idle": "2024-05-24T12:36:37.054986Z",
+ "shell.execute_reply": "2024-05-24T12:36:37.050754Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "%matplotlib inline\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "N = range(12, 50, 4)\n",
+ "error = {}\n",
+ "for basis in ('legendre', 'chebyshev'):\n",
+ " error[basis] = []\n",
+ " for i in range(len(N)):\n",
+ " errN = main(N[i], basis)\n",
+ " error[basis].append(errN)\n",
+ "\n",
+ "plt.figure(figsize=(6, 4))\n",
+ "for basis, col in zip(('legendre', 'chebyshev'), ('r', 'b')):\n",
+ " plt.semilogy(N, error[basis], col, linewidth=2)\n",
+ "plt.title('Convergence of Poisson solvers 1D')\n",
+ "plt.xlabel('N')\n",
+ "plt.ylabel('Error norm')\n",
+ "plt.legend(('Legendre', 'Chebyshev'))\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2e83be02",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The spectral convergence is evident and we can see that\n",
+ "after $N=24$ roundoff errors dominate as the errornorm trails off around $10^{-14}$."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bdbe8c88",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Complete solver\n",
+ "
\n",
+ "\n",
+ "A complete solver, that can use any family of bases (Chebyshev, Legendre, Jacobi, Chebyshev second kind),\n",
+ "and any kind of boundary condition, can be found [here](https://github.com/spectralDNS/shenfun/blob/master/demo/poisson3D.py).\n",
+ "\n",
+ "\n",
+ "\n",
+ "1.
**J. Shen**. Efficient Spectral-Galerkin Method I. Direct Solvers of Second- and Fourth-Order Equations Using Legendre Polynomials, *SIAM Journal on Scientific Computing*, 15(6), pp. 1489-1505, [doi: 10.1137/0915089](https://dx.doi.org/10.1137/0915089), 1994.\n",
+ "\n",
+ "2.
**J. Shen**. Efficient Spectral-Galerkin Method II. Direct Solvers of Second- and Fourth-Order Equations Using Chebyshev Polynomials, *SIAM Journal on Scientific Computing*, 16(1), pp. 74-87, [doi: 10.1137/0916006](https://dx.doi.org/10.1137/0916006), 1995."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/demos/PolarHelmholtz/polarhelmholtz.ipynb b/docs/demos/PolarHelmholtz/polarhelmholtz.ipynb
new file mode 100644
index 00000000..8a40a30f
--- /dev/null
+++ b/docs/demos/PolarHelmholtz/polarhelmholtz.ipynb
@@ -0,0 +1,1456 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "1d07c42c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "\n",
+ "# Demo - Helmholtz equation in polar coordinates\n",
+ "**Mikael Mortensen** (email: `mikaem@math.uio.no`), Department of Mathematics, University of Oslo.\n",
+ "\n",
+ "Date: **April 8, 2020**\n",
+ "\n",
+ "**Summary.** This is a demonstration of how the Python module [shenfun](https://github.com/spectralDNS/shenfun) can be used to solve the\n",
+ "Helmholtz equation on a circular disc, using polar coordinates. This demo is implemented in\n",
+ "a single Python file [unitdisc_helmholtz.py](https://github.com/spectralDNS/shenfun/blob/master/demo/unitdisc_helmholtz.py),\n",
+ "and the numerical method is described in more detail by J. Shen [[shen3]](#shen3).\n",
+ "\n",
+ "\n",
+ "\n",
+ "
\n",
+ "\n",
+ "
Figure 1: Helmholtz on the unit disc.
\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a8436390",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Helmholtz equation\n",
+ "
\n",
+ "\n",
+ "The Helmholtz equation is given as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5432fbb6",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "-\\nabla^2 u(\\boldsymbol{x}) + \\alpha u(\\boldsymbol{x}) = f(\\boldsymbol{x}) \\quad \\text{for }\\, \\boldsymbol{x}=(x, y) \\in \\Omega, \\label{eq:helmholtz} \\tag{1}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "74c368e2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "u =0 \\text{ on } \\partial \\Omega,\n",
+ "\\label{_auto1} \\tag{2}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "28ce39e0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $u(\\boldsymbol{x})$ is the solution, $f(\\boldsymbol{x})$ is a function and $\\alpha$ a constant.\n",
+ "The domain is a circular disc $\\Omega = \\{(x, y): x^2+y^2 < a^2\\}$ with radius $a$.\n",
+ "We use polar coordinates $(\\theta, r)$, defined as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "abcc039f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " x = r \\cos \\theta, \n",
+ "\\label{_auto2} \\tag{3}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "efcb355f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " y = r \\sin \\theta,\n",
+ "\\label{_auto3} \\tag{4}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ec76706d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "which leads to a Cartesian product mesh $(\\theta, r) \\in [0, 2\\pi) \\times (0, a)$\n",
+ "suitable for numerical implementations. Note that the\n",
+ "two directions are ordered with $\\theta$ first and then $r$, which is less common\n",
+ "than $(r, \\theta)$. This has to do with the fact that we will need to\n",
+ "solve linear equation systems along the radial direction, but not\n",
+ "the $\\theta$-direction, since Fourier matrices are diagonal. When\n",
+ "the radial direction is placed last, the data in the radial direction\n",
+ "will be contigeous in a row-major C memory, leading to faster memory\n",
+ "access where it is needed the most. Note that it takes very few\n",
+ "changes in `shenfun` to switch the directions to $(r, \\theta)$ if this\n",
+ "is still desired.\n",
+ "\n",
+ "We will use Chebyshev\n",
+ "or Legendre basis functions $\\psi_j(r)$ for the radial direction and\n",
+ "a periodic Fourier expansion in $\\exp(\\imath k \\theta)$ for the\n",
+ "azimuthal direction. The polar basis functions are as such"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f1e0f267",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "v_{kj}(\\theta, r) = \\exp(\\imath k \\theta) \\psi_j(r),\n",
+ "\\label{_auto4} \\tag{5}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c73ec530",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and we look for solutions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9af694a9",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u(\\mathbf{x}) = \\tilde{u}(\\theta, r) = \\sum_{k} \\sum_{j} \\hat{u}_{kj} v_{kj}(\\theta, r).\n",
+ "\\label{_auto5} \\tag{6}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7dc44a76",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that $\\tilde{u}$ is the function $u$ mapped to computational space.\n",
+ "From now on we will simply use $u(\\theta, r)$ without the tilde, and assume that\n",
+ "the proper version of the function is understood from its arguments.\n",
+ "\n",
+ "A discrete Fourier approximation space with $N$ basis functions is then"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e2c0c9b8",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "V_F^N = \\text{span} \\{\\exp(\\imath k \\theta)| \\text{ for } k \\in K\\},\n",
+ "\\label{_auto6} \\tag{7}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b675c87a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where the index set $K = \\{-N/2, -N/2+1, \\ldots, N/2-1\\}$. Since the solution $u(\\theta, r)$\n",
+ "is real, there is Hermitian symmetry and $\\hat{u}_{k,j} = \\hat{u}_{k,-j}^*$\n",
+ "(with $*$ denoting a complex conjugate).\n",
+ "For this reason we use only $k \\in K=\\{0, 1, \\ldots, N/2\\}$ in solving for\n",
+ "$\\hat{u}_{kj}$, and then use Hermitian symmetry to get the remaining\n",
+ "unknowns. This is handled under the hood by fast Fourier transforms.\n",
+ "\n",
+ "The radial basis is more tricky, because there is a nontrivial 'boundary'\n",
+ "condition (pole condition) that needs to be applied at the center of the disc $(r=0)$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a2a580a7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\frac{\\partial u(\\theta, 0)}{\\partial \\theta} = 0.\n",
+ "\\label{_auto7} \\tag{8}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "29ba05d7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "To apply this condition we split the solution into Fourier\n",
+ "coefficients with wavenumber 0 and $K\\backslash \\{0\\}$,\n",
+ "remembering that the Fourier basis function with $k=0$ is\n",
+ "simply 1"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8acc3dc5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u(\\theta, r) = \\sum_{j} \\left( \\hat{u}_{0j} \\psi_{j}(r) + \\sum_{k=1}^{N/2} \\hat{u}_{kj} \\exp(\\imath k \\theta) \\psi_j(r) \\right).\n",
+ "\\label{_auto8} \\tag{9}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3712274c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We then apply a different radial basis for the two $\\psi$'s in\n",
+ "the above equation (renaming the first $\\overline{\\psi}$)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "38afaa1e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u(\\theta, r) = \\sum_{j} \\left( \\hat{u}_{0j} \\overline{\\psi}_{j}(r) + \\sum_{k=1}^{N/2} \\hat{u}_{kj} \\exp(\\imath k \\theta) \\psi_j(r) \\right).\n",
+ "\\label{_auto9} \\tag{10}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f444ab42",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the first term $\\sum_{j} \\hat{u}_{0j} \\overline{\\psi}_{j}(r)$ is independent\n",
+ "of $\\theta$. Now, to enforce conditions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "eec46081",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u(\\theta, a) = 0, \n",
+ "\\label{_auto10} \\tag{11}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6a63be68",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\frac{\\partial u(\\theta, 0)}{\\partial \\theta} = 0,\n",
+ "\\label{_auto11} \\tag{12}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f41e1913",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "it is sufficient for the two bases ($\\overline{\\psi}$ and $\\psi$) to\n",
+ "satisfy"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "06d79350",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\overline{\\psi}_j(a) = 0, \n",
+ "\\label{_auto12} \\tag{13}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "869ecbbc",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\psi_j(a) = 0,\n",
+ "\\label{_auto13} \\tag{14}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "21ee8cae",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\psi_j(0) = 0.\n",
+ "\\label{_auto14} \\tag{15}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4319dd50",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Bases that satisfy these conditions can be found both with Legendre and\n",
+ "Chebyshev polynomials.\n",
+ "If $\\phi_j(x)$ is used for either the Legendre polynomial $L_j(x)$ or the\n",
+ "Chebyshev polynomial of the first kind $T_j(x)$, we can have"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8227d2da",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\overline{\\psi}_j(r) = \\phi_j(2r/a-1) - \\phi_{j+1}(2r/a-1), \\text{ for } j \\in 0, 1, \\ldots N-1, \n",
+ "\\label{_auto15} \\tag{16}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0aac6186",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\psi_j(r) = \\phi_j(2r/a-1) - \\phi_{j+2}(2r/a-1), \\text{ for } j \\in 0, 1, \\ldots N-2.\n",
+ "\\label{eq:psi} \\tag{17}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d6161bd1",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Define the following approximation spaces for the radial direction"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ed53c2c4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "V_D^N = \\text{span} \\{\\psi_j\\}_{j=0}^{N-3} \n",
+ "\\label{_auto16} \\tag{18}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b6fdf5eb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "V_U^N = \\text{span} \\{\\overline{\\psi}_j\\}_{j=0}^{N-2} \n",
+ "\\label{_auto17} \\tag{19}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "976a21cf",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\label{_auto18} \\tag{20}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "86adfe7c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and split the function space for the azimuthal direction into"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6c997fcf",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "V_F^0 = \\text{span}\\{1\\}, \n",
+ "\\label{_auto19} \\tag{21}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e0a07851",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "V_F^{1} = \\text{span} \\{\\exp(\\imath k \\theta)\\}, \\text{ for } k \\in K \\backslash \\{0\\}.\n",
+ "\\label{_auto20} \\tag{22}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c171d086",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We then look for solutions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "42be4adc",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u(\\theta, r) = u^0(r) + u^1(\\theta, r),\n",
+ "\\label{_auto21} \\tag{23}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ab4aeed8",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5d3b3e3d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u^0(r) = \\sum_{j=0}^{N-2} \\hat{u}^0_j \\overline{\\psi}_j(r), \n",
+ "\\label{_auto22} \\tag{24}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5d6431c2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "u^1(\\theta, r) = \\sum_{j=0}^{N-3}\\sum_{k=1}^{N/2} \\hat{u}^1_{kj} \\exp(\\imath k \\theta) \\psi_j(r) .\n",
+ "\\label{_auto23} \\tag{25}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6188851a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "As such the Helmholtz problem is split in two smaller problems.\n",
+ "The two problems read with the spectral Galerkin method:\n",
+ "\n",
+ "Find $u^0 \\in V_F^0 \\otimes V_U^N$ such that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5d4eec5a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\int_{\\Omega} (-\\nabla^2 u^0 + \\alpha u^0) v^0 w d\\sigma = \\int_{\\Omega} f v^0 w d\\sigma, \\quad \\forall \\, v^0 \\in V_F^0 \\otimes V_U^N.\n",
+ "\\label{eq:u0} \\tag{26}\n",
+ " \\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1283888c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Find $u^1 \\in V_F^1 \\otimes V_D^N$ such that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c629c307",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\int_{\\Omega} (-\\nabla^2 u^1 + \\alpha u^1) v^1 w d\\sigma = \\int_{\\Omega} f v^1 w d\\sigma, \\quad \\forall \\, v^1 \\in V_F^1 \\otimes V_D^N.\n",
+ "\\label{eq:u1} \\tag{27}\n",
+ " \\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9d10377e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that integration over the domain is done using\n",
+ "polar coordinates with an integral measure of $d\\sigma=rdrd\\theta$.\n",
+ "However, the integral in the radial direction needs to be mapped\n",
+ "to $t=2r/a-1$, where $t \\in [-1, 1]$, which suits the basis functions used,\n",
+ "see ([17](#eq:psi)). This leads to a measure of $0.5(t+1)adtd\\theta$.\n",
+ "Furthermore, the weight $w(t)$ will be unity for the Legendre basis and\n",
+ "$(1-t^2)^{-0.5}$ for the Chebyshev bases."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "be46f19c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Implementation\n",
+ "
\n",
+ "\n",
+ "A complete implementation is found in the file [unitdisc_helmholtz.py](https://github.com/spectralDNS/shenfun/blob/master/demo/unitdisc_helmholtz.py).\n",
+ "Here we give a brief explanation for the implementation. Start by\n",
+ "importing all functionality from [shenfun](https://github.com/spectralDNS/shenfun)\n",
+ "and [sympy](https://sympy.org), where Sympy is required for handeling the\n",
+ "polar coordinates. Also, we choose to work with covariant\n",
+ "basis vectors."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "1acc570e",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:39.272297Z",
+ "iopub.status.busy": "2024-05-24T12:36:39.272099Z",
+ "iopub.status.idle": "2024-05-24T12:36:39.851249Z",
+ "shell.execute_reply": "2024-05-24T12:36:39.849428Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "from shenfun import *\n",
+ "import sympy as sp\n",
+ "config['basisvectors'] = 'covariant'\n",
+ "\n",
+ "# Define polar coordinates using angle along first axis and radius second\n",
+ "theta, r = psi = sp.symbols('x,y', real=True, positive=True)\n",
+ "rv = (r*sp.cos(theta), r*sp.sin(theta)) # Map to Cartesian (x, y)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "355e26ca",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that Sympy symbols are both positive and real, $\\theta$ is\n",
+ "chosen to be along the first axis and $r$ second. This has to agree with\n",
+ "the next step, which is the creation of tensorproductspaces\n",
+ "$V_F^0 \\otimes V_U^N$ and $V_F^1 \\otimes V_D^N$. We use\n",
+ "`domain=(0, 1)` for the radial direction to get a unit disc, whereas\n",
+ "the default domain for the Fourier bases is already the\n",
+ "required $(0, 2\\pi)$."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "3162ee49",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:39.855609Z",
+ "iopub.status.busy": "2024-05-24T12:36:39.855339Z",
+ "iopub.status.idle": "2024-05-24T12:36:40.098105Z",
+ "shell.execute_reply": "2024-05-24T12:36:40.097499Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "N = 32\n",
+ "F = FunctionSpace(N, 'F', dtype='d')\n",
+ "F0 = FunctionSpace(1, 'F', dtype='d')\n",
+ "L = FunctionSpace(N, 'L', bc=(0, 0), domain=(0, 1))\n",
+ "L0 = FunctionSpace(N, 'L', bc=(None, 0), domain=(0, 1))\n",
+ "T = TensorProductSpace(comm, (F, L), axes=(1, 0), coordinates=(psi, rv))\n",
+ "T0 = TensorProductSpace(MPI.COMM_SELF, (F0, L0), axes=(1, 0), coordinates=(psi, rv))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6b19eba1",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that since `F0` only has one component we could actually use\n",
+ "`L0` without creating `T0`. But the code turns out to be simpler\n",
+ "if we use `T0`, much because the additional $\\theta$-direction is\n",
+ "required for the polar coordinates to apply. Using one single basis\n",
+ "function for the $\\theta$ direction is as such a generic way to handle\n",
+ "polar 1D problems (i.e., problems that are only functions of the\n",
+ "radial direction, but still using polar coordinates).\n",
+ "Also note that `F` is created using the entire range of wavenumbers\n",
+ "even though it should not include wavenumber 0.\n",
+ "As such we need to make sure that the coefficient created for\n",
+ "$k=0$ (i.e., $\\hat{u}^1_{0,j}$) will be exactly zero.\n",
+ "Finally, note that\n",
+ "`T0` is not distributed with MPI, which is accomplished using\n",
+ "`MPI.COMM_SELF` instead of `comm` (which equals `MPI.COMM_WORLD`).\n",
+ "The purely radial problem ([26](#eq:u0)) is only solved on the one\n",
+ "processor with rank = 0.\n",
+ "\n",
+ "Polar coordinates are ensured by feeding `coordinates=(psi, rv)`\n",
+ "to [TensorProductSpace](https://shenfun.readthedocs.io/en/latest/shenfun.html#shenfun.tensorproductspace.TensorProductSpace). Operators like [div()](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.operators.div)\n",
+ "[grad()](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.operators.grad) and [curl()](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.operators.curl) will now work on\n",
+ "items of [Function](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.Function), [TestFunction](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.TestFunction) and\n",
+ "[TrialFunction](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.TrialFunction) using a polar coordinate system.\n",
+ "\n",
+ "To define the equations ([26](#eq:u0)) and ([27](#eq:u1)) we first declare\n",
+ "these test- and trialfunctions, and then use code that\n",
+ "is remarkably similar to the mathematics."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a9f683c4",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:40.100829Z",
+ "iopub.status.busy": "2024-05-24T12:36:40.100639Z",
+ "iopub.status.idle": "2024-05-24T12:36:40.241550Z",
+ "shell.execute_reply": "2024-05-24T12:36:40.240621Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "v = TestFunction(T)\n",
+ "u = TrialFunction(T)\n",
+ "v0 = TestFunction(T0)\n",
+ "u0 = TrialFunction(T0)\n",
+ "alpha = 1\n",
+ "\n",
+ "mats = inner(v, -div(grad(u))+alpha*u)\n",
+ "if comm.Get_rank() == 0:\n",
+ " mats0 = inner(v0, -div(grad(u0))+alpha*u0)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ac2378ec",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Here `mats` and `mats0` will contain several tensor product\n",
+ "matrices in the form of\n",
+ "[TPMatrix](https://shenfun.readthedocs.io/en/latest/shenfun.html#shenfun.matrixbase.TPMatrix). Since there is only one non-periodic direction\n",
+ "the matrices can be easily solved using [SolverGeneric1ND](https://shenfun.readthedocs.io/en/latest/shenfun.html#shenfun.la.SolverGeneric1ND).\n",
+ "But first we need to define the function $f(\\theta, r)$.\n",
+ "To this end we use sympy and the method of\n",
+ "manufactured solution to define a possible solution `ue`,\n",
+ "and then compute `f` exactly using exact differentiation"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "56e8f67f",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:40.248259Z",
+ "iopub.status.busy": "2024-05-24T12:36:40.247680Z",
+ "iopub.status.idle": "2024-05-24T12:36:40.411690Z",
+ "shell.execute_reply": "2024-05-24T12:36:40.410356Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "\n",
+ "# Manufactured solution\n",
+ "ue = (r*(1-r))**2*sp.cos(8*theta)-0.1*(r-1)\n",
+ "#f = -ue.diff(r, 2) - (1/r)*ue.diff(r, 1) - (1/r**2)*ue.diff(theta, 2) + alpha*ue\n",
+ "f = (-div(grad(u))+alpha*u).tosympy(basis=ue, psi=psi)\n",
+ "\n",
+ "# Compute the right hand side on the quadrature mesh\n",
+ "fj = Array(T, buffer=f)\n",
+ "\n",
+ "# Take scalar product\n",
+ "f_hat = Function(T)\n",
+ "f_hat = inner(v, fj, output_array=f_hat)\n",
+ "if T.local_slice(True)[0].start == 0: # The processor that owns k=0\n",
+ " f_hat[0] = 0\n",
+ "\n",
+ "# For k=0 we solve only a 1D equation. Do the scalar product for Fourier\n",
+ "# coefficient 0 by hand (or sympy).\n",
+ "if comm.Get_rank() == 0:\n",
+ " f0_hat = Function(T0)\n",
+ " gt = sp.lambdify(r, sp.integrate(f, (theta, 0, 2*sp.pi))/2/sp.pi)(L0.mesh())\n",
+ " f0_hat = T0.scalar_product(gt, f0_hat)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ebf9e1dc",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that for $u^0$ we perform the interal in the $\\theta$ direction\n",
+ "exactly using sympy. This is necessary since one Fourier coefficient\n",
+ "is not sufficient to do this integral numerically. For the $u^1$\n",
+ "case we do the integral numerically as part of the [inner()](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.inner.inner) product.\n",
+ "With the correct right hand side assembled we can solve the\n",
+ "linear system of equations"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "62ab606c",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:40.417767Z",
+ "iopub.status.busy": "2024-05-24T12:36:40.417652Z",
+ "iopub.status.idle": "2024-05-24T12:36:40.430418Z",
+ "shell.execute_reply": "2024-05-24T12:36:40.430025Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "u_hat = Function(T)\n",
+ "Sol1 = la.SolverGeneric1ND(mats)\n",
+ "u_hat = Sol1(f_hat, u_hat)\n",
+ "\n",
+ "# case k = 0\n",
+ "u0_hat = Function(T0)\n",
+ "if comm.Get_rank() == 0:\n",
+ " Sol0 = la.SolverGeneric1ND(mats0)\n",
+ " u0_hat = Sol0(f0_hat, u0_hat)\n",
+ "comm.Bcast(u0_hat, root=0)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8923490d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Having found the solution in spectral space all that is\n",
+ "left is to transform it back to real space."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "410b965c",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:40.435602Z",
+ "iopub.status.busy": "2024-05-24T12:36:40.434831Z",
+ "iopub.status.idle": "2024-05-24T12:36:40.439685Z",
+ "shell.execute_reply": "2024-05-24T12:36:40.438992Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# Transform back to real space. Broadcast 1D solution\n",
+ "sl = T.local_slice(False)\n",
+ "uj = u_hat.backward() + u0_hat.backward()[:, sl[1]]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4c5f0cee",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Postprocessing\n",
+ "The solution can now be compared with the exact solution\n",
+ "through"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e8feed8f",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:40.443008Z",
+ "iopub.status.busy": "2024-05-24T12:36:40.442858Z",
+ "iopub.status.idle": "2024-05-24T12:36:40.447524Z",
+ "shell.execute_reply": "2024-05-24T12:36:40.446000Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "uq = Array(T, buffer=ue)\n",
+ "print('Error =', np.linalg.norm(uj-uq))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fe9d2c70",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We can also get the gradient of the solution. For this we need\n",
+ "a space without boundary conditions, and a vector space"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "de99b93f",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:40.452089Z",
+ "iopub.status.busy": "2024-05-24T12:36:40.451919Z",
+ "iopub.status.idle": "2024-05-24T12:36:40.507857Z",
+ "shell.execute_reply": "2024-05-24T12:36:40.507238Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "TT = T.get_orthogonal()\n",
+ "V = VectorSpace(TT)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f090f9c5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Notice that we do not have the solution in one single space\n",
+ "in spectral space, since it is a combination of `u_hat` and\n",
+ "`u0_hat`. For this reason we first transform the solution from\n",
+ "real space `uj` to the new orthogonal space `TT`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "cf17f776",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:40.513274Z",
+ "iopub.status.busy": "2024-05-24T12:36:40.512761Z",
+ "iopub.status.idle": "2024-05-24T12:36:40.519993Z",
+ "shell.execute_reply": "2024-05-24T12:36:40.519353Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "ua = Array(TT, buffer=uj)\n",
+ "uh = ua.forward()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "355a95e5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "With the solution as a [Function](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.Function) we can simply project\n",
+ "the gradient to `V`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "79ac588b",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:40.523056Z",
+ "iopub.status.busy": "2024-05-24T12:36:40.522966Z",
+ "iopub.status.idle": "2024-05-24T12:36:40.579605Z",
+ "shell.execute_reply": "2024-05-24T12:36:40.579234Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "dv = project(grad(uh), V)\n",
+ "du = dv.backward()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "24534131",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the gradient `du` now contains the contravariant components\n",
+ "of the covariant basis vector `b`. The basis vector `b` is not normalized\n",
+ "(it's length is not unity), because we have set\n",
+ "`config['basisvectors']='covariant'`. The basisvectors can\n",
+ "be seen as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9d570561",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:40.583233Z",
+ "iopub.status.busy": "2024-05-24T12:36:40.582564Z",
+ "iopub.status.idle": "2024-05-24T12:36:40.589089Z",
+ "shell.execute_reply": "2024-05-24T12:36:40.586422Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "from IPython.display import Math\n",
+ "Math(T.coors.latex_basis_vectors(symbol_names={theta: '\\\\theta', r: 'r'}))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "367c0496",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and we see that they are given in terms of the Cartesian unit vectors.\n",
+ "The gradient we have computed is (and yes, it should be $r^2$ because we\n",
+ "do not have unit vectors)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4a3b34ad",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\nabla u = \\underbrace{\\frac{1}{r^2}\\frac{\\partial u}{\\partial \\theta}}_{du[0]}\\mathbf{b}_{\\theta} + \\underbrace{\\frac{\\partial u}{\\partial r}}_{du[1]} \\mathbf{b}_{r}\n",
+ "\\label{eq:gradu} \\tag{28}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2a34bbe0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Now it makes sense to plot the solution and its gradient in Cartesian\n",
+ "instead of computational coordinates. To this end we need to\n",
+ "project the gradient to a Cartesian basis"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "57f82ae3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\begin{align*}\n",
+ "\\frac{\\partial u}{\\partial x} &= \\nabla u \\cdot \\mathbf{i},\\\\ \n",
+ "\\frac{\\partial u}{\\partial y} &= \\nabla u \\cdot \\mathbf{j}.\n",
+ "\\end{align*}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "83087c4c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We compute the Cartesian gradient by assembling ([28](#eq:gradu))\n",
+ "on the computational grid"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9a44ca48",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:40.593424Z",
+ "iopub.status.busy": "2024-05-24T12:36:40.593172Z",
+ "iopub.status.idle": "2024-05-24T12:36:40.599643Z",
+ "shell.execute_reply": "2024-05-24T12:36:40.599014Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "ui, vi = TT.local_mesh(True)\n",
+ "b = T.coors.get_covariant_basis()\n",
+ "bij = np.zeros((2, 2, N, N))\n",
+ "for i in (0, 1):\n",
+ " for j in (0, 1):\n",
+ " bij[i, j] = sp.lambdify(psi, b[i, j])(ui, vi)\n",
+ "gradu = du[0]*bij[0] + du[1]*bij[1]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "35993847",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Because of the way the vectors are stored, `gradu[0]` will now\n",
+ "contain $\\nabla u \\cdot \\mathbf{i}$ and\n",
+ "`gradu[1]` will contain $\\nabla u \\cdot \\mathbf{j}$.\n",
+ "\n",
+ "To validate the gradient we compute the $L^2$ error norm"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1135b831",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\sqrt{\\int_{\\Omega} |\\nabla u - \\nabla u_e|^2 d\\sigma}\n",
+ " = \\sqrt{\\int_{\\theta=0}^{2\\pi}\\int_{r=0}^{1} \\left(\\left(\\frac{1}{r^2}\\frac{\\partial u-u_e}{\\partial \\theta}\\right)^2\\mathbf{b}_{\\theta}\\cdot \\mathbf{b}_{\\theta} + \\left(\\frac{\\partial u-u_e}{\\partial r}\\right)^2\\mathbf{b}_{r}\\cdot \\mathbf{b}_{r} \\right)rd\\theta dr}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3ac72ba9",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "implemented as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7b048206",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:40.603085Z",
+ "iopub.status.busy": "2024-05-24T12:36:40.602998Z",
+ "iopub.status.idle": "2024-05-24T12:36:40.643923Z",
+ "shell.execute_reply": "2024-05-24T12:36:40.643534Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "gradue = Array(V, buffer=grad(u).tosympy(basis=ue, psi=psi))\n",
+ "gij = T.coors.get_covariant_metric_tensor()\n",
+ "ui, vi = TT.local_mesh(True, kind='uniform')\n",
+ "# Evaluate metric on computational mesh\n",
+ "gij[0, 0] = sp.lambdify(psi, gij[0, 0])(ui, vi)\n",
+ "# Compute L2 error\n",
+ "errorg = inner(1, (du[0]-gradue[0])**2*gij[0, 0]+ (du[1]-gradue[1])**2*gij[1, 1])\n",
+ "print('Error gradient', np.sqrt(float(errorg)))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1d940058",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We now refine the solution to make it look better,\n",
+ "and plot on the unit disc."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "70bfca20",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:40.648719Z",
+ "iopub.status.busy": "2024-05-24T12:36:40.648563Z",
+ "iopub.status.idle": "2024-05-24T12:36:41.468520Z",
+ "shell.execute_reply": "2024-05-24T12:36:41.467794Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "%matplotlib inline\n",
+ "\n",
+ "u_hat2 = u_hat.refine([N*3, N*3])\n",
+ "u0_hat2 = u0_hat.refine([1, N*3])\n",
+ "sl = u_hat2.function_space().local_slice(False)\n",
+ "ur = u_hat2.backward() + u0_hat2.backward()[:, sl[1]]\n",
+ "\n",
+ "# Wrap periodic plot around since it looks nicer\n",
+ "xx, yy = u_hat2.function_space().local_cartesian_mesh()\n",
+ "xp = np.vstack([xx, xx[0]])\n",
+ "yp = np.vstack([yy, yy[0]])\n",
+ "up = np.vstack([ur, ur[0]])\n",
+ "# For vector no need to wrap around and no need to refine:\n",
+ "xi, yi = TT.local_cartesian_mesh()\n",
+ "\n",
+ "# plot\n",
+ "import matplotlib.pyplot as plt\n",
+ "plt.figure()\n",
+ "plt.contourf(xp, yp, up)\n",
+ "plt.quiver(xi, yi, gradu[0], gradu[1], scale=40, pivot='mid', color='white')\n",
+ "plt.colorbar()\n",
+ "plt.title('Helmholtz - unitdisc')\n",
+ "plt.xticks([])\n",
+ "plt.yticks([])\n",
+ "plt.axis('off')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "709ed573",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "\n",
+ "1.
**J. Shen**. Efficient Spectral-Galerkin Methods III: Polar and Cylindrical Geometries, *SIAM Journal on Scientific Computing*, 18(6), pp. 1583-1604, [doi: 10.1137/S1064827595295301](https://dx.doi.org/10.1137/S1064827595295301), 1997."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/demos/RayleighBenard/rayleighbenard.ipynb b/docs/demos/RayleighBenard/rayleighbenard.ipynb
new file mode 100644
index 00000000..cfb0150a
--- /dev/null
+++ b/docs/demos/RayleighBenard/rayleighbenard.ipynb
@@ -0,0 +1,1709 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "7f6234eb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "\n",
+ "# Demo - Rayleigh Benard\n",
+ "**Mikael Mortensen** (email: `mikaem@math.uio.no`), Department of Mathematics, University of Oslo.\n",
+ "\n",
+ "Date: **November 21, 2019**\n",
+ "\n",
+ "**Summary.** Rayleigh-Benard convection arise\n",
+ "due to temperature gradients in a fluid. The governing equations are\n",
+ "Navier-Stokes coupled (through buoyancy) with an additional temperature\n",
+ "equation derived from the first law of thermodynamics, using a linear\n",
+ "correlation between density and temperature.\n",
+ "\n",
+ "This is a demonstration of how the Python module [shenfun](https://github.com/spectralDNS/shenfun) can be used to solve for\n",
+ "these Rayleigh-Benard cells in a 2D channel with two walls of\n",
+ "different temperature in one direction, and periodicity in the other direction.\n",
+ "The solver described runs with MPI\n",
+ "without any further considerations required from the user.\n",
+ "Note that there is also a more physically realistic [3D solver](https://github.com/spectralDNS/shenfun/blob/master/demo/RayleighBenard.py).\n",
+ "The solver described in this demo has been implemented in a class in the\n",
+ "[RayleighBenard2D.py](https://github.com/spectralDNS/shenfun/blob/master/demo/RayleighBenard2D.py)\n",
+ "module in the demo folder of shenfun. Below is an example solution, which has been run at a very high\n",
+ "Rayleigh number (*Ra*).\n",
+ "\n",
+ "\n",
+ "\n",
+ "
\n",
+ "\n",
+ "
Figure 1: Temperature fluctuations in the Rayleigh Benard flow. The top and bottom walls are kept at different temperatures and this sets up the Rayleigh-Benard convection. The simulation is run at Ra =1,000,000, Pr =0.7 with 256 and 512 quadrature points in x and y -directions, respectively.
\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "177a6e73",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## The Rayleigh Bénard equations\n",
+ "
\n",
+ "\n",
+ "The governing equations solved in domain $\\Omega=(-1, 1)\\times [0, 2\\pi)$ are"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ad1449b2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\frac{\\partial \\boldsymbol{u}}{\\partial t} + (\\boldsymbol{u} \\cdot \\nabla) \\boldsymbol{u} = - \\nabla p + \\sqrt{\\frac{Pr}{Ra}} \\nabla^2 \\boldsymbol{u} + T \\boldsymbol{i}, \\label{eq:momentum} \\tag{1}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "59b6c4c7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " \\frac{\\partial T}{\\partial t} +\\boldsymbol{u} \\cdot \\nabla T = \\frac{1}{\\sqrt{RaPr}} \\nabla^2 T, \\label{eq:T} \\tag{2}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5d7e6701",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " \\nabla \\cdot \\boldsymbol{u} = 0, \\label{eq:div} \\tag{3}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2a91fb26",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\boldsymbol{u}(x, y, t) (= u\\boldsymbol{i} + v\\boldsymbol{j})$ is the velocity vector, $p(x, y, t)$ is pressure, $T(x, y, t)$ is the temperature, and $\\boldsymbol{i}$ and\n",
+ "$\\boldsymbol{j}$ are the unity vectors for the $x$ and $y$-directions, respectively.\n",
+ "\n",
+ "The equations are complemented with boundary conditions $\\boldsymbol{u}(\\pm 1, y, t) = (0, 0), \\boldsymbol{u}(x, 2 \\pi, t) = \\boldsymbol{u}(x, 0, t), T(-1, y, t) = 1, T(1, y, t) = 0, T(x, 2 \\pi, t) = T(x, 0, t)$.\n",
+ "Note that these equations have been non-dimensionalized according to [[pandey18]](#pandey18), using dimensionless\n",
+ "Rayleigh number $Ra=g \\alpha \\Delta T h^3/(\\nu \\kappa)$ and Prandtl number $Pr=\\nu/\\kappa$. Here\n",
+ "$g \\boldsymbol{i}$ is the vector accelleration of gravity, $\\Delta T$ is the temperature difference between\n",
+ "the top and bottom walls, $h$ is the hight of the channel in $x$-direction, $\\nu$ is the\n",
+ "dynamic viscosity coefficient, $\\kappa$ is the heat transfer coefficient and $\\alpha$ is the\n",
+ "thermal expansion coefficient. Note that the\n",
+ "governing equations have been non-dimensionalized using the free-fall velocityscale\n",
+ "$U=\\sqrt{g \\alpha \\Delta T h}$. See [[pandey18]](#pandey18) for more details.\n",
+ "\n",
+ "The governing equations contain a non-trivial coupling between velocity, pressure and temperature.\n",
+ "This coupling can be simplified by eliminating the pressure from the equation for the wall-normal velocity\n",
+ "component $u$. We accomplish this by taking the Laplace of the momentum equation in wall normal\n",
+ "direction, using the pressure from the divergence of the momentum equation\n",
+ "$\\nabla^2 p = -\\nabla \\cdot \\boldsymbol{H}+\\partial T/\\partial x$, where\n",
+ "$\\boldsymbol{H} = (H_x, H_y) = (\\boldsymbol{u} \\cdot \\nabla) \\boldsymbol{u}$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f838dca0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\frac{\\partial \\nabla^2 {u}}{\\partial t} = \\frac{\\partial^2 H_y}{\\partial x \\partial y} - \\frac{\\partial^2 H_x}{\\partial y\\partial y} + \\sqrt{\\frac{Pr}{Ra}} \\nabla^4 {u} + \\frac{\\partial^2 T}{\\partial y^2} . \\label{eq:rb:u} \\tag{4}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ca6ea1f7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "This equation is solved with $u(\\pm 1,y,t) = \\partial u/\\partial x(\\pm 1,y,t) = 0$, where the latter follows from the\n",
+ "divergence constraint. In summary, we now seem to have the following equations to solve:"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0afef1df",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\frac{\\partial \\nabla^2 {u}}{\\partial t} = \\frac{\\partial^2 H_y}{\\partial x \\partial y} - \\frac{\\partial^2 H_x}{\\partial y\\partial y} + \\sqrt{\\frac{Pr}{Ra}} \\nabla^4 {u} + \\frac{\\partial^2 T}{\\partial y^2}, \\label{eq:rb:u2} \\tag{5}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3d483309",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " \\frac{\\partial v}{\\partial t} + H_y = - \\frac{\\partial p}{\\partial y} + \\sqrt{\\frac{Pr}{Ra}} \\nabla^2 v, \\label{eq:v} \\tag{6}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9f1801e4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " \\frac{\\partial T}{\\partial t} +\\boldsymbol{u} \\cdot \\nabla T = \\frac{1}{\\sqrt{RaPr}} \\nabla^2 T, \\label{eq:T2} \\tag{7}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2d815654",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " \\nabla \\cdot \\boldsymbol{u} = 0 \\label{eq:div2} \\tag{8}.\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "87c1dd49",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "However, we note that Eqs. ([5](#eq:rb:u2)) and ([7](#eq:T2)) and ([8](#eq:div2)) do not depend on pressure, and,\n",
+ "apparently, on each time step we can solve ([5](#eq:rb:u2)) for $u$, then ([8](#eq:div2)) for $v$ and finally ([7](#eq:T2)) for $T$.\n",
+ "So what do we need ([6](#eq:v)) for? It appears to have become redundant from the elimination of the\n",
+ "pressure from Eq. ([5](#eq:rb:u2)). It turns out that this is actually almost completely true, but\n",
+ "([5](#eq:rb:u2)), ([7](#eq:T2)) and ([8](#eq:div2)) can only provide closure for all but one of the\n",
+ "Fourier coefficients. To see this it is necessary to introduce some discretization and basis functions\n",
+ "that will be used to solve the problem. To this end we use $P_N$, which is the set of all real polynomials\n",
+ "of degree less than or equal to N and introduce the following finite-dimensional approximation spaces"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "469f8896",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " V_N^B(x) = \\{v \\in P_N | v(\\pm 1) = v´(\\pm 1) = 0\\}, \\label{eq:VB} \\tag{9} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c8f804cb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " V_N^D(x) = \\{v \\in P_N | v(\\pm 1) = 0\\}, \\label{eq:VD} \\tag{10} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f3d0a11f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " V_N^T(x) = \\{v \\in P_N | v(-1) = 0, v(1) = 1\\}, \\label{eq:VT} \\tag{11} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "eae8e9d1",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " V_N^W(x) = \\{v \\in P_N\\}, \\label{eq:VW} \\tag{12} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7be2b88e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " V_M^F(y) = \\{\\exp(\\imath l y) | l \\in [-M/2, -M/2+1, \\ldots M/2-1]\\}. \\label{eq:VF} \\tag{13}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a5e83417",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Here $\\text{dim}(V_N^B) = N-4, \\text{dim}(V_N^D) = \\text{dim}(V_N^W) = \\text{dim}(V_N^T) = N-2$\n",
+ "and $\\text{dim}(V_M^F)=M$. We note that\n",
+ "$V_N^B, V_N^D, V_N^W$ and $V_N^T$ can be used to approximate $u, v, T$ and $p$, respectively, in the $x$-direction.\n",
+ "Also note that for $V_M^F$ it is assumed that $M$ is an even number.\n",
+ "\n",
+ "We can now choose basis functions for the spaces, using Shen's composite bases for either Legendre or\n",
+ "Chebyshev polynomials. For the Fourier space the basis functions are already given. We leave the actual choice\n",
+ "of basis as an implementation option for later. For now we use $\\phi^B(x), \\phi^D(x), \\phi^W$ and $\\phi^T(x)$\n",
+ "as common notation for basis functions in spaces $V_N^B, V_N^D, V_N^W$ and $V_N^T$, respectively.\n",
+ "\n",
+ "To get the required approximation spaces for the entire domain we use tensor products of the\n",
+ "one-dimensional spaces in ([9](#eq:VB))-([13](#eq:VF))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "38df0fa1",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " W_{BF} = V_N^B \\otimes V_M^F, \\label{eq:WBF} \\tag{14} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ba2319bf",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " W_{DF} = V_N^D \\otimes V_M^F, \\label{eq:WDF} \\tag{15} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "97c4f4bc",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " W_{TF} = V_N^T \\otimes V_M^F, \\label{eq:WTF} \\tag{16} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "25acfc6e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " W_{WF} = V_N^W \\otimes V_M^F. \\label{eq:WWF} \\tag{17}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "827f02da",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Space $W_{BF}$ has 2D tensor product basis functions $\\phi_k^B(x) \\exp (\\imath l y)$ and\n",
+ "similar for the others. All in all\n",
+ "we get the following approximations for the unknowns"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fc1fc414",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " u_N(x, y, t) = \\sum_{k \\in \\boldsymbol{k}_B} \\sum_{l \\in \\boldsymbol{l}} \\hat{u}_{kl}(t) \\phi_k^B(x) \\exp(\\imath l y), \n",
+ "\\label{_auto1} \\tag{18}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b3e1db16",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " v_N(x, y, t) = \\sum_{k \\in \\boldsymbol{k}_D} \\sum_{l \\in \\boldsymbol{l}} \\hat{v}_{kl}(t) \\phi_k^D(x) \\exp(\\imath l y), \n",
+ "\\label{_auto2} \\tag{19}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bfc89552",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " p_N(x, y, t) = \\sum_{k \\in \\boldsymbol{k}_W} \\sum_{l \\in \\boldsymbol{l}} \\hat{p}_{kl}(t) \\phi_k^W(x) \\exp(\\imath l y), \n",
+ "\\label{_auto3} \\tag{20}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d37af4a7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " T_N(x, y, t) = \\sum_{k \\in \\boldsymbol{k}_T} \\sum_{l \\in \\boldsymbol{l}} \\hat{T}_{kl}(t) \\phi_k^T(x) \\exp(\\imath l y),\n",
+ "\\label{_auto4} \\tag{21}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3d0a241c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\boldsymbol{k}_{x} = \\{0, 1, \\ldots \\text{dim}(V_N^x)-1\\}, \\, \\text{for} \\, x\\in(B, D, W, T)$\n",
+ "and $\\boldsymbol{l} = \\{-M/2, -M/2+1, \\ldots, M/2-1\\}$.\n",
+ "Note that since the problem is defined in real space we will have Hermitian symmetry. This means\n",
+ "that $\\hat{u}_{k, l} = \\overline{\\hat{u}}_{k, -l}$, with an overbar being a complex conjugate,\n",
+ "and similar for $\\hat{v}_{kl}, \\hat{p}_{kl}$ and\n",
+ "$\\hat{T}_{kl}$. For this reason we can get away with\n",
+ "solving for only the positive $l$'s, as long as we remember that the sum in the end goes over both positive\n",
+ "and negative $l's$. This is actually automatically taken care of by the FFT provider and is\n",
+ "not much of an additional complexity in the implementation. So from now on $\\boldsymbol{l} = \\{0, 1, \\ldots, M/2\\}$.\n",
+ "\n",
+ "We can now take a look at why Eq. ([6](#eq:v)) is needed. If we first solve ([5](#eq:rb:u2)) for\n",
+ "$\\hat{u}_{kl}(t), (k, l) \\in \\boldsymbol{k}_B \\times \\boldsymbol{l}$, then we can use ([8](#eq:div2)) to\n",
+ "solve for $\\hat{v}_{kl}(t)$. But here there is a problem. We can see this by creating the variational\n",
+ "form required to solve ([8](#eq:div2)) by the spectral Galerkin method. To this end make $v=v_N$ in ([8](#eq:div2))\n",
+ "a trial function, use $u=u_N$ a known function and take the weighted inner product over the\n",
+ "domain using test function $q \\in W_{DF}$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4b48d850",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\left < \\frac{\\partial u_N}{\\partial x} + \\frac{\\partial v_N}{\\partial y}, q \\right > _w = 0.\n",
+ "\\label{_auto5} \\tag{22}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6505d4f0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Here we are using the inner product notation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9150f8b5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\left < a, b \\right > _w = \\int_{-1}^1 \\int_0^{2\\pi} a \\overline{b} dx_wdy_w \\left(\\approx \\sum_{i}\\sum_{j} a(x_i, y_j) \\overline{b}(x_i, y_j) w(x_i) w(y_j)\\right),\n",
+ "\\label{_auto6} \\tag{23}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d98142bf",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where the exact form of the\n",
+ "weighted scalar product depends on the chosen basis; Legendre has $dx_w=dx$, Chebyshev\n",
+ "$dx_w = dx/\\sqrt{1-x^2}$ and Fourier $dy_w=dy/2/\\pi$. The bases also have associated quadrature weights\n",
+ "$\\{w(x_i) \\}_{i=0}^{N-1}$ and $\\{w(y_j)\\}_{j=0}^{M-1}$ that are used to approximate the integrals.\n",
+ "\n",
+ "Inserting now for the known $u_N$, the unknown $v_N$, and $q=\\phi_m^D(x) \\exp(\\imath n y)$ the\n",
+ "continuity equation becomes"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2ac1d624",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\int_{-1}^1 \\int_{0}^{2\\pi} \\frac{\\partial}{\\partial x} \\left(\\sum_{k \\in \\boldsymbol{k}_B} \\sum_{l \\in \\boldsymbol{l}} \\hat{u}_{kl}(t) \\phi_k^B(x) \\exp(\\imath l y) \\right) \\phi_m^D(x) \\exp(-\\imath n y) dx_w dy_w + \\\\ \n",
+ " \\int_{-1}^1 \\int_{0}^{2\\pi} \\frac{\\partial}{\\partial y} \\left(\\sum_{k \\in \\boldsymbol{k}_D} \\sum_{l \\in \\boldsymbol{l}} \\hat{v}_{kl}(t) \\phi_k^D(x) \\exp(\\imath l y) \\right) \\phi_m^D(x) \\exp(-\\imath n y) dx_w dy_w = 0.\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1a8e691c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The $x$ and $y$ domains are separable, so we can rewrite as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1cf1221d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\sum_{k \\in \\boldsymbol{k}_B} \\sum_{l \\in \\boldsymbol{l}} \\int_{-1}^1 \\frac{\\partial \\phi_k^B(x)}{\\partial x} \\phi_m^D(x) dx_w \\int_{0}^{2\\pi} \\exp(\\imath l y) \\exp(-\\imath n y) dy_w \\hat{u}_{kl} + \\\\ \n",
+ " \\sum_{k \\in \\boldsymbol{k}_D} \\sum_{l \\in \\boldsymbol{l}} \\int_{-1}^1 \\phi_k^D(x) \\phi_m^D(x) dx_w \\int_{0}^{2\\pi} \\frac{\\partial \\exp(\\imath l y)}{\\partial y} \\exp(-\\imath n y) dy_w \\hat{v}_{kl} = 0.\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4df1a6eb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Now perform some exact manipulations in the Fourier direction and introduce the\n",
+ "1D inner product notation for the $x$-direction"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a3eb4492",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\left(a, b\\right)_w = \\int_{-1}^1 a(x) b(x) dx_w \\left(\\approx \\sum_{j = 0}^{N-1} a(x_j)b(x_j) w(x_j)\\right).\n",
+ "\\label{_auto7} \\tag{24}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1b5d5113",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "By also simplifying the notation using summation of repeated indices,\n",
+ "we get the following equation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "26b6a18f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\delta_{ln} \\left(\\frac{\\partial \\phi_k^B}{\\partial x}, \\phi_m^D \\right)_w \\hat{u}_{kl}\n",
+ " + \\imath l \\delta_{ln} \\left(\\phi_k^D, \\phi_m^D \\right)_w \\hat{v}_{kl} = 0.\n",
+ "\\label{_auto8} \\tag{25}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e486aa6d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Now $l$ must equal $n$ and we can simplify some more"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f4c027ba",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\left(\\frac{\\partial \\phi_k^B}{\\partial x}, \\phi_m^D \\right)_w \\hat{u}_{kl}\n",
+ " + \\imath l \\left(\\phi_k^D, \\phi_m^D \\right)_w \\hat{v}_{kl} = 0. \\label{eq:div3} \\tag{26}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fb8eb364",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We see that this equation can be solved for\n",
+ "$\\hat{v}_{kl} \\text{ for } (k, l) \\in \\boldsymbol{k}_D \\times [1, 2, \\ldots, M/2]$, but try with\n",
+ "$l=0$ and you hit division by zero, which obviously is not allowed. And this is the reason\n",
+ "why Eq. ([6](#eq:v)) is still needed, to solve for $\\hat{v}_{k,0}$! Fortunately,\n",
+ "since $\\exp(\\imath 0 y) = 1$, the pressure derivative $\\frac{\\partial p}{\\partial y} = 0$,\n",
+ "and as such the pressure is still not required. When used only for\n",
+ "Fourier coefficient 0, Eq. ([6](#eq:v)) becomes"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e1966ab1",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\frac{\\partial v}{\\partial t} + N_y = \\sqrt{\\frac{Pr}{Ra}} \\frac{\\partial^2 v}{\\partial x^2}. \\label{eq:vx} \\tag{27}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "69a9f741",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "There is still one more revelation to be made from Eq. ([26](#eq:div3)). When $l=0$ we get"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "440cd498",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\left(\\frac{\\partial \\phi_k^B}{\\partial x}, \\phi_m^D \\right)_w \\hat{u}_{k,0} = 0,\n",
+ "\\label{_auto9} \\tag{28}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "200607d9",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "which is trivially satisfied if $\\hat{u}_{k,0}=0$ for $k\\in\\boldsymbol{k}_B$. Bottom line is\n",
+ "that we only need to solve Eq. ([5](#eq:rb:u2)) for $l \\in \\boldsymbol{l}/\\{0\\}$, whereas we can use\n",
+ "directly $\\hat{u}_{k,0}=0 \\text{ for } k \\in \\boldsymbol{k}_B$.\n",
+ "\n",
+ "To sum up, with the solution known at $t = t - \\Delta t$, we solve\n",
+ "\n",
+ "
\n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " Equation For unknown With indices \n",
+ " \n",
+ "\n",
+ " (5 ) $\\hat{u}_{kl}(t)$ $(k, l) \\in \\boldsymbol{k}_B \\times \\boldsymbol{l}/\\{0\\}$ \n",
+ " (8 ) $\\hat{v}_{kl}(t)$ $(k, l) \\in \\boldsymbol{k}_D \\times \\boldsymbol{l}/\\{0\\}$ \n",
+ " (27 ) $\\hat{v}_{kl}(t)$ $(k, l) \\in \\boldsymbol{k}_D \\times \\{0\\}$ \n",
+ " (7 ) $\\hat{T}_{kl}(t)$ $(k, l) \\in \\boldsymbol{k}_T \\times \\boldsymbol{l}$ \n",
+ " \n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b943e520",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Temporal discretization\n",
+ "\n",
+ "The governing equations are integrated in time using any one of the time steppers available in\n",
+ "shenfun. There are several possible IMEX Runge Kutta methods, see [integrators.py](https://github.com/spectralDNS/shenfun/blob/master/shenfun/utilities/integrators.py).\n",
+ "The time steppers are used for any generic equation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b6237baa",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\frac{\\partial \\psi}{\\partial t} = \\mathcal{N} + \\mathcal{L}\\psi \\label{eq:genericpsi} \\tag{29},\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f42997a8",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\mathcal{N}$ and $\\mathcal{L}$ represents the nonlinear and linear contributions, respectively.\n",
+ "The timesteppers are provided with $\\psi, \\mathcal{L}$ and $\\mathcal{N}$, and possibly some tailored\n",
+ "linear algebra solvers, and solvers are then further assembled under the hood.\n",
+ "\n",
+ "All the timesteppers split one time step into one or several stages.\n",
+ "The classes [IMEXRK222](https://shenfun.readthedocs.io/en/latest/shenfun.utilities.html#shenfun.utilities.integrators.IMEXRK222), [IMEXRK3](https://shenfun.readthedocs.io/en/latest/shenfun.utilities.html#shenfun.utilities.integrators.IMEXRK3) and [IMEXRK443](https://shenfun.readthedocs.io/en/latest/shenfun.utilities.html#shenfun.utilities.integrators.IMEXRK443)\n",
+ "have 2, 3 and 4 steps, respectively, and the cost is proportional."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1b1d02c6",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Implementation\n",
+ "\n",
+ "To get started we need instances of the approximation spaces discussed in\n",
+ "Eqs. ([9](#eq:VB)) - ([17](#eq:WWF)). When the spaces are created we also need\n",
+ "to specify the family and the dimension of each space. Here we simply\n",
+ "choose Chebyshev and Fourier with 100 and 256 quadrature points in $x$ and\n",
+ "$y$-directions, respectively. We could replace 'Chebyshev' by 'Legendre',\n",
+ "but the former is known to be faster due to the existence of fast transforms."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4917abcd",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:08.111092Z",
+ "iopub.status.busy": "2024-05-24T12:37:08.110785Z",
+ "iopub.status.idle": "2024-05-24T12:37:08.792581Z",
+ "shell.execute_reply": "2024-05-24T12:37:08.791935Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "from shenfun import *\n",
+ "\n",
+ "N, M = 64, 128\n",
+ "family = 'Chebyshev'\n",
+ "VB = FunctionSpace(N, family, bc=(0, 0, 0, 0))\n",
+ "VD = FunctionSpace(N, family, bc=(0, 0))\n",
+ "VW = FunctionSpace(N, family)\n",
+ "VT = FunctionSpace(N, family, bc=(1, 0))\n",
+ "VF = FunctionSpace(M, 'F', dtype='d')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b7122e43",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "And then we create tensor product spaces by combining these bases (like in Eqs. ([14](#eq:WBF))-([17](#eq:WWF)))."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "32a0a207",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:08.799525Z",
+ "iopub.status.busy": "2024-05-24T12:37:08.797537Z",
+ "iopub.status.idle": "2024-05-24T12:37:09.189267Z",
+ "shell.execute_reply": "2024-05-24T12:37:09.188578Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "W_BF = TensorProductSpace(comm, (VB, VF)) # Wall-normal velocity\n",
+ "W_DF = TensorProductSpace(comm, (VD, VF)) # Streamwise velocity\n",
+ "W_WF = TensorProductSpace(comm, (VW, VF)) # No bc\n",
+ "W_TF = TensorProductSpace(comm, (VT, VF)) # Temperature\n",
+ "BD = VectorSpace([W_BF, W_DF]) # Velocity vector\n",
+ "DD = VectorSpace([W_DF, W_DF]) # Convection vector\n",
+ "W_DFp = W_DF.get_dealiased(padding_factor=1.5)\n",
+ "BDp = BD.get_dealiased(padding_factor=1.5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3e9e1f8d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Here the `VectorSpae` create mixed tensor product spaces by the\n",
+ "Cartesian products `BD = W_BF` $\\times$ `W_DF` and `DD = W_DF` $\\times$ `W_DF`.\n",
+ "These mixed space will be used to hold the velocity and convection vectors,\n",
+ "but we will not solve the equations in a coupled manner and continue in the\n",
+ "segregated approach outlined above.\n",
+ "\n",
+ "We also need containers for the computed solutions. These are created as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "be8b51ce",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:09.191855Z",
+ "iopub.status.busy": "2024-05-24T12:37:09.191720Z",
+ "iopub.status.idle": "2024-05-24T12:37:09.194654Z",
+ "shell.execute_reply": "2024-05-24T12:37:09.193903Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "u_ = Function(BD) # Velocity vector, two components\n",
+ "T_ = Function(W_TF) # Temperature\n",
+ "H_ = Function(DD) # Convection vector\n",
+ "uT_ = Function(BD) # u times T"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4c90842d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Wall-normal velocity equation\n",
+ "\n",
+ "We implement Eq. ([5](#eq:rb:u2)) using a generic time stepper.\n",
+ "To this end we first need to declare some test- and trial functions, as well as\n",
+ "some model constants and the length of the time step. We store the\n",
+ "PDE time stepper in a dictionary called `pdes` just for convenience:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b3ee1794",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:09.198222Z",
+ "iopub.status.busy": "2024-05-24T12:37:09.197359Z",
+ "iopub.status.idle": "2024-05-24T12:37:09.235664Z",
+ "shell.execute_reply": "2024-05-24T12:37:09.233971Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "\n",
+ "# Specify viscosity and time step size using dimensionless Ra and Pr\n",
+ "Ra = 1000000\n",
+ "Pr = 0.7\n",
+ "nu = np.sqrt(Pr/Ra)\n",
+ "kappa = 1./np.sqrt(Pr*Ra)\n",
+ "dt = 0.025\n",
+ "\n",
+ "# Choose timestepper and create instance of class\n",
+ "\n",
+ "PDE = IMEXRK3 # IMEX222, IMEXRK443\n",
+ "\n",
+ "v = TestFunction(W_BF) # The space we're solving for u in\n",
+ "\n",
+ "pdes = {\n",
+ " 'u': PDE(v, # test function\n",
+ " div(grad(u_[0])), # u\n",
+ " lambda f: nu*div(grad(f)), # linear operator on u\n",
+ " [Dx(Dx(H_[1], 0, 1), 1, 1)-Dx(H_[0], 1, 2), Dx(T_, 1, 2)],\n",
+ " dt=dt,\n",
+ " solver=chebyshev.la.Biharmonic if family == 'Chebyshev' else la.SolverGeneric1ND,\n",
+ " latex=r\"\\frac{\\partial \\nabla^2 u}{\\partial t} = \\nu \\nabla^4 u + \\frac{\\partial^2 N_y}{\\partial x \\partial y} - \\frac{\\partial^2 N_x}{\\partial y^2}\")\n",
+ "}\n",
+ "pdes['u'].assemble()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7b8ac028",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Notice the one-to-one resemblance with ([5](#eq:rb:u2)).\n",
+ "\n",
+ "The right hand side depends on the convection vector $\\boldsymbol{H}$, which can be computed in many different ways.\n",
+ "Here we will make use of\n",
+ "the identity $(\\boldsymbol{u} \\cdot \\nabla) \\boldsymbol{u} = -\\boldsymbol{u} \\times (\\nabla \\times \\boldsymbol{u}) + 0.5 \\nabla\\boldsymbol{u} \\cdot \\boldsymbol{u}$,\n",
+ "where $0.5 \\nabla \\boldsymbol{u} \\cdot \\boldsymbol{u}$ can be added to the eliminated pressure and as such\n",
+ "be neglected. Compute $\\boldsymbol{H} = -\\boldsymbol{u} \\times (\\nabla \\times \\boldsymbol{u})$ by first evaluating\n",
+ "the velocity and the curl in real space. The curl is obtained by projection of $\\nabla \\times \\boldsymbol{u}$\n",
+ "to the no-boundary-condition space `W_TF`, followed by a backward transform to real space.\n",
+ "The velocity is simply transformed backwards with padding."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "1edae12b",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:09.239208Z",
+ "iopub.status.busy": "2024-05-24T12:37:09.239104Z",
+ "iopub.status.idle": "2024-05-24T12:37:09.253543Z",
+ "shell.execute_reply": "2024-05-24T12:37:09.251192Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# Get a mask for setting Nyquist frequency to zero\n",
+ "mask = W_DF.get_mask_nyquist()\n",
+ "Curl = Project(curl(u_), W_WF) # Instance used to compute curl\n",
+ "\n",
+ "def compute_convection(u, H):\n",
+ " up = u.backward(padding_factor=1.5).v\n",
+ " curl = Curl().backward(padding_factor=1.5)\n",
+ " H[0] = W_DFp.forward(-curl*up[1])\n",
+ " H[1] = W_DFp.forward(curl*up[0])\n",
+ " H.mask_nyquist(mask)\n",
+ " return H"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4833c72d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the convection has a homogeneous Dirichlet boundary condition in the\n",
+ "non-periodic direction."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4bf47890",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Streamwise velocity\n",
+ "\n",
+ "The streamwise velocity is computed using Eq. ([26](#eq:div3)) and ([27](#eq:vx)).\n",
+ "The first part is done fastest by projecting $f=\\frac{\\partial u}{\\partial x}$\n",
+ "to the same Dirichlet space `W_DF` used by $v$. This is most efficiently\n",
+ "done by creating a class to do it"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ef83143c",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:09.257574Z",
+ "iopub.status.busy": "2024-05-24T12:37:09.257466Z",
+ "iopub.status.idle": "2024-05-24T12:37:09.269942Z",
+ "shell.execute_reply": "2024-05-24T12:37:09.268913Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "f = dudx = Project(Dx(u_[0], 0, 1), W_DF)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "15d1dd66",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Since $f$ now is in the same space as the streamwise velocity, Eq. ([26](#eq:div3))\n",
+ "simplifies to"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0cc5e0c5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\imath l \\left(\\phi_k^D, \\phi_m^D \\right)_w \\hat{v}_{kl}\n",
+ " = -\\left( \\phi_k^D, \\phi_m^D \\right)_w \\hat{f}_{kl}, \\label{eq:fdiv} \\tag{30} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6f940ea9",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " \\hat{v}_{kl} = \\frac{\\imath \\hat{f}_{kl}}{ l}.\n",
+ "\\label{_auto10} \\tag{31}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "93c20b46",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We thus compute $\\hat{v}_{kl}$ for all $k$ and $l>0$ as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0a919817",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:09.272850Z",
+ "iopub.status.busy": "2024-05-24T12:37:09.272735Z",
+ "iopub.status.idle": "2024-05-24T12:37:09.277113Z",
+ "shell.execute_reply": "2024-05-24T12:37:09.276555Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "K = W_BF.local_wavenumbers(scaled=True)\n",
+ "K[1][0, 0] = 1 # to avoid division by zero. This component is computed later anyway.\n",
+ "u_[1] = 1j*dudx()/K[1]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "df413965",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "which leaves only $\\hat{v}_{k0}$. For this we use ([27](#eq:vx)) and get"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "115a2254",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:09.278870Z",
+ "iopub.status.busy": "2024-05-24T12:37:09.278806Z",
+ "iopub.status.idle": "2024-05-24T12:37:09.285778Z",
+ "shell.execute_reply": "2024-05-24T12:37:09.285461Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "v00 = Function(VD)\n",
+ "v0 = TestFunction(VD)\n",
+ "h1 = Function(VD) # convection equal to H_[1, :, 0]\n",
+ "pdes1d = {\n",
+ " 'v0': PDE(v0,\n",
+ " v00,\n",
+ " lambda f: nu*div(grad(f)),\n",
+ " -Expr(h1),\n",
+ " dt=dt,\n",
+ " solver=chebyshev.la.Helmholtz if family == 'Chebyshev' else la.Solver,\n",
+ " latex=r\"\\frac{\\partial v}{\\partial t} = \\nu \\frac{\\partial^2 v}{\\partial x^2} - N_y \"),\n",
+ "}\n",
+ "pdes1d['v0'].assemble()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6dafd2a3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "A function that computes `v` for an integration stage `rk` is"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d52d2548",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:09.288176Z",
+ "iopub.status.busy": "2024-05-24T12:37:09.288047Z",
+ "iopub.status.idle": "2024-05-24T12:37:09.291139Z",
+ "shell.execute_reply": "2024-05-24T12:37:09.290863Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "def compute_v(rk):\n",
+ " v00[:] = u_[1, :, 0].real\n",
+ " h1[:] = H_[1, :, 0].real\n",
+ " u_[1] = 1j*dudx()/K[1]\n",
+ " pdes1d['v0'].compute_rhs(rk)\n",
+ " u_[1, :, 0] = pdes1d['v0'].solve_step(rk)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c2709468",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Temperature\n",
+ "\n",
+ "The temperature equation ([2](#eq:T)) is implemented using a Helmholtz solver.\n",
+ "The main difficulty with the temperature is the non-homogeneous boundary\n",
+ "condition that requires special attention. A non-zero Dirichlet boundary\n",
+ "condition is implemented by adding two basis functions to the\n",
+ "basis of the function space"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "54e16ff6",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\phi^D_{N-2} = 0.5(1+x), \n",
+ "\\label{_auto11} \\tag{32}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cf5b8b0b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " \\phi^D_{N-1} = 0.5(1-x),\n",
+ "\\label{_auto12} \\tag{33}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f036c207",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "with the approximation now becoming"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e4e54760",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " T_N(x, y, t) = \\sum_{k=0}^{N-1} \\sum_{l \\in \\boldsymbol{l}} \\hat{T}_{kl} \\phi^D_k(x)\\exp(\\imath l y), \n",
+ "\\label{_auto13} \\tag{34}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7711f3a7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " = \\sum_{k=0}^{N-3} \\sum_{l \\in \\boldsymbol{l}} \\hat{T}_{kl} \\phi^D_k(x)\\exp(\\imath l y) + \\sum_{k=N-2}^{N-1} \\sum_{l \\in \\boldsymbol{l}} \\hat{T}_{kl} \\phi^D_k(x)\\exp(\\imath l y).\n",
+ "\\label{_auto14} \\tag{35}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9c0495e0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The boundary condition requires"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "de20a9ca",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "T_N(1, y, t) = \\sum_{k=N-2}^{N-1} \\sum_{l \\in \\boldsymbol{l}} \\hat{T}_{kl} \\phi^D_k(1)\\exp(\\imath l y), \n",
+ "\\label{_auto15} \\tag{36}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7a45e061",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " = \\sum_{l \\in \\boldsymbol{l}} \\hat{T}_{N-2, l} \\exp(\\imath l y), \\label{eq:TN0} \\tag{37}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d478e8e2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "46da00c4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "T_N(-1, y, t) = \\sum_{k=N-2}^{N-1} \\sum_{l \\in \\boldsymbol{l}} \\hat{T}_{kl} \\phi^D_k(-1)\\exp(\\imath l y), \n",
+ "\\label{_auto16} \\tag{38}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "08f254e3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " = \\sum_{l \\in \\boldsymbol{l}} \\hat{T}_{N-1, l} \\exp(\\imath l y). \\label{eq:TN1} \\tag{39}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6ba8d915",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We find $\\hat{T}_{N-2, l}$ and $\\hat{T}_{N-1, l}$ using orthogonality. Multiply ([37](#eq:TN0)) and\n",
+ "([39](#eq:TN1)) by $\\exp(-\\imath m y)$ and integrate over the domain $[0, 2\\pi]$. We get"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "37475efa",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\hat{T}_{N-2, l} = \\int_{0}^{2\\pi} T_N(1, y, t) \\exp(-\\imath l y) dy, \n",
+ "\\label{_auto17} \\tag{40}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "11a34479",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " \\hat{T}_{N-1, l} = \\int_{0}^{2\\pi} T_N(-1, y, t) \\exp(-\\imath l y) dy.\n",
+ "\\label{_auto18} \\tag{41}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "802c82db",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Using this approach it is easy to see that any inhomogeneous function $T_N(\\pm 1, y, t)$\n",
+ "of $y$ and $t$ can be used for the boundary condition, and not just a constant.\n",
+ "However, we will not get into this here.\n",
+ "And luckily for us all this complexity with boundary conditions will be\n",
+ "taken care of under the hood by shenfun.\n",
+ "\n",
+ "A time stepper for the temperature equation is implemented as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "174a1ac5",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:09.295698Z",
+ "iopub.status.busy": "2024-05-24T12:37:09.295557Z",
+ "iopub.status.idle": "2024-05-24T12:37:09.351589Z",
+ "shell.execute_reply": "2024-05-24T12:37:09.351196Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "uT_ = Function(BD)\n",
+ "q = TestFunction(W_TF)\n",
+ "pdes['T'] = PDE(q,\n",
+ " T_,\n",
+ " lambda f: kappa*div(grad(f)),\n",
+ " -div(uT_),\n",
+ " dt=dt,\n",
+ " solver=chebyshev.la.Helmholtz if family == 'Chebyshev' else la.SolverGeneric1ND,\n",
+ " latex=r\"\\frac{\\partial T}{\\partial t} = \\kappa \\nabla^2 T - \\nabla \\cdot \\vec{u}T\")\n",
+ "pdes['T'].assemble()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d1745f18",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The `uT_` term is computed with dealiasing as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "62dc1037",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:09.358586Z",
+ "iopub.status.busy": "2024-05-24T12:37:09.357534Z",
+ "iopub.status.idle": "2024-05-24T12:37:09.362536Z",
+ "shell.execute_reply": "2024-05-24T12:37:09.361341Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "def compute_uT(u_, T_, uT_):\n",
+ " up = u_.backward(padding_factor=1.5)\n",
+ " Tp = T_.backward(padding_factor=1.5)\n",
+ " uT_ = BDp.forward(up*Tp, uT_)\n",
+ " return uT_"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7db1c217",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Finally all that is left is to initialize the solution and\n",
+ "integrate it forward in time."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "1a2cfb7b",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:09.366812Z",
+ "iopub.status.busy": "2024-05-24T12:37:09.366589Z",
+ "iopub.status.idle": "2024-05-24T12:37:22.082684Z",
+ "shell.execute_reply": "2024-05-24T12:37:22.081096Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "%matplotlib inline\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "# initialization\n",
+ "T_b = Array(W_TF)\n",
+ "X = W_TF.local_mesh(True)\n",
+ "#T_b[:] = 0.5*(1-X[0]) + 0.001*np.random.randn(*T_b.shape)*(1-X[0])*(1+X[0])\n",
+ "T_b[:] = 0.5*(1-X[0]+0.25*np.sin(np.pi*X[0]))+0.001*np.random.randn(*T_b.shape)*(1-X[0])*(1+X[0])\n",
+ "T_ = T_b.forward(T_)\n",
+ "T_.mask_nyquist(mask)\n",
+ "\n",
+ "t = 0\n",
+ "tstep = 0\n",
+ "end_time = 15\n",
+ "while t < end_time-1e-8:\n",
+ " for rk in range(PDE.steps()):\n",
+ " compute_convection(u_, H_)\n",
+ " compute_uT(u_, T_, uT_)\n",
+ " pdes['u'].compute_rhs(rk)\n",
+ " pdes['T'].compute_rhs(rk)\n",
+ " pdes['u'].solve_step(rk)\n",
+ " compute_v(rk)\n",
+ " pdes['T'].solve_step(rk)\n",
+ " t += dt\n",
+ " tstep += 1\n",
+ "plt.contourf(X[1], X[0], T_.backward(), 100)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "33635218",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "A complete solver implemented in a solver class can be found in\n",
+ "[RayleighBenard2D.py](https://github.com/spectralDNS/shenfun/blob/master/demo/RayleighBenard2D.py).\n",
+ "Note that in the final solver it is also possible to use a $(y, t)$-dependent boundary condition\n",
+ "for the hot wall. And the solver can also be configured to store intermediate results to\n",
+ "an `HDF5` format that later can be visualized in, e.g., Paraview. The movie in the\n",
+ "beginning of this demo has been created in Paraview.\n",
+ "\n",
+ "\n",
+ "\n",
+ "1.
**A. Pandey, J. D. Scheel and J. Schumacher**. Turbulent Superstructures in Rayleigh-B\\'enard Convection, *Nature Communications*, 9(1), pp. 2118, [doi: 10.1038/s41467-018-04478-0](https://dx.doi.org/10.1038/s41467-018-04478-0), 2018."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/demos/SparsityChebyshev/sparsity.ipynb b/docs/demos/SparsityChebyshev/sparsity.ipynb
new file mode 100644
index 00000000..b857d2c7
--- /dev/null
+++ b/docs/demos/SparsityChebyshev/sparsity.ipynb
@@ -0,0 +1,1077 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "2bb2025a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "\n",
+ "# Demo - Sparse Chebyshev-Petrov-Galerkin methods for differentiation\n",
+ "**Mikael Mortensen** (email: `mikaem@math.uio.no`), Department of Mathematics, University of Oslo.\n",
+ "\n",
+ "Date: **October 26, 2021**\n",
+ "\n",
+ "**Summary.** This demo explores how to use sparse Chebyshev-Petrov-Galerkin methods for finding Chebyshev coefficients of\n",
+ "the derivatives of smooth functions. We will compare the methods to the more commonly adopted\n",
+ "recursion methods that are found in most spectral textbooks."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4838d7e1",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Introduction\n",
+ "\n",
+ "The Chebyshev polynomials of the first kind can be defined as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1af52674",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\label{eq:chebTU} \\tag{1}\n",
+ " T_k(x) = \\cos(k\\theta),\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "747a43e9",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\theta = \\cos^{-1} x$, $k$ is a positive integer and $x \\in [-1, 1]$.\n",
+ "The Chebyshev polynomials span the discrete space $S_N = \\text{span}\\{T_k\\}_{k=0}^{N-1}$,\n",
+ "and a function $u(x)$ can be approximated in this space as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "65fce623",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u_N(x) = \\sum_{k=0}^{N-1} \\hat{u}_k T_k(x).\n",
+ "\\label{eq:uT} \\tag{2}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1f1b1a55",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Consider the expansion of the function $u(x)=\\sin(\\pi x)$, created in `shenfun` as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e8d08068",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:38:02.063676Z",
+ "iopub.status.busy": "2024-05-24T12:38:02.063468Z",
+ "iopub.status.idle": "2024-05-24T12:38:02.638338Z",
+ "shell.execute_reply": "2024-05-24T12:38:02.636455Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "from shenfun import *\n",
+ "import sympy as sp\n",
+ "x = sp.Symbol('x')\n",
+ "ue = sp.sin(sp.pi*x)\n",
+ "N = 16\n",
+ "SN = FunctionSpace(N, 'C')\n",
+ "uN = Function(SN, buffer=ue)\n",
+ "uN"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bb86e5fd",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The Python Function `uN` represents the expansion ([2](#eq:uT)), and the printed\n",
+ "values represent $\\boldsymbol{\\hat{u}} = \\{\\hat{u}_k\\}_{k=0}^{N-1}$. The expansion is fairly well resolved since\n",
+ "the highest values of $\\{\\hat{u}_k\\}_{k=0}^{N-1}$ approach 0.\n",
+ "Note that the coefficients obtained are based on interpolation at\n",
+ "quadrature points and they do not agree completely with the coefficients truncated from an\n",
+ "infinite series $u(x) = \\sum_{k=0}^{\\infty} \\hat{u}_k T_k$. The obtained series is\n",
+ "often denoted as $u_N(x) = I_N u(x)$, where $I_N$ is an interpolation operator.\n",
+ "Under the hood the coefficients are found by projection using quadrature for the integrals:\n",
+ "find $u_N \\in S_N$ such that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "563fe691",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "(u_N-u, v)_{\\omega^{-1/2}} = 0, \\quad \\forall v \\in S_N,\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "846b9e53",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\omega = (1-x^2)$ and the scalar product notation\n",
+ "$(a, b)_{\\omega^{-1/2}} = \\sum_{j=0}^{N-1} a(x_j)b(x_j)\\omega_j \\approx \\int_{-1}^{1} a(x)b(x) \\omega(x)^{-1/2} dx$,\n",
+ "where $\\{\\omega_j\\}_{j=0}^{N-1}$ are the quadrature weights. The quadrature approach ensures\n",
+ "that $u(x_j) = u_N(x_j)$ for all quadrature points $\\{x_j\\}_{j=0}^{N-1}$.\n",
+ "In `shenfun` we compute the following under the hood: insert for $u_N = \\sum_{j=0}^{N-1} \\hat{u}_j T_j$,\n",
+ "$u=\\sin(\\pi x)$ and $v = T_k$ to get"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "833df5cb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\sum_{j=0}^{N-1}(T_j, T_k)_{\\omega^{-1/2}} \\hat{u}_j = (\\sin(\\pi x), T_k)_{\\omega^{-1/2}},\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "54d5f8e3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "This has now become a linear algebra problem, and we recognise the matrix $d^{(0)}_{kj} = (T_j, T_k)_{\\omega^{-1/2}}=c_k \\pi /2 \\delta_{kj}$,\n",
+ "where $\\delta_{kj}$ is the Kronecker delta function, and $c_0=2$ and $c_k=1$ for $k>0$.\n",
+ "The problem is solved trivially since $d^{(0)}_{kj}$ is diagonal,\n",
+ "and thus"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1ad4aac0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\hat{u}_k = \\frac{2}{c_k \\pi} (\\sin(\\pi x), T_k)_{\\omega^{-1/2}}, \\quad \\forall \\, k\\in I^N,\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ced04b4b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $I^N = \\{0, 1, \\ldots, N-1\\}$.\n",
+ "We can compare this to the truncated coefficients, where the integral $(\\sin(\\pi x), T_k)_{\\omega^{-1/2}}$\n",
+ "is computed with high precision. To this end we could use adaptive quadrature, or symbolic integration\n",
+ "with sympy, but it is sufficient to use a large enough number of polynomials to fully resolve the\n",
+ "function. Below we find this number to be 22 and we see that the absolute error in\n",
+ "the highest wavenumber $\\hat{u}_{15} \\approx 10^{-11}$."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "cd4b2ee5",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:38:02.646303Z",
+ "iopub.status.busy": "2024-05-24T12:38:02.645378Z",
+ "iopub.status.idle": "2024-05-24T12:38:02.663126Z",
+ "shell.execute_reply": "2024-05-24T12:38:02.661550Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "SM = FunctionSpace(0, 'C')\n",
+ "uM = Function(SM, buffer=ue, abstol=1e-16, reltol=1e-16)\n",
+ "print(uM[:N] - uN[:N])\n",
+ "print(len(uM))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bef631d0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Differentiation\n",
+ "\n",
+ "Let us now consider the $n$'th derivative of $u(x)$ instead, denoted here as $u^{(n)}$.\n",
+ "We want to find $u^{(n)}$ in the space $S_N$, which means that we want to obtain\n",
+ "the following expansion"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2c78531f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "u_N^{(n)} = \\sum_{k=0}^{N-1} \\hat{u}^{(n)}_k T_k.\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6bacc81d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "First note that this expansion is not the same as the derivative of\n",
+ "the previously found $u_N$, which is"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "aa75f2fd",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "(u_N)^{(n)} = \\sum_{k=0}^{N-1} \\hat{u}_k T^{(n)}_k,\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "311527fa",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $T^{(n)}_k$ is the $n$'th derivative of $T_k$, a polynomial of order $k-n$.\n",
+ "We again use projection to find $u_N^{(n)} \\in S_N$ such that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5bf2f5d1",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "(u_N^{(n)}-u^{(n)}, v)_{\\omega^{-1/2}} = 0, \\quad \\forall v \\in S_N.\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f7e7d354",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Inserting for $u_N^{(n)}$ and $u^{(n)} = (u_N)^{(n)}$ we get"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "45bc180f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\sum_{j=0}^{N-1}(T_j, T_k)_{\\omega^{-1/2}} \\hat{u}_j^{(n)} = (T_j^{(n)}, T_k)_{\\omega^{-1/2}} \\hat{u}_j, \n",
+ "\\label{_auto1} \\tag{3}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bd058277",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " \\sum_{j=0}^{N-1} d^{(0)}_{kj} \\hat{u}_j^{(n)} = \\sum_{j=0}^{N-1} d^{(n)}_{kj} \\hat{u}_j,\n",
+ "\\label{_auto2} \\tag{4}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1dc093f5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $d^{(n)}_{kj} = (T_j^{(n)}, T_k)_{\\omega^{-1/2}}$.\n",
+ "We compute $\\hat{u}_k^{(n)}$ by inverting the diagonal $d^{(0)}_{kj}$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f6025179",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\hat{u}_k^{(n)} = \\frac{2}{c_k \\pi} \\sum_{j=0}^{N-1} d^{(n)}_{kj} \\hat{u}_j, \\quad \\forall \\, k \\in I^{N}.\n",
+ "\\label{eq:fhat} \\tag{5}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7eea7af8",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The matrix $d^{(n)}_{kj}$ is upper triangular, and the last $n$ rows are zero. Since $d^{(n)}_{kj}$ is\n",
+ "dense the matrix vector product $\\sum_{j=0}^{N-1} d^{(n)}_{kj} \\hat{u}_j$ is costly\n",
+ "and also susceptible to roundoff errors if the structure of the matrix is\n",
+ "not taken advantage of. But computing it in shenfun\n",
+ "is straightforward, for $n=1$ and $2$:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4f6c7409",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:38:02.672049Z",
+ "iopub.status.busy": "2024-05-24T12:38:02.671899Z",
+ "iopub.status.idle": "2024-05-24T12:38:02.677371Z",
+ "shell.execute_reply": "2024-05-24T12:38:02.676910Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "uN1 = project(Dx(uN, 0, 1), SN)\n",
+ "uN2 = project(Dx(uN, 0, 2), SN)\n",
+ "uN1"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ed23d795",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where `uN1` $=u_N^{(1)}$ and `uN2` $=u_N^{(2)}$.\n",
+ "Alternatively, doing all the work that goes on under the hood"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "85617695",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:38:02.680031Z",
+ "iopub.status.busy": "2024-05-24T12:38:02.679906Z",
+ "iopub.status.idle": "2024-05-24T12:38:02.687433Z",
+ "shell.execute_reply": "2024-05-24T12:38:02.685429Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "u = TrialFunction(SN)\n",
+ "v = TestFunction(SN)\n",
+ "D0 = inner(u, v)\n",
+ "D1 = inner(Dx(u, 0, 1), v)\n",
+ "D2 = inner(Dx(u, 0, 2), v)\n",
+ "w0 = Function(SN) # work array\n",
+ "uN1 = Function(SN)\n",
+ "uN2 = Function(SN)\n",
+ "uN1 = D0.solve(D1.matvec(uN, w0), uN1)\n",
+ "uN2 = D0.solve(D2.matvec(uN, w0), uN2)\n",
+ "uN1"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8203a97b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We can look at the sparsity patterns of $(d^{(1)}_{kj})$ and $(d^{(2)}_{kj})$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0288b4fe",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:38:02.691434Z",
+ "iopub.status.busy": "2024-05-24T12:38:02.691315Z",
+ "iopub.status.idle": "2024-05-24T12:38:03.088709Z",
+ "shell.execute_reply": "2024-05-24T12:38:03.086306Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "%matplotlib inline\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "fig, (ax1, ax2) = plt.subplots(1, 2)\n",
+ "ax1.spy(D1.diags(), markersize=2, color='r')\n",
+ "ax2.spy(D2.diags(), markersize=2, color='b')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "798dcfdd",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "just to see that they are upper triangular. We now ask is there a better and faster\n",
+ "way to get `uN1` and `uN2`? A better approach would involve only sparse\n",
+ "matrices, like the diagonal $(d^{(0)}_{kj})$. But how do we get there?\n",
+ "Most textbooks on spectral methods use fast recursive methods to\n",
+ "find the coefficients $\\{\\hat{u}_k^{(n)}\\}$. Here we will show a fast Galerkin approach.\n",
+ "\n",
+ "It turns out that a simple change of test space/function will be sufficient.\n",
+ "Let us first replace the test space $S_N$ with\n",
+ "the Dirichlet space $D_N=\\{v \\in S_N | v(\\pm 1) = 0\\}$ using basis\n",
+ "functions $v=T_k-T_{k+2}$ and see\n",
+ "what happens. Because of the two boundary conditions,\n",
+ "the number of degrees of freedom is reduced by two, and we need to use a\n",
+ "space with $N+2$ quadrature points in order to get a square matrix system.\n",
+ "The method now becomes classified as Chebyshev-Petrov-Galerkin, as we\n",
+ "wish to find $u_N^{(1)} \\in S_N$ such that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a0edfd85",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "(u_N^{(1)}-u^{(1)}, v)_{\\omega^{-1/2}} = 0, \\quad \\forall v \\in D_{N+2}.\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6fb9034a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The implementation is straightforward"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "78eb36cf",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:38:03.097765Z",
+ "iopub.status.busy": "2024-05-24T12:38:03.097566Z",
+ "iopub.status.idle": "2024-05-24T12:38:03.115215Z",
+ "shell.execute_reply": "2024-05-24T12:38:03.114393Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "DN = FunctionSpace(N+2, 'C', bc=(0, 0))\n",
+ "v = TestFunction(DN)\n",
+ "D0 = inner(u, v)\n",
+ "D1 = inner(Dx(u, 0, 1), v)\n",
+ "uN11 = Function(SN)\n",
+ "uN11 = D0.solve(D1.matvec(uN, w0), uN11)\n",
+ "print(uN11-uN1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6fc6f39f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and since `uN11 = uN1` we see that we have achived the same result as in\n",
+ "the regular projection. However, the matrices in use now look like"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d5e3bb84",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:38:03.119267Z",
+ "iopub.status.busy": "2024-05-24T12:38:03.118778Z",
+ "iopub.status.idle": "2024-05-24T12:38:03.302255Z",
+ "shell.execute_reply": "2024-05-24T12:38:03.301865Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "fig, (ax1, ax2) = plt.subplots(1, 2)\n",
+ "ax1.spy(D0.diags(), markersize=2, color='r')\n",
+ "ax2.spy(D1.diags(), markersize=2, color='b')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f9c99379",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "So $(d^{(0)}_{kj})$ now contains two nonzero diagonals, whereas $(d^{(1)}_{kj})$ is\n",
+ "a matrix with one single diagonal. There is no longer a `full` differentiation\n",
+ "matrix, and we can easily perform this projection for millions of degrees of freedom.\n",
+ "What about $(d^{(2)}_{kj})$? We can now use biharmonic test functions that\n",
+ "satisfy four boundary conditions in the space $B_N = \\{v \\in S_N | v(\\pm 1) = v'(\\pm 1) =0\\}$,\n",
+ "and continue in a similar fashion:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6a5b8db9",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:38:03.307791Z",
+ "iopub.status.busy": "2024-05-24T12:38:03.307221Z",
+ "iopub.status.idle": "2024-05-24T12:38:03.334290Z",
+ "shell.execute_reply": "2024-05-24T12:38:03.331755Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "BN = FunctionSpace(N+4, 'C', bc=(0, 0, 0, 0))\n",
+ "v = TestFunction(BN)\n",
+ "D0 = inner(u, v)\n",
+ "D2 = inner(Dx(u, 0, 2), v)\n",
+ "uN22 = Function(SN)\n",
+ "uN22 = D0.solve(D2.matvec(uN, w0), uN22)\n",
+ "print(uN22-uN2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "83944e9d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We get that `uN22 = uN2`, so the Chebyshev-Petrov-Galerkin projection works. The matrices involved are now"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "138b71ea",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:38:03.339328Z",
+ "iopub.status.busy": "2024-05-24T12:38:03.339153Z",
+ "iopub.status.idle": "2024-05-24T12:38:03.573813Z",
+ "shell.execute_reply": "2024-05-24T12:38:03.572191Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "fig, (ax1, ax2) = plt.subplots(1, 2)\n",
+ "ax1.spy(D0.diags(), markersize=2, color='r')\n",
+ "ax2.spy(D2.diags(), markersize=2, color='b')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "99a670bc",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "So there are now three nonzero diagonals in $(d^{(0)}_{kj})$, whereas the differentiation matrix\n",
+ "$(d^{(2)}_{kj})$ contains only one nonzero diagonal.\n",
+ "\n",
+ "Why does this work so well? The Chebyshev polynomials and their derivatives satisfy the following orthogonality relation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e9c66875",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\label{eq:orthon} \\tag{6}\n",
+ " \\int_{-1}^{1} T^{(n)}_j T^{(n)}_k \\omega^{n-1/2} dx = \\alpha^{n}_k \\delta_{kj}, \\quad \\text{for}\\, n \\ge 0,\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ab4aeed8",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2e7f11e2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\alpha^n_k = \\frac{c_{k+n}\\pi k (k+n-1)!}{2(k-n)!}.\n",
+ "\\label{_auto3} \\tag{7}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ec8e259a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "So when we choose a test function $\\omega^n T^{(n)}_k$ and a trial function $T_j$,\n",
+ "we get the diagonal differentiation matrix"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0a9845f8",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " d^{(n)}_{kj} = \\int_{-1}^{1} T^{(n)}_j (\\omega^n T^{(n)}_k) \\omega^{-1/2} dx = \\alpha^{n}_k \\delta_{kj}, \\quad \\text{for}\\, n \\ge 0.\n",
+ "\\label{_auto4} \\tag{8}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1faaf249",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The two chosen test functions above are both proportional to $\\omega^n T^{(n)}_k$. More precisely,\n",
+ "$T_k-T_{k+2} = \\frac{2}{k+1} \\omega T^{(1)}_{k+1}$ and the biharmonic test function is\n",
+ "$T_k-\\frac{2(k+2)}{k+3}T_{k+2} + \\frac{k+1}{k+3}T_{k+4} = \\frac{4 \\omega^2T^{(2)}_{k+2}}{(k+2)(k+3)}$.\n",
+ "Using these very specific test functions correponds closely to using the Chebyshev\n",
+ "recursion formulas that are found in most textbooks. Here they are adapted to\n",
+ "a Chebyshev-Petrov-Galerkin method, where we simply choose test and trial functions and everything\n",
+ "else falls into place in a few lines of code."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "505a7c63",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Recursion\n",
+ "\n",
+ "Let us for completion show how to\n",
+ "find $\\hat{u}_N^{(1)}$ with a recursive approach. The Chebyshev polynomials\n",
+ "satisfy"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e01fad08",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "2T_k = \\frac{1}{k+1}T'_{k+1}- \\frac{1}{k-1} T'_{k-1}, \\quad k \\ge 1.\n",
+ "\\label{eq:Trec1} \\tag{9}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a5e54439",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "By using this and setting $u' = \\sum_{k=0}^{\\infty} \\hat{u}^{(1)}_k T_k = \\sum_{k=0}^{\\infty} \\hat{u}_k T'_k$\n",
+ "we get"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c6be810e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "2k\\hat{u}_k = c_{k-1}\\hat{u}^{(1)}_{k-1} - \\hat{u}^{(1)}_{k+1}, \\quad k \\ge 1.\n",
+ "\\label{eq:Trec2} \\tag{10}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "235acf35",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Using this recursion on a discrete series, together with $\\hat{u}^{(1)}_{N} = \\hat{u}^{(1)}_{N-1} = 0$, we get\n",
+ "(see [[canuto]](#canuto) Eq. (2.4.24))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a3b2391d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "c_k \\hat{u}^{(1)}_k = \\hat{u}^{(1)}_{k+2} + 2(k+1)\\hat{u}_{k+1}, \\quad 0 \\le k \\le N-2,\n",
+ "\\label{eq:Trec3} \\tag{11}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "acbd18e5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "which is easily implemented in a (slow) for-loop"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b62bbb21",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:38:03.577529Z",
+ "iopub.status.busy": "2024-05-24T12:38:03.577429Z",
+ "iopub.status.idle": "2024-05-24T12:38:03.581284Z",
+ "shell.execute_reply": "2024-05-24T12:38:03.580257Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "f1 = np.zeros(N+1)\n",
+ "ck = np.ones(N); ck[0] = 2\n",
+ "for k in range(N-2, -1, -1):\n",
+ " f1[k] = (f1[k+2]+2*(k+1)*uN[k+1])/ck[k]\n",
+ "print(f1[:-1]-uN1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4dcda2f1",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "which evidently is exactly the same result. It turns out that this is not strange. If we multiply\n",
+ "([11](#eq:Trec3)) by $\\pi/2$, rearrange a little bit and move to a matrix form we get"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "eaeaa2a8",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "c_k \\pi/2 \\hat{u}^{(1)}_k - \\pi/2 \\hat{u}^{(1)}_{k+2} = (k+1)\\pi \\hat{u}_{k+1} \n",
+ "\\label{_auto5} \\tag{12}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1eddc342",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\underbrace{(c_k \\pi/2 \\delta_{kj} - \\pi/2 \\delta_{k, j-2})}_{(D^0)_{kj}} \\hat{u}^{(1)}_j = \\underbrace{(k+1)\\pi \\delta_{k,j-1}}_{(D^1)_{kj}} \\hat{u}_{j} \n",
+ "\\label{_auto6} \\tag{13}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f3e68c7c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "D^0 \\boldsymbol{\\hat{u}} = D^1 \\boldsymbol{\\hat{u}} \n",
+ "\\label{_auto7} \\tag{14}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e4d34134",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\boldsymbol{\\hat{u}^{(1)}} = (D^0)^{-1} D^1 \\boldsymbol{\\hat{u}}\n",
+ "\\label{_auto8} \\tag{15}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b2e1a8af",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "which is exactly how $\\boldsymbol{\\hat{u}^{(1)}}$ was computed above with the Chebyshev-Petrov-Galerkin approach\n",
+ "(compare with the code line `uN11 = D0.solve(D1.matvec(uN, w0), uN11)`). Not convinced? Check that the matrices\n",
+ "`D0` and `D1` are truly as stated above. The matrices below are printed as dictionaries with diagonal\n",
+ "number as key (main is 0, first upper is 1 etc) and diagonal values as values:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f76f13c5",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:38:03.587180Z",
+ "iopub.status.busy": "2024-05-24T12:38:03.587025Z",
+ "iopub.status.idle": "2024-05-24T12:38:03.590613Z",
+ "shell.execute_reply": "2024-05-24T12:38:03.590196Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "import pprint\n",
+ "DN = FunctionSpace(N+2, 'C', bc=(0, 0))\n",
+ "v = TestFunction(DN)\n",
+ "D0 = inner(u, v)\n",
+ "D1 = inner(Dx(u, 0, 1), v)\n",
+ "pprint.pprint(dict(D0))\n",
+ "pprint.pprint(dict(D1))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a43c5ad2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "In conclusion, we have shown that we can use an efficient Chebyshev-Petrov-Galerkin approach to obtain\n",
+ "the discrete Chebyshev coefficients for the derivatives\n",
+ "of a function. By inspection, it turns out that this approach is identical to the common methods based on\n",
+ "well-known Chebyshev recursion formulas.\n",
+ "\n",
+ "\n",
+ "\n",
+ "1.
**C. Canuto, M. Hussaini, A. Quarteroni and J. T. A.**. *Spectral Methods in Fluid Dynamics*, *Scientific Computation*, Springer, 2012."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/demos/SphereHelmholtz/sphericalhelmholtz.ipynb b/docs/demos/SphereHelmholtz/sphericalhelmholtz.ipynb
new file mode 100644
index 00000000..df7c22fb
--- /dev/null
+++ b/docs/demos/SphereHelmholtz/sphericalhelmholtz.ipynb
@@ -0,0 +1,591 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "b2ae13fb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "\n",
+ "# Demo - Helmholtz equation on the unit sphere\n",
+ "**Mikael Mortensen** (email: `mikaem@math.uio.no`), Department of Mathematics, University of Oslo.\n",
+ "\n",
+ "Date: **April 20, 2020**\n",
+ "\n",
+ "**Summary.** This is a demonstration of how the Python module [shenfun](https://github.com/spectralDNS/shenfun) can be used to solve the\n",
+ "Helmholtz equation on a unit sphere, using spherical\n",
+ "coordinates. This demo is implemented in\n",
+ "a single Python file [sphere_helmholtz.py](https://github.com/spectralDNS/shenfun/blob/master/demo/sphere_helmholtz.py).\n",
+ "If requested the solver will run in parallel using MPI.\n",
+ "\n",
+ "\n",
+ "\n",
+ "
\n",
+ "\n",
+ "
Figure 1: Helmholtz on the unit sphere.
\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "621e1394",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Helmholtz equation\n",
+ "
\n",
+ "\n",
+ "The Helmholtz equation is given as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6f206c3b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "-\\nabla^2 u(\\boldsymbol{x}) + \\alpha u(\\boldsymbol{x}) = f(\\boldsymbol{x}) \\quad \\text{for }\\, \\boldsymbol{x} \\in \\Omega = \\{(x, y, z): x^2+y^2+z^2 = 1\\}, \\label{eq:helmholtz} \\tag{1}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "627e0395",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $u(\\boldsymbol{x})$ is the solution, $f(\\boldsymbol{x})$ is a function and $\\alpha$ a constant.\n",
+ "We use spherical coordinates $(\\theta, \\phi)$, defined as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f30f6090",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " x = r \\sin \\theta \\cos \\phi , \n",
+ "\\label{_auto1} \\tag{2}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "eccfd3f2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " y = r \\sin \\theta \\sin \\phi, \n",
+ "\\label{_auto2} \\tag{3}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5922a3fb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " z = r \\cos \\theta\n",
+ "\\label{_auto3} \\tag{4}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c9ee85b3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "which (with $r=1$) leads to a 2D Cartesian product mesh $(\\theta, \\phi) \\in (0, \\pi) \\times [0, 2\\pi)$\n",
+ "suitable for numerical implementations. There are no boundary\n",
+ "conditions on the problem under consideration.\n",
+ "However, with the chosen Cartesian mesh, periodic\n",
+ "boundary conditions are required for the $\\phi$-direction. As such,\n",
+ "the $\\phi$-direction will use a Fourier basis $\\exp(\\imath k \\phi)$.\n",
+ "\n",
+ "A regular Chebyshev or Legendre basis\n",
+ "$\\psi_j(\\theta) = \\gamma_j(2\\theta/\\pi-1)$ will be\n",
+ "used for the $\\theta$-direction, where $\\gamma_j$ could be either\n",
+ "the Chebyshev polynomial of first kind $T_j$ or the Legendre\n",
+ "polynomial $L_j$. Note the mapping from real coordinates $\\theta$\n",
+ "to computational coordinates in domain $[-1, 1]$.\n",
+ "\n",
+ "The spherical basis functions are as such"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5fffe062",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "v_{jk}(\\theta, \\phi) = \\psi_j(\\theta) \\exp(\\imath k \\phi),\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c73ec530",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and we look for solutions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "175dfb12",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "u(\\theta, \\phi) = \\sum_{j} \\sum_{k} \\hat{u}_{jk} v_{jk}(\\theta, \\phi).\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "82a9884f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "A discrete Fourier approximation space with $N$ basis functions is then"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c3cc267f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "V_F^N = \\text{span} \\{\\exp(\\imath k \\theta)\\,|\\,\\text{ for } k \\in K\\},\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "971d6346",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where the index set $K = \\{-N/2, -N/2+1, \\ldots, N/2-1\\}$. For this demo we assume\n",
+ "that the solution is complex, and as such there is no simplification\n",
+ "possible for Hermitian symmetry.\n",
+ "\n",
+ "The following approximation space is used for the $\\theta$-direction"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "71b72efd",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "V^N = \\text{span} \\{\\psi_j\\}_{j=0}^{N-1},\n",
+ "\\label{_auto4} \\tag{5}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d8ee4a77",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and the variational formulation of the problem reads:\n",
+ "find $u \\in V^N \\otimes V_F^N$ such that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4e96bb4d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\int_{\\Omega} (-\\nabla^2 u + \\alpha u) v w d\\sigma = \\int_{\\Omega} f v w d\\sigma, \\quad \\forall \\, v \\in V^N \\otimes V_F^N.\n",
+ "\\label{eq:u0} \\tag{6}\n",
+ " \\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9f805cf9",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that integration over the domain is done using\n",
+ "spherical coordinates with an integral measure of $d\\sigma=\\sin \\theta d\\theta d\\phi$."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "eb297602",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Implementation\n",
+ "
\n",
+ "\n",
+ "A complete implementation is found in the file [sphere_helmholtz.py](https://github.com/spectralDNS/shenfun/blob/master/demo/sphere_helmholtz.py).\n",
+ "Here we give a brief explanation for the implementation. Start by\n",
+ "importing all functionality from [shenfun](https://github.com/spectralDNS/shenfun)\n",
+ "and [sympy](https://sympy.org), where Sympy is required for handeling the\n",
+ "spherical coordinates."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4580c8b3",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:44.032453Z",
+ "iopub.status.busy": "2024-05-24T12:36:44.032257Z",
+ "iopub.status.idle": "2024-05-24T12:36:44.630842Z",
+ "shell.execute_reply": "2024-05-24T12:36:44.629282Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "from shenfun import *\n",
+ "import sympy as sp\n",
+ "\n",
+ "# Define spherical coordinates with unit radius\n",
+ "r = 1\n",
+ "theta, phi = sp.symbols('x,y', real=True, positive=True)\n",
+ "psi = (theta, phi)\n",
+ "rv = (r*sp.sin(theta)*sp.cos(phi), r*sp.sin(theta)*sp.sin(phi), r*sp.cos(theta))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fced4ffa",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the position vector `rv` has three components (for $(x, y, z)$)\n",
+ "even though the computational domain is only 2D.\n",
+ "Also note that Sympy symbols are both positive and real, and $\\theta$ is\n",
+ "chosen to be along the first axis and $\\phi$ second. This has to agree with\n",
+ "the next step, which is the creation of tensorproductspaces\n",
+ "$V^N \\otimes V_F^N$."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7cbc4b2a",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:44.636422Z",
+ "iopub.status.busy": "2024-05-24T12:36:44.636108Z",
+ "iopub.status.idle": "2024-05-24T12:36:45.005876Z",
+ "shell.execute_reply": "2024-05-24T12:36:45.003827Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "N, M = 40, 30\n",
+ "L0 = FunctionSpace(N, 'C', domain=(0, np.pi))\n",
+ "F1 = FunctionSpace(M, 'F', dtype='D')\n",
+ "T = TensorProductSpace(comm, (L0, F1), coordinates=(psi, rv, sp.Q.positive(sp.sin(theta))))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2ed0d981",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Spherical coordinates are ensured by feeding `coordinates=(psi, rv, sp.Q.positive(sp.sin(theta)))`\n",
+ "to [TensorProductSpace](https://shenfun.readthedocs.io/en/latest/shenfun.html#shenfun.tensorproductspace.TensorProductSpace), where the restriction `sp.Q.positive(sp.sin(theta))` is there\n",
+ "to help sympy. Operators like [div()](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.operators.div),\n",
+ "[grad()](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.operators.grad) and [curl()](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.operators.curl) will now work on\n",
+ "items of [Function](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.Function), [TestFunction](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.TestFunction) and\n",
+ "[TrialFunction](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.TrialFunction) using a spherical coordinate system.\n",
+ "\n",
+ "To define the equation ([6](#eq:u0)) we first declare\n",
+ "these test- and trialfunctions, and then use code that\n",
+ "is very similar to the mathematics."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "2118b5f7",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:45.015743Z",
+ "iopub.status.busy": "2024-05-24T12:36:45.015606Z",
+ "iopub.status.idle": "2024-05-24T12:36:45.186310Z",
+ "shell.execute_reply": "2024-05-24T12:36:45.184483Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "alpha = 2\n",
+ "v = TestFunction(T)\n",
+ "u = TrialFunction(T)\n",
+ "mats = inner(v, -div(grad(u))+alpha*u)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c747054e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Here `mats` will be a list containing several tensor product\n",
+ "matrices in the form of\n",
+ "[TPMatrix](https://shenfun.readthedocs.io/en/latest/shenfun.html#shenfun.matrixbase.TPMatrix). Since there is only one directions with\n",
+ "non-diagonal matrices ($\\theta$-direction) we\n",
+ "can use the generic [SolverGeneric1ND](https://shenfun.readthedocs.io/en/latest/shenfun.html#shenfun.la.SolverGeneric1ND) solver.\n",
+ "Note that some of the non-diagonal matrices will be dense,\n",
+ "which is a weakness of the current method. Also note\n",
+ "that with Legendre one can use integration by parts\n",
+ "instead"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7760f7dc",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "```Python\n",
+ " mats = inner(grad(v), grad(u))\n",
+ " mats += [inner(v, alpha*u)]\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b002e5c4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "To solve the problem we also need to define the function $f(\\theta, r)$.\n",
+ "To this end we use sympy and the method of\n",
+ "manufactured solution to define a possible solution `ue`,\n",
+ "and then compute `f` exactly using exact differentiation. We use\n",
+ "the [spherical harmonics function](https://docs.sympy.org/latest/modules/functions/special.html#spherical-harmonics)\n",
+ "to define an analytical solution"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "50e8d4d1",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:45.191391Z",
+ "iopub.status.busy": "2024-05-24T12:36:45.191284Z",
+ "iopub.status.idle": "2024-05-24T12:36:45.288513Z",
+ "shell.execute_reply": "2024-05-24T12:36:45.287729Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "alpha = 2\n",
+ "sph = sp.functions.special.spherical_harmonics.Ynm\n",
+ "ue = sph(6, 3, theta, phi)\n",
+ "\n",
+ "# Compute the right hand side on the quadrature mesh\n",
+ "# That is, compute f = -div(grad(ue)) + alpha*ue\n",
+ "f = (-div(grad(u))+alpha*u).tosympy(basis=ue, psi=psi)\n",
+ "fj = Array(T, buffer=f)\n",
+ "\n",
+ "# Take scalar product\n",
+ "f_hat = Function(T)\n",
+ "f_hat = inner(v, fj, output_array=f_hat)\n",
+ "\n",
+ "u_hat = Function(T)\n",
+ "Sol = la.SolverGeneric1ND(mats)\n",
+ "u_hat = Sol(f_hat, u_hat)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8923490d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Having found the solution in spectral space all that is\n",
+ "left is to transform it back to real space."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8d0a59de",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:45.296292Z",
+ "iopub.status.busy": "2024-05-24T12:36:45.295845Z",
+ "iopub.status.idle": "2024-05-24T12:36:45.303401Z",
+ "shell.execute_reply": "2024-05-24T12:36:45.302897Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "uj = u_hat.backward()\n",
+ "uq = Array(T, buffer=ue)\n",
+ "print('Error =', np.linalg.norm(uj-uq))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9db642db",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Postprocessing\n",
+ "We can refine the solution to make it look better,\n",
+ "and plot on the unit sphere using either [mayavi](https://docs.enthought.com/mayavi/mayavi/)\n",
+ "or [plotly](https://plotly.com/) using the shenfun function\n",
+ "[surf3D()](https://shenfun.readthedocs.io/en/latest/shenfun.utilities.html#shenfun.utilities.surf3D)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f91cfdf0",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:45.307987Z",
+ "iopub.status.busy": "2024-05-24T12:36:45.307854Z",
+ "iopub.status.idle": "2024-05-24T12:36:45.786269Z",
+ "shell.execute_reply": "2024-05-24T12:36:45.785235Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "u_hat2 = u_hat.refine([N*2, M*2])\n",
+ "fig = surf3D(u_hat2.backward().real, wrapaxes=[1])\n",
+ "fig.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e31669b2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ ""
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/demos/Stokes/stokes.ipynb b/docs/demos/Stokes/stokes.ipynb
new file mode 100644
index 00000000..e535c801
--- /dev/null
+++ b/docs/demos/Stokes/stokes.ipynb
@@ -0,0 +1,1138 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "4787e292",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "\n",
+ "# Demo - Stokes equations\n",
+ "**Mikael Mortensen** (email: `mikaem@math.uio.no`), Department of Mathematics, University of Oslo.\n",
+ "\n",
+ "Date: **January 23, 2019**\n",
+ "\n",
+ "**Summary.** The Stokes equations describe the flow of highly viscous fluids.\n",
+ "This is a demonstration of how the Python module [shenfun](https://github.com/spectralDNS/shenfun) can be used to solve Stokes\n",
+ "equations using a mixed (coupled) basis in a 3D tensor product domain.\n",
+ "We assume homogeneous Dirichlet boundary conditions in one direction\n",
+ "and periodicity in the remaining two. The solver described runs with MPI\n",
+ "without any further considerations required from the user.\n",
+ "The solver assembles a block matrix with sparsity pattern as shown below\n",
+ "for the Legendre basis.\n",
+ "\n",
+ "\n",
+ "\n",
+ "
\n",
+ "\n",
+ "
Figure 1: Coupled block matrix for Stokes equations.
\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5313c3e5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Stokes' equations\n",
+ "
\n",
+ "\n",
+ "Stokes' equations are given in strong form as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b5b12363",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "\\begin{align*}\n",
+ "\\nabla^2 \\boldsymbol{u} - \\nabla p &= \\boldsymbol{f} \\quad \\text{in } \\Omega, \\\\ \n",
+ "\\nabla \\cdot \\boldsymbol{u} &= h \\quad \\text{in } \\Omega, \\\\ \n",
+ "\\int_{\\Omega} p dx &= 0,\n",
+ "\\end{align*}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "30593271",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\boldsymbol{u}$ and $p$ are, respectively, the\n",
+ "fluid velocity vector and pressure, and the domain\n",
+ "$\\Omega = [0, 2\\pi)^2 \\times (-1, 1)$. The flow is assumed periodic\n",
+ "in $x$ and $y$-directions, whereas there is a no-slip homogeneous Dirichlet\n",
+ "boundary condition on $\\boldsymbol{u}$ on the boundaries of the $z$-direction, i.e.,\n",
+ "$\\boldsymbol{u}(x, y, \\pm 1) = (0, 0, 0)$. (Note that we can configure shenfun with\n",
+ "non-periodicity in any of the three directions. However, since we are to\n",
+ "solve linear algebraic systems in the non-periodic direction, there is a speed\n",
+ "benefit from having the nonperiodic direction last. This has to do with Numpy\n",
+ "using a C-style row-major storage of arrays by default.)\n",
+ "The right hand side vector $\\boldsymbol{f}(\\boldsymbol{x})$ is an external applied body force.\n",
+ "The right hand side $h$ is usually zero in the regular Stokes equations. Here\n",
+ "we include it because it will be nonzero in the verification, which is using the\n",
+ "method of manufactured solutions. Note that the final $\\int_{\\Omega} p dx = 0$\n",
+ "is there because there is no Dirichlet boundary condition on the pressure\n",
+ "and the system of equations would otherwise be ill conditioned.\n",
+ "\n",
+ "To solve Stokes' equations with the Galerkin method we need basis\n",
+ "functions for both velocity and pressure. A\n",
+ "Dirichlet basis will be used for velocity, whereas there is no boundary restriction\n",
+ "on the pressure basis. For both three-dimensional bases we will use one basis\n",
+ "function for the $x$-direction,\n",
+ "$\\mathcal{X}(x)$, one for the $y$-direction, $\\mathcal{Y}(y)$, and one for the\n",
+ "$z$-direction, $\\mathcal{Z}(z)$. And\n",
+ "then we create three-dimensional basis functions like"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9b3a39c1",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "v(x, y, z) = \\mathcal{X}(x) \\mathcal{Y}(y) \\mathcal{Z} (z).\n",
+ "\\label{_auto1} \\tag{1}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c64794c9",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The basis functions $\\mathcal{X}(x)$ and $\\mathcal{Y}(y)$ are chosen as Fourier\n",
+ "exponentials, since these functions are periodic:"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "73fff69f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\mathcal{X}_l(x) = e^{\\imath l x}, \\forall \\, l \\in \\boldsymbol{l}^{N_0}, \n",
+ "\\label{_auto2} \\tag{2}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "296be640",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\mathcal{Y}_m(y) = e^{\\imath m y}, \\forall \\, m \\in \\boldsymbol{m}^{N_1},\n",
+ "\\label{_auto3} \\tag{3}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "239fe816",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\boldsymbol{l}^{N_0} = (-N_0/2, -N_0/2+1, \\ldots, N_0/2-1)$ and\n",
+ "$\\boldsymbol{m}^{N_1} = (-N_1/2, -N_1/2+1, \\ldots, N_1/2-1)$.\n",
+ "The size of the discretized problem in real physical space is\n",
+ "$\\boldsymbol{N} = (N_0, N_1, N_2)$, i.e., there are $N_0 \\cdot N_1 \\cdot N_2$ quadrature points\n",
+ "in total.\n",
+ "\n",
+ "The basis functions for $\\mathcal{Z}(z)$ remain to be decided.\n",
+ "For the velocity we need homogeneous Dirichlet boundary conditions, and for this\n",
+ "we use composite Legendre or Chebyshev polynomials"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e5ca554b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\mathcal{Z}^0_n(z) = \\phi_n(z) - \\phi_{n+2}(z), \\forall \\, n \\in \\boldsymbol{n}^{N_2-2},\n",
+ "\\label{_auto4} \\tag{4}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "92673646",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\phi_n$ is the n'th Legendre or Chebyshev polynomial of the first kind.\n",
+ "$\\boldsymbol{n}^{N_2-2} = (0, 1, \\ldots, N_2-3)$, and the zero on $\\mathcal{Z}^0$\n",
+ "is there to indicate the zero value on the boundary.\n",
+ "\n",
+ "The pressure basis that comes with no restrictions for the boundary is a\n",
+ "little trickier. The reason for this has to do with\n",
+ "inf-sup stability. The obvious choice of basis is the regular Legendre or\n",
+ "Chebyshev basis, which is denoted as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "80f5311e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\mathcal{Z}_n(z) = \\phi_n(z), \\forall \\, n \\in \\boldsymbol{n}^{N_2}. \\label{eq:Zn} \\tag{5}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f9b26f94",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The problem is that for the natural choice of $n \\in (0, 1, \\ldots, N_2-1)$\n",
+ "there is a nullspace and one degree of freedom remains unresolved. It turns out\n",
+ "that the proper choice for the pressure basis is simply ([5](#eq:Zn)) for\n",
+ "$n \\in \\boldsymbol{n}^{N_2-2}$. (Also remember that we have to fix $\\int_{\\Omega} p dx = 0$.)\n",
+ "\n",
+ "With given basis functions we obtain the spaces"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1c89537b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "V^{N_0} = \\text{span}\\{ \\mathcal{X}_l \\}_{l\\in\\boldsymbol{l}^{N_0}}, \n",
+ "\\label{_auto5} \\tag{6}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b9543bc1",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "V^{N_1} = \\text{span}\\{ \\mathcal{Y}_m \\}_{m\\in\\boldsymbol{m}^{N_1}}, \n",
+ "\\label{_auto6} \\tag{7}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "04e128fa",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "V^{N_2} = \\text{span}\\{ \\mathcal{Z}_n \\}_{n\\in\\boldsymbol{n}^{N_2-2}}, \n",
+ "\\label{_auto7} \\tag{8}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fd062fd8",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "V_0^{N_2} = \\text{span}\\{ \\mathcal{Z}^0_n \\}_{n\\in\\boldsymbol{n}^{N_2-2}},\n",
+ "\\label{_auto8} \\tag{9}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b3191743",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and from these we create two different tensor product spaces"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "409bd586",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "W_0^{\\boldsymbol{N}}(\\boldsymbol{x}) = V^{N_0}(x) \\otimes V^{N_1}(y) \\otimes V_0^{N_2}(z), \n",
+ "\\label{_auto9} \\tag{10}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "07f1eaf9",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "W^{\\boldsymbol{N}}(\\boldsymbol{x}) = V^{N_0}(x) \\otimes V^{N_1}(y) \\otimes V^{N_2}(z).\n",
+ "\\label{_auto10} \\tag{11}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "98494595",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The velocity vector is using a mixed basis, such that we will look for\n",
+ "solutions $\\boldsymbol{u} \\in [W_0^{\\boldsymbol{N}}]^3 \\, (=W_0^{\\boldsymbol{N}} \\times W_0^{\\boldsymbol{N}} \\times W_0^{\\boldsymbol{N}})$,\n",
+ "whereas we look for the pressure\n",
+ "$p \\in W^{\\boldsymbol{N}}$. We now formulate a variational problem using the Galerkin method: Find\n",
+ "$\\boldsymbol{u} \\in [W_0^{\\boldsymbol{N}}]^3$ and $p \\in W^{\\boldsymbol{N}}$ such that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4da4b026",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\int_{\\Omega} (\\nabla^2 \\boldsymbol{u} - \\nabla p ) \\cdot \\overline{\\boldsymbol{v}} \\, dx_w = \\int_{\\Omega} \\boldsymbol{f} \\cdot \\overline{\\boldsymbol{v}}\\, dx_w \\quad\\forall \\boldsymbol{v} \\, \\in \\, [W_0^{\\boldsymbol{N}}]^3, \n",
+ "\\label{_auto11} \\tag{12}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6be286f4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "\\int_{\\Omega} \\nabla \\cdot \\boldsymbol{u} \\, \\overline{q} \\, dx_w = \\int_{\\Omega} h \\overline{q} \\, dx_w \\quad\\forall q \\, \\in \\, W^{\\boldsymbol{N}}.\n",
+ "\\label{_auto12} \\tag{13}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fb3800cf",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Here $dx_w=w_xdxw_ydyw_zdz$ represents a weighted measure, with weights $w_x(x), w_y(y), w_z(z)$.\n",
+ "Note that it is only Chebyshev polynomials that\n",
+ "make use of a non-constant weight $w_x=1/\\sqrt{1-x^2}$. The Fourier weights are $w_y=w_z=1/(2\\pi)$\n",
+ "and the Legendre weight is $w_x=1$.\n",
+ "The overline in $\\boldsymbol{\\overline{v}}$ and $\\overline{q}$ represents a complex conjugate, which is needed here because\n",
+ "the Fourier exponentials are complex functions."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a2d2a7f1",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Mixed variational form\n",
+ "\n",
+ "
\n",
+ "\n",
+ "Since we are to solve for $\\boldsymbol{u}$ and $p$ at the same time, we formulate a\n",
+ "mixed (coupled) problem: find $(\\boldsymbol{u}, p) \\in [W_0^{\\boldsymbol{N}}]^3 \\times W^{\\boldsymbol{N}}$\n",
+ "such that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "718bc7d5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "a((\\boldsymbol{u}, p), (\\boldsymbol{v}, q)) = L((\\boldsymbol{v}, q)) \\quad \\forall (\\boldsymbol{v}, q) \\in [W_0^{\\boldsymbol{N}}]^3 \\times W^{\\boldsymbol{N}},\n",
+ "\\label{_auto13} \\tag{14}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1004cd02",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where bilinear ($a$) and linear ($L$) forms are given as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "eb0cfab3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " a((\\boldsymbol{u}, p), (\\boldsymbol{v}, q)) = \\int_{\\Omega} (\\nabla^2 \\boldsymbol{u} - \\nabla p) \\cdot \\overline{\\boldsymbol{v}} \\, dx_w + \\int_{\\Omega} \\nabla \\cdot \\boldsymbol{u} \\, \\overline{q} \\, dx_w, \n",
+ "\\label{_auto14} \\tag{15}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e4cbbbb0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ " L((\\boldsymbol{v}, q)) = \\int_{\\Omega} \\boldsymbol{f} \\cdot \\overline{\\boldsymbol{v}}\\, dx_w + \\int_{\\Omega} h \\overline{q} \\, dx_w.\n",
+ "\\label{_auto15} \\tag{16}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "edb90ba3",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the bilinear form will assemble to block matrices, whereas the right hand side\n",
+ "linear form will assemble to block vectors."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fc08f897",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Implementation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7815b6dd",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Preamble\n",
+ "\n",
+ "We will solve the Stokes equations using the [shenfun](https://github.com/spectralDNS/shenfun) Python module. The first thing needed\n",
+ "is then to import some of this module's functionality\n",
+ "plus some other helper modules, like [Numpy](https://numpy.org) and [Sympy](https://sympy.org):"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b8b3dc6a",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:57.974335Z",
+ "iopub.status.busy": "2024-05-24T12:36:57.974080Z",
+ "iopub.status.idle": "2024-05-24T12:36:58.579798Z",
+ "shell.execute_reply": "2024-05-24T12:36:58.579102Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "import sys\n",
+ "import numpy as np\n",
+ "from sympy import symbols, sin, cos\n",
+ "from shenfun import *"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cfc9c744",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We use `Sympy` for the manufactured solution and `Numpy` for testing."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4cf8185b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Manufactured solution\n",
+ "\n",
+ "
\n",
+ "\n",
+ "The exact solutions $\\boldsymbol{u}_e(\\boldsymbol{x})$ and $p(\\boldsymbol{x})$ are chosen to satisfy boundary\n",
+ "conditions, and the right hand sides $\\boldsymbol{f}(\\boldsymbol{x})$ and $h(\\boldsymbol{x})$ are then\n",
+ "computed exactly using `Sympy`. These exact right hand sides will then be used to\n",
+ "compute a numerical solution that can be verified against the manufactured\n",
+ "solution. The chosen solution with computed right hand sides are:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "1f71c237",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:58.584520Z",
+ "iopub.status.busy": "2024-05-24T12:36:58.584015Z",
+ "iopub.status.idle": "2024-05-24T12:36:58.610477Z",
+ "shell.execute_reply": "2024-05-24T12:36:58.608925Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "x, y, z = symbols('x,y,z')\n",
+ "uex = sin(2*y)*(1-z**2)\n",
+ "uey = sin(2*x)*(1-z**2)\n",
+ "uez = sin(2*z)*(1-z**2)\n",
+ "pe = -0.1*sin(2*x)*cos(4*y)\n",
+ "fx = uex.diff(x, 2) + uex.diff(y, 2) + uex.diff(z, 2) - pe.diff(x, 1)\n",
+ "fy = uey.diff(x, 2) + uey.diff(y, 2) + uey.diff(z, 2) - pe.diff(y, 1)\n",
+ "fz = uez.diff(x, 2) + uez.diff(y, 2) + uez.diff(z, 2) - pe.diff(z, 1)\n",
+ "h = uex.diff(x, 1) + uey.diff(y, 1) + uez.diff(z, 1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "561baab9",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Tensor product spaces\n",
+ "\n",
+ "One-dimensional spaces are created using the [FunctionSpace()](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.FunctionSpace) function. A choice of\n",
+ "polynomials between Legendre or Chebyshev can be made, and the size\n",
+ "of the domain is given"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "720b3abc",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:58.615823Z",
+ "iopub.status.busy": "2024-05-24T12:36:58.615488Z",
+ "iopub.status.idle": "2024-05-24T12:36:58.668880Z",
+ "shell.execute_reply": "2024-05-24T12:36:58.668494Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "N = (20, 20, 20)\n",
+ "family = 'Legendre'\n",
+ "K0 = FunctionSpace(N[0], 'Fourier', dtype='D', domain=(0, 2*np.pi))\n",
+ "K1 = FunctionSpace(N[1], 'Fourier', dtype='d', domain=(0, 2*np.pi))\n",
+ "SD = FunctionSpace(N[2], family, bc=(0, 0))\n",
+ "ST = FunctionSpace(N[2], family)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a97e7e01",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Next the one-dimensional spaces are used to create two tensor product spaces Q = $W^{\\boldsymbol{N}}$\n",
+ "and TD = $W_0^{\\boldsymbol{N}}$, one vector V = $[W_0^{\\boldsymbol{N}}]^3$ and one mixed\n",
+ "space VQ = V $\\times$ Q."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "494c44b1",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:58.673299Z",
+ "iopub.status.busy": "2024-05-24T12:36:58.672989Z",
+ "iopub.status.idle": "2024-05-24T12:36:58.703106Z",
+ "shell.execute_reply": "2024-05-24T12:36:58.700404Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "TD = TensorProductSpace(comm, (K0, K1, SD), axes=(2, 0, 1))\n",
+ "Q = TensorProductSpace(comm, (K0, K1, ST), axes=(2, 0, 1))\n",
+ "V = VectorSpace(TD)\n",
+ "VQ = CompositeSpace([V, Q])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2da1c004",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that we choose to transform axes in the order $1, 0, 2$. This is to ensure\n",
+ "that the fully transformed arrays are aligned in the non-periodic direction 2.\n",
+ "And we need the arrays aligned in this direction, because this is the only\n",
+ "direction where there are tensor product matrices that are non-diagonal. All\n",
+ "Fourier matrices are, naturally, diagonal.\n",
+ "\n",
+ "Test- and trialfunctions are created much like in a regular, non-mixed,\n",
+ "formulation. However, one has to create one test- and trialfunction for\n",
+ "the mixed space, and then split them up afterwards"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8aa77ff2",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:58.708414Z",
+ "iopub.status.busy": "2024-05-24T12:36:58.708262Z",
+ "iopub.status.idle": "2024-05-24T12:36:58.712476Z",
+ "shell.execute_reply": "2024-05-24T12:36:58.711486Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "up = TrialFunction(VQ)\n",
+ "vq = TestFunction(VQ)\n",
+ "u, p = up\n",
+ "v, q = vq"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8ad54e51",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "With the basisfunctions in place we may assemble the different blocks of the\n",
+ "final coefficient matrix. Since Legendre is using a constant weight function,\n",
+ "the equations may also be integrated by parts to obtain a symmetric system:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "2ac850ce",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:58.715685Z",
+ "iopub.status.busy": "2024-05-24T12:36:58.715547Z",
+ "iopub.status.idle": "2024-05-24T12:36:58.752475Z",
+ "shell.execute_reply": "2024-05-24T12:36:58.751430Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "if family.lower() == 'chebyshev':\n",
+ " A = inner(v, div(grad(u)))\n",
+ " G = inner(v, -grad(p))\n",
+ "else:\n",
+ " A = inner(grad(v), -grad(u))\n",
+ " G = inner(div(v), p)\n",
+ "D = inner(q, div(u))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "33919078",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The assembled subsystems `A, G` and `D` are lists containg the different blocks of\n",
+ "the complete, coupled matrix. `A` actually contains 6\n",
+ "tensor product matrices of type [TPMatrix](https://shenfun.readthedocs.io/en/latest/shenfun.html#shenfun.matrixbase.TPMatrix). The first two\n",
+ "matrices are for vector component zero of the test function `v[0]` and\n",
+ "trial function `u[0]`, the\n",
+ "matrices 2 and 3 are for components 1 and the last two are for components\n",
+ "2. The first two matrices are as such for"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4147ee57",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "```Python\n",
+ " A[0:2] = inner(v[0], div(grad(u[0])))\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4da1d67d",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Breaking it down this inner product is mathematically"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e0b99e63",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\label{eq:partialeq1} \\tag{17}\n",
+ "\\int_{\\Omega} \\boldsymbol{\\overline{v}}[0] \\left(\\frac{\\partial^2 \\boldsymbol{u}[0]}{\\partial x^2} + \\frac{\\partial^2 \\boldsymbol{u}[0]}{\\partial y^2} + \\frac{\\partial^2 \\boldsymbol{u}[0]}{\\partial z^2}\\right) w_x dx w_y dy w_z dz.\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d7af7337",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "If we now use test function $\\boldsymbol{v}[0]$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "39548089",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\boldsymbol{v}[0]_{lmn} = \\mathcal{X}_l \\mathcal{Y}_m \\mathcal{Z}_n,\n",
+ "\\label{_auto16} \\tag{18}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4e50aac5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "and trialfunction"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ab1d7887",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\boldsymbol{u}[0]_{pqr} = \\sum_{p} \\sum_{q} \\sum_{r} \\hat{\\boldsymbol{u}}[0]_{pqr} \\mathcal{X}_p \\mathcal{Y}_q \\mathcal{Z}_r,\n",
+ "\\label{_auto17} \\tag{19}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f54f63d9",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $\\hat{\\boldsymbol{u}}$ are the unknown degrees of freedom, and then insert these functions\n",
+ "into ([17](#eq:partialeq1)), then we obtain after\n",
+ "performing some exact evaluations over the periodic directions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a02a38ee",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ " \\Big( \\underbrace{-\\left(l^2 \\delta_{lp} + m^2 \\delta_{mq} \\right) \\int_{-1}^{1} \\mathcal{Z}_r(z) \\mathcal{Z}_n(z) w_z dz}_{A[0]} + \\underbrace{\\delta_{lp} \\delta_{mq} \\int_{-1}^{1} \\frac{\\partial^2 \\mathcal{Z}_r(z)}{\\partial z^2} \\mathcal{Z}_n(z) w_z dz}_{A[1]} \\Big) \\hat{\\boldsymbol{u}}[0]_{pqr}.\n",
+ "\\label{_auto18} \\tag{20}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "31d48e12",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Similarly for components 1 and 2 of the test and trial vectors, leading to 6 tensor\n",
+ "product matrices in total for `A`. Similarly, we get three components of `G`\n",
+ "and three of `D`.\n",
+ "\n",
+ "Eliminating the Fourier diagonal matrices, we are left with block matrices like"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7448136c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "$$\n",
+ "H(l, m) =\n",
+ " \\begin{bmatrix}\n",
+ " A[0]+A[1] & 0 & 0 & G[0] \\\\ \n",
+ " 0 & A[2]+A[3] & 0 & G[1] \\\\ \n",
+ " 0 & 0 & A[4]+A[5] & G[2] \\\\ \n",
+ " D[0] & D[1] & D[2] & 0\n",
+ " \\end{bmatrix}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6032e16f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that there will be one large block matrix $H(l, m)$ for each Fourier\n",
+ "wavenumber combination $(l, m)$. To solve the problem in the end we will need to\n",
+ "loop over these wavenumbers and solve the assembled linear systems one by one.\n",
+ "An example of the block matrix, for $l=m=5$ and $\\boldsymbol{N}=(20, 20, 20)$ is given\n",
+ "in Fig. [fig:BlockMat](#fig:BlockMat).\n",
+ "\n",
+ "In the end we create a block matrix through"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6b446033",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:58.757316Z",
+ "iopub.status.busy": "2024-05-24T12:36:58.757061Z",
+ "iopub.status.idle": "2024-05-24T12:36:58.769296Z",
+ "shell.execute_reply": "2024-05-24T12:36:58.768240Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "M = BlockMatrix(A+G+D)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2b82783f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The right hand side can easily be assembled since we have already\n",
+ "defined the functions $\\boldsymbol{f}$ and $h$, see Sec. [Manufactured solution](#sec:mansol)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c00af279",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:58.772359Z",
+ "iopub.status.busy": "2024-05-24T12:36:58.772110Z",
+ "iopub.status.idle": "2024-05-24T12:36:58.801098Z",
+ "shell.execute_reply": "2024-05-24T12:36:58.800368Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# Get mesh (quadrature points)\n",
+ "X = TD.local_mesh(True)\n",
+ "\n",
+ "# Get f and h on quad points\n",
+ "fh = Array(VQ, buffer=(fx, fy, fz, h))\n",
+ "f_, h_ = fh\n",
+ "\n",
+ "# Compute inner products\n",
+ "fh_hat = Function(VQ)\n",
+ "f_hat, h_hat = fh_hat\n",
+ "f_hat = inner(v, f_, output_array=f_hat)\n",
+ "h_hat = inner(q, h_, output_array=h_hat)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2acb39c6",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "In the end all that is left is to solve and compare with\n",
+ "the exact solution."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ce3a912d",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:36:58.804096Z",
+ "iopub.status.busy": "2024-05-24T12:36:58.803860Z",
+ "iopub.status.idle": "2024-05-24T12:36:59.489334Z",
+ "shell.execute_reply": "2024-05-24T12:36:59.488644Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# Solve problem\n",
+ "up_hat = M.solve(fh_hat, constraints=((3, 0, 0), (3, N[2]-1, 0)))\n",
+ "up = up_hat.backward()\n",
+ "u_, p_ = up\n",
+ "\n",
+ "# Exact solution\n",
+ "ux, uy, uz = Array(V, buffer=(uex, uey, uez))\n",
+ "pe = Array(Q, buffer=pe)\n",
+ "\n",
+ "error = [comm.reduce(np.linalg.norm(ux-u_[0])),\n",
+ " comm.reduce(np.linalg.norm(uy-u_[1])),\n",
+ " comm.reduce(np.linalg.norm(uz-u_[2])),\n",
+ " comm.reduce(np.linalg.norm(pe-p_))]\n",
+ "print(error)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1241e64b",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that solve has a keyword argument\n",
+ "`constraints=((3, 0, 0), (3, N[2]-1), 0)` that takes care of the restriction\n",
+ "$\\int_{\\Omega} p \\omega dx = 0$ by indenting the rows in M corresponding to the\n",
+ "first and last degree of freedom for the pressure. The value $(3, 0, 0)$\n",
+ "indicates that pressure is\n",
+ "in block 3 of the block vector solution (the velocity vector holds\n",
+ "positions 0, 1 and 2), whereas the two zeros ensures that the first dof\n",
+ "(dof 0) should obtain value 0. The constraint on the highest\n",
+ "wavenumber `(3, N[2]-1, 0)` is required to get a non-singular\n",
+ "matrix."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "eff53300",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Complete solver\n",
+ "
\n",
+ "\n",
+ "A complete solver can be found in demo [Stokes3D.py](https://github.com/spectralDNS/shenfun/blob/master/demo/Stokes3D.py)."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/demos/Tau/tau.ipynb b/docs/demos/Tau/tau.ipynb
new file mode 100644
index 00000000..63279e9e
--- /dev/null
+++ b/docs/demos/Tau/tau.ipynb
@@ -0,0 +1,800 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "03e210dc",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "\n",
+ "# Demo - The Tau method\n",
+ "**Mikael Mortensen** (email: `mikaem@math.uio.no`), Department of Mathematics, University of Oslo.\n",
+ "\n",
+ "Date: **June 15, 2021**\n",
+ "\n",
+ "**Summary.** Shenfun has primarily been developed for the spectral Galerkin method.\n",
+ "However, there are other methods out there that make use of global basis\n",
+ "functions and variational principles. One such method, which has a lot in\n",
+ "common with the spectral Galerkin method, is the Tau method. The\n",
+ "principle difference between a Tau method and a spectral Galerkin method\n",
+ "is in the choice of basis functions. The spectral Galerkin method is\n",
+ "usually defined through function spaces where the boundary conditions\n",
+ "of the problem are already built in. The tau-method, on the other hand,\n",
+ "usually considers\n",
+ "only the orthogonal basis, like pure Chebyshev or Legendre polynomials,\n",
+ "and derives differentiation matrices for these bases. The boundary conditions\n",
+ "are then usually fixed through manipulation of a couple of rows of the\n",
+ "differentiation matrix. In this demo we will show how the original\n",
+ "tau-method can be easily implemented using [shenfun](https://github.com/spectralDNS/shenfun)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4032d1d0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## The tau method for Poisson's equation in 1D\n",
+ "\n",
+ "Poisson's equation is given on a domain $\\Omega = (-1, 1)$ as"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6860396a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\nabla^2 u(x) = f(x) \\quad \\text{for }\\, x \\in \\Omega, \\label{eq:poisson} \\tag{1}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "04929b21",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "u(-1)=a, u(1)=b, \\notag\n",
+ "\\label{_auto1} \\tag{2}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b722d3fb",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $u(x)$ is the solution, $f(x)$ is a function and $a, b$ are two possibly\n",
+ "non-zero constants. To solve Eq. ([1](#eq:poisson)) with the tau method we choose either\n",
+ "Legendre of Chebyshev basis functions $\\phi_k$, and then look for\n",
+ "solutions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c9f32970",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u(x) = \\sum_{k=0}^{N-1} \\hat{u}_k \\phi_k(x), \\label{eq:u} \\tag{3}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f10d071a",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where $N$ is the size of the discretized problem and\n",
+ "$\\hat{\\mathbf{u}} = \\{\\hat{u}_k\\}_{k=0}^{N-1}$ are the unknown expansion\n",
+ "coefficients. For this function to satisfy the given boundary conditions, it is necessary\n",
+ "that"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fe13714e",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "u(-1) = \\sum_{k=0}^{N-1} \\hat{u}_k \\phi_k(-1) = \\sum_{k=0}^{N-1}\\hat{u}_{k}(-1)^k = a,\n",
+ "\\label{eq:dirichleta} \\tag{4} \n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e0a0c7d7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "u(+1) = \\sum_{k=0}^{N-1} \\hat{u}_k \\phi_k(+1) = \\sum_{k=0}^{N-1} \\hat{u}_{k} = b,\n",
+ "\\label{eq:dirichletb} \\tag{5}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c7ad046f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "where we have use that $\\phi_k(1) = 1$ and $\\phi_k(-1)=(-1)^k$ for $k=0,1, \\ldots, N-1$,\n",
+ "for either Chebyshev or Legendre polynomials $\\phi_k$. This gives two equations\n",
+ "for the $N$ unknowns in $\\{\\hat{u}_k\\}_{k=0}^{N-1}$.\n",
+ "We will now use variational principles, like in the Galerkin method, in order to\n",
+ "derive equations that can be used to close the remaining $N-2$ unknowns.\n",
+ "To this end we multiply Poisson's equation by a\n",
+ "test function $v$, a weight $w$, and integrate over the domain"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "389e6324",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\int_{-1}^1 \\nabla^2 u \\, v \\, w\\, dx = \\int_{-1}^1 f \\, v\\, w\\, dx. \\label{eq:varform} \\tag{6}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "29046d76",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The weight function depends on the choice of basis functions. For Chebyshev\n",
+ "it will be $1/\\sqrt{1-x^2}$, whereas it is unity for Legendre.\n",
+ "\n",
+ "Finally, we insert the trial function $u=\\sum_{j=0}^{N-1}\\hat{u}_j \\phi_j$ and\n",
+ "the test function $v=\\phi_k$, to get"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c390a448",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\int_{-1}^1 \\nabla^2 \\sum_{j=0}^{N-1} \\phi_j \\, \\, \\phi_k \\, w\\, dx \\hat{u}_j = \\int_{-1}^1 f \\, \\phi_k\\, w\\, dx. \\label{eq:varform2} \\tag{7}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9d4a27c7",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "This problem can be reformulated as a linear algebra problem,"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1dd2760c",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation}\n",
+ "a_{kj} \\hat{u}_j = \\tilde{f}_k, \n",
+ "\\label{_auto2} \\tag{8}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f79f7562",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "$$\n",
+ "\\begin{equation} \n",
+ "A \\hat{\\mathbf{{u}}} = \\tilde{\\mathbf{{f}}}.\n",
+ "\\label{_auto3} \\tag{9}\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3949a751",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "However, the matrix $A\\in \\mathbb{R}^{N \\times N}$ is singular because it\n",
+ "contains two zero rows. These two rows are used to implement the two boundary\n",
+ "conditions. Setting $a_{N-2, j}=1$ and\n",
+ "$a_{N-1, j}= (-1)^j$ for $j=0, 1, \\ldots, N-1$, and also fixing\n",
+ "the right hand sides $\\tilde{f}_{N-2}=a$ and $\\tilde{f}_{N-1}=b$, the\n",
+ "two boundary conditions will be satisfied."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fc08f897",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Implementation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6f3913f0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Preamble\n",
+ "\n",
+ "We will solve Poisson's equation using the [shenfun](https://github.com/spectralDNS/shenfun) Python module. The first thing needed\n",
+ "is then to import some of this module's functionality\n",
+ "plus some other helper modules, like [Numpy](https://numpy.org) and [Sympy](https://sympy.org), and the [scipy.sparse](https://docs.scipy.org/doc/scipy/reference/sparse.html)\n",
+ "for handeling sparse matrices:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d2f50904",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:57.417744Z",
+ "iopub.status.busy": "2024-05-24T12:37:57.417107Z",
+ "iopub.status.idle": "2024-05-24T12:37:57.994366Z",
+ "shell.execute_reply": "2024-05-24T12:37:57.993910Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "from shenfun import inner, div, grad, TestFunction, TrialFunction, Function, \\\n",
+ " project, Dx, Array, FunctionSpace, dx\n",
+ "import numpy as np\n",
+ "import scipy.sparse as scp\n",
+ "from sympy import symbols, cos, sin, exp, lambdify"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "40fcaf01",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "We use `Sympy` for a manufactured solution and `Numpy` for testing.\n",
+ "The exact manufactured solution $u_e(x)$ and the right hand side\n",
+ "$f_e(x)$ are created using `Sympy` as follows"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b7f66a59",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:57.997044Z",
+ "iopub.status.busy": "2024-05-24T12:37:57.996688Z",
+ "iopub.status.idle": "2024-05-24T12:37:58.002233Z",
+ "shell.execute_reply": "2024-05-24T12:37:58.001879Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "x = symbols(\"x\")\n",
+ "ue = sin(4*np.pi*x)\n",
+ "fe = ue.diff(x, 2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "739884be",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that we compute the right hand side function `fe` that corresponds to\n",
+ "the manufactured solution `ue`."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "377d957f",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Discretization\n",
+ "\n",
+ "We create a basis with a given number of basis functions,"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "12458aa3",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:58.004548Z",
+ "iopub.status.busy": "2024-05-24T12:37:58.004432Z",
+ "iopub.status.idle": "2024-05-24T12:37:58.020773Z",
+ "shell.execute_reply": "2024-05-24T12:37:58.017891Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "N = 32\n",
+ "T = FunctionSpace(N, 'Chebyshev')\n",
+ "#T = FunctionSpace(N, 'Legendre')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "736218b2",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that we can either choose a Legendre or a Chebyshev basis. The\n",
+ "remaining code will work either way."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "37f9d1b5",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Variational formulation\n",
+ "\n",
+ "The variational problem ([6](#eq:varform)) can be assembled using `shenfun`'s\n",
+ "[TrialFunction](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.TrialFunction), [TestFunction](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.TestFunction) and [inner()](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.inner.inner) functions."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "fa34ca27",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:58.025759Z",
+ "iopub.status.busy": "2024-05-24T12:37:58.025521Z",
+ "iopub.status.idle": "2024-05-24T12:37:58.034151Z",
+ "shell.execute_reply": "2024-05-24T12:37:58.033814Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "u = TrialFunction(T)\n",
+ "v = TestFunction(T)\n",
+ "# Assemble differentiation matrix\n",
+ "A = inner(v, div(grad(u)))\n",
+ "# Assemble right hand side\n",
+ "fj = Array(T, buffer=fe)\n",
+ "f_hat = Function(T)\n",
+ "f_hat = inner(v, fj, output_array=f_hat)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a10787e4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the `sympy` function `fe` is be used to initialize the [Array](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.Array)\n",
+ "`fj`, because an Array\n",
+ "is required as input to the [inner()](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.inner.inner) function. An\n",
+ "[Array](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.Array) contains the solution evaluated on the\n",
+ "quadrature mesh. A [Function](https://shenfun.readthedocs.io/en/latest/shenfun.forms.html#shenfun.forms.arguments.Function) represents a global\n",
+ "expansion, like Eq. ([3](#eq:u)), and its values are the\n",
+ "expansion coefficients $\\{\\hat{u}_{k}\\}_{k=0}^{N-1}$."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4a47d951",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Fix boundary conditions\n",
+ "\n",
+ "We fix two rows of the differentiation matrix in order to satisfy\n",
+ "Eqs. ([4](#eq:dirichleta)) and ([5](#eq:dirichletb))."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7da80e99",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:58.038581Z",
+ "iopub.status.busy": "2024-05-24T12:37:58.038166Z",
+ "iopub.status.idle": "2024-05-24T12:37:58.059598Z",
+ "shell.execute_reply": "2024-05-24T12:37:58.054103Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "A = A.diags('lil')\n",
+ "A[-2] = (-1)**np.arange(N)\n",
+ "A[-1] = np.ones(N)\n",
+ "A = A.tocsc()\n",
+ "f_hat[-2] = ue.subs(x, T.domain[0])\n",
+ "f_hat[-1] = ue.subs(x, T.domain[1])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0e3b7fe8",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "Note that the last two lines uses evaluation of the sympy function\n",
+ "`ue` at the borders of the domain. Implemented like this it is\n",
+ "easy to change to a nonstandard domain size.\n",
+ "The sparsity pattern of the matrix A is now modified\n",
+ "with the typical tau-lines that we can visualize using [plotly](https://plotly.com/)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "454473fc",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:58.065264Z",
+ "iopub.status.busy": "2024-05-24T12:37:58.065121Z",
+ "iopub.status.idle": "2024-05-24T12:37:58.588358Z",
+ "shell.execute_reply": "2024-05-24T12:37:58.587519Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "import plotly.express as px\n",
+ "z = np.where(abs(A.toarray()) > 1e-6, 0, 1).astype(bool)\n",
+ "fig = px.imshow(z, binary_string=True)\n",
+ "fig.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5a1ae665",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Solve linear equations\n",
+ "\n",
+ "Finally, solve the linear equation system and transform the solution from the spectral\n",
+ "$\\{\\hat{u}_k\\}_{k=0}^{N-1}$ vector to the real space $\\{u(x_j)\\}_{j=0}^{N-1}$\n",
+ "and then check how the solution corresponds with the exact solution $u_e$.\n",
+ "To this end we compute the $L_2$-errornorm using the `shenfun` function\n",
+ "[dx()](https://shenfun.readthedocs.io/en/latest/shenfun.utilities.html#shenfun.utilities.dx)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c55f7862",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:58.600186Z",
+ "iopub.status.busy": "2024-05-24T12:37:58.599966Z",
+ "iopub.status.idle": "2024-05-24T12:37:58.615932Z",
+ "shell.execute_reply": "2024-05-24T12:37:58.615360Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "u_hat = Function(T)\n",
+ "u_hat[:] = scp.linalg.spsolve(A, f_hat)\n",
+ "uj = u_hat.backward()\n",
+ "ua = Array(T, buffer=ue)\n",
+ "\n",
+ "print(\"Error=%2.16e\" %(np.sqrt(dx((uj-ua)**2))))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3c8908a6",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "### Convergence test\n",
+ "\n",
+ "To do a convergence test we will now create a function `main`, that takes the\n",
+ "number of quadrature points as parameter, and prints out\n",
+ "the error."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c5417c91",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:58.618506Z",
+ "iopub.status.busy": "2024-05-24T12:37:58.618386Z",
+ "iopub.status.idle": "2024-05-24T12:37:58.621491Z",
+ "shell.execute_reply": "2024-05-24T12:37:58.620785Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "def main(N, family='Chebyshev'):\n",
+ " T = FunctionSpace(N, family=family)\n",
+ " u = TrialFunction(T)\n",
+ " v = TestFunction(T)\n",
+ "\n",
+ " # Get f on quad points\n",
+ " fj = Array(T, buffer=fe)\n",
+ "\n",
+ " # Compute right hand side of Poisson's equation\n",
+ " f_hat = Function(T)\n",
+ " f_hat = inner(v, fj, output_array=f_hat)\n",
+ "\n",
+ " # Get left hand side of Poisson's equation\n",
+ " A = inner(v, div(grad(u)))\n",
+ " A = A.diags('lil')\n",
+ " A[-2] = (-1)**np.arange(N)\n",
+ " A[-1] = np.ones(N)\n",
+ " A = A.tocsc()\n",
+ " f_hat[-2] = ue.subs(x, T.domain[0])\n",
+ " f_hat[-1] = ue.subs(x, T.domain[1])\n",
+ "\n",
+ " u_hat = Function(T)\n",
+ " u_hat[:] = scp.linalg.spsolve(A, f_hat)\n",
+ " uj = u_hat.backward()\n",
+ "\n",
+ " # Compare with analytical solution\n",
+ " ua = Array(T, buffer=ue)\n",
+ " l2_error = np.linalg.norm(uj-ua)\n",
+ " return l2_error"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8199b9c0",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "For example, we find the error of a Chebyshev discretization\n",
+ "using 12 quadrature points as"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e2444fa7",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:58.625346Z",
+ "iopub.status.busy": "2024-05-24T12:37:58.625172Z",
+ "iopub.status.idle": "2024-05-24T12:37:58.632543Z",
+ "shell.execute_reply": "2024-05-24T12:37:58.632211Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "main(12, 'Chebyshev')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e42b9a11",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "To get the convergence we call `main` for a list\n",
+ "of $N=[12, 16, \\ldots, 48]$, and collect the errornorms in\n",
+ "arrays to be plotted. The error can be plotted using\n",
+ "[matplotlib](https://matplotlib.org)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "1215522e",
+ "metadata": {
+ "editable": true,
+ "execution": {
+ "iopub.execute_input": "2024-05-24T12:37:58.634874Z",
+ "iopub.status.busy": "2024-05-24T12:37:58.634740Z",
+ "iopub.status.idle": "2024-05-24T12:37:59.519571Z",
+ "shell.execute_reply": "2024-05-24T12:37:59.516997Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "%matplotlib inline\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "N = range(12, 50, 4)\n",
+ "error = {}\n",
+ "for basis in ('legendre', 'chebyshev'):\n",
+ " error[basis] = []\n",
+ " for i in range(len(N)):\n",
+ " errN = main(N[i], basis)\n",
+ " error[basis].append(errN)\n",
+ "\n",
+ "plt.figure(figsize=(6, 4))\n",
+ "for basis, col in zip(('legendre', 'chebyshev'), ('r', 'b')):\n",
+ " plt.semilogy(N, error[basis], col, linewidth=2)\n",
+ "plt.title('Convergence of Tau Poisson solvers 1D')\n",
+ "plt.xlabel('N')\n",
+ "plt.ylabel('Error norm')\n",
+ "plt.legend(('Legendre', 'Chebyshev'))\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "09bd3e41",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "The spectral convergence is evident and we can see that\n",
+ "after $N=40$ roundoff errors dominate as the errornorm trails off around $10^{-14}$."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "914025e4",
+ "metadata": {
+ "editable": true
+ },
+ "source": [
+ "## Complete solver\n",
+ "
\n",
+ "\n",
+ "A complete solver, that can use either Legendre or Chebyshev bases, chosen as a\n",
+ "command-line argument, can also be found [here](https://github.com/spectralDNS/shenfun/blob/master/demo/poisson1D_tau.py).\n",
+ "\n",
+ ""
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/source/functions.ipynb b/docs/source/functions.ipynb
index 33808893..701a1666 100644
--- a/docs/source/functions.ipynb
+++ b/docs/source/functions.ipynb
@@ -69,14 +69,16 @@
"execution_count": 1,
"id": "f17eb498",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:50.074095Z",
- "iopub.status.busy": "2024-02-19T13:47:50.073828Z",
- "iopub.status.idle": "2024-02-19T13:47:50.913544Z",
- "shell.execute_reply": "2024-02-19T13:47:50.912771Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:24.305451Z",
+ "iopub.status.busy": "2024-05-24T12:37:24.305372Z",
+ "iopub.status.idle": "2024-05-24T12:37:24.897648Z",
+ "shell.execute_reply": "2024-05-24T12:37:24.897199Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [],
"source": [
@@ -101,14 +103,16 @@
"execution_count": 2,
"id": "b77b3fc9",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:50.917037Z",
- "iopub.status.busy": "2024-02-19T13:47:50.916634Z",
- "iopub.status.idle": "2024-02-19T13:47:50.920164Z",
- "shell.execute_reply": "2024-02-19T13:47:50.919412Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:24.900143Z",
+ "iopub.status.busy": "2024-05-24T12:37:24.899852Z",
+ "iopub.status.idle": "2024-05-24T12:37:24.901950Z",
+ "shell.execute_reply": "2024-05-24T12:37:24.901605Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [],
"source": [
@@ -132,14 +136,16 @@
"execution_count": 3,
"id": "8ec4daad",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:50.923125Z",
- "iopub.status.busy": "2024-02-19T13:47:50.922882Z",
- "iopub.status.idle": "2024-02-19T13:47:50.926517Z",
- "shell.execute_reply": "2024-02-19T13:47:50.925967Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:24.903967Z",
+ "iopub.status.busy": "2024-05-24T12:37:24.903849Z",
+ "iopub.status.idle": "2024-05-24T12:37:24.906523Z",
+ "shell.execute_reply": "2024-05-24T12:37:24.905958Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [],
"source": [
@@ -189,14 +195,16 @@
"execution_count": 4,
"id": "761f5f53",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:50.929251Z",
- "iopub.status.busy": "2024-02-19T13:47:50.929055Z",
- "iopub.status.idle": "2024-02-19T13:47:50.932325Z",
- "shell.execute_reply": "2024-02-19T13:47:50.931883Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:24.909043Z",
+ "iopub.status.busy": "2024-05-24T12:37:24.908934Z",
+ "iopub.status.idle": "2024-05-24T12:37:24.911054Z",
+ "shell.execute_reply": "2024-05-24T12:37:24.910669Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [],
"source": [
@@ -221,22 +229,24 @@
"execution_count": 5,
"id": "b9ad36a9",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:50.934594Z",
- "iopub.status.busy": "2024-02-19T13:47:50.934409Z",
- "iopub.status.idle": "2024-02-19T13:47:50.947211Z",
- "shell.execute_reply": "2024-02-19T13:47:50.946640Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:24.913202Z",
+ "iopub.status.busy": "2024-05-24T12:37:24.913100Z",
+ "iopub.status.idle": "2024-05-24T12:37:24.921840Z",
+ "shell.execute_reply": "2024-05-24T12:37:24.921468Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "[-6.93889390e-17 -5.47405982e-17 -1.82237827e-18 1.00000000e+00\n",
- " 1.96261557e-17 -3.33066907e-16 1.49457239e-16 -2.93881977e-16]\n"
+ "[-8.32667268e-17 -5.47405982e-17 2.38204300e-17 1.00000000e+00\n",
+ " 0.00000000e+00 -3.20040096e-16 1.60078838e-16 -2.93881977e-16]\n"
]
}
],
@@ -271,10 +281,10 @@
},
"source": [
"\n",
- "
\n",
+ "
\n",
"\n",
"$$\n",
- "(u_h - u, v)^{N}_w = 0 \\quad \\forall v \\in T, \\label{eq:proj1} \\tag{1}\n",
+ "(u_h - u, v)^{N}_w = 0 \\quad \\forall v \\in T, \\label{eq:proj1} \\tag{1} \n",
"$$"
]
},
@@ -411,14 +421,16 @@
"execution_count": 6,
"id": "6b3431b4",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:50.950753Z",
- "iopub.status.busy": "2024-02-19T13:47:50.950522Z",
- "iopub.status.idle": "2024-02-19T13:47:50.954325Z",
- "shell.execute_reply": "2024-02-19T13:47:50.953799Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:24.925102Z",
+ "iopub.status.busy": "2024-05-24T12:37:24.924966Z",
+ "iopub.status.idle": "2024-05-24T12:37:24.928595Z",
+ "shell.execute_reply": "2024-05-24T12:37:24.927405Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [],
"source": [
@@ -443,21 +455,23 @@
"execution_count": 7,
"id": "9a55e6d5",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:50.956650Z",
- "iopub.status.busy": "2024-02-19T13:47:50.956470Z",
- "iopub.status.idle": "2024-02-19T13:47:50.971292Z",
- "shell.execute_reply": "2024-02-19T13:47:50.970532Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:24.931772Z",
+ "iopub.status.busy": "2024-05-24T12:37:24.931577Z",
+ "iopub.status.idle": "2024-05-24T12:37:24.960845Z",
+ "shell.execute_reply": "2024-05-24T12:37:24.960343Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "37\n"
+ "45\n"
]
}
],
@@ -485,21 +499,23 @@
"execution_count": 8,
"id": "d6cdcdb9",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:50.973843Z",
- "iopub.status.busy": "2024-02-19T13:47:50.973655Z",
- "iopub.status.idle": "2024-02-19T13:47:50.976913Z",
- "shell.execute_reply": "2024-02-19T13:47:50.976395Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:24.964705Z",
+ "iopub.status.busy": "2024-05-24T12:37:24.964158Z",
+ "iopub.status.idle": "2024-05-24T12:37:24.967976Z",
+ "shell.execute_reply": "2024-05-24T12:37:24.967525Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "37\n"
+ "45\n"
]
}
],
@@ -524,14 +540,16 @@
"execution_count": 9,
"id": "f3f6e277",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:50.979208Z",
- "iopub.status.busy": "2024-02-19T13:47:50.979025Z",
- "iopub.status.idle": "2024-02-19T13:47:51.014287Z",
- "shell.execute_reply": "2024-02-19T13:47:51.013761Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:24.970095Z",
+ "iopub.status.busy": "2024-05-24T12:37:24.970019Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.000706Z",
+ "shell.execute_reply": "2024-05-24T12:37:24.999982Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
@@ -566,14 +584,16 @@
"execution_count": 10,
"id": "f909dbb0",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:51.016776Z",
- "iopub.status.busy": "2024-02-19T13:47:51.016584Z",
- "iopub.status.idle": "2024-02-19T13:47:51.030924Z",
- "shell.execute_reply": "2024-02-19T13:47:51.030480Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:25.004338Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.004225Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.015645Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.015180Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
@@ -605,19 +625,21 @@
"execution_count": 11,
"id": "24ce622f",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:51.033552Z",
- "iopub.status.busy": "2024-02-19T13:47:51.033365Z",
- "iopub.status.idle": "2024-02-19T13:47:51.628468Z",
- "shell.execute_reply": "2024-02-19T13:47:51.627423Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:25.017665Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.017590Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.314535Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.312802Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
"data": {
- "image/png": "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YyE+z6nB5zl1+FynBp/n1LDqeZZlGc3NzSgpKYHN1ntXy1mXebHZbBg2bJilj5GTk8N/GCnA5zk1+DynDp/r1ODznBpWPM99ZVwENuwSERHRgMLghYiIiAYUBi8auFwufP/734fL5ervSzmr8XlODT7PqcPnOjX4PKfGmfA8n3UNu0RERHR2Y+aFiIiIBhQGL0RERDSgMHghIiKiAYXBCxEREQ0oDF5UeuqppzBy5Ei43W6Ul5djw4YN/X1JA9rSpUtx/vnnIzs7G0VFRfjMZz6Dffv2dbmPLMt4/PHHUVJSgvT0dFx22WXYtWtXP13x2WHp0qWQJAkPPPCAchufZ/NUV1fjy1/+MgoKCpCRkYFp06ahoqJC+Tyfa+OCwSC++93vYuTIkUhPT8eoUaPwxBNPIBwOK/fh86zd+vXrceONN6KkpASSJOHvf/97l8+reU79fj+++c1vorCwEJmZmbjppptw/Phxay5Ypj795S9/kdPS0uRnn31W3r17t3z//ffLmZmZ8rFjx/r70gasa665Rv79738v79y5U962bZs8b948efjw4XJLS4tyn5/+9Kdydna2/Oqrr8o7duyQb7vtNnnIkCGyz+frxysfuDZt2iSPGDFCPvfcc+X7779fuZ3PszlOnz4tl5WVyV/5ylfkjz76SD5y5Ij89ttvywcPHlTuw+fauB/96EdyQUGB/M9//lM+cuSI/Ne//lXOysqSly9frtyHz7N2q1atkh977DH51VdflQHIr732WpfPq3lOFy1aJA8dOlRes2aNvGXLFvnyyy+Xp06dKgeDQdOvl8GLChdccIG8aNGiLrdNmDBBfuSRR/rpis4+dXV1MgB53bp1sizLcjgclgcPHiz/9Kc/Ve7T0dEhezwe+emnn+6vyxywmpub5bFjx8pr1qyRL730UiV44fNsnocffliePXt20s/zuTbHvHnz5K997WtdbvvsZz8rf/nLX5Zlmc+zGboHL2qe06amJjktLU3+y1/+otynurpattls8urVq02/RpaN+tDZ2YmKigrMnTu3y+1z587Fxo0b++mqzj5erxcAkJ+fDwA4cuQIamtruzzvLpcLl156KZ93Hb7xjW9g3rx5uOqqq7rczufZPK+//jpmzJiBz3/+8ygqKsL06dPx7LPPKp/nc22O2bNn49///jf2798PAPjkk0/w3nvv4frrrwfA59kKap7TiooKBAKBLvcpKSnB5MmTLXnez7rFjGarr69HKBRCcXFxl9uLi4tRW1vbT1d1dpFlGYsXL8bs2bMxefJkAFCe20TP+7Fjx1J+jQPZX/7yF2zZsgUff/xxj8/xeTbP4cOHsWLFCixevBiPPvooNm3ahPvuuw8ulwsLFizgc22Shx9+GF6vFxMmTIDdbkcoFMKPf/xjfPGLXwTAv9NWUPOc1tbWwul0Ii8vr8d9rHitZPCikiRJXf6/LMs9biN97r33Xmzfvh3vvfdej8/xeTemqqoK999/P9566y243e6k9+PzbFw4HMaMGTPwk5/8BAAwffp07Nq1CytWrMCCBQuU+/G5NuaVV17Bn/70J/z5z3/GpEmTsG3bNjzwwAMoKSnBHXfcodyPz7P59DynVj3vLBv1obCwEHa7vUfkWFdX1yMKJe2++c1v4vXXX8e7776LYcOGKbcPHjwYAPi8G1RRUYG6ujqUl5fD4XDA4XBg3bp1ePLJJ+FwOJTnks+zcUOGDME555zT5baJEyeisrISAP9Om+Whhx7CI488gi984QuYMmUK5s+fjwcffBBLly4FwOfZCmqe08GDB6OzsxONjY1J72MmBi99cDqdKC8vx5o1a7rcvmbNGsyaNaufrmrgk2UZ9957L1auXIl33nkHI0eO7PL5kSNHYvDgwV2e987OTqxbt47PuwZXXnklduzYgW3btikfM2bMwJe+9CVs27YNo0aN4vNskosvvrjHcf/9+/ejrKwMAP9Om6WtrQ02W9eXLrvdrhyV5vNsPjXPaXl5OdLS0rrcp6amBjt37rTmeTe9BfgsJI5KP//88/Lu3bvlBx54QM7MzJSPHj3a35c2YP3nf/6n7PF45LVr18o1NTXKR1tbm3Kfn/70p7LH45FXrlwp79ixQ/7iF7/I444miD9tJMt8ns2yadMm2eFwyD/+8Y/lAwcOyC+99JKckZEh/+lPf1Luw+fauDvuuEMeOnSoclR65cqVcmFhofyd73xHuQ+fZ+2am5vlrVu3ylu3bpUByMuWLZO3bt2qjARR85wuWrRIHjZsmPz222/LW7Zska+44goele5vv/3tb+WysjLZ6XTK5513nnKkl/QBkPDj97//vXKfcDgsf//735cHDx4su1wu+ZJLLpF37NjRfxd9lugevPB5Ns8bb7whT548WXa5XPKECRPk3/3ud10+z+faOJ/PJ99///3y8OHDZbfbLY8aNUp+7LHHZL/fr9yHz7N27777bsLfyXfccYcsy+qe0/b2dvnee++V8/Pz5fT0dPmGG26QKysrLbleSZZl2fx8DhEREZE12PNCREREAwqDFyIiIhpQGLwQERHRgMLghYiIiAYUBi9EREQ0oDB4ISIiogGFwQsRERENKAxeiIiIaEBh8EJEREQDCoMXIiIiGlAYvBAREdGAwuCFiIiIBpT/DxsRVpXkvMQOAAAAAElFTkSuQmCC",
+ "image/png": "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YyE+z6nB5zl1+FynBp/n1LDqeZZlGc3NzSgpKYHN1ntXy1mXebHZbBg2bJilj5GTk8N/GCnA5zk1+DynDp/r1ODznBpWPM99ZVwENuwSERHRgMLghYiIiAYUBi8auFwufP/734fL5ervSzmr8XlODT7PqcPnOjX4PKfGmfA8n3UNu0RERHR2Y+aFiIiIBhQGL0RERDSgMHghIiKiAYXBCxEREQ0oDF5UeuqppzBy5Ei43W6Ul5djw4YN/X1JA9rSpUtx/vnnIzs7G0VFRfjMZz6Dffv2dbmPLMt4/PHHUVJSgvT0dFx22WXYtWtXP13x2WHp0qWQJAkPPPCAchufZ/NUV1fjy1/+MgoKCpCRkYFp06ahoqJC+Tyfa+OCwSC++93vYuTIkUhPT8eoUaPwxBNPIBwOK/fh86zd+vXrceONN6KkpASSJOHvf/97l8+reU79fj+++c1vorCwEJmZmbjppptw/Phxay5Ypj795S9/kdPS0uRnn31W3r17t3z//ffLmZmZ8rFjx/r70gasa665Rv79738v79y5U962bZs8b948efjw4XJLS4tyn5/+9Kdydna2/Oqrr8o7duyQb7vtNnnIkCGyz+frxysfuDZt2iSPGDFCPvfcc+X7779fuZ3PszlOnz4tl5WVyV/5ylfkjz76SD5y5Ij89ttvywcPHlTuw+fauB/96EdyQUGB/M9//lM+cuSI/Ne//lXOysqSly9frtyHz7N2q1atkh977DH51VdflQHIr732WpfPq3lOFy1aJA8dOlRes2aNvGXLFvnyyy+Xp06dKgeDQdOvl8GLChdccIG8aNGiLrdNmDBBfuSRR/rpis4+dXV1MgB53bp1sizLcjgclgcPHiz/9Kc/Ve7T0dEhezwe+emnn+6vyxywmpub5bFjx8pr1qyRL730UiV44fNsnocffliePXt20s/zuTbHvHnz5K997WtdbvvsZz8rf/nLX5Zlmc+zGboHL2qe06amJjktLU3+y1/+otynurpattls8urVq02/RpaN+tDZ2YmKigrMnTu3y+1z587Fxo0b++mqzj5erxcAkJ+fDwA4cuQIamtruzzvLpcLl156KZ93Hb7xjW9g3rx5uOqqq7rczufZPK+//jpmzJiBz3/+8ygqKsL06dPx7LPPKp/nc22O2bNn49///jf2798PAPjkk0/w3nvv4frrrwfA59kKap7TiooKBAKBLvcpKSnB5MmTLXnez7rFjGarr69HKBRCcXFxl9uLi4tRW1vbT1d1dpFlGYsXL8bs2bMxefJkAFCe20TP+7Fjx1J+jQPZX/7yF2zZsgUff/xxj8/xeTbP4cOHsWLFCixevBiPPvooNm3ahPvuuw8ulwsLFizgc22Shx9+GF6vFxMmTIDdbkcoFMKPf/xjfPGLXwTAv9NWUPOc1tbWwul0Ii8vr8d9rHitZPCikiRJXf6/LMs9biN97r33Xmzfvh3vvfdej8/xeTemqqoK999/P9566y243e6k9+PzbFw4HMaMGTPwk5/8BAAwffp07Nq1CytWrMCCBQuU+/G5NuaVV17Bn/70J/z5z3/GpEmTsG3bNjzwwAMoKSnBHXfcodyPz7P59DynVj3vLBv1obCwEHa7vUfkWFdX1yMKJe2++c1v4vXXX8e7776LYcOGKbcPHjwYAPi8G1RRUYG6ujqUl5fD4XDA4XBg3bp1ePLJJ+FwOJTnks+zcUOGDME555zT5baJEyeisrISAP9Om+Whhx7CI488gi984QuYMmUK5s+fjwcffBBLly4FwOfZCmqe08GDB6OzsxONjY1J72MmBi99cDqdKC8vx5o1a7rcvmbNGsyaNaufrmrgk2UZ9957L1auXIl33nkHI0eO7PL5kSNHYvDgwV2e987OTqxbt47PuwZXXnklduzYgW3btikfM2bMwJe+9CVs27YNo0aN4vNskosvvrjHcf/9+/ejrKwMAP9Om6WtrQ02W9eXLrvdrhyV5vNsPjXPaXl5OdLS0rrcp6amBjt37rTmeTe9BfgsJI5KP//88/Lu3bvlBx54QM7MzJSPHj3a35c2YP3nf/6n7PF45LVr18o1NTXKR1tbm3Kfn/70p7LH45FXrlwp79ixQ/7iF7/I444miD9tJMt8ns2yadMm2eFwyD/+8Y/lAwcOyC+99JKckZEh/+lPf1Luw+fauDvuuEMeOnSoclR65cqVcmFhofyd73xHuQ+fZ+2am5vlrVu3ylu3bpUByMuWLZO3bt2qjARR85wuWrRIHjZsmPz222/LW7Zska+44goele5vv/3tb+WysjLZ6XTK5513nnKkl/QBkPDj97//vXKfcDgsf//735cHDx4su1wu+ZJLLpF37NjRfxd9lugevPB5Ns8bb7whT548WXa5XPKECRPk3/3ud10+z+faOJ/PJ99///3y8OHDZbfbLY8aNUp+7LHHZL/fr9yHz7N27777bsLfyXfccYcsy+qe0/b2dvnee++V8/Pz5fT0dPmGG26QKysrLbleSZZl2fx8DhEREZE12PNCREREAwqDFyIiIhpQGLwQERHRgMLghYiIiAYUBi9EREQ0oDB4ISIiogGFwQsRERENKAxeiIiIaEBh8EJEREQDCoMXIiIiGlAYvBAREdGAwuCFiIiIBpT/DxsRVpXkvMQOAAAAAElFTkSuQmCC",
"text/plain": [
"
"
]
@@ -650,19 +672,21 @@
"execution_count": 12,
"id": "aa3f4008",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:51.631660Z",
- "iopub.status.busy": "2024-02-19T13:47:51.631293Z",
- "iopub.status.idle": "2024-02-19T13:47:51.764226Z",
- "shell.execute_reply": "2024-02-19T13:47:51.763705Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:25.322315Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.321796Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.406543Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.402731Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
"data": {
- "image/png": "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",
+ "image/png": "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",
"text/plain": [
""
]
@@ -692,19 +716,21 @@
"execution_count": 13,
"id": "39cb107e",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:51.766802Z",
- "iopub.status.busy": "2024-02-19T13:47:51.766604Z",
- "iopub.status.idle": "2024-02-19T13:47:51.951413Z",
- "shell.execute_reply": "2024-02-19T13:47:51.950859Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:25.413155Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.412715Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.621446Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.620380Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
"data": {
- "image/png": "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",
+ "image/png": "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",
"text/plain": [
""
]
@@ -734,14 +760,16 @@
"execution_count": 14,
"id": "760bd263",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:51.954388Z",
- "iopub.status.busy": "2024-02-19T13:47:51.954181Z",
- "iopub.status.idle": "2024-02-19T13:47:51.958604Z",
- "shell.execute_reply": "2024-02-19T13:47:51.958093Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:25.625839Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.625660Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.633356Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.630655Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
@@ -765,11 +793,11 @@
" 1.64428109e-03 9.53197714e-04 -5.45450869e-04 -2.80998822e-04\n",
" 1.59136941e-04 7.38240716e-05 -4.13664358e-05 -1.74579288e-05\n",
" 9.67744748e-06 3.74610168e-06 -2.05413769e-06 -7.34256601e-07\n",
- " 3.98257402e-07 1.32202237e-07 -7.09282453e-08 -2.19709845e-08\n",
- " 1.16601214e-08 3.38459230e-09 -1.77684428e-09 -4.85085285e-10\n",
- " 2.51925667e-10 6.48958256e-11 -3.33432158e-11 -8.12799381e-12\n",
- " 4.13195149e-12 9.55498771e-13 -4.80687010e-13 -1.05592419e-13\n",
- " 5.24752655e-14 1.10454430e-14 -6.02774535e-15 0.00000000e+00\n",
+ " 3.98257402e-07 1.32202237e-07 -7.09282453e-08 -2.19709846e-08\n",
+ " 1.16601214e-08 3.38459233e-09 -1.77684429e-09 -4.85085275e-10\n",
+ " 2.51925718e-10 6.48957767e-11 -3.33432388e-11 -8.12795878e-12\n",
+ " 4.13189925e-12 9.55535215e-13 -4.80638850e-13 -1.05625737e-13\n",
+ " 5.24914276e-14 1.10219183e-14 -6.06441767e-15 0.00000000e+00\n",
" 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00\n",
" 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00\n",
" 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00\n",
@@ -825,14 +853,16 @@
"execution_count": 15,
"id": "ef085fb4",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:51.961468Z",
- "iopub.status.busy": "2024-02-19T13:47:51.961274Z",
- "iopub.status.idle": "2024-02-19T13:47:51.964404Z",
- "shell.execute_reply": "2024-02-19T13:47:51.963829Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:25.637493Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.636911Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.641331Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.640169Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [],
"source": [
@@ -860,14 +890,16 @@
"execution_count": 16,
"id": "66dcc5f2",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:51.966744Z",
- "iopub.status.busy": "2024-02-19T13:47:51.966567Z",
- "iopub.status.idle": "2024-02-19T13:47:51.975599Z",
- "shell.execute_reply": "2024-02-19T13:47:51.975115Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:25.645719Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.645526Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.651103Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.650379Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [],
"source": [
@@ -892,14 +924,16 @@
"execution_count": 17,
"id": "33dc7c82",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:51.978537Z",
- "iopub.status.busy": "2024-02-19T13:47:51.978332Z",
- "iopub.status.idle": "2024-02-19T13:47:51.981859Z",
- "shell.execute_reply": "2024-02-19T13:47:51.981384Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:25.655373Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.655119Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.660950Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.658643Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
@@ -941,14 +975,16 @@
"execution_count": 18,
"id": "23287700",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:51.984354Z",
- "iopub.status.busy": "2024-02-19T13:47:51.984173Z",
- "iopub.status.idle": "2024-02-19T13:47:52.045944Z",
- "shell.execute_reply": "2024-02-19T13:47:52.045436Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:25.663414Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.663322Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.713724Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.713011Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
@@ -1001,14 +1037,16 @@
"execution_count": 19,
"id": "00e8b329",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:52.049058Z",
- "iopub.status.busy": "2024-02-19T13:47:52.048820Z",
- "iopub.status.idle": "2024-02-19T13:47:52.065668Z",
- "shell.execute_reply": "2024-02-19T13:47:52.064968Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:25.718425Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.718290Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.738958Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.738633Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [],
"source": [
@@ -1057,19 +1095,21 @@
"execution_count": 20,
"id": "f8c1a6c4",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:52.068527Z",
- "iopub.status.busy": "2024-02-19T13:47:52.068297Z",
- "iopub.status.idle": "2024-02-19T13:47:52.199742Z",
- "shell.execute_reply": "2024-02-19T13:47:52.199164Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:25.742441Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.742326Z",
+ "iopub.status.idle": "2024-05-24T12:37:25.860399Z",
+ "shell.execute_reply": "2024-05-24T12:37:25.858077Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
"data": {
- "image/png": "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CMI6yOAQBEEQBGEdZHAsYv/+/WhsbEQsFkMsFkNjYyMOHDjguk1RUVHOv5/97Gdd63z1q1/t9vnMmTMFnw07fs778ssv73ZOdXV1Geskk0l8//vfR3l5Ofr06YPzzz8fu3btEngm3vB63p2dnfjP//xPjBo1Cn369MHAgQPxrW99C7t3Z75LR8f2XrJkCYYOHYqSkhLU1tbi5Zdfdl3/xRdfRG1tLUpKSvDFL34Rv/nNb7qts3LlSowYMQLRaBQjRozAqlWrRB2+b7yc95NPPonJkyejX79+KCsrQ319PZ577rmMdZYtW5azv7e3B38/HE+8nPfatWtzntOWLVsy1rOtvXPFsKKiIpxyyild65jS3sJwCGuYMmWKM3LkSGfdunXOunXrnJEjRzrnnXee6zatra0Zf/fff79TVFTkbN++vWudM88805kzZ07GegcOHBB9Osz4Oe9Zs2Y5U6ZMyTinffv2Zawzd+5c5wtf+ILT1NTkbNy40TnrrLOcU0891Tl8+LDI02HG63kfOHDAmTRpkrNixQpny5YtTnNzszN+/HintrY2Yz3d2vuxxx5zevXq5dx3333O5s2bnWuuucbp06eP88EHH+Rc/+9//7tz3HHHOddcc42zefNm57777nN69erlPPHEE13rrFu3zikuLnZuueUW591333VuueUWp2fPns769etlnVZBvJ73Nddc49x2223Oa6+95rz33nvO/PnznV69ejkbN27sWue3v/2tU1ZW1q3f64TX837hhRccAM7WrVszzim9n9rY3gcOHMg43507dzp9+/Z1brrppq51TGhvkZDBsYTNmzc7ADI6bHNzswPA2bJlC/N+LrjgAufss8/OWHbmmWc611xzDa9D5Yrf8541a5ZzwQUX5P38wIEDTq9evZzHHnusa9mHH37o9OjRw1mzZg2XYw8Cr/Z+7bXXHAAZQVS39h43bpwzd+7cjGU1NTXO9ddfn3P9//iP/3Bqamoylv37v/+7U1dX1/Xv6dOnO1OmTMlY59xzz3VmzpzJ6aiD4/W8czFixAhn4cKFXf/+7W9/68RiMV6HKASv550yOPv378+7zzC096pVq5yioiLn/fff71pmQnuLhKaoLKG5uRmxWAzjx4/vWlZXV4dYLIZ169Yx7eOjjz7CM888g9mzZ3f7bPny5SgvL8cpp5yC6667DgcPHuR27EEIct5r165F//79cdJJJ2HOnDnYs2dP12cbNmxAZ2cnGhoaupYNHDgQI0eOZP49RcKjvQEgHo+jqKgIxx9/fMZyXdq7o6MDGzZsyGgHAGhoaMh7ns3Nzd3WP/fcc/HGG2+gs7PTdR0d2hbwd97ZHD16FAcPHkTfvn0zlh86dAjV1dUYNGgQzjvvPLz55pvcjjsoQc579OjRGDBgAM455xy88MILGZ+Fob2XLl2KSZMmobq6OmO5zu0tmlC+bNNG2tra0L9//27L+/fvj7a2NqZ9PPDAAygtLcU3vvGNjOWXXXYZhg4disrKSrzzzjuYP38+3nrrLTQ1NXE59iD4Pe+pU6fikksuQXV1NXbs2IEbb7wRZ599NjZs2IBoNIq2tjZEIhGccMIJGdtVVFQw/54i4dHe7e3tuP7663HppZdmvKhPp/beu3cvjhw5goqKiozlbu3Q1taWc/3Dhw9j7969GDBgQN51dGhbwN95Z/OLX/wCn3zyCaZPn961rKamBsuWLcOoUaOQSCRw++23Y+LEiXjrrbdw4okncj0HP/g57wEDBuDee+9FbW0tkskkHnroIZxzzjlYu3YtzjjjDAD5NWFLe7e2tuLZZ5/FI488krFc9/YWDRkczVmwYAEWLlzous7rr78O4NgFw9k4jpNzeS7uv/9+XHbZZSgpKclYPmfOnK7/HzlyJE488USMHTsWGzduxJgxY5j27RXR5z1jxoyu/x85ciTGjh2L6upqPPPMM90Mnpf9BkVWe3d2dmLmzJk4evQolixZkvGZivYuRPY5FTrPXOtnL/e6TxX4PcZHH30UCxYswFNPPZVhhOvq6jIupp84cSLGjBmDO++8E3fccQe/Aw+Il/MePnw4hg8f3vXv+vp67Ny5Ez//+c+7DI7XfarC7zEuW7YMxx9/PC688MKM5aa0tyjI4GjOVVddVfAOliFDhuDtt9/GRx991O2zjz/+uNuoIBcvv/wytm7dihUrVhRcd8yYMejVqxe2bdsmLOHJOu8UAwYMQHV1NbZt2wYAqKysREdHB/bv359RxdmzZw8mTJjAvF+vyDjvzs5OTJ8+HTt27MCf/vSnjOpNLmS0dz7Ky8tRXFzcbRS7Z8+evOdZWVmZc/2ePXvi85//vOs6XjQjEj/nnWLFihWYPXs2Hn/8cUyaNMl13R49euDLX/5yl+5VE+S806mrq8PDDz/c9W+b29txHNx///1obGxEJBJxXVe39haOmkt/CN6kLjp99dVXu5atX7+e+aLTWbNmdbubJh9/+ctfHADOiy++6Pt4eRH0vFPs3bvXiUajzgMPPOA4zmcXGa9YsaJrnd27d2t3kbHX8+7o6HAuvPBC55RTTnH27NnD9F2q23vcuHHOd77znYxlJ598sutFxieffHLGsrlz53a7yHjq1KkZ60yZMkW7i069nLfjOM4jjzzilJSUOKtWrWL6jqNHjzpjx451vv3tbwc5VK74Oe9sLr74Yuess87q+ret7e04n11k/Ze//KXgd+jY3iIhg2MRU6ZMcb70pS85zc3NTnNzszNq1Khutw0PHz7cefLJJzOWxeNx57jjjnPuvvvubvv829/+5ixcuNB5/fXXnR07djjPPPOMU1NT44wePVqr26W9nPfBgwedH/7wh866deucHTt2OC+88IJTX1/vfOELX3ASiUTXNnPnznUGDRrkPP/8887GjRuds88+W7vbxL2cd2dnp3P++ec7gwYNcjZt2pRx22gymXQcR8/2Tt0+u3TpUmfz5s3Otdde6/Tp06frbpHrr7/eaWxs7Fo/dZv4D37wA2fz5s3O0qVLu90m/uc//9kpLi52br31Vufdd991br31Vm1vG2Y970ceecTp2bOnc9ddd+W9xX/BggXOmjVrnO3btztvvvmm8+1vf9vp2bNnhlFWjdfz/tWvfuWsWrXKee+995x33nnHuf766x0AzsqVK7vWsbG9U3zzm990xo8fn3OfJrS3SMjgWMS+ffucyy67zCktLXVKS0udyy67rNutkwCc3/72txnL7rnnHqd37945n3XS0tLinHHGGU7fvn2dSCTiDBs2zLn66qu7PTNGJV7P+x//+IfT0NDg9OvXz+nVq5czePBgZ9asWU5LS0vGNp9++qlz1VVXOX379nV69+7tnHfeed3WUYnX896xY4cDIOffCy+84DiOvu191113OdXV1U4kEnHGjBmTUU2aNWuWc+aZZ2asv3btWmf06NFOJBJxhgwZktO8P/74487w4cOdXr16OTU1NRkJURe8nPeZZ56Zs21nzZrVtc61117rDB482IlEIk6/fv2choYGZ926dRLPiA0v533bbbc5w4YNc0pKSpwTTjjB+cpXvuI888wz3fZpW3s7zrFKc+/evZ1777035/5MaW9RFDnOP6++IwiCIAiCsAR6Dg5BEARBENZBBocgCIIgCOsgg0MQBEEQhHWQwSEIgiAIwjrI4BAEQRAEYR1kcAiCIAiCsA4yOARBEARBWAcZHIIgCIIgrIMMDkEQBEEQ1kEGhyAIgiAI6yCDQxAEQRCEdZDBIQiCIAjCOv5/3i8wAahV/4cAAAAASUVORK5CYII=",
+ "image/png": "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CMI6yOAQBEEQBGEdZHAsYv/+/WhsbEQsFkMsFkNjYyMOHDjguk1RUVHOv5/97Gdd63z1q1/t9vnMmTMFnw07fs778ssv73ZOdXV1Geskk0l8//vfR3l5Ofr06YPzzz8fu3btEngm3vB63p2dnfjP//xPjBo1Cn369MHAgQPxrW99C7t3Z75LR8f2XrJkCYYOHYqSkhLU1tbi5Zdfdl3/xRdfRG1tLUpKSvDFL34Rv/nNb7qts3LlSowYMQLRaBQjRozAqlWrRB2+b7yc95NPPonJkyejX79+KCsrQ319PZ577rmMdZYtW5azv7e3B38/HE+8nPfatWtzntOWLVsy1rOtvXPFsKKiIpxyyild65jS3sJwCGuYMmWKM3LkSGfdunXOunXrnJEjRzrnnXee6zatra0Zf/fff79TVFTkbN++vWudM88805kzZ07GegcOHBB9Osz4Oe9Zs2Y5U6ZMyTinffv2Zawzd+5c5wtf+ILT1NTkbNy40TnrrLOcU0891Tl8+LDI02HG63kfOHDAmTRpkrNixQpny5YtTnNzszN+/HintrY2Yz3d2vuxxx5zevXq5dx3333O5s2bnWuuucbp06eP88EHH+Rc/+9//7tz3HHHOddcc42zefNm57777nN69erlPPHEE13rrFu3zikuLnZuueUW591333VuueUWp2fPns769etlnVZBvJ73Nddc49x2223Oa6+95rz33nvO/PnznV69ejkbN27sWue3v/2tU1ZW1q3f64TX837hhRccAM7WrVszzim9n9rY3gcOHMg43507dzp9+/Z1brrppq51TGhvkZDBsYTNmzc7ADI6bHNzswPA2bJlC/N+LrjgAufss8/OWHbmmWc611xzDa9D5Yrf8541a5ZzwQUX5P38wIEDTq9evZzHHnusa9mHH37o9OjRw1mzZg2XYw8Cr/Z+7bXXHAAZQVS39h43bpwzd+7cjGU1NTXO9ddfn3P9//iP/3Bqamoylv37v/+7U1dX1/Xv6dOnO1OmTMlY59xzz3VmzpzJ6aiD4/W8czFixAhn4cKFXf/+7W9/68RiMV6HKASv550yOPv378+7zzC096pVq5yioiLn/fff71pmQnuLhKaoLKG5uRmxWAzjx4/vWlZXV4dYLIZ169Yx7eOjjz7CM888g9mzZ3f7bPny5SgvL8cpp5yC6667DgcPHuR27EEIct5r165F//79cdJJJ2HOnDnYs2dP12cbNmxAZ2cnGhoaupYNHDgQI0eOZP49RcKjvQEgHo+jqKgIxx9/fMZyXdq7o6MDGzZsyGgHAGhoaMh7ns3Nzd3WP/fcc/HGG2+gs7PTdR0d2hbwd97ZHD16FAcPHkTfvn0zlh86dAjV1dUYNGgQzjvvPLz55pvcjjsoQc579OjRGDBgAM455xy88MILGZ+Fob2XLl2KSZMmobq6OmO5zu0tmlC+bNNG2tra0L9//27L+/fvj7a2NqZ9PPDAAygtLcU3vvGNjOWXXXYZhg4disrKSrzzzjuYP38+3nrrLTQ1NXE59iD4Pe+pU6fikksuQXV1NXbs2IEbb7wRZ599NjZs2IBoNIq2tjZEIhGccMIJGdtVVFQw/54i4dHe7e3tuP7663HppZdmvKhPp/beu3cvjhw5goqKiozlbu3Q1taWc/3Dhw9j7969GDBgQN51dGhbwN95Z/OLX/wCn3zyCaZPn961rKamBsuWLcOoUaOQSCRw++23Y+LEiXjrrbdw4okncj0HP/g57wEDBuDee+9FbW0tkskkHnroIZxzzjlYu3YtzjjjDAD5NWFLe7e2tuLZZ5/FI488krFc9/YWDRkczVmwYAEWLlzous7rr78O4NgFw9k4jpNzeS7uv/9+XHbZZSgpKclYPmfOnK7/HzlyJE488USMHTsWGzduxJgxY5j27RXR5z1jxoyu/x85ciTGjh2L6upqPPPMM90Mnpf9BkVWe3d2dmLmzJk4evQolixZkvGZivYuRPY5FTrPXOtnL/e6TxX4PcZHH30UCxYswFNPPZVhhOvq6jIupp84cSLGjBmDO++8E3fccQe/Aw+Il/MePnw4hg8f3vXv+vp67Ny5Ez//+c+7DI7XfarC7zEuW7YMxx9/PC688MKM5aa0tyjI4GjOVVddVfAOliFDhuDtt9/GRx991O2zjz/+uNuoIBcvv/wytm7dihUrVhRcd8yYMejVqxe2bdsmLOHJOu8UAwYMQHV1NbZt2wYAqKysREdHB/bv359RxdmzZw8mTJjAvF+vyDjvzs5OTJ8+HTt27MCf/vSnjOpNLmS0dz7Ky8tRXFzcbRS7Z8+evOdZWVmZc/2ePXvi85//vOs6XjQjEj/nnWLFihWYPXs2Hn/8cUyaNMl13R49euDLX/5yl+5VE+S806mrq8PDDz/c9W+b29txHNx///1obGxEJBJxXVe39haOmkt/CN6kLjp99dVXu5atX7+e+aLTWbNmdbubJh9/+ctfHADOiy++6Pt4eRH0vFPs3bvXiUajzgMPPOA4zmcXGa9YsaJrnd27d2t3kbHX8+7o6HAuvPBC55RTTnH27NnD9F2q23vcuHHOd77znYxlJ598sutFxieffHLGsrlz53a7yHjq1KkZ60yZMkW7i069nLfjOM4jjzzilJSUOKtWrWL6jqNHjzpjx451vv3tbwc5VK74Oe9sLr74Yuess87q+ret7e04n11k/Ze//KXgd+jY3iIhg2MRU6ZMcb70pS85zc3NTnNzszNq1Khutw0PHz7cefLJJzOWxeNx57jjjnPuvvvubvv829/+5ixcuNB5/fXXnR07djjPPPOMU1NT44wePVqr26W9nPfBgwedH/7wh866deucHTt2OC+88IJTX1/vfOELX3ASiUTXNnPnznUGDRrkPP/8887GjRuds88+W7vbxL2cd2dnp3P++ec7gwYNcjZt2pRx22gymXQcR8/2Tt0+u3TpUmfz5s3Otdde6/Tp06frbpHrr7/eaWxs7Fo/dZv4D37wA2fz5s3O0qVLu90m/uc//9kpLi52br31Vufdd991br31Vm1vG2Y970ceecTp2bOnc9ddd+W9xX/BggXOmjVrnO3btztvvvmm8+1vf9vp2bNnhlFWjdfz/tWvfuWsWrXKee+995x33nnHuf766x0AzsqVK7vWsbG9U3zzm990xo8fn3OfJrS3SMjgWMS+ffucyy67zCktLXVKS0udyy67rNutkwCc3/72txnL7rnnHqd37945n3XS0tLinHHGGU7fvn2dSCTiDBs2zLn66qu7PTNGJV7P+x//+IfT0NDg9OvXz+nVq5czePBgZ9asWU5LS0vGNp9++qlz1VVXOX379nV69+7tnHfeed3WUYnX896xY4cDIOffCy+84DiOvu191113OdXV1U4kEnHGjBmTUU2aNWuWc+aZZ2asv3btWmf06NFOJBJxhgwZktO8P/74487w4cOdXr16OTU1NRkJURe8nPeZZ56Zs21nzZrVtc61117rDB482IlEIk6/fv2choYGZ926dRLPiA0v533bbbc5w4YNc0pKSpwTTjjB+cpXvuI888wz3fZpW3s7zrFKc+/evZ1777035/5MaW9RFDnOP6++IwiCIAiCsAR6Dg5BEARBENZBBocgCIIgCOsgg0MQBEEQhHWQwSEIgiAIwjrI4BAEQRAEYR1kcAiCIAiCsA4yOARBEARBWAcZHIIgCIIgrIMMDkEQBEEQ1kEGhyAIgiAI6yCDQxAEQRCEdZDBIQiCIAjCOv5/3i8wAahV/4cAAAAASUVORK5CYII=",
"text/plain": [
""
]
@@ -1105,19 +1145,21 @@
"execution_count": 21,
"id": "6f50c502",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:52.202908Z",
- "iopub.status.busy": "2024-02-19T13:47:52.202557Z",
- "iopub.status.idle": "2024-02-19T13:47:52.577756Z",
- "shell.execute_reply": "2024-02-19T13:47:52.577252Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:25.864167Z",
+ "iopub.status.busy": "2024-05-24T12:37:25.863483Z",
+ "iopub.status.idle": "2024-05-24T12:37:26.030734Z",
+ "shell.execute_reply": "2024-05-24T12:37:26.030410Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
"data": {
- "image/png": "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kR/DgwcPmlGjRpnly5ebDz74wFRXV5vhw4ebwsLCsHnxegyXLVtmkpOTzRNPPGG2bdtmbr/9dpOWlmZ2797d4vx//etfplu3bub2228327ZtM0888YRJTk42f/zjH0NzqqqqTOfOnc19991n3n//fXPfffeZpKQks2nTJtvXc6Jo13f77beb+++/37z++uvmww8/NLNmzTLJycnmzTffDM156qmnTHp6esTfZrxEu8b169cbSWb79u1h9Tf/e0rkx/DgwYNh69q7d6/p2bOnmT17dmiO0x7DNWvWmJ///OdmxYoVRpJZtWpVm/Od8HdIg3MKnnrqqXY1OMePHzdZWVlm3rx5obEvvvjCeL1e8/jjjxtjvvyHnpycbJYtWxaas2/fPtOpUyezdu1ay2tvy7Zt24yksH9c1dXVRpL54IMP2h3nuuuuM1dccUXY2MiRI83tt99uVamn5FTX5/P5zHXXXdfq/W58DF9//XUjKewJOl6P4UUXXWSmTJkSNta/f39z9913tzj/rrvuMv379w8b+8///E9TVFQUuj1u3DgzZsyYsDmjR482EyZMsKjq9ot2fS0ZOHCgKSsrC91u73NUrES7xqYG58CBA63GdNNjuGrVKuPxeMyuXbtCY057DJtrT4PjhL9DXqKy0c6dO1VXV6eSkpLQWGpqqkaOHKmqqipJ0pYtW9TY2Bg2p0+fPiooKAjNiZXq6mp5vV4NHz48NFZUVCSv19vuWj755BOtXr1akyZNirhvyZIlysjI0KBBg3TnnXeGruoeKx1Z34YNG9S7d2+df/75mjx5svbv3x+6z22PoSQFAgF5PJ6Il2Jj/RgeOXJEW7ZsCfvdSlJJSUmr66muro6YP3r0aG3evFmNjY1tzon143Uq6zvR8ePHdejQIfXs2TNsvL6+Xrm5uTr77LM1duxY1dTUWFZ3NDqyxiFDhig7O1tXXnml1q9fH3afmx7DxYsXa9SoUcrNzQ0bd8pjeCqc8Hd4Wl5sM1bq6uokSZmZmWHjmZmZ2r17d2hOSkqKzjzzzIg5TfvHSl1dnXr37h0x3rt373bXUlFRoR49eujb3/522PjNN9+svn37KisrS++++65mzZqlt956S5WVlZbU3h6nur6rr75a3/nOd5Sbm6udO3fql7/8pa644gpt2bJFqamprnsMv/jiC91999266aabwi6SF4/H0O/369ixYy3+DbW2nrq6uhbnHz16VH6/X9nZ2a3OifXjdSrrO9Fvf/tbHT58WOPGjQuN9e/fX+Xl5Ro8eLCCwaB+97vf6eKLL9Zbb72lfv36WbqGkzmVNWZnZ2vRokUqLCxUQ0ODnnnmGV155ZXasGGDLr30UkmtP86J9hjW1tbqxRdf1HPPPRc27qTH8FQ44e/wtG9w5syZo7KysjbnvPHGGxo2bNgp5/B4PGG3jTERYydqz5z2au8apchao63lySef1M0336wuXbqEjU+ePDn0c0FBgfr166dhw4bpzTff1NChQ9sVuzV2r2/8+PGhnwsKCjRs2DDl5uZq9erVEY1cNHGjEavHsLGxURMmTNDx48e1cOHCsPvsfAxPJtq/oZbmnzh+Kn+XdjnVWpYuXao5c+bo+eefD2tsi4qKwt4If/HFF2vo0KF6+OGH9dBDD1lXeBSiWWN+fr7y8/NDt4uLi7V371795je/CTU40ca026nWUl5erjPOOEPXX3992LgTH8Noxfvv8LRvcG677baTfhIkLy/vlGJnZWVJ+rKTzc7ODo3v378/1LVmZWXpyJEjOnDgQNgZgP3792vEiBGnlPdE7V3j22+/rU8++STivk8//TSiy27JK6+8ou3bt2v58uUnnTt06FAlJydrx44dHT44xmp9TbKzs5Wbm6sdO3ZIcs9j2NjYqHHjxmnnzp3629/+Fnb2piVWPoatycjIUOfOnSP+R9f8b+hEWVlZLc5PSkrSWWed1eacaP4dWOFU1tdk+fLlmjRpkv7whz9o1KhRbc7t1KmTvv71r4f+zcZSR9bYXFFRkZ599tnQbTc8hsYYPfnkkyotLVVKSkqbc+P5GJ4KR/wdWvJOntNMtG8yvv/++0NjDQ0NLb7JePny5aE5H3/8cVzfoPraa6+FxjZt2tTuN6j6fL6IT9605p133jGSzMaNG0+53mh1dH1N/H6/SU1NNRUVFcYYdzyGR44cMddff70ZNGiQ2b9/f7tyxeoxvOiii8wPf/jDsLEBAwa0+SbjAQMGhI1NmTIl4s2NV199ddicMWPGxO0NqtGszxhjnnvuOdOlS5eTvtGzyfHjx82wYcPMD37wg46UespOZY0nuuGGG8zll18eup3oj6Ex///N1O+8885Jc8T7MWxO7XyTcbz/DmlworB7925TU1NjysrKTPfu3U1NTY2pqakxhw4dCs3Jz883K1euDN2eN2+e8Xq9ZuXKleadd94x3/3ud1v8mPjZZ59t1q1bZ958801zxRVXxPUjxhdccIGprq421dXVZvDgwREfMT5xjcYYEwgETLdu3cxjjz0WEfMf//iHKSsrM2+88YbZuXOnWb16tenfv78ZMmRIzNcY7foOHTpkfvzjH5uqqiqzc+dOs379elNcXGy+8pWvuOYxbGxsNNdee605++yzzdatW8M+ktrQ0GCMie9j2PQR3MWLF5tt27aZGTNmmLS0tNAnTu6++25TWloamt/08dQ77rjDbNu2zSxevDji46l///vfTefOnc28efPM+++/b+bNmxf3jxi3d33PPfecSUpKMo8++mirH9mfM2eOWbt2rfnnP/9pampqzA9+8AOTlJQU1vjGUrRrfPDBB82qVavMhx9+aN59911z9913G0lmxYoVoTmJ/Bg2+d73vmeGDx/eYkynPYaHDh0KHfMkmfnz55uamprQJy2d+HdIgxMFn89nJEVs69evD82RZJ566qnQ7ePHj5vZs2ebrKwsk5qaai699NKIbv3zzz83t912m+nZs6fp2rWrGTt2rNmzZ0+MVhXus88+MzfffLPp0aOH6dGjh7n55psjPqp54hqNMeb3v/+96dq1a4vfi7Jnzx5z6aWXmp49e5qUlBRz3nnnmenTp0d8l0wsRLu+f//736akpMT06tXLJCcnm3POOcf4fL6IxyeRH8OdO3e2+O+6+b/teD+Gjz76qMnNzTUpKSlm6NChYWeNfD6fGTlyZNj8DRs2mCFDhpiUlBSTl5fXYuP9hz/8weTn55vk5GTTv3//sINnrEWzvpEjR7b4WPl8vtCcGTNmmHPOOcekpKSYXr16mZKSElNVVRXDFUWKZo3333+/Oe+880yXLl3MmWeeaf7P//k/ZvXq1RExE/UxNObLM79du3Y1ixYtajGe0x7DprNNrf27c+LfoceY//euHwAAAJfge3AAAIDr0OAAAADXocEBAACuQ4MDAABchwYHAAC4Dg0OAABwHRocAADgOjQ4AADAdWhwAACA69DgAAAA16HBAQAArkODAwAAXOf/Ar/MubUKBKVLAAAAAElFTkSuQmCC",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAGdCAYAAAAfTAk2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA+eUlEQVR4nO3de3RU9bn/8c9ALkAgoxhIQo0JWgyXoIVQSfCneMGALV5aLVBtOvQgHgoWkVorvRyIXQrWFqkXtLjQREXgtEC1B6SGFlCboILBG4q05SYm4nhghlANAb6/P/xlfhkmCRmy98yezfu11l4r853vfp7nmyGzH/ZctscYYwQAAOAineJdAAAAgNVocAAAgOvQ4AAAANehwQEAAK5DgwMAAFyHBgcAALgODQ4AAHAdGhwAAOA6SfEuIB6OHz+ujz/+WD169JDH44l3OQAAoB2MMTp06JD69OmjTp3aPkdzWjY4H3/8sXJycuJdBgAAOAV79+7V2Wef3eac07LB6dGjh6Qvf0Hp6elxrgYAALRHMBhUTk5O6DjeltOywWl6WSo9PZ0GBwCABNOet5fwJmMAAOA6NDgAAMB1aHAAAIDr0OAAAADXocEBAACuQ4MDAABchwYHAAC4Dg0OAABwHRocAADgOrY2OC+//LKuueYa9enTRx6PR3/6059Ous/GjRtVWFioLl266Nxzz9Xjjz8eMWfFihUaOHCgUlNTNXDgQK1atcqG6gEAQKKytcE5fPiwLrzwQj3yyCPtmr9z50594xvf0CWXXKKamhr97Gc/0/Tp07VixYrQnOrqao0fP16lpaV66623VFpaqnHjxum1116zaxkAACDBeIwxJiaJPB6tWrVK119/fatzfvrTn+qFF17Q+++/HxqbMmWK3nrrLVVXV0uSxo8fr2AwqBdffDE0Z8yYMTrzzDO1dOnSdtUSDAbl9XoVCAQsvRbVp59+qp/85CeSpKSkJHk8HhljdPTo0bCx1kQz184YdsaLVw4n5HRSfqfVQS3OryXedcQ6f6I+93U0phXHrObjDzzwgHr16hX1OloTzfHbURfbrK6uVklJSdjY6NGjtXjxYjU2Nio5OVnV1dW64447IuYsWLCg1bgNDQ1qaGgI3Q4Gg5bW3eQnP/mJKioqbIkNAEAiKi8vj0teR73JuK6uTpmZmWFjmZmZOnr0qPx+f5tz6urqWo07d+5ceb3e0JaTk2N98QAAwDEcdQZHirwEetMraM3HW5rT1mm0WbNmaebMmaHbwWDQlianrKwsdAbH5/MpOTlZjY2NEWOtiWaunTHsjBevHE7I6aT8TquDWpxfS7zriHX+RH3u62hMK45ZzcfLysqiXoNlTIxIMqtWrWpzziWXXGKmT58eNrZy5UqTlJRkjhw5YowxJicnx8yfPz9szvz5880555zT7loCgYCRZAKBQLv3aY/6+nojyUgy9fX1rY5Fs78VNXSE1fHilcMJOZ2U32l1UIvza4l3HbHOn6jPfR2NacUxy87fXTTHb0edwSkuLtaf//znsLGXXnpJw4YNC3WGxcXFqqysDHsfzksvvaQRI0bEtNaWNL2MJknTpk0LncE5caw10cy1M4ad8eKVwwk5nZTfaXVQi/NriXcdsc6fqM99HY1pxTGr+bjf71daWlpUNVjG0tbqBIcOHTI1NTWmpqbGSDLz5883NTU1Zvfu3cYYY+6++25TWloamv+vf/3LdOvWzdxxxx1m27ZtZvHixSY5Odn88Y9/DM35+9//bjp37mzmzZtn3n//fTNv3jyTlJRkNm3a1O667DqD4/P5Ql0rGxsbGxvb6b75fD5Lj7PRHL9tbXDWr1/f5oJ9Pp8ZOXJk2D4bNmwwQ4YMMSkpKSYvL8889thjEXH/8Ic/mPz8fJOcnGz69+9vVqxYEVVdNDhsbGxsbGz2b/FscGL2PThOYtf34OzevVt5eXmSeJOx03I4IaeT8jutDmpxfi3xroM3GccmptVvMt61a5dyc3OjXkdrojl+0+BY2OAcPnxY3bt3lyTV19crLS2txbFo9reiho6wOl68cjghp5PyO60OanF+LfGuI9b5E/W5r6MxrThm2fm7i+b47ajvwQEAALACDQ4AAHAdGhwAAOA6jvoenETH9+A4N4cTcjopv9PqoBbn1xLvOvgenNjEdNP34PAmYwvfZDxx4kQutgkAwP/j8/ksvdgmbzIGAACnNc7g8D04MY0XrxxOyOmk/E6rg1qcX0u86+B7cGITk+/BSXB8D0784sUrhxNyOim/0+qgFufXEu86+B6c2MTke3AAAAAcjAYHAAC4Dg0OAABwHRocAADgOjQ4AADAdWhwAACA69DgAAAA1+FaVBbiWlTOzeGEnE7K77Q6qMX5tcS7Dq5FFZuYXIsqwXEtKgAA7Me1qAAAACzEGRyuRRXTePHK4YScTsrvtDqoxfm1xLsOrkUVm5hciyrBcS2q+MWLVw4n5HRSfqfVQS3OryXedXAtqtjE5FpUAAAADkaDAwAAXIcGBwAAuA4NDgAAcB0aHAAA4Do0OAAAwHVocAAAgOvQ4AAAANehwQEAAK5DgwMAAFwnKRZJFi5cqAceeEC1tbUaNGiQFixYoEsuuaTFua1dkXvgwIF67733JEnl5eX6wQ9+EDHn888/V5cuXawtPgp+vz/0c9Ol46249Hw0rIhhZ7x45XBCTifld1od1OL8WuJdR6zzJ+pzX0djWnHMaj7u9/vjd6kTY7Nly5aZ5ORk88QTT5ht27aZ22+/3aSlpZndu3e3OP/gwYOmtrY2tO3du9f07NnTzJ49OzTnqaeeMunp6WHzamtr211TIBAwkkwgEOjo8sL4fD4jiY2NjY2NjU0yPp/P0uNsNMdv21+imj9/viZNmqRbbrlFAwYM0IIFC5STk6PHHnusxfler1dZWVmhbfPmzTpw4EDEGRuPxxM2Lysry+6lAACABGHrS1RHjhzRli1bdPfdd4eNl5SUqKqqql0xFi9erFGjRkVcbr2+vl65ubk6duyYvva1r+lXv/qVhgwZ0mKMhoYGNTQ0hG4Hg8EoV9I+ZWVlEZeOt+LS89GwIoad8eKVwwk5nZTfaXVQi/NriXcdsc6fqM99HY1pxTGr+XhZWVnUa7CMpeeOTrBv3z4jyfz9738PG7/33nvN+eeff9L9P/74Y9O5c2ezfPnysPHq6mrzzDPPmK1bt5qXX37Z3HDDDaZr167mww8/bDHO7NmzWzx1ZvVLVPX19aHY9fX1rY5Fs78VNXSE1fHilcMJOZ2U32l1UIvza4l3HbHOn6jPfR2NacUxy87fnaNeopK+fDmpOWNMxFhLysvLdcYZZ+j6668PGy8qKtL3vvc9XXjhhbrkkkv03//93zr//PP18MMPtxhn1qxZCgQCoW3v3r2nvBYAAOB8tr5ElZGRoc6dO6uuri5sfP/+/crMzGxzX2OMnnzySZWWliolJaXNuZ06ddLXv/517dixo8X7U1NTlZqaGl3xAAAgYdl6BiclJUWFhYWqrKwMG6+srNSIESPa3Hfjxo36xz/+oUmTJp00jzFGW7duVXZ2dofqBQAA7mD79+DMnDlTpaWlGjZsmIqLi7Vo0SLt2bNHU6ZMkfTly0f79u3T008/Hbbf4sWLNXz4cBUUFETELCsrU1FRkfr166dgMKiHHnpIW7du1aOPPmr3cgAAQAKwvcEZP368PvvsM91zzz2qra1VQUGB1qxZE/pUVG1trfbs2RO2TyAQ0IoVK/S73/2uxZgHDx7Urbfeqrq6Onm9Xg0ZMkQvv/yyLrroIruXAwAAEkBMvsl46tSpmjp1aov3lZeXR4x5vV79+9//bjXegw8+qAcffNCq8gAAgMtwLSoAAOA6NDgAAMB1aHAAAIDr0OAAAADXocEBAACuQ4MDAABchwYHAAC4Dg0OAABwnZh80d/pwu/3h36eNm2akpOT1djYGDHWmmjm2hnDznjxyuGEnE7K77Q6qMX5tcS7jljnT9Tnvo7GtOKY1Xzc7/crLS0tqhqs4jHGmLhkjqNgMCiv16tAIKD09HTL4k6cOFEVFRWWxQMAIJH5fL4Wr1hwqqI5fvMSFQAAcB3O4Fh4Bmf37t3Ky8uT9GXX2vQSVdNZnaax1kQz184YdsaLVw4n5HRSfqfVQS3OryXedcQ6f6I+93U0phXHrObju3btCl1c2wrRHL9pcCxscA4fPqzu3btLkurr65WWltbiWDT7W1FDR1gdL145nJDTSfmdVge1OL+WeNcR6/yJ+tzX0ZhWHLPs/N3xEhUAADit0eAAAADXocEBAACuQ4MDAABchwYHAAC4Dg0OAABwHRocAADgOjQ4AADAdWhwAACA69DgAAAA16HBAQAArkODAwAAXIcGBwAAuA4NDgAAcB0aHAAA4Do0OAAAwHWS4l2Am/j9/tDP06ZNU3JyshobGyPGWhPNXDtj2BkvXjmckNNJ+Z1WB7U4v5Z41xHr/In63NfRmFYcs5qP+/1+paWlRVWDVTzGGBOXzHEUDAbl9XoVCASUnp5uWdyJEyeqoqLCsngAACQyn8+n8vJyy+JFc/yOyUtUCxcuVN++fdWlSxcVFhbqlVdeaXXuhg0b5PF4IrYPPvggbN6KFSs0cOBApaamauDAgVq1apXdywAAAAnC9peoli9frhkzZmjhwoW6+OKL9fvf/15XX321tm3bpnPOOafV/bZv3x7WnfXq1Sv0c3V1tcaPH69f/epX+ta3vqVVq1Zp3LhxevXVVzV8+HBb19OWsrKy0Bkcn88XeonqxLHWRDPXzhh2xotXDifkdFJ+p9VBLc6vJd51xDp/oj73dTSmFces5uNlZWVRr8EyxmYXXXSRmTJlSthY//79zd13393i/PXr1xtJ5sCBA63GHDdunBkzZkzY2OjRo82ECRPaVVMgEDCSTCAQaNf89qqvrzeSjCRTX1/f6lg0+1tRQ0dYHS9eOZyQ00n5nVYHtTi/lnjXEev8ifrc19GYVhyz7PzdRXP8tvUlqiNHjmjLli0qKSkJGy8pKVFVVVWb+w4ZMkTZ2dm68sortX79+rD7qqurI2KOHj261ZgNDQ0KBoNhGwAAcC9bGxy/369jx44pMzMzbDwzM1N1dXUt7pOdna1FixZpxYoVWrlypfLz83XllVfq5ZdfDs2pq6uLKubcuXPl9XpDW05OTgdXBgAAnCwmHxP3eDxht40xEWNN8vPzlZ+fH7pdXFysvXv36je/+Y0uvfTSU4o5a9YszZw5M3Q7GAzS5AAA4GK2nsHJyMhQ586dI86s7N+/P+IMTFuKioq0Y8eO0O2srKyoYqampio9PT1sAwAA7mVrg5OSkqLCwkJVVlaGjVdWVmrEiBHtjlNTU6Ps7OzQ7eLi4oiYL730UlQxAQCAe9n+EtXMmTNVWlqqYcOGqbi4WIsWLdKePXs0ZcoUSV++fLRv3z49/fTTkqQFCxYoLy9PgwYN0pEjR/Tss89qxYoVWrFiRSjm7bffrksvvVT333+/rrvuOj3//PNat26dXn31VbuXAwAAEoDtDc748eP12Wef6Z577lFtba0KCgq0Zs0a5ebmSpJqa2u1Z8+e0PwjR47ozjvv1L59+9S1a1cNGjRIq1ev1je+8Y3QnBEjRmjZsmX6xS9+oV/+8pc677zztHz58rh+Bw4AAHCOmLzJeOrUqZo6dWqL9534Fc533XWX7rrrrpPGvPHGG3XjjTdaUR4AAHAZriYOAABchwYHAAC4Dg0OAABwHRocAADgOjQ4AADAdWhwAACA69DgAAAA16HBAQAArkODAwAAXIcGBwAAuA4NDgAAcJ2YXIvqdOH3+0M/T5s2TcnJyWpsbIwYa000c+2MYWe8eOVwQk4n5XdaHdTi/FriXUes8yfqc19HY1pxzGo+7vf7lZaWFlUNVvEYY0xcMsdRMBiU1+tVIBBQenq6ZXEnTpyoiooKy+IBAJDIfD5fxEW1OyKa4zcvUQEAANfhDI6FZ3B2796tvLw8SV92rU0vUTWd1Wkaa000c+2MYWe8eOVwQk4n5XdaHdTi/FriXUes8yfqc19HY1pxzGo+vmvXLuXm5ka9jtZEc/ymwbGwwTl8+LC6d+8uSaqvr1daWlqLY9Hsb0UNHWF1vHjlcEJOJ+V3Wh3U4vxa4l1HrPMn6nNfR2Naccyy83fHS1QAAOC0RoMDAABchwYHAAC4Dg0OAABwHRocAADgOjQ4AADAdWhwAACA69DgAAAA16HBAQAArkODAwAAXIcGBwAAuA4NDgAAcB0aHAAA4Do0OAAAwHVocAAAgOvEpMFZuHCh+vbtqy5duqiwsFCvvPJKq3NXrlypq666Sr169VJ6erqKi4v1l7/8JWxOeXm5PB5PxPbFF1/YvRQAAJAAbG9wli9frhkzZujnP/+5ampqdMkll+jqq6/Wnj17Wpz/8ssv66qrrtKaNWu0ZcsWXX755brmmmtUU1MTNi89PV21tbVhW5cuXexeDgAASABJdieYP3++Jk2apFtuuUWStGDBAv3lL3/RY489prlz50bMX7BgQdjt++67T88//7z+/Oc/a8iQIaFxj8ejrKwsW2sHAACJydYzOEeOHNGWLVtUUlISNl5SUqKqqqp2xTh+/LgOHTqknj17ho3X19crNzdXZ599tsaOHRtxhqe5hoYGBYPBsA0AALiXrQ2O3+/XsWPHlJmZGTaemZmpurq6dsX47W9/q8OHD2vcuHGhsf79+6u8vFwvvPCCli5dqi5duujiiy/Wjh07Wowxd+5ceb3e0JaTk3PqiwIAAI5n+0tU0pcvJzVnjIkYa8nSpUs1Z84cPf/88+rdu3dovKioSEVFRaHbF198sYYOHaqHH35YDz30UEScWbNmaebMmaHbwWDQlibH7/eHfp42bZqSk5PV2NgYMdaaaObaGcPOePHK4YScTsrvtDqoxfm1xLuOWOdP1Oe+jsa04pjVfNzv9ystLS2qGixjbNTQ0GA6d+5sVq5cGTY+ffp0c+mll7a577Jly0zXrl3N//zP/7Qr1y233GLGjBnTrrmBQMBIMoFAoF3z28vn8xlJbGxsbGxsbJLx+XyWHmejOX7b+hJVSkqKCgsLVVlZGTZeWVmpESNGtLrf0qVLNXHiRD333HP65je/edI8xhht3bpV2dnZHa4ZAAAkPttfopo5c6ZKS0s1bNgwFRcXa9GiRdqzZ4+mTJki6cuXj/bt26enn35a0pfNzfe//3397ne/U1FRUei9Ol27dpXX65UklZWVqaioSP369VMwGNRDDz2krVu36tFHH7V7OW0qKytTRUWFJMnn84VeojpxrDXRzLUzhp3x4pXDCTmdlN9pdVCL82uJdx2xzp+oz30djWnFMav5eFlZWdRrsIyl545a8eijj5rc3FyTkpJihg4dajZu3Bi6z+fzmZEjR4Zujxw58qSnuWbMmGHOOecck5KSYnr16mVKSkpMVVVVu+ux6yWq+vr6UL319fWtjkWzvxU1dITV8eKVwwk5nZTfaXVQi/NriXcdsc6fqM99HY1pxTHLzt9dNMfvmLzJeOrUqZo6dWqL95WXl4fd3rBhw0njPfjgg3rwwQctqAwAALgR16ICAACuQ4MDAABchwYHAAC4Dg0OAABwHRocAADgOjQ4AADAdWhwAACA69DgAAAA16HBAQAArkODAwAAXIcGBwAAuA4NDgAAcB0aHAAA4Do0OAAAwHVocAAAgOvQ4AAAANehwQEAAK5DgwMAAFyHBgcAALgODQ4AAHCdpHgX4CZ+vz/087Rp05ScnKzGxsaIsdZEM9fOGHbGi1cOJ+R0Un6n1UEtzq8l3nXEOn+iPvd1NKYVx6zm436/X2lpaVHVYBWPMcbEJXMcBYNBeb1eBQIBpaenWxZ34sSJqqiosCweAACJzOfzqby83LJ40Ry/eYkKAAC4DmdwLDyDs3v3buXl5Un6smtteomq6axO01hroplrZww748UrhxNyOim/0+qgFufXEu86Yp0/UZ/7OhrTimNW8/Fdu3YpNzc36nW0JprjNw2OhQ3O4cOH1b17d0lSfX290tLSWhyLZn8raugIq+PFK4cTcjopv9PqoBbn1xLvOmKdP1Gf+zoa04pjlp2/O16iAgAApzUaHAAA4Do0OAAAwHVocAAAgOvQ4AAAANehwQEAAK4TkwZn4cKF6tu3r7p06aLCwkK98sorbc7fuHGjCgsL1aVLF5177rl6/PHHI+asWLFCAwcOVGpqqgYOHKhVq1bZVT4AAEgwtjc4y5cv14wZM/Tzn/9cNTU1uuSSS3T11Vdrz549Lc7fuXOnvvGNb+iSSy5RTU2Nfvazn2n69OlasWJFaE51dbXGjx+v0tJSvfXWWyotLdW4ceP02muv2b0cAACQAGxvcObPn69Jkybplltu0YABA7RgwQLl5OTosccea3H+448/rnPOOUcLFizQgAEDdMstt+g//uM/9Jvf/CY0Z8GCBbrqqqs0a9Ys9e/fX7NmzdKVV16pBQsW2L0cAACQAGxtcI4cOaItW7aopKQkbLykpERVVVUt7lNdXR0xf/To0dq8eXPoCqWtzWktZkNDg4LBYNgGAADcy9YGx+/369ixY8rMzAwbz8zMVF1dXYv71NXVtTj/6NGj8vv9bc5pLebcuXPl9XpDW05OzqkuCQAAJICYvMnY4/GE3TbGRIydbP6J49HEnDVrlgKBQGjbu3dvVPUDAIDEkmRn8IyMDHXu3DnizMr+/fsjzsA0ycrKanF+UlKSzjrrrDbntBYzNTVVqampp7oMAACQYGw9g5OSkqLCwkJVVlaGjVdWVmrEiBEt7lNcXBwx/6WXXtKwYcNCl2JvbU5rMQEAwOnF1jM4kjRz5kyVlpZq2LBhKi4u1qJFi7Rnzx5NmTJF0pcvH+3bt09PP/20JGnKlCl65JFHNHPmTE2ePFnV1dVavHixli5dGop5++2369JLL9X999+v6667Ts8//7zWrVunV1991e7lAACABGB7gzN+/Hh99tlnuueee1RbW6uCggKtWbNGubm5kqTa2tqw78Tp27ev1qxZozvuuEOPPvqo+vTpo4ceekg33HBDaM6IESO0bNky/eIXv9Avf/lLnXfeeVq+fLmGDx9u93IAAEACsL3BkaSpU6dq6tSpLd5XXl4eMTZy5Ei9+eabbca88cYbdeONN1pRHgAAcBmuRQUAAFyHBgcAALgODQ4AAHAdGhwAAOA6NDgAAMB1YvIpqtNF07WyJGnatGlKTk4OXSC0+VhroplrZww748UrhxNyOim/0+qgFufXEu86Yp0/UZ/7OhrTimNW83G/36+0tLSoarCKxzRd6Ok0EgwG5fV6FQgElJ6eblnciRMnqqKiwrJ4AAAkMp/P1+LXwZyqaI7fvEQFAABchzM4Fp7B2b17t/Ly8iR92bU2vUTVdFanaaw10cy1M4ad8eKVwwk5nZTfaXVQi/NriXcdsc6fqM99HY1pxTGr+fiuXbtCVy6wQjTHbxocCxucw4cPq3v37pKk+vp6paWltTgWzf5W1NARVseLVw4n5HRSfqfVQS3OryXedcQ6f6I+93U0phXHLDt/d7xEBQAATms0OAAAwHVocAAAgOvQ4AAAANehwQEAAK5DgwMAAFyHBgcAALgODQ4AAHAdGhwAAOA6NDgAAMB1aHAAAIDr0OAAAADXocEBAACuQ4MDAABchwYHAAC4Dg0OAABwHRocAADgOjQ4AADAdWhwAACA69DgAAAA16HBAQAArpNkZ/ADBw5o+vTpeuGFFyRJ1157rR5++GGdccYZLc5vbGzUL37xC61Zs0b/+te/5PV6NWrUKM2bN099+vQJzbvsssu0cePGsH3Hjx+vZcuW2baW9vD7/aGfp02bpuTkZDU2NkaMtSaauXbGsDNevHI4IaeT8jutDmpxfi3xriPW+RP1ua+jMa04ZjUf9/v9SktLi6oGyxgbjRkzxhQUFJiqqipTVVVlCgoKzNixY1udf/DgQTNq1CizfPly88EHH5jq6mozfPhwU1hYGDZv5MiRZvLkyaa2tja0HTx4sN11BQIBI8kEAoFTXltLfD6fkcTGxsbGxsYmGZ/PZ+lxNprjt21ncN5//32tXbtWmzZt0vDhwyVJTzzxhIqLi7V9+3bl5+dH7OP1elVZWRk29vDDD+uiiy7Snj17dM4554TGu3XrpqysLLvKBwAACcy2Bqe6ulperzfU3EhSUVGRvF6vqqqqWmxwWhIIBOTxeCJe1lqyZImeffZZZWZm6uqrr9bs2bPVo0cPK5cQtbKyMlVUVEiSfD5f6CWqE8daE81cO2PYGS9eOZyQ00n5nVYHtTi/lnjXEev8ifrc19GYVhyzmo+XlZVFvQbLWHruqJl7773X9OvXL2K8X79+5r777mtXjM8//9wUFhaam2++OWx80aJFprKy0rzzzjtm6dKlJi8vz4waNarVOF988YUJBAKhbe/eve0+xRWN+vr60Gm5+vr6Vsei2d+KGjrC6njxyuGEnE7K77Q6qMX5tcS7jljnT9Tnvo7GtOKYZefvLpqXqKL+FNWcOXPk8Xja3DZv3ixJ8ng8LTVULY6fqLGxURMmTNDx48e1cOHCsPsmT56sUaNGqaCgQBMmTNAf//hHrVu3Tm+++WaLsebOnSuv1xvacnJyol02AABIIFG/RHXbbbdpwoQJbc7Jy8vT22+/rU8++STivk8//VSZmZlt7t/Y2Khx48Zp586d+tvf/qb09PQ25w8dOlTJycnasWOHhg4dGnH/rFmzNHPmzNDtYDBIkwMAgItF3eBkZGQoIyPjpPOKi4sVCAT0+uuv66KLLpIkvfbaawoEAhoxYkSr+zU1Nzt27ND69et11llnnTTXe++9p8bGRmVnZ7d4f2pqqlJTU08aBwAAuINtX/Q3YMAAjRkzRpMnT9amTZu0adMmTZ48WWPHjg17g3H//v21atUqSdLRo0d14403avPmzVqyZImOHTumuro61dXV6ciRI5Kkf/7zn7rnnnu0efNm7dq1S2vWrNF3vvMdDRkyRBdffLFdywEAAAnE1m8yXrJkiQYPHqySkhKVlJToggsu0DPPPBM2Z/v27QoEApKkjz76SC+88II++ugjfe1rX1N2dnZoq6qqkiSlpKTor3/9q0aPHq38/HxNnz5dJSUlWrdunTp37mzncgAAQIKw9ZuMe/bsqWeffbbNOcaY0M95eXlht1uSk5MT8S3GAAAAzXEtKgAA4Do0OAAAwHVocAAAgOvQ4AAAANehwQEAAK5DgwMAAFyHBgcAALgODQ4AAHAdGhwAAOA6NDgAAMB1aHAAAIDr0OAAAADXocEBAACuQ4MDAABcJyneBbiJ3+8P/Txt2jQlJyersbExYqw10cy1M4ad8eKVwwk5nZTfaXVQi/NriXcdsc6fqM99HY1pxTGr+bjf71daWlpUNVjFY4wxcckcR8FgUF6vV4FAQOnp6ZbFnThxoioqKiyLBwBAIvP5fCovL7csXjTHb16iAgAArsMZHAvP4OzevVt5eXmSvuxam16iajqr0zTWmmjm2hnDznjxyuGEnE7K77Q6qMX5tcS7jljnT9Tnvo7GtOKY1Xx8165dys3NjXodrYnm+E2DY2GDc/jwYXXv3l2SVF9fr7S0tBbHotnfiho6wup48crhhJxOyu+0OqjF+bXEu45Y50/U576OxrTimGXn746XqAAAwGmNBgcAALgODQ4AAHAdGhwAAOA6NDgAAMB1aHAAAIDr0OAAAADXocEBAACuQ4MDAABchwYHAAC4Dg0OAABwHRocAADgOjQ4AADAdWxtcA4cOKDS0lJ5vV55vV6Vlpbq4MGDbe4zceJEeTyesK2oqChsTkNDg370ox8pIyNDaWlpuvbaa/XRRx/ZuBIAAJBIbG1wbrrpJm3dulVr167V2rVrtXXrVpWWlp50vzFjxqi2tja0rVmzJuz+GTNmaNWqVVq2bJleffVV1dfXa+zYsTp27JhdSwEAAAkkya7A77//vtauXatNmzZp+PDhkqQnnnhCxcXF2r59u/Lz81vdNzU1VVlZWS3eFwgEtHjxYj3zzDMaNWqUJOnZZ59VTk6O1q1bp9GjR1u/GAAAkFBsO4NTXV0tr9cbam4kqaioSF6vV1VVVW3uu2HDBvXu3Vvnn3++Jk+erP3794fu27JlixobG1VSUhIa69OnjwoKClqN29DQoGAwGLYBAAD3sq3BqaurU+/evSPGe/furbq6ulb3u/rqq7VkyRL97W9/029/+1u98cYbuuKKK9TQ0BCKm5KSojPPPDNsv8zMzFbjzp07N/Q+IK/Xq5ycnA6sDAAAOF3UDc6cOXMi3gR84rZ582ZJksfjidjfGNPieJPx48frm9/8pgoKCnTNNdfoxRdf1IcffqjVq1e3WVdbcWfNmqVAIBDa9u7dG8WKAQBAoon6PTi33XabJkyY0OacvLw8vf322/rkk08i7vv000+VmZnZ7nzZ2dnKzc3Vjh07JElZWVk6cuSIDhw4EHYWZ//+/RoxYkSLMVJTU5WamtrunKfK7/eHfp42bZqSk5PV2NgYMdaaaObaGcPOePHK4YScTsrvtDqoxfm1xLuOWOdP1Oe+jsa04pjVfNzv9ystLS2qGixjbLJt2zYjybz22muhsU2bNhlJ5oMPPmh3HL/fb1JTU01FRYUxxpiDBw+a5ORks3z58tCcjz/+2HTq1MmsXbu2XTEDgYCRZAKBQLvraA+fz2cksbGxsbGxsUnG5/NZepyN5vht23twBgwYoDFjxmjy5MnatGmTNm3apMmTJ2vs2LFhn6Dq37+/Vq1aJUmqr6/XnXfeqerqau3atUsbNmzQNddco4yMDH3rW9+SJHm9Xk2aNEk//vGP9de//lU1NTX63ve+p8GDB4c+VQUAAE5vtn1MXJKWLFmi6dOnhz7xdO211+qRRx4Jm7N9+3YFAgFJUufOnfXOO+/o6aef1sGDB5Wdna3LL79cy5cvV48ePUL7PPjgg0pKStK4ceP0+eef68orr1R5ebk6d+5s53JOqqysTBUVFZIkn88XeonqxLHWRDPXzhh2xotXDifkdFJ+p9VBLc6vJd51xDp/oj73dTSmFces5uNlZWVRr8EqHmOMiVv2OAkGg/J6vQoEAkpPT7cs7uHDh9W9e3dJX56NSktLa3Esmv2tqKEjrI4XrxxOyOmk/E6rg1qcX0u864h1/kR97utoTCuOWXb+7qI5fnMtKgAA4Do0OAAAwHVocAAAgOvQ4AAAANehwQEAAK5DgwMAAFyHBgcAALgODQ4AAHAdGhwAAOA6NDgAAMB1aHAAAIDr0OAAAADXocEBAACuQ4MDAABchwYHAAC4Dg0OAABwnaR4F+Amfr8/9PO0adOUnJysxsbGiLHWRDPXzhh2xotXDifkdFJ+p9VBLc6vJd51xDp/oj73dTSmFces5uN+v19paWlR1WAVjzHGxCVzHAWDQXm9XgUCAaWnp1sWd+LEiaqoqLAsHgAAiczn86m8vNyyeNEcv3mJCgAAuA5ncCw8g7N7927l5eVJ+rJrbXqJqumsTtNYa6KZa2cMO+PFK4cTcjopv9PqoBbn1xLvOmKdP1Gf+zoa04pjVvPxXbt2KTc3N+p1tCaa4zcNjoUNzuHDh9W9e3dJUn19vdLS0loci2Z/K2roCKvjxSuHE3I6Kb/T6qAW59cS7zpinT9Rn/s6GtOKY5advzteogIAAKc1GhwAAOA6NDgAAMB1aHAAAIDr0OAAAADXocEBAACuQ4MDAABchwYHAAC4Dg0OAABwHRocAADgOrY2OAcOHFBpaam8Xq+8Xq9KS0t18ODBNvfxeDwtbg888EBozmWXXRZx/4QJE+xcCgAASCBJdga/6aab9NFHH2nt2rWSpFtvvVWlpaX685//3Oo+tbW1YbdffPFFTZo0STfccEPY+OTJk3XPPfeEbnft2tXCygEAQCKzrcF5//33tXbtWm3atEnDhw+XJD3xxBMqLi7W9u3blZ+f3+J+WVlZYbeff/55XX755Tr33HPDxrt16xYxFwAAQLLxJarq6mp5vd5QcyNJRUVF8nq9qqqqaleMTz75RKtXr9akSZMi7luyZIkyMjI0aNAg3XnnnTp06FCrcRoaGhQMBsM2AADgXradwamrq1Pv3r0jxnv37q26urp2xaioqFCPHj307W9/O2z85ptvVt++fZWVlaV3331Xs2bN0ltvvaXKysoW48ydO1dlZWXRLyJKfr8/9PO0adOUnJysxsbGiLHWRDPXzhh2xotXDifkdFJ+p9VBLc6vJd51xDp/oj73dTSmFces5uN+v19paWlR1WAZE6XZs2cbSW1ub7zxhrn33nvN+eefH7H/V7/6VTN37tx25crPzze33XbbSedt3rzZSDJbtmxp8f4vvvjCBAKB0LZ3714jyQQCgXbV0V4+n++kvxs2NjY2NrbTZfP5fJYeZwOBgJHad/yO+gzObbfddtJPLOXl5entt9/WJ598EnHfp59+qszMzJPmeeWVV7R9+3YtX778pHOHDh2q5ORk7dixQ0OHDo24PzU1VampqSeNAwAA3CHqBicjI0MZGRknnVdcXKxAIKDXX39dF110kSTptddeUyAQ0IgRI066/+LFi1VYWKgLL7zwpHPfe+89NTY2Kjs7++QLsFFZWZkqKiokST6fL/QS1YljrYlmrp0x7IwXrxxOyOmk/E6rg1qcX0u864h1/kR97utoTCuOWc3HY/H2kFZZeu7oBGPGjDEXXHCBqa6uNtXV1Wbw4MFm7NixYXPy8/PNypUrw8YCgYDp1q2beeyxxyJi/uMf/zBlZWXmjTfeMDt37jSrV682/fv3N0OGDDFHjx5tV13RnOKKRn19fei0XH19fatj0exvRQ0dYXW8eOVwQk4n5XdaHdTi/FriXUes8yfqc19HY1pxzLLzdxfN8dvWL/pbsmSJBg8erJKSEpWUlOiCCy7QM888EzZn+/btCgQCYWPLli2TMUbf/e53I2KmpKTor3/9q0aPHq38/HxNnz5dJSUlWrdunTp37mzncgAAQIKw9Yv+evbsqWeffbbNOcaYiLFbb71Vt956a4vzc3JytHHjRkvqAwAA7sS1qAAAgOvQ4AAAANehwQEAAK5DgwMAAFyHBgcAALgODQ4AAHAdGhwAAOA6NDgAAMB1bP2iv9ON3+8P/dx06XgrLj0fDSti2BkvXjmckNNJ+Z1WB7U4v5Z41xHr/In63NfRmFYcs5qP+/1+paWlRVWDVTympa8SdrlgMCiv16tAIKD09HTL4k6cODF0gTEAAE53Pp9P5eXllsWL5vjNS1QAAMB1OINj4Rmc3bt3Ky8vT9L/v3S8FZeej4YVMeyMF68cTsjppPxOq4NanF9LvOuIdf5Efe7raEwrjlnNx3ft2qXc3Nyo19GaaI7fNDgWNjiHDx9W9+7dJUn19fVKS0trcSya/a2ooSOsjhevHE7I6aT8TquDWpxfS7zriHX+RH3u62hMK45Zdv7ueIkKAACc1mhwAACA69DgAAAA16HBAQAArkODAwAAXIcGBwAAuA4NDgAAcB2uRWUhrkXl3BxOyOmk/E6rg1qcX0u86+BaVLGJybWoEhzXogIAwH5ciwoAAMBCnMHhWlQxjRevHE7I6aT8TquDWpxfS7zr4FpUsYnJtagSHNeiil+8eOVwQk4n5XdaHdTi/FriXQfXoopNTK5FBQAA4GA0OAAAwHVocAAAgOvwPTgW4ntwnJvDCTmdlN9pdVCL82uJdx18D05sYvI9OAmO78EBAMB+fA8OAACAhWw9g3Pvvfdq9erV2rp1q1JSUnTw4MGT7mOMUVlZmRYtWqQDBw5o+PDhevTRRzVo0KDQnIaGBt15551aunSpPv/8c1155ZVauHChzj777HbVxffgxC9evHI4IaeT8jutDmpxfi3xroPvwYlNTDd9D46tZ3COHDmi73znO/rhD3/Y7n1+/etfa/78+XrkkUf0xhtvKCsrS1dddZUOHToUmjNjxgytWrVKy5Yt06uvvqr6+nqNHTtWx44ds2MZAAAg0ZgYeOqpp4zX6z3pvOPHj5usrCwzb9680NgXX3xhvF6vefzxx40xxhw8eNAkJyebZcuWhebs27fPdOrUyaxdu7Zd9QQCASPJBAKB6BZyEj6fz0hiY2NjY2Njk4zP57P0OBvN8dtR78HZuXOn6urqVFJSEhpLTU3VyJEjVVVVJUnasmWLGhsbw+b06dNHBQUFoTknamhoUDAYDNsAAIB7Oepj4nV1dZKkzMzMsPHMzEzt3r07NCclJUVnnnlmxJym/U80d+5clZWV2VBxuAceeCD0c1JSkjwej4wxOnr0aNhYa6KZa2cMO+PFK4cTcjopv9PqoBbn1xLvOmKdP1Gf+zoa04pjVvPx5sfFWIu6wZkzZ85Jm4U33nhDw4YNO+WiTvyFGmNO+iC1NWfWrFmaOXNm6HYwGFROTs4p19eaXr16WfpxOAAAcGqibnBuu+02TZgwoc05TZ8kilZWVpakL8/SZGdnh8b3798fOquTlZWlI0eO6MCBA2Fncfbv368RI0a0GDc1NVWpqamnVBMAAEg8UTc4GRkZysjIsKMW9e3bV1lZWaqsrNSQIUMkfflJrI0bN+r++++XJBUWFio5OVmVlZUaN26cJKm2tlbvvvuufv3rX9tSFwAASCy2vgdnz549+t///V/t2bNHx44d09atWyVJX/3qV0OXUu/fv7/mzp2rb33rW/J4PJoxY4buu+8+9evXT/369dN9992nbt266aabbpIkeb1eTZo0ST/+8Y911llnqWfPnrrzzjs1ePBgjRo1ys7lAACABGFrg/Nf//VfYZcuaDors379el122WWSpO3btysQCITm3HXXXfr88881derU0Bf9vfTSS+rRo0dozoMPPqikpCSNGzcu9EV/5eXl6ty5s53LAQAACYJrUVn4TcYAAMA+jvkmYwAAgHigwQEAAK5DgwMAAFyHBgcAALgODQ4AAHAdGhwAAOA6NDgAAMB1aHAAAIDr2PpNxk7V9N2GwWAwzpUAAID2ajput+c7ik/LBufQoUOSpJycnDhXAgAAonXo0CF5vd4255yWl2o4fvy4Pv74Y/Xo0UMej8eyuMFgUDk5Odq7d69rLwHh9jW6fX2S+9fo9vVJ7l+j29cnuX+Ndq3PGKNDhw6pT58+6tSp7XfZnJZncDp16qSzzz7btvjp6emu/AfbnNvX6Pb1Se5fo9vXJ7l/jW5fn+T+NdqxvpOduWnCm4wBAIDr0OAAAADXocGxUGpqqmbPnq3U1NR4l2Ibt6/R7euT3L9Gt69Pcv8a3b4+yf1rdML6Tss3GQMAAHfjDA4AAHAdGhwAAOA6NDgAAMB1aHAAAIDr0OBE4d5779WIESPUrVs3nXHGGe3axxijOXPmqE+fPuratasuu+wyvffee2FzGhoa9KMf/UgZGRlKS0vTtddeq48++siGFZzcgQMHVFpaKq/XK6/Xq9LSUh08eLDNfTweT4vbAw88EJpz2WWXRdw/YcIEm1cT6VTWN3HixIjai4qKwuYk8mPY2Nion/70pxo8eLDS0tLUp08fff/739fHH38cNi+ej+HChQvVt29fdenSRYWFhXrllVfanL9x40YVFhaqS5cuOvfcc/X4449HzFmxYoUGDhyo1NRUDRw4UKtWrbKr/JOKZn0rV67UVVddpV69eik9PV3FxcX6y1/+EjanvLy8xb/JL774wu6ltCqaNW7YsKHF+j/44IOweYn6GLb0nOLxeDRo0KDQHKc9hi+//LKuueYa9enTRx6PR3/6059Ouk/c/w4N2u2//uu/zPz5883MmTON1+tt1z7z5s0zPXr0MCtWrDDvvPOOGT9+vMnOzjbBYDA0Z8qUKeYrX/mKqaysNG+++aa5/PLLzYUXXmiOHj1q00paN2bMGFNQUGCqqqpMVVWVKSgoMGPHjm1zn9ra2rDtySefNB6Px/zzn/8MzRk5cqSZPHly2LyDBw/avZwIp7I+n89nxowZE1b7Z599FjYnkR/DgwcPmlGjRpnly5ebDz74wFRXV5vhw4ebwsLCsHnxegyXLVtmkpOTzRNPPGG2bdtmbr/9dpOWlmZ2797d4vx//etfplu3bub2228327ZtM0888YRJTk42f/zjH0NzqqqqTOfOnc19991n3n//fXPfffeZpKQks2nTJtvXc6Jo13f77beb+++/37z++uvmww8/NLNmzTLJycnmzTffDM156qmnTHp6esTfZrxEu8b169cbSWb79u1h9Tf/e0rkx/DgwYNh69q7d6/p2bOnmT17dmiO0x7DNWvWmJ///OdmxYoVRpJZtWpVm/Od8HdIg3MKnnrqqXY1OMePHzdZWVlm3rx5obEvvvjCeL1e8/jjjxtjvvyHnpycbJYtWxaas2/fPtOpUyezdu1ay2tvy7Zt24yksH9c1dXVRpL54IMP2h3nuuuuM1dccUXY2MiRI83tt99uVamn5FTX5/P5zHXXXdfq/W58DF9//XUjKewJOl6P4UUXXWSmTJkSNta/f39z9913tzj/rrvuMv379w8b+8///E9TVFQUuj1u3DgzZsyYsDmjR482EyZMsKjq9ot2fS0ZOHCgKSsrC91u73NUrES7xqYG58CBA63GdNNjuGrVKuPxeMyuXbtCY057DJtrT4PjhL9DXqKy0c6dO1VXV6eSkpLQWGpqqkaOHKmqqipJ0pYtW9TY2Bg2p0+fPiooKAjNiZXq6mp5vV4NHz48NFZUVCSv19vuWj755BOtXr1akyZNirhvyZIlysjI0KBBg3TnnXeGruoeKx1Z34YNG9S7d2+df/75mjx5svbv3x+6z22PoSQFAgF5PJ6Il2Jj/RgeOXJEW7ZsCfvdSlJJSUmr66muro6YP3r0aG3evFmNjY1tzon143Uq6zvR8ePHdejQIfXs2TNsvL6+Xrm5uTr77LM1duxY1dTUWFZ3NDqyxiFDhig7O1tXXnml1q9fH3afmx7DxYsXa9SoUcrNzQ0bd8pjeCqc8Hd4Wl5sM1bq6uokSZmZmWHjmZmZ2r17d2hOSkqKzjzzzIg5TfvHSl1dnXr37h0x3rt373bXUlFRoR49eujb3/522PjNN9+svn37KisrS++++65mzZqlt956S5WVlZbU3h6nur6rr75a3/nOd5Sbm6udO3fql7/8pa644gpt2bJFqamprnsMv/jiC91999266aabwi6SF4/H0O/369ixYy3+DbW2nrq6uhbnHz16VH6/X9nZ2a3OifXjdSrrO9Fvf/tbHT58WOPGjQuN9e/fX+Xl5Ro8eLCCwaB+97vf6eKLL9Zbb72lfv36WbqGkzmVNWZnZ2vRokUqLCxUQ0ODnnnmGV155ZXasGGDLr30UkmtP86J9hjW1tbqxRdf1HPPPRc27qTH8FQ44e/wtG9w5syZo7KysjbnvPHGGxo2bNgp5/B4PGG3jTERYydqz5z2au8apchao63lySef1M0336wuXbqEjU+ePDn0c0FBgfr166dhw4bpzTff1NChQ9sVuzV2r2/8+PGhnwsKCjRs2DDl5uZq9erVEY1cNHGjEavHsLGxURMmTNDx48e1cOHCsPvsfAxPJtq/oZbmnzh+Kn+XdjnVWpYuXao5c+bo+eefD2tsi4qKwt4If/HFF2vo0KF6+OGH9dBDD1lXeBSiWWN+fr7y8/NDt4uLi7V371795je/CTU40ca026nWUl5erjPOOEPXX3992LgTH8Noxfvv8LRvcG677baTfhIkLy/vlGJnZWVJ+rKTzc7ODo3v378/1LVmZWXpyJEjOnDgQNgZgP3792vEiBGnlPdE7V3j22+/rU8++STivk8//TSiy27JK6+8ou3bt2v58uUnnTt06FAlJydrx44dHT44xmp9TbKzs5Wbm6sdO3ZIcs9j2NjYqHHjxmnnzp3629/+Fnb2piVWPoatycjIUOfOnSP+R9f8b+hEWVlZLc5PSkrSWWed1eacaP4dWOFU1tdk+fLlmjRpkv7whz9o1KhRbc7t1KmTvv71r4f+zcZSR9bYXFFRkZ599tnQbTc8hsYYPfnkkyotLVVKSkqbc+P5GJ4KR/wdWvJOntNMtG8yvv/++0NjDQ0NLb7JePny5aE5H3/8cVzfoPraa6+FxjZt2tTuN6j6fL6IT9605p133jGSzMaNG0+53mh1dH1N/H6/SU1NNRUVFcYYdzyGR44cMddff70ZNGiQ2b9/f7tyxeoxvOiii8wPf/jDsLEBAwa0+SbjAQMGhI1NmTIl4s2NV199ddicMWPGxO0NqtGszxhjnnvuOdOlS5eTvtGzyfHjx82wYcPMD37wg46UespOZY0nuuGGG8zll18eup3oj6Ex///N1O+8885Jc8T7MWxO7XyTcbz/DmlworB7925TU1NjysrKTPfu3U1NTY2pqakxhw4dCs3Jz883K1euDN2eN2+e8Xq9ZuXKleadd94x3/3ud1v8mPjZZ59t1q1bZ958801zxRVXxPUjxhdccIGprq421dXVZvDgwREfMT5xjcYYEwgETLdu3cxjjz0WEfMf//iHKSsrM2+88YbZuXOnWb16tenfv78ZMmRIzNcY7foOHTpkfvzjH5uqqiqzc+dOs379elNcXGy+8pWvuOYxbGxsNNdee605++yzzdatW8M+ktrQ0GCMie9j2PQR3MWLF5tt27aZGTNmmLS0tNAnTu6++25TWloamt/08dQ77rjDbNu2zSxevDji46l///vfTefOnc28efPM+++/b+bNmxf3jxi3d33PPfecSUpKMo8++mirH9mfM2eOWbt2rfnnP/9pampqzA9+8AOTlJQU1vjGUrRrfPDBB82qVavMhx9+aN59911z9913G0lmxYoVoTmJ/Bg2+d73vmeGDx/eYkynPYaHDh0KHfMkmfnz55uamprQJy2d+HdIgxMFn89nJEVs69evD82RZJ566qnQ7ePHj5vZs2ebrKwsk5qaai699NKIbv3zzz83t912m+nZs6fp2rWrGTt2rNmzZ0+MVhXus88+MzfffLPp0aOH6dGjh7n55psjPqp54hqNMeb3v/+96dq1a4vfi7Jnzx5z6aWXmp49e5qUlBRz3nnnmenTp0d8l0wsRLu+f//736akpMT06tXLJCcnm3POOcf4fL6IxyeRH8OdO3e2+O+6+b/teD+Gjz76qMnNzTUpKSlm6NChYWeNfD6fGTlyZNj8DRs2mCFDhpiUlBSTl5fXYuP9hz/8weTn55vk5GTTv3//sINnrEWzvpEjR7b4WPl8vtCcGTNmmHPOOcekpKSYXr16mZKSElNVVRXDFUWKZo3333+/Oe+880yXLl3MmWeeaf7P//k/ZvXq1RExE/UxNObLM79du3Y1ixYtajGe0x7DprNNrf27c+LfoceY//euHwAAAJfge3AAAIDr0OAAAADXocEBAACuQ4MDAABchwYHAAC4Dg0OAABwHRocAADgOjQ4AADAdWhwAACA69DgAAAA16HBAQAArkODAwAAXOf/Ar/MubUKBKVLAAAAAElFTkSuQmCC",
"text/plain": [
""
]
@@ -1149,19 +1191,21 @@
"execution_count": 22,
"id": "f40fd289",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:52.580463Z",
- "iopub.status.busy": "2024-02-19T13:47:52.580204Z",
- "iopub.status.idle": "2024-02-19T13:47:52.703681Z",
- "shell.execute_reply": "2024-02-19T13:47:52.703212Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:26.033855Z",
+ "iopub.status.busy": "2024-05-24T12:37:26.033556Z",
+ "iopub.status.idle": "2024-05-24T12:37:26.123275Z",
+ "shell.execute_reply": "2024-05-24T12:37:26.122760Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
"data": {
- "image/png": "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sxQAMT9vvfVWeBoAylNPPRX+va2tTbnzzjuVoqIiJScnRxk7dmxMN/71118rN954o9K1a1elY8eOytSpU5W6ujpBa5XYl19+qVx99dVKXl6ekpeXp1x99dUxH3Ftv96KoiiPPfaY0rFjx7j3sqmrq1PGjh2rdO3aVcnOzlb69u2r3HTTTTH3BHKS0fX+v//7P6WyslLp1q2bkpWVpfTq1UuZNWtWzLZMte29f//+uO+LyPeGjNv74YcfVkpLS5Xs7Gxl2LBhUWewZs2apYwbNy5q+g0bNihDhw5VsrOzld69e8dt+l944QWlf//+SlZWllJWVha1M5WFkfUeN25c3O06a9as8DTz5s1TevXqpWRnZyvdunVTKisrlU2bNglcI32MrPe9996r9O3bV8nNzVXOPPNM5bvf/a7y6quvxrxmqm1vRTl9drtjx47K448/Hvf1ZN/eobNeapl18r3tUZT/P5qJiIiIiFL360OIiIiIzGBzRERERBSBzRERERFRBDZHRERERBHYHBERERFFYHNEREREFIHNEREREVEENkdEREREEdgcEREREUVgc0REREQUgc0RERERUYT/B/bcV1+lrzptAAAAAElFTkSuQmCC",
+ "image/png": "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sxQAMT9vvfVWeBoAylNPPRX+va2tTbnzzjuVoqIiJScnRxk7dmxMN/71118rN954o9K1a1elY8eOytSpU5W6ujpBa5XYl19+qVx99dVKXl6ekpeXp1x99dUxH3Ftv96KoiiPPfaY0rFjx7j3sqmrq1PGjh2rdO3aVcnOzlb69u2r3HTTTTH3BHKS0fX+v//7P6WyslLp1q2bkpWVpfTq1UuZNWtWzLZMte29f//+uO+LyPeGjNv74YcfVkpLS5Xs7Gxl2LBhUWewZs2apYwbNy5q+g0bNihDhw5VsrOzld69e8dt+l944QWlf//+SlZWllJWVha1M5WFkfUeN25c3O06a9as8DTz5s1TevXqpWRnZyvdunVTKisrlU2bNglcI32MrPe9996r9O3bV8nNzVXOPPNM5bvf/a7y6quvxrxmqm1vRTl9drtjx47K448/Hvf1ZN/eobNeapl18r3tUZT/P5qJiIiIiFL360OIiIiIzGBzRERERBSBzRERERFRBDZHRERERBHYHBERERFFYHNEREREFIHNEREREVEENkdEREREEdgcEREREUVgc0REREQUgc0RERERUYT/B/bcV1+lrzptAAAAAElFTkSuQmCC",
"text/plain": [
""
]
@@ -1225,14 +1269,16 @@
"execution_count": 23,
"id": "abe72e5b",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:52.706780Z",
- "iopub.status.busy": "2024-02-19T13:47:52.706562Z",
- "iopub.status.idle": "2024-02-19T13:47:53.048201Z",
- "shell.execute_reply": "2024-02-19T13:47:53.047098Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:26.127527Z",
+ "iopub.status.busy": "2024-05-24T12:37:26.127418Z",
+ "iopub.status.idle": "2024-05-24T12:37:26.297581Z",
+ "shell.execute_reply": "2024-05-24T12:37:26.297216Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [],
"source": [
@@ -1261,14 +1307,16 @@
"execution_count": 24,
"id": "0a65ffc2",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:53.051335Z",
- "iopub.status.busy": "2024-02-19T13:47:53.050964Z",
- "iopub.status.idle": "2024-02-19T13:47:53.065481Z",
- "shell.execute_reply": "2024-02-19T13:47:53.065018Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:26.299837Z",
+ "iopub.status.busy": "2024-05-24T12:37:26.299661Z",
+ "iopub.status.idle": "2024-05-24T12:37:26.309064Z",
+ "shell.execute_reply": "2024-05-24T12:37:26.308249Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [],
"source": [
@@ -1290,19 +1338,21 @@
"execution_count": 25,
"id": "c32f1808",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:53.067992Z",
- "iopub.status.busy": "2024-02-19T13:47:53.067810Z",
- "iopub.status.idle": "2024-02-19T13:47:53.173389Z",
- "shell.execute_reply": "2024-02-19T13:47:53.172869Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:26.311147Z",
+ "iopub.status.busy": "2024-05-24T12:37:26.311031Z",
+ "iopub.status.idle": "2024-05-24T12:37:26.379378Z",
+ "shell.execute_reply": "2024-05-24T12:37:26.377774Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
"data": {
- "image/png": "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abSrL+75eP/7348LL7wQD3jAA3DOOefgZS97GX7wgx9kGm1TVF3TSur666/vDh061L3nPe/pbrvttu61r31td+TIke7//u//nOVf+9rXdm9+85u7//zP/+y++tWvdldffXV36NCh7gtf+ELmka+muOej149+9KPu0Y9+dHfZZZd1F154YZ7Brrgk5+IFL3hBd/HFF3ef+MQnum9+85vdf/zHf3Sf/exnM456dcU9HzfddFO3sbHRve1tb+u+8Y1vdDfddFP3pCc9qXvhC1+YeeRNPjWwWFE99alP7V75ylcufPb4xz++u+qqq8htPPGJT+yuueYa7aGtpaTn40UvelH3p3/6p90b3/jGBhZK4p6Lj33sY93ZZ5/d/eAHP8gxvLUT93y85S1v6R796EcvfPb2t7+9O/fcc83G2MRTC4WsoPrX21922WULn4debz/W3t4e7r77bjzoQQ+yGOJaSXo+rrvuOnz961/HG9/4Rushro0k5+IjH/kILrroIvz1X/81HvGIR+D888/H61//evzkJz/JMeSVluR8XHrppbjjjjvw0Y9+FF3X4bvf/S7+6Z/+Cc973vNyDLmJINHbTZvqluT19mP9zd/8De6991789m//tsUQ10qS8/G1r30NV111FW666SZsbbXbVEuSc/GNb3wDn/nMZ3D48GHccMMN+P73v4/f//3fxw9/+MOWZ5Eoyfm49NJL8f73vx8vetGLcPLkSZw+fRoveMEL8Hd/93c5htxEUHMsVlic19sP9cEPfhBvetOb8KEPfQgPfehDrYa3dqKej93dXfzu7/4urrnmGpx//vm5hrdW4twbe3t7mM1meP/734+nPvWpeO5zn4u3vvWteN/73tdcCyVxzsdtt92GP/iDP8Cf/dmf4ZZbbsGNN96Ib37zm+19VRWp/Sm0gpK83r7Xhz70Ibz85S/HP/7jP+LZz3625TDXRtzzcffdd+Pmm2/GF7/4Rbz61a8GMJ/cuq7D1tYWPv7xj+NZz3pWlrGvmiT3xjnnnINHPOIRC6+LfsITnoCu63DHHXfgsY99rOmYV1mS83H8+HE87WlPwx/+4R8CAC644AIcOXIET3/603HttdfinHPOMR93U1jNsVhBSV9v/8EPfhAvfelL8YEPfKDFKxXFPR9Hjx7Fl770Jdx66637/73yla/E4x73ONx66624+OKLcw195SS5N572tKfh29/+Nu655579z7761a9iY2MD5557rul4V12S8/HjH/8YGxuLU9fm5iaAudPRVIHK5Y02WapfwvXe9763u+2227rXve513ZEjR7r//d//7bqu66666qruJS95yX75D3zgA93W1lb3jne8o7vzzjv3//vRj35U6ieslLjnY6y2KkRP3HNx9913d+eee273W7/1W92Xv/zl7lOf+lT32Mc+tnvFK15R6ieslLjn47rrruu2tra6d77znd3Xv/717jOf+Ux30UUXdU996lNL/YSmkRpYrLDe8Y53dOedd153xhlndL/wC7/QfepTn9r/7oorruie8Yxn7P/7Gc94Rgdg6b8rrrgi/8BXVJzzMVYDC11xz8VXvvKV7tnPfnZ35plndueee2535ZVXdj/+8Y8zj3p1xT0fb3/727snPvGJ3Zlnntmdc8453Ytf/OLujjvuyDzqJp/aa9Obmpqampqa1NRyLJqampqamprU1MCiqampqampSU0NLJqampqamprU1MCiqampqampSU0NLJqampqamprU1MCiqampqampSU0NLJqampqamprU1MCiqampqampSU0NLJqampqamprU1MCiqampqampSU0NLJqampqamprU1MCiqampqampSU3/P02eHEdRuYIuAAAAAElFTkSuQmCC",
+ "image/png": "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abSrL+75eP/7348LL7wQD3jAA3DOOefgZS97GX7wgx9kGm1TVF3TSur666/vDh061L3nPe/pbrvttu61r31td+TIke7//u//nOVf+9rXdm9+85u7//zP/+y++tWvdldffXV36NCh7gtf+ELmka+muOej149+9KPu0Y9+dHfZZZd1F154YZ7Brrgk5+IFL3hBd/HFF3ef+MQnum9+85vdf/zHf3Sf/exnM456dcU9HzfddFO3sbHRve1tb+u+8Y1vdDfddFP3pCc9qXvhC1+YeeRNPjWwWFE99alP7V75ylcufPb4xz++u+qqq8htPPGJT+yuueYa7aGtpaTn40UvelH3p3/6p90b3/jGBhZK4p6Lj33sY93ZZ5/d/eAHP8gxvLUT93y85S1v6R796EcvfPb2t7+9O/fcc83G2MRTC4WsoPrX21922WULn4debz/W3t4e7r77bjzoQQ+yGOJaSXo+rrvuOnz961/HG9/4Rushro0k5+IjH/kILrroIvz1X/81HvGIR+D888/H61//evzkJz/JMeSVluR8XHrppbjjjjvw0Y9+FF3X4bvf/S7+6Z/+Cc973vNyDLmJINHbTZvqluT19mP9zd/8De6991789m//tsUQ10qS8/G1r30NV111FW666SZsbbXbVEuSc/GNb3wDn/nMZ3D48GHccMMN+P73v4/f//3fxw9/+MOWZ5Eoyfm49NJL8f73vx8vetGLcPLkSZw+fRoveMEL8Hd/93c5htxEUHMsVlic19sP9cEPfhBvetOb8KEPfQgPfehDrYa3dqKej93dXfzu7/4urrnmGpx//vm5hrdW4twbe3t7mM1meP/734+nPvWpeO5zn4u3vvWteN/73tdcCyVxzsdtt92GP/iDP8Cf/dmf4ZZbbsGNN96Ib37zm+19VRWp/Sm0gpK83r7Xhz70Ibz85S/HP/7jP+LZz3625TDXRtzzcffdd+Pmm2/GF7/4Rbz61a8GMJ/cuq7D1tYWPv7xj+NZz3pWlrGvmiT3xjnnnINHPOIRC6+LfsITnoCu63DHHXfgsY99rOmYV1mS83H8+HE87WlPwx/+4R8CAC644AIcOXIET3/603HttdfinHPOMR93U1jNsVhBSV9v/8EPfhAvfelL8YEPfKDFKxXFPR9Hjx7Fl770Jdx66637/73yla/E4x73ONx66624+OKLcw195SS5N572tKfh29/+Nu655579z7761a9iY2MD5557rul4V12S8/HjH/8YGxuLU9fm5iaAudPRVIHK5Y02WapfwvXe9763u+2227rXve513ZEjR7r//d//7bqu66666qruJS95yX75D3zgA93W1lb3jne8o7vzzjv3//vRj35U6ieslLjnY6y2KkRP3HNx9913d+eee273W7/1W92Xv/zl7lOf+lT32Mc+tnvFK15R6ieslLjn47rrruu2tra6d77znd3Xv/717jOf+Ux30UUXdU996lNL/YSmkRpYrLDe8Y53dOedd153xhlndL/wC7/QfepTn9r/7oorruie8Yxn7P/7Gc94Rgdg6b8rrrgi/8BXVJzzMVYDC11xz8VXvvKV7tnPfnZ35plndueee2535ZVXdj/+8Y8zj3p1xT0fb3/727snPvGJ3Zlnntmdc8453Ytf/OLujjvuyDzqJp/aa9Obmpqampqa1NRyLJqampqamprU1MCiqampqampSU0NLJqampqamprU1MCiqampqampSU0NLJqampqamprU1MCiqampqampSU0NLJqampqamprU1MCiqampqampSU0NLJqampqamprU1MCiqampqampSU0NLJqampqamprU1MCiqampqampSU3/P02eHEdRuYIuAAAAAElFTkSuQmCC",
"text/plain": [
""
]
@@ -1333,19 +1383,21 @@
"execution_count": 26,
"id": "a42a0a42",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:53.176403Z",
- "iopub.status.busy": "2024-02-19T13:47:53.176104Z",
- "iopub.status.idle": "2024-02-19T13:47:53.299214Z",
- "shell.execute_reply": "2024-02-19T13:47:53.298486Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:26.386950Z",
+ "iopub.status.busy": "2024-05-24T12:37:26.386314Z",
+ "iopub.status.idle": "2024-05-24T12:37:26.483051Z",
+ "shell.execute_reply": "2024-05-24T12:37:26.481112Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
"data": {
- "image/png": "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ybJly5LTTjtN22fHjh25xxe/+MWk0Wgkv/nNbzptXvOa1yTnnXdert2uXbtiXw4Zl+s+55xzklNOOSV3TU8//XSuzbp165IXv/jFyaZNm5L77rsvOeGEE5JXvOIVyd69e2NeDhnb6961a1dy0kknJRs3bkx++ctfJlu2bElWrlyZrFixIteubu/3jTfemAwNDSXXXHNN8uCDDyYXXHBBsv/++yf/+Z//KW3/29/+Nnne856XXHDBBcmDDz6YXHPNNcnQ0FDyL//yL502mzdvTgYGBpKPfvSjyS9+8Yvkox/9aDI4OJjcddddZV2WEdvrvuCCC5KPfexjyY9//OPkV7/6VbJ+/fpkaGgoue+++zptvvSlLyVz5swp/N/XCdvrvv322xMAyUMPPZS7puz/aT++37t27cpd7/bt25MDDzww+chHPtJp0wvvd0xY4PQJDz74YAIg9w+7ZcuWBEDyy1/+kjzOm9/85uR1r3tdbttrXvOa5IILLgh1qkFxve5zzjknefOb36zcv2vXrmRoaCi58cYbO9see+yxpNlsJrfddluQc/ch1Pv94x//OAGQ+xCt2/t93HHHJevWrcttW7p0aXLJJZdI2//VX/1VsnTp0ty2//E//keyatWqzuszzjgjOeWUU3JtTj755OSss84KdNb+2F63jCOPPDK57LLLOq+/9KUvJWNjY6FOMQq2150KnGeeeUY55mx4v2+++eak0Wgkv/vd7zrbeuH9jgmnqPqELVu2YGxsDCtXruxsW7VqFcbGxrB582bSGE888QRuueUWnHvuuYV9119/PebOnYujjjoKF198MZ599tlg5+6Dz3XfcccdmDdvHl72spfhvPPOw5NPPtnZd++992J6ehpr167tbDvooIOwbNky8u8zJiHebwCYmJhAo9HA85///Nz2urzfe/bswb333pt7HwBg7dq1yuvcsmVLof3JJ5+Mn/zkJ5ienta2qcN7C7hdt8jMzAyeffZZHHjggbntzz33HBYvXoyDDz4Yp512GrZu3RrsvH3xue5jjjkGCxcuxIknnojbb789t282vN/XXnstTjrpJCxevDi3vc7vd2xm5WKb/cjOnTsxb968wvZ58+Zh586dpDG+/OUv44ADDsDb3va23Pazzz4bhx56KBYsWICf//znWL9+PR544AFs2rQpyLn74Hrdp556Kt7xjndg8eLFeOSRR/DhD38Yr3vd63DvvfdiZGQEO3fuxPDwMF7wghfk+s2fP5/8+4xJiPd79+7duOSSS/DOd74zt1Bfnd7vp556Cq1WC/Pnz89t170PO3fulLbfu3cvnnrqKSxcuFDZpg7vLeB23SKf+MQn8Ic//AFnnHFGZ9vSpUtx3XXX4eijj8bk5CSuvPJKvOpVr8IDDzyAww8/POg1uOBy3QsXLsTVV1+NFStWYGpqCl/96ldx4okn4o477sCrX/1qAOq/iX55v3fs2IFvf/vb+PrXv57bXvf3OzYscGrOpZdeissuu0zb5p577gHQNgyLJEki3S7ji1/8Is4++2yMjo7mtp933nmd58uWLcPhhx+OY489Fvfddx+WL19OGtuW2Nd95plndp4vW7YMxx57LBYvXoxbbrmlIPBsxvWlrPd7enoaZ511FmZmZnDVVVfl9lXxfpsQr8l0nbL24nbbMavA9RxvuOEGXHrppfjmN7+ZE8KrVq3Kmelf9apXYfny5fj0pz+NT33qU+FO3BOb616yZAmWLFnSeb169Wps374dH//4xzsCx3bMqnA9x+uuuw7Pf/7z8Za3vCW3vVfe71iwwKk5559/vrGC5ZBDDsFPf/pTPPHEE4V9v//97wvfCmTceeedeOihh7Bx40Zj2+XLl2NoaAgPP/xwtBteWdedsnDhQixevBgPP/wwAGDBggXYs2cPnnnmmVwU58knn8SaNWvI49pSxnVPT0/jjDPOwCOPPILvf//7ueiNjDLebxVz587FwMBA4Vvsk08+qbzOBQsWSNsPDg7ihS98obaNzd9MTFyuO2Xjxo0499xz8c///M846aSTtG2bzSZe+cpXdv7uq8bnurOsWrUKX/va1zqv+/n9TpIEX/ziFzE+Po7h4WFt27q939GpxvrDhCY1nd59992dbXfddRfZdHrOOecUqmlU/OxnP0sAJD/4wQ+czzcUvted8tRTTyUjIyPJl7/85SRJuibjjRs3dto8/vjjtTMZ2173nj17kre85S3JUUcdlTz55JOkY1X9fh933HHJn//5n+e2HXHEEVqT8RFHHJHbtm7duoLJ+NRTT821OeWUU2pnOrW57iRJkq9//evJ6OhocvPNN5OOMTMzkxx77LHJn/7pn/qcalBcrlvk7W9/e3LCCSd0Xvfr+50kXZP1z372M+Mx6vh+x4QFTh9xyimnJC9/+cuTLVu2JFu2bEmOPvroQtnwkiVLkm984xu5bRMTE8nznve85HOf+1xhzF//+tfJZZddltxzzz3JI488ktxyyy3J0qVLk2OOOaZW5dI21/3ss88mH/zgB5PNmzcnjzzySHL77bcnq1evTl784hcnk5OTnT7r1q1LDj744OS73/1uct999yWve93ralcmbnPd09PTyemnn54cfPDByf33358rG52amkqSpJ7vd1o+e+211yYPPvhgcuGFFyb7779/p1rkkksuScbHxzvt0zLxv/zLv0wefPDB5Nprry2Uif/f//t/k4GBgeTv/u7vkl/84hfJ3/3d39W2bJh63V//+teTwcHB5LOf/ayyxP/SSy9NbrvttuQ3v/lNsnXr1uRP//RPk8HBwZxQrhrb6/7Hf/zH5Oabb05+9atfJT//+c+TSy65JAGQ3HTTTZ02/fh+p7zrXe9KVq5cKR2zF97vmLDA6SOefvrp5Oyzz04OOOCA5IADDkjOPvvsQukkgORLX/pSbtsXvvCFZL/99pPOdbJt27bk1a9+dXLggQcmw8PDyUtf+tLkAx/4QGHOmCqxve7/+q//StauXZu86EUvSoaGhpKXvOQlyTnnnJNs27Yt1+e///u/k/PPPz858MADk/322y857bTTCm2qxPa6H3nkkQSA9HH77bcnSVLf9/uzn/1ssnjx4mR4eDhZvnx5Lpp0zjnnJK95zWty7e+4447kmGOOSYaHh5NDDjlEKt7/+Z//OVmyZEkyNDSULF26NHdDrAs21/2a17xG+t6ec845nTYXXnhh8pKXvCQZHh5OXvSiFyVr165NNm/eXOIV0bC57o997GPJS1/60mR0dDR5wQtekPzxH/9xcssttxTG7Lf3O0nakeb99tsvufrqq6Xj9cr7HYtGkuxz3zEMwzAMw/QJPA8OwzAMwzB9BwschmEYhmH6DhY4DMMwDMP0HSxwGIZhGIbpO1jgMAzDMAzTd7DAYRiGYRim72CBwzAMwzBM38ECh2EYhmGYvoMFDsMwDMMwfQcLHIZhGIZh+g4WOAzDMAzD9B0scBiGYRiG6Tv+f2w+5dQvQZciAAAAAElFTkSuQmCC",
+ "image/png": "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ybJly5LTTjtN22fHjh25xxe/+MWk0Wgkv/nNbzptXvOa1yTnnXdert2uXbtiXw4Zl+s+55xzklNOOSV3TU8//XSuzbp165IXv/jFyaZNm5L77rsvOeGEE5JXvOIVyd69e2NeDhnb6961a1dy0kknJRs3bkx++ctfJlu2bElWrlyZrFixIteubu/3jTfemAwNDSXXXHNN8uCDDyYXXHBBsv/++yf/+Z//KW3/29/+Nnne856XXHDBBcmDDz6YXHPNNcnQ0FDyL//yL502mzdvTgYGBpKPfvSjyS9+8Yvkox/9aDI4OJjcddddZV2WEdvrvuCCC5KPfexjyY9//OPkV7/6VbJ+/fpkaGgoue+++zptvvSlLyVz5swp/N/XCdvrvv322xMAyUMPPZS7puz/aT++37t27cpd7/bt25MDDzww+chHPtJp0wvvd0xY4PQJDz74YAIg9w+7ZcuWBEDyy1/+kjzOm9/85uR1r3tdbttrXvOa5IILLgh1qkFxve5zzjknefOb36zcv2vXrmRoaCi58cYbO9see+yxpNlsJrfddluQc/ch1Pv94x//OAGQ+xCt2/t93HHHJevWrcttW7p0aXLJJZdI2//VX/1VsnTp0ty2//E//keyatWqzuszzjgjOeWUU3JtTj755OSss84KdNb+2F63jCOPPDK57LLLOq+/9KUvJWNjY6FOMQq2150KnGeeeUY55mx4v2+++eak0Wgkv/vd7zrbeuH9jgmnqPqELVu2YGxsDCtXruxsW7VqFcbGxrB582bSGE888QRuueUWnHvuuYV9119/PebOnYujjjoKF198MZ599tlg5+6Dz3XfcccdmDdvHl72spfhvPPOw5NPPtnZd++992J6ehpr167tbDvooIOwbNky8u8zJiHebwCYmJhAo9HA85///Nz2urzfe/bswb333pt7HwBg7dq1yuvcsmVLof3JJ5+Mn/zkJ5ienta2qcN7C7hdt8jMzAyeffZZHHjggbntzz33HBYvXoyDDz4Yp512GrZu3RrsvH3xue5jjjkGCxcuxIknnojbb789t282vN/XXnstTjrpJCxevDi3vc7vd2xm5WKb/cjOnTsxb968wvZ58+Zh586dpDG+/OUv44ADDsDb3va23Pazzz4bhx56KBYsWICf//znWL9+PR544AFs2rQpyLn74Hrdp556Kt7xjndg8eLFeOSRR/DhD38Yr3vd63DvvfdiZGQEO3fuxPDwMF7wghfk+s2fP5/8+4xJiPd79+7duOSSS/DOd74zt1Bfnd7vp556Cq1WC/Pnz89t170PO3fulLbfu3cvnnrqKSxcuFDZpg7vLeB23SKf+MQn8Ic//AFnnHFGZ9vSpUtx3XXX4eijj8bk5CSuvPJKvOpVr8IDDzyAww8/POg1uOBy3QsXLsTVV1+NFStWYGpqCl/96ldx4okn4o477sCrX/1qAOq/iX55v3fs2IFvf/vb+PrXv57bXvf3OzYscGrOpZdeissuu0zb5p577gHQNgyLJEki3S7ji1/8Is4++2yMjo7mtp933nmd58uWLcPhhx+OY489Fvfddx+WL19OGtuW2Nd95plndp4vW7YMxx57LBYvXoxbbrmlIPBsxvWlrPd7enoaZ511FmZmZnDVVVfl9lXxfpsQr8l0nbL24nbbMavA9RxvuOEGXHrppfjmN7+ZE8KrVq3Kmelf9apXYfny5fj0pz+NT33qU+FO3BOb616yZAmWLFnSeb169Wps374dH//4xzsCx3bMqnA9x+uuuw7Pf/7z8Za3vCW3vVfe71iwwKk5559/vrGC5ZBDDsFPf/pTPPHEE4V9v//97wvfCmTceeedeOihh7Bx40Zj2+XLl2NoaAgPP/xwtBteWdedsnDhQixevBgPP/wwAGDBggXYs2cPnnnmmVwU58knn8SaNWvI49pSxnVPT0/jjDPOwCOPPILvf//7ueiNjDLebxVz587FwMBA4Vvsk08+qbzOBQsWSNsPDg7ihS98obaNzd9MTFyuO2Xjxo0499xz8c///M846aSTtG2bzSZe+cpXdv7uq8bnurOsWrUKX/va1zqv+/n9TpIEX/ziFzE+Po7h4WFt27q939GpxvrDhCY1nd59992dbXfddRfZdHrOOecUqmlU/OxnP0sAJD/4wQ+czzcUvted8tRTTyUjIyPJl7/85SRJuibjjRs3dto8/vjjtTMZ2173nj17kre85S3JUUcdlTz55JOkY1X9fh933HHJn//5n+e2HXHEEVqT8RFHHJHbtm7duoLJ+NRTT821OeWUU2pnOrW57iRJkq9//evJ6OhocvPNN5OOMTMzkxx77LHJn/7pn/qcalBcrlvk7W9/e3LCCSd0Xvfr+50kXZP1z372M+Mx6vh+x4QFTh9xyimnJC9/+cuTLVu2JFu2bEmOPvroQtnwkiVLkm984xu5bRMTE8nznve85HOf+1xhzF//+tfJZZddltxzzz3JI488ktxyyy3J0qVLk2OOOaZW5dI21/3ss88mH/zgB5PNmzcnjzzySHL77bcnq1evTl784hcnk5OTnT7r1q1LDj744OS73/1uct999yWve93ralcmbnPd09PTyemnn54cfPDByf33358rG52amkqSpJ7vd1o+e+211yYPPvhgcuGFFyb7779/p1rkkksuScbHxzvt0zLxv/zLv0wefPDB5Nprry2Uif/f//t/k4GBgeTv/u7vkl/84hfJ3/3d39W2bJh63V//+teTwcHB5LOf/ayyxP/SSy9NbrvttuQ3v/lNsnXr1uRP//RPk8HBwZxQrhrb6/7Hf/zH5Oabb05+9atfJT//+c+TSy65JAGQ3HTTTZ02/fh+p7zrXe9KVq5cKR2zF97vmLDA6SOefvrp5Oyzz04OOOCA5IADDkjOPvvsQukkgORLX/pSbtsXvvCFZL/99pPOdbJt27bk1a9+dXLggQcmw8PDyUtf+tLkAx/4QGHOmCqxve7/+q//StauXZu86EUvSoaGhpKXvOQlyTnnnJNs27Yt1+e///u/k/PPPz858MADk/322y857bTTCm2qxPa6H3nkkQSA9HH77bcnSVLf9/uzn/1ssnjx4mR4eDhZvnx5Lpp0zjnnJK95zWty7e+4447kmGOOSYaHh5NDDjlEKt7/+Z//OVmyZEkyNDSULF26NHdDrAs21/2a17xG+t6ec845nTYXXnhh8pKXvCQZHh5OXvSiFyVr165NNm/eXOIV0bC57o997GPJS1/60mR0dDR5wQtekPzxH/9xcssttxTG7Lf3O0nakeb99tsvufrqq6Xj9cr7HYtGkuxz3zEMwzAMw/QJPA8OwzAMwzB9BwschmEYhmH6DhY4DMMwDMP0HSxwGIZhGIbpO1jgMAzDMAzTd7DAYRiGYRim72CBwzAMwzBM38ECh2EYhmGYvoMFDsMwDMMwfQcLHIZhGIZh+g4WOAzDMAzD9B0scBiGYRiG6Tv+f2w+5dQvQZciAAAAAElFTkSuQmCC",
"text/plain": [
""
]
@@ -1379,19 +1431,21 @@
"execution_count": 27,
"id": "b9f6cc53",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:53.302005Z",
- "iopub.status.busy": "2024-02-19T13:47:53.301738Z",
- "iopub.status.idle": "2024-02-19T13:47:53.423480Z",
- "shell.execute_reply": "2024-02-19T13:47:53.423025Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:26.487365Z",
+ "iopub.status.busy": "2024-05-24T12:37:26.487223Z",
+ "iopub.status.idle": "2024-05-24T12:37:26.580996Z",
+ "shell.execute_reply": "2024-05-24T12:37:26.579877Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
"data": {
- "image/png": "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kdx1113J2rVrkz/4gz9IJicnu3M2btyYHH744cmdd96ZPPjgg8kb3/jG2pWJc9739PR08ta3vjU5/PDDk4ceeihXNjo1NZUkST2/32n57PXXX5888sgjySWXXJIcfPDB3WqRj3zkI8n69eu749My8Q996EPJI488klx//fWFMvH/9//+X9JqtZK/+qu/Sh599NHkr/7qr2pbNkx931//+teToaGh5HOf+5yyxP/yyy9P7rjjjuRXv/pVsmPHjuRP/uRPkqGhoZxQrhru+/6bv/mb5NZbb01+8YtfJD/72c+Sj3zkIwmA5JZbbumOGcTvd8q73/3uZPXq1dI1++H7HZIocAaI5557Ljn//POTQw45JDnkkEOS888/v1A6CSD50pe+lDv2xS9+MTnooIOkvU527tyZvO51r0sOPfTQZGRkJHnlK1+ZfPCDHyz0jKkS7vv+93//92TdunXJy172smR4eDh5+ctfnlxwwQXJzp07c3P+4z/+I7nooouSQw89NDnooIOSs88+uzCmSrjv+4knnkgASF933XVXkiT1/X5/7nOfS5YuXZqMjIwkK1euzEWTLrjgguT1r399bvzdd9+dHH/88cnIyEhyxBFHSMX73//93yfLli1LhoeHk+XLl+ceiHWB875f//rXS7+3F1xwQXfMJZdckrz85S9PRkZGkpe97GXJunXrkm3btpX4jmhw3vcnPvGJ5JWvfGUyNjaWvOQlL0n+83/+z8ltt91WWHPQvt9J0ok0H3TQQcm1114rXa9fvt+haCTJAfddJBKJRCKRyIAQ++BEIpFIJBIZOKLAiUQikUgkMnBEgROJRCKRSGTgiAInEolEIpHIwBEFTiQSiUQikYEjCpxIJBKJRCIDRxQ4kUgkEolEBo4ocCKRSCQSiQwcUeBEIpFIJBIZOKLAiUQikUgkMnBEgROJRCKRSGTgiAInEolEIpHIwPH/A9qzxxYLuGB7AAAAAElFTkSuQmCC",
+ "image/png": "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kdx1113J2rVrkz/4gz9IJicnu3M2btyYHH744cmdd96ZPPjgg8kb3/jG2pWJc9739PR08ta3vjU5/PDDk4ceeihXNjo1NZUkST2/32n57PXXX5888sgjySWXXJIcfPDB3WqRj3zkI8n69eu749My8Q996EPJI488klx//fWFMvH/9//+X9JqtZK/+qu/Sh599NHkr/7qr2pbNkx931//+teToaGh5HOf+5yyxP/yyy9P7rjjjuRXv/pVsmPHjuRP/uRPkqGhoZxQrhru+/6bv/mb5NZbb01+8YtfJD/72c+Sj3zkIwmA5JZbbumOGcTvd8q73/3uZPXq1dI1++H7HZIocAaI5557Ljn//POTQw45JDnkkEOS888/v1A6CSD50pe+lDv2xS9+MTnooIOkvU527tyZvO51r0sOPfTQZGRkJHnlK1+ZfPCDHyz0jKkS7vv+93//92TdunXJy172smR4eDh5+ctfnlxwwQXJzp07c3P+4z/+I7nooouSQw89NDnooIOSs88+uzCmSrjv+4knnkgASF933XVXkiT1/X5/7nOfS5YuXZqMjIwkK1euzEWTLrjgguT1r399bvzdd9+dHH/88cnIyEhyxBFHSMX73//93yfLli1LhoeHk+XLl+ceiHWB875f//rXS7+3F1xwQXfMJZdckrz85S9PRkZGkpe97GXJunXrkm3btpX4jmhw3vcnPvGJ5JWvfGUyNjaWvOQlL0n+83/+z8ltt91WWHPQvt9J0ok0H3TQQcm1114rXa9fvt+haCTJAfddJBKJRCKRyIAQ++BEIpFIJBIZOKLAiUQikUgkMnBEgROJRCKRSGTgiAInEolEIpHIwBEFTiQSiUQikYEjCpxIJBKJRCIDRxQ4kUgkEolEBo4ocCKRSCQSiQwcUeBEIpFIJBIZOKLAiUQikUgkMnBEgROJRCKRSGTgiAInEolEIpHIwPH/A9qzxxYLuGB7AAAAAElFTkSuQmCC",
"text/plain": [
""
]
@@ -1425,14 +1479,16 @@
"execution_count": 28,
"id": "f896255d",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:47:53.426026Z",
- "iopub.status.busy": "2024-02-19T13:47:53.425837Z",
- "iopub.status.idle": "2024-02-19T13:47:53.605025Z",
- "shell.execute_reply": "2024-02-19T13:47:53.604491Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:26.586756Z",
+ "iopub.status.busy": "2024-05-24T12:37:26.585661Z",
+ "iopub.status.idle": "2024-05-24T12:37:26.695543Z",
+ "shell.execute_reply": "2024-05-24T12:37:26.693180Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
@@ -1470,9 +1526,9 @@
],
"metadata": {
"kernelspec": {
- "display_name": "shenfun24",
- "language": "python3",
- "name": "shenfun24"
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
},
"language_info": {
"codemirror_mode": {
@@ -1484,7 +1540,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.10.0"
+ "version": "3.12.3"
}
},
"nbformat": 4,
diff --git a/docs/source/mixingbases.ipynb b/docs/source/mixingbases.ipynb
index 0ec97322..5599b3ee 100644
--- a/docs/source/mixingbases.ipynb
+++ b/docs/source/mixingbases.ipynb
@@ -41,7 +41,7 @@
},
"source": [
"\n",
- "
\n",
+ " \n",
"\n",
"$$\n",
"\\begin{equation}\n",
@@ -69,7 +69,7 @@
},
"source": [
"\n",
- "
\n",
+ " \n",
"\n",
"$$\n",
"\\begin{equation}\n",
@@ -97,7 +97,7 @@
},
"source": [
"\n",
- "
\n",
+ " \n",
"\n",
"$$\n",
"\\begin{equation}\n",
@@ -144,7 +144,7 @@
},
"source": [
"\n",
- "
\n",
+ " \n",
"\n",
"$$\n",
"\\label{eq:heinrichs} \\tag{5}\n",
@@ -160,7 +160,7 @@
},
"source": [
"\n",
- "
\n",
+ " \n",
"\n",
"$$\n",
"\\label{eq:dirichletU} \\tag{6}\n",
@@ -196,14 +196,16 @@
"execution_count": 1,
"id": "f1f9ca5d",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:48:39.361760Z",
- "iopub.status.busy": "2024-02-19T13:48:39.361483Z",
- "iopub.status.idle": "2024-02-19T13:48:40.276844Z",
- "shell.execute_reply": "2024-02-19T13:48:40.276127Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:51.609457Z",
+ "iopub.status.busy": "2024-05-24T12:37:51.609305Z",
+ "iopub.status.idle": "2024-05-24T12:37:52.333091Z",
+ "shell.execute_reply": "2024-05-24T12:37:52.331537Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [],
"source": [
@@ -234,14 +236,16 @@
"execution_count": 2,
"id": "c0a4b817",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:48:40.280230Z",
- "iopub.status.busy": "2024-02-19T13:48:40.279834Z",
- "iopub.status.idle": "2024-02-19T13:48:40.285055Z",
- "shell.execute_reply": "2024-02-19T13:48:40.284589Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:52.340208Z",
+ "iopub.status.busy": "2024-05-24T12:37:52.339832Z",
+ "iopub.status.idle": "2024-05-24T12:37:52.345709Z",
+ "shell.execute_reply": "2024-05-24T12:37:52.344619Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [],
"source": [
@@ -270,7 +274,7 @@
},
"source": [
"\n",
- "
\n",
+ " \n",
"\n",
"$$\n",
"\\begin{equation}\n",
@@ -295,14 +299,16 @@
"execution_count": 3,
"id": "b621fdd7",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:48:40.288102Z",
- "iopub.status.busy": "2024-02-19T13:48:40.287531Z",
- "iopub.status.idle": "2024-02-19T13:48:40.294925Z",
- "shell.execute_reply": "2024-02-19T13:48:40.294417Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:52.350040Z",
+ "iopub.status.busy": "2024-05-24T12:37:52.349833Z",
+ "iopub.status.idle": "2024-05-24T12:37:52.356609Z",
+ "shell.execute_reply": "2024-05-24T12:37:52.356261Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [],
"source": [
@@ -326,14 +332,16 @@
"execution_count": 4,
"id": "b7648fc4",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:48:40.297685Z",
- "iopub.status.busy": "2024-02-19T13:48:40.297462Z",
- "iopub.status.idle": "2024-02-19T13:48:40.923369Z",
- "shell.execute_reply": "2024-02-19T13:48:40.922562Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:52.358262Z",
+ "iopub.status.busy": "2024-05-24T12:37:52.358166Z",
+ "iopub.status.idle": "2024-05-24T12:37:52.748000Z",
+ "shell.execute_reply": "2024-05-24T12:37:52.747339Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [],
"source": [
@@ -356,14 +364,16 @@
"execution_count": 5,
"id": "341119de",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:48:40.926180Z",
- "iopub.status.busy": "2024-02-19T13:48:40.925963Z",
- "iopub.status.idle": "2024-02-19T13:48:40.941262Z",
- "shell.execute_reply": "2024-02-19T13:48:40.940562Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:52.754670Z",
+ "iopub.status.busy": "2024-05-24T12:37:52.754529Z",
+ "iopub.status.idle": "2024-05-24T12:37:52.780628Z",
+ "shell.execute_reply": "2024-05-24T12:37:52.777201Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [],
"source": [
@@ -390,21 +400,23 @@
"execution_count": 6,
"id": "c29b3b52",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:48:40.944831Z",
- "iopub.status.busy": "2024-02-19T13:48:40.944580Z",
- "iopub.status.idle": "2024-02-19T13:48:40.983675Z",
- "shell.execute_reply": "2024-02-19T13:48:40.982789Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:52.791460Z",
+ "iopub.status.busy": "2024-05-24T12:37:52.791020Z",
+ "iopub.status.idle": "2024-05-24T12:37:52.852240Z",
+ "shell.execute_reply": "2024-05-24T12:37:52.849580Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Error = 0.41890381687693135\n"
+ "Error = 0.41890381687694145\n"
]
}
],
@@ -434,14 +446,16 @@
"execution_count": 7,
"id": "e7fc2aff",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:48:40.986318Z",
- "iopub.status.busy": "2024-02-19T13:48:40.986123Z",
- "iopub.status.idle": "2024-02-19T13:48:41.038794Z",
- "shell.execute_reply": "2024-02-19T13:48:41.037921Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:52.855887Z",
+ "iopub.status.busy": "2024-05-24T12:37:52.855234Z",
+ "iopub.status.idle": "2024-05-24T12:37:52.862642Z",
+ "shell.execute_reply": "2024-05-24T12:37:52.861860Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [],
"source": [
@@ -514,21 +528,23 @@
"execution_count": 8,
"id": "6a61d76e",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:48:41.042436Z",
- "iopub.status.busy": "2024-02-19T13:48:41.042140Z",
- "iopub.status.idle": "2024-02-19T13:48:41.474999Z",
- "shell.execute_reply": "2024-02-19T13:48:41.473797Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:52.865623Z",
+ "iopub.status.busy": "2024-05-24T12:37:52.865527Z",
+ "iopub.status.idle": "2024-05-24T12:37:53.192373Z",
+ "shell.execute_reply": "2024-05-24T12:37:53.191860Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "3.8866412036007366e-07\n"
+ "3.886641204701855e-07\n"
]
}
],
@@ -553,14 +569,16 @@
"execution_count": 9,
"id": "21ff1456",
"metadata": {
- "collapsed": false,
"editable": true,
"execution": {
- "iopub.execute_input": "2024-02-19T13:48:41.479228Z",
- "iopub.status.busy": "2024-02-19T13:48:41.478935Z",
- "iopub.status.idle": "2024-02-19T13:48:42.514067Z",
- "shell.execute_reply": "2024-02-19T13:48:42.513423Z"
- }
+ "iopub.execute_input": "2024-05-24T12:37:53.197472Z",
+ "iopub.status.busy": "2024-05-24T12:37:53.197343Z",
+ "iopub.status.idle": "2024-05-24T12:37:53.909816Z",
+ "shell.execute_reply": "2024-05-24T12:37:53.908747Z"
+ },
+ "tags": [
+ "thebe-init"
+ ]
},
"outputs": [
{
@@ -573,13 +591,13 @@
" require.undef(\"plotly\");\n",
" define('plotly', function(require, exports, module) {\n",
" /**\n",
- "* plotly.js v2.27.0\n",
- "* Copyright 2012-2023, Plotly, Inc.\n",
+ "* plotly.js v2.32.0\n",
+ "* Copyright 2012-2024, Plotly, Inc.\n",
"* All rights reserved.\n",
"* Licensed under the MIT license\n",
"*/\n",
"/*! For license information please see plotly.min.js.LICENSE.txt */\n",
- "!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.Plotly=e():t.Plotly=e()}(self,(function(){return function(){var t={98847:function(t,e,r){\"use strict\";var n=r(71828),i={\"X,X div\":'direction:ltr;font-family:\"Open Sans\",verdana,arial,sans-serif;margin:0;padding:0;',\"X input,X button\":'font-family:\"Open Sans\",verdana,arial,sans-serif;',\"X input:focus,X button:focus\":\"outline:none;\",\"X a\":\"text-decoration:none;\",\"X a:hover\":\"text-decoration:none;\",\"X .crisp\":\"shape-rendering:crispEdges;\",\"X .user-select-none\":\"-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;\",\"X svg\":\"overflow:hidden;\",\"X svg a\":\"fill:#447adb;\",\"X svg a:hover\":\"fill:#3c6dc5;\",\"X .main-svg\":\"position:absolute;top:0;left:0;pointer-events:none;\",\"X .main-svg .draglayer\":\"pointer-events:all;\",\"X .cursor-default\":\"cursor:default;\",\"X .cursor-pointer\":\"cursor:pointer;\",\"X .cursor-crosshair\":\"cursor:crosshair;\",\"X .cursor-move\":\"cursor:move;\",\"X .cursor-col-resize\":\"cursor:col-resize;\",\"X .cursor-row-resize\":\"cursor:row-resize;\",\"X .cursor-ns-resize\":\"cursor:ns-resize;\",\"X .cursor-ew-resize\":\"cursor:ew-resize;\",\"X .cursor-sw-resize\":\"cursor:sw-resize;\",\"X .cursor-s-resize\":\"cursor:s-resize;\",\"X .cursor-se-resize\":\"cursor:se-resize;\",\"X .cursor-w-resize\":\"cursor:w-resize;\",\"X .cursor-e-resize\":\"cursor:e-resize;\",\"X .cursor-nw-resize\":\"cursor:nw-resize;\",\"X .cursor-n-resize\":\"cursor:n-resize;\",\"X .cursor-ne-resize\":\"cursor:ne-resize;\",\"X .cursor-grab\":\"cursor:-webkit-grab;cursor:grab;\",\"X .modebar\":\"position:absolute;top:2px;right:2px;\",\"X .ease-bg\":\"-webkit-transition:background-color .3s ease 0s;-moz-transition:background-color .3s ease 0s;-ms-transition:background-color .3s ease 0s;-o-transition:background-color .3s ease 0s;transition:background-color .3s ease 0s;\",\"X .modebar--hover>:not(.watermark)\":\"opacity:0;-webkit-transition:opacity .3s ease 0s;-moz-transition:opacity .3s ease 0s;-ms-transition:opacity .3s ease 0s;-o-transition:opacity .3s ease 0s;transition:opacity .3s ease 0s;\",\"X:hover .modebar--hover .modebar-group\":\"opacity:1;\",\"X .modebar-group\":\"float:left;display:inline-block;box-sizing:border-box;padding-left:8px;position:relative;vertical-align:middle;white-space:nowrap;\",\"X .modebar-btn\":\"position:relative;font-size:16px;padding:3px 4px;height:22px;cursor:pointer;line-height:normal;box-sizing:border-box;\",\"X .modebar-btn svg\":\"position:relative;top:2px;\",\"X .modebar.vertical\":\"display:flex;flex-direction:column;flex-wrap:wrap;align-content:flex-end;max-height:100%;\",\"X .modebar.vertical svg\":\"top:-1px;\",\"X .modebar.vertical .modebar-group\":\"display:block;float:none;padding-left:0px;padding-bottom:8px;\",\"X .modebar.vertical .modebar-group .modebar-btn\":\"display:block;text-align:center;\",\"X [data-title]:before,X [data-title]:after\":\"position:absolute;-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);display:none;opacity:0;z-index:1001;pointer-events:none;top:110%;right:50%;\",\"X [data-title]:hover:before,X [data-title]:hover:after\":\"display:block;opacity:1;\",\"X [data-title]:before\":'content:\"\";position:absolute;background:rgba(0,0,0,0);border:6px solid rgba(0,0,0,0);z-index:1002;margin-top:-12px;border-bottom-color:#69738a;margin-right:-6px;',\"X [data-title]:after\":\"content:attr(data-title);background:#69738a;color:#fff;padding:8px 10px;font-size:12px;line-height:12px;white-space:nowrap;margin-right:-18px;border-radius:2px;\",\"X .vertical [data-title]:before,X .vertical [data-title]:after\":\"top:0%;right:200%;\",\"X .vertical [data-title]:before\":\"border:6px solid rgba(0,0,0,0);border-left-color:#69738a;margin-top:8px;margin-right:-30px;\",Y:'font-family:\"Open Sans\",verdana,arial,sans-serif;position:fixed;top:50px;right:20px;z-index:10000;font-size:10pt;max-width:180px;',\"Y p\":\"margin:0;\",\"Y .notifier-note\":\"min-width:180px;max-width:250px;border:1px solid #fff;z-index:3000;margin:0;background-color:#8c97af;background-color:rgba(140,151,175,.9);color:#fff;padding:10px;overflow-wrap:break-word;word-wrap:break-word;-ms-hyphens:auto;-webkit-hyphens:auto;hyphens:auto;\",\"Y .notifier-close\":\"color:#fff;opacity:.8;float:right;padding:0 5px;background:none;border:none;font-size:20px;font-weight:bold;line-height:20px;\",\"Y .notifier-close:hover\":\"color:#444;text-decoration:none;cursor:pointer;\"};for(var a in i){var o=a.replace(/^,/,\" ,\").replace(/X/g,\".js-plotly-plot .plotly\").replace(/Y/g,\".plotly-notifier\");n.addStyleRule(o,i[a])}},98222:function(t,e,r){\"use strict\";t.exports=r(82887)},27206:function(t,e,r){\"use strict\";t.exports=r(60822)},59893:function(t,e,r){\"use strict\";t.exports=r(23381)},5224:function(t,e,r){\"use strict\";t.exports=r(83832)},59509:function(t,e,r){\"use strict\";t.exports=r(72201)},75557:function(t,e,r){\"use strict\";t.exports=r(91815)},40338:function(t,e,r){\"use strict\";t.exports=r(21462)},35080:function(t,e,r){\"use strict\";t.exports=r(51319)},61396:function(t,e,r){\"use strict\";t.exports=r(57516)},40549:function(t,e,r){\"use strict\";t.exports=r(98128)},49866:function(t,e,r){\"use strict\";t.exports=r(99442)},36089:function(t,e,r){\"use strict\";t.exports=r(93740)},19548:function(t,e,r){\"use strict\";t.exports=r(8729)},35831:function(t,e,r){\"use strict\";t.exports=r(93814)},61039:function(t,e,r){\"use strict\";t.exports=r(14382)},97040:function(t,e,r){\"use strict\";t.exports=r(51759)},77986:function(t,e,r){\"use strict\";t.exports=r(10421)},24296:function(t,e,r){\"use strict\";t.exports=r(43102)},58872:function(t,e,r){\"use strict\";t.exports=r(92165)},29626:function(t,e,r){\"use strict\";t.exports=r(3325)},65591:function(t,e,r){\"use strict\";t.exports=r(36071)},69738:function(t,e,r){\"use strict\";t.exports=r(43905)},92650:function(t,e,r){\"use strict\";t.exports=r(35902)},35630:function(t,e,r){\"use strict\";t.exports=r(69816)},73434:function(t,e,r){\"use strict\";t.exports=r(94507)},27909:function(t,e,r){\"use strict\";var n=r(19548);n.register([r(27206),r(5224),r(58872),r(65591),r(69738),r(92650),r(49866),r(25743),r(6197),r(97040),r(85461),r(73434),r(54201),r(81299),r(47645),r(35630),r(77986),r(83043),r(93005),r(96881),r(4534),r(50581),r(40549),r(77900),r(47582),r(35080),r(21641),r(17280),r(5861),r(29626),r(10021),r(65317),r(96268),r(61396),r(35831),r(16122),r(46163),r(40344),r(40338),r(48131),r(36089),r(55334),r(75557),r(19440),r(99488),r(59893),r(97393),r(98222),r(61039),r(24296),r(66398),r(59509)]),t.exports=n},46163:function(t,e,r){\"use strict\";t.exports=r(15154)},96881:function(t,e,r){\"use strict\";t.exports=r(64943)},50581:function(t,e,r){\"use strict\";t.exports=r(21164)},55334:function(t,e,r){\"use strict\";t.exports=r(54186)},65317:function(t,e,r){\"use strict\";t.exports=r(94873)},10021:function(t,e,r){\"use strict\";t.exports=r(67618)},54201:function(t,e,r){\"use strict\";t.exports=r(58810)},5861:function(t,e,r){\"use strict\";t.exports=r(20593)},16122:function(t,e,r){\"use strict\";t.exports=r(29396)},83043:function(t,e,r){\"use strict\";t.exports=r(13551)},48131:function(t,e,r){\"use strict\";t.exports=r(46858)},47582:function(t,e,r){\"use strict\";t.exports=r(17988)},21641:function(t,e,r){\"use strict\";t.exports=r(68868)},96268:function(t,e,r){\"use strict\";t.exports=r(20467)},19440:function(t,e,r){\"use strict\";t.exports=r(91271)},99488:function(t,e,r){\"use strict\";t.exports=r(21461)},97393:function(t,e,r){\"use strict\";t.exports=r(85956)},25743:function(t,e,r){\"use strict\";t.exports=r(52979)},66398:function(t,e,r){\"use strict\";t.exports=r(32275)},17280:function(t,e,r){\"use strict\";t.exports=r(6419)},77900:function(t,e,r){\"use strict\";t.exports=r(61510)},81299:function(t,e,r){\"use strict\";t.exports=r(87619)},93005:function(t,e,r){\"use strict\";t.exports=r(93601)},40344:function(t,e,r){\"use strict\";t.exports=r(96595)},47645:function(t,e,r){\"use strict\";t.exports=r(70954)},6197:function(t,e,r){\"use strict\";t.exports=r(47462)},4534:function(t,e,r){\"use strict\";t.exports=r(17659)},85461:function(t,e,r){\"use strict\";t.exports=r(19990)},82884:function(t){\"use strict\";t.exports=[{path:\"\",backoff:0},{path:\"M-2.4,-3V3L0.6,0Z\",backoff:.6},{path:\"M-3.7,-2.5V2.5L1.3,0Z\",backoff:1.3},{path:\"M-4.45,-3L-1.65,-0.2V0.2L-4.45,3L1.55,0Z\",backoff:1.55},{path:\"M-2.2,-2.2L-0.2,-0.2V0.2L-2.2,2.2L-1.4,3L1.6,0L-1.4,-3Z\",backoff:1.6},{path:\"M-4.4,-2.1L-0.6,-0.2V0.2L-4.4,2.1L-4,3L2,0L-4,-3Z\",backoff:2},{path:\"M2,0A2,2 0 1,1 0,-2A2,2 0 0,1 2,0Z\",backoff:0,noRotate:!0},{path:\"M2,2V-2H-2V2Z\",backoff:0,noRotate:!0}]},50215:function(t,e,r){\"use strict\";var n=r(82884),i=r(41940),a=r(85555),o=r(44467).templatedArray;r(24695),t.exports=o(\"annotation\",{visible:{valType:\"boolean\",dflt:!0,editType:\"calc+arraydraw\"},text:{valType:\"string\",editType:\"calc+arraydraw\"},textangle:{valType:\"angle\",dflt:0,editType:\"calc+arraydraw\"},font:i({editType:\"calc+arraydraw\",colorEditType:\"arraydraw\"}),width:{valType:\"number\",min:1,dflt:null,editType:\"calc+arraydraw\"},height:{valType:\"number\",min:1,dflt:null,editType:\"calc+arraydraw\"},opacity:{valType:\"number\",min:0,max:1,dflt:1,editType:\"arraydraw\"},align:{valType:\"enumerated\",values:[\"left\",\"center\",\"right\"],dflt:\"center\",editType:\"arraydraw\"},valign:{valType:\"enumerated\",values:[\"top\",\"middle\",\"bottom\"],dflt:\"middle\",editType:\"arraydraw\"},bgcolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\",editType:\"arraydraw\"},bordercolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\",editType:\"arraydraw\"},borderpad:{valType:\"number\",min:0,dflt:1,editType:\"calc+arraydraw\"},borderwidth:{valType:\"number\",min:0,dflt:1,editType:\"calc+arraydraw\"},showarrow:{valType:\"boolean\",dflt:!0,editType:\"calc+arraydraw\"},arrowcolor:{valType:\"color\",editType:\"arraydraw\"},arrowhead:{valType:\"integer\",min:0,max:n.length,dflt:1,editType:\"arraydraw\"},startarrowhead:{valType:\"integer\",min:0,max:n.length,dflt:1,editType:\"arraydraw\"},arrowside:{valType:\"flaglist\",flags:[\"end\",\"start\"],extras:[\"none\"],dflt:\"end\",editType:\"arraydraw\"},arrowsize:{valType:\"number\",min:.3,dflt:1,editType:\"calc+arraydraw\"},startarrowsize:{valType:\"number\",min:.3,dflt:1,editType:\"calc+arraydraw\"},arrowwidth:{valType:\"number\",min:.1,editType:\"calc+arraydraw\"},standoff:{valType:\"number\",min:0,dflt:0,editType:\"calc+arraydraw\"},startstandoff:{valType:\"number\",min:0,dflt:0,editType:\"calc+arraydraw\"},ax:{valType:\"any\",editType:\"calc+arraydraw\"},ay:{valType:\"any\",editType:\"calc+arraydraw\"},axref:{valType:\"enumerated\",dflt:\"pixel\",values:[\"pixel\",a.idRegex.x.toString()],editType:\"calc\"},ayref:{valType:\"enumerated\",dflt:\"pixel\",values:[\"pixel\",a.idRegex.y.toString()],editType:\"calc\"},xref:{valType:\"enumerated\",values:[\"paper\",a.idRegex.x.toString()],editType:\"calc\"},x:{valType:\"any\",editType:\"calc+arraydraw\"},xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"auto\",editType:\"calc+arraydraw\"},xshift:{valType:\"number\",dflt:0,editType:\"calc+arraydraw\"},yref:{valType:\"enumerated\",values:[\"paper\",a.idRegex.y.toString()],editType:\"calc\"},y:{valType:\"any\",editType:\"calc+arraydraw\"},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"auto\",editType:\"calc+arraydraw\"},yshift:{valType:\"number\",dflt:0,editType:\"calc+arraydraw\"},clicktoshow:{valType:\"enumerated\",values:[!1,\"onoff\",\"onout\"],dflt:!1,editType:\"arraydraw\"},xclick:{valType:\"any\",editType:\"arraydraw\"},yclick:{valType:\"any\",editType:\"arraydraw\"},hovertext:{valType:\"string\",editType:\"arraydraw\"},hoverlabel:{bgcolor:{valType:\"color\",editType:\"arraydraw\"},bordercolor:{valType:\"color\",editType:\"arraydraw\"},font:i({editType:\"arraydraw\"}),editType:\"arraydraw\"},captureevents:{valType:\"boolean\",editType:\"arraydraw\"},editType:\"calc\",_deprecated:{ref:{valType:\"string\",editType:\"calc\"}}})},3749:function(t,e,r){\"use strict\";var n=r(71828),i=r(89298),a=r(92605).draw;function o(t){var e=t._fullLayout;n.filterVisible(e.annotations).forEach((function(e){var r=i.getFromId(t,e.xref),n=i.getFromId(t,e.yref),a=i.getRefType(e.xref),o=i.getRefType(e.yref);e._extremes={},\"range\"===a&&s(e,r),\"range\"===o&&s(e,n)}))}function s(t,e){var r,n=e._id,a=n.charAt(0),o=t[a],s=t[\"a\"+a],l=t[a+\"ref\"],u=t[\"a\"+a+\"ref\"],c=t[\"_\"+a+\"padplus\"],f=t[\"_\"+a+\"padminus\"],h={x:1,y:-1}[a]*t[a+\"shift\"],p=3*t.arrowsize*t.arrowwidth||0,d=p+h,v=p-h,g=3*t.startarrowsize*t.arrowwidth||0,y=g+h,m=g-h;if(u===l){var x=i.findExtremes(e,[e.r2c(o)],{ppadplus:d,ppadminus:v}),b=i.findExtremes(e,[e.r2c(s)],{ppadplus:Math.max(c,y),ppadminus:Math.max(f,m)});r={min:[x.min[0],b.min[0]],max:[x.max[0],b.max[0]]}}else y=s?y+s:y,m=s?m-s:m,r=i.findExtremes(e,[e.r2c(o)],{ppadplus:Math.max(c,d,y),ppadminus:Math.max(f,v,m)});t._extremes[n]=r}t.exports=function(t){var e=t._fullLayout;if(n.filterVisible(e.annotations).length&&t._fullData.length)return n.syncOrAsync([a,o],t)}},44317:function(t,e,r){\"use strict\";var n=r(71828),i=r(73972),a=r(44467).arrayEditor;function o(t,e){var r,n,i,a,o,l,u,c=t._fullLayout.annotations,f=[],h=[],p=[],d=(e||[]).length;for(r=0;r0||r.explicitOff.length>0},onClick:function(t,e){var r,s,l=o(t,e),u=l.on,c=l.off.concat(l.explicitOff),f={},h=t._fullLayout.annotations;if(u.length||c.length){for(r=0;r2/3?\"right\":\"center\"),{center:0,middle:0,left:.5,bottom:-.5,right:-.5,top:.5}[e]}for(var Y=!1,W=[\"x\",\"y\"],X=0;X1)&&(nt===rt?((pt=it.r2fraction(e[\"a\"+et]))<0||pt>1)&&(Y=!0):Y=!0),J=it._offset+it.r2p(e[et]),Q=.5}else{var dt=\"domain\"===ht;\"x\"===et?($=e[et],J=dt?it._offset+it._length*$:J=T.l+T.w*$):($=1-e[et],J=dt?it._offset+it._length*$:J=T.t+T.h*$),Q=e.showarrow?.5:$}if(e.showarrow){ft.head=J;var vt=e[\"a\"+et];if(tt=ot*q(.5,e.xanchor)-st*q(.5,e.yanchor),nt===rt){var gt=l.getRefType(nt);\"domain\"===gt?(\"y\"===et&&(vt=1-vt),ft.tail=it._offset+it._length*vt):\"paper\"===gt?\"y\"===et?(vt=1-vt,ft.tail=T.t+T.h*vt):ft.tail=T.l+T.w*vt:ft.tail=it._offset+it.r2p(vt),K=tt}else ft.tail=J+vt,K=tt+vt;ft.text=ft.tail+tt;var yt=w[\"x\"===et?\"width\":\"height\"];if(\"paper\"===rt&&(ft.head=o.constrain(ft.head,1,yt-1)),\"pixel\"===nt){var mt=-Math.max(ft.tail-3,ft.text),xt=Math.min(ft.tail+3,ft.text)-yt;mt>0?(ft.tail+=mt,ft.text+=mt):xt>0&&(ft.tail-=xt,ft.text-=xt)}ft.tail+=ct,ft.head+=ct}else K=tt=lt*q(Q,ut),ft.text=J+tt;ft.text+=ct,tt+=ct,K+=ct,e[\"_\"+et+\"padplus\"]=lt/2+K,e[\"_\"+et+\"padminus\"]=lt/2-K,e[\"_\"+et+\"size\"]=lt,e[\"_\"+et+\"shift\"]=tt}if(Y)R.remove();else{var bt=0,_t=0;if(\"left\"!==e.align&&(bt=(A-b)*(\"center\"===e.align?.5:1)),\"top\"!==e.valign&&(_t=(z-_)*(\"middle\"===e.valign?.5:1)),f)n.select(\"svg\").attr({x:N+bt-1,y:N+_t}).call(c.setClipUrl,U?L:null,t);else{var wt=N+_t-v.top,Tt=N+bt-v.left;G.call(h.positionText,Tt,wt).call(c.setClipUrl,U?L:null,t)}V.select(\"rect\").call(c.setRect,N,N,A,z),j.call(c.setRect,F/2,F/2,B-F,H-F),R.call(c.setTranslate,Math.round(C.x.text-B/2),Math.round(C.y.text-H/2)),I.attr({transform:\"rotate(\"+P+\",\"+C.x.text+\",\"+C.y.text+\")\"});var kt,At=function(r,n){O.selectAll(\".annotation-arrow-g\").remove();var l=C.x.head,f=C.y.head,h=C.x.tail+r,p=C.y.tail+n,v=C.x.text+r,b=C.y.text+n,_=o.rotationXYMatrix(P,v,b),w=o.apply2DTransform(_),A=o.apply2DTransform2(_),L=+j.attr(\"width\"),D=+j.attr(\"height\"),z=v-.5*L,F=z+L,B=b-.5*D,N=B+D,U=[[z,B,z,N],[z,N,F,N],[F,N,F,B],[F,B,z,B]].map(A);if(!U.reduce((function(t,e){return t^!!o.segmentsIntersect(l,f,l+1e6,f+1e6,e[0],e[1],e[2],e[3])}),!1)){U.forEach((function(t){var e=o.segmentsIntersect(h,p,l,f,t[0],t[1],t[2],t[3]);e&&(h=e.x,p=e.y)}));var V=e.arrowwidth,H=e.arrowcolor,q=e.arrowside,G=O.append(\"g\").style({opacity:u.opacity(H)}).classed(\"annotation-arrow-g\",!0),Z=G.append(\"path\").attr(\"d\",\"M\"+h+\",\"+p+\"L\"+l+\",\"+f).style(\"stroke-width\",V+\"px\").call(u.stroke,u.rgb(H));if(g(Z,q,e),k.annotationPosition&&Z.node().parentNode&&!a){var Y=l,W=f;if(e.standoff){var X=Math.sqrt(Math.pow(l-h,2)+Math.pow(f-p,2));Y+=e.standoff*(h-l)/X,W+=e.standoff*(p-f)/X}var J,K,$=G.append(\"path\").classed(\"annotation-arrow\",!0).classed(\"anndrag\",!0).classed(\"cursor-move\",!0).attr({d:\"M3,3H-3V-3H3ZM0,0L\"+(h-Y)+\",\"+(p-W),transform:s(Y,W)}).style(\"stroke-width\",V+6+\"px\").call(u.stroke,\"rgba(0,0,0,0)\").call(u.fill,\"rgba(0,0,0,0)\");d.init({element:$.node(),gd:t,prepFn:function(){var t=c.getTranslate(R);J=t.x,K=t.y,y&&y.autorange&&M(y._name+\".autorange\",!0),x&&x.autorange&&M(x._name+\".autorange\",!0)},moveFn:function(t,r){var n=w(J,K),i=n[0]+t,a=n[1]+r;R.call(c.setTranslate,i,a),S(\"x\",m(y,t,\"x\",T,e)),S(\"y\",m(x,r,\"y\",T,e)),e.axref===e.xref&&S(\"ax\",m(y,t,\"ax\",T,e)),e.ayref===e.yref&&S(\"ay\",m(x,r,\"ay\",T,e)),G.attr(\"transform\",s(t,r)),I.attr({transform:\"rotate(\"+P+\",\"+i+\",\"+a+\")\"})},doneFn:function(){i.call(\"_guiRelayout\",t,E());var e=document.querySelector(\".js-notes-box-panel\");e&&e.redraw(e.selectedObj)}})}}};e.showarrow&&At(0,0),D&&d.init({element:R.node(),gd:t,prepFn:function(){kt=I.attr(\"transform\")},moveFn:function(t,r){var n=\"pointer\";if(e.showarrow)e.axref===e.xref?S(\"ax\",m(y,t,\"ax\",T,e)):S(\"ax\",e.ax+t),e.ayref===e.yref?S(\"ay\",m(x,r,\"ay\",T.w,e)):S(\"ay\",e.ay+r),At(t,r);else{if(a)return;var i,o;if(y)i=m(y,t,\"x\",T,e);else{var l=e._xsize/T.w,u=e.x+(e._xshift-e.xshift)/T.w-l/2;i=d.align(u+t/T.w,l,0,1,e.xanchor)}if(x)o=m(x,r,\"y\",T,e);else{var c=e._ysize/T.h,f=e.y-(e._yshift+e.yshift)/T.h-c/2;o=d.align(f-r/T.h,c,0,1,e.yanchor)}S(\"x\",i),S(\"y\",o),y&&x||(n=d.getCursor(y?.5:i,x?.5:o,e.xanchor,e.yanchor))}I.attr({transform:s(t,r)+kt}),p(R,n)},clickFn:function(r,n){e.captureevents&&t.emit(\"plotly_clickannotation\",Z(n))},doneFn:function(){p(R),i.call(\"_guiRelayout\",t,E());var e=document.querySelector(\".js-notes-box-panel\");e&&e.redraw(e.selectedObj)}})}}}t.exports={draw:function(t){var e=t._fullLayout;e._infolayer.selectAll(\".annotation\").remove();for(var r=0;r=0,x=e.indexOf(\"end\")>=0,b=d.backoff*g+r.standoff,_=v.backoff*y+r.startstandoff;if(\"line\"===p.nodeName){o={x:+t.attr(\"x1\"),y:+t.attr(\"y1\")},c={x:+t.attr(\"x2\"),y:+t.attr(\"y2\")};var w=o.x-c.x,T=o.y-c.y;if(h=(f=Math.atan2(T,w))+Math.PI,b&&_&&b+_>Math.sqrt(w*w+T*T))return void D();if(b){if(b*b>w*w+T*T)return void D();var k=b*Math.cos(f),A=b*Math.sin(f);c.x+=k,c.y+=A,t.attr({x2:c.x,y2:c.y})}if(_){if(_*_>w*w+T*T)return void D();var M=_*Math.cos(f),S=_*Math.sin(f);o.x-=M,o.y-=S,t.attr({x1:o.x,y1:o.y})}}else if(\"path\"===p.nodeName){var E=p.getTotalLength(),L=\"\";if(E1){u=!0;break}}u?t.fullLayout._infolayer.select(\".annotation-\"+t.id+'[data-index=\"'+s+'\"]').remove():(l._pdata=i(t.glplot.cameraParams,[e.xaxis.r2l(l.x)*r[0],e.yaxis.r2l(l.y)*r[1],e.zaxis.r2l(l.z)*r[2]]),n(t.graphDiv,l,s,t.id,l._xa,l._ya))}}},2468:function(t,e,r){\"use strict\";var n=r(73972),i=r(71828);t.exports={moduleType:\"component\",name:\"annotations3d\",schema:{subplots:{scene:{annotations:r(26997)}}},layoutAttributes:r(26997),handleDefaults:r(20226),includeBasePlot:function(t,e){var r=n.subplotsRegistry.gl3d;if(r)for(var a=r.attrRegex,o=Object.keys(t),s=0;s=0))return t;if(3===o)n[o]>1&&(n[o]=1);else if(n[o]>=1)return t}var s=Math.round(255*n[0])+\", \"+Math.round(255*n[1])+\", \"+Math.round(255*n[2]);return a?\"rgba(\"+s+\", \"+n[3]+\")\":\"rgb(\"+s+\")\"}o.tinyRGB=function(t){var e=t.toRgb();return\"rgb(\"+Math.round(e.r)+\", \"+Math.round(e.g)+\", \"+Math.round(e.b)+\")\"},o.rgb=function(t){return o.tinyRGB(n(t))},o.opacity=function(t){return t?n(t).getAlpha():0},o.addOpacity=function(t,e){var r=n(t).toRgb();return\"rgba(\"+Math.round(r.r)+\", \"+Math.round(r.g)+\", \"+Math.round(r.b)+\", \"+e+\")\"},o.combine=function(t,e){var r=n(t).toRgb();if(1===r.a)return n(t).toRgbString();var i=n(e||u).toRgb(),a=1===i.a?i:{r:255*(1-i.a)+i.r*i.a,g:255*(1-i.a)+i.g*i.a,b:255*(1-i.a)+i.b*i.a},o={r:a.r*(1-r.a)+r.r*r.a,g:a.g*(1-r.a)+r.g*r.a,b:a.b*(1-r.a)+r.b*r.a};return n(o).toRgbString()},o.contrast=function(t,e,r){var i=n(t);return 1!==i.getAlpha()&&(i=n(o.combine(t,u))),(i.isDark()?e?i.lighten(e):u:r?i.darken(r):l).toString()},o.stroke=function(t,e){var r=n(e);t.style({stroke:o.tinyRGB(r),\"stroke-opacity\":r.getAlpha()})},o.fill=function(t,e){var r=n(e);t.style({fill:o.tinyRGB(r),\"fill-opacity\":r.getAlpha()})},o.clean=function(t){if(t&&\"object\"==typeof t){var e,r,n,i,s=Object.keys(t);for(e=0;e0?n>=l:n<=l));i++)n>c&&n0?n>=l:n<=l));i++)n>r[0]&&n1){var pt=Math.pow(10,Math.floor(Math.log(ht)/Math.LN10));ct*=pt*u.roundUp(ht/pt,[2,5,10]),(Math.abs(Z.start)/Z.size+1e-6)%1<2e-6&&(lt.tick0=0)}lt.dtick=ct}lt.domain=o?[ot+O/B.h,ot+Q-O/B.h]:[ot+P/B.w,ot+Q-P/B.w],lt.setScale(),t.attr(\"transform\",c(Math.round(B.l),Math.round(B.t)));var dt,vt=t.select(\".\"+A.cbtitleunshift).attr(\"transform\",c(-Math.round(B.l),-Math.round(B.t))),gt=lt.ticklabelposition,yt=lt.title.font.size,mt=t.select(\".\"+A.cbaxis),xt=0,bt=0;function _t(n,i){var a={propContainer:lt,propName:e._propPrefix+\"title\",traceIndex:e._traceIndex,_meta:e._meta,placeholder:F._dfltTitle.colorbar,containerGroup:t.select(\".\"+A.cbtitle)},o=\"h\"===n.charAt(0)?n.substr(1):\"h\"+n;t.selectAll(\".\"+o+\",.\"+o+\"-math-group\").remove(),v.draw(r,n,f(a,i||{}))}return u.syncOrAsync([a.previousPromises,function(){var t,e;(o&&ut||!o&&!ut)&&(\"top\"===V&&(t=P+B.l+tt*I,e=O+B.t+et*(1-ot-Q)+3+.75*yt),\"bottom\"===V&&(t=P+B.l+tt*I,e=O+B.t+et*(1-ot)-3-.25*yt),\"right\"===V&&(e=O+B.t+et*D+3+.75*yt,t=P+B.l+tt*ot),_t(lt._id+\"title\",{attributes:{x:t,y:e,\"text-anchor\":o?\"start\":\"middle\"}}))},function(){if(!o&&!ut||o&&ut){var a,l=t.select(\".\"+A.cbtitle),f=l.select(\"text\"),h=[-M/2,M/2],d=l.select(\".h\"+lt._id+\"title-math-group\").node(),v=15.6;if(f.node()&&(v=parseInt(f.node().style.fontSize,10)*w),d?(a=p.bBox(d),bt=a.width,(xt=a.height)>v&&(h[1]-=(xt-v)/2)):f.node()&&!f.classed(A.jsPlaceholder)&&(a=p.bBox(f.node()),bt=a.width,xt=a.height),o){if(xt){if(xt+=5,\"top\"===V)lt.domain[1]-=xt/B.h,h[1]*=-1;else{lt.domain[0]+=xt/B.h;var y=g.lineCount(f);h[1]+=(1-y)*v}l.attr(\"transform\",c(h[0],h[1])),lt.setScale()}}else bt&&(\"right\"===V&&(lt.domain[0]+=(bt+yt/2)/B.w),l.attr(\"transform\",c(h[0],h[1])),lt.setScale())}t.selectAll(\".\"+A.cbfills+\",.\"+A.cblines).attr(\"transform\",o?c(0,Math.round(B.h*(1-lt.domain[1]))):c(Math.round(B.w*lt.domain[0]),0)),mt.attr(\"transform\",o?c(0,Math.round(-B.t)):c(Math.round(-B.l),0));var m=t.select(\".\"+A.cbfills).selectAll(\"rect.\"+A.cbfill).attr(\"style\",\"\").data(W);m.enter().append(\"rect\").classed(A.cbfill,!0).attr(\"style\",\"\"),m.exit().remove();var x=H.map(lt.c2p).map(Math.round).sort((function(t,e){return t-e}));m.each((function(t,a){var s=[0===a?H[0]:(W[a]+W[a-1])/2,a===W.length-1?H[1]:(W[a]+W[a+1])/2].map(lt.c2p).map(Math.round);o&&(s[1]=u.constrain(s[1]+(s[1]>s[0])?1:-1,x[0],x[1]));var l=n.select(this).attr(o?\"x\":\"y\",rt).attr(o?\"y\":\"x\",n.min(s)).attr(o?\"width\":\"height\",Math.max(J,2)).attr(o?\"height\":\"width\",Math.max(n.max(s)-n.min(s),2));if(e._fillgradient)p.gradient(l,r,e._id,o?\"vertical\":\"horizontalreversed\",e._fillgradient,\"fill\");else{var c=G(t).replace(\"e-\",\"\");l.attr(\"fill\",i(c).toHexString())}}));var b=t.select(\".\"+A.cblines).selectAll(\"path.\"+A.cbline).data(j.color&&j.width?X:[]);b.enter().append(\"path\").classed(A.cbline,!0),b.exit().remove(),b.each((function(t){var e=rt,r=Math.round(lt.c2p(t))+j.width/2%1;n.select(this).attr(\"d\",\"M\"+(o?e+\",\"+r:r+\",\"+e)+(o?\"h\":\"v\")+J).call(p.lineGroupStyle,j.width,q(t),j.dash)})),mt.selectAll(\"g.\"+lt._id+\"tick,path\").remove();var _=rt+J+(M||0)/2-(\"outside\"===e.ticks?1:0),T=s.calcTicks(lt),k=s.getTickSigns(lt)[2];return s.drawTicks(r,lt,{vals:\"inside\"===lt.ticks?s.clipEnds(lt,T):T,layer:mt,path:s.makeTickPath(lt,_,k),transFn:s.makeTransTickFn(lt)}),s.drawLabels(r,lt,{vals:T,layer:mt,transFn:s.makeTransTickLabelFn(lt),labelFns:s.makeLabelFns(lt,_)})},function(){if(o&&!ut||!o&&ut){var t,i,a=lt.position||0,s=lt._offset+lt._length/2;if(\"right\"===V)i=s,t=B.l+tt*a+10+yt*(lt.showticklabels?1:.5);else if(t=s,\"bottom\"===V&&(i=B.t+et*a+10+(-1===gt.indexOf(\"inside\")?lt.tickfont.size:0)+(\"intside\"!==lt.ticks&&e.ticklen||0)),\"top\"===V){var l=U.text.split(\" \").length;i=B.t+et*a+10-J-w*yt*l}_t((o?\"h\":\"v\")+lt._id+\"title\",{avoid:{selection:n.select(r).selectAll(\"g.\"+lt._id+\"tick\"),side:V,offsetTop:o?0:B.t,offsetLeft:o?B.l:0,maxShift:o?F.width:F.height},attributes:{x:t,y:i,\"text-anchor\":\"middle\"},transform:{rotate:o?-90:0,offset:0}})}},a.previousPromises,function(){var n,s=J+M/2;-1===gt.indexOf(\"inside\")&&(n=p.bBox(mt.node()),s+=o?n.width:n.height),dt=vt.select(\"text\");var u=0,f=o&&\"top\"===V,v=!o&&\"right\"===V,g=0;if(dt.node()&&!dt.classed(A.jsPlaceholder)){var m,x=vt.select(\".h\"+lt._id+\"title-math-group\").node();x&&(o&&ut||!o&&!ut)?(u=(n=p.bBox(x)).width,m=n.height):(u=(n=p.bBox(vt.node())).right-B.l-(o?rt:st),m=n.bottom-B.t-(o?st:rt),o||\"top\"!==V||(s+=n.height,g=n.height)),v&&(dt.attr(\"transform\",c(u/2+yt/2,0)),u*=2),s=Math.max(s,o?u:m)}var b=2*(o?P:O)+s+S+M/2,w=0;!o&&U.text&&\"bottom\"===C&&D<=0&&(b+=w=b/2,g+=w),F._hColorbarMoveTitle=w,F._hColorbarMoveCBTitle=g;var N=S+M,j=(o?rt:st)-N/2-(o?P:0),H=(o?st:rt)-(o?$:O+g-w);t.select(\".\"+A.cbbg).attr(\"x\",j).attr(\"y\",H).attr(o?\"width\":\"height\",Math.max(b-w,2)).attr(o?\"height\":\"width\",Math.max($+N,2)).call(d.fill,E).call(d.stroke,e.bordercolor).style(\"stroke-width\",S);var q=v?Math.max(u-10,0):0;t.selectAll(\".\"+A.cboutline).attr(\"x\",(o?rt:st+P)+q).attr(\"y\",(o?st+O-$:rt)+(f?xt:0)).attr(o?\"width\":\"height\",Math.max(J,2)).attr(o?\"height\":\"width\",Math.max($-(o?2*O+xt:2*P+q),2)).call(d.stroke,e.outlinecolor).style({fill:\"none\",\"stroke-width\":M});var G=o?nt*b:0,Z=o?0:(1-it)*b-g;if(G=R?B.l-G:-G,Z=z?B.t-Z:-Z,t.attr(\"transform\",c(G,Z)),!o&&(S||i(E).getAlpha()&&!i.equals(F.paper_bgcolor,E))){var Y=mt.selectAll(\"text\"),W=Y[0].length,X=t.select(\".\"+A.cbbg).node(),K=p.bBox(X),Q=p.getTranslate(t);Y.each((function(t,e){var r=W-1;if(0===e||e===r){var n,i=p.bBox(this),a=p.getTranslate(this);if(e===r){var o=i.right+a.x;(n=K.right+Q.x+st-S-2+I-o)>0&&(n=0)}else if(0===e){var s=i.left+a.x;(n=K.left+Q.x+st+S+2-s)<0&&(n=0)}n&&(W<3?this.setAttribute(\"transform\",\"translate(\"+n+\",0) \"+this.getAttribute(\"transform\")):this.setAttribute(\"visibility\",\"hidden\"))}}))}var tt={},et=T[L],at=k[L],ot=T[C],ct=k[C],ft=b-J;o?(\"pixels\"===h?(tt.y=D,tt.t=$*ot,tt.b=$*ct):(tt.t=tt.b=0,tt.yt=D+l*ot,tt.yb=D-l*ct),\"pixels\"===_?(tt.x=I,tt.l=b*et,tt.r=b*at):(tt.l=ft*et,tt.r=ft*at,tt.xl=I-y*et,tt.xr=I+y*at)):(\"pixels\"===h?(tt.x=I,tt.l=$*et,tt.r=$*at):(tt.l=tt.r=0,tt.xl=I+l*et,tt.xr=I-l*at),\"pixels\"===_?(tt.y=1-D,tt.t=b*ot,tt.b=b*ct):(tt.t=ft*ot,tt.b=ft*ct,tt.yt=D-y*ot,tt.yb=D+y*ct));var ht=e.y<.5?\"b\":\"t\",pt=e.x<.5?\"l\":\"r\";r._fullLayout._reservedMargin[e._id]={};var bt={r:F.width-j-G,l:j+tt.r,b:F.height-H-Z,t:H+tt.b};R&&z?a.autoMargin(r,e._id,tt):R?r._fullLayout._reservedMargin[e._id][ht]=bt[ht]:z||o?r._fullLayout._reservedMargin[e._id][pt]=bt[pt]:r._fullLayout._reservedMargin[e._id][ht]=bt[ht]}],r)}(r,e,t);y&&y.then&&(t._promises||[]).push(y),t._context.edits.colorbarPosition&&function(t,e,r){var n,i,a,s=\"v\"===e.orientation,u=r._fullLayout._size;l.init({element:t.node(),gd:r,prepFn:function(){n=t.attr(\"transform\"),h(t)},moveFn:function(r,o){t.attr(\"transform\",n+c(r,o)),i=l.align((s?e._uFrac:e._vFrac)+r/u.w,s?e._thickFrac:e._lenFrac,0,1,e.xanchor),a=l.align((s?e._vFrac:1-e._uFrac)-o/u.h,s?e._lenFrac:e._thickFrac,0,1,e.yanchor);var f=l.getCursor(i,a,e.xanchor,e.yanchor);h(t,f)},doneFn:function(){if(h(t),void 0!==i&&void 0!==a){var n={};n[e._propPrefix+\"x\"]=i,n[e._propPrefix+\"y\"]=a,void 0!==e._traceIndex?o.call(\"_guiRestyle\",r,n,e._traceIndex):o.call(\"_guiRelayout\",r,n)}}})}(r,e,t)})),e.exit().each((function(e){a.autoMargin(t,e._id)})).remove(),e.order()}}},76228:function(t,e,r){\"use strict\";var n=r(71828);t.exports=function(t){return n.isPlainObject(t.colorbar)}},12311:function(t,e,r){\"use strict\";t.exports={moduleType:\"component\",name:\"colorbar\",attributes:r(63583),supplyDefaults:r(62499),draw:r(98981).draw,hasColorbar:r(76228)}},50693:function(t,e,r){\"use strict\";var n=r(63583),i=r(30587).counter,a=r(78607),o=r(63282).scales;function s(t){return\"`\"+t+\"`\"}a(o),t.exports=function(t,e){t=t||\"\";var r,a=(e=e||{}).cLetter||\"c\",l=(\"onlyIfNumerical\"in e?e.onlyIfNumerical:Boolean(t),\"noScale\"in e?e.noScale:\"marker.line\"===t),u=\"showScaleDflt\"in e?e.showScaleDflt:\"z\"===a,c=\"string\"==typeof e.colorscaleDflt?o[e.colorscaleDflt]:null,f=e.editTypeOverride||\"\",h=t?t+\".\":\"\";\"colorAttr\"in e?(r=e.colorAttr,e.colorAttr):s(h+(r={z:\"z\",c:\"color\"}[a]));var p=a+\"auto\",d=a+\"min\",v=a+\"max\",g=a+\"mid\",y=(s(h+p),s(h+d),s(h+v),{});y[d]=y[v]=void 0;var m={};m[p]=!1;var x={};return\"color\"===r&&(x.color={valType:\"color\",arrayOk:!0,editType:f||\"style\"},e.anim&&(x.color.anim=!0)),x[p]={valType:\"boolean\",dflt:!0,editType:\"calc\",impliedEdits:y},x[d]={valType:\"number\",dflt:null,editType:f||\"plot\",impliedEdits:m},x[v]={valType:\"number\",dflt:null,editType:f||\"plot\",impliedEdits:m},x[g]={valType:\"number\",dflt:null,editType:\"calc\",impliedEdits:y},x.colorscale={valType:\"colorscale\",editType:\"calc\",dflt:c,impliedEdits:{autocolorscale:!1}},x.autocolorscale={valType:\"boolean\",dflt:!1!==e.autoColorDflt,editType:\"calc\",impliedEdits:{colorscale:void 0}},x.reversescale={valType:\"boolean\",dflt:!1,editType:\"plot\"},l||(x.showscale={valType:\"boolean\",dflt:u,editType:\"calc\"},x.colorbar=n),e.noColorAxis||(x.coloraxis={valType:\"subplotid\",regex:i(\"coloraxis\"),dflt:null,editType:\"calc\"}),x}},78803:function(t,e,r){\"use strict\";var n=r(92770),i=r(71828),a=r(52075).extractOpts;t.exports=function(t,e,r){var o,s=t._fullLayout,l=r.vals,u=r.containerStr,c=u?i.nestedProperty(e,u).get():e,f=a(c),h=!1!==f.auto,p=f.min,d=f.max,v=f.mid,g=function(){return i.aggNums(Math.min,null,l)},y=function(){return i.aggNums(Math.max,null,l)};void 0===p?p=g():h&&(p=c._colorAx&&n(p)?Math.min(p,g()):g()),void 0===d?d=y():h&&(d=c._colorAx&&n(d)?Math.max(d,y()):y()),h&&void 0!==v&&(d-v>v-p?p=v-(d-v):d-v=0?s.colorscale.sequential:s.colorscale.sequentialminus,f._sync(\"colorscale\",o))}},33046:function(t,e,r){\"use strict\";var n=r(71828),i=r(52075).hasColorscale,a=r(52075).extractOpts;t.exports=function(t,e){function r(t,e){var r=t[\"_\"+e];void 0!==r&&(t[e]=r)}function o(t,i){var o=i.container?n.nestedProperty(t,i.container).get():t;if(o)if(o.coloraxis)o._colorAx=e[o.coloraxis];else{var s=a(o),l=s.auto;(l||void 0===s.min)&&r(o,i.min),(l||void 0===s.max)&&r(o,i.max),s.autocolorscale&&r(o,\"colorscale\")}}for(var s=0;s=0;n--,i++){var a=t[n];r[i]=[1-a[0],a[1]]}return r}function d(t,e){e=e||{};for(var r=t.domain,o=t.range,l=o.length,u=new Array(l),c=0;c4/3-s?o:s}},70461:function(t,e,r){\"use strict\";var n=r(71828),i=[[\"sw-resize\",\"s-resize\",\"se-resize\"],[\"w-resize\",\"move\",\"e-resize\"],[\"nw-resize\",\"n-resize\",\"ne-resize\"]];t.exports=function(t,e,r,a){return t=\"left\"===r?0:\"center\"===r?1:\"right\"===r?2:n.constrain(Math.floor(3*t),0,2),e=\"bottom\"===a?0:\"middle\"===a?1:\"top\"===a?2:n.constrain(Math.floor(3*e),0,2),i[e][t]}},64505:function(t,e){\"use strict\";e.selectMode=function(t){return\"lasso\"===t||\"select\"===t},e.drawMode=function(t){return\"drawclosedpath\"===t||\"drawopenpath\"===t||\"drawline\"===t||\"drawrect\"===t||\"drawcircle\"===t},e.openMode=function(t){return\"drawline\"===t||\"drawopenpath\"===t},e.rectMode=function(t){return\"select\"===t||\"drawline\"===t||\"drawrect\"===t||\"drawcircle\"===t},e.freeMode=function(t){return\"lasso\"===t||\"drawclosedpath\"===t||\"drawopenpath\"===t},e.selectingOrDrawing=function(t){return e.freeMode(t)||e.rectMode(t)}},28569:function(t,e,r){\"use strict\";var n=r(48956),i=r(57035),a=r(38520),o=r(71828).removeElement,s=r(85555),l=t.exports={};l.align=r(92807),l.getCursor=r(70461);var u=r(26041);function c(){var t=document.createElement(\"div\");t.className=\"dragcover\";var e=t.style;return e.position=\"fixed\",e.left=0,e.right=0,e.top=0,e.bottom=0,e.zIndex=999999999,e.background=\"none\",document.body.appendChild(t),t}function f(t){return n(t.changedTouches?t.changedTouches[0]:t,document.body)}l.unhover=u.wrapped,l.unhoverRaw=u.raw,l.init=function(t){var e,r,n,u,h,p,d,v,g=t.gd,y=1,m=g._context.doubleClickDelay,x=t.element;g._mouseDownTime||(g._mouseDownTime=0),x.style.pointerEvents=\"all\",x.onmousedown=_,a?(x._ontouchstart&&x.removeEventListener(\"touchstart\",x._ontouchstart),x._ontouchstart=_,x.addEventListener(\"touchstart\",_,{passive:!1})):x.ontouchstart=_;var b=t.clampFn||function(t,e,r){return Math.abs(t)m&&(y=Math.max(y-1,1)),g._dragged)t.doneFn&&t.doneFn();else if(t.clickFn&&t.clickFn(y,p),!v){var r;try{r=new MouseEvent(\"click\",e)}catch(t){var n=f(e);(r=document.createEvent(\"MouseEvents\")).initMouseEvent(\"click\",e.bubbles,e.cancelable,e.view,e.detail,e.screenX,e.screenY,n[0],n[1],e.ctrlKey,e.altKey,e.shiftKey,e.metaKey,e.button,e.relatedTarget)}d.dispatchEvent(r)}g._dragging=!1,g._dragged=!1}else g._dragged=!1}},l.coverSlip=c},26041:function(t,e,r){\"use strict\";var n=r(11086),i=r(79990),a=r(24401).getGraphDiv,o=r(26675),s=t.exports={};s.wrapped=function(t,e,r){(t=a(t))._fullLayout&&i.clear(t._fullLayout._uid+o.HOVERID),s.raw(t,e,r)},s.raw=function(t,e){var r=t._fullLayout,i=t._hoverdata;e||(e={}),e.target&&!t._dragged&&!1===n.triggerHandler(t,\"plotly_beforehover\",e)||(r._hoverlayer.selectAll(\"g\").remove(),r._hoverlayer.selectAll(\"line\").remove(),r._hoverlayer.selectAll(\"circle\").remove(),t._hoverdata=void 0,e.target&&i&&t.emit(\"plotly_unhover\",{event:e,points:i}))}},79952:function(t,e){\"use strict\";e.P={valType:\"string\",values:[\"solid\",\"dot\",\"dash\",\"longdash\",\"dashdot\",\"longdashdot\"],dflt:\"solid\",editType:\"style\"},e.u={shape:{valType:\"enumerated\",values:[\"\",\"/\",\"\\\\\",\"x\",\"-\",\"|\",\"+\",\".\"],dflt:\"\",arrayOk:!0,editType:\"style\"},fillmode:{valType:\"enumerated\",values:[\"replace\",\"overlay\"],dflt:\"replace\",editType:\"style\"},bgcolor:{valType:\"color\",arrayOk:!0,editType:\"style\"},fgcolor:{valType:\"color\",arrayOk:!0,editType:\"style\"},fgopacity:{valType:\"number\",editType:\"style\",min:0,max:1},size:{valType:\"number\",min:0,dflt:8,arrayOk:!0,editType:\"style\"},solidity:{valType:\"number\",min:0,max:1,dflt:.3,arrayOk:!0,editType:\"style\"},editType:\"style\"}},91424:function(t,e,r){\"use strict\";var n=r(39898),i=r(71828),a=i.numberFormat,o=r(92770),s=r(84267),l=r(73972),u=r(7901),c=r(21081),f=i.strTranslate,h=r(63893),p=r(77922),d=r(18783).LINE_SPACING,v=r(37822).DESELECTDIM,g=r(34098),y=r(39984),m=r(23469).appendArrayPointValue,x=t.exports={};function b(t,e,r){var n=e.fillpattern,i=n&&x.getPatternAttr(n.shape,0,\"\");if(i){var a=x.getPatternAttr(n.bgcolor,0,null),o=x.getPatternAttr(n.fgcolor,0,null),s=n.fgopacity,l=x.getPatternAttr(n.size,0,8),c=x.getPatternAttr(n.solidity,0,.3),f=e.uid;x.pattern(t,\"point\",r,f,i,l,c,void 0,n.fillmode,a,o,s)}else e.fillcolor&&t.call(u.fill,e.fillcolor)}x.font=function(t,e,r,n){i.isPlainObject(e)&&(n=e.color,r=e.size,e=e.family),e&&t.style(\"font-family\",e),r+1&&t.style(\"font-size\",r+\"px\"),n&&t.call(u.fill,n)},x.setPosition=function(t,e,r){t.attr(\"x\",e).attr(\"y\",r)},x.setSize=function(t,e,r){t.attr(\"width\",e).attr(\"height\",r)},x.setRect=function(t,e,r,n,i){t.call(x.setPosition,e,r).call(x.setSize,n,i)},x.translatePoint=function(t,e,r,n){var i=r.c2p(t.x),a=n.c2p(t.y);return!!(o(i)&&o(a)&&e.node())&&(\"text\"===e.node().nodeName?e.attr(\"x\",i).attr(\"y\",a):e.attr(\"transform\",f(i,a)),!0)},x.translatePoints=function(t,e,r){t.each((function(t){var i=n.select(this);x.translatePoint(t,i,e,r)}))},x.hideOutsideRangePoint=function(t,e,r,n,i,a){e.attr(\"display\",r.isPtWithinRange(t,i)&&n.isPtWithinRange(t,a)?null:\"none\")},x.hideOutsideRangePoints=function(t,e){if(e._hasClipOnAxisFalse){var r=e.xaxis,i=e.yaxis;t.each((function(e){var a=e[0].trace,o=a.xcalendar,s=a.ycalendar,u=l.traceIs(a,\"bar-like\")?\".bartext\":\".point,.textpoint\";t.selectAll(u).each((function(t){x.hideOutsideRangePoint(t,n.select(this),r,i,o,s)}))}))}},x.crispRound=function(t,e,r){return e&&o(e)?t._context.staticPlot?e:e<1?1:Math.round(e):r||0},x.singleLineStyle=function(t,e,r,n,i){e.style(\"fill\",\"none\");var a=(((t||[])[0]||{}).trace||{}).line||{},o=r||a.width||0,s=i||a.dash||\"\";u.stroke(e,n||a.color),x.dashLine(e,s,o)},x.lineGroupStyle=function(t,e,r,i){t.style(\"fill\",\"none\").each((function(t){var a=(((t||[])[0]||{}).trace||{}).line||{},o=e||a.width||0,s=i||a.dash||\"\";n.select(this).call(u.stroke,r||a.color).call(x.dashLine,s,o)}))},x.dashLine=function(t,e,r){r=+r||0,e=x.dashStyle(e,r),t.style({\"stroke-dasharray\":e,\"stroke-width\":r+\"px\"})},x.dashStyle=function(t,e){e=+e||1;var r=Math.max(e,3);return\"solid\"===t?t=\"\":\"dot\"===t?t=r+\"px,\"+r+\"px\":\"dash\"===t?t=3*r+\"px,\"+3*r+\"px\":\"longdash\"===t?t=5*r+\"px,\"+5*r+\"px\":\"dashdot\"===t?t=3*r+\"px,\"+r+\"px,\"+r+\"px,\"+r+\"px\":\"longdashdot\"===t&&(t=5*r+\"px,\"+2*r+\"px,\"+r+\"px,\"+2*r+\"px\"),t},x.singleFillStyle=function(t,e){var r=n.select(t.node());b(t,((r.data()[0]||[])[0]||{}).trace||{},e)},x.fillGroupStyle=function(t,e){t.style(\"stroke-width\",0).each((function(t){var r=n.select(this);t[0].trace&&b(r,t[0].trace,e)}))};var _=r(90998);x.symbolNames=[],x.symbolFuncs=[],x.symbolBackOffs=[],x.symbolNeedLines={},x.symbolNoDot={},x.symbolNoFill={},x.symbolList=[],Object.keys(_).forEach((function(t){var e=_[t],r=e.n;x.symbolList.push(r,String(r),t,r+100,String(r+100),t+\"-open\"),x.symbolNames[r]=t,x.symbolFuncs[r]=e.f,x.symbolBackOffs[r]=e.backoff||0,e.needLine&&(x.symbolNeedLines[r]=!0),e.noDot?x.symbolNoDot[r]=!0:x.symbolList.push(r+200,String(r+200),t+\"-dot\",r+300,String(r+300),t+\"-open-dot\"),e.noFill&&(x.symbolNoFill[r]=!0)}));var w=x.symbolNames.length;function T(t,e,r,n){var i=t%100;return x.symbolFuncs[i](e,r,n)+(t>=200?\"M0,0.5L0.5,0L0,-0.5L-0.5,0Z\":\"\")}x.symbolNumber=function(t){if(o(t))t=+t;else if(\"string\"==typeof t){var e=0;t.indexOf(\"-open\")>0&&(e=100,t=t.replace(\"-open\",\"\")),t.indexOf(\"-dot\")>0&&(e+=200,t=t.replace(\"-dot\",\"\")),(t=x.symbolNames.indexOf(t))>=0&&(t+=e)}return t%100>=w||t>=400?0:Math.floor(Math.max(t,0))};var k={x1:1,x2:0,y1:0,y2:0},A={x1:0,x2:0,y1:1,y2:0},M=a(\"~f\"),S={radial:{node:\"radialGradient\"},radialreversed:{node:\"radialGradient\",reversed:!0},horizontal:{node:\"linearGradient\",attrs:k},horizontalreversed:{node:\"linearGradient\",attrs:k,reversed:!0},vertical:{node:\"linearGradient\",attrs:A},verticalreversed:{node:\"linearGradient\",attrs:A,reversed:!0}};x.gradient=function(t,e,r,a,o,l){for(var c=o.length,f=S[a],h=new Array(c),p=0;p=0&&void 0===t.i&&(t.i=o.i),e.style(\"opacity\",n.selectedOpacityFn?n.selectedOpacityFn(t):void 0===t.mo?s.opacity:t.mo),n.ms2mrc){var c;c=\"various\"===t.ms||\"various\"===s.size?3:n.ms2mrc(t.ms),t.mrc=c,n.selectedSizeFn&&(c=t.mrc=n.selectedSizeFn(t));var f=x.symbolNumber(t.mx||s.symbol)||0;t.om=f%200>=100;var h=rt(t,r),p=G(t,r);e.attr(\"d\",T(f,c,h,p))}var d,v,g,y=!1;if(t.so)g=l.outlierwidth,v=l.outliercolor,d=s.outliercolor;else{var m=(l||{}).width;g=(t.mlw+1||m+1||(t.trace?(t.trace.marker.line||{}).width:0)+1)-1||0,v=\"mlc\"in t?t.mlcc=n.lineScale(t.mlc):i.isArrayOrTypedArray(l.color)?u.defaultLine:l.color,i.isArrayOrTypedArray(s.color)&&(d=u.defaultLine,y=!0),d=\"mc\"in t?t.mcc=n.markerScale(t.mc):s.color||s.colors||\"rgba(0,0,0,0)\",n.selectedColorFn&&(d=n.selectedColorFn(t))}if(t.om)e.call(u.stroke,d).style({\"stroke-width\":(g||1)+\"px\",fill:\"none\"});else{e.style(\"stroke-width\",(t.isBlank?0:g)+\"px\");var b=s.gradient,_=t.mgt;_?y=!0:_=b&&b.type,i.isArrayOrTypedArray(_)&&(_=_[0],S[_]||(_=0));var w=s.pattern,k=w&&x.getPatternAttr(w.shape,t.i,\"\");if(_&&\"none\"!==_){var A=t.mgc;A?y=!0:A=b.color;var M=r.uid;y&&(M+=\"-\"+t.i),x.gradient(e,a,M,_,[[0,A],[1,d]],\"fill\")}else if(k){var E=!1,L=w.fgcolor;!L&&o&&o.color&&(L=o.color,E=!0);var C=x.getPatternAttr(L,t.i,o&&o.color||null),P=x.getPatternAttr(w.bgcolor,t.i,null),O=w.fgopacity,I=x.getPatternAttr(w.size,t.i,8),D=x.getPatternAttr(w.solidity,t.i,.3);E=E||t.mcc||i.isArrayOrTypedArray(w.shape)||i.isArrayOrTypedArray(w.bgcolor)||i.isArrayOrTypedArray(w.fgcolor)||i.isArrayOrTypedArray(w.size)||i.isArrayOrTypedArray(w.solidity);var z=r.uid;E&&(z+=\"-\"+t.i),x.pattern(e,\"point\",a,z,k,I,D,t.mcc,w.fillmode,P,C,O)}else i.isArrayOrTypedArray(d)?u.fill(e,d[t.i]):u.fill(e,d);g&&u.stroke(e,v)}},x.makePointStyleFns=function(t){var e={},r=t.marker;return e.markerScale=x.tryColorscale(r,\"\"),e.lineScale=x.tryColorscale(r,\"line\"),l.traceIs(t,\"symbols\")&&(e.ms2mrc=g.isBubble(t)?y(t):function(){return(r.size||6)/2}),t.selectedpoints&&i.extendFlat(e,x.makeSelectedPointStyleFns(t)),e},x.makeSelectedPointStyleFns=function(t){var e={},r=t.selected||{},n=t.unselected||{},a=t.marker||{},o=r.marker||{},s=n.marker||{},u=a.opacity,c=o.opacity,f=s.opacity,h=void 0!==c,p=void 0!==f;(i.isArrayOrTypedArray(u)||h||p)&&(e.selectedOpacityFn=function(t){var e=void 0===t.mo?a.opacity:t.mo;return t.selected?h?c:e:p?f:v*e});var d=a.color,g=o.color,y=s.color;(g||y)&&(e.selectedColorFn=function(t){var e=t.mcc||d;return t.selected?g||e:y||e});var m=a.size,x=o.size,b=s.size,_=void 0!==x,w=void 0!==b;return l.traceIs(t,\"symbols\")&&(_||w)&&(e.selectedSizeFn=function(t){var e=t.mrc||m/2;return t.selected?_?x/2:e:w?b/2:e}),e},x.makeSelectedTextStyleFns=function(t){var e={},r=t.selected||{},n=t.unselected||{},i=t.textfont||{},a=r.textfont||{},o=n.textfont||{},s=i.color,l=a.color,c=o.color;return e.selectedTextColorFn=function(t){var e=t.tc||s;return t.selected?l||e:c||(l?e:u.addOpacity(e,v))},e},x.selectedPointStyle=function(t,e){if(t.size()&&e.selectedpoints){var r=x.makeSelectedPointStyleFns(e),i=e.marker||{},a=[];r.selectedOpacityFn&&a.push((function(t,e){t.style(\"opacity\",r.selectedOpacityFn(e))})),r.selectedColorFn&&a.push((function(t,e){u.fill(t,r.selectedColorFn(e))})),r.selectedSizeFn&&a.push((function(t,n){var a=n.mx||i.symbol||0,o=r.selectedSizeFn(n);t.attr(\"d\",T(x.symbolNumber(a),o,rt(n,e),G(n,e))),n.mrc2=o})),a.length&&t.each((function(t){for(var e=n.select(this),r=0;r0?r:0}function I(t,e,r){return r&&(t=N(t)),e?z(t[1]):D(t[0])}function D(t){var e=n.round(t,2);return E=e,e}function z(t){var e=n.round(t,2);return L=e,e}function R(t,e,r,n){var i=t[0]-e[0],a=t[1]-e[1],o=r[0]-e[0],s=r[1]-e[1],l=Math.pow(i*i+a*a,.25),u=Math.pow(o*o+s*s,.25),c=(u*u*i-l*l*o)*n,f=(u*u*a-l*l*s)*n,h=3*u*(l+u),p=3*l*(l+u);return[[D(e[0]+(h&&c/h)),z(e[1]+(h&&f/h))],[D(e[0]-(p&&c/p)),z(e[1]-(p&&f/p))]]}x.textPointStyle=function(t,e,r){if(t.size()){var a;if(e.selectedpoints){var o=x.makeSelectedTextStyleFns(e);a=o.selectedTextColorFn}var s=e.texttemplate,l=r._fullLayout;t.each((function(t){var o=n.select(this),u=s?i.extractOption(t,e,\"txt\",\"texttemplate\"):i.extractOption(t,e,\"tx\",\"text\");if(u||0===u){if(s){var c=e._module.formatLabels,f=c?c(t,e,l):{},p={};m(p,e,t.i);var d=e._meta||{};u=i.texttemplateString(u,f,l._d3locale,p,t,d)}var v=t.tp||e.textposition,g=O(t,e),y=a?a(t):t.tc||e.textfont.color;o.call(x.font,t.tf||e.textfont.family,g,y).text(u).call(h.convertToTspans,r).call(P,v,g,t.mrc)}else o.remove()}))}},x.selectedTextStyle=function(t,e){if(t.size()&&e.selectedpoints){var r=x.makeSelectedTextStyleFns(e);t.each((function(t){var i=n.select(this),a=r.selectedTextColorFn(t),o=t.tp||e.textposition,s=O(t,e);u.fill(i,a);var c=l.traceIs(e,\"bar-like\");P(i,o,s,t.mrc2||t.mrc,c)}))}},x.smoothopen=function(t,e){if(t.length<3)return\"M\"+t.join(\"L\");var r,n=\"M\"+t[0],i=[];for(r=1;r=u||w>=f&&w<=u)&&(T<=h&&T>=c||T>=h&&T<=c)&&(t=[w,T])}return t}x.steps=function(t){var e=F[t]||B;return function(t){for(var r=\"M\"+D(t[0][0])+\",\"+z(t[0][1]),n=t.length,i=1;i=1e4&&(x.savedBBoxes={},j=0),r&&(x.savedBBoxes[r]=g),j++,i.extendFlat({},g)},x.setClipUrl=function(t,e,r){t.attr(\"clip-path\",V(e,r))},x.getTranslate=function(t){var e=(t[t.attr?\"attr\":\"getAttribute\"](\"transform\")||\"\").replace(/.*\\btranslate\\((-?\\d*\\.?\\d*)[^-\\d]*(-?\\d*\\.?\\d*)[^\\d].*/,(function(t,e,r){return[e,r].join(\" \")})).split(\" \");return{x:+e[0]||0,y:+e[1]||0}},x.setTranslate=function(t,e,r){var n=t.attr?\"attr\":\"getAttribute\",i=t.attr?\"attr\":\"setAttribute\",a=t[n](\"transform\")||\"\";return e=e||0,r=r||0,a=a.replace(/(\\btranslate\\(.*?\\);?)/,\"\").trim(),a=(a+=f(e,r)).trim(),t[i](\"transform\",a),a},x.getScale=function(t){var e=(t[t.attr?\"attr\":\"getAttribute\"](\"transform\")||\"\").replace(/.*\\bscale\\((\\d*\\.?\\d*)[^\\d]*(\\d*\\.?\\d*)[^\\d].*/,(function(t,e,r){return[e,r].join(\" \")})).split(\" \");return{x:+e[0]||1,y:+e[1]||1}},x.setScale=function(t,e,r){var n=t.attr?\"attr\":\"getAttribute\",i=t.attr?\"attr\":\"setAttribute\",a=t[n](\"transform\")||\"\";return e=e||1,r=r||1,a=a.replace(/(\\bscale\\(.*?\\);?)/,\"\").trim(),a=(a+=\"scale(\"+e+\",\"+r+\")\").trim(),t[i](\"transform\",a),a};var H=/\\s*sc.*/;x.setPointGroupScale=function(t,e,r){if(e=e||1,r=r||1,t){var n=1===e&&1===r?\"\":\"scale(\"+e+\",\"+r+\")\";t.each((function(){var t=(this.getAttribute(\"transform\")||\"\").replace(H,\"\");t=(t+=n).trim(),this.setAttribute(\"transform\",t)}))}};var q=/translate\\([^)]*\\)\\s*$/;function G(t,e){var r;return t&&(r=t.mf),void 0===r&&(r=e.marker&&e.marker.standoff||0),e._geo||e._xA?r:-r}x.setTextPointsScale=function(t,e,r){t&&t.each((function(){var t,i=n.select(this),a=i.select(\"text\");if(a.node()){var o=parseFloat(a.attr(\"x\")||0),s=parseFloat(a.attr(\"y\")||0),l=(i.attr(\"transform\")||\"\").match(q);t=1===e&&1===r?[]:[f(o,s),\"scale(\"+e+\",\"+r+\")\",f(-o,-s)],l&&t.push(l),i.attr(\"transform\",t.join(\"\"))}}))},x.getMarkerStandoff=G;var Z,Y,W,X,J,K,$=Math.atan2,Q=Math.cos,tt=Math.sin;function et(t,e){var r=e[0],n=e[1];return[r*Q(t)-n*tt(t),r*tt(t)+n*Q(t)]}function rt(t,e){var r,n,i=t.ma;void 0===i&&(i=e.marker.angle||0);var a=e.marker.angleref;if(\"previous\"===a||\"north\"===a){if(e._geo){var s=e._geo.project(t.lonlat);r=s[0],n=s[1]}else{var l=e._xA,u=e._yA;if(!l||!u)return 90;r=l.c2p(t.x),n=u.c2p(t.y)}if(e._geo){var c,f=t.lonlat[0],h=t.lonlat[1],p=e._geo.project([f,h+1e-5]),d=e._geo.project([f+1e-5,h]),v=$(d[1]-n,d[0]-r),g=$(p[1]-n,p[0]-r);if(\"north\"===a)c=i/180*Math.PI;else if(\"previous\"===a){var y=f/180*Math.PI,m=h/180*Math.PI,x=Z/180*Math.PI,b=Y/180*Math.PI,_=x-y,w=Q(b)*tt(_),T=tt(b)*Q(m)-Q(b)*tt(m)*Q(_);c=-$(w,T)-Math.PI,Z=f,Y=h}var k=et(v,[Q(c),0]),A=et(g,[tt(c),0]);i=$(k[1]+A[1],k[0]+A[0])/Math.PI*180,\"previous\"!==a||K===e.uid&&t.i===J+1||(i=null)}if(\"previous\"===a&&!e._geo)if(K===e.uid&&t.i===J+1&&o(r)&&o(n)){var M=r-W,S=n-X,E=e.line&&e.line.shape||\"\",L=E.slice(E.length-1);\"h\"===L&&(S=0),\"v\"===L&&(M=0),i+=$(S,M)/Math.PI*180+90}else i=null}return W=r,X=n,J=t.i,K=e.uid,i}x.getMarkerAngle=rt},90998:function(t,e,r){\"use strict\";var n,i,a,o,s=r(95616),l=r(39898).round,u=\"M0,0Z\",c=Math.sqrt(2),f=Math.sqrt(3),h=Math.PI,p=Math.cos,d=Math.sin;function v(t){return null===t}function g(t,e,r){if(!(t&&t%360!=0||e))return r;if(a===t&&o===e&&n===r)return i;function l(t,r){var n=p(t),i=d(t),a=r[0],o=r[1]+(e||0);return[a*n-o*i,a*i+o*n]}a=t,o=e,n=r;for(var u=t/180*h,c=0,f=0,v=s(r),g=\"\",y=0;y0,f=t._context.staticPlot;e.each((function(e){var h,p=e[0].trace,d=p.error_x||{},v=p.error_y||{};p.ids&&(h=function(t){return t.id});var g=o.hasMarkers(p)&&p.marker.maxdisplayed>0;v.visible||d.visible||(e=[]);var y=n.select(this).selectAll(\"g.errorbar\").data(e,h);if(y.exit().remove(),e.length){d.visible||y.selectAll(\"path.xerror\").remove(),v.visible||y.selectAll(\"path.yerror\").remove(),y.style(\"opacity\",1);var m=y.enter().append(\"g\").classed(\"errorbar\",!0);c&&m.style(\"opacity\",0).transition().duration(s.duration).style(\"opacity\",1),a.setClipUrl(y,r.layerClipId,t),y.each((function(t){var e=n.select(this),r=function(t,e,r){var n={x:e.c2p(t.x),y:r.c2p(t.y)};return void 0!==t.yh&&(n.yh=r.c2p(t.yh),n.ys=r.c2p(t.ys),i(n.ys)||(n.noYS=!0,n.ys=r.c2p(t.ys,!0))),void 0!==t.xh&&(n.xh=e.c2p(t.xh),n.xs=e.c2p(t.xs),i(n.xs)||(n.noXS=!0,n.xs=e.c2p(t.xs,!0))),n}(t,l,u);if(!g||t.vis){var a,o=e.select(\"path.yerror\");if(v.visible&&i(r.x)&&i(r.yh)&&i(r.ys)){var h=v.width;a=\"M\"+(r.x-h)+\",\"+r.yh+\"h\"+2*h+\"m-\"+h+\",0V\"+r.ys,r.noYS||(a+=\"m-\"+h+\",0h\"+2*h),o.size()?c&&(o=o.transition().duration(s.duration).ease(s.easing)):o=e.append(\"path\").style(\"vector-effect\",f?\"none\":\"non-scaling-stroke\").classed(\"yerror\",!0),o.attr(\"d\",a)}else o.remove();var p=e.select(\"path.xerror\");if(d.visible&&i(r.y)&&i(r.xh)&&i(r.xs)){var y=(d.copy_ystyle?v:d).width;a=\"M\"+r.xh+\",\"+(r.y-y)+\"v\"+2*y+\"m0,-\"+y+\"H\"+r.xs,r.noXS||(a+=\"m0,-\"+y+\"v\"+2*y),p.size()?c&&(p=p.transition().duration(s.duration).ease(s.easing)):p=e.append(\"path\").style(\"vector-effect\",f?\"none\":\"non-scaling-stroke\").classed(\"xerror\",!0),p.attr(\"d\",a)}else p.remove()}}))}}))}},62662:function(t,e,r){\"use strict\";var n=r(39898),i=r(7901);t.exports=function(t){t.each((function(t){var e=t[0].trace,r=e.error_y||{},a=e.error_x||{},o=n.select(this);o.selectAll(\"path.yerror\").style(\"stroke-width\",r.thickness+\"px\").call(i.stroke,r.color),a.copy_ystyle&&(a=r),o.selectAll(\"path.xerror\").style(\"stroke-width\",a.thickness+\"px\").call(i.stroke,a.color)}))}},77914:function(t,e,r){\"use strict\";var n=r(41940),i=r(528).hoverlabel,a=r(1426).extendFlat;t.exports={hoverlabel:{bgcolor:a({},i.bgcolor,{arrayOk:!0}),bordercolor:a({},i.bordercolor,{arrayOk:!0}),font:n({arrayOk:!0,editType:\"none\"}),align:a({},i.align,{arrayOk:!0}),namelength:a({},i.namelength,{arrayOk:!0}),editType:\"none\"}}},30732:function(t,e,r){\"use strict\";var n=r(71828),i=r(73972);function a(t,e,r,i){i=i||n.identity,Array.isArray(t)&&(e[0][r]=i(t))}t.exports=function(t){var e=t.calcdata,r=t._fullLayout;function o(t){return function(e){return n.coerceHoverinfo({hoverinfo:e},{_module:t._module},r)}}for(var s=0;s=0&&r.index_[0]._length||lt<0||lt>w[0]._length)return d.unhoverRaw(t,e)}else st=\"xpx\"in e?e.xpx:_[0]._length/2,lt=\"ypx\"in e?e.ypx:w[0]._length/2;if(e.pointerX=st+_[0]._offset,e.pointerY=lt+w[0]._offset,q=\"xval\"in e?y.flat(l,e.xval):y.p2c(_,st),G=\"yval\"in e?y.flat(l,e.yval):y.p2c(w,lt),!i(q[0])||!i(G[0]))return o.warn(\"Fx.hover failed\",e,t),d.unhoverRaw(t,e)}var ft=1/0;function ht(t,r){for(Y=0;Yrt&&(nt.splice(0,rt),ft=nt[0].distance),m&&0!==H&&0===nt.length){et.distance=H,et.index=!1;var f=X._module.hoverPoints(et,Q,tt,\"closest\",{hoverLayer:c._hoverlayer});if(f&&(f=f.filter((function(t){return t.spikeDistance<=H}))),f&&f.length){var h,d=f.filter((function(t){return t.xa.showspikes&&\"hovered data\"!==t.xa.spikesnap}));if(d.length){var v=d[0];i(v.x0)&&i(v.y0)&&(h=dt(v),(!at.vLinePoint||at.vLinePoint.spikeDistance>h.spikeDistance)&&(at.vLinePoint=h))}var g=f.filter((function(t){return t.ya.showspikes&&\"hovered data\"!==t.ya.spikesnap}));if(g.length){var x=g[0];i(x.x0)&&i(x.y0)&&(h=dt(x),(!at.hLinePoint||at.hLinePoint.spikeDistance>h.spikeDistance)&&(at.hLinePoint=h))}}}}}function pt(t,e,r){for(var n,i=null,a=1/0,o=0;o0&&Math.abs(t.distance)At-1;Mt--)Ct(nt[Mt]);nt=St,mt()}var Pt=t._hoverdata,Ot=[],It=U(t),Dt=V(t);for(Z=0;Z1||nt.length>1)||\"closest\"===I&&ot&&nt.length>1,Yt=p.combine(c.plot_bgcolor||p.background,c.paper_bgcolor),Wt=O(nt,{gd:t,hovermode:I,rotateLabels:Zt,bgColor:Yt,container:c._hoverlayer,outerContainer:c._paper.node(),commonLabelOpts:c.hoverlabel,hoverdistance:c.hoverdistance}),Xt=Wt.hoverLabels;if(y.isUnifiedHover(I)||(function(t,e,r,n){var i,a,o,s,l,u,c,f=e?\"xa\":\"ya\",h=e?\"ya\":\"xa\",p=0,d=1,v=t.size(),g=new Array(v),y=0,m=n.minX,x=n.maxX,b=n.minY,_=n.maxY,w=function(t){return t*r._invScaleX},k=function(t){return t*r._invScaleY};function A(t){var e=t[0],r=t[t.length-1];if(a=e.pmin-e.pos-e.dp+e.size,o=r.pos+r.dp+r.size-e.pmax,a>.01){for(l=t.length-1;l>=0;l--)t[l].dp+=a;i=!1}if(!(o<.01)){if(a<-.01){for(l=t.length-1;l>=0;l--)t[l].dp-=o;i=!1}if(i){var n=0;for(s=0;se.pmax&&n++;for(s=t.length-1;s>=0&&!(n<=0);s--)(u=t[s]).pos>e.pmax-1&&(u.del=!0,n--);for(s=0;s=0;l--)t[l].dp-=o;for(s=t.length-1;s>=0&&!(n<=0);s--)(u=t[s]).pos+u.dp+u.size>e.pmax&&(u.del=!0,n--)}}}for(t.each((function(t){var n=t[f],i=t[h],a=\"x\"===n._id.charAt(0),o=n.range;0===y&&o&&o[0]>o[1]!==a&&(d=-1);var s=0,l=a?r.width:r.height;if(\"x\"===r.hovermode||\"y\"===r.hovermode){var u,c,p=D(t,e),v=t.anchor,A=\"end\"===v?-1:1;if(\"middle\"===v)c=(u=t.crossPos+(a?k(p.y-t.by/2):w(t.bx/2+t.tx2width/2)))+(a?k(t.by):w(t.bx));else if(a)c=(u=t.crossPos+k(M+p.y)-k(t.by/2-M))+k(t.by);else{var S=w(A*M+p.x),E=S+w(A*t.bx);u=t.crossPos+Math.min(S,E),c=t.crossPos+Math.max(S,E)}a?void 0!==b&&void 0!==_&&Math.min(c,_)-Math.max(u,b)>1&&(\"left\"===i.side?(s=i._mainLinePosition,l=r.width):l=i._mainLinePosition):void 0!==m&&void 0!==x&&Math.min(c,x)-Math.max(u,m)>1&&(\"top\"===i.side?(s=i._mainLinePosition,l=r.height):l=i._mainLinePosition)}g[y++]=[{datum:t,traceIndex:t.trace.index,dp:0,pos:t.pos,posref:t.posref,size:t.by*(a?T:1)/2,pmin:s,pmax:l}]})),g.sort((function(t,e){return t[0].posref-e[0].posref||d*(e[0].traceIndex-t[0].traceIndex)}));!i&&p<=v;){for(p++,i=!0,s=0;s.01&&L.pmin===C.pmin&&L.pmax===C.pmax){for(l=E.length-1;l>=0;l--)E[l].dp+=a;for(S.push.apply(S,E),g.splice(s+1,1),c=0,l=S.length-1;l>=0;l--)c+=S[l].dp;for(o=c/S.length,l=S.length-1;l>=0;l--)S[l].dp-=o;i=!1}else s++}g.forEach(A)}for(s=g.length-1;s>=0;s--){var P=g[s];for(l=P.length-1;l>=0;l--){var O=P[l],I=O.datum;I.offset=O.dp,I.del=O.del}}}(Xt,Zt,c,Wt.commonLabelBoundingBox),z(Xt,Zt,c._invScaleX,c._invScaleY)),s&&s.tagName){var Jt=g.getComponentMethod(\"annotations\",\"hasClickToShow\")(t,Ot);f(n.select(s),Jt?\"pointer\":\"\")}s&&!a&&function(t,e,r){if(!r||r.length!==t._hoverdata.length)return!0;for(var n=r.length-1;n>=0;n--){var i=r[n],a=t._hoverdata[n];if(i.curveNumber!==a.curveNumber||String(i.pointNumber)!==String(a.pointNumber)||String(i.pointNumbers)!==String(a.pointNumbers))return!0}return!1}(t,0,Pt)&&(Pt&&t.emit(\"plotly_unhover\",{event:e,points:Pt}),t.emit(\"plotly_hover\",{event:e,points:t._hoverdata,xaxes:_,yaxes:w,xvals:q,yvals:G}))}(t,e,r,a,s)}))},e.loneHover=function(t,e){var r=!0;Array.isArray(t)||(r=!1,t=[t]);var i=e.gd,a=U(i),o=V(i),s=O(t.map((function(t){var r=t._x0||t.x0||t.x||0,n=t._x1||t.x1||t.x||0,s=t._y0||t.y0||t.y||0,l=t._y1||t.y1||t.y||0,u=t.eventData;if(u){var c=Math.min(r,n),f=Math.max(r,n),h=Math.min(s,l),d=Math.max(s,l),v=t.trace;if(g.traceIs(v,\"gl3d\")){var y=i._fullLayout[v.scene]._scene.container,m=y.offsetLeft,x=y.offsetTop;c+=m,f+=m,h+=x,d+=x}u.bbox={x0:c+o,x1:f+o,y0:h+a,y1:d+a},e.inOut_bbox&&e.inOut_bbox.push(u.bbox)}else u=!1;return{color:t.color||p.defaultLine,x0:t.x0||t.x||0,x1:t.x1||t.x||0,y0:t.y0||t.y||0,y1:t.y1||t.y||0,xLabel:t.xLabel,yLabel:t.yLabel,zLabel:t.zLabel,text:t.text,name:t.name,idealAlign:t.idealAlign,borderColor:t.borderColor,fontFamily:t.fontFamily,fontSize:t.fontSize,fontColor:t.fontColor,nameLength:t.nameLength,textAlign:t.textAlign,trace:t.trace||{index:0,hoverinfo:\"\"},xa:{_offset:0},ya:{_offset:0},index:0,hovertemplate:t.hovertemplate||!1,hovertemplateLabels:t.hovertemplateLabels||!1,eventData:u}})),{gd:i,hovermode:\"closest\",rotateLabels:!1,bgColor:e.bgColor||p.background,container:n.select(e.container),outerContainer:e.outerContainer||e.container}).hoverLabels,l=0,u=0;return s.sort((function(t,e){return t.y0-e.y0})).each((function(t,r){var n=t.y0-t.by/2;t.offset=n-5([\\s\\S]*)<\\/extra>/;function O(t,e){var r=e.gd,i=r._fullLayout,a=e.hovermode,u=e.rotateLabels,f=e.bgColor,d=e.container,v=e.outerContainer,w=e.commonLabelOpts||{};if(0===t.length)return[[]];var T=e.fontFamily||m.HOVERFONT,k=e.fontSize||m.HOVERFONTSIZE,A=t[0],E=A.xa,L=A.ya,P=a.charAt(0),O=P+\"Label\",D=A[O];if(void 0===D&&\"multicategory\"===E.type)for(var z=0;zi.width-b?(g=i.width-b,e.attr(\"d\",\"M\"+(b-M)+\",0L\"+b+\",\"+x+M+\"v\"+x+(2*S+m.height)+\"H-\"+b+\"V\"+x+M+\"H\"+(b-2*M)+\"Z\")):e.attr(\"d\",\"M0,0L\"+M+\",\"+x+M+\"H\"+b+\"v\"+x+(2*S+m.height)+\"H-\"+b+\"V\"+x+M+\"H-\"+M+\"Z\"),Y.minX=g-b,Y.maxX=g+b,\"top\"===E.side?(Y.minY=y-(2*S+m.height),Y.maxY=y-S):(Y.minY=y+S,Y.maxY=y+(2*S+m.height))}else{var _,C,P;\"right\"===L.side?(_=\"start\",C=1,P=\"\",g=E._offset+E._length):(_=\"end\",C=-1,P=\"-\",g=E._offset),y=L._offset+(A.y0+A.y1)/2,l.attr(\"text-anchor\",_),e.attr(\"d\",\"M0,0L\"+P+M+\",\"+M+\"V\"+(S+m.height/2)+\"h\"+P+(2*S+m.width)+\"V-\"+(S+m.height/2)+\"H\"+P+M+\"V-\"+M+\"Z\"),Y.minY=y-(S+m.height/2),Y.maxY=y+(S+m.height/2),\"right\"===L.side?(Y.minX=g+M,Y.maxX=g+M+(2*S+m.width)):(Y.minX=g-M-(2*S+m.width),Y.maxX=g-M);var O,I=m.height/2,z=F-m.top-I,R=\"clip\"+i._uid+\"commonlabel\"+L._id;if(g=0?lt:ut+ht=0?ut:bt+ht=0?ot:st+pt=0?st:_t+pt=0,\"top\"!==t.idealAlign&&G||!Z?G?(O+=R/2,t.anchor=\"start\"):t.anchor=\"middle\":(O-=R/2,t.anchor=\"end\"),t.crossPos=O;else{if(t.pos=O,G=P+z/2+Y<=B,Z=P-z/2-Y>=0,\"left\"!==t.idealAlign&&G||!Z)if(G)P+=z/2,t.anchor=\"start\";else{t.anchor=\"middle\";var W=Y/2,X=P+W-B,J=P-W;X>0&&(P-=X),J<0&&(P+=-J)}else P-=z/2,t.anchor=\"end\";t.crossPos=P}w.attr(\"text-anchor\",t.anchor),E&&A.attr(\"text-anchor\",t.anchor),e.attr(\"transform\",s(P,O)+(u?l(_):\"\"))})),{hoverLabels:wt,commonLabelBoundingBox:Y}}function I(t,e,r,n,i,a){var s=\"\",l=\"\";void 0!==t.nameOverride&&(t.name=t.nameOverride),t.name&&(t.trace._meta&&(t.name=o.templateString(t.name,t.trace._meta)),s=N(t.name,t.nameLength));var u=r.charAt(0),c=\"x\"===u?\"y\":\"x\";void 0!==t.zLabel?(void 0!==t.xLabel&&(l+=\"x: \"+t.xLabel+\" \"),void 0!==t.yLabel&&(l+=\"y: \"+t.yLabel+\" \"),\"choropleth\"!==t.trace.type&&\"choroplethmapbox\"!==t.trace.type&&(l+=(l?\"z: \":\"\")+t.zLabel)):e&&t[u+\"Label\"]===i?l=t[c+\"Label\"]||\"\":void 0===t.xLabel?void 0!==t.yLabel&&\"scattercarpet\"!==t.trace.type&&(l=t.yLabel):l=void 0===t.yLabel?t.xLabel:\"(\"+t.xLabel+\", \"+t.yLabel+\")\",!t.text&&0!==t.text||Array.isArray(t.text)||(l+=(l?\" \":\"\")+t.text),void 0!==t.extraText&&(l+=(l?\" \":\"\")+t.extraText),a&&\"\"===l&&!t.hovertemplate&&(\"\"===s&&a.remove(),l=s);var f=t.hovertemplate||!1;if(f){var h=t.hovertemplateLabels||t;t[u+\"Label\"]!==i&&(h[u+\"other\"]=h[u+\"Val\"],h[u+\"otherLabel\"]=h[u+\"Label\"]),l=(l=o.hovertemplateString(f,h,n._d3locale,t.eventData[0]||{},t.trace._meta)).replace(P,(function(e,r){return s=N(r,t.nameLength),\"\"}))}return[l,s]}function D(t,e){var r=0,n=t.offset;return e&&(n*=-A,r=t.offset*k),{x:r,y:n}}function z(t,e,r,i){var a=function(t){return t*r},o=function(t){return t*i};t.each((function(t){var r=n.select(this);if(t.del)return r.remove();var i,s,l,u,f=r.select(\"text.nums\"),p=t.anchor,d=\"end\"===p?-1:1,v=(u=(l=(s={start:1,end:-1,middle:0}[(i=t).anchor])*(M+S))+s*(i.txwidth+S),\"middle\"===i.anchor&&(l-=i.tx2width/2,u+=i.txwidth/2+S),{alignShift:s,textShiftX:l,text2ShiftX:u}),g=D(t,e),y=g.x,m=g.y,x=\"middle\"===p;r.select(\"path\").attr(\"d\",x?\"M-\"+a(t.bx/2+t.tx2width/2)+\",\"+o(m-t.by/2)+\"h\"+a(t.bx)+\"v\"+o(t.by)+\"h-\"+a(t.bx)+\"Z\":\"M0,0L\"+a(d*M+y)+\",\"+o(M+m)+\"v\"+o(t.by/2-M)+\"h\"+a(d*t.bx)+\"v-\"+o(t.by)+\"H\"+a(d*M+y)+\"V\"+o(m-M)+\"Z\");var b=y+v.textShiftX,_=m+t.ty0-t.by/2+S,w=t.textAlign||\"auto\";\"auto\"!==w&&(\"left\"===w&&\"start\"!==p?(f.attr(\"text-anchor\",\"start\"),b=x?-t.bx/2-t.tx2width/2+S:-t.bx-S):\"right\"===w&&\"end\"!==p&&(f.attr(\"text-anchor\",\"end\"),b=x?t.bx/2-t.tx2width/2-S:t.bx+S)),f.call(c.positionText,a(b),o(_)),t.tx2width&&(r.select(\"text.name\").call(c.positionText,a(v.text2ShiftX+v.alignShift*S+y),o(m+t.ty0-t.by/2+S)),r.select(\"rect\").call(h.setRect,a(v.text2ShiftX+(v.alignShift-1)*t.tx2width/2+y),o(m-t.by/2-1),a(t.tx2width),o(t.by+2)))}))}function R(t,e){var r=t.index,n=t.trace||{},a=t.cd[0],s=t.cd[r]||{};function l(t){return t||i(t)&&0===t}var u=Array.isArray(r)?function(t,e){var i=o.castOption(a,r,t);return l(i)?i:o.extractOption({},n,\"\",e)}:function(t,e){return o.extractOption(s,n,t,e)};function c(e,r,n){var i=u(r,n);l(i)&&(t[e]=i)}if(c(\"hoverinfo\",\"hi\",\"hoverinfo\"),c(\"bgcolor\",\"hbg\",\"hoverlabel.bgcolor\"),c(\"borderColor\",\"hbc\",\"hoverlabel.bordercolor\"),c(\"fontFamily\",\"htf\",\"hoverlabel.font.family\"),c(\"fontSize\",\"hts\",\"hoverlabel.font.size\"),c(\"fontColor\",\"htc\",\"hoverlabel.font.color\"),c(\"nameLength\",\"hnl\",\"hoverlabel.namelength\"),c(\"textAlign\",\"hta\",\"hoverlabel.align\"),t.posref=\"y\"===e||\"closest\"===e&&\"h\"===n.orientation?t.xa._offset+(t.x0+t.x1)/2:t.ya._offset+(t.y0+t.y1)/2,t.x0=o.constrain(t.x0,0,t.xa._length),t.x1=o.constrain(t.x1,0,t.xa._length),t.y0=o.constrain(t.y0,0,t.ya._length),t.y1=o.constrain(t.y1,0,t.ya._length),void 0!==t.xLabelVal&&(t.xLabel=\"xLabel\"in t?t.xLabel:v.hoverLabelText(t.xa,t.xLabelVal,n.xhoverformat),t.xVal=t.xa.c2d(t.xLabelVal)),void 0!==t.yLabelVal&&(t.yLabel=\"yLabel\"in t?t.yLabel:v.hoverLabelText(t.ya,t.yLabelVal,n.yhoverformat),t.yVal=t.ya.c2d(t.yLabelVal)),void 0!==t.zLabelVal&&void 0===t.zLabel&&(t.zLabel=String(t.zLabelVal)),!(isNaN(t.xerr)||\"log\"===t.xa.type&&t.xerr<=0)){var f=v.tickText(t.xa,t.xa.c2l(t.xerr),\"hover\").text;void 0!==t.xerrneg?t.xLabel+=\" +\"+f+\" / -\"+v.tickText(t.xa,t.xa.c2l(t.xerrneg),\"hover\").text:t.xLabel+=\" ± \"+f,\"x\"===e&&(t.distance+=1)}if(!(isNaN(t.yerr)||\"log\"===t.ya.type&&t.yerr<=0)){var h=v.tickText(t.ya,t.ya.c2l(t.yerr),\"hover\").text;void 0!==t.yerrneg?t.yLabel+=\" +\"+h+\" / -\"+v.tickText(t.ya,t.ya.c2l(t.yerrneg),\"hover\").text:t.yLabel+=\" ± \"+h,\"y\"===e&&(t.distance+=1)}var p=t.hoverinfo||t.trace.hoverinfo;return p&&\"all\"!==p&&(-1===(p=Array.isArray(p)?p:p.split(\"+\")).indexOf(\"x\")&&(t.xLabel=void 0),-1===p.indexOf(\"y\")&&(t.yLabel=void 0),-1===p.indexOf(\"z\")&&(t.zLabel=void 0),-1===p.indexOf(\"text\")&&(t.text=void 0),-1===p.indexOf(\"name\")&&(t.name=void 0)),t}function F(t,e,r){var n,i,o=r.container,s=r.fullLayout,l=s._size,u=r.event,c=!!e.hLinePoint,f=!!e.vLinePoint;if(o.selectAll(\".spikeline\").remove(),f||c){var d=p.combine(s.plot_bgcolor,s.paper_bgcolor);if(c){var g,y,m=e.hLinePoint;n=m&&m.xa,\"cursor\"===(i=m&&m.ya).spikesnap?(g=u.pointerX,y=u.pointerY):(g=n._offset+m.x,y=i._offset+m.y);var x,b,_=a.readability(m.color,d)<1.5?p.contrast(d):m.color,w=i.spikemode,T=i.spikethickness,k=i.spikecolor||_,A=v.getPxPosition(t,i);if(-1!==w.indexOf(\"toaxis\")||-1!==w.indexOf(\"across\")){if(-1!==w.indexOf(\"toaxis\")&&(x=A,b=g),-1!==w.indexOf(\"across\")){var M=i._counterDomainMin,S=i._counterDomainMax;\"free\"===i.anchor&&(M=Math.min(M,i.position),S=Math.max(S,i.position)),x=l.l+M*l.w,b=l.l+S*l.w}o.insert(\"line\",\":first-child\").attr({x1:x,x2:b,y1:y,y2:y,\"stroke-width\":T,stroke:k,\"stroke-dasharray\":h.dashStyle(i.spikedash,T)}).classed(\"spikeline\",!0).classed(\"crisp\",!0),o.insert(\"line\",\":first-child\").attr({x1:x,x2:b,y1:y,y2:y,\"stroke-width\":T+2,stroke:d}).classed(\"spikeline\",!0).classed(\"crisp\",!0)}-1!==w.indexOf(\"marker\")&&o.insert(\"circle\",\":first-child\").attr({cx:A+(\"right\"!==i.side?T:-T),cy:y,r:T,fill:k}).classed(\"spikeline\",!0)}if(f){var E,L,C=e.vLinePoint;n=C&&C.xa,i=C&&C.ya,\"cursor\"===n.spikesnap?(E=u.pointerX,L=u.pointerY):(E=n._offset+C.x,L=i._offset+C.y);var P,O,I=a.readability(C.color,d)<1.5?p.contrast(d):C.color,D=n.spikemode,z=n.spikethickness,R=n.spikecolor||I,F=v.getPxPosition(t,n);if(-1!==D.indexOf(\"toaxis\")||-1!==D.indexOf(\"across\")){if(-1!==D.indexOf(\"toaxis\")&&(P=F,O=L),-1!==D.indexOf(\"across\")){var B=n._counterDomainMin,N=n._counterDomainMax;\"free\"===n.anchor&&(B=Math.min(B,n.position),N=Math.max(N,n.position)),P=l.t+(1-N)*l.h,O=l.t+(1-B)*l.h}o.insert(\"line\",\":first-child\").attr({x1:E,x2:E,y1:P,y2:O,\"stroke-width\":z,stroke:R,\"stroke-dasharray\":h.dashStyle(n.spikedash,z)}).classed(\"spikeline\",!0).classed(\"crisp\",!0),o.insert(\"line\",\":first-child\").attr({x1:E,x2:E,y1:P,y2:O,\"stroke-width\":z+2,stroke:d}).classed(\"spikeline\",!0).classed(\"crisp\",!0)}-1!==D.indexOf(\"marker\")&&o.insert(\"circle\",\":first-child\").attr({cx:E,cy:F-(\"top\"!==n.side?z:-z),r:z,fill:R}).classed(\"spikeline\",!0)}}}function B(t,e){return!e||e.vLinePoint!==t._spikepoints.vLinePoint||e.hLinePoint!==t._spikepoints.hLinePoint}function N(t,e){return c.plainText(t||\"\",{len:e,allowedTags:[\"br\",\"sub\",\"sup\",\"b\",\"i\",\"em\"]})}function j(t,e,r){var n=e[t+\"a\"],i=e[t+\"Val\"],a=e.cd[0];if(\"category\"===n.type||\"multicategory\"===n.type)i=n._categoriesMap[i];else if(\"date\"===n.type){var o=e.trace[t+\"periodalignment\"];if(o){var s=e.cd[e.index],l=s[t+\"Start\"];void 0===l&&(l=s[t]);var u=s[t+\"End\"];void 0===u&&(u=s[t]);var c=u-l;\"end\"===o?i+=c:\"middle\"===o&&(i+=c/2)}i=n.d2c(i)}return a&&a.t&&a.t.posLetter===n._id&&(\"group\"!==r.boxmode&&\"group\"!==r.violinmode||(i+=a.t.dPos)),i}function U(t){return t.offsetTop+t.clientTop}function V(t){return t.offsetLeft+t.clientLeft}function H(t,e){var r=t._fullLayout,n=e.getBoundingClientRect(),i=n.left,a=n.top,s=i+n.width,l=a+n.height,u=o.apply3DTransform(r._invTransform)(i,a),c=o.apply3DTransform(r._invTransform)(s,l),f=u[0],h=u[1],p=c[0],d=c[1];return{x:f,y:h,width:p-f,height:d-h,top:Math.min(h,d),left:Math.min(f,p),right:Math.max(f,p),bottom:Math.max(h,d)}}},38048:function(t,e,r){\"use strict\";var n=r(71828),i=r(7901),a=r(23469).isUnifiedHover;t.exports=function(t,e,r,o){o=o||{};var s=e.legend;function l(t){o.font[t]||(o.font[t]=s?e.legend.font[t]:e.font[t])}e&&a(e.hovermode)&&(o.font||(o.font={}),l(\"size\"),l(\"family\"),l(\"color\"),s?(o.bgcolor||(o.bgcolor=i.combine(e.legend.bgcolor,e.paper_bgcolor)),o.bordercolor||(o.bordercolor=e.legend.bordercolor)):o.bgcolor||(o.bgcolor=e.paper_bgcolor)),r(\"hoverlabel.bgcolor\",o.bgcolor),r(\"hoverlabel.bordercolor\",o.bordercolor),r(\"hoverlabel.namelength\",o.namelength),n.coerceFont(r,\"hoverlabel.font\",o.font),r(\"hoverlabel.align\",o.align)}},98212:function(t,e,r){\"use strict\";var n=r(71828),i=r(528);t.exports=function(t,e){function r(r,a){return void 0!==e[r]?e[r]:n.coerce(t,e,i,r,a)}return r(\"clickmode\"),r(\"hovermode\")}},30211:function(t,e,r){\"use strict\";var n=r(39898),i=r(71828),a=r(28569),o=r(23469),s=r(528),l=r(88335);t.exports={moduleType:\"component\",name:\"fx\",constants:r(26675),schema:{layout:s},attributes:r(77914),layoutAttributes:s,supplyLayoutGlobalDefaults:r(22774),supplyDefaults:r(54268),supplyLayoutDefaults:r(34938),calc:r(30732),getDistanceFunction:o.getDistanceFunction,getClosest:o.getClosest,inbox:o.inbox,quadrature:o.quadrature,appendArrayPointValue:o.appendArrayPointValue,castHoverOption:function(t,e,r){return i.castOption(t,e,\"hoverlabel.\"+r)},castHoverinfo:function(t,e,r){return i.castOption(t,r,\"hoverinfo\",(function(r){return i.coerceHoverinfo({hoverinfo:r},{_module:t._module},e)}))},hover:l.hover,unhover:a.unhover,loneHover:l.loneHover,loneUnhover:function(t){var e=i.isD3Selection(t)?t:n.select(t);e.selectAll(\"g.hovertext\").remove(),e.selectAll(\".spikeline\").remove()},click:r(75914)}},528:function(t,e,r){\"use strict\";var n=r(26675),i=r(41940),a=i({editType:\"none\"});a.family.dflt=n.HOVERFONT,a.size.dflt=n.HOVERFONTSIZE,t.exports={clickmode:{valType:\"flaglist\",flags:[\"event\",\"select\"],dflt:\"event\",editType:\"plot\",extras:[\"none\"]},dragmode:{valType:\"enumerated\",values:[\"zoom\",\"pan\",\"select\",\"lasso\",\"drawclosedpath\",\"drawopenpath\",\"drawline\",\"drawrect\",\"drawcircle\",\"orbit\",\"turntable\",!1],dflt:\"zoom\",editType:\"modebar\"},hovermode:{valType:\"enumerated\",values:[\"x\",\"y\",\"closest\",!1,\"x unified\",\"y unified\"],dflt:\"closest\",editType:\"modebar\"},hoverdistance:{valType:\"integer\",min:-1,dflt:20,editType:\"none\"},spikedistance:{valType:\"integer\",min:-1,dflt:-1,editType:\"none\"},hoverlabel:{bgcolor:{valType:\"color\",editType:\"none\"},bordercolor:{valType:\"color\",editType:\"none\"},font:a,grouptitlefont:i({editType:\"none\"}),align:{valType:\"enumerated\",values:[\"left\",\"right\",\"auto\"],dflt:\"auto\",editType:\"none\"},namelength:{valType:\"integer\",min:-1,dflt:15,editType:\"none\"},editType:\"none\"},selectdirection:{valType:\"enumerated\",values:[\"h\",\"v\",\"d\",\"any\"],dflt:\"any\",editType:\"none\"}}},34938:function(t,e,r){\"use strict\";var n=r(71828),i=r(528),a=r(98212),o=r(38048);t.exports=function(t,e){function r(r,a){return n.coerce(t,e,i,r,a)}a(t,e)&&(r(\"hoverdistance\"),r(\"spikedistance\")),\"select\"===r(\"dragmode\")&&r(\"selectdirection\");var s=e._has(\"mapbox\"),l=e._has(\"geo\"),u=e._basePlotModules.length;\"zoom\"===e.dragmode&&((s||l)&&1===u||s&&l&&2===u)&&(e.dragmode=\"pan\"),o(t,e,r),n.coerceFont(r,\"hoverlabel.grouptitlefont\",e.hoverlabel.font)}},22774:function(t,e,r){\"use strict\";var n=r(71828),i=r(38048),a=r(528);t.exports=function(t,e){i(t,e,(function(r,i){return n.coerce(t,e,a,r,i)}))}},83312:function(t,e,r){\"use strict\";var n=r(71828),i=r(30587).counter,a=r(27670).Y,o=r(85555).idRegex,s=r(44467),l={rows:{valType:\"integer\",min:1,editType:\"plot\"},roworder:{valType:\"enumerated\",values:[\"top to bottom\",\"bottom to top\"],dflt:\"top to bottom\",editType:\"plot\"},columns:{valType:\"integer\",min:1,editType:\"plot\"},subplots:{valType:\"info_array\",freeLength:!0,dimensions:2,items:{valType:\"enumerated\",values:[i(\"xy\").toString(),\"\"],editType:\"plot\"},editType:\"plot\"},xaxes:{valType:\"info_array\",freeLength:!0,items:{valType:\"enumerated\",values:[o.x.toString(),\"\"],editType:\"plot\"},editType:\"plot\"},yaxes:{valType:\"info_array\",freeLength:!0,items:{valType:\"enumerated\",values:[o.y.toString(),\"\"],editType:\"plot\"},editType:\"plot\"},pattern:{valType:\"enumerated\",values:[\"independent\",\"coupled\"],dflt:\"coupled\",editType:\"plot\"},xgap:{valType:\"number\",min:0,max:1,editType:\"plot\"},ygap:{valType:\"number\",min:0,max:1,editType:\"plot\"},domain:a({name:\"grid\",editType:\"plot\",noGridCell:!0},{}),xside:{valType:\"enumerated\",values:[\"bottom\",\"bottom plot\",\"top plot\",\"top\"],dflt:\"bottom plot\",editType:\"plot\"},yside:{valType:\"enumerated\",values:[\"left\",\"left plot\",\"right plot\",\"right\"],dflt:\"left plot\",editType:\"plot\"},editType:\"plot\"};function u(t,e,r){var n=e[r+\"axes\"],i=Object.keys((t._splomAxes||{})[r]||{});return Array.isArray(n)?n:i.length?i:void 0}function c(t,e,r,n,i,a){var o=e(t+\"gap\",r),s=e(\"domain.\"+t);e(t+\"side\",n);for(var l=new Array(i),u=s[0],c=(s[1]-u)/(i-o),f=c*(1-o),h=0;h1){h||p||d||\"independent\"===k(\"pattern\")&&(h=!0),g._hasSubplotGrid=h;var x,b,_=\"top to bottom\"===k(\"roworder\"),w=h?.2:.1,T=h?.3:.1;v&&e._splomGridDflt&&(x=e._splomGridDflt.xside,b=e._splomGridDflt.yside),g._domains={x:c(\"x\",k,w,x,m),y:c(\"y\",k,T,b,y,_)}}else delete e.grid}function k(t,e){return n.coerce(r,g,l,t,e)}},contentDefaults:function(t,e){var r=e.grid;if(r&&r._domains){var n,i,a,o,s,l,c,h=t.grid||{},p=e._subplots,d=r._hasSubplotGrid,v=r.rows,g=r.columns,y=\"independent\"===r.pattern,m=r._axisMap={};if(d){var x=h.subplots||[];l=r.subplots=new Array(v);var b=1;for(n=0;n(\"legend\"===t?1:0));if(!1===M&&(r[t]=void 0),(!1!==M||f.uirevision)&&(p(\"uirevision\",r.uirevision),!1!==M)){p(\"borderwidth\");var S,E,L,C=\"h\"===p(\"orientation\"),P=\"paper\"===p(\"yref\"),O=\"paper\"===p(\"xref\"),I=\"left\";if(C?(S=0,n.getComponentMethod(\"rangeslider\",\"isVisible\")(e.xaxis)?P?(E=1.1,L=\"bottom\"):(E=1,L=\"top\"):P?(E=-.1,L=\"top\"):(E=0,L=\"bottom\")):(E=1,L=\"auto\",O?S=1.02:(S=1,I=\"right\")),i.coerce(f,h,{x:{valType:\"number\",editType:\"legend\",min:O?-2:0,max:O?3:1,dflt:S}},\"x\"),i.coerce(f,h,{y:{valType:\"number\",editType:\"legend\",min:P?-2:0,max:P?3:1,dflt:E}},\"y\"),p(\"traceorder\",_),u.isGrouped(r[t])&&p(\"tracegroupgap\"),p(\"entrywidth\"),p(\"entrywidthmode\"),p(\"itemsizing\"),p(\"itemwidth\"),p(\"itemclick\"),p(\"itemdoubleclick\"),p(\"groupclick\"),p(\"xanchor\",I),p(\"yanchor\",L),p(\"valign\"),i.noneOrAll(f,h,[\"x\",\"y\"]),p(\"title.text\")){p(\"title.side\",C?\"left\":\"top\");var D=i.extendFlat({},d,{size:i.bigFont(d.size)});i.coerceFont(p,\"title.font\",D)}}}}t.exports=function(t,e,r){var n,a=r.slice(),o=e.shapes;if(o)for(n=0;n1)}var B=d.hiddenlabels||[];if(!(T||d.showlegend&&S.length))return s.selectAll(\".\"+w).remove(),d._topdefs.select(\"#\"+r).remove(),a.autoMargin(t,w);var N=i.ensureSingle(s,\"g\",w,(function(t){T||t.attr(\"pointer-events\",\"all\")})),j=i.ensureSingleById(d._topdefs,\"clipPath\",r,(function(t){t.append(\"rect\")})),U=i.ensureSingle(N,\"rect\",\"bg\",(function(t){t.attr(\"shape-rendering\",\"crispEdges\")}));U.call(c.stroke,h.bordercolor).call(c.fill,h.bgcolor).style(\"stroke-width\",h.borderwidth+\"px\");var V,H=i.ensureSingle(N,\"g\",\"scrollbox\"),q=h.title;h._titleWidth=0,h._titleHeight=0,q.text?((V=i.ensureSingle(H,\"text\",w+\"titletext\")).attr(\"text-anchor\",\"start\").call(u.font,q.font).text(q.text),L(V,H,t,h,_)):H.selectAll(\".\"+w+\"titletext\").remove();var G=i.ensureSingle(N,\"rect\",\"scrollbar\",(function(t){t.attr(p.scrollBarEnterAttrs).call(c.fill,p.scrollBarColor)})),Z=H.selectAll(\"g.groups\").data(S);Z.enter().append(\"g\").attr(\"class\",\"groups\"),Z.exit().remove();var Y=Z.selectAll(\"g.traces\").data(i.identity);Y.enter().append(\"g\").attr(\"class\",\"traces\"),Y.exit().remove(),Y.style(\"opacity\",(function(t){var e=t[0].trace;return o.traceIs(e,\"pie-like\")?-1!==B.indexOf(t[0].label)?.5:1:\"legendonly\"===e.visible?.5:1})).each((function(){n.select(this).call(M,t,h)})).call(x,t,h).each((function(){T||n.select(this).call(E,t,w)})),i.syncOrAsync([a.previousPromises,function(){return function(t,e,r,i){var a=t._fullLayout,o=O(i);i||(i=a[o]);var s=a._size,l=b.isVertical(i),c=b.isGrouped(i),f=\"fraction\"===i.entrywidthmode,h=i.borderwidth,d=2*h,v=p.itemGap,g=i.itemwidth+2*v,y=2*(h+v),m=P(i),x=i.y<0||0===i.y&&\"top\"===m,_=i.y>1||1===i.y&&\"bottom\"===m,w=i.tracegroupgap,T={};i._maxHeight=Math.max(x||_?a.height/2:s.h,30);var A=0;i._width=0,i._height=0;var M=function(t){var e=0,r=0,n=t.title.side;return n&&(-1!==n.indexOf(\"left\")&&(e=t._titleWidth),-1!==n.indexOf(\"top\")&&(r=t._titleHeight)),[e,r]}(i);if(l)r.each((function(t){var e=t[0].height;u.setTranslate(this,h+M[0],h+M[1]+i._height+e/2+v),i._height+=e,i._width=Math.max(i._width,t[0].width)})),A=g+i._width,i._width+=v+g+d,i._height+=y,c&&(e.each((function(t,e){u.setTranslate(this,0,e*i.tracegroupgap)})),i._height+=(i._lgroupsLength-1)*i.tracegroupgap);else{var S=C(i),E=i.x<0||0===i.x&&\"right\"===S,L=i.x>1||1===i.x&&\"left\"===S,I=_||x,D=a.width/2;i._maxWidth=Math.max(E?I&&\"left\"===S?s.l+s.w:D:L?I&&\"right\"===S?s.r+s.w:D:s.w,2*g);var z=0,R=0;r.each((function(t){var e=k(t,i,g);z=Math.max(z,e),R+=e})),A=null;var F=0;if(c){var B=0,N=0,j=0;e.each((function(){var t=0,e=0;n.select(this).selectAll(\"g.traces\").each((function(r){var n=k(r,i,g),a=r[0].height;u.setTranslate(this,M[0],M[1]+h+v+a/2+e),e+=a,t=Math.max(t,n),T[r[0].trace.legendgroup]=t}));var r=t+v;N>0&&r+h+N>i._maxWidth?(F=Math.max(F,N),N=0,j+=B+w,B=e):B=Math.max(B,e),u.setTranslate(this,N,j),N+=r})),i._width=Math.max(F,N)+h,i._height=j+B+y}else{var U=r.size(),V=R+d+(U-1)*v=i._maxWidth&&(F=Math.max(F,Z),q=0,G+=H,i._height+=H,H=0),u.setTranslate(this,M[0]+h+q,M[1]+h+G+e/2+v),Z=q+r+v,q+=n,H=Math.max(H,e)})),V?(i._width=q+d,i._height=H+y):(i._width=Math.max(F,Z)+d,i._height+=H+y)}}i._width=Math.ceil(Math.max(i._width+M[0],i._titleWidth+2*(h+p.titlePad))),i._height=Math.ceil(Math.max(i._height+M[1],i._titleHeight+2*(h+p.itemGap))),i._effHeight=Math.min(i._height,i._maxHeight);var Y=t._context.edits,W=Y.legendText||Y.legendPosition;r.each((function(t){var e=n.select(this).select(\".\"+o+\"toggle\"),r=t[0].height,a=t[0].trace.legendgroup,s=k(t,i,g);c&&\"\"!==a&&(s=T[a]);var h=W?g:A||s;l||f||(h+=v/2),u.setRect(e,0,-r/2,h,r)}))}(t,Z,Y,h)},function(){var e,c,m,x,b=d._size,_=h.borderwidth,k=\"paper\"===h.xref,M=\"paper\"===h.yref;if(q.text&&function(t,e,r){if(\"top center\"===e.title.side||\"top right\"===e.title.side){var n=e.title.font.size*v,i=0,a=t.node(),o=u.bBox(a).width;\"top center\"===e.title.side?i=.5*(e._width-2*r-2*p.titlePad-o):\"top right\"===e.title.side&&(i=e._width-2*r-2*p.titlePad-o),f.positionText(t,r+p.titlePad+i,r+n)}}(V,h,_),!T){var S,E;S=k?b.l+b.w*h.x-g[C(h)]*h._width:d.width*h.x-g[C(h)]*h._width,E=M?b.t+b.h*(1-h.y)-g[P(h)]*h._effHeight:d.height*(1-h.y)-g[P(h)]*h._effHeight;var L=function(t,e,r,n){var i=t._fullLayout,o=i[e],s=C(o),l=P(o),u=\"paper\"===o.xref,c=\"paper\"===o.yref;t._fullLayout._reservedMargin[e]={};var f=o.y<.5?\"b\":\"t\",h=o.x<.5?\"l\":\"r\",p={r:i.width-r,l:r+o._width,b:i.height-n,t:n+o._effHeight};if(u&&c)return a.autoMargin(t,e,{x:o.x,y:o.y,l:o._width*g[s],r:o._width*y[s],b:o._effHeight*y[l],t:o._effHeight*g[l]});u?t._fullLayout._reservedMargin[e][f]=p[f]:c||\"v\"===o.orientation?t._fullLayout._reservedMargin[e][h]=p[h]:t._fullLayout._reservedMargin[e][f]=p[f]}(t,w,S,E);if(L)return;if(d.margin.autoexpand){var O=S,I=E;S=k?i.constrain(S,0,d.width-h._width):O,E=M?i.constrain(E,0,d.height-h._effHeight):I,S!==O&&i.log(\"Constrain \"+w+\".x to make legend fit inside graph\"),E!==I&&i.log(\"Constrain \"+w+\".y to make legend fit inside graph\")}u.setTranslate(N,S,E)}if(G.on(\".drag\",null),N.on(\"wheel\",null),T||h._height<=h._maxHeight||t._context.staticPlot){var D=h._effHeight;T&&(D=h._height),U.attr({width:h._width-_,height:D-_,x:_/2,y:_/2}),u.setTranslate(H,0,0),j.select(\"rect\").attr({width:h._width-2*_,height:D-2*_,x:_,y:_}),u.setClipUrl(H,r,t),u.setRect(G,0,0,0,0),delete h._scrollY}else{var z,R,F,B=Math.max(p.scrollBarMinHeight,h._effHeight*h._effHeight/h._height),Z=h._effHeight-B-2*p.scrollBarMargin,Y=h._height-h._effHeight,W=Z/Y,X=Math.min(h._scrollY||0,Y);U.attr({width:h._width-2*_+p.scrollBarWidth+p.scrollBarMargin,height:h._effHeight-_,x:_/2,y:_/2}),j.select(\"rect\").attr({width:h._width-2*_+p.scrollBarWidth+p.scrollBarMargin,height:h._effHeight-2*_,x:_,y:_+X}),u.setClipUrl(H,r,t),$(X,B,W),N.on(\"wheel\",(function(){$(X=i.constrain(h._scrollY+n.event.deltaY/Z*Y,0,Y),B,W),0!==X&&X!==Y&&n.event.preventDefault()}));var J=n.behavior.drag().on(\"dragstart\",(function(){var t=n.event.sourceEvent;z=\"touchstart\"===t.type?t.changedTouches[0].clientY:t.clientY,F=X})).on(\"drag\",(function(){var t=n.event.sourceEvent;2===t.buttons||t.ctrlKey||(R=\"touchmove\"===t.type?t.changedTouches[0].clientY:t.clientY,X=function(t,e,r){var n=(r-e)/W+t;return i.constrain(n,0,Y)}(F,z,R),$(X,B,W))}));G.call(J);var K=n.behavior.drag().on(\"dragstart\",(function(){var t=n.event.sourceEvent;\"touchstart\"===t.type&&(z=t.changedTouches[0].clientY,F=X)})).on(\"drag\",(function(){var t=n.event.sourceEvent;\"touchmove\"===t.type&&(R=t.changedTouches[0].clientY,X=function(t,e,r){var n=(e-r)/W+t;return i.constrain(n,0,Y)}(F,z,R),$(X,B,W))}));H.call(K)}function $(e,r,n){h._scrollY=t._fullLayout[w]._scrollY=e,u.setTranslate(H,0,-e),u.setRect(G,h._width,p.scrollBarMargin+e*n,p.scrollBarWidth,r),j.select(\"rect\").attr(\"y\",_+e)}t._context.edits.legendPosition&&(N.classed(\"cursor-move\",!0),l.init({element:N.node(),gd:t,prepFn:function(){var t=u.getTranslate(N);m=t.x,x=t.y},moveFn:function(t,r){var n=m+t,i=x+r;u.setTranslate(N,n,i),e=l.align(n,h._width,b.l,b.l+b.w,h.xanchor),c=l.align(i+h._height,-h._height,b.t+b.h,b.t,h.yanchor)},doneFn:function(){if(void 0!==e&&void 0!==c){var r={};r[w+\".x\"]=e,r[w+\".y\"]=c,o.call(\"_guiRelayout\",t,r)}},clickFn:function(e,r){var n=s.selectAll(\"g.traces\").filter((function(){var t=this.getBoundingClientRect();return r.clientX>=t.left&&r.clientX<=t.right&&r.clientY>=t.top&&r.clientY<=t.bottom}));n.size()>0&&A(t,N,n,e,r)}}))}],t)}}function k(t,e,r){var n=t[0],i=n.width,a=e.entrywidthmode,o=n.trace.legendwidth||e.entrywidth;return\"fraction\"===a?e._maxWidth*o:r+(o||i)}function A(t,e,r,n,i){var a=r.data()[0][0].trace,l={event:i,node:r.node(),curveNumber:a.index,expandedIndex:a._expandedIndex,data:t.data,layout:t.layout,frames:t._transitionData._frames,config:t._context,fullData:t._fullData,fullLayout:t._fullLayout};a._group&&(l.group=a._group),o.traceIs(a,\"pie-like\")&&(l.label=r.datum()[0].label);var u=s.triggerHandler(t,\"plotly_legendclick\",l);if(1===n){if(!1===u)return;e._clickTimeout=setTimeout((function(){t._fullLayout&&h(r,t,n)}),t._context.doubleClickDelay)}else 2===n&&(e._clickTimeout&&clearTimeout(e._clickTimeout),t._legendMouseDownTime=0,!1!==s.triggerHandler(t,\"plotly_legenddoubleclick\",l)&&!1!==u&&h(r,t,n))}function M(t,e,r){var n,a,s=O(r),l=t.data()[0][0],c=l.trace,h=o.traceIs(c,\"pie-like\"),d=!r._inHover&&e._context.edits.legendText&&!h,v=r._maxNameLength;l.groupTitle?(n=l.groupTitle.text,a=l.groupTitle.font):(a=r.font,r.entries?n=l.text:(n=h?l.label:c.name,c._meta&&(n=i.templateString(n,c._meta))));var g=i.ensureSingle(t,\"text\",s+\"text\");g.attr(\"text-anchor\",\"start\").call(u.font,a).text(d?S(n,v):n);var y=r.itemwidth+2*p.itemGap;f.positionText(g,y,0),d?g.call(f.makeEditable,{gd:e,text:n}).call(L,t,e,r).on(\"edit\",(function(n){this.text(S(n,v)).call(L,t,e,r);var a=l.trace._fullInput||{},s={};if(o.hasTransform(a,\"groupby\")){var u=o.getTransformIndices(a,\"groupby\"),f=u[u.length-1],h=i.keyedContainer(a,\"transforms[\"+f+\"].styles\",\"target\",\"value.name\");h.set(l.trace._group,n),s=h.constructUpdate()}else s.name=n;return a._isShape?o.call(\"_guiRelayout\",e,\"shapes[\"+c.index+\"].name\",s.name):o.call(\"_guiRestyle\",e,s,c.index)})):L(g,t,e,r)}function S(t,e){var r=Math.max(4,e);if(t&&t.trim().length>=r/2)return t;for(var n=r-(t=t||\"\").length;n>0;n--)t+=\" \";return t}function E(t,e,r){var a,o=e._context.doubleClickDelay,s=1,l=i.ensureSingle(t,\"rect\",r+\"toggle\",(function(t){e._context.staticPlot||t.style(\"cursor\",\"pointer\").attr(\"pointer-events\",\"all\"),t.call(c.fill,\"rgba(0,0,0,0)\")}));e._context.staticPlot||(l.on(\"mousedown\",(function(){(a=(new Date).getTime())-e._legendMouseDownTimeo&&(s=Math.max(s-1,1)),A(e,i,t,s,n.event)}})))}function L(t,e,r,n,i){n._inHover&&t.attr(\"data-notex\",!0),f.convertToTspans(t,r,(function(){!function(t,e,r,n){var i=t.data()[0][0];if(r._inHover||!i||i.trace.showlegend){var a=t.select(\"g[class*=math-group]\"),o=a.node(),s=O(r);r||(r=e._fullLayout[s]);var l,c,h=r.borderwidth,d=(n===_?r.title.font:i.groupTitle?i.groupTitle.font:r.font).size*v;if(o){var g=u.bBox(o);l=g.height,c=g.width,n===_?u.setTranslate(a,h,h+.75*l):u.setTranslate(a,0,.25*l)}else{var y=\".\"+s+(n===_?\"title\":\"\")+\"text\",m=t.select(y),x=f.lineCount(m),b=m.node();if(l=d*x,c=b?u.bBox(b).width:0,n===_)\"left\"===r.title.side&&(c+=2*p.itemGap),f.positionText(m,h+p.titlePad,h+d);else{var w=2*p.itemGap+r.itemwidth;i.groupTitle&&(w=p.itemGap,c-=r.itemwidth),f.positionText(m,w,-d*((x-1)/2-.3))}}n===_?(r._titleWidth=c,r._titleHeight=l):(i.lineHeight=d,i.height=Math.max(l,16)+3,i.width=c)}else t.remove()}(e,r,n,i)}))}function C(t){return i.isRightAnchor(t)?\"right\":i.isCenterAnchor(t)?\"center\":\"left\"}function P(t){return i.isBottomAnchor(t)?\"bottom\":i.isMiddleAnchor(t)?\"middle\":\"top\"}function O(t){return t._id||\"legend\"}t.exports=function(t,e){if(e)T(t,e);else{var r=t._fullLayout,i=r._legends;r._infolayer.selectAll('[class^=\"legend\"]').each((function(){var t=n.select(this),e=t.attr(\"class\").split(\" \")[0];e.match(w)&&-1===i.indexOf(e)&&t.remove()}));for(var a=0;aS&&(M=S)}k[a][0]._groupMinRank=M,k[a][0]._preGroupSort=a}var E=function(t,e){return t.trace.legendrank-e.trace.legendrank||t._preSort-e._preSort};for(k.forEach((function(t,e){t[0]._preGroupSort=e})),k.sort((function(t,e){return t[0]._groupMinRank-e[0]._groupMinRank||t[0]._preGroupSort-e[0]._preGroupSort})),a=0;ar?r:t}t.exports=function(t,e,r){var y=e._fullLayout;r||(r=y.legend);var m=\"constant\"===r.itemsizing,x=r.itemwidth,b=(x+2*p.itemGap)/2,_=o(b,0),w=function(t,e,r,n){var i;if(t+1)i=t;else{if(!(e&&e.width>0))return 0;i=e.width}return m?n:Math.min(i,r)};function T(t,a,o){var c=t[0].trace,f=c.marker||{},h=f.line||{},p=o?c.visible&&c.type===o:i.traceIs(c,\"bar\"),d=n.select(a).select(\"g.legendpoints\").selectAll(\"path.legend\"+o).data(p?[t]:[]);d.enter().append(\"path\").classed(\"legend\"+o,!0).attr(\"d\",\"M6,6H-6V-6H6Z\").attr(\"transform\",_),d.exit().remove(),d.each((function(t){var i=n.select(this),a=t[0],o=w(a.mlw,f.line,5,2);i.style(\"stroke-width\",o+\"px\");var p=a.mcc;if(!r._inHover&&\"mc\"in a){var d=u(f),v=d.mid;void 0===v&&(v=(d.max+d.min)/2),p=s.tryColorscale(f,\"\")(v)}var y=p||a.mc||f.color,m=f.pattern,x=m&&s.getPatternAttr(m.shape,0,\"\");if(x){var b=s.getPatternAttr(m.bgcolor,0,null),_=s.getPatternAttr(m.fgcolor,0,null),T=m.fgopacity,k=g(m.size,8,10),A=g(m.solidity,.5,1),M=\"legend-\"+c.uid;i.call(s.pattern,\"legend\",e,M,x,k,A,p,m.fillmode,b,_,T)}else i.call(l.fill,y);o&&l.stroke(i,a.mlc||h.color)}))}function k(t,r,o){var s=t[0],l=s.trace,u=o?l.visible&&l.type===o:i.traceIs(l,o),c=n.select(r).select(\"g.legendpoints\").selectAll(\"path.legend\"+o).data(u?[t]:[]);if(c.enter().append(\"path\").classed(\"legend\"+o,!0).attr(\"d\",\"M6,6H-6V-6H6Z\").attr(\"transform\",_),c.exit().remove(),c.size()){var p=l.marker||{},d=w(h(p.line.width,s.pts),p.line,5,2),v=\"pieLike\",g=a.minExtend(l,{marker:{line:{width:d}}},v),y=a.minExtend(s,{trace:g},v);f(c,y,g,e)}}t.each((function(t){var e=n.select(this),i=a.ensureSingle(e,\"g\",\"layers\");i.style(\"opacity\",t[0].trace.opacity);var s=r.valign,l=t[0].lineHeight,u=t[0].height;if(\"middle\"!==s&&l&&u){var c={top:1,bottom:-1}[s]*(.5*(l-u+3));i.attr(\"transform\",o(0,c))}else i.attr(\"transform\",null);i.selectAll(\"g.legendfill\").data([t]).enter().append(\"g\").classed(\"legendfill\",!0),i.selectAll(\"g.legendlines\").data([t]).enter().append(\"g\").classed(\"legendlines\",!0);var f=i.selectAll(\"g.legendsymbols\").data([t]);f.enter().append(\"g\").classed(\"legendsymbols\",!0),f.selectAll(\"g.legendpoints\").data([t]).enter().append(\"g\").classed(\"legendpoints\",!0)})).each((function(t){var r,i=t[0].trace,o=[];if(i.visible)switch(i.type){case\"histogram2d\":case\"heatmap\":o=[[\"M-15,-2V4H15V-2Z\"]],r=!0;break;case\"choropleth\":case\"choroplethmapbox\":o=[[\"M-6,-6V6H6V-6Z\"]],r=!0;break;case\"densitymapbox\":o=[[\"M-6,0 a6,6 0 1,0 12,0 a 6,6 0 1,0 -12,0\"]],r=\"radial\";break;case\"cone\":o=[[\"M-6,2 A2,2 0 0,0 -6,6 V6L6,4Z\"],[\"M-6,-6 A2,2 0 0,0 -6,-2 L6,-4Z\"],[\"M-6,-2 A2,2 0 0,0 -6,2 L6,0Z\"]],r=!1;break;case\"streamtube\":o=[[\"M-6,2 A2,2 0 0,0 -6,6 H6 A2,2 0 0,1 6,2 Z\"],[\"M-6,-6 A2,2 0 0,0 -6,-2 H6 A2,2 0 0,1 6,-6 Z\"],[\"M-6,-2 A2,2 0 0,0 -6,2 H6 A2,2 0 0,1 6,-2 Z\"]],r=!1;break;case\"surface\":o=[[\"M-6,-6 A2,3 0 0,0 -6,0 H6 A2,3 0 0,1 6,-6 Z\"],[\"M-6,1 A2,3 0 0,1 -6,6 H6 A2,3 0 0,0 6,0 Z\"]],r=!0;break;case\"mesh3d\":o=[[\"M-6,6H0L-6,-6Z\"],[\"M6,6H0L6,-6Z\"],[\"M-6,-6H6L0,6Z\"]],r=!1;break;case\"volume\":o=[[\"M-6,6H0L-6,-6Z\"],[\"M6,6H0L6,-6Z\"],[\"M-6,-6H6L0,6Z\"]],r=!0;break;case\"isosurface\":o=[[\"M-6,6H0L-6,-6Z\"],[\"M6,6H0L6,-6Z\"],[\"M-6,-6 A12,24 0 0,0 6,-6 L0,6Z\"]],r=!1}var c=n.select(this).select(\"g.legendpoints\").selectAll(\"path.legend3dandfriends\").data(o);c.enter().append(\"path\").classed(\"legend3dandfriends\",!0).attr(\"transform\",_).style(\"stroke-miterlimit\",1),c.exit().remove(),c.each((function(t,o){var c,f=n.select(this),h=u(i),p=h.colorscale,v=h.reversescale;if(p){if(!r){var g=p.length;c=0===o?p[v?g-1:0][1]:1===o?p[v?0:g-1][1]:p[Math.floor((g-1)/2)][1]}}else{var y=i.vertexcolor||i.facecolor||i.color;c=a.isArrayOrTypedArray(y)?y[o]||y[0]:y}f.attr(\"d\",t[0]),c?f.call(l.fill,c):f.call((function(t){if(t.size()){var n=\"legendfill-\"+i.uid;s.gradient(t,e,n,d(v,\"radial\"===r),p,\"fill\")}}))}))})).each((function(t){var e=t[0].trace,r=\"waterfall\"===e.type;if(t[0]._distinct&&r){var i=t[0].trace[t[0].dir].marker;return t[0].mc=i.color,t[0].mlw=i.line.width,t[0].mlc=i.line.color,T(t,this,\"waterfall\")}var a=[];e.visible&&r&&(a=t[0].hasTotals?[[\"increasing\",\"M-6,-6V6H0Z\"],[\"totals\",\"M6,6H0L-6,-6H-0Z\"],[\"decreasing\",\"M6,6V-6H0Z\"]]:[[\"increasing\",\"M-6,-6V6H6Z\"],[\"decreasing\",\"M6,6V-6H-6Z\"]]);var o=n.select(this).select(\"g.legendpoints\").selectAll(\"path.legendwaterfall\").data(a);o.enter().append(\"path\").classed(\"legendwaterfall\",!0).attr(\"transform\",_).style(\"stroke-miterlimit\",1),o.exit().remove(),o.each((function(t){var r=n.select(this),i=e[t[0]].marker,a=w(void 0,i.line,5,2);r.attr(\"d\",t[1]).style(\"stroke-width\",a+\"px\").call(l.fill,i.color),a&&r.call(l.stroke,i.line.color)}))})).each((function(t){T(t,this,\"funnel\")})).each((function(t){T(t,this)})).each((function(t){var r=t[0].trace,o=n.select(this).select(\"g.legendpoints\").selectAll(\"path.legendbox\").data(r.visible&&i.traceIs(r,\"box-violin\")?[t]:[]);o.enter().append(\"path\").classed(\"legendbox\",!0).attr(\"d\",\"M6,6H-6V-6H6Z\").attr(\"transform\",_),o.exit().remove(),o.each((function(){var t=n.select(this);if(\"all\"!==r.boxpoints&&\"all\"!==r.points||0!==l.opacity(r.fillcolor)||0!==l.opacity((r.line||{}).color)){var i=w(void 0,r.line,5,2);t.style(\"stroke-width\",i+\"px\").call(l.fill,r.fillcolor),i&&l.stroke(t,r.line.color)}else{var u=a.minExtend(r,{marker:{size:m?12:a.constrain(r.marker.size,2,16),sizeref:1,sizemin:1,sizemode:\"diameter\"}});o.call(s.pointStyle,u,e)}}))})).each((function(t){k(t,this,\"funnelarea\")})).each((function(t){k(t,this,\"pie\")})).each((function(t){var r,i,o=v(t),l=o.showFill,f=o.showLine,h=o.showGradientLine,p=o.showGradientFill,g=o.anyFill,y=o.anyLine,m=t[0],b=m.trace,_=u(b),T=_.colorscale,k=_.reversescale,A=c.hasMarkers(b)||!g?\"M5,0\":y?\"M5,-2\":\"M5,-3\",M=n.select(this),S=M.select(\".legendfill\").selectAll(\"path\").data(l||p?[t]:[]);if(S.enter().append(\"path\").classed(\"js-fill\",!0),S.exit().remove(),S.attr(\"d\",A+\"h\"+x+\"v6h-\"+x+\"z\").call((function(t){if(t.size())if(l)s.fillGroupStyle(t,e);else{var r=\"legendfill-\"+b.uid;s.gradient(t,e,r,d(k),T,\"fill\")}})),f||h){var E=w(void 0,b.line,10,5);i=a.minExtend(b,{line:{width:E}}),r=[a.minExtend(m,{trace:i})]}var L=M.select(\".legendlines\").selectAll(\"path\").data(f||h?[r]:[]);L.enter().append(\"path\").classed(\"js-line\",!0),L.exit().remove(),L.attr(\"d\",A+(h?\"l\"+x+\",0.0001\":\"h\"+x)).call(f?s.lineGroupStyle:function(t){if(t.size()){var r=\"legendline-\"+b.uid;s.lineGroupStyle(t),s.gradient(t,e,r,d(k),T,\"stroke\")}})})).each((function(t){var r,i,o=v(t),l=o.anyFill,u=o.anyLine,f=o.showLine,h=o.showMarker,p=t[0],d=p.trace,g=!h&&!u&&!l&&c.hasText(d);function y(t,e,r,n){var i=a.nestedProperty(d,t).get(),o=a.isArrayOrTypedArray(i)&&e?e(i):i;if(m&&o&&void 0!==n&&(o=n),r){if(or[1])return r[1]}return o}function x(t){return p._distinct&&p.index&&t[p.index]?t[p.index]:t[0]}if(h||g||f){var b={},w={};if(h){b.mc=y(\"marker.color\",x),b.mx=y(\"marker.symbol\",x),b.mo=y(\"marker.opacity\",a.mean,[.2,1]),b.mlc=y(\"marker.line.color\",x),b.mlw=y(\"marker.line.width\",a.mean,[0,5],2),w.marker={sizeref:1,sizemin:1,sizemode:\"diameter\"};var T=y(\"marker.size\",a.mean,[2,16],12);b.ms=T,w.marker.size=T}f&&(w.line={width:y(\"line.width\",x,[0,10],5)}),g&&(b.tx=\"Aa\",b.tp=y(\"textposition\",x),b.ts=10,b.tc=y(\"textfont.color\",x),b.tf=y(\"textfont.family\",x)),r=[a.minExtend(p,b)],(i=a.minExtend(d,w)).selectedpoints=null,i.texttemplate=null}var k=n.select(this).select(\"g.legendpoints\"),A=k.selectAll(\"path.scatterpts\").data(h?r:[]);A.enter().insert(\"path\",\":first-child\").classed(\"scatterpts\",!0).attr(\"transform\",_),A.exit().remove(),A.call(s.pointStyle,i,e),h&&(r[0].mrc=3);var M=k.selectAll(\"g.pointtext\").data(g?r:[]);M.enter().append(\"g\").classed(\"pointtext\",!0).append(\"text\").attr(\"transform\",_),M.exit().remove(),M.selectAll(\"text\").call(s.textPointStyle,i,e)})).each((function(t){var e=t[0].trace,r=n.select(this).select(\"g.legendpoints\").selectAll(\"path.legendcandle\").data(e.visible&&\"candlestick\"===e.type?[t,t]:[]);r.enter().append(\"path\").classed(\"legendcandle\",!0).attr(\"d\",(function(t,e){return e?\"M-15,0H-8M-8,6V-6H8Z\":\"M15,0H8M8,-6V6H-8Z\"})).attr(\"transform\",_).style(\"stroke-miterlimit\",1),r.exit().remove(),r.each((function(t,r){var i=n.select(this),a=e[r?\"increasing\":\"decreasing\"],o=w(void 0,a.line,5,2);i.style(\"stroke-width\",o+\"px\").call(l.fill,a.fillcolor),o&&l.stroke(i,a.line.color)}))})).each((function(t){var e=t[0].trace,r=n.select(this).select(\"g.legendpoints\").selectAll(\"path.legendohlc\").data(e.visible&&\"ohlc\"===e.type?[t,t]:[]);r.enter().append(\"path\").classed(\"legendohlc\",!0).attr(\"d\",(function(t,e){return e?\"M-15,0H0M-8,-6V0\":\"M15,0H0M8,6V0\"})).attr(\"transform\",_).style(\"stroke-miterlimit\",1),r.exit().remove(),r.each((function(t,r){var i=n.select(this),a=e[r?\"increasing\":\"decreasing\"],o=w(void 0,a.line,5,2);i.style(\"fill\",\"none\").call(s.dashLine,a.line.dash,o),o&&l.stroke(i,a.line.color)}))}))}},42068:function(t,e,r){\"use strict\";r(93348),t.exports={editType:\"modebar\",orientation:{valType:\"enumerated\",values:[\"v\",\"h\"],dflt:\"h\",editType:\"modebar\"},bgcolor:{valType:\"color\",editType:\"modebar\"},color:{valType:\"color\",editType:\"modebar\"},activecolor:{valType:\"color\",editType:\"modebar\"},uirevision:{valType:\"any\",editType:\"none\"},add:{valType:\"string\",arrayOk:!0,dflt:\"\",editType:\"modebar\"},remove:{valType:\"string\",arrayOk:!0,dflt:\"\",editType:\"modebar\"}}},26023:function(t,e,r){\"use strict\";var n=r(73972),i=r(74875),a=r(41675),o=r(24255),s=r(34031).eraseActiveShape,l=r(71828),u=l._,c=t.exports={};function f(t,e){var r,i,o=e.currentTarget,s=o.getAttribute(\"data-attr\"),l=o.getAttribute(\"data-val\")||!0,u=t._fullLayout,c={},f=a.list(t,null,!0),h=u._cartesianSpikesEnabled;if(\"zoom\"===s){var p,d=\"in\"===l?.5:2,v=(1+d)/2,g=(1-d)/2;for(i=0;i1?(O=[\"toggleHover\"],I=[\"resetViews\"]):y?(P=[\"zoomInGeo\",\"zoomOutGeo\"],O=[\"hoverClosestGeo\"],I=[\"resetGeo\"]):g?(O=[\"hoverClosest3d\"],I=[\"resetCameraDefault3d\",\"resetCameraLastSave3d\"]):w?(P=[\"zoomInMapbox\",\"zoomOutMapbox\"],O=[\"toggleHover\"],I=[\"resetViewMapbox\"]):b?O=[\"hoverClosestGl2d\"]:m?O=[\"hoverClosestPie\"]:A?(O=[\"hoverClosestCartesian\",\"hoverCompareCartesian\"],I=[\"resetViewSankey\"]):O=[\"toggleHover\"],v&&(O=[\"toggleSpikelines\",\"hoverClosestCartesian\",\"hoverCompareCartesian\"]),(function(t){for(var e=0;e0)){var v=function(t,e,r){for(var n=r.filter((function(r){return e[r].anchor===t._id})),i=0,a=0;a=n.max)e=F[r+1];else if(t=n.pmax)e=F[r+1];else if(tr._length||y+b<0)return;c=g+b,p=y+b;break;case l:if(x=\"col-resize\",g+b>r._length)return;c=g+b,p=y;break;case u:if(x=\"col-resize\",y+b<0)return;c=g,p=y+b;break;default:x=\"ew-resize\",c=v,p=v+b}if(p=0;k--){var A=r.append(\"path\").attr(g).style(\"opacity\",k?.1:y).call(o.stroke,x).call(o.fill,m).call(s.dashLine,k?\"solid\":_,k?4+b:b);if(d(A,t,a),w){var M=l(t.layout,\"selections\",a);A.style({cursor:\"move\"});var S={element:A.node(),plotinfo:p,gd:t,editHelpers:M,isActiveSelection:!0},E=n(u,t);i(E,A,S)}else A.style(\"pointer-events\",k?\"all\":\"none\");T[k]=A}var L=T[0];T[1].node().addEventListener(\"click\",(function(){return function(t,e){if(h(t)){var r=+e.node().getAttribute(\"data-index\");if(r>=0){if(r===t._fullLayout._activeSelectionIndex)return void v(t);t._fullLayout._activeSelectionIndex=r,t._fullLayout._deactivateSelection=v,f(t)}}}(t,L)}))}(t._fullLayout._selectionLayer)}function d(t,e,r){var n=r.xref+r.yref;s.setClipUrl(t,\"clip\"+e._fullLayout._uid+n,e)}function v(t){h(t)&&t._fullLayout._activeSelectionIndex>=0&&(a(t),delete t._fullLayout._activeSelectionIndex,f(t))}t.exports={draw:f,drawOne:p,activateLastSelection:function(t){if(h(t)){var e=t._fullLayout.selections.length-1;t._fullLayout._activeSelectionIndex=e,t._fullLayout._deactivateSelection=v,f(t)}}}},53777:function(t,e,r){\"use strict\";var n=r(79952).P,i=r(1426).extendFlat;t.exports={newselection:{mode:{valType:\"enumerated\",values:[\"immediate\",\"gradual\"],dflt:\"immediate\",editType:\"none\"},line:{color:{valType:\"color\",editType:\"none\"},width:{valType:\"number\",min:1,dflt:1,editType:\"none\"},dash:i({},n,{dflt:\"dot\",editType:\"none\"}),editType:\"none\"},editType:\"none\"},activeselection:{fillcolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\",editType:\"none\"},opacity:{valType:\"number\",min:0,max:1,dflt:.5,editType:\"none\"},editType:\"none\"}}},90849:function(t){\"use strict\";t.exports=function(t,e,r){r(\"newselection.mode\"),r(\"newselection.line.width\")&&(r(\"newselection.line.color\"),r(\"newselection.line.dash\")),r(\"activeselection.fillcolor\"),r(\"activeselection.opacity\")}},35855:function(t,e,r){\"use strict\";var n=r(64505).selectMode,i=r(51873).clearOutline,a=r(60165),o=a.readPaths,s=a.writePaths,l=a.fixDatesForPaths;t.exports=function(t,e){if(t.length){var r=t[0][0];if(r){var a=r.getAttribute(\"d\"),u=e.gd,c=u._fullLayout.newselection,f=e.plotinfo,h=f.xaxis,p=f.yaxis,d=e.isActiveSelection,v=e.dragmode,g=(u.layout||{}).selections||[];if(!n(v)&&void 0!==d){var y=u._fullLayout._activeSelectionIndex;if(y-1,b=[];if(function(t){return t&&Array.isArray(t)&&!0!==t[0].hoverOnBox}(y)){Z(t,e,a);var _=function(t,e){var r,n,i=t[0],a=-1,o=[];for(n=0;n0?function(t,e){var r,n,i,a=[];for(i=0;i0&&a.push(r);if(1===a.length&&a[0]===e.searchInfo&&(n=e.searchInfo.cd[0].trace).selectedpoints.length===e.pointNumbers.length){for(i=0;i1)return!1;if((n+=e.selectedpoints.length)>1)return!1}return 1===n}(s)&&(h=K(_))){for(o&&o.remove(),g=0;g=0})(i)&&i._fullLayout._deactivateShape(i),function(t){return t._fullLayout._activeSelectionIndex>=0}(i)&&i._fullLayout._deactivateSelection(i);var o=i._fullLayout._zoomlayer,s=p(r),l=v(r);if(s||l){var u,c,f=o.selectAll(\".select-outline-\"+n.id);f&&i._fullLayout._outlining&&(s&&(u=T(f,t)),u&&a.call(\"_guiRelayout\",i,{shapes:u}),l&&!U(t)&&(c=k(f,t)),c&&(i._fullLayout._noEmitSelectedAtStart=!0,a.call(\"_guiRelayout\",i,{selections:c}).then((function(){e&&A(i)}))),i._fullLayout._outlining=!1)}n.selection={},n.selection.selectionDefs=t.selectionDefs=[],n.selection.mergedPolygons=t.mergedPolygons=[]}function W(t){return t._id}function X(t,e,r,n){if(!t.calcdata)return[];var i,a,o,s=[],l=e.map(W),u=r.map(W);for(o=0;o0?n[0]:r;return!!e.selectedpoints&&e.selectedpoints.indexOf(i)>-1}function $(t,e,r){var n,i;for(n=0;n-1&&e;if(!a&&e){var et=ot(t,!0);if(et.length){var nt=et[0].xref,pt=et[0].yref;if(nt&&pt){var dt=ut(et);ct([C(t,nt,\"x\"),C(t,pt,\"y\")])(Q,dt)}}t._fullLayout._noEmitSelectedAtStart?t._fullLayout._noEmitSelectedAtStart=!1:tt&&ft(t,Q),h._reselect=!1}if(!a&&h._deselect){var vt=h._deselect;(function(t,e,r){for(var n=0;n=0)k._fullLayout._deactivateShape(k);else if(!x){var r=A.clickmode;L.done(Mt).then((function(){if(L.clear(Mt),2===t){for(bt.remove(),K=0;K-1&&V(e,k,n.xaxes,n.yaxes,n.subplot,n,bt),\"event\"===r&&ft(k,void 0);l.click(k,e,P.id)})).catch(M.error)}},n.doneFn=function(){kt.remove(),L.done(Mt).then((function(){L.clear(Mt),!S&&J&&n.selectionDefs&&(J.subtract=xt,n.selectionDefs.push(J),n.mergedPolygons.length=0,[].push.apply(n.mergedPolygons,W)),(S||x)&&Y(n,S),n.doneFnCompleted&&n.doneFnCompleted(St),b&&ft(k,at)})).catch(M.error)}},clearOutline:x,clearSelectionsCache:Y,selectOnClick:V}},89827:function(t,e,r){\"use strict\";var n=r(50215),i=r(41940),a=r(82196).line,o=r(79952).P,s=r(1426).extendFlat,l=r(44467).templatedArray,u=(r(24695),r(9012)),c=r(5386).R,f=r(37281);t.exports=l(\"shape\",{visible:s({},u.visible,{editType:\"calc+arraydraw\"}),showlegend:{valType:\"boolean\",dflt:!1,editType:\"calc+arraydraw\"},legend:s({},u.legend,{editType:\"calc+arraydraw\"}),legendgroup:s({},u.legendgroup,{editType:\"calc+arraydraw\"}),legendgrouptitle:{text:s({},u.legendgrouptitle.text,{editType:\"calc+arraydraw\"}),font:i({editType:\"calc+arraydraw\"}),editType:\"calc+arraydraw\"},legendrank:s({},u.legendrank,{editType:\"calc+arraydraw\"}),legendwidth:s({},u.legendwidth,{editType:\"calc+arraydraw\"}),type:{valType:\"enumerated\",values:[\"circle\",\"rect\",\"path\",\"line\"],editType:\"calc+arraydraw\"},layer:{valType:\"enumerated\",values:[\"below\",\"above\"],dflt:\"above\",editType:\"arraydraw\"},xref:s({},n.xref,{}),xsizemode:{valType:\"enumerated\",values:[\"scaled\",\"pixel\"],dflt:\"scaled\",editType:\"calc+arraydraw\"},xanchor:{valType:\"any\",editType:\"calc+arraydraw\"},x0:{valType:\"any\",editType:\"calc+arraydraw\"},x1:{valType:\"any\",editType:\"calc+arraydraw\"},yref:s({},n.yref,{}),ysizemode:{valType:\"enumerated\",values:[\"scaled\",\"pixel\"],dflt:\"scaled\",editType:\"calc+arraydraw\"},yanchor:{valType:\"any\",editType:\"calc+arraydraw\"},y0:{valType:\"any\",editType:\"calc+arraydraw\"},y1:{valType:\"any\",editType:\"calc+arraydraw\"},path:{valType:\"string\",editType:\"calc+arraydraw\"},opacity:{valType:\"number\",min:0,max:1,dflt:1,editType:\"arraydraw\"},line:{color:s({},a.color,{editType:\"arraydraw\"}),width:s({},a.width,{editType:\"calc+arraydraw\"}),dash:s({},o,{editType:\"arraydraw\"}),editType:\"calc+arraydraw\"},fillcolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\",editType:\"arraydraw\"},fillrule:{valType:\"enumerated\",values:[\"evenodd\",\"nonzero\"],dflt:\"evenodd\",editType:\"arraydraw\"},editable:{valType:\"boolean\",dflt:!1,editType:\"calc+arraydraw\"},label:{text:{valType:\"string\",dflt:\"\",editType:\"arraydraw\"},texttemplate:c({},{keys:Object.keys(f)}),font:i({editType:\"calc+arraydraw\",colorEditType:\"arraydraw\"}),textposition:{valType:\"enumerated\",values:[\"top left\",\"top center\",\"top right\",\"middle left\",\"middle center\",\"middle right\",\"bottom left\",\"bottom center\",\"bottom right\",\"start\",\"middle\",\"end\"],editType:\"arraydraw\"},textangle:{valType:\"angle\",dflt:\"auto\",editType:\"calc+arraydraw\"},xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"auto\",editType:\"calc+arraydraw\"},yanchor:{valType:\"enumerated\",values:[\"top\",\"middle\",\"bottom\"],editType:\"calc+arraydraw\"},padding:{valType:\"number\",dflt:3,min:0,editType:\"arraydraw\"},editType:\"arraydraw\"},editType:\"arraydraw\"})},5627:function(t,e,r){\"use strict\";var n=r(71828),i=r(89298),a=r(21459),o=r(30477);function s(t){return u(t.line.width,t.xsizemode,t.x0,t.x1,t.path,!1)}function l(t){return u(t.line.width,t.ysizemode,t.y0,t.y1,t.path,!0)}function u(t,e,r,i,s,l){var u=t/2,c=l;if(\"pixel\"===e){var f=s?o.extractPathCoords(s,l?a.paramIsY:a.paramIsX):[r,i],h=n.aggNums(Math.max,null,f),p=n.aggNums(Math.min,null,f),d=p<0?Math.abs(p)+u:u,v=h>0?h+u:u;return{ppad:u,ppadplus:c?d:v,ppadminus:c?v:d}}return{ppad:u}}function c(t,e,r,n,i){var s=\"category\"===t.type||\"multicategory\"===t.type?t.r2c:t.d2c;if(void 0!==e)return[s(e),s(r)];if(n){var l,u,c,f,h=1/0,p=-1/0,d=n.match(a.segmentRE);for(\"date\"===t.type&&(s=o.decodeDate(s)),l=0;lp&&(p=f)));return p>=h?[h,p]:void 0}}t.exports=function(t){var e=t._fullLayout,r=n.filterVisible(e.shapes);if(r.length&&t._fullData.length)for(var o=0;o=t?e-n:n-e,-180/Math.PI*Math.atan2(i,a)}(x,_,b,w):0),A.call((function(e){return e.call(o.font,k).attr({}),a.convertToTspans(e,t),e}));var U=function(t,e,r,n,i,a,o){var s,l,u,c,h=i.label.textposition,p=i.label.textangle,d=i.label.padding,v=i.type,g=Math.PI/180*a,y=Math.sin(g),m=Math.cos(g),x=i.label.xanchor,b=i.label.yanchor;if(\"line\"===v){\"start\"===h?(s=t,l=e):\"end\"===h?(s=r,l=n):(s=(t+r)/2,l=(e+n)/2),\"auto\"===x&&(x=\"start\"===h?\"auto\"===p?r>t?\"left\":rt?\"right\":rt?\"right\":rt?\"left\":r1&&(2!==t.length||\"Z\"!==t[1][0])&&(0===C&&(t[0][0]=\"M\"),e[L]=t,A(),M())}}()}}function V(t,r){!function(t,r){if(e.length)for(var n=0;n_?(M=p,C=\"y0\",S=_,P=\"y1\"):(M=_,C=\"y1\",S=p,P=\"y0\"),tt(n),nt(l,r),function(t,e,r){var n=e.xref,i=e.yref,a=o.getFromId(r,n),s=o.getFromId(r,i),l=\"\";\"paper\"===n||a.autorange||(l+=n),\"paper\"===i||s.autorange||(l+=i),h.setClipUrl(t,l?\"clip\"+r._fullLayout._uid+l:null,r)}(e,r,t),Q.moveFn=\"move\"===z?et:rt,Q.altKey=n.altKey)},doneFn:function(){b(t)||(v(e),it(l),T(e,t,r),i.call(\"_guiRelayout\",t,c.getUpdateObj()))},clickFn:function(){b(t)||it(l)}};function tt(r){if(b(t))z=null;else if(j)z=\"path\"===r.target.tagName?\"move\":\"start-point\"===r.target.attributes[\"data-line-point\"].value?\"resize-over-start-point\":\"resize-over-end-point\";else{var n=Q.element.getBoundingClientRect(),i=n.right-n.left,a=n.bottom-n.top,o=r.clientX-n.left,s=r.clientY-n.top,l=!U&&i>R&&a>F&&!r.shiftKey?d.getCursor(o/i,1-s/a):\"move\";v(e,l),z=l.split(\"-\")[0]}}function et(n,i){if(\"path\"===r.type){var a=function(t){return t},o=a,c=a;B?V(\"xanchor\",r.xanchor=J(w+n)):(o=function(t){return J(W(t)+n)},q&&\"date\"===q.type&&(o=y.encodeDate(o))),N?V(\"yanchor\",r.yanchor=K(A+i)):(c=function(t){return K(X(t)+i)},Z&&\"date\"===Z.type&&(c=y.encodeDate(c))),V(\"path\",r.path=k(D,o,c))}else B?V(\"xanchor\",r.xanchor=J(w+n)):(V(\"x0\",r.x0=J(f+n)),V(\"x1\",r.x1=J(x+n))),N?V(\"yanchor\",r.yanchor=K(A+i)):(V(\"y0\",r.y0=K(p+i)),V(\"y1\",r.y1=K(_+i)));e.attr(\"d\",m(t,r)),nt(l,r),u(t,s,r,H)}function rt(n,i){if(U){var a=function(t){return t},o=a,c=a;B?V(\"xanchor\",r.xanchor=J(w+n)):(o=function(t){return J(W(t)+n)},q&&\"date\"===q.type&&(o=y.encodeDate(o))),N?V(\"yanchor\",r.yanchor=K(A+i)):(c=function(t){return K(X(t)+i)},Z&&\"date\"===Z.type&&(c=y.encodeDate(c))),V(\"path\",r.path=k(D,o,c))}else if(j){if(\"resize-over-start-point\"===z){var h=f+n,d=N?p-i:p+i;V(\"x0\",r.x0=B?h:J(h)),V(\"y0\",r.y0=N?d:K(d))}else if(\"resize-over-end-point\"===z){var v=x+n,g=N?_-i:_+i;V(\"x1\",r.x1=B?v:J(v)),V(\"y1\",r.y1=N?g:K(g))}}else{var b=function(t){return-1!==z.indexOf(t)},T=b(\"n\"),G=b(\"s\"),Y=b(\"w\"),$=b(\"e\"),Q=T?M+i:M,tt=G?S+i:S,et=Y?E+n:E,rt=$?L+n:L;N&&(T&&(Q=M-i),G&&(tt=S-i)),(!N&&tt-Q>F||N&&Q-tt>F)&&(V(C,r[C]=N?Q:K(Q)),V(P,r[P]=N?tt:K(tt))),rt-et>R&&(V(O,r[O]=B?et:J(et)),V(I,r[I]=B?rt:J(rt)))}e.attr(\"d\",m(t,r)),nt(l,r),u(t,s,r,H)}function nt(t,e){(B||N)&&function(){var r=\"path\"!==e.type,n=t.selectAll(\".visual-cue\").data([0]);n.enter().append(\"path\").attr({fill:\"#fff\",\"fill-rule\":\"evenodd\",stroke:\"#000\",\"stroke-width\":1}).classed(\"visual-cue\",!0);var i=W(B?e.xanchor:a.midRange(r?[e.x0,e.x1]:y.extractPathCoords(e.path,g.paramIsX))),o=X(N?e.yanchor:a.midRange(r?[e.y0,e.y1]:y.extractPathCoords(e.path,g.paramIsY)));if(i=y.roundPositionForSharpStrokeRendering(i,1),o=y.roundPositionForSharpStrokeRendering(o,1),B&&N){var s=\"M\"+(i-1-1)+\",\"+(o-1-1)+\"h-8v2h8 v8h2v-8 h8v-2h-8 v-8h-2 Z\";n.attr(\"d\",s)}else if(B){var l=\"M\"+(i-1-1)+\",\"+(o-9-1)+\"v18 h2 v-18 Z\";n.attr(\"d\",l)}else{var u=\"M\"+(i-9-1)+\",\"+(o-1-1)+\"h18 v2 h-18 Z\";n.attr(\"d\",u)}}()}function it(t){t.selectAll(\".visual-cue\").remove()}d.init(Q),$.node().onmousemove=tt}(t,F,c,e,r,z):!0===c.editable&&F.style(\"pointer-events\",I||f.opacity(L)*E<=.5?\"stroke\":\"all\");F.node().addEventListener(\"click\",(function(){return function(t,e){if(_(t)){var r=+e.node().getAttribute(\"data-index\");if(r>=0){if(r===t._fullLayout._activeShapeIndex)return void A(t);t._fullLayout._activeShapeIndex=r,t._fullLayout._deactivateShape=A,x(t)}}}(t,F)}))}c._input&&!0===c.visible&&(\"below\"!==c.layer?M(t._fullLayout._shapeUpperLayer):\"paper\"===c.xref||\"paper\"===c.yref?M(t._fullLayout._shapeLowerLayer):w._hadPlotinfo?M((w.mainplotinfo||w).shapelayer):M(t._fullLayout._shapeLowerLayer))}function T(t,e,r){var n=(r.xref+r.yref).replace(/paper/g,\"\").replace(/[xyz][1-9]* *domain/g,\"\");h.setClipUrl(t,n?\"clip\"+e._fullLayout._uid+n:null,e)}function k(t,e,r){return t.replace(g.segmentRE,(function(t){var n=0,i=t.charAt(0),a=g.paramIsX[i],o=g.paramIsY[i],s=g.numParams[i];return i+t.substr(1).replace(g.paramRE,(function(t){return n>=s||(a[n]?t=e(t):o[n]&&(t=r(t)),n++),t}))}))}function A(t){_(t)&&t._fullLayout._activeShapeIndex>=0&&(c(t),delete t._fullLayout._activeShapeIndex,x(t))}t.exports={draw:x,drawOne:w,eraseActiveShape:function(t){if(_(t)){c(t);var e=t._fullLayout._activeShapeIndex,r=(t.layout||{}).shapes||[];if(e0&&lp&&(t=\"X\"),t}));return a>p&&(d=d.replace(/[\\s,]*X.*/,\"\"),i.log(\"Ignoring extra params in segment \"+t)),c+d}))}(r,s,u);if(\"pixel\"===r.xsizemode){var b=s(r.xanchor);c=b+r.x0,f=b+r.x1}else c=s(r.x0),f=s(r.x1);if(\"pixel\"===r.ysizemode){var _=u(r.yanchor);h=_-r.y0,p=_-r.y1}else h=u(r.y0),p=u(r.y1);if(\"line\"===d)return\"M\"+c+\",\"+h+\"L\"+f+\",\"+p;if(\"rect\"===d)return\"M\"+c+\",\"+h+\"H\"+f+\"V\"+p+\"H\"+c+\"Z\";var w=(c+f)/2,T=(h+p)/2,k=Math.abs(w-c),A=Math.abs(T-h),M=\"A\"+k+\",\"+A,S=w+k+\",\"+T;return\"M\"+S+M+\" 0 1,1 \"+w+\",\"+(T-A)+M+\" 0 0,1 \"+S+\"Z\"}},89853:function(t,e,r){\"use strict\";var n=r(34031);t.exports={moduleType:\"component\",name:\"shapes\",layoutAttributes:r(89827),supplyLayoutDefaults:r(84726),supplyDrawNewShapeDefaults:r(45547),includeBasePlot:r(76325)(\"shapes\"),calcAutorange:r(5627),draw:n.draw,drawOne:n.drawOne}},37281:function(t){\"use strict\";function e(t,e){return e?e.d2l(t):t}function r(t,e){return e?e.l2d(t):t}function n(t,r){return e(t.x1,r)-e(t.x0,r)}function i(t,r,n){return e(t.y1,n)-e(t.y0,n)}t.exports={x0:function(t){return t.x0},x1:function(t){return t.x1},y0:function(t){return t.y0},y1:function(t){return t.y1},slope:function(t,e,r){return\"line\"!==t.type?void 0:i(t,0,r)/n(t,e)},dx:n,dy:i,width:function(t,e){return Math.abs(n(t,e))},height:function(t,e,r){return Math.abs(i(t,0,r))},length:function(t,e,r){return\"line\"!==t.type?void 0:Math.sqrt(Math.pow(n(t,e),2)+Math.pow(i(t,0,r),2))},xcenter:function(t,n){return r((e(t.x1,n)+e(t.x0,n))/2,n)},ycenter:function(t,n,i){return r((e(t.y1,i)+e(t.y0,i))/2,i)}}},75067:function(t,e,r){\"use strict\";var n=r(41940),i=r(35025),a=r(1426).extendDeepAll,o=r(30962).overrideAll,s=r(85594),l=r(44467).templatedArray,u=r(98292),c=l(\"step\",{visible:{valType:\"boolean\",dflt:!0},method:{valType:\"enumerated\",values:[\"restyle\",\"relayout\",\"animate\",\"update\",\"skip\"],dflt:\"restyle\"},args:{valType:\"info_array\",freeLength:!0,items:[{valType:\"any\"},{valType:\"any\"},{valType:\"any\"}]},label:{valType:\"string\"},value:{valType:\"string\"},execute:{valType:\"boolean\",dflt:!0}});t.exports=o(l(\"slider\",{visible:{valType:\"boolean\",dflt:!0},active:{valType:\"number\",min:0,dflt:0},steps:c,lenmode:{valType:\"enumerated\",values:[\"fraction\",\"pixels\"],dflt:\"fraction\"},len:{valType:\"number\",min:0,dflt:1},x:{valType:\"number\",min:-2,max:3,dflt:0},pad:a(i({editType:\"arraydraw\"}),{},{t:{dflt:20}}),xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"left\"},y:{valType:\"number\",min:-2,max:3,dflt:0},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"top\"},transition:{duration:{valType:\"number\",min:0,dflt:150},easing:{valType:\"enumerated\",values:s.transition.easing.values,dflt:\"cubic-in-out\"}},currentvalue:{visible:{valType:\"boolean\",dflt:!0},xanchor:{valType:\"enumerated\",values:[\"left\",\"center\",\"right\"],dflt:\"left\"},offset:{valType:\"number\",dflt:10},prefix:{valType:\"string\"},suffix:{valType:\"string\"},font:n({})},font:n({}),activebgcolor:{valType:\"color\",dflt:u.gripBgActiveColor},bgcolor:{valType:\"color\",dflt:u.railBgColor},bordercolor:{valType:\"color\",dflt:u.railBorderColor},borderwidth:{valType:\"number\",min:0,dflt:u.railBorderWidth},ticklen:{valType:\"number\",min:0,dflt:u.tickLength},tickcolor:{valType:\"color\",dflt:u.tickColor},tickwidth:{valType:\"number\",min:0,dflt:1},minorticklen:{valType:\"number\",min:0,dflt:u.minorTickLength}}),\"arraydraw\",\"from-root\")},98292:function(t){\"use strict\";t.exports={name:\"sliders\",containerClassName:\"slider-container\",groupClassName:\"slider-group\",inputAreaClass:\"slider-input-area\",railRectClass:\"slider-rail-rect\",railTouchRectClass:\"slider-rail-touch-rect\",gripRectClass:\"slider-grip-rect\",tickRectClass:\"slider-tick-rect\",inputProxyClass:\"slider-input-proxy\",labelsClass:\"slider-labels\",labelGroupClass:\"slider-label-group\",labelClass:\"slider-label\",currentValueClass:\"slider-current-value\",railHeight:5,menuIndexAttrName:\"slider-active-index\",autoMarginIdRoot:\"slider-\",minWidth:30,minHeight:30,textPadX:40,arrowOffsetX:4,railRadius:2,railWidth:5,railBorder:4,railBorderWidth:1,railBorderColor:\"#bec8d9\",railBgColor:\"#f8fafc\",railInset:8,stepInset:10,gripRadius:10,gripWidth:20,gripHeight:20,gripBorder:20,gripBorderWidth:1,gripBorderColor:\"#bec8d9\",gripBgColor:\"#f6f8fa\",gripBgActiveColor:\"#dbdde0\",labelPadding:8,labelOffset:0,tickWidth:1,tickColor:\"#333\",tickOffset:25,tickLength:7,minorTickOffset:25,minorTickColor:\"#333\",minorTickLength:4,currentValuePadding:8,currentValueInset:0}},12343:function(t,e,r){\"use strict\";var n=r(71828),i=r(85501),a=r(75067),o=r(98292).name,s=a.steps;function l(t,e,r){function o(r,i){return n.coerce(t,e,a,r,i)}for(var s=i(t,e,{name:\"steps\",handleItemDefaults:u}),l=0,c=0;c0&&(s=s.transition().duration(e.transition.duration).ease(e.transition.easing)),s.attr(\"transform\",l(o-.5*f.gripWidth,e._dims.currentValueTotalHeight))}}function E(t,e){var r=t._dims;return r.inputAreaStart+f.stepInset+(r.inputAreaLength-2*f.stepInset)*Math.min(1,Math.max(0,e))}function L(t,e){var r=t._dims;return Math.min(1,Math.max(0,(e-f.stepInset-r.inputAreaStart)/(r.inputAreaLength-2*f.stepInset-2*r.inputAreaStart)))}function C(t,e,r){var n=r._dims,i=s.ensureSingle(t,\"rect\",f.railTouchRectClass,(function(n){n.call(A,e,t,r).style(\"pointer-events\",\"all\")}));i.attr({width:n.inputAreaLength,height:Math.max(n.inputAreaWidth,f.tickOffset+r.ticklen+n.labelHeight)}).call(a.fill,r.bgcolor).attr(\"opacity\",0),o.setTranslate(i,0,n.currentValueTotalHeight)}function P(t,e){var r=e._dims,n=r.inputAreaLength-2*f.railInset,i=s.ensureSingle(t,\"rect\",f.railRectClass);i.attr({width:n,height:f.railWidth,rx:f.railRadius,ry:f.railRadius,\"shape-rendering\":\"crispEdges\"}).call(a.stroke,e.bordercolor).call(a.fill,e.bgcolor).style(\"stroke-width\",e.borderwidth+\"px\"),o.setTranslate(i,f.railInset,.5*(r.inputAreaWidth-f.railWidth)+r.currentValueTotalHeight)}t.exports=function(t){var e=t._context.staticPlot,r=t._fullLayout,a=function(t,e){for(var r=t[f.name],n=[],i=0;i0?[0]:[]);function l(e){e._commandObserver&&(e._commandObserver.remove(),delete e._commandObserver),i.autoMargin(t,g(e))}if(s.enter().append(\"g\").classed(f.containerClassName,!0).style(\"cursor\",e?null:\"ew-resize\"),s.exit().each((function(){n.select(this).selectAll(\"g.\"+f.groupClassName).each(l)})).remove(),0!==a.length){var u=s.selectAll(\"g.\"+f.groupClassName).data(a,y);u.enter().append(\"g\").classed(f.groupClassName,!0),u.exit().each(l).remove();for(var c=0;c0||_<0){var M={left:[-w,0],right:[w,0],top:[0,-w],bottom:[0,w]}[b.side];r.attr(\"transform\",l(M[0],M[1]))}}}return R.call(F),I&&(E?R.on(\".opacity\",null):(A=0,M=!0,R.text(m).on(\"mouseover.opacity\",(function(){n.select(this).transition().duration(h.SHOW_PLACEHOLDER).style(\"opacity\",1)})).on(\"mouseout.opacity\",(function(){n.select(this).transition().duration(h.HIDE_PLACEHOLDER).style(\"opacity\",0)}))),R.call(f.makeEditable,{gd:t}).on(\"edit\",(function(e){void 0!==x?o.call(\"_guiRestyle\",t,y,e,x):o.call(\"_guiRelayout\",t,y,e)})).on(\"cancel\",(function(){this.text(this.attr(\"data-unformatted\")).call(F)})).on(\"input\",(function(t){this.text(t||\" \").call(f.positionText,_.x,_.y)}))),R.classed(\"js-placeholder\",M),T}}},7163:function(t,e,r){\"use strict\";var n=r(41940),i=r(22399),a=r(1426).extendFlat,o=r(30962).overrideAll,s=r(35025),l=r(44467).templatedArray,u=l(\"button\",{visible:{valType:\"boolean\"},method:{valType:\"enumerated\",values:[\"restyle\",\"relayout\",\"animate\",\"update\",\"skip\"],dflt:\"restyle\"},args:{valType:\"info_array\",freeLength:!0,items:[{valType:\"any\"},{valType:\"any\"},{valType:\"any\"}]},args2:{valType:\"info_array\",freeLength:!0,items:[{valType:\"any\"},{valType:\"any\"},{valType:\"any\"}]},label:{valType:\"string\",dflt:\"\"},execute:{valType:\"boolean\",dflt:!0}});t.exports=o(l(\"updatemenu\",{_arrayAttrRegexps:[/^updatemenus\\[(0|[1-9][0-9]+)\\]\\.buttons/],visible:{valType:\"boolean\"},type:{valType:\"enumerated\",values:[\"dropdown\",\"buttons\"],dflt:\"dropdown\"},direction:{valType:\"enumerated\",values:[\"left\",\"right\",\"up\",\"down\"],dflt:\"down\"},active:{valType:\"integer\",min:-1,dflt:0},showactive:{valType:\"boolean\",dflt:!0},buttons:u,x:{valType:\"number\",min:-2,max:3,dflt:-.05},xanchor:{valType:\"enumerated\",values:[\"auto\",\"left\",\"center\",\"right\"],dflt:\"right\"},y:{valType:\"number\",min:-2,max:3,dflt:1},yanchor:{valType:\"enumerated\",values:[\"auto\",\"top\",\"middle\",\"bottom\"],dflt:\"top\"},pad:a(s({editType:\"arraydraw\"}),{}),font:n({}),bgcolor:{valType:\"color\"},bordercolor:{valType:\"color\",dflt:i.borderLine},borderwidth:{valType:\"number\",min:0,dflt:1,editType:\"arraydraw\"}}),\"arraydraw\",\"from-root\")},75909:function(t){\"use strict\";t.exports={name:\"updatemenus\",containerClassName:\"updatemenu-container\",headerGroupClassName:\"updatemenu-header-group\",headerClassName:\"updatemenu-header\",headerArrowClassName:\"updatemenu-header-arrow\",dropdownButtonGroupClassName:\"updatemenu-dropdown-button-group\",dropdownButtonClassName:\"updatemenu-dropdown-button\",buttonClassName:\"updatemenu-button\",itemRectClassName:\"updatemenu-item-rect\",itemTextClassName:\"updatemenu-item-text\",menuIndexAttrName:\"updatemenu-active-index\",autoMarginIdRoot:\"updatemenu-\",blankHeaderOpts:{label:\" \"},minWidth:30,minHeight:30,textPadX:24,arrowPadX:16,rx:2,ry:2,textOffsetX:12,textOffsetY:3,arrowOffsetX:4,gapButtonHeader:5,gapButton:2,activeColor:\"#F4FAFF\",hoverColor:\"#F4FAFF\",arrowSymbol:{left:\"◄\",right:\"►\",up:\"▲\",down:\"▼\"}}},64897:function(t,e,r){\"use strict\";var n=r(71828),i=r(85501),a=r(7163),o=r(75909).name,s=a.buttons;function l(t,e,r){function o(r,i){return n.coerce(t,e,a,r,i)}o(\"visible\",i(t,e,{name:\"buttons\",handleItemDefaults:u}).length>0)&&(o(\"active\"),o(\"direction\"),o(\"type\"),o(\"showactive\"),o(\"x\"),o(\"y\"),n.noneOrAll(t,e,[\"x\",\"y\"]),o(\"xanchor\"),o(\"yanchor\"),o(\"pad.t\"),o(\"pad.r\"),o(\"pad.b\"),o(\"pad.l\"),n.coerceFont(o,\"font\",r.font),o(\"bgcolor\",r.paper_bgcolor),o(\"bordercolor\"),o(\"borderwidth\"))}function u(t,e){function r(r,i){return n.coerce(t,e,s,r,i)}r(\"visible\",\"skip\"===t.method||Array.isArray(t.args))&&(r(\"method\"),r(\"args\"),r(\"args2\"),r(\"label\"),r(\"execute\"))}t.exports=function(t,e){i(t,e,{name:o,handleItemDefaults:l})}},13689:function(t,e,r){\"use strict\";var n=r(39898),i=r(74875),a=r(7901),o=r(91424),s=r(71828),l=r(63893),u=r(44467).arrayEditor,c=r(18783).LINE_SPACING,f=r(75909),h=r(25849);function p(t){return t._index}function d(t,e){return+t.attr(f.menuIndexAttrName)===e._index}function v(t,e,r,n,i,a,o,s){e.active=o,u(t.layout,f.name,e).applyUpdate(\"active\",o),\"buttons\"===e.type?y(t,n,null,null,e):\"dropdown\"===e.type&&(i.attr(f.menuIndexAttrName,\"-1\"),g(t,n,i,a,e),s||y(t,n,i,a,e))}function g(t,e,r,n,i){var a=s.ensureSingle(e,\"g\",f.headerClassName,(function(t){t.style(\"pointer-events\",\"all\")})),l=i._dims,u=i.active,c=i.buttons[u]||f.blankHeaderOpts,h={y:i.pad.t,yPad:0,x:i.pad.l,xPad:0,index:0},p={width:l.headerWidth,height:l.headerHeight};a.call(m,i,c,t).call(M,i,h,p),s.ensureSingle(e,\"text\",f.headerArrowClassName,(function(t){t.attr(\"text-anchor\",\"end\").call(o.font,i.font).text(f.arrowSymbol[i.direction])})).attr({x:l.headerWidth-f.arrowOffsetX+i.pad.l,y:l.headerHeight/2+f.textOffsetY+i.pad.t}),a.on(\"click\",(function(){r.call(S,String(d(r,i)?-1:i._index)),y(t,e,r,n,i)})),a.on(\"mouseover\",(function(){a.call(w)})),a.on(\"mouseout\",(function(){a.call(T,i)})),o.setTranslate(e,l.lx,l.ly)}function y(t,e,r,a,o){r||(r=e).attr(\"pointer-events\",\"all\");var l=function(t){return-1==+t.attr(f.menuIndexAttrName)}(r)&&\"buttons\"!==o.type?[]:o.buttons,u=\"dropdown\"===o.type?f.dropdownButtonClassName:f.buttonClassName,c=r.selectAll(\"g.\"+u).data(s.filterVisible(l)),h=c.enter().append(\"g\").classed(u,!0),p=c.exit();\"dropdown\"===o.type?(h.attr(\"opacity\",\"0\").transition().attr(\"opacity\",\"1\"),p.transition().attr(\"opacity\",\"0\").remove()):p.remove();var d=0,g=0,y=o._dims,x=-1!==[\"up\",\"down\"].indexOf(o.direction);\"dropdown\"===o.type&&(x?g=y.headerHeight+f.gapButtonHeader:d=y.headerWidth+f.gapButtonHeader),\"dropdown\"===o.type&&\"up\"===o.direction&&(g=-f.gapButtonHeader+f.gapButton-y.openHeight),\"dropdown\"===o.type&&\"left\"===o.direction&&(d=-f.gapButtonHeader+f.gapButton-y.openWidth);var b={x:y.lx+d+o.pad.l,y:y.ly+g+o.pad.t,yPad:f.gapButton,xPad:f.gapButton,index:0},k={l:b.x+o.borderwidth,t:b.y+o.borderwidth};c.each((function(s,l){var u=n.select(this);u.call(m,o,s,t).call(M,o,b),u.on(\"click\",(function(){n.event.defaultPrevented||(s.execute&&(s.args2&&o.active===l?(v(t,o,0,e,r,a,-1),i.executeAPICommand(t,s.method,s.args2)):(v(t,o,0,e,r,a,l),i.executeAPICommand(t,s.method,s.args))),t.emit(\"plotly_buttonclicked\",{menu:o,button:s,active:o.active}))})),u.on(\"mouseover\",(function(){u.call(w)})),u.on(\"mouseout\",(function(){u.call(T,o),c.call(_,o)}))})),c.call(_,o),x?(k.w=Math.max(y.openWidth,y.headerWidth),k.h=b.y-k.t):(k.w=b.x-k.l,k.h=Math.max(y.openHeight,y.headerHeight)),k.direction=o.direction,a&&(c.size()?function(t,e,r,n,i,a){var o,s,l,u=i.direction,c=\"up\"===u||\"down\"===u,h=i._dims,p=i.active;if(c)for(s=0,l=0;l0?[0]:[]);if(o.enter().append(\"g\").classed(f.containerClassName,!0).style(\"cursor\",\"pointer\"),o.exit().each((function(){n.select(this).selectAll(\"g.\"+f.headerGroupClassName).each(a)})).remove(),0!==r.length){var l=o.selectAll(\"g.\"+f.headerGroupClassName).data(r,p);l.enter().append(\"g\").classed(f.headerGroupClassName,!0);for(var u=s.ensureSingle(o,\"g\",f.dropdownButtonGroupClassName,(function(t){t.style(\"pointer-events\",\"all\")})),c=0;cw,A=s.barLength+2*s.barPad,M=s.barWidth+2*s.barPad,S=d,E=g+y;E+M>u&&(E=u-M);var L=this.container.selectAll(\"rect.scrollbar-horizontal\").data(k?[0]:[]);L.exit().on(\".drag\",null).remove(),L.enter().append(\"rect\").classed(\"scrollbar-horizontal\",!0).call(i.fill,s.barColor),k?(this.hbar=L.attr({rx:s.barRadius,ry:s.barRadius,x:S,y:E,width:A,height:M}),this._hbarXMin=S+A/2,this._hbarTranslateMax=w-A):(delete this.hbar,delete this._hbarXMin,delete this._hbarTranslateMax);var C=y>T,P=s.barWidth+2*s.barPad,O=s.barLength+2*s.barPad,I=d+v,D=g;I+P>l&&(I=l-P);var z=this.container.selectAll(\"rect.scrollbar-vertical\").data(C?[0]:[]);z.exit().on(\".drag\",null).remove(),z.enter().append(\"rect\").classed(\"scrollbar-vertical\",!0).call(i.fill,s.barColor),C?(this.vbar=z.attr({rx:s.barRadius,ry:s.barRadius,x:I,y:D,width:P,height:O}),this._vbarYMin=D+O/2,this._vbarTranslateMax=T-O):(delete this.vbar,delete this._vbarYMin,delete this._vbarTranslateMax);var R=this.id,F=c-.5,B=C?f+P+.5:f+.5,N=h-.5,j=k?p+M+.5:p+.5,U=o._topdefs.selectAll(\"#\"+R).data(k||C?[0]:[]);if(U.exit().remove(),U.enter().append(\"clipPath\").attr(\"id\",R).append(\"rect\"),k||C?(this._clipRect=U.select(\"rect\").attr({x:Math.floor(F),y:Math.floor(N),width:Math.ceil(B)-Math.floor(F),height:Math.ceil(j)-Math.floor(N)}),this.container.call(a.setClipUrl,R,this.gd),this.bg.attr({x:d,y:g,width:v,height:y})):(this.bg.attr({width:0,height:0}),this.container.on(\"wheel\",null).on(\".drag\",null).call(a.setClipUrl,null),delete this._clipRect),k||C){var V=n.behavior.drag().on(\"dragstart\",(function(){n.event.sourceEvent.preventDefault()})).on(\"drag\",this._onBoxDrag.bind(this));this.container.on(\"wheel\",null).on(\"wheel\",this._onBoxWheel.bind(this)).on(\".drag\",null).call(V);var H=n.behavior.drag().on(\"dragstart\",(function(){n.event.sourceEvent.preventDefault(),n.event.sourceEvent.stopPropagation()})).on(\"drag\",this._onBarDrag.bind(this));k&&this.hbar.on(\".drag\",null).call(H),C&&this.vbar.on(\".drag\",null).call(H)}this.setTranslate(e,r)},s.prototype.disable=function(){(this.hbar||this.vbar)&&(this.bg.attr({width:0,height:0}),this.container.on(\"wheel\",null).on(\".drag\",null).call(a.setClipUrl,null),delete this._clipRect),this.hbar&&(this.hbar.on(\".drag\",null),this.hbar.remove(),delete this.hbar,delete this._hbarXMin,delete this._hbarTranslateMax),this.vbar&&(this.vbar.on(\".drag\",null),this.vbar.remove(),delete this.vbar,delete this._vbarYMin,delete this._vbarTranslateMax)},s.prototype._onBoxDrag=function(){var t=this.translateX,e=this.translateY;this.hbar&&(t-=n.event.dx),this.vbar&&(e-=n.event.dy),this.setTranslate(t,e)},s.prototype._onBoxWheel=function(){var t=this.translateX,e=this.translateY;this.hbar&&(t+=n.event.deltaY),this.vbar&&(e+=n.event.deltaY),this.setTranslate(t,e)},s.prototype._onBarDrag=function(){var t=this.translateX,e=this.translateY;if(this.hbar){var r=t+this._hbarXMin,i=r+this._hbarTranslateMax;t=(o.constrain(n.event.x,r,i)-r)/(i-r)*(this.position.w-this._box.w)}if(this.vbar){var a=e+this._vbarYMin,s=a+this._vbarTranslateMax;e=(o.constrain(n.event.y,a,s)-a)/(s-a)*(this.position.h-this._box.h)}this.setTranslate(t,e)},s.prototype.setTranslate=function(t,e){var r=this.position.w-this._box.w,n=this.position.h-this._box.h;if(t=o.constrain(t||0,0,r),e=o.constrain(e||0,0,n),this.translateX=t,this.translateY=e,this.container.call(a.setTranslate,this._box.l-this.position.l-t,this._box.t-this.position.t-e),this._clipRect&&this._clipRect.attr({x:Math.floor(this.position.l+t-.5),y:Math.floor(this.position.t+e-.5)}),this.hbar){var i=t/r;this.hbar.call(a.setTranslate,t+i*this._hbarTranslateMax,e)}if(this.vbar){var s=e/n;this.vbar.call(a.setTranslate,t,e+s*this._vbarTranslateMax)}}},18783:function(t){\"use strict\";t.exports={FROM_BL:{left:0,center:.5,right:1,bottom:0,middle:.5,top:1},FROM_TL:{left:0,center:.5,right:1,bottom:1,middle:.5,top:0},FROM_BR:{left:1,center:.5,right:0,bottom:0,middle:.5,top:1},LINE_SPACING:1.3,CAP_SHIFT:.7,MID_SHIFT:.35,OPPOSITE_SIDE:{left:\"right\",right:\"left\",top:\"bottom\",bottom:\"top\"}}},24695:function(t){\"use strict\";t.exports={axisRefDescription:function(t,e,r){return[\"If set to a\",t,\"axis id (e.g. *\"+t+\"* or\",\"*\"+t+\"2*), the `\"+t+\"` position refers to a\",t,\"coordinate. If set to *paper*, the `\"+t+\"`\",\"position refers to the distance from the\",e,\"of the plotting\",\"area in normalized coordinates where *0* (*1*) corresponds to the\",e,\"(\"+r+\"). If set to a\",t,\"axis ID followed by\",\"*domain* (separated by a space), the position behaves like for\",\"*paper*, but refers to the distance in fractions of the domain\",\"length from the\",e,\"of the domain of that axis: e.g.,\",\"*\"+t+\"2 domain* refers to the domain of the second\",t,\" axis and a\",t,\"position of 0.5 refers to the\",\"point between the\",e,\"and the\",r,\"of the domain of the\",\"second\",t,\"axis.\"].join(\" \")}}},22372:function(t){\"use strict\";t.exports={INCREASING:{COLOR:\"#3D9970\",SYMBOL:\"▲\"},DECREASING:{COLOR:\"#FF4136\",SYMBOL:\"▼\"}}},31562:function(t){\"use strict\";t.exports={FORMAT_LINK:\"https://github.com/d3/d3-format/tree/v1.4.5#d3-format\",DATE_FORMAT_LINK:\"https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format\"}},74808:function(t){\"use strict\";t.exports={COMPARISON_OPS:[\"=\",\"!=\",\"<\",\">=\",\">\",\"<=\"],COMPARISON_OPS2:[\"=\",\"<\",\">=\",\">\",\"<=\"],INTERVAL_OPS:[\"[]\",\"()\",\"[)\",\"(]\",\"][\",\")(\",\"](\",\")[\"],SET_OPS:[\"{}\",\"}{\"],CONSTRAINT_REDUCTION:{\"=\":\"=\",\"<\":\"<\",\"<=\":\"<\",\">\":\">\",\">=\":\">\",\"[]\":\"[]\",\"()\":\"[]\",\"[)\":\"[]\",\"(]\":\"[]\",\"][\":\"][\",\")(\":\"][\",\"](\":\"][\",\")[\":\"][\"}}},29659:function(t){\"use strict\";t.exports={solid:[[],0],dot:[[.5,1],200],dash:[[.5,1],50],longdash:[[.5,1],10],dashdot:[[.5,.625,.875,1],50],longdashdot:[[.5,.7,.8,1],10]}},87381:function(t){\"use strict\";t.exports={circle:\"●\",\"circle-open\":\"○\",square:\"■\",\"square-open\":\"□\",diamond:\"◆\",\"diamond-open\":\"◇\",cross:\"+\",x:\"❌\"}},37822:function(t){\"use strict\";t.exports={SHOW_PLACEHOLDER:100,HIDE_PLACEHOLDER:1e3,DESELECTDIM:.2}},50606:function(t){\"use strict\";t.exports={BADNUM:void 0,FP_SAFE:1e-4*Number.MAX_VALUE,ONEMAXYEAR:316224e5,ONEAVGYEAR:315576e5,ONEMINYEAR:31536e6,ONEMAXQUARTER:79488e5,ONEAVGQUARTER:78894e5,ONEMINQUARTER:76896e5,ONEMAXMONTH:26784e5,ONEAVGMONTH:26298e5,ONEMINMONTH:24192e5,ONEWEEK:6048e5,ONEDAY:864e5,ONEHOUR:36e5,ONEMIN:6e4,ONESEC:1e3,EPOCHJD:2440587.5,ALMOST_EQUAL:.999999,LOG_CLIP:10,MINUS_SIGN:\"−\"}},32396:function(t,e){\"use strict\";e.CSS_DECLARATIONS=[[\"image-rendering\",\"optimizeSpeed\"],[\"image-rendering\",\"-moz-crisp-edges\"],[\"image-rendering\",\"-o-crisp-edges\"],[\"image-rendering\",\"-webkit-optimize-contrast\"],[\"image-rendering\",\"optimize-contrast\"],[\"image-rendering\",\"crisp-edges\"],[\"image-rendering\",\"pixelated\"]],e.STYLE=e.CSS_DECLARATIONS.map((function(t){return t.join(\": \")+\"; \"})).join(\"\")},77922:function(t,e){\"use strict\";e.xmlns=\"http://www.w3.org/2000/xmlns/\",e.svg=\"http://www.w3.org/2000/svg\",e.xlink=\"http://www.w3.org/1999/xlink\",e.svgAttrs={xmlns:e.svg,\"xmlns:xlink\":e.xlink}},8729:function(t,e,r){\"use strict\";e.version=r(11506).version,r(7417),r(98847);for(var n=r(73972),i=e.register=n.register,a=r(10641),o=Object.keys(a),s=0;s\",\"\",\" \",\" \",\" plotly-logomark \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\"\"].join(\"\")}}},99863:function(t,e){\"use strict\";e.isLeftAnchor=function(t){return\"left\"===t.xanchor||\"auto\"===t.xanchor&&t.x<=1/3},e.isCenterAnchor=function(t){return\"center\"===t.xanchor||\"auto\"===t.xanchor&&t.x>1/3&&t.x<2/3},e.isRightAnchor=function(t){return\"right\"===t.xanchor||\"auto\"===t.xanchor&&t.x>=2/3},e.isTopAnchor=function(t){return\"top\"===t.yanchor||\"auto\"===t.yanchor&&t.y>=2/3},e.isMiddleAnchor=function(t){return\"middle\"===t.yanchor||\"auto\"===t.yanchor&&t.y>1/3&&t.y<2/3},e.isBottomAnchor=function(t){return\"bottom\"===t.yanchor||\"auto\"===t.yanchor&&t.y<=1/3}},26348:function(t,e,r){\"use strict\";var n=r(64872),i=n.mod,a=n.modHalf,o=Math.PI,s=2*o;function l(t){return Math.abs(t[1]-t[0])>s-1e-14}function u(t,e){return a(e-t,s)}function c(t,e){if(l(e))return!0;var r,n;e[0](n=i(n,s))&&(n+=s);var a=i(t,s),o=a+s;return a>=r&&a<=n||o>=r&&o<=n}function f(t,e,r,n,i,a,u){i=i||0,a=a||0;var c,f,h,p,d,v=l([r,n]);function g(t,e){return[t*Math.cos(e)+i,a-t*Math.sin(e)]}v?(c=0,f=o,h=s):r=i&&t<=a);var i,a},pathArc:function(t,e,r,n,i){return f(null,t,e,r,n,i,0)},pathSector:function(t,e,r,n,i){return f(null,t,e,r,n,i,1)},pathAnnulus:function(t,e,r,n,i,a){return f(t,e,r,n,i,a,1)}}},73627:function(t,e){\"use strict\";var r=Array.isArray,n=ArrayBuffer,i=DataView;function a(t){return n.isView(t)&&!(t instanceof i)}function o(t){return r(t)||a(t)}function s(t,e,r){if(o(t)){if(o(t[0])){for(var n=r,i=0;ii.max?e.set(r):e.set(+t)}},integer:{coerceFunction:function(t,e,r,i){t%1||!n(t)||void 0!==i.min&&ti.max?e.set(r):e.set(+t)}},string:{coerceFunction:function(t,e,r,n){if(\"string\"!=typeof t){var i=\"number\"==typeof t;!0!==n.strict&&i?e.set(String(t)):e.set(r)}else n.noBlank&&!t?e.set(r):e.set(t)}},color:{coerceFunction:function(t,e,r){i(t).isValid()?e.set(t):e.set(r)}},colorlist:{coerceFunction:function(t,e,r){Array.isArray(t)&&t.length&&t.every((function(t){return i(t).isValid()}))?e.set(t):e.set(r)}},colorscale:{coerceFunction:function(t,e,r){e.set(o.get(t,r))}},angle:{coerceFunction:function(t,e,r){\"auto\"===t?e.set(\"auto\"):n(t)?e.set(f(+t,360)):e.set(r)}},subplotid:{coerceFunction:function(t,e,r,n){var i=n.regex||c(r);\"string\"==typeof t&&i.test(t)?e.set(t):e.set(r)},validateFunction:function(t,e){var r=e.dflt;return t===r||\"string\"==typeof t&&!!c(r).test(t)}},flaglist:{coerceFunction:function(t,e,r,n){if(-1===(n.extras||[]).indexOf(t))if(\"string\"==typeof t){for(var i=t.split(\"+\"),a=0;a=n&&t<=i?t:c}if(\"string\"!=typeof t&&\"number\"!=typeof t)return c;t=String(t);var u=_(r),y=t.charAt(0);!u||\"G\"!==y&&\"g\"!==y||(t=t.substr(1),r=\"\");var w=u&&\"chinese\"===r.substr(0,7),T=t.match(w?x:m);if(!T)return c;var k=T[1],A=T[3]||\"1\",M=Number(T[5]||1),S=Number(T[7]||0),E=Number(T[9]||0),L=Number(T[11]||0);if(u){if(2===k.length)return c;var C;k=Number(k);try{var P=g.getComponentMethod(\"calendars\",\"getCal\")(r);if(w){var O=\"i\"===A.charAt(A.length-1);A=parseInt(A,10),C=P.newDate(k,P.toMonthIndex(k,A,O),M)}else C=P.newDate(k,Number(A),M)}catch(t){return c}return C?(C.toJD()-v)*f+S*h+E*p+L*d:c}k=2===k.length?(Number(k)+2e3-b)%100+b:Number(k),A-=1;var I=new Date(Date.UTC(2e3,A,M,S,E));return I.setUTCFullYear(k),I.getUTCMonth()!==A||I.getUTCDate()!==M?c:I.getTime()+L*d},n=e.MIN_MS=e.dateTime2ms(\"-9999\"),i=e.MAX_MS=e.dateTime2ms(\"9999-12-31 23:59:59.9999\"),e.isDateTime=function(t,r){return e.dateTime2ms(t,r)!==c};var T=90*f,k=3*h,A=5*p;function M(t,e,r,n,i){if((e||r||n||i)&&(t+=\" \"+w(e,2)+\":\"+w(r,2),(n||i)&&(t+=\":\"+w(n,2),i))){for(var a=4;i%10==0;)a-=1,i/=10;t+=\".\"+w(i,a)}return t}e.ms2DateTime=function(t,e,r){if(\"number\"!=typeof t||!(t>=n&&t<=i))return c;e||(e=0);var a,o,s,u,m,x,b=Math.floor(10*l(t+.05,1)),w=Math.round(t-b/10);if(_(r)){var S=Math.floor(w/f)+v,E=Math.floor(l(t,f));try{a=g.getComponentMethod(\"calendars\",\"getCal\")(r).fromJD(S).formatDate(\"yyyy-mm-dd\")}catch(t){a=y(\"G%Y-%m-%d\")(new Date(w))}if(\"-\"===a.charAt(0))for(;a.length<11;)a=\"-0\"+a.substr(1);else for(;a.length<10;)a=\"0\"+a;o=e=n+f&&t<=i-f))return c;var e=Math.floor(10*l(t+.05,1)),r=new Date(Math.round(t-e/10));return M(a(\"%Y-%m-%d\")(r),r.getHours(),r.getMinutes(),r.getSeconds(),10*r.getUTCMilliseconds()+e)},e.cleanDate=function(t,r,n){if(t===c)return r;if(e.isJSDate(t)||\"number\"==typeof t&&isFinite(t)){if(_(n))return s.error(\"JS Dates and milliseconds are incompatible with world calendars\",t),r;if(!(t=e.ms2DateTimeLocal(+t))&&void 0!==r)return r}else if(!e.isDateTime(t,n))return s.error(\"unrecognized date\",t),r;return t};var S=/%\\d?f/g,E=/%h/g,L={1:\"1\",2:\"1\",3:\"2\",4:\"2\"};function C(t,e,r,n){t=t.replace(S,(function(t){var r=Math.min(+t.charAt(1)||6,6);return(e/1e3%1+2).toFixed(r).substr(2).replace(/0+$/,\"\")||\"0\"}));var i=new Date(Math.floor(e+.05));if(t=t.replace(E,(function(){return L[r(\"%q\")(i)]})),_(n))try{t=g.getComponentMethod(\"calendars\",\"worldCalFmt\")(t,e,n)}catch(t){return\"Invalid\"}return r(t)(i)}var P=[59,59.9,59.99,59.999,59.9999];e.formatDate=function(t,e,r,n,i,a){if(i=_(i)&&i,!e)if(\"y\"===r)e=a.year;else if(\"m\"===r)e=a.month;else{if(\"d\"!==r)return function(t,e){var r=l(t+.05,f),n=w(Math.floor(r/h),2)+\":\"+w(l(Math.floor(r/p),60),2);if(\"M\"!==e){o(e)||(e=0);var i=(100+Math.min(l(t/d,60),P[e])).toFixed(e).substr(1);e>0&&(i=i.replace(/0+$/,\"\").replace(/[\\.]$/,\"\")),n+=\":\"+i}return n}(t,r)+\"\\n\"+C(a.dayMonthYear,t,n,i);e=a.dayMonth+\"\\n\"+a.year}return C(e,t,n,i)};var O=3*f;e.incrementMonth=function(t,e,r){r=_(r)&&r;var n=l(t,f);if(t=Math.round(t-n),r)try{var i=Math.round(t/f)+v,a=g.getComponentMethod(\"calendars\",\"getCal\")(r),o=a.fromJD(i);return e%12?a.add(o,e,\"m\"):a.add(o,e/12,\"y\"),(o.toJD()-v)*f+n}catch(e){s.error(\"invalid ms \"+t+\" in calendar \"+r)}var u=new Date(t+O);return u.setUTCMonth(u.getUTCMonth()+e)+n-O},e.findExactDates=function(t,e){for(var r,n,i=0,a=0,s=0,l=0,u=_(e)&&g.getComponentMethod(\"calendars\",\"getCal\")(e),c=0;c0&&t[e+1][0]<0)return e;return null}switch(e=\"RUS\"===s||\"FJI\"===s?function(t){var e;if(null===u(t))e=t;else for(e=new Array(t.length),i=0;ie?r[n++]=[t[i][0]+360,t[i][1]]:i===e?(r[n++]=t[i],r[n++]=[t[i][0],-90]):r[n++]=t[i];var a=h.tester(r);a.pts.pop(),l.push(a)}:function(t){l.push(h.tester(t))},a.type){case\"MultiPolygon\":for(r=0;ri&&(i=u,e=l)}else e=r;return o.default(e).geometry.coordinates}(c),n.fIn=t,n.fOut=c,s.push(c)}else u.log([\"Location\",n.loc,\"does not have a valid GeoJSON geometry.\",\"Traces with locationmode *geojson-id* only support\",\"*Polygon* and *MultiPolygon* geometries.\"].join(\" \"))}delete i[r]}switch(r.type){case\"FeatureCollection\":var h=r.features;for(n=0;n100?(clearInterval(a),n(\"Unexpected error while fetching from \"+t)):void i++}),50)}))}for(var o=0;o0&&(r.push(i),i=[])}return i.length>0&&r.push(i),r},e.makeLine=function(t){return 1===t.length?{type:\"LineString\",coordinates:t[0]}:{type:\"MultiLineString\",coordinates:t}},e.makePolygon=function(t){if(1===t.length)return{type:\"Polygon\",coordinates:t};for(var e=new Array(t.length),r=0;r1||v<0||v>1?null:{x:t+l*v,y:e+f*v}}function l(t,e,r,n,i){var a=n*t+i*e;if(a<0)return n*n+i*i;if(a>r){var o=n-t,s=i-e;return o*o+s*s}var l=n*e-i*t;return l*l/r}e.segmentsIntersect=s,e.segmentDistance=function(t,e,r,n,i,a,o,u){if(s(t,e,r,n,i,a,o,u))return 0;var c=r-t,f=n-e,h=o-i,p=u-a,d=c*c+f*f,v=h*h+p*p,g=Math.min(l(c,f,d,i-t,a-e),l(c,f,d,o-t,u-e),l(h,p,v,t-i,e-a),l(h,p,v,r-i,n-a));return Math.sqrt(g)},e.getTextLocation=function(t,e,r,s){if(t===i&&s===a||(n={},i=t,a=s),n[r])return n[r];var l=t.getPointAtLength(o(r-s/2,e)),u=t.getPointAtLength(o(r+s/2,e)),c=Math.atan((u.y-l.y)/(u.x-l.x)),f=t.getPointAtLength(o(r,e)),h={x:(4*f.x+l.x+u.x)/6,y:(4*f.y+l.y+u.y)/6,theta:c};return n[r]=h,h},e.clearLocationCache=function(){i=null},e.getVisibleSegment=function(t,e,r){var n,i,a=e.left,o=e.right,s=e.top,l=e.bottom,u=0,c=t.getTotalLength(),f=c;function h(e){var r=t.getPointAtLength(e);0===e?n=r:e===c&&(i=r);var u=r.xo?r.x-o:0,f=r.yl?r.y-l:0;return Math.sqrt(u*u+f*f)}for(var p=h(u);p;){if((u+=p+r)>f)return;p=h(u)}for(p=h(f);p;){if(u>(f-=p+r))return;p=h(f)}return{min:u,max:f,len:f-u,total:c,isClosed:0===u&&f===c&&Math.abs(n.x-i.x)<.1&&Math.abs(n.y-i.y)<.1}},e.findPointOnPath=function(t,e,r,n){for(var i,a,o,s=(n=n||{}).pathLength||t.getTotalLength(),l=n.tolerance||.001,u=n.iterationLimit||30,c=t.getPointAtLength(0)[r]>t.getPointAtLength(s)[r]?-1:1,f=0,h=0,p=s;f0?p=i:h=i,f++}return a}},81697:function(t,e,r){\"use strict\";var n=r(92770),i=r(84267),a=r(25075),o=r(21081),s=r(22399).defaultLine,l=r(73627).isArrayOrTypedArray,u=a(s);function c(t,e){var r=t;return r[3]*=e,r}function f(t){if(n(t))return u;var e=a(t);return e.length?e:u}function h(t){return n(t)?t:1}t.exports={formatColor:function(t,e,r){var n,i,s,p,d,v=t.color,g=l(v),y=l(e),m=o.extractOpts(t),x=[];if(n=void 0!==m.colorscale?o.makeColorScaleFuncFromTrace(t):f,i=g?function(t,e){return void 0===t[e]?u:a(n(t[e]))}:f,s=y?function(t,e){return void 0===t[e]?1:h(t[e])}:h,g||y)for(var b=0;b1?(r*t+r*e)/r:t+e,i=String(n).length;if(i>16){var a=String(e).length;if(i>=String(t).length+a){var o=parseFloat(n).toPrecision(12);-1===o.indexOf(\"e+\")&&(n=+o)}}return n}},71828:function(t,e,r){\"use strict\";var n=r(39898),i=r(84096).g0,a=r(60721).WU,o=r(92770),s=r(50606),l=s.FP_SAFE,u=-l,c=s.BADNUM,f=t.exports={};f.adjustFormat=function(t){return!t||/^\\d[.]\\df/.test(t)||/[.]\\d%/.test(t)?t:\"0.f\"===t?\"~f\":/^\\d%/.test(t)?\"~%\":/^\\ds/.test(t)?\"~s\":!/^[~,.0$]/.test(t)&&/[&fps]/.test(t)?\"~\"+t:t};var h={};f.warnBadFormat=function(t){var e=String(t);h[e]||(h[e]=1,f.warn('encountered bad format: \"'+e+'\"'))},f.noFormat=function(t){return String(t)},f.numberFormat=function(t){var e;try{e=a(f.adjustFormat(t))}catch(e){return f.warnBadFormat(t),f.noFormat}return e},f.nestedProperty=r(65487),f.keyedContainer=r(66636),f.relativeAttr=r(6962),f.isPlainObject=r(41965),f.toLogRange=r(58163),f.relinkPrivateKeys=r(51332);var p=r(73627);f.isTypedArray=p.isTypedArray,f.isArrayOrTypedArray=p.isArrayOrTypedArray,f.isArray1D=p.isArray1D,f.ensureArray=p.ensureArray,f.concat=p.concat,f.maxRowLength=p.maxRowLength,f.minRowLength=p.minRowLength;var d=r(64872);f.mod=d.mod,f.modHalf=d.modHalf;var v=r(96554);f.valObjectMeta=v.valObjectMeta,f.coerce=v.coerce,f.coerce2=v.coerce2,f.coerceFont=v.coerceFont,f.coercePattern=v.coercePattern,f.coerceHoverinfo=v.coerceHoverinfo,f.coerceSelectionMarkerOpacity=v.coerceSelectionMarkerOpacity,f.validate=v.validate;var g=r(41631);f.dateTime2ms=g.dateTime2ms,f.isDateTime=g.isDateTime,f.ms2DateTime=g.ms2DateTime,f.ms2DateTimeLocal=g.ms2DateTimeLocal,f.cleanDate=g.cleanDate,f.isJSDate=g.isJSDate,f.formatDate=g.formatDate,f.incrementMonth=g.incrementMonth,f.dateTick0=g.dateTick0,f.dfltRange=g.dfltRange,f.findExactDates=g.findExactDates,f.MIN_MS=g.MIN_MS,f.MAX_MS=g.MAX_MS;var y=r(65888);f.findBin=y.findBin,f.sorterAsc=y.sorterAsc,f.sorterDes=y.sorterDes,f.distinctVals=y.distinctVals,f.roundUp=y.roundUp,f.sort=y.sort,f.findIndexOfMin=y.findIndexOfMin,f.sortObjectKeys=r(78607);var m=r(80038);f.aggNums=m.aggNums,f.len=m.len,f.mean=m.mean,f.median=m.median,f.midRange=m.midRange,f.variance=m.variance,f.stdev=m.stdev,f.interp=m.interp;var x=r(35657);f.init2dArray=x.init2dArray,f.transposeRagged=x.transposeRagged,f.dot=x.dot,f.translationMatrix=x.translationMatrix,f.rotationMatrix=x.rotationMatrix,f.rotationXYMatrix=x.rotationXYMatrix,f.apply3DTransform=x.apply3DTransform,f.apply2DTransform=x.apply2DTransform,f.apply2DTransform2=x.apply2DTransform2,f.convertCssMatrix=x.convertCssMatrix,f.inverseTransformMatrix=x.inverseTransformMatrix;var b=r(26348);f.deg2rad=b.deg2rad,f.rad2deg=b.rad2deg,f.angleDelta=b.angleDelta,f.angleDist=b.angleDist,f.isFullCircle=b.isFullCircle,f.isAngleInsideSector=b.isAngleInsideSector,f.isPtInsideSector=b.isPtInsideSector,f.pathArc=b.pathArc,f.pathSector=b.pathSector,f.pathAnnulus=b.pathAnnulus;var _=r(99863);f.isLeftAnchor=_.isLeftAnchor,f.isCenterAnchor=_.isCenterAnchor,f.isRightAnchor=_.isRightAnchor,f.isTopAnchor=_.isTopAnchor,f.isMiddleAnchor=_.isMiddleAnchor,f.isBottomAnchor=_.isBottomAnchor;var w=r(87642);f.segmentsIntersect=w.segmentsIntersect,f.segmentDistance=w.segmentDistance,f.getTextLocation=w.getTextLocation,f.clearLocationCache=w.clearLocationCache,f.getVisibleSegment=w.getVisibleSegment,f.findPointOnPath=w.findPointOnPath;var T=r(1426);f.extendFlat=T.extendFlat,f.extendDeep=T.extendDeep,f.extendDeepAll=T.extendDeepAll,f.extendDeepNoArrays=T.extendDeepNoArrays;var k=r(47769);f.log=k.log,f.warn=k.warn,f.error=k.error;var A=r(30587);f.counterRegex=A.counter;var M=r(79990);f.throttle=M.throttle,f.throttleDone=M.done,f.clearThrottle=M.clear;var S=r(24401);function E(t){var e={};for(var r in t)for(var n=t[r],i=0;il||t=e)&&o(t)&&t>=0&&t%1==0},f.noop=r(64213),f.identity=r(23389),f.repeat=function(t,e){for(var r=new Array(e),n=0;nr?Math.max(r,Math.min(e,t)):Math.max(e,Math.min(r,t))},f.bBoxIntersect=function(t,e,r){return r=r||0,t.left<=e.right+r&&e.left<=t.right+r&&t.top<=e.bottom+r&&e.top<=t.bottom+r},f.simpleMap=function(t,e,r,n,i){for(var a=t.length,o=new Array(a),s=0;s=Math.pow(2,r)?i>10?(f.warn(\"randstr failed uniqueness\"),l):t(e,r,n,(i||0)+1):l},f.OptionControl=function(t,e){t||(t={}),e||(e=\"opt\");var r={optionList:[],_newoption:function(n){n[e]=t,r[n.name]=n,r.optionList.push(n)}};return r[\"_\"+e]=t,r},f.smooth=function(t,e){if((e=Math.round(e)||0)<2)return t;var r,n,i,a,o=t.length,s=2*o,l=2*e-1,u=new Array(l),c=new Array(o);for(r=0;r=s&&(i-=s*Math.floor(i/s)),i<0?i=-1-i:i>=o&&(i=s-1-i),a+=t[i]*u[n];c[r]=a}return c},f.syncOrAsync=function(t,e,r){var n;function i(){return f.syncOrAsync(t,e,r)}for(;t.length;)if((n=(0,t.splice(0,1)[0])(e))&&n.then)return n.then(i);return r&&r(e)},f.stripTrailingSlash=function(t){return\"/\"===t.substr(-1)?t.substr(0,t.length-1):t},f.noneOrAll=function(t,e,r){if(t){var n,i=!1,a=!0;for(n=0;n0?e:0}))},f.fillArray=function(t,e,r,n){if(n=n||f.identity,f.isArrayOrTypedArray(t))for(var i=0;i1?i+o[1]:\"\";if(a&&(o.length>1||s.length>4||r))for(;n.test(s);)s=s.replace(n,\"$1\"+a+\"$2\");return s+l},f.TEMPLATE_STRING_REGEX=/%{([^\\s%{}:]*)([:|\\|][^}]*)?}/g;var z=/^\\w*$/;f.templateString=function(t,e){var r={};return t.replace(f.TEMPLATE_STRING_REGEX,(function(t,n){var i;return z.test(n)?i=e[n]:(r[n]=r[n]||f.nestedProperty(e,n).get,i=r[n]()),f.isValidTextValue(i)?i:\"\"}))};var R={max:10,count:0,name:\"hovertemplate\"};f.hovertemplateString=function(){return U.apply(R,arguments)};var F={max:10,count:0,name:\"texttemplate\"};f.texttemplateString=function(){return U.apply(F,arguments)};var B=/^(\\S+)([\\*\\/])(-?\\d+(\\.\\d+)?)$/,N={max:10,count:0,name:\"texttemplate\",parseMultDiv:!0};f.texttemplateStringForShapes=function(){return U.apply(N,arguments)};var j=/^[:|\\|]/;function U(t,e,r){var n=this,a=arguments;e||(e={});var o={};return t.replace(f.TEMPLATE_STRING_REGEX,(function(t,s,l){var u=\"_xother\"===s||\"_yother\"===s,c=\"_xother_\"===s||\"_yother_\"===s,h=\"xother_\"===s||\"yother_\"===s,p=\"xother\"===s||\"yother\"===s||u||h||c,d=s;(u||c)&&(d=d.substring(1)),(h||c)&&(d=d.substring(0,d.length-1));var v,g,y,m=null,x=null;if(n.parseMultDiv){var b=function(t){var e=t.match(B);return e?{key:e[1],op:e[2],number:Number(e[3])}:{key:t,op:null,number:null}}(d);d=b.key,m=b.op,x=b.number}if(p){if(void 0===(v=e[d]))return\"\"}else for(y=3;y=48&&o<=57,u=s>=48&&s<=57;if(l&&(n=10*n+o-48),u&&(i=10*i+s-48),!l||!u){if(n!==i)return n-i;if(o!==s)return o-s}}return i-n};var V=2e9;f.seedPseudoRandom=function(){V=2e9},f.pseudoRandom=function(){var t=V;return V=(69069*V+1)%4294967296,Math.abs(V-t)<429496729?f.pseudoRandom():V/4294967296},f.fillText=function(t,e,r){var n=Array.isArray(r)?function(t){r.push(t)}:function(t){r.text=t},i=f.extractOption(t,e,\"htx\",\"hovertext\");if(f.isValidTextValue(i))return n(i);var a=f.extractOption(t,e,\"tx\",\"text\");return f.isValidTextValue(a)?n(a):void 0},f.isValidTextValue=function(t){return t||0===t},f.formatPercent=function(t,e){e=e||0;for(var r=(Math.round(100*t*Math.pow(10,e))*Math.pow(.1,e)).toFixed(e)+\"%\",n=0;n1&&(u=1):u=0,f.strTranslate(i-u*(r+o),a-u*(n+s))+f.strScale(u)+(l?\"rotate(\"+l+(e?\"\":\" \"+r+\" \"+n)+\")\":\"\")},f.setTransormAndDisplay=function(t,e){t.attr(\"transform\",f.getTextTransform(e)),t.style(\"display\",e.scale?null:\"none\")},f.ensureUniformFontSize=function(t,e){var r=f.extendFlat({},e);return r.size=Math.max(e.size,t._fullLayout.uniformtext.minsize||0),r},f.join2=function(t,e,r){var n=t.length;return n>1?t.slice(0,-1).join(e)+r+t[n-1]:t.join(e)},f.bigFont=function(t){return Math.round(1.2*t)};var H=f.getFirefoxVersion(),q=null!==H&&H<86;f.getPositionFromD3Event=function(){return q?[n.event.layerX,n.event.layerY]:[n.event.offsetX,n.event.offsetY]}},41965:function(t){\"use strict\";t.exports=function(t){return window&&window.process&&window.process.versions?\"[object Object]\"===Object.prototype.toString.call(t):\"[object Object]\"===Object.prototype.toString.call(t)&&Object.getPrototypeOf(t).hasOwnProperty(\"hasOwnProperty\")}},66636:function(t,e,r){\"use strict\";var n=r(65487),i=/^\\w*$/;t.exports=function(t,e,r,a){var o,s,l;r=r||\"name\",a=a||\"value\";var u={};e&&e.length?(l=n(t,e),s=l.get()):s=t,e=e||\"\";var c={};if(s)for(o=0;o2)return u[e]=2|u[e],h.set(t,null);if(f){for(o=e;o1){var e=[\"LOG:\"];for(t=0;t1){var r=[];for(t=0;t\"),\"long\")}},a.warn=function(){var t;if(n.logging>0){var e=[\"WARN:\"];for(t=0;t0){var r=[];for(t=0;t\"),\"stick\")}},a.error=function(){var t;if(n.logging>0){var e=[\"ERROR:\"];for(t=0;t0){var r=[];for(t=0;t\"),\"stick\")}}},77310:function(t,e,r){\"use strict\";var n=r(39898);t.exports=function(t,e,r){var i=t.selectAll(\"g.\"+r.replace(/\\s/g,\".\")).data(e,(function(t){return t[0].trace.uid}));i.exit().remove(),i.enter().append(\"g\").attr(\"class\",r),i.order();var a=t.classed(\"rangeplot\")?\"nodeRangePlot3\":\"node3\";return i.each((function(t){t[0][a]=n.select(this)})),i}},35657:function(t,e,r){\"use strict\";var n=r(79576);e.init2dArray=function(t,e){for(var r=new Array(t),n=0;ne/2?t-Math.round(t/e)*e:t}}},65487:function(t,e,r){\"use strict\";var n=r(92770),i=r(73627).isArrayOrTypedArray;function a(t,e){return function(){var r,n,o,s,l,u=t;for(s=0;s/g),l=0;la||u===i||us||e&&l(t))}:function(t,e){var l=t[0],u=t[1];if(l===i||la||u===i||us)return!1;var c,f,h,p,d,v=r.length,g=r[0][0],y=r[0][1],m=0;for(c=1;cMath.max(f,g)||u>Math.max(h,y)))if(uc||Math.abs(n(o,h))>i)return!0;return!1},a.filter=function(t,e){var r=[t[0]],n=0,i=0;function o(o){t.push(o);var s=r.length,l=n;r.splice(i+1);for(var u=l+1;u1&&o(t.pop()),{addPt:o,raw:t,filtered:r}}},79749:function(t,e,r){\"use strict\";var n=r(58617),i=r(98580);t.exports=function(t,e,a){var o=t._fullLayout,s=!0;return o._glcanvas.each((function(n){if(n.regl)n.regl.preloadCachedCode(a);else if(!n.pick||o._has(\"parcoords\")){try{n.regl=i({canvas:this,attributes:{antialias:!n.pick,preserveDrawingBuffer:!0},pixelRatio:t._context.plotGlPixelRatio||r.g.devicePixelRatio,extensions:e||[],cachedCode:a||{}})}catch(t){s=!1}n.regl||(s=!1),s&&this.addEventListener(\"webglcontextlost\",(function(e){t&&t.emit&&t.emit(\"plotly_webglcontextlost\",{event:e,layer:n.key})}),!1)}})),s||n({container:o._glcontainer.node()}),s}},45142:function(t,e,r){\"use strict\";var n=r(92770),i=r(35791);t.exports=function(t){var e;if(\"string\"!=typeof(e=t&&t.hasOwnProperty(\"userAgent\")?t.userAgent:function(){var t;return\"undefined\"!=typeof navigator&&(t=navigator.userAgent),t&&t.headers&&\"string\"==typeof t.headers[\"user-agent\"]&&(t=t.headers[\"user-agent\"]),t}()))return!0;var r=i({ua:{headers:{\"user-agent\":e}},tablet:!0,featureDetect:!1});if(!r)for(var a=e.split(\" \"),o=1;o-1;s--){var l=a[s];if(\"Version/\"===l.substr(0,8)){var u=l.substr(8).split(\".\")[0];if(n(u)&&(u=+u),u>=13)return!0}}return r}},75138:function(t){\"use strict\";t.exports=function(t,e){if(e instanceof RegExp){for(var r=e.toString(),n=0;ni.queueLength&&(t.undoQueue.queue.shift(),t.undoQueue.index--))},startSequence:function(t){t.undoQueue=t.undoQueue||{index:0,queue:[],sequence:!1},t.undoQueue.sequence=!0,t.undoQueue.beginSequence=!0},stopSequence:function(t){t.undoQueue=t.undoQueue||{index:0,queue:[],sequence:!1},t.undoQueue.sequence=!1,t.undoQueue.beginSequence=!1},undo:function(t){var e,r;if(!(void 0===t.undoQueue||isNaN(t.undoQueue.index)||t.undoQueue.index<=0)){for(t.undoQueue.index--,e=t.undoQueue.queue[t.undoQueue.index],t.undoQueue.inSequence=!0,r=0;r=t.undoQueue.queue.length)){for(e=t.undoQueue.queue[t.undoQueue.index],t.undoQueue.inSequence=!0,r=0;re}function f(t,e){return t>=e}e.findBin=function(t,e,r){if(n(e.start))return r?Math.ceil((t-e.start)/e.size-s)-1:Math.floor((t-e.start)/e.size+s);var a,o,h=0,p=e.length,d=0,v=p>1?(e[p-1]-e[0])/(p-1):1;for(o=v>=0?r?l:u:r?f:c,t+=v*s*(r?-1:1)*(v>=0?1:-1);h90&&i.log(\"Long binary search...\"),h-1},e.sorterAsc=function(t,e){return t-e},e.sorterDes=function(t,e){return e-t},e.distinctVals=function(t){var r,n=t.slice();for(n.sort(e.sorterAsc),r=n.length-1;r>-1&&n[r]===o;r--);for(var i,a=n[r]-n[0]||1,s=a/(r||1)/1e4,l=[],u=0;u<=r;u++){var c=n[u],f=c-i;void 0===i?(l.push(c),i=c):f>s&&(a=Math.min(a,f),l.push(c),i=c)}return{vals:l,minDiff:a}},e.roundUp=function(t,e,r){for(var n,i=0,a=e.length-1,o=0,s=r?0:1,l=r?1:0,u=r?Math.ceil:Math.floor;i0&&(n=1),r&&n)return t.sort(e)}return n?t:t.reverse()},e.findIndexOfMin=function(t,e){e=e||a;for(var r,n=1/0,i=0;ia.length)&&(o=a.length),n(r)||(r=!1),i(a[0])){for(l=new Array(o),s=0;st.length-1)return t[t.length-1];var r=e%1;return r*t[Math.ceil(e)]+(1-r)*t[Math.floor(e)]}},78614:function(t,e,r){\"use strict\";var n=r(25075);t.exports=function(t){return t?n(t):[0,0,0,1]}},3883:function(t,e,r){\"use strict\";var n=r(32396),i=r(91424),a=r(71828),o=null;t.exports=function(){if(null!==o)return o;o=!1;var t=a.isIE()||a.isSafari()||a.isIOS();if(window.navigator.userAgent&&!t){var e=Array.from(n.CSS_DECLARATIONS).reverse(),r=window.CSS&&window.CSS.supports||window.supportsCSS;if(\"function\"==typeof r)o=e.some((function(t){return r.apply(null,t)}));else{var s=i.tester.append(\"image\").attr(\"style\",n.STYLE),l=window.getComputedStyle(s.node()).imageRendering;o=e.some((function(t){var e=t[1];return l===e||l===e.toLowerCase()})),s.remove()}}return o}},63893:function(t,e,r){\"use strict\";var n=r(39898),i=r(71828),a=i.strTranslate,o=r(77922),s=r(18783).LINE_SPACING,l=/([^$]*)([$]+[^$]*[$]+)([^$]*)/;e.convertToTspans=function(t,r,g){var S=t.text(),E=!t.attr(\"data-notex\")&&r&&r._context.typesetMath&&\"undefined\"!=typeof MathJax&&S.match(l),P=n.select(t.node().parentNode);if(!P.empty()){var O=t.attr(\"class\")?t.attr(\"class\").split(\" \")[0]:\"text\";return O+=\"-math\",P.selectAll(\"svg.\"+O).remove(),P.selectAll(\"g.\"+O+\"-group\").remove(),t.style(\"display\",null).attr({\"data-unformatted\":S,\"data-math\":\"N\"}),E?(r&&r._promises||[]).push(new Promise((function(e){t.style(\"display\",\"none\");var r=parseInt(t.node().style.fontSize,10),o={fontSize:r};!function(t,e,r){var a,o,s,l,h=parseInt((MathJax.version||\"\").split(\".\")[0]);if(2===h||3===h){var p=function(){var r=\"math-output-\"+i.randstr({},64),a=(l=n.select(\"body\").append(\"div\").attr({id:r}).style({visibility:\"hidden\",position:\"absolute\",\"font-size\":e.fontSize+\"px\"}).text(t.replace(u,\"\\\\lt \").replace(c,\"\\\\gt \"))).node();return 2===h?MathJax.Hub.Typeset(a):MathJax.typeset([a])},d=function(){var e=l.select(2===h?\".MathJax_SVG\":\".MathJax\"),a=!e.empty()&&l.select(\"svg\").node();if(a){var o,s=a.getBoundingClientRect();o=2===h?n.select(\"body\").select(\"#MathJax_SVG_glyphs\"):e.select(\"defs\"),r(e,o,s)}else i.log(\"There was an error in the tex syntax.\",t),r();l.remove()};2===h?MathJax.Hub.Queue((function(){return o=i.extendDeepAll({},MathJax.Hub.config),s=MathJax.Hub.processSectionDelay,void 0!==MathJax.Hub.processSectionDelay&&(MathJax.Hub.processSectionDelay=0),MathJax.Hub.Config({messageStyle:\"none\",tex2jax:{inlineMath:f},displayAlign:\"left\"})}),(function(){if(\"SVG\"!==(a=MathJax.Hub.config.menuSettings.renderer))return MathJax.Hub.setRenderer(\"SVG\")}),p,d,(function(){if(\"SVG\"!==a)return MathJax.Hub.setRenderer(a)}),(function(){return void 0!==s&&(MathJax.Hub.processSectionDelay=s),MathJax.Hub.Config(o)})):3===h&&(o=i.extendDeepAll({},MathJax.config),MathJax.config.tex||(MathJax.config.tex={}),MathJax.config.tex.inlineMath=f,\"svg\"!==(a=MathJax.config.startup.output)&&(MathJax.config.startup.output=\"svg\"),MathJax.startup.defaultReady(),MathJax.startup.promise.then((function(){p(),d(),\"svg\"!==a&&(MathJax.config.startup.output=a),MathJax.config=o})))}else i.warn(\"No MathJax version:\",MathJax.version)}(E[2],o,(function(n,i,o){P.selectAll(\"svg.\"+O).remove(),P.selectAll(\"g.\"+O+\"-group\").remove();var s=n&&n.select(\"svg\");if(!s||!s.node())return I(),void e();var l=P.append(\"g\").classed(O+\"-group\",!0).attr({\"pointer-events\":\"none\",\"data-unformatted\":S,\"data-math\":\"Y\"});l.node().appendChild(s.node()),i&&i.node()&&s.node().insertBefore(i.node().cloneNode(!0),s.node().firstChild);var u=o.width,c=o.height;s.attr({class:O,height:c,preserveAspectRatio:\"xMinYMin meet\"}).style({overflow:\"visible\",\"pointer-events\":\"none\"});var f=t.node().style.fill||\"black\",h=s.select(\"g\");h.attr({fill:f,stroke:f});var p=h.node().getBoundingClientRect(),d=p.width,v=p.height;(d>u||v>c)&&(s.style(\"overflow\",\"hidden\"),d=(p=s.node().getBoundingClientRect()).width,v=p.height);var y=+t.attr(\"x\"),m=+t.attr(\"y\"),x=-(r||t.node().getBoundingClientRect().height)/4;if(\"y\"===O[0])l.attr({transform:\"rotate(\"+[-90,y,m]+\")\"+a(-d/2,x-v/2)});else if(\"l\"===O[0])m=x-v/2;else if(\"a\"===O[0]&&0!==O.indexOf(\"atitle\"))y=0,m=x;else{var b=t.attr(\"text-anchor\");y-=d*(\"middle\"===b?.5:\"end\"===b?1:0),m=m+x-v/2}s.attr({x:y,y:m}),g&&g.call(t,l),e(l)}))}))):I(),t}function I(){P.empty()||(O=t.attr(\"class\")+\"-math\",P.select(\"svg.\"+O).remove()),t.text(\"\").style(\"white-space\",\"pre\");var r=function(t,e){e=e.replace(y,\" \");var r,a=!1,l=[],u=-1;function c(){u++;var e=document.createElementNS(o.svg,\"tspan\");n.select(e).attr({class:\"line\",dy:u*s+\"em\"}),t.appendChild(e),r=e;var i=l;if(l=[{node:e}],i.length>1)for(var a=1;a doesnt match end tag <\"+t+\">. Pretending it did match.\",e),r=l[l.length-1].node}else i.log(\"Ignoring unexpected end tag \"+t+\">.\",e)}b.test(e)?c():(r=t,l=[{node:t}]);for(var E=e.split(m),P=0;P|>|>)/g,f=[[\"$\",\"$\"],[\"\\\\(\",\"\\\\)\"]],h={sup:\"font-size:70%\",sub:\"font-size:70%\",b:\"font-weight:bold\",i:\"font-style:italic\",a:\"cursor:pointer\",span:\"\",em:\"font-style:italic;font-weight:bold\"},p={sub:\"0.3em\",sup:\"-0.6em\"},d={sub:\"-0.21em\",sup:\"0.42em\"},v=\"\",g=[\"http:\",\"https:\",\"mailto:\",\"\",void 0,\":\"],y=e.NEWLINES=/(\\r\\n?|\\n)/g,m=/(<[^<>]*>)/,x=/<(\\/?)([^ >]*)(\\s+(.*))?>/i,b=/ /i;e.BR_TAG_ALL=/ /gi;var _=/(^|[\\s\"'])style\\s*=\\s*(\"([^\"]*);?\"|'([^']*);?')/i,w=/(^|[\\s\"'])href\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/i,T=/(^|[\\s\"'])target\\s*=\\s*(\"([^\"\\s]*)\"|'([^'\\s]*)')/i,k=/(^|[\\s\"'])popup\\s*=\\s*(\"([\\w=,]*)\"|'([\\w=,]*)')/i;function A(t,e){if(!t)return null;var r=t.match(e),n=r&&(r[3]||r[4]);return n&&L(n)}var M=/(^|;)\\s*color:/;e.plainText=function(t,e){for(var r=void 0!==(e=e||{}).len&&-1!==e.len?e.len:1/0,n=void 0!==e.allowedTags?e.allowedTags:[\"br\"],i=t.split(m),a=[],o=\"\",s=0,l=0;l3?a.push(u.substr(0,p-3)+\"...\"):a.push(u.substr(0,p));break}o=\"\"}}return a.join(\"\")};var S={mu:\"μ\",amp:\"&\",lt:\"<\",gt:\">\",nbsp:\" \",times:\"×\",plusmn:\"±\",deg:\"°\"},E=/&(#\\d+|#x[\\da-fA-F]+|[a-z]+);/g;function L(t){return t.replace(E,(function(t,e){return(\"#\"===e.charAt(0)?function(t){if(!(t>1114111)){var e=String.fromCodePoint;if(e)return e(t);var r=String.fromCharCode;return t<=65535?r(t):r(55232+(t>>10),t%1024+56320)}}(\"x\"===e.charAt(1)?parseInt(e.substr(2),16):parseInt(e.substr(1),10)):S[e])||t}))}function C(t){var e=encodeURI(decodeURI(t)),r=document.createElement(\"a\"),n=document.createElement(\"a\");r.href=t,n.href=e;var i=r.protocol,a=n.protocol;return-1!==g.indexOf(i)&&-1!==g.indexOf(a)?e:\"\"}function P(t,e,r){var n,a,o,s=r.horizontalAlign,l=r.verticalAlign||\"top\",u=t.node().getBoundingClientRect(),c=e.node().getBoundingClientRect();return a=\"bottom\"===l?function(){return u.bottom-n.height}:\"middle\"===l?function(){return u.top+(u.height-n.height)/2}:function(){return u.top},o=\"right\"===s?function(){return u.right-n.width}:\"center\"===s?function(){return u.left+(u.width-n.width)/2}:function(){return u.left},function(){n=this.node().getBoundingClientRect();var t=o()-c.left,e=a()-c.top,s=r.gd||{};if(r.gd){s._fullLayout._calcInverseTransform(s);var l=i.apply3DTransform(s._fullLayout._invTransform)(t,e);t=l[0],e=l[1]}return this.style({top:e+\"px\",left:t+\"px\",\"z-index\":1e3}),this}}e.convertEntities=L,e.sanitizeHTML=function(t){t=t.replace(y,\" \");for(var e=document.createElement(\"p\"),r=e,i=[],a=t.split(m),o=0;oa.ts+e?l():a.timer=setTimeout((function(){l(),a.timer=null}),e)},e.done=function(t){var e=r[t];return e&&e.timer?new Promise((function(t){var r=e.onDone;e.onDone=function(){r&&r(),t(),e.onDone=null}})):Promise.resolve()},e.clear=function(t){if(t)n(r[t]),delete r[t];else for(var i in r)e.clear(i)}},58163:function(t,e,r){\"use strict\";var n=r(92770);t.exports=function(t,e){if(t>0)return Math.log(t)/Math.LN10;var r=Math.log(Math.min(e[0],e[1]))/Math.LN10;return n(r)||(r=Math.log(Math.max(e[0],e[1]))/Math.LN10-6),r}},90973:function(t,e,r){\"use strict\";var n=t.exports={},i=r(78776).locationmodeToLayer,a=r(96892).zL;n.getTopojsonName=function(t){return[t.scope.replace(/ /g,\"-\"),\"_\",t.resolution.toString(),\"m\"].join(\"\")},n.getTopojsonPath=function(t,e){return t+e+\".json\"},n.getTopojsonFeatures=function(t,e){var r=i[t.locationmode],n=e.objects[r];return a(e,n).features}},37815:function(t){\"use strict\";t.exports={moduleType:\"locale\",name:\"en-US\",dictionary:{\"Click to enter Colorscale title\":\"Click to enter Colorscale title\"},format:{date:\"%m/%d/%Y\"}}},92177:function(t){\"use strict\";t.exports={moduleType:\"locale\",name:\"en\",dictionary:{\"Click to enter Colorscale title\":\"Click to enter Colourscale title\"},format:{days:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],shortDays:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],months:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],shortMonths:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],periods:[\"AM\",\"PM\"],dateTime:\"%a %b %e %X %Y\",date:\"%d/%m/%Y\",time:\"%H:%M:%S\",decimal:\".\",thousands:\",\",grouping:[3],currency:[\"$\",\"\"],year:\"%Y\",month:\"%b %Y\",dayMonth:\"%b %-d\",dayMonthYear:\"%b %-d, %Y\"}}},14458:function(t,e,r){\"use strict\";var n=r(73972);t.exports=function(t){for(var e,r,i=n.layoutArrayContainers,a=n.layoutArrayRegexes,o=t.split(\"[\")[0],s=0;s0&&o.log(\"Clearing previous rejected promises from queue.\"),t._promises=[]},e.cleanLayout=function(t){var r,n;t||(t={}),t.xaxis1&&(t.xaxis||(t.xaxis=t.xaxis1),delete t.xaxis1),t.yaxis1&&(t.yaxis||(t.yaxis=t.yaxis1),delete t.yaxis1),t.scene1&&(t.scene||(t.scene=t.scene1),delete t.scene1);var a=(s.subplotsRegistry.cartesian||{}).attrRegex,l=(s.subplotsRegistry.polar||{}).attrRegex,f=(s.subplotsRegistry.ternary||{}).attrRegex,h=(s.subplotsRegistry.gl3d||{}).attrRegex,v=Object.keys(t);for(r=0;r3?(I.x=1.02,I.xanchor=\"left\"):I.x<-2&&(I.x=-.02,I.xanchor=\"right\"),I.y>3?(I.y=1.02,I.yanchor=\"bottom\"):I.y<-2&&(I.y=-.02,I.yanchor=\"top\")),d(t),\"rotate\"===t.dragmode&&(t.dragmode=\"orbit\"),u.clean(t),t.template&&t.template.layout&&e.cleanLayout(t.template.layout),t},e.cleanData=function(t){for(var r=0;r0)return t.substr(0,e)}e.hasParent=function(t,e){for(var r=b(e);r;){if(r in t)return!0;r=b(r)}return!1};var _=[\"x\",\"y\",\"z\"];e.clearAxisTypes=function(t,e,r){for(var n=0;n1&&a.warn(\"Full array edits are incompatible with other edits\",f);var m=r[\"\"][\"\"];if(u(m))e.set(null);else{if(!Array.isArray(m))return a.warn(\"Unrecognized full array edit value\",f,m),!0;e.set(m)}return!v&&(h(g,y),p(t),!0)}var x,b,_,w,T,k,A,M,S=Object.keys(r).map(Number).sort(o),E=e.get(),L=E||[],C=c(y,f).get(),P=[],O=-1,I=L.length;for(x=0;xL.length-(A?0:1))a.warn(\"index out of range\",f,_);else if(void 0!==k)T.length>1&&a.warn(\"Insertion & removal are incompatible with edits to the same index.\",f,_),u(k)?P.push(_):A?(\"add\"===k&&(k={}),L.splice(_,0,k),C&&C.splice(_,0,{})):a.warn(\"Unrecognized full object edit value\",f,_,k),-1===O&&(O=_);else for(b=0;b=0;x--)L.splice(P[x],1),C&&C.splice(P[x],1);if(L.length?E||e.set(L):e.set(null),v)return!1;if(h(g,y),d!==i){var D;if(-1===O)D=S;else{for(I=Math.max(L.length,I),D=[],x=0;x=O);x++)D.push(_);for(x=O;x=t.data.length||i<-t.data.length)throw new Error(r+\" must be valid indices for gd.data.\");if(e.indexOf(i,n+1)>-1||i>=0&&e.indexOf(-t.data.length+i)>-1||i<0&&e.indexOf(t.data.length+i)>-1)throw new Error(\"each index in \"+r+\" must be unique.\")}}function D(t,e,r){if(!Array.isArray(t.data))throw new Error(\"gd.data must be an array.\");if(void 0===e)throw new Error(\"currentIndices is a required argument.\");if(Array.isArray(e)||(e=[e]),I(t,e,\"currentIndices\"),void 0===r||Array.isArray(r)||(r=[r]),void 0!==r&&I(t,r,\"newIndices\"),void 0!==r&&e.length!==r.length)throw new Error(\"current and new indices must be of equal length.\")}function z(t,e,r,n,a){!function(t,e,r,n){var i=o.isPlainObject(n);if(!Array.isArray(t.data))throw new Error(\"gd.data must be an array\");if(!o.isPlainObject(e))throw new Error(\"update must be a key:value object\");if(void 0===r)throw new Error(\"indices must be an integer or array of integers\");for(var a in I(t,r,\"indices\"),e){if(!Array.isArray(e[a])||e[a].length!==r.length)throw new Error(\"attribute \"+a+\" must be an array of length equal to indices array length\");if(i&&(!(a in n)||!Array.isArray(n[a])||n[a].length!==e[a].length))throw new Error(\"when maxPoints is set as a key:value object it must contain a 1:1 corrispondence with the keys and number of traces in the update object\")}}(t,e,r,n);for(var l=function(t,e,r,n){var a,l,u,c,f,h=o.isPlainObject(n),p=[];for(var d in Array.isArray(r)||(r=[r]),r=O(r,t.data.length-1),e)for(var v=0;v-1&&-1===r.indexOf(\"grouptitlefont\")?l(r,r.replace(\"titlefont\",\"title.font\")):r.indexOf(\"titleposition\")>-1?l(r,r.replace(\"titleposition\",\"title.position\")):r.indexOf(\"titleside\")>-1?l(r,r.replace(\"titleside\",\"title.side\")):r.indexOf(\"titleoffset\")>-1&&l(r,r.replace(\"titleoffset\",\"title.offset\")):l(r,r.replace(\"title\",\"title.text\"));function l(e,r){t[r]=t[e],delete t[e]}}function H(t,e,r){t=o.getGraphDiv(t),T.clearPromiseQueue(t);var n={};if(\"string\"==typeof e)n[e]=r;else{if(!o.isPlainObject(e))return o.warn(\"Relayout fail.\",e,r),Promise.reject();n=o.extendFlat({},e)}Object.keys(n).length&&(t.changed=!0);var i=X(t,n),a=i.flags;a.calc&&(t.calcdata=void 0);var s=[h.previousPromises];a.layoutReplot?s.push(k.layoutReplot):Object.keys(n).length&&(q(t,a,i)||h.supplyDefaults(t),a.legend&&s.push(k.doLegend),a.layoutstyle&&s.push(k.layoutStyles),a.axrange&&G(s,i.rangesAltered),a.ticks&&s.push(k.doTicksRelayout),a.modebar&&s.push(k.doModeBar),a.camera&&s.push(k.doCamera),a.colorbars&&s.push(k.doColorBars),s.push(E)),s.push(h.rehover,h.redrag,h.reselect),u.add(t,H,[t,i.undoit],H,[t,i.redoit]);var l=o.syncOrAsync(s,t);return l&&l.then||(l=Promise.resolve(t)),l.then((function(){return t.emit(\"plotly_relayout\",i.eventData),t}))}function q(t,e,r){var n,i,a=t._fullLayout;if(!e.axrange)return!1;for(var s in e)if(\"axrange\"!==s&&e[s])return!1;var l=function(t,e){return o.coerce(n,i,v,t,e)},u={};for(var c in r.rangesAltered){var f=p.id2name(c);if(n=t.layout[f],i=a[f],d(n,i,l,u),i._matchGroup)for(var h in i._matchGroup)if(h!==c){var g=a[p.id2name(h)];g.autorange=i.autorange,g.range=i.range.slice(),g._input.range=i.range.slice()}}return!0}function G(t,e){var r=e?function(t){var r=[];for(var n in e){var i=p.getFromId(t,n);if(r.push(n),-1!==(i.ticklabelposition||\"\").indexOf(\"inside\")&&i._anchorAxis&&r.push(i._anchorAxis._id),i._matchGroup)for(var a in i._matchGroup)e[a]||r.push(a)}return p.draw(t,r,{skipTitle:!0})}:function(t){return p.draw(t,\"redraw\")};t.push(b,k.doAutoRangeAndConstraints,r,k.drawData,k.finalDraw)}var Z=/^[xyz]axis[0-9]*\\.range(\\[[0|1]\\])?$/,Y=/^[xyz]axis[0-9]*\\.autorange$/,W=/^[xyz]axis[0-9]*\\.domain(\\[[0|1]\\])?$/;function X(t,e){var r,n,i,a=t.layout,l=t._fullLayout,u=l._guiEditing,h=N(l._preGUI,u),d=Object.keys(e),v=p.list(t),g=o.extendDeepAll({},e),y={};for(V(e),d=Object.keys(e),n=0;n0&&\"string\"!=typeof I.parts[z];)z--;var R=I.parts[z],F=I.parts[z-1]+\".\"+R,j=I.parts.slice(0,z).join(\".\"),U=s(t.layout,j).get(),H=s(l,j).get(),q=I.get();if(void 0!==D){k[O]=D,S[O]=\"reverse\"===R?D:B(q);var G=f.getLayoutValObject(l,I.parts);if(G&&G.impliedEdits&&null!==D)for(var X in G.impliedEdits)E(o.relativeAttr(O,X),G.impliedEdits[X]);if(-1!==[\"width\",\"height\"].indexOf(O))if(D){E(\"autosize\",null);var K=\"height\"===O?\"width\":\"height\";E(K,l[K])}else l[O]=t._initialAutoSize[O];else if(\"autosize\"===O)E(\"width\",D?null:l.width),E(\"height\",D?null:l.height);else if(F.match(Z))P(F),s(l,j+\"._inputRange\").set(null);else if(F.match(Y)){P(F),s(l,j+\"._inputRange\").set(null);var $=s(l,j).get();$._inputDomain&&($._input.domain=$._inputDomain.slice())}else F.match(W)&&s(l,j+\"._inputDomain\").set(null);if(\"type\"===R){L=U;var Q=\"linear\"===H.type&&\"log\"===D,tt=\"log\"===H.type&&\"linear\"===D;if(Q||tt){if(L&&L.range)if(H.autorange)Q&&(L.range=L.range[1]>L.range[0]?[1,2]:[2,1]);else{var et=L.range[0],rt=L.range[1];Q?(et<=0&&rt<=0&&E(j+\".autorange\",!0),et<=0?et=rt/1e6:rt<=0&&(rt=et/1e6),E(j+\".range[0]\",Math.log(et)/Math.LN10),E(j+\".range[1]\",Math.log(rt)/Math.LN10)):(E(j+\".range[0]\",Math.pow(10,et)),E(j+\".range[1]\",Math.pow(10,rt)))}else E(j+\".autorange\",!0);Array.isArray(l._subplots.polar)&&l._subplots.polar.length&&l[I.parts[0]]&&\"radialaxis\"===I.parts[1]&&delete l[I.parts[0]]._subplot.viewInitial[\"radialaxis.range\"],c.getComponentMethod(\"annotations\",\"convertCoords\")(t,H,D,E),c.getComponentMethod(\"images\",\"convertCoords\")(t,H,D,E)}else E(j+\".autorange\",!0),E(j+\".range\",null);s(l,j+\"._inputRange\").set(null)}else if(R.match(M)){var nt=s(l,O).get(),it=(D||{}).type;it&&\"-\"!==it||(it=\"linear\"),c.getComponentMethod(\"annotations\",\"convertCoords\")(t,nt,it,E),c.getComponentMethod(\"images\",\"convertCoords\")(t,nt,it,E)}var at=w.containerArrayMatch(O);if(at){r=at.array,n=at.index;var ot=at.property,st=G||{editType:\"calc\"};\"\"!==n&&\"\"===ot&&(w.isAddVal(D)?S[O]=null:w.isRemoveVal(D)?S[O]=(s(a,r).get()||[])[n]:o.warn(\"unrecognized full object value\",e)),A.update(_,st),y[r]||(y[r]={});var lt=y[r][n];lt||(lt=y[r][n]={}),lt[ot]=D,delete e[O]}else\"reverse\"===R?(U.range?U.range.reverse():(E(j+\".autorange\",!0),U.range=[1,0]),H.autorange?_.calc=!0:_.plot=!0):(\"dragmode\"===O&&(!1===D&&!1!==q||!1!==D&&!1===q)||l._has(\"scatter-like\")&&l._has(\"regl\")&&\"dragmode\"===O&&(\"lasso\"===D||\"select\"===D)&&\"lasso\"!==q&&\"select\"!==q||l._has(\"gl2d\")?_.plot=!0:G?A.update(_,G):_.calc=!0,I.set(D))}}for(r in y)w.applyContainerArrayChanges(t,h(a,r),y[r],_,h)||(_.plot=!0);for(var ut in C){var ct=(L=p.getFromId(t,ut))&&L._constraintGroup;if(ct)for(var ft in _.calc=!0,ct)C[ft]||(p.getFromId(t,ft)._constraintShrinkable=!0)}(J(t)||e.height||e.width)&&(_.plot=!0);var ht=l.shapes;for(n=0;n1;)if(n.pop(),void 0!==(r=s(e,n.join(\".\")+\".uirevision\").get()))return r;return e.uirevision}function nt(t,e){for(var r=0;r=i.length?i[0]:i[t]:i}function l(t){return Array.isArray(a)?t>=a.length?a[0]:a[t]:a}function u(t,e){var r=0;return function(){if(t&&++r===e)return t()}}return void 0===n._frameWaitingCnt&&(n._frameWaitingCnt=0),new Promise((function(a,c){function f(){t.emit(\"plotly_animating\"),n._lastFrameAt=-1/0,n._timeToNext=0,n._runningTransitions=0,n._currentFrame=null;var e=function(){n._animationRaf=window.requestAnimationFrame(e),Date.now()-n._lastFrameAt>n._timeToNext&&function(){n._currentFrame&&n._currentFrame.onComplete&&n._currentFrame.onComplete();var e=n._currentFrame=n._frameQueue.shift();if(e){var r=e.name?e.name.toString():null;t._fullLayout._currentFrame=r,n._lastFrameAt=Date.now(),n._timeToNext=e.frameOpts.duration,h.transition(t,e.frame.data,e.frame.layout,T.coerceTraceIndices(t,e.frame.traces),e.frameOpts,e.transitionOpts).then((function(){e.onComplete&&e.onComplete()})),t.emit(\"plotly_animatingframe\",{name:r,frame:e.frame,animation:{frame:e.frameOpts,transition:e.transitionOpts}})}else t.emit(\"plotly_animated\"),window.cancelAnimationFrame(n._animationRaf),n._animationRaf=null}()};e()}var p,d,v=0;function g(t){return Array.isArray(i)?v>=i.length?t.transitionOpts=i[v]:t.transitionOpts=i[0]:t.transitionOpts=i,v++,t}var y=[],m=null==e,x=Array.isArray(e);if(m||x||!o.isPlainObject(e)){if(m||-1!==[\"string\",\"number\"].indexOf(typeof e))for(p=0;p0&&ww)&&k.push(d);y=k}}y.length>0?function(e){if(0!==e.length){for(var i=0;i=0;n--)if(o.isPlainObject(e[n])){var v=e[n].name,g=(c[v]||d[v]||{}).name,y=e[n].name,m=c[g]||d[g];g&&y&&\"number\"==typeof y&&m&&S<5&&(S++,o.warn('addFrames: overwriting frame \"'+(c[g]||d[g]).name+'\" with a frame whose name of type \"number\" also equates to \"'+g+'\". This is valid but may potentially lead to unexpected behavior since all plotly.js frame names are stored internally as strings.'),5===S&&o.warn(\"addFrames: This API call has yielded too many of these warnings. For the rest of this call, further warnings about numeric frame names will be suppressed.\")),d[v]={name:v},p.push({frame:h.supplyFrameDefaults(e[n]),index:r&&void 0!==r[n]&&null!==r[n]?r[n]:f+n})}p.sort((function(t,e){return t.index>e.index?-1:t.index=0;n--){if(\"number\"==typeof(i=p[n].frame).name&&o.warn(\"Warning: addFrames accepts frames with numeric names, but the numbers areimplicitly cast to strings\"),!i.name)for(;c[i.name=\"frame \"+t._transitionData._counter++];);if(c[i.name]){for(a=0;a=0;r--)n=e[r],a.push({type:\"delete\",index:n}),s.unshift({type:\"insert\",index:n,value:i[n]});var l=h.modifyFrames,c=h.modifyFrames,f=[t,s],p=[t,a];return u&&u.add(t,l,f,c,p),h.modifyFrames(t,a)},e.addTraces=function t(r,n,i){r=o.getGraphDiv(r);var a,s,l=[],c=e.deleteTraces,f=t,h=[r,l],p=[r,n];for(function(t,e,r){var n,i;if(!Array.isArray(t.data))throw new Error(\"gd.data must be an array.\");if(void 0===e)throw new Error(\"traces must be defined.\");for(Array.isArray(e)||(e=[e]),n=0;n=0&&r=0&&r=a.length)return!1;if(2===t.dimensions){if(r++,e.length===r)return t;var o=e[r];if(!_(o))return!1;t=a[i][o]}else t=a[i]}else t=a}}return t}function _(t){return t===Math.round(t)&&t>=0}function w(){var t,e,r={};for(t in f(r,o),n.subplotsRegistry)if((e=n.subplotsRegistry[t]).layoutAttributes)if(Array.isArray(e.attr))for(var i=0;i=l.length)return!1;i=(r=(n.transformsRegistry[l[u].type]||{}).attributes)&&r[e[2]],s=3}else{var c=t._module;if(c||(c=(n.modules[t.type||a.type.dflt]||{})._module),!c)return!1;if(!(i=(r=c.attributes)&&r[o])){var f=c.basePlotModule;f&&f.attributes&&(i=f.attributes[o])}i||(i=a[o])}return b(i,e,s)},e.getLayoutValObject=function(t,e){var r=function(t,e){var r,i,a,s,l=t._basePlotModules;if(l){var u;for(r=0;r=i&&(r._input||{})._templateitemname;s&&(o=i);var l,u=e+\"[\"+o+\"]\";function c(){l={},s&&(l[u]={},l[u][a]=s)}function f(t,e){s?n.nestedProperty(l[u],t).set(e):l[u+\".\"+t]=e}function h(){var t=l;return c(),t}return c(),{modifyBase:function(t,e){l[t]=e},modifyItem:f,getUpdateObj:h,applyUpdate:function(e,r){e&&f(e,r);var i=h();for(var a in i)n.nestedProperty(t,a).set(i[a])}}}},61549:function(t,e,r){\"use strict\";var n=r(39898),i=r(73972),a=r(74875),o=r(71828),s=r(63893),l=r(33306),u=r(7901),c=r(91424),f=r(92998),h=r(64168),p=r(89298),d=r(18783),v=r(99082),g=v.enforce,y=v.clean,m=r(71739).doAutoRange,x=\"start\";function b(t,e,r){for(var n=0;n=t[1]||i[1]<=t[0])&&a[0]e[0])return!0}return!1}function _(t){var r,i,s,l,f,v,g=t._fullLayout,y=g._size,m=y.p,x=p.list(t,\"\",!0);if(g._paperdiv.style({width:t._context.responsive&&g.autosize&&!t._context._hasZeroWidth&&!t.layout.width?\"100%\":g.width+\"px\",height:t._context.responsive&&g.autosize&&!t._context._hasZeroHeight&&!t.layout.height?\"100%\":g.height+\"px\"}).selectAll(\".main-svg\").call(c.setSize,g.width,g.height),t._context.setBackground(t,g.paper_bgcolor),e.drawMainTitle(t),h.manage(t),!g._has(\"cartesian\"))return a.previousPromises(t);function _(t,e,r){var n=t._lw/2;return\"x\"===t._id.charAt(0)?e?\"top\"===r?e._offset-m-n:e._offset+e._length+m+n:y.t+y.h*(1-(t.position||0))+n%1:e?\"right\"===r?e._offset+e._length+m+n:e._offset-m-n:y.l+y.w*(t.position||0)+n%1}for(r=0;r.5?\"t\":\"b\",o=t._fullLayout.margin[a],s=0;return\"paper\"===e.yref?s=r+e.pad.t+e.pad.b:\"container\"===e.yref&&(s=function(t,e,r,n,i){var a=0;return\"middle\"===r&&(a+=i/2),\"t\"===t?(\"top\"===r&&(a+=i),a+=n-e*n):(\"bottom\"===r&&(a+=i),a+=e*n),a}(a,n,i,t._fullLayout.height,r)+e.pad.t+e.pad.b),s>o?s:0}(t,r,g);y>0&&(function(t,e,r,n){var i=\"title.automargin\",s=t._fullLayout.title,l=s.y>.5?\"t\":\"b\",u={x:s.x,y:s.y,t:0,b:0},c={};\"paper\"===s.yref&&function(t,e,r,n,i){var a=\"paper\"===e.yref?t._fullLayout._size.h:t._fullLayout.height,s=o.isTopAnchor(e)?n:n-i,l=\"b\"===r?a-s:s;return!(o.isTopAnchor(e)&&\"t\"===r||o.isBottomAnchor(e)&&\"b\"===r)&&lT?c.push({code:\"unused\",traceType:m,templateCount:w,dataCount:T}):T>w&&c.push({code:\"reused\",traceType:m,templateCount:w,dataCount:T})}}else c.push({code:\"data\"});if(function t(e,r){for(var n in e)if(\"_\"!==n.charAt(0)){var a=e[n],o=v(e,n,r);i(a)?(Array.isArray(e)&&!1===a._template&&a.templateitemname&&c.push({code:\"missing\",path:o,templateitemname:a.templateitemname}),t(a,o)):Array.isArray(a)&&g(a)&&t(a,o)}}({data:p,layout:h},\"\"),c.length)return c.map(y)}},403:function(t,e,r){\"use strict\";var n=r(92770),i=r(72391),a=r(74875),o=r(71828),s=r(25095),l=r(5900),u=r(70942),c=r(11506).version,f={format:{valType:\"enumerated\",values:[\"png\",\"jpeg\",\"webp\",\"svg\",\"full-json\"],dflt:\"png\"},width:{valType:\"number\",min:1},height:{valType:\"number\",min:1},scale:{valType:\"number\",min:0,dflt:1},setBackground:{valType:\"any\",dflt:!1},imageDataOnly:{valType:\"boolean\",dflt:!1}};t.exports=function(t,e){var r,h,p,d;function v(t){return!(t in e)||o.validate(e[t],f[t])}if(e=e||{},o.isPlainObject(t)?(r=t.data||[],h=t.layout||{},p=t.config||{},d={}):(t=o.getGraphDiv(t),r=o.extendDeep([],t.data),h=o.extendDeep({},t.layout),p=t._context,d=t._fullLayout||{}),!v(\"width\")&&null!==e.width||!v(\"height\")&&null!==e.height)throw new Error(\"Height and width should be pixel values.\");if(!v(\"format\"))throw new Error(\"Export format is not \"+o.join2(f.format.values,\", \",\" or \")+\".\");var g={};function y(t,r){return o.coerce(e,g,f,t,r)}var m=y(\"format\"),x=y(\"width\"),b=y(\"height\"),_=y(\"scale\"),w=y(\"setBackground\"),T=y(\"imageDataOnly\"),k=document.createElement(\"div\");k.style.position=\"absolute\",k.style.left=\"-5000px\",document.body.appendChild(k);var A=o.extendFlat({},h);x?A.width=x:null===e.width&&n(d.width)&&(A.width=d.width),b?A.height=b:null===e.height&&n(d.height)&&(A.height=d.height);var M=o.extendFlat({},p,{_exportedPlot:!0,staticPlot:!0,setBackground:w}),S=s.getRedrawFunc(k);function E(){return new Promise((function(t){setTimeout(t,s.getDelay(k._fullLayout))}))}function L(){return new Promise((function(t,e){var r=l(k,m,_),n=k._fullLayout.width,f=k._fullLayout.height;function h(){i.purge(k),document.body.removeChild(k)}if(\"full-json\"===m){var p=a.graphJson(k,!1,\"keepdata\",\"object\",!0,!0);return p.version=c,p=JSON.stringify(p),h(),t(T?p:s.encodeJSON(p))}if(h(),\"svg\"===m)return t(T?r:s.encodeSVG(r));var d=document.createElement(\"canvas\");d.id=o.randstr(),u({format:m,width:n,height:f,scale:_,canvas:d,svg:r,promise:!0}).then(t).catch(e)}))}return new Promise((function(t,e){i.newPlot(k,r,A,M).then(S).then(E).then(L).then((function(e){t(function(t){return T?t.replace(s.IMAGE_URL_PREFIX,\"\"):t}(e))})).catch((function(t){e(t)}))}))}},84936:function(t,e,r){\"use strict\";var n=r(71828),i=r(74875),a=r(86281),o=r(72075).dfltConfig,s=n.isPlainObject,l=Array.isArray,u=n.isArrayOrTypedArray;function c(t,e,r,i,a,o){o=o||[];for(var f=Object.keys(t),h=0;hx.length&&i.push(p(\"unused\",a,y.concat(x.length)));var A,M,S,E,L,C=x.length,P=Array.isArray(k);if(P&&(C=Math.min(C,k.length)),2===b.dimensions)for(M=0;Mx[M].length&&i.push(p(\"unused\",a,y.concat(M,x[M].length)));var O=x[M].length;for(A=0;A<(P?Math.min(O,k[M].length):O);A++)S=P?k[M][A]:k,E=m[M][A],L=x[M][A],n.validate(E,S)?L!==E&&L!==+E&&i.push(p(\"dynamic\",a,y.concat(M,A),E,L)):i.push(p(\"value\",a,y.concat(M,A),E))}else i.push(p(\"array\",a,y.concat(M),m[M]));else for(M=0;M1&&h.push(p(\"object\",\"layout\"))),i.supplyDefaults(d);for(var v=d._fullData,g=r.length,y=0;y0&&Math.round(f)===f))return{vals:i};u=f}for(var h=e.calendar,p=\"start\"===l,d=\"end\"===l,v=t[r+\"period0\"],g=a(v,h)||0,y=[],m=[],x=[],b=i.length,_=0;_A;)k=o(k,-u,h);for(;k<=A;)k=o(k,u,h);T=o(k,-u,h)}else{for(k=g+(w=Math.round((A-g)/c))*c;k>A;)k-=c;for(;k<=A;)k+=c;T=k-c}y[_]=p?T:d?k:(T+k)/2,m[_]=T,x[_]=k}return{vals:y,starts:m,ends:x}}},89502:function(t){\"use strict\";t.exports={xaxis:{valType:\"subplotid\",dflt:\"x\",editType:\"calc+clearAxisTypes\"},yaxis:{valType:\"subplotid\",dflt:\"y\",editType:\"calc+clearAxisTypes\"}}},71739:function(t,e,r){\"use strict\";var n=r(39898),i=r(92770),a=r(71828),o=r(50606).FP_SAFE,s=r(73972),l=r(91424),u=r(41675),c=u.getFromId,f=u.isLinked;function h(t,e){var r,n,i=[],o=t._fullLayout,s=d(o,e,0),l=d(o,e,1),u=g(t,e),c=u.min,f=u.max;if(0===c.length||0===f.length)return a.simpleMap(e.range,e.r2l);var h=c[0].val,v=f[0].val;for(r=1;r0&&((A=C-s(b)-l(_))>P?M/A>O&&(w=b,T=_,O=M/A):M/C>O&&(w={val:b.val,nopad:1},T={val:_.val,nopad:1},O=M/C));if(h===v){var I=h-1,D=h+1;if(E)if(0===h)i=[0,1];else{var z=(h>0?f:c).reduce((function(t,e){return Math.max(t,l(e))}),0),R=h/(1-Math.min(.5,z/C));i=h>0?[0,R]:[R,0]}else i=L?[Math.max(0,I),Math.max(1,D)]:[I,D]}else E?(w.val>=0&&(w={val:0,nopad:1}),T.val<=0&&(T={val:0,nopad:1})):L&&(w.val-O*s(w)<0&&(w={val:0,nopad:1}),T.val<=0&&(T={val:1,nopad:1})),O=(T.val-w.val-p(e,b.val,_.val))/(C-s(w)-l(T)),i=[w.val-O*s(w),T.val+O*l(T)];return i=k(i,e),e.limitRange&&e.limitRange(),m&&i.reverse(),a.simpleMap(i,e.l2r||Number)}function p(t,e,r){var n=0;if(t.rangebreaks)for(var i=t.locateBreaks(e,r),a=0;a0?r.ppadplus:r.ppadminus)||r.ppad||0),S=A((t._m>0?r.ppadminus:r.ppadplus)||r.ppad||0),E=A(r.vpadplus||r.vpad),L=A(r.vpadminus||r.vpad);if(!T){if(h=1/0,p=-1/0,w)for(n=0;n0&&(h=a),a>p&&a-o&&(h=a),a>p&&a=O;n--)P(n);return{min:d,max:v,opts:r}},concatExtremes:g};var v=3;function g(t,e,r){var n,i,a,o=e._id,s=t._fullData,l=t._fullLayout,u=[],f=[];function h(t,e){for(n=0;n=r&&(u.extrapad||!o)){s=!1;break}i(e,u.val)&&u.pad<=r&&(o||!u.extrapad)&&(t.splice(l,1),l--)}if(s){var c=a&&0===e;t.push({val:e,pad:c?0:r,extrapad:!c&&o})}}function b(t){return i(t)&&Math.abs(t)=e}function T(t,e,r){return void 0===e||void 0===r||(e=t.d2l(e))=u&&(o=u,r=u),s<=u&&(s=u,n=u)}}return r=function(t,e){var r=e.autorangeoptions;return r&&void 0!==r.minallowed&&T(e,r.minallowed,r.maxallowed)?r.minallowed:r&&void 0!==r.clipmin&&T(e,r.clipmin,r.clipmax)?Math.max(t,e.d2l(r.clipmin)):t}(r,e),n=function(t,e){var r=e.autorangeoptions;return r&&void 0!==r.maxallowed&&T(e,r.minallowed,r.maxallowed)?r.maxallowed:r&&void 0!==r.clipmax&&T(e,r.clipmin,r.clipmax)?Math.min(t,e.d2l(r.clipmax)):t}(n,e),[r,n]}},23074:function(t){\"use strict\";t.exports=function(t,e,r){var n,i;if(r){var a=\"reversed\"===e||\"min reversed\"===e||\"max reversed\"===e;n=r[a?1:0],i=r[a?0:1]}var o=t(\"autorangeoptions.minallowed\",null===i?n:void 0),s=t(\"autorangeoptions.maxallowed\",null===n?i:void 0);void 0===o&&t(\"autorangeoptions.clipmin\"),void 0===s&&t(\"autorangeoptions.clipmax\"),t(\"autorangeoptions.include\")}},89298:function(t,e,r){\"use strict\";var n=r(39898),i=r(92770),a=r(74875),o=r(73972),s=r(71828),l=s.strTranslate,u=r(63893),c=r(92998),f=r(7901),h=r(91424),p=r(13838),d=r(66287),v=r(50606),g=v.ONEMAXYEAR,y=v.ONEAVGYEAR,m=v.ONEMINYEAR,x=v.ONEMAXQUARTER,b=v.ONEAVGQUARTER,_=v.ONEMINQUARTER,w=v.ONEMAXMONTH,T=v.ONEAVGMONTH,k=v.ONEMINMONTH,A=v.ONEWEEK,M=v.ONEDAY,S=M/2,E=v.ONEHOUR,L=v.ONEMIN,C=v.ONESEC,P=v.MINUS_SIGN,O=v.BADNUM,I={K:\"zeroline\"},D={K:\"gridline\",L:\"path\"},z={K:\"minor-gridline\",L:\"path\"},R={K:\"tick\",L:\"path\"},F={K:\"tick\",L:\"text\"},B={width:[\"x\",\"r\",\"l\",\"xl\",\"xr\"],height:[\"y\",\"t\",\"b\",\"yt\",\"yb\"],right:[\"r\",\"xr\"],left:[\"l\",\"xl\"],top:[\"t\",\"yt\"],bottom:[\"b\",\"yb\"]},N=r(18783),j=N.MID_SHIFT,U=N.CAP_SHIFT,V=N.LINE_SPACING,H=N.OPPOSITE_SIDE,q=t.exports={};q.setConvert=r(21994);var G=r(4322),Z=r(41675),Y=Z.idSort,W=Z.isLinked;q.id2name=Z.id2name,q.name2id=Z.name2id,q.cleanId=Z.cleanId,q.list=Z.list,q.listIds=Z.listIds,q.getFromId=Z.getFromId,q.getFromTrace=Z.getFromTrace;var X=r(71739);q.getAutoRange=X.getAutoRange,q.findExtremes=X.findExtremes;var J=1e-4;function K(t){var e=(t[1]-t[0])*J;return[t[0]-e,t[1]+e]}q.coerceRef=function(t,e,r,n,i,a){var o=n.charAt(n.length-1),l=r._fullLayout._subplots[o+\"axis\"],u=n+\"ref\",c={};return i||(i=l[0]||(\"string\"==typeof a?a:a[0])),a||(a=i),l=l.concat(l.map((function(t){return t+\" domain\"}))),c[u]={valType:\"enumerated\",values:l.concat(a?\"string\"==typeof a?[a]:a:[]),dflt:i},s.coerce(t,e,c,u)},q.getRefType=function(t){return void 0===t?t:\"paper\"===t?\"paper\":\"pixel\"===t?\"pixel\":/( domain)$/.test(t)?\"domain\":\"range\"},q.coercePosition=function(t,e,r,n,i,a){var o,l;if(\"range\"!==q.getRefType(n))o=s.ensureNumber,l=r(i,a);else{var u=q.getFromId(e,n);l=r(i,a=u.fraction2r(a)),o=u.cleanPos}t[i]=o(l)},q.cleanPosition=function(t,e,r){return(\"paper\"===r||\"pixel\"===r?s.ensureNumber:q.getFromId(e,r).cleanPos)(t)},q.redrawComponents=function(t,e){e=e||q.listIds(t);var r=t._fullLayout;function n(n,i,a,s){for(var l=o.getComponentMethod(n,i),u={},c=0;cr&&f2e-6||((r-t._forceTick0)/t._minDtick%1+1.000001)%1>2e-6)&&(t._minDtick=0)):t._minDtick=0},q.saveRangeInitial=function(t,e){for(var r=q.list(t,\"\",!0),n=!1,i=0;i.3*h||c(n)||c(a))){var p=r.dtick/2;t+=t+p.8){var o=Number(r.substr(1));a.exactYears>.8&&o%12==0?t=q.tickIncrement(t,\"M6\",\"reverse\")+1.5*M:a.exactMonths>.8?t=q.tickIncrement(t,\"M1\",\"reverse\")+15.5*M:t-=S;var l=q.tickIncrement(t,r);if(l<=n)return l}return t}(m,t,y,u,a)),g=m;g<=c;)g=q.tickIncrement(g,y,!1,a);return{start:e.c2r(m,0,a),end:e.c2r(g,0,a),size:y,_dataSpan:c-u}},q.prepMinorTicks=function(t,e,r){if(!e.minor.dtick){delete t.dtick;var n,a=e.dtick&&i(e._tmin);if(a){var o=q.tickIncrement(e._tmin,e.dtick,!0);n=[e._tmin,.99*o+.01*e._tmin]}else{var l=s.simpleMap(e.range,e.r2l);n=[l[0],.8*l[0]+.2*l[1]]}if(t.range=s.simpleMap(n,e.l2r),t._isMinor=!0,q.prepTicks(t,r),a){var u=i(e.dtick),c=i(t.dtick),f=u?e.dtick:+e.dtick.substring(1),h=c?t.dtick:+t.dtick.substring(1);u&&c?et(f,h)?f===2*A&&h===2*M&&(t.dtick=A):f===2*A&&h===3*M?t.dtick=A:f!==A||(e._input.minor||{}).nticks?rt(f/h,2.5)?t.dtick=f/2:t.dtick=f:t.dtick=M:\"M\"===String(e.dtick).charAt(0)?c?t.dtick=\"M1\":et(f,h)?f>=12&&2===h&&(t.dtick=\"M3\"):t.dtick=e.dtick:\"L\"===String(t.dtick).charAt(0)?\"L\"===String(e.dtick).charAt(0)?et(f,h)||(t.dtick=rt(f/h,2.5)?e.dtick/2:e.dtick):t.dtick=\"D1\":\"D2\"===t.dtick&&+e.dtick>1&&(t.dtick=1)}t.range=e.range}void 0===e.minor._tick0Init&&(t.tick0=e.tick0)},q.prepTicks=function(t,e){var r=s.simpleMap(t.range,t.r2l,void 0,void 0,e);if(\"auto\"===t.tickmode||!t.dtick){var n,a=t.nticks;a||(\"category\"===t.type||\"multicategory\"===t.type?(n=t.tickfont?s.bigFont(t.tickfont.size||12):15,a=t._length/n):(n=\"y\"===t._id.charAt(0)?40:80,a=s.constrain(t._length/n,4,9)+1),\"radialaxis\"===t._name&&(a*=2)),t.minor&&\"array\"!==t.minor.tickmode||\"array\"===t.tickmode&&(a*=100),t._roughDTick=Math.abs(r[1]-r[0])/a,q.autoTicks(t,t._roughDTick),t._minDtick>0&&t.dtick<2*t._minDtick&&(t.dtick=t._minDtick,t.tick0=t.l2r(t._forceTick0))}\"period\"===t.ticklabelmode&&function(t){var e;function r(){return!(i(t.dtick)||\"M\"!==t.dtick.charAt(0))}var n=r(),a=q.getTickFormat(t);if(a){var o=t._dtickInit!==t.dtick;/%[fLQsSMX]/.test(a)||(/%[HI]/.test(a)?(e=E,o&&!n&&t.dtick=(I?0:1);D--){var z=!D;D?(t._dtickInit=t.dtick,t._tick0Init=t.tick0):(t.minor._dtickInit=t.minor.dtick,t.minor._tick0Init=t.minor.tick0);var R=D?t:s.extendFlat({},t,t.minor);if(z?q.prepMinorTicks(R,t,e):q.prepTicks(R,e),\"array\"!==R.tickmode)if(\"sync\"!==R.tickmode){var F=K(c),B=F[0],N=F[1],j=i(R.dtick),U=\"log\"===a&&!(j||\"L\"===R.dtick.charAt(0)),V=q.tickFirst(R,e);if(D){if(t._tmin=V,V=N:Y<=N;Y=q.tickIncrement(Y,W,f,o)){if(D&&H++,R.rangebreaks&&!f){if(Y=p)break}if(C.length>d||Y===Z)break;Z=Y;var X={value:Y};D?(U&&Y!==(0|Y)&&(X.simpleLabel=!0),l>1&&H%l&&(X.skipLabel=!0),C.push(X)):(X.minor=!0,P.push(X))}}else C=[],v=at(t);else D?(C=[],v=ot(t)):(P=[],L=ot(t))}if(I&&!(\"inside\"===t.minor.ticks&&\"outside\"===t.ticks||\"outside\"===t.minor.ticks&&\"inside\"===t.ticks)){for(var J=C.map((function(t){return t.value})),$=[],Q=0;Q 0?(a=n-1,o=n):(a=n,o=n);var s,l=t[a].value,u=t[o].value,c=Math.abs(u-l),f=r||c,h=0;f>=m?h=c>=m&&c<=g?c:y:r===b&&f>=_?h=c>=_&&c<=x?c:b:f>=k?h=c>=k&&c<=w?c:T:r===A&&f>=A?h=A:f>=M?h=M:r===S&&f>=S?h=S:r===E&&f>=E&&(h=E),h>=c&&(h=c,s=!0);var p=i+h;if(e.rangebreaks&&h>0){for(var d=0,v=0;v<84;v++){var L=(v+.5)/84;e.maskBreaks(i*(1-L)+L*p)!==O&&d++}(h*=d/84)||(t[n].drop=!0),s&&c>A&&(h=c)}(h>0||0===n)&&(t[n].periodX=i+h/2)}}(C,t,t._definedDelta),t.rangebreaks){var it=\"y\"===t._id.charAt(0),st=1;\"auto\"===t.tickmode&&(st=t.tickfont?t.tickfont.size:12);var lt=NaN;for(r=C.length-1;r>-1;r--)if(C[r].drop)C.splice(r,1);else{C[r].value=zt(C[r].value,t);var ut=t.c2p(C[r].value);(it?lt>ut-st:ltp||ftp&&(ct.periodX=p),ft10||\"01-01\"!==n.substr(5)?t._tickround=\"d\":t._tickround=+e.substr(1)%12==0?\"y\":\"m\";else if(e>=M&&a<=10||e>=15*M)t._tickround=\"d\";else if(e>=L&&a<=16||e>=E)t._tickround=\"M\";else if(e>=C&&a<=19||e>=L)t._tickround=\"S\";else{var o=t.l2r(r+e).replace(/^-/,\"\").length;t._tickround=Math.max(a,o)-20,t._tickround<0&&(t._tickround=4)}}else if(i(e)||\"L\"===e.charAt(0)){var s=t.range.map(t.r2d||Number);i(e)||(e=Number(e.substr(1))),t._tickround=2-Math.floor(Math.log(e)/Math.LN10+.01);var l=Math.max(Math.abs(s[0]),Math.abs(s[1])),u=Math.floor(Math.log(l)/Math.LN10+.01),c=void 0===t.minexponent?3:t.minexponent;Math.abs(u)>c&&(mt(t.exponentformat)&&!xt(u)?t._tickexponent=3*Math.round((u-1)/3):t._tickexponent=u)}else t._tickround=null}function gt(t,e,r){var n=t.tickfont||{};return{x:e,dx:0,dy:0,text:r||\"\",fontSize:n.size,font:n.family,fontColor:n.color}}q.autoTicks=function(t,e,r){var n;function a(t){return Math.pow(t,Math.floor(Math.log(e)/Math.LN10))}if(\"date\"===t.type){t.tick0=s.dateTick0(t.calendar,0);var o=2*e;if(o>y)e/=y,n=a(10),t.dtick=\"M\"+12*dt(e,n,st);else if(o>T)e/=T,t.dtick=\"M\"+dt(e,1,lt);else if(o>M){if(t.dtick=dt(e,M,t._hasDayOfWeekBreaks?[1,2,7,14]:ct),!r){var l=q.getTickFormat(t),u=\"period\"===t.ticklabelmode;u&&(t._rawTick0=t.tick0),/%[uVW]/.test(l)?t.tick0=s.dateTick0(t.calendar,2):t.tick0=s.dateTick0(t.calendar,1),u&&(t._dowTick0=t.tick0)}}else o>E?t.dtick=dt(e,E,lt):o>L?t.dtick=dt(e,L,ut):o>C?t.dtick=dt(e,C,ut):(n=a(10),t.dtick=dt(e,n,st))}else if(\"log\"===t.type){t.tick0=0;var c=s.simpleMap(t.range,t.r2l);if(t._isMinor&&(e*=1.5),e>.7)t.dtick=Math.ceil(e);else if(Math.abs(c[1]-c[0])<1){var f=1.5*Math.abs((c[1]-c[0])/e);e=Math.abs(Math.pow(10,c[1])-Math.pow(10,c[0]))/f,n=a(10),t.dtick=\"L\"+dt(e,n,st)}else t.dtick=e>.3?\"D2\":\"D1\"}else\"category\"===t.type||\"multicategory\"===t.type?(t.tick0=0,t.dtick=Math.ceil(Math.max(e,1))):Dt(t)?(t.tick0=0,n=1,t.dtick=dt(e,n,pt)):(t.tick0=0,n=a(10),t.dtick=dt(e,n,st));if(0===t.dtick&&(t.dtick=1),!i(t.dtick)&&\"string\"!=typeof t.dtick){var h=t.dtick;throw t.dtick=1,\"ax.dtick error: \"+String(h)}},q.tickIncrement=function(t,e,r,a){var o=r?-1:1;if(i(e))return s.increment(t,o*e);var l=e.charAt(0),u=o*Number(e.substr(1));if(\"M\"===l)return s.incrementMonth(t,u,a);if(\"L\"===l)return Math.log(Math.pow(10,t)+u)/Math.LN10;if(\"D\"===l){var c=\"D2\"===e?ht:ft,f=t+.01*o,h=s.roundUp(s.mod(f,1),c,r);return Math.floor(f)+Math.log(n.round(Math.pow(10,h),1))/Math.LN10}throw\"unrecognized dtick \"+String(e)},q.tickFirst=function(t,e){var r=t.r2l||Number,a=s.simpleMap(t.range,r,void 0,void 0,e),o=a[1] \")}else t._prevDateHead=l,u+=\" \"+l;e.text=u}(t,o,r,u):\"log\"===c?function(t,e,r,n,a){var o=t.dtick,l=e.x,u=t.tickformat,c=\"string\"==typeof o&&o.charAt(0);if(\"never\"===a&&(a=\"\"),n&&\"L\"!==c&&(o=\"L3\",c=\"L\"),u||\"L\"===c)e.text=bt(Math.pow(10,l),t,a,n);else if(i(o)||\"D\"===c&&s.mod(l+.01,1)<.1){var f=Math.round(l),h=Math.abs(f),p=t.exponentformat;\"power\"===p||mt(p)&&xt(f)?(e.text=0===f?1:1===f?\"10\":\"10\"+(f>1?\"\":P)+h+\" \",e.fontSize*=1.25):(\"e\"===p||\"E\"===p)&&h>2?e.text=\"1\"+p+(f>0?\"+\":P)+h:(e.text=bt(Math.pow(10,l),t,\"\",\"fakehover\"),\"D1\"===o&&\"y\"===t._id.charAt(0)&&(e.dy-=e.fontSize/6))}else{if(\"D\"!==c)throw\"unrecognized dtick \"+String(o);e.text=String(Math.round(Math.pow(10,s.mod(l,1)))),e.fontSize*=.75}if(\"D1\"===t.dtick){var d=String(e.text).charAt(0);\"0\"!==d&&\"1\"!==d||(\"y\"===t._id.charAt(0)?e.dx-=e.fontSize/4:(e.dy+=e.fontSize/2,e.dx+=(t.range[1]>t.range[0]?1:-1)*e.fontSize*(l<0?.5:.25)))}}(t,o,0,u,v):\"category\"===c?function(t,e){var r=t._categories[Math.round(e.x)];void 0===r&&(r=\"\"),e.text=String(r)}(t,o):\"multicategory\"===c?function(t,e,r){var n=Math.round(e.x),i=t._categories[n]||[],a=void 0===i[1]?\"\":String(i[1]),o=void 0===i[0]?\"\":String(i[0]);r?e.text=o+\" - \"+a:(e.text=a,e.text2=o)}(t,o,r):Dt(t)?function(t,e,r,n,i){if(\"radians\"!==t.thetaunit||r)e.text=bt(e.x,t,i,n);else{var a=e.x/180;if(0===a)e.text=\"0\";else{var o=function(t){function e(t,e){return Math.abs(t-e)<=1e-6}var r=function(t){for(var r=1;!e(Math.round(t*r)/r,t);)r*=10;return r}(t),n=t*r,i=Math.abs(function t(r,n){return e(n,0)?r:t(n,r%n)}(n,r));return[Math.round(n/i),Math.round(r/i)]}(a);if(o[1]>=100)e.text=bt(s.deg2rad(e.x),t,i,n);else{var l=e.x<0;1===o[1]?1===o[0]?e.text=\"π\":e.text=o[0]+\"π\":e.text=[\"\",o[0],\" \",\"⁄\",\"\",o[1],\" \",\"π\"].join(\"\"),l&&(e.text=P+e.text)}}}}(t,o,r,u,v):function(t,e,r,n,i){\"never\"===i?i=\"\":\"all\"===t.showexponent&&Math.abs(e.x/t.dtick)<1e-6&&(i=\"hide\"),e.text=bt(e.x,t,i,n)}(t,o,0,u,v),n||(t.tickprefix&&!d(t.showtickprefix)&&(o.text=t.tickprefix+o.text),t.ticksuffix&&!d(t.showticksuffix)&&(o.text+=t.ticksuffix)),t.labelalias&&t.labelalias.hasOwnProperty(o.text)){var g=t.labelalias[o.text];\"string\"==typeof g&&(o.text=g)}if(\"boundaries\"===t.tickson||t.showdividers){var y=function(e){var r=t.l2p(e);return r>=0&&r<=t._length?e:null};o.xbnd=[y(o.x-.5),y(o.x+t.dtick-.5)]}return o},q.hoverLabelText=function(t,e,r){r&&(t=s.extendFlat({},t,{hoverformat:r}));var n=Array.isArray(e)?e[0]:e,i=Array.isArray(e)?e[1]:void 0;if(void 0!==i&&i!==n)return q.hoverLabelText(t,n,r)+\" - \"+q.hoverLabelText(t,i,r);var a=\"log\"===t.type&&n<=0,o=q.tickText(t,t.c2l(a?-n:n),\"hover\").text;return a?0===n?\"0\":P+o:o};var yt=[\"f\",\"p\",\"n\",\"μ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\"];function mt(t){return\"SI\"===t||\"B\"===t}function xt(t){return t>14||t<-15}function bt(t,e,r,n){var a=t<0,o=e._tickround,l=r||e.exponentformat||\"B\",u=e._tickexponent,c=q.getTickFormat(e),f=e.separatethousands;if(n){var h={exponentformat:l,minexponent:e.minexponent,dtick:\"none\"===e.showexponent?e.dtick:i(t)&&Math.abs(t)||1,range:\"none\"===e.showexponent?e.range.map(e.r2d):[0,t||1]};vt(h),o=(Number(h._tickround)||0)+4,u=h._tickexponent,e.hoverformat&&(c=e.hoverformat)}if(c)return e._numFormat(c)(t).replace(/-/g,P);var p,d=Math.pow(10,-o)/2;if(\"none\"===l&&(u=0),(t=Math.abs(t))\"+p+\"\":\"B\"===l&&9===u?t+=\"B\":mt(l)&&(t+=yt[u/3+5])),a?P+t:t}function _t(t,e){if(t){var r=Object.keys(B).reduce((function(t,r){return-1!==e.indexOf(r)&&B[r].forEach((function(e){t[e]=1})),t}),{});Object.keys(t).forEach((function(e){r[e]||(1===e.length?t[e]=0:delete t[e])}))}}function wt(t,e){for(var r=[],n={},i=0;i1&&r=i.min&&t=0,a=c(t,e[1])<=0;return(r||i)&&(n||a)}if(t.tickformatstops&&t.tickformatstops.length>0)switch(t.type){case\"date\":case\"linear\":for(e=0;e=o(i)))){r=n;break}break;case\"log\":for(e=0;e=0&&i.unshift(i.splice(n,1).shift())}}));var o={false:{left:0,right:0}};return s.syncOrAsync(i.map((function(e){return function(){if(e){var n=q.getFromId(t,e);r||(r={}),r.axShifts=o,r.overlayingShiftedAx=a;var i=q.drawOne(t,n,r);return n._shiftPusher&&Bt(n,n._fullDepth||0,o,!0),n._r=n.range.slice(),n._rl=s.simpleMap(n._r,n.r2l),i}}})))},q.drawOne=function(t,e,r){var n,i,l,u=(r=r||{}).axShifts||{},p=r.overlayingShiftedAx||[];e.setScale();var d=t._fullLayout,v=e._id,g=v.charAt(0),y=q.counterLetter(v),m=d._plots[e._mainSubplot];if(m){if(e._shiftPusher=e.autoshift||-1!==p.indexOf(e._id)||-1!==p.indexOf(e.overlaying),e._shiftPusher&\"free\"===e.anchor){var x=e.linewidth/2||0;\"inside\"===e.ticks&&(x+=e.ticklen),Bt(e,x,u,!0),Bt(e,e.shift||0,u,!1)}!0===r.skipTitle&&void 0!==e._shift||(e._shift=function(t,e){return t.autoshift?e[t.overlaying][t.side]:t.shift||0}(e,u));var b=m[g+\"axislayer\"],_=e._mainLinePosition,w=_+=e._shift,T=e._mainMirrorPosition,k=e._vals=q.calcTicks(e),A=[e.mirror,w,T].join(\"_\");for(n=0;n0?r.bottom-c:0,f))));var h=0,p=0;if(e._shiftPusher&&(h=Math.max(f,r.height>0?\"l\"===l?c-r.left:r.right-c:0),e.title.text!==d._dfltTitle[g]&&(p=(e._titleStandoff||0)+(e._titleScoot||0),\"l\"===l&&(p+=At(e))),e._fullDepth=Math.max(h,p)),e.automargin){n={x:0,y:0,r:0,l:0,t:0,b:0};var v=[0,1],m=\"number\"==typeof e._shift?e._shift:0;if(\"x\"===g){if(\"b\"===l?n[l]=e._depth:(n[l]=e._depth=Math.max(r.width>0?c-r.top:0,f),v.reverse()),r.width>0){var x=r.right-(e._offset+e._length);x>0&&(n.xr=1,n.r=x);var b=e._offset-r.left;b>0&&(n.xl=0,n.l=b)}}else if(\"l\"===l?(e._depth=Math.max(r.height>0?c-r.left:0,f),n[l]=e._depth-m):(e._depth=Math.max(r.height>0?r.right-c:0,f),n[l]=e._depth+m,v.reverse()),r.height>0){var _=r.bottom-(e._offset+e._length);_>0&&(n.yb=0,n.b=_);var w=e._offset-r.top;w>0&&(n.yt=1,n.t=w)}n[y]=\"free\"===e.anchor?e.position:e._anchorAxis.domain[v[0]],e.title.text!==d._dfltTitle[g]&&(n[l]+=At(e)+(e.title.standoff||0)),e.mirror&&\"free\"!==e.anchor&&((i={x:0,y:0,r:0,l:0,t:0,b:0})[u]=e.linewidth,e.mirror&&!0!==e.mirror&&(i[u]+=f),!0===e.mirror||\"ticks\"===e.mirror?i[y]=e._anchorAxis.domain[v[1]]:\"all\"!==e.mirror&&\"allticks\"!==e.mirror||(i[y]=[e._counterDomainMin,e._counterDomainMax][v[1]]))}lt&&(s=o.getComponentMethod(\"rangeslider\",\"autoMarginOpts\")(t,e)),\"string\"==typeof e.automargin&&(_t(n,e.automargin),_t(i,e.automargin)),a.autoMargin(t,Et(e),n),a.autoMargin(t,Lt(e),i),a.autoMargin(t,Ct(e),s)})),s.syncOrAsync(ot)}}function ut(t){var r=v+(t||\"tick\");return M[r]||(M[r]=function(t,e){var r,n,i,a;return t._selections[e].size()?(r=1/0,n=-1/0,i=1/0,a=-1/0,t._selections[e].each((function(){var t=St(this),e=h.bBox(t.node().parentNode);r=Math.min(r,e.top),n=Math.max(n,e.bottom),i=Math.min(i,e.left),a=Math.max(a,e.right)}))):(r=0,n=0,i=0,a=0),{top:r,bottom:n,left:i,right:a,height:n-r,width:a-i}}(e,r)),M[r]}},q.getTickSigns=function(t,e){var r=t._id.charAt(0),n={x:\"top\",y:\"right\"}[r],i=t.side===n?1:-1,a=[-1,1,i,-i];return\"inside\"!==(e?(t.minor||{}).ticks:t.ticks)==(\"x\"===r)&&(a=a.map((function(t){return-t}))),t.side&&a.push({l:-1,t:-1,r:1,b:1}[t.side.charAt(0)]),a},q.makeTransTickFn=function(t){return\"x\"===t._id.charAt(0)?function(e){return l(t._offset+t.l2p(e.x),0)}:function(e){return l(0,t._offset+t.l2p(e.x))}},q.makeTransTickLabelFn=function(t){var e=function(t){var e=t.ticklabelposition||\"\",r=function(t){return-1!==e.indexOf(t)},n=r(\"top\"),i=r(\"left\"),a=r(\"right\"),o=r(\"bottom\"),s=r(\"inside\"),l=o||i||n||a;if(!l&&!s)return[0,0];var u=t.side,c=l?(t.tickwidth||0)/2:0,f=3,h=t.tickfont?t.tickfont.size:12;return(o||n)&&(c+=h*U,f+=(t.linewidth||0)/2),(i||a)&&(c+=(t.linewidth||0)/2,f+=3),s&&\"top\"===u&&(f-=h*(1-U)),(i||n)&&(c=-c),\"bottom\"!==u&&\"right\"!==u||(f=-f),[l?c:0,s?f:0]}(t),r=e[0],n=e[1];return\"x\"===t._id.charAt(0)?function(e){return l(r+t._offset+t.l2p(Tt(e)),n)}:function(e){return l(n,r+t._offset+t.l2p(Tt(e)))}},q.makeTickPath=function(t,e,r,n){n||(n={});var i=n.minor;if(i&&!t.minor)return\"\";var a=void 0!==n.len?n.len:i?t.minor.ticklen:t.ticklen,o=t._id.charAt(0),s=(t.linewidth||1)/2;return\"x\"===o?\"M0,\"+(e+s*r)+\"v\"+a*r:\"M\"+(e+s*r)+\",0h\"+a*r},q.makeLabelFns=function(t,e,r){var n=t.ticklabelposition||\"\",a=function(t){return-1!==n.indexOf(t)},o=a(\"top\"),l=a(\"left\"),u=a(\"right\"),c=a(\"bottom\")||l||o||u,f=a(\"inside\"),h=\"inside\"===n&&\"inside\"===t.ticks||!f&&\"outside\"===t.ticks&&\"boundaries\"!==t.tickson,p=0,d=0,v=h?t.ticklen:0;if(f?v*=-1:c&&(v=0),h&&(p+=v,r)){var g=s.deg2rad(r);p=v*Math.cos(g)+1,d=v*Math.sin(g)}t.showticklabels&&(h||t.showline)&&(p+=.2*t.tickfont.size);var y,m,x,b,_,w={labelStandoff:p+=(t.linewidth||1)/2*(f?-1:1),labelShift:d},T=0,k=t.side,A=t._id.charAt(0),M=t.tickangle;if(\"x\"===A)b=(_=!f&&\"bottom\"===k||f&&\"top\"===k)?1:-1,f&&(b*=-1),y=d*b,m=e+p*b,x=_?1:-.2,90===Math.abs(M)&&(f?x+=j:x=-90===M&&\"bottom\"===k?U:90===M&&\"top\"===k?j:.5,T=j/2*(M/90)),w.xFn=function(t){return t.dx+y+T*t.fontSize},w.yFn=function(t){return t.dy+m+t.fontSize*x},w.anchorFn=function(t,e){if(c){if(l)return\"end\";if(u)return\"start\"}return i(e)&&0!==e&&180!==e?e*b<0!==f?\"end\":\"start\":\"middle\"},w.heightFn=function(e,r,n){return r<-60||r>60?-.5*n:\"top\"===t.side!==f?-n:0};else if(\"y\"===A){if(b=(_=!f&&\"left\"===k||f&&\"right\"===k)?1:-1,f&&(b*=-1),y=p,m=d*b,x=0,f||90!==Math.abs(M)||(x=-90===M&&\"left\"===k||90===M&&\"right\"===k?U:.5),f){var S=i(M)?+M:0;if(0!==S){var E=s.deg2rad(S);T=Math.abs(Math.sin(E))*U*b,x=0}}w.xFn=function(t){return t.dx+e-(y+t.fontSize*x)*b+T*t.fontSize},w.yFn=function(t){return t.dy+m+t.fontSize*j},w.anchorFn=function(t,e){return i(e)&&90===Math.abs(e)?\"middle\":_?\"end\":\"start\"},w.heightFn=function(e,r,n){return\"right\"===t.side&&(r*=-1),r<-30?-n:r<30?-.5*n:0}}return w},q.drawTicks=function(t,e,r){r=r||{};var i=e._id+\"tick\",a=[].concat(e.minor&&e.minor.ticks?r.vals.filter((function(t){return t.minor&&!t.noTick})):[]).concat(e.ticks?r.vals.filter((function(t){return!t.minor&&!t.noTick})):[]),o=r.layer.selectAll(\"path.\"+i).data(a,kt);o.exit().remove(),o.enter().append(\"path\").classed(i,1).classed(\"ticks\",1).classed(\"crisp\",!1!==r.crisp).each((function(t){return f.stroke(n.select(this),t.minor?e.minor.tickcolor:e.tickcolor)})).style(\"stroke-width\",(function(r){return h.crispRound(t,r.minor?e.minor.tickwidth:e.tickwidth,1)+\"px\"})).attr(\"d\",r.path).style(\"display\",null),Ft(e,[R]),o.attr(\"transform\",r.transFn)},q.drawGrid=function(t,e,r){if(r=r||{},\"sync\"!==e.tickmode){var i=e._id+\"grid\",a=e.minor&&e.minor.showgrid,o=a?r.vals.filter((function(t){return t.minor})):[],s=e.showgrid?r.vals.filter((function(t){return!t.minor})):[],l=r.counterAxis;if(l&&q.shouldShowZeroLine(t,e,l))for(var u=\"array\"===e.tickmode,c=0;c=0;y--){var m=y?v:g;if(m){var x=m.selectAll(\"path.\"+i).data(y?s:o,kt);x.exit().remove(),x.enter().append(\"path\").classed(i,1).classed(\"crisp\",!1!==r.crisp),x.attr(\"transform\",r.transFn).attr(\"d\",r.path).each((function(t){return f.stroke(n.select(this),t.minor?e.minor.gridcolor:e.gridcolor||\"#ddd\")})).style(\"stroke-dasharray\",(function(t){return h.dashStyle(t.minor?e.minor.griddash:e.griddash,t.minor?e.minor.gridwidth:e.gridwidth)})).style(\"stroke-width\",(function(t){return(t.minor?d:e._gw)+\"px\"})).style(\"display\",null),\"function\"==typeof r.path&&x.attr(\"d\",r.path)}}Ft(e,[D,z])}},q.drawZeroLine=function(t,e,r){r=r||r;var n=e._id+\"zl\",i=q.shouldShowZeroLine(t,e,r.counterAxis),a=r.layer.selectAll(\"path.\"+n).data(i?[{x:0,id:e._id}]:[]);a.exit().remove(),a.enter().append(\"path\").classed(n,1).classed(\"zl\",1).classed(\"crisp\",!1!==r.crisp).each((function(){r.layer.selectAll(\"path\").sort((function(t,e){return Y(t.id,e.id)}))})),a.attr(\"transform\",r.transFn).attr(\"d\",r.path).call(f.stroke,e.zerolinecolor||f.defaultLine).style(\"stroke-width\",h.crispRound(t,e.zerolinewidth,e._gw||1)+\"px\").style(\"display\",null),Ft(e,[I])},q.drawLabels=function(t,e,r){r=r||{};var a=t._fullLayout,o=e._id,c=o.charAt(0),f=r.cls||o+\"tick\",p=r.vals.filter((function(t){return t.text})),d=r.labelFns,v=r.secondary?0:e.tickangle,g=(e._prevTickAngles||{})[f],y=r.layer.selectAll(\"g.\"+f).data(e.showticklabels?p:[],kt),m=[];function x(t,a){t.each((function(t){var o=n.select(this),s=o.select(\".text-math-group\"),c=d.anchorFn(t,a),f=r.transFn.call(o.node(),t)+(i(a)&&0!=+a?\" rotate(\"+a+\",\"+d.xFn(t)+\",\"+(d.yFn(t)-t.fontSize/2)+\")\":\"\"),p=u.lineCount(o),v=V*t.fontSize,g=d.heightFn(t,i(a)?+a:0,(p-1)*v);if(g&&(f+=l(0,g)),s.empty()){var y=o.select(\"text\");y.attr({transform:f,\"text-anchor\":c}),y.style(\"opacity\",1),e._adjustTickLabelsOverflow&&e._adjustTickLabelsOverflow()}else{var m=h.bBox(s.node()).width*{end:-.5,start:.5}[c];s.attr(\"transform\",f+l(m,0))}}))}y.enter().append(\"g\").classed(f,1).append(\"text\").attr(\"text-anchor\",\"middle\").each((function(e){var r=n.select(this),i=t._promises.length;r.call(u.positionText,d.xFn(e),d.yFn(e)).call(h.font,e.font,e.fontSize,e.fontColor).text(e.text).call(u.convertToTspans,t),t._promises[i]?m.push(t._promises.pop().then((function(){x(r,v)}))):x(r,v)})),Ft(e,[F]),y.exit().remove(),r.repositionOnUpdate&&y.each((function(t){n.select(this).select(\"text\").call(u.positionText,d.xFn(t),d.yFn(t))})),e._adjustTickLabelsOverflow=function(){var r=e.ticklabeloverflow;if(r&&\"allow\"!==r){var i=-1!==r.indexOf(\"hide\"),o=\"x\"===e._id.charAt(0),l=0,u=o?t._fullLayout.width:t._fullLayout.height;if(-1!==r.indexOf(\"domain\")){var c=s.simpleMap(e.range,e.r2l);l=e.l2p(c[0])+e._offset,u=e.l2p(c[1])+e._offset}var f=Math.min(l,u),p=Math.max(l,u),d=e.side,v=1/0,g=-1/0;for(var m in y.each((function(t){var r=n.select(this);if(r.select(\".text-math-group\").empty()){var a=h.bBox(r.node()),s=0;o?(a.right>p||a.leftp||a.top+(e.tickangle?0:t.fontSize/4)e[\"_visibleLabelMin_\"+r._id]?l.style(\"display\",\"none\"):\"tick\"!==t.K||i||l.style(\"display\",null)}))}))}))}))},x(y,g+1?g:v);var b=null;e._selections&&(e._selections[f]=y);var _=[function(){return m.length&&Promise.all(m)}];e.automargin&&a._redrawFromAutoMarginCount&&90===g?(b=90,_.push((function(){x(y,g)}))):_.push((function(){if(x(y,v),p.length&&\"x\"===c&&!i(v)&&(\"log\"!==e.type||\"D\"!==String(e.dtick).charAt(0))){b=0;var t,n=0,a=[];if(y.each((function(t){n=Math.max(n,t.fontSize);var r=e.l2p(t.x),i=St(this),o=h.bBox(i.node());a.push({top:0,bottom:10,height:10,left:r-o.width/2,right:r+o.width/2+2,width:o.width+2})})),\"boundaries\"!==e.tickson&&!e.showdividers||r.secondary){var o=p.length,l=Math.abs((p[o-1].x-p[0].x)*e._m)/(o-1),u=e.ticklabelposition||\"\",f=function(t){return-1!==u.indexOf(t)},d=f(\"top\"),g=f(\"left\"),m=f(\"right\"),_=f(\"bottom\")||g||d||m?(e.tickwidth||0)+6:0,w=l<2.5*n||\"multicategory\"===e.type||\"realaxis\"===e._name;for(t=0;t0?A*=1+A/(O-=A):A=0,\"y\"!==e._id.charAt(0)&&(A=-A),L[S]=T.p2d(T.d2p(T.range[S])+M*A),\"min\"===T.autorange||\"max reversed\"===T.autorange?(L[0]=null,T._rangeInitial0=void 0,T._rangeInitial1=void 0):\"max\"!==T.autorange&&\"min reversed\"!==T.autorange||(L[1]=null,T._rangeInitial0=void 0,T._rangeInitial1=void 0),a._insideTickLabelsUpdaterange[T._name+\".range\"]=L}var B=s.syncOrAsync(_);return B&&B.then&&t._promises.push(B),B},q.getPxPosition=function(t,e){var r,n=t._fullLayout._size,i=e._id.charAt(0),a=e.side;return\"free\"!==e.anchor?r=e._anchorAxis:\"x\"===i?r={_offset:n.t+(1-(e.position||0))*n.h,_length:0}:\"y\"===i&&(r={_offset:n.l+(e.position||0)*n.w+e._shift,_length:0}),\"top\"===a||\"left\"===a?r._offset:\"bottom\"===a||\"right\"===a?r._offset+r._length:void 0},q.shouldShowZeroLine=function(t,e,r){var n=s.simpleMap(e.range,e.r2l);return n[0]*n[1]<=0&&e.zeroline&&(\"linear\"===e.type||\"-\"===e.type)&&!(e.rangebreaks&&e.maskBreaks(0)===O)&&(Mt(e,0)||!function(t,e,r,n){var i=r._mainAxis;if(i){var a=t._fullLayout,o=e._id.charAt(0),s=q.counterLetter(e._id),l=e._offset+(Math.abs(n[0])1)for(n=1;n2*o}(i,e))return\"date\";var g=\"strict\"!==r.autotypenumbers;return function(t,e){for(var r=t.length,n=f(r),i=0,o=0,s={},c=0;c2*i}(i,g)?\"category\":function(t,e){for(var r=t.length,n=0;n=2){var s,u,c=\"\";if(2===o.length)for(s=0;s<2;s++)if(u=_(o[s])){c=y;break}var f=i(\"pattern\",c);if(f===y)for(s=0;s<2;s++)(u=_(o[s]))&&(e.bounds[s]=o[s]=u-1);if(f)for(s=0;s<2;s++)switch(u=o[s],f){case y:if(!n(u))return void(e.enabled=!1);if((u=+u)!==Math.floor(u)||u<0||u>=7)return void(e.enabled=!1);e.bounds[s]=o[s]=u;break;case m:if(!n(u))return void(e.enabled=!1);if((u=+u)<0||u>24)return void(e.enabled=!1);e.bounds[s]=o[s]=u}if(!1===r.autorange){var h=r.range;if(h[0]h[1])return void(e.enabled=!1)}else if(o[0]>h[0]&&o[1]n?1:-1:+(t.substr(1)||1)-+(e.substr(1)||1)},e.ref2id=function(t){return!!/^[xyz]/.test(t)&&t.split(\" \")[0]},e.isLinked=function(t,e){return a(e,t._axisMatchGroups)||a(e,t._axisConstraintGroups)}},15258:function(t){\"use strict\";t.exports=function(t,e,r,n){if(\"category\"===e.type){var i,a=t.categoryarray,o=Array.isArray(a)&&a.length>0;o&&(i=\"array\");var s,l=r(\"categoryorder\",i);\"array\"===l&&(s=r(\"categoryarray\")),o||\"array\"!==l||(l=e.categoryorder=\"trace\"),\"trace\"===l?e._initialCategories=[]:\"array\"===l?e._initialCategories=s.slice():(s=function(t,e){var r,n,i,a=e.dataAttr||t._id.charAt(0),o={};if(e.axData)r=e.axData;else for(r=[],n=0;nn?i.substr(n):a.substr(r))+o:i+a+t*e:o}function g(t,e){for(var r=e._size,n=r.h/r.w,i={},a=Object.keys(t),o=0;ou*x)||T)for(r=0;rI&&FP&&(P=F);h/=(P-C)/(2*O),C=l.l2r(C),P=l.l2r(P),l.range=l._input.range=S=0?Math.min(t,.9):1/(1/Math.max(t,-.3)+3.222))}function N(t,e,r,n,i){return t.append(\"path\").attr(\"class\",\"zoombox\").style({fill:e>.2?\"rgba(0,0,0,0)\":\"rgba(255,255,255,0)\",\"stroke-width\":0}).attr(\"transform\",u(r,n)).attr(\"d\",i+\"Z\")}function j(t,e,r){return t.append(\"path\").attr(\"class\",\"zoombox-corners\").style({fill:f.background,stroke:f.defaultLine,\"stroke-width\":1,opacity:0}).attr(\"transform\",u(e,r)).attr(\"d\",\"M0,0Z\")}function U(t,e,r,n,i,a){t.attr(\"d\",n+\"M\"+r.l+\",\"+r.t+\"v\"+r.h+\"h\"+r.w+\"v-\"+r.h+\"h-\"+r.w+\"Z\"),V(t,e,i,a)}function V(t,e,r,n){r||(t.transition().style(\"fill\",n>.2?\"rgba(0,0,0,0.4)\":\"rgba(255,255,255,0.3)\").duration(200),e.transition().style(\"opacity\",1).duration(200))}function H(t){n.select(t).selectAll(\".zoombox,.js-zoombox-backdrop,.js-zoombox-menu,.zoombox-corners\").remove()}function q(t){O&&t.data&&t._context.showTips&&(i.notifier(i._(t,\"Double-click to zoom back out\"),\"long\"),O=!1)}function G(t){var e=Math.floor(Math.min(t.b-t.t,t.r-t.l,P)/2);return\"M\"+(t.l-3.5)+\",\"+(t.t-.5+e)+\"h3v\"+-e+\"h\"+e+\"v-3h-\"+(e+3)+\"ZM\"+(t.r+3.5)+\",\"+(t.t-.5+e)+\"h-3v\"+-e+\"h\"+-e+\"v-3h\"+(e+3)+\"ZM\"+(t.r+3.5)+\",\"+(t.b+.5-e)+\"h-3v\"+e+\"h\"+-e+\"v3h\"+(e+3)+\"ZM\"+(t.l-3.5)+\",\"+(t.b+.5-e)+\"h3v\"+e+\"h\"+e+\"v3h-\"+(e+3)+\"Z\"}function Z(t,e,r,n,a){for(var o,s,l,u,c=!1,f={},h={},p=(a||{}).xaHash,d=(a||{}).yaHash,v=0;v=0)i._fullLayout._deactivateShape(i);else{var o=i._fullLayout.clickmode;if(H(i),2!==t||yt||qt(),gt)o.indexOf(\"select\")>-1&&S(r,i,J,K,e.id,Pt),o.indexOf(\"event\")>-1&&p.click(i,r,e.id);else if(1===t&&yt){var s=v?I:O,u=\"s\"===v||\"w\"===y?0:1,f=s._name+\".range[\"+u+\"]\",h=function(t,e){var r,n=t.range[e],i=Math.abs(n-t.range[1-e]);return\"date\"===t.type?n:\"log\"===t.type?(r=Math.ceil(Math.max(0,-Math.log(i)/Math.LN10))+3,a(\".\"+r+\"g\")(Math.pow(10,n))):(r=Math.floor(Math.log(Math.abs(n))/Math.LN10)-Math.floor(Math.log(i)/Math.LN10)+4,a(\".\"+String(r)+\"g\")(n))}(s,u),d=\"left\",g=\"middle\";if(s.fixedrange)return;v?(g=\"n\"===v?\"top\":\"bottom\",\"right\"===s.side&&(d=\"right\")):\"e\"===y&&(d=\"right\"),i._context.showAxisRangeEntryBoxes&&n.select(bt).call(c.makeEditable,{gd:i,immediate:!0,background:i._fullLayout.paper_bgcolor,text:String(h),fill:s.tickfont?s.tickfont.color:\"#444\",horizontalAlign:d,verticalAlign:g}).on(\"edit\",(function(t){var e=s.d2r(t);void 0!==e&&l.call(\"_guiRelayout\",i,f,e)}))}}}function Dt(e,r){if(t._transitioningWithDuration)return!1;var n=Math.max(0,Math.min(tt,pt*e+_t)),i=Math.max(0,Math.min(et,dt*r+wt)),a=Math.abs(n-_t),o=Math.abs(i-wt);function s(){St=\"\",Tt.r=Tt.l,Tt.t=Tt.b,Lt.attr(\"d\",\"M0,0Z\")}if(Tt.l=Math.min(_t,n),Tt.r=Math.max(_t,n),Tt.t=Math.min(wt,i),Tt.b=Math.max(wt,i),rt.isSubplotConstrained)a>P||o>P?(St=\"xy\",a/tt>o/et?(o=a*et/tt,wt>i?Tt.t=wt-o:Tt.b=wt+o):(a=o*tt/et,_t>n?Tt.l=_t-a:Tt.r=_t+a),Lt.attr(\"d\",G(Tt))):s();else if(nt.isSubplotConstrained)if(a>P||o>P){St=\"xy\";var l=Math.min(Tt.l/tt,(et-Tt.b)/et),u=Math.max(Tt.r/tt,(et-Tt.t)/et);Tt.l=l*tt,Tt.r=u*tt,Tt.b=(1-l)*et,Tt.t=(1-u)*et,Lt.attr(\"d\",G(Tt))}else s();else!at||o0){var c;if(nt.isSubplotConstrained||!it&&1===at.length){for(c=0;c1&&(void 0!==a.maxallowed&&st===(a.range[0]1&&(void 0!==o.maxallowed&<===(o.range[0]b[1]-1/4096&&(e.domain=s),i.noneOrAll(t.domain,e.domain,s),\"sync\"===e.tickmode&&(e.tickmode=\"auto\")}return r(\"layer\"),e}},89426:function(t,e,r){\"use strict\";var n=r(59652);t.exports=function(t,e,r,i,a){a||(a={});var o=a.tickSuffixDflt,s=n(t);r(\"tickprefix\")&&r(\"showtickprefix\",s),r(\"ticksuffix\",o)&&r(\"showticksuffix\",s)}},23608:function(t,e,r){\"use strict\";var n=r(23074);t.exports=function(t,e,r,i){var a=e._template||{},o=e.type||a.type||\"-\";r(\"minallowed\"),r(\"maxallowed\");var s,l=r(\"range\");l||i.noInsiderange||\"log\"===o||(!(s=r(\"insiderange\"))||null!==s[0]&&null!==s[1]||(e.insiderange=!1,s=void 0),s&&(l=r(\"range\",s)));var u,c=e.getAutorangeDflt(l,i),f=r(\"autorange\",c);!l||(null!==l[0]||null!==l[1])&&(null!==l[0]&&null!==l[1]||\"reversed\"!==f&&!0!==f)&&(null===l[0]||\"min\"!==f&&\"max reversed\"!==f)&&(null===l[1]||\"max\"!==f&&\"min reversed\"!==f)||(l=void 0,delete e.range,e.autorange=!0,u=!0),u||(f=r(\"autorange\",c=e.getAutorangeDflt(l,i))),f&&(n(r,f,l),\"linear\"!==o&&\"-\"!==o||r(\"rangemode\")),e.cleanRange()}},42449:function(t,e,r){\"use strict\";var n=r(18783).FROM_BL;t.exports=function(t,e,r){void 0===r&&(r=n[t.constraintoward||\"center\"]);var i=[t.r2l(t.range[0]),t.r2l(t.range[1])],a=i[0]+(i[1]-i[0])*r;t.range=t._input.range=[t.l2r(a+(i[0]-a)*e),t.l2r(a+(i[1]-a)*e)],t.setScale()}},21994:function(t,e,r){\"use strict\";var n=r(39898),i=r(84096).g0,a=r(71828),o=a.numberFormat,s=r(92770),l=a.cleanNumber,u=a.ms2DateTime,c=a.dateTime2ms,f=a.ensureNumber,h=a.isArrayOrTypedArray,p=r(50606),d=p.FP_SAFE,v=p.BADNUM,g=p.LOG_CLIP,y=p.ONEWEEK,m=p.ONEDAY,x=p.ONEHOUR,b=p.ONEMIN,_=p.ONESEC,w=r(41675),T=r(85555),k=T.HOUR_PATTERN,A=T.WEEKDAY_PATTERN;function M(t){return Math.pow(10,t)}function S(t){return null!=t}t.exports=function(t,e){e=e||{};var r=t._id||\"x\",p=r.charAt(0);function E(e,r){if(e>0)return Math.log(e)/Math.LN10;if(e<=0&&r&&t.range&&2===t.range.length){var n=t.range[0],i=t.range[1];return.5*(n+i-2*g*Math.abs(n-i))}return v}function L(e,r,n,i){if((i||{}).msUTC&&s(e))return+e;var o=c(e,n||t.calendar);if(o===v){if(!s(e))return v;e=+e;var l=Math.floor(10*a.mod(e+.05,1)),u=Math.round(e-l/10);o=c(new Date(u))+l/10}return o}function C(e,r,n){return u(e,r,n||t.calendar)}function P(e){return t._categories[Math.round(e)]}function O(e){if(S(e)){if(void 0===t._categoriesMap&&(t._categoriesMap={}),void 0!==t._categoriesMap[e])return t._categoriesMap[e];t._categories.push(\"number\"==typeof e?String(e):e);var r=t._categories.length-1;return t._categoriesMap[e]=r,r}return v}function I(e){if(t._categoriesMap)return t._categoriesMap[e]}function D(t){var e=I(t);return void 0!==e?e:s(t)?+t:void 0}function z(t){return s(t)?+t:I(t)}function R(t,e,r){return n.round(r+e*t,2)}function F(t,e,r){return(t-r)/e}var B=function(e){return s(e)?R(e,t._m,t._b):v},N=function(e){return F(e,t._m,t._b)};if(t.rangebreaks){var j=\"y\"===p;B=function(e){if(!s(e))return v;var r=t._rangebreaks.length;if(!r)return R(e,t._m,t._b);var n=j;t.range[0]>t.range[1]&&(n=!n);for(var i=n?-1:1,a=i*e,o=0,l=0;lc)){o=a<(u+c)/2?l:l+1;break}o=l+1}var f=t._B[o]||0;return isFinite(f)?R(e,t._m2,f):0},N=function(e){var r=t._rangebreaks.length;if(!r)return F(e,t._m,t._b);for(var n=0,i=0;it._rangebreaks[i].pmax&&(n=i+1);return F(e,t._m2,t._B[n])}}t.c2l=\"log\"===t.type?E:f,t.l2c=\"log\"===t.type?M:f,t.l2p=B,t.p2l=N,t.c2p=\"log\"===t.type?function(t,e){return B(E(t,e))}:B,t.p2c=\"log\"===t.type?function(t){return M(N(t))}:N,-1!==[\"linear\",\"-\"].indexOf(t.type)?(t.d2r=t.r2d=t.d2c=t.r2c=t.d2l=t.r2l=l,t.c2d=t.c2r=t.l2d=t.l2r=f,t.d2p=t.r2p=function(e){return t.l2p(l(e))},t.p2d=t.p2r=N,t.cleanPos=f):\"log\"===t.type?(t.d2r=t.d2l=function(t,e){return E(l(t),e)},t.r2d=t.r2c=function(t){return M(l(t))},t.d2c=t.r2l=l,t.c2d=t.l2r=f,t.c2r=E,t.l2d=M,t.d2p=function(e,r){return t.l2p(t.d2r(e,r))},t.p2d=function(t){return M(N(t))},t.r2p=function(e){return t.l2p(l(e))},t.p2r=N,t.cleanPos=f):\"date\"===t.type?(t.d2r=t.r2d=a.identity,t.d2c=t.r2c=t.d2l=t.r2l=L,t.c2d=t.c2r=t.l2d=t.l2r=C,t.d2p=t.r2p=function(e,r,n){return t.l2p(L(e,0,n))},t.p2d=t.p2r=function(t,e,r){return C(N(t),e,r)},t.cleanPos=function(e){return a.cleanDate(e,v,t.calendar)}):\"category\"===t.type?(t.d2c=t.d2l=O,t.r2d=t.c2d=t.l2d=P,t.d2r=t.d2l_noadd=D,t.r2c=function(e){var r=z(e);return void 0!==r?r:t.fraction2r(.5)},t.l2r=t.c2r=f,t.r2l=z,t.d2p=function(e){return t.l2p(t.r2c(e))},t.p2d=function(t){return P(N(t))},t.r2p=t.d2p,t.p2r=N,t.cleanPos=function(t){return\"string\"==typeof t&&\"\"!==t?t:f(t)}):\"multicategory\"===t.type&&(t.r2d=t.c2d=t.l2d=P,t.d2r=t.d2l_noadd=D,t.r2c=function(e){var r=D(e);return void 0!==r?r:t.fraction2r(.5)},t.r2c_just_indices=I,t.l2r=t.c2r=f,t.r2l=D,t.d2p=function(e){return t.l2p(t.r2c(e))},t.p2d=function(t){return P(N(t))},t.r2p=t.d2p,t.p2r=N,t.cleanPos=function(t){return Array.isArray(t)||\"string\"==typeof t&&\"\"!==t?t:f(t)},t.setupMultiCategory=function(n){var i,o,s=t._traceIndices,l=t._matchGroup;if(l&&0===t._categories.length)for(var u in l)if(u!==r){var c=e[w.id2name(u)];s=s.concat(c._traceIndices)}var f=[[0,{}],[0,{}]],d=[];for(i=0;il[1]&&(i[s?0:1]=n)}},t.cleanRange=function(e,r){t._cleanRange(e,r),t.limitRange(e)},t._cleanRange=function(e,r){r||(r={}),e||(e=\"range\");var n,i,o=a.nestedProperty(t,e).get();if(i=(i=\"date\"===t.type?a.dfltRange(t.calendar):\"y\"===p?T.DFLTRANGEY:\"realaxis\"===t._name?[0,1]:r.dfltRange||T.DFLTRANGEX).slice(),\"tozero\"!==t.rangemode&&\"nonnegative\"!==t.rangemode||(i[0]=0),o&&2===o.length){var l=null===o[0],u=null===o[1];for(\"date\"!==t.type||t.autorange||(o[0]=a.cleanDate(o[0],v,t.calendar),o[1]=a.cleanDate(o[1],v,t.calendar)),n=0;n<2;n++)if(\"date\"===t.type){if(!a.isDateTime(o[n],t.calendar)){t[e]=i;break}if(t.r2l(o[0])===t.r2l(o[1])){var c=a.constrain(t.r2l(o[0]),a.MIN_MS+1e3,a.MAX_MS-1e3);o[0]=t.l2r(c-1e3),o[1]=t.l2r(c+1e3);break}}else{if(!s(o[n])){if(l||u||!s(o[1-n])){t[e]=i;break}o[n]=o[1-n]*(n?10:.1)}if(o[n]<-d?o[n]=-d:o[n]>d&&(o[n]=d),o[0]===o[1]){var f=Math.max(1,Math.abs(1e-6*o[0]));o[0]-=f,o[1]+=f}}}else a.nestedProperty(t,e).set(i)},t.setScale=function(r){var n=e._size;if(t.overlaying){var i=w.getFromId({_fullLayout:e},t.overlaying);t.domain=i.domain}var a=r&&t._r?\"_r\":\"range\",o=t.calendar;t.cleanRange(a);var s,l,u=t.r2l(t[a][0],o),c=t.r2l(t[a][1],o),f=\"y\"===p;if(f?(t._offset=n.t+(1-t.domain[1])*n.h,t._length=n.h*(t.domain[1]-t.domain[0]),t._m=t._length/(u-c),t._b=-t._m*c):(t._offset=n.l+t.domain[0]*n.w,t._length=n.w*(t.domain[1]-t.domain[0]),t._m=t._length/(c-u),t._b=-t._m*u),t._rangebreaks=[],t._lBreaks=0,t._m2=0,t._B=[],t.rangebreaks&&(t._rangebreaks=t.locateBreaks(Math.min(u,c),Math.max(u,c)),t._rangebreaks.length)){for(s=0;sc&&(h=!h),h&&t._rangebreaks.reverse();var d=h?-1:1;for(t._m2=d*t._length/(Math.abs(c-u)-t._lBreaks),t._B.push(-t._m2*(f?c:u)),s=0;si&&(i+=7,oi&&(i+=24,o=n&&o=n&&e=s.min&&(ts.max&&(s.max=n),i=!1)}i&&u.push({min:t,max:n})}};for(n=0;nr.duration?(function(){for(var r={},n=0;n rect\").call(o.setTranslate,0,0).call(o.setScale,1,1),t.plot.call(o.setTranslate,e._offset,r._offset).call(o.setScale,1,1);var n=t.plot.selectAll(\".scatterlayer .trace\");n.selectAll(\".point\").call(o.setPointGroupScale,1,1),n.selectAll(\".textpoint\").call(o.setTextPointsScale,1,1),n.call(o.hideOutsideRangePoints,t)}function g(e,r){var n=e.plotinfo,i=n.xaxis,l=n.yaxis,u=i._length,c=l._length,f=!!e.xr1,h=!!e.yr1,p=[];if(f){var d=a.simpleMap(e.xr0,i.r2l),v=a.simpleMap(e.xr1,i.r2l),g=d[1]-d[0],y=v[1]-v[0];p[0]=(d[0]*(1-r)+r*v[0]-d[0])/(d[1]-d[0])*u,p[2]=u*(1-r+r*y/g),i.range[0]=i.l2r(d[0]*(1-r)+r*v[0]),i.range[1]=i.l2r(d[1]*(1-r)+r*v[1])}else p[0]=0,p[2]=u;if(h){var m=a.simpleMap(e.yr0,l.r2l),x=a.simpleMap(e.yr1,l.r2l),b=m[1]-m[0],_=x[1]-x[0];p[1]=(m[1]*(1-r)+r*x[1]-m[1])/(m[0]-m[1])*c,p[3]=c*(1-r+r*_/b),l.range[0]=i.l2r(m[0]*(1-r)+r*x[0]),l.range[1]=l.l2r(m[1]*(1-r)+r*x[1])}else p[1]=0,p[3]=c;s.drawOne(t,i,{skipTitle:!0}),s.drawOne(t,l,{skipTitle:!0}),s.redrawComponents(t,[i._id,l._id]);var w=f?u/p[2]:1,T=h?c/p[3]:1,k=f?p[0]:0,A=h?p[1]:0,M=f?p[0]/p[2]*u:0,S=h?p[1]/p[3]*c:0,E=i._offset-M,L=l._offset-S;n.clipRect.call(o.setTranslate,k,A).call(o.setScale,1/w,1/T),n.plot.call(o.setTranslate,E,L).call(o.setScale,w,T),o.setPointGroupScale(n.zoomScalePts,1/w,1/T),o.setTextPointsScale(n.zoomScaleTxt,1/w,1/T)}s.redrawComponents(t)}},951:function(t,e,r){\"use strict\";var n=r(73972).traceIs,i=r(4322);function a(t){return{v:\"x\",h:\"y\"}[t.orientation||\"v\"]}function o(t,e){var r=a(t),i=n(t,\"box-violin\"),o=n(t._fullInput||{},\"candlestick\");return i&&!o&&e===r&&void 0===t[r]&&void 0===t[r+\"0\"]}t.exports=function(t,e,r,s){r(\"autotypenumbers\",s.autotypenumbersDflt),\"-\"===r(\"type\",(s.splomStash||{}).type)&&(function(t,e){if(\"-\"===t.type){var r,s=t._id,l=s.charAt(0);-1!==s.indexOf(\"scene\")&&(s=l);var u=function(t,e,r){for(var n=0;n0&&(i[\"_\"+r+\"axes\"]||{})[e])return i;if((i[r+\"axis\"]||r)===e){if(o(i,r))return i;if((i[r]||[]).length||i[r+\"0\"])return i}}}(e,s,l);if(u)if(\"histogram\"!==u.type||l!=={v:\"y\",h:\"x\"}[u.orientation||\"v\"]){var c=l+\"calendar\",f=u[c],h={noMultiCategory:!n(u,\"cartesian\")||n(u,\"noMultiCategory\")};if(\"box\"===u.type&&u._hasPreCompStats&&l==={h:\"x\",v:\"y\"}[u.orientation||\"v\"]&&(h.noMultiCategory=!0),h.autotypenumbers=t.autotypenumbers,o(u,l)){var p=a(u),d=[];for(r=0;r0?\".\":\"\")+a;i.isPlainObject(o)?l(o,e,s,n+1):e(s,a,o)}}))}e.manageCommandObserver=function(t,r,n,o){var s={},l=!0;r&&r._commandObserver&&(s=r._commandObserver),s.cache||(s.cache={}),s.lookupTable={};var u=e.hasSimpleAPICommandBindings(t,n,s.lookupTable);if(r&&r._commandObserver){if(u)return s;if(r._commandObserver.remove)return r._commandObserver.remove(),r._commandObserver=null,s}if(u){a(t,u,s.cache),s.check=function(){if(l){var e=a(t,u,s.cache);return e.changed&&o&&void 0!==s.lookupTable[e.value]&&(s.disable(),Promise.resolve(o({value:e.value,type:u.type,prop:u.prop,traces:u.traces,index:s.lookupTable[e.value]})).then(s.enable,s.enable)),e.changed}};for(var c=[\"plotly_relayout\",\"plotly_redraw\",\"plotly_restyle\",\"plotly_update\",\"plotly_animatingframe\",\"plotly_afterplot\"],f=0;f0&&i<0&&(i+=360);var s=(i-n)/4;return{type:\"Polygon\",coordinates:[[[n,a],[n,o],[n+s,o],[n+2*s,o],[n+3*s,o],[i,o],[i,a],[i-s,a],[i-2*s,a],[i-3*s,a],[n,a]]]}}t.exports=function(t){return new M(t)},S.plot=function(t,e,r,n){var i=this;if(n)return i.update(t,e,!0);i._geoCalcData=t,i._fullLayout=e;var a=e[this.id],o=[],s=!1;for(var l in w.layerNameToAdjective)if(\"frame\"!==l&&a[\"show\"+l]){s=!0;break}for(var u=!1,c=0;c0&&o._module.calcGeoJSON(a,e)}if(!r){if(this.updateProjection(t,e))return;this.viewInitial&&this.scope===n.scope||this.saveViewInitial(n)}this.scope=n.scope,this.updateBaseLayers(e,n),this.updateDims(e,n),this.updateFx(e,n),d.generalUpdatePerTraceModule(this.graphDiv,this,t,n);var s=this.layers.frontplot.select(\".scatterlayer\");this.dataPoints.point=s.selectAll(\".point\"),this.dataPoints.text=s.selectAll(\"text\"),this.dataPaths.line=s.selectAll(\".js-line\");var l=this.layers.backplot.select(\".choroplethlayer\");this.dataPaths.choropleth=l.selectAll(\"path\"),this._render()},S.updateProjection=function(t,e){var r=this.graphDiv,n=e[this.id],l=e._size,c=n.domain,f=n.projection,h=n.lonaxis,p=n.lataxis,d=h._ax,v=p._ax,y=this.projection=function(t){var e=t.projection,r=e.type,n=w.projNames[r];n=\"geo\"+u.titleCase(n);for(var l=(i[n]||s[n])(),c=t._isSatellite?180*Math.acos(1/e.distance)/Math.PI:t._isClipped?w.lonaxisSpan[r]/2:null,f=[\"center\",\"rotate\",\"parallels\",\"clipExtent\"],h=function(t){return t?l:[]},p=0;pc*Math.PI/180}return!1},l.getPath=function(){return a().projection(l)},l.getBounds=function(t){return l.getPath().bounds(t)},l.precision(w.precision),t._isSatellite&&l.tilt(e.tilt).distance(e.distance),c&&l.clipAngle(c-w.clipPad),l}(n),m=[[l.l+l.w*c.x[0],l.t+l.h*(1-c.y[1])],[l.l+l.w*c.x[1],l.t+l.h*(1-c.y[0])]],x=n.center||{},b=f.rotation||{},_=h.range||[],T=p.range||[];if(n.fitbounds){d._length=m[1][0]-m[0][0],v._length=m[1][1]-m[0][1],d.range=g(r,d),v.range=g(r,v);var k=(d.range[0]+d.range[1])/2,A=(v.range[0]+v.range[1])/2;if(n._isScoped)x={lon:k,lat:A};else if(n._isClipped){x={lon:k,lat:A},b={lon:k,lat:A,roll:b.roll};var M=f.type,S=w.lonaxisSpan[M]/2||180,L=w.lataxisSpan[M]/2||90;_=[k-S,k+S],T=[A-L,A+L]}else x={lon:k,lat:A},b={lon:k,lat:b.lat,roll:b.roll}}y.center([x.lon-b.lon,x.lat-b.lat]).rotate([-b.lon,-b.lat,b.roll]).parallels(f.parallels);var C=E(_,T);y.fitExtent(m,C);var P=this.bounds=y.getBounds(C),O=this.fitScale=y.scale(),I=y.translate();if(n.fitbounds){var D=y.getBounds(E(d.range,v.range)),z=Math.min((P[1][0]-P[0][0])/(D[1][0]-D[0][0]),(P[1][1]-P[0][1])/(D[1][1]-D[0][1]));isFinite(z)?y.scale(z*O):u.warn(\"Something went wrong during\"+this.id+\"fitbounds computations.\")}else y.scale(f.scale*O);var R=this.midPt=[(P[0][0]+P[1][0])/2,(P[0][1]+P[1][1])/2];if(y.translate([I[0]+(R[0]-I[0]),I[1]+(R[1]-I[1])]).clipExtent(P),n._isAlbersUsa){var F=y([x.lon,x.lat]),B=y.translate();y.translate([B[0]-(F[0]-B[0]),B[1]-(F[1]-B[1])])}},S.updateBaseLayers=function(t,e){var r=this,i=r.topojson,a=r.layers,o=r.basePaths;function s(t){return\"lonaxis\"===t||\"lataxis\"===t}function l(t){return Boolean(w.lineLayers[t])}function u(t){return Boolean(w.fillLayers[t])}var c=(this.hasChoropleth?w.layersForChoropleth:w.layers).filter((function(t){return l(t)||u(t)?e[\"show\"+t]:!s(t)||e[t].showgrid})),p=r.framework.selectAll(\".layer\").data(c,String);p.exit().each((function(t){delete a[t],delete o[t],n.select(this).remove()})),p.enter().append(\"g\").attr(\"class\",(function(t){return\"layer \"+t})).each((function(t){var e=a[t]=n.select(this);\"bg\"===t?r.bgRect=e.append(\"rect\").style(\"pointer-events\",\"all\"):s(t)?o[t]=e.append(\"path\").style(\"fill\",\"none\"):\"backplot\"===t?e.append(\"g\").classed(\"choroplethlayer\",!0):\"frontplot\"===t?e.append(\"g\").classed(\"scatterlayer\",!0):l(t)?o[t]=e.append(\"path\").style(\"fill\",\"none\").style(\"stroke-miterlimit\",2):u(t)&&(o[t]=e.append(\"path\").style(\"stroke\",\"none\"))})),p.order(),p.each((function(r){var n=o[r],a=w.layerNameToAdjective[r];\"frame\"===r?n.datum(w.sphereSVG):l(r)||u(r)?n.datum(A(i,i.objects[r])):s(r)&&n.datum(function(t,e,r){var n,i,a,o=e[t],s=w.scopeDefaults[e.scope];\"lonaxis\"===t?(n=s.lonaxisRange,i=s.lataxisRange,a=function(t,e){return[t,e]}):\"lataxis\"===t&&(n=s.lataxisRange,i=s.lonaxisRange,a=function(t,e){return[e,t]});var l={type:\"linear\",range:[n[0],n[1]-1e-6],tick0:o.tick0,dtick:o.dtick};v.setConvert(l,r);var u=v.calcTicks(l);e.isScoped||\"lonaxis\"!==t||u.pop();for(var c=u.length,f=new Array(c),h=0;h-1&&b(n.event,i,[r.xaxis],[r.yaxis],r.id,c),s.indexOf(\"event\")>-1&&p.click(i,n.event))}))}function f(t){return r.projection.invert([t[0]+r.xaxis._offset,t[1]+r.yaxis._offset])}},S.makeFramework=function(){var t=this,e=t.graphDiv,r=e._fullLayout,i=\"clip\"+r._uid+t.id;t.clipDef=r._clips.append(\"clipPath\").attr(\"id\",i),t.clipRect=t.clipDef.append(\"rect\"),t.framework=n.select(t.container).append(\"g\").attr(\"class\",\"geo \"+t.id).call(h.setClipUrl,i,e),t.project=function(e){var r=t.projection(e);return r?[r[0]-t.xaxis._offset,r[1]-t.yaxis._offset]:[null,null]},t.xaxis={_id:\"x\",c2p:function(e){return t.project(e)[0]}},t.yaxis={_id:\"y\",c2p:function(e){return t.project(e)[1]}},t.mockAxis={type:\"linear\",showexponent:\"all\",exponentformat:\"B\"},v.setConvert(t.mockAxis,r)},S.saveViewInitial=function(t){var e,r=t.center||{},n=t.projection,i=n.rotation||{};this.viewInitial={fitbounds:t.fitbounds,\"projection.scale\":n.scale},e=t._isScoped?{\"center.lon\":r.lon,\"center.lat\":r.lat}:t._isClipped?{\"projection.rotation.lon\":i.lon,\"projection.rotation.lat\":i.lat}:{\"center.lon\":r.lon,\"center.lat\":r.lat,\"projection.rotation.lon\":i.lon},u.extendFlat(this.viewInitial,e)},S.render=function(t){this._hasMarkerAngles&&t?this.plot(this._geoCalcData,this._fullLayout,[],!0):this._render()},S._render=function(){var t,e=this.projection,r=e.getPath();function n(t){var r=e(t.lonlat);return r?c(r[0],r[1]):null}function i(t){return e.isLonLatOverEdges(t.lonlat)?\"none\":null}for(t in this.basePaths)this.basePaths[t].attr(\"d\",r);for(t in this.dataPaths)this.dataPaths[t].attr(\"d\",(function(t){return r(t.geojson)}));for(t in this.dataPoints)this.dataPoints[t].attr(\"display\",i).attr(\"transform\",n)}},44622:function(t,e,r){\"use strict\";var n=r(27659).AU,i=r(71828).counterRegex,a=r(69082),o=\"geo\",s=i(o),l={};l[o]={valType:\"subplotid\",dflt:o,editType:\"calc\"},t.exports={attr:o,name:o,idRoot:o,idRegex:s,attrRegex:s,attributes:l,layoutAttributes:r(77519),supplyLayoutDefaults:r(82161),plot:function(t){for(var e=t._fullLayout,r=t.calcdata,i=e._subplots[o],s=0;s0&&P<0&&(P+=360);var O,I,D,z=(C+P)/2;if(!p){var R=d?f.projRotate:[z,0,0];O=r(\"projection.rotation.lon\",R[0]),r(\"projection.rotation.lat\",R[1]),r(\"projection.rotation.roll\",R[2]),r(\"showcoastlines\",!d&&x)&&(r(\"coastlinecolor\"),r(\"coastlinewidth\")),r(\"showocean\",!!x&&void 0)&&r(\"oceancolor\")}p?(I=-96.6,D=38.7):(I=d?z:O,D=(L[0]+L[1])/2),r(\"center.lon\",I),r(\"center.lat\",D),v&&(r(\"projection.tilt\"),r(\"projection.distance\")),g&&r(\"projection.parallels\",f.projParallels||[0,60]),r(\"projection.scale\"),r(\"showland\",!!x&&void 0)&&r(\"landcolor\"),r(\"showlakes\",!!x&&void 0)&&r(\"lakecolor\"),r(\"showrivers\",!!x&&void 0)&&(r(\"rivercolor\"),r(\"riverwidth\")),r(\"showcountries\",d&&\"usa\"!==c&&x)&&(r(\"countrycolor\"),r(\"countrywidth\")),(\"usa\"===c||\"north america\"===c&&50===u)&&(r(\"showsubunits\",x),r(\"subunitcolor\"),r(\"subunitwidth\")),d||r(\"showframe\",x)&&(r(\"framecolor\"),r(\"framewidth\")),r(\"bgcolor\"),r(\"fitbounds\")&&(delete e.projection.scale,d?(delete e.center.lon,delete e.center.lat):y?(delete e.center.lon,delete e.center.lat,delete e.projection.rotation.lon,delete e.projection.rotation.lat,delete e.lonaxis.range,delete e.lataxis.range):(delete e.center.lon,delete e.center.lat,delete e.projection.rotation.lon))}t.exports=function(t,e,r){i(t,e,r,{type:\"geo\",attributes:s,handleDefaults:u,fullData:r,partition:\"y\"})}},74455:function(t,e,r){\"use strict\";var n=r(39898),i=r(71828),a=r(73972),o=Math.PI/180,s=180/Math.PI,l={cursor:\"pointer\"},u={cursor:\"auto\"};function c(t,e){return n.behavior.zoom().translate(e.translate()).scale(e.scale())}function f(t,e,r){var n=t.id,o=t.graphDiv,s=o.layout,l=s[n],u=o._fullLayout,c=u[n],f={},h={};function p(t,e){f[n+\".\"+t]=i.nestedProperty(l,t).get(),a.call(\"_storeDirectGUIEdit\",s,u._preGUI,f);var r=i.nestedProperty(c,t);r.get()!==e&&(r.set(e),i.nestedProperty(l,t).set(e),h[n+\".\"+t]=e)}r(p),p(\"projection.scale\",e.scale()/t.fitScale),p(\"fitbounds\",!1),o.emit(\"plotly_relayout\",h)}function h(t,e){var r=c(0,e);function i(r){var n=e.invert(t.midPt);r(\"center.lon\",n[0]),r(\"center.lat\",n[1])}return r.on(\"zoomstart\",(function(){n.select(this).style(l)})).on(\"zoom\",(function(){e.scale(n.event.scale).translate(n.event.translate),t.render(!0);var r=e.invert(t.midPt);t.graphDiv.emit(\"plotly_relayouting\",{\"geo.projection.scale\":e.scale()/t.fitScale,\"geo.center.lon\":r[0],\"geo.center.lat\":r[1]})})).on(\"zoomend\",(function(){n.select(this).style(u),f(t,e,i)})),r}function p(t,e){var r,i,a,o,s,h,p,d,v,g=c(0,e);function y(t){return e.invert(t)}function m(r){var n=e.rotate(),i=e.invert(t.midPt);r(\"projection.rotation.lon\",-n[0]),r(\"center.lon\",i[0]),r(\"center.lat\",i[1])}return g.on(\"zoomstart\",(function(){n.select(this).style(l),r=n.mouse(this),i=e.rotate(),a=e.translate(),o=i,s=y(r)})).on(\"zoom\",(function(){if(h=n.mouse(this),function(t){var r=y(t);if(!r)return!0;var n=e(r);return Math.abs(n[0]-t[0])>2||Math.abs(n[1]-t[1])>2}(r))return g.scale(e.scale()),void g.translate(e.translate());e.scale(n.event.scale),e.translate([a[0],n.event.translate[1]]),s?y(h)&&(d=y(h),p=[o[0]+(d[0]-s[0]),i[1],i[2]],e.rotate(p),o=p):s=y(r=h),v=!0,t.render(!0);var l=e.rotate(),u=e.invert(t.midPt);t.graphDiv.emit(\"plotly_relayouting\",{\"geo.projection.scale\":e.scale()/t.fitScale,\"geo.center.lon\":u[0],\"geo.center.lat\":u[1],\"geo.projection.rotation.lon\":-l[0]})})).on(\"zoomend\",(function(){n.select(this).style(u),v&&f(t,e,m)})),g}function d(t,e){var r,i={r:e.rotate(),k:e.scale()},a=c(0,e),h=function(t){for(var e=0,r=arguments.length,i=[];++ed?(a=(f>0?90:-90)-p,i=0):(a=Math.asin(f/d)*s-p,i=Math.sqrt(d*d-f*f));var v=180-a-2*p,y=(Math.atan2(h,c)-Math.atan2(u,i))*s,x=(Math.atan2(h,c)-Math.atan2(u,-i))*s;return g(r[0],r[1],a,y)<=g(r[0],r[1],v,x)?[a,y,r[2]]:[v,x,r[2]]}(T,r,E);isFinite(k[0])&&isFinite(k[1])&&isFinite(k[2])||(k=E),e.rotate(k),E=k}}else r=v(e,M=b);h.of(this,arguments)({type:\"zoom\"})})),A=h.of(this,arguments),p++||A({type:\"zoomstart\"})})).on(\"zoomend\",(function(){var r;n.select(this).style(u),d.call(a,\"zoom\",null),r=h.of(this,arguments),--p||r({type:\"zoomend\"}),f(t,e,y)})).on(\"zoom.redraw\",(function(){t.render(!0);var r=e.rotate();t.graphDiv.emit(\"plotly_relayouting\",{\"geo.projection.scale\":e.scale()/t.fitScale,\"geo.projection.rotation.lon\":-r[0],\"geo.projection.rotation.lat\":-r[1]})})),n.rebind(a,h,\"on\")}function v(t,e){var r=t.invert(e);return r&&isFinite(r[0])&&isFinite(r[1])&&function(t){var e=t[0]*o,r=t[1]*o,n=Math.cos(r);return[n*Math.cos(e),n*Math.sin(e),Math.sin(r)]}(r)}function g(t,e,r,n){var i=y(r-t),a=y(n-e);return Math.sqrt(i*i+a*a)}function y(t){return(t%360+540)%360-180}function m(t,e,r){var n=r*o,i=t.slice(),a=0===e?1:0,s=2===e?1:2,l=Math.cos(n),u=Math.sin(n);return i[a]=t[a]*l-t[s]*u,i[s]=t[s]*l+t[a]*u,i}function x(t,e){for(var r=0,n=0,i=t.length;nMath.abs(s)?(u.boxEnd[1]=u.boxStart[1]+Math.abs(a)*_*(s>=0?1:-1),u.boxEnd[1]l[3]&&(u.boxEnd[1]=l[3],u.boxEnd[0]=u.boxStart[0]+(l[3]-u.boxStart[1])/Math.abs(_))):(u.boxEnd[0]=u.boxStart[0]+Math.abs(s)/_*(a>=0?1:-1),u.boxEnd[0]l[2]&&(u.boxEnd[0]=l[2],u.boxEnd[1]=u.boxStart[1]+(l[2]-u.boxStart[0])*Math.abs(_)))}}else u.boxEnabled?(a=u.boxStart[0]!==u.boxEnd[0],s=u.boxStart[1]!==u.boxEnd[1],a||s?(a&&(g(0,u.boxStart[0],u.boxEnd[0]),t.xaxis.autorange=!1),s&&(g(1,u.boxStart[1],u.boxEnd[1]),t.yaxis.autorange=!1),t.relayoutCallback()):t.glplot.setDirty(),u.boxEnabled=!1,u.boxInited=!1):u.boxInited&&(u.boxInited=!1);break;case\"pan\":u.boxEnabled=!1,u.boxInited=!1,e?(u.panning||(u.dragStart[0]=n,u.dragStart[1]=i),Math.abs(u.dragStart[0]-n).999&&(g=\"turntable\"):g=\"turntable\")}else g=\"turntable\";r(\"dragmode\",g),r(\"hovermode\",n.getDfltFromLayout(\"hovermode\"))}t.exports=function(t,e,r){var i=e._basePlotModules.length>1;o(t,e,r,{type:c,attributes:l,handleDefaults:f,fullLayout:e,font:e.font,fullData:r,getDfltFromLayout:function(e){if(!i)return n.validate(t[e],l[e])?t[e]:void 0},autotypenumbersDflt:e.autotypenumbers,paper_bgcolor:e.paper_bgcolor,calendar:e.calendar})}},65500:function(t,e,r){\"use strict\";var n=r(77894),i=r(27670).Y,a=r(1426).extendFlat,o=r(71828).counterRegex;function s(t,e,r){return{x:{valType:\"number\",dflt:t,editType:\"camera\"},y:{valType:\"number\",dflt:e,editType:\"camera\"},z:{valType:\"number\",dflt:r,editType:\"camera\"},editType:\"camera\"}}t.exports={_arrayAttrRegexps:[o(\"scene\",\".annotations\",!0)],bgcolor:{valType:\"color\",dflt:\"rgba(0,0,0,0)\",editType:\"plot\"},camera:{up:a(s(0,0,1),{}),center:a(s(0,0,0),{}),eye:a(s(1.25,1.25,1.25),{}),projection:{type:{valType:\"enumerated\",values:[\"perspective\",\"orthographic\"],dflt:\"perspective\",editType:\"calc\"},editType:\"calc\"},editType:\"camera\"},domain:i({name:\"scene\",editType:\"plot\"}),aspectmode:{valType:\"enumerated\",values:[\"auto\",\"cube\",\"data\",\"manual\"],dflt:\"auto\",editType:\"plot\",impliedEdits:{\"aspectratio.x\":void 0,\"aspectratio.y\":void 0,\"aspectratio.z\":void 0}},aspectratio:{x:{valType:\"number\",min:0,editType:\"plot\",impliedEdits:{\"^aspectmode\":\"manual\"}},y:{valType:\"number\",min:0,editType:\"plot\",impliedEdits:{\"^aspectmode\":\"manual\"}},z:{valType:\"number\",min:0,editType:\"plot\",impliedEdits:{\"^aspectmode\":\"manual\"}},editType:\"plot\",impliedEdits:{aspectmode:\"manual\"}},xaxis:n,yaxis:n,zaxis:n,dragmode:{valType:\"enumerated\",values:[\"orbit\",\"turntable\",\"zoom\",\"pan\",!1],editType:\"plot\"},hovermode:{valType:\"enumerated\",values:[\"closest\",!1],dflt:\"closest\",editType:\"modebar\"},uirevision:{valType:\"any\",editType:\"none\"},editType:\"plot\",_deprecated:{cameraposition:{valType:\"info_array\",editType:\"camera\"}}}},13133:function(t,e,r){\"use strict\";var n=r(78614),i=[\"xaxis\",\"yaxis\",\"zaxis\"];function a(){this.enabled=[!0,!0,!0],this.colors=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.drawSides=[!0,!0,!0],this.lineWidth=[1,1,1]}a.prototype.merge=function(t){for(var e=0;e<3;++e){var r=t[i[e]];r.visible?(this.enabled[e]=r.showspikes,this.colors[e]=n(r.spikecolor),this.drawSides[e]=r.spikesides,this.lineWidth[e]=r.spikethickness):(this.enabled[e]=!1,this.drawSides[e]=!1)}},t.exports=function(t){var e=new a;return e.merge(t),e}},96085:function(t,e,r){\"use strict\";t.exports=function(t){for(var e=t.axesOptions,r=t.glplot.axesPixels,s=t.fullSceneLayout,l=[[],[],[]],u=0;u<3;++u){var c=s[a[u]];if(c._length=(r[u].hi-r[u].lo)*r[u].pixelsPerDataUnit/t.dataScale[u],Math.abs(c._length)===1/0||isNaN(c._length))l[u]=[];else{c._input_range=c.range.slice(),c.range[0]=r[u].lo/t.dataScale[u],c.range[1]=r[u].hi/t.dataScale[u],c._m=1/(t.dataScale[u]*r[u].pixelsPerDataUnit),c.range[0]===c.range[1]&&(c.range[0]-=1,c.range[1]+=1);var f=c.tickmode;if(\"auto\"===c.tickmode){c.tickmode=\"linear\";var h=c.nticks||i.constrain(c._length/40,4,9);n.autoTicks(c,Math.abs(c.range[1]-c.range[0])/h)}for(var p=n.calcTicks(c,{msUTC:!0}),d=0;d/g,\" \"));l[u]=p,c.tickmode=f}}for(e.ticks=l,u=0;u<3;++u)for(o[u]=.5*(t.glplot.bounds[0][u]+t.glplot.bounds[1][u]),d=0;d<2;++d)e.bounds[d][u]=t.glplot.bounds[d][u];t.contourLevels=function(t){for(var e=new Array(3),r=0;r<3;++r){for(var n=t[r],i=new Array(n.length),a=0;ar.deltaY?1.1:1/1.1,a=t.glplot.getAspectratio();t.glplot.setAspectratio({x:n*a.x,y:n*a.y,z:n*a.z})}i(t)}}),!!u&&{passive:!1}),t.glplot.canvas.addEventListener(\"mousemove\",(function(){if(!1!==t.fullSceneLayout.dragmode&&0!==t.camera.mouseListener.buttons){var e=n();t.graphDiv.emit(\"plotly_relayouting\",e)}})),t.staticMode||t.glplot.canvas.addEventListener(\"webglcontextlost\",(function(r){e&&e.emit&&e.emit(\"plotly_webglcontextlost\",{event:r,layer:t.id})}),!1)),t.glplot.oncontextloss=function(){t.recoverContext()},t.glplot.onrender=function(){t.render()},!0},k.render=function(){var t,e=this,r=e.graphDiv,n=e.svgContainer,i=e.container.getBoundingClientRect();r._fullLayout._calcInverseTransform(r);var a=r._fullLayout._invScaleX,o=r._fullLayout._invScaleY,s=i.width*a,l=i.height*o;n.setAttributeNS(null,\"viewBox\",\"0 0 \"+s+\" \"+l),n.setAttributeNS(null,\"width\",s),n.setAttributeNS(null,\"height\",l),b(e),e.glplot.axes.update(e.axesOptions);for(var u=Object.keys(e.traces),c=null,h=e.glplot.selection,v=0;v\")):\"isosurface\"===t.type||\"volume\"===t.type?(k.valueLabel=p.hoverLabelText(e._mockAxis,e._mockAxis.d2l(h.traceCoordinate[3]),t.valuehoverformat),E.push(\"value: \"+k.valueLabel),h.textLabel&&E.push(h.textLabel),x=E.join(\" \")):x=h.textLabel;var L={x:h.traceCoordinate[0],y:h.traceCoordinate[1],z:h.traceCoordinate[2],data:_._input,fullData:_,curveNumber:_.index,pointNumber:T};d.appendArrayPointValue(L,_,T),t._module.eventData&&(L=_._module.eventData(L,h,_,{},T));var C={points:[L]};if(e.fullSceneLayout.hovermode){var P=[];d.loneHover({trace:_,x:(.5+.5*m[0]/m[3])*s,y:(.5-.5*m[1]/m[3])*l,xLabel:k.xLabel,yLabel:k.yLabel,zLabel:k.zLabel,text:x,name:c.name,color:d.castHoverOption(_,T,\"bgcolor\")||c.color,borderColor:d.castHoverOption(_,T,\"bordercolor\"),fontFamily:d.castHoverOption(_,T,\"font.family\"),fontSize:d.castHoverOption(_,T,\"font.size\"),fontColor:d.castHoverOption(_,T,\"font.color\"),nameLength:d.castHoverOption(_,T,\"namelength\"),textAlign:d.castHoverOption(_,T,\"align\"),hovertemplate:f.castOption(_,T,\"hovertemplate\"),hovertemplateLabels:f.extendFlat({},L,k),eventData:[L]},{container:n,gd:r,inOut_bbox:P}),L.bbox=P[0]}h.distance<5&&(h.buttons||w)?r.emit(\"plotly_click\",C):r.emit(\"plotly_hover\",C),this.oldEventData=C}else d.loneUnhover(n),this.oldEventData&&r.emit(\"plotly_unhover\",this.oldEventData),this.oldEventData=void 0;e.drawAnnotations(e)},k.recoverContext=function(){var t=this;t.glplot.dispose();var e=function(){t.glplot.gl.isContextLost()?requestAnimationFrame(e):t.initializeGLPlot()?t.plot.apply(t,t.plotArgs):f.error(\"Catastrophic and unrecoverable WebGL error. Context lost.\")};requestAnimationFrame(e)};var M=[\"xaxis\",\"yaxis\",\"zaxis\"];function S(t,e,r){for(var n=t.fullSceneLayout,i=0;i<3;i++){var a=M[i],o=a.charAt(0),s=n[a],l=e[o],u=e[o+\"calendar\"],c=e[\"_\"+o+\"length\"];if(f.isArrayOrTypedArray(l))for(var h,p=0;p<(c||l.length);p++)if(f.isArrayOrTypedArray(l[p]))for(var d=0;dy[1][o])y[0][o]=-1,y[1][o]=1;else{var O=y[1][o]-y[0][o];y[0][o]-=O/32,y[1][o]+=O/32}if(b=[y[0][o],y[1][o]],b=_(b,l),y[0][o]=b[0],y[1][o]=b[1],l.isReversed()){var I=y[0][o];y[0][o]=y[1][o],y[1][o]=I}}else b=l.range,y[0][o]=l.r2l(b[0]),y[1][o]=l.r2l(b[1]);y[0][o]===y[1][o]&&(y[0][o]-=1,y[1][o]+=1),m[o]=y[1][o]-y[0][o],l.range=[y[0][o],y[1][o]],l.limitRange(),n.glplot.setBounds(o,{min:l.range[0]*p[o],max:l.range[1]*p[o]})}var D=c.aspectmode;if(\"cube\"===D)g=[1,1,1];else if(\"manual\"===D){var z=c.aspectratio;g=[z.x,z.y,z.z]}else{if(\"auto\"!==D&&\"data\"!==D)throw new Error(\"scene.js aspectRatio was not one of the enumerated types\");var R=[1,1,1];for(o=0;o<3;++o){var F=x[u=(l=c[M[o]]).type];R[o]=Math.pow(F.acc,1/F.count)/p[o]}g=\"data\"===D||Math.max.apply(null,R)/Math.min.apply(null,R)<=4?R:[1,1,1]}c.aspectratio.x=f.aspectratio.x=g[0],c.aspectratio.y=f.aspectratio.y=g[1],c.aspectratio.z=f.aspectratio.z=g[2],n.glplot.setAspectratio(c.aspectratio),n.viewInitial.aspectratio||(n.viewInitial.aspectratio={x:c.aspectratio.x,y:c.aspectratio.y,z:c.aspectratio.z}),n.viewInitial.aspectmode||(n.viewInitial.aspectmode=c.aspectmode);var B=c.domain||null,N=e._size||null;if(B&&N){var j=n.container.style;j.position=\"absolute\",j.left=N.l+B.x[0]*N.w+\"px\",j.top=N.t+(1-B.y[1])*N.h+\"px\",j.width=N.w*(B.x[1]-B.x[0])+\"px\",j.height=N.h*(B.y[1]-B.y[0])+\"px\"}n.glplot.redraw()}},k.destroy=function(){var t=this;t.glplot&&(t.camera.mouseListener.enabled=!1,t.container.removeEventListener(\"wheel\",t.camera.wheelListener),t.camera=null,t.glplot.dispose(),t.container.parentNode.removeChild(t.container),t.glplot=null)},k.getCamera=function(){var t,e=this;return e.camera.view.recalcMatrix(e.camera.view.lastT()),{up:{x:(t=e.camera).up[0],y:t.up[1],z:t.up[2]},center:{x:t.center[0],y:t.center[1],z:t.center[2]},eye:{x:t.eye[0],y:t.eye[1],z:t.eye[2]},projection:{type:!0===t._ortho?\"orthographic\":\"perspective\"}}},k.setViewport=function(t){var e,r=this,n=t.camera;r.camera.lookAt.apply(this,[[(e=n).eye.x,e.eye.y,e.eye.z],[e.center.x,e.center.y,e.center.z],[e.up.x,e.up.y,e.up.z]]),r.glplot.setAspectratio(t.aspectratio),\"orthographic\"===n.projection.type!==r.camera._ortho&&(r.glplot.redraw(),r.glplot.clearRGBA(),r.glplot.dispose(),r.initializeGLPlot())},k.isCameraChanged=function(t){var e=this.getCamera(),r=f.nestedProperty(t,this.id+\".camera\").get();function n(t,e,r,n){var i=[\"up\",\"center\",\"eye\"],a=[\"x\",\"y\",\"z\"];return e[i[r]]&&t[i[r]][a[n]]===e[i[r]][a[n]]}var i=!1;if(void 0===r)i=!0;else{for(var a=0;a<3;a++)for(var o=0;o<3;o++)if(!n(e,r,a,o)){i=!0;break}(!r.projection||e.projection&&e.projection.type!==r.projection.type)&&(i=!0)}return i},k.isAspectChanged=function(t){var e=this.glplot.getAspectratio(),r=f.nestedProperty(t,this.id+\".aspectratio\").get();return void 0===r||r.x!==e.x||r.y!==e.y||r.z!==e.z},k.saveLayout=function(t){var e,r,n,i,a,o,s=this,l=s.fullLayout,u=s.isCameraChanged(t),h=s.isAspectChanged(t),p=u||h;if(p){var d={};u&&(e=s.getCamera(),n=(r=f.nestedProperty(t,s.id+\".camera\")).get(),d[s.id+\".camera\"]=n),h&&(i=s.glplot.getAspectratio(),o=(a=f.nestedProperty(t,s.id+\".aspectratio\")).get(),d[s.id+\".aspectratio\"]=o),c.call(\"_storeDirectGUIEdit\",t,l._preGUI,d),u&&(r.set(e),f.nestedProperty(l,s.id+\".camera\").set(e)),h&&(a.set(i),f.nestedProperty(l,s.id+\".aspectratio\").set(i),s.glplot.redraw())}return p},k.updateFx=function(t,e){var r=this,n=r.camera;if(n)if(\"orbit\"===t)n.mode=\"orbit\",n.keyBindingMode=\"rotate\";else if(\"turntable\"===t){n.up=[0,0,1],n.mode=\"turntable\",n.keyBindingMode=\"rotate\";var i=r.graphDiv,a=i._fullLayout,o=r.fullSceneLayout.camera,s=o.up.x,l=o.up.y,u=o.up.z;if(u/Math.sqrt(s*s+l*l+u*u)<.999){var h=r.id+\".camera.up\",p={x:0,y:0,z:1},d={};d[h]=p;var v=i.layout;c.call(\"_storeDirectGUIEdit\",v,a._preGUI,d),o.up=p,f.nestedProperty(v,h).set(p)}}else n.keyBindingMode=t;r.fullSceneLayout.hovermode=e},k.toImage=function(t){var e=this;t||(t=\"png\"),e.staticMode&&e.container.appendChild(n),e.glplot.redraw();var r=e.glplot.gl,i=r.drawingBufferWidth,a=r.drawingBufferHeight;r.bindFramebuffer(r.FRAMEBUFFER,null);var o=new Uint8Array(i*a*4);r.readPixels(0,0,i,a,r.RGBA,r.UNSIGNED_BYTE,o),function(t,e,r){for(var n=0,i=r-1;n0)for(var s=255/o,l=0;l<3;++l)t[a+l]=Math.min(s*t[a+l],255)}}(o,i,a);var s=document.createElement(\"canvas\");s.width=i,s.height=a;var l,u=s.getContext(\"2d\",{willReadFrequently:!0}),c=u.createImageData(i,a);switch(c.data.set(o),u.putImageData(c,0,0),t){case\"jpeg\":l=s.toDataURL(\"image/jpeg\");break;case\"webp\":l=s.toDataURL(\"image/webp\");break;default:l=s.toDataURL(\"image/png\")}return e.staticMode&&e.container.removeChild(n),l},k.setConvert=function(){for(var t=0;t<3;t++){var e=this.fullSceneLayout[M[t]];p.setConvert(e,this.fullLayout),e.setScale=f.noop}},k.make4thDimension=function(){var t=this,e=t.graphDiv._fullLayout;t._mockAxis={type:\"linear\",showexponent:\"all\",exponentformat:\"B\"},p.setConvert(t._mockAxis,e)},t.exports=T},90060:function(t){\"use strict\";t.exports=function(t,e,r,n){n=n||t.length;for(var i=new Array(n),a=0;aOpenStreetMap contributors',o=['© Carto ',a].join(\" \"),s=['Map tiles by Stamen Design ','under CC BY 3.0 ',\"|\",'Data by OpenStreetMap contributors','under ODbL '].join(\" \"),l={\"open-street-map\":{id:\"osm\",version:8,sources:{\"plotly-osm-tiles\":{type:\"raster\",attribution:a,tiles:[\"https://a.tile.openstreetmap.org/{z}/{x}/{y}.png\",\"https://b.tile.openstreetmap.org/{z}/{x}/{y}.png\"],tileSize:256}},layers:[{id:\"plotly-osm-tiles\",type:\"raster\",source:\"plotly-osm-tiles\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"white-bg\":{id:\"white-bg\",version:8,sources:{},layers:[{id:\"white-bg\",type:\"background\",paint:{\"background-color\":\"#FFFFFF\"},minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"carto-positron\":{id:\"carto-positron\",version:8,sources:{\"plotly-carto-positron\":{type:\"raster\",attribution:o,tiles:[\"https://cartodb-basemaps-c.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png\"],tileSize:256}},layers:[{id:\"plotly-carto-positron\",type:\"raster\",source:\"plotly-carto-positron\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"carto-darkmatter\":{id:\"carto-darkmatter\",version:8,sources:{\"plotly-carto-darkmatter\":{type:\"raster\",attribution:o,tiles:[\"https://cartodb-basemaps-c.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png\"],tileSize:256}},layers:[{id:\"plotly-carto-darkmatter\",type:\"raster\",source:\"plotly-carto-darkmatter\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"stamen-terrain\":{id:\"stamen-terrain\",version:8,sources:{\"plotly-stamen-terrain\":{type:\"raster\",attribution:s,tiles:[\"https://stamen-tiles.a.ssl.fastly.net/terrain/{z}/{x}/{y}.png\"],tileSize:256}},layers:[{id:\"plotly-stamen-terrain\",type:\"raster\",source:\"plotly-stamen-terrain\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"stamen-toner\":{id:\"stamen-toner\",version:8,sources:{\"plotly-stamen-toner\":{type:\"raster\",attribution:s,tiles:[\"https://stamen-tiles.a.ssl.fastly.net/toner/{z}/{x}/{y}.png\"],tileSize:256}},layers:[{id:\"plotly-stamen-toner\",type:\"raster\",source:\"plotly-stamen-toner\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"},\"stamen-watercolor\":{id:\"stamen-watercolor\",version:8,sources:{\"plotly-stamen-watercolor\":{type:\"raster\",attribution:['Map tiles by Stamen Design ','under CC BY 3.0 ',\"|\",'Data by OpenStreetMap contributors','under CC BY SA '].join(\" \"),tiles:[\"https://stamen-tiles.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.png\"],tileSize:256}},layers:[{id:\"plotly-stamen-watercolor\",type:\"raster\",source:\"plotly-stamen-watercolor\",minzoom:0,maxzoom:22}],glyphs:\"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\"}},u=n(l);t.exports={requiredVersion:i,styleUrlPrefix:\"mapbox://styles/mapbox/\",styleUrlSuffix:\"v9\",styleValuesMapbox:[\"basic\",\"streets\",\"outdoors\",\"light\",\"dark\",\"satellite\",\"satellite-streets\"],styleValueDflt:\"basic\",stylesNonMapbox:l,styleValuesNonMapbox:u,traceLayerPrefix:\"plotly-trace-layer-\",layoutLayerPrefix:\"plotly-layout-layer-\",wrongVersionErrorMsg:[\"Your custom plotly.js bundle is not using the correct mapbox-gl version\",\"Please install mapbox-gl@\"+i+\".\"].join(\"\\n\"),noAccessTokenErrorMsg:[\"Missing Mapbox access token.\",\"Mapbox trace type require a Mapbox access token to be registered.\",\"For example:\",\" Plotly.newPlot(gd, data, layout, { mapboxAccessToken: 'my-access-token' });\",\"More info here: https://www.mapbox.com/help/define-access-token/\"].join(\"\\n\"),missingStyleErrorMsg:[\"No valid mapbox style found, please set `mapbox.style` to one of:\",u.join(\", \"),\"or register a Mapbox access token to use a Mapbox-served style.\"].join(\"\\n\"),multipleTokensErrorMsg:[\"Set multiple mapbox access token across different mapbox subplot,\",\"using first token found as mapbox-gl does not allow multipleaccess tokens on the same page.\"].join(\"\\n\"),mapOnErrorMsg:\"Mapbox error.\",mapboxLogo:{path0:\"m 10.5,1.24 c -5.11,0 -9.25,4.15 -9.25,9.25 0,5.1 4.15,9.25 9.25,9.25 5.1,0 9.25,-4.15 9.25,-9.25 0,-5.11 -4.14,-9.25 -9.25,-9.25 z m 4.39,11.53 c -1.93,1.93 -4.78,2.31 -6.7,2.31 -0.7,0 -1.41,-0.05 -2.1,-0.16 0,0 -1.02,-5.64 2.14,-8.81 0.83,-0.83 1.95,-1.28 3.13,-1.28 1.27,0 2.49,0.51 3.39,1.42 1.84,1.84 1.89,4.75 0.14,6.52 z\",path1:\"M 10.5,-0.01 C 4.7,-0.01 0,4.7 0,10.49 c 0,5.79 4.7,10.5 10.5,10.5 5.8,0 10.5,-4.7 10.5,-10.5 C 20.99,4.7 16.3,-0.01 10.5,-0.01 Z m 0,19.75 c -5.11,0 -9.25,-4.15 -9.25,-9.25 0,-5.1 4.14,-9.26 9.25,-9.26 5.11,0 9.25,4.15 9.25,9.25 0,5.13 -4.14,9.26 -9.25,9.26 z\",path2:\"M 14.74,6.25 C 12.9,4.41 9.98,4.35 8.23,6.1 5.07,9.27 6.09,14.91 6.09,14.91 c 0,0 5.64,1.02 8.81,-2.14 C 16.64,11 16.59,8.09 14.74,6.25 Z m -2.27,4.09 -0.91,1.87 -0.9,-1.87 -1.86,-0.91 1.86,-0.9 0.9,-1.87 0.91,1.87 1.86,0.9 z\",polygon:\"11.56,12.21 10.66,10.34 8.8,9.43 10.66,8.53 11.56,6.66 12.47,8.53 14.33,9.43 12.47,10.34\"},styleRules:{map:\"overflow:hidden;position:relative;\",\"missing-css\":\"display:none;\",canary:\"background-color:salmon;\",\"ctrl-bottom-left\":\"position: absolute; pointer-events: none; z-index: 2; bottom: 0; left: 0;\",\"ctrl-bottom-right\":\"position: absolute; pointer-events: none; z-index: 2; right: 0; bottom: 0;\",ctrl:\"clear: both; pointer-events: auto; transform: translate(0, 0);\",\"ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-inner\":\"display: none;\",\"ctrl-attrib.mapboxgl-compact:hover .mapboxgl-ctrl-attrib-inner\":\"display: block; margin-top:2px\",\"ctrl-attrib.mapboxgl-compact:hover\":\"padding: 2px 24px 2px 4px; visibility: visible; margin-top: 6px;\",\"ctrl-attrib.mapboxgl-compact::after\":'content: \"\"; cursor: pointer; position: absolute; background-image: url(\\'data:image/svg+xml;charset=utf-8,%3Csvg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"%3E %3Cpath fill=\"%23333333\" fill-rule=\"evenodd\" d=\"M4,10a6,6 0 1,0 12,0a6,6 0 1,0 -12,0 M9,7a1,1 0 1,0 2,0a1,1 0 1,0 -2,0 M9,10a1,1 0 1,1 2,0l0,3a1,1 0 1,1 -2,0\"/%3E %3C/svg%3E\\'); background-color: rgba(255, 255, 255, 0.5); width: 24px; height: 24px; box-sizing: border-box; border-radius: 12px;',\"ctrl-attrib.mapboxgl-compact\":\"min-height: 20px; padding: 0; margin: 10px; position: relative; background-color: #fff; border-radius: 3px 12px 12px 3px;\",\"ctrl-bottom-right > .mapboxgl-ctrl-attrib.mapboxgl-compact::after\":\"bottom: 0; right: 0\",\"ctrl-bottom-left > .mapboxgl-ctrl-attrib.mapboxgl-compact::after\":\"bottom: 0; left: 0\",\"ctrl-bottom-left .mapboxgl-ctrl\":\"margin: 0 0 10px 10px; float: left;\",\"ctrl-bottom-right .mapboxgl-ctrl\":\"margin: 0 10px 10px 0; float: right;\",\"ctrl-attrib\":\"color: rgba(0, 0, 0, 0.75); text-decoration: none; font-size: 12px\",\"ctrl-attrib a\":\"color: rgba(0, 0, 0, 0.75); text-decoration: none; font-size: 12px\",\"ctrl-attrib a:hover\":\"color: inherit; text-decoration: underline;\",\"ctrl-attrib .mapbox-improve-map\":\"font-weight: bold; margin-left: 2px;\",\"attrib-empty\":\"display: none;\",\"ctrl-logo\":'display:block; width: 21px; height: 21px; background-image: url(\\'data:image/svg+xml;charset=utf-8,%3C?xml version=\"1.0\" encoding=\"utf-8\"?%3E %3Csvg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 21 21\" style=\"enable-background:new 0 0 21 21;\" xml:space=\"preserve\"%3E%3Cg transform=\"translate(0,0.01)\"%3E%3Cpath d=\"m 10.5,1.24 c -5.11,0 -9.25,4.15 -9.25,9.25 0,5.1 4.15,9.25 9.25,9.25 5.1,0 9.25,-4.15 9.25,-9.25 0,-5.11 -4.14,-9.25 -9.25,-9.25 z m 4.39,11.53 c -1.93,1.93 -4.78,2.31 -6.7,2.31 -0.7,0 -1.41,-0.05 -2.1,-0.16 0,0 -1.02,-5.64 2.14,-8.81 0.83,-0.83 1.95,-1.28 3.13,-1.28 1.27,0 2.49,0.51 3.39,1.42 1.84,1.84 1.89,4.75 0.14,6.52 z\" style=\"opacity:0.9;fill:%23ffffff;enable-background:new\" class=\"st0\"/%3E%3Cpath d=\"M 10.5,-0.01 C 4.7,-0.01 0,4.7 0,10.49 c 0,5.79 4.7,10.5 10.5,10.5 5.8,0 10.5,-4.7 10.5,-10.5 C 20.99,4.7 16.3,-0.01 10.5,-0.01 Z m 0,19.75 c -5.11,0 -9.25,-4.15 -9.25,-9.25 0,-5.1 4.14,-9.26 9.25,-9.26 5.11,0 9.25,4.15 9.25,9.25 0,5.13 -4.14,9.26 -9.25,9.26 z\" style=\"opacity:0.35;enable-background:new\" class=\"st1\"/%3E%3Cpath d=\"M 14.74,6.25 C 12.9,4.41 9.98,4.35 8.23,6.1 5.07,9.27 6.09,14.91 6.09,14.91 c 0,0 5.64,1.02 8.81,-2.14 C 16.64,11 16.59,8.09 14.74,6.25 Z m -2.27,4.09 -0.91,1.87 -0.9,-1.87 -1.86,-0.91 1.86,-0.9 0.9,-1.87 0.91,1.87 1.86,0.9 z\" style=\"opacity:0.35;enable-background:new\" class=\"st1\"/%3E%3Cpolygon points=\"11.56,12.21 10.66,10.34 8.8,9.43 10.66,8.53 11.56,6.66 12.47,8.53 14.33,9.43 12.47,10.34 \" style=\"opacity:0.9;fill:%23ffffff;enable-background:new\" class=\"st0\"/%3E%3C/g%3E%3C/svg%3E\\')'}}},13056:function(t,e,r){\"use strict\";var n=r(71828);t.exports=function(t,e){var r=t.split(\" \"),i=r[0],a=r[1],o=n.isArrayOrTypedArray(e)?n.mean(e):e,s=.5+o/100,l=1.5+o/100,u=[\"\",\"\"],c=[0,0];switch(i){case\"top\":u[0]=\"top\",c[1]=-l;break;case\"bottom\":u[0]=\"bottom\",c[1]=l}switch(a){case\"left\":u[1]=\"right\",c[0]=-s;break;case\"right\":u[1]=\"left\",c[0]=s}return{anchor:u[0]&&u[1]?u.join(\"-\"):u[0]?u[0]:u[1]?u[1]:\"center\",offset:c}}},50101:function(t,e,r){\"use strict\";var n=r(44517),i=r(71828),a=i.strTranslate,o=i.strScale,s=r(27659).AU,l=r(77922),u=r(39898),c=r(91424),f=r(63893),h=r(10481),p=\"mapbox\",d=e.constants=r(77734);function v(t){return\"string\"==typeof t&&(-1!==d.styleValuesMapbox.indexOf(t)||0===t.indexOf(\"mapbox://\"))}e.name=p,e.attr=\"subplot\",e.idRoot=p,e.idRegex=e.attrRegex=i.counterRegex(p),e.attributes={subplot:{valType:\"subplotid\",dflt:\"mapbox\",editType:\"calc\"}},e.layoutAttributes=r(23585),e.supplyLayoutDefaults=r(77882),e.plot=function(t){var e=t._fullLayout,r=t.calcdata,a=e._subplots[p];if(n.version!==d.requiredVersion)throw new Error(d.wrongVersionErrorMsg);var o=function(t,e){var r=t._fullLayout;if(\"\"===t._context.mapboxAccessToken)return\"\";for(var n=[],a=[],o=!1,s=!1,l=0;l1&&i.warn(d.multipleTokensErrorMsg),n[0]):(a.length&&i.log([\"Listed mapbox access token(s)\",a.join(\",\"),\"but did not use a Mapbox map style, ignoring token(s).\"].join(\" \")),\"\")}(t,a);n.accessToken=o;for(var l=0;lw/2){var T=m.split(\"|\").join(\" \");b.text(T).attr(\"data-unformatted\",T).call(f.convertToTspans,t),_=c.bBox(b.node())}b.attr(\"transform\",a(-3,8-_.height)),x.insert(\"rect\",\".static-attribution\").attr({x:-_.width-6,y:-_.height-3,width:_.width+6,height:_.height+3,fill:\"rgba(255, 255, 255, 0.75)\"});var k=1;_.width+6>w&&(k=w/(_.width+6));var A=[n.l+n.w*h.x[1],n.t+n.h*(1-h.y[0])];x.attr(\"transform\",a(A[0],A[1])+o(k))}},e.updateFx=function(t){for(var e=t._fullLayout,r=e._subplots[p],n=0;n0){for(var r=0;r0}function c(t){var e={},r={};switch(t.type){case\"circle\":n.extendFlat(r,{\"circle-radius\":t.circle.radius,\"circle-color\":t.color,\"circle-opacity\":t.opacity});break;case\"line\":n.extendFlat(r,{\"line-width\":t.line.width,\"line-color\":t.color,\"line-opacity\":t.opacity,\"line-dasharray\":t.line.dash});break;case\"fill\":n.extendFlat(r,{\"fill-color\":t.color,\"fill-outline-color\":t.fill.outlinecolor,\"fill-opacity\":t.opacity});break;case\"symbol\":var i=t.symbol,o=a(i.textposition,i.iconsize);n.extendFlat(e,{\"icon-image\":i.icon+\"-15\",\"icon-size\":i.iconsize/10,\"text-field\":i.text,\"text-size\":i.textfont.size,\"text-anchor\":o.anchor,\"text-offset\":o.offset,\"symbol-placement\":i.placement}),n.extendFlat(r,{\"icon-color\":t.color,\"text-color\":i.textfont.color,\"text-opacity\":t.opacity});break;case\"raster\":n.extendFlat(r,{\"raster-fade-duration\":0,\"raster-opacity\":t.opacity})}return{layout:e,paint:r}}l.update=function(t){this.visible?this.needsNewImage(t)?this.updateImage(t):this.needsNewSource(t)?(this.removeLayer(),this.updateSource(t),this.updateLayer(t)):this.needsNewLayer(t)?this.updateLayer(t):this.updateStyle(t):(this.updateSource(t),this.updateLayer(t)),this.visible=u(t)},l.needsNewImage=function(t){return this.subplot.map.getSource(this.idSource)&&\"image\"===this.sourceType&&\"image\"===t.sourcetype&&(this.source!==t.source||JSON.stringify(this.coordinates)!==JSON.stringify(t.coordinates))},l.needsNewSource=function(t){return this.sourceType!==t.sourcetype||JSON.stringify(this.source)!==JSON.stringify(t.source)||this.layerType!==t.type},l.needsNewLayer=function(t){return this.layerType!==t.type||this.below!==this.subplot.belowLookup[\"layout-\"+this.index]},l.lookupBelow=function(){return this.subplot.belowLookup[\"layout-\"+this.index]},l.updateImage=function(t){this.subplot.map.getSource(this.idSource).updateImage({url:t.source,coordinates:t.coordinates});var e=this.findFollowingMapboxLayerId(this.lookupBelow());null!==e&&this.subplot.map.moveLayer(this.idLayer,e)},l.updateSource=function(t){var e=this.subplot.map;if(e.getSource(this.idSource)&&e.removeSource(this.idSource),this.sourceType=t.sourcetype,this.source=t.source,u(t)){var r=function(t){var e,r=t.sourcetype,n=t.source,a={type:r};return\"geojson\"===r?e=\"data\":\"vector\"===r?e=\"string\"==typeof n?\"url\":\"tiles\":\"raster\"===r?(e=\"tiles\",a.tileSize=256):\"image\"===r&&(e=\"url\",a.coordinates=t.coordinates),a[e]=n,t.sourceattribution&&(a.attribution=i(t.sourceattribution)),a}(t);e.addSource(this.idSource,r)}},l.findFollowingMapboxLayerId=function(t){if(\"traces\"===t)for(var e=this.subplot.getMapLayers(),r=0;r1)for(r=0;r-1&&g(e.originalEvent,n,[r.xaxis],[r.yaxis],r.id,t),i.indexOf(\"event\")>-1&&u.click(n,e.originalEvent)}}},b.updateFx=function(t){var e=this,r=e.map,n=e.gd;if(!e.isStatic){var a,o=t.dragmode;a=function(t,r){r.isRect?(t.range={})[e.id]=[u([r.xmin,r.ymin]),u([r.xmax,r.ymax])]:(t.lassoPoints={})[e.id]=r.map(u)};var s=e.dragOptions;e.dragOptions=i.extendDeep(s||{},{dragmode:t.dragmode,element:e.div,gd:n,plotinfo:{id:e.id,domain:t[e.id].domain,xaxis:e.xaxis,yaxis:e.yaxis,fillRangeItems:a},xaxes:[e.xaxis],yaxes:[e.yaxis],subplot:e.id}),r.off(\"click\",e.onClickInPanHandler),h(o)||f(o)?(r.dragPan.disable(),r.on(\"zoomstart\",e.clearOutline),e.dragOptions.prepFn=function(t,r,n){p(t,r,n,e.dragOptions,o)},l.init(e.dragOptions)):(r.dragPan.enable(),r.off(\"zoomstart\",e.clearOutline),e.div.onmousedown=null,e.div.ontouchstart=null,e.div.removeEventListener(\"touchstart\",e.div._ontouchstart),e.onClickInPanHandler=e.onClickInPanFn(e.dragOptions),r.on(\"click\",e.onClickInPanHandler))}function u(t){var r=e.map.unproject(t);return[r.lng,r.lat]}},b.updateFramework=function(t){var e=t[this.id].domain,r=t._size,n=this.div.style;n.width=r.w*(e.x[1]-e.x[0])+\"px\",n.height=r.h*(e.y[1]-e.y[0])+\"px\",n.left=r.l+e.x[0]*r.w+\"px\",n.top=r.t+(1-e.y[1])*r.h+\"px\",this.xaxis._offset=r.l+e.x[0]*r.w,this.xaxis._length=r.w*(e.x[1]-e.x[0]),this.yaxis._offset=r.t+(1-e.y[1])*r.h,this.yaxis._length=r.h*(e.y[1]-e.y[0])},b.updateLayers=function(t){var e,r=t[this.id].layers,n=this.layerList;if(r.length!==n.length){for(e=0;e=e.width-20?(a[\"text-anchor\"]=\"start\",a.x=5):(a[\"text-anchor\"]=\"end\",a.x=e._paper.attr(\"width\")-7),r.attr(a);var o=r.select(\".js-link-to-tool\"),s=r.select(\".js-link-spacer\"),l=r.select(\".js-sourcelinks\");t._context.showSources&&t._context.showSources(t),t._context.showLink&&function(t,e){e.text(\"\");var r=e.append(\"a\").attr({\"xlink:xlink:href\":\"#\",class:\"link--impt link--embedview\",\"font-weight\":\"bold\"}).text(t._context.linkText+\" \"+String.fromCharCode(187));if(t._context.sendData)r.on(\"click\",(function(){_.sendDataToCloud(t)}));else{var n=window.location.pathname.split(\"/\"),i=window.location.search;r.attr({\"xlink:xlink:show\":\"new\",\"xlink:xlink:href\":\"/\"+n[2].split(\".\")[0]+\"/\"+n[1]+i})}}(t,o),s.text(o.text()&&l.text()?\" - \":\"\")}},_.sendDataToCloud=function(t){var e=(window.PLOTLYENV||{}).BASE_URL||t._context.plotlyServerURL;if(e){t.emit(\"plotly_beforeexport\");var r=n.select(t).append(\"div\").attr(\"id\",\"hiddenform\").style(\"display\",\"none\"),i=r.append(\"form\").attr({action:e+\"/external\",method:\"post\",target:\"_blank\"});return i.append(\"input\").attr({type:\"text\",name:\"data\"}).node().value=_.graphJson(t,!1,\"keepdata\"),i.node().submit(),r.remove(),t.emit(\"plotly_afterexport\"),!1}};var k=[\"days\",\"shortDays\",\"months\",\"shortMonths\",\"periods\",\"dateTime\",\"date\",\"time\",\"decimal\",\"thousands\",\"grouping\",\"currency\"],A=[\"year\",\"month\",\"dayMonth\",\"dayMonthYear\"];function M(t,e){var r=t._context.locale;r||(r=\"en-US\");var n=!1,i={};function a(t){for(var r=!0,a=0;a1&&D.length>1){for(s.getComponentMethod(\"grid\",\"sizeDefaults\")(u,l),o=0;o15&&D.length>15&&0===l.shapes.length&&0===l.images.length,_.linkSubplots(h,l,f,n),_.cleanPlot(h,l,f,n);var N=!(!n._has||!n._has(\"gl2d\")),j=!(!l._has||!l._has(\"gl2d\")),U=!(!n._has||!n._has(\"cartesian\"))||N,V=!(!l._has||!l._has(\"cartesian\"))||j;U&&!V?n._bgLayer.remove():V&&!U&&(l._shouldCreateBgLayer=!0),n._zoomlayer&&!t._dragging&&d({_fullLayout:n}),function(t,e){var r,n=[];e.meta&&(r=e._meta={meta:e.meta,layout:{meta:e.meta}});for(var i=0;i0){var f=1-2*s;n=Math.round(f*n),i=Math.round(f*i)}}var h=_.layoutAttributes.width.min,p=_.layoutAttributes.height.min;n1,v=!e.height&&Math.abs(r.height-i)>1;(v||d)&&(d&&(r.width=n),v&&(r.height=i)),t._initialAutoSize||(t._initialAutoSize={width:n,height:i}),_.sanitizeMargins(r)},_.supplyLayoutModuleDefaults=function(t,e,r,n){var i,a,o,l=s.componentsRegistry,u=e._basePlotModules,f=s.subplotsRegistry.cartesian;for(i in l)(o=l[i]).includeBasePlot&&o.includeBasePlot(t,e);for(var h in u.length||u.push(f),e._has(\"cartesian\")&&(s.getComponentMethod(\"grid\",\"contentDefaults\")(t,e),f.finalizeSubplots(t,e)),e._subplots)e._subplots[h].sort(c.subplotSort);for(a=0;a1&&(r.l/=y,r.r/=y)}if(p){var m=(r.t+r.b)/p;m>1&&(r.t/=m,r.b/=m)}var x=void 0!==r.xl?r.xl:r.x,b=void 0!==r.xr?r.xr:r.x,w=void 0!==r.yt?r.yt:r.y,T=void 0!==r.yb?r.yb:r.y;d[e]={l:{val:x,size:r.l+g},r:{val:b,size:r.r+g},b:{val:T,size:r.b+g},t:{val:w,size:r.t+g}},v[e]=1}else delete d[e],delete v[e];if(!n._replotting)return _.doAutoMargin(t)}},_.doAutoMargin=function(t){var e=t._fullLayout,r=e.width,n=e.height;e._size||(e._size={}),P(e);var i=e._size,a=e.margin,l={t:0,b:0,l:0,r:0},u=c.extendFlat({},i),f=a.l,h=a.r,d=a.t,v=a.b,g=e._pushmargin,y=e._pushmarginIds,m=e.minreducedwidth,x=e.minreducedheight;if(!1!==a.autoexpand){for(var b in g)y[b]||delete g[b];var w=t._fullLayout._reservedMargin;for(var T in w)for(var k in w[T]){var A=w[T][k];l[k]=Math.max(l[k],A)}for(var M in g.base={l:{val:0,size:f},r:{val:1,size:h},t:{val:1,size:d},b:{val:0,size:v}},l){var S=0;for(var E in g)\"base\"!==E&&o(g[E][M].size)&&(S=g[E][M].size>S?g[E][M].size:S);var L=Math.max(0,a[M]-S);l[M]=Math.max(0,l[M]-L)}for(var C in g){var O=g[C].l||{},I=g[C].b||{},D=O.val,z=O.size,R=I.val,F=I.size,B=r-l.r-l.l,N=n-l.t-l.b;for(var j in g){if(o(z)&&g[j].r){var U=g[j].r.val,V=g[j].r.size;if(U>D){var H=(z*U+(V-B)*D)/(U-D),q=(V*(1-D)+(z-B)*(1-U))/(U-D);H+q>f+h&&(f=H,h=q)}}if(o(F)&&g[j].t){var G=g[j].t.val,Z=g[j].t.size;if(G>R){var Y=(F*G+(Z-N)*R)/(G-R),W=(Z*(1-R)+(F-N)*(1-G))/(G-R);Y+W>v+d&&(v=Y,d=W)}}}}}var X=c.constrain(r-a.l-a.r,2,m),J=c.constrain(n-a.t-a.b,2,x),K=Math.max(0,r-X),$=Math.max(0,n-J);if(K){var Q=(f+h)/K;Q>1&&(f/=Q,h/=Q)}if($){var tt=(v+d)/$;tt>1&&(v/=tt,d/=tt)}if(i.l=Math.round(f)+l.l,i.r=Math.round(h)+l.r,i.t=Math.round(d)+l.t,i.b=Math.round(v)+l.b,i.p=Math.round(a.pad),i.w=Math.round(r)-i.l-i.r,i.h=Math.round(n)-i.t-i.b,!e._replotting&&(_.didMarginChange(u,i)||function(t){if(\"_redrawFromAutoMarginCount\"in t._fullLayout)return!1;var e=p.list(t,\"\",!0);for(var r in e)if(e[r].autoshift||e[r].shift)return!0;return!1}(t))){\"_redrawFromAutoMarginCount\"in e?e._redrawFromAutoMarginCount++:e._redrawFromAutoMarginCount=1;var et=3*(1+Object.keys(y).length);if(e._redrawFromAutoMarginCount0&&(t._transitioningWithDuration=!0),t._transitionData._interruptCallbacks.push((function(){n=!0})),r.redraw&&t._transitionData._interruptCallbacks.push((function(){return s.call(\"redraw\",t)})),t._transitionData._interruptCallbacks.push((function(){t.emit(\"plotly_transitioninterrupted\",[])}));var a=0,o=0;function l(){return a++,function(){var e;o++,n||o!==a||(e=i,t._transitionData&&(function(t){if(t)for(;t.length;)t.shift()}(t._transitionData._interruptCallbacks),Promise.resolve().then((function(){if(r.redraw)return s.call(\"redraw\",t)})).then((function(){t._transitioning=!1,t._transitioningWithDuration=!1,t.emit(\"plotly_transitioned\",[])})).then(e)))}}r.runFn(l),setTimeout(l())}))}],a=c.syncOrAsync(i,t);return a&&a.then||(a=Promise.resolve()),a.then((function(){return t}))}_.didMarginChange=function(t,e){for(var r=0;r1)return!0}return!1},_.graphJson=function(t,e,r,n,i,a){(i&&e&&!t._fullData||i&&!e&&!t._fullLayout)&&_.supplyDefaults(t);var o=i?t._fullData:t.data,s=i?t._fullLayout:t.layout,l=(t._transitionData||{})._frames;function u(t,e){if(\"function\"==typeof t)return e?\"_function_\":null;if(c.isPlainObject(t)){var n,i={};return Object.keys(t).sort().forEach((function(a){if(-1===[\"_\",\"[\"].indexOf(a.charAt(0)))if(\"function\"!=typeof t[a]){if(\"keepdata\"===r){if(\"src\"===a.substr(a.length-3))return}else if(\"keepstream\"===r){if(\"string\"==typeof(n=t[a+\"src\"])&&n.indexOf(\":\")>0&&!c.isPlainObject(t.stream))return}else if(\"keepall\"!==r&&\"string\"==typeof(n=t[a+\"src\"])&&n.indexOf(\":\")>0)return;i[a]=u(t[a],e)}else e&&(i[a]=\"_function\")})),i}return Array.isArray(t)?t.map((function(t){return u(t,e)})):c.isTypedArray(t)?c.simpleMap(t,c.identity):c.isJSDate(t)?c.ms2DateTimeLocal(+t):t}var f={data:(o||[]).map((function(t){var r=u(t);return e&&delete r.fit,r}))};if(!e&&(f.layout=u(s),i)){var h=s._size;f.layout.computed={margin:{b:h.b,l:h.l,r:h.r,t:h.t}}}return l&&(f.frames=u(l)),a&&(f.config=u(t._context,!0)),\"object\"===n?f:JSON.stringify(f)},_.modifyFrames=function(t,e){var r,n,i,a=t._transitionData._frames,o=t._transitionData._frameHash;for(r=0;r=0;a--)if(s[a].enabled){r._indexToPoints=s[a]._indexToPoints;break}n&&n.calc&&(o=n.calc(t,r))}Array.isArray(o)&&o[0]||(o=[{x:h,y:h}]),o[0].t||(o[0].t={}),o[0].trace=r,d[e]=o}}for(z(o,u,f),i=0;i1e-10?t:0}function h(t,e,r){e=e||0,r=r||0;for(var n=t.length,i=new Array(n),a=0;a0?r:1/0})),i=n.mod(r+1,e.length);return[e[r],e[i]]},findIntersectionXY:u,findXYatLength:function(t,e,r,n){var i=-e*r,a=e*e+1,o=2*(e*i-r),s=i*i+r*r-t*t,l=Math.sqrt(o*o-4*a*s),u=(-o+l)/(2*a),c=(-o-l)/(2*a);return[[u,e*u+i+n],[c,e*c+i+n]]},clampTiny:f,pathPolygon:function(t,e,r,n,i,a){return\"M\"+h(c(t,e,r,n),i,a).join(\"L\")},pathPolygonAnnulus:function(t,e,r,n,i,a,o){var s,l;t=90||i>90&&a>=450?1:s<=0&&u<=0?0:Math.max(s,u),[i<=180&&a>=180||i>180&&a>=540?-1:o>=0&&l>=0?0:Math.min(o,l),i<=270&&a>=270||i>270&&a>=630?-1:s>=0&&u>=0?0:Math.min(s,u),a>=360?1:o<=0&&l<=0?0:Math.max(o,l),e]}(d),_=b[2]-b[0],w=b[3]-b[1],T=p/h,k=Math.abs(w/_);T>k?(v=h,x=(p-(g=h*k))/i.h/2,y=[s[0],s[1]],m=[f[0]+x,f[1]-x]):(g=p,x=(h-(v=p/k))/i.w/2,y=[s[0]+x,s[1]-x],m=[f[0],f[1]]),r.xLength2=v,r.yLength2=g,r.xDomain2=y,r.yDomain2=m;var A,M=r.xOffset2=i.l+i.w*y[0],S=r.yOffset2=i.t+i.h*(1-m[1]),E=r.radius=v/_,L=r.innerRadius=r.getHole(e)*E,C=r.cx=M-E*b[0],P=r.cy=S+E*b[3],O=r.cxx=C-M,I=r.cyy=P-S,D=a.side;\"counterclockwise\"===D?(A=D,D=\"top\"):\"clockwise\"===D&&(A=D,D=\"bottom\"),r.radialAxis=r.mockAxis(t,e,a,{_id:\"x\",side:D,_trueSide:A,domain:[L/i.w,E/i.w]}),r.angularAxis=r.mockAxis(t,e,o,{side:\"right\",domain:[0,Math.PI],autorange:!1}),r.doAutoRange(t,e),r.updateAngularAxis(t,e),r.updateRadialAxis(t,e),r.updateRadialAxisTitle(t,e),r.xaxis=r.mockCartesianAxis(t,e,{_id:\"x\",domain:y}),r.yaxis=r.mockCartesianAxis(t,e,{_id:\"y\",domain:m});var F=r.pathSubplot();r.clipPaths.forTraces.select(\"path\").attr(\"d\",F).attr(\"transform\",l(O,I)),n.frontplot.attr(\"transform\",l(M,S)).call(c.setClipUrl,r._hasClipOnAxisFalse?null:r.clipIds.forTraces,r.gd),n.bg.attr(\"d\",F).attr(\"transform\",l(C,P)).call(u.fill,e.bgcolor)},N.mockAxis=function(t,e,r,n){var i=o.extendFlat({},r,n);return d(i,e,t),i},N.mockCartesianAxis=function(t,e,r){var n=this,i=n.isSmith,a=r._id,s=o.extendFlat({type:\"linear\"},r);p(s,t);var l={x:[0,2],y:[1,3]};return s.setRange=function(){var t=n.sectorBBox,r=l[a],i=n.radialAxis._rl,o=(i[1]-i[0])/(1-n.getHole(e));s.range=[t[r[0]]*o,t[r[1]]*o]},s.isPtWithinRange=\"x\"!==a||i?function(){return!0}:function(t){return n.isPtInside(t)},s.setRange(),s.setScale(),s},N.doAutoRange=function(t,e){var r=this,n=r.gd,i=r.radialAxis,a=r.getRadial(e);v(n,i);var o=i.range;a.range=o.slice(),a._input.range=o.slice(),i._rl=[i.r2l(o[0],null,\"gregorian\"),i.r2l(o[1],null,\"gregorian\")]},N.updateRadialAxis=function(t,e){var r=this,n=r.gd,i=r.layers,a=r.radius,c=r.innerRadius,f=r.cx,p=r.cy,d=r.getRadial(e),v=z(r.getSector(e)[0],360),g=r.radialAxis,y=c90&&v<=270&&(g.tickangle=180);var x=m?function(t){var e=I(r,C([t.x,0]));return l(e[0]-f,e[1]-p)}:function(t){return l(g.l2p(t.x)+c,0)},b=m?function(t){return O(r,t.x,-1/0,1/0)}:function(t){return r.pathArc(g.r2p(t.x)+c)},_=j(d);if(r.radialTickLayout!==_&&(i[\"radial-axis\"].selectAll(\".xtick\").remove(),r.radialTickLayout=_),y){g.setScale();var w=0,T=m?(g.tickvals||[]).filter((function(t){return t>=0})).map((function(t){return h.tickText(g,t,!0,!1)})):h.calcTicks(g),k=m?T:h.clipEnds(g,T),A=h.getTickSigns(g)[2];m&&((\"top\"===g.ticks&&\"bottom\"===g.side||\"bottom\"===g.ticks&&\"top\"===g.side)&&(A=-A),\"top\"===g.ticks&&\"top\"===g.side&&(w=-g.ticklen),\"bottom\"===g.ticks&&\"bottom\"===g.side&&(w=g.ticklen)),h.drawTicks(n,g,{vals:T,layer:i[\"radial-axis\"],path:h.makeTickPath(g,0,A),transFn:x,crisp:!1}),h.drawGrid(n,g,{vals:k,layer:i[\"radial-grid\"],path:b,transFn:o.noop,crisp:!1}),h.drawLabels(n,g,{vals:T,layer:i[\"radial-axis\"],transFn:x,labelFns:h.makeLabelFns(g,w)})}var M=r.radialAxisAngle=r.vangles?F(U(R(d.angle),r.vangles)):d.angle,S=l(f,p),E=S+s(-M);V(i[\"radial-axis\"],y&&(d.showticklabels||d.ticks),{transform:E}),V(i[\"radial-grid\"],y&&d.showgrid,{transform:m?\"\":S}),V(i[\"radial-line\"].select(\"line\"),y&&d.showline,{x1:m?-a:c,y1:0,x2:a,y2:0,transform:E}).attr(\"stroke-width\",d.linewidth).call(u.stroke,d.linecolor)},N.updateRadialAxisTitle=function(t,e,r){if(!this.isSmith){var n=this,i=n.gd,a=n.radius,o=n.cx,s=n.cy,l=n.getRadial(e),u=n.id+\"title\",f=0;if(l.title){var h=c.bBox(n.layers[\"radial-axis\"].node()).height,p=l.title.font.size,d=l.side;f=\"top\"===d?p:\"counterclockwise\"===d?-(h+.4*p):h+.8*p}var v=void 0!==r?r:n.radialAxisAngle,g=R(v),y=Math.cos(g),m=Math.sin(g),b=o+a/2*y+f*m,_=s-a/2*m+f*y;n.layers[\"radial-axis-title\"]=x.draw(i,u,{propContainer:l,propName:n.id+\".radialaxis.title\",placeholder:D(i,\"Click to enter radial axis title\"),attributes:{x:b,y:_,\"text-anchor\":\"middle\"},transform:{rotate:-v}})}},N.updateAngularAxis=function(t,e){var r=this,n=r.gd,i=r.layers,a=r.radius,c=r.innerRadius,f=r.cx,p=r.cy,d=r.getAngular(e),v=r.angularAxis,g=r.isSmith;g||(r.fillViewInitialKey(\"angularaxis.rotation\",d.rotation),v.setGeometry(),v.setScale());var y=g?function(t){var e=I(r,C([0,t.x]));return Math.atan2(e[0]-f,e[1]-p)-Math.PI/2}:function(t){return v.t2g(t.x)};\"linear\"===v.type&&\"radians\"===v.thetaunit&&(v.tick0=F(v.tick0),v.dtick=F(v.dtick));var m=function(t){return l(f+a*Math.cos(t),p-a*Math.sin(t))},x=g?function(t){var e=I(r,C([0,t.x]));return l(e[0],e[1])}:function(t){return m(y(t))},b=g?function(t){var e=I(r,C([0,t.x])),n=Math.atan2(e[0]-f,e[1]-p)-Math.PI/2;return l(e[0],e[1])+s(-F(n))}:function(t){var e=y(t);return m(e)+s(-F(e))},_=g?function(t){return P(r,t.x,0,1/0)}:function(t){var e=y(t),r=Math.cos(e),n=Math.sin(e);return\"M\"+[f+c*r,p-c*n]+\"L\"+[f+a*r,p-a*n]},w=h.makeLabelFns(v,0).labelStandoff,T={xFn:function(t){var e=y(t);return Math.cos(e)*w},yFn:function(t){var e=y(t),r=Math.sin(e)>0?.2:1;return-Math.sin(e)*(w+t.fontSize*r)+Math.abs(Math.cos(e))*(t.fontSize*M)},anchorFn:function(t){var e=y(t),r=Math.cos(e);return Math.abs(r)<.1?\"middle\":r>0?\"start\":\"end\"},heightFn:function(t,e,r){var n=y(t);return-.5*(1+Math.sin(n))*r}},k=j(d);r.angularTickLayout!==k&&(i[\"angular-axis\"].selectAll(\".\"+v._id+\"tick\").remove(),r.angularTickLayout=k);var A,S=g?[1/0].concat(v.tickvals||[]).map((function(t){return h.tickText(v,t,!0,!1)})):h.calcTicks(v);if(g&&(S[0].text=\"∞\",S[0].fontSize*=1.75),\"linear\"===e.gridshape?(A=S.map(y),o.angleDelta(A[0],A[1])<0&&(A=A.slice().reverse())):A=null,r.vangles=A,\"category\"===v.type&&(S=S.filter((function(t){return o.isAngleInsideSector(y(t),r.sectorInRad)}))),v.visible){var E=\"inside\"===v.ticks?-1:1,L=(v.linewidth||1)/2;h.drawTicks(n,v,{vals:S,layer:i[\"angular-axis\"],path:\"M\"+E*L+\",0h\"+E*v.ticklen,transFn:b,crisp:!1}),h.drawGrid(n,v,{vals:S,layer:i[\"angular-grid\"],path:_,transFn:o.noop,crisp:!1}),h.drawLabels(n,v,{vals:S,layer:i[\"angular-axis\"],repositionOnUpdate:!0,transFn:x,labelFns:T})}V(i[\"angular-line\"].select(\"path\"),d.showline,{d:r.pathSubplot(),transform:l(f,p)}).attr(\"stroke-width\",d.linewidth).call(u.stroke,d.linecolor)},N.updateFx=function(t,e){this.gd._context.staticPlot||(!this.isSmith&&(this.updateAngularDrag(t),this.updateRadialDrag(t,e,0),this.updateRadialDrag(t,e,1)),this.updateHoverAndMainDrag(t))},N.updateHoverAndMainDrag=function(t){var e,r,s=this,u=s.isSmith,c=s.gd,f=s.layers,h=t._zoomlayer,p=S.MINZOOM,d=S.OFFEDGE,v=s.radius,x=s.innerRadius,T=s.cx,k=s.cy,A=s.cxx,M=s.cyy,L=s.sectorInRad,C=s.vangles,P=s.radialAxis,O=E.clampTiny,I=E.findXYatLength,D=E.findEnclosingVertexAngles,z=S.cornerHalfWidth,R=S.cornerLen/2,F=g.makeDragger(f,\"path\",\"maindrag\",!1===t.dragmode?\"none\":\"crosshair\");n.select(F).attr(\"d\",s.pathSubplot()).attr(\"transform\",l(T,k)),F.onmousemove=function(t){m.hover(c,t,s.id),c._fullLayout._lasthover=F,c._fullLayout._hoversubplot=s.id},F.onmouseout=function(t){c._dragging||y.unhover(c,t)};var B,N,j,U,V,H,q,G,Z,Y={element:F,gd:c,subplot:s.id,plotinfo:{id:s.id,xaxis:s.xaxis,yaxis:s.yaxis},xaxes:[s.xaxis],yaxes:[s.yaxis]};function W(t,e){return Math.sqrt(t*t+e*e)}function X(t,e){return W(t-A,e-M)}function J(t,e){return Math.atan2(M-e,t-A)}function K(t,e){return[t*Math.cos(e),t*Math.sin(-e)]}function $(t,e){if(0===t)return s.pathSector(2*z);var r=R/t,n=e-r,i=e+r,a=Math.max(0,Math.min(t,v)),o=a-z,l=a+z;return\"M\"+K(o,n)+\"A\"+[o,o]+\" 0,0,0 \"+K(o,i)+\"L\"+K(l,i)+\"A\"+[l,l]+\" 0,0,1 \"+K(l,n)+\"Z\"}function Q(t,e,r){if(0===t)return s.pathSector(2*z);var n,i,a=K(t,e),o=K(t,r),l=O((a[0]+o[0])/2),u=O((a[1]+o[1])/2);if(l&&u){var c=u/l,f=-1/c,h=I(z,c,l,u);n=I(R,f,h[0][0],h[0][1]),i=I(R,f,h[1][0],h[1][1])}else{var p,d;u?(p=R,d=z):(p=z,d=R),n=[[l-p,u-d],[l+p,u-d]],i=[[l-p,u+d],[l+p,u+d]]}return\"M\"+n.join(\"L\")+\"L\"+i.reverse().join(\"L\")+\"Z\"}function tt(t,e){return e=Math.max(Math.min(e,v),x),tp?(t-1&&1===t&&_(e,c,[s.xaxis],[s.yaxis],s.id,Y),r.indexOf(\"event\")>-1&&m.click(c,e,s.id)}Y.prepFn=function(t,n,a){var l=c._fullLayout.dragmode,f=F.getBoundingClientRect();c._fullLayout._calcInverseTransform(c);var p=c._fullLayout._invTransform;e=c._fullLayout._invScaleX,r=c._fullLayout._invScaleY;var d=o.apply3DTransform(p)(n-f.left,a-f.top);if(B=d[0],N=d[1],C){var y=E.findPolygonOffset(v,L[0],L[1],C);B+=A+y[0],N+=M+y[1]}switch(l){case\"zoom\":Y.clickFn=st,u||(Y.moveFn=C?it:rt,Y.doneFn=at,function(){j=null,U=null,V=s.pathSubplot(),H=!1;var t=c._fullLayout[s.id];q=i(t.bgcolor).getLuminance(),(G=g.makeZoombox(h,q,T,k,V)).attr(\"fill-rule\",\"evenodd\"),Z=g.makeCorners(h,T,k),w(c)}());break;case\"select\":case\"lasso\":b(t,n,a,Y,l)}},y.init(Y)},N.updateRadialDrag=function(t,e,r){var i=this,u=i.gd,c=i.layers,f=i.radius,h=i.innerRadius,p=i.cx,d=i.cy,v=i.radialAxis,m=S.radialDragBoxSize,x=m/2;if(v.visible){var b,_,T,M=R(i.radialAxisAngle),E=v._rl,L=E[0],C=E[1],P=E[r],O=.75*(E[1]-E[0])/(1-i.getHole(e))/f;r?(b=p+(f+x)*Math.cos(M),_=d-(f+x)*Math.sin(M),T=\"radialdrag\"):(b=p+(h-x)*Math.cos(M),_=d-(h-x)*Math.sin(M),T=\"radialdrag-inner\");var I,D,z,B=g.makeRectDragger(c,T,\"crosshair\",-x,-x,m,m),N={element:B,gd:u};!1===t.dragmode&&(N.dragmode=!1),V(n.select(B),v.visible&&h0==(r?z>L:zn?function(t){return t<=0}:function(t){return t>=0};t.c2g=function(r){var n=t.c2l(r)-e;return(s(n)?n:0)+o},t.g2c=function(r){return t.l2c(r+e-o)},t.g2p=function(t){return t*a},t.c2p=function(e){return t.g2p(t.c2g(e))}}}(t,e);break;case\"angularaxis\":!function(t,e){var r=t.type;if(\"linear\"===r){var i=t.d2c,s=t.c2d;t.d2c=function(t,e){return function(t,e){return\"degrees\"===e?a(t):t}(i(t),e)},t.c2d=function(t,e){return s(function(t,e){return\"degrees\"===e?o(t):t}(t,e))}}t.makeCalcdata=function(e,i){var a,o,s=e[i],l=e._length,u=function(r){return t.d2c(r,e.thetaunit)};if(s){if(n.isTypedArray(s)&&\"linear\"===r){if(l===s.length)return s;if(s.subarray)return s.subarray(0,l)}for(a=new Array(l),o=0;o0?1:0}function r(t){var e=t[0],r=t[1];if(!isFinite(e)||!isFinite(r))return[1,0];var n=(e+1)*(e+1)+r*r;return[(e*e+r*r-1)/n,2*r/n]}function n(t,e){var r=e[0],n=e[1];return[r*t.radius+t.cx,-n*t.radius+t.cy]}function i(t,e){return e*t.radius}t.exports={smith:r,reactanceArc:function(t,e,a,o){var s=n(t,r([a,e])),l=s[0],u=s[1],c=n(t,r([o,e])),f=c[0],h=c[1];if(0===e)return[\"M\"+l+\",\"+u,\"L\"+f+\",\"+h].join(\" \");var p=i(t,1/Math.abs(e));return[\"M\"+l+\",\"+u,\"A\"+p+\",\"+p+\" 0 0,\"+(e<0?1:0)+\" \"+f+\",\"+h].join(\" \")},resistanceArc:function(t,a,o,s){var l=i(t,1/(a+1)),u=n(t,r([a,o])),c=u[0],f=u[1],h=n(t,r([a,s])),p=h[0],d=h[1];if(e(o)!==e(s)){var v=n(t,r([a,0]));return[\"M\"+c+\",\"+f,\"A\"+l+\",\"+l+\" 0 0,\"+(00){for(var n=[],i=0;i=c&&(h.min=0,d.min=0,g.min=0,t.aaxis&&delete t.aaxis.min,t.baxis&&delete t.baxis.min,t.caxis&&delete t.caxis.min)}function v(t,e,r,n){var i=h[e._name];function o(r,n){return a.coerce(t,e,i,r,n)}o(\"uirevision\",n.uirevision),e.type=\"linear\";var p=o(\"color\"),d=p!==i.color.dflt?p:r.font.color,v=e._name.charAt(0).toUpperCase(),g=\"Component \"+v,y=o(\"title.text\",g);e._hovertitle=y===g?y:v,a.coerceFont(o,\"title.font\",{family:r.font.family,size:a.bigFont(r.font.size),color:d}),o(\"min\"),c(t,e,o,\"linear\"),l(t,e,o,\"linear\"),s(t,e,o,\"linear\"),u(t,e,o,{outerTicks:!0}),o(\"showticklabels\")&&(a.coerceFont(o,\"tickfont\",{family:r.font.family,size:r.font.size,color:d}),o(\"tickangle\"),o(\"tickformat\")),f(t,e,o,{dfltColor:p,bgColor:r.bgColor,blend:60,showLine:!0,showGrid:!0,noZeroLine:!0,attributes:i}),o(\"hoverformat\"),o(\"layer\")}t.exports=function(t,e,r){o(t,e,r,{type:\"ternary\",attributes:h,handleDefaults:d,font:e.font,paper_bgcolor:e.paper_bgcolor})}},64380:function(t,e,r){\"use strict\";var n=r(39898),i=r(84267),a=r(73972),o=r(71828),s=o.strTranslate,l=o._,u=r(7901),c=r(91424),f=r(21994),h=r(1426).extendFlat,p=r(74875),d=r(89298),v=r(28569),g=r(30211),y=r(64505),m=y.freeMode,x=y.rectMode,b=r(92998),_=r(47322).prepSelect,w=r(47322).selectOnClick,T=r(47322).clearOutline,k=r(47322).clearSelectionsCache,A=r(85555);function M(t,e){this.id=t.id,this.graphDiv=t.graphDiv,this.init(e),this.makeFramework(e),this.aTickLayout=null,this.bTickLayout=null,this.cTickLayout=null}t.exports=M;var S=M.prototype;S.init=function(t){this.container=t._ternarylayer,this.defs=t._defs,this.layoutId=t._uid,this.traceHash={},this.layers={}},S.plot=function(t,e){var r=this,n=e[r.id],i=e._size;r._hasClipOnAxisFalse=!1;for(var a=0;aE*b?i=(a=b)*E:a=(i=x)/E,o=y*i/x,l=m*a/b,r=e.l+e.w*v-i/2,n=e.t+e.h*(1-g)-a/2,p.x0=r,p.y0=n,p.w=i,p.h=a,p.sum=_,p.xaxis={type:\"linear\",range:[w+2*k-_,_-w-2*T],domain:[v-o/2,v+o/2],_id:\"x\"},f(p.xaxis,p.graphDiv._fullLayout),p.xaxis.setScale(),p.xaxis.isPtWithinRange=function(t){return t.a>=p.aaxis.range[0]&&t.a<=p.aaxis.range[1]&&t.b>=p.baxis.range[1]&&t.b<=p.baxis.range[0]&&t.c>=p.caxis.range[1]&&t.c<=p.caxis.range[0]},p.yaxis={type:\"linear\",range:[w,_-T-k],domain:[g-l/2,g+l/2],_id:\"y\"},f(p.yaxis,p.graphDiv._fullLayout),p.yaxis.setScale(),p.yaxis.isPtWithinRange=function(){return!0};var A=p.yaxis.domain[0],M=p.aaxis=h({},t.aaxis,{range:[w,_-T-k],side:\"left\",tickangle:(+t.aaxis.tickangle||0)-30,domain:[A,A+l*E],anchor:\"free\",position:0,_id:\"y\",_length:i});f(M,p.graphDiv._fullLayout),M.setScale();var S=p.baxis=h({},t.baxis,{range:[_-w-k,T],side:\"bottom\",domain:p.xaxis.domain,anchor:\"free\",position:0,_id:\"x\",_length:i});f(S,p.graphDiv._fullLayout),S.setScale();var L=p.caxis=h({},t.caxis,{range:[_-w-T,k],side:\"right\",tickangle:(+t.caxis.tickangle||0)+30,domain:[A,A+l*E],anchor:\"free\",position:0,_id:\"y\",_length:i});f(L,p.graphDiv._fullLayout),L.setScale();var C=\"M\"+r+\",\"+(n+a)+\"h\"+i+\"l-\"+i/2+\",-\"+a+\"Z\";p.clipDef.select(\"path\").attr(\"d\",C),p.layers.plotbg.select(\"path\").attr(\"d\",C);var P=\"M0,\"+a+\"h\"+i+\"l-\"+i/2+\",-\"+a+\"Z\";p.clipDefRelative.select(\"path\").attr(\"d\",P);var O=s(r,n);p.plotContainer.selectAll(\".scatterlayer,.maplayer\").attr(\"transform\",O),p.clipDefRelative.select(\"path\").attr(\"transform\",null);var I=s(r-S._offset,n+a);p.layers.baxis.attr(\"transform\",I),p.layers.bgrid.attr(\"transform\",I);var D=s(r+i/2,n)+\"rotate(30)\"+s(0,-M._offset);p.layers.aaxis.attr(\"transform\",D),p.layers.agrid.attr(\"transform\",D);var z=s(r+i/2,n)+\"rotate(-30)\"+s(0,-L._offset);p.layers.caxis.attr(\"transform\",z),p.layers.cgrid.attr(\"transform\",z),p.drawAxes(!0),p.layers.aline.select(\"path\").attr(\"d\",M.showline?\"M\"+r+\",\"+(n+a)+\"l\"+i/2+\",-\"+a:\"M0,0\").call(u.stroke,M.linecolor||\"#000\").style(\"stroke-width\",(M.linewidth||0)+\"px\"),p.layers.bline.select(\"path\").attr(\"d\",S.showline?\"M\"+r+\",\"+(n+a)+\"h\"+i:\"M0,0\").call(u.stroke,S.linecolor||\"#000\").style(\"stroke-width\",(S.linewidth||0)+\"px\"),p.layers.cline.select(\"path\").attr(\"d\",L.showline?\"M\"+(r+i/2)+\",\"+n+\"l\"+i/2+\",\"+a:\"M0,0\").call(u.stroke,L.linecolor||\"#000\").style(\"stroke-width\",(L.linewidth||0)+\"px\"),p.graphDiv._context.staticPlot||p.initInteractions(),c.setClipUrl(p.layers.frontplot,p._hasClipOnAxisFalse?null:p.clipId,p.graphDiv)},S.drawAxes=function(t){var e=this,r=e.graphDiv,n=e.id.substr(7)+\"title\",i=e.layers,a=e.aaxis,o=e.baxis,s=e.caxis;if(e.drawAx(a),e.drawAx(o),e.drawAx(s),t){var u=Math.max(a.showticklabels?a.tickfont.size/2:0,(s.showticklabels?.75*s.tickfont.size:0)+(\"outside\"===s.ticks?.87*s.ticklen:0)),c=(o.showticklabels?o.tickfont.size:0)+(\"outside\"===o.ticks?o.ticklen:0)+3;i[\"a-title\"]=b.draw(r,\"a\"+n,{propContainer:a,propName:e.id+\".aaxis.title\",placeholder:l(r,\"Click to enter Component A title\"),attributes:{x:e.x0+e.w/2,y:e.y0-a.title.font.size/3-u,\"text-anchor\":\"middle\"}}),i[\"b-title\"]=b.draw(r,\"b\"+n,{propContainer:o,propName:e.id+\".baxis.title\",placeholder:l(r,\"Click to enter Component B title\"),attributes:{x:e.x0-c,y:e.y0+e.h+.83*o.title.font.size+c,\"text-anchor\":\"middle\"}}),i[\"c-title\"]=b.draw(r,\"c\"+n,{propContainer:s,propName:e.id+\".caxis.title\",placeholder:l(r,\"Click to enter Component C title\"),attributes:{x:e.x0+e.w+c,y:e.y0+e.h+.83*s.title.font.size+c,\"text-anchor\":\"middle\"}})}},S.drawAx=function(t){var e,r=this,n=r.graphDiv,i=t._name,a=i.charAt(0),s=t._id,l=r.layers[i],u=a+\"tickLayout\",c=(e=t).ticks+String(e.ticklen)+String(e.showticklabels);r[u]!==c&&(l.selectAll(\".\"+s+\"tick\").remove(),r[u]=c),t.setScale();var f=d.calcTicks(t),h=d.clipEnds(t,f),p=d.makeTransTickFn(t),v=d.getTickSigns(t)[2],g=o.deg2rad(30),y=v*(t.linewidth||1)/2,m=v*t.ticklen,x=r.w,b=r.h,_=\"b\"===a?\"M0,\"+y+\"l\"+Math.sin(g)*m+\",\"+Math.cos(g)*m:\"M\"+y+\",0l\"+Math.cos(g)*m+\",\"+-Math.sin(g)*m,w={a:\"M0,0l\"+b+\",-\"+x/2,b:\"M0,0l-\"+x/2+\",-\"+b,c:\"M0,0l-\"+b+\",\"+x/2}[a];d.drawTicks(n,t,{vals:\"inside\"===t.ticks?h:f,layer:l,path:_,transFn:p,crisp:!1}),d.drawGrid(n,t,{vals:h,layer:r.layers[a+\"grid\"],path:w,transFn:p,crisp:!1}),d.drawLabels(n,t,{vals:f,layer:l,transFn:p,labelFns:d.makeLabelFns(t,0,30)})};var L=A.MINZOOM/2+.87,C=\"m-0.87,.5h\"+L+\"v3h-\"+(L+5.2)+\"l\"+(L/2+2.6)+\",-\"+(.87*L+4.5)+\"l2.6,1.5l-\"+L/2+\",\"+.87*L+\"Z\",P=\"m0.87,.5h-\"+L+\"v3h\"+(L+5.2)+\"l-\"+(L/2+2.6)+\",-\"+(.87*L+4.5)+\"l-2.6,1.5l\"+L/2+\",\"+.87*L+\"Z\",O=\"m0,1l\"+L/2+\",\"+.87*L+\"l2.6,-1.5l-\"+(L/2+2.6)+\",-\"+(.87*L+4.5)+\"l-\"+(L/2+2.6)+\",\"+(.87*L+4.5)+\"l2.6,1.5l\"+L/2+\",-\"+.87*L+\"Z\",I=!0;function D(t){n.select(t).selectAll(\".zoombox,.js-zoombox-backdrop,.js-zoombox-menu,.zoombox-corners\").remove()}S.clearOutline=function(){k(this.dragOptions),T(this.dragOptions.gd)},S.initInteractions=function(){var t,e,r,n,f,h,p,d,y,b,T,k,M=this,S=M.layers.plotbg.select(\"path\").node(),L=M.graphDiv,z=L._fullLayout._zoomlayer;function R(t){var e={};return e[M.id+\".aaxis.min\"]=t.a,e[M.id+\".baxis.min\"]=t.b,e[M.id+\".caxis.min\"]=t.c,e}function F(t,e){var r=L._fullLayout.clickmode;D(L),2===t&&(L.emit(\"plotly_doubleclick\",null),a.call(\"_guiRelayout\",L,R({a:0,b:0,c:0}))),r.indexOf(\"select\")>-1&&1===t&&w(e,L,[M.xaxis],[M.yaxis],M.id,M.dragOptions),r.indexOf(\"event\")>-1&&g.click(L,e,M.id)}function B(t,e){return 1-e/M.h}function N(t,e){return 1-(t+(M.h-e)/Math.sqrt(3))/M.w}function j(t,e){return(t-(M.h-e)/Math.sqrt(3))/M.w}function U(i,a){var o=r+i*t,s=n+a*e,l=Math.max(0,Math.min(1,B(0,n),B(0,s))),u=Math.max(0,Math.min(1,N(r,n),N(o,s))),c=Math.max(0,Math.min(1,j(r,n),j(o,s))),v=(l/2+c)*M.w,g=(1-l/2-u)*M.w,m=(v+g)/2,x=g-v,_=(1-l)*M.h,w=_-x/E;x.2?\"rgba(0,0,0,0.4)\":\"rgba(255,255,255,0.3)\").duration(200),k.transition().style(\"opacity\",1).duration(200),b=!0),L.emit(\"plotly_relayouting\",R(p))}function V(){D(L),p!==f&&(a.call(\"_guiRelayout\",L,R(p)),I&&L.data&&L._context.showTips&&(o.notifier(l(L,\"Double-click to zoom back out\"),\"long\"),I=!1))}function H(t,e){var r=t/M.xaxis._m,n=e/M.yaxis._m,i=[(p={a:f.a-n,b:f.b+(r+n)/2,c:f.c-(r-n)/2}).a,p.b,p.c].sort(o.sorterAsc),a=i.indexOf(p.a),l=i.indexOf(p.b),u=i.indexOf(p.c);i[0]<0&&(i[1]+i[0]/2<0?(i[2]+=i[0]+i[1],i[0]=i[1]=0):(i[2]+=i[0]/2,i[1]+=i[0]/2,i[0]=0),p={a:i[a],b:i[l],c:i[u]},e=(f.a-p.a)*M.yaxis._m,t=(f.c-p.c-f.b+p.b)*M.xaxis._m);var h=s(M.x0+t,M.y0+e);M.plotContainer.selectAll(\".scatterlayer,.maplayer\").attr(\"transform\",h);var d=s(-t,-e);M.clipDefRelative.select(\"path\").attr(\"transform\",d),M.aaxis.range=[p.a,M.sum-p.b-p.c],M.baxis.range=[M.sum-p.a-p.c,p.b],M.caxis.range=[M.sum-p.a-p.b,p.c],M.drawAxes(!1),M._hasClipOnAxisFalse&&M.plotContainer.select(\".scatterlayer\").selectAll(\".trace\").call(c.hideOutsideRangePoints,M),L.emit(\"plotly_relayouting\",R(p))}function q(){a.call(\"_guiRelayout\",L,R(p))}this.dragOptions={element:S,gd:L,plotinfo:{id:M.id,domain:L._fullLayout[M.id].domain,xaxis:M.xaxis,yaxis:M.yaxis},subplot:M.id,prepFn:function(a,l,c){M.dragOptions.xaxes=[M.xaxis],M.dragOptions.yaxes=[M.yaxis],t=L._fullLayout._invScaleX,e=L._fullLayout._invScaleY;var v=M.dragOptions.dragmode=L._fullLayout.dragmode;m(v)?M.dragOptions.minDrag=1:M.dragOptions.minDrag=void 0,\"zoom\"===v?(M.dragOptions.moveFn=U,M.dragOptions.clickFn=F,M.dragOptions.doneFn=V,function(t,e,a){var l=S.getBoundingClientRect();r=e-l.left,n=a-l.top,L._fullLayout._calcInverseTransform(L);var c=L._fullLayout._invTransform,v=o.apply3DTransform(c)(r,n);r=v[0],n=v[1],f={a:M.aaxis.range[0],b:M.baxis.range[1],c:M.caxis.range[1]},p=f,h=M.aaxis.range[1]-f.a,d=i(M.graphDiv._fullLayout[M.id].bgcolor).getLuminance(),y=\"M0,\"+M.h+\"L\"+M.w/2+\", 0L\"+M.w+\",\"+M.h+\"Z\",b=!1,T=z.append(\"path\").attr(\"class\",\"zoombox\").attr(\"transform\",s(M.x0,M.y0)).style({fill:d>.2?\"rgba(0,0,0,0)\":\"rgba(255,255,255,0)\",\"stroke-width\":0}).attr(\"d\",y),k=z.append(\"path\").attr(\"class\",\"zoombox-corners\").attr(\"transform\",s(M.x0,M.y0)).style({fill:u.background,stroke:u.defaultLine,\"stroke-width\":1,opacity:0}).attr(\"d\",\"M0,0Z\"),M.clearOutline(L)}(0,l,c)):\"pan\"===v?(M.dragOptions.moveFn=H,M.dragOptions.clickFn=F,M.dragOptions.doneFn=q,f={a:M.aaxis.range[0],b:M.baxis.range[1],c:M.caxis.range[1]},p=f,M.clearOutline(L)):(x(v)||m(v))&&_(a,l,c,M.dragOptions,v)}},S.onmousemove=function(t){g.hover(L,t,M.id),L._fullLayout._lasthover=S,L._fullLayout._hoversubplot=M.id},S.onmouseout=function(t){L._dragging||v.unhover(L,t)},v.init(this.dragOptions)}},73972:function(t,e,r){\"use strict\";var n=r(47769),i=r(64213),a=r(75138),o=r(41965),s=r(24401).addStyleRule,l=r(1426),u=r(9012),c=r(10820),f=l.extendFlat,h=l.extendDeepAll;function p(t){var r=t.name,i=t.categories,a=t.meta;if(e.modules[r])n.log(\"Type \"+r+\" already registered\");else{e.subplotsRegistry[t.basePlotModule.name]||function(t){var r=t.name;if(e.subplotsRegistry[r])n.log(\"Plot type \"+r+\" already registered.\");else for(var i in y(t),e.subplotsRegistry[r]=t,e.componentsRegistry)b(i,t.name)}(t.basePlotModule);for(var o={},l=0;l-1&&(f[p[r]].title={text:\"\"});for(r=0;r\")?\"\":e.html(t).text()}));return e.remove(),r}(w)).replace(/&(?!\\w+;|\\#[0-9]+;| \\#x[0-9A-F]+;)/g,\"&\")).replace(c,\"'\"),i.isIE()&&(w=(w=(w=w.replace(/\"/gi,\"'\")).replace(/(\\('#)([^']*)('\\))/gi,'(\"#$2\")')).replace(/(\\\\')/gi,'\"')),w}},75341:function(t,e,r){\"use strict\";var n=r(71828);t.exports=function(t,e){for(var r=0;rf+u||!n(c))}for(var p=0;pa))return e}return void 0!==r?r:t.dflt},e.coerceColor=function(t,e,r){return i(e).isValid()?e:void 0!==r?r:t.dflt},e.coerceEnumerated=function(t,e,r){return t.coerceNumber&&(e=+e),-1!==t.values.indexOf(e)?e:void 0!==r?r:t.dflt},e.getValue=function(t,e){var r;return Array.isArray(t)?e0?e+=r:c<0&&(e-=r)}return e}function D(t){var e=c,r=t.b,i=I(t);return n.inbox(r-e,i-e,_+(i-e)/(i-r)-1)}var z=t[f+\"a\"],R=t[h+\"a\"];v=Math.abs(z.r2c(z.range[1])-z.r2c(z.range[0]));var F=n.getDistanceFunction(i,p,d,(function(t){return(p(t)+d(t))/2}));if(n.getClosest(g,F,t),!1!==t.index&&g[t.index].p!==u){k||(L=function(t){return Math.min(A(t),t.p-m.bargroupwidth/2)},C=function(t){return Math.max(M(t),t.p+m.bargroupwidth/2)});var B=g[t.index],N=y.base?B.b+B.s:B.s;t[h+\"0\"]=t[h+\"1\"]=R.c2p(B[h],!0),t[h+\"LabelVal\"]=N;var j=m.extents[m.extents.round(B.p)];t[f+\"0\"]=z.c2p(x?L(B):j[0],!0),t[f+\"1\"]=z.c2p(x?C(B):j[1],!0);var U=void 0!==B.orig_p;return t[f+\"LabelVal\"]=U?B.orig_p:B.p,t.labelLabel=l(z,t[f+\"LabelVal\"],y[f+\"hoverformat\"]),t.valueLabel=l(R,t[h+\"LabelVal\"],y[h+\"hoverformat\"]),t.baseLabel=l(R,B.b,y[h+\"hoverformat\"]),t.spikeDistance=(function(t){var e=c,r=t.b,i=I(t);return n.inbox(r-e,i-e,w+(i-e)/(i-r)-1)}(B)+function(t){return P(A(t),M(t),w)}(B))/2,t[f+\"Spike\"]=z.c2p(B.p,!0),o(B,y,t),t.hovertemplate=y.hovertemplate,t}}function f(t,e){var r=e.mcc||t.marker.color,n=e.mlcc||t.marker.line.color,i=s(t,e);return a.opacity(r)?r:a.opacity(n)&&i?n:void 0}t.exports={hoverPoints:function(t,e,r,n,a){var o=c(t,e,r,n,a);if(o){var s=o.cd,l=s[0].trace,u=s[o.index];return o.color=f(l,u),i.getComponentMethod(\"errorbars\",\"hoverInfo\")(u,l,o),[o]}},hoverOnBars:c,getTraceColor:f}},60822:function(t,e,r){\"use strict\";t.exports={attributes:r(1486),layoutAttributes:r(43641),supplyDefaults:r(90769).supplyDefaults,crossTraceDefaults:r(90769).crossTraceDefaults,supplyLayoutDefaults:r(13957),calc:r(92290),crossTraceCalc:r(11661).crossTraceCalc,colorbar:r(4898),arraysToCalcdata:r(75341),plot:r(17295).plot,style:r(16688).style,styleOnSelect:r(16688).styleOnSelect,hoverPoints:r(95423).hoverPoints,eventData:r(58065),selectPoints:r(81974),moduleType:\"trace\",name:\"bar\",basePlotModule:r(93612),categories:[\"bar-like\",\"cartesian\",\"svg\",\"bar\",\"oriented\",\"errorBarsOK\",\"showLegend\",\"zoomScale\"],animatable:!0,meta:{}}},43641:function(t){\"use strict\";t.exports={barmode:{valType:\"enumerated\",values:[\"stack\",\"group\",\"overlay\",\"relative\"],dflt:\"group\",editType:\"calc\"},barnorm:{valType:\"enumerated\",values:[\"\",\"fraction\",\"percent\"],dflt:\"\",editType:\"calc\"},bargap:{valType:\"number\",min:0,max:1,editType:\"calc\"},bargroupgap:{valType:\"number\",min:0,max:1,dflt:0,editType:\"calc\"}}},13957:function(t,e,r){\"use strict\";var n=r(73972),i=r(89298),a=r(71828),o=r(43641);t.exports=function(t,e,r){function s(r,n){return a.coerce(t,e,o,r,n)}for(var l=!1,u=!1,c=!1,f={},h=s(\"barmode\"),p=0;p0}function S(t){return\"auto\"===t?0:t}function E(t,e){var r=Math.PI/180*e,n=Math.abs(Math.sin(r)),i=Math.abs(Math.cos(r));return{x:t.width*i+t.height*n,y:t.width*n+t.height*i}}function L(t,e,r,n,i,a){var o=!!a.isHorizontal,s=!!a.constrained,l=a.angle||0,u=a.anchor||\"end\",c=\"end\"===u,f=\"start\"===u,h=((a.leftToRight||0)+1)/2,p=1-h,d=i.width,v=i.height,g=Math.abs(e-t),y=Math.abs(n-r),m=g>2*_&&y>2*_?_:0;g-=2*m,y-=2*m;var x=S(l);\"auto\"!==l||d<=g&&v<=y||!(d>g||v>y)||(d>y||v>g)&&d.01?G:function(t,e,r){return r&&t===e?t:Math.abs(t-e)>=2?G(t):t>e?Math.ceil(t):Math.floor(t)};N=Z(N,j,R),j=Z(j,N,R),U=Z(U,V,!R),V=Z(V,U,!R)}var Y=A(a.ensureSingle(I,\"path\"),P,g,y);if(Y.style(\"vector-effect\",O?\"none\":\"non-scaling-stroke\").attr(\"d\",isNaN((j-N)*(V-U))||H&&t._context.staticPlot?\"M0,0Z\":\"M\"+N+\",\"+U+\"V\"+V+\"H\"+j+\"V\"+U+\"Z\").call(l.setClipUrl,e.layerClipId,t),!P.uniformtext.mode&&F){var W=l.makePointStyleFns(f);l.singlePointStyle(u,Y,f,W,t)}!function(t,e,r,n,i,s,u,f,p,g,y){var w,T=e.xaxis,M=e.yaxis,C=t._fullLayout;function P(e,r,n){return a.ensureSingle(e,\"text\").text(r).attr({class:\"bartext bartext-\"+w,\"text-anchor\":\"middle\",\"data-notex\":1}).call(l.font,n).call(o.convertToTspans,t)}var O=n[0].trace,I=\"h\"===O.orientation,D=function(t,e,r,n,i){var o,s=e[0].trace;return o=s.texttemplate?function(t,e,r,n,i){var o=e[0].trace,s=a.castOption(o,r,\"texttemplate\");if(!s)return\"\";var l,u,f,h,p=\"histogram\"===o.type,d=\"waterfall\"===o.type,v=\"funnel\"===o.type,g=\"h\"===o.orientation;function y(t){return c(h,h.c2l(t),!0).text}g?(l=\"y\",u=i,f=\"x\",h=n):(l=\"x\",u=n,f=\"y\",h=i);var m,x=e[r],_={};_.label=x.p,_.labelLabel=_[l+\"Label\"]=(m=x.p,c(u,u.c2l(m),!0).text);var w=a.castOption(o,x.i,\"text\");(0===w||w)&&(_.text=w),_.value=x.s,_.valueLabel=_[f+\"Label\"]=y(x.s);var T={};b(T,o,x.i),(p||void 0===T.x)&&(T.x=g?_.value:_.label),(p||void 0===T.y)&&(T.y=g?_.label:_.value),(p||void 0===T.xLabel)&&(T.xLabel=g?_.valueLabel:_.labelLabel),(p||void 0===T.yLabel)&&(T.yLabel=g?_.labelLabel:_.valueLabel),d&&(_.delta=+x.rawS||x.s,_.deltaLabel=y(_.delta),_.final=x.v,_.finalLabel=y(_.final),_.initial=_.final-_.delta,_.initialLabel=y(_.initial)),v&&(_.value=x.s,_.valueLabel=y(_.value),_.percentInitial=x.begR,_.percentInitialLabel=a.formatPercent(x.begR),_.percentPrevious=x.difR,_.percentPreviousLabel=a.formatPercent(x.difR),_.percentTotal=x.sumR,_.percenTotalLabel=a.formatPercent(x.sumR));var k=a.castOption(o,x.i,\"customdata\");return k&&(_.customdata=k),a.texttemplateString(s,_,t._d3locale,T,_,o._meta||{})}(t,e,r,n,i):s.textinfo?function(t,e,r,n){var i=t[0].trace,o=\"h\"===i.orientation,s=\"waterfall\"===i.type,l=\"funnel\"===i.type;function u(t){return c(o?r:n,+t,!0).text}var f,h,p=i.textinfo,d=t[e],v=p.split(\"+\"),g=[],y=function(t){return-1!==v.indexOf(t)};if(y(\"label\")&&g.push((h=t[e].p,c(o?n:r,h,!0).text)),y(\"text\")&&(0===(f=a.castOption(i,d.i,\"text\"))||f)&&g.push(f),s){var m=+d.rawS||d.s,x=d.v,b=x-m;y(\"initial\")&&g.push(u(b)),y(\"delta\")&&g.push(u(m)),y(\"final\")&&g.push(u(x))}if(l){y(\"value\")&&g.push(u(d.s));var _=0;y(\"percent initial\")&&_++,y(\"percent previous\")&&_++,y(\"percent total\")&&_++;var w=_>1;y(\"percent initial\")&&(f=a.formatPercent(d.begR),w&&(f+=\" of initial\"),g.push(f)),y(\"percent previous\")&&(f=a.formatPercent(d.difR),w&&(f+=\" of previous\"),g.push(f)),y(\"percent total\")&&(f=a.formatPercent(d.sumR),w&&(f+=\" of total\"),g.push(f))}return g.join(\" \")}(e,r,n,i):v.getValue(s.text,r),v.coerceString(m,o)}(C,n,i,T,M);w=function(t,e){var r=v.getValue(t.textposition,e);return v.coerceEnumerated(x,r)}(O,i);var z=\"stack\"===g.mode||\"relative\"===g.mode,R=n[i],F=!z||R._outmost;if(D&&\"none\"!==w&&(!R.isBlank&&s!==u&&f!==p||\"auto\"!==w&&\"inside\"!==w)){var B=C.font,N=d.getBarColor(n[i],O),j=d.getInsideTextFont(O,i,B,N),U=d.getOutsideTextFont(O,i,B),V=r.datum();I?\"log\"===T.type&&V.s0<=0&&(s=T.range[0]0&&Z>0&&(G<=W&&Z<=X||G<=X&&Z<=W||(I?W>=G*(X/Z):X>=Z*(W/G)))?w=\"inside\":(w=\"outside\",H.remove(),H=null)):w=\"inside\"),!H){var J=(H=P(r,D,Y=a.ensureUniformFontSize(t,\"outside\"===w?U:j))).attr(\"transform\");if(H.attr(\"transform\",\"\"),G=(q=l.bBox(H.node())).width,Z=q.height,H.attr(\"transform\",J),G<=0||Z<=0)return void H.remove()}var K,$=O.textangle;K=\"outside\"===w?function(t,e,r,n,i,a){var o,s=!!a.isHorizontal,l=!!a.constrained,u=a.angle||0,c=i.width,f=i.height,h=Math.abs(e-t),p=Math.abs(n-r);o=s?p>2*_?_:0:h>2*_?_:0;var d=1;l&&(d=s?Math.min(1,p/f):Math.min(1,h/c));var v=S(u),g=E(i,v),y=(s?g.x:g.y)/2,m=(i.left+i.right)/2,x=(i.top+i.bottom)/2,b=(t+e)/2,w=(r+n)/2,T=0,A=0,M=s?k(e,t):k(r,n);return s?(b=e-M*o,T=M*y):(w=n+M*o,A=-M*y),{textX:m,textY:x,targetX:b,targetY:w,anchorX:T,anchorY:A,scale:d,rotate:v}}(s,u,f,p,q,{isHorizontal:I,constrained:\"both\"===O.constraintext||\"outside\"===O.constraintext,angle:$}):L(s,u,f,p,q,{isHorizontal:I,constrained:\"both\"===O.constraintext||\"inside\"===O.constraintext,angle:$,anchor:O.insidetextanchor}),K.fontSize=Y.size,h(\"histogram\"===O.type?\"bar\":O.type,K,C),R.transform=K;var Q=A(H,C,g,y);a.setTransormAndDisplay(Q,K)}else r.select(\"text\").remove()}(t,e,I,r,p,N,j,U,V,g,y),e.layerClipId&&l.hideOutsideRangePoint(u,I.select(\"text\"),w,C,f.xcalendar,f.ycalendar)}));var U=!1===f.cliponaxis;l.setClipUrl(u,U?null:e.layerClipId,t)}));u.getComponentMethod(\"errorbars\",\"plot\")(t,I,e,g)},toMoveInsideBar:L}},81974:function(t){\"use strict\";function e(t,e,r,n,i){var a=e.c2p(n?t.s0:t.p0,!0),o=e.c2p(n?t.s1:t.p1,!0),s=r.c2p(n?t.p0:t.s0,!0),l=r.c2p(n?t.p1:t.s1,!0);return i?[(a+o)/2,(s+l)/2]:n?[o,(s+l)/2]:[(a+o)/2,l]}t.exports=function(t,r){var n,i=t.cd,a=t.xaxis,o=t.yaxis,s=i[0].trace,l=\"funnel\"===s.type,u=\"h\"===s.orientation,c=[];if(!1===r)for(n=0;n1||0===i.bargap&&0===i.bargroupgap&&!t[0].trace.marker.line.width)&&n.select(this).attr(\"shape-rendering\",\"crispEdges\")})),e.selectAll(\"g.points\").each((function(e){d(n.select(this),e[0].trace,t)})),s.getComponentMethod(\"errorbars\",\"style\")(e)},styleTextPoints:v,styleOnSelect:function(t,e,r){var i=e[0].trace;i.selectedpoints?function(t,e,r){a.selectedPointStyle(t.selectAll(\"path\"),e),function(t,e,r){t.each((function(t){var i,s=n.select(this);if(t.selected){i=o.ensureUniformFontSize(r,g(s,t,e,r));var l=e.selected.textfont&&e.selected.textfont.color;l&&(i.color=l),a.font(s,i)}else a.selectedTextStyle(s,e)}))}(t.selectAll(\"text\"),e,r)}(r,i,t):(d(r,i,t),s.getComponentMethod(\"errorbars\",\"style\")(r))},getInsideTextFont:m,getOutsideTextFont:x,getBarColor:_,resizeText:l}},98340:function(t,e,r){\"use strict\";var n=r(7901),i=r(52075).hasColorscale,a=r(1586),o=r(71828).coercePattern;t.exports=function(t,e,r,s,l){var u=r(\"marker.color\",s),c=i(t,\"marker\");c&&a(t,e,l,r,{prefix:\"marker.\",cLetter:\"c\"}),r(\"marker.line.color\",n.defaultLine),i(t,\"marker.line\")&&a(t,e,l,r,{prefix:\"marker.line.\",cLetter:\"c\"}),r(\"marker.line.width\"),r(\"marker.opacity\"),o(r,\"marker.pattern\",u,c),r(\"selected.marker.color\"),r(\"unselected.marker.color\")}},72597:function(t,e,r){\"use strict\";var n=r(39898),i=r(71828);function a(t){return\"_\"+t+\"Text_minsize\"}t.exports={recordMinTextSize:function(t,e,r){if(r.uniformtext.mode){var n=a(t),i=r.uniformtext.minsize,o=e.scale*e.fontSize;e.hide=o g.point\"}e.selectAll(s).each((function(t){var e=t.transform;if(e){e.scale=l&&e.hide?0:o/e.fontSize;var r=n.select(this).select(\"text\");i.setTransormAndDisplay(r,e)}}))}}}},55023:function(t,e,r){\"use strict\";var n=r(5386).fF,i=r(1426).extendFlat,a=r(81245),o=r(1486);t.exports={r:a.r,theta:a.theta,r0:a.r0,dr:a.dr,theta0:a.theta0,dtheta:a.dtheta,thetaunit:a.thetaunit,base:i({},o.base,{}),offset:i({},o.offset,{}),width:i({},o.width,{}),text:i({},o.text,{}),hovertext:i({},o.hovertext,{}),marker:o.marker,hoverinfo:a.hoverinfo,hovertemplate:n(),selected:o.selected,unselected:o.unselected}},74692:function(t,e,r){\"use strict\";var n=r(52075).hasColorscale,i=r(78803),a=r(75341),o=r(11661).setGroupPositions,s=r(66279),l=r(73972).traceIs,u=r(71828).extendFlat;t.exports={calc:function(t,e){for(var r=t._fullLayout,o=e.subplot,l=r[o].radialaxis,u=r[o].angularaxis,c=l.makeCalcdata(e,\"r\"),f=u.makeCalcdata(e,\"theta\"),h=e._length,p=new Array(h),d=c,v=f,g=0;gh.range[1]&&(x+=Math.PI),n.getClosest(u,(function(t){return v(m,x,[t.rp0,t.rp1],[t.thetag0,t.thetag1],d)?g+Math.min(1,Math.abs(t.thetag1-t.thetag0)/y)-1+(t.rp1-m)/(t.rp1-t.rp0)-1:1/0}),t),!1!==t.index){var b=u[t.index];t.x0=t.x1=b.ct[0],t.y0=t.y1=b.ct[1];var _=i.extendFlat({},b,{r:b.s,theta:b.p});return o(b,c,t),s(_,c,f,t),t.hovertemplate=c.hovertemplate,t.color=a(c,b),t.xLabelVal=t.yLabelVal=void 0,b.s<0&&(t.idealAlign=\"left\"),[t]}}},23381:function(t,e,r){\"use strict\";t.exports={moduleType:\"trace\",name:\"barpolar\",basePlotModule:r(23580),categories:[\"polar\",\"bar\",\"showLegend\"],attributes:r(55023),layoutAttributes:r(40151),supplyDefaults:r(6135),supplyLayoutDefaults:r(19860),calc:r(74692).calc,crossTraceCalc:r(74692).crossTraceCalc,plot:r(60173),colorbar:r(4898),formatLabels:r(98608),style:r(16688).style,styleOnSelect:r(16688).styleOnSelect,hoverPoints:r(27379),selectPoints:r(81974),meta:{}}},40151:function(t){\"use strict\";t.exports={barmode:{valType:\"enumerated\",values:[\"stack\",\"overlay\"],dflt:\"stack\",editType:\"calc\"},bargap:{valType:\"number\",dflt:.1,min:0,max:1,editType:\"calc\"}}},19860:function(t,e,r){\"use strict\";var n=r(71828),i=r(40151);t.exports=function(t,e,r){var a,o={};function s(r,o){return n.coerce(t[a]||{},e[a],i,r,o)}for(var l=0;l0?(u=o,c=l):(u=l,c=o);var f=[s.findEnclosingVertexAngles(u,t.vangles)[0],(u+c)/2,s.findEnclosingVertexAngles(c,t.vangles)[1]];return s.pathPolygonAnnulus(n,i,u,c,f,e,r)}:function(t,n,i,o){return a.pathAnnulus(t,n,i,o,e,r)}}(e),d=e.layers.frontplot.select(\"g.barlayer\");a.makeTraceGroups(d,r,\"trace bars\").each((function(){var r=n.select(this),s=a.ensureSingle(r,\"g\",\"points\").selectAll(\"g.point\").data(a.identity);s.enter().append(\"g\").style(\"vector-effect\",l?\"none\":\"non-scaling-stroke\").style(\"stroke-miterlimit\",2).classed(\"point\",!0),s.exit().remove(),s.each((function(t){var e,r=n.select(this),o=t.rp0=f.c2p(t.s0),s=t.rp1=f.c2p(t.s1),l=t.thetag0=h.c2g(t.p0),d=t.thetag1=h.c2g(t.p1);if(i(o)&&i(s)&&i(l)&&i(d)&&o!==s&&l!==d){var v=f.c2g(t.s1),g=(l+d)/2;t.ct=[u.c2p(v*Math.cos(g)),c.c2p(v*Math.sin(g))],e=p(o,s,l,d)}else e=\"M0,0Z\";a.ensureSingle(r,\"path\").attr(\"d\",e)})),o.setClipUrl(r,e._hasClipOnAxisFalse?e.clipIds.forTraces:null,t)}))}},53522:function(t,e,r){\"use strict\";var n=r(82196),i=r(1486),a=r(22399),o=r(12663).axisHoverFormat,s=r(5386).fF,l=r(1426).extendFlat,u=n.marker,c=u.line;t.exports={y:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},x:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},x0:{valType:\"any\",editType:\"calc+clearAxisTypes\"},y0:{valType:\"any\",editType:\"calc+clearAxisTypes\"},dx:{valType:\"number\",editType:\"calc\"},dy:{valType:\"number\",editType:\"calc\"},xperiod:n.xperiod,yperiod:n.yperiod,xperiod0:n.xperiod0,yperiod0:n.yperiod0,xperiodalignment:n.xperiodalignment,yperiodalignment:n.yperiodalignment,xhoverformat:o(\"x\"),yhoverformat:o(\"y\"),name:{valType:\"string\",editType:\"calc+clearAxisTypes\"},q1:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},median:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},q3:{valType:\"data_array\",editType:\"calc+clearAxisTypes\"},lowerfence:{valType:\"data_array\",editType:\"calc\"},upperfence:{valType:\"data_array\",editType:\"calc\"},notched:{valType:\"boolean\",editType:\"calc\"},notchwidth:{valType:\"number\",min:0,max:.5,dflt:.25,editType:\"calc\"},notchspan:{valType:\"data_array\",editType:\"calc\"},boxpoints:{valType:\"enumerated\",values:[\"all\",\"outliers\",\"suspectedoutliers\",!1],editType:\"calc\"},jitter:{valType:\"number\",min:0,max:1,editType:\"calc\"},pointpos:{valType:\"number\",min:-2,max:2,editType:\"calc\"},sdmultiple:{valType:\"number\",min:0,editType:\"calc\",dflt:1},sizemode:{valType:\"enumerated\",values:[\"quartiles\",\"sd\"],editType:\"calc\",dflt:\"quartiles\"},boxmean:{valType:\"enumerated\",values:[!0,\"sd\",!1],editType:\"calc\"},mean:{valType:\"data_array\",editType:\"calc\"},sd:{valType:\"data_array\",editType:\"calc\"},orientation:{valType:\"enumerated\",values:[\"v\",\"h\"],editType:\"calc+clearAxisTypes\"},quartilemethod:{valType:\"enumerated\",values:[\"linear\",\"exclusive\",\"inclusive\"],dflt:\"linear\",editType:\"calc\"},width:{valType:\"number\",min:0,dflt:0,editType:\"calc\"},marker:{outliercolor:{valType:\"color\",dflt:\"rgba(0, 0, 0, 0)\",editType:\"style\"},symbol:l({},u.symbol,{arrayOk:!1,editType:\"plot\"}),opacity:l({},u.opacity,{arrayOk:!1,dflt:1,editType:\"style\"}),angle:l({},u.angle,{arrayOk:!1,editType:\"calc\"}),size:l({},u.size,{arrayOk:!1,editType:\"calc\"}),color:l({},u.color,{arrayOk:!1,editType:\"style\"}),line:{color:l({},c.color,{arrayOk:!1,dflt:a.defaultLine,editType:\"style\"}),width:l({},c.width,{arrayOk:!1,dflt:0,editType:\"style\"}),outliercolor:{valType:\"color\",editType:\"style\"},outlierwidth:{valType:\"number\",min:0,dflt:1,editType:\"style\"},editType:\"style\"},editType:\"plot\"},line:{color:{valType:\"color\",editType:\"style\"},width:{valType:\"number\",min:0,dflt:2,editType:\"style\"},editType:\"plot\"},fillcolor:n.fillcolor,whiskerwidth:{valType:\"number\",min:0,max:1,dflt:.5,editType:\"calc\"},showwhiskers:{valType:\"boolean\",editType:\"calc\"},offsetgroup:i.offsetgroup,alignmentgroup:i.alignmentgroup,selected:{marker:n.selected.marker,editType:\"style\"},unselected:{marker:n.unselected.marker,editType:\"style\"},text:l({},n.text,{}),hovertext:l({},n.hovertext,{}),hovertemplate:s({}),hoveron:{valType:\"flaglist\",flags:[\"boxes\",\"points\"],dflt:\"boxes+points\",editType:\"style\"}}},48518:function(t,e,r){\"use strict\";var n=r(92770),i=r(89298),a=r(42973),o=r(71828),s=r(50606).BADNUM,l=o._;t.exports=function(t,e){var r,u,m,x,b,_,w,T=t._fullLayout,k=i.getFromId(t,e.xaxis||\"x\"),A=i.getFromId(t,e.yaxis||\"y\"),M=[],S=\"violin\"===e.type?\"_numViolins\":\"_numBoxes\";\"h\"===e.orientation?(m=k,x=\"x\",b=A,_=\"y\",w=!!e.yperiodalignment):(m=A,x=\"y\",b=k,_=\"x\",w=!!e.xperiodalignment);var E,L,C,P,O,I,D=function(t,e,r,i){var s,l=e+\"0\"in t;if(e in t||l&&\"d\"+e in t){var u=r.makeCalcdata(t,e);return[a(t,r,e,u).vals,u]}s=l?t[e+\"0\"]:\"name\"in t&&(\"category\"===r.type||n(t.name)&&-1!==[\"linear\",\"log\"].indexOf(r.type)||o.isDateTime(t.name)&&\"date\"===r.type)?t.name:i;for(var c=\"multicategory\"===r.type?r.r2c_just_indices(s):r.d2c(s,0,t[e+\"calendar\"]),f=t._length,h=new Array(f),p=0;pE.uf};if(e._hasPreCompStats){var U=e[x],V=function(t){return m.d2c((e[t]||[])[r])},H=1/0,q=-1/0;for(r=0;r=E.q1&&E.q3>=E.med){var Z=V(\"lowerfence\");E.lf=Z!==s&&Z<=E.q1?Z:p(E,C,P);var Y=V(\"upperfence\");E.uf=Y!==s&&Y>=E.q3?Y:d(E,C,P);var W=V(\"mean\");E.mean=W!==s?W:P?o.mean(C,P):(E.q1+E.q3)/2;var X=V(\"sd\");E.sd=W!==s&&X>=0?X:P?o.stdev(C,P,E.mean):E.q3-E.q1,E.lo=v(E),E.uo=g(E);var J=V(\"notchspan\");J=J!==s&&J>0?J:y(E,P),E.ln=E.med-J,E.un=E.med+J;var K=E.lf,$=E.uf;e.boxpoints&&C.length&&(K=Math.min(K,C[0]),$=Math.max($,C[P-1])),e.notched&&(K=Math.min(K,E.ln),$=Math.max($,E.un)),E.min=K,E.max=$}else{var Q;o.warn([\"Invalid input - make sure that q1 <= median <= q3\",\"q1 = \"+E.q1,\"median = \"+E.med,\"q3 = \"+E.q3].join(\"\\n\")),Q=E.med!==s?E.med:E.q1!==s?E.q3!==s?(E.q1+E.q3)/2:E.q1:E.q3!==s?E.q3:0,E.med=Q,E.q1=E.q3=Q,E.lf=E.uf=Q,E.mean=E.sd=Q,E.ln=E.un=Q,E.min=E.max=Q}H=Math.min(H,E.min),q=Math.max(q,E.max),E.pts2=L.filter(j),M.push(E)}}e._extremes[m._id]=i.findExtremes(m,[H,q],{padded:!0})}else{var tt=m.makeCalcdata(e,x),et=function(t,e){for(var r=t.length,n=new Array(r+1),i=0;i=0&&it0){var ct,ft;(E={}).pos=E[_]=B[r],L=E.pts=nt[r].sort(f),P=(C=E[x]=L.map(h)).length,E.min=C[0],E.max=C[P-1],E.mean=o.mean(C,P),E.sd=o.stdev(C,P,E.mean)*e.sdmultiple,E.med=o.interp(C,.5),P%2&&(lt||ut)?(lt?(ct=C.slice(0,P/2),ft=C.slice(P/2+1)):ut&&(ct=C.slice(0,P/2+1),ft=C.slice(P/2)),E.q1=o.interp(ct,.5),E.q3=o.interp(ft,.5)):(E.q1=o.interp(C,.25),E.q3=o.interp(C,.75)),E.lf=p(E,C,P),E.uf=d(E,C,P),E.lo=v(E),E.uo=g(E);var ht=y(E,P);E.ln=E.med-ht,E.un=E.med+ht,at=Math.min(at,E.ln),ot=Math.max(ot,E.un),E.pts2=L.filter(j),M.push(E)}e._extremes[m._id]=i.findExtremes(m,e.notched?tt.concat([at,ot]):tt,{padded:!0})}return function(t,e){if(o.isArrayOrTypedArray(e.selectedpoints))for(var r=0;r0?(M[0].t={num:T[S],dPos:N,posLetter:_,valLetter:x,labels:{med:l(t,\"median:\"),min:l(t,\"min:\"),q1:l(t,\"q1:\"),q3:l(t,\"q3:\"),max:l(t,\"max:\"),mean:\"sd\"===e.boxmean||\"sd\"===e.sizemode?l(t,\"mean ± σ:\").replace(\"σ\",1===e.sdmultiple?\"σ\":e.sdmultiple+\"σ\"):l(t,\"mean:\"),lf:l(t,\"lower fence:\"),uf:l(t,\"upper fence:\")}},T[S]++,M):[{t:{empty:!0}}]};var u={text:\"tx\",hovertext:\"htx\"};function c(t,e,r){for(var n in u)o.isArrayOrTypedArray(e[n])&&(Array.isArray(r)?o.isArrayOrTypedArray(e[n][r[0]])&&(t[u[n]]=e[n][r[0]][r[1]]):t[u[n]]=e[n][r])}function f(t,e){return t.v-e.v}function h(t){return t.v}function p(t,e,r){return 0===r?t.q1:Math.min(t.q1,e[Math.min(o.findBin(2.5*t.q1-1.5*t.q3,e,!0)+1,r-1)])}function d(t,e,r){return 0===r?t.q3:Math.max(t.q3,e[Math.max(o.findBin(2.5*t.q3-1.5*t.q1,e),0)])}function v(t){return 4*t.q1-3*t.q3}function g(t){return 4*t.q3-3*t.q1}function y(t,e){return 0===e?0:1.57*(t.q3-t.q1)/Math.sqrt(e)}},37188:function(t,e,r){\"use strict\";var n=r(89298),i=r(71828),a=r(99082).getAxisGroup,o=[\"v\",\"h\"];function s(t,e,r,o){var s,l,u,c=e.calcdata,f=e._fullLayout,h=o._id,p=h.charAt(0),d=[],v=0;for(s=0;s1,b=1-f[t+\"gap\"],_=1-f[t+\"groupgap\"];for(s=0;s0){var q=E.pointpos,G=E.jitter,Z=E.marker.size/2,Y=0;q+G>=0&&((Y=V*(q+G))>M?(H=!0,j=Z,B=Y):Y>R&&(j=Z,B=M)),Y<=M&&(B=M);var W=0;q-G<=0&&((W=-V*(q-G))>S?(H=!0,U=Z,N=W):W>F&&(U=Z,N=S)),W<=S&&(N=S)}else B=M,N=S;var X=new Array(u.length);for(l=0;l0?(g=\"v\",y=x>0?Math.min(_,b):Math.min(b)):x>0?(g=\"h\",y=Math.min(_)):y=0;if(y){e._length=y;var S=r(\"orientation\",g);e._hasPreCompStats?\"v\"===S&&0===x?(r(\"x0\",0),r(\"dx\",1)):\"h\"===S&&0===m&&(r(\"y0\",0),r(\"dy\",1)):\"v\"===S&&0===x?r(\"x0\"):\"h\"===S&&0===m&&r(\"y0\"),i.getComponentMethod(\"calendars\",\"handleTraceDefaults\")(t,e,[\"x\",\"y\"],a)}else e.visible=!1}function f(t,e,r,i){var a=i.prefix,o=n.coerce2(t,e,u,\"marker.outliercolor\"),s=r(\"marker.line.outliercolor\"),l=\"outliers\";e._hasPreCompStats?l=\"all\":(o||s)&&(l=\"suspectedoutliers\");var c=r(a+\"points\",l);c?(r(\"jitter\",\"all\"===c?.3:0),r(\"pointpos\",\"all\"===c?-1.5:0),r(\"marker.symbol\"),r(\"marker.opacity\"),r(\"marker.size\"),r(\"marker.angle\"),r(\"marker.color\",e.line.color),r(\"marker.line.color\"),r(\"marker.line.width\"),\"suspectedoutliers\"===c&&(r(\"marker.line.outliercolor\",e.marker.color),r(\"marker.line.outlierwidth\")),r(\"selected.marker.color\"),r(\"unselected.marker.color\"),r(\"selected.marker.size\"),r(\"unselected.marker.size\"),r(\"text\"),r(\"hovertext\")):delete e.marker;var f=r(\"hoveron\");\"all\"!==f&&-1===f.indexOf(\"points\")||r(\"hovertemplate\"),n.coerceSelectionMarkerOpacity(e,r)}t.exports={supplyDefaults:function(t,e,r,i){function s(r,i){return n.coerce(t,e,u,r,i)}if(c(t,e,s,i),!1!==e.visible){o(t,e,i,s),s(\"xhoverformat\"),s(\"yhoverformat\");var l=e._hasPreCompStats;l&&(s(\"lowerfence\"),s(\"upperfence\")),s(\"line.color\",(t.marker||{}).color||r),s(\"line.width\"),s(\"fillcolor\",a.addOpacity(e.line.color,.5));var h=!1;if(l){var p=s(\"mean\"),d=s(\"sd\");p&&p.length&&(h=!0,d&&d.length&&(h=\"sd\"))}s(\"whiskerwidth\");var v,g=s(\"sizemode\");\"quartiles\"===g&&(v=s(\"boxmean\",h)),s(\"showwhiskers\",\"quartiles\"===g),\"sd\"!==g&&\"sd\"!==v||s(\"sdmultiple\"),s(\"width\"),s(\"quartilemethod\");var y=!1;if(l){var m=s(\"notchspan\");m&&m.length&&(y=!0)}else n.validate(t.notchwidth,u.notchwidth)&&(y=!0);s(\"notched\",y)&&s(\"notchwidth\"),f(t,e,s,{prefix:\"box\"})}},crossTraceDefaults:function(t,e){var r,i;function a(t){return n.coerce(i._input,i,u,t)}for(var o=0;ot.lo&&(x.so=!0)}return a}));h.enter().append(\"path\").classed(\"point\",!0),h.exit().remove(),h.call(a.translatePoints,o,s)}function l(t,e,r,a){var o,s,l=e.val,u=e.pos,c=!!u.rangebreaks,f=a.bPos,h=a.bPosPxOffset||0,p=r.boxmean||(r.meanline||{}).visible;Array.isArray(a.bdPos)?(o=a.bdPos[0],s=a.bdPos[1]):(o=a.bdPos,s=a.bdPos);var d=t.selectAll(\"path.mean\").data(\"box\"===r.type&&r.boxmean||\"violin\"===r.type&&r.box.visible&&r.meanline.visible?i.identity:[]);d.enter().append(\"path\").attr(\"class\",\"mean\").style({fill:\"none\",\"vector-effect\":\"non-scaling-stroke\"}),d.exit().remove(),d.each((function(t){var e=u.c2l(t.pos+f,!0),i=u.l2p(e-o)+h,a=u.l2p(e+s)+h,d=c?(i+a)/2:u.l2p(e)+h,v=l.c2p(t.mean,!0),g=l.c2p(t.mean-t.sd,!0),y=l.c2p(t.mean+t.sd,!0);\"h\"===r.orientation?n.select(this).attr(\"d\",\"M\"+v+\",\"+i+\"V\"+a+(\"sd\"===p?\"m0,0L\"+g+\",\"+d+\"L\"+v+\",\"+i+\"L\"+y+\",\"+d+\"Z\":\"\")):n.select(this).attr(\"d\",\"M\"+i+\",\"+v+\"H\"+a+(\"sd\"===p?\"m0,0L\"+d+\",\"+g+\"L\"+i+\",\"+v+\"L\"+d+\",\"+y+\"Z\":\"\"))}))}t.exports={plot:function(t,e,r,a){var u=t._context.staticPlot,c=e.xaxis,f=e.yaxis;i.makeTraceGroups(a,r,\"trace boxes\").each((function(t){var e,r,i=n.select(this),a=t[0],h=a.t,p=a.trace;h.wdPos=h.bdPos*p.whiskerwidth,!0!==p.visible||h.empty?i.remove():(\"h\"===p.orientation?(e=f,r=c):(e=c,r=f),o(i,{pos:e,val:r},p,h,u),s(i,{x:c,y:f},p,h),l(i,{pos:e,val:r},p,h))}))},plotBoxAndWhiskers:o,plotPoints:s,plotBoxMean:l}},24626:function(t){\"use strict\";t.exports=function(t,e){var r,n,i=t.cd,a=t.xaxis,o=t.yaxis,s=[];if(!1===e)for(r=0;r=10)return null;for(var r=1/0,a=-1/0,o=t.length,s=0;s0?Math.floor:Math.ceil,O=L>0?Math.ceil:Math.floor,I=L>0?Math.min:Math.max,D=L>0?Math.max:Math.min,z=P(S+C),R=O(E-C),F=[[f=M(S)]];for(a=z;a*L=0;i--)a[c-i]=t[f][i],o[c-i]=e[f][i];for(s.push({x:a,y:o,bicubic:l}),i=f,a=[],o=[];i>=0;i--)a[f-i]=t[i][0],o[f-i]=e[i][0];return s.push({x:a,y:o,bicubic:u}),s}},20347:function(t,e,r){\"use strict\";var n=r(89298),i=r(1426).extendFlat;t.exports=function(t,e,r){var a,o,s,l,u,c,f,h,p,d,v,g,y,m,x=t[\"_\"+e],b=t[e+\"axis\"],_=b._gridlines=[],w=b._minorgridlines=[],T=b._boundarylines=[],k=t[\"_\"+r],A=t[r+\"axis\"];\"array\"===b.tickmode&&(b.tickvals=x.slice());var M=t._xctrl,S=t._yctrl,E=M[0].length,L=M.length,C=t._a.length,P=t._b.length;n.prepTicks(b),\"array\"===b.tickmode&&delete b.tickvals;var O=b.smoothing?3:1;function I(n){var i,a,o,s,l,u,c,f,p,d,v,g,y=[],m=[],x={};if(\"b\"===e)for(a=t.b2j(n),o=Math.floor(Math.max(0,Math.min(P-2,a))),s=a-o,x.length=P,x.crossLength=C,x.xy=function(e){return t.evalxy([],e,a)},x.dxy=function(e,r){return t.dxydi([],e,o,r,s)},i=0;i0&&(p=t.dxydi([],i-1,o,0,s),y.push(l[0]+p[0]/3),m.push(l[1]+p[1]/3),d=t.dxydi([],i-1,o,1,s),y.push(f[0]-d[0]/3),m.push(f[1]-d[1]/3)),y.push(f[0]),m.push(f[1]),l=f;else for(i=t.a2i(n),u=Math.floor(Math.max(0,Math.min(C-2,i))),c=i-u,x.length=C,x.crossLength=P,x.xy=function(e){return t.evalxy([],i,e)},x.dxy=function(e,r){return t.dxydj([],u,e,c,r)},a=0;a0&&(v=t.dxydj([],u,a-1,c,0),y.push(l[0]+v[0]/3),m.push(l[1]+v[1]/3),g=t.dxydj([],u,a-1,c,1),y.push(f[0]-g[0]/3),m.push(f[1]-g[1]/3)),y.push(f[0]),m.push(f[1]),l=f;return x.axisLetter=e,x.axis=b,x.crossAxis=A,x.value=n,x.constvar=r,x.index=h,x.x=y,x.y=m,x.smoothing=A.smoothing,x}function D(n){var i,a,o,s,l,u=[],c=[],f={};if(f.length=x.length,f.crossLength=k.length,\"b\"===e)for(o=Math.max(0,Math.min(P-2,n)),l=Math.min(1,Math.max(0,n-o)),f.xy=function(e){return t.evalxy([],e,n)},f.dxy=function(e,r){return t.dxydi([],e,o,r,l)},i=0;ix.length-1||_.push(i(D(o),{color:b.gridcolor,width:b.gridwidth,dash:b.griddash}));for(h=c;hx.length-1||v<0||v>x.length-1))for(g=x[s],y=x[v],a=0;ax[x.length-1]||w.push(i(I(d),{color:b.minorgridcolor,width:b.minorgridwidth,dash:b.minorgriddash}));b.startline&&T.push(i(D(0),{color:b.startlinecolor,width:b.startlinewidth})),b.endline&&T.push(i(D(x.length-1),{color:b.endlinecolor,width:b.endlinewidth}))}else{for(l=5e-15,c=(u=[Math.floor((x[x.length-1]-b.tick0)/b.dtick*(1+l)),Math.ceil((x[0]-b.tick0)/b.dtick/(1+l))].sort((function(t,e){return t-e})))[0],f=u[1],h=c;h<=f;h++)p=b.tick0+b.dtick*h,_.push(i(I(p),{color:b.gridcolor,width:b.gridwidth,dash:b.griddash}));for(h=c-1;hx[x.length-1]||w.push(i(I(d),{color:b.minorgridcolor,width:b.minorgridwidth,dash:b.minorgriddash}));b.startline&&T.push(i(I(x[0]),{color:b.startlinecolor,width:b.startlinewidth})),b.endline&&T.push(i(I(x[x.length-1]),{color:b.endlinecolor,width:b.endlinewidth}))}}},83311:function(t,e,r){\"use strict\";var n=r(89298),i=r(1426).extendFlat;t.exports=function(t,e){var r,a,o,s=e._labels=[],l=e._gridlines;for(r=0;re.length&&(t=t.slice(0,e.length)):t=[],i=0;i90&&(p-=180,l=-l),{angle:p,flip:l,p:t.c2p(n,e,r),offsetMultplier:u}}},89740:function(t,e,r){\"use strict\";var n=r(39898),i=r(91424),a=r(27669),o=r(67961),s=r(11651),l=r(63893),u=r(71828),c=u.strRotate,f=u.strTranslate,h=r(18783);function p(t,e,r,s,l,u,c){var f=\"const-\"+l+\"-lines\",h=r.selectAll(\".\"+f).data(u);h.enter().append(\"path\").classed(f,!0).style(\"vector-effect\",c?\"none\":\"non-scaling-stroke\"),h.each((function(r){var s=r,l=s.x,u=s.y,c=a([],l,t.c2p),f=a([],u,e.c2p),h=\"M\"+o(c,f,s.smoothing);n.select(this).attr(\"d\",h).style(\"stroke-width\",s.width).style(\"stroke\",s.color).style(\"stroke-dasharray\",i.dashStyle(s.dash,s.width)).style(\"fill\",\"none\")})),h.exit().remove()}function d(t,e,r,a,o,u,h,p){var d=u.selectAll(\"text.\"+p).data(h);d.enter().append(\"text\").classed(p,!0);var v=0,g={};return d.each((function(o,u){var h;if(\"auto\"===o.axis.tickangle)h=s(a,e,r,o.xy,o.dxy);else{var p=(o.axis.tickangle+180)*Math.PI/180;h=s(a,e,r,o.xy,[Math.cos(p),Math.sin(p)])}u||(g={angle:h.angle,flip:h.flip});var d=(o.endAnchor?-1:1)*h.flip,y=n.select(this).attr({\"text-anchor\":d>0?\"start\":\"end\",\"data-notex\":1}).call(i.font,o.font).text(o.text).call(l.convertToTspans,t),m=i.bBox(this);y.attr(\"transform\",f(h.p[0],h.p[1])+c(h.angle)+f(o.axis.labelpadding*d,.3*m.height)),v=Math.max(v,m.width+o.axis.labelpadding)})),d.exit().remove(),g.maxExtent=v,g}t.exports=function(t,e,r,i){var l=t._context.staticPlot,c=e.xaxis,f=e.yaxis,h=t._fullLayout._clips;u.makeTraceGroups(i,r,\"trace\").each((function(e){var r=n.select(this),i=e[0],v=i.trace,g=v.aaxis,m=v.baxis,x=u.ensureSingle(r,\"g\",\"minorlayer\"),b=u.ensureSingle(r,\"g\",\"majorlayer\"),_=u.ensureSingle(r,\"g\",\"boundarylayer\"),w=u.ensureSingle(r,\"g\",\"labellayer\");r.style(\"opacity\",v.opacity),p(c,f,b,0,\"a\",g._gridlines,!0),p(c,f,b,0,\"b\",m._gridlines,!0),p(c,f,x,0,\"a\",g._minorgridlines,!0),p(c,f,x,0,\"b\",m._minorgridlines,!0),p(c,f,_,0,\"a-boundary\",g._boundarylines,l),p(c,f,_,0,\"b-boundary\",m._boundarylines,l);var T=d(t,c,f,v,0,w,g._labels,\"a-label\"),k=d(t,c,f,v,0,w,m._labels,\"b-label\");!function(t,e,r,n,i,a,o,l){var c,f,h,p,d=u.aggNums(Math.min,null,r.a),v=u.aggNums(Math.max,null,r.a),g=u.aggNums(Math.min,null,r.b),m=u.aggNums(Math.max,null,r.b);c=.5*(d+v),f=g,h=r.ab2xy(c,f,!0),p=r.dxyda_rough(c,f),void 0===o.angle&&u.extendFlat(o,s(r,i,a,h,r.dxydb_rough(c,f))),y(t,e,r,0,h,p,r.aaxis,i,a,o,\"a-title\"),c=d,f=.5*(g+m),h=r.ab2xy(c,f,!0),p=r.dxydb_rough(c,f),void 0===l.angle&&u.extendFlat(l,s(r,i,a,h,r.dxyda_rough(c,f))),y(t,e,r,0,h,p,r.baxis,i,a,l,\"b-title\")}(t,w,v,0,c,f,T,k),function(t,e,r,n,i){var s,l,c,f,h=r.select(\"#\"+t._clipPathId);h.size()||(h=r.append(\"clipPath\").classed(\"carpetclip\",!0));var p=u.ensureSingle(h,\"path\",\"carpetboundary\"),d=e.clipsegments,v=[];for(f=0;f90&&m<270,b=n.select(this);b.text(h.title.text).call(l.convertToTspans,t),x&&(_=(-l.lineCount(b)+g)*v*a-_),b.attr(\"transform\",f(e.p[0],e.p[1])+c(e.angle)+f(0,_)).attr(\"text-anchor\",\"middle\").call(i.font,h.title.font)})),b.exit().remove()}},11435:function(t,e,r){\"use strict\";var n=r(35509),i=r(65888).findBin,a=r(45664),o=r(20349),s=r(54495),l=r(73057);t.exports=function(t){var e=t._a,r=t._b,u=e.length,c=r.length,f=t.aaxis,h=t.baxis,p=e[0],d=e[u-1],v=r[0],g=r[c-1],y=e[e.length-1]-e[0],m=r[r.length-1]-r[0],x=y*n.RELATIVE_CULL_TOLERANCE,b=m*n.RELATIVE_CULL_TOLERANCE;p-=x,d+=x,v-=b,g+=b,t.isVisible=function(t,e){return t>p&&tv&&ed||eg},t.setScale=function(){var e=t._x,r=t._y,n=a(t._xctrl,t._yctrl,e,r,f.smoothing,h.smoothing);t._xctrl=n[0],t._yctrl=n[1],t.evalxy=o([t._xctrl,t._yctrl],u,c,f.smoothing,h.smoothing),t.dxydi=s([t._xctrl,t._yctrl],f.smoothing,h.smoothing),t.dxydj=l([t._xctrl,t._yctrl],f.smoothing,h.smoothing)},t.i2a=function(t){var r=Math.max(0,Math.floor(t[0]),u-2),n=t[0]-r;return(1-n)*e[r]+n*e[r+1]},t.j2b=function(t){var e=Math.max(0,Math.floor(t[1]),u-2),n=t[1]-e;return(1-n)*r[e]+n*r[e+1]},t.ij2ab=function(e){return[t.i2a(e[0]),t.j2b(e[1])]},t.a2i=function(t){var r=Math.max(0,Math.min(i(t,e),u-2)),n=e[r],a=e[r+1];return Math.max(0,Math.min(u-1,r+(t-n)/(a-n)))},t.b2j=function(t){var e=Math.max(0,Math.min(i(t,r),c-2)),n=r[e],a=r[e+1];return Math.max(0,Math.min(c-1,e+(t-n)/(a-n)))},t.ab2ij=function(e){return[t.a2i(e[0]),t.b2j(e[1])]},t.i2c=function(e,r){return t.evalxy([],e,r)},t.ab2xy=function(n,i,a){if(!a&&(ne[u-1]|ir[c-1]))return[!1,!1];var o=t.a2i(n),s=t.b2j(i),l=t.evalxy([],o,s);if(a){var f,h,p,d,v=0,g=0,y=[];ne[u-1]?(f=u-2,h=1,v=(n-e[u-1])/(e[u-1]-e[u-2])):h=o-(f=Math.max(0,Math.min(u-2,Math.floor(o)))),ir[c-1]?(p=c-2,d=1,g=(i-r[c-1])/(r[c-1]-r[c-2])):d=s-(p=Math.max(0,Math.min(c-2,Math.floor(s)))),v&&(t.dxydi(y,f,p,h,d),l[0]+=y[0]*v,l[1]+=y[1]*v),g&&(t.dxydj(y,f,p,h,d),l[0]+=y[0]*g,l[1]+=y[1]*g)}return l},t.c2p=function(t,e,r){return[e.c2p(t[0]),r.c2p(t[1])]},t.p2x=function(t,e,r){return[e.p2c(t[0]),r.p2c(t[1])]},t.dadi=function(t){var r=Math.max(0,Math.min(e.length-2,t));return e[r+1]-e[r]},t.dbdj=function(t){var e=Math.max(0,Math.min(r.length-2,t));return r[e+1]-r[e]},t.dxyda=function(e,r,n,i){var a=t.dxydi(null,e,r,n,i),o=t.dadi(e,n);return[a[0]/o,a[1]/o]},t.dxydb=function(e,r,n,i){var a=t.dxydj(null,e,r,n,i),o=t.dbdj(r,i);return[a[0]/o,a[1]/o]},t.dxyda_rough=function(e,r,n){var i=y*(n||.1),a=t.ab2xy(e+i,r,!0),o=t.ab2xy(e-i,r,!0);return[.5*(a[0]-o[0])/i,.5*(a[1]-o[1])/i]},t.dxydb_rough=function(e,r,n){var i=m*(n||.1),a=t.ab2xy(e,r+i,!0),o=t.ab2xy(e,r-i,!0);return[.5*(a[0]-o[0])/i,.5*(a[1]-o[1])/i]},t.dpdx=function(t){return t._m},t.dpdy=function(t){return t._m}}},72505:function(t,e,r){\"use strict\";var n=r(71828);t.exports=function(t,e,r){var i,a,o,s=[],l=[],u=t[0].length,c=t.length;function f(e,r){var n,i=0,a=0;return e>0&&void 0!==(n=t[r][e-1])&&(a++,i+=n),e0&&void 0!==(n=t[r-1][e])&&(a++,i+=n),r0&&a