【读MFiX源代码】2 读time march loop(dt_loop)(仍在mfix.f)
上次总结
- mfix.f是程序入口
- mfix.f的入口在PROGRAM MFIX 而program mfix的主要作用是调用了run_mfix
run_mfix的主要步骤
- CALL GET_DATA(MFIX_DAT) 读取deck文件,包括设定几何,BC,IC位置
- CALL INITIALIZE(MFIX_DAT) 初始化
- 进行Time march loop,即dt_loop
- 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
忽略不重要的部分
主要做了这几件事
- CALL TIME_STEP_INIT(MFIX_DAT)初始化时间步
- 进行一个DO循环
- CALL CHECK_LOW_DT 检查dt是否过低,与发散有关
- CALL CHEM_MASS与刚性化学反应有关,应该是考虑反应后气体产物的质量增加
这个DO循环是主体
它主要做
- CALL TIME_STEP_INIT(MFIX_DAT)初始化时间步
- 嵌套又一个DO循环
- CALL POST_ITERATE进行循环后续步骤
嵌套的DO循环是主体
DO WHILE (NIT<MAX_NIT .AND. .NOT.(CONVERGED.OR.DIVERGED))
循环控制调节是NIT小于MAX_NIT,而且没有收敛或者发散
这个嵌套的循环主要就做了两件事
- 先NIT = NIT + 1
- 再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结构一样的
最外层也是做了三件事
- CALL DES_TIME_INIT开始前准备
- DO循环
- 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中