Если вы хотите только визуализировать свою сетку, вы можете использовать функцию, подобную следующей, для создания неструктурированной сетки 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