Fumiya Nozaki
2014/04/27,1st ed.
OpenFOAM v2.3.0
回転領域を含む計算
Keywords:
• OpenFOAM
• SRF
• MRF
2
回転体周りの流れ場の計算|分類
計算領域全体が回転領域
計算領域に回転領域と静止領域の両方が存在
http://www.pumped101.com/pumpintro.pdf
例)インペラ単独の解析
例)インペラとボリュートとを併せた解析
インペラ(回転領域)
ボリュート(静止領域)
1
2
3
計算領域全体が回転領域の計算
 回転領域と一緒に回転する座標系で計算を行うことにより,メッシュの移動
をせずに回転領域を取り扱うことができます.
Single Rotating Frame (SRF)
SRFSimpleFoam
SRFPimpleFoam
定常計算用
非定常計算用
4
SRFSimpleFoam | 概要
 SRFSimpleFoamの支配方程式 (定常,非圧縮)
𝒖 𝑅 ∙ 𝛻 𝒖 𝑅 + 2𝜴 × 𝒖 𝑅 + 𝜴 × 𝜴 × 𝒓 = −𝛻𝑝 + 𝛻 ∙ 𝜈 𝑒𝑓𝑓 𝛻𝒖 𝑅 + 𝛻𝒖 𝑅
𝑇
𝛻 ∙ 𝒖 𝑅 = 0
𝒖 = 𝒖 𝑅 + 𝜴 × 𝒓
𝜴 :角速度
回転軸
𝒓
慣性座標系での流速
回転座標系での流速
コリオリ力 遠心力
:軸からの位置ベクトル
5
SRFSimpleFoam | 設定
 constant ディレクトリの『SRFProperties』ファイルで回転速度に関する
