Fluent UDF中判断壁面热边界类型

         我们知道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宏,执行结果如下。可以看到,汇报的类型和我们点选设置的类型是一致的。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值