{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Adaptive PDE discretizations on Cartesian grids\n", "## Volume : Non-divergence form PDEs\n", "## Part : Monotone numerical schemes\n", "## Chapter : PDEs with a first order non-linearity\n", "\n", "This notebook illustrates the use of monotone finite difference schemes to compute viscosity solutions of non-linear PDEs, in two space dimensions. \n", "We consider the PDE\n", "$$\n", " {-} \\mathrm{Tr}(A(x) \\nabla^2 u(x)) + F(x, \\nabla u(x)) = 1,\n", "$$\n", "with Dirichlet boundary conditions, where $\\|v\\|_D^2 := $. \n", "For illustration, we consider a quadratic non-linearity:\n", "$$\n", " F(x, \\nabla u(x)) := \\| \\nabla u(x) -\\omega(x)\\|^2_{D(x)}\n", "$$\n", "More details on this problem below.\n", "\n", "\n", "Two possibilities are considered for the discretization of the first order non-linear (quadratic) term, in a monotone fashion. One is second order accurate, but requires the diffusion tensors $A$ to be positive definite, and the solution to be smooth enough, for monotony to hold. The other possibility is only first order accurate, but unconditionally monotone.\n", "\n", "Our numerical schemes use adaptive stencils, and depend on Selling's decomposition of the diffusion tensors $A$ and $D$. Their implementation is fairly simple and compact (approx. ten lines) thanks to the use of sparse automatic differentiation.\n", "\n", "**Reference.**\n", "\n", "The use of Selling's algorithm for the discretization of anisotropic PDEs was first introduced in:\n", "* Bonnans, J. F., Ottenwaelter, E., Zidani, H. (2004). A fast algorithm for the two dimensional HJB equation of stochastic control. ESAIM: Mathematical Modelling and Numerical Analysis, 38(4), 723–735.\n", "* Fehrenbach, J., & Mirebeau, J.-M. (2014). Sparse non-negative stencils for anisotropic diffusion. Journal of Mathematical Imaging and Vision, 49(1), 123–147. http://doi.org/http://dx.doi.org/10.1007/s10851-013-0446-3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[**Summary**](Summary.ipynb) of volume Non-Divergence form PDEs, this series of notebooks.\n", "\n", "[**Main summary**](../Summary.ipynb) of the Adaptive Grid Discretizations \n", "\tbook of notebooks, including the other volumes.\n", "\n", "# Table of contents\n", " * [1. Numerical schemes](#1.-Numerical-schemes)\n", " * [1.1 Centered scheme](#1.1-Centered-scheme)\n", " * [1.2 Upwind type scheme](#1.2-Upwind-type-scheme)\n", " * [1.3 Numerical tests](#1.3-Numerical-tests)\n", " * [1.4 Alternative centered scheme](#1.4-Alternative-centered-scheme)\n", " * [2. Pure eikonal equations](#2.-Pure-eikonal-equations)\n", " * [2.1 A Riemannian eikonal equation](#2.1-A-Riemannian-eikonal-equation)\n", " * [2.2 An eikonal equation of Rander type](#2.2-An-eikonal-equation-of-Rander-type)\n", "\n", "\n", "\n", "**Acknowledgement.** Some of the experiments presented in these notebooks are part of \n", "ongoing research with Ludovic Métivier and Da Chen.\n", "\n", "Copyright Jean-Marie Mirebeau, Centre Borelli, ENS Paris-Saclay, CNRS, University Paris-Saclay" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0. Importing the required libraries" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:26.122587Z", "iopub.status.busy": "2024-04-30T08:50:26.122083Z", "iopub.status.idle": "2024-04-30T08:50:26.132159Z", "shell.execute_reply": "2024-04-30T08:50:26.131743Z" } }, "outputs": [], "source": [ "import sys; sys.path.insert(0,\"..\") # Allow import of agd from parent directory (useless if conda package installed)\n", "#from Miscellaneous import TocTools; print(TocTools.displayTOC('NonlinearMonotoneFirst2D','NonDiv'))" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:26.134661Z", "iopub.status.busy": "2024-04-30T08:50:26.134456Z", "iopub.status.idle": "2024-04-30T08:50:26.188492Z", "shell.execute_reply": "2024-04-30T08:50:26.188178Z" }, "tags": [ "ExportCode" ] }, "outputs": [], "source": [ "from agd import Selling\n", "from agd import LinearParallel as lp\n", "from agd import AutomaticDifferentiation as ad\n", "from agd import Domain" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:26.190293Z", "iopub.status.busy": "2024-04-30T08:50:26.190162Z", "iopub.status.idle": "2024-04-30T08:50:26.391003Z", "shell.execute_reply": "2024-04-30T08:50:26.390655Z" }, "tags": [ "ExportCode" ] }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import scipy.linalg;\n", "import itertools" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Some utility functions" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:26.392764Z", "iopub.status.busy": "2024-04-30T08:50:26.392639Z", "iopub.status.idle": "2024-04-30T08:50:26.394362Z", "shell.execute_reply": "2024-04-30T08:50:26.394128Z" } }, "outputs": [], "source": [ "newton_root = ad.Optimization.newton_root\n", "stop = ad.Optimization.stop_default\n", "every4 = itertools.count(1,4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Numerical schemes\n", "\n", "We propose several approches for discretizing the proposed PDE, whose properties are summarized below:\n", "\n", "| Finite differences | Monotony | Accuracy | Non-linearity |\n", "|--|--|--|--|\n", "| Centered | Conditional | Second order | General |\n", "| Upwind | Unconditional | First order | Quadratic |\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.1 Centered scheme \n", "\n", "Recall that we consider the PDE \n", "$$\n", "-\\mathrm{Tr}(A(x) \\nabla^2 u(x)) + F(x, \\nabla u(x)) = 1\n", "$$\n", "with Dirichlet boundary conditions. \n", "\n", "We propose below a numerical scheme, that is degenerate elliptic (maximum principle holds) under the following additional assumptions:\n", "* the tensors $A(x)$ are Lipschitz and uniformly positive definite,\n", "* the function $F$ uniformly Lipschitz in its second variable, \n", "* the discretization grid scale $h>0$ is sufficiently small.\n", "\n", "The discretization of the first order term $F(x,\\nabla u(x))$ is based on centered finite differences, along specific directions. Their lack of monotony is compensated by the second order term $-\\mathrm{Tr}(A(x) \\nabla^2 u(x))$. \n", "\n", "**Connection with the Lax-Friedrichs approximation.**\n", "The Lax Friedrichs approximation is based, likewise, on the use of centered finite differences, whose monotony is compensated by a linear second order operator. The key difference is, however, that the Lax-Friedrichs scheme only uses finite differences along the coordinate axes, and introduces an additional isotropic diffusion term, thus loosing second order accuracy.\n", "\n", "\n", "\n", "**Note on the uniform Lipschitz regularity assumption.**\n", "The non-linearity $F$ considered in our examples is quadratic, hence it isn't uniformly Lipschitz. \n", "As a result, the scheme looses the degenerate ellipticity property if the solution gradient is excessively large, or unbounded.\n", "\n", "**Discretization of the second order term.** Consider a tensor decomposition of the form\n", "$$\n", " A(x) = \\sum_{1 \\leq i \\leq n} \\mu_i(x) e_i(x) e_i(x)^T,\n", "$$\n", "where $\\mu_i(x)\\geq 0$ and $e_i(x)$ has integer entries. Typically, we obtain such a decomposition using Selling's formula. The second order part of the operator is discretized using centered finite differences.\n", "$$\n", " -\\mathrm{Tr}(A(x) \\nabla^2 u(x)) = -\\sum_{1 \\leq i \\leq n} \\mu_i(x) \\frac{u(x+he_i(x)) - 2 u(x) +u(x-h e_i(x))}{h^2} + O(h^2).\n", "$$\n", "\n", "\n", "**Discretization of the first order term.**\n", "We approximate the product $A(x)\\nabla u(x)$ using second order finite differences:\n", "$$\n", "A(x) \\nabla u(x) = \\sum_{1 \\leq i \\leq n} \\mu_i \\frac{u(x+h e_i)-u(x-h e_i)} {2 h} e_i + O(h^2).\n", "$$\n", "Form this point, a second order finite difference approximation of the gradient $\\nabla u(x)$ is obtained by applying the linear mapping $A(x)^{-1}$ to both sides. After what, the non-linear functional $F$ can be applied to both sides. No specific form of this functional is required." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:26.395777Z", "iopub.status.busy": "2024-04-30T08:50:26.395701Z", "iopub.status.idle": "2024-04-30T08:50:26.397915Z", "shell.execute_reply": "2024-04-30T08:50:26.397687Z" }, "tags": [ "ExportCode" ] }, "outputs": [], "source": [ "def Gradient(u,A,bc,decomp=None):\n", " \"\"\"\n", " Approximates grad u(x), using finite differences along the axes of A.\n", " \"\"\"\n", " coefs,offsets = Selling.Decomposition(A) if decomp is None else decomp\n", " du = bc.DiffCentered(u,offsets) \n", " AGrad = lp.dot_AV(offsets.astype(float),(coefs*du)) # Approximates A * grad u\n", " return lp.solve_AV(A,AGrad) # Approximates A^{-1} (A * grad u) = grad u" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:26.399232Z", "iopub.status.busy": "2024-04-30T08:50:26.399137Z", "iopub.status.idle": "2024-04-30T08:50:26.401483Z", "shell.execute_reply": "2024-04-30T08:50:26.401265Z" }, "tags": [ "ExportCode" ] }, "outputs": [], "source": [ "def SchemeCentered(u,A,F,rhs,bc):\n", " \"\"\"\n", " Discretization of - Tr(A(x) hess u(x)) + F(grad u(x)) - rhs,\n", " with Dirichlet boundary conditions. The scheme is second order,\n", " and degenerate elliptic under suitable assumptions.\n", " \"\"\"\n", " # Compute the tensor decomposition\n", " coefs,offsets = Selling.Decomposition(A)\n", " A,coefs,offsets = (bc.as_field(e) for e in (A,coefs,offsets))\n", " \n", " # Obtain the first and second order finite differences\n", " grad = Gradient(u,A,bc,decomp=(coefs,offsets))\n", " d2u = bc.Diff2(u,offsets) \n", " \n", " # Numerical scheme in interior \n", " residue = -lp.dot_VV(coefs,d2u) + F(grad) - rhs\n", " \n", " # Placeholders outside domain\n", " return np.where(bc.interior,residue,u-bc.grid_values)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:26.402858Z", "iopub.status.busy": "2024-04-30T08:50:26.402759Z", "iopub.status.idle": "2024-04-30T08:50:26.404832Z", "shell.execute_reply": "2024-04-30T08:50:26.404587Z" }, "tags": [ "ExportCode" ] }, "outputs": [], "source": [ "# Specialization for the quadratic non-linearity\n", "def SchemeCentered_Quad(u,A,omega,D,rhs,bc):\n", " omega,D = (bc.as_field(e) for e in (omega,D))\n", " def F(g): return lp.dot_VAV(g-omega,D,g-omega)\n", " return SchemeCentered(u,A,F,rhs,bc)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.2 Upwind type scheme\n", "\n", "As announced we assume here a specific form of the PDE non-linearity:\n", "$$\n", " F(x,\\nabla u(x)) = \\|\\nabla u(x) - \\omega(x)\\|^2_{D(x)}\n", "$$\n", "\n", "We propose below a numerical schemes that is degenerate elliptic as soon as $D$ and $A$ are everywhere positive definite. (Or positive semi-definite, provided the required tensor decompositions exist.)\n", "\n", "For that purpose, we introduce a decomposition of the tensors appearing in the first order non-linearity\n", "$$\n", " D(x) = \\sum_{1 \\leq i \\leq n} \\nu_i(x) f_i(x) f_i(x)^T,\n", "$$\n", "involving again non-negative weights $\\nu_i(x)\\geq 0$ and offsets with integer coordinates $f_i(x) \\in Z^d$.\n", "We then discretize the non-linearity using first order upwind finite differences\n", "$$\n", " F(x,\\nabla u(x)) = \n", " \\sum_{1 \\leq i \\leq n} \\nu_i(x) \\max\\left\\{0,\n", " <\\omega(x),f_i(x)> - \\frac{u(x+h f_i(x))-u(x)}{h},\n", " -<\\omega(x),f_i(x)> - \\frac{u(x-h f_i(x))-u(x)}{h}\n", " \\right\\}^2 + O(h)\n", "$$" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:26.406198Z", "iopub.status.busy": "2024-04-30T08:50:26.406103Z", "iopub.status.idle": "2024-04-30T08:50:26.409280Z", "shell.execute_reply": "2024-04-30T08:50:26.409032Z" }, "tags": [ "ExportCode" ] }, "outputs": [], "source": [ "def SchemeUpwind(u,A,omega,D,rhs,bc):\n", " \"\"\"\n", " Discretization of -Tr(A(x) hess u(x)) + \\| grad u(x) - omega(x) \\|_D(x)^2 - rhs,\n", " with Dirichlet boundary conditions, using upwind finite differences for the first order part.\n", " The scheme is degenerate elliptic if A and D are positive definite. \n", " \"\"\"\n", " # Compute the decompositions (here offset_e = offset_f)\n", " nothing = (np.full((0,),0.), np.full((2,0),0)) # empty coefs and offsets\n", " mu,offset_e = nothing if A is None else Selling.Decomposition(A) \n", " nu,offset_f = nothing if D is None else Selling.Decomposition(D)\n", " omega_f = lp.dot_VA(omega,offset_f.astype(float))\n", "\n", " # First and second order finite differences\n", " maxi = np.maximum\n", " mu,nu,omega_f = (bc.as_field(e) for e in (mu,nu,omega_f))\n", "\n", " dup = bc.DiffUpwind(u, offset_f)\n", " dum = bc.DiffUpwind(u,-offset_f)\n", " dup[...,bc.not_interior]=0. # Placeholder values to silence NaN warnings\n", " dum[...,bc.not_interior]=0.\n", " \n", " d2u = bc.Diff2(u,offset_e)\n", " \n", " # Scheme in the interior\n", " du = maxi(0.,maxi( omega_f - dup, -omega_f - dum) )\n", " residue = - lp.dot_VV(mu,d2u) + lp.dot_VV(nu,du**2) - rhs\n", "\n", " # Placeholders outside domain\n", " return np.where(bc.interior,residue,u-bc.grid_values)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.3 Numerical tests" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We next choose some problem parameters. As a starter we solve \n", "$$\n", " -\\epsilon \\Delta u +\\| \\nabla u\\|^2 -1 = 0,\n", "$$\n", "with on the unit disk $B(0,1)$, with null boundary conditions.\n", "This is a a relaxation of the eikonal equation, and the solution is therefore close to the distance to the disk boundary." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:26.410709Z", "iopub.status.busy": "2024-04-30T08:50:26.410620Z", "iopub.status.idle": "2024-04-30T08:50:26.413446Z", "shell.execute_reply": "2024-04-30T08:50:26.413172Z" } }, "outputs": [], "source": [ "# Create the domain\n", "aX0 = np.linspace(-1,1,100); aX1=aX0;\n", "X = np.array(np.meshgrid(aX0,aX1,indexing='ij'))\n", "\n", "# Unit ball, with null Dirichlet boundary conditions, on grid X\n", "bc = Domain.Dirichlet(Domain.Ball(),0.,X)\n", "\n", "# A correctly shaped arbitrary guess for the solvers\n", "guess = np.zeros(bc.shape) " ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:26.414791Z", "iopub.status.busy": "2024-04-30T08:50:26.414708Z", "iopub.status.idle": "2024-04-30T08:50:26.416477Z", "shell.execute_reply": "2024-04-30T08:50:26.416261Z" } }, "outputs": [], "source": [ "A = 0.1*np.eye(2) \n", "omega = np.zeros(2)\n", "D = np.eye(2)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:26.417827Z", "iopub.status.busy": "2024-04-30T08:50:26.417744Z", "iopub.status.idle": "2024-04-30T08:50:28.691366Z", "shell.execute_reply": "2024-04-30T08:50:28.691063Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Centered discretization\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 1 Residue norm: 24.999950894587233\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 2 Residue norm: 6.0024804515672034\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 3 Residue norm: 1.2724251099266919\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 4 Residue norm: 0.16500802975014683\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 5 Residue norm: 0.0042807081614353315\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 6 Residue norm: 2.2617146211434402e-06\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 7 Residue norm: 3.608224830031759e-13\n", "Target residue reached. Terminating.\n", "\n", "Upwind discretization\n", "Iteration: 1 Residue norm: 24.99995089458734\n", "Iteration: 2 Residue norm: 6.003872999345725\n", "Iteration: 3 Residue norm: 1.2747915081784789\n", "Iteration: 4 Residue norm: 0.1666390652889247\n", "Iteration: 5 Residue norm: 0.004460489668933532\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 6 Residue norm: 2.60179986244502e-06\n", "Iteration: 7 Residue norm: 5.491163079796024e-13\n", "Target residue reached. Terminating.\n" ] } ], "source": [ "params0 = (A,omega,D,1.,bc)\n", "print(\"Centered discretization\"); \n", "solution_lf = newton_root(SchemeCentered_Quad,guess,params0)\n", "print()\n", "print(\"Upwind discretization\"); \n", "solution_upwind = newton_root(SchemeUpwind,guess,params0)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:28.692918Z", "iopub.status.busy": "2024-04-30T08:50:28.692826Z", "iopub.status.idle": "2024-04-30T08:50:28.817698Z", "shell.execute_reply": "2024-04-30T08:50:28.817409Z" } }, "outputs": [ { "data": { "image/png": "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8sor2s++UaL169fj8ssvBwDs2rVLu8IEAPzf//0ffv31V9xxxx04evQoevTogffeew9NmjTR1nnyySdRv359jBgxAr/++iuysrIwf/581KtXr9bb6na7MXny5IBpaQqNxyxyPGaR4zGLnBXHjHlvbzxmkeMxixyPWeSMOmYuIdN174iIiIiIyFKGfpMyERERERGphQ0CERERERFp2CAQEREREZGGDQIREREREWkc2yD885//RGZmJho2bBjyS9OqEkJgypQpaNGiBRo0aIDLL78cX375pbEbKpGjR48iJycHHo8HHo8HOTk5OHbsWLX3ueWWW+Byufxu6enp5mywRWbPno02bdogJiYGaWlp+Oijj6pdf+PGjUhLS0NMTAzatm2LOXPmmLSl8ojkmG3YsCHgNeVyufD111+buMXW+fDDDzF06FC0aNECLpcLb731Vo334WuMmV8bzPyaMe8jx7yPjFWZ79gGoaKiAtdffz3Gjx8f9n1mzJiBJ554As8++yy2bt2KxMRE9OvXD2VlZQZuqTxGjx6N7du3Y+3atVi7di22b9+OnJycGu83YMAAFBcXa7fVq1ebsLXWWLJkCSZMmIAHH3wQhYWF6NWrFwYOHIiioqKg6+/ZsweDBg1Cr169UFhYiAceeAB33303li1bZvKWWyfSY+aza9cuv9dVu3btTNpiax0/fhyXXHIJnn322bDW52vsLGZ+5Jj51WPeR455HznLMl843Msvvyw8Hk+N6505c0YkJiaKRx99VFt24sQJ4fF4xJw5cwzcQjns3LlTABCbN2/WlhUUFAgA4uuvvw55vzFjxohhw4aZsIVy6N69u7j99tv9lnXo0EHcf//9Qdf/v//7P9GhQwe/ZX/6059Eenq6Ydsom0iP2fr16wUAcfToURO2Tm4AxIoVK6pdh68xf8z88DDza8a8jxzzvm7MzHzHziBEas+ePSgpKUF2dra2zO12o0+fPti0aZOFW2aOgoICeDwe9OjRQ1uWnp4Oj8dT4/5v2LAB8fHxuPDCCzFu3DgcPHjQ6M21REVFBT799FO/1wgAZGdnhzxGBQUFAev3798f27Ztw8mTJw3bVlnU5pj5pKamIikpCVlZWVi/fr2Rm6k0p7/GaouZz8yvDvM+csx7c+j1OmODEKaSkhIAQEJCgt/yhIQE7f/srKSkBPHx8QHL4+Pjq93/gQMHYuHChfjggw8wc+ZMbN26FVdeeSXKy8uN3FxLHD58GKdPn47oNVJSUhJ0/VOnTuHw4cOGbassanPMkpKSMHfuXCxbtgzLly9H+/btkZWVhQ8//NCMTVaO019jtcXMZ+ZXh3kfOea9OfR6ndXXe8OsNGXKFEydOrXadbZu3Ypu3brV+jlcLpffz0KIgGUqCfeYAYH7DtS8/yNHjtT+3alTJ3Tr1g0pKSlYtWoVrr322lputdwifY0EWz/YcjuL5Ji1b98e7du3137OyMjA/v378fjjj6N3796Gbqeq7PoaY+ZHjpmvL+Z95Jj3xtPjdWarBuGuu+7CqFGjql2ndevWtXrsxMREAGc7s6SkJG35wYMHAzo1lYR7zD7//HP8+OOPAf936NChiPY/KSkJKSkp2L17d8TbKru4uDjUq1cvYCSkutdIYmJi0PXr16+P5s2bG7atsqjNMQsmPT0dCxYs0HvzbMHOrzFmfuSY+fpg3keOeW8OvV5ntmoQ4uLiEBcXZ8hjt2nTBomJicjPz0dqaiqAs+fTbdy4EdOnTzfkOc0Q7jHLyMiA1+vFJ598gu7duwMAtmzZAq/Xi8zMzLCf78iRI9i/f79fwbWL6OhopKWlIT8/H9dcc422PD8/H8OGDQt6n4yMDKxcudJv2XvvvYdu3bohKirK0O2VQW2OWTCFhYW2fE3pwc6vMWZ+5Jj5+mDeR455bw7dXmcRfaTZRvbt2ycKCwvF1KlTRePGjUVhYaEoLCwUZWVl2jrt27cXy5cv135+9NFHhcfjEcuXLxf//e9/xQ033CCSkpJEaWmpFbtgugEDBoguXbqIgoICUVBQIDp37iyGDBnit07lY1ZWViYmTZokNm3aJPbs2SPWr18vMjIyxPnnn2/bY7Z48WIRFRUl5s2bJ3bu3CkmTJggGjVqJPbu3SuEEOL+++8XOTk52vrff/+9aNiwobjnnnvEzp07xbx580RUVJR48803rdoF00V6zJ588kmxYsUK8c0334gvvvhC3H///QKAWLZsmVW7YKqysjItrwCIJ554QhQWFop9+/YJIfgaC4WZHzlmfvWY95Fj3kfOqsx3bIMwZswYASDgtn79em0dAOLll1/Wfj5z5oyYPHmySExMFG63W/Tu3Vv897//NX/jLXLkyBFx4403iiZNmogmTZqIG2+8MeDSY5WP2S+//CKys7PFeeedJ6KiokSrVq3EmDFjRFFRkfkbb6LnnntOpKSkiOjoaNG1a1exceNG7f/GjBkj+vTp47f+hg0bRGpqqoiOjhatW7cWzz//vMlbbL1Ijtn06dPFBRdcIGJiYkTTpk3F73//e7Fq1SoLttoavsv+Vb2NGTNGCMHXWCjM/Mgx82vGvI8c8z4yVmW+S4j//8kFIiIiIiJyPF7mlIiIiIiINGwQiIiIiIhIwwaBiIiIiIg0bBCIiIiIiEjDBoGIiIiIiDRsEIiIiIiISMMGgYiIiIiINGwQiIiIiIhIwwaBiIiIiIg0bBCIiIiIiEjDBoGIiIiIiDRsEIiIiIiISPP/AA/Ca814SI9sAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(9,4))\n", "plt.subplot(1,2,1); plt.axis('equal'); plt.title('Centered solution')\n", "plt.contourf(*X,solution_lf);\n", "plt.subplot(1,2,2); plt.axis('equal'); plt.title('Upwind solution')\n", "plt.contourf(*X,solution_upwind);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We introduce a drift term $\\omega$. While $|\\omega|<1$, the deterministic optimal control problem corresponding to $\\|\\nabla u - \\omega\\|=1$ remains locally controllable. The solution is smooth enough that the centered scheme remains monotone, and the two solutions agree." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:28.819214Z", "iopub.status.busy": "2024-04-30T08:50:28.819107Z", "iopub.status.idle": "2024-04-30T08:50:28.820839Z", "shell.execute_reply": "2024-04-30T08:50:28.820620Z" } }, "outputs": [], "source": [ "drift_direction = np.array( (1,1) )/np.sqrt(2)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:28.822234Z", "iopub.status.busy": "2024-04-30T08:50:28.822135Z", "iopub.status.idle": "2024-04-30T08:50:30.959484Z", "shell.execute_reply": "2024-04-30T08:50:30.959189Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Centered discretization\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 1 Residue norm: 30.40805941478243\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 2 Residue norm: 7.379568316641786\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 3 Residue norm: 1.0964622384982343\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 4 Residue norm: 0.01800476146249519\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 5 Residue norm: 2.6812805282716567e-06\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 6 Residue norm: 6.505906924303417e-14\n", "Target residue reached. Terminating.\n", "\n", "Upwind discretization\n", "Iteration: 1 Residue norm: 24.592819351648156\n", "Iteration: 2 Residue norm: 5.778192346917685\n", "Iteration: 3 Residue norm: 0.8418135077234823\n", "Iteration: 4 Residue norm: 0.01753768523541277\n", "Iteration: 5 Residue norm: 4.362129309321006e-06\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 6 Residue norm: 1.723066134218243e-13\n", "Target residue reached. Terminating.\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwgAAAF0CAYAAACHeh6EAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABdNklEQVR4nO3deXwU9f0/8NcKyYYrKxBzIBCOIoiAhiAkoYgKhNtboGiKLdKKWotov4pWOdoa8b5AS6WigoAWUClHDQqoJSBowHqAqEDAJnIIm0gl4fj8/uC3Qza7m+zszvH5zLyej0ceDzLM7s7O7r7eeX8+M7MeIYQAERERERERgLPs3gAiIiIiIpIHGwQiIiIiItKwQSAiIiIiIg0bBCIiIiIi0rBBICIiIiIiDRsEIiIiIiLSsEEgIiIiIiINGwQiIiIiItKwQSAiIiIiIg0bBDLFp59+il/96ldo3749kpKS0LRpU/Ts2ROPPPIIfvjhB9Me93//+x+mTZuGdevWmfYY8Zg2bRo8Ho+lj3nppZfi0ksvjem2K1euxLRp08L+X7t27XDTTTfFvF1E5GyBvDt48GDY/+/WrVvM2RQrM3IrnoyNlcfjiZjN9Zk9ezbmzZsXsnz37t3weDxh/4/cp6HdG0DO87e//Q233norOnfujD/84Q/o2rUrjh8/ji1btuCFF15AcXExli1bZspj/+9//8P06dMBwPLAdqKVK1di1qxZYQvRsmXLkJycbP1GERHFiLl1ukFISUkJaZQyMjJQXFyMjh072rNhJBU2CGSo4uJiTJw4EYMGDcKbb74Jr9er/d+gQYNw1113YfXq1TZuYWyOHz8Oj8eDhg35kQnIysqyexOIiHRhbkXm9XqRk5Nj92aQJHiIERnqoYcegsfjwZw5c4Kag4DExERcccUVQcsWL16M3NxcNGnSBE2bNsXgwYNRUlIStM5NN92Epk2b4uuvv8awYcPQtGlTtGnTBnfddReqqqoAnJ4ePeeccwAA06dPh8fjgcfjCRol2blzJ8aOHYvU1FR4vV6cf/75mDVrVtBjrVu3Dh6PB6+++iruuusunHvuufB6vfj6668BAGvWrMGAAQOQnJyMxo0bo2/fvnj33XdDnuuKFStw0UUXwev1on379njsscei3o8lJSUYMWKEtp2tWrXC8OHDsW/fPm2dY8eOYcqUKWjfvj0SExNx7rnn4rbbbsORI0fqvO/A86t9GFbt6eWbbrpJ2zeBfenxeLB7924A4afqS0tLceONNwbt38cffxynTp0KeZzHHnsMTzzxBNq3b4+mTZsiNzcXGzdujHofEZGzBLJp/vz5mDx5MtLT09GoUSP0798/qCasWLECHo8Hmzdv1pYtWbIEHo8Hw4cPD7rPHj164Nprr9V+r51bgcdcuHAh7r//frRq1QrJyckYOHAgduzYEXRfQgg88sgjyMzMRFJSEnr27IlVq1ZF/fzeeOMN9OnTBz6fD40bN0aHDh3w61//OmidaDI0nEiHr86bNy8ktz///HOsX79ey/R27doBiHyI0YcffogBAwagWbNmaNy4MfLy8rBixYqwj7N27VpMnDgRKSkpaNmyJa655hr897//jXofkTzYIJBhTp48iffeew/Z2dlo06ZNVLd56KGH8Itf/AJdu3bF66+/jldffRWVlZXo168fvvjii6B1jx8/jiuuuAIDBgzAW2+9hV//+td48sknMXPmTACnp0cDsxPjx49HcXExiouL8cADDwAAvvjiC1x88cX47LPP8Pjjj+Of//wnhg8fjjvuuEM7LKmmKVOmoLS0FC+88AKWL1+O1NRUzJ8/H/n5+UhOTsbLL7+M119/HS1atMDgwYODmoR3330XV155JZo1a4ZFixbh0Ucfxeuvv46XXnqp3n1y9OhRDBo0CN9//z1mzZqFoqIiPPXUU2jbti0qKysBnC5UV111FR577DEUFBRgxYoVmDx5Ml5++WVcfvnlWtMUjwceeADXXXcdAGj7sri4GBkZGWHXP3DgAPLy8vDOO+/gT3/6E95++20MHDgQd999N26//faQ9Ws+twULFuDo0aMYNmwY/H5/3NtOROq677778O233+LFF1/Eiy++iP/+97+49NJL8e233wIA+vfvj4SEBKxZs0a7zZo1a9CoUSOsX78ex48fBwDs378fn332GQYOHBjVY+7Zswcvvvgi5syZg507d2LkyJE4efKkts706dNxzz33aDPkEydOxIQJE0IaiXCKi4sxevRodOjQAYsWLcKKFSvw4IMP4sSJE9o6ejM0FsuWLUOHDh2QlZWlZXpdh/yuX78el19+Ofx+P+bOnYuFCxeiWbNmGDlyJBYvXhyy/s0334yEhAS89tpreOSRR7Bu3TrceOONhmw7WUwQGaS8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f+rUKcyfPx+tW7fGeeedV+/9kJo4g0CGys3NxfPPP49bb70V2dnZmDhxIi644AIcP34cJSUlmDNnDrp164aRI0eiXbt2mDFjBu6//358++23GDJkCJo3b47vv/8eH330EZo0aRL26kJ1adasGTIzM/HWW29hwIABaNGiBVJSUtCuXTs8/fTT+PnPf45+/fph4sSJaNeuHSorK/H1119j+fLl9R7f2bRpUzz77LMYN24cfvjhB1x33XVITU3FgQMHsG3bNhw4cADPP/88AOBPf/oThgwZon33w8mTJzFz5kw0adKk3m+S/uc//4nZs2fjqquuQocOHSCEwNKlS3HkyBGtCA4aNAiDBw/GPffcg4qKCvTt2xeffvoppk6diqysLBQUFES8//T0dAwcOBCFhYVo3rw5MjMz8e6772Lp0qUh63bv3h0AMHPmTAwdOhQNGjRAjx49kJiYGLLunXfeiVdeeQXDhw/HjBkzkJmZiRUrVmD27NmYOHEiCwmRy3Ts2BG33347Hn30URw5cgTDhg1Do0aNsHnzZjz88MPo1asXxo4dG3K7/fv34+qrr8aECRPg9/sxdepUJCUlYcqUKUHrDRgwAHfddRcAaI1Go0aNtCsB9ejRA6mpqYY8l+bNm+Puu+/Gn//8Z9x88824/vrrsXfvXkybNi2qQ4wefPBB7Nu3DwMGDEDr1q1x5MgRPP3000hISED//v0BxJehw4YNQ4sWLTB+/HjMmDEDDRs2xLx587B3796QdQMz1IsXL0aHDh2QlJSkZX1thYWFGDRoEC677DLcfffdSExMxOzZs/HZZ59h4cKFYS+tSg5h19nR5Gxbt24V48aNE23bthWJiYmiSZMmIisrSzz44INi//79Qeu++eab4rLLLhPJycnC6/WKzMxMcd1114k1a9Zo64wbN040adIk5HHCXblhzZo1IisrS3i9XgEg6IoVu3btEr/+9a/FueeeKxISEsQ555wj8vLyxJ///GdtncBVLd54442wz239+vVi+PDhokWLFiIhIUGce+65Yvjw4SHrv/3226JHjx4iMTFRtG3bVjz88MMRrzRR0/bt28UvfvEL0bFjR9GoUSPh8/lE7969xbx584LW++mnn8Q999wjMjMzRUJCgsjIyBATJ04Uhw8fDlqv9lWMhBCirKxMXHfddaJFixbC5/OJG2+8Ubt6Us0rWFRVVYmbb75ZnHPOOcLj8QRdDaP21UCEEGLPnj1i7NixomXLliIhIUF07txZPProo+LkyZPaOoErZTz66KMhzx0RrkBFRGo6deqUeP7550WvXr1E48aNRWJioujUqZO45557gq6MI8SZ7H311VfFHXfcIc455xzh9XpFv379xJYtW0Lue9u2bQKA6NSpU9Dyv/zlLwKAmDx5cshtIl3FqHZ+h7uiz6lTp0RhYaFo06aNSExMFD169BDLly8Pm7G1/fOf/xRDhw4V5557rkhMTBSpqali2LBh4oMPPghaL5oMFSJ8Vn700UciLy9PNGnSRJx77rli6tSp4sUXXwy5itHu3btFfn6+aNasmQAgMjMzIz5nIYT44IMPxOWXXy6aNGkiGjVqJHJycsTy5cuD1glcxWjz5s1ByyNdNY/k5xGixjweERERkQ3WrVuHyy67DG+88Yb2HSxEZA+eg0BERERERBo2CEREREREpOEhRkREREREpDF1BuH999/HyJEj0apVK3g8Hrz55pv13mb9+vXIzs5GUlISOnTogBdeeCFknSVLlqBr167wer3o2rUrli1bZsLWExGRHsx8IiJnMLVBOHr0KC688EI899xzUa2/a9cuDBs2DP369UNJSQnuu+8+3HHHHViyZIm2TnFxMUaPHo2CggJs27YNBQUFGDVqFDZt2mTW0yAioigw84mInMGyQ4w8Hg+WLVuGq666KuI699xzD95++218+eWX2rJbbrkF27ZtQ3FxMQBg9OjRqKiowKpVq7R1AtfPr/mV5UREZB9mPhGRuqT6orTi4mLk5+cHLRs8eDDmzp2L48ePIyEhAcXFxbjzzjtD1nnqqaci3m9VVRWqqqq030+dOoUffvgBLVu25Jd8EJHjCSFQWVmJVq1a4ayz5Lk2BTOfiMh4RmS+VA1CeXk50tLSgpalpaXhxIkTOHjwIDIyMiKuU15eHvF+CwsLdX8jLxGR0+zduxetW7e2ezM0zHwiIvPEk/lSNQgAQkZ3AkdA1Vwebp26RoWmTJmCyZMna7/7/X60bdsWe/fuRXJyMgDg2k53xb3tRESyWLLzce3fFRUVaNOmDZo1a2bjFoXHzCciip/RmS9Vg5Cenh4yKrR//340bNgQLVu2rHOd2iNMNXm9Xni93pDlycnJWrFoeFZivJtPRCSNQLbVJNvhNcx8IiJjGJ358hyMCiA3NxdFRUVBy9555x306tULCQkJda6Tl5dn2XYSEVH8mPlERHIydQbhxx9/xNdff639vmvXLmzduhUtWrRA27ZtMWXKFHz33Xd45ZVXAJy+esVzzz2HyZMnY8KECSguLsbcuXODrlTx+9//HpdccglmzpyJK6+8Em+99RbWrFmDDz/80MynQkRE9WDmExE5g6kzCFu2bEFWVhaysrIAAJMnT0ZWVhYefPBBAEBZWRlKS0u19du3b4+VK1di3bp1uOiii/CnP/0JzzzzDK699lptnby8PCxatAgvvfQSevTogXnz5mHx4sXo06ePmU+FiIjqwcwnInIGy74HQSYVFRXw+Xzw+/3aMVtDM26zeauIiIyzqmyW9u9wmecmzHwicjqjM1+qcxCIiIiIiMhebBCIiIiIiEjDBoGIiIiIiDRsEIiIiIiISMMGgYiIiIiINGwQiIiIiIhIwwaBiIiIiIg0bBCIiIiIiEjDBoGIiIiIiDRsEIiIiIiISMMGgYiIiIiINGwQiIiIiIhIwwaBiIiIiIg0bBCIiIiIiEjDBoGIiIiIiDRsEIiIiIiISMMGgYiIiIiINGwQiIiIiIhIwwaBiIiIiIg0De3eACI7VHdpbdtjJ27fZ9tjExG5nRX5z5wn1bFBIMeyswmoS33bxcJCRBQbWXI/mu1g1pPM2CCQI8hSFIwQ7rmwkBARneGEzGfWk8zYIJBynFAY9GIhISI3c0vuM+tJFmwQSHpuKQx61d4vLCJE5BTM/TOY9WQHNggkJRYH/WruMxYQIlIJMz96bBjICmwQSAosDsZiASEi2TH3jcHBITIDGwSyFQuENVhAiEgGzHxzMevJKKZ/Udrs2bPRvn17JCUlITs7Gx988EHEdW+66SZ4PJ6QnwsuuEBbZ968eWHXOXbsmNlPhQxS3aW19kPW474nMzHzqTZmvj243ykeps4gLF68GJMmTcLs2bPRt29f/PWvf8XQoUPxxRdfoG3btiHrP/3003j44Ye130+cOIELL7wQ119/fdB6ycnJ2LFjR9CypKQkc54EGYIBJR+ONJHRmPkUwMyXC/Oe9DK1QXjiiScwfvx43HzzzQCAp556Cv/617/w/PPPo7CwMGR9n88Hn8+n/f7mm2/i8OHD+NWvfhW0nsfjQXp6upmbTgZhkVBD4HVi4aB4MPOJmS8/5j1Fw7RDjKqrq/Hxxx8jPz8/aHl+fj42bNgQ1X3MnTsXAwcORGZmZtDyH3/8EZmZmWjdujVGjBiBkpISw7abjMFpTTVxSppixcx3N+aGepj3VBfTZhAOHjyIkydPIi0tLWh5WloaysvL6719WVkZVq1ahddeey1oeZcuXTBv3jx0794dFRUVePrpp9G3b19s27YNnTp1CntfVVVVqKqq0n6vqKiI4RlRfRgyzsJRJtKDme8+zHznYN5TbaZfxcjj8QT9LoQIWRbOvHnzcPbZZ+Oqq64KWp6Tk4OcnBzt9759+6Jnz5549tln8cwzz4S9r8LCQkyfPl3/xlNUWCScjYWD9GDmOx8z37mY9xRg2iFGKSkpaNCgQcjI0f79+0NGmGoTQuDvf/87CgoKkJiYWOe6Z511Fi6++GLs3Lkz4jpTpkyB3+/Xfvbu3Rv9E6GIODXpLny9qS7MfOdjBrgHX2syrUFITExEdnY2ioqKgpYXFRUhLy+vztuuX78eX3/9NcaPH1/v4wghsHXrVmRkZERcx+v1Ijk5OeiHYsfgcDe+/hQOM9+5+Jl3L7727mXqIUaTJ09GQUEBevXqhdzcXMyZMwelpaW45ZZbAJwe5fnuu+/wyiuvBN1u7ty56NOnD7p16xZyn9OnT0dOTg46deqEiooKPPPMM9i6dStmzZpl5lOh/49BQQGciqbamPnOw8wngHnvRqY2CKNHj8ahQ4cwY8YMlJWVoVu3bli5cqV2hYqysjKUlpYG3cbv92PJkiV4+umnw97nkSNH8Jvf/Abl5eXw+XzIysrC+++/j969e5v5VFyPRYIiYeGgAGa+czDzKRzmvXt4hBDC7o2wWkVFBXw+H/x+vzb1PDTjNpu3Sk4sEqQXC4ccVpWdGWEPl3luwsyPHjOf9GDey8PozDf9KkakJhYJihVHmIjUw8ynWFR3ac2sdyjTTlImdbFQkBH4PiJSAz+rFA+eyOxMnEEgDT/gZDTOJhDJi5lPRmLeOwtnEAgACwWZi+8vIrnwM0lm4XvLGTiD4HL8IJNVOLpEZD9mPlmBea8+ziC4GAsF2YHvOyJ78LNHVuN7Tl2cQXAhfmDJbhxdIrIOM5/sxLxXExsEl3FqofB39Fr2WL5vqix7LKfjJfKIzOXUzI8kllrATLcG814tbBBcROVCYWUDUJ+6toWFRj+OLhGZQ+XMr83MGqDnvpnx8WHeq4MNgguoViRkagb0CrftLCjR4egSkTFUy/wAFbI/0jYy5/Vh3suPDYLDqVAoVCgK8WDTED0WDaL4qJD5AU7Kfua8fsx7ubFBcDBZC4WTikKsau8DFpIzOAVNFBtZMz/AbdnPnK8f815ebBAcSrZC4bbCoFfN/cMichpHl4iiJ1vmA8z92tgwRMa8lw8bBAeSpVCwOMSGzcIZLBpEdZMl7wOY+9Fj1gdj3suFDYLD2F0sWByMxQLCokEUid15H8Dcjx+z/jTmvTzYIDiE3YWCBcJ8bi4gLBpEwezOfIC5bxY3Zz3A8xJkwQbBAewqFCwO9gnsezcVDxYNotPsbA6Y+9ZyY9YHcGDIXmwQFGdHoWCBkIcbR5pYNMjNOCDkTm7MeoB5b6ez7N4Aip3VhcLf0csiITE3vT4yHF5BZDW7BoTckiuqcNtrwry3B2cQFGXlB8ZNQeQEbpmS5sgSuQkzn2pzS9YDzHs7cAZBQVYVCreNUjiNG14/jiyRG7A5oLq4IesB5r3V2CAoxooPiFvCxi2c/nqyaJCTcUCIouWG15B5bx02CAox+4PhhnBxMye/viwa5EQcEKJYOP01Zd5bgw2CIqxoDsgdnFo8WDTISTggRPFy8mvMvDcfGwSXc3KAUN2c+NqzaJATmPk+duLnnurm1NeceW8uNggKMOtD4MTAIP2c9j5g0SCVmd0ckHs5sVFg3puHDYLkzHjzOzEkKD5Oe0+waJCKzBwMctLnm+LjtPcC894cbBAkZlZzQBSJk/6QYNEgYuZTeE7KeoB5bwbTG4TZs2ejffv2SEpKQnZ2Nj744IOI665btw4ejyfkZ/v27UHrLVmyBF27doXX60XXrl2xbNkys5+G5Yx+szstDMhcTnmvsGhYj5kfG2Y+2cFJ7xPmvbFMbRAWL16MSZMm4f7770dJSQn69euHoUOHorS0tM7b7dixA2VlZdpPp06dtP8rLi7G6NGjUVBQgG3btqGgoACjRo3Cpk2bzHwqljKjUBDp5ZTCwaJhHWZ+bJj5ZDenvGeY98bxCCGEWXfep08f9OzZE88//7y27Pzzz8dVV12FwsLCkPXXrVuHyy67DIcPH8bZZ58d9j5Hjx6NiooKrFq1Sls2ZMgQNG/eHAsXLoxquyoqKuDz+eD3+5GcnAwAGJpxm45nZh4j39xO+cCT/XzfVNm9CXFJ3L7P7k2w3KqyWdq/w2WeGZj5+rE5INmonvcAM9+IzDdtBqG6uhoff/wx8vPzg5bn5+djw4YNdd42KysLGRkZGDBgANauXRv0f8XFxSH3OXjw4Drvs6qqChUVFUE/TsciQUZS/f3EUSXzMfP1M3pASPXPKcmB7yMCTGwQDh48iJMnTyItLS1oeVpaGsrLy8PeJiMjA3PmzMGSJUuwdOlSdO7cGQMGDMD777+vrVNeXq7rPgGgsLAQPp9P+2nTpk0cz8w8RhULfrjJDKr/AcImwVzMfPuo/LkkOan+nmLex6+h2Q/g8XiCfhdChCwL6Ny5Mzp37qz9npubi7179+Kxxx7DJZdcEtN9AsCUKVMwefJk7feKigrpCgabg/AqMyO/rtFqtse0o+hcyd/Rq+wUdHWX1q6cerYSMz86zHySXeC9xbx3J9MahJSUFDRo0CBklGf//v0ho0F1ycnJwfz587Xf09PTdd+n1+uF1ytviLq5UBjRABjxGGwi9GGTQLUx86Pn5syvi5H1gJluHOa9O5l2iFFiYiKys7NRVFQUtLyoqAh5eXlR309JSQkyMjK033Nzc0Pu85133tF1n04ke6GozPSE/ZGF7NsnI5UPOeL0s/GY+dFxc3MQKWfNyFsrH8sNVHy/BTDvY2PqIUaTJ09GQUEBevXqhdzcXMyZMwelpaW45ZZbAJyeBv7uu+/wyiuvAACeeuoptGvXDhdccAGqq6sxf/58LFmyBEuWLNHu8/e//z0uueQSzJw5E1deeSXeeustrFmzBh9++KGZT8U08b5xZf3QOiWAaz8PjkqFUnl0iYzFzLeGrLlfk+w1INL2MeMjU/mQI84k6GdqgzB69GgcOnQIM2bMQFlZGbp164aVK1ciMzMTAFBWVhZ0fezq6mrcfffd+O6779CoUSNccMEFWLFiBYYNG6atk5eXh0WLFuGPf/wjHnjgAXTs2BGLFy9Gnz59zHwqpnBacyB7QTACG4bwVGwSWDCMx8yvm9MyP8BJ2c+Mr5+KeU/6mfo9CLKS5ZrY8RQLGQqFk4qCEVhI1BxZcmqTYMf3IMhKhsx3WnPg1vxnzp/BvJeL0Zlv+lWMKDyVmwO3Fob61Nwvbi0iKk5BcyaBZGd35gcw+5nzNak4k8C8jx4bBBuo2BywMOjj9iKiYuEgMouKmR/A7I/M7TkPqJn1bBKiwwZBIXYUChaH+Lm1iKhUOFgwyCwqNgfMff3cmvOAmjPHVD/TLnNK4cVaLKwuFLwUnDnctl/tHv3Ug5fCI5nYNSDkpnwyi1v3I/PeWdggWEiFN6Rbg81qbtrPKhUNIiOpkPmAu/LISm783gWV8l6Vz6dd2CAowIoPnNtCTBZuKSCqFA0WDDKKCocWuSF7ZOGmfa1K3lPd2CBYRNZDi9wUWrJz+muhStFgk0B24oCQs7ll3zPv1ccGQWJmfsDcElIqcvJro0rRIIoHB4SoPm54LVTJezYJ4bFBsEAsbz6zPlhuCCWncOprpULRYMEgq1nRHJB8nJrzASrkPYXHBsFksjUHpB4nvm4qFA02CRQLmTIfcP4foE7h5NeJea8mNggu4OTgcQsnvoYqFA0iPWRqDpyYGW7g1NdNhbxnkxCMDYKJZCgWTgwaN3Na8ZC9aLBgkIqclBFu5bSsB+TPewrGBkEibA4oWk56bWUvGmwSKBqyDAg5KRvIWVmvAub9GWwQTKL3TWZkoWCRcAcnvc6yNwlERuOAEEWLWU92YIPgME4JEYoeX3PzcVSJ6mLngBDADHALp7zOsjcJzPvT2CCYwK5i4ZTwIP2cMMIke9Egko0TPvekj1Nec+a9/Ngg2IzNARlJ9feBzEWDo0oUDgeEyA5OeP2Z93Jjg2Awq99UThlNIOOo/p6QuWgQxYPNARlJ9awH5M57tzcJbBBsFO8HQ/VgIHOp/P6QtWi4vWBQMDveDyp/rskcqr8nZM17t2ODYCA9xYLNAVlB5fcJiwY5iRHvZ5U/z2QuJ8wmyMjNg0JsEBTEECA9WDiM5eaCQbFhc0BWUfV9wgEh+TS0ewPcKJ4Pgoof/qq21Yben7c00dD7c4vKTA+a7RF2b4Yu/o5e+L6psnsziEJY2SiqmPtkHxWzHpA376u7tEbi9n12b4bl2CAYJNpi4dTmwOgmINbHYvNQNxULh4xFw60Fg/Rz++GksdQG5nj8VMx6QM68dys2CIqQrUhY2RDoEW67WGyCqVo4iGRh1eyBbLkfjhm1IJr7ZK7XL/D+Yd7Hz42DQmwQDGDF7IHdZG0IolF721lY1GsSZBxVcmPBIH2cNmMsUx3gYFD0mPcUCzYICrCrUMhUDIxU83m5uaCoNrrEokFuIUtzoFoNYNMQGZuE+LltUIgNgkViHUmyo1CoVhTiwdkFtQqHbEXDbQWDzJ8xtrs5cFr+c0DoDJWynuxn+mVOZ8+ejfbt2yMpKQnZ2dn44IMPIq67dOlSDBo0COeccw6Sk5ORm5uLf/3rX0HrzJs3Dx6PJ+Tn2LFjZj+VsMw8FtXKQlHVtlr7cTO37gO7/ygh53B65pvJztliN2SfW55nXVTKepUPy3YCUxuExYsXY9KkSbj//vtRUlKCfv36YejQoSgtLQ27/vvvv49BgwZh5cqV+Pjjj3HZZZdh5MiRKCkpCVovOTkZZWVlQT9JSUlmPpW4xPImt+pD7PawjMSNhUSVwiFb0eD3Ipzh9Mx32vlmbsu4mtyY8QGqZD0g32fJTXlv6iFGTzzxBMaPH4+bb74ZAPDUU0/hX//6F55//nkUFhaGrP/UU08F/f7QQw/hrbfewvLly5GVlaUt93g8SE9PN3PTo2LWG8WKD68bQzFWgX3lhulpVaagZTvUiE5zeuabycpBIQrmxsOQVMl6so9pMwjV1dX4+OOPkZ+fH7Q8Pz8fGzZsiOo+Tp06hcrKSrRo0SJo+Y8//ojMzEy0bt0aI0aMCBltkols3a9bR0yM4JYRJ5VGl2ThplGlSJj5p8k6Y+yG7DKCm/aTKlkv299Rbsl70xqEgwcP4uTJk0hLSwtanpaWhvLy8qju4/HHH8fRo0cxatQobVmXLl0wb948vP3221i4cCGSkpLQt29f7Ny5M+L9VFVVoaKiIuhHVmZ9YN0UelZw+v5UoXDIVjTczumZr+qMsdOzyixu2W8qZD3AvLeD6ScpezzBbz4hRMiycBYuXIhp06Zh8eLFSE1N1Zbn5OTgxhtvxIUXXoh+/frh9ddfx3nnnYdnn3024n0VFhbC5/NpP23atIn9Cf1/0RQLvW9oM5sDMoeTi4gqhYPk4tTMj4Zsf8Q4NZus5IaZY2a9fm6YRTCtQUhJSUGDBg1CRo72798fMsJU2+LFizF+/Hi8/vrrGDhwYJ3rnnXWWbj44ovrHE2aMmUK/H6/9rN3797on4jCnB5qMnHqvpa9cMj0B5kbCkZdmPn6ccZYLU7er7JnPSBX3ruBaQ1CYmIisrOzUVRUFLS8qKgIeXl5EW+3cOFC3HTTTXjttdcwfPjweh9HCIGtW7ciIyMj4jperxfJyclBP7Ix+sPp1BCTnRP3u+yFg0VDDk7OfFVmjJ38B6xMnLqPZc96spapVzGaPHkyCgoK0KtXL+Tm5mLOnDkoLS3FLbfcAuD0KM93332HV155BcDpQvHLX/4STz/9NHJycrSRqEaNGsHn8wEApk+fjpycHHTq1AkVFRV45plnsHXrVsyaNcvMp6KbnmJh5IfSqcGlEjdd9YiCuf2L09yc+XqY1RyQdZya87Jf3UimK9g5Pe9NbRBGjx6NQ4cOYcaMGSgrK0O3bt2wcuVKZGZmAgDKysqCro/917/+FSdOnMBtt92G2267TVs+btw4zJs3DwBw5MgR/OY3v0F5eTl8Ph+ysrLw/vvvo3fv3mY+lSCyHkrAAiEXJxUQFg2KhlMzvz52z2Ix++3jpJwPYN4TAHiEEPK+C0xSUVEBn88Hv9+vTT0PzbitnludUV+DYMfsAQuE3JxSPGQuGrIUDFlGlFaVnRlhD5d5bhJP5ht9eBFnjJ3NKVkPMO+jIUveA8ZnvulXMSLzsUjIzynHBst8jKrdo7gBss4wkrM4IU+ciK+LNZj35mODoJORbwYj/thiGKnFCa+XzE0CkdU4Y0y1cUCInIANgsGiLRZsDtzLCcVD1sIhy6gSkVlUzw43ccJrJWvWA8x7s7FBUJQTgsft+Bo6l5Onnd2EM8YULw4IOZ9T854NgoGsmj1QPWzoDJWLh6xFg6NKZBXOGFO0VH/9mPfuwwZBBxm6RNVDhsJT9XWVtWgQOYmq+UDBVB4QIvdhg2CxeP6gYrA4m6qvr4xNggyjSjIMKJD9OGNMtan6msqY9QDz3ixsEBShaqCQPhxhIpKDkd93EytmgXOp+trK2iSQ8dggGCSaYhHrB0vVIKHYqfaay1g0ZBhVIoqVahlA+qn6GjPv3YENQpTsmj5SNUAofqq99jIWDSI7cVCI6sNZY+dw2mFGDe3eAHKOdq0PRPy/3fvOsXBLnKOqbTW8pYl2b0bUKjM9aLZH2L0ZGn9HL3zfVNn2+NVdWiNx+z7bHp/MYeZoJf9YdCdmffzsznunYYNgALMOL5KpUNT1x7+Rt2cjEUq1wkFEnFEj/VTLehmbBDIOGwRJ2d0cxNsQGPm4bBrUKhyyFQ2OKpEq7M79aMRSG5jh0VMp68nZ2CBYQIWRJLsagmjU3DY3FxoWDiJrxHsssdtnjPXcn5szPRKVsp4DQsGcdFgpGwQJWVkoZG4Mwqm9vW4rLqoUDtmKhp2cVDDInPMP7G4O7KwDnDUOT5WsB5j3TsUGIQp1jSYZXSysKBSqNQV1cePsgiqFQ6aiYfeoEpFsZK4Dbh8IClAl62XDvDcGGwSTyXR4kcwFwQiB5+eGYsLCQSQnvZnPGeP6uXEgKECVrJdpQIiMwQZBImYVClWLQqzcUkxUKBwsGkT2c1INcEu+16RC1tMZTjmslF+U5nBOKgyxaNf6gKP3gd3HLqvEzm/adNoX6LiVaoeUOj3/nP78alIh62U6YoLfrBw/ziCYSM+HxegPv1tCM1pOPvxI9tElziKQSuJp5mT5A8lt+e+WWQXZsx5g3jsJZxDiIGuH6rbioIdTR5xkH12S5Q8nWT+z5D5mfGadmm96OH0fyJ715BxsECRg1Afe6cFoJCfuKxYOIjWY1RzQGU7M+ADZs54DQs7ABsEhnBqEZnNaEZG5cMhSNIicxGkZZjSn7h+Zs56ccd4ZG4R6xPoiR/vHkBEfcieGn9WctA9ZOOTkhIJBkdnRADspt8zmxEZB5qzngJD62CAozmmBZycnFhDZyFA0OO1MsTDqfWPkIaWkH3PeXZj3sWODYKN4CwVDzhxOKCAyjywRUXxUzycZOGUfypz1MgwIUezYIMTI7q7UKeEmM9X3sayFg0WD3IqHlMrFCYNBgLxZT2pjg2ACs/8AckKgqUL1AsLCEZ7dDT45i1VNr8pZJDMn7FdZs16GASHmfWxMbxBmz56N9u3bIykpCdnZ2fjggw/qXH/9+vXIzs5GUlISOnTogBdeeCFknSVLlqBr167wer3o2rUrli1bZtbmm0bWDzOF54QCIhMZigaZg5lvDmaQuVQfDCIymqkNwuLFizFp0iTcf//9KCkpQb9+/TB06FCUlpaGXX/Xrl0YNmwY+vXrh5KSEtx333244447sGTJEm2d4uJijB49GgUFBdi2bRsKCgowatQobNq0ycynIg0GmH1U3fdsRskqzPzI4vkcqpo9KlJ5X8ua9W4dEFL9ynUeIYRp34ndp08f9OzZE88//7y27Pzzz8dVV12FwsLCkPXvuecevP322/jyyy+1Zbfccgu2bduG4uJiAMDo0aNRUVGBVatWaesMGTIEzZs3x8KFC6ParoqKCvh8Pvj9fiQnJwMAhmbcFnbdSC9wXVNW0XwYYvkgqxxcTrN73zl2b4Ju3tJEuzchSLM9pkVPVHzfVNnyuInb91nyOKvKZmn/Dpd5ZlA98+sq6HZkPsDct5OKOQ/Il/UA894KRme+aTMI1dXV+Pjjj5Gfnx+0PD8/Hxs2bAh7m+Li4pD1Bw8ejC1btuD48eN1rhPpPgGgqqoKFRUVQT92YnOgPhVfD9lGl+weVeJxqcZi5pPTqJjzgHxZLwPmvX6mNQgHDx7EyZMnkZaWFrQ8LS0N5eXlYW9TXl4edv0TJ07g4MGDda4T6T4BoLCwED6fT/tp06ZNLE+JKIiqxYPIDG7NfM4eOBtfA2PYPSBE+pl+krLHE/ymEEKELKtv/drL9d7nlClT4Pf7tZ+9e/dGvf16mfEhYEDJS7XXRraRJRYN53Fi5tsx+qhatjiZiq+FbFlP6mlo1h2npKSgQYMGIaM8+/fvDxkNCkhPTw+7fsOGDdGyZcs614l0nwDg9Xrh9coxvaT3Q6tiMLlNu9YHlDpWtapttZTHqJLamPnkZKrlPCBf1ldmemw/F4GiZ9oMQmJiIrKzs1FUVBS0vKioCHl5eWFvk5ubG7L+O++8g169eiEhIaHOdSLdJ5EV2MipicelGoeZHx7POXMOXgpVbcx7fUw9xGjy5Ml48cUX8fe//x1ffvkl7rzzTpSWluKWW24BcHoa+Je//KW2/i233II9e/Zg8uTJ+PLLL/H3v/8dc+fOxd13362t8/vf/x7vvPMOZs6cie3bt2PmzJlYs2YNJk2aZOZTsQWDSC0qFQ+Zpp95mJFzMPPjp0qGuJlKr5FMWU9qMe0QI+D05ekOHTqEGTNmoKysDN26dcPKlSuRmZkJACgrKwu6Pnb79u2xcuVK3HnnnZg1axZatWqFZ555Btdee622Tl5eHhYtWoQ//vGPeOCBB9CxY0csXrwYffr0MfOpEEVNxaloIiMw88ktmPOx4WFG6jD1exBkFe/3IMRzPexou3mVRigoPBWKh0zHp9pVNKy+PraTvwdBVvF+D4IVmQ8w91WkQs4DzPoAp+Y9YHzmmzqDQMFUmuoblL5d922KyruYsCXqUmGESbaT2IiIVKJCzgPMetKPDQLF1AzouR83Nw6qFA8383f02vYtm+RsnD1wB+a8PjzMSA1sECRkRaEwqimI5bHc3DDISJaRJRYNIlKVCk2CLFlvJ6sHhKq7tLb0MCMjsUFwGSsbg2i2wQ3NggqFg4j0c8IVuIyqCW7I8vow68lJ2CBIxqzZAxkag3Dc0izIXjg4skRkHysPLzKrFoS7XydneiTM+uhwxlh+bBAMJONokqyNQTiBbXVqUZG9cBC5XeL2fRGvZKQyu+qAWwaAamPWkxOwQbCIHVcwUqk5qMnJjYLMhUOGkSWOKhEZR6Ya4NZmQUYyZD3Jz9RvUib7yFQYYjUofbsjnkdtvFoJEQW47bBS4Ey2y7yN8WLO10/Goy7oDDYIEjEiUJwYuk58TrIWD5W+q8NIdX0RFlEs7PosqZaXqm2vHrLmPODerKfosUGIgazXTHdqyAY4uZAQEcVL5Xx0ar7L3CS4FQeEosMGgZTjlELCwhEep52J9HNCJgLOyfeaZM16ziJQXdggOITTAjUaTnjOMhYOFg0iaxj1+XdCFtbmxEaBQnFASF5sECQRT6Fwc4g6oYjI2CQQkRpUz7/6OCHjAXlzngNCFAkbhHrI/hXZTghOI3A/GItFg+gMnndmPyc8V1mbBKJw2CAYiNdvt5fKI00sHME47UxUN1WzLh4qZ3wAs55UwQZBYaoHpVlU3S+yFQ7OIhDJSdWMM4rbn7/RmPXmkf0olLqwQSBHYgEhIrNx1tg+Ks8myDYYZDfOGMuJDYKiVA1GK6lYQFg4iOxl1YhfrJ911TLNbKruD2Y9yY4NAjmeagVEpsLBqWcikp1qGS8jZj3VxgZBQQxD/bjP1MNpZ6JgzLHIVNw3Mg0GEdXGBoFcQ6UCwsJBRKSPioeVEsmKDUIUwh2TKut1saluLB76ceqZyH7MruiptK9kGgxi1lNNbBAUo1LwyUqVfShT4SByOw4KqUWVnKfTeEipfNggkCuxeBBRJCpfu5zOUCXnORhEMmKDQK6lQvFg4SAiFbJKVqrsO1mynocZUQAbBIPxi3PUokrxsBuLhjE4Mu0e3tJEuzeB/j/mPJF+bBCiFG9hN6JYMOTMIft+lWVkiYhCcVBIDbLnPMCsJ7mY2iAcPnwYBQUF8Pl88Pl8KCgowJEjRyKuf/z4cdxzzz3o3r07mjRpglatWuGXv/wl/vvf/watd+mll8Lj8QT9jBkzxsynEhZPWnMOFYqHG/HENXU4Pe9Jfcx5spLqM8amNghjx47F1q1bsXr1aqxevRpbt25FQUFBxPX/97//4ZNPPsEDDzyATz75BEuXLsVXX32FK664ImTdCRMmoKysTPv561//auZTIReQuXjIMLLEw4yoLk7Le17e2plkznmAWU/yaGjWHX/55ZdYvXo1Nm7ciD59+gAA/va3vyE3Nxc7duxA586dQ27j8/lQVFQUtOzZZ59F7969UVpairZt22rLGzdujPT0dLM2n1xqUPp2FJV3sXsziJTCvDeP7H/QEpEzmTaDUFxcDJ/PpxULAMjJyYHP58OGDRuivh+/3w+Px4Ozzz47aPmCBQuQkpKCCy64AHfffTcqKyuN2nRyOVkLsgwjS0ThMO9JJbJmPJFMTJtBKC8vR2pqasjy1NRUlJeXR3Ufx44dw7333ouxY8ciOTlZW37DDTegffv2SE9Px2effYYpU6Zg27ZtIaNRAVVVVaiqOjM1XFFRofPZnJa4fR+qu7Sud71mewSPnSYi15Ap7wHjMp+cS+bZ4natD2D3vnPs3gxyOd0zCNOmTQs5Yaz2z5YtWwAAHk/oH8lCiLDLazt+/DjGjBmDU6dOYfbs2UH/N2HCBAwcOBDdunXDmDFj8I9//ANr1qzBJ598Eva+CgsLtRPnfD4f2rRpo/dpR8RjUp1J1hEmziKoS8UT1lTMe8DczA+HVzJSk6w5LwOeh0C6ZxBuv/32eq8g0a5dO3z66af4/vvvQ/7vwIEDSEtLq/P2x48fx6hRo7Br1y689957QaNJ4fTs2RMJCQnYuXMnevbsGfL/U6ZMweTJk7XfKyoqTC8Y4XhLE6X+0F2XHLnghvOPitB97SQyjzDZpaptNa/v7iIq5j1gXOaHmzX2fVMFf0dvVLevK/N37zuHDb8EZM15ziKoTcUBodp0NwgpKSlISUmpd73c3Fz4/X589NFH6N27NwBg06ZN8Pv9yMvLi3i7QLHYuXMn1q5di5YtW9b7WJ9//jmOHz+OjIyMsP/v9Xrh9UYX6G6jtymo67ZObBhkLR5EVlAx7wFmPhFRvEw7Sfn888/HkCFDMGHCBGzcuBEbN27EhAkTMGLEiKArWnTp0gXLli0DAJw4cQLXXXcdtmzZggULFuDkyZMoLy9HeXk5qqtPj8J88803mDFjBrZs2YLdu3dj5cqVuP7665GVlYW+ffua9XQ0TugKA+JpDiLdn9H3SaE46kiycWrekzvwUCOiUKZ+D8KCBQvQvXt35OfnIz8/Hz169MCrr74atM6OHTvg9/sBAPv27cPbb7+Nffv24aKLLkJGRob2E7gSRmJiIt59910MHjwYnTt3xh133IH8/HysWbMGDRo0MPPpRBTuPAS9x6RaPZVo5h/yTmsUWDyI6ufUvI92UIjnIahNxpznYBDZybSrGAFAixYtMH/+/DrXEeJMqLZr1y7o93DatGmD9evXG7J9bmXVH++Bx3HCoUc81Iji4aSZx0jclPd6zkMgIrnw4jLRMbVBcKpoL3cajt0nKtsxsu+kRkEWPIHNWCwYZBa7M78+sdQEp2Y5B4KC8aIUsXHKgJCphxi5iQp/YNh92I/qhx7JOAVNRBSLePI4cFuV8zwS2XKehxmRXdggmIjHpIbnxKLiJjKPhhKZIdyIoIrnngUYmcFObRSI3I4NgkTMLBayBbiqRUWm0SWOLBGRXmblrqqZHo5MOU9kFzYIMYrnGLNYj+lz4rGRTikoRJE45XhUil08x3EbmftW5K1TGgWZmgQOBqnDSXnPBsFARkw5u5FqxUSmwkFE1nBS4beCUxoFIrdig0BSUK2QsEkgIpXOQ7ArY1XL9pqY886jwgVlZMEGIQ5mHGbk5ktXqlxI7MKp5/ixYJAV3Hy5SGY7kXrYIBiMhxnFR6VpaY4uUX14WIqzqPp6ypCpKmV7TbLkPAeD5KdqPkTCBiFOVr8hYjlhTcVQVnGbich9OCikD7OdSA1sEGzk5innaLCQEP/QIieJ9dBSp13BjtlOJD82CCaId0TJ6PMQ/lHR09D7ozNkmX4m+ThtuplOM+tL09xGpSaBOe8MPN9MHzYIBuAfAuZRqYjYhcemxo4Fg8g+zHdyCif+HcgGwSTR/uERy2FGTpturo/sRYSjS0TuYscV7Jya+7LnewBzntyGDYKF7DzMSHWqFBEiwJmjSVQ3HmYUO+Z7dJw8W8zPinzYIBiEfxCYj0WEiMiZVMh3ziKoy8zDSZ369x8bBBNFO6IUy5SzU6eb6yNrEWHhUA/PP6B4RHuycjg8zCg8WfOdyI3YIBjIqV0kkR1UnXJmDlBNqr6Piah+Ts57Nggmi3cWwShOutQpR5mISAZ2nKzsdMx3IjmwQTCY0d0kDzMKT8YiwsOMiMjsk5VjyX3VBohkzPcA5rx6eDhpbNggWMDMS54SAc6+uoUZzCoYTp5upvA4i0AUH1UPw3N63rNBMEE0bxqjLnmqZzRJtVGk+sg8ykRE7sVLnsaP+U5kLzYIFuEsApGzOX00iSKz+rV3w2FGgLxNAg8zUgcPL4odGwSTyDqL4DSyFRAWDmOYOdrKgkFWMPMy10RkLzcMCLFBsJAMswgqjiLVR7Ymwek4y0UUSoVZBBUx34nswQbBRJxFIHIHN4wmkX6yzSI4cYCIzGPFYJCKs8VuyXs2CBbjLAKRfXh4EZnJ6isauWVgiLMIRNZjg2AyziJYgwXEOVS72otbRpMoNrJd0YgDRESxc1Pem9ogHD58GAUFBfD5fPD5fCgoKMCRI0fqvM1NN90Ej8cT9JOTkxO0TlVVFX73u98hJSUFTZo0wRVXXIF9+9R50WT4dmUWCfPwRGU5cfbAXMz70ziL4A7M+fipeHiRm5jaIIwdOxZbt27F6tWrsXr1amzduhUFBQX13m7IkCEoKyvTflauXBn0/5MmTcKyZcuwaNEifPjhh/jxxx8xYsQInDx50qynEhd+u7I1OItAVnPTaFJ9mPeRyfbtyioOEDHfyW5uy/uGZt3xl19+idWrV2Pjxo3o06cPAOBvf/sbcnNzsWPHDnTu3Dnibb1eL9LT08P+n9/vx9y5c/Hqq69i4MCBAID58+ejTZs2WLNmDQYPHmz8kzGB75sq+Dt6g5Y12yNQmekJWuYtTURV2+qQ2+/ed07Eb88tKu8S1ejGPyp6MnRJF7NPWlPt8CI6jXkfLHH7PlR3aR3TbWPJfCIio5k2g1BcXAyfz6cVCwDIycmBz+fDhg0b6rztunXrkJqaivPOOw8TJkzA/v37tf/7+OOPcfz4ceTn52vLWrVqhW7dukW836qqKlRUVAT9WE3WzlPFkSQivcyYbpb1M20HmfIekCPza+MsAqlE5ctZ8/AiY5jWIJSXlyM1NTVkeWpqKsrLyyPebujQoViwYAHee+89PP7449i8eTMuv/xyVFVVafebmJiI5s2bB90uLS0t4v0WFhZqx8X6fD60adMmjmdmHDMvgefmQ43ciF+qRHaSKe8BOTI/XAPJy57GhzPezqHabLEbB4R0NwjTpk0LOams9s+WLVsAAB6PJ+T2QoiwywNGjx6N4cOHo1u3bhg5ciRWrVqFr776CitWrKhzu+q63ylTpsDv92s/e/fu1fGMjRNtwQiHJyxHhwVEXWYVDM4exE7FvAfkyfx4cGCISD/mvXF0n4Nw++23Y8yYMXWu065dO3z66af4/vvvQ/7vwIEDSEtLi/rxMjIykJmZiZ07dwIA0tPTUV1djcOHDweNKu3fvx95eXlh78Pr9cLr9Yb9P6tFc2xquHMRIjHiXASA5yMQUSgV8x6QJ/PD5X2055/FSk/uA8x+sp5qswdupXsGISUlBV26dKnzJykpCbm5ufD7/fjoo4+0227atAl+v7/OYK/t0KFD2Lt3LzIyMgAA2dnZSEhIQFFRkbZOWVkZPvvsM133KxMeakQqUPmYVCO5aTSJeR+/aN8vRh5qxPMRKB6qZj1nD4xl2jkI559/PoYMGYIJEyZg48aN2LhxIyZMmIARI0YEXdGiS5cuWLZsGQDgxx9/xN13343i4mLs3r0b69atw8iRI5GSkoKrr74aAODz+TB+/HjcddddePfdd1FSUoIbb7wR3bt3165yITszDjUyoklgkSC7qHR4EYVi3uuj533J8xEogOeakZVM/R6EBQsWoHv37sjPz0d+fj569OiBV199NWidHTt2wO/3AwAaNGiA//znP7jyyitx3nnnYdy4cTjvvPNQXFyMZs2aabd58skncdVVV2HUqFHo27cvGjdujOXLl6NBgwZmPh3L2TENxyJBFJmbR5Pqw7yPLJ4TlmMVy+wx85/MptJgkNvz3iOEcN3BYBUVFfD5fPD7/UhOTgYADM24zfLtCHcuQu1jUwGEPTY13HWyAdR5nWw9x6WqfEyqDEXO6kO7zB5ZMnPKmQXDHKvKZmn/Dpd5biJr5ofLe8C4zAdi+8ZfmfNfhnwPcFrOBzDvT1Mp7wHjM9/UGQSqWzxvPrPPR5AphKlunHa2hmrFguRnxaFGnEkgPdgcnMa8Z4MgHT3TzrF8kNkkkBsYXTBYLMgIZh1qZMYgAfOfyN3YINjMjIJh5IgSiwSpOKJEJCszvkCtPrEeCsP8l4cVM8UqXr2IswfmYYMgAdm/cZNFglTC2QNyMisPNQLkyn+ZtoWXENdHlcEg5v0ZbBAcwIrvR5ApmGVnZeFQ+fwDMwoGL2tKKoh35tiOJoE1gGTDvDcXGwRJ2FEw2CRQfVSccjYSR5PILKo1CQBrgJPxUFLmfW1sECRixwlssTQJLBIULxVmD1gsSBZGn7Qcb5NgRw1wc91ReabYLMx787FBkIxZJ7AZ2SQA8oa1rNtlBpW/+4CIos97wNjMB+I/FNLKrJUt1512/oFqswc8tMgabBAUZvdVLjibQLFQoWBwNImsoqdJCMfuJsHsGsAaQ2Zj3ofHBkFCZhUMp1/lQobtcMrIkkqzB2wOSHVmnY8AmN8kAGcaBaMzWIZMt5vKM8UcDFIbGwRJqXYCm92zCW4rJKoek6rKyWpEVlO9SQgwohbYXU/q4pRBILMx69XX0O4NoMgSt+9DdZfWQct831TB39EbtKzZHoHKTE/I7b2liahqWx2yfPe+c9Cu9YGIjxsIwEHp23VvcyDUr0v+RPdtSQ5mjShxNInIGHozHzA398Op/Qd+fTVB1obATirPHpiBeW8tNgiSs6tJAE4XjFiLhZWNgiyFxaqRJVVnD4zGYkFOE23eA+Y0CUB8uV8XWXKazMfBIGfgIUaKsuJwI0Duk9hknoZWlUqzB0ZisSBZxHtlIyC+w40AHkYTiZO+BFO12QMjMe+jwwZBAXrezLE0CaqdxCZjY8DZA2vxMnfkZGwS5MP9ER0VZg8oOjzESBF2Tz0beXxquD/u6zoUSbZmwKlUmT3gVDO5gd2ZDxh/XgJFR9XZAxWaA+Z99NggKESWgsHjU4Nx9iAyHlpEFDsZMh8wL/dVwdkDe7A5sBcPMVIMp57l4pR9YcaIkuyjSSwWpCqrMx84nXVOyTs9rH7OnD0wB/NePzYICpKlSXBjsbCLmUVDlZPV2ByQG0V6rxqd+XoaBTIHm4MzmPf2Y4OgKBmaBMDdxcIJhxapUjBYLMjNrGgSAM4m1Oak56hK1gM8KVkWbBAUZkWTwNmE8Nz2fPWQuTkgUpVsTQLg7Ox32qFFquB5B/Jgg6A4s5sEgKNKtTnlWtiqnHdgJBYLUpmVTYKbGwWnNQeqzB6wOZALGwQHMKpJMOKQI8B5xaImNgfW4qFFRMGMbBKMnE0A1M9+O7afzcFpbA7kwwbBIYxoEgDjTmQD1C8WtbE5qJvMBYPFgpzEqCYBMPaQowAVs9+O7WVzYA7mvTHYIDiIFU0CwFEls7E5YHNAVB+rmwSnNgp2bSObgzOY93Jig+AwepsEq45RBdQoFrU5bbrZDGwOiOxhdJNgdqMgU/7buT1sDs5g3suL36TsQJG+fROA7m/gBBDxWziBM0EXzbdxBtQMZVm/nZMjStFhc0Bkr3B5D9T9jcsAwmY+UPc3LwdE+w3M4dTOVitrgAwNioqDQACbAzcydQbh8OHDKCgogM/ng8/nQ0FBAY4cOVLnbTweT9ifRx99VFvn0ksvDfn/MWPGmPlUlGPl9DMQe+jJNrLE6ebosTmgmpj39tGb94AxmW9EbtWsAWZkr0w1xormQIWsB5j3KjB1BmHs2LHYt28fVq9eDQD4zW9+g4KCAixfvjzibcrKyoJ+X7VqFcaPH49rr702aPmECRMwY8YM7fdGjRoZuOXOEMvIUl2jSoDxswk12TWzYHfhYHPAYuEEzHt7Bd73RsweA9FlPhB/7tdmdx6bRcWcB9gcuJlpDcKXX36J1atXY+PGjejTpw8A4G9/+xtyc3OxY8cOdO7cOezt0tPTg35/6623cNlll6FDhw5Byxs3bhyyLoWya/oZiK9ghCsSRjUNMhUgFYsGmwOqjXkvDzsyHzC+UXAKVWcNADYHbmdag1BcXAyfz6cVCwDIycmBz+fDhg0bIhaMmr7//nusWLECL7/8csj/LViwAPPnz0daWhqGDh2KqVOnolmzZoY+B6fQWzAAjiyZTcXGAGBzQOEx7+ViV+YDbBRqYnMQjHmvFtMahPLycqSmpoYsT01NRXl5eVT38fLLL6NZs2a45pprgpbfcMMNaN++PdLT0/HZZ59hypQp2LZtG4qKisLeT1VVFaqqzrwxKyoqdDwTZ6irYAD6p58BjizFis3BaSwWziFT3gPMfMD4JgFgoxAtq05EViXrAea9inQ3CNOmTcP06dPrXGfz5s0ATp+AVpsQIuzycP7+97/jhhtuQFJSUtDyCRMmaP/u1q0bOnXqhF69euGTTz5Bz549Q+6nsLCw3m12g0jHqALxTT8DLBjR4GjSGSwWalAx7wFmfkCsA0NA5MwHoh8cAoJzzw3Zz+YgGL8hWV26G4Tbb7+93itItGvXDp9++im+//77kP87cOAA0tLS6n2cDz74ADt27MDixYvrXbdnz55ISEjAzp07wxaMKVOmYPLkydrvFRUVaNOmTb3361QcWbKWygWDxcLdVMx7gJlfU6S8B6zL/AAnZ7/KOR/AvKeadDcIKSkpSElJqXe93Nxc+P1+fPTRR+jduzcAYNOmTfD7/cjLy6v39nPnzkV2djYuvPDCetf9/PPPcfz4cWRkZIT9f6/XC683fAi6lZkjS4C+RgFgwYiHG0eSWCisoWLeA8z82mKZPQaMz/wAp2S/1d9pwOaArGTa9yCcf/75GDJkCCZMmICNGzdi48aNmDBhAkaMGBF0wlqXLl2wbNmyoNtWVFTgjTfewM033xxyv9988w1mzJiBLVu2YPfu3Vi5ciWuv/56ZGVloW/fvmY9HUeq6wMX6/WzA/QGWeCa2qp+iUxNVj4PNgckA+a9Gur6vgQjMj+WPFIx+63e3lj3bTSa7RHS5z0z3x6mfg/CggULcMcddyA/Px8AcMUVV+C5554LWmfHjh3w+/1ByxYtWgQhBH7xi1+E3GdiYiLeffddPP300/jxxx/Rpk0bDB8+HFOnTkWDBg3MezIOJdvIEqDm6BJHkiJjc+AOzHs1xHPIEVB35gOx5z4QmqMy5b9dDYxKWQ8w753EI4Qw/h0iuYqKCvh8Pvj9fiQnJwMAhmbcZvNW2S9S0QDCH3JUU31FIyCWolETC4Y7Zw0AFgu9VpXN0v4dLvPchJkfngqZX5sVNUCG2QwzGwOAee9ERme+qTMIpJZYR5aA+k9oC4hndAkIH9xWNQ12Fw2VRpI4ikQkv3gzHzB3RiGcaHM4Ul2wO8fro1pjALA5cCo2CBSkvkOOgMgjS9EWDMDYolFf4EfbQMhaOFRqDAA2B0Qqqa9JAOqeTdA7OAQYP6sQjqx5HonZjQHAvCd92CBQWPEUjVgaBcC8oqFaoQhwc2MAsFgQWaWugSHAuNmEAKubBZmxMTiNeS8fNggUkV1Fw80Fg8WChYLILkbMJgDRZz7g3mZB1awHmPduwQaB6mV10XBjwVC1WHAUichZohkYAoxvFADnZ78VOQ+o0RgAzHvZsUGgqNhVNGoHqpOKBovFGSwURHKpa2AI0Jf5gHubBatyHlAj6wHmvSrYIJAuRjYKQHxFA1CrcFhZKAAWCyKKT315D9R/qGlArLMKQPjslDX7rc55wLysB5j3bsYGgWJixOgSEF/RAORuGOwoFAAbAyIylhEDQwHxZn5ApHy1qgbYle81sTEgM7FBoJhFO7oERN8oAPEVjrpC26zCIUOhANgYEJG5jBoYAozL/NpkyWMzqdQYAMx8VbFBoLgZ2SgALBx6sFAQkZX05D1gb+Y7iZlZDzDvKRQbBDKM0Y0CwMIRDgsFEdktmrwHmPnxMDvrAeY9RcYGgQxX3zQ0oL9oAO4uHCwURCQjsxoFIDT33JD7VmQ9wLyn+rFBIFPoLRoAC0dtLBREpAqzMx9wZu5blfMBzHuKFhsEMlW0RQOIbYQpwAmFg4WCiFRnVeYD4TNT9uy3OucBc7I+gJnvXGwQyBI1Q8TMEaaASCEsQ/Gwo0AEmFUoWCSIqKZYGgUg9swPqCtfrcp/OzO+JuY9xYMNAlnOrsIBRBfc8RQRWQpDTRw9IiK76BkcAozP/JpkzGejMe/JKGwQyDZ6GgXA3MJRkxOKiJlFAmChICL9ZM181THvyQxsEMh2ekeYgNBAZPFgkSAiNehtFABmfk1mZ30AM9/d2CCQVGIpHIA7iweLBBGpLJbBoQA3Zb5VWQ8w7+kMNggkpXgKBxA+UFUuIFYWCIBFgoisxcw/zeqsB5j3FB4bBJJevIUjIFLwylZE7CgQAIsEEcnB7MwH7M99u3I+gHlP9WGDQEoxqnDUFE1QG1FM7C4I4bBIEJHMzMh8QM48NhvznvRgg0DKqh12RhaP2pxUTFgkiEhFVma+UzDvKVZsEMgxWDzCY4EgIidi5odi3pNR2CCQY7mxeLA4EJFbuS3zmfdkJjYI5BqRwlTVIsLiQEQUmZMyn3lPVmODQK5XV/DaXUhYFIiIjCVj5jPrSTZsEIjqwNAmInIPZj7RaWeZeed/+ctfkJeXh8aNG+Pss8+O6jZCCEybNg2tWrVCo0aNcOmll+Lzzz8PWqeqqgq/+93vkJKSgiZNmuCKK67Avn38UBMR2YV5T0TkHKY2CNXV1bj++usxceLEqG/zyCOP4IknnsBzzz2HzZs3Iz09HYMGDUJlZaW2zqRJk7Bs2TIsWrQIH374IX788UeMGDECJ0+eNONpEBFRPZj3RETOYeohRtOnTwcAzJs3L6r1hRB46qmncP/99+Oaa64BALz88stIS0vDa6+9ht/+9rfw+/2YO3cuXn31VQwcOBAAMH/+fLRp0wZr1qzB4MGDTXkuREQUGfOeiMg5pDoHYdeuXSgvL0d+fr62zOv1on///tiwYQN++9vf4uOPP8bx48eD1mnVqhW6deuGDRs2hC0YVVVVqKo680VXfr8fAFBRUaEtO3Gq2oynRERki5r5Fvi3EMKuzQlhVt4DzHwich+jM1+qBqG8vBwAkJaWFrQ8LS0Ne/bs0dZJTExE8+bNQ9YJ3L62wsJCbXSrpjZt2hix2URE0vH5XgxZVllZCZ/PZ8PWhDIr7wFmPhG5j9GZr7tBmDZtWtjgrWnz5s3o1atXTBsEAB6PJ+h3IUTIstrqWmfKlCmYPHmy9vupU6fwww8/oGXLltptKioq0KZNG+zduxfJyckxb7ubcJ/px32mH/eZfrX3mRAClZWVaNWqla77UTHvgfozn+8p/bjP9OM+04/7TL9w+yzWzK9Jd4Nw++23Y8yYMXWu065du5g2Jj09HcDpUaOMjAxt+f79+7VRpvT0dFRXV+Pw4cNBo0r79+9HXl5e2Pv1er3wer1ByyJdZSM5OZlvSp24z/TjPtOP+0y/mvssllEkFfMeiD7z+Z7Sj/tMP+4z/bjP9Ku9z+KdLdbdIKSkpCAlJSWuB42kffv2SE9PR1FREbKysgCcvjLG+vXrMXPmTABAdnY2EhISUFRUhFGjRgEAysrK8Nlnn+GRRx4xZbuIiNyIeU9E5E6mnoNQWlqKH374AaWlpTh58iS2bt0KAPjZz36Gpk2bAgC6dOmCwsJCXH311fB4PJg0aRIeeughdOrUCZ06dcJDDz2Exo0bY+zYsQBOd0Tjx4/HXXfdhZYtW6JFixa4++670b17d+0qF0REZC3mPRGRc5jaIDz44IN4+eWXtd8Do0Rr167FpZdeCgDYsWOHdoUJAPi///s//PTTT7j11ltx+PBh9OnTB++88w6aNWumrfPkk0+iYcOGGDVqFH766ScMGDAA8+bNQ4MGDWLeVq/Xi6lTp4ZMS1Nk3Gf6cZ/px32mnx37jHnvbNxn+nGf6cd9pp9Z+8wjZLruHRERERER2crUb1ImIiIiIiK1sEEgIiIiIiINGwQiIiIiItKwQSAiIiIiIo1rG4S//OUvyMvLQ+PGjSN+aVptQghMmzYNrVq1QqNGjXDppZfi888/N3dDJXL48GEUFBTA5/PB5/OhoKAAR44cqfM2N910EzweT9BPTk6ONRtsk9mzZ6N9+/ZISkpCdnY2PvjggzrXX79+PbKzs5GUlIQOHTrghRdesGhL5aFnn61bty7kPeXxeLB9+3YLt9g+77//PkaOHIlWrVrB4/HgzTffrPc2fI8x82PBzK8f814/5r0+dmW+axuE6upqXH/99Zg4cWLUt3nkkUfwxBNP4LnnnsPmzZuRnp6OQYMGobKy0sQtlcfYsWOxdetWrF69GqtXr8bWrVtRUFBQ7+2GDBmCsrIy7WflypUWbK09Fi9ejEmTJuH+++9HSUkJ+vXrh6FDh6K0tDTs+rt27cKwYcPQr18/lJSU4L777sMdd9yBJUuWWLzl9tG7zwJ27NgR9L7q1KmTRVtsr6NHj+LCCy/Ec889F9X6fI+dxszXj5lfN+a9fsx7/WzLfOFyL730kvD5fPWud+rUKZGeni4efvhhbdmxY8eEz+cTL7zwgolbKIcvvvhCABAbN27UlhUXFwsAYvv27RFvN27cOHHllVdasIVy6N27t7jllluClnXp0kXce++9Ydf/v//7P9GlS5egZb/97W9FTk6OadsoG737bO3atQKAOHz4sAVbJzcAYtmyZXWuw/dYMGZ+dJj59WPe68e8j4+Vme/aGQS9du3ahfLycuTn52vLvF4v+vfvjw0bNti4ZdYoLi6Gz+dDnz59tGU5OTnw+Xz1Pv9169YhNTUV5513HiZMmID9+/ebvbm2qK6uxscffxz0HgGA/Pz8iPuouLg4ZP3Bgwdjy5YtOH78uGnbKotY9llAVlYWMjIyMGDAAKxdu9bMzVSa299jsWLmM/PrwrzXj3lvDaPeZ2wQolReXg4ASEtLC1qelpam/Z+TlZeXIzU1NWR5ampqnc9/6NChWLBgAd577z08/vjj2Lx5My6//HJUVVWZubm2OHjwIE6ePKnrPVJeXh52/RMnTuDgwYOmbassYtlnGRkZmDNnDpYsWYKlS5eic+fOGDBgAN5//30rNlk5bn+PxYqZz8yvC/NeP+a9NYx6nzU0esPsNG3aNEyfPr3OdTZv3oxevXrF/BgejyfodyFEyDKVRLvPgNDnDtT//EePHq39u1u3bujVqxcyMzOxYsUKXHPNNTFutdz0vkfCrR9uuZPp2WedO3dG586dtd9zc3Oxd+9ePPbYY7jkkktM3U5VOfU9xszXj5lvLOa9fsx78xnxPnNUg3D77bdjzJgxda7Trl27mO47PT0dwOnOLCMjQ1u+f//+kE5NJdHus08//RTff/99yP8dOHBA1/PPyMhAZmYmdu7cqXtbZZeSkoIGDRqEjITU9R5JT08Pu37Dhg3RsmVL07ZVFrHss3BycnIwf/58ozfPEZz8HmPm68fMNwbzXj/mvTWMep85qkFISUlBSkqKKffdvn17pKeno6ioCFlZWQBOH0+3fv16zJw505THtEK0+yw3Nxd+vx8fffQRevfuDQDYtGkT/H4/8vLyon68Q4cOYe/evUEF1ykSExORnZ2NoqIiXH311dryoqIiXHnllWFvk5ubi+XLlwcte+edd9CrVy8kJCSYur0yiGWfhVNSUuLI95QRnPweY+brx8w3BvNeP+a9NQx7n+k6pdlB9uzZI0pKSsT06dNF06ZNRUlJiSgpKRGVlZXaOp07dxZLly7Vfn/44YeFz+cTS5cuFf/5z3/EL37xC5GRkSEqKirseAqWGzJkiOjRo4coLi4WxcXFonv37mLEiBFB69TcZ5WVleKuu+4SGzZsELt27RJr164Vubm54txzz3XsPlu0aJFISEgQc+fOFV988YWYNGmSaNKkidi9e7cQQoh7771XFBQUaOt/++23onHjxuLOO+8UX3zxhZg7d65ISEgQ//jHP+x6CpbTu8+efPJJsWzZMvHVV1+Jzz77TNx7770CgFiyZIldT8FSlZWVWl4BEE888YQoKSkRe/bsEULwPRYJM18/Zn7dmPf6Me/1syvzXdsgjBs3TgAI+Vm7dq22DgDx0ksvab+fOnVKTJ06VaSnpwuv1ysuueQS8Z///Mf6jbfJoUOHxA033CCaNWsmmjVrJm644YaQS4/V3Gf/+9//RH5+vjjnnHNEQkKCaNu2rRg3bpwoLS21fuMtNGvWLJGZmSkSExNFz549xfr167X/GzdunOjfv3/Q+uvWrRNZWVkiMTFRtGvXTjz//PMWb7H99OyzmTNnio4dO4qkpCTRvHlz8fOf/1ysWLHChq22R+Cyf7V/xo0bJ4TgeywSZr5+zPz6Me/1Y97rY1fme4T4/2cuEBERERGR6/Eyp0REREREpGGDQEREREREGjYIRERERESkYYNAREREREQaNghERERERKRhg0BERERERBo2CEREREREpGGDQEREREREGjYIRERERESkYYNAREREREQaNghERERERKRhg0BERERERJr/B8C+WA2qI1tLAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "params1 = (A,0.8*drift_direction,D,1.,bc)\n", "print(\"Centered discretization\"); \n", "solution_lf = newton_root(SchemeCentered_Quad,guess,params1)\n", "print()\n", "print(\"Upwind discretization\"); \n", "solution_upwind = newton_root(SchemeUpwind,guess,params1)\n", "\n", "plt.figure(figsize=(9,4))\n", "plt.subplot(1,2,1); plt.axis('equal'); plt.title('Centered solution')\n", "plt.contourf(*X,solution_lf);\n", "plt.subplot(1,2,2); plt.axis('equal'); plt.title('Upwind solution')\n", "plt.contourf(*X,solution_upwind);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On the other hand, if $|\\omega|>1$, then the solution features a boundary layer, along which the gradient norm is large. As a result, the centered scheme looses monotonicity, and cannot the solver fails. " ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:30.960970Z", "iopub.status.busy": "2024-04-30T08:50:30.960864Z", "iopub.status.idle": "2024-04-30T08:50:34.575128Z", "shell.execute_reply": "2024-04-30T08:50:34.574748Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Centered discretization\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 1 Residue norm: 50.265687232917536\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 2 Residue norm: 49336633.79105744\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 3 Residue norm: 12334165.482004056\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 4 Residue norm: 3083542.5588974967\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 5 Residue norm: 770880.4029508829\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 6 Residue norm: 177320707.80257964\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 8 Residue norm: 11082568.584614972\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 10 Residue norm: 692691.8418754636\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 12 Residue norm: 52619.874947132004\n", "Max iterations exceeded. Aborting.\n", "\n", "Upwind discretization\n", "Iteration: 1 Residue norm: 26.15264872826889\n", "Iteration: 2 Residue norm: 12.054212149921995\n", "Iteration: 3 Residue norm: 0.015615302075318027\n", "Iteration: 4 Residue norm: 1.0064768218853715e-06\n", "Iteration: 5 Residue norm: 1.1501910535116622e-13\n", "Target residue reached. Terminating.\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwgAAAF0CAYAAACHeh6EAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABRsElEQVR4nO3de3wU1cH/8e8KuXDLCkSSIBCCxShXAxSSUEQFwr1qq0DRFJ8iT6VaisDzIFoVaCuCd61oqSgVKWALqBSkBAXUh4CAAUtVigoEbSIXQxKohNv8/uCXIZu9JJvs7G0+79drXy92cnZ3Zpg9e75zzplxGIZhCAAAAAAkXRLqFQAAAAAQPggIAAAAAEwEBAAAAAAmAgIAAAAAEwEBAAAAgImAAAAAAMBEQAAAAABgIiAAAAAAMBEQAAAAAJgICLDExx9/rP/6r/9SWlqa4uPj1bRpU/Xo0UPz5s3Tt99+a9nn/uc//9HMmTO1adMmyz6jPmbOnCmHwxHUz7zuuut03XXX1em1a9eu1cyZMz3+rX379rrjjjvqvF4AoltlfXf06FGPf+/SpUud66a6sqLeqk8dW1cOh8Nr3VyT+fPna9GiRW7LDxw4IIfD4fFvsJ+GoV4BRJ8//vGP+sUvfqH09HT9z//8jzp16qQzZ85ox44devHFF5Wfn69Vq1ZZ8tn/+c9/NGvWLEkKeoUdjdauXavnn3/e4w/RqlWrlJCQEPyVAoA6ot66EBASExPdglJKSory8/N1xRVXhGbFEFYICAio/Px8TZw4UYMGDdIbb7yhuLg482+DBg3S1KlTtW7duhCuYd2cOXNGDodDDRvylamUkZER6lUAAL9Qb3kXFxenzMzMUK8GwgRDjBBQjzzyiBwOhxYsWOASDirFxsbqhz/8ocuy5cuXKysrS02aNFHTpk01ePBgFRQUuJS544471LRpU33++ecaNmyYmjZtqrZt22rq1KmqqKiQdKF79LLLLpMkzZo1Sw6HQw6Hw+Usyb59+zR27Fi1atVKcXFxuvrqq/X888+7fNamTZvkcDi0ePFiTZ06VZdffrni4uL0+eefS5I2bNigAQMGKCEhQY0bN1bfvn31zjvvuG3rmjVrdM011yguLk5paWl6/PHHa70fCwoKNGLECHM9W7dureHDh+urr74yy5w6dUozZsxQWlqaYmNjdfnll+vuu+/W8ePHfb535fZVH4ZVvXv5jjvuMPdN5b50OBw6cOCAJM9d9YWFhbr99ttd9u8TTzyh8+fPu33O448/rieffFJpaWlq2rSpsrKytHXr1lrvIwDRpbJueu211zRlyhQlJyerUaNG6t+/v8tvwpo1a+RwOLR9+3Zz2YoVK+RwODR8+HCX9+zWrZt+/OMfm8+r11uVn7l06VI98MADat26tRISEjRw4EDt3bvX5b0Mw9C8efOUmpqq+Ph49ejRQ2+//Xatt+8vf/mL+vTpI6fTqcaNG6tDhw762c9+5lKmNnWoJ96Gry5atMit3v7nP/+pzZs3m3V6+/btJXkfYvTBBx9owIABatasmRo3bqzs7GytWbPG4+ds3LhREydOVGJiolq2bKkf/ehH+ve//13rfYTwQUBAwJw7d07vvvuuevbsqbZt29bqNY888oh+8pOfqFOnTnr99de1ePFilZeXq1+/fvrkk09cyp45c0Y//OEPNWDAAL355pv62c9+pqeeekpz586VdKF7tLJ3Yvz48crPz1d+fr4efPBBSdInn3yi73//+9qzZ4+eeOIJ/e1vf9Pw4cM1adIkc1hSVTNmzFBhYaFefPFFrV69Wq1atdJrr72mnJwcJSQk6E9/+pNef/11tWjRQoMHD3YJCe+8845uvPFGNWvWTMuWLdNjjz2m119/Xa+88kqN++TkyZMaNGiQvvnmGz3//PPKy8vT008/rXbt2qm8vFzShR+qm266SY8//rhyc3O1Zs0aTZkyRX/60590ww03mKGpPh588EHdcsstkmTuy/z8fKWkpHgsf+TIEWVnZ2v9+vX6zW9+o7feeksDBw7UtGnTdM8997iVr7ptS5Ys0cmTJzVs2DCVlpbWe90BRK77779fX375pV566SW99NJL+ve//63rrrtOX375pSSpf//+iomJ0YYNG8zXbNiwQY0aNdLmzZt15swZSdLhw4e1Z88eDRw4sFafefDgQb300ktasGCB9u3bp5EjR+rcuXNmmVmzZmn69OlmD/nEiRM1YcIEtyDhSX5+vkaPHq0OHTpo2bJlWrNmjR566CGdPXvWLONvHVoXq1atUocOHZSRkWHW6b6G/G7evFk33HCDSktLtXDhQi1dulTNmjXTyJEjtXz5crfyd955p2JiYvTnP/9Z8+bN06ZNm3T77bcHZN0RZAYQIMXFxYYkY8yYMbUqX1hYaDRs2ND45S9/6bK8vLzcSE5ONkaNGmUuGzdunCHJeP31113KDhs2zEhPTzefHzlyxJBkPPzww26fN3jwYKNNmzZGaWmpy/J77rnHiI+PN7799lvDMAxj48aNhiTj2muvdSl38uRJo0WLFsbIkSNdlp87d87o3r270bt3b3NZnz59jNatWxvfffeduaysrMxo0aKFUdPXbseOHYYk44033vBaZt26dYYkY968eS7Lly9fbkgyFixYYC7r37+/0b9/f/N55fZt3LjR5bX79+83JBmvvPKKuezuu+/2ur6pqanGuHHjzOf33XefIcnYtm2bS7mJEycaDofD2Lt3r8vndO3a1Th79qxZ7sMPPzQkGUuXLvW63QAix8MPP2xIMo4cOeLx7507d/ZYN/Xo0cM4f/68ufzAgQNGTEyMceedd5rLfvCDHxg33HCD+fx73/ue8T//8z/GJZdcYmzevNkwDMNYsmSJIcn417/+ZZarXm9VfuawYcNc1u311183JBn5+fmGYRhGSUmJER8fb9x8880u5f7v//7PkOSyHZ48/vjjhiTj+PHjXsvUtg41DMPtd65yX1f3yiuvGJKM/fv3m8uq7/dKnn4DMjMzjVatWhnl5eXmsrNnzxpdunQx2rRpY/4/VX7OL37xC5f3nDdvniHJKCoq8rrdCE/0ICBk/v73v+vs2bP66U9/qrNnz5qP+Ph49e/f320IjMPh0MiRI12WdevWTQcPHqzxs06dOqV33nlHN998sxo3buzyecOGDdOpU6fchrdU7ZaWpC1btujbb7/VuHHjXF5//vx5DRkyRNu3b9fJkyd18uRJbd++XT/60Y8UHx9vvr7yrEtNvve976l58+aaPn26XnzxRbeeFEl69913JcltiM+tt96qJk2aeBzyZLV3331XnTp1Uu/evV2W33HHHTIMw1znSsOHD1eDBg3M5926dZOkWv1/AoheY8eOdRkuk5qaquzsbG3cuNFcNmDAAP3f//2fvvvuOx08eFCff/65xowZo2uuuUZ5eXmSLvQqtGvXTh07dqzxM6sPfa1eH+Xn5+vUqVO67bbbXMplZ2crNTW1xvf//ve/L0kaNWqUXn/9dX399dduZfytQ6128uRJbdu2TbfccouaNm1qLm/QoIFyc3P11VdfufWe1LQfETkICAiYxMRENW7cWPv3769V+W++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i4tTXFyc2/KEhATzx+KS+Pj6rj4AhI3Kuq2qcBteE8o6v2mz8BlqBQD1Feg6P6xqyKysLOXl5bksW79+vXr16qWYmBifZbKzs4O2ngCA+qPOB4DwZGkPwokTJ/T555+bz/fv369du3apRYsWateunWbMmKGvv/5ar776qqQLV6/4/e9/rylTpmjChAnKz8/XwoULXa5U8atf/UrXXnut5s6dqxtvvFFvvvmmNmzYoA8++MDKTQEA1IA6HwCig6U9CDt27FBGRoYyMjIkSVOmTFFGRoYeeughSVJRUZEKCwvN8mlpaVq7dq02bdqka665Rr/5zW/07LPP6sc//rFZJjs7W8uWLdMrr7yibt26adGiRVq+fLn69Olj5aYAAGpAnQ8A0SFo90EIJ2VlZXI6nSotLTXHbHV49okQrxUABM6Xk6aa//ZU59mJp+3fXdg2xGsFAIHTvd0h89+BqPPDag4CAAAAgNAiIAAAAAAwERAAAAAAmAgIAAAAAEwEBAAAAAAmAgIAAAAAEwEBAAAAgImAAAAAAMBEQAAAAABgIiAAAAAAMBEQAAAAAJgICAAAAABMBAQAAAAAJgICAAAAABMBAQAAAICJgAAAAADAREAAAAAAYCIgAAAAADAREAAAAACYCAgAAAAATAQEAAAAACYCAgAAAAATAQEAAACAqWGoVwAAAMBfi0uyg/p5uc23BPXzgFAiIAAAgLAU7BDgS03rQoBANCEgAACAkAqnIFBX3raB4IBIREAAAABBEw1hwB+etpfQgHBn+STl+fPnKy0tTfHx8erZs6fef/99r2XvuOMOORwOt0fnzp3NMosWLfJY5tSpU1ZvCgCgBtT5qG5xSbbLA+wThD9LexCWL1+uyZMna/78+erbt6/+8Ic/aOjQofrkk0/Url07t/LPPPOMHn30UfP52bNn1b17d916660u5RISErR3716XZfHx8dZsBACgVqjzUYlGr3+q7i96FxAOLA0ITz75pMaPH68777xTkvT000/r73//u1544QXNmTPHrbzT6ZTT6TSfv/HGGyopKdF//dd/uZRzOBxKTk62ctUBAH6izrc3QkFgVN+PBAaEgmVDjE6fPq2dO3cqJyfHZXlOTo62bKndwb5w4UINHDhQqampLstPnDih1NRUtWnTRiNGjFBBQUHA1hsA4D/qfHtimIz12McIBct6EI4e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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "params2 = (A,1.2*drift_direction,D,1.,bc)\n", "print(\"Centered discretization\"); \n", "solution_lf = newton_root(SchemeCentered_Quad,guess,params2,\n", " stop=stop(niter_max=12,raise_on_abort=False))\n", "print()\n", "print(\"Upwind discretization\"); \n", "solution_upwind = newton_root(SchemeUpwind,guess,params2)\n", "\n", "plt.figure(figsize=(9,4))\n", "plt.subplot(1,2,1); plt.axis('equal'); plt.title('Centered solution')\n", "plt.contourf(*X,solution_lf);\n", "plt.subplot(1,2,2); plt.axis('equal'); plt.title('Upwind solution')\n", "plt.contourf(*X,solution_upwind);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The upwind scheme is monotone and solvable even for a vanishing diffusion tensor field $A$.\n", "\n", "A numerical difficulty arises however for our Newton solver : the jacobian matrix $J$ of the scheme may not be invertible. Fortunately but $J+ \\epsilon \\mathrm{Id}$ is invertible for any $\\epsilon>0$." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:34.577092Z", "iopub.status.busy": "2024-04-30T08:50:34.576957Z", "iopub.status.idle": "2024-04-30T08:50:34.849281Z", "shell.execute_reply": "2024-04-30T08:50:34.849000Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 1 Residue norm: 39.513767346713\n", "Iteration: 2 Residue norm: 9.840819177498114\n", "Iteration: 3 Residue norm: 2.3997317508090434\n", "Iteration: 4 Residue norm: 0.44412322609316157\n", "Iteration: 5 Residue norm: 0.037963132835068025\n", "Iteration: 6 Residue norm: 0.0008139125358357369\n", "Iteration: 8 Residue norm: 7.2353676496828e-06\n", "Iteration: 10 Residue norm: 9.558118230224011e-08\n", "Iteration: 11 Residue norm: 9.553106306015025e-09\n", "Target residue reached. Terminating.\n" ] }, { "data": { "image/png": "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s2bp0Ucf1ZNPPqmNGzcqNTVVQ4YMUUUFH4tcH2PHjtXWrVu1bNkyLVu2TFu3blVeXl6d9xs2bJjKysp8t6VLl0Zga61l4cKFmjhxou69914VFRWpf//+Gj58uEpKSoKuv337dl166aXq37+/ioqKdM899+i2227TokWLIrzl1hXqe16tuLjY7+e5c+fOEdpia/vhhx90/vnn68knn6zX+vyM18CAY7z00kuG2+2uc71jx44Zqampxp/+9CffskOHDhlut9t45plnTNxCe/jiiy8MScb69et9ywoLCw1JxldffVXj/W688UbjyiuvjMAWWlvfvn2NCRMm+C3r2rWrcffddwdd/3e/+53RtWtXv2U333yzkZWVZdo22k2o7/nKlSsNScaBAwcisHX2JslYvHhxrevwMx4cExwE2L59u8rLy5Wbm+tblpCQoAEDBmjdunVR3DJrKCwslNvtVr9+/XzLsrKy5Ha763z/Vq1apdatW6tLly7Kz8/Xnj17zN5cS6mqqtLmzZv9fjYlKTc3t8b3trCwMGD9oUOHatOmTTp8+LBp22oXDXnPq/Xq1UtpaWkaNGiQVq5caeZmOho/48EROAhQXl4uSb5PcK+WkpLi+x5qVl5ertatWwcsb926da3v3/DhwzVv3jytWLFCjzzyiDZu3KhLLrlElZWVZm6upezbt09Hjx4N6WezvLw86PpHjhzRvn37TNtWu2jIe56WlqbnnntOixYt0ptvvqmMjAwNGjRIa9asicQmOw4/48GZ+llUMM/UqVM1bdq0WtfZuHGj+vTp0+DncLlcfl8bhhGwzEnq+55Lge+dVPf7N3r0aN//79Gjh/r06aP09HQtWbJEv/jFLxq41fYU6s9msPWDLUfNQnnPMzIylJGR4fs6OztbpaWlevjhh3XRRReZup1Oxc94IALHom699VaNGTOm1nU6dOjQoMdOTU2VdPy/CtLS0nzL9+zZE/BfCU5S3/f8008/1XfffRfwvb1794b0/qWlpSk9PV3btm0LeVvtKjk5WU2aNAmYHNT2s5mamhp0/aZNm6ply5ambatdNOQ9DyYrK0uvvvpquDcP4me8JgSORSUnJys5OdmUx+7YsaNSU1NVUFDg+wT4qqoqrV69WjNnzjTlOa2gvu95dna2PB6PPv74Y/Xt21eStGHDBnk8HuXk5NT7+fbv36/S0lK/yHS6+Ph4ZWZmqqCgQFdffbVveUFBga688sqg98nOzta7777rt+yDDz5Qnz59FBcXZ+r22kFD3vNgioqK+Fk2CT/jNYjmEc6IjJ07dxpFRUXGtGnTjNNPP90oKioyioqKjIqKCt86GRkZxptvvun7+k9/+pPhdruNN9980/jnP/9p/PKXvzTS0tIMr9cbjZdgOcOGDTPOO+88o7Cw0CgsLDR69uxpjBgxwm+dE9/ziooK48477zTWrVtnbN++3Vi5cqWRnZ1tnHXWWbznJ1mwYIERFxdnzJkzx/jiiy+MiRMnGqeddpqxY8cOwzAM4+677zby8vJ86//73/82Tj31VOOOO+4wvvjiC2POnDlGXFyc8cYbb0TrJVhOqO/5X/7yF2Px4sXG119/bXz22WfG3XffbUgyFi1aFK2XYCkVFRW+39OSjEcffdQoKioydu7caRgGP+P1ReA4wI033mhICritXLnSt44k46WXXvJ9fezYMePBBx80UlNTjYSEBOOiiy4y/vnPf0Z+4y1q//79xnXXXWc0b97caN68uXHdddcFnDJ74nv+3//+18jNzTVatWplxMXFGe3btzduvPFGo6SkJPIbbwFPPfWUkZ6ebsTHxxu9e/c2Vq9e7fvejTfeaAwYMMBv/VWrVhm9evUy4uPjjQ4dOhhPP/10hLfY+kJ5z2fOnGmcffbZRmJiotGiRQvj5z//ubFkyZIobLU1VZ9mf/LtxhtvNAyDn/H6chnG/x2JBAAAYBOcJg4AAGyHwAEAALZD4AAAANshcAAAgO0QOAAAwHYIHAAAYDsEDgAAsB0CBwAA2A6BAwAAbIfAAQAAtkPgAAAA2/n/thzxBL4mueYAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "params = (None,1.2*drift_direction,D,1.,bc)\n", "epsilon=1; relax = epsilon*ad.Sparse.identity(bc.shape)\n", "solution_upwind = newton_root(SchemeUpwind,guess,params,relax=relax)\n", "\n", "\n", "plt.axis('equal'); plt.title('Upwind solution')\n", "plt.contourf(*X,solution_upwind);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For validation purposes, we reproduce the canonical example of a laplacian over a square domain." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:34.850894Z", "iopub.status.busy": "2024-04-30T08:50:34.850776Z", "iopub.status.idle": "2024-04-30T08:50:34.953047Z", "shell.execute_reply": "2024-04-30T08:50:34.952754Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 1 Residue norm: 2.5011104298755527e-12\n", "Target residue reached. Terminating.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "bc_square = Domain.MockDirichlet(bc.shape,bc.gridscale,0.)\n", "params = (np.eye(2),np.zeros(2),None,1.,bc_square)\n", "solution_upwind = newton_root(SchemeUpwind,guess,params)\n", "\n", "plt.axis('equal'); plt.title('Laplacian on a square')\n", "plt.contourf(*X,solution_upwind);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.4 Alternative centered scheme\n", "\n", "For completeness, we present a last scheme, that mixes the discretization principles of the previous two. In the considered examples, it behaves similarly to the first centered scheme. We use:\n", "* Centered finite differences for second order accuracy,\n", "* A sum-of-squares decomposition of the non-linearity, which is assumed to be quadratic.\n", "\n", "In addition, the quadratic non-linearity must be defined in terms of a tensor $D(x)$ which is *proportionnal* to diffusion tensor $A(x)$. This is strong restriction, which possibly makes this scheme less useful in applications. This assumption could be weakened, but the the scheme would become more complex.\n", "\n", "The resulting scheme is degenerate elliptic under the condition that\n", "* $A(x)$ is positive definite at each point.\n", "* $D(x)$ obeys a compatibility condition, satisfied in particular if $D(x)=\\alpha(x) A(x)$ at each point.\n", "* The grid scale $h>0$ is sufficiently small.\n", "\n", "\n", "\n", "The approximation of the first order non-linearity reads\n", "$$\n", " F(x,\\nabla u(x)) = \\sum_{1 \\leq i \\leq n} \\nu_i(x) \\left(\\frac{u(x+h e_i(x))-u(x-h e_i(x))}{2 h} - <\\omega(x),e_i(x)>\\right)^2+ O(h)\n", "$$\n", "where \n", "$$\n", " D(x) = \\sum_{1 \\leq i \\leq n} \\nu_i(x) e_i(x) e_i(x)^T\n", "$$\n", "is a tensor decomposition over the same stencil as $A(x)$, but with possibly negative weights $\\nu_i(x)\\in R$. This scheme is monotone provided the solution gradient is suitably bounded and \n", "$$\n", " \\mu_i \\geq h |\\nu_i|,\n", "$$\n", "where $h$ is the discretization grid scale. This is in particular the case if $A(x) = \\alpha(x) D(x)$ where $\\alpha(x) \\geq h$, at each point $x$.\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:34.954630Z", "iopub.status.busy": "2024-04-30T08:50:34.954520Z", "iopub.status.idle": "2024-04-30T08:50:34.957226Z", "shell.execute_reply": "2024-04-30T08:50:34.956992Z" } }, "outputs": [], "source": [ "def SchemeCenteredAlt(u,A,omega,D,rhs,bc):\n", " # Compute the decompositions (here offset_e = offset_f)\n", " sb = Selling.ObtuseSuperbase(A) \n", " mu,offset_e = Selling.Decomposition(A,sb=sb) # Non-negative decomposition\n", " nu,offset_f = Selling.Decomposition(D,sb=sb) # Decomposition with the same offsets\n", " omega_f = lp.dot_VA(omega,offset_f.astype(float))\n", "\n", " # Compute the first and second order finite differences\n", " du = bc.DiffCentered(u,offset_f)\n", " d2u = bc.Diff2(u,offset_e)\n", " \n", " # Scheme in the interior\n", " mu,nu,omega_f = (bc.as_field(e) for e in (mu,nu,omega_f)) \n", " residue = -lp.dot_VV(mu,d2u) + lp.dot_VV(nu, (du-omega_f)**2) - rhs\n", "\n", " # Boundary conditions\n", " return np.where(bc.interior,residue,u-bc.grid_values)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:34.958705Z", "iopub.status.busy": "2024-04-30T08:50:34.958603Z", "iopub.status.idle": "2024-04-30T08:50:35.879016Z", "shell.execute_reply": "2024-04-30T08:50:35.878725Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "No drift\n", "Iteration: 1 Residue norm: 24.999950894587233\n", "Iteration: 2 Residue norm: 6.002480451567207\n", "Iteration: 3 Residue norm: 1.2724251099266946\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 4 Residue norm: 0.16500802975014417\n", "Iteration: 5 Residue norm: 0.004280708161434887\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 6 Residue norm: 2.2617146198111726e-06\n", "Iteration: 7 Residue norm: 3.6060043839825084e-13\n", "Target residue reached. Terminating.\n", "\n", "Weak drift\n", "Iteration: 1 Residue norm: 30.40805941478428\n", "Iteration: 2 Residue norm: 7.379568316642263\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 3 Residue norm: 1.0964622384983578\n", "Iteration: 4 Residue norm: 0.018004761462498076\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 5 Residue norm: 2.6812805289377906e-06\n", "Iteration: 6 Residue norm: 6.505906924303417e-14\n", "Target residue reached. Terminating.\n", "\n", "Non-controllable drift\n", "Iteration: 1 Residue norm: 50.26568723291751\n", "Iteration: 2 Residue norm: 49336633.791056104\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 3 Residue norm: 12334165.482003726\n", "Iteration: 4 Residue norm: 3083542.5588974156\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 5 Residue norm: 770880.4029508628\n", "Iteration: 6 Residue norm: 177320707.80226308\n", "Iteration: 8 Residue norm: 11082568.58459519\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 10 Residue norm: 692691.8418742283\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 12 Residue norm: 52619.87494355634\n", "Max iterations exceeded. Aborting.\n" ] } ], "source": [ "print()\n", "print(\"No drift\"); \n", "solution_no = newton_root(SchemeCenteredAlt,guess,params0)\n", "print()\n", "print(\"Weak drift\"); \n", "solution_weak = newton_root(SchemeCenteredAlt,guess,params1)\n", "print()\n", "print(\"Non-controllable drift\"); \n", "solution_strong = newton_root(SchemeCenteredAlt,guess,params2,\n", " stop=stop(niter_max=12,raise_on_abort=False))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:35.880610Z", "iopub.status.busy": "2024-04-30T08:50:35.880496Z", "iopub.status.idle": "2024-04-30T08:50:36.046203Z", "shell.execute_reply": "2024-04-30T08:50:36.045911Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABEIAAAF0CAYAAAAn2ZxuAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABydElEQVR4nO3deXgUVdo28LsDSYclaZZAEgRCREhQEAMMkDBsAmERRRAB0QgzgDLjhsgnoiiLKMLrgo6i44iiosAooKiABgTEl6AgATdAZICAJLJ3gDEJkPP9wdtNOr2kl1pOVd2/6+pLqVRXTlV3P6m6+5xTNiGEABERERERERGRBUTp3QAiIiIiIiIiIq0wCCEiIiIiIiIiy2AQQkRERERERESWwSCEiIiIiIiIiCyDQQgRERERERERWQaDECIiIiIiIiKyDAYhRERERERERGQZDEKIiIiIiIiIyDIYhBARERERERGRZTAIIVNZuHAhbDYbYmNjcfDgQa+f9+jRA61bt1a9HaNHj0azZs2CWvfAgQOw2WxYuHChx/KlS5fimmuuQY0aNWCz2bBjxw7Mnz/faz0iIrV9+OGHsNlsWLp0qdfP2rZtC5vNhs8//9zrZ82bN0e7du1UadP06dNhs9lw/PhxxbcZLJvNhunTp3ssW7duHTp06IBatWrBZrPho48+wvvvv4958+Yp1k4iq/rmm28wePBgNG3aFHa7HYmJicjMzMRDDz3ksZ6Zz5dc57oHDhwIav1mzZph9OjRHsvy8/PRvXt3OBwO2Gw2zJs3D6tWrfKqZ8Ho1asXxo8f77Fs165dyMnJwZVXXonY2FgkJCSgXbt2uPfee1FcXBzS9kePHo3atWuH3C6ZHThwADfccAPq1asHm82GCRMmhPT8yq+pv2uJquTk5ODmm28O6TlmUl3vBhCpobS0FFOnTsW7776rd1OqlJycjLy8PDRv3ty97NixY8jJyUG/fv0wf/582O12tGzZEnfccQcSEhK8/qAREampR48esNlsWL9+PYYPH+5efvLkSfzwww+oVasW1q9fj759+7p/dvjwYfznP//BxIkT9WiyJvLy8tC4cWP3v4UQGDZsGFq2bImVK1eiVq1aSEtLQ05ODn788ceQT3aJ6LLPPvsMN910E3r06IG5c+ciOTkZhYWF2LZtG5YsWYLnnnvOve78+fN5vvR/VqxYgfj4eI9lf/3rX3Hu3DksWbIEdevWRbNmzTBr1iy88sorIYUhH3/8Mf73f/8X77zzjntZfn4+unTpglatWuGJJ55As2bNcPz4cezcuRNLlizBpEmTvNpjNQ8++CC++eYbvPnmm0hKSkJycnJIz/f1moZj+vTpSE9Px5dffonrr78+4u0ZDYMQMqV+/frh/fffx6RJk9C2bVu9m+PTxYsXceHCBdjtdnTu3NnjZ7/88gvOnz+PO+64A927d9ephURElyQkJKB169bYsGGDx/KNGzeievXqGDNmDNavX+/xM9e/e/bsqVUzNSGEQElJCWrUqOFVu48cOYKTJ09i8ODB6NWrl04tJDKnuXPnIjU1FZ9//jmqV798CTNixAjMnTs37O2eP38eNpvNY5tm8Mcff6BGjRrIyMjw+tmPP/6IcePGoX///hH9jqeffhqDBw/GFVdc4V42b948REVFYcOGDYiLi3MvHzp0KJ588kkIISL6nWbw448/omPHjmH3xvD1moajefPm6NevH5555hlLBiEcGkOm9PDDD6N+/fqYPHlyleuWlJRgypQpSE1NRUxMDK644grcc889OH36dFC/a+HChUhLS4PdbkerVq08UnEXV5e1uXPnYtasWUhNTYXdbsf69eu9urONHj0af/7znwEAw4cPh81mQ48ePdCsWTP89NNP2LhxI2w2G2w2W9DDb4iIItWzZ0/s2bMHhYWF7mUbNmzAn/70JwwYMADfffcdzpw54/GzatWqoWvXrgAuBQjz58/Hddddhxo1aqBu3boYOnQo/vOf/3j8ntzcXAwaNAiNGzdGbGwsrrrqKtx9991BDYHZvXs3rrzySnTq1AlHjx4NuO5nn32G6667Dna7HampqXj22Wd9rmez2XDvvffitddeQ6tWrWC32/H222+7f+b69nT69Onu3iGTJ0921+gePXrgs88+w8GDB921O5ThN0R0yYkTJ5CQkOAzsIiKunxJE+h8acOGDbDZbHj33Xfx0EMP4YorroDdbsevv/4KAHjzzTfRtm1bxMbGol69ehg8eDB27drl8btcQzV+/fVXDBgwALVr10aTJk3w0EMPobS01GPdw4cPY+jQoYiLi0OdOnVw++23Y+vWrUEPY9iyZQu6dOmC2NhYNGrUCFOmTMH58+e91mvWrBkGDhyI5cuXIyMjA7GxsZgxY4b7Z66e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24SSWzOI//znP2jevLnezSAiCmjfvn248sor9W6GqliPiUh2VqjFAOsxEclPyXqsao8QWdWrVw/Ape6JDodD59bIyzV7+KFDhzh7eBV4rILD4xQcp9OJpk2bumuVmbEeB4efneDwOAWHxyk4VqrFAOtxsPj5CQ6PU3B4nIKjRj22ZBASFRUF4NKYSr7hqhYfH8/jFCQeq+DwOAXHVavMjPU4NPzsBIfHKTg8TsGxQi0GWI9Dxc9PcHicgsPjFBwl67E1KjsRERERERERERiEEBEREREREZGFWDIIsdvtmDZtGux2u95NkRqPU/B4rILD4xQcKx0nK+1rJHicgsPjFBwep+BY7ThZbX/DxeMUHB6n4PA4BUeN42TJu8YQERERERERkTVZskcIEREREREREVkTgxAiIiIiIiIisgwGIURERERERERkGQxCiIiIiIiIiMgyLBOEPPXUU8jKykLNmjVRp06doJ4jhMD06dPRqFEj1KhRAz169MBPP/2kbkN1durUKeTk5MDhcMDhcCAnJwenT58O+JzRo0fDZrN5PDp37qxNgzUyf/58pKamIjY2Fu3bt8emTZsCrr9x40a0b98esbGxuPLKK/Haa69p1FJ9hXKcNmzY4PW+sdls2L17t4Yt1t5XX32FG2+8EY0aNYLNZsNHH31U5XPM9n5iPQ4O67FvrMfBYT2umtXrMWtxcFiLfWMtDh7rcWB61WLLBCFlZWW49dZb8be//S3o58ydOxfPP/88Xn75ZWzduhVJSUno06cPzpw5o2JL9TVy5Ejs2LEDa9aswZo1a7Bjxw7k5ORU+bx+/fqhsLDQ/Vi1apUGrdXG0qVLMWHCBDz22GPIz89H165d0b9/fxQUFPhcf//+/RgwYAC6du2K/Px8PProo7j//vuxbNkyjVuurVCPk8uePXs83jstWrTQqMX6OHfuHNq2bYuXX345qPXN+H5iPQ4O67E31uPgsB4Hx+r1mLU4OKzF3liLg8d6XDXdarGwmLfeeks4HI4q1ysvLxdJSUnimWeecS8rKSkRDodDvPbaayq2UD8///yzACC2bNniXpaXlycAiN27d/t93qhRo8SgQYM0aKE+OnbsKMaPH++xLD09XTzyyCM+13/44YdFenq6x7K7775bdO7cWbU2yiDU47R+/XoBQJw6dUqD1skJgFixYkXAdcz8fmI99o/12DfW4+CwHofOyvWYtdg/1mLfWIuDx3ocGi1rsWV6hIRq//79KCoqQnZ2tnuZ3W5H9+7dsXnzZh1bpp68vDw4HA506tTJvaxz585wOBxV7vOGDRvQsGFDtGzZEuPGjcPRo0fVbq4mysrK8N1333m8DwAgOzvb7zHJy8vzWr9v377Ytm0bzp8/r1pb9RTOcXLJyMhAcnIyevXqhfXr16vZTEOy4vupMtbjS1iPWY+DwXqsHiu+nypiLb6EtZi1OFisx+pQ6v3EIMSPoqIiAEBiYqLH8sTERPfPzKaoqAgNGzb0Wt6wYcOA+9y/f3+89957+PLLL/Hcc89h69atuP7661FaWqpmczVx/PhxXLx4MaT3QVFRkc/1L1y4gOPHj6vWVj2Fc5ySk5Px+uuvY9myZVi+fDnS0tLQq1cvfPXVV1o02TCs+H6qjPX4MtZj1uOqsB6rx4rvp4pYiy9jLWYtDgbrsTqUej9VV7phWpo+fTpmzJgRcJ2tW7eiQ4cOYf8Om83m8W8hhNcy2QV7nADv/QWq3ufhw4e7/79169bo0KEDUlJS8Nlnn2HIkCFhtlouob4PfK3va7nZhHKc0tLSkJaW5v53ZmYmDh06hGeffRbdunVTtZ1GY4T3E+txcFiPI8d6HBzWY3XI/n5iLQ4Oa3HkWIuDx3qsPCXeT4YOQu69916MGDEi4DrNmjULa9tJSUkALiVOycnJ7uVHjx71SqBkF+xx+v777/H77797/ezYsWMh7XNycjJSUlKwd+/ekNsqm4SEBFSrVs0rtQ30PkhKSvK5fvXq1VG/fn3V2qqncI6TL507d8aiRYuUbp6hGeX9xHocHNbj8LEeB4f1WD1GeD+xFgeHtTh8rMXBYz1Wh1LvJ0MHIQkJCUhISFBl26mpqUhKSkJubi4yMjIAXBrntXHjRsyZM0eV36mWYI9TZmYmnE4nvv32W3Ts2BEA8M0338DpdCIrKyvo33fixAkcOnTI44+kUcXExKB9+/bIzc3F4MGD3ctzc3MxaNAgn8/JzMzEJ5984rHsiy++QIcOHRAdHa1qe/USznHyJT8/3xTvGyUZ5f3Eehwc1uPwsR4Hh/VYPUZ4P7EWB4e1OHysxcFjPVaHYu+nkKZWNbCDBw+K/Px8MWPGDFG7dm2Rn58v8vPzxZkzZ9zrpKWlieXLl7v//cwzzwiHwyGWL18ufvjhB3HbbbeJ5ORkUVxcrMcuaKJfv37i2muvFXl5eSIvL0+0adNGDBw40GOdisfpzJkz4qGHHhKbN28W+/fvF+vXrxeZmZniiiuuMM1xWrJkiYiOjhYLFiwQP//8s5gwYYKoVauWOHDggBBCiEceeUTk5OS41//Pf/4jatasKR588EHx888/iwULFojo6Gjx4Ycf6rULmgj1OL3wwgtixYoV4pdffhE//vijeOSRRwQAsWzZMr12QRNnzpxx1x8A4vnnnxf5+fni4MGDQghrvJ9Yj4PDeuyN9Tg4rMfBsXo9Zi0ODmuxN9bi4LEeV02vWmyZIGTUqFECgNdj/fr17nUAiLfeesv97/LycjFt2jSRlJQk7Ha76Natm/jhhx+0b7yGTpw4IW6//XYRFxcn4uLixO233+51+6aKx+m///2vyM7OFg0aNBDR0dGiadOmYtSoUaKgoED7xqvolVdeESkpKSImJka0a9dObNy40f2zUaNGie7du3usv2HDBpGRkSFiYmJEs2bNxKuvvqpxi/URynGaM2eOaN68uYiNjRV169YVf/7zn8Vnn32mQ6u15botWuXHqFGjhBDWeD+xHgeH9dg31uPgsB5Xzer1mLU4OKzFvrEWB4/1ODC9arFNiP+bWYSIiIiIiIiIyOR4+1wiIiIiIiIisgwGIURERERERERkGQxCiIiIiIiIiMgyGIQQERERERERkWUwCCEiIiIiIiIiy2AQQkRERERERESWwSCEiIiIiIiIiCyDQQgRERERERERWQaDECIiIiIiIiKyDAYhRERERERERGQZDEKIiIiIiIiIyDIYhBARERERERGRZfx/tqf79POdg9UAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(13,4))\n", "plt.subplot(1,3,1); plt.axis('equal'); plt.title('No drift')\n", "plt.contourf(*X,solution_no);\n", "plt.subplot(1,3,2); plt.axis('equal'); plt.title('Weak drift')\n", "plt.contourf(*X,solution_weak);\n", "plt.subplot(1,3,3); plt.axis('equal'); plt.title('Strong drift (Scheme fails)')\n", "plt.contourf(*X,solution_strong);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Pure eikonal equations\n", "\n", "The upwind scheme can accomodate, a null diffusion tensor $A$, so that the consider PDE degenerates to a first order eikonal-like equation. \n", "$$\n", " \\|\\nabla u-\\omega\\|_D^2-1=0.\n", "$$\n", "In that case we may in addition impose the boundary condition $+\\infty$ on part of the domain boundary, in the sense of viscosity solutions. This corresponds to outflow boundary conditions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Note on the numerical solver.**\n", "In this notebook, we use a Newton-like solver for all the PDEs. While this approach does eventually work for the considered examples, let us emphasize that it *lacks both speed and robustness in the case of pure eikonal equations*. Gauss-Siedel iterations (either sweeping or adaptive) are much more adequate, or even better the single pass fast marching method (applicable to this numerical scheme when $\\omega=0$). \n", "\n", "**Stabilization of the linear solves**\n", "The jacobian matrix $J$ of the considered numerical scheme is not invertible, but \n", "$$\n", " J + \\epsilon_0 \\mathrm{Id} - \\epsilon_1 \\Delta\n", "$$\n", "is invertible for any $\\epsilon_0>0$ and $\\epsilon_1\\geq 0$, where $\\Delta$ is the matrix of the laplacian operator.\n", "\n", "We use both $\\epsilon_0>0$ and $\\epsilon_1>0$ in the first steps of Newton method, to propagate information over the domain using the laplacian kernel. Once a good approximation of the solution is obtained, we turn to a more basic relaxation with $\\epsilon_0>0$ and $\\epsilon_1=0$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.1 A Riemannian eikonal equation\n", "We solve $\\|\\nabla u\\|_D = 1$, where $D$ is the inverse to a Riemannian metric, which is specified in terms of its eigenvalues and eigenvectors.\n", "\n", "In order to compute the Riemannian distance from the domain center $x_0$, we impose the Dirichlet boundary condition $u(x_0)=0$. On the domain boundary, we set $u=+\\infty$ in the sense of viscosity solutions, to impose outflow boundary conditions." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:36.047937Z", "iopub.status.busy": "2024-04-30T08:50:36.047823Z", "iopub.status.idle": "2024-04-30T08:50:36.051085Z", "shell.execute_reply": "2024-04-30T08:50:36.050839Z" } }, "outputs": [], "source": [ "# Generate the metric\n", "eig1 = np.stack((np.full(bc.shape,1.),(np.pi/2)*np.cos(2*np.pi*X[0])))\n", "eig1 /= scipy.linalg.norm(eig1,axis=0) \n", "eig2 = np.stack( (eig1[1],-eig1[0]) ) # Rotate eig1 by pi/2\n", "lambda1, lambda2 = 0.8, 0.2\n", "metric = lambda1**-2*lp.outer_self(eig1) + lambda2**-2*lp.outer_self(eig2)\n", "\n", "# Boundary conditions set a seed in the center\n", "bc_eikonal_grid_values = np.full(bc.shape,np.nan)\n", "bc_eikonal_grid_values[bc.shape[0]//2,bc.shape[1]//2] = 1.\n", "\n", "# Outflow boundary conditions on the square boundary obtained by padding +infinity\n", "bc_eikonal = Domain.MockDirichlet(bc_eikonal_grid_values, bc.gridscale, padding=np.inf)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:36.052468Z", "iopub.status.busy": "2024-04-30T08:50:36.052382Z", "iopub.status.idle": "2024-04-30T08:50:36.250707Z", "shell.execute_reply": "2024-04-30T08:50:36.250399Z" } }, "outputs": [], "source": [ "# Set the problem parameters\n", "D_Riemann = lp.inverse(metric)\n", "omega_Riemann = bc.as_field(np.zeros(2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following variables encode the identity and laplacian operators, devoted to the stabilization of the linear systems." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:36.252441Z", "iopub.status.busy": "2024-04-30T08:50:36.252344Z", "iopub.status.idle": "2024-04-30T08:50:36.257211Z", "shell.execute_reply": "2024-04-30T08:50:36.256958Z" } }, "outputs": [], "source": [ "ident = ad.Sparse.identity(bc.shape)\n", "lap = bc_eikonal.Diff2(ident,(1,0)) + bc_eikonal.Diff2(ident,(0,1))\n", "lap[0,:]=0.; lap[-1,:]=0.; lap[:,0]=0.; lap[:,-1]=0.; " ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:36.258723Z", "iopub.status.busy": "2024-04-30T08:50:36.258636Z", "iopub.status.idle": "2024-04-30T08:50:38.408237Z", "shell.execute_reply": "2024-04-30T08:50:38.407965Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 1 Residue norm: 1.0\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 5 Residue norm: 3.605432892874699\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 9 Residue norm: 194.58604911510207\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 13 Residue norm: 3.9728508145792913\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 17 Residue norm: 2.8803427436693863\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 20 Residue norm: 1.6378773781358142\n", "Max iterations exceeded. Aborting.\n", "\n", "Iteration: 1 Residue norm: 10.651492467554577\n", "Iteration: 5 Residue norm: 0.34070548675785317\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 9 Residue norm: 0.026254530626949824\n", "Iteration: 13 Residue norm: 0.0017178774713889622\n", "Iteration: 17 Residue norm: 0.00010778223937157883\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 21 Residue norm: 6.7370720728821e-06\n", "Iteration: 25 Residue norm: 4.210679548366514e-07\n", "Iteration: 29 Residue norm: 2.631674766995218e-08\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 31 Residue norm: 6.5791907477574796e-09\n", "Target residue reached. Terminating.\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAGxCAYAAABvIsx7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABR0ElEQVR4nO3de1xUZf4H8M+EMHhjvKCAK4K1Cl4LMQVab2l4CTPdTcwibc2y3bbM3Ipc87IV2bbdtswulJWmtKFpaWxYeGlFSwPdLrpuq6IteEsHtALE8/vD30wMMwMzw5zzPOecz/v1mtdLDmfOPM8zx/N8+J5zZiyKoiggIiIiMpBLRDeAiIiIKNgYcIiIiMhwGHCIiIjIcBhwiIiIyHAYcIiIiMhwGHCIiIjIcBhwiIiIyHAYcIiIiMhwGHCIiIjIcBhwyJSWL18Oi8XifLRo0QIxMTGYMmUKDhw44Lb+8OHDMXz4cO0bKtjmzZthsViwefNm0U3xylMbp0+fjjZt2ohrVBMWLlwIi8UiuhlB8cMPP2DhwoUe9xHH/7NDhw5p3i6iFqIbQCTS66+/jsTERPz000/45z//iUcffRRFRUXYt28f2rdv71xv6dKlAlspzoABA1BcXIzevXuLbopXemijkf3www9YtGgRALj9EXDttdeiuLgYMTExAlpGZseAQ6bWt29fDBw4EMDFg3NdXR0WLFiA9957D7feeqtzPbNOnhEREUhJSRHdjEbpoY1m1alTJ3Tq1El0M8ikeIqKqB5H2Dl27JjLck+nqGpqavDII48gMTERVqsVnTp1wq233ooTJ064rBcfH4+MjAx88MEHSEpKQsuWLdGrVy988MEHAC6W8Xv16oXWrVtj0KBB2LVrl8vzd+3ahSlTpiA+Ph4tW7ZEfHw8brzxRhw+fNhlPcfpgKKiItx5552IjIxEx44dMWnSJPzvf//z2KaCggIMGDAALVu2RGJiIl577TWX9Tyd/lGjPd7s2rUL1113HTp06IDw8HAkJSXhnXfeabKNnvzzn/9EZGQkMjIycO7cOQDAp59+ipEjR6Jt27Zo1aoV0tLSsGHDhoD7kZeXh/T0dMTExDjf5wcffND5eoHwZQwAYMeOHbjqqqsQHh6OLl26IDs7G6+88orbKSKLxYKFCxe6PT8+Ph7Tp093/nzixAn87ne/Q+/evdGmTRt07twZV199NbZt2+Zc59ChQ84As2jRIucpX8d2vJ2ieu2113D55ZcjPDwcHTp0wMSJE/HNN9+4rOM4zfif//wH48aNQ5s2bRAbG4v77rsP1dXV/g0imRIDDlE9Bw8eBAD07Nmz0fUuXLiACRMm4PHHH8fUqVOxYcMGPP744ygsLMTw4cPx448/uqy/Z88eZGdn44EHHsCaNWtgs9kwadIkLFiwAK+++ioee+wxrFy5Ena7HRkZGS7PP3ToEBISEvDMM8/gH//4B5YsWYLy8nJceeWVOHnypFvbbrvtNoSGhuLtt9/GE088gc2bN+Pmm292W2/Pnj247777cO+992LdunXo378/ZsyYga1btzbad7Xa01BRURGuuuoqnDlzBsuWLcO6detwxRVXIDMzE8uXL2/y+fW98847GDlyJCZPnox169ahdevW2LJlC66++mrY7Xbk5uZi1apVaNu2LcaPH4+8vLyA+nHgwAGMGzcOubm5KCgowOzZs/HOO+9g/PjxfrXX3zH4+uuvMXLkSJw5cwbLly/HsmXLUFJSgkceeSSg1wWA77//HgCwYMECbNiwAa+//jouvfRSDB8+3BkmY2JiUFBQAACYMWMGiouLUVxcjPnz53vdbk5ODmbMmIE+ffpgzZo1ePbZZ7F3716kpqa6Xf9WW1uL6667DiNHjsS6devw29/+Fk8//TSWLFkScL/IRBQiE3r99dcVAMqOHTuU2tpapaqqSikoKFCio6OVoUOHKrW1tS7rDxs2TBk2bJjz51WrVikAlPz8fJf1Pv/8cwWAsnTpUueyuLg4pWXLlsrRo0edy0pLSxUASkxMjHLu3Dnn8vfee08BoKxfv95r28+fP6+cPXtWad26tfLss8+69el3v/udy/pPPPGEAkApLy93aVN4eLhy+PBh57Iff/xR6dChg3LHHXc4lxUVFSkAlKKiIlXb40liYqKSlJTk9l5kZGQoMTExSl1dndc2Tps2TWndurWiKIry+OOPKyEhIcqSJUtctpOSkqJ07txZqaqqculL3759la5duyoXLlxoVj8uXLig1NbWKlu2bFEAKHv27HH+bsGCBYovh19fxyAzM1Np2bKlUlFR4dKXxMREBYBy8OBB53IAyoIFC9xeKy4uTpk2bZrXtpw/f16pra1VRo4cqUycONG5/MSJE1636Rg7x+ufPn1aadmypTJu3DiX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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "params = (None,omega_Riemann,D_Riemann,1.,bc_eikonal)\n", "\n", "# First run 20 iterations with a strong relaxation, featuring a laplacian\n", "solution_upwind = newton_root(SchemeUpwind,guess,params,relax=ident-bc_eikonal.gridscale*lap,\n", " stop = stop(niter_max=20,raise_on_abort=False,niter_print=every4))\n", "\n", "print()\n", "# Then refine the solution, with a weaker relaxation\n", "solution_upwind = newton_root(SchemeUpwind,solution_upwind,params,relax=ident,\n", " stop = stop(niter_print=every4)) \n", "\n", "plt.axis('equal'); plt.title(\"Riemannian eikonal equation\")\n", "plt.contourf(*X,solution_upwind);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2 An eikonal equation of Rander type\n", "\n", "We solve a classical instance of Zermelo's navigation problem: $u(x)=T$ is the smallest time for which there exists a path $\\gamma : [0,T] \\to \\Omega$ such that \n", "$$\n", " \\| \\gamma'(t) - \\eta(\\gamma(t))\\|_{M(\\gamma(t))} \\leq 1\n", "$$\n", "for all $0 \\leq t \\leq T$, and with the endpoint conditions $\\gamma(0) = x_0$ (the seed point) and $\\gamma(T)=x$.\n", "Here $M$ is a prescribed Riemannian metric, and $\\eta$ is a drift vector field. \n", "\n", "For well posedness, we require the problem to be locally controllable, which is the case provided \n", "$$\n", "\\| \\eta(x)\\|_{M(x)} < 1\n", "$$\n", "at all points of the domain." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:38.409958Z", "iopub.status.busy": "2024-04-30T08:50:38.409835Z", "iopub.status.idle": "2024-04-30T08:50:38.412254Z", "shell.execute_reply": "2024-04-30T08:50:38.412015Z" } }, "outputs": [], "source": [ "# Choose the Riemannian metric and drift\n", "metric = bc_eikonal.as_field( np.eye(2))\n", "drift_max_speed = 0.8\n", "drift = drift_max_speed*np.sin(2*np.pi*X[0])*np.sin(2*np.pi*X[1]) * X / ad.Optimization.norm(X,ord=2,axis=0)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:38.413654Z", "iopub.status.busy": "2024-04-30T08:50:38.413550Z", "iopub.status.idle": "2024-04-30T08:50:38.415352Z", "shell.execute_reply": "2024-04-30T08:50:38.415129Z" } }, "outputs": [], "source": [ "def RanderDual(m,v):\n", " s = lp.inverse(m-lp.outer_self(v))\n", " w = lp.dot_AV(s,v)\n", " return (s*(1+lp.dot_VV(v,w)),w)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:38.416712Z", "iopub.status.busy": "2024-04-30T08:50:38.416608Z", "iopub.status.idle": "2024-04-30T08:50:39.047663Z", "shell.execute_reply": "2024-04-30T08:50:39.047341Z" } }, "outputs": [], "source": [ "# Set the problem parameters\n", "D_Rander,omega_Rander = RanderDual(lp.inverse(metric),drift)\n", "D_Rander = lp.inverse(D_Rander)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "execution": { "iopub.execute_input": "2024-04-30T08:50:39.049443Z", "iopub.status.busy": "2024-04-30T08:50:39.049344Z", "iopub.status.idle": "2024-04-30T08:50:40.791088Z", "shell.execute_reply": "2024-04-30T08:50:40.790796Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 1 Residue norm: 3.377923009093725\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 5 Residue norm: 782.3323881462628\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 9 Residue norm: 7.844631818162194\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 13 Residue norm: 0.7264236353476003\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 17 Residue norm: 0.2365958052116035\n", "Iteration: 20 Residue norm: 0.09804071441839779\n", "Max iterations exceeded. Aborting.\n", "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 1 Residue norm: 0.011436478442580889\n", "Iteration: 5 Residue norm: 0.0012592903006959366\n", "Iteration: 9 Residue norm: 7.933843450369515e-05\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 13 Residue norm: 4.95868412153655e-06\n", "Iteration: 17 Residue norm: 3.099181191679179e-07\n", "Iteration: 21 Residue norm: 1.936986149253528e-08\n", "Iteration: 22 Residue norm: 9.6849650521591e-09\n", "Target residue reached. Terminating.\n" ] }, { "data": { "image/png": "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D4mJiejYsSP279/vc749evTwOM1Wl+TkZGzduhVHjx5Fv379cOLECfcypqamYvny5R7ViOrqaixatAjt2rXzuJDbH671XzvUvf322wHNxyWQddC/f39s2rTJ46LuS5cu+bxYukOHDvjyyy89pm3evBlnz571Wp7ay/Lll1+isLDQY1rtSlZ90tPTER4ejkWLFnlMP3r0KDZv3oyBAwc2OA8irTDgECmodevWmDp1KoqLi/HRRx8BuBwyDh48iMceewybN2/G+++/j5tvvrlJX672pz/9CQ6HA7fccgtWrlyJvLw8DBw4EC1atPBo16tXLzz88MN48MEH8fTTT+PTTz9FQUEBPvroIzz22GNen/4D8fbbb2PTpk0YPHgwlixZgm3btmHlypXIycnB3Xff7fd8kpKSsH37dpSXl6NPnz44evQogMt385w6dQr9+/fHxx9/jNWrV2PYsGH46quv8OKLLwb8TcMZGRlo3bo1JkyYgBUrVuDTTz/FPffcg/379wc0n5r8XQd//OMfAQADBgxAbm4uPvnkE9x6660+b0/Pzs7GunXr8Nxzz2HTpk1444038Oijj8Jms3m0Gz58ODZs2IDp06dj8+bNeOuttzB48GAkJCR4tGvVqhXat2+PVatWYcOGDdizZ0+d31x85ZVXYtq0aVi9ejXuv/9+rFu3DosWLUL//v0RFhaG6dOnN3pdESlO22uciYzBdffJ7t27vf7v/Pnz4pprrhEdO3YUFy9eFEJcvlOoQ4cOwmq1iqSkJPHuu+/6vFMHgPjtb3/rNU9fd9CsXr1a3HjjjSI0NFRcc8014vnnn6/z7p/33ntPpKamihYtWojw8HBx3XXXifvvv1/s2bPH3aZv376iS5cuAa2H/fv3i1GjRono6GgREhIi7Ha7GDBggJg3b567TUN3UbkcPXpUdOrUSXTo0EH85z//EUIIsX37djFgwAB3v9PS0sQnn3zi8by6toWv192xY4dIT08XERER4qqrrhIPPfSQ+OKLLwQAsWDBAnc7f++i8ncdCCHEv/71L5GWliasVquw2+3i//2//yfeeecdr7uoKioqxNNPPy3i4+NFeHi46Nu3r9i3b5/XPlBRUSGmTJkirr76ahEWFia6d+8uVq5cKcaOHSvat2/v8dobN24UycnJwmq1CgDu+dS+i8rl73//u3vfstlsYsSIEeLr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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "params = (None,omega_Rander,D_Rander,1.,bc_eikonal)\n", "solution_upwind = newton_root(SchemeUpwind,guess,params, # Zero guess\n", " relax=ident-bc_eikonal.gridscale*lap, # Laplacian in relaxation\n", " stop=stop(niter_max=20,raise_on_abort=False,niter_print=every4) )\n", "\n", "print()\n", "solution_upwind = newton_root(SchemeUpwind,solution_upwind,params, # Previous solution as guess\n", " relax=ident, stop=stop(niter_print=every4)) # Basic relaxation\n", "\n", "plt.axis('equal'); plt.title(\"Rander eikonal equation\")\n", "plt.contourf(*X,solution_upwind);" ] } ], "metadata": { "celltoolbar": "Format de la Cellule Texte Brut", "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.8" }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }