本篇文章将介绍如何读取fluent格式的网格和流场并显示。

Fluent是国际上比较流行的商用CFD软件包,在美国的市场占有率为60%,凡是和流体、热传递和化学反应等有关的工业均可使用。它具有丰富的物理模型、先进的数值方法和强大的前后处理功能,在航空航天、汽车设计、石油天然气和涡轮机设计等方面都有着广泛的应用。

代码及算例摘抄自 硫酸亚铜 的博客。
文章链接: 使用VTK对Fluent计算结果进行后处理

环境

  • VTK : 9.1.0
  • Python : 3.6.5

功能

  • 读取fluent网格及流场(cas和dat)
  • 显示几何
  • 显示网格
  • 读取显示流场
  • 切片操作

效果图

代码

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
try:
import vtkmodules.all as vtk
except ImportError:
import vtk
r = vtk.vtkFLUENTReader()
r.SetFileName(r'fluent.cas')
r.EnableAllCellArrays()
r.Update()

data = r.GetOutput().GetBlock(0).GetCellData()
arrays_number = data.GetNumberOfArrays()
for i in range(arrays_number):
array_name = data.GetArrayName(i)
print(array_name)
NAME = 'PRESSURE'
scalars = vtk.vtkFloatArray()
scalars = r.GetOutput().GetBlock(0).GetCellData().GetArray(NAME)
g = vtk.vtkGeometryFilter()
g.SetInputConnection(r.GetOutputPort())
lut = vtk.vtkLookupTable()
lut.SetHueRange(0.667, 0)
lut.Build()
########################################################
# 创建一个切片
plane = vtk.vtkPlane()
plane.SetOrigin(0, 0, 0) # 切片通过的点
plane.SetNormal(1, 0, 0) # 切片的法向量
########################################################
########################################################
# 创建一个Cutter的Filter
cutter = vtk.vtkCutter()
cutter.SetCutFunction(plane)
cutter.SetInputConnection(r.GetOutputPort())
cutter.Update()
########################################################

########################################################
# 显示几何
GeoMapper = vtk.vtkCompositePolyDataMapper()
GeoMapper.SetInputConnection(g.GetOutputPort())
GeoActor = vtk.vtkActor()
GeoActor.SetMapper(GeoMapper)
GeoRen = vtk.vtkRenderer()
GeoRen.SetViewport(0.0, 0.5, 0.5, 1.0)
GeoRen.GradientBackgroundOn()
GeoRen.SetBackground(1, 1, 1)
GeoRen.SetBackground2(0.4, 0.55, 0.75)
GeoRen.AddActor(GeoActor)
##########################################################

##########################################################
# 显示网格
# MeshMapper = vtk.vtkCompositePolyDataMapper2()
MeshMapper = vtk.vtkCompositePolyDataMapper()
MeshMapper.SetInputConnection(g.GetOutputPort())
MeshActor = vtk.vtkActor()
MeshActor.SetMapper(MeshMapper)
MeshProp = MeshActor.GetProperty()
MeshProp.EdgeVisibilityOn()
MeshRen = vtk.vtkRenderer()
MeshRen.SetViewport(0.5, 0.5, 1.0, 1.0)
MeshRen.GradientBackgroundOn()
MeshRen.SetBackground(1, 1, 1)
MeshRen.SetBackground2(0.4, 0.55, 0.75)
MeshRen.AddActor(MeshActor)
##########################################################

##########################################################
# 显示温度云图
# FluentMapper = vtk.vtkCompositePolyDataMapper2()
TempMapper = vtk.vtkCompositePolyDataMapper()
TempMapper.SetInputConnection(g.GetOutputPort())
TempMapper.SetScalarModeToUseCellFieldData()
TempMapper.SelectColorArray(NAME)
TempMapper.SetScalarRange(scalars.GetRange())
TempMapper.SetLookupTable(lut)
TempActor = vtk.vtkActor()
TempActor.SetMapper(TempMapper)
TempRen = vtk.vtkRenderer()
TempRen.SetViewport(0.0, 0.0, 0.5, 0.5)
TempRen.GradientBackgroundOn()
TempRen.SetBackground(1, 1, 1)
TempRen.SetBackground2(0.4, 0.55, 0.75)
TempRen.AddActor(TempActor)
##########################################################

##########################################################
# 显示切片云图
# SliceMapper = vtk.vtkCompositePolyDataMapper2()
SliceMapper = vtk.vtkCompositePolyDataMapper()
SliceMapper.SetInputConnection(cutter.GetOutputPort())
SliceMapper.SetScalarModeToUseCellFieldData()
SliceMapper.SelectColorArray(NAME)
SliceMapper.SetScalarRange(scalars.GetRange())
SliceMapper.SetLookupTable(lut)
SliceActor = vtk.vtkActor()
SliceActor.SetMapper(SliceMapper)
SliceRen = vtk.vtkRenderer()
SliceRen.SetViewport(0.5, 0.0, 1.0, 0.5)
SliceRen.GradientBackgroundOn()
SliceRen.SetBackground(1, 1, 1)
SliceRen.SetBackground2(0.4, 0.55, 0.75)
SliceRen.AddActor(SliceActor)
##########################################################

##########################################################
# 图例
legendBar = vtk.vtkScalarBarActor()
legendBar.SetOrientationToVertical()
legendBar.SetLookupTable(lut)
legenProp = vtk.vtkTextProperty()
legenProp.SetColor(0, 0, 0)
legenProp.SetFontSize(20)
legenProp.SetFontFamilyToArial()
legenProp.ItalicOff()
legenProp.BoldOff()
legendBar.UnconstrainedFontSizeOn()
legendBar.SetTitleTextProperty(legenProp)
legendBar.SetLabelTextProperty(legenProp)
legendBar.SetLabelFormat("%5.2f")
legendBar.SetTitle("tempereture")
TempRen.AddActor(legendBar)
SliceRen.AddActor(legendBar)
##########################################################

renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(GeoRen)
renWin.AddRenderer(MeshRen)
renWin.AddRenderer(TempRen)
renWin.AddRenderer(SliceRen)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)

renWin.SetSize(300, 300)
renWin.Render()

iren.Initialize()
iren.Start()

代码库

相关代码可以查看:

hufei/vtk-examples

注意

  1. 由于 gitee 限制,单仓库最大文件为50M,算例采用了压缩分片方式存储,压缩格式为 7z
  2. 推荐采用 7-ZIP 进行解压操作
  3. fluent.cas的md5校验码为e83292a678eb6777d2ab26ee0b177b1f
  4. fluent.dat的md5校验码为3a7c7f3ffed75831ed94fa33ea02a33e