问题描述
我关心的是以下一个:我有一个 3D 磁场 B,来自自适应网格细化,以 HDF 格式保存和组织。现在我想使用 Python 例程创建一个 VTK 文件。我的目标是用 Paraview 来代表它。
你能帮我创建这个例程吗?
使用:
gridToVTK("./B",np.array(x),np.array(y),np.array(z),pointData = {"B" : B})
我成功地将 HDF-5 非均匀数据转换为 VTK,但自适应网格细化在其组织上略有不同。
谢谢,
解决方法
如果您只想可视化您的网格,您可以使用类似于以下的函数来创建一个 vtk 非结构化网格,以便在 paraview 中加载文件:
def save_vtk_unstructured_grid(path,points,cells,point_data):
"""
Create a vtu grid file containing quads from a list of points,a list of cells and additional point data.
The list of cells references the points inside the point list via the row index.
N Points: [[x_0,y_0,z_0],[x_1,y_1,z_1],...
[x_(n-1),y_(n-1),z_(n-1)]]
M Cells: [[i_00,i_01,i_02,i_03],[i_10,i_11,i_12,i_13],...
[i_(m-1)0,i_(m-1)1,i_(m-1)2,i_(m-1)3]]
E.g.:
Cell: p0 x------x p1 => Cell indices inside the cell array:
| | [0,1,2,3]
| |
| |
p2 x------x p3
:param path: Save path as string
:param points: Nx3 numpy array of point coordinates
:param cells: Mx4 numpy array of point indices for a mesh consisting of quads.
:param point_data: Nx1 numpy array of containing data at the point coordinates.
"""
points = vtk.vtkPoints()
cells = vtk.vtkCellArray()
# insert points
for p in points:
points.InsertNextPoint(p[0],p[1],p[2])
# insert the quad cells
for idx in cells:
# create a new quad cell
quad = vtk.vtkQuad()
quad.GetPointIds().SetId(0,idx[0])
quad.GetPointIds().SetId(1,idx[1])
quad.GetPointIds().SetId(2,idx[2])
quad.GetPointIds().SetId(3,idx[3])
cells.InsertNextCell(quad)
# create the point data
data = vtk.vtkDoubleArray()
data.SetNumberOfComponents(1)
data.SetNumberOfValues(len(point_data))
for i,d in enumerate(point_data):
data.SetTuple(i,d)
# create the grid from the points and cells
grid = vtk.vtkUnstructuredGrid()
grid.SetPoints(points)
grid.SetCells(vtk.VTK_QUAD,cells)
grid.GetPointData().SetScalars(data)
# write the grid
writer = vtk.vtkXMLUnstructuredGridWriter()
writer.SetFileName(path)
writer.SetInputData(grid)
writer.Write()
这将创建一个由四边形组成的非结构化网格(网格),通常用于自适应网格细化。您只需要提供点列表:
points = np.array([x,y,z])
和网格连接作为索引列表 cells
。您的点数据 B
应该是一个标量值。如果每个点有多个组件,您必须更改函数内 vtkDoubleArray
的组件数量。
请注意,如果您输入包含悬挂节点的细化网格,这可能会影响网格的连通性,并根据连通性信息导致算法的错误结果。据我所知 vtk 不支持挂节点连接。