【读MFiX源代码】2 读time march loop(dt_loop)(仍在mfix.f)

上次总结

  1. mfix.f是程序入口
  2. mfix.f的入口在PROGRAM MFIX 而program mfix的主要作用是调用了run_mfix

run_mfix的主要步骤

  1. CALL GET_DATA(MFIX_DAT) 读取deck文件,包括设定几何,BC,IC位置
  2. CALL INITIALIZE(MFIX_DAT) 初始化
  3. 进行Time march loop,即dt_loop
  4. CALL FINALIZE结束运行

time march loop是最关键的步骤,在此处选择了运行的类型:fluid, dem 还是pic
分别对应run_fluid, run_dem和run_pic
其中run_fluid是每种类型都要先运行的

Time march loop

本章仍然在mfix.f内,主要读time march loop

dt_loop: DO WHILE (TIME + 0.1d0*DT < TSTOP)

开始,到

ENDDO dt_loop

结束

首先来看do while那一行
循环是由time控制的,每次增进0.1*DT,一直到大于等于TSTOP结束

         IF(DES_CONTINUUM_COUPLED .OR. .NOT.DISCRETE_ELEMENT) THEN
            call run_fluid
         ENDIF

如果是非离散单元法,或者是离散单元法但耦合了流体相,那么运行 run_fluid

         IF (DEM_SOLIDS) THEN
            call run_dem
            IF(.NOT.DES_CONTINUUM_COUPLED) EXIT
            IF (CHECK_EXIT_FLAG()) THEN
               CALL TIME_STEP_END
               EXIT
            ENDIF
         ENDIF

如果DEM_SOLIDS为真,那么运行run_dem
check_exit_flag等行忽略掉,与批运行有关系

         IF (PIC_SOLIDS) THEN
            call run_pic
            IF(.NOT.DES_CONTINUUM_COUPLED) EXIT
            IF (CHECK_EXIT_FLAG()) THEN
               CALL TIME_STEP_END
               EXIT
            ENDIF
         ENDIF

如果PIC_SOLIDS为真,则运行run_pic

run_mfix contains了run_fluid, run_dem, run_pic这三个subroutine

run_fluid

首先看run_fluid

 subroutine run_fluid
         STARTTIME = WALL_TIME()
         CALL TIME_STEP_INIT(MFIX_DAT)
         DO
            CALL ITERATE_INIT
            DO WHILE (NIT<MAX_NIT .AND. .NOT.(CONVERGED.OR.DIVERGED))
               NIT = NIT + 1
               CALL DO_ITERATION(MFIX_DAT)
               IF (CHECK_EXIT_FLAG()) RETURN
               CALL WAIT_WHILE_PAUSED
            ENDDO
            CALL POST_ITERATE
            IF (STEADY_STATE) EXIT
            IF (.NOT.ADJUSTDT(MFIX_DAT)) EXIT
         ENDDO

! Exit if DT < DT_MIN
         CALL CHECK_LOW_DT
         IF (CHECK_EXIT_FLAG()) RETURN

! Stiff Chemistry Solver.
         CALL CHEM_MASS
         IF (CHECK_EXIT_FLAG()) RETURN
         CALL PRINT_WALLTIME("Timestep walltime, fluid solver:", STARTTIME)
      end subroutine run_fluid

忽略不重要的部分
主要做了这几件事

  1. CALL TIME_STEP_INIT(MFIX_DAT)初始化时间步
  2. 进行一个DO循环
  3. CALL CHECK_LOW_DT 检查dt是否过低,与发散有关
  4. CALL CHEM_MASS与刚性化学反应有关,应该是考虑反应后气体产物的质量增加

这个DO循环是主体
它主要做

  1. CALL TIME_STEP_INIT(MFIX_DAT)初始化时间步
  2. 嵌套又一个DO循环
  3. CALL POST_ITERATE进行循环后续步骤

嵌套的DO循环是主体

DO WHILE (NIT<MAX_NIT .AND. .NOT.(CONVERGED.OR.DIVERGED))

循环控制调节是NIT小于MAX_NIT,而且没有收敛或者发散

这个嵌套的循环主要就做了两件事

  1. 先NIT = NIT + 1
  2. 再CALL DO_ITERATION(MFIX_DAT)

显然重点在第2步

剖析DO_ITERATION(MFIX_DAT)我们下期再说,先说run_dem

run_dem

      subroutine run_dem
         STARTTIME = WALL_TIME()
         CALL DES_TIME_INIT
         DO II = 1, FACTOR
            CALL DES_TIME_STEP(II)
            IF (MOD(factor-II, 10) == 0) THEN
               CALL CHECK_BATCH_QUEUE_END(EXIT_FLAG)
               EXIT_LOOP = EXIT_LOOP .OR. EXIT_FLAG
            ENDIF
            IF ( EXIT_LOOP ) EXIT
            CALL WAIT_WHILE_PAUSED
         ENDDO
         CALL DES_TIME_END
         CALL PRINT_WALLTIME("Timestep walltime, DEM solver:", STARTTIME)
      end subroutine run_dem

      subroutine run_pic
! number of PIC time steps
         Integer :: PIC_ITERS

         STARTTIME = WALL_TIME()
         CALL PIC_TIME_INIT

基本上是与run_fluid结构一样的

最外层也是做了三件事

  1. CALL DES_TIME_INIT开始前准备
  2. DO循环
  3. CALL DES_TIME_END结束后步骤

这个DO循环主要就做了一件事

  CALL DES_TIME_STEP(II)

循环的控制条件

DO II = 1, FACTOR

这个循环变量II传入了 des_time_step之中

gdb调试查看完整运行过程

所用算例
我所运行的算例是自己设置的,带热解和气化反应的拟2D DEM模拟
https://github.com/chunleili/Yin_0413_git_sync_case

从进入dt_loop开始,每一步都是按一次F10,或者是在gdb里输入一次next

在这里插入图片描述

在这里插入图片描述
判断是否暂停
在这里插入图片描述
在这里插入图片描述
计算流体相
在这里插入图片描述
这一步在终端产生的信息为
在这里插入图片描述
然后判断是否为DEM
在这里插入图片描述
在这里插入图片描述
终端输出
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后回到dt_loop
在这里插入图片描述


注:在特定的迭代步会输出
在这里插入图片描述
就像gif里那样。
目前我还没找到具体是哪一步输出的。但可以肯定的是不是每一个迭代步都会输出这个信息。

总结

本期结束,下次讲DO_ITERATION 和 DES_TIME_STEP,分别是run_fluid和run_dem的主要步骤

do_iterate在iterate 这个module里面位于iterate.f源文件中
des_time_step在MODULE DES_TIME_MARCH中,位于源文件des_time_march.f中

原文地址:https://www.cnblogs.com/chunleili/p/12758192.html