Este año buena parte de nuestros proyectos se han centrado en la integración de la
inteligencia artificial, ya sea algoritmos o directamente agentes basados en LLMs, con
reactores experimentales para el crecimiento de materiales (en mi caso actualmente se traduce en reactores de ALD). La promesa es que estos sistemas pueden acelerar la investigación de nuevos procesos.
Una de las lecciones que he aprendido durante los últimos años es la importancia de poder optimizar y evaluar las capacidades de la IA antes de integrarlas con los experimentos. Esto ha motivado la creación del paquete de Python aldenv. aldenv implementa una serie de modelos sencillos de ALD que incorporan algunas de las características que aparecen cuando caracterizamos procesos reales en el laboratorio, como la presencia de ruido en las medidas o procesos que no son completamente autolimitados.
La física de estos modelos es bastante sencilla pero captura bien la naturaleza de procesos
autolimitados. aldenv considera la solución en estado estacionario de un proceso de ALD
en el que los pulsos del precursor y el segundo reactivo están completamente separados. Una de las cosas que me hizo feliz fue descubrir que la solución de un modelo general basado en una colección de reacciones cada una de ellas compuesta de un proceso de Langmuir de primer orden e irreversible es analítica. Esto permite integrar las simulaciones con IA de forma muy eficiente.
aldenv es software libre: cualquier persona puede utilizarlo para entender cómo funcionan los procesos de ALD, tratar de optimizar uno de los procesos, y con suerte ganarle a la IA.
En este post me voy a centrar en un modelo muy sencillo que describe la evolución
de la topografía debido a la acción de la erosión fluvial. Los procesos de erosión
tanto del agua como del viento esculpen el paisaje a través de la acción combinada de la
erosión y la deposición de sedimentos. Este es un problema que siempre me ha fascinado, particularmente cuando lo comparas con los mecanismos que influencian la topografía durante
el crecimiento de materiales.
El trabajo original, titulado Fluvial landsculpting and the fractal
dimension of topology, fue publicado en 1991. Es una idealización de
este proceso que utiliza un autómata celular y que por tanto es ideal como proyecto de fin
de semana. Desgraciadamente, la información proporcionada en el paper no es suficiente como
para reproducir las figuras, con lo que lo que voy a implementar es
una reinterpretación de
los conceptos básicos introducidos en el trabajo. El énfasis en las características y propiedades fractales del paisaje es típica de la época, pero en este post no me voy a centrar en ellas.
Figura 1: Este paper presenta un modelo sencillo sobre la evolución de la topografía
debido a la precipitación y la erosión fluvial
Como su título en inglés indica, el modelo se centra en la evolución de la topografía en
condiciones en las que la erosión está dominada por el efecto de la lluvia y el transporte
de sedimentos por el agua. El modelo introduce reglas sencillas que controlan cómo la altura promedio en cada punto de red cuadrada \(h(x,y)\) evoluciona en función del tiempo, con
cada punto representando un área del orden de 1 \(km^{2}\).
En lugar de considerar la evolución coordinada de todos los puntos del paisaje simultáneamente, el modelo considera que la evolución de la topografía se produce como
una secuencia de sucesos independientes, cada uno representando un evento fundamental que
causa la modificación del paisaje.
En cada evento, un punto se escoge al azar y se evoluciona \(h(x,y)\) de la siguiente manera:
Difusión local: las diferencias locales de altura entre los vecinos cercanos se atenúan usando un modelo de difusión. Este proceso representa sucesos locales como la meteorización,
el colapso de terrenos y el movimiento local de sedimientos.
Transporte de sedimentos: si uno de los ocho vecinos tiene una altura inferior al punto escogido, una fracción del terreno es erosionada por el agua y se transporta a la región vecina de menor altura. Este proceso se repite hasta que se llega a un mínimo o se llega al borde de la simulación, acumulando sedimentos en cada paso.
Deposición de sedimentos: si la concentración de sedimientos excede un límite se produce deposición de este exceso de material.
El repositorio que contiene mi aproximación en Python
está aquí, y
éste es un ejemplo de la evolución de la topografía:
Figura 2: Ejemplo de evolución de la topografía usando un autómata celular basada
en el paper de Chase.
Para reproducir una figura similar basta con correr el fichero run.py en el repositorio.
Cada evento comienza con proceso de difusión local. Como en el trabajo original, mi implementación considera un cambio proporcional a la diferencia de alturas entre celdas adyacentes. Sin
embargo, la implementación que he escogido realiza esta homogeneización celda a celda,
escogiendo el orden de los vecinos de manera aleatoria.
En un segundo paso, el modelo calcula la erosión y traza el camino en el que el agua circula, erosionando o depositando material dependiendo de la carga de aluvio o sedimientos. Una diferencia con el trabajo original es que para determinar la
siguiente celda donde se mueve el agua utilizo la pendiente en lugar de la diferencia
de altura. He incluido un parámetro en la clase TopoCA que permite
escoger cualquiera de las dos opciones.
El resultado es que cuando los parámetros se escogen de manera juiciosa, este modelo
sencillo obtiene resultados como el de la figura, en el que la erosión en terrenos altos
se compensa con la redeposición de sedimentos en terrenos bajos de baja pendiente. También
es posible alcanzar resultados completamente incorrectos, sobre todo cuando aumentamos
la cantidad máxima de sedimentos que el agua puede transportar, principalmente debido
a lo simplificado que es el modelo de sedimentación cuando el agua alcanza un mínimo local.
Finalmente quiero recalcar que la intención de estos modelos sencillos no es reproducir de manera exacta los resultados
experimentales (de hecho, hay modelos mucho más sofisticados hoy en día) sino reproducir
la dinámica de sistemas realmente muy complejos con un número mínimo de parámetros.
En este post me voy a centrar en cómo usar POV-Ray, Python y ffmpeg como herramientas
de visualización. Recientemente, como parte de las actividades de una jornada de puertas
abiertas, decidimos añadir una visualización en un monitor que teníamos disponible que
ayudara a explicar la síntesis de materiales usando reacciones autolimitadas. El resultado
es el siguiente vídeo, el producto de jugar unas horas con POV-Ray, Python y ffmpeg para conseguir generar animaciones sencillas de manera automática.
POV-Ray (Persistence of Vision Ray-tracer) es un programa de raytracing de software libre.
Las animaciones se construyen usando scripts, tradicionalmente con la extensión .pov.
El usuario define una cámara, iluminación y el contenido de una escena en la que se describen los objetos y sus texturas. Cada imagen generada por POV-Ray es un fotograma
de la animación.
La idea es usar POV-Ray para generar una secuencia de imágenes y convertirlas luego en una animación. Para esta segunda parte del proceso decidí usar el programa FFmpeg.
FFmpeg es un programa para crear y convertir vídeos. Desde la línea de comandos, es posible
generar un vídeo en formato mp4 a partir de una colección de imágenes usando el siguiente
comando:
Esta instrucción coge una secuencia de ficheros image%04d.png (por ejemplo image0001.png, image0002.png) y genera un vídeo usando diez fotogramas por segundo.
Una vez escogidas estas dos herramientas, lo único que falta es automatizar el proceso para generar cientos de fotogramas de manera automática. Para ello, Python es perfecto.
El objetivo es generar los ficheros .pov de manera automática a partir de una colección de objetos. Para ello decidí crear una clase PovSpace que contiene los siguientes elementos:
Una lista de templates, prototipos de objetos que queremos representar
Una colección de objetos, donde especificamos el tipo de objeto (la template a la que pertenecen) y su posición.
Una paleta que permite asociar colores específicos (en el espacio RGB) con nombres sencillos, de manera que podamos definir "verde" como (0,0.9,0). POV-Ray usa una escala
de 0 a 1 en lugar de 0 a 255.
Finalmente, una función run_pov coge un objeto de la clase PovSpace y se encarga
de crear el fichero, ejecutar POV-Ray y opcionalmente visualizar el resultado.
En 1953 Metropolis, Rosenbluth, Rosenbluth, Teller y Teller publicaron el primer trabajo
en el que describen el llamado método de Metropolis para calcular las propiedades de
sistemas en equilibrio. Titulado Equation of State Calculations by Fast Computing Machines, establece el llamado método de Metropolis, un proceso basado
en números aleatorios que permite evolucionar un sistema complejo hasta alcanzar
el estado de equilibrio y por tanto extraer sus propiedades acumulando estadísticas
de una manera que satisface las condiciones de equilibrio.
Un gran paper
Es un paper fantástico: a pesar de que tiene más de 70 años, entender este trabajo es
entender una buena parte de la física estadística y de los métodos que se utilizan
para explorar las propiedades de los diferentes estados de la materia.
En el apartado "así se escribe la historia", aunque el algoritmo se llama método de Metropolis, la contribución de Metropolis es principalmente el ordenador en el que
se corre el algoritmo, el MANIAC de Los Alamos, descendiente del ENIAC. El desarrollo
y la implementación del algoritmo corresponden a Marshall y Arianna Rosenbluth, quienes
continuaron explorando sistemas físicos en trabajos posteriores. Teller contribuyó
ideas fundamentales incluyendo el énfasis en explorar el problema desde la perspectiva
de la física estadística, pero no se dedicó extensivamente a estudiar este método.
Cosas que me parecen fascinantes de este trabajo:
El algoritmo se puede reimplementar fácilmente.
Cada iteración tardaba 3 minutos, y cada punto en el paper era el trabajo de al menos un día
completo.
Aunque el método de Metropolis establece que la probabilidad de transicionar de un estado
a otro depende exponencialmente de la diferencia de energía, el sistema que exploran, basado en un potencial de esferas duras, no requiere el cálculo de exponenciales. Aparte
de la importancia de este sistema, es
sin duda una elección práctica para acelerar el algoritmo.
Conceptos avanzados, como el desarrollo del virial de la ecuación de estado de un fluido y
su expansión diagramática se dan prácticamente por sentado. Por eso entender algunos de los resultados del artículo requiere unos buenos mimbres teóricos.
Arianna Rosenbluth era una máquina programando los primeros ordenadores.
Este sitio usa Materials for Mkdocs. Uno
de los motivos por los que me decidí a usarlo es por su integración con Markdown. Otros
generadores de sitios web que uso actualmente o he llegado a usar son los siguientes:
sphinx: Es el paquete estándar para escribir
documentación en Python pero también permite generar sitios estáticos. Sphinx es la forma
más común de escribir documentación e integrarla con sitios como Read The Docs. Genera webs estáticas.
jekyll: También funciona con Markdown. Su integración con github
es fantástica y tiene plugins bastante interesantes. El único inconveniente es que se basa en Ruby. Lo sigo usando para otros proyectos. Genera webs estáticas.
Nikola: Es un generador de sitios estáticos en Python. No lo he
llegado a usar mucho.
Pelican: Otro generador de páginas web estáticas. He jugado
con él pero nunca me ha atraído mucho su estética.
Wordpress: Dinámico, basado en PHP y uno de los más conocidos.
Lo he usado siempre con hosting sites que te proporcionan una distribución y un mínimo
mantenimiento. Volví a él después de casi veinte años y casi me tiro por la ventana con
algunas de las opciones más modernas.
html+css: Crear un sitio sencillo directamente en
html y css no es difícil, siempre y cuando no te importe el prueba y error. Está bien
mantener un mínimo conocimiento de html si eres un científico. Algunos programas como
pandoc te permiten convertir tex o Markdown directamente a html.
Mi objetivo es explorar Materials for Mkdocs y ver si merece la pena usarlo en otros
de mis sitios. Si me canso, borrón y cuenta nueva. De momento, he mantenido la configuración
lo más sencilla posible, actualmente tengo sólo los siguientes plugins: