基于VTK的OpenFOAM數據后處理方法
來源:多相流在線
作者:吳玉欣
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程序中的實現過程進行了詳細介紹。
Reader
該模塊通過VTK庫中的vtkOpenFOAMReader函數實現OpenFOAM格式數據的讀取。
其中filename參數為算例中controlDict文件的路徑,latest_time表示當前算例運行的最新時間步。運行以上代碼,可以將當前最新時間步的數據讀入程序中。我們要繪制的標量場存儲在網格節點上,通過以下代碼實現網格上標量場"mag(U)"的讀取。
data_type參數設置為"cell",表示程序讀取的是網格體中心上的數據。至此,網格幾何信息存儲在block變量中,標量場"mag(U)"儲存在矩陣變量array中,其名稱則儲存在字符串變量array_name里。
Filter
采用vtkGeometryFilter轉換讀入的網格數據信息,并將其存儲在geom_filter變量中。
Mapper
基于vtkCompositePolyDataMapper以及SetInputConnection函數,建立網格信息與圖形元素之間的映射關系。通過SelectColorArray指定網格在圖形中的顯示顏色由array_name變量對應的參數場決定。
Actor
通過vtkActor函數建立圖形化對象actor,采用SetMapper函數選擇之前建立的映射器mapper將網格數據信息映射到對象actor上。
Renderer
采用渲染器vtkRenderer建立場景ren,運行AddActor函數將對象actor添加至ren場景中。
RenderWindow
通過窗口渲染器vtkRenderWindow建立窗口對象ren_win,將場景ren添加至ren_win中。
Interactor
通過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.
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP




















