はじめに

OpenFOAMで計算していると、今の計算がいつくらいに終わるのかなと、気になることも多々あります。
そこで、pisoFoamで次のようにlog.pisoFoamを吐き出しながら計算しているという前提で解析終了時刻の推定スクリプトを作ってみたので参考にしてほしい。

前提1

% pisoFoam > log.pisoFoam &

として、バックグラウンドでログを吐き出しながら実行しているという前提。

前提2

gawkの組み込み関数を使うので、以下のようにgawkをインストールしておく必要がある。

% sudo apt-get install gawk

スクリプトの内容

$1=="Time"{
    ts=$3;
}
$1=="ExecutionTime"{
    te=$7;
}
$1=="Courant"{
    Cm=$4;
    Cmax=$6;
}
ts>0&&te>0{
    if(FST>0){
        ctime=systime();
        ft=FST-ts;
        dt=int(ft*te/ts);
        ctime+=dt;
        print strftime("%y/%m/%d %H:%M:%S"), ts, te, strftime("%y/%m/%d %H:%M:%S",ctime), Cm, Cmax;
    }else{
        print strftime("%y/%m/%d %H:%M:%S"), ts, te, int(te/ts),"S/s", Cm,Cmax
    }
    system("");
}

このスクリプトを、適当な名前(ここではesttime.awk)で保存し、次のように実行する。

% tail -f log.pisoFoam | gawk -v FST=30 -f esttime.awk

こうすると、

15/05/14 10:38:13 14.0235 244466 15/05/17 16:00:04 0.0244288 0.707315

のような感じで、log.pisoFoamから、実行タイムステップ(Time)と実行時間(ClockTime)を読み取って、FSTで指定した解析終了時間に到達する日時を教えてくれる。FSTを指定しなかった場合には、

15/05/14 10:39:21 14.0275 244532 17432 S/s 0.0244289 0.7131

のように、解析ステップ1秒あたりに要する実行時間を表示する。

おわりに

やっつけで作ったので、かなり荒削りのスクリプトである。controlDictからEndTimeを読み取って指定しなくても終了日時を計算するなど、まだまだ工夫のし甲斐はあるので、各自で楽しんでいただきたい。

お約束

ここに書かれた情報は私の環境でうまくいった例を紹介しており、その他の環境でうまくいくことを保証するものではありません。また、ここの情報に沿って試した結果生じた不利益に対して一切責任を追いません。

執筆者:M. Noda