見出し画像

Palabosで外部流れ用のソルバを手に入れる方法

この記事はQiitaからの転載です。Qiitaのアカウントは塩漬けにする予定です。

オープンCAEシンポジウム2019で発表したPalabosの外部流れソルバの構築についてのメモです。

Palabos

PalabosはFlowKit Ltd.,が開発し、現在はジュネーブ大学のサイトで公開されている格子ボルツマン法のオープンソースのライブラリです。OpenFOAMなどと同じで、ソルバを構築するためのライブラリやソースコードのサンプルを提供しています。OpenFOAMなどと異なるのは標準ソルバがありません。自分で計算する内容に合わせてソルバを作ります。Palabos自体はGPL V3で配布されています。

外部流れのexampleコード

今回は/showCases/generalExternalFlowをもとにします。この例題では回転する6面体と静止した球の周りの流れを解いています。

コードの改造

今回は回転体を取り扱える外部流れソルバを作ります。静止物体を同時解く必要がないので、その部分を元となるgeneralExternalFlowのソースコードから取り除きます。改修は「static(Static)」が含まれている行をコメントアウトするだけです。

generalExternalFlow.cpp

// 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の両方のサーフェースを使用しているので、コメントアウトではなく、書き換えが必要です。

generalExternalFlow.cpp

// document["geometry"]["staticSurfaceFileNames"].read(param.staticSurfaceFileNames);
// param.numStaticSurfaces = param.staticSurfaceFileNames.size();
// param.numSurfaces = param.numStaticSurfaces + param.numMovingSurfaces;
param.numSurfaces = param.numMovingSurfaces;

残りの部分も書き換えていきます。

generalExternalFlow.cpp

// 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ファイルに書き換えます。

generalExternalFlow.xml

<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を作っていきたいと思います。

画像2

https://twitter.com/mmer547/status/1209836417813073920?s=20

・2019/12/26追加

画像1

https://twitter.com/mmer547/status/1210201210407407616?s=20


この記事が気に入ったらサポートをしてみませんか?