流体力学计算量甚大而且情况很复杂，能否用机器学习的问题来解决？
先介绍一些背景。 流体计算有很多门类，不妨打开一点思路，比如说，燃烧计算？ 从原理上讲，燃烧计算就是在流体控制方程的基础上加上化学反应源项，和化学组分对应的组分输运方程。对于三维纯流体的五个方程（一个质量守恒，一个能量守恒，三个方向的动量守恒），再多求解Ns个组分方程即可。 听起来非常简单。 实际上求解异常昂贵。 比如，美国Sandia实验室在2008年雄心勃勃地搞了一个千万亿次级（petascale），随后万亿亿次级（exascale）数值计算项目，瞄准的目标之一就是湍流燃烧直接数值模拟。下图所示（JH Chen, PCI, 2011)，是他们部分的计算结果，看起来非常炫酷。 如果不说，你肯定想不到这个项目烧了48亿机时。 你肯定更想不到这只是算一个几毫米宽的“小火苗”。 雷诺数10000，用了接近13亿个网格。 恐怖如斯。问题描述里的“计算量甚大而且情况很复杂”，燃烧计算肯定是非常切题了。 那么，为了解决问题，首先要理解问题，到底为什么求解代价如此高昂？ 简单说，就是组分数量太多，加上化学刚性太强。 组分数量多很好理解，多一个组分就要多一个输运方程。 那么化学刚性又是什么东西？简单说，化学刚性就是反应体系不同模态特征时间尺度相差太大，有几个反应几秒钟变化一次，有几个反应几纳秒变化一次，如果涉及非平衡态的过程，时间尺度可能在飞秒量级。燃烧的物理时间总是在毫秒和秒之间，有时候也会更长，取决于研究问题的尺度。而为了详细求解，数值模拟时间步长依赖于最快物理过程的特征时间。所以基本上，时间推进步数在百万步到十亿步之间，非常难搞。 如果不是强湍流的情况，很多时候，流体的特征变化时间差不多是微秒量级，但是燃烧几乎总是在纳秒量级变化，相比纯流体，一下子就要多1000倍的时间步，让整个的计算变得特别耗时。别说算个发动机啥的，算个实验室级别的小火苗都得举国之力。 但退一步说，我们真的关心几纳秒之间，中间产物有什么变化吗？好像也不是很关心。说到底，我们关心的是宏观燃烧现象，是燃烧化学反应最后跟流体在微秒及以上量级的耦合情况。 那我们能不能跳跃掉中间燃烧的细节，找一个工具，按微秒的分辨率，去预测燃烧反应，然后跟流体耦合呢？这样子我们可以加速1000倍的时间推进速度。 那么这个地方机器学习就派上了用场。 当然，机器学习不是万能的，在长期的摸索中，我总结过一个非常粗略的LED原则，即Localized（机器学习的输入是本地的），Expensive（想取代的科学计算必须是昂贵的，因为神经网络的训练和推断也不便宜），Decoupled（机器学习取代的部分与其他部分的求解可以解耦）作为机器学习在科学计算领域的一个指导。 燃烧化学反应源项预测完美地契合了这个标准。 出于这样的考虑，我们针对氢气反应，做了一系列的数据采样和预处理工作（俗称洗数据，这个在燃烧领域尤为重要），最后跑出来一个泛化性能很好，精度也不错的神经网络模型。这个模型的最大好处就是时间步长不受限制，流体计算需要什么样的步长，它就可以学习什么样的步长去预测燃烧。再也不用管化学刚性，流体计算从此可以放飞自我。 这个工作最近发表在了燃烧学顶刊Combustion and Flame上。这是文章全文的链接：A multi-scale sampling method for accurate and robust deep neural network to predict combustion chemical kinetics, Combustion and Flame, Volume 245, 2022, https://doi.org/10.1016/j.combustflame.2022.112319.https://doi.org/10.1016/j.combustflame.2022.112319。 为了方便学术交流，这个DNN模型和验证代码我们都进行了开源。模型本身就是一个高维函数的拟合器，还是非常标准的矩阵形式，有pytorch可以用pytorch跑，没有的话手动写一个矩阵计算就可以用。 当然氢气的例子还比较简单，早年间我们还做过一个二甲醚的例子（DLODE: a deep learning-based ODE solver for chemistry kinetics, AIAA Scitech 2021 Forum, 2021, https://doi.org/10.2514/6.2021-1139），在那个例子里，DNN可以起到一到两个数量级的加速效果。我觉得能十倍加速就差不多可以了，毕竟在大规模计算中，燃烧反应可能占比在70-90%之间，把这部分加速十倍，变成7-9%，那剩下的问题就可以交给计算流体力学家再去解决输运和湍流模型的问题了。 抛砖引玉，欢迎广大网友批评指正。