0405-AICFD进展综述

前言

  • 1、本号将持续更新AI4PDEs&AI4CFD相关前沿进展
  • 2、本号主推:开源、启发性的文献
  • 3、感兴趣可以关注微信公众号:AI4CFD
  • 4、持续更新中!
alt

摘要:在过去的十年中,深度学习(DL)作为机器学习的一个分支,经历了快速的进展。为传统上难以自动化的任务开发了强大的工具,例如图像合成和自然语言处理。在模拟流体动力学的背景下,这导致了一系列新颖的DL方法来替代或增强传统的数值求解器。我们将这些方法大致分为物理驱动和数据驱动的方法。一般来说,物理驱动方法调整DL模型以通过最小化控制偏微分方程的残差来提供给定流体动力学问题的解析和可微分解。数据驱动方法为任何与调整DL模型参数时使用的观测共享某些物理属性的流体动力学问题提供快速和近似的解决方案。同时,数值求解器和DL的共生已经在湍流建模和加速迭代求解器方面取得了有希望的结果。然而,这些方法呈现出一些挑战。专门的数据驱动流模拟器常常遭受糟糕的外推能力,时依赖模拟中的误差累积,以及训练对抗湍流流动的困难。因此,正在投入大量努力研究可能改进当前技术状态的方法。

关键词:deep learning, deep neural networks, computational fluid dynamics, physics-informed neural networks, data-driven fluid dynamics, turbulence modelling

1 引言

机器学习(ML)这一术语指的是根据在之前已知数据的分析中自主识别出的模式,从新数据中进行推理所采用的一般技术。在过去的二十年里,ML的普及度急剧增长,导致了在诸如医学【1】、金融【2】和广告【3】等多个不同学科中出现了新颖且颠覆性的应用。在ML出现之前,我们对世界的认识完全建立在我们对观察到的现象进行归纳推理的能力之上。这一过程导致了无数的科学和技术进步,最终使我们能够逐步提高生活质量,并对我们无限的好奇心提供答案。获取并储存越来越多的可靠数据几乎变得毫不费力。然而,单靠人类是无法揭示大型复杂数据集中涉及大量变量的所有因果关系的。在这个背景下,ML为我们提供了利用这些数据并帮助我们继续科学和技术进步的工具。ML算法的例子包括支持向量机、随机森林、基因表达编程和深度学习(DL)【4,5】。

深度学习(DL)可以被视为更经典的机器学习(ML)算法(例如线性/逻辑回归、核方法和专家系统)的泛化,以处理更复杂的任务,如科学发现【6-9】、自然语言处理【10,11】、自动驾驶【12】或艺术创作【13,14】。DL模型最初受到大脑生理学的启发,因此它们常被称为深度神经网络,或简称为神经网络(NN)。DL的成功归因于其能力,即以嵌套层次的抽象特征表达非线性函数,其中更抽象的特征是根据较不抽象的特征计算得出的。近年来,随着计算硬件的改进,DL模型在深度(抽象层次)和宽度(每一层次的特征数量)上都有所增长,这使我们能够解决日益挑战性的问题。DL理解计算复杂系统能力的一个明确例子是AlphaZero【15】。AlphaZero是一个强化学习(RL)代理,它在除了游戏规则外没有领域知识的情况下,仅通过自我对弈学会了掌握国际象棋、将棋和围棋。这种方法与之前的计算棋盘游戏方法截然不同,后者使用人工设计的函数来评估棋盘上的位置。令人惊讶的是,尽管缺乏领域专业知识,AlphaZero在每个学习的游戏中都超过了世界冠军程序。2022年,AlphaZero的另一个版本,名为AlphaTensor【7】,发现了矩阵乘法的更快算法,这是50年来第一次提高了Strassen两级算法的效率。这最新的成就展示了DL可以如何用来推动科学发现。另一个对科学有重大贡献的是AlphaFold【6】。这个DL模型是第一个能以原子精度预测蛋白质的三维结构的算法,并且它已经被用来确定几乎所有已知蛋白质的结构(超过2亿个结构)。

流体动力学是在航空学【16,17】、土木工程【18】、生物学和医学【19,20】、环境科学【21】和计算机生成图像(CGI)【22】等多个科学和工程领域都至关重要的学科。由于测量设备的改进和高度并行的计算模拟,过去几十年流体动力学数据的可用性一直在增加,这使得最近应用DL技术于流体动力学成为可能,目的各异。自2016年以来,关于DL和流体动力学的发表文章数量呈指数增长。这些方法被应用于识别未知流动参【23,24】、流动超分辨率【25-28】、从直接或间接散射测量重建场【29-32】、降维【33-35】、流动控制【36,37】和数据同化【38】。

计算模拟流体动力学是理解不同条件下流动行为的重要工具,并在工程设计和控制中发挥作用【39】。这通常是通过数值求解偏微分方程(PDE)来完成的,但迄今为止,这些方法仍存在一些众所周知的缺点,包括稳定性限制、高计算成本和湍流项的不准确建模。尽管深度学习(DL)技术有其不足之处,但它已经在流体动力学中找到了直接应用,试图解决数值求解器的某些限制。卷积神经网络(CNNs)已被证实能够比数值流体求解器加速两到四个数量级【40-42】。其他DL技术已经专门开发出来满足守恒原则,如所谓的物理信息神经网络(PINNs),它们提供对纳维-斯托克斯方程的解析和易于微分的解决方案,避免了生成网格和强制执行与数值求解器相关的稳定性约束【23,43】。使用DL的视觉精确流体模拟已经实现了实时模拟【44】。

本综述关注深度学习(DL)方法在推断稳定和非稳定流动动力学方面的应用。它试图识别现有的方法,并为读者提供如何运作的基础理解,突出它们与数值流体求解器相比的优势和劣势。这不仅与流体动力学实践者相关,也可能对从事动力系统状态推断的新兴方法的研究人员感兴趣。这包括金融、流行病学和环境科学等领域。先前有关流体动力学数据驱动和机器学习方法的调查是由Brunton等人【45】和Brenner等人【46】进行的。在这篇综述中,我们特别关注DL和流体模拟。其他重要的综述则针对使用物理信息神经网络(PINNs)求解微分方程【47,48】、通过机器学习进行湍流建模【49】以及使用深度强化学习进行流控【50】等特定主题。

