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).
The code for implementing vorticity confinement is relatively simple. For 2D I used the snippet provided by Iam0x539 in this video.
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.
Jason.
hi, i like your blog, i have a question, that perhaps can be answered by reading another post, but i´m so lazy ….the question is which tool do you use for drawing the simulations?, in which language is written? the syntax is very similar to Pascal… anyway thank you for reading this, if you don´t understand something i will write it again (because English is not my native language)
The images and movies are created with Visions of Chaos. Yes, that snippet is Pascal (Object Pascal to be exact).
ohh i see… thanks for the reply!
keep up the good work!