基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 本文介绍了如何利用Python脚本结合动态模态分解(DMD)技术,分析从OpenFOAM模拟中提取的二维切片数据,以深入理解流体动力学现象。通过PyVista库处理VTK格式的模拟数据,进行POD和DMD分析,揭示流场中的主要能量结构及动态特征。此方法为研究复杂流动系统提供了有力工具。

本文探讨了Python脚本与动态模态分解(DMD)的结合应用。我们将利用Python对从OpenFOAM模拟中提取的二维切片数据进行DMD计算。这种方法能够有效地提取隐藏的流动模式,深化对流体动力学现象的理解。

使用开源CFD软件OpenFOAM,有两种方法可以对CFD数据进行DMD计算。第一种方法是直接将OpenFOAM的场数据读入Python;第二种方法则是从OpenFOAM中提取二维切片,然后对这些数据进行DMD计算。

本文将重点介绍第二种方法,即利用Python的强大库直接分析从OpenFOAM提取的二维切片数据,执行DMD并可视化提取的模态。

OpenFOAM案例模态分解准备指南

本研究的起点是雷诺数为100的方形圆柱周围完全发展的、统计稳定的流动。在此基础上,我们将模拟时间延长至100个涡脱落周期。在每个脱落周期内,我们从数据中提取16次二维切片。二维切片的提取是通过OpenFOAM中的

surfaces

函数对象实现的,具体配置如下:

 surfaces  
 {  
     type            surfaces;  
     libs            ("libsampling.so");  
     writeControl    timeStep;  
     writeInterval   142;

     surfaceFormat   vtk;  
     fields          (p U);  

     interpolationScheme cellPoint;  

     surfaces  
     {  
         zNormal  
         {  
             type        cuttingPlane;  
             point       (0 0 0.05);  
             normal      (0 0 1);  
             interpolate true;  
         }  
     };  
 };  
 // ************************************************************************* //

模拟完成后,在案例的

postProcessing

目录中会生成一个名为

surfaces

的子目录,其中包含所有提取的表面数据。目录结构如下:

 surfaces/  
 ├── 4771.2000000577236  
 │   └── zNormal.vtp  
 ├── 4772.6200000577546  
 │   └── zNormal.vtp  
 ├── 4774.0400000577856  
 │   └── zNormal.vtp  
 ├── 4775.4600000578166  
 │   └── zNormal.vtp  
 .  
 .  
 .

在进行后续分析之前,请确保案例模拟已完成且表面数据已成功提取。

表面数据提取

为了从OpenFOAM生成的VTK文件中提取数据,我们将使用PyVista库。PyVista是可视化工具包(VTK)的Python接口,通过NumPy包装VTK库,提供了直接访问数组的方法和类。它为VTK的强大可视化后端提供了一个文档完善的Pythonic接口,便于快速原型设计、分析和空间参考数据集的可视化集成。

PyVista在科学计算可视化中具有重要价值,尤其适用于演示和研究论文的图形生成。同时它也作为其他依赖3D网格渲染的Python模块的支持库。

导入必要的模块,包括PyVista:

 importmatplotlib.colors  
 importmatplotlib.pyplotasplt  
 importnumpyasnp  
 importpandasaspd  
 importfluidfoamasfl  
 importscipyassp  
 importos  
 importmatplotlib.animationasanimation  
 importpyvistaaspv  
 importimageio  
 importio  
 %matplotlibinline  
 plt.rcParams.update({'font.size' : 18, 'font.family' : 'Times New Roman', "text.usetex": True})

接下来设置路径变量和常量:

 ### 常量
 d=0.1  
 Ub=0.015  

 ### 路径
 Path='E:/deephub/Sq_Cyl_Surfaces/surfaces/'  
 save_path='E:/deephub/SquareCylinderData/'  

 Files=os.listdir(Path)

现在可以尝试读取第一个快照表面:

 Data=pv.read(Path+Files[0] +'/zNormal.vtp')  
 grid=Data.points  
 x=grid[:,0]  
 y=grid[:,1]  
 z=grid[:,2]  
 rows, columns=np.shape(grid)  
 print('rows = ', rows, 'columns = ', columns)  

 print(Data.array_names)

输出:

 ['TimeValue', 'p', 'U']

