{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "raw", "metadata": {}, "source": [ "Texto y c\u00f3digo sujeto bajo Creative Commons Attribution license, CC-BY-SA. (c) Original por Lorena A. Barba, 2013, traducido libremente por F.J. Navarro-Brull para CAChemE.org " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[@LorenaABarba](https://twitter.com/LorenaABarba)\n", "[@CAChemEorg](https://twitter.com/cachemeorg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "12 pasos para Navier-Stokes\n", "======\n", "***" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Este notebook de IPython contin\u00faa la presentaci\u00f3n de los **12 pasos para Navier-Stokes**, el m\u00f3dulo pr\u00e1ctico se ense\u00f1a en la clase interactiva de CFD impartida por la [Prof. Lorena Barba](http://lorenabarba.com). Debes de haber completado el [Paso 1](http://nbviewer.ipython.org/urls/bitbucket.org/franktoffel/cfd-python-class-es/raw/master/lecciones/01%2520-%2520Paso%25201.ipynb) antes de continuar, despu\u00e9s de haber escrito tu propio script Python o notebook y de haber experimentado con la variaci\u00f3n de los par\u00e1metros de la discretizaci\u00f3n observando lo que sucede." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Paso 2: Convecci\u00f3n no lineal (_Non-linear Convection_)\n", "-----\n", "***" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora vamos a poner en pr\u00e1ctica la convecci\u00f3n no lineal utilizando los mismos m\u00e9todos que en el paso 1. La ecuaci\u00f3n de convecci\u00f3n 1D es:\n", "\n", "$$\\frac{\\partial u}{\\partial t} + u \\frac{\\partial u}{\\partial x} = 0$$\n", "\n", "En lugar de una constante $c$ multiplicando el segundo t\u00e9rmino, ahora tenemos la variable $u$ multiplic\u00e1ndolo. Por lo tanto, el segundo t\u00e9rmino de la ecuaci\u00f3n es ahora *no lineal* Vamos a usar la misma discretizaci\u00f3n que en el paso 1 por el el m\u00e9todo de diferencias finitas, hacia delante para la derivada de tiempo y hacia atr\u00e1s para el espacio. Esta es la ecuaci\u00f3n discretizada.\n", "\n", "$$\\frac{u_i^{n+1}-u_i^n}{\\Delta t} + u_i^n \\frac{u_i^n-u_{i-1}^n}{\\Delta x} = 0$$\n", "\n", "Despejando el t\u00e9rmino que no conocemos, $u_i^{n+1}$, se obtiene:\n", "\n", "$$u_i^{n+1} = u_i^n - u_i^n \\frac{\\Delta t}{\\Delta x} (u_i^n - u_{i-1}^n)$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Al igual que antes, el c\u00f3digo en Python comienza mediante la carga de las librer\u00edas necesarias. Seguidamente, creamos algunas variables que determinan la discretizaci\u00f3n en el espacio y en el tiempo (deber\u00edas probar cambiando estos par\u00e1metros para ver qu\u00e9 pasa). A continuaci\u00f3n, establecemos la condici\u00f3n inicial $u_0$ creando la matriz de la variable con $u = 2\\ @\\ 0.5 \\leq x \\leq 1$ y $u = 1$ para el resto del dominio $(0,2)$ (es decir, una funci\u00f3n de sombrero)." ] }, { "cell_type": "code", "collapsed": true, "input": [ "%pylab inline\n", "# El comando de arriba har\u00e1 que figuras de este notebook se representen junto al texto\n", "\n", "import numpy as np # estamos importando numpy y abrevi\u00e1ndolo con np \n", "import matplotlib.pyplot as plt # junto con librer\u00eda de gr\u00e1ficos 2D, llam\u00e1ndola plt\n", "\n", "\n", "nx = 41\n", "dx = 2./(nx-1)\n", "nt = 20 # nt es el n\u00famero de intervalos de tiempo que se desea calcular\n", "dt = .025 # dt es la cantidad de tiempo que cada incremento de tiempo comprende (delta t)\n", "\n", "u = np.ones(nx) # como antes, se inicializa 'u' con cada valor igual a 1.\n", "u[.5/dx : 1/dx+1]=2 # a continuaci\u00f3n, u = 2 entre 0,5 y 1 para completar la C.I. (condiciones inicial)\n", "\n", "un = np.ones(nx) #inicializar el marcador de posici\u00f3n de conjunto de 'un', para almacenar la soluci\u00f3n de tiempo instante por instante" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "El siguiente fragmento de c\u00f3digo est\u00e1 *inacabado*. Lo hemos copiado en base al c\u00f3digo del [Paso 1](http://nbviewer.ipython.org/urls/bitbucket.org/franktoffel/cfd-python-class-es/raw/master/lecciones/01%2520-%2520Paso%25201.ipynb) que lleva a cabo la actualizaci\u00f3n conforme se avanza en el tiempo. \u00bfPuedes modificar el c\u00f3digo para resolver la convecci\u00f3n no lineal en su lugar?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for n in range(nt): # iteraci\u00f3n con respecto al tiempo\n", " un[:] = u[:] ## copia los valores existentes de 'u' en 'un'\n", " for i in range(1,nx): ## ahora iteraremos por el array 'u'\n", " \n", " ### Esto que viene a continuaci\u00f3n\n", " ### es la l\u00ednea del Paso 1, copia exacta. Ed\u00edtala para nuestra nueva equaci\u00f3n.\n", " ### despu\u00e9s descom\u00e9ntala y ejecuta la celda para evaluar la ec. de conv. no lineal. \n", " \n", " ###u[i] = un[i]-c*dt/dx*(un[i]-un[i-1]) \n", "\n", " \n", "plt.plot(np.linspace(0,2,nx),u) ## Representa los resultados" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "IndentationError", "evalue": "expected an indented block (, line 12)", "output_type": "pyerr", "traceback": [ "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m12\u001b[0m\n\u001b[1;33m plt.plot(np.linspace(0,2,nx),u) ## Representa los resultados\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mIndentationError\u001b[0m\u001b[1;31m:\u001b[0m expected an indented block\n" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u00bfQu\u00e9 observas en la evoluci\u00f3n de la funci\u00f3n de sombrero bajo la ecuaci\u00f3n de convecci\u00f3n no lineal? \u00bfQu\u00e9 sucede cuando se cambian los par\u00e1metros num\u00e9ricos y se ejecuta de nuevo?\n" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Aprende m\u00e1s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para una explicaci\u00f3n detallada de la discretizaci\u00f3n de la ecuaci\u00f3n de convecci\u00f3n por diferencias finitas (y todos los pasos del 1 al 4), mira el **Video Lesson 4** en ingl\u00e9s de la Prof. Barba en YouTube." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.display import YouTubeVideo\n", "YouTubeVideo('y2WaK7_iMRI')" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " " ], "output_type": "pyout", "prompt_number": 4, "text": [ "" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.core.display import HTML\n", "def css_styling():\n", " styles = open(\"../styles/custom.css\", \"r\").read()\n", " return HTML(styles)\n", "css_styling()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", "" ], "output_type": "pyout", "prompt_number": 1, "text": [ "" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "> (La celda de arriba establece el formato de este notebook.)" ] } ], "metadata": {} } ] }