OpenFOAM

【水面高さ(OpenFOAM)】ParaViewで表示してPythonスクリプトにする(11)

こんにちは(@t_kun_kamakiri

今回は下記の記事で解説した水面高さをParaViewで表示する方法について解説を行います。

ちなみに、水面高さは「system/controlDict」ファイル内でfunctionObjectのinterfaceHeightで特定座標の水位や波高を取得することが可能です。

system/controlDict

「direction (0 0 -1);」は重力の方向を正しく指定する必要があります。
今回はz方向下向きに重力がはたらいているためこのような設定としました。

また、「postProcessing/interfaceHeight1/0/height.dat」には一つの座標に対して以下の出力結果が出されます。

  • # hB : Interface height above the boundary:水面の高さ
  • # hL : Interface height above the location:波の高さ

いずれも重力の方向を正しく指定することが重要です。

本来はこちらの設定の方が結果処理の手間が省けて良いのですが、計算実行後に設定し忘れて(もしくは後で見たくなった)などの理由で可視化ソフトで表示させたいということは稀にあります。

今回の内容

3次元ダムブレイクの実験の指定した座標位置での水面高さをParaViewで表示し、Pythonスクリプトにして自動化する方法について解説を行います。

OpenFOAM初心者でチュートリアルを動かしたことがある方を対象にしています。

DEXCS2020
OpenFOAM v2006
gnuplot 5.2

3次元ダムブレイクの実験データと解析モデル

実験データ

こちらの実験データのより以下の時刻歴データを計測しています。

  • 圧力計測点P1~P8(前回の記事)
  • 水面の高さH1~H4←今回OpenFOAMと比較する対象

ちなみに「system/controlDict」ファイル内のfunctionObjectのinterfaceHeightで取得した特定座標の水面高さを実験データと比較すると下記のようになります。

そこそこ実験とOpenFOAMの結果が合っていますね。

解析モデル

OpenFOAMでの解析モデルの設定方法は下記の記事に書いています。
※追々ファイルもモデルファイルも公開します。

ParaViewで水面高さのコンター図

ParaViewを起動したら資料に従ってParaviewの操作を記録していきます。

操作が記録されて出力されたPythonスクリプトがこちらです。

height_main.py

Pythonスクリプトの読み込み

先ほど作成したPythonスクリプトを読み込んで操作の再現を行います。

Paraviewから読み込み

Paraviewを起動してPython Shellが表示されていることを確認します。
表示されていない場合は「View」>「Python Shell」にチェックを入れます。

“Run Scrip”から実行

自動で読み込まれます。

コマンドのオプションでParaviewを起動

コマンドでParaviewをPythonスクリプトを読み込ませて起動させることができます。

ターミナル上で以下のコマンドを打ちます。

自動で読み込まれます。

pvpython

Pythonスクリプトの操作の記録の中には水面高さによるデータを出力する操作も含まれています。以下の部分ですね。

水面高さを知りたいだけならParaviewを起動させずにcsvファイルだけを出力できるといいですよね。

PvPythonはParaViewのPythonインターフェイスを備えたParaViewと考えることができます。pvpythonにコマンドを手動で入力できます。

ターミナル上で以下のコマンドを打ちます。

以下のような対話型に変わります。

Paraview内で使われているPythonのバージョンが2.7.18となっています。
最新のPythonのバージョンは3系なので注意が必要ですね。バージョン2系と3系ではずいぶん記述方法が変わったので、注意しないと思わぬエラーが出ます。(Paraview内のPythonを3系にアップデートすれば良いのですが、それは追々_(._.)_)

以下のように実行するとPythonのライブラリのインストール先が確認できます。

Pythonスクリプトは以下のコマンド実行できます。

Paraviewは起動されませんが、フォルダ内に「height_water.csv」が出力されます。

結果のグラフ化は後半にgnuplotで行います。

時間指定で出力

先ほどまではPythonスクリプトを実行しても初期状態の水面高さのcsvファイルしか出力されませんでしたが、計算時間(0~8秒)の1秒ごとのデータがほしいのですね。

まずは、時間指定で出力できるようにします。

height_main.pyは、

で読み込んでいるので、この後くらいに時間指定の記述を書いておきます。

「animationScene1.AnimationTime = 指定時間」とします。
0~8秒の時間がほしいので「ani_time = 5」と変数定義しておきます。
ステップ数ではなく時間なのでもっと細かくしたい場合は0.1刻みで指定しても良いでしょう。

csvファイルも指定した時間でファイル名を区別したいので変数を使います。

※Python3系だと文字列の中に以下のようにフォーマット文字列が使えるのですが、2系だと使えないので上記のように記述する必要があります。

全体のコードはこちら↓

height_main.py

ターミナル上で以下のコマンドを打ちます。

もしくは

として結果が正常に読み込めているかを確認しましょう。

1秒ごとにファイル出力

先ほどのファイルを少し修正します。

for文にして各時間でループを回すようにしました。

height_main_Alltime.py

ターミナル上で以下のコマンドを打ちます。

何やらエラーが出ますがcsvファイルは正常に出力してくれています。
ひとまずエラー内容の対処はせず次に進みます_(._.)_

gnuplotで可視化

先ほど出力したcsvファイルはgnuplotでグラフ化するのが簡単ですね。
ターミナル上で「gnuplot」と打ってgnuplotを起動します。

対話モードになったらデータをプロットします。

  • 横軸:6列目(x座標)
  • 縦軸:8列目(z座標)

なので、以下のように列指定でプロットしようとするとエラーがでました。

データがカンマ区切りなのでエラーが出たようです。

と打って再度プロットさせます。

上手くいきました。

1秒ごとのデータを重ねてみます。
ベタでですが以下のようにしてプロットします。(gnuplotもスクリプトにして繰り返し文など使えるのですが、ここではべた書きしておきます)

データが多くてカオスですが、水面高さの時刻歴変化をプロットできました。

gnuplotでアニメーション作成

さきほど作成した水面高さのグラフを繋げてアニメーションにします。
Paraviewで水面高さのアニメーションは見れるので、ここでもう一回アニメーションに作り替えるのは意味がないことですが、アニメーション作成方法のメモとして残しておきます。

gnuplotもスクリプトとして保存できるので以下のようにします。

movie_script

ターミナル上で以下のコマンドを打ちます。

もしくはgnuplotを起動してloadで読み込みます。

このように「heitht.gif」というファイル名でアニメーションができます。

まとめ

今回はParaviewで水面高さを出力する方法を解説しました。
少し手間ですがスクリプトを上手く書いてカスタマイズすれば自動化ができそうですね。

実験ではx方向に

  1. H1=0.496m
  2. H2=0.992m
  3. H3=1.488m
  4. H4=2.638m

のポイントで水面高さを出力しています。

今回作成したcsvファイルから指定のx座標での水面の高さ(z座標)の時刻歴を作成すれば、指定した座標での水面高さの時刻歴が作成できますね。

参考書

PENGUINさんサイトを体系的に学べる書籍となっています。ネット記事でも十分勉強できるのですが、OpenFOAMの初学者でOpenFOAMをインストール済みであれば一冊持って置き、体系的に学ぶのが良いでしょう。

OpenFOAMによる熱移動と流れの数値解析(第2版)

OpenFOAMによる熱移動と流れの数値解析(第2版)

3,520円(04/16 09:39時点)
Amazonの情報を掲載しています

あとは初心者向けに丁寧に解説がされているこちらの書籍もお勧めです。最後の章にはオーバーセットメッシュ(重合メッシュ)の機能を使った解析を最後まで丁寧に解説しているので挫折することはないでしょう。

OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))

OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))

川畑 真一
1,980円(04/16 11:52時点)
発売日: 2021/02/26
Amazonの情報を掲載しています
関連記事もどうぞ

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です