{ "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": 1, "id": "0c1a7c93", "metadata": { "editable": true, "execution": { "iopub.execute_input": "2026-06-03T08:50:01.718291Z", "iopub.status.busy": "2026-06-03T08:50:01.717983Z", "iopub.status.idle": "2026-06-03T08:50:02.256204Z", "shell.execute_reply": "2026-06-03T08:50:02.255815Z" }, "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": 2, "id": "063c35c2", "metadata": { "editable": true, "execution": { "iopub.execute_input": "2026-06-03T08:50:02.258056Z", "iopub.status.busy": "2026-06-03T08:50:02.257752Z", "iopub.status.idle": "2026-06-03T08:50:02.780748Z", "shell.execute_reply": "2026-06-03T08:50:02.780486Z" }, "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": 3, "id": "3102955a", "metadata": { "editable": true, "execution": { "iopub.execute_input": "2026-06-03T08:50:02.782276Z", "iopub.status.busy": "2026-06-03T08:50:02.782197Z", "iopub.status.idle": "2026-06-03T08:50:02.783877Z", "shell.execute_reply": "2026-06-03T08:50:02.783656Z" }, "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": 4, "id": "b9035407", "metadata": { "editable": true, "execution": { "iopub.execute_input": "2026-06-03T08:50:02.785118Z", "iopub.status.busy": "2026-06-03T08:50:02.785050Z", "iopub.status.idle": "2026-06-03T08:50:02.796348Z", "shell.execute_reply": "2026-06-03T08:50:02.796101Z" }, "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": 5, "id": "80301cc6", "metadata": { "editable": true, "execution": { "iopub.execute_input": "2026-06-03T08:50:02.798025Z", "iopub.status.busy": "2026-06-03T08:50:02.797936Z", "iopub.status.idle": "2026-06-03T08:50:02.800021Z", "shell.execute_reply": "2026-06-03T08:50:02.799809Z" }, "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": 6, "id": "8f63facd", "metadata": { "editable": true, "execution": { "iopub.execute_input": "2026-06-03T08:50:02.801255Z", "iopub.status.busy": "2026-06-03T08:50:02.801179Z", "iopub.status.idle": "2026-06-03T08:50:02.803261Z", "shell.execute_reply": "2026-06-03T08:50:02.803046Z" }, "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": 7, "id": "ab20ac9d", "metadata": { "editable": true, "execution": { "iopub.execute_input": "2026-06-03T08:50:02.804505Z", "iopub.status.busy": "2026-06-03T08:50:02.804439Z", "iopub.status.idle": "2026-06-03T08:50:06.214862Z", "shell.execute_reply": "2026-06-03T08:50:06.214622Z" }, "tags": [ "thebe-init" ] }, "outputs": [ { "data": { "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAisAAAGxCAYAAACju/aQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAACTg0lEQVR4nO29eZwVxdX//5nBYYZ1UJBNEHAhUYm7EcgTkRi3uCcxj9mUR8VEwSXRX6JRI7jEJI9k+brEuASzr5pETUwUt8SoCUGe79fliS8XRFSQgMIgyABz+/fHTN2pW1PVtXfV7Vvv1+u+5naf7qrT1VWnTp9Tfacpy7IMiUQikUgkEpHSHFqBRCKRSCQSiTySs5JIJBKJRCJqkrOSSCQSiUQiapKzkkgkEolEImqSs5JIJBKJRCJqkrOSSCQSiUQiapKzkkgkEolEImqSs5JIJBKJRCJqkrOSSCQSiUQiapKzkqg77rjjDjQ1NQk/jzzySGgVvbNo0SJMmzYNAwcOxIgRIzBr1iysXr1aet7KlStx2WWXYdq0aRgxYgSGDh2KAw44ALfccgu6urpyz73tttvQ1NSEwYMH5x6XZRkOOeQQNDU1Ye7cudxjli9fjtNPPx1jx45Fa2srdtppJ5x00kl9jlu9ejVmzZqFESNGYODAgZg2bRoefPDBPsfde++9OPXUU/G+970PLS0taGpq4tY7b9683L7zi1/8ouZ6TzzxREycOBEDBgzAbrvthrPPPhsrV67Mvf4333wTw4cPR1NTE37zm9/UyB566CGcfvrpeO9734tBgwZhp512wgknnIAlS5Zw2/H//J//g/e+971obW3FmDFjcPbZZ+Ptt982btO77roLn/zkJ7HbbrthwIABmDhxIj796U/jhRde4Ja5ceNGfPWrX8XkyZPR2tqK4cOHY+bMmX2Ov+yyy3Dsscdip512QlNTE2bNmsUt7+c//zkOOeQQjBo1Cq2trRg7diyOO+44PP7446LmTCQAANuFViCRMGXhwoV473vf22f/nnvuGUCb4nj00Udx9NFH45hjjsHvf/97rF69Gl/+8pdx2GGH4Z///CdaW1uF5y5ZsgQ/+tGPcOqpp+Lyyy9HS0sL7rvvPpx99tl48skn8YMf/IB73uuvv46LLroIY8eOxfr163P1u/HGG/Hiiy8K5c888wwOPfRQ7LLLLrjuuuswbtw4rFy5En/+859rjuvs7MRhhx2GdevW4bvf/S5GjhyJG2+8EUcddRQWLVqEGTNmVI/97W9/iyeffBL77bcfWltbuZM/AJx55pk46qij+uyfPXs2XnrppRrZFVdcgZkzZ+JrX/sadtppJzz//PO46qqr8Pvf/x5Lly7FqFGjuHXMmTMHbW1tXNn3vvc9rF27Fueffz723HNP/Pvf/8aCBQswdepU/PnPf8aHPvSh6rEXXXQRvvOd7+Ciiy7Chz/8YTz33HP46le/isWLF+OJJ55AS0uLdpt+4xvfwOjRo3HppZdil112wYoVK/C1r30N+++/P5588knstdde1WPfeecdzJw5E2+88QYuvvhi7L333li/fj0ef/xxbNq0qabcb3/729h7771x/PHHC/sQAKxduxYf+MAHcP7552PEiBFYuXIlvvWtb+GQQw7Bgw8+WHNPE4kaskSizli4cGEGIFu8eHFoVbIsy7ItW7ZkW7duLay+gw46KNtzzz1r6vzb3/6WAchuuumm3HPfeuutbMuWLX32z5kzJwOQvfrqq9zzjj322Oy4447LTjvttGzQoEHC8pctW5YNHjw4u+uuuzIA2Zw5c2rklUol23fffbN9990327x5c66uN954YwYge/zxx6v7tm7dmu25557Z+9///ppju7q6+lyLKsuWLcuampqyz3zmMzX733zzzT7HLl68OAOQXXXVVdyyfvOb32SDBw/OfvjDH2YAsl//+tfSMjds2JCNGjUqO+yww6r7Xnvttaxfv37ZueeeW3Psz372swxAdsstt1T36bQpr/7XX389a2lpyc4444ya/eeff342aNCg7KWXXsotM8tq23/QoEHZaaedJj2HsG7duqylpSX77Gc/q3xOovFIaaBEqSGpiB//+MfYY489MHDgQOyzzz649957+xz7wgsv4FOf+hRGjhyJ1tZW7LHHHrjxxhtrjnnkkUfQ1NSEH//4x7jwwgux0047obW1tRpJuPXWW6sh8z333BM/+9nPMGvWLEycOBFAd2h/9913x5FHHtmn/nfeeQft7e2YM2eO8Hpef/11LF68GJ/97Gex3Xa9gdHp06dj8uTJ+O1vf5vbHttvv33NEznh/e9/PwDgtdde6yP7yU9+gkcffRQ33XRTbtkAcNZZZ+Hwww/npnQA4C9/+Qv+53/+BxdccEFuBAjojpa85z3vwbRp06r7tttuO3zmM5/BP/7xD7z++uvV/c3N5qbsBz/4AbIsw5lnnlmzf+TIkX2OPeCAA9CvXz+sWLGij+ytt97CnDlzcM0112DnnXfm1sUrc/Dgwdhzzz1rynzyySfR1dWFj3zkIzXHHnvssQCAO++8s7pPp0159Y8dOxbjxo2rqX/Tpk247bbbcPLJJ2OXXXbJLROwa/8hQ4agra2tpj8nEizJWUnULV1dXdi2bVvNh7fu4g9/+ANuuOEGXHnllbjzzjuxww474KSTTsLLL79cPea5557DQQcdhGeeeQYLFizAvffei2OOOQbnnXce5s+f36fMSy65BK+++ipuvvlm3HPPPRg5ciRuueUWnHXWWdh7771x11134bLLLsP8+fNr1tA0NTXh3HPPxQMPPNAn7/+jH/0IHR0duc7KM888AwDYe++9+8j23nvvqlyXhx56CNtttx0mT55cs3/16tW44IIL8PWvfx3jxo3LLeO2227DP/7xD9xwww3CY/7yl78A6J6gPvKRj6CtrQ2DBw/Gsccei3/96181xz7zzDPC6wSAZ599Vuna8qhUKrjjjjuw2267KaUgHn30UXR1ddWkSwjnnXceJk2aJFynI2L9+vV46qmnasrcsmULAPRxPsh6nP/3//5fdZ9Om/J4+eWXsXz58pr6lyxZgo0bN2L33XfH2Wefje233x79+/fHgQceiD/84Q9a18ejq6sLW7duxSuvvIKzzz4bWZbl9vtEIqWBEnUHSQPxPv369as5FkA2atSorKOjo7pv1apVWXNzc3bttddW9x155JHZuHHjsvXr19ecP3fu3KytrS176623sizLsocffjgDkB1yyCE1x3V1dWWjR4/ODj744Jr9y5cvz1paWrIJEyZU93V0dGRDhgzJzj///Jpj99xzz2zmzJm51/7Tn/40A5A98cQTfWRnnXVW1r9//9zzefz5z3/Ompubsy984Qt9ZB/72Mey6dOnZ5VKJcuyTJgGeu2117L29vbs+9//fnUfOGmgz33ucxmAbOjQodkZZ5yRLVq0KPvxj3+cTZgwIRsxYkT2xhtvVI9taWnJPve5z/Wp6/HHH88AZD/72c+416OTBrrvvvsyADV9QURHR0e2xx57ZOPHj882bNhQI7v33nuzlpaW7Omnn86yrLefsGkgHp/+9Kez7bbbLvvnP/9Z3fc///M/3HTTgw8+mAGouc86bcqydevW7NBDD82GDh1akwL8+c9/Xi3zAx/4QHb33Xdn9957bzZz5sysqakp+9Of/iQsUyUN9J73vKc6ZseMGZM99thjuccnEinulqhbfvSjH2GPPfao2cd7C2TmzJkYMmRIdXvUqFEYOXIkli9fDgDYvHkzHnzwQZx99tkYOHAgtm3bVj32Ix/5CG644QY8+eSTOProo6v7P/axj9XU8fzzz2PVqlX4//6//69m/84774wPfOADWLZsWXXfkCFD8F//9V+44447cM0112DQoEF46KGH8Nxzz+Gqq65SunbR2y6i/SKeeuopfOITn8DUqVNx7bXX1sjuvPNO3HPPPVi6dKm03M9//vPYZ599MHv27NzjKpUKAGDatGm47bbbqvunTJmC/fbbDzfeeCOuvvpqpevRvVYet99+O7bbbjvh2yuEzZs346Mf/SiWL1+Ohx56qOaNqPXr1+Nzn/scvvzlL2PKlCla9V9++eX46U9/iuuvvx4HHHBAdf8+++yDQw45BP/93/+N97znPTj88MPx3HPP4fOf/zz69etXk3bRbVNClmU444wz8Ne//hV33nknxo8f36fM/v3747777quOn5kzZ2L33XfHVVddxU1lqnLnnXdi48aN1ejk0UcfjbvvvhuHHnqocZmJcpOclUTdsscee+DAAw+UHjd8+PA++1pbW/Huu+8C6H5DYdu2bbj++utx/fXXc8tYs2ZNzfaYMWNqtteuXQsA3DdERo0aVeOsAMC5556LG264AT/96U9x1lln4YYbbsC4ceNwwgknKF0LqY/mrbfewg477JB7Ps3SpUtx+OGHY/fdd8cf//jHmpTDO++8gzlz5uDcc8/F2LFjsW7dOgC96Yl169ahpaUFgwYNwm9+8xv86U9/wmOPPdbnTaEtW7Zg3bp1GDRoEFpaWqr6sxPdvvvuizFjxuCpp56quVbRdQLQulYea9aswd13341jjjkGo0ePFh7X2dmJk046CY899hjuvfdeHHzwwTXySy+9FC0tLZg7d261nd555x0A3Ws/1q1bh/b29j7O1fz583H11Vfjmmuu4aaOfv3rX2PWrFn4xCc+AaDbcfjCF76ARYsWVesBoNWmhKxnjc5PfvIT/PCHP+zT70iZ06dPr3H0Bw4ciBkzZuB3v/udqLmUICmn97///TjxxBOx33774fzzz8f//b//16rcRHlJzkqi4dl+++3Rr18/fPaznxXmzSdNmlSzzU48xLi/+eabfc5dtWpVn3277bYbjj76aNx4443Vp8r58+ejX79+ubqSJ/enn366z+LLp59+WvnJfunSpfjwhz+MCRMm4P7770d7e3uNfM2aNXjzzTexYMECLFiwoM/522+/PU444QT87ne/wzPPPINt27Zh6tSpfY679dZbceutt+K3v/0tTjzxRO4aFEKWZTURg/e97314+umn+xxH9ulGMVh+/OMfY8uWLX0W1tJ0dnbixBNPxMMPP4zf//73OOyww/oc88wzz+CVV17hOjynnXYaAODtt9/GsGHDqvvnz5+PefPmYd68efjKV77CrXvkyJH44x//iNWrV2PVqlWYMGECBgwYgJtuugkf//jHq8fptCnZd+aZZ2LhwoW4/fbb8ZnPfKbPebpl2rDddtth//33x69+9StnZSZKSMgcVCJhgs6ry+Csm8iyLJswYUJNXv3DH/5wts8++2SdnZ255YnWIuisWSHcf//9GYBs5syZWf/+/bmvlfJ4//vfn02ZMiXbtm1bdd8TTzyRAci+973vSc9funRptsMOO2R77713tmbNGu4x7777bvbwww/3+Rx55JFZW1tb9vDDD1fXZyxbtox7LIDsxBNPzB5++OHs3//+d5ZlWfb2229nAwcOzA4//PCa+pYsWdJnjcZNN92UAciefPLJ6r6tW7dme+21V592plFds7LXXntlY8eOrWlHms2bN2dHH3101r9//+zee+8VlrN06dI+1/7tb387A5DNmzcve/jhh2teM7/yyiszANlll10m1ZHlu9/9btbc3JwtWbKkuk+nTSuVSnbGGWdkTU1NNa8/85g2bVo2fPjwmnVcGzduzMaMGVPzmjWL7qvL7777bjZ58uRsypQpyuckGo8UWUnULeSJnmXXXXfFjjvuqFXWd7/7XfzHf/wHPvjBD+Lss8/GxIkTsWHDBrz44ou455578NBDD+We39zcjPnz5+Nzn/scPv7xj+P000/HunXrMH/+fIwZM4b7JHr44Ydjzz33xMMPP4zPfOYz3NdKeXzjG9/A4YcfjpNPPhnnnHMOVq9ejYsvvhhTpkzBf/3Xf1WPW758OXbddVecdtppuP322wF0r6358Ic/DAC45ppr8MILL9S8lUTarq2tjbt+4I477kC/fv1qZBMnTqy+ms2y00471Rw7bNgwXHnllbjoooswa9YsfPKTn8SqVatw+eWXY+edd8Y555xTPfb000/HjTfeiJNPPhlf//rXMXLkSNx00014/vnnsWjRopp6li9fjsWLFwMAXnrpJQCo/nrsxIkT+6QL//73v+PZZ5/FV77yFWE06+Mf/zjuu+8+XHrppRg+fDiefPLJqmzo0KHVHx/cd999uecD3ekO+voXLFiAr371qzjqqKNwzDHH1JQJoCY6deuttwLovifr1q3Dfffdh9tvv736I24mbXreeefh9ttvx+mnn473ve99NfW3trZiv/32q25fd911mDlzJo488kh8+ctfRlNTExYsWIA1a9b0WVv16KOP4t///jeA7jd9li9fXm3/GTNmVMfj9OnTcfzxx2OPPfZAe3s7XnnlFXzve9/DSy+9JH3tPtHghPaWEgld8t4GApDdeuut1WOhGFnJsu4Iwemnn57ttNNOWUtLS7bjjjtm06dPz66++urqMbK3PG655ZZst912y/r3759Nnjw5+8EPfpCdcMIJ2X777cc9ft68eX2iByrcf//92dSpU7O2trZshx12yE499dQ+kZlly5ZlAGquU9Z2CxcuzK1X9qNwNKK2z7Isu/XWW7MpU6Zk/fv3z4YPH559+tOfzlasWNHnuFWrVmWnnnpqtsMOO2RtbW3Z1KlTswceeKDPcXnXxXvKnz17dtbU1JT7g2d57TRjxozcaxf1kxkzZuSWS/P9738/22OPPbKBAwdmgwcPzj74wQ9mv/vd74R1qrTphAkThHXzon9//etfsxkzZmQDBw7MBg4cmH3oQx/K/va3v/U5Lu+6Hn744epxF154YbbPPvtk7e3t2XbbbZeNHj06O+mkk7hlJhI0TVmWZW7dn0QiQVi3bh0mT56ME088Ebfccksf+YEHHoimpqZqVCCRSCQSfUlpoETCEatWrcI111yDmTNnYvjw4Vi+fDm+/e1vY8OGDTj//POrx3V0dOCZZ57BvffeiyVLlqTwdyKRSEhIzkoi4YjW1la88sorOOecc/DWW29h4MCBmDp1Km6++eaaXwd96qmnqg7NFVdcgRNPPDGc0olEIlEHpDRQIpFIJBKJqEn/GyiRSCQSiUTUJGclkUgkEolE1CRnJZFIJBKJRNTU/QLbSqWCN954A0OGDHHyj80S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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "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 }