文章目录

  • 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
    • 4.3 验证结果分析
  • 附录: 子程序调用关系图(显式待完善)
    • 2020-10-28:出现问题,总传热量不等于五项和
    • 2020-10-29:问题有可能出在输出时刻不同上
  • 补充3:输出传热时刻S_TIME
    • 操作方法
    • 结果
  • 源代码下载
    • 第1版
    • 第2版

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(导热相关,颗粒-墙壁导热)

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

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

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

2.1 des_time_step外层总控制

次外层:des_time_step

位置des_time_march.f

关注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的一个函数

进入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(可以为负号)。

2020-09-17补充
偶然在des_granular_temperature.f中发现了PIJK数组的用法

第一个下标指的是颗粒编号。第二个下标从1到5分别代表:网格I编号J编号K编号,IJK编号,最后是相编号。

注:

165-175这一段是在两个嵌套的循环内的


do_index就是颗粒的编号NP,只不过是当地变量。start_index和end_index分别是1和最后一个颗粒编号
CC就是邻域颗粒的编号。内层循环就是在邻域颗粒内循环。

2021-5-10补充
目前碰撞导热的时间问题还没有弄清楚。
其他几种传热形式如热对流等均为连续的传热,因此没有时间的问题。只要统一用W做单位,在能量方程里取单位时间的传热量就行了
然而碰撞导热是离散的,只在碰撞期间传热。因此就出现时间的问题。
目前可以确定的是,从des_thermo_cond_mod.f中计算的DES_CONDUCTION函数的值,得到的是单位时间的传热量
如图所示

可见注释中明确标注了是Rate。

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

calc_collision_wall_mod.f中

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

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

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

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

这段翻译一下就是

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

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

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

2.3.1 CONV_GS_DES1 对流传热量

位置:des_thermo_conv.f

模块名:RXNS_GS_DES1_MOD

看69-88行

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

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

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

2.3.2 DES_RADIATION计算辐射量

位置:des_thermo_rad.f

模块名:des_radiation_mod

看67-94行

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

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。

如果是显式耦合,把反应热赋值给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行

