前阵子我在做一台共轴刚性高速直升机的旋翼启动过程瞬态气动仿真,这台验证机的正式代号不在文章里展开,统一叫X97。它最典型的布局就是上下两副刚性旋翼同轴反旋,尾部还有一个推进桨,我这次只算主旋翼从静止加速到额定转速的阶段,尾桨在建模阶段直接砍掉了。之所以要单独做启动段而不是拿额定转速的定常流场敷衍,是因为启动过程中转速从零爬升,整个流场的无量纲参数都在变,定常算出来的那一个工作点根本覆盖不了这一段。这篇文章会把FLUENT建模、网格、运动设置、求解器配置、结果判读和踩坑过程全部串一遍,给想做旋翼瞬态气动、旋转机械起动仿真的朋友一个完整参照。
1. 我为什么非要把“启动过程”单独拎出来做瞬态
1.1 定常计算给不了的那部分“加速效应”
如果只是求旋翼在某个固定转速下的拉力、功率,定常方法完全够用。把旋转域设成MRF或者直接在给定转速下做滑移网格稳态计算,半小时能出结果。但启动过程不是单一工作点,转速从0到额定值连续变化,流场本身是强非定常的,定常计算给不了“加速效应”。
所谓加速效应,对应的是流体的附加质量。旋翼桨叶在静止空气中启动,相当于在一个静止流体环境中突然推动一大团空气。桨叶加速越快,周围流体跟不上桨叶运动,局部攻角和有效来流速度会跟准定常假设有很大偏差。气动力中除了“当前转速对应的准定常分量”,还有一项正比于角加速度的分量。这个分量在转速稳定后迅速消失,但恰恰在启动过程中会显著改变拉力和扭矩曲线。
如果漏掉这个效应,最直接的后果就是低估启动阶段的最大扭矩。旋翼启动时发动机功率匹配通常看的就是扭矩峰值,峰值算小了,发动机选型或者传动系统校核就会出问题。所以工程上需要瞬态仿真,不是追求炫技,是要把那部分定常算不出来的瞬态载荷找出来。
1.2 启动阶段的气动环境远比巡航复杂
额定巡航状态下,桨尖马赫数可能到0.6左右,旋翼工作在相对稳定的攻角范围内。启动阶段完全不是这样:转速从零开始往上走,桨尖马赫数从0跨越到0.6,桨叶剖面的当地雷诺数也在几个数量级之间变化。
低转速的时候,桨叶上诱速很小,如果总距已经给定,桨叶剖面迎角会非常大,很容易进入深度失速。深度失速意味着气流在桨叶表面大范围分离,升力线斜率变负,气动力会出现迟滞和振荡。这种流动状态对湍流模型、网格分辨率和时间步长都极其敏感,稍微设置不当,算出来的振荡可能是数值假象,而不是真实物理。
更麻烦的是,启动过程中转速变化会让涡脱落频率跟着变化。旋翼桨尖涡从无到有、强度从小到大,涡的位置和输运速度一直在变。低转速阶段,桨尖涡相对桨叶的速度低,涡更容易停留在桨盘附近,和桨叶发生相互作用。我在后处理里看Q准则等值面的时候,启动前期的流场像一团乱麻,根本没法拿定常计算结果的经验去硬套。
1.3 共轴刚性旋翼在这个场景下的特殊问题
X97这类共轴刚性旋翼,上下两副旋翼转向相反、刚性连接,桨叶根部没有挥舞铰。这种构型的优点是取消了尾桨,诱导功率损失小,但气动上有一个先天难题:上旋翼的尾流会直接打到下旋翼上,下旋翼工作在非常复杂的非均匀来流里。
额定转速下,上下旋翼之间的气动干扰已经有明显周期性,下旋翼每转一圈都会切过上旋翼脱落的桨尖涡。启动阶段这个问题会更严重。转速低,桨尖涡强度弱但位置更散,而且上下旋翼的相对转速差造成的通过频率是变化的,周期性载荷脉动不是简单的一个固定频率,而是随时间扫频。
另外,刚性旋翼没有挥舞自由度,气动载荷的脉动会直接通过桨毂传递到机体。如果想知道启动过程中桨毂承受的交变载荷到底多大,就必须把上下旋翼分别建模,分别监测每副旋翼的拉力和扭矩,不能像单旋翼那样笼统地看一个总载荷。这个需求直接决定了后面的网格和运动模型要怎么做。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 几何简化、网格与运动模型:动手之前先做决定
2.1 几何模型做到什么程度够用
CFD仿真不是建模越细越好。启动过程本身计算量已经很大,几何上再堆一堆桨毂整流罩、变距拉杆、防冰管,网格量会失控,而且对气动载荷的改善贡献很小。我做X97启动仿真时,几何上只保留了桨叶和一根简化桨毂轴。
桨叶参数按公开文献里常见的刚性共轴高速旋翼尺度给:单副旋翼半径4.5米,上下各4片桨叶,弦长0.32米,桨叶扭转采用线性负扭转,根部到桨尖变化约8度。翼型截面没有用某型号真实翼型,而是用公开的NACA0012,虽然这会让绝对载荷偏掉一点,但我们在乎的是启动过程中的趋势和相对变化,不是给某一架实机做性能发布。
桨叶数选4片,是为了让上下旋翼的通过频率在启动阶段不至于太密,后处理时更容易分辨上旋翼桨尖涡对下旋翼的干扰特征。总距在启动过程中假设不变,固定在巡航配平时的近似值8度。这个假设必须说清楚:真实直升机启动时总距会随转速和驾驶指令变化,本文的工况相当于“转速斜坡加载、总距锁定”的数值试验,用于研究纯转速变化下的气动响应。
2.2 计算域尺寸和边界条件的选择
旋翼启动会向外辐射压力波,计算域边界如果离得太近,反射波会在几秒内污染整个桨盘附近的流场。我把计算域设成半径12R的圆柱,旋翼中心到地面的距离设为1.2R,地面保留成无滑移壁面,用来模拟地面试车状态。顶部和侧面外边界按远场处理。
地面是否保留,对启动结果的直接影响很大。旋翼靠近地面时,气流受地面阻挡,会在桨盘下方形成地面涡。启动初期诱导速度弱,地面涡更靠近桨盘中心,下旋翼的载荷会明显被地面效应改变。如果一开始就把地面省掉,等于默认悬停启动,后处理时可能出现莫名其妙的拉力波动,先检查是不是边界条件跟工况不匹配。
远场边界在密度基求解器里用压力远场,初始马赫数为0,压力给定标准大气压。这里有一点要提醒:旋翼启动前流场是静止空气,初始条件必须同时把速度场设成0,不能把压力远场条件理解成“无穷远来流”。
2.3 滑移网格、动网格还是重叠网格:我的选择
FLUENT里模拟旋翼旋转,常见方案有MRF、滑移网格、动态网格、重叠网格。启动过程是转速变化,MRF只能做定常或者给冻结转子近似,排除。剩下三个我列在下面对比:
| 方案 | 工作原理 | 优点 | 风险与代价 |
|---|---|---|---|
| 滑移网格 | 旋转域整体刚性旋转,交界面滑移 | 实现简单,网格不变形,稳定性好,适合刚体旋转 | 两套网格交界面上需要通量插值,不能处理桨叶变形 |
| 动态网格 | 网格节点随刚体运动或变形运动 | 可处理变距、挥舞、弹性变形 | 容易负体积,网格重构耗时,启动连续大角度旋转会造成网格缠绕 |
| 重叠网格 | 旋翼网格嵌在背景网格中,挖洞插值 | 适合多体相对大位移,网格质量容易控制 | 挖洞和插值设置繁琐,上下旋翼各自挖洞容易产生质量退化区域 |
我的工况是上下旋翼反向旋转,转速随时间变化,但几何本身不变形。滑移网格是最稳的选择。两个旋转域分别包住上、下旋翼,旋转域半径取1.35R,旋转域之间留一段静止域作为过渡。FLUENT里两个旋转域通过interface和静止域连接,上旋翼域和下旋翼域不直接接触。
选择滑移网格的另一个好处是规避了动态网格里最恶心的负体积问题。纯刚体旋转时,网格节点跟着旋转域一起转,内部网格相对位置不变,理论上不会出现负体积。真正容易出问题的是interface附近的网格过渡区,后面调试部分我会单独讲。
3. 启动过程的FLUENT实现:Profile、UDF和时间步长怎么配
3.1 转速加载曲线:不要直接给额定转速一个阶跃
有的人图省事,直接把额定转速作为固定值扔给滑移网格,然后说“算了瞬态”。那不是启动过程,那是从一个额定转速流场突然开始,得到的是阶跃激励响应,物理意义完全不同。启动仿真必须给角速度加载曲线。
最简单的办法是写profile文件,用时间和角速度散点定义一条折线。FLUENT的profile格式大概是:
code复制((x97-start-omega transient
(4 point)
(time 0.0 0.5 3.0 8.0)
(omega 0.0 0.0 39.8 39.8)
))
注意单位是rad/s,换算关系是rpm乘以2π/60。额定转速取380rpm,对应的角速度约为39.8rad/s。上面这个profile是0到0.5秒保持静止,0.5到3秒线性加转速,3秒后保持额定。线性加载的缺点是角加速度在0.5秒和3秒两个点有阶跃,数值上会激起额外的高频压力波。
我最后选了UDF,用平滑过渡函数生成角速度曲线。好处是角加速度连续,流场不会因为转速拐点出现人为脉冲。UDF大概长这样:
c复制#include "udf.h"
real omega_target(real t)
{
real tau;
real omg = 0.0;
if (t < 0.2) return 0.0;
if (t > 1.2) return 39.8;
tau = (t - 0.2) / 1.0;
omg = 39.8 * (3.0 * tau * tau - 2.0 * tau * tau * tau);
return omg;
}
DEFINE_ZONE_MOTION(spin_up, omega, axis, axis_origin, velocity, time, dtime)
{
*omega = omega_target(time);
}
DEFINE_ZONE_MOTION(spin_down, omega, axis, axis_origin, velocity, time, dtime)
{
*omega = -omega_target(time);
}
这个UDF里,spin_up和spin_down分别挂到上、下旋翼旋转域上,方向相反。FLUENT里每次迭代都会调用它取当前角速度,滑移网格就能跟着转速曲线转动。
实际上真实直升机从启动到额定转速可能需要十几秒,如果原样算,时间步长又小,计算量会非常吓人。我的做法是把整个启动过程压缩到1秒完成,再保持0.8秒看流场稳定。压缩后的角加速度比真实值大,结果不能直接拿去做绝对载荷校核,但足以看清启动期气动力变化规律。要想还原真实启动时长,需要把时间步长放宽到物理现象允许的极限,同时用多核并行计算,这是另一笔成本账。
3.2 求解器组合:密度基、压力基和湍流模型怎么配
启动段桨尖马赫数从0爬到0.59,既有密度变化不大的低速段,也有明显压缩性的高速段。我最后用了密度基耦合隐式求解器。密度基在整个转速范围里都保留可压缩性,不会出现压力基在低马赫段压力-速度耦合不稳的毛病。代价是低速段收敛慢,本质上是一个时间步一个时间步磨出来的。
流体设为理想气体,黏度用Sutherland公式。理想气体状态方程配合旋翼做功导致的当地温度变化,比不可压缩常数密度假设更接近真实。湍流模型用SST k-omega,这是旋转机械和分离流的标准选择。启动初期大攻角分离流非常强,SST在逆压梯度分离的预测上比k-epsilon可靠得多。
如果要更精细地捕捉低雷诺数下的转捩,应该上γ-Reθ转捩模型,但瞬态计算里转捩模型对网格和时间步长极其苛刻。我这里整体看载荷,转捩位置误差对积分量影响有限,所以妥协了。如果你发现启动初期桨叶吸力峰附近出现明显层流分离泡,那就要考虑加转捩模型。
离散格式上,流动项用二阶迎风,时间项用二阶隐式。一阶格式在瞬态旋翼计算里耗散太大,桨尖涡会衰减得特别快,等看到结果时涡早就糊了。二阶格式需要更小的步长和更多子迭代,但对启动过程这种强非定常问题,这点成本必须花。
3.3 时间步长与子迭代的控制逻辑
时间步长是启动仿真里最需要拿捏的参数。定得太小,计算量爆炸;定得太大,桨叶每转的采样点数不足,桨尖涡会在数值上提前破碎。
我的做法是拿额定转速下的每转步数来控制。额定380rpm约等于6.33转/秒,如果时间步长取2e-4秒,每步旋转约0.46度,一转差不多788步。这个分辨率对旋翼气动力和桨尖涡追踪是够用的。启动初期转速低,同样时间步长下每步转过的角度更小,分辨率更细,正好覆盖低转速段的强分离流。
子迭代次数我放在25到30之间,每个时间步内残差至少下降两个数量级再进入下一步。FLUENT的双时间步法要求内部迭代收敛,不然非定常结果会被上一时间步的未收敛残差污染。启动阶段转速变化最大的那段时间,子迭代次数可以加到40,因为角加速度大,流场变化剧烈,单步收敛难度更高。
这里有个很多人容易忽略的点:FLUENT的物理时间步长在转速变化过程中不自动缩放。如果你用profile加载转速,转速低的时候每步转过角度很小,转速高的时候每步转过角度很大。所以时间步长要按最高转速来定,不能按平均转速拍脑袋。
3.4 关键监控量:不止是拉力和扭矩
我用了很多Report Definition,分别监控上、下旋翼的瞬时拉力、瞬时扭矩和无量纲系数。上下旋翼不能合并监测,因为启动过程中两副旋翼的载荷分配一直在变,合并后会把干涉信息抹掉。
无量纲系数的定义要固定,推荐用拉力系数CT和扭矩系数CQ。需要特别关注的是上下旋翼拉力比,这个比值在启动早期往往比额定状态下更偏离1。如果比值出现无规律的剧烈振荡,要检查是物理上的桨尖涡切割,还是时间步长导致的数值振荡。
此外我还设了几个流场探针,位置分别在桨尖平面外侧0.25R处和上下旋翼中间。探针记录的是当地速度和压力脉动,可以用来对时间历程做FFT,看启动过程中有没有明显的通过频率峰值漂移。到了后处理阶段,Q准则等值面是判断桨尖涡形态的最好工具,建议把每个时间步的涡量场都写出来,不然启动过程结束后想倒回去看某个时刻的涡结构都没有数据。
4. 算出来的结果怎么读:几个容易被误判的启动现象
4.1 低转速段的拉力“过冲”是真实物理还是数值假象
启动过程最容易被拿来说事的一个现象,是低转速段拉力或扭矩出现一个短暂峰值,看起来像个过冲。我从结果里也看到了这个现象,但要分清楚它有多少是物理,多少是数值。
物理上,低转速段桨叶剖面处于大攻角状态,如果攻角进入失速后升力系数仍有迟滞,气动力会出现瞬时增大。再加上启动时角加速度给周围流体附加动量,扭矩里会多出一项惯性项,峰值会出现在转速还没到额定值的时候。
数值上,时间步长过大或者网格太粗,也会造成类似过冲的振荡。判断方法不复杂:把时间步长减半,重新算启动段,看峰值位置和幅值是否基本不变。如果峰值随着步长减半明显下降,说明是时间离散误差,不是真实物理。如果峰值依然稳定出现在同一转速区间,才有资格谈物理机理。
我的结果里,上旋翼拉力在转速达到额定值的60%左右出现了一个约15%的凸起。把时间步长从2e-4改成1e-4后,凸起位置基本不变,幅值只下降了不到1%,这才放心认为它跟启动加速过程有关。
4.2 上下旋翼干扰随转速的变化
上下旋翼的干扰从启动一开始就存在,但表现形态一直在变。低转速段,上旋翼尾流向下输运速度慢,桨尖涡更像一团卷起来的云,下旋翼在通过上旋翼尾流区域时载荷脉动不明显,但平均载荷会受到“堵塞”效应。
转速上来以后,上旋翼桨尖涡强度和输运速度都增加,下旋翼每转一圈都会更清晰地切过一排涡,载荷时间历程里出现明显的通过频率脉动。这个脉动的幅值不是单调增大的。我在结果里观察到,中转速段脉动最强,接近额定转速后反而有所减弱,原因是额定状态下诱导速度增大,桨尖涡被拉得更开,对下旋翼的干扰范围变大但强度分散。
这个趋势对工程有价值:如果只看额定转速定常结果,会以为上下旋翼干扰就是简单的高频脉动;实际上启动过程中存在一个干扰最强转速区间,结构载荷校核不应该漏掉这一段。
4.3 地面附近启动时的台架效应
因为我保留了地面,启动过程里能清楚看到地面涡的形成。低转速段,旋翼诱导速度不足以把气流顺畅地从侧面吸进来,气流在旋翼前方和地面之间形成一个大尺度涡,这个涡的位置不稳定,会来回摆动。
地面涡对下旋翼的影响比上旋翼明显。原因是下旋翼离地面更近,地面涡直接改变了进入下旋翼的局部入流角。我在监测下旋翼叶片表面压力时,看到吸力峰两侧出现间歇性分离,这就是地面涡扫过桨盘的表现。
如果只做空中悬停启动,可以忽略地面;但要模拟地面开车状态,地面必须保留。另外,计算域底部如果设成对称面而不是无滑移壁面,地面效应会被完全抹掉,结果会偏乐观。很多启动仿真的异常振荡其实来自地面边界处理不一致,建议先核对边界条件再查网格。
5. 调试实录:三个逼疯人的稳定性和收敛性问题
5.1 压力-速度耦合方式导致的低频振荡
第一次计算时我图省事,直接用压力基SIMPLE算法。启转初期还算正常,到了转速进入中段,残差开始出现周期性的低频起伏,每一百多个时间步就涨一次。拉力和扭矩曲线也跟着出现波浪状波动,周期跟旋翼转速没有直接对应关系。
查到最后,问题出在压力基求解器对低马赫数旋转流场的压力-速度解耦能力偏弱。启动过程里转速低,动压小,压力场对速度场的反馈不够强,SIMPLE系列算法在这种工况下容易产生棋盘压力振荡。
换到密度基耦合隐式后,同一个网格、同一个UDF,压力振荡直接消失。这是我在这个项目里换求解器的根本原因。如果你第一次用压力基跑启动过程发现残差不收敛,先别急着加密网格,先换求解器试一轮,成本低得多。
5.2 时间步长过大时桨尖附近出现的“数值脱落”
中间有一次我想省计算时间,把时间步长放大到1e-3秒。结果Q准则等值面里,桨尖涡变成了一串等间距的小涡环,看起来像真实的桨尖涡破碎,但每个涡环之间的间距恰好等于一个时间步内桨叶转过的弧长。
这就是典型的时间离散伪涡。桨叶在一个时间步内移动了好几度,涡量在空间上被离散成跳跃分布的片段,后处理里看着像脱落,其实是数值人为制造的空间周期。判断依据是看涡环间距是否跟时间步长和转速的乘积一致,如果一致,就是步长太大。
我把时间步长缩回2e-4秒以后,等值面重新变成连续的螺旋涡面。这个教训说明,瞬态旋翼仿真的后处理阶段,看到任何“周期性脱落”先别高兴,先检查是否满足时间步长分辨率。
5.3 网格负体积和interface附近的参数失衡
滑移网格本身不产生负体积,但两个旋转域和静止域之间的interface不能乱建。我就是因为上下旋翼旋转域半径取得不一样,导致interface两侧网格尺寸差距过大,交界面上的通量插值出现局部失衡,速度场在界面处有轻微跳跃。
解决方式是重新设计旋转域,上旋翼和下旋翼的旋转域半径都取1.35R,旋转域与静止域之间的过渡网格尺寸按1.2倍渐变,不要在interface两侧出现超过5倍的网格尺度跳跃。另一个容易踩的点是旋转轴定义不一致,上下两个旋转域必须用同一个轴心点,方向相反只能通过角速度符号区分,不能靠改轴心位置实现。
如果你的模型里除了旋转还要做变距,滑移网格就不够了,得上动态网格或重叠网格。那时候负体积问题会重新浮出水面,建议先单独做变距运动的空网格验证,再引入气动计算。
5.4 远场反射造成的边界压力波污染
启动过程一开始,旋翼相当于突然在静止空气里推了一把,产生一个压力脉冲向计算域边界传播。如果边界离得太近或者边界条件反射太强,压力波会从远场弹回来,在计算域里形成来回振荡的驻波。
这个现象最容易被误判成旋翼的非定常气动特性,因为它的频率跟旋翼通过频率无关,更像是一种低频整体脉动。我的处理方法是把计算域半径加到12R,同时用密度基的压力远场条件,压力波在边界上被削弱很多。如果条件允许,可以在计算域最外层加一层网格逐渐变粗的阻尼区,能进一步吸收外传波。
判断是不是远场反射的办法很直接:把计算域半径加一倍,重新算同样物理时间,看压力脉动曲线是否显著变化。如果变化大,就是边界效应,需要改边界而不是怀疑求解器。
6. 最后再聊几句:启动仿真里容易被忽略的三件事
做完这个X97启动仿真,我最大的体会是CFD给的结果一定要跟动力学方程配合着看。气动仿真只负责回答“给定转速曲线下气动力是什么”,它不能回答“旋翼实际多久能转到额定转速”。真实启动过程中,旋翼本身有转动惯量,发动机输出扭矩和旋翼气动阻力矩共同决定角加速度。要想预测真实启动时间,必须在FLUENT旁边再挂一个刚体动力学方程,或者用UDF里的角速度去反馈气动扭矩。这样才是完整闭环。
第二件事是不要被绝对数值骗了。几何做了简化,启动曲线做了压缩,翼型也不是原型翼型,算出来的拉力、扭矩绝对值跟实机肯定有差距。这种仿真真正的价值在于趋势和相对关系:峰值出现在哪个转速区间、上下旋翼载荷分配怎么变、到底有没有危险脉动。把这些趋势找出来,再结合试验或者更高保真度计算做标定,比单看一个数有意义得多。
第三件事是给同样准备入坑的人一个小技巧:正式启动瞬态计算之前,先用低转速MRF定常算一个初场,比如10rpm的冻结转子解,然后把这个初场插值到瞬态模型里。不要从绝对的零速度全场开始硬算,那样前几百个时间步基本都在跟初始冲击搏斗。用低转速初场可以缩短启动前期的不稳定段,又不至于丢失启动过程的物理特征。
如果你也想做共轴刚性旋翼或者其他旋转机械的瞬态启动仿真,建议先建一个缩比模型把整个流程跑通,网格量控制在几百万量级,再逐步加密。直接上一两千万网格的模型,一个时间步要转很久,调试期会非常痛苦。先把时间步、UDF、监测量这些逻辑理顺,再考虑精度和规模,这才是CFD项目该有的节奏。
