流体模拟不可压缩流体

时间:2016-01-14 19:05:02

标签: c++ simulation fluid-dynamics

在基于paper by Stam的流体模拟中,流体被建模为密度网格。密度"通常取0到1之间的值,但可以更大。边界的实现基本上如文章中所述:

  

实现内部边界的一种简单方法是分配布尔网格   表示哪个单元格被对象占用。然后我们只需添加   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]。

1 个答案:

答案 0 :(得分:1)

我认为你应该说"具有自由表面的不可压缩流"。

这是一个难题,因为你必须跟踪自由表面的位置作为空间和时间的函数。

您命名的所有液体的密度不等于1;论文必须以某种你不明确的方式对它们进行规范化。

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

对于这个问题,你可以将水和空气都视为不可压缩的,即使你知道没有气体。在马赫数小于0.1的情况下,空气的速度足够低,因此压缩效应很小。