我们根据DL方法模拟流体动力学的预测是否是由于学习满足控制方程或重现这些方程的解决方案的结果来分类。我们将前一组方法称为物理驱动方法,后一组称为数据驱动方法。物理驱动的模拟器以无监督的方式训练,以获得最小化控制方程残差的解决方案【23,43,51】,而数据驱动的模拟器则训练以最小化推断解决方案与数值求解器生成的目标解决方案之间的差异【40,44,52,53】。这样做的一个重要后果是物理驱动的模型学习流体动力学问题的一个精确解决方案,同时,数据驱动的模型可以通过在数值解的数据集上插值快速生成任意数量的近似解决方案,尽管它们的准确性是不确定的。因此,我们特别关注数据驱动方法,因为它们的新颖性和大幅加速流动模拟的能力【41,44,54】。与大多数数值流体求解器一样,数据驱动的模拟器在流体域的空间离散化上运作。我们将区分为结构化网格(通常是笛卡尔网格)和非结构化网格设计的模拟器,尽管它们有许多相似之处,但在数据存储和处理方式上有所不同。除了进行端到端的模拟外,DL模型也被用来在算法的一个或多个组件中补充数值求解器,例如提供更精确的湍流闭合【55-57】、更有效的预处理器【58】或更好的迭代算法初始值【59,60】。

本文的其余部分组织如下:第2节概述了深度学习(DL)算法的基础,接着是对用于流体动力学模拟的物理驱动方法(第3节)和数据驱动方法(第4节)的综述。在第5节中,我们讨论了一些使用数据驱动模型来增强数值求解器的方法。最后,在第6节中给出了总结性的评论和未来的展望。

2 深度学习基础

神经网络(NN)是一个参数化函数,旨在最小化给定的损失函数。NN最基本的构建模块称为神经元。如图2a所示,一个神经元接收 个输入特征, ,并以非线性方式处理这些输入,以产生输出:

其中 是第 个输入特征的权重系数, 是偏差系数,而 是一个非线性函数,被称为激活函数或传递函数。已经为不同类型的ML任务提出了多种此类函数【4】,目前最受欢迎的是整流线性单元(RELU)

在网络中,每个神经元的权重和偏置是通过最小化给定的损失函数来调整(或学习)的,这个过程通常被称为训练。这种最小化通常是通过使用随机梯度下降和通过反向传播计算损失函数相对于权重的导数来实现的【4】。根据评估损失函数时是否涉及注释数据(即每个输入都分配了预期的输出),训练可以被分类为监督学习或无监督学习。在监督学习中,深度学习(DL)模型学习将输入映射到训练数据集中的相应输出。另一方面,在无监督学习中,DL模型在没有明确告知正确输出应该是什么的情况下发现数据中的模式。最后,也有可能在注释数据和非注释数据的混合上进行训练,这被称为半监督训练【63,64】。

多层感知机。在一个多层感知机(MLP)中,神经元被安排成顺序排列的层,每个神经元接收前一层所有神经元的输入【4】。第 层的第 个神经元的输出为

其中 是第 层中神经元的数量, 是第 个神经元在第 层的输出特征, 是第 层的第 个神经元与第 层的第 个神经元之间的权重, 是第 层的第 个神经元的偏置。一个MLP包含一个输入层、一个或多个隐藏层,以及一个输出层,如图2b所示。在1990年代,MLP开始用于直接映射航空控制参数到翼型的空气动力学系数【65,66】和涡轮机叶片【67】。尽管它们的架构简单,但根据通用逼近定理【68,69】,一个带有一个隐藏层的MLP(理论上)能够逼近任何连续函数。正如在§3中讨论的,这一特性促使人们使用MLP来逼近包括纳维-斯托克斯方程在内的PDEs,这些方程规定了流体动力学【23,43】。MLP的另一个有用特性是它们能够通过映射到降维空间来逼近恒等函数。这种类型的网络被称为自编码器,已经被用于找到降阶的流体模型【33,52】。

alt

卷积神经网络(CNN或ConvNet)。包含一个或多个卷积层的神经网络被视为CNN。二维卷积层在一个可学习的核(也称为滤波器) ,和一个输入特征映射 之间应用了一个修正的互相关(这实际上并不是卷积,因为省略了翻转操作)。它输出特征映射 。这在图3中有所说明,并且由下式给出

其中 包含偏置系数。这里, 输入通道的大小, 输出通道的形状,而 是卷积核的大小,这必须提前定义。三维卷积层在MLP中也很常见,并具有类似的性质【4,70】。与MLP中完全连接层不同,卷积层的核和偏置对于 中的每个输出值是共享的,这导致了平移不变性,减少了可学习参数的数量,并增强了模式识别【4】。CNN还可能包括池化层,通过对特征图的非重叠区域应用最大/平均过滤器来减少特征图的大小。结合卷积层和池化层允许学习覆盖一系列分辨率的模式。完全卷积网络的另一个优势,在于它们没有任何完全连接的层,这使得它们独立于输入大小。由于这些原因,CNN经常被用于从数据中学习模拟欧拉流体动力学【40,41】。已经探索了许多不同的CNN架构,其中残差网络(ResNet)【71】和U-Net【72】最成功地用于学习流动模拟。特别是,由收缩路径和扩展路径通过跳跃连接组合而成的U-Net架构,在未见过的流体域的几何形状上展现了良好的泛化性能【41,42,73,74】。训练CNN的一个流行方法是生成对抗网络(GAN)框架,它通过提供更复杂的损失函数,最大化CNN产生与真实场地无法区分的流场的能力【63,75,76】。

alt

图神经网络(GNN或GraphNet)。有向图是一对集合 ,其中 是节点的有限集合, 是有序的不同节点对的有限集合,称为边【77】。在图上进行DL的背景下,对于一条边 ,第一个节点 被称为发送节点,第二个节点 被称为接收节点。为了在图上执行DL,每个节点 被赋予一个节点特征向量 ,每条边 被赋予一组边特征 【78,79】。应用于图的DL算法最常见的家族是谱图卷积【80-82】和空间图卷积【83-86】。后者最近因其更高的效率和灵活性而比前者更受欢迎【78】。2017年,Gilmer等人【86】引入了消息传递神经网络(MPNNs),这是一种空间图卷积的通用框架,其中每条边及其发送节点的特征和接收节点的特征一起处理后再传递给接收节点,并相应地更新特征。Battaglia等人【79】通过引入边更新步骤扩展了这种消息传递(MP)算法。如图4所示,MP算法执行三个步骤:

