viernes, 10 de agosto de 2012

Python embebido

Iba a empezar esta entrada diciendo que "embebido" no significa lo que creemos que significa; pero me equivocaba. Significa lo que creemos que significa (es decir, no me equivocaba ¿o sí?)

Al parecer embebido no sólo significa estar absorbido (o absorto), sino que también tiene el significado de estar incrustado en algo. Es curioso porque "embedded" y "embebido" parecen tener orígenes bastante distintos, pero acaban significando cosas parecidas.

En fin, que voy a hablar de embeber Python en un programa, concretamente, un modelo numérico.

A diferencia de otro tipo de programas, los modelos numéricos suelen tener el problema de que en depuración es difícil obtener los valores que necesitamos. Si estamos resolviendo en una malla triangular, por ejemplo, necesitariamos hacer algún tipo de interpolación antes de poder ver los datos, y eso no es algo que el debugger pueda hacer.

La solución típica suele ser ir grabando resultados cada paso temporal y verlos desde otro programa. Los inconvenientes de esto son varios:

1. Generalmente sólo se graban ciertas variables importantes, así que no podemos acceder a ciertos valores.
2. Los archivos generados suelen ser muy grandes, pero poca de la informacion que se guarda se usa realmente.
3. A veces conviene ver los valores en momentos distintos al punto en el que se graba.

Hace tiempo tuve la idea de incluir un lenguaje interpretado junto con el programa, de forma que pudiésemos acceder a las variables en ciertos puntos de la ejecución. Bueno, la idea no es realmente mía, pero nunca la he visto implementada realmente.

Empecé a intentarlo con Python, que es un lenguaje bastante adecuado para ello (parece que cada vez se postula más como la alternativa de Matlab); pero la falta de documentación y ejemplos hizo que lo dejara... hasta ayer.

Ayer me puse con ganas renovadas y ya lo tengo funcionando. En pocas palabras, tengo un código que se compila con mi programa y que se enlaza con Python. En cada paso temporal tengo una llamada a una función que detecta si se ha pulsado una tecla y en caso afirmativo pone la simulación en pausa y permite escribir comandos Python. También es posible hacer que esto ocurra en un punto concreto del programa.

La siguiente figura muestra la línea de comandos, en la que se ve cómo accedo a ciertas variables (la presión y la componente X de la velocidad).




Y también como ejecuto un código externo (unas 6 líneas) que realizan el mallado e interpolación de la presión y la muestran en forma gráfica.

Es una gráfica aburrida, pero es la que tenía.


También es posible modificar las variables sobre la marcha, así que es posible hacer cambios en el programa sin recompilarlo. Hay muchas más posibilidades, aún estoy empezando a explorar el invento.

Supongo que es algo muy específico que no motivará a todo el mundo, pero a mí estas cosas me ponen.

A los interesados, puedo pasaros el código.

No hay comentarios:

Publicar un comentario