CFD中文网

    CFD中文网

    • 登录
    • 搜索
    • 最新

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

    OpenFOAM
    3
    8
    1431
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • Y
      yfclark 讲师 最后由 编辑

      有研究过拉格朗日的高手帮忙看看,我看的是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 条回复 最后回复 回复 引用
      • 李东岳
        李东岳 管理员 最后由 编辑

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

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

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

        CFD高性能服务器 http://dyfluid.com/servers.html

        1 条回复 最后回复 回复 引用
        • Y
          yfclark 讲师 最后由 编辑

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

          杨 1 条回复 最后回复 回复 引用
          • 李东岳
            李东岳 管理员 最后由 编辑

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

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

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

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

            CFD高性能服务器 http://dyfluid.com/servers.html

            1 条回复 最后回复 回复 引用
            • Y
              yfclark 讲师 最后由 编辑

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

              1 条回复 最后回复 回复 引用
              • Y
                yfclark 讲师 最后由 编辑

                大概看懂 (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 条回复 最后回复 回复 引用
                • 李东岳
                  李东岳 管理员 最后由 编辑

                  有始有终,感谢分享!

                  :xiexie:

                  CFD高性能服务器 http://dyfluid.com/servers.html

                  1 条回复 最后回复 回复 引用
                  • 杨
                    杨英狄 @yfclark 最后由 编辑

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

                    1 条回复 最后回复 回复 引用
                    • First post
                      Last post