更新边属性:

聚合边属性:

更新节点属性:

其中 是节点 的传入边集合, 分别是边和节点更新函数,通常由MLP【87,88】建模。MP层的可学习参数是这些函数的参数。图卷积网络(GCN)【82,89-91】是MPNN的一种特定类型,其中 是一个线性层,应用于 ,并且权重根据发送节点和接收节点的度数进行归一化, 是恒等函数。GNN通常由顺序排列的消息传递和激活层组成【92,93】。这些网络已经在学习模拟各种物理现象方面取得成功【87,88,94】,包括流体动力学【53,54,93】。

递归神经网络(RNN)。RNN是任何一个其构建块(如神经元、全连接层、卷积层、消息传递(MP)层等)进行迭代评估的神经网络,它通过在输入之外,再添加一个在之前评估期间获得的内部状态进行喂食。这一特性使其能够学习时间动态行为。考虑一个NN,它有两个全连接层:FC1和FC2。在网络的第 次评估时,输入 被送入并且内部状态 从FC1获得。然后, 和前一迭代的内部状态 被连接并送入FC2,返回 。因此,该网络在第 次评估时的输出如下:

更复杂的RNN架构,例如长短期记忆(LSTM)【95】和门控循环单元(GRU)【96】,能有效学习长期依赖【4】。LSTM已被用于推断流体流动的时序演化【52,74,97,98】。另一种非递归架构适合于建模时间依赖性,被称为变换器(transformer)【10】。虽然变换器在自然语言处理中非常受欢迎【111】,但它们在物理建模方面还没有被充分探索。

3 物理驱动的神经网络流体求解器

​ 迄今为止,有限差分法(FDM)、有限元法(FEM)和有限体积法(FVM)一直是求解纳维-斯托克斯方程的主要数值方法。FEM和FVM属于一大类用于求解偏微分方程(PDE)的数值方法的家族,其中解决方案是通过(全局或局部)试验函数的线性组合近似的,这种方法被称为加权残差法(MWR)【39】。受到MLP的通用逼近定理最近的表述【68,69】的启发,一个基于深度学习技术的MWR的修改版本被开发并应用于求解简单的PDE。在这种方法中,一个MLP,以时间和/或空间坐标为输入,并通过其权重和偏差参数化,代表了PDE解决方案所在的函数子空间。因此,在经典MWR中使用的试验函数的线性组合被一个MLP取代,其参数可以在无监督的方式下调整以近似PDE的解决方案【99-101】。

如Dissanayake和Phan-Thien在1990年代最初提出的【99】,MLP的参数是通过最小化一个包含在某些配置点评估的PDE残差的损失函数来调整的。这种优化是通过应用梯度下降算法完成的,这等同于已经很成熟的MLP训练过程。由于损失函数包括了PDE的残差,MLP输出的时间和/或空间导数必须在训练期间的每次损失函数评估时计算。Lagaris等人【100】建议使用反向传播,即一层一层地应用链规则,来获得相对于MLP输入的导数(这些是时间和/或空间坐标)。这是一个关键贡献,因为它允许使用少量配置点获得导数的精确值,此技术一直被使用【23,51】。还有一些作者选择使用进化算法来调整MLP的参数,尽管这并没有成为常见做法【102】。

我们将这样的网络称为物理驱动,因为它们产生物理正确解决方案的能力源于它们被告知控制方程。从ML的角度来看,它们的任务是学习一个或多个物理量在初始时间点和/或域边界给定值时的时间和/或空间分布。物理驱动网络之间的主要区别在于如何施加初始/边界条件(弱约束与硬约束)以及如何聚合每个配置点的PDE残差(直接求和与空间和/或时间积分)。Dissanayake & Phan-Thien【99】建议在损失函数中包括边界条件的残差作为额外项,以便训练后的MLP大致满足边界条件,从而对网络施加弱约束。另一方面,Lagaris等人【100】施加了强约束以确保通过使用一个包含两个项的试验解来确切满足初始/边界条件:第一个项满足初始/边界条件且不包含可学习参数,第二个项由一个MLP乘以一个函数组成,确保初始/边界值不会被MLP修改。尽管收敛性有所提高,这种方法仅限于矩形域,并且需要人为设计的满足初始/边界条件的函数。为了克服这一限制,Lagaris等人【101】将他们之前的工作扩展到任意复杂的边界几何形状,但提出的方法过于计算昂贵且未获支持。Dissanayake & Phan-Thien【99】和Lagaris等人【100】还遵循了两种不同的方法来聚合配置点的PDE残差;Lagaris等人【100】直接求和所有残差,而Dissanayake & Phan-Thien【99】计算了计算域上残差的积分。在1990年代和2000年代,Kumar和Yadav【47】对MLP解微分方程的应用进行了详细的综述。

物理驱动NN在流体动力学中的首次应用来自Baymani等人【43】,他们遵循Lagaris等人【100】的方法,求解了通过微通道的静止不可压缩的电渗流的二维纳维-斯托克斯方程。他们的MLP以空间坐标为输入,并返回这些坐标处流函数的值作为输出。通过近似流函数而不是速度场来满足连续性,因此损失函数仅计算动量方程的残差。如Baymani等人【43】所强调的,他们的流动求解器相比数值求解器的一个显著优势是,纳维-斯托克斯方程的解以可微分的封闭解析形式获得,并且可以在后续计算中轻松使用。另一个直接的优势是,这种方法不受稳定性约束的限制,这使得他们能够在仅有20×8配置点的网格上评估动量方程的残差,而有限元法求解器中是2400×80个节点。

最近,物理信息神经网络(PINNs)被开发用来解决已知全部或部分控制方程的前向和逆向问题【23,24,29,30,103,104】。前向问题包括在域边界上和/或初始时间点放置的一组配置点上给定训练数据来求解一组PDE。PINN解决前向问题的方法与早期物理驱动的神经求解器类似,对初始/边界条件施加弱约束。即,损失函数的一般形式为 ,其中 代表PDE的残差, 代表初始时间点配置点上的误差, 代表边界上配置点的误差。系数 是训练的超参数。与早期工作的主要区别在于选择任意配置点而不是通过网格生成算法生成的节点,使得PINN框架成为一种无网格方法来求解PDE。

