我试图理解一段来自 paper concerning fluid simulations for games 的代码。我正在研究边界条件的解决方法。由于我不了解 C++,所以我遇到了额外的困难。
据我了解:
IX(i, j)
表示位于 x 方向上的i
处的二维网格单元,位于 x 方向上的j
处的二维网格单元。 y 方向u[IX(i, j)]
则为 (i
,j
) 单元中的速度
以下宏用于 IX(i, j)
:
#define IX(i, j) ((i) + (N + 2) * (j))
最佳答案
我不会试图费力地读完整篇论文,但我可以解释一下 语法并对正在发生的事情做出一些有根据的猜测。
#define IX(i,j) ((i)+(N+2)*(j))
在我看来,它们正在转换二维坐标
i,j
转换为一维数组索引。 j
是行号,i
是列号,与您的描述相符,总计
列数为N+2
。
0 1 2 ... (N+2)-1
(N+2)+0 (N+2)+1 (N+2)+2 ... 2(N+2)-1
...
然后我们有这个:
x[IX(0,i)] = b==1 ? -x[IX(1,i)] : x[IX(1,i)]
在 C 语言中,a ? b : c
表示如果 a、b,则 c。这是一个表达式,其
值是 b
或 c
,具体取决于 a
是否为真。
它称为三元运算符,了解更多 here .
Python 有自己的三元运算符,操作数不同 订单:
b if a else c
所以x[IX(0,i)] = b==1 ? -x[IX(1,i)] : x[IX(1,i)]
相当于
说:
if (b == 1)
x[IX(0,i)] = -x[IX(1,i)]
else
x[IX(0,i)] = x[IX(1,i)]
因此,在第 i 行中,第 0 列的新值是第 1 列的值,
可能被否定。看第10页,好像和这个有关系
与边界。这是在左边缘,所以我们将其设置为
向内一个单元格的值或该值的负值,具体取决于 b
。
希望这能让事情有所澄清。
关于python - CFD 边界条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51725926/