拉格朗日粒子包(parcel)入注是什么时候添加到粒子云(cloud)的
-
有研究过拉格朗日的高手帮忙看看,我看的是DPM求解器,里面有
调用evolve求解拉格朗日过程,我一路往下追踪,具体的追踪过程为(1)求解器调用kinematicCloud.evolve() (2)进入 template<class CloudType> void Foam::KinematicCloud<CloudType>::evolve() (3)用当前的粒子云cloud创建trackData td (4)用updateCellOccupancy()将每个粒子包占用网格信息更新一遍 (5)根据InjectionModle创建injectors_ (6)入注粒子 injectors_.inject(td); (7)移动粒子云,获得粒子位置和粒子速度 td.cloud().motion(td);
我比较关心入注的粒子是怎样被添加到cloud里面的,就仔细查看了injectors的inject方法。
inject方法中涉及到的添加粒子到粒子云的代码就下面几句,但是在添加到粒子云之前,调用了移动粒子函数,如果是这样的,那么这部分被添加的粒子在injectors_.inject(td)被移动一次,然后再被 td.cloud().motion(td)移动一次,相当于移动两次,我觉得自己理解错了。if (pPtr->nParticle() >= 1.0) { parcelsAdded++; massAdded += pPtr->nParticle()*pPtr->mass(); if (pPtr->move(td, dt)) { td.cloud().addParticle(pPtr); } else { delete pPtr; } }
请有研究过的大神指教
-
大概看懂 (6)入注粒子 injectors_.inject(td);的意思了,这里给出我的个人看法:
(1)读取injectors内的信息,当前时刻为time
如果粒子入注时间SOI_<time且粒子包内粒子个数大于等于1,才准备入射
(2)根据粒子包的个数将粒子包的入射时刻切分,入射结束时间为Tend,则各个粒子包的入射时刻为timeinject=SOI_+parcelID*(Tend-SOI_)/parcelnumer
(3)并且只入射在SOI_到当前时刻的time之间的粒子包
(4)调用pPtr->move(td, dt)对这些在[SOI_,time]之间入射的粒子包的空间位置移动,得到它们在time时刻的空间位置信息
(5)将在[SOI_,time]之间入射的粒子包添加到粒子云
td.cloud().addParticle(pPtr);