从输出可以看出,我们的二维切片包含了时间值、压力场和速度场。利用PyVista,可以为每个快照提取涡量场,并将结果数据组织成一个大型矩阵,以便进行后续的POD计算。具体实现如下:

 Data=pv.read(Path+Files[0] +'/zNormal.vtp')  
 grid=Data.points  
 x=grid[:,0]  
 y=grid[:,1]  
 z=grid[:,2]  
 rows, columns=np.shape(grid)  
 print('rows = ', rows, 'columns = ', columns)  

 ### 对U场进行处理
 Snaps=len(Files) # 快照数量  
 data_Vort=np.zeros((rows,Snaps-1))  
 foriinnp.arange(0,Snaps-1):  
     data=pv.read(Path+Files[i] +'/zNormal.vtp')  
     gradData=data.compute_derivative('U', vorticity=True)  
     grad_pyvis=gradData.point_data['vorticity']  
     data_Vort[:,i:i+1] =np.reshape(grad_pyvis[:,2], (rows,1), order='F')  

 np.save(save_path+'VortZ.npy', data_Vort)

让我们检查一下生成的

data_Vort

数组的维度:

 data_Vort.shape  
 ### 输出
 ### (96624, 1600)

此外,我们可以可视化涡量场的一个快照:

这个可视化结果展示了方形圆柱周围的涡量分布,为我们提供了流场结构的直观认识。

正交分解(POD)

为了确定动态模态分解(DMD)的最佳近似秩,我们可以对涡量场数据进行正交分解(POD)分析。POD是一种强大的降维技术,能够捕捉流场中的主要能量结构。

以下是POD分析的Python实现:

 ### POD分析

 # 构建数据矩阵
 X=data_Vort  

 # 计算并去除平均场
 X_mean=np.mean(X, axis=1)  
 Y=X-X_mean[:,np.newaxis]  

 # 计算协方差矩阵
 C=np.dot(Y.T, Y)/(Y.shape[1]-1)  

 # 对协方差矩阵进行奇异值分解
 U, S, V=np.linalg.svd(C)  

 # 计算POD模态
 Phi_POD=np.dot(Y, U)  

 # 计算时间系数
 a=np.dot(Phi_POD.T, Y)

接下来可以分析POD特征值以评估各模态的能量贡献:

 Energy=np.zeros((len(S),1))  
 foriinnp.arange(0,len(S)):  
     Energy[i] =S[i]/np.sum(S)  

 X_Axis=np.arange(Energy.shape[0])  
 heights=Energy[:,0]  

 fig, axes=plt.subplots(1, 2, figsize= (12,4))  
 ax=axes[0]  
 ax.plot(Energy, marker='o', markerfacecolor='none', markeredgecolor='k', ls='-', color='k')  
 ax.set_xlim(0, 20)  
 ax.set_xlabel('Modes')
 ax.set_ylabel('Energy Content')

 ax=axes[1]  
 cumulative=np.cumsum(S)/np.sum(S)  
 ax.plot(cumulative, marker='o', markerfacecolor='none', markeredgecolor='k', ls='-', color='k')  
 ax.set_xlabel('Modes')
 ax.set_ylabel('Cumulative Energy')
 ax.set_xlim(0, 20)  

 plt.show()

分析结果显示,前21个POD模态捕捉了约99.9%的总能量。这一发现为我们后面选择DMD的近似秩提供了重要依据,表明使用21阶近似进行DMD分析是合理的。

以下是前几个POD模态的可视化结果,用于参考:

这些模态图展示了流场中的主要结构,为我们理解流动特性提供了直观的洞察。

动态模态分解(DMD)

动态模态分解是一种强大的技术,能够提取流场中的动态特征。以下是DMD算法的Python实现:

 defDMD(X1, X2, r, dt):  
     # 对X1进行奇异值分解
     U, s, Vh=np.linalg.svd(X1, full_matrices=False)  
     # 截断SVD矩阵
     Ur=U[:, :r]  
     Sr=np.diag(s[:r])  
     Vr=Vh.conj().T[:, :r]  

     # 构建Atilde矩阵并计算其特征值和特征向量
     Atilde=Ur.conj().T@X2@Vr@np.linalg.inv(Sr)  
     Lambda, W=np.linalg.eig(Atilde)  

     # 计算DMD模态
     Phi=X2@Vr@np.linalg.inv(Sr) @W  

     # 计算连续时间特征值
     omega=np.log(Lambda)/dt

     # 计算DMD模态振幅
     alpha1=np.linalg.lstsq(Phi, X1[:, 0], rcond=None)[0]
     b=np.linalg.lstsq(Phi, X2[:, 0], rcond=None)[0]

     # DMD重构
     time_dynamics=None  
     foriinrange(X1.shape[1]):  
         v=np.array(alpha1)[:,0]*np.exp( np.array(omega)*(i+1)*dt)  
         iftime_dynamicsisNone:  
             time_dynamics=v  
         else:  
             time_dynamics=np.vstack((time_dynamics, v))  
     X_dmd=np.dot(np.array(Phi), time_dynamics.T)  

     returnPhi, omega, Lambda, alpha1, b, X_dmd

