2
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

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

オープン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;
    // }
generalExternalFlow.cpp
    // allSurfaceFileNames.insert(allSurfaceFileNames.end(), param.staticSurfaceFileNames.begin(), param.staticSurfaceFileNames.end());
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ファイルに書き換えます。

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

・2019/12/26追加

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
2
Help us understand the problem. What are the problem?