Eulerian fluid simulations simulate the flow of fluids by tracking fluid velocity and density over a set of individual (discreet) evenly spaced grid locations. One downside to this approach is that the finer details in the fluid can be smoothed out, so you lose those little swirls and vortices.
A simple fix for this is to add Vorticity Confinement. If you read the Wikipedia page on Vorticity Confinement you may be no wiser on what it is or how to add it into your fluid simulations.
My explanation of vorticity confinement is that it looks for curls (vortices) in the fluid and adds in velocity to help boost the swirling motion of the fluid. Adding vorticity confinement can also give more turbulent looking fluid simulations which tend to be more aesthetically pleasing in simulations (unless you are a member of team laminar flow).
function Curl(x,y:integer):double; begin Curl:=xvelocity[x,y+1]-xvelocity[x,y-1] + yvelocity[x-1,y]-yvelocity[x+1, y]; end; procedure VorticityConfinement(vorticity:double); var dx,dy,len:double; x,y:integer; begin for y:=2 to _h-3 do begin for x:=2 to _w-3 do begin dx:=abs(curl(x + 0, y - 1)) - abs(curl(x + 0, y + 1)); dy:=abs(curl(x + 1, y + 0)) - abs(curl(x - 1, y + 0)); len:=sqrt(sqr(dx)+sqr(dy))+1e-5; dx:=vorticity/len*dx; dy:=vorticity/len*dy; xvelocity[x,y]:=xvelocity[x,y]+timestep*curl(x,y)*dx); yvelocity[x,y]:=yvelocity[x,y]+timestep*curl(x,y)*dy); end; end; end;
The VorticityConfinement procedure is called once per simulation step. It looks for local curl at each fluid grid point and then increases the local x and y velocities using the curl. This is what helps preserve the little vortices and helps reduce the smoothing out of the fluid.
To demonstrate how vorticity confinement changes a fluid simulation, the images within this post and the following movie add vorticity confinement to my previous Eulerian MAC Fluid Simulations code.
Eulerian MAC Fluid Simulations with Vorticity Confinement is now included in the latest version of Visions of Chaos.