用户自定义函数(User-defined functions),顾名思义,用户自己定义的函数,根据每个人的实际需要,自己定义函数、源项或修改边界条件加载到软件中,得到自己想要的结果。VirtualFlow不仅有强大的网格技术和丰富的求解模型,还具有先进的用户自定义功能。
VirtualFlow是通过编写C++来创建用户自定义函数(UDF)的,可调用不同类型的UDF,具体如下:
—阻力系数、升力系数、壁面润滑力系数、粘度
—Paraview定制输出变量
—求解调整:
Begin Iteration 每次迭代前执行 UDF;
End Iteration 每次迭代后执行 UDF;
Initialization 每次初始化执行 UDF;
Simulation Begin 计算前执行 UDF;
Simulation End 计算后执行 UDF;
Output Frequency 每n个迭代步或时间步长执行 UDF;
Before Solver 初始化之后,计算之前执行 UDF;
Every Time Step 每个时间步执行 UDF;
Every Particle Substep 每次求解颗粒步时执行 UDF;
Every Iteration 每个迭代步执行 UDF。
—源项。如质量源项、动量源项、能量源项、湍动能和耗散率源项等。
下面通过具体的案例展示VirtualFlow用户自定义函数操作,如下图所示,模拟储水池中的水通过两台泵吸出过程,VirtualFlow用户自定义函数主要包括以下:
储水池初始化条件设置
用户自定义函数设置随时间变化域内水的质量
储水池结构示意图
模型建立
对储水池计算域进行网格划分,采用VirtualFlow笛卡尔网格技术结合分块网格优化,对计算域分为4个块(block)。
储水池网格
储水池仿真边界条件
模型设置
采用均相多相流进行模拟,两相分别为水和空气,湍流模型为RANS k-ε 模型,求解类型为非稳态求解。
对于两相流,初始界面需要指定,为了给出相的初始位置和初始压力分布,需要对其进行初始化,在此模型中,=0.25m为界面位置,y>
的区域为空气,y<
的区域为水。
储水池初始化条件设置
在VirtualFlow中,初始化分为普通初始化和高级初始化,该案例设置涉及到复杂边界的初始化,需采用高级初始化条件,创建一个C++子程序,命名为initialconditions.cxx,将此程序文件复制到计算文件夹中,在软件执行窗口点击初始化编译按钮,即可将初始化程序编译到软件中。
VirtualFlow高级初始化按钮
UDF设置随时间变化域内水的质量
此案例中我们想要得到区域内水质量随时间的变化情况,可通过UDF的方式实现,UDF需要准备头文件mass_output.h和主程序文件mass_output.cxx两个文件,其中主程序主要包括变量声明、数据更新计算以及数据输出三部分。
在User Defined Functions窗口添加用户自定义函数,VirtualFlow为用户创建自定义函数提供了很多模板,用户可直接进行添加,如下图所示。
VirtualFlow的UDF模板
当计算结束后,就会产生相应的数据结果文件test_output.dat,数据可以通过Office或文本编辑打开。
模拟结果
在t=0s时的水的体积分数
在t=2s时的水的体积分数
水的质量随时间变化而变化
图1和图2可知,初始水的体积分数随着时间不断减少,图3为储水池内的水的质量随时间变化曲线,可以看到由于泵的吸力水的质量随着时间线性减少,且VirtualFlow得到的结果与解析解结果一致。
总结
通过对储水池的抽水仿真说明了VirtualFlow软件的用户自定义函数功能,VirtualFlow软件不仅提供了多种后处理的模板供用户使用,而且用户可根据需要,对想要的结果进行定制化编写。