rhocentralfoam in openfoam
TRANSCRIPT
圧縮性流体のソルバーの解説1
松原 大輔
OPENFOAM
2.5
5
7.5
10
12p
0.0339
12.7
第52回OpenCAE勉強会@関西
OPENFOAMに実装されている基本的な圧縮性流体ソルバーの一覧
• rhoCentralFOAM KURGANOVとTADMORによる中心-風上スキームに基づく密度ベースソルバー
• sonicFOAM非定常/遷音速・超音速/層流・乱流
• rhoSimpleFOAM定常/層流・乱流(RANS)/SIMPLE法
• rhoSimplecFOAM定常/層流・乱流(RANS)/SIMPLEC法
• rhoPimpleFOAM非定常/層流・乱流/HVAC用
出典 http://dot-prototype.appspot.com/OpenFOAM.html
OPENFOAMに実装されている基本的な圧縮性流体ソルバーの一覧
• rhoCentralFOAM KURGANOVとTADMORによる中心-風上スキームに基づく密度ベースソルバー
• sonicFOAM非定常/遷音速・超音速/層流・乱流
• rhoSimpleFOAM定常/層流・乱流(RANS)/SIMPLE法
• rhoSimplecFOAM定常/層流・乱流(RANS)/SIMPLEC法
• rhoPimpleFOAM非定常/層流・乱流/HVAC用
出典 http://dot-prototype.appspot.com/OpenFOAM.html
OPENFOAMに実装されている基本的な圧縮性流体ソルバーの一覧
• rhoCentralFOAM KURGANOVとTADMORによる中心-風上スキームに基づく密度ベースソルバー
• sonicFOAM非定常/遷音速・超音速/層流・乱流
• rhoSimpleFOAM定常/層流・乱流(RANS)/SIMPLE法
• rhoSimplecFOAM定常/層流・乱流(RANS)/SIMPLEC法
• rhoPimpleFOAM非定常/層流・乱流/HVAC用
出典 http://dot-prototype.appspot.com/OpenFOAM.html
密度ベースソルバーとは?
• 密度ベースソルバーは、物体の周りの遷音速や高音速流れに用いられる方法。
• 圧力ベースソルバーは、非圧縮流体や低マッハ数の流れに対して用いられる方法。
密度ベースソルバーVS圧力ベースソルバー
時間差分の部分で誤差が蓄積されていくので、非定常計算の場合、慎重にスキームを選ぶ必要がある。
質量保存則、運動量保存則、エネルギー保存則から保存量を陽的に求め、保存量から密度や圧力などのプリミティブな変数を求める。
陰解法を含めることができるため、密度ベースと比較してΔTを大きく取ることができる。
密度ベースに比べて流体シミュレーションでは主流の方法である。
緩和係数や連立方程式など設定するパラメータが多く、経験も必要
密度ベースソルバーとは?
2.質量保存則から次の時間ステップの密度𝜌を求める
3.運動量保存則から次の時間ステップの運動量𝑀を求める
5.エネルギー保存則から次の時間ステップの全エネルギーを求める
4.ここで2で求めた運動量を1の密度で割ることで、次のステップの速度が求まる
6.ここで4で求めたエネルギーを1の密度と3の速度を用いて、次のステップの内部エネルギーや温度、圧力などが求まる
// --- Solve density solve(fvm::ddt(rho) + fvc::div(phi));
// --- Solve momentum solve(fvm::ddt(rhoU) + fvc::div(phiUp));
U.ref() = rhoU() /rho();
// --- Solve energy solve(fvm::ddt(rhoE) + fvc::div(phiEp) - fvc::div(sigmaDotU) );
e = rhoE/rho - 0.5*magSqr(U); e.correctBoundaryConditions();thermo.correct(); p.ref() = rho() /psi();
rhoCentralFoam.C
1.補間を用いてセル界面の物理量(phi,phiUp,phiEp)等を求める
rhoCentralFoamを使う際に用いられるパラメータ
• system/fvSolution中Solvers{
”(rho|rhoU|rhoE)”{
solver diagonal;}
}
右辺(緑側)は陽的に求めるため未知変数に対して緩和法などを使って連立方程式を解く必要がない。
// --- Solve density solve(fvm::ddt(rho) + fvc::div(phi));
// --- Solve momentum solve(fvm::ddt(rhoU) + fvc::div(phiUp));
// --- Solve energy solve(fvm::ddt(rhoE) + fvc::div(phiEp) - fvc::div(sigmaDotU) );
既知の変数(密度など)で構成 (fvc::)未知 (fvm::)
粘性項は今回は割愛
粘性を考慮する場合、ラプラシアン項は隠的に与えるためソルバーを設定する必要がある。
そしてrhoEなどの未知変数は一意に求まるため、残差はゼロと出力される(バグではない)。
rhoCentralFoam• KURGANOVとTADMORによる中心-風上スキームに基づく密度ベースソルバー
// --- Solve density solve(fvm::ddt(rho) + fvc::div(phi));
// --- Solve momentum solve(fvm::ddt(rhoU) + fvc::div(phiUp));
// --- Solve energy solve(fvm::ddt(rhoE) + fvc::div(phiEp) - fvc::div(sigmaDotU) );
既知の変数(密度など)で構成 (fvc::)
phi、phiUp、phiEpの決め方ごとに様々なスキームが考案されている。
Roeスキーム、HLLEスキーム、HLLCスキーム..etc
rhoCentralFoamは、 KurganovとTadmorスキームが実装されている。
OPENFOAMに実装されている基本的な圧縮性流体ソルバーの一覧
• rhoCentralFOAM KURGANOVとTADMORによる中心-風上スキームに基づく密度ベースソルバー
• sonicFOAM非定常/遷音速・超音速/層流・乱流
• rhoSimpleFOAM定常/層流・乱流(RANS)/SIMPLE法
• rhoSimplecFOAM定常/層流・乱流(RANS)/SIMPLEC法
• rhoPimpleFOAM非定常/層流・乱流/HVAC用
出典 http://dot-prototype.appspot.com/OpenFOAM.html
• 風上と中心スキームをフラックス上で切り替える
rhoCentralFoamのソースコード解読
𝜕𝜌𝜕t + 𝛻 ' (𝜌𝒗)
• 支配方程式(例:質量保存則)
Solve( fvm::ddt(rho) + fvc::div(phi) )
Phi = aphiv_pos*rho_pos + aphiv_neg*rho_neg;
𝜙 = 𝑎.(𝜙.𝜌.) + 𝑎/(𝜙/𝜌/)
係数
風上成分と風下成分を係数で結合した形となる。今回は理論的背景は考えない。例えばある時、𝑎., 𝑎/が支配的ならば風上的、等分であれば中心差分となる。運動量、エネルギーの式も同じ考え方。
運動量方程式とエネルギー方程式については割愛
interpolate(rho,pos)
𝜙 = 𝑎.(𝜙.𝜌.) + 𝑎/(𝜙/𝜌/)
この時、𝜌±等はどのように決めるのか?
rhoCentralFoam.C// --- Directed interpolation of primitive fields onto faces
surfaceScalarField rho_pos(interpolate(rho, pos));surfaceScalarField rho_neg(interpolate(rho, neg));
createField.HsurfaceScalarField pos( IOobject ( “pos”, runTime.timeName(), mesh ), mesh,
dimensionedScalar(“pos”, dimless, 1.0) );
negなら”-1.0”
interpolate(rho,pos)rho_pos(interpolate(rho, pos))を探索
directionInterpolate.H
//- Interpolate field vf according to direction dirtemplate<class Type>tmp<GeometricField<Type, fvsPatchField, surfaceMesh>> interpolate( const GeometricField<Type, fvPatchField, volMesh>& vf,
const surfaceScalarField& dir, const word& reconFieldName = word::null ){
tmp<GeometricField<Type, fvsPatchField, surfaceMesh>> tsf(
fvc::interpolate( vf, dir, "reconstruct("+ (reconFieldName != word::null ? reconFieldName : vf.name())+ ')'
));GeometricField<Type, fvsPatchField, surfaceMesh>& sf = tsf.ref();sf.rename(vf.name() + '_' + dir.name());return tsf;
}
補間する場の変数と方向を引数にする
interpolate(rho,pos)Interpolate(GF,ssf,word )を探索
interpolate( const GeometricField<Type, fvPatchField volMesh>&, const surfaceScalarField& ,const word& )
これらが引数のinterpolate( ) を探すと
//- Interpolate field onto faces using scheme given by name in fvSchemestemplate<class Type>static tmp<GeometricField<Type, fvsPatchField, surfaceMesh> > interpolate(
const GeometricField<Type, fvPatchField, volMesh>& tvf,const tmp<surfaceScalarField>& faceFlux,const word& name
);
surfaceInterpolate.H
interpolate(rho,pos)Interpolate(GF,ssf,word )を探索
//- Interpolate field onto faces using scheme given by name in fvSchemestemplate<class Type>static tmp<GeometricField<Type, fvsPatchField, surfaceMesh> > interpolate(
const GeometricField<Type, fvPatchField, volMesh>& tvf,const tmp<surfaceScalarField>& faceFlux,const word& name
);
surfaceInterpolate.C
interpolate(rho,pos)Interpolate(GF,ssf,word )を探索
セル界面
𝑥
𝜌.
𝜌/
補間の傾き
傾きの選び方は複数用意されている
𝜌𝜙 = 𝑎.(𝜙.𝜌.) + 𝑎/(𝜙/𝜌/)
他の物理量やパラメータも同じ考え方
rhoCentralFoamを使う際に用いられるパラメータ
• system/fvSchemes中
fluxScheme Kuraganov;
interpolationSchemes{
default linear;reconstruct(rho) vanLeer;reconstruct(U) vanLeerV;reconstruct(T) vanLeer;
}
KurganovかTadmorを選択
傾きの選び方を選択
vanLeersuperBeevanAlbada等
ベクトルの場合は末尾にVを追記すると成分の中で も制限の厳しい値をベクトル全体に採用する。→単調性が高くなり1次の風上的になるvanLeerが一般的
rhoCentralFoamを使う際に用いられるパラメータ
• constant/thermophysicalProperties中
Mixture{Specie{
nMoles 1;molWeight 11640.3;
}thermodynamics
{Cp 2.5;Hf 0;
}transport
{mu 0;Pr 1;
}}
定圧比熱
エンタルピー
0ならば非粘性(invisid)プラントル数
モル数モル質量
まとめ
• rhoCentralFoam(密度ベースソルバー)の概要を説明した。
• 今後やりたいこと
1.補間法の違いによる影響を調べる2.sonicFoam等の圧力ベースのソルバーとの比較3. Kurganov Tadmor以外の密度ベースソルバーを実装、比較していきたい(HLLE等)
問い合わせ先[email protected]