fluent算例6 使用UDF定义沸腾与冷凝写在开头问题描述分析1. general2. 边界条件3. 物理模型4. 材料5.UDF6. methods7. 初始化8.动画
fluent算例6 使用UDF定义沸腾与冷凝
写在开头
最近的学习过程中有一点感受,想要分享一下,不知道各位CFDer有没有同感。在很多专业知识上,比如UDF或者某一种算例的关键点,在中文的文献中总是一笔带过,不是不小心带过,而是故意不外露,目前对于UDF的入门,永远都是那两个例子,十几来年了,很少有人会愿意把自己学到的知识真正的分享出来,总是将不好做有困难的那部分藏着掖着,如果大家都可以分享出来应该进步更快吧,对国家的发展或许也是一种帮助,也或许因为自己在寻找解决方法的路漫漫,所以当自己解决以后也不愿意无偿或者有偿分享了。
问题描述
本次算例参考胡坤老师,在其内容之上略有补充。演示源项法模拟水沸腾,在早期版本的Fluent中没有现成的蒸发冷凝模型,需要借助UDF指定质量源与能量源来模拟沸腾现象。在较新的Fluent版本中已经内置了蒸发冷凝模型,本算例中的UDF等同于Fluent中内置的Lee模型。本案例的UDF也可以经过修改用于更复杂的沸腾现象模拟。
分析
1. general
-
瞬态计算
-
考虑重力
-
压力求解器
2. 边界条件
在流体域中的液态水,初始温度是372 K,也就是99 ℃,水的沸点是100 ℃,因此想要模拟水的沸腾,需要有热源的输入,才可以使得水达到沸点。而将初始温度设置为99摄氏度也是因为我们不关注水的升温过程,而更关心其沸腾。
-
底部热源:温度壁面(573 K)
-
两侧壁面及底部除热源之外的部分:绝热壁面(fluent默认的壁面条件,无需修改)
-
出口:压力出口边界,常压即可
3. 物理模型
-
涉及多相流,使用mixture模型,因此需要双精度启动fluent
-
考虑重力,所以勾选implicit body force
-
主相是液态水
-
第二相是气态水,直径0.2mm
-
-
涉及温度相关,开启能量方程
-
速度不大,层流模型
4. 材料
-
装满液态水的容器中水的沸腾只会设计到液态水和气态水两种物质
-
从fluent材料库中直接复制water-liquid和water-vapour即可
-
本次沸腾的传质传热使用UDF,两种材料的标准生成焓都改为0即可
5.UDF
#include "udf.h" #include "sg_mphase.h" #define T_SAT 373.15 //饱和温度373.15 K #define LAT_HT 1.e3 //汽化潜热1000 J/kg // 液相质量源项 DEFINE_SOURCE(liq_src, cell, pri_th, dS, eqn) { Thread *mix_th, *sec_th; real m_dot_l; // mix_th存储主相的Thread指针;sec_th存储次相指针,注意ID mix_th = THREAD_SUPER_THREAD(pri_th); sec_th = THREAD_SUB_THREAD(mix_th, 1); // 温度大于饱和温度,表示为蒸发 if (C_T(cell, mix_th) >= T_SAT) { //计算蒸发量,注意液相质量流量为负值,0.1为coeff值 m_dot_l = -0.1 * C_VOF(cell, pri_th) * C_R(cell, pri_th) * fabs(C_T(cell, pri_th) - T_SAT) / T_SAT; //对体积分数求导 dS[eqn] = -0.1 * C_R(cell, pri_th) * fabs(C_T(cell, pri_th) - T_SAT) / T_SAT; } else { //计算冷凝量,液相质量分数为正值 m_dot_l = 0.1 * C_VOF(cell, sec_th) * C_R(cell, sec_th) * fabs(T_SAT - C_T(cell, mix_th)) / T_SAT; //若对体积分数求导得到的值为正,干脆直接赋零值 dS[eqn] = 0.; } return m_dot_l; } // 气相质量源项,解释同上 DEFINE_SOURCE(vap_src, cell, sec_th, dS, eqn) { Thread *mix_th, *pri_th; real m_dot_v; mix_th = THREAD_SUPER_THREAD(sec_th); pri_th = THREAD_SUB_THREAD(mix_th, 0); if (C_T(cell, mix_th) >= T_SAT) { m_dot_v = 0.1 * C_VOF(cell, pri_th) * C_R(cell, pri_th) * fabs(C_T(cell, mix_th) - T_SAT) / T_SAT; dS[eqn] = 0.; } else { m_dot_v = -0.1 * C_VOF(cell, sec_th) * C_R(cell, sec_th) * fabs(T_SAT - C_T(cell, mix_th)) / T_SAT; dS[eqn] = -0.1 * C_R(cell, sec_th) * fabs(C_T(cell, sec_th) - T_SAT) / T_SAT; } return m_dot_v; } //混合相的能量源项 DEFINE_SOURCE(enrg_src, cell, mix_th, dS, eqn) { Thread *pri_th, *sec_th; real m_dot; pri_th = THREAD_SUB_THREAD(mix_th, 0); sec_th = THREAD_SUB_THREAD(mix_th, 1); if (C_T(cell, mix_th) >= T_SAT) { // 得到蒸发量,Lee模型 m_dot = -0.1 * C_VOF(cell, pri_th) * C_R(cell, pri_th) * fabs(C_T(cell, pri_th) - T_SAT) / T_SAT; //对温度求导,若为负则保留,否则赋值零 dS[eqn] = -0.1 * C_VOF(cell, pri_th) * C_R(cell, pri_th) / T_SAT; } else { //得到冷凝量 m_dot = 0.1 * C_VOF(cell, sec_th) * C_R(cell, sec_th) * fabs(T_SAT - C_T(cell, mix_th)) / T_SAT; dS[eqn] = -0.1 * C_VOF(cell, sec_th) * C_R(cell, sec_th) / T_SAT; } // 返回热量值,利用潜热与质量流量的乘积得到 return LAT_HT * m_dot; }
-
UDF这块我也不是很深理解,大概在其中都有解释
-
直接将以上内容其复制,使用记事本粘贴,然后将记事本的后缀.txt修改为.c,User Defined Functions-interpreted-点击到刚刚创建的.c文件-interpret即可。
-
在cell zone conditions中分别双击phase-1(液态水)、phase-2(气态水)、fluid(混合相),都勾选上源项source term,在其中点击mass或者energy后的edit-将0改为1-下拉找到对应的源项(液态水对应-liq::src、气态水对应vapour::src、混合相对应energy::src)-保存即可
6. methods
-
我使用的默认,和胡老师不太一样
7. 初始化
-
标准初始化
-
将初始温度设置为372K
-
由于沸腾温度为373.15 K,所以可以给温度边界上一层网格patch一个温度
-
需要使用cell-register将温度壁面上的一层网格进行标记:cell register-new-boundry-选择底部的边界
8.动画
对于瞬态计算可以保存动画,对于本次算例,我们关心的是相的变化
-
首选新建一个contours,设置成我们关心的样子,选择pahse-选择气相-save
-
solution-activities-create-solution animations-定义动画名-定义迭代多少步保存一个-保存类型可以选择jpeg-定义保存路径-选择要观察的面(contour提前定义好)-ok;计算结束后,animations-playback即可观看-write即可保存动画