【科研脚本工具】 Python 导出数据到 ParaView 中可视化

文摘   2024-07-21 10:20   广西  

在有限元分析中,数据的可视化是理解和分析计算结果的重要步骤。ParaView 是一个强大的可视化工具,可以帮助我们直观地查看和分析有限元计算结果。本文将介绍如何使用 Python 将有限元网格数据(比如节点的x,y坐标及其对应的标量w)导出为 VTK或者VTU 文件,并在 ParaView 中进行可视化。最后展示了将abaqus数据导出为VTK文件的结果。

0. 什么是VTK和VTU文件?

此部分为拓展知识,可跳过,爱学习的同学可以留下🥸

在科学计算和可视化领域,VTK(Visualization Toolkit)格式和 VTU(VTK Unstructured Grid)格式是两种常用的数据文件格式。它们用于存储网格和数据,以便在可视化工具(如 ParaView)中读取和显示。

VTK 格式

VTK 文件格式 是一种文本或二进制文件格式,用于存储三维计算机图形学和可视化数据。它由 Kitware 开发,并广泛用于科学数据可视化。VTK 文件的扩展名通常为 .vtk。

  • 特点:可扩展性:支持多种数据类型和拓扑结构,包括标量场、矢量场、张量场等。兼容性:可以在多个可视化工具中使用,如 ParaView 和 VTK。灵活性:支持不同的单元类型,如点、线、三角形、四面体等。

  • 文件结构:Header:包含文件版本信息。Title:描述文件内容的简短描述。Dataset:描述数据类型和结构。Data Attributes:定义点或单元的属性数据,如标量、矢量等。

VTU 格式

VTU 文件格式 是 VTK 的一种特定文件格式,用于存储非结构化网格(Unstructured Grid)数据。VTU 文件的扩展名为 .vtu,它使用 XML 格式进行数据存储,属于 VTK XML 文件格式系列。

  • 特点:非结构化网格:可以表示复杂的几何形状和拓扑结构,包括各种单元类型,如三角形、四面体、六面体等。XML 格式:使用 XML 作为文件格式,易于解析和修改,并且支持压缩存储。多种数据类型:支持存储标量、矢量、张量等多种数据类型。

  • 文件结构:VTKFile:根元素,包含文件类型和版本信息。UnstructuredGrid:定义非结构化网格的数据。Piece:包含网格的具体数据,包括点、单元和数据属性。

如何生成和读取 VTK/VTU 文件

假设我们已经安装了python的vtk库,则可先定义下面的图形数据:

import vtk

# 创建示例数据
points = vtk.vtkPoints()
points.InsertNextPoint(0, 0, 0)
points.InsertNextPoint(1, 0, 0)
points.InsertNextPoint(0, 1, 0)

poly = vtk.vtkPolygon()
poly.GetPointIds().SetNumberOfIds(3)
poly.GetPointIds().SetId(0, 0)
poly.GetPointIds().SetId(1, 1)
poly.GetPointIds().SetId(2, 2)

polys = vtk.vtkCellArray()
polys.InsertNextCell(poly)

polyData = vtk.vtkPolyData()
polyData.SetPoints(points)
polyData.SetPolys(polys)

写入vtu格式的文件

# 写入 VTU 文件
writer = vtk.vtkXMLPolyDataWriter()
writer.SetFileName("output.vtu")
writer.SetInputData(polyData)
writer.Write()

写入vtk格式的文件

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

可以看出,根据文件类型,需选择对应的写入方案。

接下来介绍如何使用python的vtk库将网格数据写入vtk文件中,假设现有的有限元数据为:二维问题中的节点坐标x,y,单元的节点编号,每个节点对应的标量w(比如某个位移场)

1. 安装 VTK 库

首先,需安装 VTK(Visualization Toolkit)库,这是一个开源的软件系统,用于计算机图形学、图像处理和可视化。
可使用以下命令安装 VTK 库:

pip install vtk

2.准备网格数据和标量数据

假设我们有以下有限元网格数据和标量数据:

  • x, y:节点的坐标

  • elements:单元的节点编号

  • w:每个节点对应的标量数据

例如:

## 挨踢的土木佬 日期:2024.07.21
import numpy as np

x = np.array([0.0, 1.0, 1.0, 0.0])
y = np.array([0.0, 0.0, 1.0, 1.0])
elements = np.array([[0, 1, 2], [0, 2, 3]])
w = np.array([1.0, 2.0, 3.0, 4.0])

3.导出数据为 VTK 文件

接下来,使用 VTK 库将上述数据导出为 VTK 文件:

import vtk

# 创建点
points = vtk.vtkPoints()
for i in range(len(x)):
points.InsertNextPoint(x[i], y[i], 0.0)

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

# 创建网格数据
polyData = vtk.vtkPolyData()
polyData.SetPoints(points)
polyData.SetPolys(polys)

# 创建标量数据
scalars = vtk.vtkFloatArray()
scalars.SetName("w")
for value in w:
scalars.InsertNextValue(value)

# 将标量数据添加到网格
polyData.GetPointData().SetScalars(scalars)

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

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

以上代码将生成一个名为 output.vtk 的文件。

代码解析

  • vtk.vtkPoints 用于存储点的坐标。

  • vtk.vtkCellArray 用于存储单元的拓扑结构。

  • vtk.vtkPolyData 用于存储网格数据。

  • vtk.vtkFloatArray 用于存储标量数据并将其附加到网格数据上。

  • vtk.vtkPolyDataWriter 用于将数据写入 VTK 文件。

4. 在 ParaView 中打开 VTK 文件

上述代码生成的 VTK 文件可以在 ParaView 中打开。打开 ParaView,选择 File -> Open,找到生成的 output.vtk 文件并打开它。将能够看到导入的网格数据,并可以进一步进行可视化分析。

ParaView中查看VTK文件

5. 示例:将abaqus的计算数据导出并可视化

有了上面的基础,可进一步编写脚本,导出abaqus的计算数据为VTK格式:

abaqus解答
有限元数据可视化

6. 结论

使用 Python 和 VTK 库,可以轻松地将有限元网格数据导出为 VTK 文件,并在 ParaView 中进行可视化。为分析和理解有限元计算结果提供了强大的工具🛠️。

往期内容推荐:


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