Fluid simulation incompressible fluid
<p>In the fluid simulation based on a <a href="http://www.intpowertechcorp.com/GDC03.pdf" rel="nofollow">paper by Stam</a>, fluid is modeled as a grid of densities. The densities "usually take a value between zero and one", but can be greater. Boundaries are implemented essentially as described in the paper: </p>

<blockquote>
  <p>A simple way of implementing internal boundaries is to allocate a Boolean grid
  which indicates which cells are occupied by an object or not. Then we simply have to add
  some code to the set_bnd() routine to fill in values for the occupied cells from the values of
  their direct neighbors. </p>
</blockquote>

<pre><code>int surround = !bound[IX(i+1,j)] + !bound[IX(i-1,j)] + !bound[IX(i,j+1)] + !bound[IX(i,j-1)];
if (!surround) x[IX(i,j)] = 0;
else
    x[IX(i,j)] = ((bound[IX(i+1,j)] ? 0 : x[IX(i+1,j)]) +
                  (bound[IX(i-1,j)] ? 0 : x[IX(i-1,j)]) +
                  (bound[IX(i,j+1)] ? 0 : x[IX(i,j+1)]) +
                  (bound[IX(i,j-1)] ? 0 : x[IX(i,j-1)])) / surround;
</code></pre>

<p>The density method works well for compressible fluids like air, fire, or smoke. Is there a method to change boundary routines so density (limited to one fluid) is limited to a value, such as 1? This would represent say a cell completely full of water particles. Density that would be greater than one would have to be pushed away to neighboring cells. Stam lists ideas for extension but does not include how:</p>

<blockquote>
  <p>Another extension is to use this solver as a basis to animate water flows. In this case there are
  two fluids with different densities: water and air. The air is usually not modeled and the solver
  is harder to implement for the following reason: the domain of the water fluid changes over
  time and has to be tracked somehow and the correct boundary conditions have to be applied
  at the interface. The water region can be tracked using particles which simply move through
  the fluid as done by Foster and Metaxas [Foster96] or can be tracked with a combination of
  particles and level sets [Foster01,Enright02].</p>
</blockquote>