0

我正在尝试理解foam-extend 中的dbns 代码。但是我对下面给出的以下代码的特定部分有点怀疑。

deltaRLeft & gradrho[own] 或

deltaRRight & gradU[nei]

我在这里使用的东西&是一个参考运算符,但是如果有人可以更详细地解释它,它将对我有所帮助。

    Flux::evaluateFlux
    (
        rhoFlux_[faceI],
        rhoUFlux_[faceI],
        rhoEFlux_[faceI],
        rho_[own] + rhoLimiter[own]*(deltaRLeft & gradrho[own]),
        rho_[nei] + rhoLimiter[nei]*(deltaRRight & gradrho[nei]),
        U_[own] + cmptMultiply(ULimiter[own], (deltaRLeft & gradU[own])),
        U_[nei] + cmptMultiply(ULimiter[nei], (deltaRRight & gradU[nei])),
        T_[own] + TLimiter[own]*(deltaRLeft & gradT[own]),
        T_[nei] + TLimiter[nei]*(deltaRRight & gradT[nei]),
        R[own],
        R[nei],
        Cv[own],
        Cv[nei],
        Cp[own],
        Cp[nei],
        Sf[faceI],
        magSf[faceI]
    );

这里 & 到底在做什么,如果可以详细解释的话。部分代码来自 dbns/numericFlux/numericFlux.C

4

3 回答 3

2

这是按位和运算符。

它将第一个操作数的每个位与第二个操作数的相应位进行比较。如果两个位都为 1,则结果位设置为 1,否则设置为 0。

例如:

     11001001  
   & 10111000 
     -------- 
   = 10001000
于 2019-10-16T03:49:00.020 回答
2

恐怕第一个第二个答案大多不适用于 OpenFOAM 上下文。

在 OpenFOAM 上下文中,如果操作数是张量,&则为内积。在那里,deltaRRight实际上gradT[nei]是张量对象。

请查看OpenFOAM 的程序员指南,第 1.4.1 和 1.3.1 节。

于 2019-11-06T17:18:51.160 回答
0

有两种不同的&运算符。

按位与运算符 (&) 将第一个操作数的每个位与第二个操作数的相应位进行比较。如果两个位都为 1,则相应的结果位设置为 1。否则,相应的结果位设置为 0。

按位与运算符的两个操作数都必须是整数类型。

例如:

#include <iostream>

using namespace std;

int main() {
   unsigned short a = 0xFFFF;      // pattern 1111 ...
   unsigned short b = 0xAAAA;      // pattern 1010 ...

   cout  << hex << ( a & b ) << endl;   // prints "aaaa", pattern 1010 ...
}
于 2019-10-16T03:47:27.937 回答