【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)

文章目录

  • 1 目标
  • 2 代码结构
    • 2.1 des_time_step外层总控制
    • 2.2 颗粒导热
      • 2.2.1 颗粒-颗粒导热:calc_force_dem.f和des_thermo_cond_mod.f
      • 2.2.2 颗粒-墙壁导热:calc_collision_wall_mod.f和des_thermo_cond_mod.f
    • 2.3 除导热外其他三种传热的控制:calc_thermo_des
      • 2.3.1 CONV_GS_DES1 对流传热量
      • 2.3.2 DES_RADIATION计算辐射量
      • 2.3.3 RXNS_GS_DES1计算反应传热
    • 2.4 总热源项置零:des_thermo_newvalues
    • 2.5 显式耦合计算传热方式(待完善)
  • 3 修改代码以输出传热量
    • 3.1 总传热量
    • 3.2 颗粒颗粒导热量
    • 3.3 颗粒墙壁导热量
    • 3.4 对流传热量和反应传热量(显式)
    • 3.5 辐射传热
  • 4 算例验证
    • 4.1 算例要求
    • 4.2 结果展示(待更正)
      • 4.2.1 总源项 des_usr_var 1
      • 4.2.2 颗粒颗粒导热 des_usr_var 2
      • 4.2.3 颗粒墙壁导热 des_usr_var 3
      • 4.2.4 对流 des_usr_var 4
      • 4.2.5 反应热 des_usr_var 5
      • 4.2.6 辐射des_usr_var 6(待更新)
  • 附录: 子程序调用关系图(显式待完善)

1 目标

分别输出mfix-dem中的颗粒的1.总传热量2.导热传热量3.对流传热量4.辐射传热量5.化学反应传热量

一共五项,存储到des_usr_var的第1到第6个数组中(后面会看到,导热分为两种:颗粒颗粒以及颗粒墙壁)。

关于des_usr_var的用法见前面的博文。

前面博文的地址:

https://blog.csdn.net/weixin_43940314/article/details/108138825

2 代码结构

首先搞清楚计算传热的大致代码结构。

计算传热方面有两条路径:隐式耦合和显式耦合。两者耦合方式我现在还没有完全弄明白,但是大概知道几点:

  1. 这里的耦合指的是气体和颗粒之间的耦合。
  2. 隐式耦合在每个固体时间步都进行传热量的耦合。但是显式耦合只在流体时间步和颗粒时间步的开始进行传热耦合。
  3. 尽管user guide上面说有传热传质和反应的模拟无法使用显式耦合,但是这个说法显然过时了。在目前的版本里是可以用的。

显然隐式的计算量要大很多,但是计算会更加精准,而且按理来说应该更容易收敛(因为传热传质每次加入的源项小了)。

调用关系图我放在附录了,可以先去瞟一眼有个大致印象。(不一定准确,是我自己debug一步步画出来的)

隐式和显式耦合计算四种传热方式的代码都是一致的。但是调用关系和路径不一样

计算四种传热量隐式耦合的路径更加清晰简单,我们就以隐式为例子。(虽然我实际计算用的显式耦合,但是我目前显式耦合的路径还没研究透彻,以后待完善)

以下要用到这几个源文件:

  1. des_time_march.f(整体控制)
  2. calc_thermo_des.f(整体控制)
  3. des_thermo_newvalues.f(总热源项置0)
  4. des_thermo_conv.f(对流相关)
  5. des_thermo_rad.f(辐射相关)
  6. rxns_gs_des1.f(反应热相关)
  7. des_thermo_cond_mod.f(导热相关)
  8. calc_force_dem.f(导热相关,颗粒之间导热)
  9. calc_collision_wall_mod.f(导热相关,颗粒-墙壁导热)

为了结构清楚,我们按照调用路径来讲解。

【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第1张图片

(下面我们主要指的都是函数或者子程序)

最外层:run_dem中调用des_time_step。这里就不多说了。

2.1 des_time_step外层总控制

次外层:des_time_step

位置des_time_march.f

【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第2张图片

关注des_time_march中的174行(颗粒颗粒导热)、178行(颗粒墙壁导热)、183行calc_thermo_des(除了导热外其他传热方式的总控制)和193行des_thermo_newvalues(把总热源项置零)

2.2 颗粒导热

导热是比较特殊的,因为它只有当颗粒相接触或者很近的时候才发生。因此把它写在了碰撞里。

分为两种:颗粒颗粒导热和颗粒墙壁导热

2.2.1 颗粒-颗粒导热:calc_force_dem.f和des_thermo_cond_mod.f

calc_force_dem.f第165-175行

QQ_TMP是存储导热量的临时变量

des_conduction是定义在 module des_thermo_cond的一个函数

【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第3张图片

进入des_thermo_cond函数,位置在des_thermo_cond_mod.f第41行

在这里插入图片描述

