こんにちは(@t_kun_kamakiri)
本記事ではOpenFOAMを用いた熱流体解析の設定手順について解説を行います。
具体的には自然対流下でのマネキン周りの熱量を計算し、対流熱伝達と熱ふく射における影響度を調べることを目的とします。
今回は、前回の記事で作成した乱流モデル($k$-$\omega$SST)の結果を使って熱流束と熱伝達率を出力する設定を加えたい思います。
マネキン周りの熱流体解析(乱流モデル$k$-$\omega$SST)
本記事では前回の記事で作成したモデルをベースにして以下の結果を出力します。
- 熱伝達率
- 熱流束
- OpenFOAMを用いて流体解析を勉強している人
- 熱伝達率と熱流束の出力をしたい人
- OpenFOAMで熱流体解析(ふく射込み)を試したい人
本記事では出てきた結果に対する妥当性の検証は行わず、とりあえず計算できるひな形のモデルを作成することを目的としています。
- メッシュはそこまでこだわらない(前回のまま)
- 乱流モデルk-ωSST乱流モデル
- ふく射モデル無し
とします。
OpenFOAM v2412(WSL Ubuntu 22.04)
フォルダ構成の確認
フォルダ構成は以下のようにしています。
1 2 3 4 5 6 7 8 9 |
kamakiri$ tree -L 1 . ├── cfMesh ├── model ├── run_shm-d1_NoRad_base ├── run_shm-d1_NoRad_komegaSST_base 👈今回使用する解析フォルダ ├── run_shm_NoRad_base ├── shm └── shm-d1 |
解析用フォルダを作成します。
1 |
cd run_shm-d1_NoRad_komegaSST_base |
- 物性値
- 乱流モデル($k$-$\omega$SST)
- ふく射モデル(設定なし)
- 境界条件
- 離散化スキーム
- 代数ソルバ
これらは前回の記事で設定しているものを使うため、ここでは解説をしません。
出力の設定
結果の出力はfunction objects
に熱伝達率と熱流束の設定を追加します。
なので出力設定は以下になります。
- 連続式の誤差
- 残差
- $y^{+}$
- 体積流量
- 熱伝達率👈追加
- 熱流束👈追加
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 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
application buoyantSimpleFoam; startFrom latestTime; startTime 0; stopAt endTime; endTime 2000; deltaT 1; writeControl timeStep; writeInterval 100; purgeWrite 0; writeFormat ascii;//binary; writePrecision 6; writeCompression off; timeFormat general; timePrecision 6; runTimeModifiable true; functions { continuityError1 { type continuityError; libs ( fieldFunctionObjects ); // Mandatory entries (unmodifiable)// Optional entries (runtime modifiable) phi phi; // Optional (inherited) entries writePrecision 8; writeToFile yes; useUserTime yes; region region0; enabled yes; log yes; timeStart 0; timeEnd 8000; executeControl timeStep; executeInterval 1; writeControl timeStep; writeInterval 50; } residuals { type solverInfo; libs ( "libutilityFunctionObjects.so" ); fields ( ".*" ); } fieldMinMax1 { type fieldMinMax; libs ( fieldFunctionObjects ); // Mandatory entries (unmodifiable)// Mandatory entries (runtime modifiable) mode magnitude; fields ( U p T ); // Optional entries (runtime modifiable) location yes; writePrecision 8; writeToFile yes; useUserTime yes; region region0; enabled yes; log yes; timeStart 0; timeEnd 8000; executeControl timeStep; executeInterval 1; writeControl timeStep; writeInterval 100; } yPlus1 { type yPlus; libs ( fieldFunctionObjects ); // Mandatory entries (unmodifiable)// Optional (inherited) entries writePrecision 8; writeToFile yes; useUserTime yes; region region0; enabled yes; log yes; timeStart 0; timeEnd 8000; executeControl timeStep; executeInterval 1; writeControl timeStep; writeInterval 100; } ZMax { type surfaceFieldValue; libs ( "libfieldFunctionObjects.so" ); writeControl timeStep; log yes; writeFields no; regionType patch; name ZMax; operation sum; fields ( phi ); // Optional (inherited) entries writePrecision 8; writeToFile yes; useUserTime yes; region region0; enabled yes; timeStart 0; timeEnd 8000; executeControl timeStep; executeInterval 1; writeInterval 100; } ZMin_outlet1 { $ZMax; name ZMin_outlet1; } ZMin_outlet2 { $ZMax; name ZMin_outlet2; } //https://doc.openfoam.com/2306/tools/post-processing/function-objects/field/wallHeatFlux/ wallHeatFlux1 { // Mandatory entries (unmodifiable) type wallHeatFlux; libs (fieldFunctionObjects); // Optional entries (runtime modifiable) //patches (<patch1> ... <patchN>); // (wall1 "(wall2|wall3)"); //qr qr; // Optional (inherited) entries // writePrecision 8; // writeToFile true; // useUserTime true; // region region0; // enabled true; // log true; // timeStart 0; // timeEnd 8000; executeControl timeStep; executeInterval 1; writeControl writeTime;//timeStep; writeInterval 1; } //https://doc.openfoam.com/2306/tools/post-processing/function-objects/field/heatTransferCoeff/ heatTransferCoeff1 { // Mandatory entries (unmodifiable) type heatTransferCoeff; libs (fieldFunctionObjects);//(fieldFunctionObjects); field T;//<field>; // patches ("([a-zA-Z]+-(left|right)-[0-9]+)");//(<patch1> <patch2> ... <patchN>); patches ( unspecified-24 hand-left-17 shoulder-left-16 arm-right-4 foot-right-14 chest-8 neck-22 face-10 back-7 leg-left-20 hand-right-6 foot-left-21 );//(<patch1> <patch2> ... <patchN>); htcModel fixedReferenceTemperature;//<htcModel>; TRef 298.15; // UInf (20 0 0); // Cp CpInf; // CpInf 4000; // rho rhoInf; // rhoInf 1.2; // Optional (inherited) entries // result <fieldResult>; region region0; // enabled true; // log true; // timeStart 0; // timeEnd 8000; executeControl timeStep; executeInterval 1; writeControl writeTime;;//timeStep; writeInterval 1; } } |
熱伝達率
熱伝達率はheatTransferCoeffで設定しています。
熱伝達率の定義は3つあります。
ReynoldsAnalogy: レイノルズ類推
h = 0.5 \rho_{\infty} C_{p,\infty} |U_{\infty}| C_f
\end{align*}
localReferenceTemperature: 局所基準温度
h = \frac{\dot{q}}{T_c – T_w}
\end{align*}
fixedReferenceTemperature: 固定基準温度
h = \frac{\dot{q}}{T_c – T_{\text{ref}}}
\end{align*}
モデル | 特徴 | 適用範囲 |
ReynoldsAnalogy | 摩擦係数を利用し、乱流流れに適用 | 境界層流れ、航空機・車両の外部流れ、強制対流 |
localReferenceTemperature | 局所温度を基準にする | 内部流れ(管流れ)、自由対流、局所温度変化が重要な場合 |
fixedReferenceTemperature | 固定温度を基準にする | 熱交換器、設計基準の統一、比較用 |
今回はfixedReferenceTemperature
を使用しています。
熱流束
熱流束はwallHeatFlux
で設定しています。
最低限の設定だけを行っています。
基本的に境界条件がtype wall(壁条件)のものは、出力されるのですべて設定する場合は特に壁面の境界名を指定する必要はありません。
writeControl writeTime;
としていますが、ファイル(U, T, p_rgh, …など)と同じタイミング(
writeInterval 100;
)で結果を出力されるので都合が良いためこのようにしています。計算実行
乱流モデルとふく射モデルは今回使用しないためファイルを一時避難させておきます。
1 2 |
mkdir -p 0/old mv 0/{G,IDefault,alphat,epsilon,k,nut} 0/old/ |
では、並列計算の実行します。
1 2 |
decomposePar mpirun -np 4 buoyantSimpleFoam -parallel > log.buoyantSimpleFoam & |
計算は数分で終わると思います。
結果の可視化
連続式の誤差

