!In [2]

%cd work/

!unzip PaddleScience_CubeDomain.zip

AI求解CFD基础案例:圆柱绕流
在这里插入图片描述
好看吗? 如果你是CFD计算流体力学领域的大牛,看了是不是非常兴奋?这涡有毒啊!!作为专业领域弟弟在这里我真的不敢从原理上解释这种现象的本质了。但是,我知道这一定是流体问题。

我们可以一起讨论下现在分析这种流体问题都有哪些手段呢?

以前在实验室的时候,接触过fluent/xflow这些专业的工具,功能确实很强大,但是大家有没有过同样的苦恼:

画的网格被师兄鄙视
计算时间漫长的让你怀疑人生,然而最尴尬的是算一半不收敛💣😶
时刻期待着有个超级厉害的服务器,期待着那些复杂的画网格、RANS/LES等各种难以理解的方程尽可能的消失。。。。
今天,我给大家搬一个新的砖,通过对流体力学中最典型的圆柱绕流问题进行分析,探索AI是否真的有可能应用到CFD的求解中,当然答案是必须滴~~~~~

先上结果,以下两幅图分别是基于openfoam以及AI两种方式对2D非定常圆柱绕流的计算结果,大家能区分AI的结果是哪一个吗?
基于OpenFoam的流场水平速度在这里插入图片描述
基于PINN的流场水平速度 在这里插入图片描述
下图为基于PINN方法结果(基于物理信息的神经网络作为近似CFD求解器),在PaddleScicen的Repo中已经更新了最新的代码结构,供大家学习

从结果能够看到基于AI的手段对于这类简单的CFD问题似乎真的能够得到很好的结果,接下来通过一个详细的项目示例,给大家有理有据的说明下AI For CFD真的很行。

背景介绍
简单引入以下概念

科学计算
【AI For Science】当前AI技术在CV、NLP等领域已有了较为广泛的应用,替代传统方法完成缺陷检测、人脸检测、物体分割、阅读理解、文本生成等任务,在产业界也形成了规模化的落地。但是放眼到更加广阔的工业设计、制造等领域,仍有诸多科学和工程问题亟待解决。比如对于高层建筑结构、大跨桥梁、海上石油平台、航空飞机等,流体和结构的复杂相互作用会引起动力荷载,进而导致抖振、涡振、驰振、颤振等流致振动,影响结构安全与服役年限。数值模拟是研究工程结构流致振动的有效方法之一,但是传统数值方法需要大量的计算资源,在计算速度上有很大的局限性等等。

在科学计算领域,往往需要针对海洋气象、能源材料、航空航天、生物制药等具体场景中的物理问题进行模拟。由于大多数物理规律可以表达为偏微分方程的形式,所以偏微分方程组的求解成为了解决科学计算领域问题的关键。神经网络具备“万能逼近”的能力,即只要网络有足够多的神经元,就可以充分地逼近任意一个连续函数。所以使用AI方法解决科学计算问题的一个思路是训练神经网络以模拟某个偏微分方程组的解函数。

详见飞桨加速CFD(计算流体力学)原理与实践

2D圆柱绕流
**【圆柱绕流】**是指二维圆柱低速定常绕流的流型只与Re数有关。在Re≤1时,流场中的惯性力与粘性力相比居次要地位,圆柱上下游的流线前后对称,阻力系数近似与Re成反比(阻力系数为10~60),此Re数范围的绕流称为斯托克斯区;随着Re的增大,圆柱上下游的流线逐渐失去对称性。—百度百科

相信大家能看到这里的一定也是行业内的专家,关于这些流体的基础概念本文就不做多说了。

PINN
**【PINN】**基于物理信息的神经网络 (Physics Informed Neural Network,简称PINN) 是一种科学机器在传统数值领域的应用方法,特别是用于解决与偏微分方程 (PDE) 相关的各种问题,包括方程求解、参数反演、模型发现、控制与优化等。

其实,简单点说就是在AI中神经网络多了我们物理学科中的控制方程作为约束,并将我们之前CFD中求解的时空信息,作为训练点,在使网络输出尽可能的符合初边值与控制方程约束的过程中不断优化网络。这个网络就是我们拟合的CFD求解器。

这种想法不是近年才有的,但是确实是随着深度学习的发展逐渐应用到了CFD或者传统的物理仿真上。

基于PINN的圆柱绕流问题求解
基于深度学习,采用PINN方法求解圆柱绕流问题主要由以下几步构成,前提是我们需要借助一个比较成熟的深度学习框架,当然我一定会用百度的PaddlePaddle框架🤣,事实证明也是比较nice的。

百度飞桨框架提供了自动微分、多类算子以及比较广泛的API。同时百度同学基于飞桨框架,开发了一套开源的科学计算套件PaddleScience,里面提供了一些基础的DEMO,也为大家后期进行深一步的工程探索提供了良好的条件。在这里插入图片描述
言归正传,接下来给搭建step by step的介绍本项目的实现流程。

环境配置
安装Paddle-gpu-develop
在进行AI求解圆柱绕流问题前,我们需要先明确深度学习的框架以及科学计算套件等环境。需要注意的是:

当前PaddleScience套件所应用的深度学习框架为Paddle-gpu-develop版本,可详见paddle安装
对于当前示例运行环境,安装代码如下:

!python -m pip install paddlepaddle-gpu==0.0.0.post101 -f https://www.paddlepaddle.org.cn/whl/linux/gpu/develop.html
安装PaddleScience及依赖项
可从git克隆到目标路径,同时也可以下载后upload. cd至PaddleScience路径,安装依赖项,基于本示例,代码如下:

