在基于斯塔姆的论文的流体模拟中,流体被建模为密度网格。密度“通常取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?这将代表一个完全充满水粒子的细胞。密度将大于一个将不得不被推开到邻近的细胞。Stam列出了扩展的想法,但不包括如何:
另一个扩展是使用这个解算器作为一个基础来驱动水流。在这种情况下,有两种不同密度的流体:水和空气。由于以下原因,通常不模拟空气,求解器更难实现:水流体的域随时间而变化,必须以某种方式跟踪,并且必须在界面处应用正确的边界条件。水区域可以使用粒子来跟踪,这些粒子可以像福斯特和Metaxas Foster96那样在流体中移动,也可以通过粒子和水平集( Foster01,Enright02 )的组合来跟踪。
发布于 2016-01-14 19:10:31
我认为你应该说“自由表面不可压缩的流动”。
这是一个很难的问题,因为你必须跟踪自由表面的位置,这是空间和时间的函数。
你命名的所有液体的密度并不等于一;纸张必须以某种你不清楚的方式将它们规范化。
你如何追踪自由表面?细胞内能同时有两种液体吗?还是全是水还是全是空气?如果是后者,那就意味着你必须在海面附近有一个非常精细的网格,才能解出在海洋中传播的波浪。
对于这个问题,你可以把水和空气看作是不可压缩的,即使你知道气体不是。当马赫数小于0.1时,空气速度足够低,因此压缩性影响很小。
https://stackoverflow.com/questions/34797667
复制相似问题