OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

Preview:

Citation preview

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)なら

Recommended