オープンCAEシンポジウム2019で発表したPalabosの外部流れソルバの構築についてのメモです。
Palabos
PalabosはFlowKit Ltd.,が開発し、現在はジュネーブ大学のサイトで公開されている格子ボルツマン法のオープンソースのライブラリです。OpenFOAMなどと同じで、ソルバを構築するためのライブラリやソースコードのサンプルを提供しています。OpenFOAMなどと異なるのは標準ソルバがありません。自分で計算する内容に合わせてソルバを作ります。Palabos自体はGPL V3で配布されています。
外部流れのexampleコード
今回は/showCases/generalExternalFlowをもとにします。この例題では回転する6面体と静止した球の周りの流れを解いています。
コードの改造
今回は回転体を取り扱える外部流れソルバを作ります。静止物体を同時解く必要がないので、その部分を元となるgeneralExternalFlowのソースコードから取り除きます。改修は「static(Static)」が含まれている行をコメントアウトするだけです。
// std::vector<std::string> staticSurfaceFileNames; // Files with the static immersed surface geometries.
plint numMovingSurfaces; // Number of moving immersed surfaces.
// plint numStaticSurfaces; // Number of static immersed surfaces.
ただし、次の個所ではparam.numSurfacesの計算にmovingとstaticの両方のサーフェースを使用しているので、コメントアウトではなく、書き換えが必要です。
// document["geometry"]["staticSurfaceFileNames"].read(param.staticSurfaceFileNames);
// param.numStaticSurfaces = param.staticSurfaceFileNames.size();
// param.numSurfaces = param.numStaticSurfaces + param.numMovingSurfaces;
param.numSurfaces = param.numMovingSurfaces;
残りの部分も書き換えていきます。
// for (plint i = 0; i < (plint) param.staticSurfaceFileNames.size(); i++) {
// pcout << "staticSurfaceFileNames[" << i << "] = " << param.staticSurfaceFileNames[i] << std::endl;
// }
// allSurfaceFileNames.insert(allSurfaceFileNames.end(), param.staticSurfaceFileNames.begin(), param.staticSurfaceFileNames.end());
// if (iSurface == -1) { // We are on a static surface.
// return Array<T,3>((T) 0, (T) 0, (T) 0);
// }
インプットの書き換え
generalExternalFlowのソルバはインプットをxmlから読み取るように構築されています。今回はほぼexampleの記述のまま使いますが、staticSurfaceFileNamesは使わないのでコメントアウトし、movingSurfaceFileNamesを計算するstlファイルに書き換えます。
<geometry>
<!-- Coordinates of the physical simulation domain. -->
<simulationDomain>
<x> -0.650 2.500 </x>
<y> -0.455 0.445 </y>
<z> -0.455 0.445 </z>
</simulationDomain>
<!-- Files with the moving immersed surface geometries. -->
<movingSurfaceFileNames> Mesh.stl </movingSurfaceFileNames>
<!-- Files with the static immersed surface geometries. -->
<!-- <staticSurfaceFileNames> sphere.stl </staticSurfaceFileNames> -->
<!-- Direction of the flow (0-> positive x, 1-> positive y, 2-> positive z). -->
<flowDirection> 0 </flowDirection>
</geometry>
コンパイル
コンパイルはmakeコマンドでできます。
計算実行
計算はコンパイル後に生成された実行ファイルを実行します。MPIを使って計算するのなら次のコマンドでできます。
mpirun -np 12 generalExternalFlow generalExternalFlow.xml
まとめ
単一のサーフェースを使った外部流れ用のPalabosのソルバをexampleから構築しました。ほぼソースコードそのままで構築できるので、非常に簡単です。MPIはライブラリが対応しているので、並列計算も可能です。GUIを作成すればそこそこ使える計算コードになるような気がするので、今後はGUIを作っていきたいと思います。
#オープンCAE アドベントカレンダー2019用の動画です。サンタを回しました #OpenCAE #趣味レーション #Palabos pic.twitter.com/a06bZVG0dI
— mmer547@技術書典8一日目参加 (@mmer547) December 25, 2019
・2019/12/26追加
#オープンCAE アドベントカレンダー2019用の動画のロングバージョンです。サンタを回してます。断面表示を2断面にしてみました #OpenCAE #趣味レーション #Palabos https://t.co/eIxejnONDW pic.twitter.com/YUvVAbqahk
— mmer547@技術書典8一日目参加 (@mmer547) December 26, 2019