为了应用这个DMD函数,我们首先需要准备时间偏移的数据矩阵:

 # 获取数据矩阵的两个时间步长偏移视图
 X1=np.matrix(X[:, 0:-1])  
 X2=np.matrix(X[:, 1:])

然后,我们定义近似秩和时间步长:

 r=21  # 根据POD分析结果选择
 dt=0.01*142

接下来,我们执行DMD计算:

 Phi, omega, Lambda, alpha1, b, X_dmd=DMD(X1, X2, r, dt)

在进行可视化之前,我们首先分析DMD特征值的分布。这有助于我们理解所识别的DMD模态的动态特性。我们将实部和虚部特征值绘制在单位圆上:

 theta=np.linspace(0, 2*np.pi, 150)  
 radius=1  
 a=radius*np.cos(theta)  
 b=radius*np.sin(theta)  

 fig, ax=plt.subplots()  

 ax.scatter(np.real(Lambda), np.imag(Lambda), color='r', marker='o', s=100)  
 ax.plot(a, b, color='k', ls='--')  

 ax.set_xlabel(r'$\Lambda_r$')  
 ax.set_ylabel(r'$\Lambda_i$')  

 ax.set_aspect('equal')  

 plt.show()

这个图显示所有特征值都位于单位圆上,表明DMD模态既不增长也不衰减,呈现稳定的特性。

为了可视化DMD模态,我们首先需要将DMD模态矩阵转换为数组:

 A=np.squeeze(np.asarray(Phi))

然后可以使用Matplotlib绘制DMD模态:

 Rect1=plt.Rectangle((-0.5, -0.5), 1, 1, ec='k', color='white', zorder=2)  
 Mode=11  
 fig, ax=plt.subplots(figsize=(11, 4))  

 p=ax.tricontourf(x/0.1, y/0.1, np.real(A[:,Mode]), levels=1001, vmin=-0.005, vmax=0.005, cmap=cmap)  

 ax.add_patch(Rect1)  
 ax.xaxis.set_tick_params(direction='in', which='both')  
 ax.yaxis.set_tick_params(direction='in', which='both')  
 ax.xaxis.set_ticks_position('both')  
 ax.yaxis.set_ticks_position('both')  

 ax.set_xlim(-1, 20)  
 ax.set_ylim(-5, 5)  

 ax.set_aspect('equal')  

 ax.set_xlabel(r'$\bf x/d$')  
 ax.set_ylabel(r'$\bf y/d$')  
 ax.text(0, 4, r'$f_i ='+str(np.imag(Lambda[Mode])) +'$', fontsize=25, color='black')  

 plt.show()

这个图展示了第11个DMD模态的空间结构。类似地,我们可以绘制前6个DMD模态:

这些DMD模态图揭示了流场中的关键动态结构,为我们深入理解方形圆柱周围的流动特性提供了重要依据。

通过结合POD和DMD分析,我们不仅捕捉了流场的主要能量结构,还揭示了这些结构随时间的演化特性。这种综合分析方法为复杂流动系统的研究提供了强大的工具,能够帮助我们更深入地理解流体动力学现象。

总结

本文详细介绍了一种基于OpenFOAM和Python的流场动态分析方法。我们从OpenFOAM模拟数据的提取和处理开始,利用PyVista库高效地处理二维切片数据。通过正交分解(POD)成功捕捉了流场的主要能量结构,为动态模态分解(DMD)的应用奠定了基础。DMD分析进一步揭示了流场的动态特征,使我们能够深入理解方形圆柱周围的复杂流动现象。

这种结合OpenFOAM、POD和DMD的综合分析方法,不仅提高了对复杂流体系统的认识,还为流体动力学研究提供了强大的工具。Python的灵活性和效率在整个分析过程中发挥了关键作用,展示了其在科学计算和数据可视化方面的优势。

https://avoid.overfit.cn/post/7d6faa4f21244df0ac7ed62f9833acd2

作者:Shubham Goswami