Fortran中的函数,传出的变量默认是与函数同名的变量,因此直接看DES_CONDUCTION这个变量的赋值语句部分,在199行

在这里插入图片描述

就是颗粒颗粒直接传热加上颗粒-流体-颗粒传热。具体传热机制请看Musser的博士论文。

根据函数头给定的信息,把形参和实参对照,可以发现实参变量LL就是颗粒I的编号,I就是颗粒J的编号。sqrt(DIST_MAG)是颗粒中心距离,PIJK(LL,5)是颗粒的相,PIJK(LL,4)是颗粒所在流体网格编号。

因此LL应该就是当前的颗粒,而I是LL的相邻的一个颗粒。假定方向为:热量从I传递给LL(可以为负号)。

注:

165-175这一段是在两个嵌套的循环内的
在这里插入图片描述
在这里插入图片描述
do_index就是颗粒的编号NP,只不过是当地变量。start_index和end_index分别是1和最后一个颗粒编号
CC就是邻域颗粒的编号。内层循环就是在邻域颗粒内循环。

2.2.2 颗粒-墙壁导热:calc_collision_wall_mod.f和des_thermo_cond_mod.f

calc_collision_wall_mod.f中
【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第4张图片

934-936行调用DES_conduction_wall函数计算导热量。这个函数同样在des_thermo_cond_mod.f里

939行把墙壁颗粒导热加入到Q_Source

2.3 除导热外其他三种传热的控制:calc_thermo_des

在calc_thermo_des.f文件的第50-64行

【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第5张图片

这段翻译一下就是

首先看是不是显式耦合的,如果是显式耦合,直接把传热量加进热源项Q_source之中

如果不是显式耦合,分别调用三个子程序计算对流传热、辐射传热和反应传热

于是我们分别看这三个调用的子程序。

2.3.1 CONV_GS_DES1 对流传热量

位置:des_thermo_conv.f

模块名:RXNS_GS_DES1_MOD

看69-88行

【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第6张图片

和之前的逻辑一样,也是个IF结构

如果是显式耦合,直接把对流传热量给到CONV_QS这个变量中

如果是隐式耦合,给到Qcv这个变量(这是个当地变量,出了子程序就会消失),然后再加和到热源项中

2.3.2 DES_RADIATION计算辐射量

位置:des_thermo_rad.f

模块名:des_radiation_mod

看67-94行

【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第7张图片

有点儿长,前面是具体的怎么计算的,着重看最后一个IF ELSE语句,也就是87-91行

【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第8张图片

MPPIC的话就多乘以一个颗粒统计重量(就是一个颗粒团中有几个实际颗粒)

不是PIC的话就直接加上辐射传热量Q_rad

2.3.3 RXNS_GS_DES1计算反应传热

在RXNS_GS_DES1.f的第188行,调用子程序calc_rrates_des

在这里插入图片描述

跳转到calc_rrates_des.f以后,找到第222行-227行,这一行是存储反应传热量的(这几行往上是计算反应传热的,这里为了简略没给出),变量为lQSource。

【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第9张图片

如果是显式耦合,把反应热赋值给RXNS_QS这个数组

如果是隐式耦合,把反应热直接加进Q_source

这里也就解释了为什么之前calc_thermo_des只有显示耦合把RXNS_QS加进去了。因为隐式耦合在这里就已经把反应热加入源项了。

2.4 总热源项置零:des_thermo_newvalues

这个文件在之前的关于des_usr_var的博客https://blog.csdn.net/weixin_43940314/article/details/108138825 中已经说过了,就是更新颗粒的温度、热源项等等热力学相关量的。和cfnewvalues类似。

这里再复述一下关键行

看第67行,这里是把热源项置为0,意思是开始新一轮计算前先情况变量。所以可以认为到此为止所有的传热量都被加进到了热源项了。这一行之前的Q_source就是总的热源项。

在这里插入图片描述

2.5 显式耦合计算传热方式(待完善)

显式耦合的路径只有每个流体时间步才计算一次热源项。

目前了解的有这么几种:

导热:和隐式完全一样,在des_time_step中(也就是每个固体时间步)调用碰撞的时候计算导热。

对流:在DES_TIME_INIT,也就是固体时间步循环的开始,流体时间步刚结束之后。在des_time_march.f的115行

【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第10张图片

反应热:在流体时间步(run_fluid),计算反应的同时调用了计算反应热的子程序。具体关系看调用关系图。中间隔了好几层有些复杂。

3 修改代码以输出传热量

注:修改源代码前先把源代码复制到自己的文件夹下。

因为导热有两种,所以一个六个变量