設定を行います.
/*--------------------------------*- C++ -*----------------------------------*¥
| ========= | |
| ¥¥ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| ¥¥ / O peration | Version: 2.3.0 |
| ¥¥ / A nd | Web: www.OpenFOAM.org |
| ¥¥/ M anipulation | |
¥*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "constant";
object SRFProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
SRFModel rpm;
axis ( 0 0 1 );
rpmCoeffs
{
rpm 5000;
}
// ************************************************************************* //
回転速度を,1分当たりの回転の回数 (RPM)で指定
回転軸ベクトル
5000 rpm ⇒ 5000 ∗ 2π 60 = 523.6 [rad/s]
回転軸ベクトルが自分の方を向いている視点で,
• rpm>0 ⇒ 反時計回り
• rpm<0 ⇒ 時計回り
回転の向き
6
SRFSimpleFoam | 実装
𝒖 𝑅 ∙ 𝛻 𝒖 𝑅 + 2𝜴 × 𝒖 𝑅 + 𝜴 × 𝜴 × 𝒓 = −𝛻𝑝 + 𝛻 ∙ 𝜈 𝑒𝑓𝑓 𝛻𝒖 𝑅 + 𝛻𝒖 𝑅
𝑇
𝛻 ∙ 𝒖 𝑅 = 0
// Relative momentum predictor
tmp<fvVectorMatrix> UrelEqn
(
fvm::div(phi, Urel)
+ turbulence->divDevReff(Urel)
+ SRF->Su()
==
fvOptions(Urel)
);
UrelEqn.H
Foam::tmp<Foam::DimensionedField<Foam::vector, Foam::volMesh> >
Foam::SRF::SRFModel::Su() const
{
return Fcoriolis() + Fcentrifugal();
}
SRFModel.H
2.0*omega_ ^ Urel_ omega_ ^ (omega_ ^ mesh_.C())
126行 147行
慣性座標系での流速 (Uabs) の計算
Urel + SRF->U()
SRFSimpleFoam.C
omega_ ^ (mesh_.C() - axis_*(axis_ & mesh_.C()))
7
SRFSimpleFoam|チュートリアル
 tutorials/incompressible/SRFSimpleFoam/mixer
反時計回りに 5000rpm で回転
outlet
outerWall
innerWall
cyclic_half1
cyclic_half0
非表示にしている手前側の面が inlet
8
SRFSimpleFoam|チュートリアル
cyclic_half1
cyclic_half0
周期境界条件
 境界条件
innerWall
𝒖 𝑅 = 𝟎
outerWall
𝒖 = 𝟎inlet
𝒖 = 0 0 − 10
手前側から奥向き
9
SRFVelocity 境界条件
 mixer チュートリアルでは,inlet と outerWall において『SRFVelocity』
という境界条件を使用しています.
inlet
{
type
inletValue
relative
value
}
outerWall
{
type
inletValue
relative
value
}
SRFVelocity;
uniform ( 0 0 -10 );
no;
uniform ( 0 0 0 );
SRFVelocity;
uniform ( 0 0 0 );
no;
uniform ( 0 0 0 );
𝒖 = 𝟎 の条件(慣性座標系で静止)
𝒖 = 0 0 − 10 の条件
(慣性座標系で Z 方向に一様に流入)
『relative』で『no』と設定
慣性座標系での流速により,
𝒖 𝑟 に関する境界条件を
設定できます.
この境界条件の実装部分を次のページ
に示します.
10
SRFVelocity 境界条件の実装
void Foam::SRFVelocityFvPatchVectorField::updateCoeffs()
{
if (updated())
{
return;
}
// If not relative to the SRF include the effect of the SRF
if (!relative_)
{
// Get reference to the SRF model
const SRF::SRFModel& srf =
db().lookupObject<SRF::SRFModel>("SRFProperties");
// Determine patch velocity due to SRF
const vectorField SRFVelocity(srf.velocity(patch().Cf()));
operator==(-SRFVelocity + inletValue_);
}
// If already relative to the SRF simply supply the inlet value as a fixed
// value
else
{
operator==(inletValue_);
}
fixedValueFvPatchVectorField::updateCoeffs();
}
『relative』が『no』の場合
『relative』が『yes』の場合
SRFModel.C の 160 行目
𝜴 × 𝒓 の計算
𝒖 𝑅 = −𝜴 × 𝒓 + 𝒖
11
outerWall 上の流速
慣性座標系での流速分布
回転座標系での流速分布
outerWall の半径が 0.1 m
𝒖 = 𝟎
𝒖 𝒓 = 𝒖 − 𝛀 × 𝒓
= 523.6 ∙ 0.1 = 52.36 [𝑚/𝑠]
ベクトルは,𝒖 𝑟 を表しています.
当然ですが,回転座標系で観測すれば,
outerWall は回転方向と逆方向に
回転して見えます.
回転方向
12
計算領域に回転領域と静止領域の両方が存在する計算
 回転領域のメッシュの移動を伴うか否かで大きく2つの方法に分類できます.
メッシュの移動を伴わない方法
メッシュの移動を伴う方法
回転領域は,SRF と同様に回転座標系で解き,
静止領域は静止座標系で解きます.
Multiple Reference Frame (MRF)
複数の座標系を用いるため
Arbitrary Mesh Interface(AMI) + dynamicMesh
回転領域のメッシュ移動を dynamicMesh (solidBodyMotionFvMesh 等)
で行い,回転領域と静止領域間の補間を AMI で行います.
13
Multiple Reference Frame (MRF)
回転領域
静止領域
 MRF モデルをイメージで描くと・・・
14
Multiple Reference Frame (MRF)
 OpenFOAM v2.3.0 では,fvOptions の機能を使用して,標準のソルバー
の支配方程式にソース項を付加することで,MRF モデルを取り扱います.
 system ディレクトリ内の『fvOptions』ファイルで設定を行います.
MRF1
{
type
active
selectionMode
cellZone
MRFSourceCoeffs
{
origin
axis
omega
}
}
MRFSource;
true;
cellZone;
rotor;
(0 0 0);
(0 0 1);
104.72;
回転領域を cellZone により
指定しています.この領域に
含まれるセルにコリオリ力が
ソース項として作用します.
rotor
15
MRF モデル|概要
 支配方程式(非圧縮)
𝒖 𝑅 ∙ 𝛻 𝒖 − 𝛀 × 𝒖 = −𝛻𝑝 + 𝛻 ∙ 𝜈 𝑒𝑓𝑓 𝛻𝒖 + 𝛻𝒖 𝑇
𝛻 ∙ 𝒖 𝑅 = 0
コリオリ力 (静止領域では0)
 通常の simpleFoam の支配方程式と異なる点
• 回転領域においてコリオリ力が加わる
• 回転領域における流束
これらの処理について次の2ページに示します.
静止領域では,𝒖
355 void Foam::MRFZone::addCoriolis(fvVectorMatrix& UEqn, const bool rhs) const
356 {
357 if (cellZoneID_ == -1)
358 {
359 return;
360 }
361
362 const labelList& cells = mesh_.cellZones()[cellZoneID_];
363 const scalarField& V = mesh_.V();
364 vectorField& Usource = UEqn.source();
365 const vectorField& U = UEqn.psi();
366
367 const vector Omega = this->Omega();
368
369 if (rhs)
370 {
371 forAll(cells, i)
372 {
373 label celli = cells[i];
374 Usource[celli] += V[celli]*(Omega ^ U[celli]);
375 }
376 }
377 else
378 {
379 forAll(cells, i)
380 {
381 label celli = cells[i];
382 Usource[celli] -= V[celli]*(Omega ^ U[celli]);
383 }
384 }
385 }
16
MRF モデル|実装
MRFZone.C
 回転領域におけるコリオリ力の計算
cells は,cellZone に
含まれるセルの番号の
リストです.
cellZone に含まれるセルに
対して,コリオリ力をソース
として加えています.
17
MRF モデル|実装
34 template<class RhoFieldType>
35 void Foam::MRFZone::makeRelativeRhoFlux
36 (
37 const RhoFieldType& rho,
38 surfaceScalarField& phi
39 ) const
40 {
41 const surfaceVectorField& Cf = mesh_.Cf();
42 const surfaceVectorField& Sf = mesh_.Sf();
43
44 const vector Omega = omega_->value(mesh_.time().timeOutputValue())*axis_;
45
46 const vectorField& Cfi = Cf.internalField();
47 const vectorField& Sfi = Sf.internalField();
48 scalarField& phii = phi.internalField();
49
50 // Internal faces
51 forAll(internalFaces_, i)
52 {
53 label facei = internalFaces_[i];
54 phii[facei] -= rho[facei]*(Omega ^ (Cfi[facei] - origin_)) & Sfi[facei];
55 }
56
57 makeRelativeRhoFlux(rho.boundaryField(), phi.boundaryField());
58 }
 回転領域における流束の修正
MRFZoneTemplates.C
18
MRF, AMI etc. について
To be continued.

OpenFOAM -回転領域を含む流体計算 (Rotating Geometry)-