一、背景介绍

在使用FLUENT软件进行流体仿真的时候,有时设定的壁面热源并不是恒定温度或是恒定热流密度,而是随着时间变化、随着空间变化、甚至是互相影响随着压力变化。

例如,使用 FLUENT 模拟激光热源扫过一指定平面。首先,激光热源的热流密度不是均匀分布的(可以是类高斯分布、双椭球分布、环形热源分布等);其次,热源扫过平面,加热的区域在空间上是变化的。针对这种情景,我们不能简单的将受热面定义为恒定的热流密度,需要借助 UDF 指定热壁面,以此来模拟热源的扫描加热。下面以一个实际应用的例子为介绍,讲解如何使用DEFINE_PROFILE宏编写 UDF 施加动态热源。

案例介绍:

要模拟激光在基体上,沿着xoz平面的x轴方向扫描加热,以便分析其温度场,示意图如下:

 选用的热源模型为高斯热源模型,其热流密度方程可以表示为:

二、DEFINE_PROFILE宏

2.1   DEFINE_PROFILE宏简介

宏形式:        DEFINE_PROFILE(name, t, i)

                        symbol name: 宏名称,这个定义UDF的名称

                        thread *t: 边界指针,指向所选定的边界

                        int i : 定义的变量索引

        DEFINE_PROFILE宏形式如上所示,一共由三个参数组成,具体的含义如上所诉述。

宏功能:

        1. 定义边界速度、压力、温度、湍动能、质量流量;

        2. 定义组分质量分数;

        3. 壁面热条件(温度、热流、热产生率、换热系数、外部发射率);

        4. 计算区域孔隙度

        5. 计算区域源项;

由上可知,DEFINE_PROFILE 宏可以实现壁面热条件的设定,接下来介绍一下UDF如何编写,以及怎么根据自己的实际要求进行改写。

2.2   移动高斯热源UDF

先上总的 UDF 代码

#include"udf.h"
DEFINE_PROFILE(heat,t,i)
	{
		real xc[ND_ND];
		real x,y,z,P,A,R,v,pi;
		face_t f;
		pi=3.141592;
		A=0.2;		//利用率
		P=1000;		//激光功率
		R=0.001;	//光斑半径
		v=0.005;	//扫描速度
	begin_f_loop(f,t);
	{
		real time=RP_Get_Real(“flow-time”);	    //获取仿真时间
		F_CENTROID(xc,f,t);			            //获取坐标
		x=xc[0];
		y=xc[1];
		z=xc[2];
		F_PROFILE(f,t,i)=(A*2*P)/(pi*R*R)*exp(-2*(pow(x-v*time,2)+z*z)/(R*R));
	}
	end_f_loop(f,t)
}

接下来逐一细致讲解,以便能根据自己的所需的热源模型,进行改写:

1. 整体框架

热源施加的UDF基本结构框架如下,简单的说,我们选定某一个壁面作为热源,在每一轮迭代计算中,FLUENT都会运行UDF中的程序,对所选的壁面上每一个单元逐一赋值。

#include"udf.h"
DEFINE_PROFILE(heat,t,i)
	{
        /*-----申明变量及赋值---------*/
		/*---------------------------*/
        /*---------------------------*/
    
    face_t f;   //定义一个面,将通过循环对这个面上的单元逐一赋值 

    //逐一循环,对指定壁面上的单元逐一赋值 
	begin_f_loop(f,t);
	{

		F_PROFILE(f,t,i)=  对该单元赋值 ;
	}
	end_f_loop(f,t)
}

2. 申明变量

UDF 中声明变量的形式与 C语言相近,可以使用 int、long等格式声明变量的类型,然而我们一般都是使用 real ,real 是FLUENT所特有的一种变量声明,在单精度计算时,变量就为单精度(32位,7位小数位精度),在双精度计算时,变量会自动视为双精度(64位,15位小数位精度)。

比分我们要创建一个变量 v,定义为扫描速度,并设定为6mm/s,我们可以这样子书写:

注:FLUENT的UDF使用的单位为国际单位,即千克、米、秒;即时在FLUENT单位选择为毫米,编写UDF仍需使用国际标准单位。

real v = 0.006;

声明数组也与C语言类似:

real xc[3];
real xc[ND_ND];    // ND_ND为维度,三维模型下 ND_ND值为3;二维模型下 ND_ND值为2

3. 参数访问

能量密度的方程与位置、时间相关,以下介绍获得一些参见参数的方法:

RP_Get_Real(“flow-time”);        //获取当前时间
F_CENTROID(xc,f,t);              //获得当前单元中心的坐标,将值存放在数组xc中
F_U(f,t);                        //获得u方向上的速度
F_V(f,t);                        //获得v方向上的速度
F_W(f,t);                        //获得w方向上的速度
F_T(f,t);                        //获得当前面上的温度
F_H(f,t);                        //获得当前面上的焓

2.3   编写热源UDF例程

假设受热面位于xoy平面,在不同情况下,热源UDF编写如下:

1. 中间圆形区域为均匀热源

#include"udf.h"
DEFINE_PROFILE(heat,t,i)
	{
    real q = 500000;    //定义热流密度
    real r = 0.01;      //定义圆形区域半径
    real xc[ND_ND];     //定义一个数组,存放坐标信息 

    face_t f; 
	begin_f_loop(f,t);
	{
        F_CENTROID(xc,f,t);			     //获取坐标
		x=xc[0];
		y=xc[1];
        if(x*x+y*y < r*r)
		    F_PROFILE(f,t,i) = q;
        else
            F_PROFILE(f,t,i) = 0;
	}
	end_f_loop(f,t)
}

2. 高斯热源静止不动

#include"udf.h"
DEFINE_PROFILE(heat,t,i)
	{
		real xc[ND_ND];
		real x,y,P,A,R,v,pi;
		face_t f;
		pi=3.141592;
		A=0.2;		    //利用率
		P=1000;		    //激光功率
		R=0.001;	    //光斑半径
		v=0.005;	    //扫描速度
        x_0 = 0.01;     //热源中心坐标
        y_0 = 0.05;     //热源中心坐标
	begin_f_loop(f,t);
	{
		real time=RP_Get_Real(“flow-time”);	    //获取仿真时间
		F_CENTROID(xc,f,t);			            //获取坐标
		x=xc[0];
		y=xc[1];
		F_PROFILE(f,t,i)=(A*2*P)/(pi*R*R)*exp(-2*(pow(x-x_0,2)+pow(y-y_0,2))/(R*R));
	}
	end_f_loop(f,t)
}

参考文献:

[1] 罗佳勤,朱刚贤,李加强,谢光耀,王丽芳,石世宏.激光熔覆熔池温度场及流场数值模拟研究进展[J/OL].表面技术:1-19[2022-10-09].http://kns.cnki.net/kcms/detail/50.1083.TG.20220420.1935.012.html

[2] 胡坤. ANSYS Fluent二次开发指南[M]. 化学工业出版社

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