Wang等人【104】应用PINN框架来解决雷诺数为100的驱动腔流中的稳态二维纳维-斯托克斯方程。他们观察到在训练PINN时,与初始/边界条件( )相关的损失函数项和与PDE残差( )相关的项可能以不同的速度收敛。为了克服这一问题,他们提出了一种在训练过程中动态修改系数 的策略。Psaros等人【105】最近也从元学习的角度解决了这个问题。此外,Wang等人【104】展示了两种不同的公式来解决纳维-斯托克斯方程。在第一种情况下,神经网络推断输入坐标处的速度和压力,并训练以最小化动量和连续性方程的残差。在第二种情况下,神经网络推断流函数和压力,并训练以最小化动量方程的残差,因为与Baymani等人【43】的工作类似,通过使用流函数保证了连续性方程的满足。

alt

图5显示,速度-压力公式(图5b)未收敛到预期解决方案,而流函数-压力公式(图5c)得到了与有限差分法(FDM)求解器(图5a)相似的结果。这些结果说明了选择适当的输入和/或输出变量的重要性,因为这可能会显著影响网络学习底层物理的能力。遵循类似的思路,Beucler等人【107】提出了一种将控制方程作为硬约束在PINNs中施加的通用技术,但这仅对代数方程有效。虽然可以使用离散化的PDE,但这将会丧失与PINNs相关的优势——PDE解不会是连续且可通过自动微分进行微分的,并且需要网格化步骤。另一个相关的研究是使用PINNs解决流体动力学问题,例如对于一维欧拉方程,在不连续性周围随机分布的几个散乱点上获得了不连续的解【103】。

PINN框架引入的关键新颖性来自于它们解决逆问题的能力,在逆问题中,一个或多个PDE系统的参数是未知的,目标是从流体域内分散点集上的数据中推断出它们的值的近似值。这项技术已经被用于流体动力学应用中的参数识别【24】和从散乱的实验测量中重建场【29,30,103】。这些主题超出了本综述的范围,感兴趣的读者可参阅Cai等人的综述【48】。

物理驱动求解器具有使它们比数值求解器更高效的属性,特别是针对特定问题。首先,它们允许在不需要流体域网格的情况下获得准确解,这对于几何形状复杂的域来说是一个具有挑战性且代价昂贵的过程,尽管这些在工业上更具相关性的问题迄今尚未尝试。其次,PDE系统的解决方案以可微分的封闭解析形式获得,可以轻松用于任何未来的计算。这也使得在流体域的任何点评估解变得简单,并且可以在训练网络期间未考虑的时间点评估解,尽管这种时间外推可能意味着很高的不确定性。在最近由Du等人【108】引入的PINNs的修改版本中,网络的权重在每个时间点更新以满足控制方程。尽管这消除了时间外推问题,但它也显著增加了总运行时间并增加了计算解的时间导数的成本。最后,与一些数值求解器采用的显式时间积分方案不同,大多数物理驱动的神经求解器没有任何稳定性约束,这允许使用更少的配置点。当前最大的挑战是物理驱动求解器的收敛速度通常比数值求解器慢,且PDE的残差保持较高【109,110】。目前正在努力克服这些问题,通过设计全局自适应激活函数【109】和局部自适应激活函数【110】,以及使用从变分方法衍生的损失函数【111-113】。

4 数据驱动的神经求解器

与物理驱动方法相反,数据驱动的神经求解器没有调整以满足任何控制方程。它们是根据流体解决方案的数据集观察来调整的,这些解决方案通常是由数值求解器生成的,它们从中学习了底层物理的近似。与数值求解器一样,流体域必须被离散化成有限的节点集。这些求解器由一个神经网络(NN)建模,该网络以某些物理变量(例如粘度、强制函数等)在这些节点的值为输入,并推断出这些节点上感兴趣的物理变量的值(例如速度和压力场)。

所有在第2节中描述的NN类型都被考虑用于这项任务。它们以监督方式针对大型数据集进行训练,以最小化一个损失函数,该函数量化了网络预测和这些量的真实观测之间的误差。训练数据集通常包含数百或数千个流动模拟,选择基于这样的信念:NN将学习重现其中的相关动态。一旦训练完成,NN模型就构成了一个插值器,能够给定输入变量近似流动解决方案。与数值求解器的运行时间相比,NN的评估速度极快。因此,这种方法在推理时带来了两到四个数量级的加速【40,44,54】。这种加速的原因有两个:首先,隐式数值求解器需要迭代求解大型方程系统,而NN通过单一评估返回解决方案;其次,与显式数值求解器不同,NN对网格和时间步长大小没有稳定性约束,允许更粗的网格和时间离散化。

快速流动推断是开发数据驱动神经求解器背后的主要动机。然而,它们的插值性质限制了它们对训练数据集之外的物理配置的泛化能力。文献中的大多数研究试图通过探索新型架构、损失函数和技术来缓解这一局限性,以强或弱的方式将我们的部分物理知识嵌入模型中。在本综述中,我们进一步将数据驱动的神经求解器分类为适用于流体域的结构化(第4(a)节)、非结构化(第4(b)节)和拉格朗日(第4(c)节)离散化。

(a) 在结构化网格上的数据驱动流动推断

到目前为止,大多数用于模拟流体动力学的数据驱动DL模型都基于应用于结构化网格的CNN,通常是笛卡尔网格【40,41】。我们进一步将这些模型细分为用于推断(i)稳定层流,(ii)时间平均湍流和(iii)非稳定层流。我们不考虑湍流时间演变的推断,因为这是一个尚未被DL充分解决的具有挑战性的问题,初步研究旨在仅通过类似于非稳定层流推断的方法来匹配长期统计数据【114–116】。

(i) 在结构化网格上稳定层流解决方案 2016年,Guo等人的开创性工作【40】率先将数据驱动的CNN应用于笛卡尔网格上快速推断流体解决方案,并促成了CNN在此任务中随后的爆发性流行【41,42,52,63,75,117】。Guo等人【40】训练了一个CNN,将表示笛卡尔网格上流体域几何的标量场映射到由此产生的稳定速度场的各个分量。该架构由一个编码器组成,将几何场映射到低维潜在空间,以及多个解码器,每个解码器将潜在特征映射到速度场的一个分量。编码器由堆叠的卷积层和一个全连接层组成,解码器由堆叠的反卷积层构成。考虑的流动案例是在雷诺数Re = 20时绕多边形(训练数据集)和汽车轮廓(测试数据集)的二维稳态流动。CNN被训练以最小化推断的速度场与训练数据集中包含的数值解之间的平均平方误差(MSE)。推断时间比用于生成真实数据的数值求解器快两个数量级。它对绕未见过障碍物的流动进行外推的能力通过测试数据集进行了评估。例如,图6显示了数值求解器和CNN得到的速度场大小的比较。这项工作的另一个重要贡献是使用几何场来捕捉流体域的几何形状。他们评估了几何场的两种替代定义:(i)二进制场,在固体内部取值为一,在流体中为零;(ii)有符号距离函数(SDF)场,它在每个点取到最近墙面的距离值。研究表明SDF场提供比二进制场更准确的结果,尽管这两种方法都继续被使用【41,42,63,117】。后来使用CNN进行流动模拟的研究为架构改进做出了贡献【52,63】,并特别设计了损失函数【63,64,75】。

