Как рассчитать числовую разницу между двумя полями, хранящимися в двух разных файлах VTK с одинаковой структурой?


14

Предположим, у меня есть два файла VTK, оба в формате структурированной сетки. Структурированные сетки одинаковы (они имеют одинаковый список точек в одинаковом порядке), и в каждом файле VTK есть поле, называемое «Фи». Я хочу создать третий файл VTK, опять же с той же структурированной сеткой, и построить поле, которое является разницей между Phi в первом файле VTK и Phi во втором файле VTK.

Я знаю, как сделать это вручную; Я могу проанализировать необработанный текст в двух файлах VTK, скопировать данные в массивы, вычесть один массив из другого и затем вывести данные в нужном формате в новый файл. Есть ли лучший способ рассчитать эту разницу и экспортировать ее в ВТК? Решение на Python или в программном обеспечении для визуализации, таком как VisIt или Paraview, предпочтительнее, чем использование скомпилированного языка, такого как C ++.

Цель вычисления этой разницы состоит в том, чтобы сравнить различные численные методы для вычисления решения PDE; Поскольку я использую одно и то же программное обеспечение для генерации решений, я могу гарантировать, что все данные, кроме поля Phi, будут одинаковыми в каждом создаваемом мной файле.


Я опубликовал этот вопрос, потому что мне потребовалось около полутора дней, чтобы найти ответ; если бы я не нашел его вчера, я бы все равно задал этот вопрос здесь. Мне интересно посмотреть, есть ли другие быстрые способы решения той же задачи.
Джефф Оксберри

Когда вы говорите «разобрать необработанный текст», вы имеете в виду буквально войти в файл или использовать синтаксический анализатор python?
SAAD

В то время я имел в виду написать парсер Python вручную.
Джефф Оксберри

Ответы:


15

Самый простой способ вычесть два поля из разных файлов VTK с одной и той же структурированной сеткой - это использовать программируемый фильтр в Paraview, который позволяет вам манипулировать данными с помощью скриптов Python.

В диалоговом окне программируемого фильтра вы можете вычесть два массива и записать в вывод код:

   phi_0 = inputs[0].CellData['Phi']
   phi_1 = inputs[1].CellData['Phi']
   output.CellData.append(phi_1 - phi_0, 'difference')

В этом случае поле Phi оказывается ячейкой данных. Если ваше поле содержит точечные данные, CellDataвезде в скрипте замените его на PointData. См. Http://public.kitware.com/pipermail/paraview/2010-April/016667.html для получения дополнительной информации.


4
Никогда не слишком много напоминать, что для того, чтобы иметь два входа (входы [0] и входы [1]), необходимо выделить оба набора данных, прежде чем выбрать программируемый фильтр (это упомянуто по указанной ссылке).
Толивейра

3

В ParaView есть фильтр «Добавить атрибуты», который можно использовать для этого. Требуется, чтобы в наборе данных было одинаковое количество точек для правильного добавления данных точек, и такое же количество ячеек в наборе данных для правильного добавления данных ячеек. Это будет иметь проблемы с массивами с тем же именем (например, Phi в вашем примере). Вы можете легко скопировать этот массив с помощью фильтра «Калькулятор», прежде чем использовать фильтр «Добавить атрибуты». Затем вы можете использовать другой фильтр калькулятора для вычитания. Это, вероятно, менее эффективно, чем использование программируемого фильтра ParaView Python. Кроме того, вы можете использовать исполняемый файл vtkpython, чтобы сделать это вручную, поскольку у вас будет прямой доступ к сеткам и их атрибутам.


1

У меня нет особенно хорошего подхода, но я скопировал бы поле 'phi' из одного файла VTK в другой и назвал бы его 'phiprime' или что-то в этом роде. В Paraview и Visit у вас есть возможность определить новые поля по формуле, которая использует значения других полей. Затем вы можете определить поле «error» как «error = phi-phiprime» в редакторе полей и отобразить это поле «error» как поверхность, контурный график или все, что вас интересует.

Шаг копирования блока данных из одного файла в другой явно неудобен, но это лучшее, что я могу придумать.


1

Я понял, что это немного старше, но, возможно, вас заинтересует решение VisIt:

Вы можете сделать это в VisIt с помощью так называемого выражения поля перекрестной сетки, основанного на соединении. Это полный рот, но в основном это механизм для сопоставления полей между базами данных (в вашем случае файлы VTK).

«На основе подключения» (conn_cmfe) используется, когда топология между файлами одинакова - как в вашем случае.

Существует также «Позиционирование» (pos_cmfe), которое осуществляет выборку между сетками с различными топологиями.

Для вашего случая откройте первый файл и используйте окно выражений, чтобы определить выражение (MyPhi_Diff):

Phi - conn_cmfe(<file2.vtk:Phi>, mesh)

Затем вы можете построить «MyPhi_Diff» с помощью псевдоцвета.

Существует также мастер, который вы можете использовать, чтобы помочь определить выражение

(Меню параметров -> «Сравнение уровней данных»)

Вот еще немного информации:

http://visitusers.org/index.php?title=Cmfe

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.