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. 拉格朗日粒子包(parcel)入注是什么时候添加到粒子云(cloud)的

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

已定时 已固定 已锁定 已移动 OpenFOAM
8 帖子 3 发布者 5.8k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • Y 离线
    Y 离线
    yfclark 神
    写于 最后由 编辑
    #1

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

    请有研究过的大神指教

    1 条回复 最后回复
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    写于 最后由 编辑
    #2

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

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

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

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • Y 离线
    Y 离线
    yfclark 神
    写于 最后由 编辑
    #3

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

    杨英狄杨 1 条回复 最后回复
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    写于 最后由 编辑
    #4
    if (pPtr->move(td, dt)) //如果要注入的话
     {
         td.cloud().addParticle(pPtr);//添加粒子到链表List
     }
      else
     {
        delete pPtr;
    }
    

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

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

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

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • Y 离线
    Y 离线
    yfclark 神
    写于 最后由 编辑
    #5

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

    1 条回复 最后回复
  • Y 离线
    Y 离线
    yfclark 神
    写于 最后由 编辑
    #6

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

    1 条回复 最后回复
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    写于 最后由 编辑
    #7

    有始有终,感谢分享!

    :xiexie:

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • 杨英狄杨 离线
    杨英狄杨 离线
    杨英狄
    在 中回复了 yfclark 最后由 编辑
    #8

    @yfclark 你好,你这个功能实现了吗,可以请教一下如何实现的吗?

    1 条回复 最后回复

  • 登录

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