编码器-解码器架构,例如Guo等人【40】使用的,是推断纳维-斯托克斯方程的稳态和时间平均解决方案的最常见的NN架构。更一般地,编码器通常包括一堆卷积-激活层和池化层,将输入特征降维到低维空间,称为潜在空间,而解码器由一堆卷积-激活层和反卷积或插值层组成,用来上采样潜在特征,并最终生成输出场。U-Net【72】是一个完全卷积的编码器-解码器网络,其编码器和解码器层通过跳过连接相连。通过避免使用全连接层,它可以支持任意维度的输入。由于其始终良好的性能,U-Net目前是推断稳态流动解决方案最主要的架构【41,42,63,74】。图7展示了一个有三个分辨率层次的U-Net架构。有两个跳过连接导致在编码器和解码器中特征图的串联。U-Net在流动推断中的成功可归因于它们提取不同尺度流动特征的能力,并分享由编码器识别的判别特征与解码器进行场合成。由于流体动力学的多尺度性质,这一点特别相关。在【73】中,U-Net的泛化准确性与三种在图像分割任务中流行的修改过的U-Nets——堆叠U-Nets【118】、耦合U-Nets【119】和并行U-Nets【73】进行了比较,用于推断绕钝体和NACA翼型的2D流动中的速度和压力场,雷诺数为10,给定二进制几何场作为输入。作者发现,尽管修改过的U-Nets的训练成本显著更高,但它们并不一定会带来更好的预测准确性。

alt

大多数损失函数——例如平均平方误差(MSE)和平均绝对误差(MAE)——仅计算预测场与真实场之间的点对点误差。然而,在计算机图形学和工程应用中,通常更希望最大化推断解的真实性或最小化它们与守恒定律的偏差,而不是最小化点对点误差。受到图像到图像转换进展的启发【120】,Barat Farimani等人【63】提出了使用一种特殊的损失函数,这个损失函数捕捉了UNet在稳定驱动腔问题中速度和压力输出场的真实性概念。这个函数结合了预测和真实数据之间的MSE和第二项,第二项测量了一个判别器网络将这样的预测与训练数据集上的真实数据混淆的可能性。判别器是另一个CNN,与UNet并行训练,其任务是将U-Net模型的输出分类为属于训练数据集或不属于。这个深度学习框架被称为条件生成对抗网络(cGAN)【121,122】。尽管cGAN产生了准确的数据驱动求解器【75,76】,但与求解网络同时训练判别器模型的高计算成本使它们在实践中的性能不如其他方法。

Sekar等人【123】提出了一种通过顺序训练两个神经网络来推断绕翼型流动的新方法。第一个网络是一个编码器-解码器CNN,它将翼型轮廓的图像作为输入,并返回70个水平坐标处翼型壁的垂直位置作为输出。这样的CNN的编码器返回16个潜在特征,这些特征被解释为定义翼型几何形状的一组简化参数。这16个潜在特征,连同雷诺数和攻角一起,然后被用作MLP的输入特征,该MLP被训练以返回流体域中选定坐标处的速度和压力场。

受到CNN在获得具有可接受准确度的快速流动解的成功激励,Chen等人【117】提出使用它们来加速设计和优化任务。他们优化了一个给定面积的二维物体在低雷诺数(Re ∈ [1, 40])下稳定不可压缩流中的形状,以最小化阻力。一个U-Net被训练以从二进制几何场推断速度和压力场,并被用作梯度下降优化的每次迭代的代理求解器。阻力相对于定义物体形状参数的梯度使用自动微分计算。与数值流动求解器相比,这个框架提供了两个数量级的加速——不包括训练和生成训练数据集所需的运行时间。因此,这种方法提出了一个有前途的替代方案或补充(例如提供一个初始猜测)用于在需要反复解决类似优化问题的设置中的气动设计的伴随方法。Liu等人【124】后来进行了类似的研究,尽管使用贝叶斯优化而不是基于梯度的优化。报告了类似的加速。

alt

(ii) 结构化网格上湍流时间平均解 从深度学习的角度来看,推断湍流的平均流场与推断稳态层流并没有显著不同,因此类似的神经网络已被用于此任务【41,125-128】。据作者所知,Bhatnagar等人【125】是首次处理在高雷诺数(Re ∼ 10^6)下推断湍流平均速度和压力场的任务。他们考虑了围绕风力涡轮机叶片横截面的可压缩流(马赫数M = 0.2),使用笛卡尔网格和编码器-解码器CNN作为输入的SDF几何场。这样的CNN针对RANS求解器的解进行了训练。与Guo等人【40】不同,Bhatnagar等人【125】使用一个共享的解码器处理速度场和压力场的所有组成部分。他们证明了共享解码器尽管可调参数数量少得多,但可以产生相似的结果。这项工作中使用的编码器-解码器的一个独特特征是,雷诺数和翼型的攻角被明确包含在编码器获得的潜在空间中,而雷诺数通常被提供作为输入特征,攻角由输入几何场隐式地传达【41】。然而,关于这种做法是否有利于准确性和泛化的见解尚缺乏。这项工作的另一个贡献是添加了一个损失项,衡量输出场的梯度相对于真实场梯度的偏差。此损失项之前在提高图像锐度和减少视频预测任务中的噪声方面被考虑【129】。在流体问题中,它惩罚速度和压力场中的虚假振荡,倾向于平滑解。这个损失函数随后在非稳态模拟中变得流行【42,52,75】。Bhatnagar等人【125】探讨了他们的模型对不同翼型形状、攻角和雷诺数的预测准确性;尽管结果在定性上是正确的,但推断的场被污染了,特别是在考虑未见过的翼型形状时。

