Напишите файл VTK из адаптивного уточнения сетки с помощью Python.

Меня беспокоит следующее: у меня есть трехмерное магнитное поле B из адаптивного уточнения сетки, сохраненное и организованное в формате HDF. Теперь я хотел бы создать файл VTK, используя процедуру Python. Моя цель — представить это с помощью Paraview.

Можете ли вы помочь мне создать эту рутину?

С использованием :

gridToVTK("./B", np.array(x), np.array(y), np.array(z), pointData = {"B" : B})

Мне удалось преобразовать неоднородные данные HDF-5 в VTK, но адаптивное уточнение сетки немного отличается по своей организации.

Спасибо,


person dodo27    schedule 12.01.2021    source источник
comment
Можете ли вы объяснить, чем отличается уточнение сетки, а что не работает при использовании предыдущего подхода? (возможно добавить подробности о неоднородной версии)   -  person Nico Vuaille    schedule 13.01.2021


Ответы (1)


Если вы хотите только визуализировать свою сетку, вы можете использовать функцию, подобную следующей, для создания неструктурированной сетки vtk, чтобы загрузить файл в паравью:

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 не поддерживает подключение зависших узлов.

person stadlera    schedule 13.01.2021
comment
Во-первых, позвольте мне поблагодарить вас за ваш подробный ответ! Я думаю, что это отвечает на мой вопрос, я собираюсь провести несколько тестов, прежде чем закрыть эту тему. В начале вы указываете, что если вы хотите только визуализировать свою сетку, меня это заинтриговало, можете ли вы указать, что вы подразумеваете под только? - person dodo27; 14.01.2021
comment
Vtk предоставляет ряд алгоритмов, которые вы можете запускать в неструктурированной сетке, от извлечения отдельных ячеек до применения порога и т. д. Для получения дополнительной информации просмотрите все алгоритмы, которые унаследованы от vtkUnstructuredGridAlgorithm: vtk.org/doc/nightly/html/classvtkUnstructuredGridAlgorithm.html - person stadlera; 14.01.2021