本案例演示在Fluent中利用UDF模拟膜状沸腾现象。
膜状沸腾:在一些换热问题中,当加热壁面的温度远远高于与壁面接触的液体的饱和温度时,此时整个壁面浸泡在蒸气中,同时在汽液界面发生沸腾传质,周期性地产生气泡并向上排放的现象。膜状沸腾会导致传热效率下降,对换热不利。
”
本案例中的数据来自Fluent官方案例,对原始UDF进行了修改。
1 问题描述
本案例中要解决的问题如下图所示。
本案例利用UDF定义质量源项与能量源项来模拟膜沸腾现象。计算区域宽0.0389 m,高0.1168 m。介质的饱和温度 K,计算区域底部壁面的温度为510 K。初始时刻,沿Y方向给定一个从Twall到TSAT的线性分布温度,利用下面的函数表达式进行指定:
计算结果如下图所示。
2 Fluent设置
-
以2D、Double Precision方式启动Fluent -
利用菜单File → Read → Mesh… 读取网格文件filmBoil.msh.gz
2.1 General设置
-
选择Transient进行瞬态计算 -
指定重力加速度为Y轴方向-9.81 m/s2
2.2 Models设置
-
多相流模型选择 -
采用VOF多相流模型 -
采用Explicit格式 -
激活选项Implicit Body Force
-
激活能量方程
-
采用Laminar层流模型
2.3 Materials设置
创建两个新材料liquid及vapor,材料属性如下图所示。
-
液相材料参数
-
气相材料参数
2.4 设置相
-
指定气相为主相
-
指定液相为次相
-
激活选项Surface Tension Force Modeling,设置表面张力系数为0.1 N/m
2.5 编译UDF
-
右键选择模型树节点User Defined Functions,点击弹出菜单项Compiled… 打开编译对话框
-
编译源文件boiling.c并加载
UDF中使用了3个UDM,这里需要先设置UDM数量。
-
点击Memory… 按钮打开UDM设置对话框
-
指定UDM数量为3
-
点击按钮Function Hooks… 打开设置对话框
-
如下图所示,添加初始化及Adjust的UDF
2.6 设置计算区域
-
按下图所示顺序添加混合相的能量源
-
添加气相的质量源
-
添加液相的质量源
2.7 设置边界条件
-
设置边界heat的温度为510 K
-
设置出口边界outlet的静压为0 Pa
-
设置回流温度500 K
-
设置出口液相回流体积分数为1
2.8 Methods
-
如下图所示设置Methods
2.9 初始化
-
全局初始化,指定温度为500 K
-
右键选择模型树节点Custom Field Functions,点击弹出菜单项New…
-
如下图所示创建函数temp-profile,定义为 510-y*10/0.1168
-
Patch整个区域的温度为temp-profile
2.10 监测变量
-
监测壁面heat的Nusslet数
-
监测整个计算区域的气相体积分数
-
指定参考值,用于Nusselt数的计算
2.11 进行计算
-
指定时间步数为4000,时间步长为0.001 s,进行计算
-
监测得到的体积分数随时间变化
-
监测得到的壁面Nusselt数随时间变化曲线
3 计算结果
-
计算结果如下图所示
案例实际上是投机取巧了的,事实上膜状沸腾模拟最困难的地方是附壁气膜的形成过程,这里直接将气膜以初始化的形式直接给定了。
4 相关理论及UDF代码
气相质量源的一般表达形式为:
式中,为通过界面的单位面积的热通量,下标与分别表示气相与液相;为潜热。
这样可以得到气相质量源为:
由于计算域内没有内部质量源,因此液相质量源为:
能量方程的潜热源变为:
界面属性包括表面张力系数0.1 N/m,潜热1e5 J/kg,饱和温度 K。
案例模型的长度尺度是泰勒-罗利不稳定性最危险的波长:
速度尺度为:
因此时间尺度为:
计算域水平宽度为,垂直高度为,网格分辨率为64(水平方向)×192(高度方向)。
汽液界面的初始形状必须受到扰动才能启动气泡的生长。因此,采用一个初始化UDF宏,利用气体填充所有满足以下条件的网格:
式中,为坐标,单位为米。
Nusselt数是表征沸腾换热的一个重要的无量纲值,其定义为:
由于该问题的时间尺度为0.1s,因此时间步长为0.001,即100个时间步长分辨率。总而言之,这个问题应该运行大约1200个时间步才能捕捉到第一个气泡排放。
一些代码注释如下所示。
#include "udf.h"
#include "sg.h"
#include "sg_mphase.h"
#include "flow.h"
#include "mem.h"
DEFINE_ADJUST(area_density, domain)
{
Thread *t;
Thread **pt;
cell_t c;
//混合相中循环
mp_thread_loop_c(t, domain, pt) if (FLUID_THREAD_P(t))
{
//利用P_PHASE得到主相的Thread指针,P_PHASE宏的值=0
Thread *tp = pt[P_PHASE];
begin_c_loop(c, t)
{
//计算得到$namda T cdot nabla α$,并将其存储在UDM中方便后面调用
C_UDMI(c, t, 0) = (C_VOF_G(c, tp)[0] * C_T_G(c, t)[0] +
C_VOF_G(c, tp)[1] * C_T_G(c, t)[1]);
}
end_c_loop(c, t)
}
}
//气相质量源
DEFINE_SOURCE(gas, cell, thread, dS, eqn)
{
real x[ND_ND];
real source;
Thread *tm = THREAD_SUPER_THREAD(thread);
Thread **pt = THREAD_SUB_THREADS(tm);
//得到k_lα_l+k_gα_g
real Kl = C_K_L(cell, pt[1]) * C_VOF(cell, pt[1]),
Kg = C_K_L(cell, pt[0]) * C_VOF(cell, pt[0]);
real L = 1e5;
// 根据公式计算得到质量源,这里引用了前面的UDM变量
source = (Kl + Kg) * C_UDMI(cell, tm, 0) / L;
//将质量源存储在UDM中方便后面调用
C_UDMI(cell, tm, 1) = source;
// 顺便计算能量源(等于质量源于潜热的乘积),存储在UDM中后面调用
C_UDMI(cell, tm, 2) = -source * L;
// 无法保证负斜率,干脆直接赋零
dS[eqn] = 0;
return source;
}
//液相质量源,利用UDM值进行指定
DEFINE_SOURCE(liquid, cell, thread, dS, eqn)
{
real x[ND_ND];
real source;
Thread *tm = THREAD_SUPER_THREAD(thread);
Thread **pt = THREAD_SUB_THREADS(tm);
source = -C_UDMI(cell, tm, 1);
dS[eqn] = 0;
return source;
}
// 计算能量源
DEFINE_SOURCE(energy, cell, thread, dS, eqn)
{
real x[ND_ND];
real source;
Thread *tm = thread;
source = C_UDMI(cell, tm, 2);
dS[eqn] = 0;
return source;
}
//给底部初始化了一层气体区域
DEFINE_INIT(my_init_function, domain)
{
Thread *t;
Thread **pt;
Thread **st;
cell_t c;
real xc[ND_ND], y, x;
mp_thread_loop_c(t, domain, pt) if (FLUID_THREAD_P(t))
{
Thread *tp = pt[P_PHASE];
begin_c_loop(c, t)
{
C_CENTROID(xc, c, t);
x = xc[0];
y = xc[1];
if (y < 0.00292 + 0.0006 * cos(6.283 * x / 0.0778))
C_VOF(c, tp) = 1;
else
C_VOF(c, tp) = 0;
}
end_c_loop(c, t)
}
}
相关文件下载:
链接:https://pan.baidu.com/s/1dbEC25AF-r-o89I5RaxGfQ 提取码:5ewn
”
(本文结束)
本篇文章来源于微信公众号: CFD之道
这个udf是不是不准确呀,adjust宏中温度梯度和VOF梯度那一行报错,VOF梯度好像默认不保留,需要进行UDS或者其他办法保留,因为adjust在迭代前运行,温度梯度好像要给一个初始值?