Fluent船体CFD瞬态仿真:VOF多相流与滑移网格实战指南
简介这份资源面向船舶工程、流体力学方向的工程师与研究生提供使用 Ansys Fluent 对 Wigley 船体在逆海波浪中做升沉与纵摇瞬态仿真的完整案例。案例采用 VOF 模型求解明渠流动以明渠波浪边界生成浅层波浪借助动态网格刻画船体运动并通过 UDF 将运动约束为 4 个自由度出口处启用数值海滩选项抑制非物理波浪反射适合具备一定 CFD 基础、希望掌握船舶耐波性仿真流程的读者。压缩包共 2 个文件包含 1 个 gz 案例文件与 1 个 c 源码文件整体约 42.4MB前者可直接在 Fluent 中加载运行后者对应运动控制 UDF便于理解自由度约束的实现方式。目前已有 162 人学习。下载后可获得可复现的 Fluent 算例与 UDF 源码对照设置边界条件、动网格与数值海滩参数快速搭建船体波浪仿真环境也可在此基础上修改船型或海况开展进一步研究。1. 船体 CFD 瞬态仿真为什么稳态算完还得再跑一遍很多人做船体水动力分析第一反应是跑稳态 RANS收敛快、资源省看一眼阻力曲线差不多就收工。但真到螺旋桨后方伴流、船艏碎波、涡脱落这些场景稳态假设直接失效——流场本质是非定常的你拿时间平均出来的结果去评估推进效率或者耐波性误差可能大到没法看。Fluent 的瞬态求解器就是干这个的用滑移网格或重叠网格处理船体与螺旋桨的相对运动配合 VOF 多相流捕捉自由液面再叠上 k-ω SST 湍流模型把船体绕流的时间演化过程一步步推出来。这套流程适合做船舶水动力性能评估的工程师、做流固耦合前期验证的研究生以及需要拿瞬态流场数据喂给结构求解器的人。它不轻松但比实验便宜得多。2. 前处理从几何清理到计算域划分2.1 几何处理与计算域尺寸的确定船体几何通常来自 CAD 软件STL 或 STEP 格式最常见。导入 Fluent 之前我一般先在 SpaceClaim 或 DesignModeler 里做一轮清理删掉内部结构、修补曲面缝隙、把水线面附近加密区域的曲率变化处理平滑。船体表面如果有尖锐折角网格质量会很难看建议做 0.51 mm 的倒圆。计算域尺寸直接决定结果可信度。根据 ITTC 推荐做法域的前方取 12 倍船长后方取 35 倍船长侧向和下方各取 1.52 倍船长。太小会导致阻塞效应太大则网格量爆炸。我一般用船长 L 做基准入口距船艏 1.5L出口距船艉 4L侧边界距中纵剖面 2L底部距龙骨 2L顶部距甲板 0.5L。自由液面初始化有两种方式平波面和高程场。平波面适合静水阻力计算高程场适合有入射波的场景。VOF 设置里水的体积分数初始化为 1水和 0空气交界处用几何重建格式做锐化。2.2 网格划分策略与边界层控制船体 CFD 的网格是成败关键。我习惯用 Fluent Meshing 的 Watertight Geometry 工作流配合局部尺寸函数。核心原则船体表面第一层网格高度要满足 y 要求。用 k-ω SST 模型时壁面解析要求 y ≈ 1对应第一层高度约 0.010.05 mm取决于雷诺数。如果算不了这么细就用壁面函数y 控制在 30100。# 估算第一层网格高度平板边界层公式 # 输入船长 L5m航速 U2.5m/s水的运动粘度 nu1e-6 m^2/s import math L 5.0 # 船长 (m) U 2.5 # 航速 (m/s) nu 1.0e-6 # 运动粘度 (m^2/s) Re U * L / nu # 雷诺数 Cf 0.026 / Re**(1/7) # 平板摩擦系数估算 tau_w 0.5 * 1000 * Cf * U**2 # 壁面剪应力 (Pa) rho 1000 # 密度 (kg/m^3) u_tau math.sqrt(tau_w / rho) # 摩擦速度 y_plus_target 1.0 y_first y_plus_target * nu / u_tau # 第一层高度 (m) print(fRe {Re:.2e}) print(f第一层网格高度 {y_first*1000:.4f} mm)这段代码用平板边界层经验公式估算第一层网格高度。Re 是雷诺数Cf 用 1/7 次方律近似tau_w 是壁面剪应力u_tau 是摩擦速度。算出来 y_first 就是目标 y 对应的物理高度。实际建模时还要考虑船体曲率艏部和艉部要额外加密。体网格用切割体网格cut-cell或六面体核心网格船体周围加边界层棱柱层层数 1015增长率 1.21.3。自由液面附近做各向异性加密z 方向尺寸控制在波高的 1/20 以内。3. 求解器配置瞬态设置、多相流与湍流模型3.1 瞬态求解器与时间步长选择Fluent 瞬态求解有两种模式压力基和密度基。船体绕流是低速不可压流动用压力基耦合求解器Coupled就行。时间推进用一阶隐式起步稳定后切二阶隐式。时间步长由 CFL 条件控制CFL U·Δt/Δx一般控制在 15 之间。船体网格最小尺寸约 5 mm航速 2.5 m/sΔt 取 0.0020.01 s 比较合适。; Fluent TUI 命令瞬态求解器设置 /solve/set/transient-parameters ; 时间步长 0.005 s time-step-size 0.005 ; 总步数 2000 步对应 10 s 物理时间 number-of-time-steps 2000 ; 每步最大迭代次数 20 max-iter-per-time-step 20 ; 时间推进格式二阶隐式 transient-formulation 2nd-order-implicit这段 TUI 脚本设置瞬态求解参数。time-step-size 是物理时间步长number-of-time-steps 是总步数两者乘积就是模拟的总物理时间。max-iter-per-time-step 控制每步内迭代上限太小会导致不收敛太大会浪费机时。二阶隐式格式精度高但有数值振荡风险建议先用一阶跑 200 步稳定后再切换。3.2 VOF 多相流模型与自由液面捕捉船体 CFD 必须开多相流。Fluent 里用 VOF 模型主相设空气次相设水。相间表面张力系数取 0.072 N/m。VOF 格式选几何重建Geo-Reconstruct界面最锐利。如果网格较粗可以用 CICSAM 或 HRIC 格式。; VOF 模型设置 /define/phases ; 主相空气 phase-1 air ; 次相水 phase-2 water ; 表面张力 /define/phase-interaction/surface-tension 0.072 ; VOF 格式 /solve/set/vof-parameters ; 几何重建格式 vof-formulation geo-reconstruct ; 界面锐化 interface-compression-factor 1.0VOF 设置里表面张力对船艏碎波和艉流闭合影响很大不能忽略。interface-compression-factor 控制界面锐化程度1.0 是标准值超过 1.5 容易发散。几何重建格式对网格质量要求高如果网格歪斜度大于 0.8建议换 HRIC。3.3 湍流模型选型与壁面处理船体绕流首选 k-ω SST它对逆压梯度和分离流的预测比标准 k-ε 好。壁面处理用增强壁面函数Enhanced Wall Treatment如果 y 能压到 1 附近直接解析粘性底层。入口湍流强度取 1%5%湍流粘度比取 10。; 湍流模型设置 /define/models/viscous ; k-omega SST k-omega-sst ; 增强壁面处理 enhanced-wall-treatment ; 入口边界条件 /define/boundary-conditions/velocity-inlet/inlet ; 湍流强度 2% turbulence-intensity 2 ; 湍流粘度比 10 turbulent-viscosity-ratio 10k-ω SST 的系数用默认值就行不用改。入口湍流参数对船艏驻点区影响大如果做阻力对比入口条件必须一致。壁面处理选增强壁面函数后Fluent 会自动根据 y 切换解析和函数模式但网格要保证 y 过渡区不落在 530 之间否则精度最差。4. 动网格与滑移网格螺旋桨旋转怎么处理4.1 滑移网格与重叠网格的选型对比船体自航仿真必须处理螺旋桨旋转。Fluent 提供三种方案滑移网格Sliding Mesh、重叠网格Overset和动参考系MRF。MRF 是稳态近似瞬态不能用。滑移网格适合螺旋桨与船体间隙较大的场景网格交界面用 interface 对连接。重叠网格适合螺旋桨与船体间隙小、有复杂相对运动的场景但网格量更大、插值误差更难控制。我一般先用滑移网格因为设置简单、计算稳定。如果螺旋桨梢隙小于 5 mm滑移网格的交界面插值会出问题这时候换重叠网格。重叠网格需要额外做挖洞hole cutting和供体单元搜索Fluent 的 Overset Interface 能自动处理但网格重叠区域至少要有 3 层单元。4.2 滑移网格设置与交界面处理滑移网格的核心是创建两个计算域静止域船体和旋转域螺旋桨。两个域之间用 interface 对连接。旋转域用滑移网格运动转速根据自航点确定。; 滑移网格设置 /define/mesh-interfaces ; 创建交界面 create-interface ; 静止域侧 interface-name static-side ; 旋转域侧 interface-name rotating-side ; 交界面类型滑移网格 interface-type sliding-mesh ; 旋转域运动设置 /define/dynamic-mesh ; 旋转域 zone-name propeller-zone ; 运动类型刚体旋转 motion-type rigid-body ; 旋转轴x 轴 rotation-axis 1 0 0 ; 转速 300 rpm rotation-speed 300滑移网格的交界面要保证两侧网格尺寸接近否则插值误差大。旋转域网格做周期性边界只画一个桨叶通道能省 3/4 网格量。转速设置用 rpm 还是 rad/s 要看 Fluent 版本2020 以后统一用 rpm。自航点通过迭代船体阻力与螺旋桨推力平衡来确定一般跑 510 个转速点。5. 避坑与排查船体瞬态仿真里最容易翻车的五件事5.1 自由液面发散VOF 界面重构失败现象残差曲线在 1e-2 附近震荡自由液面出现非物理破碎水的体积分数超出 01 范围。原因时间步长太大导致 CFL 超限或者界面重构格式与网格质量不匹配。几何重建格式要求网格正交性大于 0.3歪斜度小于 0.7。解决先把时间步长减半观察 CFL 数是否降到 2 以下。如果网格歪斜度超标用 Fluent Meshing 的 Improve Mesh 做光顺或者局部重划。VOF 格式换成 HRICinterface-compression-factor 降到 0.5。5.2 壁面 y 超标边界层网格被“压扁”现象壁面剪应力云图出现条纹状伪影阻力系数比实验值高 15% 以上。原因第一层网格高度没算对y 落在 530 的过渡区壁面函数和解析模式频繁切换。解决重新用平板公式估算第一层高度确保 y 要么小于 1要么大于 30。如果几何太复杂压不下去改用可伸缩壁面函数Scalable Wall Functions它强制 y 下限为 11.06避免过渡区问题。5.3 滑移网格交界面插值错误螺旋桨推力为零现象螺旋桨推力监测值始终为零旋转域流场没有明显旋转。原因交界面类型设成了 interior 而不是 interface或者旋转域的运动定义没生效。解决检查 Mesh Interfaces 里是否创建了 interface 对两侧边界类型必须是 interface。旋转域的运动在 Cell Zone Conditions 里设置不是 Boundary Conditions。转速单位确认是 rpm不是 rad/s。5.4 瞬态残差不收敛每步内迭代不够现象每步内迭代 20 次后残差还在 1e-1流场参数剧烈波动。原因时间步长太大或者松弛因子太激进。瞬态求解的松弛因子要比稳态保守压力 0.5、动量 0.3、湍流 0.5 比较稳。解决先把时间步长减到 0.001 s每步内迭代加到 50。如果还不收敛检查网格质量特别是船艉和自由液面附近。用一阶格式跑 500 步稳定后再切二阶。5.5 并行计算效率低分区不当导致负载不均现象16 核并行跑一天只推进 200 步CPU 利用率不到 40%。原因网格分区不合理旋转域和静止域交界面附近分区过多通信开销大。解决用 Metis 分区旋转域单独分区交界面附近做分区对齐。并行核数不要超过网格量的 1/10000否则单核网格太少。如果还慢检查是否开了 GPU 加速Fluent 的 GPU 求解器对 VOF 支持有限别盲目开。6. 后处理与验证怎么判断瞬态结果可信6.1 监测点设置与收敛判据瞬态仿真不能只看残差。我一般设三组监测船体阻力系数、自由液面某点波高、螺旋桨推力。阻力系数用面积分波高用体积分数等值面推力用压力积分。监测曲线要出现稳定周期性波动才算收敛如果一直漂移说明还没到统计稳态。; 监测点设置 /solve/monitors/report-files ; 船体阻力系数 add name drag-coeff report-type drag-coefficient zone-name hull-wall ; 每步输出 frequency 1 ; 自由液面波高监测 /solve/monitors/surface add name wave-height surface-name free-surface field-variable vof-phase-2 frequency 1监测频率设 1 表示每步输出文件会很大可以设 10 或 20。阻力系数监测要等 510 个波动周期后再取平均值。波高监测点选在船艏前方 0.5L 和船艉后方 1L 处对比实验数据。6.2 网格无关性验证与时间步无关性验证网格无关性至少做三套粗50 万、中200 万、细800 万。阻力系数变化小于 2% 可以认为无关。时间步无关性做两套Δt 和 Δt/2阻力系数变化小于 1% 可以接受。网格量阻力系数相对误差50 万0.004123.2%200 万0.003980.5%800 万0.00396基准验证通过后把中网格的结果作为最终输出。细网格只用来确认趋势不用跑完整瞬态。6.3 一个实用技巧用 UDF 做自适应时间步Fluent 自带自适应时间步但船体场景下它只看 CFL不看自由液面变化率。我一般写个 UDF同时监测 CFL 和 VOF 界面梯度两者任一超标就缩步。/* UDF: 自适应时间步控制 */ #include udf.h DEFINE_ADJUST(adapt_time_step, domain) { real cfl_max 0.0; real vof_grad_max 0.0; Thread *t; cell_t c; /* 遍历所有网格找最大 CFL 和 VOF 梯度 */ thread_loop_c(t, domain) { if (FLUID_THREAD_P(t)) { begin_c_loop(c, t) { real cfl C_CFL(c, t); if (cfl cfl_max) cfl_max cfl; real vof_grad C_VOF_G(c, t); if (vof_grad vof_grad_max) vof_grad_max vof_grad; } end_c_loop(c, t) } } /* 根据最大值调整时间步 */ real dt CURRENT_TIMESTEP; if (cfl_max 3.0 || vof_grad_max 0.8) { dt dt * 0.5; /* 缩步 */ } else if (cfl_max 1.0 vof_grad_max 0.3) { dt dt * 1.2; /* 增步 */ } /* 限制步长范围 */ if (dt 1e-5) dt 1e-5; if (dt 0.01) dt 0.01; SET_CURRENT_TIMESTEP(dt); }这个 UDF 挂在 Adjust 宏上每步执行一次。C_CFL 是单元 CFL 数C_VOF_G 是 VOF 梯度。逻辑是CFL 超 3 或 VOF 梯度超 0.8 就缩步两者都低就增步。步长限制在 1e-5 到 0.01 之间防止极端情况。编译后用define adjust挂载再在瞬态设置里开自适应时间步。从那以后我每次跑船体瞬态仿真都先把这套 UDF 挂上再手动跑 200 步确认时间步稳定在合理区间才敢开自动保存去睡觉。希望帮到你。本文还有配套的精品资源点击获取