ソルバーの実行

2015年3月10日

はじめに

ソルバーの実行について。

使用バージョン

OpenFOAM 2.2.1

ソルバーの実行

ソルバーの実行は、たとえば simpleFoam を実行する場合は、ケースディレクトリの中でつぎのようにする。

$ simpleFoam

計算中の出力はとっておくと便利なことがあるため、つぎのように出力をファイルに書き出したほうがよい。

$ simpleFoam > log &

計算中の出力を継続的に表示させるには、tail を使う。

$ tail -f log

表示を止めるには Ctrl+C を入力する。

つぎのようにすれば、計算の進み具合がわかる。

$ tail -f log | grep Time

並列計算の実行

並列計算を実行するには、まず領域を分割する必要がある。領域を分割するには decomposePar を使う。設定ファイルとして system/decomposeParDict を用意する。

FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      decomposeParDict;
}

numberOfSubdomains 2;

method          scotch;
//method          simple;

simpleCoeffs
{
    n               (2 1 1);
    delta           0.001;
}

numberOfSubdomains で領域分割数、つまり並列数を指定する。method は領域分割方法で、"scotch" を指定しておけば適当に分割してくれる。ただし、領域分割のせいで計算が発散することもありえる。scotch に問題がありそうな場合は、代わりに "simple" を使うとよい。simple は simpleCoeffs の n で XYZ 方向それぞれの分割数を指定する。上の例の "(2 1 1)" では、X 方向に単純に 2 分割する。

decomposePar はつぎのように実行する。

$ decomposePar

ケースフォルダ内に "processor0"、"processor1" … といったファイルが分割数分でき、それぞれに分割された領域の情報が含まれる。すでに "processor0" などのディレクトリが存在する場合は、前もって消しておく必要がある。

並列計算を実行するには、Open MPI を使う。つぎのように実行する。

$ mpirun -np 2 simpleFoam -parallel > log &

オプション "-np" で並列数を指定する。"-parallel" というオプションは OpenFOAM のソルバーのオプションで、並列で実行していることを伝えるものである。

計算結果は分割された領域のそれぞれのディレクトリに格納される。これをひとつに結合するには reconstructPar を用いる。

$ reconstructPar

これはすべての時刻の結果を結合しようとするが、最後の結果だけでよい場合はオプション "-latestTime" を指定する。また、一度結果を結合したあとに並列計算を実行し、再度結合したい場合は、オプション "-newTimes" を指定すれば、新しい結果だけを結合してくれる。

foamJob によるソルバーの実行

直接ソルバーを実行する代わりに foamJob で実行する方法がある。

$ foamJob simpleFoam

自動的にソルバーの出力が log ファイルに書き出され、バックグラウンドで実行される。フォアグラウンドで実行するにはオプション "-screen" を使う。

$ foamJob -screen simpleFoam

並列計算を実行するには、オプション "-parallel" を指定すればよい。

$ foamJob -parallel simpleFoam

decomposePar を実行しておく必要があるが、並列数を指定する必要はない。

計算を止めるには foamEndJob を使う。

$ foamJob simpleFoam
$ ps
  PID TTY          TIME CMD
14460 pts/1    00:00:00 bash
15193 pts/1    00:00:01 simpleFoam
15197 pts/1    00:00:00 ps
$ foamEndJob -n 15193
foamEndJob : Read from controlDict:
  controlDict   : ./system/controlDict
  writeInterval : 50
  stopAt        : endTime
foamEndJob : Making backup of controlDict to controlDict_bak
foamEndJob : Changed in controlDict:
    stopAt          nextWrite;
    writeInterval   1;
foamEndJob : Waiting for Foam job 15193 to finish ...
foamEndJob : Restoring controlDict from controlDict_bak
foamEndJob : Exiting

foamEndJob にプロセス ID を指定して実行すると、計算結果を保存してからソルバーを止める。オプションの "-n" ではつぎの時間ステップで停止する。オプションなしではつぎの計算結果の出力の時点で停止する。