关键词:飞机结冰,CFD,面元法,拉格朗日法,软件开发
熟悉我们的读者都知道,我本来就是做结构力学的出身,现在开发一些工业软件。
但实际上,我第一次正儿八经硬刚求解器,是做的CFD求解器。那会不知天高地厚,找来几本书,就开始胡乱练功。
之所以死磕CFD求解器,是因为我当时想开发一个飞机结冰软件,用来预测机翼穿云结冰的冰形。要实现这样的功能,需要进行流场计算、水滴两相流计算、结冰热力学计算。

流场计算就是第一步。大部分事情都是这样,环环相扣。要搞流体求解器,还要搞自动生成网格,因为水滴积聚结冰是一个时间过程,翼型和流场网格需要同步更新。
那个时候还没有AI,身边也没有人指导,我还瞎琢磨了很长时间的网格生成技术,处处踩坑。
一般来说,CFD三大数值算法,有限差分、有限体积、有限元。其中有限体积目前可以说是主流。有限体积我研究了半天也没研究明白,后来干脆转向自己熟悉的有限元法。
不久,就有了第一版跑通的程序,也不知道自己写的对不对。我用圆柱绕流的算例,又开始去写水滴两相流代码,可是水滴的轨迹有了,但是水滴始终无法撞击到圆柱上,总是绕着圆柱走。
我这时候就开始怀疑,可能是流场不对。因为这个绕流的云图和其他人总是不太一样,怪怪的。

我的速度云图

别人的速度云图
然后我就每天查资料,改代码,再查,再改。如此反复,折腾了小半年。
刚进入一个自己不熟悉的领域,一定要找人指导,不需要很细,方向能指导就行。自己关门练功,极容易走火入魔。懂行的人,一看我这个结果,应该就能意识到,问题出在我的这个圆柱相比于流场来说太大了。
或者说,我的流场域太小了,通常模拟飞机在大气中运动,都要用足够大的区域包住飞机来说做网格。我也是后来做CFD仿真,才意识到问题所在。
当时我不了解这个情况,就准备放弃了。后来科室师傅建议我用面元法做流场计算。面元法不需要流场网格,只需要知道壁面的网格即可。
这额外带来了三个好处:
(1) 编程简单了,计算效率也高了;
(2) 结冰后,网格更新简单了,只要更新壁面节点就行;
(3) 两相流计算水滴轨迹的时候,不需要通过网格插值水滴位置的速度。

面元法得到的速度云图
水滴在流场中的运动,受到如下条件支配:
(1) 所在位置的流场速度;
(2) 水滴自身的重力、升力、阻力。
根据受力和牛顿第二定律,可以建立水滴的运动轨迹方程。这个就是所谓的拉格朗日法。
水滴的运动轨迹是和时间相关的常微分方程,可以通过四阶龙格库塔法按时间推进求解。

蓝:流线;红:水滴轨迹
然而,当我用圆柱算例去做的时候,仍然没有做出水滴撞击的效果。
纠结了很久我才意识到。不是流场不对,也不是水滴轨迹求的不对。
是模型不对!我设置的圆柱的半径是0.5m。它实在太大了,把气流和水滴“都撑开了”。
哪有前缘半径能到半米的机翼呢。好家伙,这一个错误,就耽误了我一年多的功夫。外行最缺的就是这些常识性的东西。
最后一个槛是结冰模型。它要解决的问题是,水滴撞击到前缘不同单元,但是由于温度限制,所有撞击的水不一定都能结成冰。没有结冰的水又接着沿着壁面滑进另一个单元参与结冰。
听着复杂,编程起来更复杂。这个模型涉及的参数特别多,方程的参数多,求解也难,其中一步还需要通过牛顿迭代法求解。
反正也是死磕了很久,终于能算出冰形了。但是这个时候又遇到一个麻烦。文献上,一般都是通过多步法时间迭代出一个符合试验的冰形。我自己也使用过NASA 的Lewice结冰软件,一般都要设置十几步迭代才能算出好冰形。

我的程序稍微多算几步,冰就发散了。并且经过反复测试,我发现我的算法设置成两到三步,算出的冰反而效果很好。
那个时候,生活和工作所迫,我已经花了两年多的时候在这个上面,已无心再纠结具体原因。速速对软件进行了封装,给软件取名为Spring 2D,并完成了大量案例的测试。

Spring 2D界面

Spring 2D结果、Lewice结果、试验对比
当年最开始接触这个领域的时候,我发现国内没有冰形计算效率和精度能够同时追上NASA Lewice的软件。我心想,只要这个软件开发出来,我就一战成名,库库挣大钱。
两年多过去后,软件真的做了出来,计算效率比NASA Lewice高,几秒就能算出一个冰形。精度水平也是持平的。除了一点成就感之外,我早就明白这个东西是赚不到钱的,它几乎是没有市场的,太小众了。
靠一个东西的成功,就能彻底翻身的事情,是不会发生在我们普通人身上的。即便有,也是和中彩 票的概率差不多。不是说这个东西很难,我解决了,我就发达了。不存在的,能力和变现之间还缺一个最重要的东西,就是渠道。普通人是没有渠道的。
前面提到,大部分文献里都提出要用多步(一般十几步)才能得到好的冰形,国内这种论文更多,几乎成了铁律。像我这两三步算出来的,都不敢往外说。
一直到去年,我无意中阅读到了90年代NASA的报告。这个报告讲的是英法美三国互相交流、验证各自结冰算法的情况。
看完我大吃一惊,英国的DRA结冰程序的单步结果比多步结果更好。这和我的情况不是一样吗!
我这才意识到,我之前看问题的角度错了。结冰计算,涉及到流场、水滴、结冰热力学、网格、各种迭代还有一大堆参数。不能把它当成是一个软件,要把它当一个系统。
直白点说,就是这所有的算法和编程细节,都是系统的一部分。只要两个人,不是用的一模一样的算法和代码,那么他们开发的结冰软件就是两个系统。不同系统,自然有各自的特性。
有的系统多步算的准,有的系统少量步数算的准,这都是特性。不是一定之规。

Spring 2D不同步数结果对比
结冰软件,让我走上了开发工业软件的路。从接触它到现在有近10年的时间,期间工作、生活诸多波折变动,这个软件也是从迷雾重重中开发出来,有遗憾有惊喜,唯独没有放弃。于我而言,这个经历是一辈子难以忘怀的。