此流体模拟基于paper by Stam。在第7页,他描述了平流背后的基本思想:
从两个网格开始:一个包含上一个时间步长的密度值和一个 这将包含新值。对于后者的每个网格单元,我们跟踪单元的中心 通过速度场向后定位。然后我们从网格线性插值 先前的密度值并将此值分配给当前网格单元格。
Advect代码。两个密度网格为d
和d0
,u
和v
为速度组件,dt
为时间步长,N
(全局)是网格大小,b
可以忽略:
void advect(int b, vfloat &d, const vfloat &d0, const vfloat &u, const vfloat &v, float dt, std::vector<bool> &bound)
{
float dt0 = dt*N;
for (int i=1; i<=N; i++)
{
for (int j=1; j<=N; j++)
{
float x = i - dt0*u[IX(i,j)];
float y = j - dt0*v[IX(i,j)];
if (x<0.5) x=0.5; if (x>N+0.5) x=N+0.5;
int i0=(int)x; int i1=i0+1;
if (y<0.5) y=0.5; if (y>N+0.5) y=N+0.5;
int j0=(int)y; int j1=j0+1;
float s1 = x-i0; float s0 = 1-s1; float t1 = y-j0; float t0 = 1-t1;
d[IX(i,j)] = s0*(t0*d0[IX(i0,j0)] + t1*d0[IX(i0,j1)]) +
s1*(t0*d0[IX(i1,j0)] + t1*d0[IX(i1,j1)]);
}
}
set_bnd(b, d, bound);
}
这个方法简洁而且效果很好,但实现对象边界对我来说很难理解,因为值是向后追踪和插值的。我目前的解决方案是,如果在它旁边有一个空的空间(或空格),只是将密度推出边界,但是不准确并导致密度增加,特别是在角落和具有对角线速度的区域。罢工>只有视觉上准确。我正在寻找&#34;正确性&#34;现在。
我的边界代码的相关部分:
void set_bnd(const int b, vfloat &x, std::vector<bool> &bound)
{
//...
for (int i=1; i<=N; i++)
{
for (int j=1; j<=N; j++)
{
if (bound[IX(i,j)])
{
//...
else if (b==0)
{
// Distribute density from bound to surrounding cells
int nearby_count = !bound[IX(i+1,j)] + !bound[IX(i-1,j)] + !bound[IX(i,j+1)] + !bound[IX(i,j-1)];
if (!nearby_count) 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;
}
}
}
}
}
bound
是包含行0
到N+1
的bool向量。通过将bound
中的单元格坐标设置为1
,可以在主循环之前设置边界对象。
该论文模糊地说明了#34;然后我们只需添加
set_bnd()
例程的一些代码,用于从值中填充被占用单元格的值
他们的直接邻居&#34;,这就是我正在做的事情。我正在寻找一种更准确地实现边界的方法,即具有非流体固体边界并且可能最终支持多种流体的边界。视觉质量比物理正确性重要得多。
答案 0 :(得分:1)
你的答案来自物理而不是模拟。由于您正在处理边界,因此您的速度场需要满足Prandtl无滑移边界条件,该条件仅表示边界处的速度必须为零。有关(很多)更多信息,请参阅https://en.wikipedia.org/wiki/Boundary_layer。如果您的速度场不符合此标准,您将遇到所描述的困难,包括在边界上回放质量,这是对模型的一种非常基本的违反。
您还应该知道,这种平流代码不能保存密度(按设计),并且最终修正了守恒定律。您需要注意该步骤,因为矢量场的Hodge分解也具有适用的边界条件。
答案 1 :(得分:1)
您可能对Jos Stam的“流体动画艺术”感兴趣(2015年9月)。大约page 69 he discusses boundary conditions in some detail.。
也许还有兴趣:https://software.intel.com/en-us/articles/fluid-simulation-for-video-games-part-1/。
“完美风暴”不久之前,所以现在你的流体模拟器要么非常大,要么非常快,要么非常详细。最好全部三个。如果用例允许,有些人可能会使用GPU。也许有帮助......