基于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后處理程序的理想選擇。

基于VTK的OpenFOAM數據后處理方法的圖1

圖1 VTK在計算流體、醫學等領域的應用

VTK實質上是一個C++的標準庫,采用面向對象的方式構建,包含600多個類,支持Java、Python等高級語言的調用。KitwarePublic[4]及PENGUINITIS[5]網站上提供了諸多關于Python程序如何調用VTK函數庫繪圖的示例。在調研了現有基于VTK的OpenFOAM數據后處理方法基礎上,重點介紹如何利用Python語言調用VTK函數庫直接讀取OpenFOAM數據,自動執行數據場的3D圖形化渲染。通過該方法可實現多組計算數據的批處理繪圖,大大提高數據后處理效率,并可在此基礎上開發可自定義的新型后處理程序。

VTK的工作原理

VTK系統采用數據流的方法,實現數據信息與圖形信息之間的轉變。圖2為基于VTK的3D圖形繪制流程[6]

基于VTK的OpenFOAM數據后處理方法的圖2

圖2 VTK的主要模塊及3D繪圖流程

繪圖流程:

通過Reader讀取數據,采用Filter對數據進行格式轉換;

通過Mapper建立數據與圖形元素間的映射關系,將數據映射到Actor對象;

通過渲染器Renderer和RendererWindows建立可視化場景和窗口,同時基于Interactor實現窗口交互功能。

VTK庫中支持讀取的數據類型包括vtkStructuredPointsvtkRectilinearGridvtkStructuredGridvtkUnstructuredGridvtkPolyData幾大類,OpenFOAM的數據格式對應VTK中的vtkCompositePolyData數據類型,為vtkPolyData數據類型的一種,可通過vtk庫中的vtkOpenFOAMReader函數讀取。

基于VTK的OpenFOAM后處理方法

以OpenFOAM6中的頂蓋驅動流算例(cavity)為例,詳細介紹基于VTK的OpenFOAM后處理程序開發思路。cavity算例為OpenFOAM的經典算例之一,采用不可壓縮層流流動求解器icoFoam求解。計算完成后,輸入以下命令依據速度向量場"U"計算得到速度模的分布場"mag(U)"。

基于VTK的OpenFOAM數據后處理方法的圖3

這里將介紹的ofvtk_reader.py程序,可實現cavity算例計算結果的3D圖形化渲染。該程序可運行于Python3.6+VTK8.2.0環境,VTK庫可采用Python的pip工具通過以下命令安裝:

基于VTK的OpenFOAM數據后處理方法的圖4

基于VTK的3D圖形化渲染過程需要遵循圖2所示的工作流程,下面就圖2中各個VTK模塊在ofvtk_reader.py程序中的實現過程進行了詳細介紹。

  • Reader

該模塊通過VTK庫中的vtkOpenFOAMReader函數實現OpenFOAM格式數據的讀取。

基于VTK的OpenFOAM數據后處理方法的圖5

其中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中。

基于VTK的OpenFOAM數據后處理方法的圖6

  • Interactor

通過vtkRenderWindowInteractor窗口交互控件可實現通過鼠標旋轉圖形方向等交互功能。

除此之外,程序中還包括了定義顏色條scalar_bar和輸出文本信息等模塊,詳情參見附件中的程序代碼。

將此程序拷貝至cavity算例文件夾所在的目錄中,運行后即可生成速度模"mag(U)"的3D分布云圖,可通過鼠標拖拽調整網格顯示的方向(圖3)。

基于VTK的OpenFOAM數據后處理方法的圖7

圖3 cavity算例采用VTK渲染生成的速度模3D分布云圖

總結

本文以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.

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

18
1
2