Предположим, у меня есть два файла VTK, оба в формате структурированной сетки. Структурированные сетки одинаковы (они имеют одинаковый список точек в одинаковом порядке), и в каждом файле VTK есть поле, называемое «Фи». Я хочу создать третий файл VTK, опять же с той же структурированной сеткой, и построить поле, которое является разницей между Phi в первом файле VTK и Phi во втором файле VTK.
Я знаю, как сделать это вручную; Я могу проанализировать необработанный текст в двух файлах VTK, скопировать данные в массивы, вычесть один массив из другого и затем вывести данные в нужном формате в новый файл. Есть ли лучший способ рассчитать эту разницу и экспортировать ее в ВТК? Решение на Python или в программном обеспечении для визуализации, таком как VisIt или Paraview, предпочтительнее, чем использование скомпилированного языка, такого как C ++.
Цель вычисления этой разницы состоит в том, чтобы сравнить различные численные методы для вычисления решения PDE; Поскольку я использую одно и то же программное обеспечение для генерации решений, я могу гарантировать, что все данные, кроме поля Phi, будут одинаковыми в каждом создаваемом мной файле.
источник
Ответы:
Самый простой способ вычесть два поля из разных файлов VTK с одной и той же структурированной сеткой - это использовать программируемый фильтр в Paraview, который позволяет вам манипулировать данными с помощью скриптов Python.
В диалоговом окне программируемого фильтра вы можете вычесть два массива и записать в вывод код:
В этом случае поле Phi оказывается ячейкой данных. Если ваше поле содержит точечные данные,
CellData
везде в скрипте замените его наPointData
. См. Http://public.kitware.com/pipermail/paraview/2010-April/016667.html для получения дополнительной информации.источник
В ParaView есть фильтр «Добавить атрибуты», который можно использовать для этого. Требуется, чтобы в наборе данных было одинаковое количество точек для правильного добавления данных точек, и такое же количество ячеек в наборе данных для правильного добавления данных ячеек. Это будет иметь проблемы с массивами с тем же именем (например, Phi в вашем примере). Вы можете легко скопировать этот массив с помощью фильтра «Калькулятор», прежде чем использовать фильтр «Добавить атрибуты». Затем вы можете использовать другой фильтр калькулятора для вычитания. Это, вероятно, менее эффективно, чем использование программируемого фильтра ParaView Python. Кроме того, вы можете использовать исполняемый файл vtkpython, чтобы сделать это вручную, поскольку у вас будет прямой доступ к сеткам и их атрибутам.
источник
У меня нет особенно хорошего подхода, но я скопировал бы поле 'phi' из одного файла VTK в другой и назвал бы его 'phiprime' или что-то в этом роде. В Paraview и Visit у вас есть возможность определить новые поля по формуле, которая использует значения других полей. Затем вы можете определить поле «error» как «error = phi-phiprime» в редакторе полей и отобразить это поле «error» как поверхность, контурный график или все, что вас интересует.
Шаг копирования блока данных из одного файла в другой явно неудобен, но это лучшее, что я могу придумать.
источник
Я понял, что это немного старше, но, возможно, вас заинтересует решение VisIt:
Вы можете сделать это в VisIt с помощью так называемого выражения поля перекрестной сетки, основанного на соединении. Это полный рот, но в основном это механизм для сопоставления полей между базами данных (в вашем случае файлы VTK).
«На основе подключения» (conn_cmfe) используется, когда топология между файлами одинакова - как в вашем случае.
Существует также «Позиционирование» (pos_cmfe), которое осуществляет выборку между сетками с различными топологиями.
Для вашего случая откройте первый файл и используйте окно выражений, чтобы определить выражение (MyPhi_Diff):
Затем вы можете построить «MyPhi_Diff» с помощью псевдоцвета.
Существует также мастер, который вы можете использовать, чтобы помочь определить выражение
(Меню параметров -> «Сравнение уровней данных»)
Вот еще немного информации:
http://visitusers.org/index.php?title=Cmfe
источник