2018年12月30日日曜日

OpenFOAMのサンプルプロジェクトを動かして図を表示してみた


背景

OpenFOAMとはオープンソースなCFD(Computation Fluid Dunamics: 数値流体力学)プログラムの1つです。
FreeCADの日本語のチュートリアルを作った方がOpenFOAMの資料まとめWEBアプリ作成をされていたり、PEZY-SCが使われているスパコンシステムで利用できる(PDF資料)という話を聞いたりして、OpenFOAMが気になったので試してみました。

サンプルプロジェクトを動かしてみた所、動かすのに詰まりどころがあったり、思っていたよりコマンド操作やファイルの編集が必要な使い方だと感じました。
使ったことが無い方の概要把握に役立てば良いと思い、備忘録を兼ねて自分が試したとこを共有します。

使ったもの

Ubuntu 18.04 をインストールしたPC
このようなスペックのPCで動作を確認しました。


OpenFOAMをダウンロード・インストール

OpenFOAMは下記の2種類のサイトがあるようです。

https://www.openfoam.com/
2004年からOpenFOAM(以前はOpenCFD)を作っているOpenCFD.Ltdが運営するサイト(以後開発元)

https://openfoam.org/
2011年から非独占的にOpenFOAMのライセンス契約をしているOpenFOAM財団が運営するサイト(以後財団)

