拉格朗日粒子包(parcel)入注是什么时候添加到粒子云(cloud)的


  • OpenFOAM讲师

    有研究过拉格朗日的高手帮忙看看,我看的是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;
                            }
                        }
    

    请有研究过的大神指教



  • inject方法中涉及到的添加粒子到粒子云的代码就下面几句,但是在添加到粒子云之前,调用了移动粒子函数,

    你是说if (pPtr->move(td, dt)),这个是判断语句吧?

    你要用拉格朗日模拟什么工况?


  • OpenFOAM讲师

    我想改injection模型,每个时间步更新一次injectors_,就是每次入射的粒子包的信息都不是相同的,需要一些欧拉场信息来确定,对的东岳老师研究过这个吗,if (pPtr->move(td, dt))和之后的添加粒子到粒子包是什么意思?



  • if (pPtr->move(td, dt)) //如果要注入的话
     {
         td.cloud().addParticle(pPtr);//添加粒子到链表List
     }
      else
     {
        delete pPtr;
    }
    

    我正在用欧拉拉格朗日模拟气泡流,正找人整理数据写文章呢。不过你这部分没研究过。粗略看了一下,大体是这个意思。

    每个时间步更新一次injectors_,就是每次入射的粒子包的信息都不是相同的,需要一些欧拉场信息来确定,

    我觉得你不需要改上面的内容


  • OpenFOAM讲师

    谢谢东岳老师,我再仔细看看这部分代码@东岳


  • OpenFOAM讲师

    大概看懂 (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);



  • 有始有终,感谢分享!

    :xiexie:


Log in to reply