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

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

# Palabos

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

# 外部流れのexampleコード

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

# コードの改造

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

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

```c++:generalExternalFlow.cpp
    // document["geometry"]["staticSurfaceFileNames"].read(param.staticSurfaceFileNames);
    // param.numStaticSurfaces = param.staticSurfaceFileNames.size();
    // param.numSurfaces = param.numStaticSurfaces + param.numMovingSurfaces;
    param.numSurfaces = param.numMovingSurfaces;
```

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

```c++:generalExternalFlow.cpp
    // for (plint i = 0; i < (plint) param.staticSurfaceFileNames.size(); i++) {
    //     pcout << "staticSurfaceFileNames[" << i << "] = " << param.staticSurfaceFileNames[i] << std::endl;
    // }
```

```c++:generalExternalFlow.cpp
    // allSurfaceFileNames.insert(allSurfaceFileNames.end(), param.staticSurfaceFileNames.begin(), param.staticSurfaceFileNames.end());
```

```c++:generalExternalFlow.cpp
        // 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ファイルに書き換えます。

```xml: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を使って計算するのなら次のコマンドでできます。

```bash
mpirun -np 12 generalExternalFlow generalExternalFlow.xml
```

# まとめ

単一のサーフェースを使った外部流れ用のPalabosのソルバをexampleから構築しました。ほぼソースコードそのままで構築できるので、非常に簡単です。MPIはライブラリが対応しているので、並列計算も可能です。GUIを作成すればそこそこ使える計算コードになるような気がするので、今後はGUIを作っていきたいと思います。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3CAE?src=hash&amp;ref_src=twsrc%5Etfw">#オープンCAE</a> アドベントカレンダー2019用の動画です。サンタを回しました <a href="https://twitter.com/hashtag/OpenCAE?src=hash&amp;ref_src=twsrc%5Etfw">#OpenCAE</a> <a href="https://twitter.com/hashtag/%E8%B6%A3%E5%91%B3%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3?src=hash&amp;ref_src=twsrc%5Etfw">#趣味レーション</a> <a href="https://twitter.com/hashtag/Palabos?src=hash&amp;ref_src=twsrc%5Etfw">#Palabos</a> <a href="https://t.co/a06bZVG0dI">pic.twitter.com/a06bZVG0dI</a></p>&mdash; mmer547@技術書典8一日目参加 (@mmer547) <a href="https://twitter.com/mmer547/status/1209836417813073920?ref_src=twsrc%5Etfw">December 25, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

・2019/12/26追加

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3CAE?src=hash&amp;ref_src=twsrc%5Etfw">#オープンCAE</a> アドベントカレンダー2019用の動画のロングバージョンです。サンタを回してます。断面表示を2断面にしてみました <a href="https://twitter.com/hashtag/OpenCAE?src=hash&amp;ref_src=twsrc%5Etfw">#OpenCAE</a> <a href="https://twitter.com/hashtag/%E8%B6%A3%E5%91%B3%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3?src=hash&amp;ref_src=twsrc%5Etfw">#趣味レーション</a> <a href="https://twitter.com/hashtag/Palabos?src=hash&amp;ref_src=twsrc%5Etfw">#Palabos</a> <a href="https://t.co/eIxejnONDW">https://t.co/eIxejnONDW</a> <a href="https://t.co/YUvVAbqahk">pic.twitter.com/YUvVAbqahk</a></p>&mdash; mmer547@技術書典8一日目参加 (@mmer547) <a href="https://twitter.com/mmer547/status/1210201210407407616?ref_src=twsrc%5Etfw">December 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>