简介:这份资源面向船舶工程、流体力学方向的工程师与研究生,提供使用 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.5~1 mm 的倒圆。
计算域尺寸直接决定结果可信度。根据 ITTC 推荐做法,域的前方取 1~2 倍船长,后方取 3~5 倍船长,侧向和下方各取 1.5~2 倍船长。太小会导致阻塞效应,太大则网格量爆炸。我一般用船长 L 做基准:入口距船艏 1.5L,出口距船艉 4L,侧边界距中纵剖面 2L,底部距龙骨 2L,顶部距甲板 0.5L。
自由液面初始化有两种方式:平波面和高程场。平波面适合静水阻力计算,高程场适合有入射波的场景。VOF 设置里,水的体积分数初始化为 1(水)和 0(空气),交界处用几何重建格式做锐化。
2.2 网格划分策略与边界层控制
船体 CFD 的网格是成败关键。我习惯用 Fluent Meshing 的 Watertight Geometry 工作流,配合局部尺寸函数。核心原则:船体表面第一层网格高度要满足 y+ 要求。用 k-ω SST 模型时,壁面解析要求 y+ ≈ 1,对应第一层高度约 0.01~0.05 mm(取决于雷诺数)。如果算不了这么细,就用壁面函数,y+ 控制在 30~100。
# 估算第一层网格高度(平板边界层公式) # 输入:船长 L=5m,航速 U=2.5m/s,水的运动粘度 nu=1e-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(f"Re = {Re:.2e}") print(f"第一层网格高度 = {y_first*1000:.4f} mm")这段代码用平板边界层经验公式估算第一层网格高度。Re 是雷诺数,Cf 用 1/7 次方律近似,tau_w 是壁面剪应力,u_tau 是摩擦速度。算出来 y_first 就是目标 y+ 对应的物理高度。实际建模时还要考虑船体曲率,艏部和艉部要额外加密。
体网格用切割体网格(cut-cell)或六面体核心网格,船体周围加边界层棱柱层,层数 10~15,增长率 1.2~1.3。自由液面附近做各向异性加密,z 方向尺寸控制在波高的 1/20 以内。
3. 求解器配置:瞬态设置、多相流与湍流模型
3.1 瞬态求解器与时间步长选择
Fluent 瞬态求解有两种模式:压力基和密度基。船体绕流是低速不可压流动,用压力基耦合求解器(Coupled)就行。时间推进用一阶隐式起步,稳定后切二阶隐式。时间步长由 CFL 条件控制:CFL = U·Δt/Δx,一般控制在 1~5 之间。船体网格最小尺寸约 5 mm,航速 2.5 m/s,Δt 取 0.002~0.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+ 过渡区不落在 5~30 之间,否则精度最差。
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。自航点通过迭代船体阻力与螺旋桨推力平衡来确定,一般跑 5~10 个转速点。
5. 避坑与排查:船体瞬态仿真里最容易翻车的五件事
5.1 自由液面发散:VOF 界面重构失败
现象:残差曲线在 1e-2 附近震荡,自由液面出现非物理破碎,水的体积分数超出 0~1 范围。
原因:时间步长太大导致 CFL 超限,或者界面重构格式与网格质量不匹配。几何重建格式要求网格正交性大于 0.3,歪斜度小于 0.7。
解决:先把时间步长减半,观察 CFL 数是否降到 2 以下。如果网格歪斜度超标,用 Fluent Meshing 的 Improve Mesh 做光顺,或者局部重划。VOF 格式换成 HRIC,interface-compression-factor 降到 0.5。
5.2 壁面 y+ 超标:边界层网格被“压扁”
现象:壁面剪应力云图出现条纹状伪影,阻力系数比实验值高 15% 以上。
原因:第一层网格高度没算对,y+ 落在 5~30 的过渡区,壁面函数和解析模式频繁切换。
解决:重新用平板公式估算第一层高度,确保 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。阻力系数监测要等 5~10 个波动周期后再取平均值。波高监测点选在船艏前方 0.5L 和船艉后方 1L 处,对比实验数据。
6.2 网格无关性验证与时间步无关性验证
网格无关性至少做三套:粗(50 万)、中(200 万)、细(800 万)。阻力系数变化小于 2% 可以认为无关。时间步无关性做两套:Δt 和 Δt/2,阻力系数变化小于 1% 可以接受。
| 网格量 | 阻力系数 | 相对误差 |
|---|---|---|
| 50 万 | 0.00412 | 3.2% |
| 200 万 | 0.00398 | 0.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 步确认时间步稳定在合理区间,才敢开自动保存去睡觉。希望帮到你。
本文还有配套的精品资源,点击获取