【问题标题】:CFD boundary conditionsCFD 边界条件
【发布时间】:2019-01-14 11:50:30
【问题描述】:

我试图理解来自paper concerning fluid simulations for games 的一段代码。我正在研究解决边界条件的方式。由于我不了解 C++,因此我遇到了额外的困难。

据我了解:

  • IX(i, j) 表示在 x 方向位于 i,在 y 方向位于 j 的二维网格单元

  • u[IX(i, j)] 是 (i, j) 单元格中的速度

以下宏用于IX(i, j)

#define IX(i, j) ((i) + (N + 2) * (j))

【问题讨论】:

  • 并非没有任何上下文。 x 是什么类型? ix 是什么类型? ix[1,i]ix(1,i) 有什么区别?
  • @klutt 不,它没有,如果有 ix(0, 1)ix 不是宏。
  • 看起来 OP 的意思是 x[IX(0,i)] = b==1 ? -x[IX(1,i)] : x[IX(1,i)]; 但他们切换了一些符号并以废话告终。
  • 它与 Python 中的x[IX(0 ,i)] = -x[IX(1,i)] if b == 1 else x[IX(1,i)] 含义相同(使用合适的IX 函数)。重要性在论文周围的文字中进行了解释。

标签: python c


【解决方案1】:

我不会尝试通读整篇论文,但我可以解释一下 语法并对正在发生的事情做出一些有根据的猜测。

#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。这是一个表达式 值是bc,取决于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

希望这能让事情有所澄清。

【讨论】:

    猜你喜欢
    • 2015-10-24
    • 1970-01-01
    • 2018-02-03
    • 2021-01-20
    • 2023-03-18
    • 2023-03-10
    • 2020-06-14
    • 2019-10-07
    • 2015-03-18
    相关资源
    最近更新 更多