如何将一些固体particles的体积整合成一个球形的有效parcel



  • 大家好,目前遇到一个难题,希望有经验的朋友给予指导.我想将一个网格内的所有固体粒子整合(也就是得到它的想分数)后,通过球体体积公式得到一个有效半径.这其实有点儿像MPPIC里把一定数量的粒子规定为一个parcel.不同的是我希望这个parcel是球形的,可用来计算半径的.谢谢大家!



  • 把网格内所有颗粒的体积求出,加和,然后反求球的半径?



  • 你好,我想和你确认一下你的问题
    请问:

    1. 瞬时的还是统计上的?
      是这一 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 中说:

    间是等于把所有粒子平均化了,

    1. 如果你需要实现equivalent parcel我个人建议使用cloudfunction 来实现这样的功能,而且你需要remove 原来的parcel,在某个cloudfunction中有remove function 你可以借鉴一下。生成equaivalent parcel 需要你得到所有cell中的parcel信息,剩下就简单生成了,而且你生成的equivalent parcel 的大小也是一个问题,和cell size的关系是什么?

    2. 如果不考虑粒子的位置是不可能的,如果没有位置的话,就不可能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或其他主程序文件中.
    Screenshot from 2020-11-19 16-29-57.png

    不知道能不能帮到你,你可以试试啊.



  • @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优势是啥呢? 可以讨论一下吗? 谢谢啦:135:



  • @星星星星晴 您好,首先谢谢回复.我看了spray里的stochastic collision model, 对于里面的code不知道理解对不对,希望您指正.像图里看到的,对于P1和P2的定义,是分别落在不同的cell[i] 和cell [j]里吗?那么这两个粒子都是虚拟的吗?
    Screenshot from 2020-11-20 11-03-17.png



  • @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,
    af1a172d-e785-40d7-acb0-df2b4dad7f21-image.png

    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的mass

    OpenFOAM-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之间的碰撞,还会有其他的问题.我再想想,谢谢了.以后常联络!


Log in to reply