Dinámica de fluidos en Javascript

Inspirado por un ejemplo portado por Oliver Hunt de C a JS (y frustrado porque no se me ocurría como resolver el nivel Ophanim en Manufactoria 😀 ), decidí portar mi código de simulación de fluidos mediante Lattice Boltzmann (LB) a Javascript y agregarle interactividad. La visualización es algo primitiva, ya que me concentré en optimizar los cálculos sin prestarle mucha atención a la optimización del manejo de canvas; posiblemente mejore ese aspecto en una próxima versión.

El código presenta algunas limitaciones propias de utilizar una grilla de 64 X 64 como base (el máximo tamaño con performance “realtime“) y, muy probablemente de mi desconocimiento sobre como optimizar los parámetros de LB. Es particularmente clara la compresibilidad del fluido y no es muy difícil hacer “explotar” la simulación (se recupera mediante un reset).

Como WordPress no permite incluir código Javascript en los posts, para visualizar la simulación pueden hacer click en la imagen de referencia de los controles.

Referencia de los controles de la simulación. Hacer click para arrancar la simulación.

El uso de los controles es muy simple:

  • Play/pause: arranca o detiene la simulación.
  • Reset: reinicia la simulación desde cero.
  • Visualization reset: reinicia la visualización, creando una nueva serie de partículas para marcar el movimiento del fluido (sin alterar el estado del mismo).

Para darle un impulso a una parte del fluido basta con arrastrar sobre el área de visualización.

En un posterior post incluiré detalles acerca de como funciona LB y de las optimizaciones realizadas (tengo que leer más, sobre todo respecto a la conexión con los valores físicos 😀 ).

Advertisements

6 thoughts on “Dinámica de fluidos en Javascript

  1. Demian says:

    58 FPS! A mi me tira aproximadamente 18 en Chrome (en Firefox ni me animé a correlo jeje).

    Se ve bien la simulación, auqnue sospecho que lo debo estar viendo mucho más lento de lo que tendría que ser =P

    • mchouza says:

      Acá en el trabajo, con un CPU más lento que el de casa pero Intel, me llega a 79 FPS. V8 debe estar optimizada para Intel.

      Tendría que probar con Web Workers, así uso los múltiples cores… 😀

      • Demian says:

        Seguramente esté optimizado. Igual, el que tengo es un Intel… pero es un Atom, bastante más lento que algo “de escritorio”.

        Lo de los WebWorkers estaría bueno. Sería interesante ver si en las implementaciones actuales las ventajas de trabajar paralelamente superan a los costos de la sincronización entre threads =P.

        El problema de Lattice Boltzmann es relativamente paralelizable?

      • mchouza says:

        El problema de Lattice Boltzmann es relativamente paralelizable?

        Si, es una de las ventajas de este algoritmo.

        Las implementaciones de dinámica de fluidos basadas en resolver directamente una versión discretizada de Navier Stokes, como la que linkeaba al principio del post, requieren resolver un sistema de ecuaciones lineales. Eso complica la paralelización.

        Lattice Boltzmann solo tiene que manejar los “flujos” entre los distintos subdominios. Como el borde de un subdominio (de forma razonable) con N celdas tiene en el orden de sqrt(N) celdas, es un problema relativamente simple de paralelizar.

        Más detalles cuando encuentre el tiempo para implementarlo 😀

  2. tuankuranes says:

    wondering if you did get further on fluid on webgl path. noticed a webpage on your google code on that, but cannot make it work ?
    ( LBFluidSim)

    Several methods on opengl, but depends on float textures, which is a not very well supported webgl extension. need to encode float in rgba I guess.
    http://prideout.net/blog/?p=58 (nice + 3d code)
    http://prideout.net/blog/?p=66 (nice + code)
    http://artis.imag.fr/Membres/Martin.Guay/ (fastest + code)

    • mchouza says:

      I haven’t worked with WebGL for the last few months. The code you saw is an unfinished port of the code of this post (a Lattice Boltzmann simulation).

      My best WebGL simulation is this Schrödinger equation one but, as the equation is linear, it’s not as interesting as a fluid simulation.

      Now I’m working on a new (Eulerian) fluid simulation using WebGL. I hope to win the battle against procrastination 😀 Thanks for your interest and the very nice links (both here and in your tweets)!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s