Simulación fluido SPH

Simulación de fluido SPH

Esta es una simulación de fluidos utilizando el método Smoothed-Particle  Hydrodynamics. La idea es simular el líquido como un conjunto de elementos discretos, representados como partículas. Y para determinar el movimiento de cada una, definimos un cierto potencial que depende de las partículas vecinas.

Ver simulación de distintos fluidos

Nota: hay que reconocer que Javascript no es lo más apropiado para este tipo de simulaciones que requieren muchos cálculos, así que es posible que dependiendo del ordenador, móvil o tablet en el que estés viendo esto, la animación podría verse “a saltos”

Para conseguir un mejor rendimiento, el área accesible está dividida en una cuadrícula y las partículas solo pueden interaccionar con aquellas otras que se encuentren en su misma cuadrícula o en las adyacentes. Así ahorramos cálculos inncesesarios con partículas lejanas.

El potencial es repulsivo a muy corta distancia, para evitar que se superpongan las partículas y atractivo a media distancia para simular la cohesión del fluido. Además, líquidos distintos tenderán a no mezclarse (hay un término para eso en el potencial).

A medida que calculamos cada iteración, podemos dibujar las partículas, con lo que se obtiene un monton de bolitas moviéndose por la pantalla. Pero tenemos también la opción de usar pequeños degradados circulares, visibles en el centro y transparentes por el borde. Después de pintar todos los elementos podemos pasar un filtro umbral, asociado a la transparencia, y obtendremos un interesante efecto.

filtro_fluido

He programado 4 experimentos distintos que se van intercambiando al tocar o hacer click en la animación:

  • Petróleo líquido: Simulación con 200 partículas de un líquido negro.
  • Mezcla agua y aceite: Dos líquidos con distintas densidades que comienzan mezclados y terminan separándose.
  • Petróleo partículas: La misma simulación del principio pero sin el aspecto de líquido y el doble de partículas (400).
  • Ketchup y mostaza: Dos líquidos viscosos, uno en cada lado.