众所周知,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。

最后修改:2021 年 12 月 04 日
如果觉得我的文章对你有用,请随意赞赏