如何将一些固体particles的体积整合成一个球形的有效parcel
-
大家好,目前遇到一个难题,希望有经验的朋友给予指导.我想将一个网格内的所有固体粒子整合(也就是得到它的想分数)后,通过球体体积公式得到一个有效半径.这其实有点儿像MPPIC里把一定数量的粒子规定为一个parcel.不同的是我希望这个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吧?
- 瞬时的还是统计上的?
-
@李东岳 李老师,怎么求解并输出随时间变化的单元网格内颗粒的总体积呢?
-
@李东岳 网格里的体积可以通过得出,因为MPPIC本身就是在通过alpha进行耦合.在得到总网格内固相粒子的总体后,怎么可以得出一个有效球体的半径呢?
-
@星星星星晴 谢谢回复.我需要生成一个新的Equivalent parcel代替原本cell中的parcel,在一个网格里,我不考虑原本粒子的位置,而只想要通过一个有效球体来代替网格内粒子的情况.这中间是等于把所有粒子平均化了,所有属性(比如:速度,密度)都是一样的.这个有效球体可以是以网格中心为原点,因为原点的速度什么的可以通过Euler插值给出,节省计算量.不知道我的想法是否可行?
-
@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带来的误差.这样的话,算不算抹去了原本粒子呢?或者说原本位置上的粒子是有的,但是没有相互作用力,是不是更准确些?
-
@Jacob-Z 你好,如果是用OpenFOAM里的求解器,那么可以直接加一行就能用求出网格内总体积分数,那么总体积也就知道了.在DPMFOAM.C或其他主程序文件中.
不知道能不能帮到你,你可以试试啊.
-
@zhe 如果我理解的没错的话,你并不是想要生成一个‘真’parcel在cell中,而是在cell中心点生成一个等效parcel,然后让真parcel来碰撞你的等效parcel,但是等效parcel是相较而言静止在cell中心点的,等效parcel的properties 是根据cell中现存的parcel的properties做平均?
-
@星星星星晴 是的.并不是形成正式的粒子,那样就完全没有意义. 是一个虚拟的等效球体, 您觉得这样的情况可以形成吗?
-
@zhe 这个没问题的,不过你用的是什么碰撞模型 deterministic 还是O Rouke
-
@星星星星晴 DEM的碰撞模型,Cundall and Strack (1979). 这个应该也叫Damped Hertzian Spring.
-
@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碰撞
-
@zhe 你看一下 deterministic 和 stochastic 区别, 你用的类似spring model,是处理碰撞结果的,软球模型还是硬球模型。
deterministic 和stochastic 是偏向于如何tracking的 -
@星星星星晴 好的,谢谢.我看一下sprayCloud,然后有问题再请教您,感谢!
-
@zhe 感谢回复!我是用的CFDEM,不知道您了不了解怎么实现这个功能呢? 另外一个题外话,你们使用DPM,MPPIC 模拟parcel与parcel(实际存在or假定存在)相较于CFDEM的4-way coupling优势是啥呢? 可以讨论一下吗? 谢谢啦
-
@星星星星晴 您好,首先谢谢回复.我看了spray里的stochastic collision model, 对于里面的code不知道理解对不对,希望您指正.像图里看到的,对于P1和P2的定义,是分别落在不同的cell[i] 和cell [j]里吗?那么这两个粒子都是虚拟的吗?
-
@zhe 不是,这个是一个cell中选取两个真parcel,我个人觉得你的想法和这个模型比较相像,有些地方你可以借用一下~
-
@Jacob-Z 不好意思,我没用过CFDEM,不好对它有什么说法.但是对于它们的比较的话,你可以直接在论坛上搜索"DEM和DPM"这个题目.很多有见地的总结在里面.希望能帮到你.
-
@星星星星晴 好的,谢谢啦.我再试试,有进展了会分享一下,谢谢您!
-
@zhe 好的 谢谢!
-
@星星星星晴 您好,我这两天都在研究您提到的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? 希望您有时间了可以回复.
-
@zhe hi 因为我也没用过你的模型,我们的collision 模型是in house的,我觉得你可以组合一下他们,我个人以为 stochastic collision model 更偏向于去寻找碰撞对,而你用的packing,damping,isotropic模型更倾向于碰撞后的处理,我没用过OF原来的模型,所以了解不深。。
或者你可以combine一下他们 -
@zhe 毕竟 Orouke 的后处理其实很简单,更偏向于硬球模型。
-
@星星星星晴 谢谢您的及时回复.那我明白了,我也是比较倾向于碰撞处理.真心感谢这几天来您的回复,帮助极大.
-
@zhe 客气啦 你在美洲?
-
@星星星星晴 没有,在英国.您也是在国外吧,看您回复的时间,都跟国内有差距.
-
@zhe 咱不用客气,邻居啊,你们刚被踢出去。
话说顺便问你个问题,你做average 的时候,是根据Nparcel做average 还是Nparticle做平均。
比如你求一个cell中 粒子的平均质量的时候。 -
@星星星星晴 我现在用的都是以parcel为计算单位的.在code里也是p.nparticle.每一个parcel里包含的particel的数量是自己的一项输入,那么就不能再以每一个particle再做计算.并且,parcel的概念本身也是为了减少计算量,如果每次平均再回到particle,那就达不到原来的目的了.
-
@星星星星晴 所以把所有的parcel(p.nparticle)总和的话,就变成你说的Nparcel了.
-
@zhe 但是这么想,如果一个cell中有n个不同size的parcel,
size(um) nParcel nParticle Average Parcel size Average Particle size 100 50 300 (100*50+175*15+500*35)/(50+15+35) (100*50*300+175*15*200+500*35*100)/(50*300+15*200+35*100) 175 15 200 251.25 175.5813953 500 35 100
-
@zhe 最终parcel的概念到底怎么搞的 我有的时候还是很迷糊。。。涉及到后处理,处理的我一头包
-
@星星星星晴 这里面是两个环节的.一开始是粒子的注入.需要在注入后计算出它在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里调用stochastic collision model, 原本它的cloudproperties里也是有这个的.但是MPPIC下面只能选择none,也就是没有办法使用,不知道你是怎么active这个的.并且现在在sprayFoam的tutorial里,也没有关于stochastic collision model的调用.你有哪个案例,能让我试着run一下吗?谢谢.
-
@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的话,就要自己研究怎么添加模型了,基本上相当于自己全程写东西了 -
@星星星星晴 明白了.我这个方法确实直接套用不上.并且碰撞模型从同一个cell扩展到周围cells之间的碰撞,还会有其他的问题.我再想想,谢谢了.以后常联络!