こんにちは(@t_kun_kamakiri)
OpenFOAMの熱流体固体連成のチュートリアルの解説を行います。
熱流体と熱伝導による固体の温度変化を解くソルバーを使います。

OpenFOAMv2036
熱流体固体連成のソルバ
今回は使うのは以下のようなソルバーです。
- chtMultiRegionFoam
- chtMultiRegionSimpleFoam
- chtMultiRegionTwoPhaseEulerFoam
chtMultiRegionFoamとchtMultiRegionSimpleFoamの違いはSimpleFoamと付いている方が定常解析用です。
本記事では非定常解析のchtMultiRegionFoamを使います。
チュートリアルをコピーする
チュートリアルをコピーします。
1 | cp -r $FOAM_TUTORIALS/heatTransfer/chtMultiRegionFoam/multiRegionHeater . |
$FOAM_TUTORIALS = /usr/lib/openfoam/openfoam2306/tutorials
chtMultiRegionFoamのフォルダ構成は特殊で各領域ごとに設定を用意する必要があります。

Allrunスクリプトを確認する
チュートリアルにはAllrunスクリプトが用意されているので、スクリプトの内容を確認すると必要な手順というのがわかります。

Allrun
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #!/bin/sh cd "${0%/*}" || exit # Run from this directory . ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions #------------------------------------------------------------------------------ runApplication ./Allrun.pre #-- Run on single processor #runApplication $(getApplication) # Decompose runApplication decomposePar -allRegions # Run runParallel $(getApplication) # Reconstruct runApplication reconstructPar -allRegions #------------------------------------------------------------------------------ |
Allrunファイルは全体のスクリプトなので、以下のコマンドをターミナルに打ち計算を実行します。
1 | ./Allrun |
これでメッシュ作成➡解析設定➡ソルバ実行まで行ってくれます。
Allrun.preの確認
AllrunスクリプトははじめにAlrun.preを実行しているため、Alrun.preからまずは確認することになります。
Allrun.pre
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 | #!/bin/sh cd "${0%/*}" || exit # Run from this directory . ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions #------------------------------------------------------------------------------ runApplication blockMesh runApplication topoSet # Restore initial fields restore0Dir runApplication splitMeshRegions -cellZones -overwrite # 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 for region in $(foamListRegions) do runApplication -s $region changeDictionary -region $region done echo echo "End" #------------------------------------------------------------------------------ |
解析の設定を理解するために、設定ファイルをはじめの状態に戻しておきます。
1 | ./Allclean |
これで初期化されます。
初期設定のフォルダ構成
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 | $ tree . ├── 0.orig │ ├── T │ ├── U │ ├── epsilon │ ├── k │ ├── p │ └── p_rgh ├── Allclean ├── Allrun ├── Allrun.pre ├── README.md ├── constant │ ├── bottomWater │ │ ├── radiationProperties │ │ ├── thermophysicalProperties │ │ └── turbulenceProperties │ ├── g │ ├── heater │ │ ├── radiationProperties │ │ └── thermophysicalProperties │ ├── leftSolid │ │ ├── radiationProperties -> ../heater/radiationProperties │ │ └── thermophysicalProperties -> ../heater/thermophysicalProperties │ ├── regionProperties │ ├── rightSolid │ │ ├── radiationProperties -> ../heater/radiationProperties │ │ └── thermophysicalProperties -> ../heater/thermophysicalProperties │ └── topAir │ ├── radiationProperties -> ../bottomWater/radiationProperties │ ├── thermophysicalProperties │ └── turbulenceProperties -> ../bottomWater/turbulenceProperties └── system ├── README ├── blockMeshDict ├── bottomWater │ ├── changeDictionaryDict │ ├── decomposeParDict -> ../decomposeParDict │ ├── fvSchemes │ └── fvSolution ├── controlDict ├── decomposeParDict ├── fvSchemes ├── fvSolution ├── heater │ ├── changeDictionaryDict │ ├── decomposeParDict -> ../decomposeParDict │ ├── fvSchemes │ └── fvSolution ├── leftSolid │ ├── changeDictionaryDict │ ├── decomposeParDict -> ../decomposeParDict │ ├── fvSchemes -> ../heater/fvSchemes │ └── fvSolution ├── rightSolid │ ├── changeDictionaryDict │ ├── decomposeParDict -> ../decomposeParDict │ ├── fvSchemes -> ../heater/fvSchemes │ └── fvSolution ├── topAir │ ├── changeDictionaryDict │ ├── decomposeParDict -> ../decomposeParDict │ ├── fvSchemes -> ../bottomWater/fvSchemes │ └── fvSolution ├── topoSetDict └── vtkWrite |
blockMeshでメッシュ作成
blockMeshを実行します。
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 | scale 1; vertices ( (-0.1 -0.04 -0.05) ( 0.1 -0.04 -0.05) ( 0.1 0.04 -0.05) (-0.1 0.04 -0.05) (-0.1 -0.04 0.05) ( 0.1 -0.04 0.05) ( 0.1 0.04 0.05) (-0.1 0.04 0.05) ); blocks ( hex (0 1 2 3 4 5 6 7) (30 10 10) simpleGrading (1 1 1) ); edges ( ); boundary ( maxY { type wall; faces ( (3 7 6 2) ); } minX { type patch; faces ( (0 4 7 3) ); } maxX { type patch; faces ( (2 6 5 1) ); } minY { type wall; faces ( (1 5 4 0) ); } minZ { type wall; faces ( (0 3 2 1) ); } maxZ { type wall; faces ( (4 5 6 7) ); } ); mergePatchPairs ( ); |
以下のコマンドでベースメッシュを作成します。
1 | blockMesh |
cellZoneを作成する
次にtopoSetでcellZoneを作成して、作成したcellZoneを元にsplitMultiRegionで領域分割を行います。
ここではtopoSetのみを行い、後ほどsplitMultiRegionで領域分割を行います。
system/topoSetDict
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 | actions ( // Heater { name heaterCellSet; type cellSet; action new; source boxToCell; box (-0.01001 0 -100) (0.01001 0.00999 100); } { name heaterCellSet; type cellSet; action add; source boxToCell; box (-0.01001 -100 -0.01001) (0.01001 0.00999 0.01001); } { name heater; type cellZoneSet; action new; source setToCellZone; set heaterCellSet; } // leftSolid { name leftSolidCellSet; type cellSet; action new; source boxToCell; box (-100 0 -100) (-0.01001 0.00999 100); } { name leftSolid; type cellZoneSet; action new; source setToCellZone; set leftSolidCellSet; } // rightSolid { name rightSolidCellSet; type cellSet; action new; source boxToCell; box (0.01001 0 -100) (100 0.00999 100); } { name rightSolid; type cellZoneSet; action new; source setToCellZone; set rightSolidCellSet; } // topAir { name topAirCellSet; type cellSet; action new; source boxToCell; box (-100 0.00999 -100) (100 100 100); } { name topAir; type cellZoneSet; action new; source setToCellZone; set topAirCellSet; } // bottomWater is all the other cells { name bottomWaterCellSet; type cellSet; action new; source cellToCell; set heaterCellSet; } { name bottomWaterCellSet; type cellSet; action add; source cellToCell; set leftSolidCellSet; } { name bottomWaterCellSet; type cellSet; action add; source cellToCell; set rightSolidCellSet; } { name bottomWaterCellSet; type cellSet; action add; source cellToCell; set topAirCellSet; } { name bottomWaterCellSet; type cellSet; action invert; } { name bottomWater; type cellZoneSet; action new; source setToCellZone; set bottomWaterCellSet; } ); |
以下のコマンドでcellZoneを作成します。
1 | topoSet |
例えばHeater部分のみ見ていくと、
- 黄色の丸の座標値を対角線にした直方体でcellSetを新規で作成
- 緑色の丸の座標値を対角線にした直方体でcellSetを追加
- 上記で作成したcellSetをcellZoneとして作成します。
これをParaViewで確認することができます。

0.origのコピー
次に0.origを0フォルダとしてコピーします。
1 | cp -r 0.orig 0 |
Allrun.preスクリプト内では以下の記述で同様のことができます。
1 | restore0Dir |
Allrun.preの冒頭に「${WM_PROJECT_DIR:?}/bin/tools/RunFunctions」という記述があるので、また別のスクリプトを使用していることがわかります。
このスクリプトの中に「restore0Dir」関数があります。
気になる方は、vimなどで調べてみてください。
1 | vi ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions |
領域に分割
この状態だとまだ領域を分割できていないので、splitMeshRegionsコマンドを使ってcellZoneで分割を行います。
複数回計算させながら分割を行うのですが、分割した最終状態だけがほしいのでoverwriteをオプションで付けておきます。
1 | splitMeshRegions -cellZones -overwrite |
これにより物理量を設定する0フォルダも領域ごとに設定が分かれれます。

メッシュ情報として「constant/bottomWater/polyMesh/boundary」は境界条件のtypeにも関わるので確認しておきます。
constant/bottomWater/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 63 64 65 66 | 8 ( minX { type patch; nFaces 50; startFace 3858; } maxX { type patch; nFaces 50; startFace 3908; } minY { type wall; inGroups 1(wall); nFaces 292; startFace 3958; } minZ { type wall; inGroups 1(wall); nFaces 150; startFace 4250; } maxZ { type wall; inGroups 1(wall); nFaces 150; startFace 4400; } bottomWater_to_rightSolid { type mappedWall; inGroups 1(wall); nFaces 130; startFace 4550; sampleMode nearestPatchFace; sampleRegion rightSolid; samplePatch rightSolid_to_bottomWater; } bottomWater_to_leftSolid { type mappedWall; inGroups 1(wall); nFaces 130; startFace 4680; sampleMode nearestPatchFace; sampleRegion leftSolid; samplePatch leftSolid_to_bottomWater; } bottomWater_to_heater { type mappedWall; inGroups 1(wall); nFaces 92; startFace 4810; sampleMode nearestPatchFace; sampleRegion heater; samplePatch heater_to_bottomWater; } ) |
以下のような構造になっています。
1 2 3 4 5 6 7 8 9 10 | regionA_to_regionB { type mappedWall; inGroups 1(wall); nFaces 130; startFace 4550; sampleMode nearestPatchFace; sampleRegion regionA; samplePatch regionB_to_regionA; } |
typeはmappedWallとしておく必要があります。
splitMeshRegionsの実行は必ず0.origをコピーして0フォルダを作成した後にしてください。
境界条件の設定
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; } } |
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:境界条件の変更
ここまでまとめてきて、これを手作業で行うのは至難の業ですね。
なので、オリジナルの解析を行う際はスクリプトを使うことは必須になります。
計算実行
設定の確認ができたので計算を実行します。
system/controlDictは以下のようになっています。
system/controlDict
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 | application chtMultiRegionFoam; startFrom latestTime; startTime 0.001; stopAt endTime; endTime 100; deltaT 0.001; writeControl adjustable; writeInterval 10; purgeWrite 0; writeFormat ascii; writePrecision 8; writeCompression off; timeFormat general; timePrecision 6; runTimeModifiable yes; maxCo 0.6; // Maximum diffusion number maxDi 10.0; adjustTimeStep yes; functions { #include "vtkWrite" } |
function Objectsで「#include “vtkWrite”」として、「system/vtkWrite」ファイルを読み込んでいます。各領域のvtkファイルを作成してくれているのでParaViewで結果を確認するときは便利です。
system/vtkWrite
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 | vtkWrite { type vtkWrite; libs (utilityFunctionObjects); log true; writeControl writeTime; writeInterval 1; regions (".*"); internal true; boundary true; single false; interpolate true; // Fields to output (words or regex) fields (".*"); //- Output format (ascii | binary) - Default=binary // format binary; //- Use legacy output format - Default=false // legacy false; //- Output directory name - Default="postProcessing/<name>" // directory "VTK"; //- Write cell ids as field - Default=true writeIds false; } // Solid walls only walls { type vtkWrite; libs (utilityFunctionObjects); log true; writeControl writeTime; writeInterval 1; internal false; // single true; regions ( heater "(?i).*solid" ); patches ( "(?i).*solid_to.*" "heater.*(Air|Water)" ); fields (T); } |
では、計算実行します。
1 | chtMultiRegionFoam |
結果の確認
ParaViewでpostProcessingに保存されたvtkファイルを読み込みます。
leftSolidとheaterの境界は熱伝導率を持つ厚みを設けたので熱が伝わりにくくなっているのが確認できます。

まとめ
OpenFOAMのchtmultiRegionFoamのチュートリアルの解説を行いました。
手順は以下です。
- blockMesh:ベースメッシュの作成
- topoSet:cellZoneの作成
- cp -r 0.orig 0:0.origフォルダをコピー
- splitMeshRegions:topoSetで作成したcellZoneを使って領域分割
- changeDictionary:境界条件の変更
- chtMultiRegionFoam:計算実行
今回紹介したチュートリアルでは領域分割はtopoSetとsplitMeshRegionsを使っていますが、複雑な形状になると対応できなくなるでしょう。
これをsnappyHexMeshで行っているのが以下のチュートリアルです。
1 | $FOAM_TUTORIALS/heatTransfer/chtMultiRegionFoam/snappyMultiRegionHeater |
こちらも合わせて見ておくといいですね。
chtMultiRegionFoamの勉強のきっかけ
当ブログに低温調理でのお肉の温度変化を対流なども考慮した解析をできないかという問い合わせが来ました。
- 複数の物質との熱伝導
- 強制対流や自然対流も考慮した熱解析
- 脂肪の融解熱
など考慮したいことが多いようです。
あまり色々と考えたあげく以下のように提案をしてみました。

- 方法1
熱流体は個別でOpenFOAMなりで計算して熱流束や熱伝達率を算出する
その熱流束や熱伝達率を固体表面に与えて熱解析を行う - 方法2
本記事で紹介したように流体・固体熱連成を行う
というわけで、方法2を試すことにしました。
どれほどchtMultiRegionFoamソルバが使えるのかを試してみたくなったというわけです。
※追記:適当な条件で試しました。
適当にモデルを作ってやってみました。
物性は良くわからないですが調べて適当に設定しています。
constant/solid/thermophysicalProperties
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 | thermoType { type heSolidThermo; mixture pureMixture; transport constIso; thermo hConst; equationOfState rhoConst; specie specie; energy sensibleEnthalpy; } /* 脂肪層の熱特性 熱伝導率は水の1/3の0.194[W/m・K] 比熱容量は水の1/2の2.09[kJ/kg・K] 比重は0.92g/ml */ mixture { specie { molWeight 6000;//g/mol } transport { kappa 0.194;// W/m K } thermodynamics { Hf 0; Cp 2.09E3; //J/kg K } equationOfState { rho 920;//kg/m3 } } |
おすすめ参考図書
☟こちらは、OpenFOAMの日本語書籍が無い中唯一わかりやすい参考書だと思います。
☟こちらもOpenFOMの古いバージョンでの和訳になります。さすがにこちらはバージョンに対する日本語でのケアはしていないので、OpenFOAMに慣れている方は購入しても良いかと思います。僕は「日本語でまとまっている内容」なので少し重宝しています。
☟以下に、もっと初心者向けの同人誌を紹介しておきます。
初心者は「ってか、まずどうやってOpenFOAMをインストールするの?」というところからつまずきがちです。
そんな時は、以下の書籍をおすすめします。
改訂新版 OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))
インストール方法とチュートリアルで流体解析を体験・・・ちょっと高度な解析まで解説があります。著者曰くOpenFOAMのバージョンの追跡を行いながら、書籍をアップデートするようなので安心ですね。