目录
相关文章
|
27天前
|
缓存 Rust 算法
从混沌到秩序:Python的依赖管理工具分析
Python 的依赖管理工具一直没有标准化,主要原因包括历史发展的随意性、社区的分散性、多样化的使用场景、向后兼容性的挑战、缺乏统一治理以及生态系统的快速变化。依赖管理工具用于处理项目中的依赖关系,确保不同环境下的依赖项一致性,避免软件故障和兼容性问题。常用的 Python 依赖管理工具如 pip、venv、pip-tools、Pipenv、Poetry 等各有优缺点,选择时需根据项目需求权衡。新工具如 uv 和 Pixi 在性能和功能上有所改进,值得考虑。
84 35
|
1月前
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python实现基于矩阵分解的长期事件(MFLEs)时间序列分析
在现代数据分析中,高维时间序列数据的处理和预测极具挑战性。基于矩阵分解的长期事件(MFLEs)分析技术应运而生,通过降维和时间序列特性结合,有效应对大规模数据。MFLE利用矩阵分解提取潜在特征,降低计算复杂度,过滤噪声,并发现主要模式。相比传统方法如ARIMA和深度学习模型如LSTM,MFLE在多变量处理、计算效率和可解释性上更具优势。通过合理应用MFLE,可在物联网、金融等领域获得良好分析效果。
64 0
使用Python实现基于矩阵分解的长期事件(MFLEs)时间序列分析
|
28天前
|
数据采集 数据可视化 数据挖掘
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
本文探讨了金融资产波动率建模中的三种主流方法:GARCH、GJR-GARCH和HAR模型,基于SPY的实际交易数据进行实证分析。GARCH模型捕捉波动率聚类特征,GJR-GARCH引入杠杆效应,HAR整合多时间尺度波动率信息。通过Python实现模型估计与性能比较,展示了各模型在风险管理、衍生品定价等领域的应用优势。
251 66
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
|
18天前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
97 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
6天前
|
数据采集 数据安全/隐私保护 Python
从零开始:用Python爬取网站的汽车品牌和价格数据
在现代化办公室中,工程师小李和产品经理小张讨论如何获取懂车帝网站的汽车品牌和价格数据。小李提出使用Python编写爬虫,并通过亿牛云爬虫代理避免被封禁。代码实现包括设置代理、请求头、解析网页内容、多线程爬取等步骤,确保高效且稳定地抓取数据。小张表示理解并准备按照指导操作。
从零开始:用Python爬取网站的汽车品牌和价格数据
|
1月前
|
数据可视化 算法 数据挖掘
Python时间序列分析工具Aeon使用指南
**Aeon** 是一个遵循 scikit-learn API 风格的开源 Python 库,专注于时间序列处理。它提供了分类、回归、聚类、预测建模和数据预处理等功能模块,支持多种算法和自定义距离度量。Aeon 活跃开发并持续更新至2024年,与 pandas 1.4.0 版本兼容,内置可视化工具,适合数据探索和基础分析任务。尽管在高级功能和性能优化方面有提升空间,但其简洁的 API 和完整的基础功能使其成为时间序列分析的有效工具。
80 37
Python时间序列分析工具Aeon使用指南
|
1天前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
22 12
|
1月前
|
机器学习/深度学习 运维 数据可视化
Python时间序列分析:使用TSFresh进行自动化特征提取
TSFresh 是一个专门用于时间序列数据特征自动提取的框架,支持分类、回归和异常检测等机器学习任务。它通过自动化特征工程流程,处理数百个统计特征(如均值、方差、自相关性等),并通过假设检验筛选显著特征,提升分析效率。TSFresh 支持单变量和多变量时间序列数据,能够与 scikit-learn 等库无缝集成,适用于大规模时间序列数据的特征提取与模型训练。其工作流程包括数据格式转换、特征提取和选择,并提供可视化工具帮助理解特征分布及与目标变量的关系。
75 16
Python时间序列分析:使用TSFresh进行自动化特征提取
|
1月前
|
数据采集 Web App开发 数据可视化
Python用代理IP获取抖音电商达人主播数据
在当今数字化时代,电商直播成为重要的销售模式,抖音电商汇聚了众多达人主播。了解这些主播的数据对于品牌和商家至关重要。然而,直接从平台获取数据并非易事。本文介绍如何使用Python和代理IP高效抓取抖音电商达人主播的关键数据,包括主播昵称、ID、直播间链接、观看人数、点赞数和商品列表等。通过环境准备、代码实战及数据处理与可视化,最终实现定时任务自动化抓取,为企业决策提供有力支持。
|
1月前
|
数据采集 缓存 API
python爬取Boss直聘,分析北京招聘市场
本文介绍了如何使用Python爬虫技术从Boss直聘平台上获取深圳地区的招聘数据,并进行数据分析,以帮助求职者更好地了解市场动态和职位需求。

推荐镜像

更多