众所周知,Fluent的压力进口指定的是总压,而不能单独指定静压。但是有时候我们做模拟的时候会遇到一些外行,给的边界条件有点麻烦。比如他只给你进出口的静压,不给你流量。如果给了进口的静压和流量的话,对于不可压缩流可以用伯努利方程来算出总压,对于可压缩流可以用可压缩的伯努利方程或者等熵原理来算总压。但问题是对面就疯狂想让你在已知进出口静压的情况下求流量,这意味着从一开始进口总压就是未知数。
应对只给进出口静压的方法一般有两种:第一种,去你妈的动压,静压就是总压,的忽略动压的做法,该做法在动压远小于静压时有用;第二种,利用二分法,重复计算多次,慢慢调整总压使得静压接近需要的值,该做法严谨,精确但是浪费时间。
但是现在!有了UDF的加持,就可以在计算中慢慢调整总压,使得静压达到预定的值了!一次解决所有问题,既有第一种做法的简便,也有第二种做法的精准!事不宜迟快来看看程序把!该程序适用于ANSYS19.1及其兼容版本。
//本UDF可以用于根据某面的静压来实时调整压力入口的总压,使该面的静压达到预想的值
#include "udf.h"
//User Input
#define ZoneID 6 //定义为进口的ID
#define Target_Static_Pressure 19710 //定义你希望达到的入口静压
#define Initial_Total_Pressure 19710 //定义总压的初始值
//End of User Input
// 全局变量区
real staPA = 0.0;//初始化为0
real totPA = Initial_Total_Pressure;//初始化为总压初始值
//全局变量区结束
DEFINE_ADJUST(in_avg_Pa, domain) //求解进口边界条件的静压
{
real NV_VEC(A); //定义一个数组,二维的时候为 A[2],三维的时候为 A[3]
real sumPA = 0.0, sumA = 0.0;//声明实数类型变量
#if !RP_HOST//计算节点内执行代码
face_t f;//在计算节点内声明指针
Thread *fthread;//在计算节点内声明指针
fthread = Lookup_Thread(domain, ZoneID);//ZoneID 应该修改为对应的入口的ID
begin_f_loop(f, fthread)
{
if (PRINCIPAL_FACE_P(f, fthread))
{
F_AREA(A, f, fthread); /*返回数组A[]的面积向量*/
sumA += NV_MAG(A); /*求模运算。NV_MAG(A)相当于计算sqrt(A[0]*A[0] + A[1]*A[1]) 表示矢量大小*/
sumPA += NV_MAG(A)*F_P(f, fthread); /*求得该平面所有压力(牛顿)之和*/
}
}
end_f_loop(f, fthread)
#endif
sumPA = PRF_GRSUM1(sumPA);//reduce压力数据到一个数据,即计算节点间数据求和
sumA = PRF_GRSUM1(sumA);//reduce面积数据到一个数据,即计算节点间数据求和
node_to_host_real_2(sumPA, sumA);//将两个数据由节点传送到host
#if RP_HOST//host节点执行代码
staPA = sumPA / sumA; //求进口壁面的平均压力
Message(" Now the static pressure at the in boundary is %e Pa. \n Now the total pressure at the in boundary is %e Pa.\n",staPA,totPA);//实时输出进口边界的总压和静压
#endif
host_to_node_real_1(staPA);
}
DEFINE_PROFILE(Total_Pressure, thread, i)//实现入口总压在计算过程中逐渐调节,采用比例调节,比例系数0.5
{
face_t f;//面线指针
if (N_ITER>10 && N_ITER % 50 == 0) //迭代次数大于10时 且 每隔50次迭代更新一次总压,因为前几次迭代流场比较混乱,对于复杂的模型可将10适当增大
{
if (abs(staPA - Target_Static_Pressure) > 10)//当静压的值超出设定值的一定范围后,更新入口总压的值
{
totPA = totPA - (0.5*(staPA - Target_Static_Pressure));//计算新的入口总压值
begin_f_loop(f, thread)//将计算出的入口总压值赋值在入口边界上
{
F_PROFILE(f, thread, i) = totPA;
}
end_f_loop(f, thread)
}
}
else if(N_ITER < 10)//将入口总压初值赋值在入口边界上
{
begin_f_loop(f, thread)
{
F_PROFILE(f, thread, i) = totPA;
}
end_f_loop(f, thread)
}
}
该程序可以用于瞬态和稳态计算,利用ADJUST宏计算面上静压,这意味着控制的输入不仅仅可以是入口,更有可能是别的面。在调整静压的控制算法上采用了简洁易懂的比例控制。
求解面上静压的示例程序位于UDF手册(19.1版本)的第496页,章节7.3.2.5.5. Looping Over Faces。
2 条评论