%cd ~/work/PaddleScience_CubeDomain/refactor_PaddleScience_0430/
!pip install -r requirements.txt
环境变量定义
代码示意如下:

%env PYTHONPATH=/home/aistudio/work/PaddleScience_CubeDomain/refactor_PaddleScience_0430
In [ ]
!python -m pip install paddlepaddle-gpu==0.0.0.post101 -f https://www.paddlepaddle.org.cn/whl/linux/gpu/develop.html
%cd ~/work/PaddleScience_CubeDomain/refactor_PaddleScience_0430/
!pip install -r requirements.txt
%env PYTHONPATH=/home/aistudio/work/PaddleScience_CubeDomain/refactor_PaddleScience_0430
环境配置完成后,log部分示意如下:

数据集导入
神经网络的训练过程需要大量的训练数据集,我们将CFD计算中的时间t, 空间(x, y)作为训练集对网络进行训练,本案例采用了半监督的方式,即基于部分CFD计算的结果来监督网络的训练过程(目的也是加速网络的收敛,后期逐渐开放结果)

本项目直接将openfoam中定义的网格信息作为神经网络的训练点,并使用load_cfd_data模块加载数据

结合CFD求解,训练数据同样也会按照初始值、边界条件、流体域内空间点等进行区分,分别定义了如下分类数据,数据保存在./data_0430文件夹下:

域内训练点:
domain_train ----流体域内

边界训练点: 当前采用了速度入口、压力出口以及无滑移圆柱边界,并以Re=100进行分析,以下数据用于评估bc_loss.
domain_inlet ----流体域入口
domain_outlet ----流体域出口
domain_cylinder ----圆柱周边

初始值: 采样相对初始时刻作为0时刻,从openfoam提取部分位置的流场信息作为神经网络的初始值监督结果,数据保存在./data_0430/initial文件夹下,用于评估ic_loss.
同时,也从openfoam中提取了流场某些关键位置的速度、压力信息等作为网络训练的监督数据。数据保存在./data_0430/probe文件夹下。

数据加载可采用如下模块实现:在这里插入图片描述
流体参数、损失函数等定义
本示例针对不可压缩流体,并采用2D非定常时间连续方式的流体连续性方程以及动量方程作为控制方程。 模型中圆柱半径为1,针对Re=100的工况,定义入口流速为1,可调节粘度定义为2e-2。无量纲化的N-S方程示意如下:在这里插入图片描述
同时,按照速度入口、压力出口、无滑移圆柱边界等定义边界条件,并定义初始流场信息为相对0时刻,即流场稳定建立后的某一个相对时刻。

构建网络
采用PINN的方法,并选择FCNet作为深度学习的神经网络,定义代码如下,并在Train模块中直接调用即可。

PINN = psolver.PysicsInformedNeuralNetwork(
layers=6, nu=2e-2, bc_weight=10, eq_weight=1, ic_weight=10, supervised_data_weight=10,
outlet_weight=1, training_type=‘half-supervised’, net_params=net_params)
本示例采用Adam优化器求解,关于超参数的定义如下所示:

adm_opt = psci.optimizer.Adam(learning_rate=1e-4, weight_decay=0.9,parameters=PINN.net.parameters())
模型训练
基于数据导入模块、网络及训练定义模块等,可直接运行2d_unsteady_cylinder_train.py执行圆柱绕流模型的训练。 针对该示例,在V100-32G GPU显卡上,预估训练100000次左右(8h+)能够得到比较理想的结果。

In [ ]
!python examples/cylinder/2d_unsteady_cylinder_train.py
训练过程log部分示意:在这里插入图片描述
模型预测
结合训练完成后保存的网络,直接进行一次前向计算,即可得到训练过程中所有时刻的结果,只需执行如下代码,生成的结果会保存在vtk文件夹中,可通过paraview打开。

!python examples/cylinder/2d_unsteady_cylinder_predict.py
In [2]
!python examples/cylinder/2d_unsteady_cylinder_predict.py
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/init.py:107: DeprecationWarning: Using or importing the ABCs from ‘collections’ instead of from ‘collections.abc’ is deprecated, and in 3.8 it will stop working
from collections import MutableMapping
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/rcsetup.py:20: DeprecationWarning: Using or importing the ABCs from ‘collections’ instead of from ‘collections.abc’ is deprecated, and in 3.8 it will stop working
from collections import Iterable, Mapping
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/colors.py:53: DeprecationWarning: Using or importing the ABCs from ‘collections’ instead of from ‘collections.abc’ is deprecated, and in 3.8 it will stop working
from collections import Sized
/home/aistudio/work/PaddleScience_CubeDomain/refactor_PaddleScience_0430/paddlescience/pde/pde_navier_stokes.py:41: DeprecationWarning: invalid escape sequence \p
“”"
Imported Module
W0506 10:55:38.362141 927 gpu_context.cc:278] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W0506 10:55:38.366156 927 gpu_context.cc:306] device: 0, cuDNN Version: 7.6.
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
25 26 27 28 29 30]
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
25 26 27 28 29 30]
outlet data shape: 161
boundary data shape: 161
boundary data shape: 160
residual data shape: 1107540
精度分析
针对PINN中计算的流场结果,与OpenFoam结果对比如下:在这里插入图片描述
从对比结果可知,基于AI方式求解的cfd圆柱绕流模型,在大部分区域结果精度已经非常高。 但在个别位置,如边界层上则相对误差较大。由于边界层一直是流体中比较复杂的问题,也说明了AI For CFD还有很大的改进空间。

以上,欢迎各位AI+Science的小伙伴探讨交流,希望大家能够基于飞桨框架以及飞桨科学计算套件探索以及共享一些更有价值的DEMO!

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