在科学计算与仿真分析中,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功能针对上面的向量数据进行可视化处理。
四、示例:可视化abaqus结果
以下是我用abaqus计算一个平面问题的例子,根据前述的代码,可将abaqus的结果数据可视化如下:
通过修改Warp by Vector里面的Scale Factor,可以对结构的位移向量进行缩放:五、总结
本文实现了如何将向量场数据写入 VTK 文件。向量数据的存储对于仿真结果的可视化至关重要,特别是当我们需要显示节点的位移、速度或其他方向量时。
相关阅读推荐: