OpenFOAM数据后处理通常使用ParaView等可视化绘图工具,在处理大量计算数据时存在效率低下的问题,本篇主要介绍基于VTK的OpenFOAM数据后处理方法,该方法通过Python程序调用VTK函数库自动执行数据场的3D图形化渲染,大幅提高了数据后处理效率,并可以此为基础开发可自定义的新型OpenFOAM后处理程序。
OpenFOAM[1]数据后处理通常使用ParaView[2]、Ensight和Tecplot360等可视化绘图工具,以上工具依赖手动操作的方式生成数据场的分布云图,因此在处理多组计算数据时存在效率低下的问题,且难以添加其他自定义功能。为解决以上问题,有必要开发程序自动完成数据场的3D图形化渲染输出,同时满足可添加自定义功能的需求。
为实现以上功能,首先需要寻找支持读取OpenFOAM数据文件的工具,同时该工具要支持3D图形化渲染功能。
VTK(visualization toolkit)为免费开源的软件系统[3],可实现三维模型的计算机图形可视化,被广泛应用于计算流体数据分析、医学建模成像等多个领域(图1)。
VTK的阅读器可直接读取OpenFOAM的数据文件,并通过数据流的方式实现数据场的3D图形化渲染,因此成为开发OpenFOAM后处理程序的理想选择。
图1 VTK在计算流体、医学等领域的应用
VTK实质上是一个C++的标准库,采用面向对象的方式构建,包含600多个类,支持Java、Python等高级语言的调用。KitwarePublic[4]及PENGUINITIS[5]网站上提供了诸多关于Python程序如何调用VTK函数库绘图的示例。在调研了现有基于VTK的OpenFOAM数据后处理方法基础上,重点介绍如何利用Python语言调用VTK函数库直接读取OpenFOAM数据,自动执行数据场的3D图形化渲染。通过该方法可实现多组计算数据的批处理绘图,大大提高数据后处理效率,并可在此基础上开发可自定义的新型后处理程序。
1
VTK的工作原理
VTK系统采用数据流的方法,实现数据信息与图形信息之间的转变。图2为基于VTK的3D图形绘制流程[6]。
图2 VTK的主要模块及3D绘图流程
绘图流程:
通过Reader读取数据,采用Filter对数据进行格式转换;
通过Mapper建立数据与图形元素间的映射关系,将数据映射到Actor对象;
通过渲染器Renderer和RendererWindows建立可视化场景和窗口,同时基于Interactor实现窗口 交互功能。
VTK库中支持读取的数据类型包括vtkStructuredPoints、vtkRectilinearGrid、vtkStructuredGrid、vtkUnstructuredGrid和vtkPolyData几大类,OpenFOAM的数据格式对应VTK中的vtkCompositePolyData数据类型,为vtkPolyData数据类型的一种,可通过vtk库中的vtkOpenFOAMReader函数读取。
2
基于VTK的OpenFOAM后处理方法
以OpenFOAM6中的顶盖驱动流算例(cavity)为例,详细介绍基于VTK的OpenFOAM后处理程序开发思路。cavity算例为OpenFOAM的经典算例之一,采用不可压缩层流流动求解器icoFoam求解。计算完成后,输入以下命令依据速度向量场"U"计算得到速度模的分布场"mag(U)"。
这里将介绍的ofvtk_reader.py程序,可实现cavity算例计算结果的3D图形化渲染。该程序可运行于Python3.6+VTK8.2.0环境,VTK库可采用Python的pip工具通过以下命令安装:
基于VTK的3D图形化渲染过程需要遵循图2所示的工作流程,下面就图2中各个VTK模块在ofvtk_reader.py程序中的实现过程进行了详细介绍。
该模块通过VTK库中的vtkOpenFOAMReader函数实现OpenFOAM格式数据的读取。
其中filename参数为算例中controlDict文件的路径,latest_time表示当前算例运行的最新时间步。运行以上代码,可以将当前最新时间步的数据读入程序中。我们要绘制的标量场存储在网格节点上,通过以下代码实现网格上标量场"mag(U)"的读取。
data_type参数设置为"cell",表示程序读取的是网格体中心上的数据。至此,网格几何信息存储在block变量中,标量场"mag(U)"储存在矩阵变量array中,其名称则储存在字符串变量array_name里。
采用vtkGeometryFilter转换读入的网格数据信息,并将其存储在geom_filter变量中。
基于vtkCompositePolyDataMapper以及SetInputConnection函数,建立网格信息与图形元素之间的映射关系。通过SelectColorArray指定网格在图形中的显示颜色由array_name变量对应的参数场决定。
通过vtkActor函数建立图形化对象actor,采用SetMapper函数选择之前建立的映射器mapper将网格数据信息映射到对象actor上。
采用渲染器vtkRenderer建立场景ren,运行AddActor函数将对象actor添加至ren场景中。
通过窗口渲染器vtkRenderWindow建立窗口对象ren_win,将场景ren添加至ren_win中。
通过vtkRenderWindowInteractor窗口 交互控件可实现通过鼠标旋转图形方向等交互功能。
除此之外,程序中还包括了定义颜色条scalar_bar和输出文本信息等模块,详情参见附件中的程序代码。
将此程序拷贝至cavity算例文件夹所在的目录中,运行后即可生成速度模"mag(U)"的3D分布云图,可通过鼠标拖拽调整网格显示的方向(图3)。
图3 cavity算例采用VTK渲染生成的速度模3D分布云图
3
总结
本文以ofvtk_render.py程序为例,介绍了如何利用Python语言调用VTK函数库读取OpenFOAM数据并实现数据场的3D图形化渲染。基于该方法可实现多组计算数据的批处理绘图,提高数据的后处理效率。同时可在此基础上结合PyQT5模块,开发新型的OpenFOAM图形化后处理工具,实现任意自定义的后处理功能。
参考文献
[1] Jasak H, Jemcov A, Tukovic Z. OpenFOAM: A C++ library for complex physics simulations[C]//International workshop on coupled methods in numerical dynamics. IUC Dubrovnik Croatia, 2007, 1000: 1-20.
[2] Ahrens J, Geveci B, Law C. Paraview: An end-user tool for large data visualization[J]. The visualization handbook, 2005, 717.
[3] Schroeder W J, Lorensen B, Martin K. The visualization toolkit: an object-oriented approach to 3D graphics[M]. Kitware, 2004.
[4] VTK/Examples. KitwarePublic. https://vtk.org/Wiki/VTK/Examples/Python
[5] VTK メモ. PENGUINITIS. http://penguinitis.g1.xrea.com/computer/programming/Python/VTK/VTK.html
[6] Stefano Perticoni. Introduction to Visualization ToolKit. 13th summer school on scientific visualization.