Jak obliczyć różnicę liczbową między dwoma polami przechowywanymi w dwóch różnych plikach VTK o tej samej strukturze?


15

Załóżmy, że mam dwa pliki VTK, oba w ustrukturyzowanym formacie siatki. Strukturyzowane siatki są takie same (mają tę samą listę punktów, w tej samej kolejności), aw każdym pliku VTK znajduje się pole, nazwij je „Phi”. Chcę utworzyć trzeci plik VTK, ponownie z tą samą strukturą siatki i wykreślić pole, które jest różnicą między Phi w pierwszym pliku VTK a Phi w drugim pliku VTK.

Wiem, jak to zrobić ręcznie; Mogę parsować nieprzetworzony tekst w dwóch plikach VTK, skopiować dane do tablic, odjąć jedną tablicę od drugiej, a następnie zrzucić dane w odpowiednim formacie do nowego pliku. Czy istnieje lepszy sposób na obliczenie tej różnicy i wyeksportowanie jej do VTK? Rozwiązanie w Pythonie lub oprogramowaniu do wizualizacji, takim jak VisIt lub Paraview, byłoby lepsze niż użycie skompilowanego języka, takiego jak C ++.

Celem obliczenia tej różnicy jest porównanie różnych metod numerycznych do obliczenia rozwiązania PDE; ponieważ używam tego samego oprogramowania do generowania rozwiązań, mogę zagwarantować, że wszystkie dane oprócz pola Phi będą takie same w każdym generowanym przeze mnie pliku.


Zadałem to pytanie, ponieważ znalezienie odpowiedzi zajęło mi około półtora dnia; gdybym go wczoraj nie znalazł, i tak zadałbym to pytanie. Chciałbym zobaczyć, czy istnieją inne szybkie sposoby wykonania tego samego zadania.
Geoff Oxberry

Kiedy mówisz „parsuj surowy tekst” masz na myśli dosłownie wejście do pliku lub użycie parsera python?
SAAD

W tym czasie miałem na myśli napisanie ręcznie parsera Python.
Geoff Oxberry

Odpowiedzi:


16

Najłatwiejszym sposobem na odjęcie dwóch pól z różnych plików VTK przy użyciu tej samej struktury siatki jest użycie programowalnego filtra w Paraview, który pozwala manipulować danymi za pomocą skryptów Python.

W oknie dialogowym programowalnego filtra możesz odjąć dwie tablice i zapisać kod wyjściowy na wyjściu:

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

W tym przypadku pole Phi to dane komórki. Jeśli twoje pole to dane punktowe, zamień CellDatawszędzie w skrypcie na PointData. Więcej informacji można znaleźć na stronie http://public.kitware.com/pipermail/paraview/2010-April/016667.html .


4
Nigdy nie ma zbyt wiele do przypomnienia, że ​​aby mieć dwa wejścia (wejścia [0] i wejścia [1]), należy wybrać oba zestawy danych przed wybraniem Programowalnego filtra (jest to wspomniane odnośnik).
toliveira

3

W ParaView znajduje się filtr Dołącz atrybuty, który można w tym celu wykorzystać. Wymaga to, aby ta sama liczba punktów znajdowała się w zestawie danych dla poprawnego dołączania danych punktów, a ta sama liczba komórek była w zestawie danych dla poprawnego dołączania danych komórek. Będzie miał jednak problemy z tablicami o tej samej nazwie (tj. Phi w twoim przykładzie). Możesz jednak łatwo skopiować tę tablicę za pomocą filtra Kalkulator przed użyciem filtra Dołącz atrybuty. Następnie możesz użyć innego filtru kalkulatora, aby wykonać odejmowanie. Jest to prawdopodobnie mniej wydajne niż użycie programowalnego filtru PytView firmy ParaView. Poza tym możesz użyć pliku wykonywalnego vtkpython, aby zrobić to ręcznie, ponieważ będziesz miał bezpośredni dostęp zarówno do siatek, jak i ich atrybutów.


1

Nie mam szczególnie dobrego podejścia, ale skopiowałbym pole „phi” z jednego pliku VTK do drugiego i nazwałbym to „phiprime” lub coś w tym rodzaju. Zarówno w widokach Paraview, jak i Visit, możesz zdefiniować nowe pola za pomocą formuły, która wykorzystuje wartości innych pól. Następnie możesz zdefiniować „błąd” pola jako „error = phi-phiprime” w edytorze pól i wykreślić to „błąd” jako powierzchnię, wykres konturowy lub cokolwiek, co cię interesuje.

Krok kopiowania bloku danych z jednego pliku do drugiego jest wyraźnie niewygodny, ale to najlepsze, co mogę wymyślić.


1

Zdałem sobie sprawę, że jest nieco starszy, ale pomyślałem, że może Cię zainteresować rozwiązanie VisIt:

Możesz to zrobić w VisIt za pomocą czegoś, co nazywa się wyrażeniem pola siatki krzyżowej. To jest kęs, ale w zasadzie jest maszyną do mapowania pól między bazami danych (w twoim przypadku plików VTK).

„Oparte na łączności” (conn_cmfe) jest używane, gdy topologia jest taka sama między plikami - jak w twoim przypadku.

Istnieje również „oparty na pozycji” (pos_cmfe), który pobiera próbki między siatkami o różnych topologiach.

W twoim przypadku otwórz pierwszy plik i użyj okna Wyrażenia, aby zdefiniować wyrażenie (MyPhi_Diff):

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

Następnie możesz wydrukować „MyPhi_Diff” za pomocą wykresu Pseudocolor.

Istnieje również kreator, którego można użyć do zdefiniowania wyrażenia

(Menu opcji -> „Porównania poziomu danych”)

Oto kilka informacji:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.