openfoamのdem解析のpatchinteractionmodelクラスの解読

29
OpenFOAMのDEM解析の patchInteractionModel クラスの解読 ⼤阪⼤学⼤学院基礎⼯学研究科 博⼠3年 ⼭本卓也

Upload: takuya-yamamoto

Post on 17-Jan-2017

407 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

OpenFOAMのDEM解析のpatchInteractionModel

クラスの解読

⼤阪⼤学⼤学院基礎⼯学研究科 博⼠3年 ⼭本卓也

Page 2: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

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がないので調査する。

粒子に働く力のモデルについて

Page 3: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

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

Page 4: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

$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

Page 5: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

$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

Page 6: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

PatchInterac9onModelのクラス構造

PatchInteracEonModelクラス

UName

メンバ クラス

interacEonTypeToWord

wordToInteracEonType correct

info

virtualboolcorrectvirtualvoidinfo(Ostream&os);

virtual:仮想関数として指定(派生クラスで再定義した際に派生クラス側のメンバ関数が呼ばれるようにするため)

「C++の絵本」 (株)アンク 翔泳社

interacEonTypeToWord

wordToInteracEonType

PatchInteracEonModelではcorrect,infoは初期化している。(値として0(false)を代入する。つまり、派生クラスにおいてオーバーライドすること前提にしている。)

相互作用の型から名前に変換するクラス

名前から相互作用の型に変換するクラス

Page 7: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

LocalInterac9onのクラス構造

PatchInteracEonModelクラス

UName

メンバ クラス

interacEonTypeToWord

wordToInteracEonType correct

info

LocalInteracEonクラス

継承

継承したメンバ オーバーライドしたメンバ

派生クラス上で定義するメンバ

UName interacEonTypeToWord

wordToInteracEonType correct

info massEscape massSEck

LocalInterac9onはmassEscape,massS9ckのメンバを定義オーバーライドしてcorrect,infoを設定

Page 8: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

Mul9Interac9onのクラス構造

PatchInteracEonModelクラス

UName

メンバ クラス

interacEonTypeToWord

wordToInteracEonType correct

info

MulEInteracEonクラス

継承

継承したメンバ オーバーライドしたメンバ

派生クラス上で定義するメンバ

UName interacEonTypeToWord

wordToInteracEonType correct

info read

Mul9Interac9onはread,ac9veのメンバを定義オーバーライドしてcorrectを設定

acEve

Page 9: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

NoInterac9onのクラス構造

PatchInteracEonModelクラス

UName

メンバ クラス

interacEonTypeToWord

wordToInteracEonType correct

info

NoInteracEonクラス

継承

継承したメンバ オーバーライドしたメンバ

派生クラス上で定義するメンバ

UName interacEonTypeToWord

wordToInteracEonType correct

info

Mul9Interac9onはac9veのメンバを定義オーバーライドしてcorrectを設定

acEve

Page 10: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

Reboundのクラス構造

PatchInteracEonModelクラス

UName

メンバ クラス

interacEonTypeToWord

wordToInteracEonType correct

info

Reboundクラス

継承

継承したメンバ オーバーライドしたメンバ

派生クラス上で定義するメンバ

UName interacEonTypeToWord

wordToInteracEonType correct

info

オーバーライドしてcorrectを設定

Page 11: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

StandardWallInterac9onのクラス構造

PatchInteracEonModelクラス

UName

メンバ クラス

interacEonTypeToWord

wordToInteracEonType correct

info

StandardWallInteracEonクラス

継承

継承したメンバ オーバーライドしたメンバ

派生クラス上で定義するメンバ

UName interacEonTypeToWord

wordToInteracEonType correct

info

オーバーライドしてcorrect,infoを設定

Page 12: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

NoInterac9onのクラス構造

NoInteracEonクラス

継承したメンバ オーバーライドしたメンバ

派生クラス上で定義するメンバ

UName interacEonTypeToWord

wordToInteracEonType correct

info acEve

何を行っているか?以下のクラスを見ていく•  correct•  acEve

Page 13: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

NoInterac9on(NoInterac9on.C)

Correctクラス

returnfalse;

falseを返し、何も行わない

ac9veクラス

returnfalse;

falseを返し、何も行わない

Page 14: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

Rebound

Reboundクラス

継承したメンバ オーバーライドしたメンバ

派生クラス上で定義するメンバ

UName interacEonTypeToWord

wordToInteracEonType correct

info

何を行っているか?以下のクラスを見ていく•  correct

Page 15: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

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クラス

Page 16: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

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クラス

Page 17: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

StandardWallInterac9on

StandardWallInteracEonクラス

継承したメンバ オーバーライドしたメンバ

派生クラス上で定義するメンバ

UName interacEonTypeToWord

wordToInteracEonType correct

info

何を行っているか?以下のクラスを見ていく•  correct•  info

Page 18: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

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の場合に分け、そのモデルを変更

Page 19: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

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で粒子を動かさなくなる。(粒子による境界を作るときには使用できる)

Page 20: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

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の数、質量)

Page 21: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

LocalInterac9on

LocalInteracEonクラス

継承したメンバ オーバーライドしたメンバ

派生クラス上で定義するメンバ

UName interacEonTypeToWord

wordToInteracEonType correct

info massEscape massSEck

何を行っているか?以下のクラスを見ていく•  correct

Page 22: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

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){

Page 23: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

LocalInterac9on(LocalInterac9on.C)

Correctクラス

casePatchInteracEonModel<CloudType>::itEscape:{...}casePatchInteracEonModel<CloudType>::itSEck:{...}casePatchInteracEonModel<CloudType>::itRebound:{...}

Escape,SEck,Reboundの型ごとに定義

Escape,SEck,Reboundで行うことはstandardWallInteracEonの場合と同じ

Page 24: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

Mul9Interac9on

MulEInteracEonクラス

継承したメンバ オーバーライドしたメンバ

派生クラス上で定義するメンバ

UName interacEonTypeToWord

wordToInteracEonType correct

info read acEve

何を行っているか?以下のクラスを見ていく•  correct•  read•  acEve

Page 25: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

Mul9Interac9on(Mul9Interac9on.C)

Correctクラス

labelorigFacei=p.face();labelpatchi=pp.index();

粒子とpatchの情報を取得

interacted変数を初期化

boolinteracted=false;

forAll(models_,i){...}

各Patchでの(複数)モデルに対してループ

この後、coincidentBaffleInteracEon用等に実装しているが、coincidentBaffleInteracEonのクラスがない?実際にはまだMulEInteracEonモデルは使用できない?

Page 26: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

衝突時のモデル(Rebound)

Reboundでは面(patch)に衝突した後、反発した速度を返すモデルUFactor(図中C)の係数で反発後の速度を変更できる

Page 27: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

衝突時のモデル(S9ck)

SEckでは面(patch)に衝突した後、粒子速度を0にするモデル粒子は存在したままにする

Page 28: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

衝突時のモデル(Escape)

Escapeでは面(patch)に衝突した後、粒子を消去するモデル流出口等で使用する

Page 29: OpenFOAMのDEM解析のpatchInteractionModelクラスの解読

まとめ

PatchInteracEonModelあり

PatchInteracEonModelなし

LocalInteracEonクラス

MulEInteracEonクラス

NoInteracEonクラス

Reboundクラス

StandardWallInteracEonクラス

•  Patchごとの定義

•  一括定義

ReboundモデルSEckモデルEscapeモデル

ReboundモデルSEckモデルEscapeモデル

MulEInteracEonは複数モデルを定義可(使用出来るかまでは解読できず)LocalInteracEonはpatchごとにモデルを変更できる

境界が壁(wall)なら