前面提到在使用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的壁面上。
后来经热心网友提醒,可能是因为压力基求解器与边界条件所引起(前面测试用的计算模型四个边界均为壁面边界,采用的是默认的压力基求解器)。
解决方式有三种。
当使用密度基求解器时,采用下面的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代码。
#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之道