{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "\n", "
\n", "

Sensitivity analysis and optimization with dolfin-adjoint

\n", "
\n", "Scaling test\n", "\n", "
\n", "

Simon Funke

\n", "

Slides: https://goo.gl/W8J51i

\n", "
\n", "13th October 2016, UNISA Symposium\n", "
\n", "
\n", "Contributors: Patrick Farrell, Marie Rognes\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Sensitivity analysis\n", "\n", "\n", "**Given:** \n", "\n", "* A PDE with some parameter(s).\n", "\n", "* A (scalar) output derived from the solution." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**Goal:**\n", "\n", "* Compute the sensitivity of the outout with respect to the parameters." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Why adjoints are useful\n", "\n", "The solution of the adjoint PDE allows us to evaluate the sensitivity with **arbitrary** parameters" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "-- at a **fixed cost**!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## In maths\n", "\n", "**Given:** \n", "\n", "* PDE $F(u; m) = 0$ with solution $u$ and parameter $m$.\n", "\n", "* A functional $J(u, m)$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**What the adjoint approach gives us:**\n", "\n", "* Efficiently compute $\\frac{\\text{d}J}{\\text{dm}}$ for any $m$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## What is an adjoint \n", "\n", "Given a PDE and a functional, the adjoint is \n", "\n", "* a linear PDE derived from the original (\"forward) system.\n", "* which depends on the forward solution u and the functional J,\n", "* that in general is quite hard to derive\n", "* and is useful for lots of things in computational science." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Adjoints are used in many applications\n", "\n", "
\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## The problem\n", "\n", "*[T]he automatic generation of optimal (in terms of robustness and efficiency) adjoint versions of large-scale simulation code is one of the great open challenges in the field of High-Performance Scientific Computing.*\n", "\n", "\"The Art of Differentiating Computer Programs\", Naumann (2011)\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "*Considering the importance of design to .. all of engineering, it is\n", "perhaps surprising that the development of adjoint codes has not\n", "been more rapid .. [I]t seems likely that part of the reason is its\n", "complexity.*\n", "\n", "\"An Introduction to the Adjoint Approach to Design\" (Giles and Pierce, 2000)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## The traditional way of computing adjoints\n", "\n", "
\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "### Fundamental idea\n", "\n", "A model is a sequence of elementary instructions. Differentiate each in turn, and\n", "compose with the chain rule." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## The dolfin-adjoint approach\n", "\n", "
\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "### Fundamental idea\n", "A model is a sequence of equation solves. Differentiate each in turn, and\n", "compose with the chain rule. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# dolfin-adjoint automates adjoints and PDE-constrained optimization*\n", "\n", "
\n", "\n", "
\n", "\n", "*for FEniCS models" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## dolfin-adjoint annotates the symbolic equation of the PDE constraint\n", "
\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## dolfin-adjoint automatically derives the symbolic adjoint equations\n", "
\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## dolfin-adjoint solves forward/adjoint problems until the optimal solution is found\n", "
\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Advantages of the dolfin-adjoint approach\n", "\n", "* The adjoint derivation is **totally automatic** (∼3–10 lines)\n", "* The adjoint is **very efficient** (examples later)\n", "* The adjoint can automatically use **checkpointing**\n", "* The adjoint works **naturally in parallel** (both MPI and OpenMP)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Why does it run in parallel?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## The FEniCS pipeline is employed both for the forward and the adjoint problem \n", "
\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Live demo" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Imagine with given have a FEniCS solver\n", "\n", "It does not really matter which one. For example a heat-equation solver:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nDPJVOgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from dolfin import *\n", "from dolfin_adjoint import *\n", "#adj_reset()\n", "\n", "mesh = UnitSquareMesh(40, 40)\n", "V = FunctionSpace(mesh, \"CG\", 2)\n", "\n", "v = TestFunction(V)# Testfunction \n", "u_ = Function(V) # Old u\n", "u = Function(V) # New u\n", "f = Function(V) # Forcing term\n", "f.vector()[:] = 1\n", "nu = Function(V) # Viscosity\n", "nu.vector()[:] = 0.001\n", "\n", "t = 0.0\n", "end = 20\n", "timestep = Constant(1)\n", "\n", "# Variational form\n", "F = (u - u_)/timestep*v*dx + nu*inner(grad(u), grad(v))*dx - f*v*dx\n", "bc = DirichletBC(V, 0.0, \"on_boundary\")\n", "\n", "# Time loop\n", "while (t <= end):\n", " solve(F == 0, u, bc)\n", " u_.assign(u)\n", " t += float(timestep)\n", "plot(u)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## In order to use dolfin-adjoint, we need to make change one line\n", "\n", "On the second line:\n", "```python\n", "from dolfin_adjoint import *\n", "```\n", "With that change, dolfin-adjoint will record all equations that are being solved." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Now we can compute the define the functional. Let's say we are interested in:\n", "\n", "$J = \\frac{1}{2}\\int_\\Omega u(T) \\cdot u(T) \\textrm{d}x +\\frac{1}{2}\\int_\\Omega f^2 \\textrm{d}x$ " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "In code:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [], "source": [ "J = Functional(u*u*dx*dt[FINISH_TIME] + f**2*dx*dt[START_TIME])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Now we can compute sensitivities\n", "\n", "For example with respect to $f$:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ctrl = Control(f)\n", "\n", "dJdf = compute_gradient(J, ctrl, forget=False, project=True)\n", "plot(dJdf)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## or with respect to more parameters\n", "\n", "(at nearly no additional cost)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nSUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ctrl = [Control(f), Control(nu)]\n", "\n", "dJdf, dJdnu = compute_gradient(J, ctrl, forget=False, project=True)\n", "plot(dJdnu)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Or even solve an optimisation problem!" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Calling FFC just-in-time (JIT) compiler, this may take some time.\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "rf = ReducedFunctional(J, Control(nu))\n", "nu_opt = minimize(rf, options={\"maxiter\": 4})\n", "plot(nu_opt)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "## Some important dolfin-adjoint functions\n", "\n", "\n", "### Functionals\n", "*Mathematics*: \n", "\n", "$J = \\frac{1}{2}\\int_\\Omega u(T) \\cdot u(T) \\textrm{d}x$\n", "\n", "*Code*:\n", "```python \n", "J = Functional(0.5*inner(u, u)*dx*dt[FINISH TIME])\n", "```" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "*Mathematics*: \n", "\n", "$J = \\frac{1}{2}\\int_0^T\\int_\\Omega u \\cdot u \\textrm{d}x\\text{d}t$\n", "\n", "*Code*:\n", "```python \n", "J = Functional(0.5*inner(u, u)*dx*dt)\n", "```" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "## Some important dolfin-adjoint functions\n", "\n", "\n", "### Controls\n", "```python\n", "ctrl = Control(f)\n", "ctrl = [Control(f), Control(g)]\n", "```" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "### Compute sensitivity\n", "```python\n", "dJdf = compute_gradient(J, ctrl)\n", "H = compute_hessian(J, ctrl)\n", "```" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "### Solve optimization problem\n", "```python\n", "rf = ReducedFunctional(J, ctrl)\n", "f_opt = minimize(rf)\n", "```" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Some application examples" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Cahn-Hilliard equations\n", "\n", "
\n", "\n", "
\n", "\n", "Quite a difficult problem to adjoint:\n", "* nonlinear, time-dependent, fourth-order equation\n", "* run in parallel (8 processors, MPI)\n", "* checkpointing necessary (5 in memory, 10 on disk)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Willmore functional\n", "\n", "\\begin{align*}\n", "W(u(t)) &= \\frac{1}{4\\epsilon} \\int_{\\Omega} \\left(\\epsilon \\nabla^2 u(t=T) - \\frac{1}{\\epsilon} \\frac{df}{dc}\\right)^2 \\ {dx}\n", "\\end{align*}" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## dolfin-adjoint computes the gradient efficiently\n", "\n", "
\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Topology optimisation of a heat conduction problem" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "Problem: Find the material distribution that minimises the integral of the temperature when the amount of highly conducting material is limited.\n", "\n", "\n", "
\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Formulation as an optimisation problem\n", "\n", "\n", "\\begin{equation*}\n", "min_{a} \\int_{\\Omega} fT + \\alpha \\int_{\\Omega} \\nabla a \\cdot \\nabla a\n", "\\end{equation*}\n", "\n", "subject to\n", "\n", "\\begin{align*}\n", " -\\mathrm{div}(k(a) \\nabla T) &= f \\qquad \\mathrm{in} \\ \\Omega \\\\\n", " T &= 0 \\qquad \\mathrm{on} \\ \\delta \\Omega_D \\\\\n", " (k(a) \\nabla T) &= 0 \\qquad \\mathrm{on} \\ \\delta \\Omega_N \\\\\n", "\\end{align*} \n", "\n", "and to the control constraints\n", "\n", "\\begin{align*}\n", " 0 \\le a(x) &\\le 1 \\qquad \\forall x \\in \\Omega \\\\\n", " \\int_{\\Omega} a &\\le V\n", "\\end{align*} \n", "Implementation consists of 65 lines of code (including IO)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### 2D Solution\n", "
\n", "Scaling test\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### 3D Solution\n", "Scaling test" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## OpenTidalFarm - Optimal tuning of tidal turbine farms\n", "\n", "* Optimisation of number of turbines, their location and their size \n", "* Based on a shallow water solver in FEniCs + dolfin-adjoint\n", "\n", "
\n", "Scaling test\n", "www.opentidalfarm.org\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## CBC-beat - cardiac electriophiosology with an adjoint\n", "\n", "* Implements the mono-domain and bi-domain solvers with various cell models (coupled PDE-ODE system)\n", "* Implemented in FEniCS + Gortran (cell model generator for FEniCS) + dolfin-adjoint\n", "
\n", "Scaling test\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Data assimilation of blood flow models\n", "\n", "**Given MRI flow measurements, can we tune a blood flow model?**\n", "\n", "* Implements Navier-Stokes in FEniCS + dolfin-adjoint\n", "* Requires carefull design of regularisation terms\n", "
\n", "Scaling test
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Multimesh support in FEniCs (Outlook)\n", "
\n", "Scaling test\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Multimesh support in FEniCs (Outlook)\n", "
\n", "Scaling test\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Multimesh support in FEniCs (Outlook)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "image/jpeg": "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\nsfxf8NU83tbLrk5S5kuXou5m1cRTnuntD+x7cdXgvP1VPlc26dpfQyzfLFtxaSbwupfqyb5k6dq0\nqoonaaws75PVVkpnSh5Yr2KppKW25ZO+uc4rsVO0suzRFT3vOFRXyryydr0ZOSprNtEW3nZroV0i\n0tsPIlsqvcazG3F32B4eXuAntWXksIdUl0JiQkxhKLjkCBUhNZwxsHsAbdAtDAAKeKxw2ov4S2ux\nTxV/4bU9iW6ysOMAAfLag2eGfES+T90YzZ4Z8RL5P3Rpi7wk8OoJbj3E+59FkYn2GJAMTwxgAAJA\n+wDXci1h1uSIyvNfqULbNgm+V7XW4b4q0+obZ2voA1zc29pdixXafK8+pGNPDbb9B9HLlqtwi+P4\nutsuhUoJOV31RTHeOWvQthfKq8r7ElGiDXI25OkqwaYt22nb5bSZRpyfPVLl3u8F8cacvvNrpUZW\nWGm/LJTpLlt5zY9Z9peRxxW4QXnTjGLjWb3DVu5XFKMVhrJ4ssPTin64niGrULvFbNZsn9nvs7re\nM6jnJvT4aLqWp1b7IfH8PKenjzerKvD/ALQeJeEaL4bQnH7tNtKUbqzGun0fy9fw5fSPDvDOE8M0\nfuuE0lBdX1l7st4jiuH4WHPxGtDSiuspUfMuJ+1Hi/EKpcZPTT6aa5f5rJy9XW1dafNq6k9R95yb\nZ2wjxbT9tL6Dx/218P4e48Kp8TPulyx/VnlfE/tR4l4jzQeqtHSf5NLH6vc4v1APRTBSpiDNARu+\nt+B8WuN8H4bXTtuCT91hnnPt74XzQ0vEdOOY+TU9ujJf+n/GqXDa/BSlmEvvIL0e/wDP+p6jxDhY\ncdwOtw2p+HVg4+3qV8vc4sr46HXHUs4jRnw3EamjqYlpycWiEVbRH09/ts4XT6Ju/Y6fDxVuTTTS\nq2ZeGg2o8rOlpwbtKnjEWqMpncsLyu0oThFOXmknVLBcoQhGcNN8svxY/qRhHzLEvMqpPCBv/hS5\nouNJpNZbNqQ8OSxzrnSuTlBbdzNOWI15OZ3Xcu1HJXlJNKmtzPNtRjVTezf8j2Uh5ZU6jXI+bmjn\n9clM6575um1lk3XOovPqVTfm26b2bw4Utx3prlxsVOlLd56E5N1csUyqTxmStHSoPDeCNqlazfQe\nM4u2Ra81p0ux0pu7fYj0VP8AUeKvbPUWN2q6AEZJ9byWXZCKqse5bpq9SK9Ti06iZdVjdogVJ4yH\n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\nU35cPO5xNV21SqUJxkko9Gv7k4zudKXlSqu/sY+aPLNKPN6PJZzu3m3drm2X1M5o6iV6cZxp82op\nSeewOKfOuVwaVXTIw1FHL1I8rwiVycHD7xc29rsY2xtIvpXOCk6U3co4xlFT0VJUlmUcOqRsUraa\ncXFrEu5HllyrmSlKOKi6synG2jNpk0+FuVtKmru9y7T0ZRjFJRjnKZaoq1CClGsrs/QOZOUdSTae\nyTJGJbZtiMG1LlbjLZX0+hGa54xhJc6XW+opSkqcopyTf0RTqyUYySuCWbPTSmnmtbYnqvlt3GKx\nTVlMnyxUee67hqTuTqTbawq2KJyTm5U01i3g9NYZlzVTvlW1MolP8XM/akSm1KFfiW5XN5bvFVR3\nCIvCrLXcrdUndpdSVx5nnKK2+ZZjt0OlQt8vmu2Kqk3bfoSfW3jYi1foVQ8p7Bbtbe4NNUm07/mJ\n/KQP83SiSVL1IQab9idoBmrwrPifDf6iMlo1+E0/FeF/1EcX6y6rzD1visa8M4n5GeJk87nu/FlX\nhXFf6bPBtZzbfqeTwo1WW/kTu0FuJLBIS2Pa8wyFjEArv6FfFNf4bU+UsSyyvivhtT5SW6ysOKAA\nfLag2eGfES+T90YzZ4Z8RL5P3Rpi7wk8OoLqMT3R9FkNge6GRW/oA77A1gYn0ANhgIBiewxdQGLp\nQxSdZAi/V4QNb/16je219yPfp6lDvC3+o9qzXoiMnl4vuhqXeyiXM3O1dE1OnbbyVJ5W9knVpu10\nAvi1XLzO/clCWI08FKk426wSTtRtERoi3nNvohqXLyt3foURkk1jLW6JRk0kqb9WQaVJc0U221lE\n+dOPnx5tjOp1JKmxrUSWXzeYmkaueStu8PFbk4zdSy5Zz6GW1zYtWt0SjK3fKle9k0Ni1EmoKGPb\nYlCee9Yk3HcxwklFQyk1unsWx1Ka8y5arPc4mq7aY6sJQjJRbUXVV9CanHmuMXbWXtRk+8bVOotv\n3GpJtvl3eb6nM0XbRzeXl80+Z99hfeKTkubnXatjMtSHLBp0tkgersnJJt9EPQ2tWrzNyinG8P0K\nuaSi05czzlohObttx22yVtteVJpd7NIqic5v/wC1b+pQ5Zau3s0KUlyuL5qXXuRk7fSjrSFJxbpK\nuXJU5Rq06V/qNyq3J7blblzRVfhOlKTb7V1E/Xp2FzefamyNpUlbKoSzaymDzSvPoDyqfuFW7ewA\n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\nMGIAEnaK+Kf+V1PlEBLdZWHGAAPltX//2Q==\n", "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import YouTubeVideo\n", "YouTubeVideo(\"wbdN0_9P6Hw\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Computing sensitivities\n", "\n", "Here, with respect to the initial condition:\n", "
\n", "Scaling test\n", "
\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Conclusion\n", "\n", "\n", "*dolfin-adjoint* automates adjoints for FEniCS models. \n", "\n", "You can use it for:\n", "* Sensitivity analysis\n", "* PDE-constrained optimisation\n", "* Stability analysis\n", "* ...\n", "\n", "www.dolfin-adjoint.org\n" ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.11+" }, "livereveal": { "scroll": true, "start_slideshow_at": "selected", "theme": "serif" } }, "nbformat": 4, "nbformat_minor": 1 }