0

在基于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]。

4

1 回答 1

1

我认为您应该说“具有自由表面的不可压缩流动”。

这是一个难题,因为您必须根据空间和时间来跟踪自由表面的位置。

你命名的所有流体的密度都不等于一;论文必须以某种您不清楚的方式将它们标准化。

你如何跟踪自由表面?一个细胞内可以同时有两种液体,还是全是水或全是空气?如果是后者,这意味着您必须在表面附近有一个非常精细的网格,才能解决像在海洋中传播的波浪这样的问题。

对于这个问题,您可以将水和空气都视为不可压缩,即使您知道气体不是。在马赫数小于 0.1 的地方,空气的速度足够低,因此可压缩性影响很小。

于 2016-01-14T19:10:31.023 回答