OpenFOAM【chtMultiRegionFoamで輻射:viewFactorモデルについて】
OpenFOAMでchtMultiRegionFoam+viewFactorの導入について検討したのでそのまとめです。
viewFactorモデルの考え方
形態係数に基づいて輻射を計算します。OpenFOAMではfluid側で新しく輻射の熱流束に関する変数qrを追加して計算します。qrの境界条件は、fluid側の境界条件および固体流体の界面であるfluid_to_solidで設定されます。qrはfluid_to_solid、solid_to_fluidの両設定により固体側へ伝えることができます。
viewFactorの実際の導入についての方針
tutorialにはchtMultiRegionFoam(chtMultiRegionSimpleFoamではない)+viewFactorが存在していないので、viewFactorモデルを実際に導入するには
- chtMultiRegionFoamで正常に計算できるモデル・条件を設定
- viewFactorを追加
するのが正着と思われます。
viewFactorを追加するときに設定する部分
- /0.org にqrを追加する
- /constant中のファイルは
- /solidにradiationPropertiesを追加する。モデルはopaqueSolid。
- /fluidにradiationPropertiesを追加する。モデルはviewFactor。
- /fluidにboundaryRadiationProperties、viewFactorsDictを追加する。
- /system中のファイルは
- changeDictionaryDictを修正。
- /solidのT/solid_to_fluidのtypeをturbulentTemperatureRadCoupledMixedに修正。
- /solidのT/solid_to_fluidにqr, qrNbrを追加。
- /fluidのT/fluid_to_solidのtypeをturbulentTemperatureRadCoupledMixedに修正。
- /fluidのT/fluid_to_solidにqr, qrNbrを追加。
- /fluidにqrを追加
- /fluidの boundaryにinGroupsでwall, viewFactorWallを追加
なお、前処理(メッシュ作成)で
$ faceAgglomerate $ viewFactorsGen
を実行する必要があります。
デバッグの覚書(トラブルシューティング)
輻射を受ける対象物(固体)の温度が上がり続ける(下がり続ける)
平衡状態に達するハズなので、温度が上がり続けることはないです。直接的には、
- 壁面の輻射の境界条件が初期条件から更新されていない。
ことが考えられます。paraviewなどで、qrの時間経過を確認しましょう。時間の経過とともに平衡へと向かう熱流束に収束していくはずです。qrはfluid側の境界面およびfluid_to_solidで可視化できます。
見直すべき部分としては
- 境界条件、物性の設定
- fluid_to_solidの伝熱物性の見直し
qrの計算はfluid側で実施されているので、solid側の温度情報がfluid側に反映されていないとqrの更新はされないと推察されます。
温度が振動して、最後は異常終了で計算停止
標準出力で出てくるMin/max T
あたりが大きな-の値として出力されたりします。
- qrの値、輻射境界面のfluid温度が振動
したりしてます(paraviewとかで確認)。
輻射での熱流束は平衡に達するよう進行しますが、各タイムステップの1回目においては平衡前の温度を参考に熱流束が計算され、過剰に評価してしまいそのまま温度が暴走することがあります。デバッグとしては、まず輻射のモデルをoffにした条件で適切に計算が実施されることを確認したうえで
- 時間刻みを短くする
- qr, hを緩和する
- 輻射面を細かくする
が対処ほうで考えられます。緩和はhよりもqrの方が有効な気がしています(体感)。qrの緩和はfluidのfvSolution中でrelaxationFactors -> fieldsで設定できるようです。
relaxationFactors { fields { rho 1.0; p_rgh 0.7; qr 0.3; } equations { U 0.3; h 0.5; "(k|epsilon|omega)" 0.7; ".*Final" 1; } }
輻射面を細かくするにはviewFactorsDictのnFacesInCoarsestLevel(大きくする)、featureAngle(大きくする)で設定します。
参考にしました
OpenFOAM全般
chtMultiRegionFoamに関して
https://www.foamacademy.com/wp-content/uploads/2016/11/thermo_training_handout_public.pdf
OpenFOAMの輻射モデルについて
OpenFOAM を用いたふく射・対流場の連成伝熱解析の妥当性評価
https://scielo.conicyt.cl/pdf/ingeniare/v26n4/0718-3305-ingeniare-26-04-00546.pdf
http://www.tfd.chalmers.se/~hani/kurser/OS_CFD_2009/AlexeyVdovin/Radiation_in_OpenFoam_final.pdf
OpenFOAM: API Guide: viewFactor Class Reference
OpenFOAM: viewFactor Class Reference
フォーラム情報
viewfactor -- CFD Online Discussion Forums
viewFactor radiation model problem! -- CFD Online Discussion Forums
View factor radiation model. Symmetry boundaries verification.. -- CFD Online Discussion Forums
Understanding temperature coupling BCs -- CFD Online Discussion Forums
Problems adding Qr field in externalWallHeatFluxTemperature BC -- CFD Online Discussion Forums
error in implementing viewfactor model in chtMultiregionFoam -- CFD Online Discussion Forums
Problem with chtMultiregionFoam radiation boundary condition -- CFD Online Discussion Forums
Radiation in chtMultiRegionSimpleFoam -- CFD Online Discussion Forums
ViewFactor Radiation -- CFD Online Discussion Forums
CHT +viewfactor model -- CFD Online Discussion Forums
viewFactorsGen produces incorrect view factors in a very thin gap -- CFD Online Discussion Forums
Heated wall by radiation -- CFD Online Discussion Forums
convert viewFactorField to ascii and visualization -- CFD Online Discussion Forums
OpenFOAM【chtMultiRegionFoam のpostProcessでsingleGraph】
OpenFOAMの結果の可視化・グラフ化についてす。
chtMultiRegionFoamで実施したときにうまくいかなかったので。
$ postProcess -func singleGraph
通常コマンドで実行すると、こんな感じのエラーが出まくります。
Time = 15000 --> FOAM Warning : From function virtual bool Foam::functionObjects::fieldSelection::checkSelection() in file functionObjects/fieldSelections/fieldSelection/fieldSelection.C at line 166 Field T not found Reading fields: Executing functionObjects --> FOAM Warning : From function Foam::label Foam::sampledSets::classifyFields() in file sampledSet/sampledSets/sampledSetsGrouping.C at line 83 Cannot find registered field matching 1(T) No fields to sample
複数領域/マルチリージョンでのポスト処理をするときには、以下のように領域指定が必要なようです。
$ postProcess -func singleGraph -region solid
解析結果のフォルダ分けが領域ごとになされているのが理由と推察されます。
参考
OpenFOAM【物性の温度依存性の設定2】
自作の物性の追加します。
前準備(方針の確認)
まずはリンクの構成を理解するところから。
$FOAM_SRC/thermophysicalModels/solidSpecie/transport
ここに物性。一例として、exponentialSolidTransport.Hのリンク先を確認。
$FOAM_SRC/thermophysicalModels/solidThermo/solidThermo/solidThermos.C
ここが物性を呼んでいることを確認します。solidThermos.Cを読むと
makeSolidThermo ( solidThermo, heSolidThermo, pureMixture, exponentialSolidTransport, sensibleEnthalpy, hPowerThermo, rhoConst, specie );
と書いてあるので、ここに自作の物性を追加すればよいと理解します。すなわち
$FOAM_SRC/thermophysicalModels/solidSpecie/transport
以下に自製の物性のフォルダ・ソースコードを追加$FOAM_SRC/thermophysicalModels/solidThermo/solidThermo/solidThermos.C
を修正
同一環境をローカルに降ろして、ソースを修正できる環境を作る
元ソースコードをローカルにコピーします。一応、開発用フォルダ(dev-src)を作成。
$ mkdir dev-src $ cd dev-src $ cp -r $FOAM_SRC/thermophysicalModels/solidSpecie . $ cp -r $FOAM_SRC/thermophysicalModels/solidThermo .
git管理を開始しておくと吉です。
solidSpecie/Make/filesの中を修正します。これを。
LIB = $(FOAM_LIBBIN)/libsolidSpecie
こう
LIB = $(FOAM_USER_LIBBIN)/libsolidSpecie
/solidSpecieのフォルダ内(Makeフォルダが配置されている階層)でコンパイルします。
$ wmake libso
念のため、コンパイルされているかを確認
$ ls $FOAM_USER_LIBBIN
続いて、solidThermo内。ローカルのsolidSpecieを参照できるようにします。これを
EXE_INC = \ -I$(LIB_SRC)/finiteVolume/lnInclude \ -I$(LIB_SRC)/thermophysicalModels/solidSpecie/lnInclude \
こう
EXE_INC = \ -I$(LIB_SRC)/finiteVolume/lnInclude \ -I../solidSpecie/lnInclude \
コンパイルには同じようにwmake libso
を使います。
プログラムの修正(準備)
$ cd solidSpecie/transport/ $ cp -r exponential/ usr
exponentialSolidTransportをもとに自製の物性プログラムを作成します。
$ sed -e "s/exponentialSolidTransport/usrSolidTransport/g" exponentialSolidTransport.C > usrSolidTransport.C $ sed -e "s/exponentialSolidTransport/usrSolidTransport/g" exponentialSolidTransport.H > usrSolidTransport.H $ sed -e "s/exponentialSolidTransport/usrSolidTransport/g" exponentialSolidTransportI.H > usrSolidTransportI.H
solidThermos.Cの内部を修正して、自製のusrSolidTransportを呼べるようにします。修正箇所は
#include "usrSolidTransport.H"
ヘッダファイルの追加
makeSolidThermo ( solidThermo, heSolidThermo, pureMixture, usrSolidTransport, sensibleEnthalpy, hPowerThermo, rhoConst, specie );
usrSolidTransportを呼べるように。
修正したらコンパイルしなおします。(念のため)wcleanからのコンパイル。
$ wclean $ wmake libso
プログラムの修正(中身)
usrSolidTransport.H
static word typeName() { return "usr<" + Thermo::typeName() + '>'; }
thermophysicalPropertiesを読み込むときに、"usr"のキーワードで読み込むことができるようになります。
コンパイルは、solidThermoディレクトリでwmake libso
たたけばできます(wcleanはいらない)。solidSpacie以下のディレクトリの変更も反映できます(なので、solidThermoディレクトリに居座ってコンパイルすればよい
)
プログラムの修正(詳細)
変数a0を追加してみます。exponentialSolidTransport中のn0を編集する形で追加していきます。
usrSolidTransport.H, usrSolidTransportI.H, usrSolidTransport.Cの3ソースファイル中で、n0を探す⇒コピー⇒a0に編集を機械的に繰り返していくことで追加できます。
この段階で一度コンパイルしてみます。実行すると、変数a0が足りないと怒られるので、thermophysicalPropertiesを修正しておきます。
実行できることを確認した後は本格的に修正。熱物性計算の本体はusrSolidTransportI.H中の以下なので、この辺を修正していきます。
template<class Thermo> inline Foam::scalar Foam::usrSolidTransport<Thermo>::kappa ( const scalar p, const scalar T ) const { return (kappa0_*pow(T/Tref_, n0_)); } template<class Thermo> inline Foam::vector Foam::usrSolidTransport<Thermo>::Kappa ( const scalar p, const scalar T ) const { const scalar kappa(kappa0_*pow(T/Tref_, n0_)); return vector(kappa, kappa, kappa); }
実行
OpenFOAMの実行プログラムは$FOAM_USER_LIBBIN中のライブラリを優先的に参照するようです。ですので、上記手順でソースコードを修正した場合、すでにコンパイル済みの実行ファイルでも修正部分が反映されます。
参考にしました
pythonで関数のフィッティング
多項式で近似する場合
numpyの機能で実行できます。
import numpy as np x = np.arange(0, 1000, 1) y_target = xxx ndim = 3 # Coeffs=np.polyfit(x,y_target,3) # plt.plot( x, np.poly1d(Coeffs)(x) )
一般の関数で近似する場合
scipyのoptimize, curve_fitを使います。
from scipy.optimize import curve_fit def y_func(x,a,b): y = a*x+b return y coefs, pcov = curve_fit(y_func, x, y_target) plt.plot( x, y_func(x, coefs ) )
参考にしました
OpenFOAM【物性の温度依存性の設定1】
chtMultiFegionFoam中で固体(solid)の物性の温度依存性を反映させるのが目的。熱伝導率(transport)、比熱(thermo)の温度依存性を考慮できます。thermophysicalPropertiesが設定ファイル。まずは、thermoTypeで関数の指定。
thermoType { type heSolidThermo; mixture pureMixture; transport polynomial; thermo hPolynomial; equationOfState rhoConst; specie specie; energy sensibleEnthalpy; }
(わざと)合わない設定をすると、以下出力されるので参考に設定します。
Valid solidThermo types :
6(heSolidThermo<multiComponentMixture<constIso<hConst<rhoConst<specie>>,sensibleEnthalpy>>> heSolidThermo<pureMixture<constAnIso<hConst<rhoConst<specie>>,sensibleEnthalpy>>> heSolidThermo<pureMixture<constIso<hConst<rhoConst<specie>>,sensibleEnthalpy>>> heSolidThermo<pureMixture<exponential<hPower<rhoConst<specie>>,sensibleEnthalpy>>> heSolidThermo<pureMixture<polynomial<hPolynomial<icoPolynomial<specie>>,sensibleEnthalpy>>> heSolidThermo<pureMixture<polynomial<hPolynomial<rhoConst<specie>>,sensibleEnthalpy>>>)
type mixture transport thermo equationOfState specie energy
heSolidThermo multiComponentMixture constIso hConst rhoConst specie sensibleEnthalpy
heSolidThermo pureMixture constAnIso hConst rhoConst specie sensibleEnthalpy
heSolidThermo pureMixture constIso hConst rhoConst specie sensibleEnthalpy
heSolidThermo pureMixture exponential hPower rhoConst specie sensibleEnthalpy
heSolidThermo pureMixture polynomial hPolynomial icoPolynomial specie sensibleEnthalpy
heSolidThermo pureMixture polynomial hPolynomial rhoConst specie sensibleEnthalpy
transportの設定
一定値(constIso)のほかに、指数形(exponential)、多項式(polynomial )を設定できます。
transport { // exponentialの場合 kappa0 1; n0 1.1; Tref 300; // polynomial の場合 kappaCoeffs<8> (1e3 0 0 0 0 0 0 0) }
具体的な計算は、以下のソースコードを見ればわかります。
/src/thermophysicalModels/solidSpecie/transport/exponential/exponentialSolidTransportI.H /src/thermophysicalModels/solidSpecie/transport/polynomial/polynomialSolidTransportI.H
thermoの設定
一定値(hConst)のほかに、指数形(hPower)、多項式(hPolynomial)を設定できます。
thermodynamics { Hf 0; Sf 0; // hPower の場合 // Cp(T) = c0*(T/Tref)^n0 C0 1; Tref 300; n0 1.1; // hPolynomial の場合 CpCoeffs<8> (2000 0 0 0 0 0 0 0); }
OpenFOAM【chtMultiRegionFoamで輻射:基礎編】
chtMultiRegionFoamで輻射を入れる方法についてまとめ。
基本的な考え方
OpenFOAMで輻射を計算する場合、輻射に関する変数(G, IDefault, qr)が追加され、その変数を合わせて解くことになります。
輻射のモデルとしては、P1, viewFactor, FvDOMなどを選択可。viewFactorは形態係数を解析領域から計算させる必要があります(後述)。FvDOMは直接求解しているようで、計算コストを要します。
G: 入射の強度。前ステップの温度場から、MarshakRadiationの境界条件にもとづいて計算される。Marshak Radiationの境界条件の原著は下の論文(みたい)。 Phys. Rev. 71, 443 (1947) - Note on the Spherical Harmonic Method As Applied to the Milne Problem for a Sphere
IDefault:放射の強度。greyDiffusiveRadiationの境界条件から計算される。
qr:輻射による熱交換量。greyDiffusiveRadiationViewFactorの境界条件から計算される。viewFactorモデルの際に使用。
境界条件の設定
OpenFOAMの一般的な境界条件はこちら。
一方で、constant中に配置するboundaryRadiationPropertiesでも輻射に関しての境界を設定できそうです。下のフォーラムによればどちらかで設定すればよさそう、とのことですが、tutorialのmultiRegionHeaterRadiationでは、どちらでも設定されているようです(例えばsystem/topAir/changeDictionaryDictとconstant/topAir/boundaryRadiationProperties)。これらの設定の反映については要確認だが、とりあえずどっちにも設定しとけばよいかも。
What is boundaryRadiationProperties -- CFD Online Discussion Forums
また、multiRegionHeaterRadiationの設定を確認すると、流体側のG,IDefault, qrには輻射に関する境界条件・界面の条件が付与されている一方で、固体側の境界条件には
{
type calculated;
value uniform 0;
}
で付与されています。
温度Tの境界条件
compressible::turbulentTemperatureRadCoupledMixed を設定することで、輻射熱を温度の境界に反映させることができるようです。流体側と固体側とでqrNbr,qrをそれぞれ設定する必要があるようです。
流体側
"topAir_to_.*" { type compressible::turbulentTemperatureRadCoupledMixed; Tnbr T; kappaMethod fluidThermo; qrNbr none; qr qr; value uniform 300; }
固体側
heater_to_topAir
{
type compressible::turbulentTemperatureRadCoupledMixed; Tnbr T;
kappaMethod solidThermo;
qrNbr qr;
qr none;
value uniform 300;
}
輻射の境界条件の設定は、turbulentTemperatureRadCoupledMixedのようですが、もとは以下フォルダに格納です。
src/TurbulenceModels/compressible/turbulentFluidThermoModels/derivedFvPatchFields/turbulentTemperatureRadCoupledMixed
Understanding temperature coupling BCs -- CFD Online Discussion Forums
viewFactorモデルの使用について
viewFactorを計算するには、preprocessで形態係数に関する設定が必要です。なので、constant中にviewFactorsDictを配置して、preprocessが必要です。multiRegionHeaterRadiationを参考にすると、以下のコマンドが必要。
# Agglomerate patch faces for region in bottomAir topAir do runApplication -s $region \ faceAgglomerate -region $region -dict constant/viewFactorsDict done # Generate view factors for region in bottomAir topAir do runApplication -s $region \ viewFactorsGen -region $region done
あわせて、境界条件の設定も必要なようです。
boundary { ".*" { inGroups 2(wall viewFactorWall); } }
【参考】multiRegion+輻射に関するチュートリアル
各モデルと初期条件で設定されている変数のまとめ。参照しているのはOpenFOAM-v1912です。
/heatTransfer/buoyantSimpleFoam/hotRadiationRoom
- SIMPLE+P1
- G T U alphat epsilon k nut p p_rgh
/heatTransfer/buoyantSimpleFoam/hotRadiationRoomFvDOM
- SIMPLE+fvDOM
- G IDefault T U alphat epsilon k nut p p_rgh
/heatTransfer/chtMultiRegionFoam/multiRegionHeater
- multiregion+PIMPLE
- T U epsilon k p p_rgh
/heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeaterRadiation
- multiregion+SIMPLE+viewFactor
- G IDefault T U epsilon k p p_rgh qr
/heatTransfer/buoyantPimpleFoam/thermocoupleTestCase
- PIMPLE+fvDOM;
- IDefault T U p p_rgh
参考にしました。
OpenFOAM全般
http://www.opencae.or.jp/wp-content/uploads/2015/06/C-_%E7%AC%AC2%E5%9B%9E.pdf
伝熱解析全般
chtMultiRegionFoam情報
chtMultiRegionSimpleFoam:流体-固体熱連成解析(定常) - Onion Salad - OpenFOAMチュートリアルドキュメント作成プロジェクト
chtMultiRegionSimpleFoam:熱交換器とファン - Onion Salad - OpenFOAMチュートリアルドキュメント作成プロジェクト
OpenFOAMのマルチリージョン(標準ソルバー編 その1 ケースディレクトリ) - Qiita
OpenFOAM マルチリージョンの取り扱い(境界条件と並列処理) - Qiita
OpenFOAM-v1712のCHT部分の変更点(sub-looping) - Qiita
OpenFOAMでの輻射解析
https://scielo.conicyt.cl/pdf/ingeniare/v26n4/0718-3305-ingeniare-26-04-00546.pdf
輻射を考慮した直方体領域内の自然対流(fvDOM モデル) - XSim
http://www.tfd.chalmers.se/~hani/kurser/OS_CFD_2009/AlexeyVdovin/Radiation_in_OpenFoam_final.pdf
OpenFOAM: API Guide: Radiation models
How to deal with Conduction, Convection and radiation in OpenFOAM | CFD WITH A MISSION
https://www.foamacademy.com/wp-content/uploads/2018/03/thermo_training_handout_public.pdf
Difference between IDefault and G (radiation) -- CFD Online Discussion Forums
chtMultiRegionFoam: crash with fvDOM and unstructured mesh -- CFD Online Discussion Forums
OpenFOAM【pythonでblockMesh】
春日氏作成のpythonプログラムblockMesh.pyを使ってみました。ので、簡単なメモ(OpenFOAMも久しぶりなので)。
$ wget http://penguinitis.g1.xrea.com/study/OpenFOAM/blockMeshPython/blockMeshPython-v1912-20200612.tar.gz $ tar -zxvf blockMeshPython-v1912-20200612.tar.gz
でダウンロード+解凍。チュートリアルプログラムが二つほど入っています。createMesh.pyとcreateMesh2.py。とりあえず、createMesh.pyを動かしてみます。
ディレクトリとして、/constant、/systemを用意します。
$ python createMesh.py
をたたくことで、blockMeshDictを作成します。作成場所はcreateMesh.pyの中に記載。/system中にcontrolDictを配置します。内容は適当でもよい。
$ blockMesh
をたたくと/constantフォルダの中に、polyMeshディレクトリ・meshファイルが作成されています。
$ paraFoam
でメッシュを確認できます。