(上記の情報はWikipedia調べ: OpenFOAM - Wikipedia

Linux(Ubuntu)向けのダウンロードサイトも開発元と財団でそれぞれあります。

開発元
https://www.openfoam.com/download/install-binary-linux.php
Source ForgeからバイナリをダウンロードしてDockerで動かす

財団
https://openfoam.org/download/6-ubuntu/
Ubuntuにリポジトリを登録して、aptコマンドでインストール

開発する場合はDockerを利用して実行環境を分けることのメリットがあるのだと思いますが、とりあえず動かすにはaptコマンドでインストールする方が楽そうなので、今回は財団の紹介する方法でOpenFOAMをインストールしました。


ということで、財団の紹介する方法を参考にしながら、下記のコマンドでOpenFOAMをインストールしました。
# リポジトリを登録
sudo sh -c "wget -O - http://dl.openfoam.org/gpg.key | apt-key add -"
sudo add-apt-repository http://dl.openfoam.org/ubuntu
sudo apt update
# インストール
sudo apt install -y openfoam6
# OpenFOAM読み込み設定を追加 
echo "source /opt/openfoam6/etc/bashrc" >> ~/.bashrc
source ~/.bashrc
#OpenFOAMの作業ディレクトリを作成
mkdir -p $FOAM_RUN

参考になったら良いと思うので実行したコマンドを表記しますが、バージョンが上がると動かなくなる可能性が高いので、上手く行かない場合は開発元財団のダウンロードページを参照してください。

ダウンロード手順の後半に紹介されているサンプルプロジェクトを実行

開発元のダウンロード手順の後半にGettingStartedとして、紹介されているサンプルプロジェクトがあるので、それを実行してみます。
cd $FOAM_RUN
cp -r $FOAM_TUTORIALS/incompressible/simpleFoam/pitzDaily .
cd pitzDaily
blockMesh
simpleFoam
paraFoam

よく分かってないですが、何か動きました。


OpenFOAMはblockMesh、simpleFoam、paraFoamなどのコマンドで構成されているようです。

サンプル集で紹介されているLid-driven cavity flowを実行

開発元のwikiにチュートリアルをまとめているページがあります。
まとめページの最初の最初として紹介されているFlow in an elbow(詳細は動画)は情報を見返しにくいと思ったので、最初の2番目に紹介されているLid-driven cavity flowを実施してみます。

Lid-driven cavity flowとは?

蓋(lid)が動く(driven)空洞(cavity)内に蓄えられた流体の流れ(flow)をシミュレーションする、チュートリアルプロジェクトです。

Lid-driven cavity flow

プロジェクトを起動してメッシュを表示

まず、サンプルディレクトリにあるプロジェクトファイルを、$FOAM_RUNにコピーします。
cd $FOAM_RUN
cp -r /opt/openfoam6/tutorials/incompressible/icoFoam/cavity/cavity ./
cd cavity

cavityディレクトリ内でblockMeshとicoFoamを実行すると、paraFoamでシミュレーション結果を可視化出来る状態になります。
blockMeshはOpenFOAMが提供するメッシュを作るコマンドの1つです。
icoFoamPISOアルゴリズムというシミュレーションで利用されるアルゴリズムを適用できるOpenFOAMが提供するコマンドです。
cd $FOAM_RUN/cavity
blockMesh
icoFoam
paraFoam


paraFoamを起動できたのは良いのですが、起動直後は何も表示されていません。これは読み込んだデータが非表示になっているためなので、Pipeline Browser左側の目のマークをクリックして表示切り替えするとメッシュが表示されます。



ちなみに、サンプルプロジェクトのディレクトリをコピーした直後にparaFoamを実行して可視化しようとすると、下記のようなエラーが表示されます。


ERROR: In /home/ubuntu/OpenFOAM/OpenFOAM-6/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoamReader.cxx, line 202
vtkPVFoamReader (0x55e2240c6a40): could not find valid OpenFOAM mesh
ERROR: In /home/ubuntu/OpenFOAM/ThirdParty-dev/ParaView-5.6.0/VTK/Common/ExecutionModel/vtkExecutive.cxx, line 782
vtkPVCompositeDataPipeline (0x55e22410e660): Algorithm vtkPVFoamReader(0x55e2240c6a40) returned failure for request: vtkInformation (0x55e22413e660)
  Debug: Off
  Modified Time: 221345
  Reference Count: 1
  Registered Events: (none)
  Request: REQUEST_INFORMATION
  ALGORITHM_AFTER_FORWARD: 1
  FORWARD_DIRECTION: 0

これはblockMeshで必要なメッシュデータを作っていないことによるエラーなので、blockMeshを実行してください。

また、icoFoamを実行せずにparaFoamを実行しすると、曾祖単位のシミュレーションが行われていないので、次の手順で設定するcoloringをpとしてもシミュレーション結果を見れません。


Coloringをpとしてシミュレーション結果を見たい場合は、icoFoamを実行してからparaFoamを起動してください。

色付きのメッシュを表示

メッシュが表示されたので、cravityの2.1.3 Running an applicationを参考にシミュレーションの結果を色付きで表示してみます。

PropertiesタブのColoringをpにすると、メッシュが色付けされます。



Coloringとしてpを選択した後、paraFoamのバグなのか、メッシュが青1色や青と赤の2色になっていることがあります。


このような場合は、画面上部の再生ボタンを押した後、Coloringを一旦「U」など別の値にしてからpを選び直すと、期待通りに表示されました。




色を変えたい場合は、Choose presetをクリックし、利用したい色を選択してApplyをクリックすると、色を変えられます。




cravityの説明の「Figure 2.5: Pressures in the cavity case.」と似たような図を表示できました。

ベクトルを配置

「Figure 2.7: Velocities in the cavity case.」として紹介されている、単位座標ごとにベクトルを配置している図を表示してみます。

先ほど表示した表示した色付きのメッシュある画面のPropertiesのApplyボタンが緑色のままであれば、クリックします。


Applyをクリックしたら、Pipeline BrowserのOpenFOAMファイルを右クリックしてメニューを開き、 Add Filter -> Alphabetical -> Glyph を選択します。
(Applyボタンが緑色のままだと、右クリックしてもGlyphが選べないことがあります。)


Glyphを選択したらPipeline Browserに項目が増えるので、目のボタンをクリックしてcravityを非表示にし、Glyphを表示状態にします。


Orientation ArrayをUに、Scale Factorを0.005にし、Applyボタンをクリックします。


Applyをクリックした後は、このような画像が表示されます。


背景が暗くて見づらいので、BackgroundのColorを選択し、白色をクリックしてSelectボタンをクリックします。



「Figure 2.7: Velocities in the cavity case.」と似たようなベクトルを表示できました。


流線を表示

「Figure 2.9: Streamlines in the cavity case.」のような流線を表示してみます。

Glyphを選択したときと同様に、Pipeline Browserのcavityを右クリックして Add Filter -> Alphabetical -> Stream Tracer を選択します。


Pipeline Browserの目のマークをクリックして、StreamTracerを表示します。


チュートリアルサイトの図と比べると中心が空白になり先の間が詰まっていますが、流線を表示できました。


グラフを表示

「Figure 2.11: Plotting graphs in ParaView.」のようなグラフを表示してみます。

Pipeline Browserのcavityを右クリックして、 Add Filter -> Data Analysis -> Plot Over Line を選択します。


Pipeline Browserの目のマークをクリックして、PlotOverLineを表示するようにします。


applyボタンを押すと、グラフが表示されます。



グラフを表示できました。

メッシュの形を変更

「Figure 2.14: cavityClipped solution for velocity field.」のような、形を変えた空間のベクトルを表示してみます。

Lid-driven cavity flowで指示されたとおり、system/blockMeshDictを下記のように書き換えます。(コピペしました。)
このblockMeshはblockMeghは16頂点で形成されているL字型のメッシュです。
また、movingWallの代わりにlidという名前を動く壁に付けています。
$FOAM_RUN/cavity/system/blockMeshDict
/*--------------------------------*- C++ -*----------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     | Website:  https://openfoam.org
    \\  /    A nd           | Version:  6
     \\/     M anipulation  |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

scale   0.1;

vertices
(
    (0 0 0)
    (0.6 0 0)
    (0 0.4 0)
    (0.6 0.4 0)
    (1 0.4 0)
    (0 1 0)
    (0.6 1 0)
    (1 1 0)

    (0 0 0.1)
    (0.6 0 0.1)
    (0 0.4 0.1)
    (0.6 0.4 0.1)
    (1 0.4 0.1)
    (0 1 0.1)
    (0.6 1 0.1)
    (1 1 0.1)

);

blocks
(
    hex (0 1 3 2 8 9 11 10) (12 8 1) simpleGrading (1 1 1)
    hex (2 3 6 5 10 11 14 13) (12 12 1) simpleGrading (1 1 1)
    hex (3 4 7 6 11 12 15 14) (8 12 1) simpleGrading (1 1 1)
);

edges
(
);

boundary
(
    lid
    {
        type wall;
        faces
        (
            (5 13 14 6)
            (6 14 15 7)
        );
    }
    fixedWalls
    {
        type wall;
        faces
        (
            (0 8 10 2)
            (2 10 13 5)
            (7 15 12 4)
            (4 12 11 3)
            (3 11 9 1)
            (1 9 8 0)
        );
    }
    frontAndBack
    {
        type empty;
        faces
        (
            (0 2 3 1)
            (2 5 6 3)
            (3 6 7 4)
            (8 9 11 10)
            (10 11 14 13)
            (11 12 15 14)
        );
    }
);

mergePatchPairs
(
);

// ************************************************************************* //

blockMeshDictでmovinbWallをlidに変更したのに伴い、初期値を扱う0/Uと0/pのmovingWallもlidに変更します。
$FOAM_RUN/cavity/0/U
    // movingWall
    lid
$FOAM_RUN/cavity/0/p
    // movingWall
    lid


movingWallをlidという名前に変更したので、movingWallとlidを紐付けるために、下記のようなmapFieldsDictファイルをsystemディレクトリに作成します。
$FOAM_RUN/cavity/system/mapFieldsDict
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    location    "system";
    object      mapFieldsDict;
}

patchMap        (lid movingWall);

cuttingPatches  ();

system/blockMeshDict、0/U、0/pの変更と、system/mapFieldsDictの追加ができたら、メッシュの作成とシミュレーションをやりなおすためにblockMeshとicoFormを再度実行し、その後にparaFormを実行します。
cd $FOAM_RUN/cavity
blockMesh
icoFoam
paraFoam

paraFoamが起動したら「色付きのメッシュを表示」で紹介した手順を行うと、L字型のメッシュ内を移動する流体のベクトルを表示できます。


まとめ

分かっていないことが多く、飛ばした説明(レイノルズ数を変更して実行してみる説明)があるものの、OpenFOAMで提供される、blockMesh、sampleFoam、icoFoam、paraFoamなどを利用してLid-driven cavity flowに関するいくつかの画像を表示できました。
図を表示する方法が分かったので、学習意欲をある程度維持できそうです。

何かの参考になれば嬉しいです。

0 件のコメント :