“Negative cell volume detected”弹出来的时候,螺旋泵的转子刚转过第一个时间步的十分之一。控制台刷了一屏单元ID,回去看Display Mesh,变形区靠近齿顶那几层单元已经被压成纸片了。路径D:\Fluent_work\screw_pump\run01\error_log.txt。
动网格设置先过一遍。Define→Dynamic Mesh→Zones,转子壁面设成Rigid Body,Motion UDF/Profile里挂上自己写的DEFINE_CG_MOTION。变形区设成Deforming,Geometry Definition选None,Remeshing Options里Mesh Methods三个全开,Smoothing管小幅变形,Remeshing管大幅拉伸压缩,Layering用不上但勾着也不报错。转子转速4500 rpm,角速度换算一下4500×2π/60≈471 rad/s。DEFINE_CG_MOTION里omega[2]填这个值,注意单位是rad/s不是rpm。UDF只能编译型,解释型跑不了这个宏,编译之前确认Fluent的编译环境配好了。
DEFINE_CG_MOTION的框架写起来简单,坑在细节。`#include "udf.h"`,`DEFINE_CG_MOTION(rotor, dt, vel, omega, time, dtime)`,进去先`NV_S(vel, =, 0.0)`和`NV_S(omega, =, 0.0)`把数组清零,再`omega[2] = 471.0`。没清零的话Fluent默认给vel和omega里填的是垃圾值,转子会往奇怪的方向跑。路径里的反斜杠在UDF字符串里要双写,C文件里写的`"D:\\Fluent_work\\screw_pump\\udf\\rotor.c"`才认。编译报“}此处错误”一般不是括号的问题,是前面某一行漏了分号或者NV_S的宏写错了,往回翻三行看。
Smoothing和Remeshing的参数配比决定负体积出现的早晚。弹簧常数因子取0.8,叶片只在外围转,变形集中在齿顶附近,因子越小光顺扩散到整个域,计算量大还容易把远处的网格拉坏。Remeshing的Maximum Cell Skewness给0.7到0.8,Minimum Cell Volume按初始最小单元体积的0.3倍填,Maximum Cell Volume按初始最大单元体积的1.5倍填。重构区域要把初始非结构网格的单元边长范围覆盖进去,不然网格被拉伸到超过最大值还不重构,越拉越长最后负体积。
VOF这边,主相空气,次相水或者油,表面张力勾上,Courant数锁死在0.25以下。VOF的时间步是独立于全局时间步的,Fluent会在每个全局时间步内做VOF子时间步,子步数等于Global Courant数除以界面Courant数。全局Courant数给2,界面给0.25,子步数就是8步。全局时间步长按转子转过0.5度来算,4500 rpm下一圈8.3ms,0.5度大概0.0115ms,时间步长给1e-5秒量级起步。这个量级下跑一圈要八百多步,但负体积出现的概率比用1e-4秒小一个数量级。

负体积已经出现了的处理顺序。先把时间步长砍一半重跑,转子在每个时间步内移动的距离小于变形区最小单元边长的三分之一,这是硬门槛。还报就局部加密变形区的网格,齿顶间隙处原来0.3mm的单元缩到0.15mm,网格量翻倍但变形单元的容忍度也翻倍。再报就把弹簧常数因子从0.8降到0.5,让光顺的作用范围更大,变形分散到更多单元上,单个单元被压缩的比例就小了。三条都试过还不行,回来看UDF里omega的值是不是填错了,471 rad/s对应的齿顶线速度大概7m/s,如果误填成471 rpm,线速度差了60倍,网格每个时间步被撕碎是必然的。
螺旋泵的工况参数参考一下,流量500 m³/h,转速4500 r/min,叶片数3,包角130°,入口出口安放角6°,这些是从文献里摘的。含气率从0%到15%逐渐加,VOF的初始化用Patch把气相填到入口段,液相填满其余区域。进出口都设pressure outlet,入口压力按含气率对应的饱和压力给,出口给背压。后处理看齿顶间隙的压力脉动和含气率分布,转子转过一圈内的波动幅值跟文献对比。
D:\Fluent_work\screw_pump\下面那个run01已经跑废了,run02把时间步从1e-4改到2e-5,弹簧常数因子从0.8改到0.5,Remeshing的Minimum Cell Volume从默认值改成初始值的0.3倍,三个一起改再跑。齿顶间隙的网格还没加密,0.3mm的单元在471 rad/s下每个时间步移动的弧长是……
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删