反应热:在流体时间步(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 反应热 RXNS_Qs des_usr_var(5,:)
6 辐射传热 Qrad 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!######################

如图

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

如图
68行(大概)后

3.2 颗粒颗粒导热量

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

在calc_force_dem.f添加

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

位置如图

170行后

3.3 颗粒墙壁导热量

在calc_collision_wall_mod.f添加

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

如图
937行后

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

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

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

在calc_thermo_des.f

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

65行后

3.5 辐射传热

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

在des_thermo_rad.f

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

91行后

2020-9-15补充
没有输出辐射传热,可能是mfix bug显式没有调用计算传热的代码?

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

在calc_thermo_des.f中加入

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

如图

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

之前des_usr_var(6,NP)那一行还是不变。这样把本地变量Qrad存储进来。

4 算例验证

4.1 算例要求

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

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

4.2 结果展示(待更正)

4.2.1 总源项 des_usr_var 1

4.2.2 颗粒颗粒导热 des_usr_var 2

4.2.3 颗粒墙壁导热 des_usr_var 3

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

4.2.4 对流 des_usr_var 4

4.2.5 反应热 des_usr_var 5

4.2.6 辐射des_usr_var 6

2020-9-17
这个就是自己手动在calc_thermo_des.f里面的显式耦合路径下调用辐射子程序的结果

4.3 验证结果分析

在某一瞬时时刻,对某一生物质颗粒,加和各个输出传热。

做平均传热量(所有生物质颗粒平均)随不同时刻变化线图
先mark一下,以后有空再做。

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

2020-10-28:出现问题,总传热量不等于五项和

测试了一下,发现了一些问题。主要就是总传热量并不等于后面五项之和

下面这个表格表示的是所有颗粒的各项传热,对全体颗粒平均后,随时间的输出。

sum2to6表示后面五项之和,最后一列表示五项之和减去总传热量
标黄的表示差值的绝对值大于1E-6的,标红的表示大于1E-4(总传热的量级在1E-4左右)

标黄的占了1951个,标红的占了15个

可见总传热量绝对不等于后面几种传热量之和!

这里因为没把墙壁设为定温BC所以没有墙壁颗粒导热。
问题出在哪呢?目前还没找到解决方案

2020-10-29:问题有可能出在输出时刻不同上

看这篇的最后结果

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


时刻还是存储到des_usr_var当中
在这里插入图片描述从左到右依次为:
颗粒编号,
总传热计算时间,
导热计算实际,
与墙壁导热计算时间(因为没开墙壁导热所以没计算),
对流换热计算时间,
反应热计算时间,
辐射热计算时间
总传热计算时间减去导热计算时间

发现其他几项都还好,导热相差时间很大!
计算总传热量和计算导热的时间差了几十秒

补充3:输出传热时刻S_TIME

操作方法

编号 传热方式 原本存储的变量 传热存储的变量 传热时间S_TIME存储序号
1 总传热量 Q_Source des_usr_var(1,:) 13
2 颗粒颗粒导热 QQ_TMP(本地) des_usr_var(2,:) 14
3 颗粒墙壁导热 QSWALL(本地) des_usr_var(3,:) 15
4 对流传热 CONV_Qs des_usr_var(4,:) 16
5 反应热 RXNS_Qs des_usr_var(5,:) 17
6 辐射传热 Qrad des_usr_var(6,:) 18

增加传热时间输出量S_TIME
仍然采用des_usr_var的方式

在每个源代码前面增加导入模块
增加代码如图
1 Q_source处

2 QQ_TMP处

3 QSWALL处

4和5 CONV_QS和 RXNS_QS处

6 Qrad处

结果

这是在t=5.00s的时候的生物质颗粒的情况

可以看见,7001所有时刻均一致
但是7002开始,均有变化。而且16\17\18总是和13保持一致,但是14和15常常和13差距很大

也就是说,两种导热–颗粒的碰撞导热(QQ_TMP)和颗粒与墙壁的接触导热(QSWALL),与其他时间不能保持一致。

这也是应该的,因为碰撞发生的时间是随机的,间断的。而对流、辐射、反应是无时无刻不在发生的。

所以这也是为什么碰撞导热的时刻总是小于总传热的时间(13)。因为加和总传热值的时候,只能考虑到前面发生了的碰撞。

有些颗粒甚至15(QSWALL)为0,证明它从未与墙壁接触过。

源代码下载

第1版

9个源文件
链接:https://pan.baidu.com/s/1O0NNRTBh62H40IsNiOa72Q
提取码:abcd

第2版

输出传热所需时间后的源代码(2020-10-29)

链接:https://pan.baidu.com/s/1VODCZ3xwgG3s3Vwkp3hCrg
提取码:nqcs

【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(2020-12-15更新)相关推荐

  1. 计算机系统的四种启动方式是,详解电脑为何有四种不同的启动设备教程

    通常我们开机的时候都是按F2进BIOS的boot菜单设置启动优先级,或者说开机按F12在启动菜单选择启动设备,下面小编就为大家讲解有关启动设备的教程. 首先我们知道电脑是由很多部件组成的,什么CPU, ...

  2. 华人科学家发现第四种传热方式!真空声子传热将改写物理教科书

    早在上中学时,我们就知道传热一共有三种方式,热传导.热对流.热辐射.如今,这一教科书上的知识要被改写了. 近期,一篇发表在<自然>杂志上的论文让不少传热学.物理学.量子力学等领域的科学家们 ...

  3. 计算机曝光模式有哪些,摄影:单反相机中P、A、S、M四种曝光模式的用法详解 -电脑资料...

    这篇教程是向脚本之家的朋友介绍单反相机中P.A.S.M四种曝光模式的用法,对于摄影爱好者非常值得学习,推荐到脚本之家,喜欢的朋友一起来看看吧 很多朋友在初接触单反相机时对相机的P.A.S.M四种曝光模 ...

  4. python可变参数_Python 的四种共享传参详解

    点击上方"Python数据之道",选择"星标公众号" 精品文章,第一时间送达 作者 | 杨仁聪 编辑 | Lemon 出品 | Python数据之道 本文来自公 ...

  5. Plotly中4种文本类型设置详解

    作者:Lemon 来源:Python数据之道 Plotly中4种文本类型设置详解 大家好,我是 Lemon . 在过去的一段时间里,我写了几篇用 Python 的交互式可视化工具 Plotly 来演示 ...

  6. php读音量大小,Android_Android中实时获取音量分贝值详解,基础知识 度量声音强度,大 - phpStudy...

    Android中实时获取音量分贝值详解 基础知识 度量声音强度,大家最熟悉的单位就是分贝(decibel,缩写为dB).这是一个无纲量的相对单位,计算公式如下: 分子是测量值的声压,分母是参考值的声压 ...

  7. C++中四种类型转换方式

    C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a,但是c 风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型 ...

  8. Burp Suite爆破模块中的四种模式的区别详解和演示(暴力破解)

    BrupSuite爆破的四种模式详解 最近看了好多关于暴力破解的博客,其中用的最多的工具就是bp了,但是好多都是一上来给了执行步骤,却没有对爆破的这几个模式选择进行解释,所以今天萌新写个纪录,来阐明这 ...

  9. spi协议时序图和四种模式实际应用详解

    大家好,我是无际. 上个章节我们讲解了spi接口定义,今天我们更加深入讲解下spi协议时序图和spi四种模式的用法. 刚开始接触单片机开发时,最怕就是看时序图,对于我来说就是奇怪的知识. 特别是SPI ...

最新文章

  1. Java学习总结:39(反射机制)
  2. jquery-- json字符串没有自动包装为 json对象
  3. Mallet机器语言工具包-入门测试
  4. php访问服务器文件路径,PHP与服务器文件系统的简单交互
  5. 免费直播| TDD如何颠覆了我对开发的认知?
  6. HDU2000 ASCII码排序【字符排序】
  7. 使用说明 思迅收银系统_思迅天店标准版收银系统条码秤+计价秤操作指南
  8. 最新爱客影院自动采集源码v3.5.5
  9. 确保着法合规:象棋通用规则解析
  10. Java将Word/Excel转换成PDF—aspose工具
  11. 把常用网站固定在任务栏
  12. uniapp 电商小程序 置顶特效/分享特效/红包特效 简单实现效果
  13. 站在巨人的肩膀 门卫思想
  14. 电脑开热点手机连不上
  15. Dynamics crm2013 IFD部署后启用多组织
  16. 2006年中国笑话大全
  17. 如何检索、写作和顺利发表一篇SCI论文?
  18. 在微控制器平台等小型物联网设备上运行 JavaScript
  19. Webots2021b和ROS2调试笔记21-07-27
  20. 语音识别服务_语音识别服务厂商_腾讯云语音识别服务 - 云+社区 - 腾讯云

热门文章

  1. 疯狂Android讲义第三版完整带目录
  2. 中国宠物药品行业研究及投资前景研究报告(2021版)
  3. STM32 使用内部FLASH存储读取数据
  4. 小呆v免签二合一支付系统v6.6版带app手机息屏监控
  5. Ubuntu 安装搜狗拼音及fcitx
  6. 实战敏感信息泄露高危漏洞挖掘利用
  7. 【Python】转译日文乱码(txt文件)
  8. 智慧养老有哪些模式?
  9. 牛鞭效应matlab代码,基于控制工程的牛鞭效应建模与仿真研究
  10. Python分析抖音用户行为数据,看看发什么样的视频才会爆!