こんにちは(@t_kun_kamakiri)
本記事では異なるメッシュの境界を結合する方法について解説します。
メッシュの結合には、OpenFOAMで用意されている以下のユーティリティを使います。
- mergeMesh:2つのメッシュ情報を合体する
- stitchMesh:2つの境界を結合する
直方体形状はblockMeshDictを載せましたのでそちらをご参考ください。
前回の記事では円筒形状でも同じことをしてみました。結果はうまくいかない部分があったのですが、今回の直方体だとどうでしょうか。
OpenFOAM-v2212(WSL)
直方体の形状ならどうなるか(結合できるか)
円筒形状だとstitchで結合できないサーフェスができましたが、以下のような直方体ならどうでしょうか。
mesh001
まず1つ目の20×20×100の直方体を用意します。
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 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 |
scale 0.001; // Divisions in x/y/z directions. Can be unequal. nx 15; ny 15; nz 100; xyMin -10; xyMax 10; Zmin 0.0; Zmax 100; geometry { } vertices ( ($xyMin $xyMin $Zmin) //0 ($xyMax $xyMin $Zmin) //1 ($xyMax $xyMax $Zmin) //2 ($xyMin $xyMax $Zmin) //3 ($xyMin $xyMin $Zmax) //4 ($xyMax $xyMin $Zmax) //5 ($xyMax $xyMax $Zmax) //6 ($xyMin $xyMax $Zmax) //7 ); blocks ( hex (0 1 2 3 4 5 6 7) ($nx $ny $nz) grading (1 1 1) //center(block0) ); edges ( ); faces ( ); boundary ( sideWall { type wall; faces ( (0 4 7 3) (1 2 6 5) (0 1 5 4) (2 3 7 6) ); } inlet { type patch; faces ( (0 3 2 1) ); } outlet_inlet { type patch; faces ( (4 5 6 7) ); } ); |
blockMesh実行します。
1 |
blockMesh |
mesh002
同じく2つ目の20×20×100の直方体を用意します。
ただしx-y方向のメッシュ数はmesh001のよりx-y各方向で2倍にしています。
また、メッシュ生成後にz方向に100mm平行移動します。
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 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 |
scale 0.001; // Divisions in x/y/z directions. Can be unequal. nx 30; ny 30; nz 100; xyMin -10; xyMax 10; Zmin 0.0; Zmax 100; geometry { } vertices ( ($xyMin $xyMin $Zmin) //0 ($xyMax $xyMin $Zmin) //1 ($xyMax $xyMax $Zmin) //2 ($xyMin $xyMax $Zmin) //3 ($xyMin $xyMin $Zmax) //4 ($xyMax $xyMin $Zmax) //5 ($xyMax $xyMax $Zmax) //6 ($xyMin $xyMax $Zmax) //7 ); blocks ( hex (0 1 2 3 4 5 6 7) ($nx $ny $nz) grading (1 1 1) //center(block0) ); edges ( ); faces ( ); boundary ( sideWall { type wall; faces ( (0 4 7 3) (1 2 6 5) (0 1 5 4) (2 3 7 6) ); } inlet_outlet { type patch; faces ( (0 3 2 1) ); } outlet { type patch; faces ( (4 5 6 7) ); } ); |
blockMesh実行後に100mm平行移動するのを忘れずに。
1 2 |
blockMesh transformPoints -translate '(0 0 0.1) |
mergeMesh(mesh001とmesh002を合体)
mesh001をコピーしてmesh001のメッシュとmesh002のメッシュを合体します。
1 2 |
cp -r mesh001 mergeMesh001_002 mergeMeshes -overwrite mergeMesh001_002 mesh002 |
メッシュ情報がひとつになっただけで境界は合体していません。
stitchMesh(境界を結合)
mesh001とmesh002を合体させたmergeMesh001_002をstitchMesh001_002にコピーしてoutlet_inlet面とoutlet_inlet面を結合します。
1 2 3 |
cp -r mergeMesh001_002 stitchMesh001_002 cd stitchMesh001_002 stitchMesh -overwrite outlet_inlet inlet_outlet |
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 |
5 ( sideWall { type wall; inGroups 1(wall); nFaces 18000; startFace 328275; } inlet { type patch; nFaces 225; startFace 346275; } outlet_inlet { type patch; nFaces 0; startFace 346500; } inlet_outlet { type patch; nFaces 0; startFace 346500; } outlet { type patch; nFaces 900; startFace 346500; } ) |
inlet_outlet面とoutlet_inlet面は結合したので面の数が0になっています。
どうやら直方体の場合はうまく面倒が結合しているみたいです。
まとめ
前回、円筒の場合だと上手く両方の面が消えてくれず残ってしまいましたが、直方体の場合は上手く境界の両方の面が消えて結合されました。
円筒の場合のような残った面は側面の面に変わっているようなので、壁条件として解析すれば円筒内流れとしては問題ないのではないかと思います。
気になるようでしたらmergeMeshしたあとに「outlet_inlet」と「inlet_outlet」面は周期境界 (格子の切り方が違う2面をつなぐ Cyclic Arbitrary Mesh Interface (cyclicAMI)タイプ)で設定した方が良いかもしれません。
次回、今回結合させたメッシュで円筒内の流れを解析してみます。
stitchMeshでつながない場合と違いが出るのか確かめます。
おすすめ参考図書
☟こちらは、OpenFOAMの日本語書籍として重宝しているわかりやすい参考書だと思います。
☟こちらもOpenFOMの古いバージョンでの和訳になります。さすがにこちらはバージョンに対する日本語でのケアはしていないので、OpenFOAMに慣れている方は購入しても良いかと思います。僕は「日本語でまとまっている内容」なので少し重宝しています。
☟以下に、もっと初心者向けの同人誌を紹介しておきます。
初心者は「ってか、まずどうやってOpenFOAMをインストールするの?」というところからつまずきがちです。
そんな時は、以下の書籍をおすすめします。
改訂新版 OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))
インストール方法とチュートリアルで流体解析を体験・・・ちょっと高度な解析まで解説があります。著者曰くOpenFOAMのバージョンの追跡を行いながら、書籍をアップデートするようなので安心ですね。