Fluent UDF教程——壁面温度设定,实现动态高斯热源的施加,DEFINE_PROFILE宏讲解
介绍在FLUENT软件下,高斯移动热源的施加方法,简单介绍UDF相关知识,
一、背景介绍
在使用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]. 化学工业出版社
更多推荐
所有评论(0)