使用pyevtk导出结构化VTK网格以供后处理

33 篇文章 1 订阅
26 篇文章 3 订阅

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打开查看

速度场:在这里插入图片描述

温度场:

在这里插入图片描述

压力场:

在这里插入图片描述

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jedi-knight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值