前面提到在使用DEFINE_INIT进行压力初始化时会出现问题(Fluent UDF中DEFINE_INIT压力初始化错误)。
如下面的几何模型,几何尺寸为50 mm x 50 mm。
现在要对 $30 可以写UDF为: 编译并加载UDF。在初始化面板中进行初始化。初始化完毕后可以在后处理中查看初始压力的分布。如下图所示,可以看到,压力并未按照程序中所指定的压力值进行分布。在30 mm < y < 40 mm区域内的压力值被初始化为100 Pa,其他区域的压力值为0 Pa,而200 Pa的压力值则出现在30 mm < y < 40 mm的壁面上。 后来经热心网友提醒,可能是因为压力基求解器与边界条件所引起(前面测试用的计算模型四个边界均为壁面边界,采用的是默认的压力基求解器)。 解决方式有三种。 当使用密度基求解器时,采用下面的UDF程序: 此时可以正常初始化。如下图所示。 但是密度基求解器并不那么好用,大量的物理模型无法在密度基求解器下使用。不过可以在初始化后将密度基求解器转换为压力基求解器,虽然麻烦点儿,但也能解决问题。 依然使用压力基求解器。 当使用压力基求解器时,若所有边界均为壁面边界,则会出现之前那种无法正常初始化的情况。但计算域中存在至少一个压力边界(压力入口或压力出口)时,可以正常初始化。 此时初始化的结果如下图所示。图中显示,压力初始化正常。 也可以尝试将右侧边界指定为压力出口。 初始化后如图所示,可以看到压力也能够正常初始化。 因此若要想在密闭区域中使用压力基求解器时进行压力初始化,可以先修改其中某个边界为压力边界,初始化完毕后再改回来。 如果头铁非要在密闭环境下使用压力基求解器,且要对区域内的压力进行初始化,该怎么做? 可以按下面所示修改UDF代码。 上面的代码初始化后如下图所示。 那下面还有一点压力为零的部分(0
注:此解决方法不太优雅。 ” (完)#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)
}
}
1 密度基求解器
#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程序
#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)
}
}
本篇文章来源于微信公众号: CFD之道
评论前必须登录!
注册