Mi modelo incendiaba el Atlántico
Dos días para improvisar una herramienta que prevé un incendio — y mucho más tiempo para descubrir todo lo que tenía mal
El jueves 23 de julio, una furgoneta se incendia en una carretera departamental en Biscarrosse (en las Landas, departamento del suroeste de Francia). A las 15:45 las llamas pasan al macizo forestal, y en tres días se evacúa a 30 000 personas. Como todo el mundo, sigo aquello en mapas de puntos rojos, y una pregunta se instala — el tipo de pregunta que uno no se atreve a formular del todo mientras no sabe responderla: ¿y si fuera hacia el Blayais?
El Blayais es la central nuclear situada en la orilla derecha del estuario de la Gironda, a unos cincuenta kilómetros al norte de Burdeos. Un mapa de puntos rojos no responde a esa pregunta. Muestra dónde está el fuego. Nunca adónde va.
Entre ambas cosas hace falta un modelo. Quise ver hasta dónde se podía improvisar uno honesto en dos días. El resultado existe, funciona y se puede consultar aquí:
👉 kokusho.ss2i.ca — el mapa es público y se actualiza con cada nuevo cálculo.
Herramienta experimental, sin ningún valor oficial. En caso de incendio, la única fuente que da fe es la prefectura (la representación del Estado en cada departamento francés).
Pero esa no es la parte interesante de la historia. La parte interesante es la lista de todo lo que tuvo mal — y sobre todo, con qué se dejó atrapar cada error.
La primera decisión es moral, no técnica
Una herramienta como esta puede mostrar dos cosas muy distintas. La primera:
«El fuego alcanzará la central dentro de 17 horas.»
Es nítido. Es accionable. Y es una estafa. Para escribir una frase así, habría que conocer la posición exacta del frente, el viento de las próximas diecisiete horas, la sequedad real de los combustibles y la eficacia de los equipos de extinción. No conozco ninguno de esos cuatro elementos. Nadie los conoce.
La segunda se parece más bien a esto:
«De 200 escenarios simulados, 6 llevan el fuego a la zona ampliada alrededor de la central, como muy pronto dentro de 29 horas. El viento previsto es transversal al eje del emplazamiento. Confianza baja: última detección satelital hace 5 horas.»
Es bastante menos satisfactorio de leer. Es verdad.
Todo lo demás se deriva de esa elección. La herramienta nunca traza una trayectoria; dibuja envolventes — el término consagrado para esos contornos que delimitan la zona alcanzable — a 6, 12, 24 y 48 horas, en tres niveles de plausibilidad decreciente: la zona alcanzada en más de un escenario de cada dos, la alcanzada en uno de cada diez, y la envolvente extrema que solo se cruza en un escenario de cada cien, aquel en el que todo sale mal a la vez.
Y se niega a resumir la situación en una única cifra. Da tres, por separado: el nivel de amenaza, la confianza que se puede otorgar a ese juicio, y la frescura de la última observación. Porque un «verde» calculado con datos de cuatro horas de antigüedad no es una buena noticia: es un vacío de información. Un satélite que no ve nada no demuestra que el fuego se haya detenido — demuestra que no ve nada.
Los ladrillos, y lo que hacen de verdad
Haz clic en las figuras para abrirlas en grande.
Ver el fuego: FIRMS y VIIRS. La NASA difunde gratuitamente, casi en tiempo real, las detecciones térmicas de sus satélites — el servicio se llama FIRMS, y los sensores que uso, VIIRS, dividen el suelo en píxeles de 375 metros. Los prefiero a MODIS, más antiguo y cuatro veces más grueso.
Hay que entender bien qué es una detección FIRMS: un píxel cuya temperatura de superficie es anómala. No un contorno de incendio. Con retraso, con huecos cuando no pasa ningún satélite, y nada en absoluto cuando el humo o las nubes tapan la vista. Este matiz gobierna todo el resto del artículo.
Saber qué lo empuja: AROME, OSM, MDT. Tres ingredientes hacen avanzar un fuego. El viento en primer lugar, que pesa mucho más que el resto: lo tomo de AROME, el modelo de malla fina de Météo-France (el servicio meteorológico nacional francés), y no en un único punto sino muestreado sobre todo el dominio — un incendio de este tamaño atraviesa varias mallas, y el viento puede girar localmente. La vegetación después, extraída de OpenStreetMap: un pinar seco arde, un estanque no, una viña apenas. El relieve por último, a través de un modelo digital del terreno — un archivo de altitudes, sencillamente — porque un fuego sube una pendiente mucho más deprisa de lo que la baja.
Hacerlo avanzar: el autómata celular. El corazón del cálculo lleva un nombre erudito para una idea sencilla.
Autómata celular — se divide el espacio en celdas regulares, aquí cuadrados de 150 metros, y se da una regla que dice cómo el estado de una celda depende de sus vecinas. Se aplica la regla en todas partes, se avanza un paso de tiempo, se vuelve a empezar. El Juego de la vida de Conway es el ejemplo más conocido.
Mi regla: una celda en llamas intenta prender a sus ocho vecinas, tanto más deprisa cuanto más inflamable es la vegetación, más sube la pendiente y más empuja el viento en esa dirección. El frente adopta espontáneamente una forma elíptica alargada a sotavento — lo que los bomberos observan sobre el terreno, y lo que los modelos reproducen desde los años 1980.
Aceptar que no se sabe: Montecarlo. Es el punto que lo cambia todo.
Método de Montecarlo — en lugar de calcular una sola vez con los mejores valores posibles, se rehace el cálculo cientos de veces sorteando, cada vez, los parámetros que se conocen mal. Después se mira la distribución de los resultados. El nombre viene del casino, y el método, de la bomba atómica — Ulam y von Neumann, 1946.
Lanzo pues 200 sorteos. Cada vez perturbo lo que es realmente incierto: el error de previsión del viento — que crece con el plazo y se mantiene correlacionado en el tiempo, porque una previsión equivocada lo es de forma duradera y no una hora de cada dos — el error de mi propio modelo de velocidad, la sequedad real de los combustibles y la aparición de saltos de fuego, esas brasas proyectadas por delante del frente que cruzan una carretera o un cortafuegos.
Lo que se muestra después ya no es una previsión sino un recuento: esta celda ardió en 150 de mis 200 mundos posibles, aquella en 3. Es la misma lógica que el cono de incertidumbre de las trayectorias de los ciclones.
Una precisión que importa: esas frecuencias no son probabilidades en el sentido actuarial. Son frecuencias condicionadas a mis hipótesis. Si mis hipótesis son malas, mis porcentajes también lo son. Tenlo en cuenta — el resto del artículo no habla prácticamente de otra cosa.
Primer resultado: un fuego perfectamente inmóvil
Primer lanzamiento con los datos reales. Cae el informe: superficie nueva quemada al cabo de 6 horas, 103,5 hectáreas. Al cabo de 12 horas: 103,5 hectáreas. Con precisión de una décima de hectárea.
Un fuego que no gana ni un metro en seis horas bajo 17 km/h de viento es falso. Y mis 200 sorteos, que se suponía que exploraban mundos distintos, daban todos rigurosamente el mismo resultado — lo que es aún más sospechoso.
La causa estaba en una elección de índice. Cuando calculaba la velocidad de paso de una celda a su vecina, tomaba la velocidad de la celda fuente, la que ya arde. Ahora bien, marco toda la superficie ya recorrida como «cicatriz», con una velocidad de propagación casi nula — lo cual es correcto: una zona ya quemada no vuelve a arder fácilmente.
Salvo que el fuego parte forzosamente de la superficie ya quemada. Todas mis celdas fuente eran cicatrices, y por tanto incapaces de transmitir nada. El fuego era prisionero de su propio perímetro.
La corrección cabe en una palabra: tomar la velocidad de la celda objetivo, aquella cuyo combustible está a punto de consumirse. Además es físicamente más justo — un fuego avanza a la velocidad que le permite lo que ataca, no lo que ya ha quemado. Bonificación inesperada: también corrige el cruce de las masas de agua, que una celda fuente combustible podía atravesar.
Luego miré el mapa más de cerca
La herramienta funcionaba, las envolventes se extendían con elegancia, las cifras parecían plausibles. Las miré un rato antes de hacer lo que debería haber hecho desde el principio: abrir el mapa de entrada, el que usa el modelo, y mirarlo de verdad.
Había un problema. El modelo hacía arder el mar.
Y era cierto. Aquí está el mapa de combustible — la imagen que le dice al autómata, para cada celda, a qué velocidad puede avanzar el fuego allí. A la izquierda lo que veía mi programa, a la derecha la realidad:
Toda la masa verde oscuro de la izquierda es el Atlántico. Clasificado como pinar.
La razón es casi divertida. OpenStreetMap no cartografía el océano como una superficie. No existe ningún polígono «Atlántico»: los contribuidores han trazado la línea de costa — en la jerga de OSM, un camino etiquetado natural=coastline — es decir, una línea, no una superficie. Mi consulta, en cambio, buscaba superficies. Recuperaba concienzudamente los lagos, los estanques y los ríos, todos polígonos, y el mar abierto no correspondía a nada.
Ahora bien, fuera de un polígono reconocido, mi programa supone pinar. Era una elección deliberada: en el macizo forestal de las Landas domina el pino marítimo, y equivocarse del lado de «esto arde» sesga el modelo hacia el lado prudente. Salvo que aplicar esa prudencia al 40 % del dominio de cálculo ya no se llama prudencia. En este mapa, el agua pasa del 3,4 % al 40,7 % una vez corregido: más de un tercio de mi zona de trabajo era océano inflamable.
Mi primera corrección recuperaba la línea de costa y recortaba el dominio con ella — perfecto en mi prueba aislada. En condiciones reales, fracaso: tres consultas de doce al servidor de OpenStreetMap volvieron con error, la línea quedó agujereada, y una línea agujereada no recorta nada. El mar volvió a ser combustible.
La buena solución estaba en otra parte, y explota una convención de OpenStreetMap: cuando se traza una costa, la tierra está siempre a la izquierda del sentido de trazado. Basta entonces, para cada celda, con encontrar el segmento de costa más cercano y mirar de qué lado cae — un simple producto vectorial. A la izquierda la tierra, a la derecha el mar. Un hueco en los datos ya solo cuesta la precisión local alrededor del hueco.
Solo supe que mi primera corrección había fracasado porque me había tomado la molestia de hacer gritar al programa. Cuando no conseguía reconstituir el mar, escribía negro sobre blanco en su informe: «línea de costa presente pero imposible deducir de ella la extensión del mar: el mar abierto corre el riesgo de tratarse como combustible». Un modelo que falla en silencio miente. Un modelo que falla ruidosamente se deja reparar.
La pregunta incómoda: ¿funciona?
A estas alturas, la herramienta producía bonitos mapas. Un bonito mapa nunca ha demostrado nada.
Y tenía a mano con qué ponerla en evidencia: el incendio duraba ya varios días, así que su propio pasado estaba disponible. En lugar de esperar a ver si las próximas previsiones acertaban, mejor repetir las que se habrían podido hacer dos días antes y mirar cuánto valían. Es un método conocido, y tiene nombre: la retroprevisión.
Retroprevisión (o hindcast) — uno se sitúa en un instante del pasado, conserva solo los datos disponibles en esa fecha, simula hacia delante y luego compara con lo que ocurrió realmente. Es la manera estándar de evaluar un modelo de previsión cuando uno no puede permitirse esperar.
Me sitúo pues en la mañana del 24 de julio, descarto todo lo observado después, simulo doce horas y comparo con lo que realmente ardió. Luego vuelvo a empezar el 25. Dos ejecuciones, un puñado de minutos de cálculo — y con mucha diferencia la mejor relación entre el esfuerzo invertido y lo que me enseñó.
La mañana del 24, cuando el fuego corría libremente, el modelo sobrepredice por un factor de 1,7. Para un modelo de propagación es honorable — se está en el orden de magnitud correcto. El 25, cuando los equipos de extinción retomaban el control del frente: factor 12,3.
Lo interesante no es que el modelo se equivoque. Es por dónde pasa la diferencia entre las dos jornadas. El modelo no se volvió malo de un día para otro: mismo código, mismo viento, mismo bosque. Lo que cambió entre el 24 y el 25 fueron los medios de lucha.
Mi programa no los ve. No sabe nada de los efectivos desplegados, ni de las líneas de apoyo — esos cortes que los bomberos abren con bulldozer para detener el frente — ni de las descargas aéreas. Calcula por tanto, sin que yo lo haya decidido explícitamente, un contrafactual sin lucha: lo que haría el incendio si nadie se le opusiera. El 25, la física sola daba 22 758 hectáreas; el fuego solo recorrió 1 645, porque hubo gente que se lo impidió.
Hay un consuelo en esas cifras, y es importante. Cabe en una medida que se llama AUC.
AUC, por área bajo la curva ROC — mide la calidad de una clasificación, independientemente de los valores absolutos. Si tomo al azar una celda que ardió y una que no ardió, el AUC es la probabilidad de que el modelo haya clasificado mejor la primera. 0,5 = cara o cruz, 1 = clasificación perfecta.
Mi AUC vale entre 0,96 y 0,98 en ambos casos — mientras el sesgo de superficie, por su parte, varía por un factor de siete. Dicho de otro modo: el modelo sabe muy bien adónde va el fuego, y se equivoca gravemente sobre cuánto. Es el mejor modo de fallo posible, porque un error de escala se calibra, mientras que un error de dirección condena la herramienta.
Lo que me lleva a la decisión menos intuitiva de todo este bricolaje. Tenía un factor de ajuste listo: frenar la propagación lo justo para volver a caer en el 25 de julio. No lo apliqué. Sería grabar en el modelo la hipótesis «la lucha siempre tiene éxito» — precisamente aquella de la que no hay que fiarse delante de una central nuclear. La herramienta, por lo demás, se niega por sí misma a publicar un factor global cuando sus casos de validación son demasiado heterogéneos, y explica por qué en lugar de promediar dos regímenes incomparables.
Lo que no hace — y es lo más grave
La peor limitación no es ninguna de las que acabo de contar. Cabe en una palabra: el acoplamiento es de sentido único. La meteorología gobierna el fuego; el fuego nunca modifica la atmósfera.
Ahora bien, un gran incendio fabrica su propia meteorología. Es la piroconvección: la columna de aire sobrecalentado que envía hacia el cielo puede subir varios kilómetros y formar un pirocumulonimbo, una auténtica nube de tormenta nacida del propio fuego. Produce rayos secos que encienden focos a decenas de kilómetros, y puede colapsar de golpe, abatiendo contra el suelo una ráfaga violenta, en una dirección cualquiera.
Es exactamente lo que hace escapar a los fuegos que se creían contenidos, y es independiente del viento sinóptico — el viento de gran escala, el que prevé AROME. Por tanto, invisible para mi modelo. Existe un verdadero acoplamiento fuego-atmósfera, lleva nombres como Meso-NH/ForeFire o WRF-SFIRE, y exige medios de cálculo de laboratorio. Fuera de alcance.
El compromiso: no simular el fenómeno, sino evaluar su potencial. Existe para ello un indicador, el índice de Haines continuo, que combina la inestabilidad del aire en altura y su sequedad — en suma, dice si el cielo «hace chimenea» ese día. Cruzado con la potencia radiativa del fuego, me da una puntuación. Una fracción de mis 200 sorteos, igual a esa puntuación, pasa entonces a régimen piroconvectivo: dirección mucho más incierta, propagación aumentada, saltos de fuego más numerosos y más lejanos. Esos sorteos alimentan naturalmente la envolvente extrema.
Un potencial elevado se lee entonces como «las envolventes amplias se vuelven creíbles», nunca como «va a ocurrir esto».
Otro punto ciego, descubierto viendo llegar la ola de calor de esta semana. Mi humedad de los combustibles finos procede de una fórmula clásica de peligro meteorológico, la de Simard, que solo mira la temperatura y la humedad relativa instantáneas. No tiene ninguna memoria. Ahora bien, tres días a 38 °C secan la hojarasca en profundidad, y el suelo con ella. De ahí este resultado absurdo: mi modelo muestra una humedad de los combustibles que sube el día en que hará 39,8 °C. Subestima por tanto el efecto de una ola de calor. Harían falta índices con memoria, del tipo DMC y DC del índice meteorológico de incendios forestales canadiense, que acumulan el déficit hídrico a lo largo de días y semanas. Es el próximo frente de trabajo.
Entonces, ¿el Blayais?
Haz clic para ampliar — o ve a ver la versión viva en kokusho.ss2i.ca.
La respuesta se mantuvo igual del primer al último cálculo: frente observado a 36 kilómetros, ninguno de los 200 escenarios se acerca a menos de 10 kilómetros, viento que empuja en sentido opuesto. La central nunca estuvo amenazada. Y la herramienta lo dice con sus motivos, no con un veredicto.
El emplazamiento realmente expuesto estaba en otra parte: la base aérea de Cazaux, a 7 kilómetros del foco de Biscarrosse, con hasta un 6,7 % de los escenarios alcanzando su zona ampliada.
Y luego hubo esa última mañana en que Cazaux pasó bruscamente a naranja, con un 96,7 % de los escenarios alcanzando esa misma zona. Espectacular. Y falso.
El satélite no había visto nada desde hacía quince horas. Mi programa había recurrido a su hipótesis de repliegue: a falta de saber dónde se encuentra el frente activo, considerar que todo el perímetro recorrido está activo. El incendio se propagaba, pues, en todas las direcciones a la vez, y mi 96,7 % ya no medía una convergencia hacia Cazaux — medía mi ignorancia. La velocidad de aproximación realmente observada, en cambio, era nula.
Desde ahora, en ese caso concreto, el nivel vuelve a caer en «incertidumbre elevada, ninguna aproximación observada» en lugar de gritar ¡fuego! — salvo si se mide realmente una aproximación, en cuyo caso la alerta se mantiene. Es quizá la corrección de la que estoy más contento: impide que la herramienta convierta una ausencia de información en alerta.
Lo que me llevo de todo esto
Todo esto se improvisó en dos días, y el código no lo tecleé yo: lo hice escribir por una IA. El mismo método que para el descapotable checo hace tres semanas, pero esta vez sobre un tema en el que equivocarse no es anodino.
Lo que no se delega, en cambio, es el resto: decidir que se mostrarían envolventes y nunca una trayectoria, elegir las fuentes, exigir que el modelo se pusiera a prueba con el pasado del incendio y no con pruebas de laboratorio, y volver a abrir el mapa de entrada cuando un resultado olía a falso. La máquina escribe rápido y bien. No sabe qué hay que verificar.
Se encontraron cinco errores de fondo en el modelo. Lo que más me sorprendió fue mirar por medio de qué:
- el fuego prisionero de su cicatriz: por una cifra inverosímil en un informe;
- la rasterización que se atascaba: por un cálculo que ya no devolvía el control;
- el mar combustible: porque acabé mirando el mapa de entrada, el que nadie piensa en abrir;
- la reconstrucción del litoral que no aguantaba en condiciones reales: por un aviso que me había tomado la molestia de escribir para ese caso concreto;
- la falsa alerta naranja: confrontando lo que decía la simulación con lo que decía la observación.
Ninguno fue encontrado por las pruebas automáticas. Tengo sesenta y cuatro, y cada uno de esos bugs tiene ahora la suya — impedirán la regresión. Pero ninguna prueba podía adivinar que OpenStreetMap no cartografía el océano. Las pruebas verifican aquello en lo que ya se ha pensado. Callan sobre el resto.
Lo que funcionó fue el roce con lo real: los datos verdaderos, el mapa verdadero, el pasado verdadero del incendio. La retroprevisión me enseñó más en dos ejecuciones que dos días de desarrollo.
Y su enseñanza principal no era «el modelo se equivoca en tanto». Era: el modelo no responde a la pregunta que yo creía hacerle. Le preguntaba qué iba a hacer este incendio. Me respondía qué haría si nadie se le opusiera.
Es una información útil — es incluso exactamente la que hace falta para saber de qué es capaz un incendio. Pero no es la que uno cree leer en un mapa.
🔥 Ver la herramienta en línea — kokusho.ss2i.ca
Experimental, sin valor oficial. En caso de incendio, la única fuente que da fe es la prefectura: landes.gouv.fr · gironde.gouv.fr.

