はじめに
DEXCSワークベンチ(以下DEXCS-WBと記す)のハック元となったCfdOFであるが、あちらも着々と開発は進行中のようで、DEXCS2023 for OpenFOAM をリリースした後での更新版も存在するが、ここでは読者の方にも追試できるよう、DEXCS2023 for OpenFOAMに搭載したCfdOFワークベンチを使って、DEXCSの標準チュートリアル例題を動かすことを試みた。
これが簡単にチャチャっとできるようになってくれるのであれば、DEXCS-OFの標準ランチャーとしてこれを採用することに何の抵抗も無いのであるが・・・そろそろDEXCS2024に取り掛かる時期になったので、その可能性を判断したい、ということである。
Table of Contents
CADモデルの再構築
CfdOFとDEXCSワークベンチでは、メッシュ作成用のCADモデルの作り方に根本的な違いがある。CfdOFでは、計算対象となる流体部分を閉じた領域モデルとして予め用意する必要があり、DEXCSフォントを使ったモデルでは、これを作るのが容易でなかった。そこでこれまではDEXCSフォントの代わりに簡単な形状を使ってCfdOFの動作検証をしていたが、ここではDEXCSフォントを使ったモデルでCfdOFの動作検証できるよう、モデルの再構築を試み、そのやり方を取りまとめた。
仮想風洞パーツの結合
まずは仮想風洞を構成する3つのパーツ(inlet, outlet, walls)を結合した(これらのパーツの元々は直方体ブロックをパーツ分解しただけのものであるので、元の直方体データが残っていれば、それを使えていたのであるが、そうなっていなかったので)。
当初というか、普通に考えれば、この結合パーツ(Fusion001)とDexcsのブーリアン演算をすれば良いと思われ試行錯誤した結果で計算実行まで進めていったのだが、FreeCAD上でのmm寸法が、OpenFOAM上で自動的にm(メートル)寸法に変更されてしまう(100 mm は 0.1 m となる)ということに気づいた(DEXCS-WBでは、設定したscale(デフォルトは「1」)倍となる)
OpenFOAMの計算実行前のどこかの段階でスケール変更すれば良いことではあるが、結果的に考えると、一番最初にスケール変更しておいた方が、ブーリアン演算の手間も少し簡単になった。
またFreeCADのモデリングでは、寸法の数値と単位がいつもセットで表示されるので、これを素直に解釈すれば良く、初心者にはこの方が良いとも言える。
スケール変更
スケール変更は❶「Draft」ワークベンチにて実施する。パーツ「Dexcs」を❷選択して、❸「クローン」ボタンを押すと❹クローンパーツ「Dexcs001」ができるので、この「プロパティ」画面の「Scale」の値を❺「1000」に変更する。
この操作を残りの2つのパーツ(regionBox, fusion001)について、同様に実施する。
平行移動
サイズが1000倍になったので、❶「画面にフィット」ボタンを押して全体のレイアウトを確認する。そうすると❷で見るように、仮想風洞(Fusion002)とメッシュ細分化リージョン(regionBox001)の位置がずれてしまっている。これは細分化リージョンのスケール変更が、ローカル座標の原点を基準として実施された為である。❸〜❻の手順にて、ローカル座標原点の平行移動量も1000倍してやれば良い。
不要パーツ削除
この後の作業をわかりやすくする為、スケール変更前のパーツを削除(❶〜❷)して、モデル全体を❸別名にて保存しておく。
ブーリアン演算⇒失敗
ブーリアン演算は❶「Part」ワークベンチで実施する。❷「ブーリアン演算」ボタンを押して、
❹「Fusion002」と❺「Dexcs001」の❸「差集合」を作成したいのだが、❼「ソリッドでないものに。。。」というメッセージが出て、あえなく失敗する。
Fusionパーツのソリッド化
確かにここで対象としたパーツは「ソリッド」のリストには含まれないで、「コンパウンド」にリストアップされているが、経験上「コンパウンド」に含まれるパーツもソリッド演算できていた。本例では、Fusion002の元になったFusion001を作成した際に、警告メッセージが出ていたのが思い起こされ、多分これが原因と考えられ、これをソリッド化してみた。
ブーリアン演算
改めてブーリアン演算パネルを開くと、上記ソリッド化したパーツ「Fusion002(Solid)」が、ソリッドパーツのリスト最下段に出ているので、これに❶チェックマークを付けて、右側リストでは、❷「Dexcs001」にチェックマークを付けて、❸「差集合」にチェック、❹「適用」ボタンを押す。
そうすると、❹「Cut」が作成され、これがブーリアン演算の結果であり、これにてようやくモデルの再構築完了である。
因みに、スケール変更をしないでこの操作をすると、「Dexcs」も「ソリッドでないものは・・・」となってしまい、Dexcsフォントを構成するパーツの1つずつ、ブーリアン演算を全5回する必要があったので、結果的にブーリアン演算の手間が少なくなったということである。
解析コンテナ
ワークベンチを❶「CfdOF」に切り替えて、❷「解析コンテナ」ボタンを押すと、コンボビュー/モデル画面のコンポーネントツリー上にコンテナが展開される。このあたりの操作はDEXCS-WBと同じだが、こちらはこの時点でメッシュコンテナは存在せず、DEXCS-WBには無かったものが現れる。
Output Path
具体的な作業に入る前に、Output Path を指定しておきたい。CfdOFでのデフォルトPathは、/tmp 下に収納されるようになっており、異なるFreeCADモデルを使うと、前に作成したデータが書き換えられてしまう。したがってDEXCS-WBでは、デフォルトPathをFreeCADモデルと同じディレクトリになるよう自動設定しているが、CfdOFでは「解析コンテナ」のプロパティを手動で変更する必要がある。
PhysicsModel
「PhysicalModel」コンテナをダブルクリックすると、計算の物理モデルを選択/変更できる。⇒デフォルトは、Steady / Single phase / isothermal / Viscous / laminar となっていたので、Dexcs標準チュートリアルの設定に合わすべく、laminar をRANSに変更、併せて乱流モデルをkEpsillon に変更した。
設定を変更すれば、見え消し状態の部分が使えるようになったり、選択メニューも変更されるようになっており、商用ツールと同じような使い方を想定したものになっている。現時点でどれだけのソルバーに対応できているかまで調査しきれていないが、将来が楽しみなところである。
FluidProperties
こちらもデフォルトでAir(空気)の物性値(密度、動粘性係数)がセット済となっていたので、このまま使えた。因みにライブラリとしてAir以外に4点ほど用意されているようで、こちらも将来が楽しみである。
InitialiseFields
Field変数の初期値を設定するのに、いくつかのオプションが用意されている。境界条件の値をそのまま使うこともできるようだが、この時点では境界条件も未定義なので選択肢がない。ここでは初期値を規定しておいた(DEXCS標準チュートリアルと同じ)。
境界条件
DEXCS-WBの流れだと、先にメッシュを作成して、その後に境界条件設定だが、CfdOFでは境界条件を先に指定した方が良さそうであった(後でも良いが、メッシュ作成をやり直すことになる)。
基本的な使い方は、❶「Fluid boundary」ボタンを押すと、タスク画面が現れるので、この画面上で必要な設定を行った後❸「OK」ボタンを押せば。新しい❹コンテナが作成される。この名前は❷で指定した境界Type名が引き継がれるが、任意に変更しても構わない。また、このコンテナをダブルクリックすれば、タスク画面が現れて設定の確認・変更も可能である。
境界Typeは❷に示すように6つのTypeを選択することができ、選択に応じてSub-type以下に現れるメニューも変わるようになっている。
Dexcsチュートリアルでは、以下4つの境界条件指定が必要になる。
Dexcs(静止壁)
静止壁の境界条件は、デフォルトをそのまま使うだけである。問題は境界の指定方法であったが、意外と簡単であった。
❶「Select from list」のタブをクリックすると、パーツリストが出てくるので、対象(この場合はDexcs001)に❷チェックマークをつけるだけである。念の為❸「Select Objects」のタブをクリックして選択を確認できる。DEXCS-WBにおけるメッシュ細分化指定のやり方と同じである。
「意外と簡単」と記したのは、他にもやり方があって、この方法にたどりつく以前は別のやり方をしていて、処理に時間がかかっていたからである。たとえば、以下の方法である。
Dexcs001にチェックマークを付けるでなく、これを❷選択して❸「Boundary Face list」をクリックすると、Dexcs001を構成する面(Face)リストが現れる。このFaceにチェックマークを付けるでも良い。ただFaceの数が多いので❹「Select all」ボタンを押して全選択する。❺「Select in model」では、Dexcs001:Face##という形式で全Faceリストを確認できるという次第である。
この場合Faceの数が約3000と多いので、処理にかなりの時間(数分程度)必要になる。また、ここではDexcs001というパーツを対象としたが、当初は再構築したメッシュ領域(Cut)を対象として面指定する必要があるものと思い込んでいた。この場合は、全選択でなく部分選択する必要があるので、尚更面倒になっていた。
以下、残り(walls, inlet, outlet)の境界条件も図示しておくが、これらもFusion002(Solid)パーツの面を部分選択すれば良い(Cutパーツの部分選択でもOKだが、選択が面倒で時間がかかる)。
walls(すべり壁)
Wallタイプの境界条件にはSub-typeとして5つの選択肢があり、Dexcs標準チュートリアルに合わせてSlipを選択した。
いくつか見慣れないものもあるので、どういうものかをいずれ検証したい。
inlet(流入条件)
境界条件として❶inletを選択すると、Sub-typeとして5つの選択肢を使えるが、いずれもポピュラーな方法。これもDEXCS標準チュートリアルに合わせて❷「uniform velocity」を選択し、❻にその値を定義している。
outlet(流出条件)
❶Outletの選択肢は3つで、❷「Static pressure」とし、その値は❻のデフォルト値をそのまま使う。Velocityも定義できるようになっている所があって、この値を変えたらどうなるのか、やや気にかかる。
メッシュ作成
メッシュ作成は、対象領域モデル(本例ではCut)を指定する必要がある点で、DEXCS-WBと異なるが、細分化指定の方法は大体同じである(というか、DEXCS-OFが真似させてもらっている)。
メッシュ作成コンテナ
DEXCS-OFでは解析コンテナを作成した時に同時に作成されるが、CfdOFではメッシュ対象領域パーツ(Cut)を❶選択してから、❷「CFD mesh」ボタンを押すことによって、メッシュコンテナが作成される。作成されるコンテナの名前❺も、(パーツ名)_mesh となる。
メッシュ作成方法のデフォルトはcfMeshとなっているが、snappyHexMeshやgmshも使える。ここでは以下、cfMeshにて検証するが、別記事で他の方法についても調査する予定。
メッシュ細分化コンテナ1
メッシュ細分化コンテナの使い方は、DEXCS-WBとほとんど同じである。❹細分化パラメタを、Relative element size として指定する方法が違うくらいか。本来であれば、0.0625と指定したかったが、小数点以下3桁しか指定できない(多分、設定変更は可能と思うが・・・)。
なお、この細分化対象を指定するのに、当初はメッシュ対象領域パーツ(Cut)を使う必要があると思い込んでいたため、かなり回り道をしてしまった。
メッシュ細分化コンテナ2
volume refinement(領域細分化)の指定も、❹パラメタ指定方法以外は。DEXCS-WBとほとんど同じ。
モデルツリー上で細分化コンテナを選択すると、3D画面上で当該パーツを確認できる点は嬉しい。
メッシュ作成⇒確認
メッシュ作成の手順もDEXCS-WBとほとんど同じで、出来上がりメッシュもほとんど同じであった。
❺「Load surface mesh」ボタンで、3D画面上にメッシュを表示することも出来ている。但し、このメッシュはOpenFOAMオリジナルの多面体要素でなく、テトラ要素に分割したものになっており、これが表示できたからといってその嬉しさは今一つ不明。
ポスト処理設定
Paraviewによる場の可視化に加えて、もう一つの後処理としてプロットデータ処理があるが、プロットデータ用のポスト処理設定も可能になっている。
❶「Reporting function」ボタンを押すと、「CFD reporting function」のタスク画面が現れる。最上段の「Reporting function」の❷プルダウンメニューによると、3つのfunction設定が出来るとわかる。ここでは。DEXCSの標準チュートリアルに同梱している、forceCoeffcientsとprobesの一部について同等の設定を試みた。
forceCoeffcients
デフォルトから変更した箇所を赤枠で示しておいた。
一番下の「Spatial data binning」というのは対象パッチを分割して結果を局所的に出力させるもので、DEXCS標準チュートリアルには同梱していないものである。ここは実際に数値を入れて動作を確認したが、出力データには何の変化も無かった。DEXCSフォントの場合、patch全体として連続面になっていないのが原因かもしれない。
Probes
こちらもプローブの位置をDEXCS標準チュートリアルのそれと合致させた(赤枠部分)。
なお、Probes と複数形であるが、プローブ位置は1点のみ。Sample field name はテキストブロックなので、p k U とブランク区切りで入力してやれば、所定のprobesファイルが出来て後処理もしてくれる。但し、プロットデータのグラフ表示はしてくれないようなので、デフォルトのp(圧力)だけの設定にとどめた。
計算実行
計算の実行方法もDEXCS-WBとほとんど同じである。❶「Solver job control」ボタンを押すか、❷「CFDSolver」コンテナをダブルクリックすれば「Analysis control」のタスク画面に切り替わる。
❸「Write」ボタンを押せば、見え消し状態になっている他のボタンも有効になるので、❺「Run」と続ければ良い。
実行方法が「DEXCS-WBとほとんど同じ」と記したが、外形的な操作方法が同じというだけで、処理方法の実体は全く異なっている。DEXCS-WBで「Write」ボタンは単に実行スクリプトを作成しているだけであるが、こちらは実行用のケースファイルそのもの(caseというフォルダ)を作成している。❸「Edit」ボタンを押すとファイルマネージャーが立ち上がって内容の閲覧編集が可能になる。
実行結果1
とりあえずそのまま実行した際の結果を以下に示しておく。計算中に、初期残渣グラフが都度更新されるのは、DEXCS-WBでもおなじみだと思うが、ポスト処理結果も都度更新されるのは嬉しい。
但し、計算結果は圧力の初期残渣が10-2程度以下には低下せず、最大ステップ数(2000)に到達して停止することとなった。
流れ場はほぼ定常解に達しているようではあった。
実行結果2
流れ場が収束解まで至らなかったのは、計算スキームや収束パラメタの問題であると考えられたので、これもとりあえずfvSchemes, fvSolution ファイルを、DEXCS標準チュートリアルで使用しているものにそのまま置き換えて計算してみた。
予想通り、ほぼDEXCS-WBでの結果と同じになった。
DEXCS-WBとの比較
念の為、以下に3つのグラフを対比表示しておく。
Paraview
「Paraview」ボタンを押すと、Paraviewが計算結果をロードした状態で立ち上がる(いちいちFile⇒Openや、Applyボタンを押す手間が不要)。
しかも計算結果は並列計算のdecomposeCaseでありながら、並列境界が見えていない!これは、「Clean to Grid」というフィルターを使えばこうなる、ということらしいが、こんなものがあるとは知らなかった。⇒次期DEXCSではハックさせてもらう予定。
まとめ
DEXCS標準チュートリアル問題を、CfdOFを使って実行検証した。
- CADモデルの再構築が必要であったが、DEXCS-WBで作成したのとほぼ同じメッシュ(cfMesh)を作成することが出来た。
- 細分化対象の選択は3D画面上で確認しながらできるという嬉しさもあった。
- 但し、設定できるパラメタは少なく、パラメタ指定方法もやや面倒
- DEXCS-WBにおいてテンプレートケースファイル中に組み込んであった解析条件、境界条件は全てGUIメニューにて設定可能であった。
- 一部のポスト処理(forceCoeffs, probes)もGUI設定、計算と同時のプロット出力が可能であった。
- デフォルトの計算パラメタ(fvSchemes, fvSolution)では収束解に至らなかった。
今後
- Dexcs標準チュートリアル問題におけるsnappyHexMeshでの動作確認
- CfdOFのdemoケース調査