Thuerey等人【41】的开创性工作证明了数据驱动的深度学习模型可以快速且准确地预测之前未见过的翼型形状的平均速度和压力场,雷诺数在[0.5, 5] × 10^6范围内。他们的网络再次是一个U-Net,以自由流速度的分量和二进制几何场作为输入。除了他们对模型大小和训练数据量对预测准确性综合影响的详细研究外,他们最重要的贡献是对不同数据归一化策略的评估。他们发现并证明了导致最高准确性的数据归一化包括三个归一化步骤的组合: N1. 使用自由流速度的大小对速度和压力场进行无量纲化。 N2. 从每个压力场中减去其平均值(否则,学习目标是不适定的,因为解中的压力偏移与输入不相关)。 N3. 在整个数据集中线性缩放速度的水平

图8比较了使用不同归一化时获得的输出场,分别为(b) N3、(c) N1和N3以及(d) N1、N2和N3,强调使用所有三种归一化步骤显著提高了预测准确性。 除了从流体域的视觉表示(即几何场)推断绕翼型的流动外,还探索了直接从翼型的设计参数推断平均速度和压力场。例如,Wu等人【126】按照cGAN框架训练了一个CNN生成器,该生成器以定义超临界翼型的14个参数为输入。

alt

(iii) 结构化网格上非稳态流动解 已经研究了在结构化网格上推断非稳态流动的时间演变的数据驱动推断【52,75,131】。非稳态情况下的学习目标包括使用最近p个时间点的流场,t_n, t_{n-1}, ..., t_{n-p+1} p ≥ 1,来推断接下来q个时间点的流场,t_{n+1}, t_{n+2}, ..., t_{n+q} q ≥ 1,可能还需要给出一些额外信息,如几何场或雷诺数。这类任务中使用的DL模型通常以自回归方式评估,即,它们通过将自己之前的预测作为输入来迭代重新评估,以产生长时间序列,这些序列被称为展开【42】。

推断非稳态流动类似于广泛研究的视频预测任务【129,132】,这激发了该领域一些早期研究【131】。这些非稳态模型还必须解决对未见领域几何形状和流动参数的插值和外推的挑战,以及在长时间间隔内(即经过多次递归评估模型后)保持准确性。为了满足这些要求,一些作者选择了受视频预测CNN启发的编码器-传播器-解码器CNN【52,131】,而其他人则更倾向于使用类似于稳态问题中采用的编码器-解码器架构【42,75】。

通过DL预测流体系统时间演变的首批研究之一来自Sorteberg等人【131】,他们提出了一个能够在时间上外推有界正方形流体域中浅水波动态的NN。他们网络的输入特征是连续五个等间隔时间点观测到的液面的渲染图像,而预期的输出是接下来十个时间点的液面。选用的网络架构,在视频预测任务中常用【133】,包括(i)由卷积层和全连接层组成的编码器,(ii)LSTM传播器和(iii)由卷积层组成的解码器。编码器负责从输入数据中提取最相关的时空特征,传播器重复地将潜态向前演化以推断10个未来状态,解码器将这些状态转换为对应的液面图像。与用于生成真实数据的数值求解器相比,运行时间在GPU上减少了240倍,但网络只能保持80个时间步的准确性。

后续Kim等人的工作【52】在证明DL应用于计算机生成图像(CGI)方面具有重要意义,推断给定时间点t_n的速度场和定义场景的参数(例如烟雾注入器的位置)在时间点t_n和t_{n+1}下的速度场。他们同样使用了编码器-传播器-解码器NN,但是分别对编码器-解码器和传播器进行了训练,以实现每个组件的更严格专业化。编码器-解码器对被训练为自动编码器【4,33】,以最小化输入和输出速度场之间的差异。这样,编码器生成的潜在特征代表了描述场景的一组简化特征,可以通过解码器返回到高维物理空间。传播器是一个被训练用于时间积分编码器网络生成的潜在特征的MLP,由此解码器合成相应的速度场。这个框架被用于模拟二维和三维烟雾羽流和液体表面的运动,达到了高度的真实性,如图9所示。他们还争辩说,编码器-传播器-解码器策略可以被解释为一种纯粹的数据驱动方法,用于执行简化顺序建模(ROM)。与传统的ROM方法不同,这种新策略计算一个非线性简化空间,并且可以实现更高的压缩率【33,52,134】。基于编码器-解码器学习空间信息的压缩表示和另一个DL模型用于推进压缩数据的时间的编码器-传播器-解码器网络,获得了极大的流行,并且在文献中广泛存在,最常见的是使用RNN或LSTM作为传播器模型来考虑压缩数据的过去历史【134-136】。

Bai等人【137】通过实验证明CNN在建模来自流行的ML基准数据集的时间序列方面优于各种RNN,而Fotiadis等人【74】得出结论,U-Net在之前的浅水问题【131】中表现优于不同版本的LSTM模型。这可以解释为,大多数物理系统在时间上是确定性的;因此,NN无需跟踪其内部状态就可以产生展开。这导致RNN用于模拟非稳态层流的使用减少,转而使用具有编码器-解码器架构的更简单的完全卷积CNN【42,138】。例如,Lino等人【42】使用U-Net处理浅水问题,在具有各种几何形状的开放和反射边界的模拟中获得了高精度。

还为结构化网格上的非稳态问题提出了新的损失函数。Lee等人【75】提出并比较了几种损失函数,结合了MSE、判别器损失(由使用cGAN框架训练的判别器网络计算)和一个新的物理损失,由三个项组成:(i)速度和压力梯度的MSE,(ii)每个像素处的总质量通量,(iii)每个像素处的总动量通量。这个物理损失旨在在保持质量和动量的同时增强流场的锐度。然而,发现仅由MSE和判别器损失组成的损失函数导致了更高的准确性。这表明,以条件生成对抗网络(cGAN)方式训练可能在提高模型的准确性方面比试图匹配在粗糙网格上计算的质量和动量通量更为有效。通过等变卷积运算符强制执行纳维-斯托克斯方程的对称性是一个新兴研究方向,这可能有助于大幅提高CNN的泛化准确性【139,140】。部分受到图像分割中保持对称性NN的最新进展的启发【141】,Wang等人【139】将伽利略、旋转和尺度对称性纳入CNN模型。通过采用可控制的卷积【141】,实现了速度场的旋转等变性,而伽利略不变性和尺度等变性是通过对每个卷积-激活层的输入特征应用变换及其输出应用逆变换来实现的。这些模型被应用于模拟瑞利-贝纳德对流和海洋流动,展示了与未保持对称性的变体相比改进的泛化准确性。同样,Siddani等人【140】利用三维可控卷积CNN【142】将旋转等变性嵌入到CNN模型中,用于推断围绕静止颗粒的稳态流动中的速度场。尽管保持对称性的CNN在流动推断方面的结果充满希望,但它们的设计和实现增加了复杂性,这可能限制了它们的快速发展和适应。