残差
熱伝達率と熱流束の可視化
ParaViewで確認ができます。
熱流束のデータ
postProcessing/wallHeatFlux1/0/wallHeatFlux.dat
に以下のように各ステップでの壁面条件の熱流束の最小値(min)、最大値(max)、積分値(integral)が出力されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# Wall heat-flux # Time patch min max integral 1 XMin 0.000000e+00 0.000000e+00 0.000000e+00 1 YMin 0.000000e+00 0.000000e+00 0.000000e+00 1 YMax 0.000000e+00 0.000000e+00 0.000000e+00 1 XMax 0.000000e+00 0.000000e+00 0.000000e+00 1 ZMin_wall 0.000000e+00 0.000000e+00 0.000000e+00 1 ZMin_wall1 0.000000e+00 0.000000e+00 0.000000e+00 1 ZMin_wall2 0.000000e+00 0.000000e+00 0.000000e+00 1 unspecified-24 2.517129e+01 8.427858e+02 3.224279e+02 1 hand-left-17 1.999902e+01 7.035485e+02 2.317997e-01 1 shoulder-left-16 6.708124e+01 6.708124e+01 6.873770e-03 1 arm-right-4 4.489011e+01 5.447709e+01 1.192482e-02 1 foot-right-14 3.761676e+01 3.007948e+02 4.643496e-02 1 chest-8 2.182461e+02 2.182461e+02 3.659773e-02 1 neck-22 9.405790e+01 2.615839e+02 1.062127e-01 1 face-10 3.387485e+01 4.349193e+02 1.176913e-01 |
積分された単位時間当たりの熱量$\dot{Q}$から各部位の面積$A$で割れば、熱流束$\dot{q}=\frac{\dot{Q}}{A}$が求まります。
熱流束の分布を確認する場合は、ParaView確認ができます。

