Saltar a contenido

2026

Modelo de autómata celular de la evolución de la topografía

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 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.

Fluvial landsculptiong and the fractal dimension of topology
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.

Evolución de la topografía

En cada evento, un punto se escoge al azar y se evoluciona \(h(x,y)\) de la siguiente manera:

  1. 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.

  2. 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.

  3. Deposición de sedimentos: si la concentración de sedimientos excede un límite se produce deposición de este exceso de material.

Reimplementación del modelo

El repositorio que contiene my aproximación en Python está aquí, y éste es un ejemplo de la evolución de la topografía:

Evolution of topology by fluvial erosion
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 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ámina de sistemas realmente muy complejos con un número mínimo de parámetros.

...

POV-Ray como herramienta de visualización

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.

Sobre POV-Ray

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.

Sobre FFmpeg

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:

ffmpeg -framerate 10 -i image%04d.png -c:v libx264 -pix_fmt yuv420p output.mp4

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.

Integrándolo todo con Python

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:

  1. Una lista de templates, prototipos de objetos que queremos representar
  2. Una colección de objetos, donde especificamos el tipo de objeto (la template a la que pertenecen) y su posición.
  3. 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.
class PovSpace:

    def __init__(self, palette):
        self.templates = {}
        self.objs = []
        self.current = 1
        self.palette = palette

La clase PovSpace contiene un método, generate, que crea el contenido del fichero .pov a partir del contenido del objeto:

    def generate(self):

        out = header
        out += self._generate_templates()
        out += self._generate_boxes()
        return out

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.

def run_pov(ps, filename, full_hd=False, quality=9, view=True)

Con estos métodos, podemos generar todos los fotogramas necesarios para crear el vídeo de arriba usando un script muy sencillo:

basename = "ald{:04d}.pov"

index = 1

ps = PovSpace(palette)
ps.add_box((0,0,0), (8,2,16), "grey")
index = grow_cycle(ps, index, 2, 0.25, "red", basename)

ps = PovSpace(palette)
ps.add_box((0,0,0), (8,2,16), "grey")
ps.add_box((0,2,0), (8,0.25,16), "red")

index = add_n(ps, index, 10)

index = grow_cycle(ps, index, 2.25, 0.5, "green", basename)

ps = PovSpace(palette)
ps.add_box((0,0,0), (8,2,16), "grey")
ps.add_box((0,2,0), (8,0.25,16), "red")
ps.add_box((0,2.25,0), (8,0.5,16), "green")

index = add_n(ps, index, 10)

index = grow_cycle(ps, index, 2.75, 0.25, "blue", basename)

ps = PovSpace(palette)
ps.add_box((0,0,0), (8,2,16), "grey")
ps.add_box((0,2,0), (8,0.25,16), "red")
ps.add_box((0,2.25,0), (8,0.5,16), "green")
ps.add_box((0,2.75,0), (8,0.25,16), "blue")

index = add_n(ps, index, 10)

...

Papers favoritos: la primera aplicación del método de Monte Carlo al estudio de la materia

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 pque 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.

Modelo de superficie
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 require 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.

...

Primer post

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 objectivo 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:

plugins:
  - privacy
  - blog
  - rss
Y extensiones para trabajar con ecuaciones.

...