こんにちは(@t_kun_kamakiri)
前回の記事では異なるメッシュの境界を結合する方法について解説しましたが、本記事では節点がつながっていない面でのcyclicAMIを使って円筒内の流れを解析したいと思います。
前回の内容は、
- mergeMesh:2つのメッシュ情報を合体する
 - stitchMesh:2つの境界を結合する
 
円筒の場合
異なるメッシュ境界面をcyclicAMI境界条件でつなげて円筒内流れを解析する
「mergeMesh:2つのメッシュ情報を合体する」の状態で仮に以下のように微妙につながっていない(以下の絵)、もしくは異なるメッシュ状態であっても周期境界 (格子の切り方が違う2面をつなぐ Cyclic Arbitrary Mesh Interface (cyclicAMI)タイプ)を課すことで解析することができます。
OpenFOAM-v2212(WSL)
モデルの準備
モデルの準備からします。
まず前回の記事で作成したフォルダの内容を確認しておきます。
| 
					 1 2  | 
						ls mergeMesh001_002  mesh001  mesh002  stitchMesh001_002  | 
					
- mesh001
 - mesh002
 - mergeMesh001_002
mesh001とmesh002を合体させた状態(境界でつながっていない) - stitchMesh001_002
mesh001とmesh002を境界でつなげた状態 
mergeMesh001_002(本記事で扱う)


stitchMesh001_002での状態(本記事では扱わない)


まずはcyclicAMIの条件のフォルダを用意します。
これにはmergeMeshでmesh001とmesh002のメッシュ情報を合体させただけのmergeMesh001_002をコピーします。
| 
					 1  | 
						cp -r mergeMesh001_002 mergeMesh001_002_cyclicAMI  | 
					
mesh001の「outlet_inlet」とmesh002の「outlet_inlet」はよく見るとつながっておりません。mesh002のblockMeshで生成後にz方向へ101mm平行移動させたからです。
mergeMesh001_002

constant/polyMesh/boundaryのメッシュの境界の情報は以下のようになっています。
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  | 
						5 (     sideWall     {         type            wall;         inGroups        1(wall);         nFaces          18000;         startFace       1672875;     }     inlet     {         type            patch;         nFaces          1125;         startFace       1690875;     }     outlet_inlet     {         type            patch;         nFaces          1125;         startFace       1692000;     }     inlet_outlet     {         type            patch;         nFaces          4500;         startFace       1693125;     }     outlet     {         type            patch;         nFaces          4500;         startFace       1697625;     } )  | 
					
これを以下に変える必要があります。
| 
					 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  | 
						5 (     sideWall     {         type            wall;         inGroups        1 ( wall );         nFaces          18000;         startFace       1672875;     }     inlet     {         type            patch;         nFaces          1125;         startFace       1690875;     }     outlet_inlet     {         type            cyclicAMI;         nFaces          1125;         startFace       1692000;         neighbourPatch  inlet_outlet;     }     inlet_outlet     {         type            cyclicAMI;         nFaces          4500;         startFace       1693125;         neighbourPatch  outlet_inlet;     }     outlet     {         type            patch;         nFaces          4500;         startFace       1697625;     } )  | 
					
次に0フォルダの「U, p, k, omega, nuTilda, nut」も以下に変える必要があります。
参考までに「0/U」を載せておきます。
| 
					 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  | 
						boundaryField {     inlet     {         type            fixedValue;         value           uniform ( 0 0 1 );     }     outlet     {         type            zeroGradient;     }     sideWall     {         type            noSlip;     }     inlet_outlet     {         type            cyclicAMI;         neighbourPatch  outlet_inlet;     }     outlet_inlet     {         type            cyclicAMI;         neighbourPatch  inlet_outlet;     } }  | 
					
inlet_outletとoutlet_inletを対応させてneighbourPatchとするのがポイントです。
typeはcyclicAMIとすることで、境界はつながっていないですが対応する2つの面は周期境界となります。
その他「p, k, omega, nuTilda, nut」も同様にinlet_outletとoutlet_inletをcyclicAMIで対応付けします。
ここまでを手動で行っても良いですが、changeDictionaryを使うと便利です。
findコマンドでチュートリアルから適当に探します。
| 
					 1  | 
						find $FOAM_TUTORIALS -name "changeDictionaryDict"  | 
					
