境界条件の設定
Allrun.preを見ると以下のような記述があります。
1 2 3 4 5 6 | # Remove fluid fields from solid regions (important for post-processing) for region in $(foamListRegions solid) do rm -f 0/$region/{nut,alphat,epsilon,k,U,p_rgh} rm -f processor*/0/$region/{nut,alphat,epsilon,k,U,p_rgh} done |
foamListRegionsが「constant/regionProperties」で指定しているリストをします。
1 2 3 4 5 | regions ( fluid (bottomWater topAir) solid (heater leftSolid rightSolid) ); |
foamListRegionsだけだと領域全ての要素をリストにするので、 [bottomWater topAir heater leftSolid rightSolid]というリストになります。
しかし以下のようにregionTypeを指定すると、
1 | foamListRegions [OPTIONS] [regionType ... regionType] |
「foamListRegions solid」とsolidを指定するとsolidだけを要素にするので [heater leftSolid rightSolid]となります。
つまり、上記のdo文は以下のようになります。
1 2 3 4 5 6 | rm -f 0/heater/{nut,alphat,epsilon,k,U,p_rgh} rm -f processor*/0/heater/{nut,alphat,epsilon,k,U,p_rgh} rm -f 0/leftSolid/{nut,alphat,epsilon,k,U,p_rgh} rm -f processor*/0/leftSolid/{nut,alphat,epsilon,k,U,p_rgh} rm -f 0/rightSolid/{nut,alphat,epsilon,k,U,p_rgh} rm -f processor*/0/rightSolid/{nut,alphat,epsilon,k,U,p_rgh} |
既に設定がされていたら設定を消すためものですね。
「rm -f」の「-f」オプションはファイルがあれば削除するというものです。
続いてAllrun.preを見ると以下のようになっています。
1 2 3 4 | for region in $(foamListRegions) do runApplication -s $region changeDictionary -region $region done |
これはsystemフォルダ内で各領域のフォルダ内を用意しその中にchangeDictionaryを用意して境界条件の設定を変更していきます。
system/bottomWater/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 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 | U { internalField uniform (0.001 0 0); boundaryField { minX { type fixedValue; value uniform (0.001 0 0); } maxX { type inletOutlet; inletValue uniform (0 0 0); } ".*" { type fixedValue; value uniform (0 0 0); } } } T { internalField uniform 300; boundaryField { minX { type fixedValue; value uniform 300; } maxX { type inletOutlet; inletValue uniform 300; } ".*" { type zeroGradient; value uniform 300; } "bottomWater_to_.*" { type compressible::turbulentTemperatureRadCoupledMixed; Tnbr T; kappaMethod fluidThermo; value uniform 300; } } } epsilon { internalField uniform 0.01; boundaryField { minX { type fixedValue; value uniform 0.01; } maxX { type inletOutlet; inletValue uniform 0.01; } ".*" { type epsilonWallFunction; value uniform 0.01; } } } k { internalField uniform 0.1; boundaryField { minX { type inletOutlet; inletValue uniform 0.1; } maxX { type zeroGradient; value uniform 0.1; } ".*" { type kqRWallFunction; value uniform 0.1; } } } p_rgh { internalField uniform 0; boundaryField { minX { type zeroGradient; value uniform 0; } maxX { type fixedValue; value uniform 0; } ".*" { type fixedFluxPressure; value uniform 0; } } } p { internalField uniform 0; boundaryField { ".*" { type calculated; value uniform 0; } } } |
上記のスクリプトでchangeDictionaryが実行されると、以下のようにファイルが作成されます。
各領域がどの様に変更されたのかを見ていきます。
0/bottomWater/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 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 | dimensions [ 0 1 -1 0 0 0 0 ]; internalField uniform ( 0.001 0 0 ); boundaryField { minX { // before changeDictionary // type calculated; // value uniform (0.01 0 0); type fixedValue; value uniform ( 0.001 0 0 ); } maxX { type inletOutlet; value uniform ( 0.01 0 0 ); inletValue uniform ( 0 0 0 ); } minY { type fixedValue; value uniform ( 0 0 0 ); } minZ { type fixedValue; value uniform ( 0 0 0 ); } maxZ { type fixedValue; value uniform ( 0 0 0 ); } bottomWater_to_rightSolid { type fixedValue; value uniform ( 0 0 0 ); } bottomWater_to_leftSolid { type fixedValue; value uniform ( 0 0 0 ); } bottomWater_to_heater { type fixedValue; value uniform ( 0 0 0 ); } } |
0/bottomWater/T
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 | internalField uniform 300; boundaryField { minX { // before changeDictionary // type calculated; // value uniform 300; type fixedValue; value uniform 300; } maxX { type inletOutlet; value uniform 300; inletValue uniform 300; } minY { type zeroGradient; value uniform 300; } minZ { type zeroGradient; value uniform 300; } maxZ { type zeroGradient; value uniform 300; } bottomWater_to_rightSolid { type compressible::turbulentTemperatureRadCoupledMixed; value uniform 300; Tnbr T; kappaMethod fluidThermo; } bottomWater_to_leftSolid { type compressible::turbulentTemperatureRadCoupledMixed; value uniform 300; Tnbr T; kappaMethod fluidThermo; } bottomWater_to_heater { type compressible::turbulentTemperatureRadCoupledMixed; value uniform 300; Tnbr T; kappaMethod fluidThermo; } } |
changeDictionaryで“bottomWater_to_.*”としているので、「bottomWater_to_」からはじまる境界は全て同じ設定にしています。
全ての領域をここで記載することはできないので、特殊な設定をしている部分を紹介しておきます。
leftSolidとheaterが接触する部分の温度の設定です。
0/leftSolid/T
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 | dimensions [ 0 0 0 1 0 0 0 ]; internalField uniform 300; boundaryField { minX { type zeroGradient; value uniform 300; } minZ { type zeroGradient; value uniform 300; } maxZ { type zeroGradient; value uniform 300; } leftSolid_to_bottomWater { type compressible::turbulentTemperatureRadCoupledMixed; value uniform 300; Tnbr T; kappaMethod solidThermo; } leftSolid_to_heater { type compressible::turbulentTemperatureRadCoupledMixed; value uniform 300; Tnbr T; kappaMethod solidThermo; thicknessLayers ( 0.001 ); kappaLayers ( 0.0005 ); } leftSolid_to_topAir { type compressible::turbulentTemperatureRadCoupledMixed; value uniform 300; Tnbr T; kappaMethod solidThermo; } } |
デフォルトでは界面での熱流束は単純に領域の熱伝導率で決まります。
しかし、leftSolid_to_heaterの境界面は任意の熱伝導率の層を挟んでいます。
- thicknessLayersで厚みを0.001[m]
- kappaLayersで熱伝導率を0.005[W/m K]
設定のまとめ
要するにchtMultiRegionFoamでは各領域の境界条件もフォルダ分けして行う必要があるということです。
- blockMesh:ベースメッシュの作成
- topoSet:cellZoneの作成
- cp -r 0.orig 0:0.origフォルダをコピー
- splitMeshRegions:topoSetで作成したcellZoneを使って領域分割
- changeDictionary:境界条件の変更
ここまでまとめてきて、これを手作業で行うのは至難の業ですね。
なので、オリジナルの解析を行う際はスクリプトを使うことは必須になります。