こんにちは。ゆってーです。
先日、ブーメラン構想という記事を書きましたが、そのブーメランの飛び方について流体力学シミュレーションというアプローチを考えていました。流体力学によるシミュレーションを行うソフトは世の中にいろいろ存在しますが、有料のものは個人の趣味で買うにはちょっと手が出ないものが多いです。
そこで、OSSの流体シミュレーションソフトを探すのですが、比較的歴史があって、機能が豊富で安定して(ソフト的にも開発ペース的にも)いるものはおそらくOpenFOAMではないかと思います。
OpenFOAMは、おそらくLinux系のOSで使われることが多いのではないかと思いますが、今回はWindowsベースで使うことを想定していきます。私も仕事で使うならUbuntu用のサーバを用意してそのうえで、ゴリゴリ計算させると思うのですが、個人の趣味レベルだとなかなかそこまでは。。。という感じです。
というわけで、今回はWindows上で、OpenFOAMを動かす方法についてご紹介していきたいと思います。
OpenFOAMって?
おそらくOSSではもっとも有名な流体シミュレーションソフトかと思います。詳細は本家サイトにお任せし、ここでは必要最低限のざっくり説明で進めさせていただきます。
流体シミュレーションとは、細かく分類していくといろいろな手法がありますが、おそらく主流な方法はナビエ・ストークス方程式を離散化して解くアプローチのものかと思います。もうちょっと応用よりにかみ砕くと
- ブーメランが飛び回るためのメッシュ状の空間(空気で満たされている)を定義する
- ブーメランに初期条件(時刻t=0[秒]における位置・速度・回転など)を定義する
- 時間を少しだけ進めたときに空気の流れ(速度・圧力など)やブーメランの動き(ブーメランに及ぶ力やブーメランの速度、位置・回転など)を計算してそれぞれを更新。これを、必要な結果が得られるまで(t=10[秒]までやるなど)繰り返す
ということです。OpenFOAMにはこれらを実現するような機能がそろっていると思われるので、これを使ってブーメランの飛び方を流体力学的に解析していくことを検討したいと思います。
OpenFOAMをWindowsにインストールする
OpenFOAMは、基本的にLinuxやMacのような、コアがUnix系OSでできているようなOSを想定しているため、Windowsではそのままでは動きません。しかし、近年はWindows on LinuxというMicrosoftが公式にリリースしているLinux仮想環境をインストールすれば、その上でLinuxで動くようなソフトは大抵動きます。
さて、今回はこのインストール過程を記事にしようと思っていたのですが、すでに先人の素晴らしい記事がありますのでそちらをご紹介するにとどめ、本記事ではその先のちょっとだけシミュレーションで遊んでみるところを書いてみたいと思います。
Windows11版OpenFOAMのインストール方法 | 株式会社ソフトフロー (softflow.jp)
こちらに従っていけば、Ubuntu 22.04.2上でOpenFOAMのESI版のv2306を動かせるようになります。
ただし、ちょっと私の個人的な都合で申し訳ないですが、私自身はUbuntu 22.04.3上で、ESI版v2312をインストールしておりますので、以下の記事はこの組み合わせを前提としていることをご了承ください。(今回の内容に関しては、あまり大きな違いはないかと思います。)
チュートリアルを動かしてみる
OpenFOAMでは、サンプルプログラムに相当するチュートリアルケースが付属しており、大抵はこの中から、自分がやりたいシミュレーションに近いものを探して、改造して使うことになるかと思います。
さて、ESI版OpenFOAMを公式の通りaptでインストールした場合、以下のようなフォルダにチュートリアルがごっそりあるかと思います。
/usr/lib/openfoam/openfoam2312/tutorials/
この中から今回は以下の2つのチュートリアルを動かしてみたいと思います。
- incompressible/icoFoam/cavity
- multiphase/interFoam/RAS/floatingObject
ちなみに、私の実行環境は以下のようなスペックです(数年前に購入したDELL XPS15です)。今回のシミュレーションを動かす程度ならば、ここまでスペックがなくても全然OKと思います。
項目 | 値 |
CPU | Intel Corei9-9980HK @2.4GHz (8コア) |
メモリ | 32GB |
incompressible/icoFoam/cavityを動かす
このチュートリアルは、いわゆるキャビティ流れをicoFoamという、非圧縮流体ソルバーとしては非常にオーソドックスなソルバーを使ってシミュレーションします。
先ほどのチュートリアルがごっそりある場所から、ケースファイル一式をホームディレクトリにコピーします。
$ cp -r /usr/lib/openfoam/openfoam2312/tutorials/incompressible/icoFoam/cavity .
フォルダの中には、Allrun、Allcleanというファイルと、cavity、cavityClipped、cavityFine 、cavityGrade、cavityHighReというフォルダがあります。先の2つはそれぞれ、シミュレーションの実行、シミュレーション結果の除去のスクリプトで、後の4つは異なる4つのケースファイルです。以下のようにシミュレーションを実行してみます。
$ cd cavity
$ ./Allrun
ずらずらっとログ出力的なものが出たら終了です。私のPCでは1秒くらいでした。4つのケース全部やってしまいましたが、今回は1つ目のcavityについてだけ見ていきます。paraFoamを使って結果を見ていきましょう。
$ cd cavity
$ paraFoam
以下のようなGUIが起動してきたと思います。
画面左側のApplyというボタンを押すと、時刻0.1[秒]における圧力が表示されます。
画面上部のpと書かれている部分をほかのもの(Uなど)に切り替えると、表示を圧力以外の物理量(流速など)に切り替えられます。
また、▷(再生)や、Time:の横の数値をいじることで、時間方向の変化を見ることができます。
また、絵が表示されている部分をマウスのドラッグで動かすことで、見る角度を変えることができます。
また、画面上部のFilters→Alphabetical→Annotate Time Filterとすると、絵の中に現在時刻を表示することができます。(上記操作直後は非表示となっていることがあるので、画面左Pipeline BrowserのAnnotateTimeFilter1の左側の「目」マークをクリックして表示状態とします。)
こうして可視化した結果を画像や動画として残しておきたい場合は、画面上部からFile→Save Animationsと進み、保存するファイル名形式やフォーマット、圧縮率などを設定してOKとすると、各タイムステップの画像が保存されます。
今回の場合ですと、出力先に、cavity.0000.png~cavity.0004.pngの5つのファイルが出力されていると思います。それぞれ時刻0、0.1、0.2、0.3、0.4における空間の状態を可視化したものになります。ただ、時刻0.1でほぼほぼ収束しているように見えるので、視覚的にはあまり面白くないと思います。
せっかくなので、デフォルトの設定を少しいじり、もう少し細かい時間間隔で画像を出力してみましょう。cavityフォルダにあるsystem/controlDictというファイルを編集します。
$ vi system/controlDict
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2312 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
application icoFoam;
startFrom startTime;
startTime 0;
stopAt endTime;
endTime 0.5;
deltaT 0.005;
writeControl timeStep;
//writeInterval 20;
writeInterval 1;
purgeWrite 0;
writeFormat ascii;
writePrecision 6;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable true;
// ************************************************************************* //
もともとは時刻0から0.005[秒]ステップで0.5[秒]まで時間発展させ、20ステップに1度結果をファイル出力するという設定でしたが、writeIntervalを1にして、さらにすべてのステップでの結果が出力されるようにしてみます。再度シミュレーションし(一度Allcleanで元の結果を消しておくと良いでしょう)、paraFoamで開いてみると、結果がより細かい時間間隔(0.005秒ステップ)で可視化できていることがわかります。
先ほどと同様にSave Animationをすると、cavity.0000.png~cavity.0099.pngまでの100個の画像ファイルができているかと思います。せっかくなので、これをffmpegで動画にしてみましょう。
もしffmpegが未インストールであれば、以下のようにしてインストールします。
# apt install ffmpeg
以下のコマンドで、100個の画像ファイルを結合したwmvファイルを出力します。
$ ffmpeg -i cavity.%04d.png cavity.wmv
以下では、さらにcontrolDictのdeltaTを0.001にして、シミュレーション自体のタイムステップを1/5にしたときの(画像としては500枚分)流速Uのマグニチュードを動画にしたものです。
multiphase/interFoam/RAS/floatingObjectを動かす
こちらは、interFoamという2層流のソルバーとしては最もオーソドックスなソルバーで、液体(水のようなもの?)と気体(空気のようなもの?)の間に直方体の剛体がいて、液体の流れに任せてぷかぷかと浮かんでいるようなシミュレーションになります。
まずはcavityと同様に、ホームディレクトリにケースファイルをコピーします。
$ cp -r /usr/lib/openfoam/openfoam2312/tutorials/multiphase/interFoam/RAS/floatingObject .
floatingObjectに関しては、このフォルダそのものが1個のケースファイルです。cavityと同様にAllrunを実行してシミュレーションします。cavityよりは少し時間がかかります(私の環境で数十秒くらいでした)。
$ cd floatingObject
$ ./Allrun
cavityと同様にparaFoamで可視化してみます。ただし、今回は気液や剛体との界面をみてみたいので、以下のように設定してみます。
まとめ
今回は、Windows11でWindows Subsystem for Linux2を有効にし、Ubuntu Linuxをインストールし、OpenFOAM(ESI版)をインストールして、いくつかのチュートリアルケースを実行してみて使えることを確認しました。
次回は、実際にブーメランの飛翔にOpenFOAMが使えるのかどうかを見ていきたいと思います。
コメント