首页/文章/ 详情

Fluent UDF中DEFINE_INIT压力初始化错误问题解决方法

精品
作者优秀平台推荐
详细信息
文章亮点
作者优秀
优秀教师/意见领袖/博士学历/特邀专家
平台推荐
内容稀缺
1月前浏览1695

前面提到在使用DEFINE_INIT进行压力初始化时会出现问题。

如下面的几何模型,几何尺寸为50 mm x 50 mm。

现在要对 $30<y<40$ 区域进行初始化,指定该区域内的压力为200 pa,其他区域压力为100 pa。(注:这里是随便举例,仅为演示udf宏的使用,无实际意义。)

可以写UDF为:

#include "udf.h"
DEFINE_INIT(init_field, d)
{
   cell_t c;
   Thread *t;
   real xc[ND_ND];
   thread_loop_c(t,d)
     {
        begin_c_loop(c,t)
          {
             C_CENTROID(xc,c,t);
             if (xc[1]>0.03 && xc[1]<0.04)
             {
                 C_P(c,t) = 200;
             }else
             {
                 C_P(c,t) = 100;
             }
          }
        end_c_loop(c,t)
     }
}

编译并加载UDF。在初始化面板中进行初始化。初始化完毕后可以在后处理中查看初始压力的分布。如下图所示,可以看到,压力并未按照程序中所指定的压力值进行分布。在30 mm < y < 40 mm区域内的压力值被初始化为100 Pa,其他区域的压力值为0 Pa,而200 Pa的压力值则出现在30 mm < y < 40 mm的壁面上。

后来经热心网友提醒,可能是因为压力基求解器与边界条件所引起(前面测试用的计算模型四个边界均为壁面边界,采用的是默认的压力基求解器)。

解决方式有三种。

  1. 使用密度基求解器。
  2. 使用压力基求解器,但计算域中至少有一个压力边界(压力入口边界或压力出口边界)。
  3. 使用压力基求解器,修改UDF程序代码。

1 密度基求解器

  • 激活密度基求解器

当使用密度基求解器时,采用下面的UDF程序:

#include "udf.h"
DEFINE_INIT(init_field, d)
{
   cell_t c;
   Thread *t;
   real xc[ND_ND];
   thread_loop_c(t,d)
     {
        begin_c_loop(c,t)
          {
             C_CENTROID(xc,c,t);
             if (xc[1]>0.03 && xc[1]<0.04)
             {
                 C_P(c,t) = 200;
             }else
             {
                 C_P(c,t) = 100;
             }
          }
        end_c_loop(c,t)
     }
}

此时可以正常初始化。如下图所示。

但是密度基求解器并不那么好用,大量的物理模型无法在密度基求解器下使用。不过可以在初始化后将密度基求解器转换为压力基求解器,虽然麻烦点儿,但也能解决问题。

2 修改边界类型

依然使用压力基求解器。

当使用压力基求解器时,若所有边界均为壁面边界,则会出现之前那种无法 正常初始化的情况。但计算域中存在至少一个压力边界(压力入口或压力出口)时,可以正常初始化。

  • 修改左侧边界为压力入口边界

此时初始化的结果如下图所示。图中显示,压力初始化正常。

也可以尝试将右侧边界指定为压力出口。

初始化后如图所示,可以看到压力也能够正常初始化。

因此若要想在密闭区域中使用压力基求解器时进行压力初始化,可以先修改其中某个边界为压力边界,初始化完毕后再改回来。

3 修改UDF程序

如果头铁非要在密闭环境下使用压力基求解器,且要对区域内的压力进行初始化,该怎么做?

可以按下面所示修改UDF代码。

#include "udf.h"
DEFINE_INIT(init_field, d)
{
 cell_t c;
 Thread *t;
 real xc[ND_ND];
 thread_loop_c(t,d)
 {
   begin_c_loop(c,t)
   {
     C_CENTROID(xc,c,t);
     if (xc[1]>0.03 && xc[1]<0.04)
     {
       C_P(c,t) = 200;
     }
     else if(xc[1]>=0.04 && xc[1] <=0.05)
     {
       C_P(c,t) = 100;
     }
     else if(xc[1]<=0.03 && xc[1]>0.001) //给了一个小容差0.001
     {
       C_P(c,t) = 100;
     }  
   }
   end_c_loop(c,t)
 }
}

上面的代码初始化后如下图所示。

那下面还有一点压力为零的部分(0<y<0.001 m)怎么办?目前没有好的办法,试过将0.001改成0.0005,结果崩了。猜测与网格尺寸有关(这里测试的网格尺寸是1 mm,小于1mm就没法搞了)。

 

注:此解决方法不太优雅。


(完)

来源:CFD之道

FluentUDF
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-09-15
最近编辑:1月前
CFD之道
博士 | 教师 探讨CFD职场生活,闲谈CFD里外
获赞 2559粉丝 11230文章 732课程 27
点赞
收藏
作者推荐
未登录
1条评论
小鬼
签名征集中
10天前
用第三种方法后,封闭仓wall为高压,里面逐步降低,请问是什么原因
回复
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