zoukankan      html  css  js  c++  java
  • 【读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中

  • 相关阅读:
    Android广播机制概述
    [AJAX系列]$.post(url,[data],[fn],[type])
    [AJAX系列]$.get(url,[data],[fn],[type])
    [AJAX系列]onreadystatechange事件
    [AJAX系列]XMLHttpResponse对象
    [AJAX系列]XMLHttpRequest请求
    [Ajax系列]Ajax介绍
    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:2.4:create (default-cli) on project standalone-pom: Unable to parse configuration of 3: mojo org.apache.maven.plugins:
    Failed to execute goal org.codehaus.cargo:cargo-maven2-plugin:1.2.3:run (default-cli) on project Maven_WebTest: Execution default-cli of goal org.codehaus.cargo:cargo-maven2-plugin:1.2.3:run failed: C
    The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path。
  • 原文地址:https://www.cnblogs.com/chunleili/p/12758192.html
Copyright © 2011-2022 走看看