OpenFOAM

【OpenFOAM】スロッシングの実験比較(設定ファイル解説あり)

こんにちは(@t_kun_kamakiri

本記事ではOpenFOAMを用いたスロッシングタンクの流体解析を設定の解説を行います。

本記事の内容
  • OpenFOAMでスロッシングタンクの解析設定を解説
  • スロッシングタンクの実験データとの比較を行う

スロッシングタンクは、タンク内に入れた液体が周期的な振動によりうねる現象のことです。構造物には構造物特有の固有振動を持っているため、その周期と重なったときに共振を起こし小さな力でも問題になることがあります。

こんな方を対象
  • OpenFOAMでダイナミックメッシュをやってみたい
  • 流体解析を実験データと比較したい

ベンチマークテストの試験データとOpenFOAMとの比較も行います。

OpenFOAMで再現するのはこちらの実験です。
タンクが振動して水がバシャバシャ暴れていますね。

CAEと実機との比較検討は本記事では十分に行うことができませんが、解析設定から実験データとの比較まで一連の流れを体験することができます。

OpenFOAMv2212
Python3.8.5

解析対象

まずは解析対象を確認します。
実験の元データはこちらになります。

自身が解析するフォルダにとりあえず保存しておきましょう。
フォルダの中に試験の解説が書かれているpdfがあります。

試験の寸法はこちらにきっちり書かれています。
Sensor1~6は実験での圧力センサーの位置です。
OpenFOAMでも同じ位置にprobeを設けて圧力の時刻歴変化を出力するようにします。
試験ではz方向の厚みを31mm,62mm,124mmの3パターン行っていますが、データとして62mmのみを保存しているとのことです。

振動周期は以下のように書かれています。

$T_{1}$が振動の周期[s]です。
OpenFOAMでこれ通りに与えると、そもそも試験での振動と上記の数式による振動の周期が微妙にずれていました。
ですので、ここでは実験で得られた試験データの振動周期をOpenFOAMにも与えるようにします。試験条件が違うとなると実機とCAEのコリレーションの意味がなくなるので。

H[mm]の高さが2パターンありますが、これは液体の初期水位です。
今回示すのはH=93mmですので、93mだけ見ておけば良いです。
また、液体はwater(水)です。

物性値は以下のようになっています。
Water(水)による実験データと比較するのでwaterだけを見ておけば良いです。

以上で解析対象の説明が終わりました。
以下でOpenFOAMの解析設定の解説を行います。

チュートリアルから解析ケースをコピー

OpenFOAMにスロッシング用のチュートリアルがあるのでそれをコピーします。

※「$FOAM_TUTORIALS=/usr/lib/openfoam/openfoam2212/tutorials」

ソルバはinterFoamを使います。
気体と液体を体積分率$\alpha$で区別するVOF法による解析ソルバです。

先ほど入手した試験データは001_runと同じ階層に保存しておきます。

  • 001_run
  • expdata/9449af_05f4aa0eaa1d4164a1024d07c562592a/SPHERIC_TestCase10

9449af_05f4aa0eaa1d4164a1024d07c562592aは元々のフォルダ名ですので、この辺は好みで名前やフォルダ構成を変えてください。

メッシュ作成

形状は直方体なのでblockMeshで簡単に設定することができます。
形状作成とメッシュ作成、境界面の名前はblockMeshで行います。

system/blockMeshDict

設定が終わりましたら、blockMeshを実行します。

結果をParaViewで確認しましょう。

形状はいたってシンプルですね。

境界条件の設定

乱流モデルを使わない解析ですので、設定する物理量はU(流速)、p_rgh(圧力)、体積分率alpha.waterです。
圧力は計算の便宜上$p-\rho \boldsymbol{g}\cdot h$という値で行っている点に注意です。

いつでも初期化できるように0.origフォルダ内のファイルを編集します。

0.orig/U

 

壁条件ではありますが振動をしているのでtypeをmovingWallVelocityとしています。

movingWallVelocity:パッチでのフラックスが0となるよう、パッチでの値の法線方向を置き換える。

0.orig/p_rgh

fixedFluxPressureは境界のフラックスが速度の境界条件にマッチするように圧力勾配を調整するものです。

0.orig/alpha.water

typeを法線方向の勾配0のzeroGradientとしておきます。

初期状態の設定

初期状態としては水を93mm浸した状態を作るためsetFieldsで場の設定を行います。

system/setFieldsDict

では初期状態を確認しましょう。
まず、先ほど境界条件で0.origで設定したので0フォルダという名前にコピーします。

setFieldsにより0フォルダ内はalpha.waterの分布を持ったファイルができてしまうので、0.origを残しておくと後で境界条件を設定しなおすときに便利です。

では、setFieldsを実行します。

ParaViewで結果を見てみましょう。

ParaViewのデフォルトが0フォルダを読みこまない設定になっているので、「Skip Zero Time」のチェックを外して読み込んでください。
図のように93mmに体積分率$\alpha=1$(水)が表示されていればOKです。

移動メッシュの設定

移動メッシュはconstant /dynamicMeshDictで行います。

solidBodyMotionFunctionは以下のように選択ができます。

3次元6自由度の振動を与えるためtabulated6DoFMotionとしています。
CofGは重心位置のことです。
「timeDataFileName “<constant>/1DoF_exp.dat”;」で振動のデータを与えています。

1DoF_exp.dat”には決まったフォームでデータを書かないといけないので、エクセルで処理します。

  • SPHERIC_TestCase10/data_files/lateral_oil_1x.txtをExcelにタブ区切りで貼り付ける
  • 以下のように入力用のフォームにする
  • コピーしてconstant/1DoF_exp.datにコピーする

constant/1DoF_exp.dat

※余談ですがチュートリアルには数式で上記の振動データを作るプログラムがありました。こちらの数式に従いプログラムを作成してタンクの振動のインプットデータとして使うことができます。試しにやってみましょう。

型定義などはOpenFOAM用のC++って感じですがわりと簡単に関数を作れます。
作ったプログラムが以下です。

gen6DoF/gen6DoF.C

こちらをコンパイルします。

同じフォルダに「MyGen1DoF.dat」が出力されて先ほどのconstant/1DoF_exp.datとして使うことができます。

こちらのインプットデータで解析をしましたが、試験とタンクの振動周期がずれてきます。

試験が理論通りにいかないことはよくあることです。今回は振動のインプットデータは試験と同じにしたいので試験データの振動をそのままOpenFOAMのデータとして使います。
もし、振動が理論通りになっているかどうかも含めて知りたい、もしくは試験データがまだないと言った場合は理論式を使わざるを得ないのです。

物性値

物性値はconstant/transportPropertiesで行います。
こちらは資料通りに設定します。

constant/transportProperties

離散化スキーム

離散化スキームはデフォルトの設定のままでよいです。

system/fvSchemes

対流項は2次精度のTVDスキームvanLeerを使用しています。

代数ソルバ

代数ソルバもデフォルトのままでよいです。

system/fvSolution

以下で基準圧を指定しています。

  • pRefPoint (0 0 0);
  • pRefValue 1e5;

pRefValueの値を0Paとしていると実験と同じ基準圧になります。

計算制御

controlDictでは計算制御の設定と物理量の出力設定を行います。

system/controlDict

時間刻みは「maxCo 0.5; 」のクーラン数0.5で指定しています。
ちなみに「deltaT 0.01;」は初期値にしか使っていないので(初期値にも使ってないかも)、こちらの値を小さくしても時間刻みは変わらないので注意です。
時間刻みを変えたい場合はクーラン数を小さくしましょう。

functionsで指定した位置での圧力を出力する設定を行っています。

  • 測定点は移動する場合と移動しない場合を考える必要があります。
  • メッシュ移動するけど初期の固定位置で測定したい場合はyes(or true)
  • メッシュ移動すると移動した分だけ測定位置も変わる場合はno
    今回は容器に圧力計測を取り付けているので、fixedLocationsはnoとする必要があります。
fixedLocations Do not recalculate cells if mesh moves no true

以上で解析の設定が終了です。
次に計算を実行します。

計算実行

interFoamコマンドを実行して計算を実行します。
※今回は並列計算無しで計算をさせますが、8秒前の解析で数十分かかるので、待ってられない方は並列計算をさせてください。

  • interFoam:ソルバの実行
  • log.interFoam:log.interFoamにログを出力
  • &:バックグラウンドで流す

ParaViewで確認します。CAEは水しぶきの水がぼやけてしまっていますね。

実験の動画も載せておきます。

 

実験と比較するとCAEは解像度から水しぶきがぼやけているため、実機との乖離があります。今回使っているVOFによる解法はメッシュが粗いと空気と水との境界で体積分率がなまってしまうという問題があるため、ここからCAEの精度を上げるためには改善が必要です。

  • メッシュを細かくして解像度を上げる
    ただし計算負荷がかかる
  • 界面を追跡しながらダイナミックメッシュを行う
    毎時刻メッシュを切り直すの計算負荷がかかる
  • 乱流モデルを設定する
    細かい渦などを見ることを諦めて乱流状態を数理モデルで表現する
    こちらのように
  • 界面圧縮項を大きくする
  • interIsoFoamソルバを使う

interIsoFoam
気液混相流に対してisoAdvector位相分率ベースの界面捕捉アプローチを用いたinterFoamから派生したソルバーで、適応的再メッシュを含むメッシュの動きやメッシュトポロジー変更を任意に行うことができます。interIsoFoamを使うと界面のぼやけるのがinterFoamと比べるとかなり改善されています。

今度のCAE精度アップの改善活動は必要ですが、本記事では深追いはしません。

圧力データの比較

実機とCAEの圧力データの比較を行うために簡単にPythonスクリプトを書きました。
今回はsensor1のみをグラフ化してみます。

おおまかな圧力の挙動は再現できていますね。

ちなみにポリヘドラルメッシュに変えてみましょう。

これまた何とも言えない結果ですね。
ずいぶんノイジーな感じです。

ビタビタに実験とCAEがあることは難しいので、これをどう定量的に合っていると表現するか、どこまでの実機とCAEのコリレーションレベルで妥協するのかは納期や目的にも依るでしょう。

実験データはかなりノイジーなデータなので、n増し(複数回試験をすること)しないとノイズなのか本当にそういう振動なのかが判断付かないというのもあります。このような衝撃のある圧力データなどは1回のデータで判断せずにn増し試験を追加するのが賢明です。

追試験1

どうもOpenFOAMの結果の圧力が1.5秒3.5秒・・・あたりで負圧へ振動しているのが気になっていたのですが、原因が基準圧の座標位置の問題でした。

system/fvSolution

以下で基準圧を指定しています。

  • pRefPoint (-0.45 0.508 0.031));
  • pRefValue 0;

