OpenFOAM のベクトル演算


OpenFOAM には,ベクトルに対する様々な演算子が用意されています.次のプログラムを実行して,それぞれの演算子の意味を確認しましょう.

Test Program

Results

Meaning of the Operations
    • cmptMax

$$cmptMax({\bf a}) = max (a_{1},\;a_{2},\;a_{3})$$

    • cmptMin

$$cmptMin({\bf a}) = min (a_{1},\;a_{2},\;a_{3})$$

    • cmptSum

$$cmptSum({\bf a}) = a_{1} + a_{2} + a_{3}$$

    • cmptAv

$$cmptAv({\bf a}) = \frac{a_{1} + a_{2} + a_{3}}{3}$$

    • cmptProduct

$$cmptProduct({\bf a}) = a_{1} \times a_{2} \times a_{3}$$

    • cmptMag

$$cmptMag({\bf a}) = (|a_{1}|\;\;|a_{2}|\;\;|a_{3}|)$$

    • cmptMultiply

$$cmptMultiply({\bf b},\;{\bf c}) = (b_{1}\times c_{1}\;\;b_{2}\times c_{2}\;\;b_{3}\times c_{3})$$

    • max

$$max({\bf b},\;{\bf c}) = (max(b_{1},\;c_{1})\;\;max(b_{2},\;c_{2})\;\;max(b_{3},\;c_{3}))$$

    • min

$$min({\bf b},\;{\bf c}) = (min(b_{1},\;c_{1})\;\;min(b_{2},\;c_{2})\;\;min(b_{3},\;c_{3}))$$

これらのベクトル演算子は,VectorSpaceI.H ファイルで実装されています.

境界に隣接するセルからなる cellZone の生成

ある境界に隣接するセルのみから構成される cellZone は,setSet ユーティリティを使用して,以下のような手順で生成することができます.

1行目のコマンドで,境界名が duct の境界フェイスから,ductwall という名前の faceSet を生成しています.2行目のコマンドでは,この faceSet に属するフェイスの owner セルから構成される cellSet を生成し,layer1Cells と名付けています.最後に3行目のコマンドで,この cellSet から,layer1Zone という名前の cellZone を生成しています.

Lduct_layer_cellZone

ここで,2行目のコマンドで使用している faceToCell オプションは,指定した faceSet に属する faceneighbour セル,owner セル,またはその両方のセル (any) から構成される cellSet を生成することができます.また,all オプションを指定した場合には,全てのフェイスが指定した faceSet に属するセルから構成される cellSet を生成します.境界フェイスの場合,owner セルしか存在しないので,ownerany のどちらを指定しても同じ cellSet が生成されます.

実装は,faceToCell.C ファイルで確認できます.

OpenFOAM では,それぞれのセルのフェイスの両側に位置する2つのセルを,owner セルと neighbour セルと呼んでいます(境界フェイスの場合は,neighbour セルのみ存在します).ここで,セル番号が小さい方のセルが owner セルです.ここら辺の話題については,こちらのスライドで触れています.

neighbour のスペルちょっと違和感ありますか?OpenFOAM Code Style Guide の最後の Orthography の項でも言及されているように,OpenFOAM はもともと,英国産のソフトウェアなので,今でも英国式のスペリングが好まれています.他には,centre なども頻出しますね.