こんにちは(@t_kun_kamakiri)
OpenFOAMの熱流体固体連成によるヒートシンクの熱流体解析の設定方法を解説します。
使用するソルバはchtMultiRegionSimpleFoamで熱流体と固体を連成させた定常解析用のソルバになります。
OpenFOAMv2412のバージョンにおいて現在は、浮力を考慮した熱流体解析ソルバは以下のものがあります。
ソルバ名 | 定常 / 非定常 | 主な特徴 | 主な用途・備考 |
---|---|---|---|
chtMultiRegionSimpleFoam |
定常 | 多領域の熱流体連成(非圧縮性) | 構造物と流体の熱連成、定常問題向け |
chtMultiRegionFoam |
非定常 | 多領域・非圧縮性の時間依存連成解析 | 熱伝導と流体連成の過渡解析 |
chtMultiRegionTwoPhaseEulerFoam |
非定常 | 多領域 + 二相流(Euler-Euler) + 熱連成 | 液体/気体の二相流+固体との熱連成に対応 |
buoyantSimpleFoam |
定常 | 単領域の自然対流・熱伝導 | 密度差による自然対流、定常解析向け |
buoyantPimpleFoam |
非定常 | 上記の非定常版 | 過渡的な自然対流解析 |
buoyantBoussinesqSimpleFoam |
定常 | Boussinesq近似(小温度差) | 温度変化が小さい自然対流 |
buoyantBoussinesqPimpleFoam |
非定常 | 上記の時間依存版 | 過渡的自然対流、簡略化モデル |
この中のchtMultiRegion系は流体(液体、気体)・固体の複数領域の熱流体解析を行うために設計されています。
ただ、テキストベースで解析設定しようとすると、めちゃくちゃ大変です。
以下にOpenFOAMが用意しているチュートリアルを解説した記事がありますので、一度読んでみると良いでしょう。
最終的にはヒートシンクの熱流体解析を行います。
CFDで移動現象論111例題
ヒートシンクhttps://t.co/ceod0EWiq6 https://t.co/pz65L8pkjU pic.twitter.com/B4F6EO3UOb— カマキリ🐲計算力学頑張る (@t_kun_kamakiri) August 4, 2025
マルチリージョン系はメッシュ作成だけでも少し特殊なので、本記事ではまずはメッシュ作成のみ解説したいと思います。
chtMultiRegionSimpleFoamによるメッシュ作成方法の解説
OpenFOAM v2412(WSL Ubuntu 22.04)
解析対象
解析対象は以下のように、筐体内部に底面から2000Wの発熱体があり、発生した熱は上部に取り付けられたヒートシンクを介して放熱される構成します。
流体領域には自然対流が生じ、固体領域との熱連成を考慮して解析を行います。
モデル作成
モデルの作成はFreeCADで行いました。
まずはメッシュ作成用の作業フォルダを作成するため、今回行う解析内容と近いチュートリアルをコピーします。
1 2 3 |
cp -r $FOAM_TUTORIALS/heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeaterRadiation run001 cd run001 mkdir model |
modelフォルダを作成したのでFreeCADモデルはこちらに保存します。
形状は非常にシンプルなので、ここでは詳しい解説は行いません。
発熱減の底面は厚み2mmで42mm×40mmの大きさとします。
以下のように厚み2mm高さ15mmのフィンが9個並んでいるものとします。 以上でヒートシンクの固体領域のモデル作成ができました。
筐体部分(気体領域)も作成しておきます。
モデル作成したものを上記のように境界面に名前を付けておくと、OpenFOAMでの解析設定が楽です。
- ヒートシンク(固体領域):heatsink.stl
- 筐体(気体領域):outer.stl
として別々で出力します。
境界面に名前を付けると複数面に分割されてしまいますが、FreeCADのPythonマクロを使うとこれらをひとつのstlファイルにまとめて出力することができます。
動画で操作を確認したい人はこちらをご参考ください。
出力したstlファイルは寸法がmm単位なので、1/1000倍にしてメートルにします。
1 2 |
surfaceConvert -scale 0.001 model/heatsink.stl model/heatsink_m.stl surfaceConvert -scale 0.001 model/outer.stl model/outer_m.stl |
以後使用するのはheatsink_m.stl
とouter_m.stl
です。
メッシュ作成
- ヒートシンク(固体領域):heatsink.stl
- 筐体(気体領域):outlet.stl
これをもとにメッシュ作成を行います。
事前準備
チュートリアルから気体領域(air)と固体領域(heatsink)をコピーして作成します。同時に不要な情報は削除しておきましょう。
1 2 3 4 |
cp -r constant/heater constant/heatsink cp -r constant/bottomAir constant/air cp -r system/heater system/heatsink cp -r system/bottomAir system/air |
不要な情報を削除
1 2 |
rm -r constant/{bottomAir,leftSolid,heater,rightSolid,topAir} rm -r system/{bottomAir,leftSolid,heater,rightSolid,topAir} |
特徴線surfaceFeatureExtractDictとメッシュ作成snappyHexMeshDictをコピーします。
1 2 3 |
$FOAM_TUTORIALS/incompressible/simpleFoam/motorBike/system/surfaceFeatureExtractDict surfaceFeatureExtractDict.air $FOAM_TUTORIALS/incompressible/simpleFoam/motorBike/system/surfaceFeatureExtractDict surfaceFeatureExtractDict.heatsink $FOAM_TUTORIALS/heatTransfer/chtMultiRegionFoam/snappyMultiRegionHeater/system/snappyHexMeshDict system/ |
ここまででフォルダ構成は以下となります。
色付き文字がフォルダを意味しています。
ベースメッシュの作成(blockMesh)
まずはベースメッシュをblockMeshで作成します。
ベースメッシュのサイズはouter_m.stlとほぼ同じサイズ(じゃっかん大きいくらいで良い)とします。
system/blockMeshDict
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 |
scale 0.001; vertices ( (-9 -10 0) ( 51 -10 0) ( 51 60 0) (-9 60 0) (-9 -10 20) ( 51 -10 20) ( 51 60 20) (-9 60 20) ); blocks ( hex (0 1 2 3 4 5 6 7) (15 20 5) simpleGrading (1 1 1) ); edges ( ); boundary ( ); mergePatchPairs ( ); |
ではblockMeshを実行します。
1 |
blockMesh |
ベースメッシュがheatsinkをしっかり覆えているかをParaViewで確認しておきましょう。
特徴線の抽出(surfaceFeatureExtractDict)
特徴線はsnappyHexMeshのメッシュ作成の際に使用します。
system/surfaceFeatureExtractDict.air
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 |
outer_m.stl { // How to obtain raw features (extractFromFile || extractFromSurface) extractionMethod extractFromSurface; // Mark edges whose adjacent surface normals are at an angle less // than includedAngle as features // - 0 : selects no edges // - 180: selects all edges includedAngle 150; subsetFeatures { // Keep nonManifold edges (edges with >2 connected faces) nonManifoldEdges no; // Keep open edges (edges with 1 connected face) openEdges yes; } // Write options // Write features to obj format for postprocessing writeObj yes; } |
surfaceFeatureExtractDict.heatsink
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 |
heatsink_m.stl { // How to obtain raw features (extractFromFile || extractFromSurface) extractionMethod extractFromSurface; // Mark edges whose adjacent surface normals are at an angle less // than includedAngle as features // - 0 : selects no edges // - 180: selects all edges includedAngle 150; subsetFeatures { // Keep nonManifold edges (edges with >2 connected faces) nonManifoldEdges no; // Keep open edges (edges with 1 connected face) openEdges yes; } // Write options // Write features to obj format for postprocessing writeObj yes; } |
特徴線の作成は以下のコマンドで行います。
1 2 |
surfaceFeatureExtract -dict system/surfaceFeatureExtractDict.air surfaceFeatureExtract -dict system/surfaceFeatureExtractDict.heatsink |
特徴線はconstant/triSurface/outer_m.eMesh
とconstant/triSurface/heatsink_m.eMesh
に作成されています。
メッシュ作成(snappyHexMeshDict)
snappyHexMeshDictは全文を載せておき、いくつか注意点を述べておきます。
system/snappyHexMeshDict
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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 |
FoamFile { version 2.0; format ascii; class dictionary; location "system"; object snappyHexMeshDict; } castellatedMesh yes; snap yes; addLayers yes; geometry { outer_m.stl { type triSurfaceMesh; name outer; regions { XMin { name XMin; } YMin { name YMin; } ZMax { name ZMax; } YMax { name YMax; } ZMin { name ZMin; } XMax { name XMax; } } } heatsink_m.stl { type triSurfaceMesh; name heatsink; regions { heatSource { name heatSource; } heatsink { name heatsink; } } } } castellatedMeshControls { features ( { file heatsink_m.eMesh; level 2; } { file outer_m.eMesh; level 2; } ); refinementSurfaces { outer { level (0 0); regions { XMin { level (0 0); patchInfo { type wall; } } XMax { level (0 0); patchInfo1 { type wall; } } YMin { level (0 0); patchInfo { type patch; } } YMax { level (0 0); patchInfo { type patch; } } ZMax { level (0 0); patchInfo { type wall; } } ZMin { level (0 0); patchInfo { type wall; } } } } heatsink { level (0 0); regions { heatSource { level (2 3); patchInfo { type wall; } } heatsink { level (2 3); patchInfo { type wall; } } } } } refinementRegions { } locationsInMesh ( (( 0.005 0.005 0.005) heatsink) (( 0.05 0.05 0.018) air) ); maxLocalCells 100000000; maxGlobalCells 100000000; minRefinementCells 1; nCellsBetweenLevels 3; resolveFeatureAngle 30; allowFreeStandingZoneFaces no; } snapControls { nSolveIter 30; nSmoothPatch 3; tolerance 4.0; nRelaxIter 5; nFeatureSnapIter 10; } addLayersControls { layers { heatSource { nSurfaceLayers 3; } heatsink { nSurfaceLayers 3; } } relativeSizes yes; expansionRatio 1.0; finalLayerThickness 0.3; minThickness 0.03; nGrow 1; // featureAngle 60; featureAngle 130; nRelaxIter 5; nSmoothSurfaceNormals 1; nSmoothNormals 3; nSmoothThickness 10; maxFaceThicknessRatio 0.5; maxThicknessToMedialRatio 0.3; minMedialAxisAngle 130; nBufferCellsNoExtrude 0; nLayerIter 50; nRelaxedIter 20; } meshQualityControls { maxNonOrtho 65; maxBoundarySkewness 20; maxInternalSkewness 4; maxConcave 80; minFlatness 0.5; minVol 1e-13; minTetQuality -1e+30; minArea -1; minTwist 0.05; minDeterminant 0.001; minFaceWeight 0.05; minVolRatio 0.01; minTriangleTwist -1; nSmoothScale 4; errorReduction 0.75; relaxed { maxNonOrtho 180; } } debug 0; mergeTolerance 1e-05; |
以下でstlファイルのgeometryを設定します。
同時にregionsでsnappyHexMeshDict内で設定する境界面を指定します。
stl作成の際に決めた境界面と同じにしておけばOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
geometry { outer_m.stl { type triSurfaceMesh; name outer; regions { XMin { name XMin; } YMin { name YMin; } ...(省略)... } } heatsink_m.stl { type triSurfaceMesh; name heatsink; regions { heatSource { name heatSource; } heatsink { name heatsink; } } } } |
以下で特徴線の分割数を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 |
castellatedMeshControls { features ( { file heatsink_m.eMesh; level 2; } { file outer_m.eMesh; level 2; } ); ...(省略)... |
以下で境界面まわりの分割数を指定します。
ここでは特に再分割はしていません。
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 |
refinementSurfaces { outer { level (0 0); regions { XMin { level (0 0); patchInfo { type patch; } } YMin { level (0 0); patchInfo { type wall; } } ...(省略)... } } heatsink { level (0 0); regions { heatSource { level (2 3); patchInfo { type wall; } } heatsink { level (2 3); patchInfo { type wall; } } } } } |
次が非常に大事なところです。
座標を指定することで、stlで囲まれた領域の名前を指定します。
必ず指定した座標が領域内部にあることを確認してください。
1 2 3 4 5 6 |
locationsInMesh ( (( 0.005 0.005 0.005) heatsink) (( 0.05 0.05 0.018) air) ); |
あとは境界層の数を指定する設定を行います。
addLayers yes;がno/offだと境界層の設定が効かないので注してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
addLayersControls { layers { heatSource { nSurfaceLayers 3; } heatsink { nSurfaceLayers 3; } } |
また、snappyHexMeshはメッシュの再分割と境界層の相性が悪いので、境界層を設定してもきれいに境界層が入らない場合があります。
以上でメッシュ作成の準備ができたのでsnappyHexMeshを実行します。
1 |
snappyHexMesh -overwrite |
snappyHexMesh
は3段階に分けてメッシュ作成を行います。
-overwrite
オプションを付けておくとconstant/polyMesh
にメッシュの最新情報が入ることになります。
メッシュが作成できてもconstant/polyMesh
に*Zone
というファイルができるだけで、まだ気体・固体領域に分かれていません。
領域分割
0.origフォルダをコピーしておきます。
1 |
cp -r 0.orig 0 |
以下で気体・固体領域の名前を指定します。
constant/regionProperties
1 2 3 4 5 |
regions ( fluid (air) solid (heatsink) ); |
気体・固体領域の分割は以下のコマンドで行います。
1 |
splitMeshRegions -cellZones -overwrite |
heatsinkのような固体領域は圧力pと温度Tのみ使用するので、不要な設定ファイルは削除しておきます。残していても問題なく計算はできますが…
1 |
rm -r 0/heatsink/{U,p_rgh,k,epsilon,alphat,rho} |
領域分割によりフォルダ構成は以下となっています。
splitMeshRegionsコマンドにより、0, constant. system内に領域ごとの設定ファイルが作成されますconstant/air(heatsink), system/air(heatsink)のフォルダは元々作成していましたが、0/air(heatsink)はフォルダが生成されたと思います。
ParaViewでメッシュを確認しましょう。
以下のように領域ごとにパッチ名が割り当てられていることを確認してください。
気体領域と固体領域で共通している面は、heatsink_to_airやair_to_heatsinkの名前が付けられます。
以上でメッシュ作成を終わります。
まとめ
本記事で見たようにマルチリージョン系はメッシュ作成でも少し癖があるので、手動で行うのは結構手間です。
次回は境界条件を設定しますが、0, constant, systemフォルダ内の設定はファイルは各領域(air, heatsink)ごとに設定しないといけないため、めちゃくちゃ面倒になります。
可能ならTreeFoamのようなGUIで設定できる方が良いかもしれません。
WSLでもTreeFoamが使えそうなのを確認したので、おいおい設定方法をまとめたい思います。
もろもろインストールできてないのでエラー出るけど使えることがわかった。 pic.twitter.com/BAU4K4qriA
— カマキリ🐲計算力学頑張る (@t_kun_kamakiri) June 12, 2025
計算力学技術者のための問題アプリ
計算力学技術者熱流体2級、1級対策アプリをリリースしました。
- 下記をクリックしてホームページでダウンロードできます。
- LINE公式に登録すると無料で問題の一部を閲覧できます。
※LINEの仕様で数式がずれていますが、アプリでは問題ありません。
- 計算力学技術者の熱流体2級問題アプリ作成
リリース後も試行錯誤をしながら改善に努め日々アップデートしています。
備忘録として作成の過程を綴っています。
OpenFOAMに関する技術書を販売中!
OpenFOAMを自宅で学べるシリーズを販売中です。
OpenFOAM初学者から中級者向けの技術書となっていますので、ぜひよろしくお願いいたします。
おすすめ参考図書
本記事は以下の書籍の例題のひとつになります。
Fluentでの設定を確認したい方は本書を手に取ってみると良いでしょう(サンプルモデルが公開されています)
☟こちらは、OpenFOAMの日本語書籍が無い中唯一わかりやすい参考書だと思います。
☟こちらもOpenFOMの古いバージョンでの和訳になります。さすがにこちらはバージョンに対する日本語でのケアはしていないので、OpenFOAMに慣れている方は購入しても良いかと思います。僕は「日本語でまとまっている内容」なので少し重宝しています。
☟以下に、もっと初心者向けの同人誌を紹介しておきます。
初心者は「ってか、まずどうやってOpenFOAMをインストールするの?」というところからつまずきがちです。
そんな時は、以下の書籍をおすすめします。
改訂新版 OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))
インストール方法とチュートリアルで流体解析を体験・・・ちょっと高度な解析まで解説があります。著者曰くOpenFOAMのバージョンの追跡を行いながら、書籍をアップデートするようなので安心ですね。