{ "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": "heading", "level": 5, "metadata": {}, "source": [ "Version 0.1 (Julio 2013)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "12 pasos para Navier-Stokes\n", "======\n", "***" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u00a1Hola! Bienvenidos a ** 12 pasos para Navier-Stokes **. Este es un m\u00f3dulo pr\u00e1ctico que se utiliza en el principio de un curso interactivo de Din\u00e1mica de Fluidos Computacional (en ingl\u00e9s Computational Fluid Dynamics, CFD) y se imparte por la [Prof. Lorena Barba](http://lorenabarba.com) desde el 2009 en la Universidad de Boston. El curso supone s\u00f3lo el conocimiento b\u00e1sico de programaci\u00f3n (en cualquier lenguaje) y, por supuesto, alg\u00fan fundamento en las ecuaciones en derivadas parciales y mec\u00e1nica de fluidos. El m\u00f3dulo pr\u00e1ctico se inspir\u00f3 en las ideas del Dr. Rio Yokota, que era un post-doctorado en el laboratorio de Barba, y ha sido depurado por la profesora Barba y sus alumnos durante varios semestres de ense\u00f1anza del curso. El curso se imparte \u00edntegramente utilizando Python y los estudiantes que no saben Python simplemente aprender\u00e1n a medida que se trabaje a trav\u00e9s del m\u00f3dulo.\n", "\n", "Este [IPython notebook](http://ipython.org/ipython-doc/stable/interactive/htmlnotebook.html) ser\u00e1 la primera etapa de programaci\u00f3n de tu propio resolvedor de Navier-Stokes en Python. Vamos a ello ahora mismo. No te preocupes si no entiendes todo lo que est\u00e1 pasando en primer lugar, cubriremos en detalle cada aspecto a medida que se avance y mediante los videos de apoyo (en ingl\u00e9s) [(EN) Clases de la Prof. Barba en YouTube](http://www.youtube.com/playlist?list=PL30F4C5ABCE62CB61).\n", "\n", "Para obtener los mejores resultados, una vez visto este notebook (cuaderno), escribe tu propio c\u00f3digo para el Paso 1, ya sea como un script en Python o en un notebook IPython vac\u00edo.\n", "\n", "Para ejecutar este cuaderno, se supone que has arrancado el servidor de notebook usando: `ipython notebook --pylab inline` en tu l\u00ednea de comandos.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Paso 1: 1-D Convecci\u00f3n lineal (_Linear Convection_)\n", "-----\n", "***" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La ecuaci\u00f3n en 1-D de convecci\u00f3n lineal (1-D Linear Convection) es la ecuaci\u00f3n m\u00e1s simple que permite el modelado m\u00e1s sencillo y permite aprender bastante sobre CFD (Computational fluid dynamics). \u00a1Es sorprendente como esta peque\u00f1a ecuaci\u00f3n puede ense\u00f1arnos tanto! aqu\u00ed est\u00e1: \n", "\n", "$$\\frac{\\partial u}{\\partial t} + c \\frac{\\partial u}{\\partial x} = 0$$\n", "\n", "Con unas condiciones iniciales dadas (entendido como *onda* o *wave*), la ecuaci\u00f3n representa la propagaci\u00f3n de esta *onda* inicial con velocdad $c$, sin cambio de su forma. Siendo la condici\u00f3n inicial $u(x,0)=u_0(x)$. Entonces, la soluci\u00f3n exacta de la ecuaci\u00f3n es $u(x,t)=u_0(x-ct)$.\n", "\n", "Para discretizar esta ecuaci\u00f3n en tiempo y espacio, usamos el m\u00e9todo de diferencias finitas, hacia delante para la derivada de tiempo y hacia atr\u00e1s para el espacio. As\u00ed, se discretiza la coordenada espacial $x$ en puntos con un \u00edndice de $i=0$ a $N$, y el tiempo en intervalos de un tama\u00f1o espec\u00edfico $\\Delta t$.\n", "\n", "De la definici\u00f3n de una derivada (simplemente quitando el l\u00edmite), sabemos que:\n", "\n", "$$\\frac{\\partial u}{\\partial x}\\approx \\frac{u(x+\\Delta x)-u(x)}{\\Delta x}$$\n", "\n", "Nuestra ecuaci\u00f3n discreta queda como:\n", "\n", "$$\\frac{u_i^{n+1}-u_i^n}{\\Delta t} + c \\frac{u_i^n - u_{i-1}^n}{\\Delta x} = 0 $$\n", "\n", "Donde $n$ y $n+1$ son dos puntos consecutivos en el tiempo, mientras que, $i-1$ y $i$ son dos puntos vecinos de la coordenada $x$ discretizada. Si se dan las condiciones iniciales, entonces la \u00fanica inc\u00f3gnita en esta discretizaci\u00f3n es $u_i^{n+1}$. Podemos resolver la inc\u00f3gnita y obtener una ecuaci\u00f3n que nos permite avanzar en el tiempo, de la siguiente manera:\n", "\n", "$$u_i^{n+1} = u_i^n - c \\frac{\\Delta t}{\\Delta x}(u_i^n-u_{i-1}^n)$$\n", "\n", "Ahora vamos a tratar de implementar esto en Python.\n", "\n", "Vamos a empezar importando algunas librer\u00edas para ayudarnos.\n", "\n", "* `numpy` es una biblioteca que proporciona un grupo de operaciones matriciales de forma similar a MATLAB \n", "* `matplotlib` es una biblioteca de gr\u00e1ficas 2D que vamos a utilizar para representar los resultados \n", "* `time` y `sys` proporcionan funciones b\u00e1sicas de tiempo que vamos a utilizar para reducir la velocidad de visualizaci\u00f3n de animaciones" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Recuerda: Los comentarios en python se indican con el signo de almohadilla\n", "\n", "%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 # aqu\u00ed importamos numpy, llam\u00e1ndolo \"np\" de ahora en adelante\n", "import matplotlib.pyplot as plt # aqu\u00ed importamos matplotlib, llam\u00e1ndolo \"plt\"\n", "import time, sys # e importamos algunas funciones \u00fatiles\n", "from IPython.core.display import clear_output # utilizado para la animaci\u00f3n que se ver\u00e1 adelante" ], "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": [ "Ahora vamos a definir algunas variables, queremos crear una red de puntos espaciados uniformemente dentro de un dominio espacial que tenga 2 unidades de longitud de ancho, es decir, $x_i\\in(0,2)$. Vamos a definir una variable `nx`, que ser\u00e1 el n\u00famero de puntos de la cuadr\u00edcula que queremos y `dx` ser\u00e1 la distancia entre cualquier par de puntos de las cuadr\u00edculas adyacentes." ] }, { "cell_type": "code", "collapsed": false, "input": [ "nx = 41 # prueba a cambiar este n\u00famero de 41 a 81 y ejecutar todo ... \u00bfqu\u00e9 pasa?\n", "dx = 2./(nx-1)\n", "nt = 25 # nt es el n\u00famero de pasos de tiempo que queremos calcular\n", "dt = .025 # dt es la cantidad de tiempo que cada momento de tiempo abarca (delta t)\n", "c = 1. # asumir la velocidad de la onda de c = 1" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tambi\u00e9n tenemos que establecer nuestras condiciones iniciales. La velocidad inicial $u_0$ viene dada por $u = 2$ en el intervalo $0.5 \\leq x \\leq 1$ y $u = 1$ en el resto de $(0,2)$ (\u00e9sto es la funci\u00f3n de sombrero).\n", "\n", "Aqu\u00ed, utilizamos la funci\u00f3n `ones()` definiendo un 'array' de numpy que tiene `nx` elementos de largo con cada valor igual a 1." ] }, { "cell_type": "code", "collapsed": false, "input": [ "u = np.ones(nx) # numpy funci\u00f3n ones() creando un array de 1 con nx elmentos\n", "u[.5/dx : 1/dx+1]=2 # estableciendo u = 2 entre 0.5 y 1 como nuestras C.I.s (condiciones de iniciales)\n", "print u" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 2. 2. 2. 2. 2. 2. 2. 2.\n", " 2. 2. 2. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1.]\n" ] } ], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora echemos un vistazo a las condiciones iniciales represent\u00e1ndolo gr\u00e1ficamente con Matplotlib. Hemos importado `matplotlib` como `plt` y, dentro de ella, la funci\u00f3n representaci\u00f3n de datos `plot`, por lo que llamamos a `plt.plot`. Para saber m\u00e1s sobre las m\u00faltiples posibilidades de Matplotlib, \u00e9chale un vistazo a la [Galer\u00eda](http://matplotlib.org/gallery.html) de ejemplos de gr\u00e1ficas.\n", "\n", "Aqu\u00ed, utilizamos la sintaxis de una simple gr\u00e1fica 2D: `plot (x, y)`, donde los valores de `x` se distribuyen uniformemente en puntos de la cuadr\u00edcula:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "plt.plot(np.linspace(0,2,nx), u)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAD9CAYAAACoXlzKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFVRJREFUeJzt3X9sVfX9x/HXxVZHW4Z1urKVm6mUzZb+uB1LOuJqLlvc\nsLGMAEvs4qYtcQ1Z5kj2x5Ily3rVEbN/DI5k2RbHQqrOxbjpMugShVsHrmKggy0mWp1NW1CSRohU\nkF7K+f5R6VegvT96z4/P59PnI7mx5Z6e+87x+OLlp/ecG/M8zxMAwBmLoh4AAOAvgh0AHEOwA4Bj\nCHYAcAzBDgCOIdgBwDFZg310dFRr167VqlWrVF9fr8cff/yqbZ588kk1NTWpsbFRt99+u44dOxbY\nsACA3GLZ3sf+3nvv6b333lMikdDExIRWr16tv/71r6qtrZ3Z5l//+pfq6uq0dOlS9fX1qaenRwMD\nA6EMDwC4WtbGvmzZMiUSCUlSRUWFamtrdeLEicu2WbNmjZYuXSpJamlp0djYWECjAgDykfca+/Dw\nsAYHB9XS0jLnNk888YTa2tp8GQwAME9eHs6cOeOtXr3a+8tf/jLnNvv27fNqa2u9999/f9bnJfHg\nwYMHj3k8CpXzJyYnJ71vfvOb3mOPPTbnNkePHvVWrFjhDQ0Nzf1C8xgOs/vFL34R9QhO4Xj6i+Pp\nr/lkZ9alGM/ztGXLFtXV1Wnbtm2zbjMyMqKNGzeqt7dXNTU12XYHAAhBSbYnDx48qN7eXjU2Nqq5\nuVmStH37do2MjEiSuru79dBDD+nUqVPaunWrJKm0tFSHDh0KeGwAwFyyvt3R1xeKxRTSSzkvnU4r\nmUxGPYYzOJ7+4nj6az7ZSbADgMHmk53cUgAAHEOwA4BjCHYAcAzBDgCOIdgBwDEEOwA4hmAHAMcQ\n7ADgGIIdABxDsAOAYwh2AHAMwQ4AjiHYAcAxBDsAOIZgBwDHEOwA4BiCHQAcQ7ADgGMIdgBwDMEO\nAI4h2AHAMQQ7ADiGYAcAxxDsAOAYgh0AHEOwA4BjCHYAcEzWYB8dHdXatWu1atUq1dfX6/HHH591\nuwcffFArV65UU1OTBgcHAxkUAJCfkmxPlpaW6rHHHlMikdDExIRWr16tO++8U7W1tTPb7NmzR2+9\n9ZaGhob06quvauvWrRoYGAh8cADA7LI29mXLlimRSEiSKioqVFtbqxMnTly2zQsvvKD77rtPktTS\n0qLTp0/r5MmTAY0LAMgla2P/pOHhYQ0ODqqlpeWyPz9+/Lji8fjM98uXL9fY2Jiqqqr8mxIzzp2T\nvv996aOPop7EHR0d0ne/G/UUgH/yCvaJiQlt3rxZO3bsUEVFxVXPe5532fexWGzW/fT09Mx8nUwm\nlUwm858UkqR335X++U/p97+PehI37Nsn/eMfBDvMkU6nlU6ni9pHzmDPZDLatGmT7r33Xm3YsOGq\n56urqzU6Ojrz/djYmKqrq2fd1yeDHfMzMSHddJPU3h71JG44f156+umopwD+35WlN5VKFbyPrGvs\nnudpy5Ytqqur07Zt22bdZv369dq9e7ckaWBgQNdffz3LMAH68ENplv9pwjxVVEwfU8AlWRv7wYMH\n1dvbq8bGRjU3N0uStm/frpGREUlSd3e32tratGfPHtXU1Ki8vFy7du0KfuoFbGJCKi+Pegp3lJdP\nH1PAJVmD/Wtf+5ouXryYcyc7d+70bSBkR2P3F40dLuLKU8vQ2P1FY4eLCHbL0Nj9RWOHiwh2y9DY\n/UVjh4sIdsvQ2P1VXj59TK+4FAOwGsFuGRq7v0pKpNJSruSFWwh2y9DY/cc6O1xDsFuGxu4/1tnh\nGoLdMjR2/9HY4RqC3TI0dv/R2OEagt0yNHb/0djhGoLdMjR2/9HY4RqC3TI0dv/R2OEagt0yNHb/\n0djhGoLdMhMTNHa/VVQQ7HALwW4Rz5teMqCx++vSbQUAVxDsFvnoo+nL30vy/ghy5IPGDtcQ7Bah\nrQeDxg7XEOwWYX09GDR2uIZgtwiNPRg0driGYLcIjT0YNHa4hmC3CBcnBYMLlOAagt0iXJwUDC5Q\ngmsIdovQ2INBY4drCHaL0NiDQWOHawh2i9DYg0Fjh2sIdovQ2INBY4drCHaL0NiDce21UiwmTU5G\nPQngD4LdIjT24NDa4RKC3SI09uCwzg6X5Az2rq4uVVVVqaGhYdbnx8fHtW7dOiUSCdXX1+uPf/yj\n3zPiYzT24NDY4ZKcwd7Z2am+vr45n9+5c6eam5v173//W+l0Wj/5yU904cIFX4fENBp7cGjscEnO\nYG9tbVVlZeWcz3/uc5/TBx98IEn64IMP9JnPfEYl3DA8EDT24NDY4ZKiE/iBBx7Q17/+dX3+85/X\nmTNn9Oc//3nObXt6ema+TiaTSiaTxb78gkJjDw6NHaZIp9NKp9NF7aPoYN++fbsSiYTS6bTefvtt\n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\nHQAc839QV9xYZwpZ5AAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u00bfPor qu\u00e9 la funci\u00f3n del sombrero (_hat function_) tiene las l\u00edneas perfectamente rectas? Pi\u00e9nsalo un poco." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora es el momento de poner en pr\u00e1ctica la discretizaci\u00f3n de la ecuaci\u00f3n de convecci\u00f3n usando el m\u00e9todo de diferencias finitas.\n", "\n", "Para cada elemento de nuestra matriz `u`, necesitamos realizar la operaci\u00f3n $u_i^{n+1} = u_i^n - c \\frac{\\Delta t}{\\Delta x}(u_i^n-u_{i-1}^n)$\n", "\n", "Vamos a guardar el resultado en un nuevo array (temporal), `un`, que ser\u00e1 la soluci\u00f3n de $u$ para el siguiente punto en el tiempo. Vamos a repetir esta operaci\u00f3n para todos los intervalos de tiempo que especifiquemos y, entonces, podemos ver hasta qu\u00e9 punto la onda experimenta convecci\u00f3n.\n", "\n", "Primero inicializamos nuestro array marcador de posici\u00f3n, `un`, y mantenemos los valores que calculados para el $n+1$ intervalos de tiempo, utilizando una vez m\u00e1s la funci\u00f3n de NumPy `ones()`.\n", "\n", "Entonces, podemos pensar que tenemos dos operaciones iterativas: una en el espacio y una en el tiempo (aprenderemos una manera diferente de hacerlo despu\u00e9s), por lo que vamos a empezar por la inclusi\u00f3n o anidadamiento de un bucle dentro de otro. Ten en cuenta el uso ingenioso de la funci\u00f3n `range()`. Cuando escribimos: `for i in range (1, nx)` vamos a recorrer el array `u`, pero vamos a saltar al primer elemento (el elemento cero). *\u00bfPor qu\u00e9?*\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "un = np.ones(nx) # crea un array temporal de unos con nx elementos\n", "\n", "for n in range(nt): # bucle para los valores de n desde 0 a nt-1, por lo que se ejecutar\u00e1 nt veces\n", " un[:] = u[:] # copia los valores existentes de u en un\n", " for i in range(1,nx): ## puedes convertir esta l\u00ednea en un comentario...\n", " #for i in range(nx): ## ... e intercambiarla por esta otra para ver que pasa!\n", " u[i] = un[i]-c*dt/dx*(un[i]-un[i-1])\n", " \n", " " ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Nota**: Aprenderemos m\u00e1s tarde que el c\u00f3digo escrito arriba es bastante ineficiente y hay mejores maneras de escribir esto al estilo Python. Pero vamos a continuar de momento as\u00ed.\n", "\n", "Ahora vamos a intentar representar nuestro array `u` despu\u00e9s de que el tiempo haya avanzado." ] }, { "cell_type": "code", "collapsed": false, "input": [ "plt.plot(np.linspace(0,2,nx),u)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 15, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nVd0AAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u00a1OK! Nuestra funci\u00f3n sombrero (de copa) se ha movido definitivamente hacia la derecha, pero ya no es un sombrero \"recto\". **\u00bfQu\u00e9 est\u00e1 pasando?**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Aprende m\u00e1s\n", "-----\n", "***" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para una explicaci\u00f3n m\u00e1s detallada del m\u00e9todo de diferencias finitas, incluyendo temas como el error de truncamiento, el orden de convergencia y otros detalles, puedes ver en ing\u00e9s las **Video Lessons 2 and 3** de la profesora Barba en YouTube." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.display import YouTubeVideo\n", "YouTubeVideo('iz22_37mMkk')" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " " ], "output_type": "pyout", "prompt_number": 7, "text": [ "" ] } ], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "YouTubeVideo('xq9YTcv-fQg')" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " " ], "output_type": "pyout", "prompt_number": 8, "text": [ "" ] } ], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para una explicaci\u00f3n detallada (paso por paso) de la discretizaci\u00f3n de la ecuaci\u00f3n de convecci\u00f3n lineal con diferencias finitas (y tambi\u00e9n los siguientes pasos de estos notebooks hasta el Paso 4), mira el v\u00eddeo **Lesson 4** de la profesora Barba en YouTube." ] }, { "cell_type": "code", "collapsed": false, "input": [ "YouTubeVideo('y2WaK7_iMRI')" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " " ], "output_type": "pyout", "prompt_number": 9, "text": [ "" ] } ], "prompt_number": 9 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Por \u00faltimo pero no por ello menos importante (_Last but not least_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Recuerda** que deber\u00edas reescribir el c\u00f3digo de este notebook desde cero como script en Python o experimentar con el cambiando los valores de discretizaci\u00f3n mediante tu instalaci\u00f3n de IPython notebook. Una vez hecho esto, est\u00e1s listo para el [Paso 2](http://nbviewer.ipython.org/urls/bitbucket.org/franktoffel/cfd-python-class-es/raw/master/lecciones/02%2520-%2520Paso%25202.ipynb).\n", "\n", "\n", "***" ] }, { "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": 2, "text": [ "" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "> (La celda de arriba establece el estilo de este notebook. Se modific\u00f3 el estilo encontrado en GitHub por [CamDavidsonPilon](https://github.com/CamDavidsonPilon), [@Cmrn_DP](https://twitter.com/cmrn_dp).)" ] } ], "metadata": {} } ] }