我们知道Fluent中壁面可以有不同的换热边界类型,比如给定热流量的类型,给定温度的类型,给定对流条件的类型等等。
UDF中有时候需要根据类型的不同来进行不同的处理。那么在Fluent UDF中该如何判断一个壁面是什么类型的热边界呢?这里为大家解密几个未写入UDF帮助手册的宏。
宏 | 作用 |
HEAT_FLUX_WALL(Thread*tf) | 判断是否是给定热流量的边界 |
TEMPERATURE_WALL(Thread*tf) | 判断是否是给定温度的边界 |
CONVECTION_WALL(Thread*tf) | 判断是否是给定换热对流条件的边界 |
COUPLED_WALL(Thread*tf) | 判断是否是couple耦合的边界 |
RADIATION_WALL(Thread*tf) | 判断是否是辐射边界 |
MIXED_WALL(Thread*tf) | 判断是否为混合型热边界 |
具体用法示例如下(VC++ UDF Studio插件 2022R1学术版上编译通过)。其中GetZoneIdByName函数是根据边界的名字获取其ID号,具体讲解可以参见另一篇博客《Fluent UDF中根据zone的名字获取ID》。
//利用VC++ UDF Studio 2022R1插件编译通过
#include "udf.h"
#include "SuperUdfExtension.h" //VC++ UDF Studio自带的扩展库头文件,具体参考该软件中的编程手册
#pragma comment(lib, "SuperUdfExtension.lib") //VC++ UDF Studio自带的扩展库的lib文件
int GetZoneIdByName(CString zoneName) //适用于所有Fluent版本
{
int returnID=-1;
Domain*domain=Get_Domain(1);
CString strCurrentFluentVersion;
strCurrentFluentVersion.Format("%d.%d", RampantReleaseMajor, RampantReleaseMinor);//格式化当前Fluent版本为字符串形式
double fCurrentFluentVersion = atof(strCurrentFluentVersion.GetBuffer()); //当前Fluent版本转为double类型
if(fCurrentFluentVersion<=19.2) // 对于Fluent6.3-19.2,只能调用VC++ UDF Studio扩展库
{
SuperUdf_Initialize(AfxGetInstanceHandle()); //调用VC++ UDF Studio扩展库中任何函数之前必须调用此初始化函数,具体参考该软件中的编程手册
#if !RP_NODE
returnID=SuperUdf_GetZoneIdByName(zoneName.GetBuffer()); //调用VC++ UDF Studio扩展库中的SuperUdf_GetZoneIdByName函数,具体参考该软件中的编程手册
#endif
host_to_node_int_1(returnID);
}
else // 对于Fluent version >=19.3,有直接UDF函数可以实现
{
Thread*tf;
thread_loop_f(tf, domain) //对所有面的thread进行循环查找
{
if(0==zoneName.CompareNoCase(THREAD_NAME(tf))) //对比名字是否相同
{
returnID=THREAD_ID(tf);
break;
}
}
if(-1==returnID) //如果面的thread中无法找到匹配名字
{
Thread*tc;
thread_loop_c(tc, domain) //对所有网格的thread进行循环查找
{
if(0==zoneName.CompareNoCase(THREAD_NAME(tc))) //对比名字是否相同
{
returnID=THREAD_ID(tc);
break;
}
}
}
}
return returnID;
}
DEFINE_ON_DEMAND(judge_wall_type)
{
int theWallID=GetZoneIdByName("wall"); //根据边界名字获取其ID,如果返回-1表示找不到
if(-1==theWallID)
{
Message0("Can't find face named as 'wall'\n");
}
else // 能够找到名字为wall的边界
{
Domain*domain=Get_Domain(1);
Thread*tf=Lookup_Thread(domain, theWallID);
if(THREAD_F_WALL!=THREAD_TYPE(tf)) // 如果不是壁面类型
Message0("It is not a wall type\n");
else
{
if(HEAT_FLUX_WALL(tf)) // 如果是热量型壁面
Message0("heat flux type wall\n");
else if(TEMPERATURE_WALL(tf)) // 如果是温度型壁面
Message0("temperature type wall\n");
else if(CONVECTION_WALL(tf)) // 如果是对流型壁面
Message0("Convection type wall\n");
else
Message0("Other types wall\n");
}
}
以上源码即实现了判断名字为”wall”的边界到底是什么样的壁面换热条件。其中,THREAD_TYPE是用来判断边界类型的宏。很多朋友可能不太熟悉,你可以在该宏上右键弹出菜单选择“转到定义”就可以看到它的定义了(前提是在VC++ UDF Studio插件中才可以使用这个功能)。可以看到该宏实际是一个define语句,等价于THREAD_HEAD(t)->var.type,要查看THREAD_HEAD是啥东西,可以继续右键弹出菜单“转到定义”进一步研究,这里不再赘述。
此外,在THREAD_F_WALL上右键弹出菜单“转到定义”,我们发现原来这个是一个枚举类型的成员,该枚举类型列举了所有可能的Thread类型。
最后,编译通过加载以后,点击Excute on Demand按钮执行我们定义的judge_wall_type宏,执行结果如下。可以看到,汇报的类型和我们点选设置的类型是一致的。