openfoamのdem解析のpatchinteractionmodelクラスの解読
TRANSCRIPT
OpenFOAMのDEM解析のpatchInteractionModel
クラスの解読
⼤阪⼤学⼤学院基礎⼯学研究科 博⼠3年 ⼭本卓也
OpenFOAMでのDEM
OpenFOAM-2.0.0よりDEM解析が実装された。
2011/6/16 OpenFOAM-2.0.0でDEM(DiscreteElement Method)の機能追加 (Lagrangianライブラリが追加)
2014/2/17 OpenFOAM-2.3.0でDPM(DiscreteParEcle Modeling)が実装 MP-PIC(MulEphaseParEcle-in-Cell)法が実装
ReleaseHistory
OpenFOAMのDEMについてあまりdocumentがないので調査する。
粒子に働く力のモデルについて
PatchInterac9onModel
$FOAM_SRC/lagrangian/intermediate/submodels/KinemaEc/PatchInteracEonModel
このフォルダ中にPatchInteracEonのモデルが書かれている
$tree-L1
.├──LocalInteracEon├──MulEInteracEon├──NoInteracEon├──PatchInteracEonModel├──Rebound└──StandardWallInteracEon
クラスは6つ基底クラスはPatchInteracEonModelクラス派生クラスはLocalInteracEonクラス、MulEInteracEonクラス、NoInteracEonクラス、Reboundクラス、StandardWallInteracEonクラス
基底クラスはPatchInteracEonModelクラスで、その他のクラスはPatchInteracEonModelクラスを継承している
Ver.2.3.x
$FOAM_SRC/lagrangian/intermediate/submodels/KinemaEc/PatchInteracEonModel
クラスの継承
classderive:publicbase
baseの基底クラスをderiveの派生クラスで継承する。
「C++の絵本」 (株)アンク 翔泳社
classLocalInteracEon:publicPatchInteracEonModel<CloudType>
LocalInterac9on.H
classMulEInteracEon:publicPatchInteracEonModel<CloudType>
Mul9Interac9on.H
classNoInteracEon:publicPatchInteracEonModel<CloudType>
NoInterac9on.H
classRebound:publicPatchInteracEonModel<CloudType>
Rebound.H
classStandardWallInteracEon:publicPatchInteracEonModel<CloudType>
StandardWallInterac9on.H
PatchInterac9onModel
$FOAM_SRC/lagrangian/intermediate/submodels/KinemaEc/PatchInteracEonModel
クラスの継承
classderive:publicbase
baseの基底クラスをderiveの派生クラスで継承する。
「C++の絵本」 (株)アンク 翔泳社
classPatchInteracEonModel:publicCloudSubModelBase<CloudType>
PatchInterac9onModel.H
PatchInteracEonModelクラス
CloudSubModelBase<CloudType>クラス
LocalInteracEonクラス
MulEInteracEonクラス
NoInteracEonクラス
Reboundクラス
StandardWallInteracEonクラス
PatchInterac9onModel
PatchInterac9onModelのクラス構造
PatchInteracEonModelクラス
UName
メンバ クラス
interacEonTypeToWord
wordToInteracEonType correct
info
virtualboolcorrectvirtualvoidinfo(Ostream&os);
virtual:仮想関数として指定(派生クラスで再定義した際に派生クラス側のメンバ関数が呼ばれるようにするため)
「C++の絵本」 (株)アンク 翔泳社
interacEonTypeToWord
wordToInteracEonType
PatchInteracEonModelではcorrect,infoは初期化している。(値として0(false)を代入する。つまり、派生クラスにおいてオーバーライドすること前提にしている。)
相互作用の型から名前に変換するクラス
名前から相互作用の型に変換するクラス
LocalInterac9onのクラス構造
PatchInteracEonModelクラス
UName
メンバ クラス
interacEonTypeToWord
wordToInteracEonType correct
info
LocalInteracEonクラス
継承
継承したメンバ オーバーライドしたメンバ
派生クラス上で定義するメンバ
UName interacEonTypeToWord
wordToInteracEonType correct
info massEscape massSEck
LocalInterac9onはmassEscape,massS9ckのメンバを定義オーバーライドしてcorrect,infoを設定
Mul9Interac9onのクラス構造
PatchInteracEonModelクラス
UName
メンバ クラス
interacEonTypeToWord
wordToInteracEonType correct
info
MulEInteracEonクラス
継承
継承したメンバ オーバーライドしたメンバ
派生クラス上で定義するメンバ
UName interacEonTypeToWord
wordToInteracEonType correct
info read
Mul9Interac9onはread,ac9veのメンバを定義オーバーライドしてcorrectを設定
acEve
NoInterac9onのクラス構造
PatchInteracEonModelクラス
UName
メンバ クラス
interacEonTypeToWord
wordToInteracEonType correct
info
NoInteracEonクラス
継承
継承したメンバ オーバーライドしたメンバ
派生クラス上で定義するメンバ
UName interacEonTypeToWord
wordToInteracEonType correct
info
Mul9Interac9onはac9veのメンバを定義オーバーライドしてcorrectを設定
acEve
Reboundのクラス構造
PatchInteracEonModelクラス
UName
メンバ クラス
interacEonTypeToWord
wordToInteracEonType correct
info
Reboundクラス
継承
継承したメンバ オーバーライドしたメンバ
派生クラス上で定義するメンバ
UName interacEonTypeToWord
wordToInteracEonType correct
info
オーバーライドしてcorrectを設定
StandardWallInterac9onのクラス構造
PatchInteracEonModelクラス
UName
メンバ クラス
interacEonTypeToWord
wordToInteracEonType correct
info
StandardWallInteracEonクラス
継承
継承したメンバ オーバーライドしたメンバ
派生クラス上で定義するメンバ
UName interacEonTypeToWord
wordToInteracEonType correct
info
オーバーライドしてcorrect,infoを設定
NoInterac9onのクラス構造
NoInteracEonクラス
継承したメンバ オーバーライドしたメンバ
派生クラス上で定義するメンバ
UName interacEonTypeToWord
wordToInteracEonType correct
info acEve
何を行っているか?以下のクラスを見ていく• correct• acEve
NoInterac9on(NoInterac9on.C)
Correctクラス
returnfalse;
falseを返し、何も行わない
ac9veクラス
returnfalse;
falseを返し、何も行わない
Rebound
Reboundクラス
継承したメンバ オーバーライドしたメンバ
派生クラス上で定義するメンバ
UName interacEonTypeToWord
wordToInteracEonType correct
info
何を行っているか?以下のクラスを見ていく• correct
Rebound(Rebound.C)
vector&U=p.U();
粒子速度データの設定
keepParEcle=true;p.acEve()=true;
初期変数の設定
vectornw;vectorUp;
新変数の作成
this->owner().patchData(p,pp,trackFracEon,tetIs,nw,Up);
patchDataよりデータ取得(patchDataはkinemaEcCloudで定義)
thisポインタ(this->)
this->記述したオブジェクトそのものを指定自分自身のオブジェクトをメンバ関数から非メンバ関数に渡す際に使用する
this->はicoUncoupledKinemaEcParcelFoamではオブジェクト名はkinemaEcCloud(元々のクラス名はbasicKinemaEcCollidingCloud)
nw(境界の法線方向単位ベクトル),Up(境界での速度)を引数として返す。
詳しくはKinemaEcCloudのスライド
Correctクラス
Rebound(Rebound.C)
U-=Up;
粒子速度データから境界速度データを引き、相対速度を計算する
境界に対する法線方向の相対速度を計算する
scalarUn=U&nw;
境界に衝突後の相対速度を計算する
if(Un>0.0){U-=UFactor_*2.0*Un*nw;}
un+1 = un − 2cun
相対速度から粒子速度へ戻す
U+=Up;
UFactor=1で完全弾性衝突UFactor<1で減衰する衝突UFactor>1で速度が増大する衝突(ありえない)
Correctクラス
StandardWallInterac9on
StandardWallInteracEonクラス
継承したメンバ オーバーライドしたメンバ
派生クラス上で定義するメンバ
UName interacEonTypeToWord
wordToInteracEonType correct
info
何を行っているか?以下のクラスを見ていく• correct• info
StandardWallInterac9on(StandardWallInterac9on.C)
vector&U=p.U();bool&acEve=p.acEve();
粒子データの設定
Correctクラス
壁面境界なら
if(isA<wallPolyPatch>(pp)){
場合分けして処理
switch(interacEonType_){casePatchInteracEonModel<CloudType>::itEscape:{...}casePatchInteracEonModel<CloudType>::itSEck:{... }casePatchInteracEonModel<CloudType>::itRebound:{...
Escape,SEck,Reboundの場合に分け、そのモデルを変更
StandardWallInterac9on(StandardWallInterac9on.C)
keepParEcle=false;acEve=false;U=vector::zero;nEscape_++;
Escapeでの処理
Correctクラス
SEckでの処理
keepParEcle=true;acEve=false;U=vector::zero;nSEck_++;
Reboundでの処理
keepParEcle=true;acEve=true;vectornw;vectorUp;this->owner().patchData(p,pp,trackFracEon,tetIs,nw,Up);U-=Up;scalarUn=U&nw;vectorUt=U-Un*nw;if(Un>0){U-=(1.0+e_)*Un*nw;}U-=mu_*Ut;U+=Up;
Reboundクラスのcorrectと処理は同じ
粒子を消し、速度を0にし、Escape数を足し合わせる
速度を0にし、SEck数を足し合わせる
acEve=falseで粒子を動かさなくなる。(粒子による境界を作るときには使用できる)
StandardWallInterac9on(StandardWallInterac9on.C)
labelnpe0=this->templategetBaseProperty<scalar>("nEscape");labelnpe=npe0+returnReduce(nEscape_,sumOp<label>());scalarmpe0=this->templategetBaseProperty<scalar>("massEscape");scalarmpe=mpe0+returnReduce(massEscape_,sumOp<scalar>());labelnps0=this->templategetBaseProperty<scalar>("nSEck");labelnps=nps0+returnReduce(nSEck_,sumOp<label>());scalarmps0=this->templategetBaseProperty<scalar>("massSEck");scalarmps=mps0+returnReduce(massSEck_,sumOp<scalar>());
ラベル,変数の設定
infoクラス
nEscapemassEscapenSEckmassSEckこれらの設定(Escapeの数、質量SEckの数、質量)
LocalInterac9on
LocalInteracEonクラス
継承したメンバ オーバーライドしたメンバ
派生クラス上で定義するメンバ
UName interacEonTypeToWord
wordToInteracEonType correct
info massEscape massSEck
何を行っているか?以下のクラスを見ていく• correct
LocalInterac9on(LocalInterac9on.C)
Correctクラス
labelpatchI=patchData_.applyToPatch(pp.index());
patchのグループを取得
粒子の情報を取得
vector&U=p.U();bool&acEve=p.acEve();
applyToPatch()はpatchInteracEonDataList.C中で定義
相互作用の型を取得
typenamePatchInteracEonModel<CloudType>::interacEonTypeit=this->wordToInteracEonType(patchData_[patchI].interacEonTypeName());
相互作用の型による分岐
switch(it){
LocalInterac9on(LocalInterac9on.C)
Correctクラス
casePatchInteracEonModel<CloudType>::itEscape:{...}casePatchInteracEonModel<CloudType>::itSEck:{...}casePatchInteracEonModel<CloudType>::itRebound:{...}
Escape,SEck,Reboundの型ごとに定義
Escape,SEck,Reboundで行うことはstandardWallInteracEonの場合と同じ
Mul9Interac9on
MulEInteracEonクラス
継承したメンバ オーバーライドしたメンバ
派生クラス上で定義するメンバ
UName interacEonTypeToWord
wordToInteracEonType correct
info read acEve
何を行っているか?以下のクラスを見ていく• correct• read• acEve
Mul9Interac9on(Mul9Interac9on.C)
Correctクラス
labelorigFacei=p.face();labelpatchi=pp.index();
粒子とpatchの情報を取得
interacted変数を初期化
boolinteracted=false;
forAll(models_,i){...}
各Patchでの(複数)モデルに対してループ
この後、coincidentBaffleInteracEon用等に実装しているが、coincidentBaffleInteracEonのクラスがない?実際にはまだMulEInteracEonモデルは使用できない?
衝突時のモデル(Rebound)
Reboundでは面(patch)に衝突した後、反発した速度を返すモデルUFactor(図中C)の係数で反発後の速度を変更できる
衝突時のモデル(S9ck)
SEckでは面(patch)に衝突した後、粒子速度を0にするモデル粒子は存在したままにする
衝突時のモデル(Escape)
Escapeでは面(patch)に衝突した後、粒子を消去するモデル流出口等で使用する
まとめ
PatchInteracEonModelあり
PatchInteracEonModelなし
LocalInteracEonクラス
MulEInteracEonクラス
NoInteracEonクラス
Reboundクラス
StandardWallInteracEonクラス
• Patchごとの定義
• 一括定義
ReboundモデルSEckモデルEscapeモデル
ReboundモデルSEckモデルEscapeモデル
MulEInteracEonは複数モデルを定義可(使用出来るかまでは解読できず)LocalInteracEonはpatchごとにモデルを変更できる
境界が壁(wall)なら