如何将一些固体particles的体积整合成一个球形的有效parcel
-
你好,我想和你确认一下你的问题
请问:- 瞬时的还是统计上的?
是这一 lagrangian timestep内这个cell中的Equivalent parcel diameter ?
还是euler timestep 的Equivalent parcel diameter?
还是你要得到这个一cell中统计学上的Equivalent parcel diameter?即over time
还是你需要生成一个新的Equivalent parcel代替原本cell中的parcel?
如果你给这个parcel的直径的话,of应该默认是球形的parcel吧?
- 瞬时的还是统计上的?
-
@zhe 在 如何将一些固体particles的体积整合成一个球形的有效parcel 中说:
间是等于把所有粒子平均化了,
-
如果你需要实现equivalent parcel我个人建议使用cloudfunction 来实现这样的功能,而且你需要remove 原来的parcel,在某个cloudfunction中有remove function 你可以借鉴一下。生成equaivalent parcel 需要你得到所有cell中的parcel信息,剩下就简单生成了,而且你生成的equivalent parcel 的大小也是一个问题,和cell size的关系是什么?
-
如果不考虑粒子的位置是不可能的,如果没有位置的话,就不可能tracking了啊,这就导致了以后所有的parcel的位置就在cell中心点,make no sense。我个人感觉如果按照你这个想法,不久应该是流场里面有无数个静止小球,只要对应的静止小球有相对应的relative velocity就可以了,不需要Euler Lagrangian模拟了
不知道你具体的case是什么样的,以上仅凭个人经验判断的,希望能没理解错你的意思,祝好运~
-
-
@星星星星晴 您说的对,这个应该是cloud层面的.我的想法主要是用来改善目前MPPIC中的interparticle stress.目前的这个用stress表达的并不准确,并且误差很大.如果换成纯粹的DPMFoam,那么就增大了很多计算量.所以我想,在MPPIC上,将每个网格里的粒子当做一个有效球体,与想要进入网格的粒子进行碰撞.那么也就是说,粒子本身还是parcel层面的,这样才能追踪;但同时,在进入别的网格时受到的碰撞效果由整个网格里的有效球体来实施.碰撞力根据DPM来.这样粒子就能避免目前MPPIC的inter-particle stress带来的误差.这样的话,算不算抹去了原本粒子呢?或者说原本位置上的粒子是有的,但是没有相互作用力,是不是更准确些?
-
@zhe 我可能问的不太仔细,你看一下sprayCloud里面的 stochastic collision model,就是Orouke model, 和你想用的比较像,但是他是在cell中寻找另两个真parcel,你把真p1和真p2 其中的一个换成假parcel即可。
我们这边用的是这个模型
Influence of inter‐particle collisions and agglomeration on cyclone performance and collection efficiency
Oscar Lino Sgrott Júnior Martin Sommerfeld
还有
Validation of a stochastic Lagrangian modelling approach for inter-particle collisions in homogeneous isotropic turbulence
Martin sommerfeld
https://www.sciencedirect.com/science/article/abs/pii/S0301932201000350我们也是生成一个假parcel,pp碰撞
-
@星星星星晴 您好,我这两天都在研究您提到的stochastic collision model, 帮助很大,首先谢谢您.我有一个小问题,如果在MPPIC的方法中,既然应用了inter-particle stress (packing model)再加上damping model, 那么是不是stochastic collision model就不应该并存了?或者说是不是二选一比较妥当.虽然在现在OpenFOAM自带的MPPIC的tutorials,在kinematicCloudProperties文件里,两个都显示了,但是stochastic collision model都是默认了none. 那么如果我想要在MPPIC中加入另外的碰撞的模型,还是需要关掉packing,damping,isotropic这3种 stresses? 希望您有时间了可以回复.
-
@星星星星晴 这里面是两个环节的.一开始是粒子的注入.需要在注入后计算出它在cell里的state.这个state会store下来以计算后的形式,我认为这里是parcel了.
// Define local properties at beginning of time step // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ const scalar np0 = nParticle_; const scalar mass0 = mass();
接着是追踪parcel运动过程,在这里就只是调用之前calc出来的parcels的质量了.不同zise的parcel是一直被延续的,中间是以整体形式在计算域里被计算和追踪的.
// averaging sums forAllConstIter(typename TrackCloudType, cloud, iter) { const typename TrackCloudType::parcelType& p = iter(); const tetIndices tetIs = p.currentTetIndices(); const scalar m = p.nParticle()*p.mass();
这是我的理解,不知道是不是都对,你先看看,是不是符合你的情况.
-
@zhe
这就存在问题了啊,在开始的时候 parcel的mass 就是 他的size *volume 不考虑particle.
但是比如计算这个parcel受力的时候也用的是parcel的massOpenFOAM-8/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H inline Foam::scalar Foam::KinematicParcel<ParcelType>::mass() const { return rho_*volume(); }
但是你后半部分的mass是在cloud中
OpenFOAM-8/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H
就是代表着,在cloud中,追踪的mass是parcel这个合集的mass,真的很头大
-
@星星星星晴 在KinematicCloudI.H中计算了system mass也是以parcel来计算的,这是cloud层面上的.在我上个回复里的后半段是是追踪粒子的文档里的,不是cloud怎么的. 在追踪过程里,还是以parcel为追踪项的.
template<class ParcelType> template<class TrackCloudType> inline void Foam::MPPICParcel<ParcelType>::trackingData::updateAverages ( const TrackCloudType& cloud ) { // zero the sums volumeAverage_() = 0; radiusAverage_() = 0; rhoAverage_() = 0; uAverage_() = Zero; uSqrAverage_() = 0; frequencyAverage_() = 0; massAverage_() = 0; // temporary weights autoPtr<AveragingMethod<scalar>> weightAveragePtr ( AveragingMethod<scalar>::New ( IOobject ( cloud.name() + ":weightAverage", cloud.db().time().timeName(), cloud.mesh() ), cloud.solution().dict(), cloud.mesh() ) ); AveragingMethod<scalar>& weightAverage = weightAveragePtr(); // averaging sums forAllConstIter(typename TrackCloudType, cloud, iter) { const typename TrackCloudType::parcelType& p = iter(); const tetIndices tetIs = p.currentTetIndices(); const scalar m = p.nParticle()*p.mass(); volumeAverage_->add(p.coordinates(), tetIs, p.nParticle()*p.volume()); rhoAverage_->add(p.coordinates(), tetIs, m*p.rho()); uAverage_->add(p.coordinates(), tetIs, m*p.U()); massAverage_->add(p.coordinates(), tetIs, m); }
-
@zhe 我没有,而且MPPIC调用的是kinematicCloud,stochastic collision model中的很多properties是无法调用的比如下面这一段涉及到thermo的地方就是没有办法调用的。
bool massChanged = collideParcels(dt, p1, p2, m1, m2); if (massChanged) { if (m1 > rootVSmall) { const scalarField X(liquids_.X(p1.Y())); p1.setCellValues(this->owner(), td); p1.rho() = liquids_.rho(td.pc(), p1.T(), X); p1.Cp() = liquids_.Cp(td.pc(), p1.T(), X); p1.sigma() = liquids_.sigma(td.pc(), p1.T(), X); p1.mu() = liquids_.mu(td.pc(), p1.T(), X); p1.d() = cbrt(6.0*m1/(p1.nParticle()*p1.rho()*pi)); } if (m2 > rootVSmall) { const scalarField X(liquids_.X(p2.Y())); p2.setCellValues(this->owner(), td); p2.rho() = liquids_.rho(td.pc(), p2.T(), X); p2.Cp() = liquids_.Cp(td.pc(), p2.T(), X); p2.sigma() = liquids_.sigma(td.pc(), p2.T(), X); p2.mu() = liquids_.mu(td.pc(), p2.T(), X); p2.d() = cbrt(6.0*m2/(p2.nParticle()*p2.rho()*pi)); } }
Tut中的aachenbomb 在 stochastic collisionmodel 设置一个banana 就能看到Valid model了。
stochasticcollision model是spraycloud独有的。 而kinematiccloud中的collisionmodel 更多的倾向于是关于软硬球的处理,而且应该用的是deterministic tracking method。
所以如果你要在MPPIC下使用stochasticcollisionmodel的话,就要自己研究怎么添加模型了,基本上相当于自己全程写东西了