Resumen
Simulador de fluidos construido enteramente por mí desde cero en Rust como proyecto de investigación e ingeniería. El solver interactivo 2D utiliza Smoothed Particle Hydrodynamics débilmente compresible (WCSPH) para modelar densidad, presión, viscosidad, tensión superficial, gravedad e interacción con los límites sin depender de una malla interna fija. El proyecto supuso un reto importante de algoritmia y optimización: diseñar la búsqueda de vecinos, la organización de datos y la ejecución paralela necesarias para mantener la simulación fluida a 60 FPS.
Un simulador de fluidos construido enteramente desde cero
Diseñé e implementé este simulador completamente por mi cuenta y desde cero como proyecto universitario de modelado. Explora cómo traducir un modelo continuo de fluidos a un método numérico basado en partículas. El simulador representa un líquido 2D mediante partículas que transportan posición, velocidad, masa, densidad y presión, haciendo visible el comportamiento y manteniendo explícita la relación con las ecuaciones de continuidad y cantidad de movimiento. El proyecto conecta la implementación computacional con conceptos de ingeniería química y requirió construir como un único sistema el núcleo de simulación, los métodos numéricos, las estructuras de datos y el renderizado interactivo.
Smoothed Particle Hydrodynamics débilmente compresible
El solver utiliza WCSPH, una formulación lagrangiana y sin malla que reconstruye los campos locales mediante sumas ponderadas sobre partículas vecinas. La densidad se estima con un kernel Poly6, la presión procede de una ecuación de estado de Tait y las fuerzas de presión utilizan el gradiente simétrico de un kernel Spiky. El modelo también incluye viscosidad laminar, tensión superficial a partir de un campo de color, gravedad, fuerzas de contorno y suavizado de velocidad XSPH.
Un reto de algoritmia y optimización diseñado para 60 FPS
La parte más costosa de SPH es evaluar las interacciones entre partículas cercanas. Diseñé la grilla espacial uniforme que asigna partículas a celdas y solo visita las nueve celdas colindantes al buscar vecinos. Esto reduce en la práctica el coste de cada paso frente a un enfoque ingenuo de todos contra todos y permite una ejecución interactiva. Los pasos de densidad, aceleraciones e integración se paralelizan con Rayon. Elegir la organización de datos, eliminar trabajo innecesario y equilibrar el paso de simulación con el renderizado fue un reto importante de algoritmia y optimización, con el objetivo concreto de mantener una experiencia fluida a 60 FPS.
La estabilidad forma parte del modelo
La simulación utiliza un paso temporal fijo de 1/240 segundos, límites de aceleración y velocidad, protecciones de densidad, amortiguación de contorno, restitución y corrección XSPH. Estos controles mantienen estable el solver WCSPH durante la interacción en tiempo real y hacen explícito el compromiso: es un simulador interactivo con fundamento físico, no un paquete CFD de producción. El proyecto documenta dónde termina la estabilización numérica y dónde empieza el modelado físico.
El proyecto completo está hecho por mí desde cero
No hay un motor de fluidos preexistente detrás de la demo: construí personalmente el núcleo de simulación, los kernels, la búsqueda de vecinos, el bucle de integración, los límites, los emisores, las estadísticas, el modelo de interacción y el renderizado. Rust proporciona el núcleo, Rayon aporta paralelismo de datos y nannou renderiza el campo de partículas. La aplicación incluye un emisor, depósitos superior e inferior, una configuración de caja abierta, estadísticas en tiempo real y controles para atraer o repeler el fluido. El artículo técnico que acompaña al proyecto conecta directamente las ecuaciones con el código e identifica futuras mejoras como pasos adaptativos basados en CFL, validación con benchmarks y esquemas más cercanos a la incompresibilidad.