1. 障碍物扰流
一般我们模拟障碍物流动都需要将障碍物画出来,然后进行流动计算。但是如果障碍物比较复杂,一方面障碍物比较难以建模,另一方面还会大大拉低网格质量,可能会导致计算收敛性不好。
于是我突然胡思乱想,是否可以不需要单独建模和画网格,而根据障碍物坐标,通过UDF来实现流体障碍物流动?
2. 方法1:Fixed value固定障碍物区域速度为0
首先想到的就是直接将障碍物区域的速度强行设置为0,即使用Cell Zone Conditions→Fixed Values中固定速度为0
UDF很容易写,即首先要知道障碍物的坐标信息,然后根据障碍物坐标来令此区域x方向和y方向的速度均为0。
比如,我们在流场中的障碍物为圆,障碍物坐标如下图
UDF代码:
#include "udf.h"
DEFINE_PROFILE(fixed_value_xy, t, i)
{
cell_t c;
real xc[ND_ND];
real x, y;
begin_c_loop(c, t)
{
C_CENTROID(xc, c, t);
x = xc[0];
y = xc[1];
if ((x-6)*(x-6)+ (y - 5) * (y - 5)<=0.8)
{
C_UDMI(c, t, 0) = 1;
F_PROFILE(c, t, i) = 0;
}
else
{
C_UDMI(c, t, 0) = 0;
}
}
end_c_loop(c, t)
}
分别在Fixed_value的x和y方向速度上hook这个UDF
可以查看UDM确实是指障碍物位置才等于1,其余部分等于0
但是却没有产生任何障碍物扰流效果,这说明这种方式不可行
Fixed_value作用机理
实际上,仔细分析也可以想明白。固定速度只是数值约束,不是物理阻力。它是一个硬约束条件,强行把速度设置为 0;并不会引入任何动量交换或剪切效应;该区域就像一个“冻结”的流体区域,不具有“阻挡”或“扰动”的能力。
周围流体会“忽略”它,真实绕流中,流体与障碍物表面有相互作用(壁面摩擦、压强分布);Fixed Value 区域没有这种边界行为,它更像是一个“静止的流体包”。
3. 方法2:通过动量源项实现
通过设置动量源项,使得某一特定区域的速度恰好为0,这样就可以实现障碍物效果,而且通过动量源项只是在方程中添加了源项,并没有违背物理规律。
比如还是上面的例子,设置圆形区域动量为-1e5。代码如下:
#include "udf.h"
DEFINE_SOURCE(mom_source, c, t, dS, eqn)
{
real source = 0.;
real xc[ND_ND];
real x, y;
C_CENTROID(xc, c, t);
x = xc[0];
y = xc[1];
if ((x - 6) * (x - 6) + (y - 5) * (y - 5) <= 0.8)
{
source = -1e5;
dS[eqn] = 0.0;
}
return source;
}
速度云图如下。可以看到似乎已经出现了障碍物的效果
这种方式已经接近障碍物扰流了,但难点在于,动量源项难以控制某一区域速度为0。如果给的动量源项过大,可能会出现流体反向流动现象
4. 方法3:高阻力多孔介质区
通过在流场中定义一个“高阻力多孔介质区”来模拟障碍物,将整个区域设置成多孔介质,然后使用UDF将固定区域并赋予极大的粘性阻力系数,使流体在这个区域内几乎无法流动,相当于一个虚拟实体障碍物,即可逼近真实的绕流场。
UDF代码如下:
#include "udf.h"
DEFINE_PROFILE(resistance_xy, t, i)
{
face_t f;
real xc[ND_ND];
real x, y;
begin_f_loop(f, t)
{
F_CENTROID(xc, f, t);
x = xc[0];
y = xc[1];
if ((x-3)*(x-3)+ (y - 5) * (y - 5)<=0.3)
{
F_PROFILE(f, t, i) = 1e107;
F_UDMI(f, t, 0) = 1;
}
else
{
F_PROFILE(f, t, i) = 0.0;
F_UDMI(f, t, 0) = 0;
}
}
end_f_loop(f, t)
}
实现效果如下:
甚至还可以实现卡门涡街现象
但是这个速度云图和真实障碍物的速度云图有明显的区别
卡门涡街对比
5. 总结
我们对这几种方法进行总结
总的来说,想要真实模拟障碍物扰流还是需要真实的几何建模,其他的方式都不够准确?
或者说还有什么更好的奇思妙想??欢迎大家评论区留言,互相交流学习!!