DEXCS-OFには表題のCHT(Conjugate Heat Transfer, 共役熱伝導、熱連成)計算を想定したヒートシンクモデルも同梱してあるが、このCHT計算には領域ごとにcfMeshでメッシュ作成し、簡易CHTのテンプレートケースのメッシュを領域ごとに入れ替える方法を推奨してきた(こちらの記事参照)。
一方、DEXCS2024のカーネルアップデート不具合暫定対応版 #2よりsnappyHexMesh も手軽に使えるようになり、マルチリージョンメッシュもチャチャっと作成できるようになった。そこで新たにCHT計算用のテンプレートケースを作成・公開してこれをDEXCS-WBで使うようにすればCHT計算のケースセットアップがかなり簡単になるのでは…という構想の下、上記のヒートシンクモデルを使ってケースセットアッププロセスを検証した。
本記事の執筆時点で、まだいくつか要改造点はあり、次期DEXCSに向けての先送り事項とはなるが、一般に言われるところの「OpenFOAMのCHTケースセットアップは面倒臭い」は払拭できているのではないかと思う。
なお、先送り事項として文中文字に色付けしているが、DEXCS-WBで担う部分、TreeFoamでお願いしたい部分、と色分けしている。
テンプレートケースのダウンロードはこちら
テンプレートケースを同梱したDEXCS最新版はこちら
Table of Contents
まずはやってみる
DEXCS-OFに同梱のヒートシンクモデルは、領域ごとのメッシュ作成を想定しているので、マルチリージョンメッシュ用には、CADモデルを少々修正する必要がある。
なお本記事は、DEXCS2024のカーネルアップデート不具合暫定対応版 #2を使って検証したものである点、お断りしておく。
CADモデルの修正
CADモデルの修正については、DEXCS-OFに同梱の資料(デスクトップ上 DEXCS/doc/4_DEXCS2024_howtoMeshing.pdf の p.39〜41)も参照されたい。フルモデルから1/3カットモデルをセレクトした状態を対象とするが、このままでは固体領域しかリージョン指定できない。流体領域を指定する方法はいくつかかあるが(補足1)、ここでは個体領域も含めた領域全体パーツ「air」を作成して(仮)流体領域として使うことにする(下図イメージ参照)。
「inlet」「outlet」「walls」を❶「選択」状態にしておいて、❷「ファイル」⇒「エクスポート」にて「air.brep」を作成、引き続き❸「ファイル」⇒「インポート」にて、これを読み込んでいるだけである。
解析コンテナ作成⇒ケース作成
CADモデルが完成したら、DEXCSの通常作法通り、まずはアイコン❶「解析コンテナを作成」をクリックして解析コンテナを作成する(下図)。
次に、作成した解析コンテナ「dexcsCFDAnalysis」を❷選択状態にして、「データ」タグ画面の❸「Template Case」を選択、デフォルトのDEXCSチュートリアルケース(/opt/DEXCS/template/dexcs)になっているのを、予めダウンロードした❹CHT用テンプレートケースに変更する。
引き続き❶メッシュコンテナ「CFDMesh」をダブルクリックして「メッシュ作成タスク画面」を起動する。本例のCADモデルはmm(ミリメートル)で作成されているので、スケール(to meter)を❷「0.001」として、❸「ケース作成」ボタンを押す。数秒後タスク画面の下の方に❹「Exporting the part surface…」と表示されたら、❺「閉じる」ボタンを押してメッシュ作成の準備が完了する。
メッシュ作成
(「メッシュ作成タスク画面」を閉じてから「メッシュ作成」するというのはちょっと変だが…)DEXCSツールバーのアイコン❶「Run TrfSHM」をクリックして、TreeFoamの「snappyHexMeshによるmesh作成」画面(以下、「Trf-SHM画面」と略す)を起動する(下図)。
「snappyCsvファイルの読み込み」というダイヤログ画面が現れるが❷「OK」ボタンを押せば良い。
メッシュ作成はこの「Trf-SHM画面」(下図)を使って行う。この画面でのデフォルトからの変更箇所を紫色の枠で囲っておいた。
❶はblockMeshのcellSizeで、cfMeshでいうところの基本セルサイズで、❸solidに対するcellCizeだけを❺「0.0001」と1/8(細分化レベル3)に細分化しているのは、前述のDEXCS-OFに同梱の資料(howtoMeshing.pdf)でcfMeshで実施したのと同等となるよう設定したものである。但し、❼「featureAngle」についてはデフォルトの「90」に対して、少し小さい値(本例では「80」)としてある。「90」だと、「walls」の稜線が一部欠損してしまう。(デフォルト値は90よりも小さい値にした方が良いのでないか?)。
また❻にて「solid」と「walls」に対して「layer追加」のチェックボックスをオンにしているのも、cfMeshと同等設定を狙ったものであるが、この点に関しては設定完了後の追加作業が必要になる。
各stlパーツに対して「patch Type」を選択指定できるようになっているが、cfMesh ではできなかたマルチリージョン用の設定パラメタとして、❸「solid」に対して「cellZone」❷「air」に対して「cellZoneOther」が選択されており、特に後者が重要である。「air」は「solid」を含む領域として定義されていたが、この指定により定義済の領域(本例では「solid」)を除外して指定くれることになる。
設定が完了したら、画面の下部にある「mesh作成」パネルを使う。
計算環境と必要に応じて❶「並列処理」パラメタを変更し、❷「Dict作成」ボタンを押す。レイヤーを付与しないのであれば、❹「mesh作成」としても良いのだが、このままではレイヤーをうまく作成できない。そこで❸「作成したDict編集」が必要になる。これをクリックするとテキストエディターが立ち上がって、「snappyHexMeshDict」ファイルを直接変更できるようになる。
565行目あたりに、レイヤー指定に係るブロック(layers)があり、設定したパラメタが反映されていることを確認できるはずである。ここで、「solid」と記されている箇所を「solid_slave」に変更する。そうしないと、レイヤーは作成されても、「solid」の内部(固体側)に作成されてしまう。「_slave」を付与することによって反対側(流体側)を指定したことになる。(このあたりは「Trf-SHM画面」でチェックボックスなり、ラジオボタンなりで設定できるようにしてもらいたいものであるが…)
またもう一点、「snappyHexMeshDict」ファイルのサブディクショナリーである「meshQualityDict」ファイルについても変更が必要である(このファイルを編集するボタンなり、欲を言えばパラメタのをGUIで変更できる機能なりもあると嬉しい)。具体的には、32行目で「miniVol」を指定しており、デフォルトで、「1e-13」となっているところを「1e-30」とした。当初、レイヤー指定をしなければ、この変更は必要無かったので、レイヤー指定してレイヤーを作成できない原因がここにあるのに気付くまで、色々回り道させられた。
これでようやく❹「mesh作成」ボタンを押せば、端末画面が現れてメッシュ作成の計算ログが表示される。計算は1分もあれば終了する。
メッシュの領域分割
メッシュがリージョン毎に正しく区分できているのを確認できたら「meshViewer」「Trf-SHM画面」を閉じて、FreeCADの画面に戻って、アイコン❶をクリックしてTreeFoamを起動する(下図)。
本来であれば、ここでアイコン❹をクリックしてそのままメッシュ操作に進みたいところであるが、何故かエラーで先へ進めなくなるので、一旦アイコン❷
をクリックして、TreeFoamを終了し、今度はデスクトップのDockツールバーのアイコン❸
をクリックすると、先程と同じように作業中のフォルダー(case1)を解析フォルダとしてTreeFoamが立ち上がり、今度はアイコン❹
をクリックして、そのまま進むことができる(下図)。
「メッシュ操作」画面が立ち上がったら、画面下方の「領域分割(Region)」ボタンをクリックする。「メッシュの領域分割」の確認ダイヤログが現れ❷「OK」をクリックすれば、「meshOperationDialog.py」という画面が立ち上がる。メッシュデータからcellZoneの名前を読み取って❸のブロックにリストアップされるので、これらを❹の「fluid Zone(流体)」もしくは❺の「solid Zone(固体)」に分別せよ、ということである。
分別作業は直感的に操作できるので説明するまでないだろう。下図(左側)の状態にできたら❶「OK」ボタンを押せばよい。
ここで「メッシュの領域分割」ダイヤログ画面が現れ、今度は「regCase」を作成したので…というメッセージが現れれば問題無い。❷「OK」ボタンを押して、「メッシュ操作」画面も❸「閉じる」でよい。
マルチリージョンケースのセットアップ
TreeFoam画面に戻り、アイコン❶「dirの再読込」をクリックする(下図)。
しかる後、当該の解析ケース「case1」のアイコン左の❷下向き矢印をクリックして展開すると❸「regCase」ができているので、これを選択してアイコン❹をクリック、以下解析ケースとして続行することになる(このあたりは前項の作業が終わったら、自動的に変更されるようになっても良さそうだし、「regCase」という名前もその際に変更できると嬉しい。ついでながら「regCase/constant/polyMesh」は不要のはずなので自動的に削除してもらいたい)。
引き続き下図にて、アイコン❶「multiRegionのFile操作」をクリックすれば、「multiRegionの設定」画面が現れる。
初心者には少々難解な説明が多いが、ここで使うのは一番下の❷「region内file操作」だけである。これをクリックすれば、「multiRegion内のfile操作」画面が、下図左側の状態にて立ち上がる。
この画面においても多くのメニューがあり、基本的には❶の破線で囲ったあたり、4つのタグで切り替え、各領域の「0」「constant」「system」フォルダーに加えて、「固体の材料設定」もGUIメニューにて変更できるようになっている。また、領域全体に係るパラメタである❷「g(重力加速度)」などはこれを直接編集(値や方向を変更)することもできる。
計算対象として、流体に関しては空気、乱流モデル(kOmegaSST)を想定したパラメタが組み込まれているが、そうでない場合や、領域の数がもっと多い場合などは補足2を参考に変更されたい。
本例に限って変更が必要なものは、❸「固体の材料設定」で、デフォルトのままでも計算できないことはないが、出所不明の物性値が設定されている。❹領域「solid」を選択、材料DBから❺「Al」を選択、❻「<<設定」ボタンを押す、ということで簡単に変更できる。固体領域が複数存在する場合には重宝する機能である。
境界・初期条件
境界・初期条件については、TreeFoamでお馴染みのgridEditorも使える(下図アイコン❶で起動)。但し、最初に現れる画面は、領域分割前のメッシュに対するデータで意味が無い。この画面からアイコン❷
「開く」をクリックして、「gridEditor開く」という画面から領域を指定して開くことになる(「fluidRegions」「 solidRegions」は選択しても何もできない。紛らわしいので表示されないようにしてもらえると嬉しいのだが…また、「regCase/constant/polyMesh」を削除してあれば、起動画面もシンプルになる)。
基本的にテンプレートケースは本例のシートシンク問題を想定しており、FreeCADモデルのパーツ名を変更しない限り、何も変更せずそのまま使えるようになっている(補足3参照)が、流入条件を変えたり、固体の加熱条件を変えたりすることはあるだろうから、そのあたりの作業イメージを以下に示しておく。
流体側は以下の通り。
❸で、流入速度を規定している。「outlet」「walls」は一般的に良く使われるもので、説明するまでないだろう。最下段の「air_to_solid」は流体と固体の界面で、前々項の領域分割ツールによって、その境界名も含めて全自動で作成されており、通常はそのまま使えば良い。
固体側については、以下の通り。
最下段の「solid_to_air」は流体側と同様に自動作成されている。本例では、流体との界面以外を「walls」として固定温度境界として取り扱っているが、これを発熱量一定なりに変更しても良いだろう。
計算実行
ソルバー計算の実行もTreeFoam利用経験者には説明するまで無いと思うが、初心者向けに作業イメージを示しておく(下図)。
アイコン❶「solverを起動」をクリックすれば、❷「端末」画面が立ち上がって、計算の実行ログが流れるように表示される。アイコン❶
の2つ右隣りのアイコン
を使用すれば並列計算もできるが、ボタン一発とはいかない。本計算は数分で終了するので単体計算とした。
端末の計算ログだけを見ていても状況がわからないと思ったら、下図のアイコン❶「plotWatcherの起動」をクリックする。
❷「端末」画面が立ち上がるのに続いていくつかプロット図も立ち上がる。❸は「Residuals」で残渣がプロットされている。
後処理1(Paraview)
場の可視化ツールParaViewを使うには、下図のアイコン❶「paraFoamの起動」を使うか、❷あたりをダブルクリックする。
「paraFoamの起動option」画面でoption選択を促されるがどちらを選んでも同じである。マルチリージョンケースの可視化に際しての注意事項としては、下図のParaview起動画面の「Mesh Regions」選択リスト中「internalMesh」がデフォルトでロードされてしまうので、この❶チェックを外してから❷「Apply」ボタンを押すことくらいか(「regCase/constant/polyMesh」を削除してあれば、そうはならないので作業も少し楽ちんになる)。
その他リージョンや境界面の数に応じてパーツが沢山あり、その選択に手間がかかる点は致し方ない。以下に可視化例を掲載しておく。
最初は、流体領域の❶中央カット面でのコンタ図である(下図)。
右上の❸速度場において、中央3列の通路幅が同一であるのに流速が同じ値になっていない点は目につくが、あとはそれなりの計算結果が得られている。
下の図は、固体と液体界面での熱流束を表示したものである。
後処理2(DEXCSプロットツール)
プロットサンプルもいくつか同梱してあり、❶「十徳ナイフ」⇒❷「DEXCSプロットツールの起動」メニューにてDEXCSプロットツールを起動できる(下図)。
ダミー(解析コンテナだけがコンテンツ)のFreeCADが起動し、プロットツールが使えるようになる。
プロット例を以下に示しておく。
以下は、デフォルト表示では初期の擾乱が大きすぎて定常値や収束状況がよくわからない為、アイコン❸「Edit axis, …」を使って、縦軸のスケールを変更して表示したものである。
wallHeatFlux は流体と固体の界面を通しての熱流束の積分値で、「air」「solid」のどちらで計算したものも、同じ値になっている。
補足
「まずはやってみた」の計算結果で、速度のコンタ図に一部不自然さが見られた原因は、流体領域のメッシュ品質に起因すると考えられる。
これを改善するには、メッシュの細分化設定をもう少し工夫するなり、領域ごとにcfMeshのメッシュで置き換える(DEXCS-OFで従前から推奨してきた方法)なりの方法があり、いずれ別記事にて公開予定。
補足1 流体領域モデルについて
本例のCADモデルにおいて、全体領域と固体領域の差集合を作成すれば、流体領域を正確に定義して使うことは可能である。
しかしながら、この方法でメッシュ作成した場合、レイヤー層を付与しなければ取り立てて大きな問題にはならない(微小な空隙ができてしまう場合もあるが、さほど重要ではない)が、レイヤー層を作成すると、かなり悲惨な状況になってしまう。
また、わざわざCADモデルを作成せずとも、固体領域以外は流体領域であるので、topoSetコマンドを駆使して、regionファイルを作成することも可能ではある。しかし、この方法はDEXCS的にはアウト(とまでいかないがボタン一発で実行できるツールなり、スクリプトなりの実装が面倒)であった。
補足2 multiRegion内のfile設定について
system
system/controlDict(61行目〜)
#include "patchData"
#include "wallHeatFlux"
とあり、❷の「patchData」❸の「wallHeatFlux」を後処理用のFunctionブロックに読み込んでいる箇所があり、領域名が「air」「solid」でないと通用しない部分がある。また、この後処理出力に対するDEXCSプロット出力用の拡張子が「.dplt」となっているファイルについても然りである。領域名が異なるCADデータを使ってセットアップする際には、このままではエラーとなって計算が進まないので、上記インクルード文を一旦コメントアウトして使用することを推奨する。
また、流体領域の❹「fvSolution」についても留意されたい。
system/air/fvsolution(51行目〜)
SIMPLE
{
momentumPredictor yes;
nNonOrthogonalCorrectors 0;
//pRefCell 0;
//pRefValue 100000;
rhoMin 0.2;
rhoMax 2;
}
5行目(実ファイルでは55行目)と6行目をコメントアウトしてあるのは、基準圧力セルとその値を定義するもので、流体領域計算が閉じた空間での計算になった場合にすぐに使えるようにとしておいたものである。
問題はその下の、rhoMinと、 rhoMaxを定義した行で、流体が空気もしくは密度がその範囲の気体で使う場合には、このままで問題無いというか、これが無いと計算初期の擾乱で発散してしまうが、液体で使う場合には、この2行をコメントアウト(行頭に//)して使う必要がある点、特に注意されたい(液体計算用のfvSolutionを別途用意しておくのが良かったかもしれない⇒DEXCS最新版ではそうしておいた)。
constant
「multiRegion内のFile操作」画面において「constant」タグを選択した際の画面の上半分イメージを以下に示す(下半分は固体に関するもので、本例で使用することはないので省略)。
上図の左側「fluidRegions」に収納されているファイル名が長くて読み取れない(何とかならないのか?)が、❶「thermophysicalProperties.air」❷「thermophysicalProperties.water」となっており、領域別に分別される際に❶が「thermophysicalProperties」と名前変更されてそのまま使えるようになっている。これは、流体の領域名を「air」としてあったのでこうなった。上図の下半分に、領域名を❹「fluid」とした場合の画面イメージを参照されたいが、この場合は❶がそのまま分別されて、このまま計算しようとすると、「thermophysicalProperties」が存在しないのでエラーになってしまう。
因みに❶「thermophysicalProperties.air」は、空気の物性値、❷「thermophysicalProperties.water」は水の物性値が収納されており、気体と液体とでは、使用する熱物性モデルが異なるので、計算したい流体が「空気」でもなく「水」でもない場合には、気体か液体かによって、とりあえず気体の場合は「air]を、液体の場合は「water」を選択しておいて、テキストエディターで内容を変更する、という使い方を推奨する(下図は気体の場合の作業イメージ)。
❶〜❺の作業は、直感的にできるであろう。❻「開く」をクリック、もしくは❺「thermophysicalProperties」をダブルクリックすればテキストエディターが立ち上がる、
constant/air/thermophysicalProperties(18行目〜)
thermoType
{
type heRhoThermo;
mixture pureMixture;
transport const;
thermo hConst;
equationOfState perfectGas;
specie specie;
energy sensibleEnthalpy;
}
mixture
{
specie
{
molWeight 28.9;
}
thermodynamics
{
Cp 1000;
Hf 0;
}
transport
{
mu 1.8e-05;
Pr 0.7;
}
}
16行目(実ファイルでは33行目)のモル重量、20行目のCp(比熱)、25行目のmu(粘性係数)、26行目のPr(プラントル数)あたりの数値を変更して使えということである。
なお、上例は気体であり、液体もほぼ同様のパラメータ構成になっているが、液体では7行目の「equationOfState」が「perfectGas」でなく「rhoConst」となっており、「rho」そのものの値を設定する行が存在する、という違いになっている。
密度や熱物性値に関して、OpenFOAMにはこれら以外にも様々なライブラリーが用意されているので、それらに変更して使用することも可能である。
constant
補足3 デフォルトの初期・境界条件について
流体領域用の境界条件としては、一般的によく使われる「流入」「流出」「静止壁」の境界条件が、それぞれ「inlet」「outlet」「walls」という境界名で定義済となっているる。たとえば、
0/fluidRegions/U(19行目〜)
dimensions [ 0 1 -1 0 0 0 0 ];
internalField uniform $zeroVelocity;
boundaryField
{
inlet
{
type fixedValue;
value uniform (1 0 0);
}
outlet
{
type zeroGradient;
}
walls
{
type noSlip;
}
}
といった具合である。本来であれば、名前の部分をもう少し拡張性のある記法(大文字・小文字の区別や特殊文字を使った任意表現)などしたかったが、今後の課題。
これ以外の名前の境界面は、全て type zeroGradient; になってしまうので、適合が必要。
補足 テンプレートケースについて
これはDEXCS2024に同梱のTreeFoamマニュアル(9-5-1-1.
case の作成、202〜207ページ)に則り、以前に作成して公開してあったもの、をベースに不要なファイルを削除し、本例題(ヒートシンク)用の適合作業が極力簡単になるように各パラメタファイルを精選吟味、且つ後処理用パラメタファイルを追加したものである。
フォルダー構成として、「0」「constant」「system」と、OpenFOAMの基本ケースファイルと同じ構成であるが、各フォルダ下には「fluidRegions」「solidRegions」というフォルダと、全体で共通に使用するパラメタファイル(constant/g, system/controlDict など)が同梱されている。
かようなファイル構成にしておけば、DEXCS-WBでTrmplateCaseとして指定、メッシュコンテナでこれを使ってケース作成し、マルチリージョンメッシュを作成すれば、あとはTreeFoamを使って、サクッとケースセットアップできるようになるというものである。
但し、もちろんヒートシンク以外の問題に対しては、相応のカスタマイズが必要になるが、補足2、補足3 を理解いただければ、カスタマイズも難しくないと思われる。如何であろう。不具合なり、ご要望なりあれば、本記事にコメント投稿いただきたい。