OpenFOAMで総括熱伝達率(U値)を計算する方法。chtMultiRegionFoam対応
こんにちは(@t_kun_kamakiri)
OpenFOAMの熱流体固体連成による総括熱伝達率(U値)を計算で求めたいと思います。
例えば以下のような平板が3層の場合の熱伝導を考えるにはどうするでしょうか?
3層の合成の熱伝導率を考えることができれば、両端の温度差からフーリエの法則を使って熱量が計算できます。
結論を先に言うと、合成の熱伝導率は総括熱伝達率(U値)と呼ばれ、$\frac{L}{KA}=\frac{L_{1}}{k_{1}A}+\frac{L_{2}}{k_{2}A}+\frac{L_{3}}{k_{3}A}$のように書けます。
熱伝達率の部分は経験則で与えるか、流体解析により求めるしかありません。
実際に熱流体解析により通過する熱流束$q$を求め、両端の温度差$\Delta T$からU値を算出することができます。
今回はこの総括熱伝達率(U値)を熱流体解析で求めたいと思います。

- マルチリージョン用メッシュからOpenFOAMでの流体解析の手順を紹介
- 総括熱伝達率(U値)を計算
使用するソルバはchtMultiRegionFoamで熱流体と固体を連成させた非定常解析用のソルバになります。
OpenFOAMv2506のバージョンにおいて現在は、浮力を考慮した熱流体解析ソルバは以下のものがあります。
| ソルバ名 | 定常 / 非定常 | 主な特徴 | 主な用途・備考 |
|---|---|---|---|
chtMultiRegionSimpleFoam | 定常 | 多領域の熱流体連成(非圧縮性) | 構造物と流体の熱連成、定常問題向け |
chtMultiRegionFoam | 非定常 | 多領域・非圧縮性の時間依存連成解析 | 熱伝導と流体連成の過渡解析 |
chtMultiRegionTwoPhaseEulerFoam | 非定常 | 多領域 + 二相流(Euler-Euler) + 熱連成 | 液体/気体の二相流+固体との熱連成に対応 |
buoyantSimpleFoam | 定常 | 単領域の自然対流・熱伝導 | 密度差による自然対流、定常解析向け |
buoyantPimpleFoam | 非定常 | 上記の非定常版 | 過渡的な自然対流解析 |
buoyantBoussinesqSimpleFoam | 定常 | Boussinesq近似(小温度差) | 温度変化が小さい自然対流 |
buoyantBoussinesqPimpleFoam | 非定常 | 上記の時間依存版 | 過渡的自然対流、簡略化モデル |
この中のchtMultiRegion系は流体(液体、気体)・固体の複数領域の熱流体解析を行うために設計されています。
ただ、テキストベースで解析設定しようとすると、めちゃくちゃ大変です。
以下にOpenFOAMが用意しているチュートリアルを解説した記事がありますので、一度読んでみると良いでしょう。
以前にsappyHexMeshでヒートシンクの固体・流体連成の解析を紹介しました。
また、別の方法としてsalomeでメッシュ作成する方法でモデル作成を行い、ヒートシンクの解析の記事もありますのでご参考ください。
領域分割やメッシュ作成はsalomeで行っています。
OpenFOAM v2506(WSL Ubuntu 22.04)
チュートリアルのコピー
20260301_U_thermal/ana001というフォルダが作業フォルダとします。
チュートリアルをコピー
cp -r $FOAM_TUTORIALS/heatTransfer/chtMultiRegionFoam/multiRegionHeater/* .
$FOAM_TUTORIALS = /usr/lib/openfoam/openfoam2506/tutorials
#!/bin/sh
# changeDictionary patch faces
for region in fluid_1 fluid_2
do
changeDictionary -region $region -constant -noFunctionObjects
done
# Agglomerate patch faces
for region in fluid_1 fluid_2
do
faceAgglomerate -region $region -dict constant/viewFactorsDict -noFunctionObjects
done
# Generate view factors
for region in fluid_1 fluid_2
do
viewFactorsGen -region $region -noFunctionObjects
done
メッシュ作成
blockMeshでメッシュ作成を行います。
scale 1;
vertices
(
(0 0 0) //0
(0.1 0 0) //1
(0.11 0 0) //2
(0.21 0 0) //3
(0.22 0 0) //4
(0.22 0.3 0) //5
(0.21 0.3 0) //6
(0.11 0.3 0) //7
(0.1 0.3 0) //8
(0 0.3 0) //9
(0 0 0.01) //10
(0.1 0 0.01) //11
(0.11 0 0.01) //12
(0.21 0 0.01) //13
(0.22 0 0.01) //14
(0.22 0.3 0.01) //15
(0.21 0.3 0.01) //16
(0.11 0.3 0.01) //17
(0.1 0.3 0.01) //18
(0 0.3 0.01) //19
);
blocks
(
hex (0 1 8 9 10 11 18 19) fluid_1 (20 60 1) simpleGrading (1 1 1)
hex (1 2 7 8 11 12 17 18) solid_1 (10 60 1) simpleGrading (1 1 1)
hex (2 3 6 7 12 13 16 17) fluid_2 (20 60 1) simpleGrading (1 1 1)
hex (3 4 5 6 13 14 15 16) solid_2 (10 60 1) simpleGrading (1 1 1)
);
edges
(
);
boundary
(
f1_minX
{
type wall;
faces
(
(0 9 19 10)
);
}
f1_minY
{
type wall;
faces
(
(1 0 10 11)
);
}
s1_minY
{
type wall;
faces
(
(2 1 11 12 )
);
}
f2_minY
{
type wall;
faces
(
(3 2 12 13)
);
}
s2_minY
{
type wall;
faces
(
(4 3 13 14)
);
}
s2_maxY
{
type wall;
faces
(
(6 5 15 16)
);
}
s2_maxX
{
type wall;
faces
(
(4 5 15 14)
);
}
f2_maxY
{
type wall;
faces
(
(7 6 16 17)
);
}
s1_maxY
{
type wall;
faces
(
(8 7 17 18)
);
}
f1_maxY
{
type wall;
faces
(
(9 8 18 19)
);
}
);
mergePatchPairs
(
);
blockMehshDictに以下のように記述することで領域に分けることができます。
hex (0 1 8 9 10 11 18 19) fluid_1 (20 60 1) simpleGrading (1 1 1)
hex (1 2 7 8 11 12 17 18) solid_1 (10 60 1) simpleGrading (1 1 1)
hex (2 3 6 7 12 13 16 17) fluid_2 (20 60 1) simpleGrading (1 1 1)
hex (3 4 5 6 13 14 15 16) solid_2 (10 60 1) simpleGrading (1 1 1)
以下のコマンドでメッシュを作成します。
blockMesh blockMesh -write-vtk #vtkファイルが出力されます
blockMeshによりメッシュは作成されました。
ParaViewで結果を確認します。

#!/bin/sh cp -r constant/heater constant/solid_1 cp -r constant/heater constant/solid_2 cp -r constant/bottomWater constant/fluid_1 cp -r constant/bottomWater constant/fluid_2 cp -r system/heater system/solid_1 cp -r system/heater system/solid_2 cp -r system/bottomWater system/fluid_1 cp -r system/bottomWater system/fluid_2
ここからchtMultiRegionソルバのコツですが、領域ごとにすべての境界条件を設定する必要がありとても面倒ですが、以下の手順を踏めば比較的簡単に済みます。
まず、0フォルダを用意します。
今の場合は0.origをコピーして0フォルダを作成します。
cp -r 0.orig 0
0フォルダは以下のようなファイルが存在しています。
0/ ├── T ├── U ├── epsilon ├── k ├── p └── p_rgh
例えば、Uファイル(それ以外のファイルも)は以下のようにしておきます。
dimensions [0 1 -1 0 0 0 0];
internalField uniform (0.01 0 0);
boundaryField
{
".*"
{
type calculated;
value $internalField;
}
}
そのあとに領域分割を行います。
領域分割するには以下のコマンドで行います。
splitMeshRegions -cellZones -overwrite
これによりフォルダは以下のように作成されます。
0フォルダには境界条件の情報が作成され、constantフォルダにはメッシュ情報(polyMesh)が作成されます。

流体は「流れ+熱」を解き、固体は「熱伝導」を解くため、必要な物理量が異なります。固体領域にもUなどが含まれていますが実際使われていません(そのまま何も設定しなくても大丈夫です)
流体領域:
・速度 U
・温度 T
・圧力 p または p_rgh
・乱流モデルを使う場合は乱流量
- k-epsilon なら k, epsilon
- k-omega なら k, omega
- SpalartAllmaras なら nuTilda
固体領域:
・温度 T
・圧力 p
0/U
dimensions [0 1 -1 0 0 0 0];
internalField uniform (0.01 0 0);
boundaryField
{
f1_minX
{
type calculated;
value uniform (0.01 0 0);
}
f1_minY
{
type calculated;
value uniform (0.01 0 0);
}
f1_maxY
{
type calculated;
value uniform (0.01 0 0);
}
defaultFaces
{
type empty;
}
fluid_1_to_solid_1
{
type calculated;
value uniform (0 0 0);
}
}
共通している面は「fluid_1_to_solid_1」のように「領域1_to_領域2」のように名付けられます。



