Este notebook de IPython continúa la presentación de los 12 pasos para Navier-Stokes, el módulo práctico se enseña en la clase interactiva de CFD impartida por la Prof. Lorena Barba. Debes de haber completado el Paso 1 antes de continuar, después de haber escrito tu propio script Python o notebook y de haber experimentado con la variación de los parámetros de la discretización observando lo que sucede.
Ahora vamos a poner en práctica la convección no lineal utilizando los mismos métodos que en el paso 1. La ecuación de convección 1D es:
$$\frac{\partial u}{\partial t} + u \frac{\partial u}{\partial x} = 0$$En lugar de una constante $c$ multiplicando el segundo término, ahora tenemos la variable $u$ multiplicándolo. Por lo tanto, el segundo término de la ecuación es ahora no lineal Vamos a usar la misma discretización que en el paso 1 por el el método de diferencias finitas, hacia delante para la derivada de tiempo y hacia atrás para el espacio. Esta es la ecuación discretizada.
$$\frac{u_i^{n+1}-u_i^n}{\Delta t} + u_i^n \frac{u_i^n-u_{i-1}^n}{\Delta x} = 0$$Despejando el término que no conocemos, $u_i^{n+1}$, se obtiene:
$$u_i^{n+1} = u_i^n - u_i^n \frac{\Delta t}{\Delta x} (u_i^n - u_{i-1}^n)$$Al igual que antes, el código en Python comienza mediante la carga de las librerías necesarias. Seguidamente, creamos algunas variables que determinan la discretización en el espacio y en el tiempo (deberías probar cambiando estos parámetros para ver qué pasa). A continuación, establecemos la condición 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ón de sombrero).
%pylab inline
# El comando de arriba hará que figuras de este notebook se representen junto al texto
import numpy as np # estamos importando numpy y abreviándolo con np
import matplotlib.pyplot as plt # junto con librería de gráficos 2D, llamándola plt
nx = 41
dx = 2./(nx-1)
nt = 20 # nt es el número de intervalos de tiempo que se desea calcular
dt = .025 # dt es la cantidad de tiempo que cada incremento de tiempo comprende (delta t)
u = np.ones(nx) # como antes, se inicializa 'u' con cada valor igual a 1.
u[.5/dx : 1/dx+1]=2 # a continuación, u = 2 entre 0,5 y 1 para completar la C.I. (condiciones inicial)
un = np.ones(nx) #inicializar el marcador de posición de conjunto de 'un', para almacenar la solución de tiempo instante por instante
Populating the interactive namespace from numpy and matplotlib
El siguiente fragmento de código está inacabado. Lo hemos copiado en base al código del Paso 1 que lleva a cabo la actualización conforme se avanza en el tiempo. ¿Puedes modificar el código para resolver la convección no lineal en su lugar?
for n in range(nt): # iteración con respecto al tiempo
un[:] = u[:] ## copia los valores existentes de 'u' en 'un'
for i in range(1,nx): ## ahora iteraremos por el array 'u'
### Esto que viene a continuación
### es la línea del Paso 1, copia exacta. Edítala para nuestra nueva equación.
### después descoméntala y ejecuta la celda para evaluar la ec. de conv. no lineal.
###u[i] = un[i]-c*dt/dx*(un[i]-un[i-1])
plt.plot(np.linspace(0,2,nx),u) ## Representa los resultados
File "<ipython-input-2-6d48ba8ccdd2>", line 12 plt.plot(np.linspace(0,2,nx),u) ## Representa los resultados ^ IndentationError: expected an indented block
¿Qué observas en la evolución de la función de sombrero bajo la ecuación de convección no lineal? ¿Qué sucede cuando se cambian los parámetros numéricos y se ejecuta de nuevo?
Para una explicación detallada de la discretización de la ecuación de convección por diferencias finitas (y todos los pasos del 1 al 4), mira el Video Lesson 4 en inglés de la Prof. Barba en YouTube.
from IPython.display import YouTubeVideo
YouTubeVideo('y2WaK7_iMRI')
from IPython.core.display import HTML
def css_styling():
styles = open("../styles/custom.css", "r").read()
return HTML(styles)
css_styling()
(La celda de arriba establece el formato de este notebook.)