alt

CNN的一个主要缺点是必须在规则且均匀的网格上表示解决方案,这使得它们在大多数现实世界应用中的应用变得具有挑战性。能够准确地离散化具有复杂几何形状的边界并在域内非均匀地分布分辨率是可取的,这样可以在物理解决更具挑战性的地方投入更多的计算努力。这个问题部分被Li等人【143】考虑过,他们开发了一个分辨率不变的修改卷积层,尽管空间离散化仍然需要是规则且均匀的。Chen和Thuerey【127】通过将流体域离散化为围绕翼型的c-网格或o-网格解决了这个问题。然后对物理坐标进行到曲线坐标系统的转换。在这种新的表示中,节点特征(包括其物理坐标和坐标-变换矩阵的元素)可以直接输入到CNN中。Tsunoda等人【128】也采用了类似的方法,尽管输入不同。尽管如此,c-网格和o-网格并不总是可行的离散化。在下一节中,将回顾在非结构化网格上进行流动推断的新技术。

(b) 非结构化网格上的数据驱动流动推断

在几何深度学习的最近发展之前,唯一存在的在非结构化离散化上推断纳维-斯托克斯方程的数据驱动DL技术包括结合了简化基础方法和NNs的技术【97,144-146】。这些方法使用了简化基础方法(例如POD或DMD)来构建一个低维基础,代表了从一组高保真解中提取的主要流动模式。然后,使用NN(通常是MLP或LSTM)根据给定的流动参数推断基础系数,这些系数与简化基础函数一起生成预期的流动解。然而,一个简化基础只对应一个空间离散化,因此,每个模型只适用于单一域。因此,这种方法主要限于对一系列高保真解进行时间上的外推【97,145,146】或推断不同流动参数组合的稳态解【144】。也有尝试同时处理时间和参数外推的研究【147】。

GNN模型目前是学习模拟在几何和拓扑复杂域中的流体动力学的最有前景的方法。基于消息传递的现代GNN与CNN共享基本属性,如局部性和通过权重共享的空间不变性【79】。GNN模型用于模拟物理系统的应用始于离散的点粒子系统【87,88】,随后扩展到可变形材料【148,149】和被离散为拉格朗日粒子的液体【93】(见§4(c))。更近期,GNN也被应用于模拟欧拉流动模拟【53,54】。在这个上下文中,与CNN模型不同,GNN模型可以处理流体域的任何任意离散化。这使我们能够准确地离散化具有复杂几何形状的边界,并在域内非均匀分布分辨率,将更多的计算努力投入到解决物理更具挑战性的地方。使用图G := (V, E),节点V捕获解决方案,而边的集合E,通常基于节点接近性构建,代表一种在图中传播节点和边状态的机制。与CNN模型一样,GNN模型已被用于推断稳态【91,150-152】和非稳态【53,54,153】流动解决方案。

alt

据作者所知,Alet等人【89】是首次探索使用GNN来推断欧拉力学,通过解决泊松PDE,而Belbute-Peres等人【90】是最早利用GNN的学习能力进行流体动力学研究的努力之一,采用了一个包括数值求解器提供低分辨率解决方案和GNN进行超分辨率处理的混合模型。紧随其后,Pfaff等人的开创性工作【53】提出了一个用于学习基于网格的模拟的GNN模型,包括可压缩和不可压缩流动模拟。在这个模型中,图的节点和边代表数值求解器通常使用的网格。这个模型的性能在二维非稳态模拟中得到评估,包括(不可压缩的)围绕圆柱的水和(可压缩的)围绕翼型的空气。在不可压缩情况下,每个节点的输入特征是动量的组成部分和指示节点类型(内部或边界节点)的独热向量,每个节点的输出特征是下一个时间点的动量和压力的变化。在可压缩情况下,输入和输出特征与不可压缩情况相同,加上密度及其变化。在两种情况下,每条边的输入特征是其发送节点和接收节点之间的相对位置及其大小,使得模型对坐标系的起点不敏感,因此空间不变。所采用的GNN架构由序列化的MP层组成,边更新和节点更新函数被建模为MLP。他们展示了这种设计比GCN【82】具有更高的预测准确性,GCN也已用于模拟欧拉流体动力学【90,91,154】。重要的是,他们建议GNN模型由于能够处理非结构化离散化,因此可以比CNN模型实现更高的准确性,如图10所示,很明显CNN模型未能解决更小的尺度,尽管使用的节点/像素是GNN模型的四倍。在这项工作之后,Chen等人【91】也采用了类似的模型来推断围绕钝体的稳态不可压缩流的速度和压力场。

基于CNN的数据驱动求解器常常考虑流体流动的多尺度性质【41,75】。然而,对于GNN模型,没有首选的下采样和上采样算法,选择的算法高度依赖于应用【155】。最近,Liu等人【156】开发了一个用于推断PDE解的多尺度GNN模型,他们将其应用于非线性泊松方程。对于下采样,一些节点通过从CFD借来的粗化算法被移除,而上采样则使用从粗糙网格到原始网格的线性插值。Lino等人【54】和Fortunato等人【153】最近引入了更复杂的下采样和上采样算法。对于下采样,Lino等人【54】提出了从高分辨率到低分辨率节点集的MP。类似地,上采样通过从低到高分辨率节点集的MP进行。每个低分辨率图是通过将高分辨率图的节点聚类到笛卡尔网格的单元中生成的。

(c) 拉格朗日离散化上的数据驱动流动模拟

与欧拉模拟器相比,虽然比例较小,但也使用DL开发了用于非稳态流动的拉格朗日流动模拟器【44,94,148,149,159,160】。在拉格朗日情况下,流体被离散化为一组有限的移动粒子,每个粒子分配有一定的质量和体积。存在各种数值方法用于时间积分这些流体粒子的位置和速度,例如,平滑粒子流体动力学(SPH)方法【161】和基于位置的流体(PBF)方法【162】。这些方法可以比欧拉方法更有效地模拟自由表面流和多相流,尽管它们的准确性有时可能受限【163】。因此,它们在模拟CGI和交互式虚拟环境中的液体中发挥了最突出的作用【164】。

