解析実行
並列化計算なし
並列計算を行わない場合は以下のコマンドで計算実行を行います。
1 |
interFoam |
バックグラウンドで計算の処理を行いたい場合は、コマンドの後ろに&」を付けます。
1 |
interFoam & |
計算の処理のログをテキストに書き出したい場合は以下のように書きます。
1 |
interFoam & > interFoam.log |
拡張子は何でも良いです。
「interFoam.log」を適当なテキストエディタで開くと計算ログを確認することができます。
※並列計算を行うとなぜか「水面高さ」の出力がされなかったため、今回は並列計算なしで計算を行います。
計算が終わったらparaviewで結果を確認しましょう。
このように水が崩れて障害物で水しぶきを上げている結果が得られました。
並列計算あり
その他の設定は特に触っていないのでそのままでいきます。
設定が終わったので以下のコマンドで解析を実行しましょう。
1 2 3 |
decomposePar mpirun -np 4 interFoam -parallel reconstructPar |
結果処理
実験データ
こちらの実験データより圧力データを入手します。
zipファイルを解凍します。
「test_case_2_exp_data.xls」が実験データです。
指定した圧力の時刻歴(gnuplotでグラフ化)
gnuplotをExcelデータで読み込むことができなかったため(文字コードが違う?)ため、Excelデータを全てコピーし、新規作成のテキストファイルに貼り直してcsvファイルの名前を「test_case_2_exp_data.csv」として保存します。
treeコマンドでファイル構成を見ておきましょう。
実験データは「exp_data/3D_damBrake_experiment_data/9449af_6ce73873d6d04315853e481c337dbfca」に保存しています。
※計算結果は省略
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
tree . ├── 0 │ ├── 0.org │ │ ├── U │ │ ├── alpha.water │ │ ├── k │ │ ├── nut │ │ ├── omega │ │ └── p_rgh │ ├── U │ ├── alpha.water │ ├── k │ ├── nut │ ├── omega │ ├── p_rgh │ └── polyMesh │ └── cellMap ├── 0.org │ ├── 0.org │ │ ├── U │ │ ├── alpha.water │ │ ├── k │ │ ├── nut │ │ ├── omega │ │ └── p_rgh │ ├── U │ ├── alpha.water │ ├── k │ ├── nut │ ├── omega │ └── p_rgh ├── Allclean ├── Allrun ├── constant │ ├── dynamicMeshDict │ ├── g │ ├── polyMesh │ │ ├── boundary │ │ ├── cellZones │ │ ├── faceZones │ │ ├── faces │ │ ├── neighbour │ │ ├── owner │ │ ├── pointZones │ │ ├── points │ │ └── sets │ │ ├── c0 │ │ ├── refineCells │ │ └── refinedCells │ ├── transportProperties │ └── turbulenceProperties ├── damBreakWithObstacle_noDynamichMesh_rasidual.OpenFOAM ├── exp_data │ └── 3D_damBrake_experiment_data │ ├── 9449af_6ce73873d6d04315853e481c337dbfca │ │ ├── test_case_2.f │ │ ├── test_case_2_exp_data.csv │ │ ├── test_case_2_exp_data.xls │ │ └── test_case_2_v1p1.pdf ├── run └── system ├── blockMeshDict ├── controlDict ├── decomposeParDict ├── fvSchemes ├── fvSolution ├── probes ├── refineMeshDict ├── setFieldsDict ├── topoSetDict1 └── topoSetDict2 16 directories, 78 files |
gnuplotを起動します。
gnuplotと打つとgnuplotが起動し対話形式になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ gnuplot G N U P L O T Version 5.2 patchlevel 8 last modified 2019-12-01 Copyright (C) 1986-1993, 1998, 2004, 2007-2019 Thomas Williams, Colin Kelley and many others gnuplot home: http://www.gnuplot.info faq, bugs, etc: type "help FAQ" immediate help: type "help" (plot window: hit 'h') Terminal type is now 'qt' gnuplot> |
このようになっていればgnuplotが使えます。
以下のコマンドを打って圧力計測点P1の実験データとOpenFOAMの結果を比較してみましょう。
1 |
plot "exp_data/3D_damBrake_experiment_data/9449af_6ce73873d6d04315853e481c337dbfca/test_case_2_exp_data.csv" us 1:2 with lines lt 1 lw 3 title "EXP P1", "postProcessing/probes/0/p" us 1:2 with lines lt 2 lw 3 title "OpenFOAM p1" |
さらにグラフをきれいに見せたい場合は以下のページを参考にアレンジすることができます。
以下の記述を「gnuplot_run_P.plt」という名前で保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
point=1 #変数 sample=sprintf("%d",point+1) #数値を文字列(整数型)に変換 # 画像の保存 set terminal png set output "graph_P".point.".png" # 画枠のマージン set lmargin 15 set tmargin 5 set rmargin 10 set bmargin 5 set mxtics #set mxtics 10 # グリッドを表示 set grid # 座標軸レンジとラベル set yrange[0:12000] set xlabel font "Arial,16" set ylabel font "Arial,16" set tics font "Arial,20" set ylabel 'Pressure(Pa)' offset -2,0 set xlabel 'Time(sec)' offset 0,-1 # グラフタイトル set title "Pressure P".point offset -5,0 font "Arial,24" plot "exp_data/3D_damBrake_experiment_data/9449af_6ce73873d6d04315853e481c337dbfca/test_case_2_exp_data.csv" us 1:@sample with lines lt 1 lw 3 title "EXP P".point, "postProcessing/probes/0/p" us 1:@sample with lines lt 2 lw 3 title "OpenFOAM P".point |
スクリプトの実行は以下のコマンド行います。
1 |
load "gnuplot_run_P.plt" |
以上を実行すると「graph_P1.png」という画像ファイルが作成されています。
先頭分で「point=”1″ #変数」と変数定義しています。
文字列は「.(ドット)」を使って連結できます。
例えば「set output “graph_”.sample.”.png”」にすることで「set output “graph_1.png”」となります。
では他の計測点も比較してみましょう。
全ての点で概ね良い結果ですね。
ただ初期のピークが全計測点であっていないですね。このピークが目的に対して重要ならモデルの修正が必要になります。実際、メッシュサイズの変更により実験データに近づきます。
gnuplotはスクリプト言語なので繰り返し文を使えば、以下のスクリプトで各測定点の時刻歴データの画像ファイルを出力できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
if (exist("n")==0 || n<0) n=0 #変数の初期化 point=n+1 sample=sprintf("%d",point+1) #数値を文字列(整数型)に変換 # exp_data="exp_data/3D_damBrake_experiment_data/9449af_6ce73873d6d04315853e481c337dbfca/test_case_2_exp_data.csv" CAE_data="postProcessing/probes/0/p" # 画像の保存 set terminal png set output "graph_P".point.".png" # 画枠のマージン set lmargin 15 set tmargin 5 set rmargin 10 set bmargin 5 set mxtics #set mxtics 10 # グリッドを表示 set grid # 座標軸レンジとラベル set yrange[0:12000] set xlabel font "Arial,16" set ylabel font "Arial,16" set tics font "Arial,20" set ylabel 'Pressure(Pa)' offset -2,0 set xlabel 'Time(sec)' offset 0,-1 # グラフタイトル set title "Pressure P".point offset -5,0 font "Arial,24" plot "exp_data/3D_damBrake_experiment_data/9449af_6ce73873d6d04315853e481c337dbfca/test_case_2_exp_data.csv" us 1:@sample with lines lt 1 lw 3 title "EXP P".point, "postProcessing/probes/0/p" us 1:@sample with lines lt 2 lw 3 title "OpenFOAM P".point if (n<3) pause 0.1; n=n+1; \ reread # スクリプトの再読み込み n=-1 #end of script |
- 1行目で変数nを初期化
reread
が実行されてスクリプトの最初に戻る
Paraviewでの圧力のグラフ化も可能です。
解析実行後に各座標の圧力の時刻歴を知りたい場合は、この方法でもいいですね。
Paraviewもちょっとわかった。 pic.twitter.com/o9eObQqEva
— カマキリ🐲Python頑張る昆虫 (@t_kun_kamakiri) May 28, 2022
水面の高さの時刻歴(gnuplotでグラフ化)
指定した位置での水面の他高さはの時刻歴の記事同様gnuplotスクリプトで可視化します。
以下の記述を「gnuplot_run_H.plt」というファイル名で保存しgnuplotを起動してスクリプトを読み込みみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
if (exist("n")==0 || n<0) n=0 #変数の初期化 point=n+1 sample=sprintf("%d",point+1) #数値を文字列(整数型)に変換 # exp_data="exp_data/3D_damBrake_experiment_data/9449af_6ce73873d6d04315853e481c337dbfca/test_case_2_exp_data.csv" CAE_data="postProcessing/probes/0/p" # 画像の保存 set terminal png set output "graph_P".point.".png" # 画枠のマージン set lmargin 15 set tmargin 5 set rmargin 10 set bmargin 5 set mxtics #set mxtics 10 # グリッドを表示 set grid # 座標軸レンジとラベル set yrange[0:12000] set xlabel font "Arial,16" set ylabel font "Arial,16" set tics font "Arial,20" set ylabel 'Pressure(Pa)' offset -2,0 set xlabel 'Time(sec)' offset 0,-1 # グラフタイトル set title "Pressure P".point offset -5,0 font "Arial,24" plot "exp_data/3D_damBrake_experiment_data/9449af_6ce73873d6d04315853e481c337dbfca/test_case_2_exp_data.csv" us 1:@sample with lines lt 1 lw 3 title "EXP P".point, "postProcessing/probes/0/p" us 1:@sample with lines lt 2 lw 3 title "OpenFOAM P".point if (n<3) pause 0.1; n=n+1; \ reread # スクリプトの再読み込み n=-1 #end of script |
- 1行目で変数nを初期化
reread
が実行されてスクリプトの最初に戻る
ターミナル上で以下のコマンドを打ちます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ gnuplot G N U P L O T Version 5.2 patchlevel 8 last modified 2019-12-01 Copyright (C) 1986-1993, 1998, 2004, 2007-2019 Thomas Williams, Colin Kelley and many others gnuplot home: http://www.gnuplot.info faq, bugs, etc: type "help FAQ" immediate help: type "help" (plot window: hit 'h') Terminal type is now 'qt' |
gnuplotが起動したら以下のように打ってスクリプトを実行します。
1 |
gnuplot> loat "gnuplot_run_H.plt" |
各位置での水面の高さについて実験データとOpenFOAMを比較すると以下のようになります。概ね良い結果ですね。
Paraviewで水面高さの表示をすることができましたが、少々面倒でした。
それに指定した座標での水面高さの出力が難しかったです。
指定座標の界面の高さの時刻歴をParaviewで表示するのは難しい…
指定時刻のみならできた。こちら試してみようかな。https://t.co/0tvPJP1kYD pic.twitter.com/VDCgxhZueL
— カマキリ🐲Python頑張る昆虫 (@t_kun_kamakiri) May 30, 2022
操作方法は別途記事でも書きます_(._.)_
Paraviewでの方法がお分かりの方は教えていただければ幸いです。
スクリプトを使った方法だと下記の記事が参考になります。
実機とCAEとのコリレーションについて
「CAE解析と実測データのコリレーションをとる」といった場合に、「実験データとCAE解析によるシミュレーション結果の相関確認」ということを意味します。
要するにコリレーションとは実験とCAE結果が近しいかどうかを確認するということです。
流体現象などの物理現象をバーチャル上で再現し、製品開発や不具合対策などに活かす活動は製造業でもずいぶんと定着してきたようです。バーチャル上で再現する現象はソフト化され、今やCA解析が開発工程の一部になっていることがほとんどです。
※CAEとはcomputer-aided engineering、シーエーイーは、コンピュータによって支援された、製品の設計・製造や工程設計の事前検討などといったエンジニアリングの作業のこと。
注意すべき点は、CAE解析に至るまでの工程ではあくまで実現象を数理モデルによりモデル化し、そのモデルが偏微分方程式ことが多く手計算で求めることができないため、パソコンが解ける形に離散化し代数的に解けるようなステップを踏んでいるという点です。
CAE解析をいきなり開発の工程で使用するのではなく、既に過去に実施された実験データとの比較を行い実験データとCAE解析がある程度近しいことを確認する必要があります。
ベンチマークサイトもあるのでV&Vを意識した活動が必要です。
まとめ
本記事はOpenFOAMを使って3次元ダムブレイクのメッシュ作成・解析設定と実験データとの比較までをまとめました。
参考書
PENGUINさんサイトを体系的に学べる書籍となっています。ネット記事でも十分勉強できるのですが、OpenFOAMの初学者でOpenFOAMをインストール済みであれば一冊持って置き、体系的に学ぶのが良いでしょう。
あとは初心者向けに丁寧に解説がされているこちらの書籍もお勧めです。最後の章にはオーバーセットメッシュ(重合メッシュ)の機能を使った解析を最後まで丁寧に解説しているので挫折することはないでしょう。
OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))
大変貴重な記事ありがとうございます。