pRefValueの値を0Paとしていると実験と同じ基準圧になります。

これで余計な振動がなくなりました。

追試験2

実験データの「Position_original [deg]」の値が重複しているので、重複を除いたデータにして再度解析を行いました。

重複データの除去は以下のように適当にPythonで行いました。

最終的には以下のようになりました。

最終的なモデルはこちらに置いております。
github

まとめ

今回はOpenFOAMを使ってスロッシングの解析を行いました。
また、実験データとOpenFOAMの結果を比較しおおまかな圧力の挙動は示していることを確認しました。

ただ、実験のような水しぶきを再現するにはVOF法では限界がありそうであることがわかったので、今後CAE向上のためにも改善が必要です。

おすすめ参考図書

☟こちらは、OpenFOAMの日本語書籍が無い中唯一わかりやすい参考書だと思います。

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

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

3,520円(12/03 08:46時点)
Amazonの情報を掲載しています

☟こちらもOpenFOMの古いバージョンでの和訳になります。さすがにこちらはバージョンに対する日本語でのケアはしていないので、OpenFOAMに慣れている方は購入しても良いかと思います。僕は「日本語でまとまっている内容」なので少し重宝しています。

OpenFOAMプログラミング

OpenFOAMプログラミング

Mari´c,Tomislav, H¨opken,Jens, Mooney,Kyle
8,250円(12/03 16:27時点)
Amazonの情報を掲載しています

☟以下に、もっと初心者向けの同人誌を紹介しておきます。
初心者は「ってか、まずどうやってOpenFOAMをインストールするの?」というところからつまずきがちです。
そんな時は、以下の書籍をおすすめします。

改訂新版 OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))

改訂新版 OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))

川畑 真一
1,320円(12/03 20:35時点)
発売日: 2022/04/15
Amazonの情報を掲載しています

インストール方法とチュートリアルで流体解析を体験・・・ちょっと高度な解析まで解説があります。著者曰くOpenFOAMのバージョンの追跡を行いながら、書籍をアップデートするようなので安心ですね。

OpenFOAMコードの辞書的な扱いとしては以下の参考書が大変役に立ちます。
本記事ではESI版のOpenFOAMを使っているため本書のFoundation版で対応していない部分がありますが、その辺を考慮しても持っていて損はないでしょう。

OpenFOAMライブラリリファレンス

OpenFOAMライブラリリファレンス

株式会社テラバイト, 人見 大輔
16,500円(12/04 00:45時点)
Amazonの情報を掲載しています

メッシュ作成を極めたいって方はこちらもお勧めです。
OpenFOAMでメッシュ作成

関連記事もどうぞ

COMMENT

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