在基于Stam 的论文的流体模拟中,流体被建模为密度网格。密度“通常取零到一之间的值”,但可以更大。边界的实现基本上如本文所述:
实现内部边界的一种简单方法是分配一个布尔网格,该网格指示哪些单元格被对象占用。然后我们只需在 set_bnd() 例程中添加一些代码,以根据其直接邻居的值填充被占用单元格的值。
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;
密度法适用于空气、火或烟等可压缩流体。有没有一种方法可以改变边界例程,使密度(仅限于一种流体)限制为一个值,例如 1?这将代表一个完全充满水颗粒的细胞。大于 1 的密度必须被推到相邻的单元格。Stam 列出了扩展的想法,但不包括如何:
另一个扩展是使用这个解算器作为动画水流的基础。在这种情况下,有两种密度不同的流体:水和空气。空气通常不建模,求解器更难实现,原因如下:水流体的域随时间变化,必须以某种方式进行跟踪,并且必须在界面处应用正确的边界条件。可以使用像 Foster 和 Metaxas [Foster96] 所做的那样简单地穿过流体的粒子来跟踪水域,也可以使用粒子和水平集的组合来跟踪 [Foster01,Enright02]。