【科研脚本工具】Python VTK库写入向量数据并在ParaView中可视化

文摘   2024-09-06 15:02   广西  

在科学计算与仿真分析中,VTK 文件格式常被用于存储复杂的几何和物理场数据,以便后续的可视化处理。本文将通过一个具体的例子,讲解如何使用 VTK 库,将二维位移场数据以向量的形式写入到 .vtk 文件中,最后展示一个可视化abaqus计算结果的例子。


一、数据简介

假设有一个 2x2 的二维网格,由 4 个节点和 2 个三角形单元组成。每个节点还附带有位移场向量(X 和 Y 分量)。我们想把这些节点、单元以及对应的位移向量写入到一个 VTK 文件,供后续的可视化软件(如 ParaView)使用。

节点坐标和位移向量数据

  • 节点坐标

    • (0, 0)

    • (1, 0)

    • (0, 1)

    • (1, 1)

  • 位移向量数据

    • 节点 0:位移 (0.1, 0.0)

    • 节点 1:位移 (0.2, 0.1)

    • 节点 2:位移 (0.3, 0.2)

    • 节点 3:位移 (0.4, 0.3)

  • 三角形单元

    • 单元 1:由节点 0、1、2 组成

    • 单元 2:由节点 1、2、3 组成

二、实现步骤

1. 导入 VTK 库并准备数据

首先需要导入 VTK 库,并准备好节点坐标、位移向量以及单元数据。

import vtk

# 示例输入数据:网格节点的坐标和向量分量
xy = [[0, 0], [1, 0], [0, 1], [1, 1]] # 节点坐标
u1 = [0.1, 0.2, 0.3, 0.4] # X 分量
u2 = [0.0, 0.1, 0.2, 0.3] # Y 分量
elements = [[0, 1, 2], [1, 2, 3]] # 三角形单元

2. 创建点数据

通过 vtkPoints() 创建点对象,并插入每个节点的坐标信息。由于这是一个二维问题,Z 坐标设为 0。

# 创建点对象
points = vtk.vtkPoints()
for coord in xy:
points.InsertNextPoint(coord[0], coord[1], 0.0) # Z 方向设为 0.0

3. 创建单元数据

接下来使用 vtkCellArray() 来创建单元(这里是三角形单元),并将每个三角形的节点信息插入到单元数组中。

# 创建单元对象
polys = vtk.vtkCellArray()
for element in elements:
polys.InsertNextCell(len(element)) # 定义单元的节点数量
for node in element:
polys.InsertCellPoint(node) # 将节点插入单元

4. 创建网格数据

通过 vtkPolyData(),将点和单元数据组合在一起,创建一个表示网格的对象。

# 创建 vtkPolyData 存储点和单元数据
polyData = vtk.vtkPolyData()
polyData.SetPoints(points) # 设置点
polyData.SetPolys(polys) # 设置多边形单元

5. 创建向量数据

向量数据是存储在每个节点的位移信息。在这里,我们使用 vtkFloatArray() 创建一个数组,并设置它的名称和分量数。由于是二维位移场,Z 分量设置为 0。

# 创建向量数据数组
U = vtk.vtkFloatArray()
U.SetName("U") # 命名为 "U"
U.SetNumberOfComponents(3) # 三维向量

# 插入每个点的位移向量数据
for i in range(len(u1)):
U.InsertNextTuple3(u1[i], u2[i], 0.0) # Z 分量为 0.0

6. 将向量数据添加到网格

将刚刚创建好的向量数据与网格节点进行关联。
这里使用 SetVectors() 函数将向量数据添加到网格的节点上
而如果要存储为标量数据,则可用 SetScalars()函数。

# 将向量数据添加到网格
polyData.GetPointData().SetVectors(U)

7. 写入 VTK 文件

最后,使用 vtkPolyDataWriter() 将生成的网格和向量数据写入到一个 .vtk 文件中。

# 写入 VTK 文件
writer = vtk.vtkPolyDataWriter()
writer.SetFileName("output-vec.vtk") # 指定输出文件名
writer.SetInputData(polyData) # 设置要写入的网格数据
writer.Write() # 执行写入操作

print("VTK 文件写入完成!")

三、完整代码及效果

import vtk

# 示例输入数据:网格节点的坐标和向量分量
xy = [[0, 0], [1, 0], [0, 1], [1, 1]] # 节点坐标
u1 = [0.1, 0.2, 0.3, 0.4] # X 分量
u2 = [0.0, 0.1, 0.2, 0.3] # Y 分量
elements = [[0, 1, 2], [1, 2, 3]] # 三角形单元

# 创建点对象
points = vtk.vtkPoints()
for coord in xy:
points.InsertNextPoint(coord[0], coord[1], 0.0)

# 创建单元对象
polys = vtk.vtkCellArray()
for element in elements:
polys.InsertNextCell(len(element))
for node in element:
polys.InsertCellPoint(node)

# 创建 vtkPolyData 存储点和单元数据
polyData = vtk.vtkPolyData()
polyData.SetPoints(points)
polyData.SetPolys(polys)

# 创建向量数据数组
U = vtk.vtkFloatArray()
U.SetName("U")
U.SetNumberOfComponents(3)

for i in range(len(u1)):
U.InsertNextTuple3(u1[i], u2[i], 0.0)

# 将向量数据添加到网格
polyData.GetPointData().SetVectors(U)

# 写入 VTK 文件
writer = vtk.vtkPolyDataWriter()
writer.SetFileName("output-vec.vtk")
writer.SetInputData(polyData)
writer.Write()

print("VTK 文件写入完成!")

在paraview中查看结果,并使用 Warp by Vector功能针对上面的向量数据进行可视化处理。

paraview可视化

四、示例:可视化abaqus结果

以下是我用abaqus计算一个平面问题的例子,根据前述的代码,可将abaqus的结果数据可视化如下:

abaqus
通过修改Warp by Vector里面的Scale Factor,可以对结构的位移向量进行缩放:
paraview

五、总结

本文实现了如何将向量场数据写入 VTK 文件。向量数据的存储对于仿真结果的可视化至关重要,特别是当我们需要显示节点的位移、速度或其他方向量时。

相关阅读推荐:


挨踢的土木佬
一名学习编程的土木佬,计算固体力学,以第一/通讯作者身份在IJNME、IJSS、力学学报、振动工程学报等权威期刊发表论文若干。热衷分享Python编程、数据处理和数值分析(含有限元)新知,不定期更新文章与笔记。
 最新文章