Структура файла vtk, прочитанного с python - PullRequest
3 голосов
/ 27 апреля 2020

У меня есть файл vtk, и мне нужно извлечь из него трехмерный вектор скорости. Я никогда не использовал его, поэтому я не знаю, что он содержит и как извлечь из него информацию.

При переполнении стека я нашел этот вопрос Сохранить массив данных из VTK в Python , что помогло, и я смог извлечь свои данные.

Это скрипт, который я использовал:

import vtk as v
import numpy as np

Filename = 'filename.vtk'
reader = v.vtkUnstructuredGridReader()
reader.SetFileName(Filename)
reader.ReadAllScalarsOn()
reader.ReadAllVectorsOn()

pa = v.vtkPassArrays()
pa.SetInputConnection(reader.GetOutputPort())
pa.AddArray(0, 'velocity_magnitude' )
print(pa)

writer = v.vtkDataSetWriter()
writer.SetFileName('test.vtk')
writer.SetInputConnection(pa.GetOutputPort())
writer.Update()
writer.Write()

И это файл, с которым я закончил:

# vtk DataFile Version 4.2
vtk output
ASCII
DATASET UNSTRUCTURED_GRID
FIELD FieldData 6
Nek_SpectralElementData 1 4 int
8 8 8 512 
avtOriginalBounds 1 6 double
0 6.283185482 -1 1 0 3.141592741 
VolumeDependent 1 1 bit
0 
MeshName 1 1 string
mesh

CYCLE 1 1 int
1000 
TIME 1 1 double
20 
POINTS 262144 float
0 -1 1.5708 0.0503675 -1 1.5708 0.160339 -1 1.5708 
0.310507 -1 1.5708 0.474891 -1 1.5708 0.625059 -1 1.5708 
0.735031 -1 1.5708 0.785398 -1 1.5708 0 -0.997435 1.5708 
0.0503675 -0.997435 1.5708 0.160339 -0.997435 1.5708 0.310507 -0.997435 1.5708 

.
.
.
CELLS 175616 1580544
8 0 1 9 8 64 65 73 72 
8 64 65 73 72 128 129 137 136 
8 128 129 137 136 192 193 201 200 
8 192 193 201 200 256 257 265 264 
8 256 257 265 264 320 321 329 328 

.
.
.

CELL_TYPES 175616
12
12
12
12

.
.
.
POINT_DATA 262144
VECTORS velocity float
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0.0113612 1.21843e-05 0.000552347 
0.0115553 1.12597e-05 0.000419801 0.0121388 6.55409e-06 -0.000110149 0.0128729 -5.02466e-06 -0.000602613 

Итак, проведя некоторое исследование, я понял, что в первой части у меня есть координаты точек, но почему их 9 в строке? Тогда я понял, что точки соединены шестигранными ячейками, их 175616, каждая с 8 точками, а затем у нас есть положения их углов, но я не знаю, как они написаны. В последней части у меня наконец есть свой вектор скорости, но опять же, почему 9 компонентов в строке? А как расставлены точки? К какой точке относится скорость первой линии? А для второго или третьего?

Если вы знаете какое-нибудь руководство, где я могу прочитать, как понять этот файл, вы очень поможете.

Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 27 апреля 2020

В формате файла VTK атрибуты набора данных разделяют пробел строки. Таким образом, точки и векторы всегда берутся как наборы из 3 чисел с плавающей запятой, независимо от того, где заканчивается линия.

Ваша секция POINTS имеет 262144 точки, поэтому предполагается, что в следующих данных имеется 3 * 262144 числа с плавающей запятой, соответствующие каждому XYZ-позиция точки.

То же самое относится и к POINT_DATA. У вас есть 262144 записей, которые отображаются непосредственно на предыдущие ТОЧКИ. И предполагается, что секция VECTOR имеет значения 3 * 262144, соответствующие точкам. И опять же, переводы строки игнорируются.

Вот документация для формата VTK: https://vtk.org/wp-content/uploads/2015/04/file-formats.pdf

1 голос
/ 29 апреля 2020

Вы можете найти информацию о CELL и CELL_TYPES здесь: Чтение и построение структуры данных файла VTK с помощью python и здесь: https://lorensen.github.io/VTKExamples/site/VTKFileFormats/#dataset -формат .

Наличие девяти записей подряд для ввода данных для 3D-точки может показаться странным. Но если вы учитываете 3 кортежа, независимо от того, сколько записей у вас в строке, вы должны получить, например, 262144 балла в разделе POINT. И каждая точка представлена ​​кортежем из 3 записей (x, y, z)

...