考虑到Jos Stam 的 GDC关于稳定流体的教程的第 10 页,该函数project()
首先获得速度场的散度:¹
div[IX(i,j)] = -0.5*(u[IX(i+1,j)]-u[IX(i-1,j)]+
v[IX(i,j+1)]-v[IX(i,j-1)]) / N;
p[IX(i,j)] = 0;
然后从原始速度场中减去一个无旋度的部分,得到一个没有发散的速度场:
u[IX(i,j)] -= 0.5*(p[IX(i+1,j)]-p[IX(i-1,j)]) * N;
v[IX(i,j)] -= 0.5*(p[IX(i,j+1)]-p[IX(i,j-1)]) * N;
这对我来说通常是有意义的,除了一件事:我大致理解为什么第一个代码块除以- 使用有限差分计算规则网格上的N
散度涉及除以相邻网格单元之间的距离。但是为什么第二个代码块乘以N
?我认为计算均匀网格上的梯度也将涉及除以N
,就像计算散度一样。
¹ 为了便于阅读,在下面的代码块中,我替换了h = 1.0/N
本文实现中使用的倒数。