alt

图形是存储和处理流体粒子系统的理想数据结构。每个节点可以代表一个流体粒子并存储其属性(例如,质量,位置,速度等),而每条边可以代表粒子之间的成对关系并存储涉及到它们互动的属性(例如,相对位置,粘合属性等)。因此,大多数研究都集中在GNN上【93,148,149,160】。尽管如此,CNN也已经被满意地使用【44,159】。类似于用于推断网格上流动演变的DL模型(见§4(a)(iii),(b)),这些拉格朗日模型从系统在一个或多个先前时间点的状态推断出每个粒子/节点的位置和速度,粒子轨迹是通过迭代评估先前推断的状态产生的。与用于生成训练数据的SPH求解器相比,这些模型可以实现高达两个数量级的加速【44】,主要是由于对时间步长大小的限制较低以及绕过迭代算法在每个时间点收敛到解决方案。

Battaglia等人【87】和Chang等人【88】的工作展示了使用图上的消息传递(MP)来预测二维粒子系统的动力学。这启发了Mrowca等人【148】将GNN扩展到学习三维刚体,可变形材料和液体的数据驱动模拟器,这些被离散化成数百个粒子。这些粒子被建模为图的节点,节点属性是每个粒子的位置,速度和质量。由于每个图中的节点数量很高,像Battaglia等人【87】使用的完全连接图被证明非常低效。相反,Mrowca等人【148】提议使用通过连续节点聚类获得的三级层次图,这允许在保持较少的图边数目的同时考虑到远粒子之间的相互作用。最低层的节点仍然代表流体粒子,而更高层的节点代表聚类节点的平均动力学。为了在这个层次图上应用MP,他们定义了一个修改的MP算法,计算同一层次上节点之间以及更低层次和更高层次节点之间的相互作用。

最低层的节点仍然代表流体粒子,而更高层的节点代表聚类节点的平均动力学。为了在这个层次图中应用消息传递(MP),他们定义了一个修改的MP算法,计算同一层级上节点之间以及低层与高层节点之间的相互作用,并且反之亦然。他们通过模拟一个立方体形状的液体体积落在一个表面上的场景来展示他们的方法。然而,流体粒子的数量(约200个)仍然太小,无法产生真实感的模拟。

这项工作由Li等人【149】继续,他们为处理液体引入了修改。首先,他们认为,尽管层次图结构对于模拟刚体和可变形固体是有效的,但对于液体来说,这种结构并不转化为显著的优势,因为在拉格朗日系统中,不可压缩性约束可以仅通过考虑每个流体粒子的小邻域并让它们根据需要移动来保证大致均匀和恒定的流体密度来实现。其次,模拟过程中任意一对流体粒子之间的距离可能会有显著变化,因此,他们选择动态地构建图的边,通过在每个时间点将每个流体粒子连接到其邻近的流体粒子。他们还模拟了刚体与液体之间相互作用的场景,如图11所示。该图展示了GNN模拟的改进真实感,其总运行时间在GPU上大约为一秒。

Sanchez-Gonzalez等人【93】的后续工作将拉格朗日模拟扩展到划分为数千个流体粒子的液体,同时保持了一个简单的GNN架构,这在未见物理设置下证明具有高预测准确性。每个节点的输入属性是其位置、在最后五个时间点的速度和一个指示材料类型的参数(例如,水、刚体、固体边界等)。输入边的属性是节点之间的相对位置及其大小。这个GNN由两个MLP组成,一个编码输入节点属性,另一个编码输入边属性,10个连续的MP层,以及一个MLP将处理过的节点属性解码成它们预测的加速度。

最后,Li等人【160】提出了另一个基于GNN的模型,紧密遵循平滑粒子流体动力学(SPH)方法,该模型为SPH算法的每个步骤使用不同的GNN,并采用了一个受SPH核插值启发的消息传递(MP)算法。在这个模型中,第一个GNN预测每个粒子的对流力,这些力通过时间积分来更新粒子的位置和速度。然后,第二和第三个GNN分别预测由于粒子之间的吸引/排斥作用和每个粒子的压力而导致的每个粒子动量的变化。两个结果被用来修正粒子的位置和速度。这三个GNN中的每一个都有类似于Sanchez-Gonzalez等人【93】介绍的GNN模型的架构,并独立训练以确保任务专业化。这样的分割模型具有更高的可解释性,但需要在每个时间步骤重建图的边两次。

alt

与这些GNN模拟器的开发相平行,Ummenhofer等人【159】提出了一个CNN模型来学习拉格朗日流动求解器。由于数据的分散和非结构化特性,传统的卷积层无法使用。为了解决这个问题,开发了一个连续卷积(CConv)层。与传统的卷积层一样,内核具有局部支持,尽管在这种情况下,它是一个连续的、球形的内核。其值存储在定义在立方体域上的笛卡尔网格上,并通过线性插值使其连续。内核的球形通过将输入坐标(定义在球形域上)映射到定义内核值的立方体域来处理。他们展示了他们的模型在准确性和推理速度上都显著优于Li等人的模型【149】。他们还展示了CConv层比早期的CConv层【145】在预测准确性上略有提高,而运行时间大大减少。在这项工作之后,Prantl等人【44】提出了一个修改后的CConv,通过约束卷积核是反对称的,确保了流体粒子系统的动量守恒。他们将他们的动量保守模型与Ummenhofer等人【159】和Sanchez-Gonzalez等人【93】使用的模型进行了比较。他们发现他们的模型比前者(图12a)更准确,尽管其准确性与后者相似,但其运行时间几乎减少了三倍。一个示例说明了这个求解器扩展到大型流体粒子系统(约100万)的能力,如图12b所示。这些结果表明,未来的工作方向之一可能是研究其他形式的对称性,这些对称性可能有助于进一步提高学习到的拉格朗日求解器的准确性和泛化能力,例如,旋转不变性,这已经被CNN和GNN研究过【54,141,142】。

结语

  • 持续分享更新AI4PDEs&AI4CFD前沿进展
  • 开源代码、启发性文献
  • 感兴趣请关注微信公众号:AI4CFD

本文由 mdnice 多平台发布

  • 24
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值