Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

  1. CFD中文网
  2. OpenFOAM
  3. 如何将一些固体particles的体积整合成一个球形的有效parcel

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

已定时 已固定 已锁定 已移动 OpenFOAM
40 帖子 4 发布者 28.3k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • zheZ 离线
    zheZ 离线
    zhe
    在 中回复了 星星星星晴 最后由 编辑
    #21

    @星星星星晴 好的,谢谢啦.我再试试,有进展了会分享一下,谢谢您!

    1 条回复 最后回复
  • J 离线
    J 离线
    Jacob Z
    在 中回复了 zhe 最后由 编辑
    #22

    @zhe 好的 谢谢!

    1 条回复 最后回复
  • zheZ 离线
    zheZ 离线
    zhe
    在 中回复了 星星星星晴 最后由 编辑
    #23

    @星星星星晴 您好,我这两天都在研究您提到的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? 希望您有时间了可以回复.

    星 2 条回复 最后回复
  • 星 离线
    星 离线
    星星星星晴
    在 中回复了 zhe 最后由 编辑
    #24

    @zhe hi 因为我也没用过你的模型,我们的collision 模型是in house的,我觉得你可以组合一下他们,我个人以为 stochastic collision model 更偏向于去寻找碰撞对,而你用的packing,damping,isotropic模型更倾向于碰撞后的处理,我没用过OF原来的模型,所以了解不深。。
    或者你可以combine一下他们

    游荡

    1 条回复 最后回复
  • 星 离线
    星 离线
    星星星星晴
    在 中回复了 zhe 最后由 编辑
    #25

    @zhe 毕竟 Orouke 的后处理其实很简单,更偏向于硬球模型。

    游荡

    zheZ 1 条回复 最后回复
  • zheZ 离线
    zheZ 离线
    zhe
    在 中回复了 星星星星晴 最后由 编辑
    #26

    @星星星星晴 谢谢您的及时回复.那我明白了,我也是比较倾向于碰撞处理.真心感谢这几天来您的回复,帮助极大.

    星 1 条回复 最后回复
  • 星 离线
    星 离线
    星星星星晴
    在 中回复了 zhe 最后由 编辑
    #27

    @zhe 客气啦 你在美洲?

    游荡

    zheZ 1 条回复 最后回复
  • zheZ 离线
    zheZ 离线
    zhe
    在 中回复了 星星星星晴 最后由 编辑
    #28

    @星星星星晴 没有,在英国.您也是在国外吧,看您回复的时间,都跟国内有差距.

    星 1 条回复 最后回复
  • 星 离线
    星 离线
    星星星星晴
    在 中回复了 zhe 最后由 编辑
    #29

    @zhe 咱不用客气,邻居啊,你们刚被踢出去。
    话说顺便问你个问题,你做average 的时候,是根据Nparcel做average 还是Nparticle做平均。
    比如你求一个cell中 粒子的平均质量的时候。

    游荡

    zheZ 2 条回复 最后回复
  • zheZ 离线
    zheZ 离线
    zhe
    在 中回复了 星星星星晴 最后由 编辑
    #30

    @星星星星晴 我现在用的都是以parcel为计算单位的.在code里也是p.nparticle.每一个parcel里包含的particel的数量是自己的一项输入,那么就不能再以每一个particle再做计算.并且,parcel的概念本身也是为了减少计算量,如果每次平均再回到particle,那就达不到原来的目的了.

    星 1 条回复 最后回复
  • zheZ 离线
    zheZ 离线
    zhe
    在 中回复了 星星星星晴 最后由 编辑
    #31

    @星星星星晴 所以把所有的parcel(p.nparticle)总和的话,就变成你说的Nparcel了.

    星 1 条回复 最后回复
  • 星 离线
    星 离线
    星星星星晴
    在 中回复了 zhe 最后由 李东岳 编辑
    #32

    @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
    

    游荡

    zheZ 1 条回复 最后回复
  • 星 离线
    星 离线
    星星星星晴
    在 中回复了 zhe 最后由 编辑
    #33

    @zhe 最终parcel的概念到底怎么搞的 我有的时候还是很迷糊。。。涉及到后处理,处理的我一头包

    游荡

    1 条回复 最后回复
  • zheZ 离线
    zheZ 离线
    zhe
    在 中回复了 星星星星晴 最后由 编辑
    #34

    @星星星星晴 这里面是两个环节的.一开始是粒子的注入.需要在注入后计算出它在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();
    

    这是我的理解,不知道是不是都对,你先看看,是不是符合你的情况.

    星 1 条回复 最后回复
  • 星 离线
    星 离线
    星星星星晴
    在 中回复了 zhe 最后由 编辑
    #35

    @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,真的很头大

    游荡

    zheZ 1 条回复 最后回复
  • zheZ 离线
    zheZ 离线
    zhe
    在 中回复了 星星星星晴 最后由 李东岳 编辑
    #36

    @星星星星晴 在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);
        }
    
    星 1 条回复 最后回复
  • 星 离线
    星 离线
    星星星星晴
    在 中回复了 zhe 最后由 编辑
    #37

    @zhe 啊 我突然明白了 谢谢,这个定义总在拐弯,老了,脑子不行了

    游荡

    zheZ 1 条回复 最后回复
  • zheZ 离线
    zheZ 离线
    zhe
    在 中回复了 星星星星晴 最后由 编辑
    #38

    @星星星星晴 我想试一下在MPPIC里调用stochastic collision model, 原本它的cloudproperties里也是有这个的.但是MPPIC下面只能选择none,也就是没有办法使用,不知道你是怎么active这个的.并且现在在sprayFoam的tutorial里,也没有关于stochastic collision model的调用.你有哪个案例,能让我试着run一下吗?谢谢.

    星 1 条回复 最后回复
  • 星 离线
    星 离线
    星星星星晴
    在 中回复了 zhe 最后由 编辑
    #39

    @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的话,就要自己研究怎么添加模型了,基本上相当于自己全程写东西了

    游荡

    zheZ 1 条回复 最后回复
  • zheZ 离线
    zheZ 离线
    zhe
    在 中回复了 星星星星晴 最后由 编辑
    #40

    @星星星星晴 明白了.我这个方法确实直接套用不上.并且碰撞模型从同一个cell扩展到周围cells之间的碰撞,还会有其他的问题.我再想想,谢谢了.以后常联络!

    1 条回复 最后回复

  • 登录

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]