day 15
2.3.23. DEFINE_PROFILE
DEFINE_PROFILE可以定义随空间坐标或时间变化的边界条件或单元区域条件。
可以自定义的变量有:
·速度、压力、温度、湍流动能、湍流耗散率
·质量流量
·质量流量与物理流动时间的函数
·组分质量分数(组分运输)
·体积分数(多相模型)
·壁面热条件(温度、热流、生热率、传热系数和外部发射率等)
·壳层发热率
·壁面粗糙度条件
·壁面剪切和应力条件
·孔隙率
·多孔阻力方向矢量
·壁面粘附接触角(VOF多相模型)
DEFINE_PROFILE仅允许修改壁面热通量的单个值。单个值在ANSYS FLUENT没有线性化的显式源项中使用。如果要线性化壁面热通量的源项并分别考虑传导和辐射传热,则需要使用DEFINE_HEAT_FLUX。
example 1-压力分布
以下名为pressure_profile的UDF根据方程生成抛物线型的压力分布。
此UDF假定网格的生成方式是使原点位于要应用UDF的边界区域的几何中心。
入口中心y值为0,延伸到入口顶部(+0.0745)和底部(-0.0745)
#include "udf.h"
DEFINE_PROFILE(pressure_profile,t,i)
{
real x[ND_ND]; /* 用来存储质心坐标 */
real y;
face_t f;
begin_f_loop(f,t)
{
F_CENTROID(x,f,t);
y = x[1];/*将y轴坐标赋给y*/
F_PROFILE(f,t,i) = 1.1e5 - y*y/(.0745*.0745)*0.1e5;/*计算压力,传给F_PROFILE*/
}
end_f_loop(f,t)
}
example 2-速度、湍流动能和湍流耗散率分布
在下面的示例中,DEFINE_PROFILE分别用于生成二维完全发展的管道流动的速度、湍动能和耗散率。定义了三个独立的UDF,分别命名为x_ocity、k_profile和dissip_profile。这些函数串联在单个C源文件中,可以在ANSYS Fluent中解释或编译。
#include "udf.h"
#define YMIN 0.0 /* constants */
#define YMAX 0.4064
#define UMEAN 1.0
#define B 1./7.
#define DELOVRH 0.5
#define VISC 1.7894e-05
#define CMU 0.09
#define VKC 0.41
/*x方向速度*/
DEFINE_PROFILE(x_velocity,t,i)
{
real y, del, h, x[ND_ND], ufree;
face_t f;
h = YMAX - YMIN;
del = DELOVRH*h;
ufree = UMEAN*(B+1.);
begin_f_loop(f,t)
{
F_CENTROID(x,f,t);
y = x[1];
if (y <= del)
F_PROFILE(f,t,i) = ufree*pow(y/del,B);
else
F_PROFILE(f,t,i) = ufree*pow((h-y)/del,B);
}
end_f_loop(f,t)
}
/* 湍动能 */
DEFINE_PROFILE(k_profile,t,i)
{
real y, del, h, ufree, x[ND_ND];
real ff, utau, knw, kinf;
face_t f;
h = YMAX - YMIN;
del = DELOVRH*h;
ufree = UMEAN*(B+1.);
ff = 0.045/pow(ufree*del/VISC,0.25);
utau=sqrt(ff*pow(ufree,2.)/2.0);
knw=pow(utau,2.)/sqrt(CMU);
kinf=0.002*pow(ufree,2.);
begin_f_loop(f,t)
{
F_CENTROID(x,f,t);
y=x[1];
if (y <= del)
F_PROFILE(f,t,i)=knw+y/del*(kinf-knw);
else
F_PROFILE(f,t,i)=knw+(h-y)/del*(kinf-knw);
}
end_f_loop(f,t)
}
/* 湍流耗散率 */
DEFINE_PROFILE(dissip_profile,t,i)
{
real y, x[ND_ND], del, h, ufree;
real ff, utau, knw, kinf;
real mix, kay;
face_t f;
h = YMAX - YMIN;
del = DELOVRH*h;
ufree = UMEAN*(B+1.);
ff = 0.045/pow(ufree*del/VISC,0.25);
utau=sqrt(ff*pow(ufree,2.)/2.0);
knw=pow(utau,2.)/sqrt(CMU);
kinf=0.002*pow(ufree,2.);
begin_f_loop(f,t)
{
F_CENTROID(x,f,t);
y=x[1];
if (y <= del)
kay=knw+y/del*(kinf-knw);
else
kay=knw+(h-y)/del*(kinf-knw);
if (VKC*y < 0.085*del)
mix = VKC*y;
else
mix = 0.085*del;
F_PROFILE(f,t,i)=pow(CMU,0.75)*pow(kay,1.5)/mix;
}
end_f_loop(f,t)
}
real r;
begin_c_loop(c,t)
{
C_CENTROID(x,c,t);
r =x[1];
F_PROFILE(c,t,i) =
va1+(va2*r)+(va3*r*r)+(va4*r*r*r)+(va5*r*r*r*r);
}
end_c_loop(c,t)
}
DEFINE_PROFILE(fixed_ke,t,i)
{
cell_t c;
real x[ND_ND];
real r;
begin_c_loop(c,t)
{
C_CENTROID(x,c,t);
r =x[1];
F_PROFILE(c,t,i) =
ka1+(ka2*r)+(ka3*r*r)+(ka4*r*r*r)+(ka5*r*r*r*r)+(ka6*r*r*r*r*r);
}
end_c_loop(c,t)
}
example 3-固定速度UDF
在下面的示例中,DEFINE_PROFILE用于固定在某单元区域内始终保持不变的量。其中包含FIXED_U、FIXED_V和FIXED_KE三个单独的UDF,它们定义了固定的速度,用于模拟叶轮驱动的混合罐中叶轮的瞬态启动。
#include "udf.h"
#define FLUID_ID 1
#define ua1 -7.1357e-2
#define ua2 54.304
#define ua3 -3.1345e3
#define ua4 4.5578e4
#define ua5 -1.9664e5
#define va1 3.1131e-2
#define va2 -10.313
#define va3 9.5558e2
#define va4 -2.0051e4
#define va5 1.1856e5
#define ka1 2.2723e-2
#define ka2 6.7989
#define ka3 -424.18
#define ka4 9.4615e3
#define ka5 -7.7251e4
#define ka6 1.8410e5
#define da1 -6.5819e-2
#define da2 88.845
#define da3 -5.3731e3
#define da4 1.1643e5
#define da5 -9.1202e5
#define da6 1.9567e6
DEFINE_PROFILE(fixed_u,t,i)
{
cell_t c;
real x[ND_ND];
real r;
begin_c_loop(c,t)
{
C_CENTROID(x,c,t);
r =x[1];
F_PROFILE(c,t,i) =
ua1+(ua2*r)+(ua3*r*r)+(ua4*r*r*r)+(ua5*r*r*r*r);
}
end_c_loop(c,t)
}
DEFINE_PROFILE(fixed_v,t,i)
{
cell_t c;
real x[ND_ND];
real r;
begin_c_loop(c,t)
{
C_CENTROID(x,c,t);
r =x[1];
F_PROFILE(c,t,i) =
va1+(va2*r)+(va3*r*r)+(va4*r*r*r)+(va5*r*r*r*r);
}
end_c_loop(c,t)
}
DEFINE_PROFILE(fixed_ke,t,i)
{
cell_t c;
real x[ND_ND];
real r;
begin_c_loop(c,t)
{
C_CENTROID(x,c,t);
r =x[1];
F_PROFILE(c,t,i) =
ka1+(ka2*r)+(ka3*r*r)+(ka4*r*r*r)+(ka5*r*r*r*r)+(ka6*r*r*r*r*r);
}
end_c_loop(c,t)
}
example 4-壁面产热率分布
以下名为wallheatGenerate的UDF生成平面导热壁面的产热率文件。对其进行解释或编译后,可在ANSYS FLUENT中的壁面边界条件对话框中激活此UDF
#include "udf.h"
DEFINE_PROFILE(wallheatgenerate,t,i)
{
real source = 0.001;
face_t f;
begin_f_loop(f,t)
F_PROFILE(f,t,i) = source;
end_f_loop(f,t)
}
example 5-作为物理流动时间函数的质量流量UDF
以下名为tm_pout2的UDF在物理时间步长大于0.2秒时将质量流量从1kg/s调整为1.35kg/s。对其进行解释或编译后,可以在ANSYS FLUENT中的压力出口边界条件对话框中激活此UDF,方法是选择指定目标质量流量选项,然后从相应的下拉列表中选择UDF名称。
/* UDF for setting target mass flow rate in pressure-outlet */
/* at t0.2 sec the target mass flow rate set to 1.00 kg/s */
/* when t0.2 sec the target mass flow rate will change to 1.35 kg/s */
#include "udf.h"
DEFINE_PROFILE(tm_pout2, t, nv)
{
face_t f ;
real flow_time = RP_Get_Real("flow-time");/*RP_Get_Real("flow-time")与CURRENT_TIME等价,都是用于获取当前物理时间,但RP_Get_Real不能用在cell或者face的循环中,太耗费时间*/
if (flow_time < 0.2)
{
printf("Time = %f sec. \n",flow_time);
printf("Targeted mass-flow rate set at 1.0 kg/s \n");
begin_f_loop(f,t)
{
F_PROFILE(f,t,nv) = 1.0 ;
}
end_f_loop(f,t)
}
else
{
printf("Time = %f sec. \n",flow_time);
printf("Targeted mass-flow rate set at 1.35 kg/s \n") ;
begin_f_loop(f,t)
{
F_PROFILE(f,t,nv) = 1.35 ;
}
end_f_loop(f,t)
}
}
example 6-质量流量入口的质量流量UDF
以下名为INTERT_MF的UDF最初指定前10毫秒的质量流量为3.0千克/秒,然后在接下来的10毫秒内将其增加到4.0千克/秒,之后指定5.0千克/秒。
#include "udf.h"
DEFINE_PROFILE(inlet_mf,th,i)
{
face_t f;
real flow_time = CURRENT_TIME;/*CURRENT_TIME查找当前的流动时间,它对所有节点都可用,访问它一次并将值存储在局部变量中比为Face循环中的每个面都访问一次更有效*/
begin_f_loop(f,th)
{
if(flow_time <= 0.01)
F_PROFILE(f,th,i) = 3.0;
else if(flow_time <=0.02)
F_PROFILE(f,th,i) = 4.0;
else
F_PROFILE(f,th,i) = 5.0;
}
end_f_loop(f,th);
}