{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Computação Científica em Julia\n",
    "\n",
    "Simples, resolver as equações de Navier-Stokes:\n",
    "\n",
    " * Vamos ficar em escoamento incompressível\n",
    " * Vamos usar uma metodologia apenas\n",
    " * Isso será feito de maneira construtiva\n",
    " * **A jornada é mais importante que o destino** (neste caso pelo menos...)\n",
    " \n",
    " ## Equações de Navier-Stokes incompressível\n",
    "\n",
    " * Segunda lei de Newton\n",
    "    $$\n",
    "    \\frac{\\partial \\pmb{u}}{\\partial t} + \\pmb{u}\\cdot\\nabla\\pmb{u} = \n",
    "-\\nabla p + \\frac{1}{Re}\\nabla^2\\pmb{u}\n",
    "    $$\n",
    "    \n",
    " * Conservação de massa\n",
    " $$\n",
    "\\nabla\\cdot\\pmb{u} = 0 \n",
    " $$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Integrando as equações de Navier Stokes\n",
    "\n",
    "Podemos reescrever as equações de Navier Stokes  como:\n",
    "$$\n",
    "\\frac{\\partial \\pmb{u}}{\\partial t} = -\\nabla p + \\frac{1}{Re}\\pmb{L}(\\pmb{u}) + \\pmb{N}(\\pmb{u})\n",
    "$$\n",
    "\n",
    "onde\n",
    "\n",
    "$$\n",
    "\\pmb{L}(\\pmb{u}) \\equiv \\nabla^2\\pmb{u} = \\nabla(\\nabla\\cdot\\pmb{u}) - \\nabla\\times(\\nabla\\times\\pmb{u})\\\\\n",
    "\\pmb{N}(\\pmb{u}) \\equiv - \\pmb{u}\\cdot\\nabla\\pmb{u} = -\\frac{1}{2}\\left[ \\pmb{u}\\cdot\\nabla\\pmb{u}  + \\nabla(\\pmb{u}\\cdot\\pmb{u})\\right]\n",
    "$$\n",
    "\n",
    "Dado o campo de velocidades no instante $t_n$, como calcular isso no instante $t_{n+1}$\n",
    "\n",
    "$$\n",
    "\\pmb{u}^{n+1} - \\pmb{u}^{n}= -\\int_{t_n}^{t_{n+1}} \\nabla p \\: dt + \\frac{1}{Re}\\int_{t_n}^{t_{n+1}} \\pmb{L}(\\pmb{u})\\:dt + \\int_{t_n}^{t_{n+1}} \\pmb{N}(\\pmb{u})\\:dt\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### Termo da pressão:\n",
    "\n",
    "$$\n",
    "\\int_{t_n}^{t_{n+1}} \\nabla p \\: dt = \\Delta t \\nabla\\bar{p}^{n+1}\n",
    "$$\n",
    "$\\bar{p}^{n+1}$ é o campo escalar que garante que o campo de velocidades seja incompressível no instante n+1\n",
    "\n",
    "### Termo convectivo (Adams-Bashforth):\n",
    "$$\n",
    "\\int_{t_n}^{t_{n+1}} \\pmb{N}(\\pmb{u})\\:dt = \\Delta t \\sum_{q=0}^{J_e-1}\\beta_q \\pmb{N}(\\pmb{u^{n-q}})\n",
    "$$ \n",
    "\n",
    "### Termo difusivo (Adams-Moulton):\n",
    "$$\n",
    "\\int_{t_n}^{t_{n+1}} \\pmb{L}(\\pmb{u})\\:dt = \\Delta t \\sum_{q=0}^{J_i-1}\\gamma_q \\pmb{L}(\\pmb{u^{n+1-q}})\n",
    "$$ \n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### O esquema de integração tem a seguinte forma:\n",
    "$$\n",
    "\\frac{\\pmb{\\hat{u}}-\\pmb{u^n}}{\\Delta t} = \\sum_{q=0}^{J_e-1}\\beta_q \\pmb{N}(\\pmb{u^{n-q}})\\\\\n",
    "\\frac{\\pmb{\\hat{\\hat{u}}}-\\pmb{\\hat{u}}}{\\Delta t} = - \\nabla \\bar{p}^{n+1}\\\\\n",
    "\\frac{\\pmb{u}^{n+1} - \\pmb{\\hat{\\hat{u}}}}{\\Delta t} = \\frac{1}{Re} \\sum_{q=0}^{J_i-1}\\gamma_q \\pmb{L}(\\pmb{u^{n+1-q}})\\\\\n",
    "$$\n",
    "\n",
    "E a pressão?\n",
    "$$\n",
    "\\nabla^2\\bar{p}^{n+1} = \\nabla\\cdot\\left[\\left(\\frac{\\pmb{\\hat{u}}}{\\Delta t} \\right) + \\frac{1}{Re}  \\sum_{q=0}^{J_i-1}\\gamma_q \\pmb{L}(\\pmb{u^{n+1-q}})\\right]\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "##  Este equacionamento não é para assustar mas sim mostrar algumas coisas\n",
    "\n",
    " * Software numérico é construído a partir de elementos mais básicos que incluem:\n",
    "   * Integração numérica\n",
    "   * Diferenciação\n",
    "   * Aproximação \n",
    "   * Sistemas de equaões algébricas lineares (e não lineares)\n",
    " * Resolvendo problemas simples permite ir longe:\n",
    "  $$\n",
    "  \\nabla^2 u + \\lambda u = f(x)\n",
    "  $$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Roteiro para $\\nabla^2 u = f$\n",
    "\n",
    " * $u^\\delta(x) = \\sum \\hat{u}_k \\phi_k(x) \\approx u(x)$ - Aproximação e interpolação\n",
    " * $\\nabla^2 u^\\delta - f = \\varepsilon(x)$ - Erro da equação diferencial\n",
    " * Resíduos ponderados $\\int_\\Omega w_i(x) \\nabla^2 u^\\delta \\:dx = \\int_\\Omega f w_i(x)\\:dx$\n",
    " * Formulação fraca: $ -\\int_\\Omega \\nabla w_i(x) \\cdot \\nabla u^\\delta \\:dx + \\int_{\\partial\\Omega} w_i\\frac{\\partial u}{\\partial n} = \\int_\\Omega f w_i(x)\\:dx$\n",
    " * Galerkin: $w_i(x) = \\phi_i(x)$\n",
    " * Sistema linear: $\\left[A\\right]\\cdot\\left\\{\\hat{u}\\right\\} = \\left\\{f\\right\\}$, \n",
    " $$A_{i,k} = -\\int_\\Omega\\nabla\\phi_i\\cdot\\nabla\\phi_k\\:dx + \\int_{\\partial\\Omega}\\phi_i\\frac{\\partial u}{\\partial n}\\\\\n",
    " f_i = \\int_\\Omega f\\phi_i\\:dx\n",
    " $$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## O que vamos fazer:\n",
    "\n",
    " * Aprender a aproximar funções (e dados):\n",
    "  $$\n",
    "  u(x)\\approx u^\\delta(x) = \\sum_{i=1}^N \\hat{u}_i \\phi_i(x)\n",
    "  $$\n",
    " * Aprender a calcular integrais:\n",
    "  $$\n",
    "  \\int_a^b u(x)\\:dx \\approx \\sum_{i=1}^N \\omega_i u(x_i)\n",
    "  $$\n",
    " * Aprender a calcular derivadas:\n",
    " $$\n",
    " \\frac{du(x)}{dx}\n",
    " $$\n",
    " * Juntar tudo isso e tornar problemas mais difíceis em mais fáceis:\n",
    "   * Problema não linear -> Problema linear\n",
    "   * Equação diferencial parcial -> Equação diferencial ordinária\n",
    "   * Reduzir praticamente qualquer problema em um sequência de sistemas lineares.\n",
    " \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    " # Nesta jornada vamos tentar aprender a programar em Julia\n",
    " \n",
    "  * A linguagem de programação Julia\n",
    "  * Engenharia de Software: pode ser utilizado em muito mais do que software apenas!\n",
    "  * Pensar nas nossas ferramentas e ambiente\n",
    "  "
   ]
  }
 ],
 "metadata": {
  "@webio": {
   "lastCommId": null,
   "lastKernelId": null
  },
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Julia 1.4.1",
   "language": "julia",
   "name": "julia-1.4"
  },
  "language_info": {
   "file_extension": ".jl",
   "mimetype": "application/julia",
   "name": "julia",
   "version": "1.4.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
