Какова роль & в этом фрагменте кода? - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь разобраться в коде dbns в пенопласте. Но у меня есть некоторые сомнения в конкретной части следующего кода, приведенного ниже.

deltaRLeft & gradrho [own] или

deltaRRight & gradU [nei]

Iвещь & используется здесь - это ссылочный оператор, но если кто-нибудь сможет объяснить его более подробно, это будет полезно для меня.

    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

Ответы [ 3 ]

2 голосов
/ 16 октября 2019

Это побитовый оператор.

Он сравнивает каждый бит первого операнда с соответствующим битом второго операнда. Если оба бита равны 1, результирующий бит устанавливается в 1, в противном случае 0.

Как пример:

     11001001  
   & 10111000 
     -------- 
   = 10001000
1 голос
/ 06 ноября 2019

Боюсь, что ответы first и second в основном не применимы в контексте OpenFOAM.

В контексте OpenFOAM & - это внутреннее произведение , если операнды являются тензорами. При этом deltaRRight и gradT[nei] на самом деле являются тензорными объектами.

Пожалуйста, ознакомьтесь с Руководством для программистов OpenFOAM , Раздел 1.4.1 и 1.3.1.

0 голосов
/ 16 октября 2019

Существует два разных оператора &.

Битовый оператор AND (&) сравнивает каждый бит первого операнда с соответствующим битом второго операнда. Если оба бита равны 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 ...
}
...