先行論文と比較してみると熱流束の値が小さいようです。
本記事での流体解析の結果は対流のなので、先行論文のaと比較することになります。
value uniform 309.15;
なので$34^{\circ}$Cです。
人の体温で$34^{\circ}$Cというのは低いと思いますが、先行論文のマネキンの温度は実測に近い温度にしたという実験的な都合がありそうです。
熱伝達率のデータ
熱伝達率の分布はParaViewで確認することができます。

fixedReferenceTemperature: 固定基準温度
h = \frac{\dot{q}}{T_c – T_{\text{ref}}}
\end{align*}
- $T_c$:マネキン表面温度
- $ T_{\text{ref}}=298.15$:参照温度
熱伝達率に関しては物性値ではなく、流れによって決まるため、このように流体解析を行って決定される量なのでやっかいですよね。
まとめ
本記事ではOpenFOAMを用いてマネキンモデルまわり熱流体解析を乱流モデルありで行い、さらに熱流束と熱伝達率を出力する設定を加えました。
次回は、乱流モデルの設定$k$-$\omega$SSTの設定に加えてふく射モデルを考慮した解析を行います。より実際の環境に近い条件での解析を行う予定です。
先行文献では、複数の乱流モデルでの比較を行った結果、$k$-$\omega$SSTの乱流モデルがマネキン周りの熱流束の実験値と一番近いモデルだったと示されています。
k-ωSSTに変更
当然見た目は変わらない
実験での熱流束だとk-ωSSTが最も予測精度良かったよって結論付けている。
■Application of open-source CFD software to the indoor airflow simulationhttps://t.co/fSGosRR0LD https://t.co/21qWHgb7yH pic.twitter.com/Avpezrnugl— カマキリ🐲CAE頑張る (@t_kun_kamakiri) March 2, 2025
どのような乱流モデルが一番適しているかは見ている現象にもよりますが、本記事では先行文献にならって$k$-$\omega$SSTを使用しています。
計算力学技術者のための問題アプリ
計算力学技術者熱流体2級、1級対策アプリをリリースしました。
- 下記をクリックしてホームページでダウンロードできます。
- LINE公式に登録すると無料で問題の一部を閲覧できます。
※LINEの仕様で数式がずれていますが、アプリでは問題ありません。
- 計算力学技術者の熱流体2級問題アプリ作成
リリース後も試行錯誤をしながら改善に努め日々アップデートしています。
備忘録として作成の過程を綴っています。
OpenFOAMに関する技術書を販売中!
OpenFOAMを自宅で学べるシリーズを販売中です。
OpenFOAM初学者から中級者向けの技術書となっていますので、ぜひよろしくお願いいたします。
次回の技術書典18に向けて内容を考え中です。
乞うご期待!!

お勧めの参考書
本記事の内容について触れている書籍がこちらです。
CFD(流体解析)のガイドブックというタイトルだけあって、熱流体に関する内容は網羅的に書かれています。
乱流モデルの数式の展開が非常に丁寧なのはこちらの参考書です。
今まで読んだ本の中で途中式もしっかり書いてあって一番丁寧でした。
乱流モデルの話だけでなく、混相流(気液、固液)や粒子法、浅水方程式の話も乗っているので重宝しています。
乱流モデルはこちらもお勧めです。
前半は数値シミュレーションの離散化の話で、後半に乱流モデルの話が出てきます。
乱流モデルのざっくりした解説と流体全般の基礎知識にはこちらがちょうど良いでしょう。