上篇文章我们模拟了当管路阀门关闭时的水锤情况,我们使用了以下表达式来控制阀门关闭:
IF (t<0.2[s],2[m/s],0[m/s])
这个if表达式的意思是当时间小于0.2秒的时候,水流速度为2m/s,当时间为0.2秒的时候,流速减为零,我们知道在实际工程应用中,阀门不可能瞬间关闭,中间是需要一定时间的。
为了控制阀门关闭时间,我们需要使用UDF来控制流速。UDF(User Defined Function)是Fluent提供的一种代码,允许用户用C语言编写函数,来定义自己的边界条件、材料属性和流态的源项,以及指定自定义模型参数(例如 DPM、多相模型)、初始化解决方案或增强后处理。
现在有了AI,可以很容易让大模型生成UDF的代码。以下代码由chatgpt3.5生成,要求在时间在0.2秒内速度为2m/s,然后在0.1秒内速度减为0。
#include "udf.h"
DEFINE_PROFILE(velocity_inlet, thread, position)
{
real t = CURRENT_TIME;
real u_inlet;
/* Define velocity profile over time */
if (t <= 0.2)
{
u_inlet = 2.0; /* Maintain velocity at 2 m/s for t <= 0.2 seconds */
}
else if (t <= 0.3)
{
u_inlet = 2.0 - 20.0 * (t - 0.2); /* Linear reduction from 2 m/s to 0 m/s over 0.1 second */
}
else
{
u_inlet = 0.0; /* Maintain velocity at 0 m/s after t > 0.3 seconds */
}
face_t f;
begin_f_loop(f, thread)
{
F_PROFILE(f, thread, position) = u_inlet;
}
end_f_loop(f, thread)
}
不难看出,控制速度的函数是一个线性函数y = 2-2*(x-0.2)。
在项目目录下打开记事本,复制以上代码,存为后缀名为.c的文件。
在Fluent菜单找到User-Defined,然后在Functions下面找到Compiled(编译文件)。

点击Add添加,并点击Build,我这里选择了内置的编译器,外置编译器为Visual Studio,但是有时候会报错。

编译成功后控制台会提示以下消息:

最后点击Load关闭对话框,注意如果代码发生改动,每次要重新编译一下。
来到边界条件的速度出口,选择udf。

在报告中新建出口的速度数值用来监测:

同之前一样,0-0.2秒采用大步长,0.2秒后减少步长观测水锤效应。
运行结果:
速度由初始值减到0(这里显示的平均速度,2m/s为最大速度)

管子末端峰值压强为0.2MPa(29Psi)

有意思的是阀门完全关闭后,管路产生了第二个压力波:

让我们把关闭时间延长到0.5s。

管子末端最大压强为0.12MPa(17psi)。基本上是没有什么水锤了。

水管中段压力变化:

从以上模拟结果我们不难得出,水锤现象虽然可怕,但也不是完全无法避免,一个非常有效的方法是通过优化阀芯设计,延长其关闭时间就可以有效减小水锤产生的峰值压力。