编号 传热方式 原本存储的变量 我们存储的变量
1 总传热量 Q_Source des_usr_var(1,:)
2 颗粒颗粒导热 DES_CONDUCTION/QQ_TMP(本地) des_usr_var(2,:)
3 颗粒墙壁导热 DES_Qw_cond(共享)/DES_CONDUCTION_WALL(共享)/QSWALL(本地) des_usr_var(3,:)
4 对流传热 CONV_Qs des_usr_var(4,:)
5 辐射传热 Qrad des_usr_var(5,:)
6 反应热 RXNS_Qs des_usr_var(6,:)

注:斜线后面标注的是本地变量,前面是共享变量(封装在module里)。加粗的是我实际使用的变量。

我们既可以把本地变量存储起来,也可以存储共享变量。不过共享变量有可能在后面某些地方会被改变,而我们不知道在哪,所以无法确定是否就真的是这个值。本地变量还有一个好处,就是不用关心它是显式还是隐式的路径,只要在实际计算的地方添加就行了。

注:添加的位置请看图中行号和上下文。

注:有些代码前面直接整个USE discretelement了,所以不用再单独添加 USE discretelement, only: des_usr_var。如果没有的话要加上。

3.1 总传热量

之前的那篇博客已经说过,这里再重复一下

  1. 在des_thermo_newvalues.f implicit none语句前添加
  !######CL_200914#######
  USE discretelement, only: des_usr_var
  !######################

如图

【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第11张图片

  1. 同一个源文件,在Q_source(:)=0前添加
         !#########CL_200912##############
         des_usr_var(1,:)=Q_source(:)
         !################################

如图
68行(大概)后
【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第12张图片

3.2 颗粒颗粒导热量

实际上还可以细分成颗粒颗粒直接导热和颗粒-流体-颗粒的间接导热,这里就合在一起了。

在calc_force_dem.f添加

              !#######CL_200912#########
              des_usr_var(2,LL)=QQ_TMP;
              !#######################

位置如图

170行后
【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第13张图片

3.3 颗粒墙壁导热量

在calc_collision_wall_mod.f添加

               !########CL_200914############
               des_usr_var(3,LL)=QSWALL
               !#############################

如图
937行后
【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第14张图片

3.4 对流传热量和反应传热量(显式)

这里有些许的不同,显式和隐式必须分开。因为即使是本地变量的存储方式也不一样。隐式的直接就在计算的位置加入到热源项里面了(所以他才只需要call子程序就行了)。

我们的算例是显式的。先添加显式。隐式有机会再测试。

在calc_thermo_des.f

  !###########CL_200912###########
     des_usr_var(4,:)=CONV_Qs
     des_usr_var(5,:)=RXNS_Qs
  !############################### 

65行后
【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第15张图片

3.5 辐射传热

辐射略有不同,显式的我没搞清楚他在哪里调用的des_conduction(或许显式压根就没算辐射?以后再研究),隐式的在前面那张图里调用了。但是不管显式还是隐式,直接存本地变量应该都没问题。

在des_thermo_rad.f

           !#########CL_200912#########
              des_usr_var(6,NP)=Qrad
           !###########################

91行后
【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第16张图片
2020-9-15补充
没有输出辐射传热,可能是mfix bug显式没有调用计算传热的代码?

由于没有发现显式耦合中调用了计算辐射的子程序,所以和朋友讨论以后决定自己调用一下

在calc_thermo_des.f中加入

 !#########CL_200915##############
 IF(any(CALC_RADT_DES)) CALL DES_RADIATION
 !#######################

如图
【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第17张图片

代码是模仿下面那一行隐式调用的。至于为什么不模仿显式调用呢?因为des_thermo_rad里面不管显式还是隐式都把辐射加入到源项了(如下图),所以只要调用,就自动加入源项。

之前des_usr_var(6,NP)那一行还是不变。这样把本地变量Qrad存储进来。
【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第18张图片

4 算例验证

4.1 算例要求

  1. 打开传热传质和化学反应
  2. 打开des_usr_var并给出数组上限(在这里是6)
  3. 如果考察墙壁导热,应该设置墙壁BC(这里给确定温度)。

一般来说我们不单独设置墙壁BC的话,默认会设置为绝热的无滑移边界,这样就不会产生任何热量交换也就看不见墙壁导热了。

4.2 结果展示(待更正)

4.2.1 总源项 des_usr_var 1

【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第19张图片

4.2.2 颗粒颗粒导热 des_usr_var 2

【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第20张图片

4.2.3 颗粒墙壁导热 des_usr_var 3

由于一开始设置算例没有设置墙壁BC,导致默认是绝热壁,因此没有值。
2020-9-15已更新,可以看到贴壁的颗粒是有传热量的。

【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第21张图片

4.2.4 对流 des_usr_var 4

【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第22张图片

4.2.5 反应热 des_usr_var 5

【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第23张图片

4.2.6 辐射des_usr_var 6(待更新)

结果验证中…

附录: 子程序调用关系图(显式待完善)

【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第24张图片

【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(待完善)_第25张图片

你可能感兴趣的:(读MFiX源代码,mfix,后处理)