こんにちは(@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=qΔTU=\frac{q}{\Delta T}


今回はこの総括熱伝達率(U値)を熱流体解析で求めたいと思います。

本記事の内容
  • マルチリージョン用メッシュからOpenFOAMでの流体解析の手順を紹介
  • 総括熱伝達率(U値)を計算

使用するソルバはchtMultiRegionFoamで熱流体と固体を連成させた非定常解析用のソルバになります。

OpenFOAMv2506のバージョンにおいて現在は、浮力を考慮した熱流体解析ソルバは以下のものがあります。

ソルバ名定常 / 非定常主な特徴主な用途・備考
chtMultiRegionSimpleFoam定常多領域の熱流体連成(非圧縮性)構造物と流体の熱連成、定常問題向け
chtMultiRegionFoam非定常多領域・非圧縮性の時間依存連成解析熱伝導と流体連成の過渡解析
chtMultiRegionTwoPhaseEulerFoam非定常多領域 + 二相流(Euler-Euler) + 熱連成液体/気体の二相流+固体との熱連成に対応
buoyantSimpleFoam定常単領域の自然対流・熱伝導密度差による自然対流、定常解析向け
buoyantPimpleFoam非定常上記の非定常版過渡的な自然対流解析
buoyantBoussinesqSimpleFoam定常Boussinesq近似(小温度差)温度変化が小さい自然対流
buoyantBoussinesqPimpleFoam非定常上記の時間依存版過渡的自然対流、簡略化モデル

この中のchtMultiRegion系は流体(液体、気体)・固体の複数領域の熱流体解析を行うために設計されています。
ただ、テキストベースで解析設定しようとすると、めちゃくちゃ大変です。
以下にOpenFOAMが用意しているチュートリアルを解説した記事がありますので、一度読んでみると良いでしょう。

以前にsappyHexMeshでヒートシンクの固体・流体連成の解析を紹介しました。

【ヒートシンクの熱流体(1)】OpenFOAMの熱流体固体連成のメッシュ作成こんにちは(@t_kun_kamakiri) OpenFOAMの熱流体固体連成によるヒートシンクの熱流体解析の設定方法を解説します。 ...
【ヒートシンクの熱流体(2)】OpenFOAMの熱流体固体連成の計算実行 こんにちは(@t_kun_kamakiri) OpenFOAMの熱流体固体連成によるヒートシンクの熱流体解析の設定方法を解...

また、別の方法としてsalomeでメッシュ作成する方法でモデル作成を行い、ヒートシンクの解析の記事もありますのでご参考ください。
領域分割やメッシュ作成はsalomeで行っています。

【(1)SALOMEでヒートシンクの熱流体固体連成メッシュ作成】chtMultiRegionSimpleFoam用マルチリージョンモデル構築手順 こんにちは(@t_kun_kamakiri) OpenFOAMの熱流体固体連成によるヒートシンクの熱流体解析の設定方法を解説しま...
【(2)SALOMEでヒートシンクの熱流体固体連成メッシュ作成】chtMultiRegionSimpleFoamで計算実行 こんにちは(@t_kun_kamakiri) OpenFOAMの熱流体固体連成によるヒートシンクの熱流体解析の設定方法を解説しま...

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」のように名付けられます。

1 2