白黒羊

OpenFOAMを使ったときのメモ

ありとあらゆるものに手を出していて収拾がついていませんが今日はOpenFOAMの話です。

https://www.openfoam.com/

OpenFOAMとは流体や連続体シミュレーションのコード開発用のオープンソースプログラムのことです。
様々な種類の流体を解くモデル、ソルバーが用意されているのですが検索しても出てくる情報が古かったり日本語はなかったり、マニュアルを読むのではなくサンプルコード(チュートリアル)の実行で理解する必要があったりと最初の最初が少しだけ大変な感じです。

基本的にはこのユーザーガイドを読みながらチュートリアルを使って覚えるのかな。

http://foam.sourceforge.net/docs/Guides-a4/UserGuide-Japanese.pdf

ちょっと触ってみて困ったところと解決できたところを自分用の備忘録として残しておきます。

OpenFOAMで流体の流出入を取り扱いたい

「blockMeshDict」の「boundary」に以下を追加。
(もちろんfacesの中身の面指定はそのときどきに応じて)

    inlet
    {
      // 流入面
        type patch;
        faces
        (
            (0 4 7 3)
        );
    }
    outlet
    {
      // 流出面
        type patch;
        faces
        (
            (2 6 5 1)
        );
    }

初期条件の設定

「0」/「p」
「inlet」:「type zeroGradient;」
「outlet」:「type fixedValue; value uniform 0;」

「0」/「U」
「inlet」:「type fixedValue; value uniform (1 0 0);」
「outlet」:「type zeroGradient;」

流入部では速度を固定、流出部では圧力を固定し(ディリクレ条件)、流入部の圧力と流出部の速度はゼロ勾配にします(ノイマン条件)。

エラーを倒す

–> FOAM FATAL ERROR: face 0 in patch 0 does not have neighbour cell face: ( * * *)

隣の面がないよ~と言っているエラー。
6面とも指定しているはずなのにこのエラーが出たらblockを指定するときに「x増加→y増加→z増加」の順に頂点を選んでいっていないということみたいです。

blockMeshDictの「mergePatchPairs」を使う

英語だけど下のリンクの自己解決が分かりやすかったです。

https://www.cfd-online.com/Forums/openfoam-meshing-blockmesh/73241-mergepatchpairs-master-few-slaves.html

面Aを面Bに融合させて、面Bにだけ条件を与えることでどちらにも条件が与えられている状態にしたいときに、

mergePatchPairs
(
    ( A B )
);

みたいに書けばいいよという話。

温度の解析をしたい

流れるのはもうわかったから次のことをします。
今までの定常層流ソルバーicoFoamで解けなくなったので熱流動解析ソルバーを使います。
解析ソルバーは4種類あって、定常/非定常、ブシネスク近似 (Boussinesq approximation)をするかどうかに分けられています。

ブシネスク近似 – Wikipediaによると、「ブシネスク近似とは、流体力学の自然対流問題において、熱膨張による密度変化に比べて膨張圧縮による密度変化が無視できるとする解析上の近似手法である。 この近似のもとでは、密度変化は重力に比例した浮力としてのみ流体の運動に影響を及ぼし、運動量の変化を無視する」ということで、
とりあえず定常/ブシネスク近似の解析ソルバー(buoyantBoussinesqSimpleFoam)を使ってみます。
「buoyantBoussinesqSimpleFoam」/「hotroom」のtutorialをコピー。
急に変数が増えまくります。
「U」「p」「p_rgh」「k」「epsilon」「T」「alphat」「nut」
どこがどういう変数なのか調べずに使わないところの設定は「type zeroGradient;」にしてしまっています、これは今度調べる。

OpenFOAM で使用される主要な変数名 – XSimによると、
圧縮性の場合、「U」は速度($m/s$)、「p」「p_rgh」は圧力($kg/(m\cdot s)$)で前者は静水圧、後者はそこから流体質量による圧力を差し引いた量を表しています。
rghは$\rho gh$のことみたいです。
「k」は乱流エネルギー($m^2/s^2$)で、「epsilon」は乱流エネルギー散逸率($m^3/s^2$)
「T」が絶対温度($K$)で、「alphat」が熱拡散率($m^2/s$)、「nut」が乱流動粘性係数($m^2/s$)
他のチュートリアルで「phi」とかも見たけれどそこで流量の指定もできたりするみたいです。

PostProcessing

結果ファイルをはきださせる設定
基本的にcontrolDictに

includeFunc patchAverage(name=outlet,T)

みたいなのを追加するだけ。
これでoutlet部分のT(熱)の時系列データがPostProcessingフォルダに書き出されます、簡単!

CentOSでOpenFOAMを使う

https://qiita.com/yotakagi77/items/8523460767379a3963c5

これを読もう。

とりあえずまとめ

もう少しOpenFOAMに慣れたら、またまとめます。
日本語の参考資料としては公式のマニュアルとPENGUINITISが最強な気がします。

せっかく流体やるなら絶対Unityで流体やりたいな。