こんにちは(@t_kun_kamakiri)
OpenFOAMの熱流体固体連成を使った熱交換器の軸対称モデルの解析を行います。
結論から言うと軸対称モデルは解析が失敗しましたm(__)m
なので、2次元の解析モデルで最後の結果を載せていますが、軸対称モデルでやってみたが失敗したという過程を本記事で記しておきます。
熱流体と熱伝導による固体の温度変化を解くソルバーを使います。
以下のサイトに熱流体固体連成以外の多くの例題が載っており、解析と理論解との妥当性検証を行う上ではとても参考になります。
ちなみにこちらは書籍にもまとまっていますので、是非手に取って眺めてみてください。
本書はFluentを使った解析事例ですが、これをOpenFOAMでもやってみたいと思います。
「二重管式熱交換器(向流,並流) <etp2_26> (軸対称,エネルギー,伝熱境界)」という例題の雛型モデルを作成します。
軸対称モデル(失敗?)
軸対称モデルをうまくいきませんでした。
本記事は軸対称での解析設定の解説をしています。
またうまくいったら更新しようと思いますm(__)m
OpenFOAM v2312(WSL2)
熱流体固体連成のソルバ
今回は使うのは以下のようなソルバーです。
- chtMultiRegionFoam
- chtMultiRegionSimpleFoam
- chtMultiRegionTwoPhaseEulerFoam
chtMultiRegionFoamとchtMultiRegionSimpleFoamの違いはSimpleFoamと付いている方が定常解析用です。
本記事では非定常解析のchtMultiRegionSimpleFoamを使います。
以前にもチュートリアルの解説記事を書きました。
chtMultiRegion系のソルバはフォルダ構成が比較的ややこしい(面倒)ので、取っ掛かりとしてはチュートリアルを理解するところからが良いでしょう。
チュートリアルのコピー
適当なチュートリアルをコピーします。
1 |
cp -r $FOAM_TUTORIALS/heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeaterRadiation 001_2DheatExchanger |
※「$FOAM_TUTORIALS」は環境変数でお使いのバージョンやインストール先によって変わります。
こちらの環境では以下のようになっていますのでご自身で確か見てみてください。
1 2 |
echo $FOAM_TUTORIALS /usr/lib/openfoam/openfoam2312/tutorials #出力結果 |
チュートリアルを確認するとchtMultiRegionFoamのフォルダ構成は特殊で各領域ごとに設定を用意する必要があります。
まずはチュートリアルをそのまま実行してフォルダ構成や設定項目を確認するのが良いでしょう。
2次元熱交換器のフォルダ構成
今回行いたい解析についてフォルダ構成をまとめました。
では、フォルダを移動してメッシュ作成から行います。
1 |
cd 001_2DheatExchanger/ |
今回作成する領域名に名前に合うようにコピーしておきます。
1 2 3 4 5 6 |
cp -r constant/heater constant/solid cp -r constant/bottomAir constant/hotwater cp -r constant/bottomAir constant/coldwater cp -r system/heater system/solid cp -r system/bottomAir system/hotwater cp -r system/bottomAir system/coldwater |
メッシュ作成
メッシュ作成はblockMeshのみで行います。
blockMeshの中で3つの領域に分けます。
- hotwater
- coldwater
- solid
以上の3つの領域のcellZoneを設けるためにblockMeshで以下のように設定します。
肝になるのは以下の部分です。
1 2 3 4 5 6 |
blocks ( hex ( 0 1 2 3 4 5 6 7) hotwater (1 500 16) simpleGrading (1 1 1) hex ( 4 5 6 7 8 9 10 11) solid (1 500 4) simpleGrading (1 1 1) hex ( 8 9 10 11 12 13 14 15) coldwater (1 500 8) simpleGrading (1 1 1) ); |
この状態でblockMeshを実行します。
1 |
blockMesh |
この状態では以下のようにcellZoneとして分かれますが、メッシュ情報は「constant/polyMesh」にまとめられています。
「Read Zone」のチェックを入れる「MultiBlock Inspector(出てない人はViewタブでチェックを入れる)」で確認できます。
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 |
/*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: v2312 | | \\ / A nd | Website: www.openfoam.com | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; object blockMeshDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // scale 0.001; xMax 1000; zMax 1; t1 4; t2 1; t3 2; // 厚み y1 #eval{ $t1 }; y2 #eval{ $t1 + $t2}; y3 #eval{ $t1 + $t2 + $t3}; Nx 20; Ny 20; Nz 20; vertices ( ( 0 0 0 ) //0 ( 0 0 $zMax ) //1 ( $xMax 0 $zMax ) //2 ( $xMax 0 0 ) //3 ( 0 $y1 0 ) //5 ( 0 $y1 $zMax ) //6 ( $xMax $y1 $zMax ) //7 ( $xMax $y1 0 ) //8 ( 0 $y2 0 ) //9 ( 0 $y2 $zMax ) //10 ( $xMax $y2 $zMax ) //11 ( $xMax $y2 0 ) //12 ( 0 $y3 0 ) //13 ( 0 $y3 $zMax ) //14 ( $xMax $y3 $zMax ) //15 ( $xMax $y3 0 ) //16 ); blocks ( hex ( 0 1 2 3 4 5 6 7) hotwater (1 500 16) simpleGrading (1 1 1) hex ( 4 5 6 7 8 9 10 11) solid (1 500 4) simpleGrading (1 1 1) hex ( 8 9 10 11 12 13 14 15) coldwater (1 500 8) simpleGrading (1 1 1) ); edges ( ); boundary ( hotwaterXmin { type patch; faces ( (0 4 5 1) ); } hotwaterXmax { type patch; faces ( (2 3 7 6) ); } solidXmin { type wall; faces ( (4 8 9 5) ); } solidXmax { type wall; faces ( (7 11 10 6) ); } coldwaterXmin { type patch; faces ( (8 12 13 9) ); } coldwaterXmax { type patch; faces ( (11 15 14 10) ); } hotwaterYmin { type wall; faces ( (0 1 2 3) ); } coldwaterYmax { type wall; faces ( (12 15 14 13) ); } // empty Zmax { type empty; faces ( (1 5 6 2) (5 9 10 6) (9 13 14 10) ); } Zmin { type empty; faces ( (0 4 7 3) (4 8 11 7) (8 12 15 11) ); } ); mergePatchPairs ( ); // ************************************************************************* // |
軸対称のモデルに変更
こちらの軸対称モデルの作成方法を利用します。
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 |
/*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: v2312 | | \\ / A nd | Website: www.openfoam.com | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; object extrudeMeshDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // What to extrude: // patch : from patch of another case ('sourceCase') // mesh : as above but with original case included // surface : from externally read surface constructFrom patch; sourceCase "."; sourcePatches (Zmin); // If construct from patch: patch to use for back (can be same as sourcePatch) exposedPatchName Zmax; // Flip surface normals before usage. Valid only for extrude from surface or // patch. flipNormals false; //- Wedge extrusion of a single layer // with wedge patches on front and back extrudeModel wedge; sectorCoeffs { axisPt (0 0 0); axis (1 0 0); angle 5; // wedge assumes axial symmetry of angle/2 on each side } // Do front and back need to be merged? Usually only makes sense for 360 // degree wedges. mergeFaces false; //true; // Merge small edges. Fraction of bounding box. mergeTol 1e-6; // ************************************************************************* // |
blockMeshで作成した面「Zmax」と「Zmin」の面をくっつけたことによって「bottom」がなくなっています。
constant/polyMesh/boundary
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
10 ( hotwaterXmin { type patch; nFaces 16; startFace 27472; } (省略) hotwaterYmin { type wall; inGroups 1(wall); nFaces 0; startFace 27528; } (省略) ) |
1 |
cp -r $FOAM_TUTORIALS/multiphase/potentialFreeSurfaceDyMFoam/oscillatingBox/system/createPatchDict system/ |
「system/createPatchDict」を編集します。
編集と言ってもいらない面を消すだけなので特に設定するものはありません。
system/createPatchDict
1 2 3 4 5 6 |
pointSync false; // Patches to create. patches ( ); |
実行します。
1 |
createPatch -overwrite |
こちらを実行すると大量のwarningが出ますが警告文なので無視してもよいです。
気になる方はこちら(リンク)に対処法を書いているのでご参考ください。
これにより面の数が9つになったことでしょう。
constant/polyMesh/boundary
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 |
9 ( hotwaterXmin { type patch; nFaces 16; startFace 27472; } hotwaterXmax { type patch; nFaces 16; startFace 27488; } solidXmin { type wall; inGroups 1(wall); nFaces 4; startFace 27504; } solidXmax { type wall; inGroups 1(wall); nFaces 4; startFace 27508; } coldwaterXmin { type patch; nFaces 8; startFace 27512; } coldwaterXmax { type patch; nFaces 8; startFace 27520; } coldwaterYmax { type wall; inGroups 1(wall); nFaces 500; startFace 27528; } Zmax { type wedge; inGroups 1(wedge); nFaces 14000; startFace 28028; } Zmin { type wedge; inGroups 1(wedge); nFaces 14000; startFace 42028; } ) |
cellZoneから領域を分割
blockMeshで作成したメッシュは領域に分割されていないので以下のコマンドで領域を分割します。
1 |
splitMeshRegions -cellZones -overwrite |
これにより領域ごとにメッシュ情報が分かれました。
フォルダ構成は以下となります。
ポイントは共有している面で以下のようにtypeがmappedWallになっているという点でです。
1例を示すとconstant/hotwater/polyMesh/boundaryは以下のようになっています。
constant/hotwater/polyMesh/boundary
1 2 3 4 5 6 7 8 9 10 |
hotwater_to_solid { type mappedWall; inGroups 1(wall); nFaces 500; startFace 31516; sampleMode nearestPatchFace; sampleRegion solid; samplePatch solid_to_hotwater; } |
その他の共有している面も以下のようになっています。
「A_to_B」のようになっているという点を意識しておきます。