Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
OpenFOAMのDEM解析の
patchInteractionModel
クラスの解読
⼤阪⼤学⼤学院基礎⼯学研究科
 博⼠3年 ⼭本卓也
OpenFOAMでのDEM	
OpenFOAM-2.0.0よりDEM解析が実装された。	
2011/6/16 	OpenFOAM-2.0.0でDEM(Discrete	Element	
	 	Method)の機能追加	
	 	(Lagrangi...
PatchInterac9onModel	
$FOAM_SRC/lagrangian/intermediate/submodels/KinemaEc/PatchInteracEonModel	
このフォルダ中にPatchInteracEonのモ...
$FOAM_SRC/lagrangian/intermediate/submodels/KinemaEc/PatchInteracEonModel	
クラスの継承	
class	derive	:	public	base	
baseの基底クラスを...
$FOAM_SRC/lagrangian/intermediate/submodels/KinemaEc/PatchInteracEonModel	
クラスの継承	
class	derive	:	public	base	
baseの基底クラスを...
PatchInterac9onModelの
クラス構造	
PatchInteracEonModelクラス	
UName	
メンバ	 クラス	
interacEonTypeToWord	
wordToInteracEonType	 correct...
LocalInterac9onのクラス構造	
PatchInteracEonModelクラス	
UName	
メンバ	 クラス	
interacEonTypeToWord	
wordToInteracEonType	 correct	
info...
Mul9Interac9onのクラス構造	
PatchInteracEonModelクラス	
UName	
メンバ	 クラス	
interacEonTypeToWord	
wordToInteracEonType	 correct	
info	...
NoInterac9onのクラス構造	
PatchInteracEonModelクラス	
UName	
メンバ	 クラス	
interacEonTypeToWord	
wordToInteracEonType	 correct	
info	
N...
Reboundのクラス構造	
PatchInteracEonModelクラス	
UName	
メンバ	 クラス	
interacEonTypeToWord	
wordToInteracEonType	 correct	
info	
Reboun...
StandardWallInterac9onのク
ラス構造	
PatchInteracEonModelクラス	
UName	
メンバ	 クラス	
interacEonTypeToWord	
wordToInteracEonType	 corre...
NoInterac9onのクラス構造	
NoInteracEonクラス	
継承したメンバ	 オーバーライド
したメンバ	
派生クラス上で
定義するメンバ	
UName	 interacEonTypeToWord	
wordToInteracEo...
NoInterac9on	(NoInterac9on.C)	
Correctクラス	
return	false;	
falseを返し、何も行わない	
ac9veクラス	
return	false;	
falseを返し、何も行わない
Rebound	
Reboundクラス	
継承したメンバ	 オーバーライド
したメンバ	
派生クラス上で
定義するメンバ	
UName	 interacEonTypeToWord	
wordToInteracEonType	 correct	
...
Rebound	(Rebound.C)	
	vector&	U	=	p.U();	
粒子速度データの設定	
	keepParEcle	=	true;	
	p.acEve()	=	true;	
初期変数の設定	
	vector	nw;	
	vec...
Rebound	(Rebound.C)	
U	-=	Up;	
粒子速度データから境界速度データを引き、相対速度を計算する	
境界に対する法線方向の相対速度を計算する	
scalar	Un	=	U	&	nw;	
境界に衝突後の相対速度を計算する	...
StandardWallInterac9on	
StandardWallInteracEonクラス	
継承したメンバ	 オーバーライド
したメンバ	
派生クラス上で
定義するメンバ	
UName	 interacEonTypeToWord	
w...
StandardWallInterac9on	
(StandardWallInterac9on.C)	
vector&	U	=	p.U();	
bool&	acEve	=	p.acEve();	
粒子データの設定	
Correctクラス	
壁面...
StandardWallInterac9on	
(StandardWallInterac9on.C)	
keepParEcle	=	false;	
acEve	=	false;	
U	=	vector::zero;	
nEscape_++;	
...
StandardWallInterac9on	
(StandardWallInterac9on.C)	
	label	npe0	=	this->template	getBaseProperty<scalar>("nEscape");	
	lab...
LocalInterac9on	
LocalInteracEonクラス	
継承したメンバ	 オーバーライド
したメンバ	
派生クラス上で
定義するメンバ	
UName	 interacEonTypeToWord	
wordToInteracEo...
LocalInterac9on	
	(LocalInterac9on.C)	
Correctクラス	
label	patchI	=	patchData_.applyToPatch(pp.index());	
patchのグループを取得	
粒子の...
LocalInterac9on	
	(LocalInterac9on.C)	
Correctクラス	
case	PatchInteracEonModel<CloudType>::itEscape:	
{...	
}	
case	PatchInt...
Mul9Interac9on	
MulEInteracEonクラス	
継承したメンバ	 オーバーライド
したメンバ	
派生クラス上で
定義するメンバ	
UName	 interacEonTypeToWord	
wordToInteracEonT...
Mul9Interac9on	
	(Mul9Interac9on.C)	
Correctクラス	
label	origFacei	=	p.face();	
label	patchi	=	pp.index();	
粒子とpatchの情報を取得	
...
衝突時のモデル(Rebound)	
Reboundでは面(patch)
に衝突した後、反発し
た速度を返すモデル	
	
UFactor(図中C)の係数
で反発後の速度を変
更できる
衝突時のモデル(S9ck)	
SEckでは面(patch)に衝
突した後、粒子速度を
0にするモデル	
	
粒子は存在したままに
する
衝突時のモデル(Escape)	
Escapeでは面(patch)に
衝突した後、粒子を消
去するモデル	
	
流出口等で使用する
まとめ	
Patch	InteracEon	Modelあり	
Patch	InteracEon	Modelなし	
LocalInteracEonクラス	
MulEInteracEonクラス	
NoInteracEonクラス	
Reboundクラ...
Upcoming SlideShare
Loading in …5
×

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

1,797 views

Published on

オープンソースであるOpenFOAMのDEM(Lagrangian)計算に使用される境界条件(patchInteractionModel)のクラス解読

Published in: Technology
  • Be the first to comment

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

  1. 1. OpenFOAMのDEM解析の patchInteractionModel クラスの解読 ⼤阪⼤学⼤学院基礎⼯学研究科  博⼠3年 ⼭本卓也
  2. 2. OpenFOAMでのDEM OpenFOAM-2.0.0よりDEM解析が実装された。 2011/6/16 OpenFOAM-2.0.0でDEM(Discrete Element Method)の機能追加 (Lagrangianライブラリが追加) 2014/2/17 OpenFOAM-2.3.0でDPM(Discrete ParEcle Modeling)が実装 MP-PIC(MulEphase ParEcle-in-Cell)法が実装 Release History OpenFOAMのDEMについてあまりdocumentがないので調査する。 粒子に働く力のモデルについて
  3. 3. PatchInterac9onModel $FOAM_SRC/lagrangian/intermediate/submodels/KinemaEc/PatchInteracEonModel このフォルダ中にPatchInteracEonのモデルが書かれている $tree -L 1 . ├── LocalInteracEon ├── MulEInteracEon ├── NoInteracEon ├── PatchInteracEonModel ├── Rebound └── StandardWallInteracEon クラスは6つ 基底クラスは PatchInteracEonModelクラス 派生クラスは LocalInteracEonクラス、MulEInteracEonクラス、 NoInteracEonクラス、Reboundクラス、 StandardWallInteracEonクラス 基底クラスはPatchInteracEonModelクラスで、その他のクラスは PatchInteracEonModelクラスを継承している Ver. 2.3.x
  4. 4. $FOAM_SRC/lagrangian/intermediate/submodels/KinemaEc/PatchInteracEonModel クラスの継承 class derive : public base baseの基底クラスをderiveの派生ク ラスで継承する。 「C++の絵本」 (株)アンク 翔泳社 class LocalInteracEon : public PatchInteracEonModel<CloudType> LocalInterac9on.H class MulEInteracEon : public PatchInteracEonModel<CloudType> Mul9Interac9on.H class NoInteracEon : public PatchInteracEonModel<CloudType> NoInterac9on.H class Rebound : public PatchInteracEonModel<CloudType> Rebound.H class StandardWallInteracEon : public PatchInteracEonModel<CloudType> StandardWallInterac9on.H PatchInterac9onModel
  5. 5. $FOAM_SRC/lagrangian/intermediate/submodels/KinemaEc/PatchInteracEonModel クラスの継承 class derive : public base baseの基底クラスをderiveの派生ク ラスで継承する。 「C++の絵本」 (株)アンク 翔泳社 class PatchInteracEonModel : public CloudSubModelBase<CloudType> PatchInterac9onModel.H PatchInteracEonModelクラス CloudSubModelBase<CloudType>クラス LocalInteracEonクラス MulEInteracEonクラス NoInteracEonクラス Reboundクラス StandardWallInteracEonクラス PatchInterac9onModel
  6. 6. PatchInterac9onModelの クラス構造 PatchInteracEonModelクラス UName メンバ クラス interacEonTypeToWord wordToInteracEonType correct info virtual bool correct virtual void info(Ostream& os); virtual: 仮想関数として指定 (派生クラスで再定義した際に派生クラス側 のメンバ関数が呼ばれるようにするため) 「C++の絵本」 (株)アンク 翔泳社 interacEonTypeToWord wordToInteracEonType PatchInteracEonModelではcorrect, infoは 初期化している。(値として0 (false)を代入 する。つまり、派生クラスにおいてオー バーライドすること前提にしている。) 相互作用の型から名前に変換するクラス 名前から相互作用の型に変換するクラス
  7. 7. LocalInterac9onのクラス構造 PatchInteracEonModelクラス UName メンバ クラス interacEonTypeToWord wordToInteracEonType correct info LocalInteracEonクラス 継承 継承したメンバ オーバーライド したメンバ 派生クラス上で 定義するメンバ UName interacEonTypeToWord wordToInteracEonType correct info massEscape massSEck LocalInterac9onはmassEscape, massS9ckのメンバを定義 オーバーライドしてcorrect, infoを設定
  8. 8. Mul9Interac9onのクラス構造 PatchInteracEonModelクラス UName メンバ クラス interacEonTypeToWord wordToInteracEonType correct info MulEInteracEonクラス 継承 継承したメンバ オーバーライド したメンバ 派生クラス上で 定義するメンバ UName interacEonTypeToWord wordToInteracEonType correct info read Mul9Interac9onはread, ac9veのメンバ を定義 オーバーライドしてcorrectを設定 acEve
  9. 9. NoInterac9onのクラス構造 PatchInteracEonModelクラス UName メンバ クラス interacEonTypeToWord wordToInteracEonType correct info NoInteracEonクラス 継承 継承したメンバ オーバーライド したメンバ 派生クラス上で 定義するメンバ UName interacEonTypeToWord wordToInteracEonType correct info Mul9Interac9onはac9veのメンバを定義 オーバーライドしてcorrectを設定 acEve
  10. 10. Reboundのクラス構造 PatchInteracEonModelクラス UName メンバ クラス interacEonTypeToWord wordToInteracEonType correct info Reboundクラス 継承 継承したメンバ オーバーライド したメンバ 派生クラス上で 定義するメンバ UName interacEonTypeToWord wordToInteracEonType correct info オーバーライドしてcorrectを設定
  11. 11. StandardWallInterac9onのク ラス構造 PatchInteracEonModelクラス UName メンバ クラス interacEonTypeToWord wordToInteracEonType correct info StandardWallInteracEonクラス 継承 継承したメンバ オーバーライド したメンバ 派生クラス上で 定義するメンバ UName interacEonTypeToWord wordToInteracEonType correct info オーバーライドしてcorrect, infoを設定
  12. 12. NoInterac9onのクラス構造 NoInteracEonクラス 継承したメンバ オーバーライド したメンバ 派生クラス上で 定義するメンバ UName interacEonTypeToWord wordToInteracEonType correct info acEve 何を行っているか? 以下のクラスを見ていく •  correct •  acEve
  13. 13. NoInterac9on (NoInterac9on.C) Correctクラス return false; falseを返し、何も行わない ac9veクラス return false; falseを返し、何も行わない
  14. 14. Rebound Reboundクラス 継承したメンバ オーバーライド したメンバ 派生クラス上で 定義するメンバ UName interacEonTypeToWord wordToInteracEonType correct info 何を行っているか? 以下のクラスを見ていく •  correct
  15. 15. Rebound (Rebound.C) vector& U = p.U(); 粒子速度データの設定 keepParEcle = true; p.acEve() = true; 初期変数の設定 vector nw; vector Up; 新変数の作成 this->owner().patchData(p, pp, trackFracEon, tetIs, nw, Up); patchDataよりデータ取得(patchDataはkinemaEcCloudで定義) thisポインタ(this->) this->記述したオブジェクトそのも のを指定 自分自身のオブジェクトをメンバ 関数から非メンバ関数に渡す際に 使用する this->はicoUncoupledKinemaEcParcelFoamではオブジェクト名はkinemaEcCloud (元々のクラス名はbasicKinemaEcCollidingCloud) nw(境界の法線方向単位ベクトル), Up(境界での速度)を引数として返す。 詳しくは KinemaEcCloud のスライド Correctクラス
  16. 16. Rebound (Rebound.C) U -= Up; 粒子速度データから境界速度データを引き、相対速度を計算する 境界に対する法線方向の相対速度を計算する scalar Un = 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クラス
  17. 17. StandardWallInterac9on StandardWallInteracEonクラス 継承したメンバ オーバーライド したメンバ 派生クラス上で 定義するメンバ UName interacEonTypeToWord wordToInteracEonType correct info 何を行っているか? 以下のクラスを見ていく •  correct •  info
  18. 18. StandardWallInterac9on (StandardWallInterac9on.C) vector& U = p.U(); bool& acEve = p.acEve(); 粒子データの設定 Correctクラス 壁面境界なら if (isA<wallPolyPatch>(pp)) { 場合分けして処理 switch (interacEonType_) { case PatchInteracEonModel<CloudType>::itEscape: {... } case PatchInteracEonModel<CloudType>::itSEck: {... } case PatchInteracEonModel<CloudType>::itRebound: {... Escape, SEck, Reboundの場合に分け、 そのモデルを変更
  19. 19. 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; vector nw; vector Up; this->owner().patchData(p, pp, trackFracEon, tetIs, nw, Up); U -= Up; scalar Un = U & nw; vector Ut = 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で粒子を動かさなく なる。 (粒子による境界を作るときには 使用できる)
  20. 20. StandardWallInterac9on (StandardWallInterac9on.C) label npe0 = this->template getBaseProperty<scalar>("nEscape"); label npe = npe0 + returnReduce(nEscape_, sumOp<label>()); scalar mpe0 = this->template getBaseProperty<scalar>("massEscape"); scalar mpe = mpe0 + returnReduce(massEscape_, sumOp<scalar>()); label nps0 = this->template getBaseProperty<scalar>("nSEck"); label nps = nps0 + returnReduce(nSEck_, sumOp<label>()); scalar mps0 = this->template getBaseProperty<scalar>("massSEck"); scalar mps = mps0 + returnReduce(massSEck_, sumOp<scalar>()); ラベル,変数の設定 infoクラス nEscape massEscape nSEck massSEck これらの設定 (Escapeの数、質量 SEckの数、質量)
  21. 21. LocalInterac9on LocalInteracEonクラス 継承したメンバ オーバーライド したメンバ 派生クラス上で 定義するメンバ UName interacEonTypeToWord wordToInteracEonType correct info massEscape massSEck 何を行っているか? 以下のクラスを見ていく •  correct
  22. 22. LocalInterac9on (LocalInterac9on.C) Correctクラス label patchI = patchData_.applyToPatch(pp.index()); patchのグループを取得 粒子の情報を取得 vector& U = p.U(); bool& acEve = p.acEve(); applyToPatch()は patchInteracEonDataList.C 中で定義 相互作用の型を取得 typename PatchInteracEonModel<CloudType>::interacEonType it = this->wordToInteracEonType ( patchData_[patchI].interacEonTypeName() ); 相互作用の型による分岐 switch (it) {
  23. 23. LocalInterac9on (LocalInterac9on.C) Correctクラス case PatchInteracEonModel<CloudType>::itEscape: {... } case PatchInteracEonModel<CloudType>::itSEck: {... } case PatchInteracEonModel<CloudType>::itRebound: {... } Escape, SEck, Reboundの型ごとに定義 Escape, SEck, Reboundで行うことはstandardWallInteracEonの場合と同じ
  24. 24. Mul9Interac9on MulEInteracEonクラス 継承したメンバ オーバーライド したメンバ 派生クラス上で 定義するメンバ UName interacEonTypeToWord wordToInteracEonType correct info read acEve 何を行っているか? 以下のクラスを見ていく •  correct •  read •  acEve
  25. 25. Mul9Interac9on (Mul9Interac9on.C) Correctクラス label origFacei = p.face(); label patchi = pp.index(); 粒子とpatchの情報を取得 interacted変数を初期化 bool interacted = false; forAll(models_, i) { ... } 各Patchでの(複数)モデルに対してループ この後、coincidentBaffleInteracEon用等に実装しているが、 coincidentBaffleInteracEonのクラスがない? 実際にはまだMulEInteracEonモデルは使用できない?
  26. 26. 衝突時のモデル(Rebound) Reboundでは面(patch) に衝突した後、反発し た速度を返すモデル UFactor(図中C)の係数 で反発後の速度を変 更できる
  27. 27. 衝突時のモデル(S9ck) SEckでは面(patch)に衝 突した後、粒子速度を 0にするモデル 粒子は存在したままに する
  28. 28. 衝突時のモデル(Escape) Escapeでは面(patch)に 衝突した後、粒子を消 去するモデル 流出口等で使用する
  29. 29. まとめ Patch InteracEon Modelあり Patch InteracEon Modelなし LocalInteracEonクラス MulEInteracEonクラス NoInteracEonクラス Reboundクラス StandardWallInteracEonクラス •  Patchごとの定義 •  一括定義 Reboundモデル SEckモデル Escapeモデル Reboundモデル SEckモデル Escapeモデル MulEInteracEonは複 数モデルを定義可 (使用出来るかまで は解読できず) LocalInteracEonは patchごとにモデルを 変更できる 境界が壁(wall)なら

×