Texto y código sujeto bajo Creative Commons Attribution license, CC-BY-SA. (c) Original por Lorena A. Barba y Gilbert Forsyth en 2013, traducido por F.J. Navarro-Brull para CAChemE.org

12 pasos para Navier-Stokes


Este notebook complementa el primer módulo interectivo online de CFD con Python y clases dadas por la profesora Lorena A. Barba, llamadas 12 Pasos para Navier-Stokes. Este módulo de programación interactva empieza con ejercicios simples en 1D que empiezan a usar un poco del poder de Python. Vamos a presentar ahora nuevas formas de hacer las mismas cosas pero que son más eficientes y producen un código más bonito. Esta lección fue orginalmente escrita por un estudiante de grado de Boston University, Gilbert Forsyth.

Definiendo funciones en Python

En los pasos 1 al 8, hemos escrito código en Python pensado para ejecutarse de arriba a abajo. Éramos capaces de reutilizar el código (¡con gran éxito!) al copiar y pegar, para construir gradualmente un programa de resolución de la ecuación de Burgers. Pero si damos un paso adelante, hay maneras más eficientes para escribir nuestro código Python. En esta lección, vamos a introducir las definiciones de función (function definitions), las cuales nos permitirán mayor flexibilidad en la reutilización de código y por tanto en la organización del mimso.

Empezaremos con un ejemplo trivial, una función que suma dos números.

Para crear una función en Python, empezamos de la siguiente forma:

def sumasimple(a,b):

Esta sentencia crea una función llamada sumasimple que toma dos entradas (a y b) y devuelva su suma. Vamos a crear y ejecutar esta función:

In [1]:
def sumasimple(a, b):
    return a+b

La declaración return dice a Python qué datos devolvera en respuesta cuando la función sea llamada. Vamos a probar nuestra función sumasimplea ver qué pasa.

In [2]:
sumasimple(3, 4)
Out[2]:
7

Por supuesto, pueden ocurrir muchas cosas entre las líneas de código def y return. De esta forma, uno puede generar código de forma modular. Vamos a intentar crear una función que devuelva el número n-ésimo de la sucesión de Fibonacci.

In [3]:
def fibonacci(n):
    a, b = 0, 1
    for i in range(n):
        a, b = b, a + b
    return a
In [4]:
fibonacci(7)
Out[4]:
13

Una vez definida, la función fibonacci puede ser llamada como cualquier otra función incluida en Python que ya hemos usado. Por ejemplo, si quisieramos mostrar en la consola la secuencia hasta el valor n:

In [15]:
for n in range(10):
    print fibonacci(n)
0
1
1
2
3
5
8
13
21
34

Utilizaremos la capacidad de definir nuestras propias funciones en Python para ayudarnos a crear código que sea fácil de reutilizar, de mantener y ¡más fácil de compartir!.

Aprende más


¿Recuerdas nuestro pequeño desvío con Operaciones matriciales (arrays) con NumPy?

Bien, hay otras formas de hacer que el código científico se ejecute más rápido. Recomendamos el artículo en inglés de Technical Discovery Speeding Up Python (junio, 2011), que habla de NumPy, Cython y Weave. Usa como ejemplo la ecuación de Laplace (que resolveremos en el Paso 9) y hace un uso limpio de funciones definidas..

Pero una forma reciente de hacer códigos de Python rápido es Numba. Aprenderemos un poco mas despues de que terminemos los 12 pasos para Navier-Stokes.

¡Hay muchas cosas interesantes que están sucediendo en el mundo de Python de alto rendimiento ahora mismo!


In [4]:
from IPython.core.display import HTML
def css_styling():
    styles = open("../styles/custom.css", "r").read()
    return HTML(styles)
css_styling()
Out[4]:

(La celda de arriba establece el formato de este notebook)