извлечь объем ячейки из vtk

У меня есть некоторые результаты CFD, полученные из существующего решателя (nektar++), и я хотел бы выполнить некоторую постобработку в Python. Мне нужно извлечь поле (u, v, p) и объем ячейки для каждой ячейки.

Мне удалось извлечь поля в массивы numpy с помощью этого кода:

import vtk
import vtk.util.numpy_support as VN
import numpy as np

filename = "t_2.vtk"

reader = vtk.vtkUnstructuredGridReader()
reader.ReadAllScalarsOn()
reader.ReadAllVectorsOn()
reader.SetFileName(filename)
reader.Update()

num_points = reader.GetOutput().GetNumberOfPoints()

p = VN.vtk_to_numpy(reader.GetOutput().GetPointData().GetScalars('p'))
u = VN.vtk_to_numpy(reader.GetOutput().GetPointData().GetVectors('u'))
v = VN.vtk_to_numpy(reader.GetOutput().GetPointData().GetVectors('v'))

P = vtk_to_numpy(p)
U = vtk_to_numpy(u)
V = vtk_to_numpy(v)

Однако я не понимаю, есть ли способ или нет (возможно, информация об объеме ячейки отсутствует на выходе), чтобы узнать также значение объема ячейки.

Я предполагаю, что правильная инструкция должна быть примерно такой:

Vol = VN.vtk_to_numpy(reader.GetOutput().GetPointData().GetScalars('Volume'))

Может кто сталкивался/сталкивается с такой же проблемой?

Большое спасибо за Вашу помощь.

Привет, Риккардо


person rickyrubini    schedule 22.10.2017    source источник


Ответы (2)


Удалось ли вам зафиксировать какой-либо прогресс в этом вопросе? Я действительно удивлен, что нет простого решения этого вопроса. Это казалось действительно легким. Однако сделать это мне не удалось.

Я использую OpenFOAM и нашел обходной путь. Это не поможет вам, но, надеюсь, кто-то еще, кто использует OpenFOAM, найдет этот ответ полезным. Вы можете использовать постпроцессор для записи томов ячеек. Когда вы включаете их в раздел полей «foamToVTK», вы можете прочитать их в python так же, как вы читали бы давление.

runApplication postProcess -func writeCellVolumes
runApplication foamToVTK -fields '(U p V)'
person Newfarmer    schedule 09.10.2018

Вы можете использовать vtkMeshQuality. Он поддерживает несколько типов объемных ячеек. См. здесь пример того, как его использовать. В этом примере вы можете попробовать использовать SetTetQualityMeasureToVolume (или подобное) вместо SetTriangleQualityMeasureToArea().

person normanius    schedule 12.10.2018