本案例演示在Fluent中利用表达式功能及UDF处理温度反问题的基本思路。
1 问题描述
案例要解决的问题如下图所示。管道直径20 mm,长度300 mm。流体介质为空气,入口速度2 m/s,出口静压0 Pa,固体壁面对流换热系数 20 W/(m2-K),环境温度300 K,若想要管道出口平均温度为350 K,请问管道入口温度应为多少?
本案例几何简单,可以利用传热学的相关理论直接计算。不过这仅仅只是为了方便演示而已,如果计算模型非常复杂的话,利用传热学公式也不太容易计算。
这是个典型的反问题,利用仿真的方式也不容易处理。一种解决方式是采用二分法不断尝试入口温度,使得出口平均温度接近目标值。如本案例中,可以先给入口一个温度上限(比如上限600 K),然后用中间值500 K及上限值600 K分别进行计算并查看出口值,若600 K入口计算得到的出口温度值大于350 K,而500 K温度值计算得到的温度值也大于350 K,则使用350~500的中间值(425 K)进行计算并比较出口温度值;若500 K的温度值计算得到的出口温度值小于350 K,则使用500~600的中间值(550 K)进行计算并比较出口值。相同的方式不断逼近,得到最终的入口温度值。另一种方式也可以不采用二分法,而是采用单步搜索方式对入口温度进行修改。
两种方法在技术上都是可以行得通的,然而在具体实施上不太方便,需要多次修改边界条件并执行计算以及查看出口温度并获取入口温度。
本案例借助Fluent中的表达式功能将出口温度作为入口温度的操作变量,在迭代计算过程中自动修改入口温度,使出口温度满足设计目标。
注:本案例也可以使用UDF中的DEFINE_ADJUST及DEFINE_PRFILE宏进行处理。
”
2 Fluent设置
-
进入Fluent并导入网格
2.1 Models设置
-
激活能量方程
-
使用默认的SST k-omega湍流模型
2.2 Materials设置
-
材料介质air采用默认参数
2.3 设置边界条件
1、inlet边界
-
设置入口速度为2 m/s
-
设置入口温度350 K
注:这里的入口温度是随便给的,后面要重新指定。
”
2、outlet边界
-
指定出口静压0 Pa
-
指定出口回流温度300 K
3、wall边界
-
指定壁面换热系数20 W/(m2-K),指定环境温度300 K
2.4 定义报告
-
如下图所示添加报告
-
报告名称为report-outlet-temp,指定其为出口平均温度
2.5 初始化
-
进行初始化
2.6 进行计算
-
设置迭代300步进行计算
-
监测得到的出口平均温度为336.82 K,而需要的出口目标温度为350 K,显然入口温度需要调整。
3 表达式处理
3.1 定义表达式
-
右键选择模型树节点Named Expressions,点击弹出菜单项**New…**新建表达式
-
如下图所示创建表达式Tout,其定义为前面所指定的出口温度报告值report-outlet-temp
-
定义表达式TInCurrent,其为入口边界的当前值,如下图所示
-
定义表达式relax,指定其值为0.2,如下图所示
注:这是一个松弛因子,会影响到计算的收敛性。如果后面的计算出现较大的振荡,建议降低此参数值。
”
-
定义表达式TAdjust,如下图所示
这里350 K为目标温度,这里在入口当前温度值的前后尝试
”
-
定义表达式TIn,如下图所示
3.2 修改边界条件
-
指定入口边界inlet的温度为TIn,如下图所示
3.3 定义报告
-
如下图所示,新建一个Expression报告
-
指定其值为TIn,如下图所示
3.4 进行计算
-
指定初始温度为300 K
注:这里将初始温度设置为300 K仅仅是为了方便观察出口温度分布。实际上设置初始温度为350 K要更好一些,计算收敛更快。
”
-
设置迭代计算300步
3.5 计算结果
-
出口温度的变化曲线
-
查看入口温度监测曲线,可以看到最终温度为367.35 K,即入口温度在367.35 K时,出口温度能稳定在350 K。
4 UDF处理
案例所涉及的问题也可以使用UDF进行处理,其处理思路与表达式相同。
4.1 编译并加载UDF
编写UDF源代码如下。
#include "udf.h"
#define ZoneID 6 //定义为出口的ID,后面统计出口温度时要用
#define Target_T 350 //定义你希望达到的出口温度
#define Initial_T 350 //定义入口温度的初始值
// 定义全局变量,便于宏内调用
real staT = 0.0; //初始化为0
real currentT = Initial_T; //初始化为温度初始值
// 计算入口的温度值
DEFINE_ADJUST(in_avg_T, domain)
{
real NV_VEC(A);
real sumTA = 0.0, sumA = 0.0; //声明实数类型变量
#if !RP_HOST
face_t f;
Thread *fthread;
fthread = Lookup_Thread(domain, ZoneID);
begin_f_loop(f, fthread)
{
if (PRINCIPAL_FACE_P(f, fthread))
{
F_AREA(A, f, fthread);
sumA += NV_MAG(A);
sumTA += NV_MAG(A) * F_T(f, fthread);
}
}
end_f_loop(f, fthread)
#endif
// 变量全局约简并从计算节点传递到host节点
sumTA = PRF_GRSUM1(sumTA);
sumA = PRF_GRSUM1(sumA);
node_to_host_real_2(sumTA, sumA);
#if RP_HOST
//得到温度的面平均值
staT = sumTA / sumA;
Message("the Temperature at outlet is %e K. n ", staT);
#endif
host_to_node_real_1(staT);
}
// 实现入口温度在计算过程中逐渐调节,采用比例调节,比例系数0.2
// 比例系数取值范围0~1,调节方式等同于亚松弛因子
DEFINE_PROFILE(inlet_temperature, thread, i)
{
face_t f;
//迭代次数大于5 时且每隔10次迭代更新一次入口温度
if (N_ITER > 5 && N_ITER % 10 == 0)
{
//当出口温度值与目标温度值差异超过0.1K时,更新入口温度
if (abs(staT - Target_T) > 0.1)
{
currentT = currentT - (0.2 * (staT - Target_T));
//将计算出的入口温度值赋值在入口边界上
begin_f_loop(f, thread)
{
F_PROFILE(f, thread, i) = currentT;
}
end_f_loop(f, thread)
}
}
else
{
begin_f_loop(f, thread)
{
F_PROFILE(f, thread, i) = currentT;
}
end_f_loop(f, thread)
}
}
-
右键选择模型树节点User Defined Functions,点击弹出菜单项**Compiled…**打开编译对话框
-
如下图所示加载源文件,编译源代码并加载UDF
注:利用内置编译器,可能需要将源代码中的中文注释去掉,否则会提示GBK转码错误。
”
-
点击工具按钮**Function Hooks…**打开UDF Hooks对话框
-
如下图所示添加 Adjust
宏
4.2 修改边界条件
-
修改inlet边界条件,指定其温度为UDF inlet_temperature
4.3 初始化
-
初始化计算
4.4 进行计算
-
迭代计算300步
4.5 计算结果
-
出口温度变化曲线,可以看到收敛后出口温度为350 K(最后一步的数据没有显示出来,若想要更精确,可以修改UDF代码中的出口温度差异值)
-
入口温度变化曲线如下图所示,可以看到入口温度最终温度为367.9372 K,即入口为此温度时,出口温度为350 K
5 总结
本文分别利用表达式和UDF求解温度反问题。总体思路是一样的,不过从过程上来看,利用表达式要比UDF更简洁,主要是利用表达式获取边界上的平均值更方便,利用UDF要写并行代码,较为麻烦。不过表达式语言表达能力有限,UDF更灵活一些,如果控制方法较为复杂的话,可能只能借助于UDF来实现。
链接:https://pan.baidu.com/s/1JwO886S6wGso3EabqhYTwQ
提取码:1234”
(本文结束)
本篇文章来源于微信公众号: CFD之道
评论前必须登录!
注册