使用 Python 从自适应网格细化中编写 VTK 文件

问题描述

我关心的是以下一个我有一个 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 不支持挂节点连接。