こんにちは(@t_kun_kamakiri)
本記事ではOpenFOAMを用いた熱流体解析の設定手順について解説を行います。
具体的には自然対流下でのマネキン周りの熱量を計算し、対流熱伝達と熱ふく射における影響度を調べることを目的とします。
今回は、前回の記事で作成した乱流モデル($k$-$\omega$SST)に加えて、熱ふく射を考慮した計算を行います。
マネキン周りの熱流体解析(乱流モデル$k$-$\omega$SST、ふく射fvDOMモデル)
マネキンの熱流束の分布と流速ベクトルを示しています。
定常解析なのでStepによる変化は時刻歴変化ではなく、計算が収束向かう過程をしています。
本記事では前回の記事で作成したモデルをベースにして以下の結果を出力します。
- 熱伝達率
- 熱流束
- OpenFOAMを用いて流体解析を勉強している人
- 熱伝達率と熱流束の出力をしたい人
- OpenFOAMで熱流体解析(ふく射込み)を試したい人
本記事では出てきた結果に対する妥当性の検証は行わず、とりあえず計算できるひな形のモデルを作成することを目的としています。
- メッシュはそこまでこだわらない(前回のまま)
- 乱流モデルk-ωSST乱流モデル
- ふく射モデル無し
とします。
OpenFOAM v2412(WSL Ubuntu 22.04)
フォルダ構成の確認
フォルダ構成は以下のようにしています。
1 2 3 4 5 6 7 8 9 |
kamakiri$ tree -L 1 . ├── cfMesh ├── model ├── run_shm-d1_NoRad_base ├── run_shm-d1_NoRad_komegaSST_base 👈今回使用する解析フォルダ ├── run_shm_NoRad_base ├── shm └── shm-d1 |
解析用フォルダを作成します。
1 2 |
cp -r run_shm-d1_NoRad_komegaSST_base run_shm-d1_Rad_komegaSST_base rm -r postProcessing processor* #計算過程が残っていたらこちらのコマンドで削除 |
ふく射の設定用のファイルを使用させます。
1 |
mv 0/old/{IDefault,G} 0/ |
- 物性値
- 乱流モデル($k$-$\omega$SST)
- ふく射モデル👈こちらを設定
- 境界条件
- 離散化スキーム
- 代数ソルバ
これらは前回の記事で設定しているものを使うため、ここでは解説をしません。
ふく射モデルの設定
ふく射モデルはfvDOMモデルを使用します。
使用しているチュートリアルはfvDOMモデルradiationModel fvDOM;
ですので、そのままの設定で良いでしょう。
ふく射モデルは以下のように6タイプあります。
1 2 |
Valid radiationModel types : 6(P1 fvDOM none opaqueSolid solarLoad viewFactor) |
後ほど詳しく解説しています。
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 |
radiation on; radiationModel fvDOM; fvDOMCoeffs { nPhi 3; nTheta 5; tolerance 1e-3; maxIter 10; } // Number of flow iterations per radiation iteration solverFreq 10; absorptionEmissionModel constantAbsorptionEmission; constantAbsorptionEmissionCoeffs { absorptivity absorptivity [ m^-1 ] 0.5; emissivity emissivity [ m^-1 ] 0.5; E E [ kg m^-1 s^-3 ] 0; } scatterModel none; sootModel none; |
放射率、吸収率、透過率などはconstant/boundaryRadiationProperties
で設定します。
emissivity 1.0;
が特に重要でこの値はどれだけ黒体ふく射に近いかを表すもので、単純に放射強度に影響するため、数値が1に近いほどふく射の影響が考慮されます。
1 2 3 4 5 6 7 |
".*" { type lookup; emissivity 1.0; absorptivity 1.0; transmissivity 0.0; } |
境界条件
境界条件で使用するファイルは0/U, 0/T, 0/p_rgh, 0/p, 0/k, 0/omega, 0/nut, 0/alphat
に加えて0/IDefault
が加わります。
p_rghは静圧から流体質量による圧力分を差し引いた量$p_{rgh}=p-rgh$なので、0/p
は0/p_rgh
から計算され設定にします。
まずは流速の設定
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 |
dimensions [0 1 -1 0 0 0 0]; internalField uniform (0.0 0.0 -0.27); boundaryField { ".*" { type noSlip; } XMin { type noSlip; } XMax { type noSlip; } YMin { type noSlip; } YMax { type noSlip; } ZMin { type zeroGradient; } ZMax { type fixedValue; value uniform (0 0 -0.27); } } |
計算実行
4並列で計算を実行します。
1 2 |
decomposePar mpirun -np 4 buoyantSimpleFoam -parallel > log.buoyantSimpleFoam & |
計算実行し、ログを確認すると、ふく射無しのときにはなかった放射強度を計算する過程が生じています。
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 |
Selecting sootModel none fvDOM : Allocated 60 rays with average orientation: I0 : dAve : (0.010235 0.0381976 0.0904495) : omega : 0.0999985 : d : (0.0799795 0.298487 0.951057) I1 : dAve : (0.0279626 0.0279626 0.0904495) : omega : 0.0999985 : d : (0.218508 0.218508 0.951057) (省略) I56 : dAve : (-0.0381976 -0.010235 -0.0904495) : omega : 0.0999985 : d : (-0.298487 -0.0799795 -0.951057) I57 : dAve : (-0.0381976 0.010235 -0.0904495) : omega : 0.0999985 : d : (-0.298487 0.0799795 -0.951057) I58 : dAve : (-0.0279626 0.0279626 -0.0904495) : omega : 0.0999985 : d : (-0.218508 0.218508 -0.951057) I59 : dAve : (-0.010235 0.0381976 -0.0904495) : omega : 0.0999985 : d : (-0.0799795 0.298487 -0.951057) Total omega : 12.5664 No finite volume options present Starting time loop surfaceFieldValue ZMax: operation = sum surfaceFieldValue ZMin_outlet1: operation = sum surfaceFieldValue ZMin_outlet2: operation = sum wallHeatFlux wallHeatFlux1: processing all (19) wall patches Selecting heat transfer coefficient model fixedReferenceTemperature Time = 1 DILUPBiCGStab: Solving for Ux, Initial residual = 1, Final residual = 0.00920577, No Iterations 1 DILUPBiCGStab: Solving for Uy, Initial residual = 1, Final residual = 0.0195842, No Iterations 1 DILUPBiCGStab: Solving for Uz, Initial residual = 1, Final residual = 0.00225195, No Iterations 1 DILUPBiCGStab: Solving for h, Initial residual = 1, Final residual = 0.0131098, No Iterations 1 Radiation solver iter: 0 Selecting boundary radiation Model: lookup Selecting boundary radiation Model: lookup Selecting boundary radiation Model: lookup (省略) Selecting boundary radiation Model: lookup GAMG: Solving for ILambda_0_0, Initial residual = 1, Final residual = 3.06222e-05, No Iterations 2 GAMG: Solving for ILambda_1_0, Initial residual = 1, Final residual = 2.6289e-05, No Iterations 2 (省略) |
これによりふく射を考慮すると計算時間が伸びます。
- ふく射なし:0.23時間
- ふく射あり(fvDOM):0.37時間
計算時間はふく射モデルにも依りますが、fvDOMは精度良い代わりに計算時間もかかります。
熱伝達率と熱流束の可視化
ParaViewで確認ができます。
熱流束のデータ
postProcessing/wallHeatFlux1/0/wallHeatFlux.dat
に以下のように各ステップでの壁面条件の熱流束の最小値(min)、最大値(max)、積分値(integral)が出力されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Wall heat-flux # Time patch min max integral 1 XMin 8.747131e+01 2.605587e+02 9.629629e+02 1 YMin 8.811362e+01 3.517990e+02 4.814129e+02 1 YMax 8.712351e+01 2.287534e+02 4.023138e+02 1 XMax 8.747240e+01 2.593848e+02 9.617250e+02 1 ZMin_wall 7.265268e+01 2.458050e+02 3.879065e+02 1 ZMin_wall1 5.206317e+01 1.993751e+02 1.741807e+01 1 ZMin_wall2 5.215832e+01 2.000476e+02 1.744849e+01 1 unspecified-24 1.653210e+02 1.255748e+03 8.759945e+02 1 hand-left-17 2.603619e+02 1.103899e+03 1.145084e+00 1 shoulder-left-16 4.482059e+02 4.482059e+02 4.592736e-02 1 arm-right-4 4.010347e+02 4.312581e+02 9.765926e-02 |
積分された単位時間当たりの熱量$\dot{Q}$から各部位の面積$A$で割れば、熱流束$\dot{q}=\frac{\dot{Q}}{A}$が求まります。
熱流束の分布を確認する場合は、ParaView確認ができます。
この熱流束$\dot{q}$は対流による熱量とふく射による熱量が含まれています。
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 |
void Foam::functionObjects::wallHeatFlux::calcHeatFlux ( const volScalarField& alpha, const volScalarField& he, volScalarField& wallHeatFlux ) { volScalarField::Boundary& wallHeatFluxBf = wallHeatFlux.boundaryFieldRef(); const volScalarField::Boundary& heBf = he.boundaryField(); const volScalarField::Boundary& alphaBf = alpha.boundaryField(); for (const label patchi : patchSet_) { wallHeatFluxBf[patchi] = alphaBf[patchi]*heBf[patchi].snGrad(); } const auto* qrPtr = cfindObject<volScalarField>(qrName_); if (qrPtr) { const volScalarField::Boundary& radHeatFluxBf = qrPtr->boundaryField(); for (const label patchi : patchSet_) { wallHeatFluxBf[patchi] -= radHeatFluxBf[patchi]; } } } |
if (qrPtr)
の条件分岐でふく射がある場合はwallHeatFluxBf[patchi] -= radHeatFluxBf[patchi];
で熱流束にふく射を考慮しています。
マイナスなのは吸収分がプラスなのか?今回はふく射によって熱量を出しているのでマイナスにしている?
先行論文と比較してみると熱流束の値が小さいようです。
本記事での流体解析の結果は対流のなので、先行論文のcと比較することになります。
違いと言えば先行論文のマネキンは$34^{\circ}$Cですが、本記事での設定は
value uniform 309.15;
なので$34^{\circ}$Cです。
人の体温で$34^{\circ}$Cというのは低いと思いますが、先行論文のマネキンの温度は実測に近い温度にしたという実験的な都合がありそうです。
熱伝達率のデータ
熱伝達率の分布はParaViewで確認することができます。
fixedReferenceTemperature: 固定基準温度
h = \frac{\dot{q}}{T_c – T_{\text{ref}}}
\end{align*}
- $T_c$:マネキン表面温度
- $ T_{\text{ref}}=298.15$:参照温度
- この熱流束$\dot{q}$は対流による熱量とふく射による熱量が含まれています。
熱伝達率に関しては物性値ではなく、流れによって決まるため、このように流体解析を行って決定される量なのでやっかいですよね。
この熱流束$\dot{q}$は対流による熱量とふく射による熱量が含まれています。
ただ、気になるのが熱流束にふく射を考慮するときの符号ってあっているのかな?
ふく射ありの熱伝達率の計算
ここ足し算で符号あってるのかな?
radiationをonにすると値が変な気がする…https://t.co/YUvghf4Dh6 https://t.co/1WhXP0i7s5 pic.twitter.com/Gof0lIvBco— カマキリ🐲CAE頑張る (@t_kun_kamakiri) December 19, 2024
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 |
Foam::tmp<Foam::FieldField<Foam::Field, Foam::scalar>> Foam::heatTransferCoeffModel::q() const { const auto& T = mesh_.lookupObject<volScalarField>(TName_); const volScalarField::Boundary& Tbf = T.boundaryField(); auto tq = tmp<FieldField<Field, scalar>>::New(Tbf.size()); auto& q = tq.ref(); forAll(q, patchi) { q.set(patchi, new Field<scalar>(Tbf[patchi].size(), Zero)); } typedef compressible::turbulenceModel cmpTurbModel; if (mesh_.foundObject<cmpTurbModel>(cmpTurbModel::propertiesName)) { const auto& turb = mesh_.lookupObject<cmpTurbModel>(cmpTurbModel::propertiesName); // Note: calling he(p,T) instead of he() const volScalarField he(turb.transport().he(turb.transport().p(), T)); const volScalarField::Boundary& hebf = he.boundaryField(); const volScalarField alphaEff(turb.alphaEff()); const volScalarField::Boundary& alphaEffbf = alphaEff.boundaryField(); for (const label patchi : patchSet_) { q[patchi] = alphaEffbf[patchi]*hebf[patchi].snGrad(); } } else if (mesh_.foundObject<fluidThermo>(fluidThermo::dictName)) { const auto& thermo = mesh_.lookupObject<fluidThermo>(fluidThermo::dictName); // Note: calling he(p,T) instead of he() const volScalarField he(thermo.he(thermo.p(), T)); const volScalarField::Boundary& hebf = he.boundaryField(); const volScalarField& alpha(thermo.alpha()); const volScalarField::Boundary& alphabf = alpha.boundaryField(); for (const label patchi : patchSet_) { q[patchi] = alphabf[patchi]*hebf[patchi].snGrad(); } } else { FatalErrorInFunction << "Unable to find a valid thermo model to evaluate q. " << nl << "Database contents are: " << mesh_.objectRegistry::sortedToc() << exit(FatalError); } // Add radiative heat flux contribution if present const auto* qrPtr = mesh_.cfindObject<volScalarField>(qrName_); if (qrPtr) { const volScalarField::Boundary& qrbf = qrPtr->boundaryField(); for (const label patchi : patchSet_) { q[patchi] += qrbf[patchi]; } } return tq; } |
if (qrPtr)
の条件分岐でふく射がある場合はwq[patchi] += qrbf[patchi];
で熱流束にふく射を考慮しています。
wallHeatFluxのときはマイナスだったような….
ふく射込みの際の熱伝達率の計算(heatTransferCoeff)について、熱流束の計算がおかしい気もしますが、誰か知っている人いたらXなどで教えてくださいm(__)m
OpenFOAMのふく射モデル
本記事ではfvDOMモデルというふく射モデルを使用しましたが、他にもふく射のモデルはいろいろありますので紹介しておきます。
P1モデル(1次モーメント近似)
放射強度を全方向で積分し、拡散近似した簡易的なふく射モデル。
\nabla \cdot \left( \frac{1}{3(a+\sigma_s)} \nabla G \right) – aG + 4a\sigma T^4 = 0
\end{align*}
- $G$:放射エネルギー入射量 $[\text{W}/\text{m}^2]$
- $a$:吸収係数 [$1/\text{m}$]
- $\sigma_s$:散乱係数 [$1/\text{m}$]
- $\sigma$:ステファン・ボルツマン定数 $[\text{W}/\text{m}^2\text{K}^4]$
- $T$:温度 $[\text{K}]$
計算負荷が小さく、光学的に厚く方向性が弱い媒体で効果的。
0
フォルダにG
ファイルが必要みたいです。
- greyDiffusiveRadiation
- greyDiffusiveViewFactor
- MarshakRadiation
- MarshakRadiationFixedTemperature
- wideBandDiffusiveRadiation
fvDOMモデル(有限体積離散座標法)
放射輸送方程式(RTE)を有限の離散方向に分割し、各方向ごとに解く詳細なモデル。
\mathbf{s}\cdot\nabla I + (a+\sigma_s)I = a\frac{\sigma T^4}{\pi}+\frac{\sigma_s}{4\pi}\int_{4\pi}I(\mathbf{s}’)\,d\Omega’
\end{align*}
壁境界条件
I_w=\varepsilon\frac{\sigma T_w^4}{\pi}+(1-\varepsilon)\frac{1}{\pi}\int_{\mathbf{s}’\cdot \mathbf{n}<0}|\mathbf{s}’\cdot\mathbf{n}|I_{in}(\mathbf{s}’)\,d\Omega”
\end{align*}
- $I$:放射強度 $[\text{W}/\text{m}^2\cdot \text{sr}]$
- $a$:吸収係数 [$1/\text{m}$]
- $\sigma_s$:散乱係数 [$1/\text{m}$]
- $\sigma$:ステファン・ボルツマン定数 $[\text{W}/\text{m}^2\text{K}^4]$
- $T$:温度 $[\text{K}]$
- $\varepsilon$:壁面放射率(emissivity)
- $\mathbf{s}\):方向単位ベクトル
- $\mathbf{n}$:壁法線ベクトル
- $\Omega$:立体角 $[\text{sr}]$
放射率による境界条件設定が可能で、半透明媒体や壁面反射を高精度に計算可能だが、計算負荷は高い。
0
フォルダにIDefault
ファイルが必要みたいです。
- greyDiffusiveRadiation
- greyDiffusiveViewFactor
- MarshakRadiation
- MarshakRadiationFixedTemperature
- wideBandDiffusiveRadiation
opaqueSolidモデル(不透明固体モデル)
エネルギー方程式への放射の寄与がゼロの領域を扱うモデル。
S_{rad}=0
\end{align*}
- $S_{rad}$:放射ソース項(ゼロ設定)$[\text{W}/\text{m}^3]$
放射の寄与が無い不透明固体領域を効率的に扱う。境界における吸収・散乱のモデル定義のみ提供。
viewFactorモデル(形態係数法)
幾何的に決まる形態係数を用いて、表面間の放射熱交換を計算するモデル
Q_{i\rightarrow j}=A_iF_{i\rightarrow j}\sigma(T_i^4-T_j^4)
\end{align*}
- $Q_{i\rightarrow j}$:表面間の熱流量 [W]
- $A_i$:表面面積 [m²]
- $F_{i\rightarrow j}$:形態係数(view factor)
- $\sigma$:ステファン・ボルツマン定数 [W/m²K⁴]
$T_i,T_j$:各表面の温度 [K]
明確な幾何関係のある固体間の放射熱交換計算に適する。透明媒体や散乱は考慮できない。
solarLoad
OpenFOAMのsolarLoad
モデルは、太陽放射による熱負荷をシミュレーションするためのモデルで、以下の要素を考慮しています。
- 直接日射:太陽からの直接的な放射エネルギー。
- 反射放射:表面で反射された放射エネルギー。
- 拡散放射:大気や雲による散乱によって生じる拡散放射エネルギー。
これらの要素を組み合わせることで、建物の外壁や内装材への太陽熱負荷を詳細に評価することが可能です
fvDOMについてもう少し調べた
fvDOMはOpenFOAMでどう計算しているのかを少し調べました。
emissivityは放射率を示していますが、なぜconstant/radiationProperties
とconstant/boundaryRadiationProperties
の2つに設定しているのかがわからなかったのでChatGPTに聞きながらまとめました。
constant/radiationProperties内の emissivity
1 2 3 4 5 6 |
constantAbsorptionEmissionCoeffs { absorptivity absorptivity [ m^-1 ] 0.5; emissivity emissivity [ m^-1 ] 0.5; E E [ kg m^-1 s^-3 ] 0; } |
- これは、流体領域の媒体自体の放射特性 を定義します。
- この emissivity は媒体(気体など)が熱放射をどれだけ放出するかを規定します。
- 次元が [m⁻¹] とついている通り、これは容積あたりの特性で、固体面の特性ではありません。
constant/boundaryRadiationProperties 内の emissivity
1 2 3 4 5 6 7 |
".*" { type lookup; emissivity 1.0; absorptivity 1.0; transmissivity 0.0; } |
- こちらは 壁面や境界面における放射特性 です。
- 境界条件として表面の反射・放射挙動を決定します。
- 次元なしのパラメータ(0~1の値)であり、壁面の熱放射の強さ(黒体比)を指定しています。
つまり、
radiationProperties
は「媒体(流体領域)」の特性、boundaryRadiationProperties
は「固体境界面」の特性、
と役割が明確に分かれているため、両方の設定が存在しています。
放射強度の基本式
理論の解説でわかりやすかったのはこちらの書籍ですね。
壁面条件
0/IDefaultが以下であるので壁面条件のタイプは、type greyDiffusiveRadiation;
であると思われます。
1 2 3 4 5 6 7 8 9 10 11 12 |
dimensions [1 0 -3 0 0 0 0]; internalField uniform 0; boundaryField { ".*" { type greyDiffusiveRadiation; value uniform 0; } } |
greyDiffusiveRadiationMixedFvPatchScalarField.C
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 |
#include "greyDiffusiveRadiationMixedFvPatchScalarField.H" #include "addToRunTimeSelectionTable.H" #include "fvPatchFieldMapper.H" #include "volFields.H" #include "boundaryRadiationProperties.H" (省略) if ((-n[faceI] & myRayId) > 0.0) { // direction out of the wall refGrad()[faceI] = 0.0; valueFraction()[faceI] = 1.0; refValue()[faceI] = Isource[faceI] + Iexternal[faceI]*transmissivity[faceI] + ( Ir[faceI]*(scalar(1) - emissivity[faceI]) + emissivity[faceI]*physicoChemical::sigma.value() * pow4(Tp[faceI]) )/pi; // Emitted heat flux from this ray direction qem[faceI] = refValue()[faceI]*nAve[faceI]; } |
#include “boundaryRadiationProperties.H”によりインクルードしているので、ここで放射率(emissivity)を読み込んでいるであろうと思います。
n[faceI]
:壁面の法線ベクトルを示します。myRayId
:現在の放射線の方向ベクトルを示します。-n[faceI] & myRayId
:法線ベクトルと放射線方向ベクトルの内積を計算します。
この内積が正の場合、放射線が壁面から外向き(壁面から放射される方向)であることを示しています。
refGrad()[faceI] = 0.0;
:放射強度の勾配をゼロに設定し、ディレクレット境界条件を適用します。valueFraction()[faceI] = 1.0;
:境界条件における値の割合を1に設定します。
この式は、壁面からの放射強度refValue()[faceI]
を以下の3つの項の和として計算しています。
I = I_{\text{source}} + I_{\text{external}} \cdot \tau + \frac{I_{\text{r}} \cdot (1 – \varepsilon) + \varepsilon \cdot \sigma \cdot T_{\text{p}}^4}{\pi}
\end{align*}
- 内部放射源項(
Isource[faceI]
):壁面自体が生成する放射エネルギー。 - 外部放射の透過項(
Iexternal[faceI]*transmissivity[faceI]
):外部からの放射が壁面を透過して内部に入るエネルギー。 - 反射・放射項:
Ir[faceI]*(1 - emissivity[faceI])
:壁面に入射する放射強度のうち、反射される部分。emissivity[faceI] * sigma * pow4(Tp[faceI]) / pi
:壁面の温度に基づく放射強度。
これらを合計し、壁面からの総放射強度を求めています。
q_{\text{em}} = I \cdot \langle \mathbf{n} \cdot \mathbf{s} \rangle
\end{align*}
qem[faceI]
:放射熱流束を示します。nAve[faceI]
:放射線の方向ベクトルと壁面法線ベクトルの内積の平均値を示します。
OpenFOAMのemissivityの設定が放射強度に直接依存する形なので、かなり重要なパラメータですね。
まとめ
本記事ではOpenFOAMを用いてマネキンモデルまわり熱流体解析を乱流モデルあり、ふく射モデル(fvDOM)ありで行い、さらに熱流束と熱伝達率を出力する設定を加えました。
先行文献では、複数の乱流モデルでの比較を行った結果、$k$-$\omega$SSTの乱流モデルがマネキン周りの熱流束の実験値と一番近いモデルだったと示されています。
k-ωSSTに変更
当然見た目は変わらない
実験での熱流束だとk-ωSSTが最も予測精度良かったよって結論付けている。
■Application of open-source CFD software to the indoor airflow simulationhttps://t.co/fSGosRR0LD https://t.co/21qWHgb7yH pic.twitter.com/Avpezrnugl— カマキリ🐲CAE頑張る (@t_kun_kamakiri) March 2, 2025
どのような乱流モデルが一番適しているかは見ている現象にもよりますが、本記事では先行文献にならって$k$-$\omega$SSTを使用しています。
計算力学技術者のための問題アプリ
計算力学技術者熱流体2級、1級対策アプリをリリースしました。
- 下記をクリックしてホームページでダウンロードできます。
- LINE公式に登録すると無料で問題の一部を閲覧できます。
※LINEの仕様で数式がずれていますが、アプリでは問題ありません。
- 計算力学技術者の熱流体2級問題アプリ作成
リリース後も試行錯誤をしながら改善に努め日々アップデートしています。
備忘録として作成の過程を綴っています。
OpenFOAMに関する技術書を販売中!
OpenFOAMを自宅で学べるシリーズを販売中です。
OpenFOAM初学者から中級者向けの技術書となっていますので、ぜひよろしくお願いいたします。
次回の技術書典18に向けて内容を考え中です。
乞うご期待!!
お勧めの参考書
本記事の内容について触れている書籍がこちらです。
CFD(流体解析)のガイドブックというタイトルだけあって、熱流体に関する内容は網羅的に書かれています。
乱流モデルの数式の展開が非常に丁寧なのはこちらの参考書です。
今まで読んだ本の中で途中式もしっかり書いてあって一番丁寧でした。
乱流モデルの話だけでなく、混相流(気液、固液)や粒子法、浅水方程式の話も乗っているので重宝しています。
乱流モデルはこちらもお勧めです。
前半は数値シミュレーションの離散化の話で、後半に乱流モデルの話が出てきます。
乱流モデルのざっくりした解説と流体全般の基礎知識にはこちらがちょうど良いでしょう。