以下のように適当にコピーしてきて、
| 
					 1  | 
						cp -r  $FOAM_TUTORIALS/heatTransfer/chtMultiRegionFoam/snappyMultiRegionHeater/system/leftSolid/changeDictionaryDict system/  | 
					
system/changeDictionaryDict
| 
					 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  | 
						boundary {     inlet_outlet     {         type            cyclicAMI;         neighbourPatch  outlet_inlet;     }     outlet_inlet     {         type            cyclicAMI;         neighbourPatch  inlet_outlet;     } } U {     boundaryField     {            inlet_outlet         {             type            cyclicAMI;             neighbourPatch  outlet_inlet;         }         outlet_inlet         {             type            cyclicAMI;             neighbourPatch  inlet_outlet;         }     } } p {     boundaryField     {            inlet_outlet         {             type            cyclicAMI;             neighbourPatch  outlet_inlet;         }         outlet_inlet         {             type            cyclicAMI;             neighbourPatch  inlet_outlet;         }     } } k{     boundaryField     {            inlet_outlet         {             type            cyclicAMI;             neighbourPatch  outlet_inlet;         }         outlet_inlet         {             type            cyclicAMI;             neighbourPatch  inlet_outlet;         }     } } omega {     boundaryField     {            inlet_outlet         {             type            cyclicAMI;             neighbourPatch  outlet_inlet;         }         outlet_inlet         {             type            cyclicAMI;             neighbourPatch  inlet_outlet;         }     } } nuTilda {     boundaryField     {            inlet_outlet         {             type            cyclicAMI;             neighbourPatch  outlet_inlet;         }         outlet_inlet         {             type            cyclicAMI;             neighbourPatch  inlet_outlet;         }     } } nut {     boundaryField     {            inlet_outlet         {             type            cyclicAMI;             neighbourPatch  outlet_inlet;         }         outlet_inlet         {             type            cyclicAMI;             neighbourPatch  inlet_outlet;         }     } }  | 
					
p,k,omega,nuTilda,nutはUと同じ条件の記述です。
もう少し楽な書き方があるかもしれませんが・・・
| 
					 1  | 
						changeDictionary  | 
					
これで「constant/polyMesh/boundary」と「0/U, 0/p, 0/k, 0/omega, 0/nuTilda, 0/nut」の境界条件が変更されます。
円筒内流れの解析
では、メッシュと境界条件ができたので解析を実行します。
今回は↓こちらの記事で書いた層流・乱流の2つの条件で解析をします。


粘性係数でレイノルズ数を変えることで層流状態と乱流状態を作っています。
simpleFoamソルバで解析を実行します。
| 
					 1  | 
						simpleFoam > log.simpleFoam &  | 
					
結果の確認
では、ParaViewで結果を確認してみましょう。
特にz=100mmでmesh001とmesh002をcyclicAMIで周期境界条件にしたのでどうなっているのかが気になります。


z=100(mm),101(mm)との速度分布を見ましたが、収束したころには同じ速度分布になっています。
乱流の場合


z=100(mm),101(mm)との速度分布を見ましたが同じ速度分布になっています。
まとめ
今回はmergeMeshしたあとに異なるメッシュでの境界面「outlet_inlet」と「inlet_outlet」面は周期境界 (格子の切り方が違う2面をつなぐ Cyclic Arbitrary Mesh Interface (cyclicAMI)タイプ)で設定して、円筒内の流れを解析を行いました。
次回、
- cyclicAMIで解析した場合(今回)
 - blockMeshで一体になっている状態の解析
 - mesh001とmesh002をmergeMesh+stitchMeshした場合
 
この3つで解析結果に違いが出るのか確認します。
おすすめ参考図書
☟こちらは、OpenFOAMの日本語書籍として重宝しているわかりやすい参考書だと思います。
☟こちらもOpenFOMの古いバージョンでの和訳になります。さすがにこちらはバージョンに対する日本語でのケアはしていないので、OpenFOAMに慣れている方は購入しても良いかと思います。僕は「日本語でまとまっている内容」なので少し重宝しています。
☟以下に、もっと初心者向けの同人誌を紹介しておきます。
初心者は「ってか、まずどうやってOpenFOAMをインストールするの?」というところからつまずきがちです。
そんな時は、以下の書籍をおすすめします。
改訂新版 OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))
インストール方法とチュートリアルで流体解析を体験・・・ちょっと高度な解析まで解説があります。著者曰くOpenFOAMのバージョンの追跡を行いながら、書籍をアップデートするようなので安心ですね。
											





























