pyevtk简介
在计算流体力学CFD中,通常需要处理三维网格数据,为了可视化,需要将其输出。本文介绍使用python的pyevtk库输出结构化网格,以供paraview进一步后处理。
代码
# **************************************************************
# * Example of how to use the high level gridToVTK function. *
# * This example shows how to export a structured grid. *
# **************************************************************from pyevtk.hl import gridToVTK
import numpy as np# 尺寸参数
lx, ly, lz = 3.0, 4.0, 5.0 #立方体的长宽高
nx_points, ny_points, nz_points = 3, 4, 5 #边上的节点数
n_points= nx_points*ny_points*nz_points #节点总数
nx_cells, ny_cells, nz_cells = nx_points-1, ny_points-1, nz_points-1 #边上的单元数
n_cells= nx_cells*ny_cells*nz_cells #单元总数
dx,dy,dz=lx/nx_cells,ly/ny_cells,lz/nz_cells #节点间距# 节点坐标
x_vector = np.linspace(0,lx,nx_points) #x方向节点分布,向量
y_vector = np.linspace(0,ly,ny_points) #y方向节点分布,向量
z_vector = np.linspace(0,lz,nz_points) #z方向节点分布,向量
x_field,y_field,z_field=np.meshgrid(x_vector,y_vector,z_vector, indexing='ij',sparse=False) #x场,y场,z场张量,注意:indexing务必选择'ij'# 物理量
pressure = np.random.rand(n_cells).reshape((nx_cells, ny_cells, nz_cells)) #随机压力场(存储在体心)
temp = np.random.rand(n_points).reshape((nx_points, ny_points, nz_points)) #随机温度场 (存储在节点)
velocity=(x_field**2+y_field**2+z_field**2, x_field**2+y_field**2+z_field**2,x_field**2+y_field**2+z_field**2) #自定义速度场(存储在节点)# 输出VTK文件
gridToVTK("./structured",x_field,y_field,z_field,cellData={"pressure": pressure},pointData={"temp": temp,"velocity":velocity},
)
gridToVTK
函数用于将np
数组转换为vtk
文件并输出,x_field
表示一个三层深的张量,描述了每个节点的x坐标。第一层表示x方向,第二层表示y方向,第三层表示z方向。x_field
如下:
[[[0. 0. 0. 0. 0. 0.][0. 0. 0. 0. 0. 0.][0. 0. 0. 0. 0. 0.][0. 0. 0. 0. 0. 0.][0. 0. 0. 0. 0. 0.]][[1. 1. 1. 1. 1. 1.][1. 1. 1. 1. 1. 1.][1. 1. 1. 1. 1. 1.][1. 1. 1. 1. 1. 1.][1. 1. 1. 1. 1. 1.]][[2. 2. 2. 2. 2. 2.][2. 2. 2. 2. 2. 2.][2. 2. 2. 2. 2. 2.][2. 2. 2. 2. 2. 2.][2. 2. 2. 2. 2. 2.]][[3. 3. 3. 3. 3. 3.][3. 3. 3. 3. 3. 3.][3. 3. 3. 3. 3. 3.][3. 3. 3. 3. 3. 3.][3. 3. 3. 3. 3. 3.]]]
y_field
如下:
[[[0. 0. 0. 0. 0. 0.][1. 1. 1. 1. 1. 1.][2. 2. 2. 2. 2. 2.][3. 3. 3. 3. 3. 3.][4. 4. 4. 4. 4. 4.]][[0. 0. 0. 0. 0. 0.][1. 1. 1. 1. 1. 1.][2. 2. 2. 2. 2. 2.][3. 3. 3. 3. 3. 3.][4. 4. 4. 4. 4. 4.]][[0. 0. 0. 0. 0. 0.][1. 1. 1. 1. 1. 1.][2. 2. 2. 2. 2. 2.][3. 3. 3. 3. 3. 3.][4. 4. 4. 4. 4. 4.]][[0. 0. 0. 0. 0. 0.][1. 1. 1. 1. 1. 1.][2. 2. 2. 2. 2. 2.][3. 3. 3. 3. 3. 3.][4. 4. 4. 4. 4. 4.]]]
z_field
如下:
[[[0. 1. 2. 3. 4. 5.][0. 1. 2. 3. 4. 5.][0. 1. 2. 3. 4. 5.][0. 1. 2. 3. 4. 5.][0. 1. 2. 3. 4. 5.]][[0. 1. 2. 3. 4. 5.][0. 1. 2. 3. 4. 5.][0. 1. 2. 3. 4. 5.][0. 1. 2. 3. 4. 5.][0. 1. 2. 3. 4. 5.]][[0. 1. 2. 3. 4. 5.][0. 1. 2. 3. 4. 5.][0. 1. 2. 3. 4. 5.][0. 1. 2. 3. 4. 5.][0. 1. 2. 3. 4. 5.]][[0. 1. 2. 3. 4. 5.][0. 1. 2. 3. 4. 5.][0. 1. 2. 3. 4. 5.][0. 1. 2. 3. 4. 5.][0. 1. 2. 3. 4. 5.]]]
cellData指保存在体心的数据,pointData指保存在节点的数据。这些数据既可以所标量(如pressure和temp)也可以是矢量(如velocity)
结果
运行代码后会输出structured.vts
文件,可用paraview打开查看