Wie berechne ich die numerische Differenz zwischen zwei Feldern, die in zwei verschiedenen VTK-Dateien mit derselben Struktur gespeichert sind?


13

Angenommen, ich habe zwei VTK-Dateien, beide im strukturierten Rasterformat. Die strukturierten Gitter sind gleich (sie haben die gleiche Liste von Punkten in der gleichen Reihenfolge), und in jeder VTK-Datei gibt es ein Feld mit der Bezeichnung "Phi". Ich möchte eine dritte VTK-Datei mit demselben strukturierten Raster erstellen und ein Feld zeichnen, das den Unterschied zwischen Phi in der ersten VTK-Datei und Phi in der zweiten VTK-Datei darstellt.

Ich weiß, wie man das manuell macht; Ich kann den Rohtext in den beiden VTK-Dateien analysieren, die Daten in Arrays kopieren, ein Array vom anderen subtrahieren und die Daten im richtigen Format in eine neue Datei kopieren. Gibt es eine bessere Möglichkeit, diesen Unterschied zu berechnen und in VTK zu exportieren? Eine Lösung in Python oder in Visualisierungssoftware wie VisIt oder Paraview ist der Verwendung einer kompilierten Sprache wie C ++ vorzuziehen.

Der Zweck der Berechnung dieser Differenz besteht darin, verschiedene numerische Methoden zur Berechnung der Lösung einer PDE zu vergleichen. Da ich für die Erstellung der Lösungen dieselbe Software verwende, kann ich garantieren, dass alle Daten außer dem Feld Phi in jeder von mir erstellten Datei gleich sind.


Ich habe diese Frage gestellt, weil ich ungefähr anderthalb Tage gebraucht habe, um die Antwort herauszufinden. Hätte ich es gestern nicht gefunden, hätte ich diese Frage hier sowieso gestellt. Ich bin daran interessiert zu sehen, ob es andere schnelle Möglichkeiten gibt, die gleiche Aufgabe zu erfüllen.
Geoff Oxberry

Wenn Sie "den rohen Text analysieren" sagen, meinen Sie wörtlich in die Datei zu gehen oder einen Python-Parser zu verwenden?
SAAD

Damals wollte ich einen Python-Parser von Hand schreiben.
Geoff Oxberry

Antworten:


15

Die einfachste Möglichkeit, zwei Felder von verschiedenen VTK-Dateien mit demselben strukturierten Raster zu subtrahieren, besteht darin, in Paraview einen programmierbaren Filter zu verwenden, mit dem Sie Daten mithilfe von Python-Skripten bearbeiten können.

Im Dialogfeld "Programmierbarer Filter" können Sie die beiden Arrays subtrahieren und schreiben, um sie mit dem Code auszugeben:

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

In diesem Fall handelt es sich bei dem Feld Phi zufällig um Zellendaten. Wenn es sich bei Ihrem Feld um Punktdaten handelt, ersetzen Sie das CellDatagesamte Skript durch PointData. Weitere Informationen finden Sie unter http://public.kitware.com/pipermail/paraview/2010-April/016667.html .


3
Es ist nie zu viel daran zu erinnern, dass man, um zwei Eingänge (Eingänge [0] und Eingänge [1]) zu haben, beide Datensätze markieren muss, bevor man den programmierbaren Filter auswählt (dies ist der Link, auf den verwiesen wird).
Toliveira

3

In ParaView gibt es den Filter Attribute anhängen, der dafür verwendet werden kann. Es ist erforderlich, dass sich die gleiche Anzahl von Punkten im Datensatz zum ordnungsgemäßen Anhängen von Punktdaten und die gleiche Anzahl von Zellen im Datensatz zum ordnungsgemäßen Anhängen von Zelldaten befinden. Es wird jedoch Probleme mit Arrays mit demselben Namen geben (dh Phi in Ihrem Beispiel). Sie können dieses Array einfach mit dem Taschenrechner-Filter kopieren, bevor Sie den Filter Attribute anhängen verwenden. Dann können Sie einen anderen Taschenrechner-Filter verwenden, um die Subtraktion durchzuführen. Dies ist wahrscheinlich weniger effizient als die Verwendung des programmierbaren Python-Filters von ParaView. Außerdem können Sie die ausführbare vtkpython-Datei verwenden, um dies manuell zu tun, da Sie direkten Zugriff auf beide Grids und deren Attribute haben.


1

Ich habe keinen besonders guten Ansatz, aber ich würde das 'phi'-Feld von einer VTK-Datei in die andere kopieren und es' phiprime 'oder so nennen. Sowohl in Paraview als auch in Visit haben Sie die Möglichkeit, neue Felder durch eine Formel zu definieren, die die Werte anderer Felder verwendet. Sie können dann ein Feld "error" als "error = phi-phiprime" im Feldeditor definieren und dieses Feld "error" entweder als Oberfläche, Konturdiagramm oder was auch immer Sie interessieren, darstellen.

Der Schritt des Kopierens des Datenblocks von einer Datei in die andere ist eindeutig umständlich, aber das Beste, was ich mir einfallen lassen kann.


1

Ich habe festgestellt, dass dies etwas älter ist, aber ich denke, dass Sie an der VisIt-Lösung interessiert sein könnten:

Sie können dies in VisIt mit einem so genannten Connectively Based Cross Mesh Field Expression tun. Das ist ein Mund voll, ist aber im Grunde eine Maschinerie, um Felder zwischen Datenbanken (in Ihrem Fall VTK-Dateien) zuzuordnen.

"Connectivity based" (conn_cmfe) wird verwendet, wenn die Topologie zwischen den Dateien identisch ist - wie in Ihrem Fall.

Es gibt auch ein "Positionsbasiertes" (pos_cmfe), das zwischen Maschen mit verschiedenen Topologien abtastet.

Öffnen Sie für Ihren Fall die erste Datei und definieren Sie im Fenster Ausdrücke einen Ausdruck (MyPhi_Diff):

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

Dann können Sie "MyPhi_Diff" mit einem Pseudocolor-Plot zeichnen.

Es gibt auch einen Assistenten, mit dessen Hilfe Sie den Ausdruck definieren können

(Optionsmenü -> "Datenebenenvergleiche")

Hier noch ein paar Infos:

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.