こんにちは(@t_kun_kamakiri)(‘◇’)ゞ
この記事では、オープンソースのOpenFOAMを用いて自動車まわりの流れの解析の設定方法を紹介します。
※ただ雛形作成で遊び程度に解析をしてみるだけですので、抗力係数とか計算しません。
- OpenFOAM初心者で空力解析とかしてみたい方
- OpenFOAMをできるだけGUIで設定したい方
OpenFOAMをはじめたばかりの初心者にとっては有益な記事になっていると思いますので、頑張って最後までやりきってみてください(^^)
今回、使うXsimはWebブラウザ上でOpenFOAMの設定ファイルを作成できる非常に使いやすいツールです。
ただ、Xsimにも色々と制限(ファイル容量など)があります。
しかし、Xsimでの設定がとても簡単なのでOpenFOAMのひな形の設定ファイルはXsimで作成しつつ、それを自分がしたい解析内容に編集することで、流体解析を行うという方法をとっています。
本記事を最後まで読んでいただいた方にも楽しめる、初級から中級レベルの方を対象にしたOpenFOAM講座ですをご紹介します。
はじめから読んでいくことでOpenFOAMの基礎が身につきます。
以下は中級レベルですがPythonを使った自動化を行いたい方には良い題材だと思います。
興味がある方は時間があるときにゆっくりとはじめからお読みいただければ幸いです。
ツール
OpenFOAMで一番面倒な設定ファイルをXsimを使って行います。
全体の流れ
環境構築と車体モデルのダウンロード
流体解析のOpenFOAMをWindows10で使用
流体解析のフリーで使用できるOpenFOAMを用いて流体解析を行います。
windows10(64bit)でOpenFOAMの解析を実行します。
windows10で使用するには、下記の記事をもとにすると誰でも環境構築までできると思います。https://www.xsim.info/articles/OpenFOAM/Install-on-Windows10.html
車体モデルのダウンロード
車体のモデルをいちから作成するのは骨が折れる作業ですのでネット上にあるモデルを使わしてもらいましょう。
今回は下記のページからお好みの車体形状のモデルをダウンロードして使用させてもらいます。
http://www.honda-3d.com/no_flash.html
これとか良いのではないか?と思ってダウンロードしてみました。
ダウンロードすると、下記のようにふたつの「stl」ファイルが保存されました。
なにやら2種類のファイルが出力されました。
これを適当な可視化ソフトで開いて確認してみましょう。
paraview(無料可視化ソフト)で開くと、こんな感じです。
※上記のhttps://www.xsim.info/articles/OpenFOAM/Install-on-Windows10.htmlOpenFOAM用のparaviewがインストールされているのでそちらを使っても良いです。
「puyo_HIGH.stl」ファイルをparaviewで確認すると、やたらメッシュが細かいことがわかります。
次にparaviewで「puyo_LOW.stl」ファイルを見てみます。
メッシュが荒めですね。
「puyo_HIGH.stl」と「puyo_LOW.stl」の違いはメッシュの粗さだったのかと理解しました。
ファイルのサイズから「puyo_LOW.stl」を使うのが計算が軽くて済みそうだなと思ったので、「puyo_LOW.stl」を使いたいと思います。
流体解析の解析対象
下記のコンパクトカー周りの流れの様子を解析で示したいと思います。
※できれば車体まわりの抗力係数Cd値の分布とかを見たいところですが、また次回に。
ここでは流れの様子を見るための雛形を作成するというくらいに考えてください。
また、雛形作成が目的なので、外側の流体領域の広さやメッシュの細かさなどはあまりこだわっていません。
解析条件
- 境界条件
- 非定常解析
- クーラン数:0.9
- 非圧縮性条件
- 温度場は解かない
- 乱流モデル:標準\(k-\epsilon\)モデル
pre処理:モデルと設定ファイルの作成
OpenFOAMはフリーでありますが、GUIがないためモデル構築はかなり手間がかかり初心者にはハードルが高いです。
ハードルの高さは、主にテキストベースで流体解析の境界条件などを設定する必要があるため、流体解析の知識と流体力学の正しい知識が必要になります(ある意味勉強になりますが・・・)
僕も含めて初心者の方はいきなり自力で作成するより、GUIを使ってモデルを作成して慣れる方が良いでしょう。
OpenFOAM用のモデル作成ツールとして、いくつかあるのですが代表的なものは以下のものでしょうかね。
今回はXsimを使用してOpenFOAMのモデル作成を行います。
Xsimを使ってOpenFOAM用のモデルを作成
ここからXsimを使わせてもらいます。
↓下記のリンクより使用できます。
まずプロジェクト名を聞かれるので適当な名前のプロジェクト名を付けます。
「形状のインポート」→「ファイルのドロップ」で先ほどダウンロードした「puyo_LOW.stl」をインポートするため、ドロップします。
何!!?ファイルの上限が5MB?
となりました(笑)
ここで、回避方法は2つほど思いつきました。
1. Meshlabを使用してstlファイルのメッシュ数を削減して容量を小さくする。
「Meshlab stl メッシュ数低減」など検索をして使用方法を調べると良いでしょう。
しかし、これ以上メッシュ数を減らして形状を簡略化しすぎるのもな~って思いました。
2. とりあえずダミーのモデルで解析ファイルを作成し、計算時に車体モデルと入れ替える。
例えば、適当にダミーの直方体のモデル回りの流れの解析を実行できる解析ファイルを作成します。
この方法を採用して、モデルを作成してみたいと思います。
ダミーのモデルをFreeCADで作成
FreeCADはwindows版でダウンロードして使用します。
FreeCADの操作感はCATIAと近いものがあります。
では、FreeCADで直方体のモデルを作成していきます。
FreeCADを立ち上げると、新規作成ボタンを押します。
モデルを作成するのに「スケッチ」で絵を書くため、モードを「Part Design」にします。
「スケッチ作成」を選択し、スケッチを描く平面として「xy平面」を選択します。
お好みですがスケッチのグリッド幅は「500mm」にしておきましょうかね。
スケッチとして長方形を描きます。
FreeCADはスケッチで拘束条件で辺や点などを拘束する必要があります。
CATIAも同じように拘束が必要なのですが、さすがCATIAは商用ソフトだけあって拘束条件を適当にしても結構モデルは問題なく作れてしまいます。
しかし、本来数学的に辺や点が定義されて「モデルはこれにしかならない」という状況を作る方が好ましいので、FreeCADはそういう意味で厳密にモデルを作成できます(厳密にモデルを定義する必要があります。)
下記のように寸法拘束ができれば「Close」で閉じます。
※寸法は車体寸法に近いものをで定義しています。
スケッチの作成の後は、押し出して直方体にします。
「押し出し」は2通りの方法でできます。
「タスク」タブから「押し出し」を選択する方法と、「モデル」タブから「Sketch」→「押し出し」のアイコンで押し出す方法です。
いずれかの方法で、z軸方向に「2000mm」押し出します。
※ここではxy平面に対して対称に2000mm押し出したいので、「面に対して対称」にチェックを入れて押し出します。
「Pad」→「Sketch」で確認を行うと確かにxy平面に対して対称にモデルが作成されていることが確認できます。
モデルができたので「stl」ファイルとして出力します。
ここで、どのモデルを出力するかを指定するために「Pad」を選択して、出力したいモデルが緑色になっているのを確認して、「ファイル」→「エクスポート」でstlファイルを出力してください。
ファイル名は「model.stl」として、適当な作業フォルダに保存します。
modelの確認のため、paraviewで「model.stl」を確認してみましょう。
ちゃんとできているっぽいです。
(再度)Xsimを使ってOpenFOAM用のモデルを作成
ここからXsimを使わせてもらいます。
↓下記のリンクより使用できます。
ここからがXsimの本領発揮!!
まるで商用のソフトを扱っているかのような操作感に驚きます!!
ではやっていきましょう♪
まずプロジェクト名を聞かれるので適当な名前のプロジェクト名を付けます。
形状のインポート
「形状のインポート」→「ファイルのドロップ」で先ほどダウンロードした「model.stl」をインポートするため、ドロップします。
今度はモデルがめちゃくちゃ軽いので当然読み込むことができたようです。
右下のアイコンを選択すると、直方体の寸法が表示されます。
しかし、FreeCADで2000mmや3000mmと設定したはずですが、2000mや3000mと表示されてしまっています。
これは、FreeCADの仕様がmmと表示しておきながら出力したときには、寸法の数字しか拾ってきていないためです。
そのため読み込むときにSI単位系(m)として読み込んでいるのでこのようなことになります。
これは商用のソフトでも別のソフト間でやりとりするときには注意が必要です。
しかし、寸法のスケール変換はXsimの中で可能です。
「形状の編集」よりスケールを0.001倍にしましょう。そうすると、寸法が2mや3mに変換されたことがわかります。
では、次に流体の解析領域を作成するために「形状の追加」より直方体を作成します。
作成される形状は視覚的に表示してくれるので感覚的にもどれくらいの流体解析領域かがわかりやすくて良いです。
流体解析領域が決まれば「追加」を押して形状の追加をしましょう。
右下のアイコンを選択すると表示方法を変更できます。
メッシュ設定
ここでは、下記のように「メッシュ数の設定」「メッシュの再分割の設定」「境界層の設定(レイヤー・メッシュ設定)」などができるようです。
では、メッシュの設定を行いたいと思います。
メッシュ数には特にこだわりはないのでデフォルトのままにしておいて、「再分割設定」と「レイヤー・メッシュ設定」だけ設定しましょう。
より詳細な流れの再現が必要な部分は、再分割の設定をする方が良いです。
ここでは車体モデル(今は、ダミーだが)のまわりは複雑な流れが発生するとしてメッシュは細かくしておく必要があるでしょう。
下記のように「直方体」で範囲を指定して「再分割レベル」を指定します。(※絵ではレベル2にしていますが、より詳細に見たければ再分割レベルを大きくすればメッシュは細かくなります。本当はレベル3にしたかったのですが、間違ってレベル2で設定してしまっています(笑))
設定できれば「追加」で再分割条件を追加します。
あと再分割レベルを上げておいた方が良いのは、車体モデルの表面まわりです。
設定できれば「追加」で再分割条件を追加します。
次に、「境界層の設定(レイヤー・メッシュ設定)」ですが、境界層が必要な部分は主にすべり無し条件のまわりのメッシュです。
すべり無し条件とは速度ベクトルが0である条件になります(もし、速度ベクトルが壁で0でなければ流体が滑っていることになります。希薄な流体の場合ではそのようなことがあるかもしれませんが、ナビエストークス方程式を解いている以上は、壁はすべり無しと考えて良いかと思います。)
ですので壁などの境界では流速ベクトルが平行な状態で壁から離れていくため境界層を設けた方が正しい解析結果を得やすいということになります。
境界層はできるだけ多く設定する方が良いですが・・・・「理論的にこうした方が良い」みたいな設定ノウハウみたいなのがあるのでしょうか?僕にはわかりません(笑)
境界層(レイヤー・メッシュ設定)で、「車体モデル(model.stl)」と「床(Ymin)」の層数を3にしておきます。
どこが境界面かわからなくなった場合は、左上の「形状インポート」の面の名前のところをクリックすると色付けされて面の名前と面の位置の対応関係がわかります。
基本設定
ここでは、「定常・非定常」の選択、「クーラン数」の指定を行います。
非定常の解析を行うため、「非定常」を選択し、終了時間は「1秒」とします。
解析の時間感覚ですが計算を安定に進めるために「クーラン数を1以下」にしておく方が良いでしょう。
ですので、「最大クーラン数」は0.9にしておきます。
ただし、クーラン数は解析上の速度が定義できてから計算されるので計算初期のクーラン数は決められていません。
ですので、「初期時間間隔」を指定する必要があり、今は0.1秒としておきます。
熱流体として解析したい場合は、「熱」にチェックを入れると熱の解析ができる設定項目がでてきますが、今回は非圧縮性の流体として扱い、熱は流れに影響を及ぼさないとして熱の解析は行わないことにします。
OpenFOAM自体に設定では乱流モデルはかなりサポートされているのですが、Xsimから設定できる乱流モデルは、現時点では下記の3つがサポートされているようです。
今後色々と増えてくるだろうと思います。
今回は、「標準\(k-\epsilon\)」を選択肢て疑似的に乱流を数理モデルで組み込んだ解析を行います。
補足ですが、「熱」を選択すると下記のように、「浮力をブシネスク近似で行うのかどうか」や物性値として「比熱の設定」や「プラントル数の設定」などが行えます。
ただ、物性値の「理想流体」を選択すると粘度も設定できるようですけど・・・・理想流体ってオイラーの運動方程式(非粘性)と思っていたのですが・・・・どうなんでしょう(´・ω・`)
物性
物性値を設定します。
今は、空気が流れているとしたいので「Air」を設定します。
今はデフォルトで「Air」か「Water」が設定できますが、密度と動粘度を手入力で変更できるで各自の解析対象に応じて変更することもできるようです。
補足ですが、物性の粘度のタイプとして「ニュートン流体」以外に下記の2つが設定できるようです。
式も書いてくれているので非常にわかりやすいです。
初期条件
流体領域の初期状態を設定します。
(初期条件を設けないと、すべての解析領域で流速が定義されていない(定義されていないということは値が0)なのに、いきなりひだりから8.3m/sの流速で流入するなんて変なことになりますので(笑))
境界条件
境界条件の選択は流体解析で最も重要な部分でしょう。
境界条件の基本的な考え方は、下記の記事を参考にしてください。
境界条件下記のように設定しましょう。
「領域」「タイプ」→「設定」の流れで設定していきます。
設定すると境界条件のイメージを示してくれます。
特に指定していない部分はすべり条件として自動的に設定してくれるそうですので、気にしなくても良いのだそうです。(下に書いています)
補足ですが、境界条件のタイプとして現状では以下のものが用意されています。
これだけのものが用意されていたらだいたいのことはできるでしょう。
OpenFOAMは基本テキストベースで編集するので、例えば「質量流指定」ってどうやって記述するんだっけ?ってなったときに毎回覚えていないのでネットで調べることになっていたのでこれは大変助かります。
「移動壁」とか使ったことないし(笑)
計算指定
ここでは「並列数の指定」や「数値スキーム」「行列ソルバー」などを指定できます。
あとは緩和係数が設定できるようですが、非定常解析なので緩和係数って非定常解析に使っただろうか?・・・わからないけど追々勉強するとして緩和係数は無視しよう(笑)
並列数はPCのスペックによりますが2にしておきます。
「数値スキーム」「行列ソルバー」に関しては下記のように選択できるようですが、知識不足のためここはデフォルトのままいきましょう(笑)
「数値スキーム」は「標準」を選択、「行列ソルバー」は「安定性重視」を選択します。
これで解析条件は全て整いましたので、後は出力の設定をして設定ファイルを出力して終了です。
出力
まずデータを出力する時間間隔を指定します。
解析終了時間が1秒にしているので、データの出力間隔は0.1秒に設定しておきます。
出力するデータはあまり重い計算ではないし全部出力しましょう(笑)(「全体」→全てにチェックを入れます)
エクスポート
では設定ファイルの出力をします。
OpenFOAM ver4として出力してくれるようです。
※解析するOpenFOAMもver4を使用しましょう。
「エクスポート」を押すと、「プロジェクト名.zip」ファイルとして出力してくれるようです。
zipファイルを展開したら、OpenFOAMに慣れている人はお馴染みのテキストベースの設定ファイルが現れます。
※Windows10でOpenFOAMを使用する場合に、作業フォルダをあまりにも深い階層のフォルダで計算させようとすると読み込んでくれなかったので、注意してください。
どうですかね?
めっちゃ使いやすい気がします。
直方体モデルまわりの解析ならこれだけで流体解析できてしまいます。
(解析できることを確認しました。)
せっかくなので、車体モデルに変更して「車体まわりの流れ」の解析をしてみます。
ダミーのモデルを車体モデルに変更する
このままでは直方体まわりの流れの解析になるので、車体モデルに入れ替えます。
今のままでは「model.stl」は直方体モデルなので、それを「puyo_LOW.stl」に替える必要があります。
では、「model.stl」はどこにあるのかというと、
「プロジェクト名\constant\triSurface」の中にあります。
ここに、「puyo_LOW.stl」を「model.stl」として上書きします。(心配な人は直方体モデルの「model.stl」を別のフォルダに避難させてください)
この状態でparaviewで2つのモデルを読み込んでみましょう。
何これ?(笑)
となります。
車体モデルの寸法を表示してみると、横幅が20mになっています。
でかすぎます(笑)
しかも変な方向に向いています(笑)
何かコマンドで車体モデルを「縮小・回転」することにします。
車体モデルの縮小・回転
車体モデルを下記のようにすることを試みてみましょう。
stlファイルのスケール変更について
stlファイルのスケール変更については下記のページの最後にあったので簡単にできそうです。
http://penguinitis.g1.xrea.com/study/OpenFOAM/scaling.html
1 | $surfaceConvert -scale 0.1 変更前ファイル名 変更後のファイル名 |
実際にコマンドを打つとこんな感じ。
実行後にparaviewで確認してみましょう。
お、ちっちゃくなってくれたっぽい(*’▽’)
stlファイルを90°回転させる
これはネットで探してもなかったので、スケール変換したコマンドと同じようなコマンドではないかと思って、
1 | $surface |
まで打って[Tabキー]を押すと、色々出てきました。
その中の「surfaceTransformPoints」が何かやってくれそうなので、helpオプションで確認していると、「-rotate」という回転のオプションがあったのでこれでstlファイルの回転ができそうです。
ではさっそく回転をしてみましょう。
下記のコマンドでz軸をy軸の向きに変更するというのを行います。
1 | $surfaceTransforPoints -rotate '(0 0 1)(0 1 0)' 変更前のファイル名 変更後のファイル名 |
では実際にコマンドを打って、paraviewで変更後を確認してみましょう。
ちゃんとできたっぽい(*’▽’)
テキストファイルの修正
というわけで完成したわけですが、このまま計算を流してもエラーが出たので、いくつかテキストファイルを修正していきます。
その1
今、「流体解析領域(Cuboid.stl)」と「車体モデル領域(model.stl)」の2つあるのですが、計算領域として必要なのは車体の外側、つまり車体以外の流体解析領域が必要となります。
ですので、流体解析領域から車体をくり抜いてメッシュを作成してほしいのです。
その設定は「プロジェクト名\costant」の中の「snapyHexMeshDict」のファイルの中で行います。
下記のように、「locationMesh(x座標 y座標 z座標)」が流体解析領域にあるようにしないといけません。
※座標位置が車体の中にある場合は車体のメッシュだけが残りますので修正が必要なら修正してください。
その2
「プロジェクト名\costant\trisSurface」の中の「model.stl」は今は車体のモデルなのですが、中身のsolidの名前がまだ変更されていません。
デフォルトだと「patch0」というsolidの名前になっていますが、ここを「model」に変更する必要があるようです。
これでようやく計算が流れる!(^^)!
solver:解析実行
解析実行は、
- 「ベースメッシュの作成」
- 「解析領域のメッシュ作成」
- 「並列計算用に領域分割」
- 「解析実行」
- 「分割した領域をまとめる」
といった流れで行うのですが、Xsimから掃き出された設定ファイル内に「Allran」というスクリプトがあります。
これをコマンドで実行すると、自動的に上記「1.~5.」の流れを随時実行してくれます。
実際に「Allrun」を実行してみましょう。
そうするとコマンドがひとつずつ実行されているのがわかります。
残差をgnulplotで自動的に出力してモニターをしてくれるようです。
ちなみに、フォルダ内はこのようになります。
並列計算用に分割されたのが「processor0」「processor1」に入っているというわけですかね。
補足ですが、解析結果を全て消したい(初期に戻したい)場合は、「Allclean」というスクリプトを実行すればよいです。
そうするときれいに元通りになります。
どうやら計算はしてくれたようですので、結果処理をしてみます。
といっても流線しか見ません。
post処理:解析結果の可視化
可視化はparaviewを使います。
使い方は書籍を参考にするか、ネットで調べるかしてください。僕は詳しくないので(笑)
流線の可視化
車のアンテナみたいなところの背後が渦巻いていますね(‘;’)
計算できました。
終わりです。
一応レイノルズ数も計算しておく
レイノルズ数は層流か乱流かの指標になる無次元量です。
下記の記事が参考になります。
流体力学の力学的相似性
今の場合だと、
$$L=2.0$$
$$U=8.3$$
$$\nu=0.00001511$$
だから、レイノルズ数は
$$Re=1098610\sim 10^6$$
です。
これは乱流になっていてもおかしくないってことでしょうかね。
OpenFOAMの参考書は下記を参考にどうぞ(^^)/
Xsimを使わずにOpenFOAMの設定を学べる記事を用意しました。