計算実行
設定の確認ができたので計算を実行します。
system/controlDictは以下のようになっています。
system/controlDict
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
application chtMultiRegionFoam; startFrom latestTime; startTime 0.001; stopAt endTime; endTime 100; deltaT 0.001; writeControl adjustable; writeInterval 10; purgeWrite 0; writeFormat ascii; writePrecision 8; writeCompression off; timeFormat general; timePrecision 6; runTimeModifiable yes; maxCo 0.6; // Maximum diffusion number maxDi 10.0; adjustTimeStep yes; functions { #include "vtkWrite" } |
function Objectsで「#include “vtkWrite”」として、「system/vtkWrite」ファイルを読み込んでいます。各領域のvtkファイルを作成してくれているのでParaViewで結果を確認するときは便利です。
system/vtkWrite
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
vtkWrite { type vtkWrite; libs (utilityFunctionObjects); log true; writeControl writeTime; writeInterval 1; regions (".*"); internal true; boundary true; single false; interpolate true; // Fields to output (words or regex) fields (".*"); //- Output format (ascii | binary) - Default=binary // format binary; //- Use legacy output format - Default=false // legacy false; //- Output directory name - Default="postProcessing/<name>" // directory "VTK"; //- Write cell ids as field - Default=true writeIds false; } // Solid walls only walls { type vtkWrite; libs (utilityFunctionObjects); log true; writeControl writeTime; writeInterval 1; internal false; // single true; regions ( heater "(?i).*solid" ); patches ( "(?i).*solid_to.*" "heater.*(Air|Water)" ); fields (T); } |
では、計算実行します。
1 |
chtMultiRegionFoam |
例えば並列計算する場合の計算実行は以下です。
1 2 |
mpirun -np 8 chtMultiRegionSimpleFoam -parallel > log.chtMultiRegionSimpleFoam reconstructPar -allRegions -noFunctionObjects |
結果の確認
ParaViewでpostProcessingに保存されたvtkファイルを読み込みます。
温度分布を見るとこんな感じです。
leftSolidとheaterの境界は熱伝導率を持つ厚みを設けたので熱が伝わりにくくなっているのが確認できます。
まとめ
OpenFOAMのchtmultiRegionFoamのチュートリアルの解説を行いました。
手順は以下です。
- blockMesh:ベースメッシュの作成
- topoSet:cellZoneの作成
- cp -r 0.orig 0:0.origフォルダをコピー
- splitMeshRegions:topoSetで作成したcellZoneを使って領域分割
- changeDictionary:境界条件の変更
- chtMultiRegionFoam:計算実行
今回紹介したチュートリアルでは領域分割はtopoSetとsplitMeshRegionsを使っていますが、複雑な形状になると対応できなくなるでしょう。
これをsnappyHexMeshで行っているのが以下のチュートリアルです。
1 |
$FOAM_TUTORIALS/heatTransfer/chtMultiRegionFoam/snappyMultiRegionHeater |
こちらも合わせて見ておくといいですね。
chtMultiRegionFoamの勉強のきっかけ
当ブログに低温調理でのお肉の温度変化を対流なども考慮した解析をできないかという問い合わせが来ました。
- 複数の物質との熱伝導
- 強制対流や自然対流も考慮した熱解析
- 脂肪の融解熱
など考慮したいことが多いようです。
あまり色々と考えたあげく以下のように提案をしてみました。
すると先方からは以下のようにしたいという提案がありまして・・・
- 方法1
熱流体は個別でOpenFOAMなりで計算して熱流束や熱伝達率を算出する
その熱流束や熱伝達率を固体表面に与えて熱解析を行う - 方法2
本記事で紹介したように流体・固体熱連成を行う
というわけで、方法2を試すことにしました。
どれほどchtMultiRegionFoamソルバが使えるのかを試してみたくなったというわけです。
※追記:適当な条件で試しました。
適当にモデルを作ってやってみました。
solid部分がお肉のつもりです。
物性は良くわからないですが調べて適当に設定しています。
constant/solid/thermophysicalProperties
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
thermoType { type heSolidThermo; mixture pureMixture; transport constIso; thermo hConst; equationOfState rhoConst; specie specie; energy sensibleEnthalpy; } /* 脂肪層の熱特性 熱伝導率は水の1/3の0.194[W/m・K] 比熱容量は水の1/2の2.09[kJ/kg・K] 比重は0.92g/ml */ mixture { specie { molWeight 6000;//g/mol } transport { kappa 0.194;// W/m K } thermodynamics { Hf 0; Cp 2.09E3; //J/kg K } equationOfState { rho 920;//kg/m3 } } |
おすすめ参考図書
☟こちらは、OpenFOAMの日本語書籍が無い中唯一わかりやすい参考書だと思います。
☟こちらもOpenFOMの古いバージョンでの和訳になります。さすがにこちらはバージョンに対する日本語でのケアはしていないので、OpenFOAMに慣れている方は購入しても良いかと思います。僕は「日本語でまとまっている内容」なので少し重宝しています。
☟以下に、もっと初心者向けの同人誌を紹介しておきます。
初心者は「ってか、まずどうやってOpenFOAMをインストールするの?」というところからつまずきがちです。
そんな時は、以下の書籍をおすすめします。
改訂新版 OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))
インストール方法とチュートリアルで流体解析を体験・・・ちょっと高度な解析まで解説があります。著者曰くOpenFOAMのバージョンの追跡を行いながら、書籍をアップデートするようなので安心ですね。