{ "cells": [ { "cell_type": "markdown", "id": "ed4b2efe", "metadata": {}, "source": [ "# Introduction\n", "\n", ".. index:: Equations; Laplace\n", "\n", "## A Laplace problem\n", "\n", "As an introduction we will solve\n", "\\begin{equation}\n", "-\\triangle u + u = f\n", "\\end{equation}\n", "in $\\Omega=[0,1]^2$, where $f=f(x)$ is a given forcing term.\n", "On the boundary we prescribe Neumann boundary\n", "$\\nabla u\\cdot n = 0$.\n", "\n", "We will solve this problem in variational form\n", "$a(u,v) = l(v)$ with\n", "\\begin{equation}\n", "a(u,v) := \\int_\\Omega \\nabla u\\cdot\\nabla v + uv~,\\qquad\n", "l(v) := \\int_\\Omega fv~.\n", "\\end{equation}\n", "We choose $f=(8\\pi^2+1)\\cos(2\\pi x_1)\\cos(2\\pi x_2)$\n", "so that the exact solution is\n", "\\begin{align*}\n", "u(x) = \\cos(2\\pi x_1)\\cos(2\\pi x_2)\n", "\\end{align*}\n", "\n", "We first need to setup a tessellation of $\\Omega$. We use a Cartesian\n", "grid with a 20 cells in each coordinate direction" ] }, { "cell_type": "code", "execution_count": 1, "id": "ce242ad8", "metadata": { "execution": { "iopub.execute_input": "2024-02-29T12:25:06.655137Z", "iopub.status.busy": "2024-02-29T12:25:06.654919Z", "iopub.status.idle": "2024-02-29T12:26:05.974337Z", "shell.execute_reply": "2024-02-29T12:26:05.973253Z" } }, "outputs": [], "source": [ "import numpy as np\n", "\n", "from dune.grid import structuredGrid\n", "gridView = structuredGrid([0, 0], [1, 1], [20, 20])" ] }, { "cell_type": "markdown", "id": "5251a569", "metadata": {}, "source": [ "\n", ".. note::\n", "In the following we will often use the term ``gridView`` instead of grid.\n", "The details of what a ``gridView`` is together with some other central\n", "concepts is provided in the [next section](concepts_nb.ipynb).\n", "\n", ".. tip:: an overview of available approaches to construct a grid can be\n", " found [here](othergrids_nb.ipynb).\n" ] }, { "cell_type": "markdown", "id": "ad91c8b5", "metadata": {}, "source": [ "Next we define a linear Lagrange Finite-Element space over that grid\n", "and setup a discrete function which we will store the discrete solution\n", "to our PDE" ] }, { "cell_type": "code", "execution_count": 2, "id": "4854d755", "metadata": { "execution": { "iopub.execute_input": "2024-02-29T12:26:05.978580Z", "iopub.status.busy": "2024-02-29T12:26:05.978087Z", "iopub.status.idle": "2024-02-29T12:26:06.844772Z", "shell.execute_reply": "2024-02-29T12:26:06.843711Z" } }, "outputs": [], "source": [ "from dune.fem.space import lagrange\n", "space = lagrange(gridView, order=1)\n", "u_h = space.interpolate(0, name='u_h')" ] }, { "cell_type": "markdown", "id": "96f8ee3d", "metadata": {}, "source": [ "We define the mathematical problem using ufl" ] }, { "cell_type": "code", "execution_count": 3, "id": "402e121a", "metadata": { "execution": { "iopub.execute_input": "2024-02-29T12:26:06.848161Z", "iopub.status.busy": "2024-02-29T12:26:06.847848Z", "iopub.status.idle": "2024-02-29T12:26:06.853604Z", "shell.execute_reply": "2024-02-29T12:26:06.852834Z" } }, "outputs": [], "source": [ "from ufl import (TestFunction, TrialFunction, SpatialCoordinate,\n", " dx, grad, inner, dot, sin, cos, pi )\n", "x = SpatialCoordinate(space)\n", "u = TrialFunction(space)\n", "v = TestFunction(space)\n", "\n", "f = (8*pi**2+1) * cos(2*pi*x[0])*cos(2*pi*x[1])\n", "a = ( inner(grad(u),grad(v)) + u*v ) * dx\n", "l = f*v * dx" ] }, { "cell_type": "markdown", "id": "a7bbe759", "metadata": {}, "source": [ "Now we can assemble the matrix and the right hand side" ] }, { "cell_type": "code", "execution_count": 4, "id": "c8043024", "metadata": { "execution": { "iopub.execute_input": "2024-02-29T12:26:06.856272Z", "iopub.status.busy": "2024-02-29T12:26:06.856061Z", "iopub.status.idle": "2024-02-29T12:26:42.862638Z", "shell.execute_reply": "2024-02-29T12:26:42.861122Z" } }, "outputs": [], "source": [ "from dune.fem import assemble\n", "mat,rhs = assemble(a==l)" ] }, { "cell_type": "markdown", "id": "ee5ff26b", "metadata": {}, "source": [ "We solve the resulting linear system of equations $Ay=b$ using scipy.\n", "To this end it is straightforward to expose the underlying data\n", "structures of ``mat,rhs`` and ``u_h`` using the ``as_numpy`` attribute." ] }, { "cell_type": "code", "execution_count": 5, "id": "a92ee7ba", "metadata": { "execution": { "iopub.execute_input": "2024-02-29T12:26:42.867440Z", "iopub.status.busy": "2024-02-29T12:26:42.866905Z", "iopub.status.idle": "2024-02-29T12:26:42.879907Z", "shell.execute_reply": "2024-02-29T12:26:42.878458Z" } }, "outputs": [], "source": [ "from scipy.sparse.linalg import spsolve as solver\n", "\n", "A = mat.as_numpy\n", "b = rhs.as_numpy\n", "y = u_h.as_numpy\n", "y[:] = solver(A,b)" ] }, { "cell_type": "markdown", "id": "5b19c245", "metadata": {}, "source": [ "Note the ``y[:]`` which guarantees that the result from the solver is\n", "stored in the same buffer used for the discrete function. Consequently,\n", "no copying is required.\n", "\n", ".. tip:: More details on how to use [Scipy](solvers_nb.ipynb#Using-Scipy) will be given later\n", " in the tutorial. Other linear solver backends are also available,\n", " e.g., [PETSc and petsc4py](solvers_nb.ipynb#Using-PETSc-and-Petsc4Py)." ] }, { "cell_type": "markdown", "id": "a2322e8f", "metadata": {}, "source": [ "That's it - to see the result we plot it using matplotlib" ] }, { "cell_type": "code", "execution_count": 6, "id": "fa985f31", "metadata": { "execution": { "iopub.execute_input": "2024-02-29T12:26:42.884054Z", "iopub.status.busy": "2024-02-29T12:26:42.883544Z", "iopub.status.idle": "2024-02-29T12:26:43.290584Z", "shell.execute_reply": "2024-02-29T12:26:43.289167Z" } }, "outputs": [ { "data": { "image/jpeg": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "u_h.plot()" ] }, { "cell_type": "markdown", "id": "08ddbab4", "metadata": {}, "source": [ "Since in this case the exact solution is known,\n", "we can also compute the $L^2$ and $H^1$ errors to see how good our\n", "approximation actually is" ] }, { "cell_type": "code", "execution_count": 7, "id": "223f5b5a", "metadata": { "execution": { "iopub.execute_input": "2024-02-29T12:26:43.294126Z", "iopub.status.busy": "2024-02-29T12:26:43.293869Z", "iopub.status.idle": "2024-02-29T12:27:25.418015Z", "shell.execute_reply": "2024-02-29T12:27:25.416578Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "L^2 and H^1 errors: [0.004816749930263432, 0.40259995183954644]\n" ] } ], "source": [ "from dune.fem import integrate\n", "exact = cos(2*pi*x[0])*cos(2*pi*x[1])\n", "e_h = u_h-exact\n", "squaredErrors = integrate([e_h**2,inner(grad(e_h),grad(e_h))])\n", "print(\"L^2 and H^1 errors:\",[np.sqrt(e) for e in squaredErrors])" ] }, { "cell_type": "markdown", "id": "57fc21f6", "metadata": {}, "source": [ "\n", ".. index::\n", " pair: assemble function ; dune.fem\n", "\n", ".. index::\n", " pair: integrate function ; dune.fem\n", "\n", ".. note::\n", " The ``assemble`` function can be used to assemble bilinear forms as shown\n", " above, linear forms (functionals) as shown further down, and to compute scalar integrals.\n", " So we could compute the $L^2$ error using ``assemble(e_h**2*dx)``. We use the\n", " ``integrate`` function above since it allows to integrate vector valued\n", " expressions which is more efficient than calling ``assemble`` multiple times.\n", " Using the assemble function with 'a==l' and 'a-l==0' produces the same result.\n" ] }, { "cell_type": "markdown", "id": "ee4927d5", "metadata": {}, "source": [ "\n", ".. _label-on-gridview-detection:\n", "\n", ".. tip::\n", " Both ``assemble`` and ``integrate`` take extra arguments ``gridView``\n", " and ``order``. The latter allows to fix the order of the quadrature used\n", " to integrate a function - if it is not provided (``None``) a reasonable\n", " order is determined heuristically. The ``gridView`` argument is required in\n", " cases where the ``gridView`` can not be determined from\n", " the ufl expression.\n", "\n", "In the above example ``gridView`` can be extracted from\n", "the discrete function ``u_h`` which is part of the expression for\n", "``e_h``. Consider instead the following example where the ``gridView``\n", "has to be provided to the integrate method\n" ] }, { "cell_type": "code", "execution_count": 8, "id": "e298ca62", "metadata": { "execution": { "iopub.execute_input": "2024-02-29T12:27:25.424297Z", "iopub.status.busy": "2024-02-29T12:27:25.423784Z", "iopub.status.idle": "2024-02-29T12:28:01.238530Z", "shell.execute_reply": "2024-02-29T12:28:01.237219Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "average: 1.5720931501039814e-17\n", "average: 1.5720931501039814e-17\n" ] } ], "source": [ "print(\"average:\",integrate(exact,gridView=gridView) )\n", "# since the integrand is scalar, the following is equivalent:\n", "print(\"average:\",assemble(exact*dx,gridView=gridView) )" ] }, { "cell_type": "markdown", "id": "64b77b12", "metadata": {}, "source": [ ".. index:: Equations; Boundary value problem\n", "\n", "## Laplace equation with Dirichlet boundary conditions\n", "We consider the scalar boundary value problem\n", "\\begin{align*}\n", "-\\triangle u &= f & \\text{in}\\;\\Omega:=(0,1)^2 \\\\\n", "\\nabla u\\cdot n &= g_N & \\text{on}\\;\\Gamma_N \\\\\n", "u &= g_D & \\text{on}\\;\\Gamma_D\n", "\\end{align*}\n", "and $f=f(x)$ is some forcing term.\n", "For the boundary conditions we set $\\Gamma_D=\\{0\\}\\times[0,1]$ and take\n", "$\\Gamma_N$ to be the remaining boundary of $\\Omega$.\n", "\n", "We will solve this problem in variational form\n", "\\begin{align*}\n", "\\int \\nabla u \\cdot \\nabla \\varphi \\\n", "- \\int_{\\Omega} f(x) \\varphi\\ dx\n", "- \\int_{\\Gamma_N} g_N(x) v\\ ds\n", "= 0.\n", "\\end{align*}\n", "\n", "We choose $f,g_N,g_D$ so that the exact solution is\n", "\\begin{align*}\n", "u(x) = \\left(\\frac{1}{2}(x_1^2 + x_2^2) - \\frac{1}{3}(x_1^3 - x_2^3)\\right) + 1~.\n", "\\end{align*}\n", "\n", ".. tip:: More [general boundary conditions](boundary_nb.ipynb) are discussed in a later section.\n", "\n", "The setup of the model using ufl is very similar to the previous example\n", "but we need to include the non trivial Neumann boundary conditions:" ] }, { "cell_type": "code", "execution_count": 9, "id": "83112d61", "metadata": { "execution": { "iopub.execute_input": "2024-02-29T12:28:01.243930Z", "iopub.status.busy": "2024-02-29T12:28:01.243536Z", "iopub.status.idle": "2024-02-29T12:28:01.254300Z", "shell.execute_reply": "2024-02-29T12:28:01.252893Z" } }, "outputs": [], "source": [ "from ufl import conditional, FacetNormal, ds, div\n", "\n", "exact = 1/2*(x[0]**2+x[1]**2) - 1/3*(x[0]**3 - x[1]**3) + 1\n", "a = dot(grad(u), grad(v)) * dx\n", "f = -div( grad(exact) )\n", "g_N = grad(exact)\n", "n = FacetNormal(space)\n", "l = f*v*dx + dot(g_N,n)*conditional(x[0]>=1e-8,1,0)*v*ds" ] }, { "cell_type": "markdown", "id": "ffc97d56", "metadata": {}, "source": [ "With the model described as a ufl form, we can again assemble the system\n", "matrix and right hand side using ``dune.fem.assemble``. To take the\n", "Dirichlet boundary conditions into account we construct an instance of\n", "``dune.ufl.DirichletBC`` that described the values to use and the part\n", "of the boundary to apply them to. This is then passed into the\n", "``assemble`` function:" ] }, { "cell_type": "code", "execution_count": 10, "id": "7ed322e6", "metadata": { "execution": { "iopub.execute_input": "2024-02-29T12:28:01.260149Z", "iopub.status.busy": "2024-02-29T12:28:01.259644Z", "iopub.status.idle": "2024-02-29T12:28:15.278903Z", "shell.execute_reply": "2024-02-29T12:28:15.277381Z" } }, "outputs": [], "source": [ "from dune.ufl import DirichletBC\n", "dbc = DirichletBC(space,exact,x[0]<=1e-8)\n", "mat,rhs = assemble([a==l,dbc])" ] }, { "cell_type": "markdown", "id": "b03b2c0d", "metadata": {}, "source": [ "Solving the linear system of equations, plotting the solution, and\n", "computing the error is now identical to the previous example:" ] }, { "cell_type": "code", "execution_count": 11, "id": "ef1d4e5b", "metadata": { "execution": { "iopub.execute_input": "2024-02-29T12:28:15.283354Z", "iopub.status.busy": "2024-02-29T12:28:15.282822Z", "iopub.status.idle": "2024-02-29T12:28:58.878723Z", "shell.execute_reply": "2024-02-29T12:28:58.877482Z" } }, "outputs": [ { "data": { "image/jpeg": "/9j/4AAQSkZJRgABAQEAMgAyAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCADrARwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3yV2jhd1ieVlGRGhGW9hkgfmRWTL4ltItOs73ybh47m2N3hVXMcIClnbLdt65AyeeAa1pY1mieNiwVwVJRip/AjkfUVmJ4a0pLOC0EMxggXZGr3MrYTABTJbJQhVyp+U45FAFm/1nS9KKDUdSs7Pf9z7ROse76biM1S/4TDwx/wBDHpH/AIHRf/FVh/EyLztJ0pP+oiP/AERNXnsth+6fj+E15GOzX6rV9ny30vuezgMrhiqLqSnbW23/AAT17/hMPDH/AEMekf8AgdF/8VR/wmPhj/oY9I/8Dov/AIqvII7D90nH8IqOGwz5nH8Zrj/t9fyfj/wDuWQUv+fv4f8ABPY/+Ex8Mf8AQx6R/wCB0X/xVH/CY+Fx/wAzJo//AIHRf/FV41JYfv4uPX+VMubDEDcen86pZ6nb3Px/4A/9X6Wv738P+Ce0f8Jj4Y/6GTR//A6L/wCKpP8AhMvC/wD0Mmj/APgdF/8AFV4y1h7VXjsP9Z8v8ZprPU/s/j/wC/8AVylf+L+H/BPbv+Ey8L/9DJo//gdF/wDFUf8ACZ+Fh/zMuj/+B0X/AMVXhsth++j49ajubDELcVazpO3u/iV/q1S1/e/h/wAE92/4TPwt/wBDLo//AIHRf/FUn/CaeFf+hl0b/wAD4v8A4qvCWsPaqyWGd/y/xGqWcp/Z/E0/1XpX/jfh/wAE9/8A+E08K/8AQzaN/wCB8X/xVJ/wmvhT/oZtG/8AA+L/AOKr57bTx5+Nv8P9aiuNOAib5atZsn9kf+qtOzftvw/4J9E/8Jr4U/6GbRv/AAPi/wDiqP8AhNfCn/Qz6L/4Hxf/ABVfObaaPQ1XXTj8/wDvGrWaRfQp8JxvpW/D/gn0p/wm3hT/AKGfRf8AwPi/+Ko/4Tbwn/0M+i/+B8X/AMVXzM2nsJsY/hqKaxdUPy1azFPoS+E9G1U/D/gn09/wm3hP/oZ9F/8AA+L/AOKo/wCE38J/9DRov/gfF/8AFV8vtZMP4TUKWh2D5TVLHp9CHwpJO3tPw/4J9S/8Jv4T/wCho0X/AMGEX/xVH/Cb+E/+ho0X/wAGEX/xVfK5tv3nTtTXtvu8d6f11djN8MSS+P8AD/gn1V/wm/hP/oaNF/8ABhF/8VR/wm/hL/oaNE/8GEX/AMVXyqbX2qNLb5BxT+ursS+GpJ25/wAP+CfV3/Cb+Ev+ho0T/wAGEX/xVH/Cb+Ev+ho0T/wYRf8AxVfKH2b9507Uj233eO9P64uxD4clb4vw/wCCfWH/AAm/hL/oaNE/8GEX/wAVWxaXlrqFrHdWVzDc28gyksLh0YdOCODXxx9l9q+ofhmNvw50UekLD/x9q2o1/aNo8/McreCjGTd7m7qWt6To3lf2pqllY+bny/tVwkW/GM43EZxkfmKor418KOwVfE2jMxOABfxEk/8AfVeYftALun8N/wC7dfzhryHT48alan/psn8xSnX5Z8th4bK/b4f23Nbfp2Prq91iCzsUvUje6tmIzJbsjAAnAPLDdzwAuSTwBVa88SWljczwyw3BEJMZkVV2tLsEnljnO4qQemPert/pdrqTW7XKyk28nmR+XO8eGxjPykZ4J6+tQP4f0yV3aSB3Lx7G3zO2flCbuW+/tAG/72B1roPIIIvE1rLOkP2a6Ri4jlLBcQsZGjUNhucujAbcjpnANbVZsegabFLDKkDb4jkEzOdx3M2WyfnIZmILZwSSK0qACiiigDk/HkH2i00iPLDN/nKn/phNXKTaT+5k/eS/dP8AF7V2vixWb+xwqbz9uPGcf8sJqy54pvIk/wBF/hP/AC0HpXwfElWUMakv5V+bPWwWJVKlyvuc7FpP7lP3kv3R/F7VHBpWfN/eS/6w/wAVdLDFN9nj/wBF/hH/AC0HpUdtDN++/wBF/wCWrfxivA+sz1O1Y6Pc5yXSsXMP7yX+L+L2pl3pWLZ/3kvb+L3rpJoJ/tdv/ov97+MelNvYJ/sj/wCi+n8Y9auOKleOv9XLWNWupz50n/ppL/31VaHSs+b+8l/1h/irrTbT/wDPr/4+KqQW0587/Rf+WrfxinHFSs9fyNljVc5mXSsXEI3y/wAX8XtUd1peLdvnk7d/eunmt5/tUH+i/wB7+MelRXttP9mf/RvT+MetbRxUrrX+rmixi1OebSv9uT/vqqsWl58z55Pvn+Kuta2n/wCfb/x8VUhtpv3v+jf8tD/GKuOKlZ6myxiucw2l/wClY3yfc9feorrTMQMd8nbv7107W0323H2b/ln/AHx61FeW032Z/wDRvT+MetbRxTutTZYxWZzraX/tyfnVWPTM+Z8z/fPeuta1m/59v/HxVWG2mPm/6P8A8tD/ABitI4p23N1jFdHMNpn+k43P9z196iudMxC3zP8AnXTtbTfa/wDj3/5Z/wB4etRXdtKIG/0f0/iHrW0cU7rU1WMVmc42mf7T/nVePTcwr8z/AJ11jWsv/Pv/AOPCq0FrKYF/cev8Q9auOKdtzdYyNzmG0wefjLfd9feo5tLHyct94d66drWX7V/qP4P7w9aZPay/u/3H8Y/iFarFO61LWMjZnNnSl9X/ADqGPSwYgcv+ddWbWX/nh/48KggtZfIU+R6/xD1qli3bc0+tQucydLHn43P93196STS8bMM/3h3rpTay/af9R/B/eHrSTWkn7v8Acfxj+IVaxTvuH1mnZ6HO/wBlf7TfnX0N8OV2eANJT+6jj/x9q8eNpKP+WH/jwr2XwCCvgnTgRgjzBj/to1erlNZ1JyT7HzfE9WM6VPl7v8jzz48ruuPDn+5dfzhryiyjxfW5x/y1X+dev/G+PzLvw8PSO6/nDXl1vb7LmJicBXBJP1rbEztXt6HZk1FSyrm/xfqfWFFUbrVYLe2t7lFa5t55o4RLAysq72CKxyRkZIHGT7VRvvFVjp+o3NjLFO0tvbtcNs2HKqu44XduxgY3Y254znivWPgTcornoPGWnTvZgRzIt22xHZoyuTIYxghzvyw6puABBOAa6GgAopksscETyzSLHGilndzgKB1JJ6Cq76rp0cMEz39qsU52wuZlCyH0U55/CgDJ8VSrCdHdzgfbjz/2wmrNn1C3+zyfvP4T/CfStLxWcf2Of+n4/wDoiasyd/8AR5P90/yr5LO8KquKUrdF+pxYjE+znyjoNQt/s8f7z+Edj6VHa6hb/vv3n/LVuxp0D/uI/wDdH8qZav8A67/rq1eK8vWuhksd5jpdQt/tdv8AvP73Y+lLeahbm0f956dj602V/wDS7f8A4F/Ki8f/AER/w/nUPL1daGixxa/tC3/56f8AjpqC1vrb998//LVv4TU2+oLV/wDXf9dWrB4BWehrHH+Yst5am7t/n/vdj6Ul7dWptH/een8J9aWV/wDS7f8A4F/KnXj/AOiP+H86zeBSa0N4499xxntD/wAtP/HTVW3ktT53z/8ALVuxrR31Bav/AK7/AK6tWH1VpPc3jmD7lJmtvt/3/wDll/dPrUV6bf7K+H9P4T61qB/+Jh/2y/rS3r/6I/4fzqfZyUkdEcwM1vs/9/8A8dNU4PI/ffP/AMtG/hNdNkHtVe1Cnzv+urVClJJ6HTHH+ZzjCD7b9/8A5Z+h9ajvRB9mf5vTsfWumManUP8Atl/WmX0Cm0f8P51arWktGbxxytuc6ywf3v8Ax01Vtlg+zJ83r2PrXYm1B7VUtLQG0Tj1/nQsSuU3jjddzlSsH2z73/LP0PrTLlYf3fzf8tB2NdSbT/T8Y/5Zf1pl1Z/6nj/lqtarFK6NVi3bc5srBj73/jpqvbrD9nT5vXsfWuwNn7VVtLTNqnHr/OqWKXKarFu+5y5WH7Z97/ln6H1pJ1h/d/N/y0HY10/2P/TsY/5Z/wBaS5s/9Tx/y1FWsSror627bnOlYT/F+hr0jwTj/hErPHTdLj/v69c/9j/2a6TwiNvhuBfSWcf+Rnr6ThqsqlWol2R5ebV3UhFeZw/xgTff6CP+mV1/OGvOkgIdT6EV6b8VE8zUtDGOkN1/OGuEaDCk46CuzH1LYy3ofQZPV5cr5f8AF+p75qGm22pwJDdCUokiygRzPGdynKnKkE4IBx04qrL4b0qdmaaCSQsu1t1xIQTs8vcRu+/t43/e961aK+kPgzOi0Owi8kLHKRDIZVV7iRgXJ3bmBYhjk5BbOOMdBWjRRQBU1Ky/tDT5bXzPLL4KvtyAwIIyO4yBkd6wbrwlcXdpHC+pIpSWeQskDKD5rb2GBJzht3DZUggMrYzXU0UAcr4zhZ30Z/tEqKL0jy12gE+RLznGc/jj2rFmh/cSfv5vun+P2rb8bFxBpBj27vt/8XT/AFE1c7M915En+p+6fX0rlrYb2kuY+UzrEOniVG/RfqTww/uI/wB/N90fx+1Ntof9d+/m/wBYf46ihe68iP8A1P3R6+lMtnuv3v8Aqf8AWH1rF4E8pYx66liSH/SoP3838X8ftS3cP+iv+/m7fx+9V5HuvtUH+p/i9fSi7e6+yv8A6nt6+tZvAmkcY7rU0PJ/6bzf991Daw/679/N/rW/jpu+6/6Y/rUNs91+9/1P+sPrWEsCaRxrtuWZIf8ASrf9/N/F/H7Ut3D/AKK/7+bt/H71Wke6+1Qf6n+L19KddvdfZX/1Pb19axlgdjojjHpqaAh/6bz/APfdQ2sP+u/fzf61v46aHu/+mP61DbPdfvv9T/rW9a5pYF2NoY3zLIh/0/8A183+q/v+9OvIf9Ef9/N2/j96rB7r7d/yx/1Xv60t2919lf8A1Pb19a55YF3R0Rxmq1NAQf8ATef/AL7qG1g/137+b/Wt/HSB7r/pj+tQ2r3X77/U/wCtb1rllgnY6I4zzLPkf6f/AK+f/Vf3/elvIP8ARH/fz9v4/eq2+7+3/wDLH/Ve/rS3j3f2V/8AU9vX1rCWCd0bxxnmaHkf9N5/++6hsoP9ET9/P3/j96Tfd/8ATH9ahsnu/sif6nv6+tc0sE7G8cZ5lj7OP7Q/183+q/v+9F1bD9z++m/1q/x1Bvu/t/8Ayx/1Xv60ty93+5/1P+tX1rF4N3RtHGeZd+yL/wA95/8Avuq9nZqbRP38/f8Aj96fvu/+mH61DZPd/ZE/1Pf19ayeDlbc1WNfcf8AYl+3/wCvm/1X973pLqxX9z+/m/1q/wAVN33f2/8A5Y/6r39aLl7v9z/qP9avrU/VZ3Wposa+5a+wL/z3m/76rU8Krt0CNck4nnGT/wBdnrJ33f8A0w/Wtbwrn/hH492N3nz5x0/1z19LwvRlTq1LvovzFLEe10OV+JCb9V0Uf9MLn/0KGuNuIQltKx4AQnJ+ld548TfrGjj/AKd7n/0KGuWvIMWU59I2/lVZpUtmNv8AD+h9Rl1XlwPL6nqN9qgt7O2u7VYbqCa4hiLrNgBZJFQMuAQ2Cw44+tMuNRvY9aTT4LO3kV4HmEjXDKV24ADDYcZLYByehOOMVcvLCz1CNY720guURg6rNGHAYdCAe/vTo7O1iGI7aFB5aw4VAPkXO1f90ZOB0GTX2R8qc5b+LppZtOSTTkVbvaxdJ2dVR5GSNs7AAGADDeUznC7iMV1NVW02weWCVrK2MluAsLmJcxgdApxx+FWqACiiigDlPHcqQ2ukO5wPt/X/ALYTVys2o2/kyfvP4T2PpXSfER/L07SW/wCoh/7QmriJbr9y/P8ACa9fA4X2tLm8z4HiW/15f4V+bNSHULfyY/3n8I7H0ptvf2/7395/y0PY1nw3P7lOf4RSW9zjzOf+WhrpeAPn7tXNKS+gNzB+8/vdj6U66vYPsz/vPTsfWs17n/SIef738qfc3R+zPz6fzrOWAeo1Npx/rqa326D+/wDoaitr2D978/8Ay0PY1At2fWktrr/W/wDXQ1hLAPsEa7SZZkvYPtMHz/3ux9KW7vYPsz/P6dj61A9ypuYP+BfyqS5mU2z8+n86554J9jWOJ1j/AF1LYvoP+en6Goba+g/e/P8A8tD2NSCQetR2z/63/roa5p4PyNYYtWY77dB9u/1n/LP0PrS3d9B9lf8AeenY+tIH/wBN/wC2f9aW7b/RX/D+dc0sH5HTDFq6LAvoP+en6Gora+gHnfvP+Wp7GpQ1RWzf63/roa5pYNdjaGLVhft0H27Pmf8ALL0PrS3d/B9lf956dj60gb/Tv+2f9aW7b/RX/D+dc8sGux0wxeqLIv7f/np+hqGzvoPsqfvPXsfWpd1RWbf6Kn4/zrmlgl2No4xWF+3Qfbs+Z/yy9D60tzfQfuf3n/LVexpN3+nf9sv60ty/+p/66rWEsEr7G8cWix9vg/56foahs76D7Kn7z17H1qbfUNm/+ip+P86xeCVtjRYtWD7dB9v/ANZ/yy9D60XN/B+5/ef8tV7Gjf8A6f8A9sv60ty/+p/66rUfU1fY0WLRP9vg/wCen6Gtzwmwbw9Ew6Gacj/v89Ye+tzwn/yL0X/Xaf8A9HPXp5TQVOcn5Ho5dW9pKSMnxgm/W9KGOltc/wDoUNc/qEGNMujjpC/8jXU+JE8zXtMH/Trc/wDoUNZGrQ7dGvm54t5D0/2TXzec1LZrb/D+h9dhavLh+X1O+orOvtTa2s7a6ht/MiluIYXEpaJlEkioDtK5yCw4OPrWZqXiwabe3sb2Ej29qrAzB+XlEXm+Wq4/uc7jxwfx/QDxjpKKwINfvJm05f7OhV7md4JozcktCybtx4TDABeuRywHvW/QAUVS1eS6i0q4ezDeeF+Uou5gM8lV5yQMkDByR0Nc3calr/2G1NuLvcks4kZrI+ZNtceShG3CB0PL4AUjnByKAK3xSONF0o7iv/ExHIP/AExmrzWR/wB0/wC+k6H+KvQPi9JOmi6VsSPyv7QGXLndu8mXjGOmM85/CvKXuZvLblOh9a+ryWmpYZu3V/ofI55ScsUn5L82a8Tfuk/eyfdH8VJA3+s/eyffP8VZUdxN5a8p0HrRDcTfPyn3z616vsVpoeM6D1Nhm/fxfvZO/wDF7U6dv3DfvZO38XvWO1xN50fKd/WnzXE3ktzH29ah0VZ6Eewd0bwb/ptL/wB9Ulu3+s/fS/fP8VZS3M3rH+tEFxP8/Mf3z61MqKvsYug7M2Wb/SIf30vf+L2qSc/6O376Xt/F71jG4n8+LmPv6+lSTXE/kNzH29fWsZUFZ6EOg7r+up0Cn/pvL/31Rasf3v76X/WH+Kslbif1j/Wi3uJ/3nMf3z61jPDRb2MPYySeptqf9M5ml/1f973qW5Cm2f8AfS9v4vesRbi4+19Yvue/rUs9xcfZ25i7evrXNPBxs9CeSaktToBGD/y3l/76qO2h/wBb++l/1h/irOW4ufWL9aLW5uR5uDF/rD61yzwRKnNJ6mmIf9N/103+r/ve9LdQ/wCjP++m7fxe9UVubn7Z/wAsv9X7+tSXM9wbZ/8AU9vX1rlng2uhpGvJSWpo+T/03m/76qK0h/0VP303f+L3poluD3h/WmWj3P2ZMeT39fWuaWF8jSOJdtybyf8ATv8AXzf6v+970txD/qv303+sH8VQ7rn7b/yx/wBX7+tLcNc/uv8AU/6wetYSwpvHEu61Lvkf9N5v++6htIf9FT9/N3/i96N11/0x/WobRrr7Mn+p7+vrWTwpaxLtuTeR/p3+vm/1f9/3pbmH/U/v5v8AWD+Kod1z9t/5Y/6v39aLhrr91/qf9YPWs3hTVYl3Wpc8j/pvN/33XUeEBjw1AMk4ln5P/XV65Lddf9Mf1rrPB+f+EZt92M+bNnH/AF1eqp0fZu573D9XnqTV+hHrYB8Qabn/AJ9bn/0OGs/WQv8AYeof9e0n/oJq/rpx4g03/r1uf/Q4azdYb/iSX/8A17Sf+gmvhc5o82a83+H9D6tV+Vcp1l5YWeoRrHe2kFyiMHVZow4DDoQD396YNK04MGFhahhF5APkrkR4xs6fdx26Vbor78kggsbS2EYgtYIhErLH5cYXYGILAY6AkAn1wKnoooAKKKKAPOPjPIIvC+mMTj/iZL/6Jmrxhr1NjfN29K9i+N7bPCWmn/qJp/6Jmrw1p/lPPavueHablgm/N/kjwcypqVdPyNJLxNi/N29KIrxPn+b+I9qz0nwi89qIp/vc/wARr3PYvQ850VroaRvE8yP5vXtT5L1PKPzfpWYZvnT8afJP+7PNRKi7Mh0VdaGut6n979KIb1Pn+b+I9qzxP70sM/3uf4jUyou6MnRVtjUN7H50fz+vapJb6Mwt83p2rL8/97Hz61LJN+6PNYyouzMnRV1obC30f9/9DS299GN/z/xnsaz1n96WCf7/AD/GazlRdzB0VZ6Got/H9pzv/g9PepZr+LyG+f07H1rMWf8A0jr/AAf1qWWf9y3PpWMqLszF0VdaGwt/F/f/AENLb6hEPM+f+M9jVBZ/elt5/wDWc/xms5UXc53RjZ6GmuoRfa/v/wAHofWpZ9QhNuw3+nY+tZqz/wCldf4P61LNP+4b/PesJUXZmTox5loa66jF/wA9P0NJaajELdR5nr2PrVJZ/ei1n/cJz6/zrGWHTZg6S5XoaS6lF9szv/5Z+h9akm1KA+V8/wDy0HY1mrP/AKWP+uf9akmn/wBVz/y0Fc8sIhclmtDXGo2/9/8AQ1HaX9v9mT9569j61VE/PWmWk3+jrz6/zrKWD1IWkdi8L63+2/6z/ln6H1pbi9g/dfvP+Wg7GqYn/wBMzn/ln/WluJ/9Vz/y0FZPBspS1Ro/boP+en6Guy8HMG8MWzDkGSYj/v69cGJz613fgw58K2p9Xm/9GvXFjKHs0mfUcKSvWqei/Mg8QHGv6Z/163P/AKFDWXq740S/P/TvJ0/3TWl4kONe0z/r1uf/AEKGsjVW/wCJPe/9e8n/AKCa+HzChzY7m9D6TEVuWvy+h0us60unafaXqzwQRy3UMTC7QoWV5FUgAlSrAEtyD06Vn33iC9j1OeG0vdFa3ktGltmeQkxttDB5iDgRnPUeo9a6mivqD0zj7HxVf3OpadbyR2flTKBI6ZJmYvKmYRnlB5YYtz8rg12FFFABRRRQB5b8eCB4M03P/QUT/wBEzV4AXXaeO1e9/H9ivgfTiP8AoKJ/6Jmr52Mr4PSv0PheClgG2vtP8kefioc1S5fVl2jjtSoy88d/WqCytgdKVJm56da+h9lHTQ5XSZobl3rx696ezKUPH61nec25eRT2lfafu1EqUbS0/qxLpPQ1Ayen606Ip83H8R71nLK/tTo5X5+71qZUo3Whk6TsaeU8xOPXvUjlPLPH61m+c+9eV71I0z7D92sZUlaWn9WMnSehrKU9P1p0JT5uP4j3rOWWT1WnxSyfN937xqJUldaGDpOxqL5fn9P4fX3qWTZ5R4/WstZZPO6r92pXmk8s/crCVJWehi6TutTYXy/T9aWAR/Px/Ee9Z6zS+qfrToZZfn+594+tZypK+xg6Ts9TTUR/aPu/wevvUsqxeS3y/qfWsxZZfP6p9339alkml8pvufrWMqSs9DF0ndamuqxf3f1NLbLF5K/L69z61nrNN6p+tLbzTeSv3P1rOVJX2MHSdtzTVYvtX3f4PU+tSSrF+7+X+MdzWYs032jrH9z39akklm/d/wCr++PWsnSVnoZuk7rU1gkX939TTbZIvIX5fXufWqYmn9Y/1ptvLP5C/wCr7+vrUukr7GLpStuaISL7V93+D1PrSzJF+7+X+MdzWeJp/tPWP7nv606Waf8Ad/6v749ah0lbYXspXWpqbIv7n6mvT/A+P+EQssdN0v8A6NevIfOn9Y/1r1zwISfBlgTjP7zOP+ujV4+cQUYR06n0XDMHGrUu+iIPE5xrul/9e1z/AOhQ1jao3/Epvf8Arg//AKCa1vFZxrml/wDXtc/+hQ1h6m3/ABKbzgn9w/H/AAE18jWoc1XmN8wrcuO5fQ9JorG1nWH0zT7S7d4LTzLqGJ47vGSryKpAIfAYAls8jiqV34olh10W1vaS3FobKSeN4oJHM7jyyux1BXZh+Tzz6Y+bvPqTpqK5DT/Fd7dXGhwyWpAvJHjuJfskqqSBLgJn7pzFk7j0Ye5HX0AVNSvf7P0+W6EfmMmAqbtoLEgDJ7DJGT2rGvPF8NhY2ctxFEk9xeG1MbThVXbN5TuGIGQCQQMZOR05I6GWKOeJ4pY1kjdSro4yGB6gjuKhi06yggMMNnbxxF1cokShdwxg4A6jauD7D0oA8t/aCmUeDNNhw+46kjZ2HbjypR97GM89M5r52LcHg19GftBf8iLp3/YUj/8ARM1fOJPBr9D4Xm1gGr/af5I5K/xDg3A4NAbrwetIDwKAev1r6RVHpqY2FLfMODSlzt6Gm55FKTxVc11LX+rBYkExHY05J+vB61Fmgd/rVuN2tSeVFoT/ADLwakM/yng/lVLJDCnmT5TWcqbtLX+rEOmjRWf2b8qfFcfe4br6VRWX3qSOTr9aiVN3WphKmX1uP3v3W+76VK1x+7Pyt+VUFk/efhUpkyhrCVN8r1MZU1c0luf9lvyp8Nx975W+8e1UllqSKT73P8RrOVN3RhKmrbF5bn9991/u+nvUr3OYj8j/AJVRWT97/wABqV5P3Z5rCVN2Zi6autDRW5/2H/Klguf3S/I/5VVWWnQSfuxUSpu5g6atsXFuv9I+4/3fT3qSS6+58j/fHaqYk/f/APAf6095Puc/xCsXTdmZOmr7GgLr/Yk/Kkt7rEK/I/5VXElEEv7pal03cydNW2LQuv8ASPuP9z096dLdf6v5JPvjtVUSf6R/wH+tLJJ9z/eFQ6bsxezV1oXvtf8AsP8A9817R4BO7wTpx9RIef8Aro1eHeb717h8P+fA+mn2k/8ARjV4OfxtTh6nt5BFKpP0Kvi441vSv+va5/8AQoawdRb/AIll3/1xf/0E1teNHCa1pJP/AD73P/oUNc5fzA6dcj1if+RrwqeH54cx5Gc1XHNeX/D+h6tRRRXKffBRRRQAUUUUAeTftB/8iJp//YUj/wDRUtfN5Ax0r6Q/aE/5EPT/APsKx/8AoqWvm0k47V9tw9JLBu66v8kc1X4h4AxQAOfrTQTjtQCeenWveVSOmhlYdgZFKQMUzJyOlKScdq0VSNpaf1YLD8ChQOfrTcn2oUnnp1rdVI3WhNh+BkcUrAbaZk5HSlJOO1aqcbS0/qwWHgCnIQM8d6Zk+1A3c9OtbPlbWhNiwpXf+FSkrsPFUwWD9ulP3ttPSs5QjyvQhwNBdvpUkW3njvVJXf2qSN35+71qJwjdaGEoMvLt83p/D61KwTYeP1qirv5n8PSpWd9h+7WEoR5XoYuDuaChPT9adCE8scfrVRZJP9mnQvJ5Y+7UShG+xg4OxdUJ53T+H1qRgnycfxDvVIPJ5v8AD92pGeT5fufeFYuCs9DNwd9y+FT0/WiFU8ocfrVYPJ6r+tELyeWPu0nBX2MXB23LYWPzun8Pr70siR/J8v8AEO9VRJJ538H3fenO8nyfc+8PWs3BWeguR33LuyP0/WvfPh5/yIel46bX/wDRjV89B5fVK+hPh1k+AdKz12P/AOhtXz3EcUqULLqz1cni1OXoZXxBk8vVtHPrBc/+hQ1yN1cZs5wAT+7bj8K6T4nSeXqeiHPWG6/9ChriZLjdE4z1UiubAU74O/qeHnFLmzTm/wAP6Hsms3t1Bp9pcwJewym6hDwxQCZihkUOGCh8DZuOQR0HPaq13fXrazF9mkvxZSWzNIBat+7O3KkAxZz043McnGzqR0VFfNn3ZyVpfa20ekGRr0yvcOtwjW+FaLzGCsT5Qx8uOpjOBnaSdp62iigAoqK5uYbO2kuJ32RRjLHBP5Ack+w61TbXLBLWK5MkvkyuUDi3kIVg20h/l+TDcHdjofSgDzb9oXjwHp//AGFY/wD0VLXzaW4719JftDf8iFp//YVj/wDRU1fNhPFfX5HJrCv1f5I56vxChuO9AbrwetIDxQO9e0pvTUzHbuRwaC3HQ0meRQTxVqTs9QH7vY0BuvBpM0A9frW6m7rUkdu5HBpS3HQ03PIpT0rZSdnr/VhD93saFbrwetJmhT1+tdUZO61EO3fN0PShm+XoaT+L8KcelbJtxeohyyY7GpY5evB61DSocZ+tXKLutSGkyysvz9D09KlMvyHhvyqqr/N+FSlvkNYyg+V6mUo6lxZf9lvyp8U2EHyt+VV1anxN8gqJQfNuYOKsWRN+9+633fSntN935W+8O1V1b95+FSFvu/7wrGUHZ6mbirloTf7LflRFNiMfK35VGGoib92KlwfNuZOKsTCb979xvu+lOeb7vyv94dqhDfvf+A052+7/ALwrNwdnqTyq5P53+y/5V9GfDg5+H+kn1jf/ANDavm/fX0h8N/8Akn2kf9c2/wDQ2r5rieLVKn6v8j0crVpyOY+Lcnl6hoR9Yrr+cNefC43ED14rt/jRJ5d74fPrHdfzhrzOK4JmQDklhjNPKqd8uv8A4v1ODMKXNjub0PqaisbWbu9tdPtJ0E8c/wBqhWSK0iNwGQyKHB+Qnbs3HOF6dapXmp3H9qTmGTV1tEszK6pp5OWIBURZjyX65DE4JxjOdvxh9SdNRXLWF9qcl/pMUs2oEujyXIksisW3LhVZvLGJPu55UYXOBuAPU0AV76zjv7OS2lZlVwPmQ/MpByCM9wQD+FZn/COJ5UEX9p33lw3LXWw+ViR2bcdw2cjcSwHYnjouNuigDyH9oeFT4J06bL7hqSLjeduPKlP3c4zx1xmvm4gYr6U/aH/5EHT/APsKx/8AoqWvmrnHWvqMnaWGenV/oY1NxQBilAHNNGcdaUZ9a9ZNaaGYuBkUpAxTecjmlOcdatNWegh2BQAOfrSc+tAzzzXQmrrQQ7AyKUgYpvORzSnOOtbJqz0EPwKFA5+tJz60DPPNdMWrrT8hDsDd+FOIGKZzu69qcc4610Ra5X7v5Ej8CkCjnjvRz60AHnnvXUrNr3fyEKAN/TtUvBU1Dg7uvalO4L979KUorlfu/kJq5bUL6U+ILsHFQKT/AHv0p8e7aPm/SolFc3w/kYtFgBfM6dqkKr8vHeq43b/vdvSnnd8vzd/SsZRVn7v5GTXmWgq+n60sSrsHFRDd/e/SiPdsHz/pScVzfD+Rk1puThV83p/DTnVPl4/iHeoRu8z7/b0pW3fL8/cdqzcVZ+7+RNtdyfYnpX0v8Nv+SeaP/wBcm/8AQ2r5k+f+/wDpX018Nf8AknejZ/55N/6G1fMcUpKlT0tq/wAjvy5e9I4b46yeXc+HTnql1/OGvKrS43XsAz1kUfrXpf7QUnlzeGz6rdf+0a8g06fOp2g9Zk/mK7slp3ym/lL9RYmlzV+b0Ps2iiivz09YKKKKACiiigDyT9of/kQdP/7Csf8A6Kmr5qJ46V9K/tD/APIg6f8A9hWP/wBFTV81HpX0uU3+rv1f6GNTcAeOhoB9jQOlA716qvoQGeRwaUnjoaO4oPSrTdnqIXPsaUHrwaKB3rdXutRBnkcGnE8dDSdxSnpW8b2eohc+xpVPXg9aBQvf610xvdaki5+boelKTx0NJ/F+FKeldEb8r1EOz7GhT14PWgUq9/rXXG91qSGfm6HpQzfKeDS/xfhQ33a0afK9RD1f2NSRv8o4NRCpIz8oolF8y1IkiVX/AHnQ9PSnl+nyt19KjB+f8KkJ+79axlF2epk0Sh/ZvypY5PlHyt+VIDSxn5BScXzbmbtYcH/efdbp6U5pPu/K3X0poOX/AApzH7v1rNxdnqRYf5n+y35V9O/DTn4daN/1yb/0Nq+Yc19PfDT/AJJ1o3/XJv8A0Nq+W4rTVGn6v8juwHxSPN/2ijiTwz9Lv/2jXjOmMf7Vs8cnz0xk/wC0K9k/aMOJPDP0u/8A2jXjGlN/xN7L/rvH/wChCuvJa3LlPL/i/U6Ki/eH2HrK6hJp9o8FrO12l1C7paXIUBBIpfJYoGXYGGCO/TvUbreya20pstQFpNYESAXKgCTIIUASfK+MjcuBn+LvW7RX56dZzGnRasieGzcWmoCWK38q+L3SsAQmMuPMIclhnI3GunoooAKKpavHdS6VcR2ZYTlflCNtYjPIVuMEjIByME9RXOzWmvSadFHHHfI6G5WPN2u5WZgYHdg/zoikqwJYkjo3BoA5P9of/kQdP/7Csf8A6Klr5pIGK+wPiF4Kk8dadY6Y96La0iuhPKyx7nyI3UYJOMZYDGPxrhP+GctN/wChhu/+/C/417GAxtGjScJ73M5Rbeh89ADFAAr6F/4Zy03/AKGG7/78L/jR/wAM5ab/ANDDd/8Afhf8a7lmmG03+4nkkfPeBkUEDFfQn/DOWm/9DDd/9+F/xpk/7OtktvK0GvXUkoQlEaFQGbHAJzxzVf2rhdd/uDkkeAYFAAr6D/4Z003/AKGG7/8AAdf8aP8AhnTTR/zMN3/4Dr/jWqzjCX6/cL2cj59wMilIGK+gf+GdNN/6GG7/APAdf8aX/hnXTv8AoYbv/wAB1/xrRZ1g7Pf7hezkfP4AoAHP1r6A/wCGdtO/6GC6/wDAdf8AGmRfs8WZeYPrtyqh8RkQqdy7RyeeOcj8K3We4FPr9wvZSPAwBmlIGK9//wCGd9Oz/wAjBdf+A6/40f8ADO+n4/5GC6/8B1/xrVcQYBJrX7heykeBYFCgc/Wvfv8AhnjT/wDoYLr/AMB1/wAaB+zzp4/5mC6/8B1/xrdcSZcmt/uF7GZ4HtG78KGUbele8n9nu0FygGu3BiKMWfyVyGyMDGe+W/L3qQ/s9aeR/wAjBdf+A6/41p/rNlvK1r9wvYzPBAo9KdEo2jivef8Ahnqw/wChguv/AAHX/GlX9nywUYHiC5/8B1/xpvibLb31+4ToTPCQo39O1SbF44717p/wz9Y5z/wkFz/4Dr/jTZvgFbKimLXJ3beuQYFHy7huPXsMn3xUPiTLrPf7iHhqh4kEX0pURdo4r3H/AIUHZ/8AQfuP/Adf8aUfAOzAx/b9x/4Dr/8AFVL4ky699fuIeFqnh+xfM6dqcyKdvHevbv8AhQtnnP8Ab9x/4Dr/APFUv/ChrTj/AIn8/Bz/AMe6/wDxVS+Isvs9/uJ+qVTxLYvpX1B8M+Phzov/AFyb/wBDauN/4UPaf9B+f/wGX/4qvRfCmjyeH/DdrpUkgkNsZEVwMbl3sVJHrtIzXh57mmGxtOEaF7p9rHRhaE6bbkeQ/tHnD+GPpd/+0a8W0lv+JzY/9fEf/oQr6q+IPw4tviAdONxqE1n9h83b5cYbdv2Zzn02D86463/Z5sLa5inj8QXJeJw67rdSMg5GeawweZ06OF9jLfX8TolBuVz2eisbWYtQOn2hgjnubuO6hdzaSCEFBIpfIZwCpTcNpJ61maja69c3VzLardwtIhMeblQqxmDHlbQ2BJ5vO8DGP4u1eAanWUVyVvY64t3bswvFiEqmIPdhvJTzmLiX5z5haIqq/ewR2611tABRRRQByMPhq/iivYdtkUnEW7943+kMkpcmQbP+WisVbrjA+8Dx0Gj2Umn6ZHbS7Ays7BIzlIwzlgi8DhQQo4HA6DpV6igAooooAKwLnRrtvE8OpxLbOiyKxd3KyBNjI0Ywp+XLb+vLDGO436KAMbw/pk+nLePcW1nbPcTeYI7NyYwMYHGxecAZPOT6DAGzRRQAUUUUAZut6fJqNlHEkcEwSZZGguDiOUD+Fjg/XoeQKyI/D2qGfw7LLeWxGlgK8bKz7sRvGXVsj5mDLwR8vOCec9TRQAUUUUAFRXUTT2k0KSGJ5EZVkXqpIxkfSpaKAON/4RW9fSnsZLeyW3Nyk/2SK4dI3Ai2FCQmVG4CTIBySR7nq7GGW3sLaGeQSzRxKjyBdoZgACQO2T2qeigAooooAK5d9Avxql9cRC023MVxGZmkYO/mBSm4Ac7Cm0fN0YkEEYPUUUAYvhjSJ9F0x7afygTKXUREEAEAfwoi5yD0VR9TknaoooAKKKKAMnX9PuNQtbZbWC1lmhu4Zw1w5TYEkViVIVjkgEduvWq0WjXh8Qpqcq2ykuJHdHLSAeTsMA+UZj3fPnI5/h71v0UAFFFFABRRRQAUUUUAf//Z", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "L^2 and H^1 errors: [0.000492922796816225, 0.031176023550870714]\n" ] } ], "source": [ "u_h.as_numpy[:] = solver(mat.as_numpy, rhs.as_numpy)\n", "u_h.plot()\n", "e_h = u_h-exact\n", "squaredErrors = integrate([e_h**2,inner(grad(e_h),grad(e_h))])\n", "print(\"L^2 and H^1 errors:\",[np.sqrt(e) for e in squaredErrors])" ] }, { "cell_type": "markdown", "id": "b1043ec1", "metadata": {}, "source": [ "It is straightforward to solve a problem with a different right hand side\n", "and different boundary values. Assuming the type of the boundary\n", "conditions remains the same, the system matrix does not change we\n", "only need to reassemble the right hand side:" ] }, { "cell_type": "code", "execution_count": 12, "id": "f50d2433", "metadata": { "execution": { "iopub.execute_input": "2024-02-29T12:28:58.884744Z", "iopub.status.busy": "2024-02-29T12:28:58.884234Z", "iopub.status.idle": "2024-02-29T12:29:49.571395Z", "shell.execute_reply": "2024-02-29T12:29:49.570284Z" } }, "outputs": [ { "data": { "image/jpeg": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "l = conditional(dot(x,x)<0.1,1,0)*v*dx\n", "dbc = DirichletBC(space,x[1]*(1-x[1]),x[0]<=1e-8)\n", "rhs = assemble([l,dbc])\n", "u_h.as_numpy[:] = solver(mat.as_numpy, rhs.as_numpy)\n", "u_h.plot()" ] }, { "cell_type": "markdown", "id": "ad2e5dc7", "metadata": {}, "source": [ "## A non-linear elliptic problem\n", ".. index:: Equations; Non-linear elliptic\n", "\n", "It is very easy to solve a non-linear elliptic problem with very few\n", "changes to the above code.\n", "We will demonstrate this using the PDE\n", "\\begin{equation}\n", "-\\triangle u + m(u) = f\n", "\\end{equation}\n", "in $\\Omega=[0,1]^2$, where again $f=f(x)$ is a given forcing term\n", "and $m=m(u)$ is some non-linearity.\n", "On the boundary we still prescribe Neumann boundary\n", "$\\nabla u\\cdot n = 0$.\n", "\n", "We will solve this problem in variational form\n", "\\begin{equation}\n", "\\int_\\Omega \\nabla u\\cdot\\nabla v + m(u)v = \\int_\\Omega fv~.\n", "\\end{equation}\n", "We use $f(x)=|x|^2$ as forcing and choose $m(u) = (1+u)^2u$.\n", "Most of the code is identical to the linear case, we can use the same\n", "grid, discrete lagrange space, and the discrete function ``u_h``.\n", "The model description using ufl is also very similar" ] }, { "cell_type": "code", "execution_count": 13, "id": "7d8e666e", "metadata": { "execution": { "iopub.execute_input": "2024-02-29T12:29:49.577339Z", "iopub.status.busy": "2024-02-29T12:29:49.576933Z", "iopub.status.idle": "2024-02-29T12:29:49.583602Z", "shell.execute_reply": "2024-02-29T12:29:49.582530Z" } }, "outputs": [], "source": [ "a = ( inner(grad(u),grad(v)) + (1+u)**2*u*v ) * dx\n", "l = dot(x,x)*v * dx" ] }, { "cell_type": "markdown", "id": "a2bda6dc", "metadata": {}, "source": [ "To solve the non-linear problem we need to use something like a Newton\n", "solver. We could use\n", "[the implementation available in Scipy](solvers_nb.ipynb)\n", "but ``dune-fem`` provides so called\n", "[schemes](concepts_nb.ipynb#Operators-and-Schemes)\n", "that have a ``solve`` method which can handle both linear and non-linear models.\n", "The default solver is based on a Newton-Krylov solver using a\n", "``gmres`` method to solve the intermediate linear problems.\n", "These ``schemes`` are quite central to solving PDE is different ways,\n", "including writing your own linear or non-linear solvers, accessing\n", "degrees of freedom on the boundary etc. A detailed description on the\n", "API is given [here](scheme_api.rst) and how to use the schemes in\n", "different context to solve the problems on the Python side is available\n", "[here](solvers_nb.ipynb).\n", "\n", "Since the problem here is symmetric we can use a ``cg``\n", "method. A full list of available solvers, preconditioners, and how\n", "to customize them is available in the [Alternative Linear Solvers](solvers_nb.ipynb#Available-solvers-and-parameters) section." ] }, { "cell_type": "code", "execution_count": 14, "id": "77f82e14", "metadata": { "execution": { "iopub.execute_input": "2024-02-29T12:29:49.588934Z", "iopub.status.busy": "2024-02-29T12:29:49.588529Z", "iopub.status.idle": "2024-02-29T12:30:03.190796Z", "shell.execute_reply": "2024-02-29T12:30:03.189646Z" } }, "outputs": [], "source": [ "from dune.fem.scheme import galerkin as solutionScheme\n", "scheme = solutionScheme(a == l, solver='cg')\n", "u_h.clear() # set u_h to zero as initial guess for the Newton solver\n", "info = scheme.solve(target=u_h)" ] }, { "cell_type": "markdown", "id": "87de9415", "metadata": {}, "source": [ "That's it - we can plot the solution again - we don't know the exact\n", "solution so we can't compute any errors in this case.\n", "In addition the ``info`` structure returned by the ``solve`` method\n", "gives some information on the solver like number of iterations required" ] }, { "cell_type": "code", "execution_count": 15, "id": "d6ef54b3", "metadata": { "execution": { "iopub.execute_input": "2024-02-29T12:30:03.194362Z", "iopub.status.busy": "2024-02-29T12:30:03.194143Z", "iopub.status.idle": "2024-02-29T12:30:03.479918Z", "shell.execute_reply": "2024-02-29T12:30:03.478819Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'converged': True, 'iterations': 5, 'linear_iterations': 250, 'timing': [0.007532947, 0.0038442399999999996, 0.0036887070000000003]}\n" ] }, { "data": { "image/jpeg": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "print(info)\n", "u_h.plot()" ] }, { "cell_type": "markdown", "id": "8d807570", "metadata": {}, "source": [ ".. index::\n", " pair: Models; Constants\n", "\n", "## Using `Constant` parameters and grid functions in PDEs\n", "\n", "Every time we call `assemble` or construct a new `scheme` as show above,\n", "some code must be compiled which leads to some extra cost. In time\n", "critical points of the simulation, e.g., in loops, this extra cost is not\n", "acceptable. To avoid recompilation general\n", "[grid functions](concepts_nb.ipynb#Grid-Functions)\n", "and placeholders for scalar or vector valued\n", "[constants](concepts_nb.ipynb#Operators-and-Schemes)\n", "can be used within the ufl forms.\n", "In the [next section](concepts_nb.ipynb) we will give a full example for this in the\n", "context of a time dependent problems.\n", "\n", "As a simple introduction we consider a linear version of the elliptic problem\n", "considered previously\n", "$$ -\\varepsilon \\triangle u(x) + m(x) u(x) = f(x) $$\n", "with Neuman boundary conditions.\n", "We also added a real valued constant $\\varepsilon$ and we want to able to\n", "change $m$ easily. Assuming $\\bar{u}$ is the exact solution of the\n", "non-linear elliptic problem from above then $\\bar{u}$ will also solve the\n", "above equation if $\\varepsilon=1$ and we chose\n", "$m(x) = (1+\\bar{u})^2$. We will use the discrete solution $u_h$\n", "from above, which is an approximation to $\\bar{u}$ and chose\n", "$m(x) = (1+u_h)^2$. Later we want to solve\n", "the same linear problem but with $\\varepsilon=0$ and $m(x)=1$\n", "so that we are simply looking at the $L^2$ projection of $f$:\n", "$$ \\int_\\Omega uv = \\int_\\Omega fv~. $$\n", "\n", "Although the problem is linear and we could just use\n", "``dune.fem.assemble`` and Scipy to solve it, we will again use a ``scheme`` instead.\n", "Details on schemes and operators will be provided in the following\n", "section. For this example the important characteristic of a `scheme` is\n", "that we can still access some information contained in the underlying UFL\n", "form, e.g., the `Constants` used. This allows us to change these\n", "efficiently during the simulation as shown below." ] }, { "cell_type": "code", "execution_count": 16, "id": "ff19a714", "metadata": { "execution": { "iopub.execute_input": "2024-02-29T12:30:03.492648Z", "iopub.status.busy": "2024-02-29T12:30:03.492399Z", "iopub.status.idle": "2024-02-29T12:30:18.023581Z", "shell.execute_reply": "2024-02-29T12:30:18.022389Z" } }, "outputs": [ { "data": { "image/jpeg": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from dune.ufl import Constant\n", "\n", "epsilon = Constant(1,name=\"eps\") # start with epsilon=1\n", "x,u,v = SpatialCoordinate(space), TrialFunction(space), TestFunction(space)\n", "f = dot(x,x)\n", "a = epsilon*dot(grad(u), grad(v)) * dx + (1+u_h)**2*u*v * dx\n", "b = f*v*dx\n", "\n", "scheme = solutionScheme(a == b, solver='cg')\n", "w_h = space.interpolate(0,name=\"w_h\")\n", "scheme.solve(target = w_h)\n", "w_h.plot()\n", "\n", "from dune.fem.operator import galerkin\n", "op = galerkin(a == b)" ] }, { "cell_type": "markdown", "id": "51145d69", "metadata": {}, "source": [ "\n", "Note that since $\\varepsilon=1$ and we use the previously computed approximation $u_h$\n", "the new discrete function $w_h$ is close to $u_h$.\n", "\n", "We can print the value of a `Constant` with name `foo` either via\n", "`scheme.model.foo` or using the `value` on the `Constant` itself.\n", "We can change the value using the same attribute. See the discussion at\n", "the end of section on operators and schemes in the [concepts chapter](concepts_nb.ipynb#Operators-and-Schemes) for\n", "more detail on these two approaches." ] }, { "cell_type": "code", "execution_count": 17, "id": "e7840a11", "metadata": { "execution": { "iopub.execute_input": "2024-02-29T12:30:18.038645Z", "iopub.status.busy": "2024-02-29T12:30:18.038337Z", "iopub.status.idle": "2024-02-29T12:30:18.044643Z", "shell.execute_reply": "2024-02-29T12:30:18.043600Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.0 1.0\n", "0.0 0.0\n" ] } ], "source": [ "print(scheme.model.eps, epsilon.value)\n", "epsilon.value = 0 # change to the problem which matches our exact solution\n", "print(scheme.model.eps, epsilon.value)" ] }, { "cell_type": "markdown", "id": "c8beb0d5", "metadata": {}, "source": [ "To switch to a standard $L^2$ projection we will also change\n", "$m=(1+u_h)^2$ to $m\\equiv 1$. This can be easily done by changing $u_h$\n", "to be zero everywhere. This can be either done using `u_h.interpolate(0)` or\n", "by using `u_h.clear()`." ] }, { "cell_type": "code", "execution_count": 18, "id": "4e6d6498", "metadata": { "execution": { "iopub.execute_input": "2024-02-29T12:30:18.049912Z", "iopub.status.busy": "2024-02-29T12:30:18.049692Z", "iopub.status.idle": "2024-02-29T12:30:51.721352Z", "shell.execute_reply": "2024-02-29T12:30:51.720024Z" } }, "outputs": [ { "data": { "image/jpeg": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "u_h.interpolate(0)\n", "scheme.solve(target = w_h)\n", "w_h.plot()" ] }, { "cell_type": "markdown", "id": "4618a31c", "metadata": {}, "source": [ ".. tip:: A wide range of problems a covered in the\n", " [further examples](furtherexamples.rst) section.\n", " In the [next section](concepts_nb.ipynb) we explain the main concepts\n", " we use to solve PDE using finite-element approximations which we end with\n", " a solution to a non-linear time-dependent problem using the\n", " Crank-Nicolson method in time." ] } ], "metadata": { "jupytext": { "cell_metadata_filter": "-all" }, "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.12" } }, "nbformat": 4, "nbformat_minor": 5 }