Effiziente Interpolationsmethode für unstrukturierte Gitter?

12

Ich würde gerne eine gute Methode zum Interpolieren von Daten zwischen zwei unstrukturierten Gittern kennen, wobei ein Gitter eine gröbere Version des anderen ist.

Effizienz ist für mich sehr wichtig, da ich ein vorübergehendes PDE-Problem löse, bei dem ich zu jedem Zeitpunkt der Lösung Daten zwischen den Gittern übertragen muss.

Ich dachte darüber nach, kd-tree zum Suchen des nächsten Knotens eines bestimmten Punkts zu verwenden, dann würde ich die Formfunktionen dieses Elements (FEM-Simulation) verwenden, um die Daten zu interpolieren. Ist das eine gute Lösung? Gibt es bessere?

Kennen Sie auch eine robuste und zuverlässige Bibliothek in C / C ++ für diese Aufgabe?

* Ich weiß, dass es eine ähnliche Frage gibt, aber sie fragt nach der genauesten Methode in einem strukturierten Raster.

Bernardo MR
quelle
In diesen Fragen und Antworten habe
denfromufa

Antworten:

6

Unstrukturierte Gitter haben ihren Platz.

Vielleicht möchten Sie sich das Earth System Modeling Framework (ESMF) ansehen. Sie haben einen Code zum erneuten Gittern - speziell für diesen Zweck - und sie haben auch einige raffinierte Dinge mit parallelem Code gemacht. Das gesamte System ist so konzipiert, dass Modelle gekoppelt werden können, sodass möglicherweise auch andere nützliche Dinge vorhanden sind.

Einige andere Hinweise:

"Keine Möglichkeit, dies für eine signifikante Anzahl von Punkten effizient zu tun"

Nun, effizient ist eine relative Sache - sobald Sie das Raster in einer Baumstruktur haben, können Sie es in O (logn) suchen, was verdammt schnell sein kann, wenn auch nicht in O (1), wie das Durchsuchen eines regulären Rasters ist.

Es hört sich auch so an, als ob die Interpolation bei jedem Zeitschritt durchgeführt werden muss. Wenn sich die Gitter nicht anpassen, bleibt die Zuordnung von einem Gitter zu einem anderen konstant. Sie können diese Zuordnung (dh welches Element in jedem Raster welchem ​​Element im anderen entspricht) auf beliebige Weise berechnen, speichern und müssen sie dann nie wieder berechnen (bis sich die Raster ändern).

So bleibt Ihnen der Interpolationscode - wo Sie Genauigkeit und Leistung in Einklang bringen möchten - eine einfache lineare Interpolation über ein Dreieck ist schnell und möglicherweise gut genug.

"Ich habe darüber nachgedacht, kd-tree zum Suchen des nächsten Knotens eines bestimmten Punkts zu verwenden, dann würde ich die Formfunktionen dieses Elements verwenden."

Denken Sie daran, dass der nächste Knoten Ihnen das Element nicht liefert. Sie sollten also etwas mehr tun, um das gewünschte Element zu finden. Eine Möglichkeit wäre, stattdessen einen Baum zu verwenden, der nach Begrenzungsrahmen speichert / sucht - Sie erhalten bei jeder Suche mehr als ein Element, können dann aber direkt überprüfen, welches davon korrekt ist.

Chris Barker
quelle
Das sieht gut aus. Ich muss die Netze nicht anpassen, daher wird die Zuordnung von einem Raster zum anderen nur einmal vorgenommen. Vielen Dank für den Tipp zur R-Tree-Datenstruktur.
Bernardo MR
1
O(N)O(logN)
7

Wenn ich Sie richtig verstehe, möchten Sie die Werte des feineren Gitters durch Interpolation auf dem gröberen Gitter eingeben. Eine Möglichkeit zur linearen Interpolation in einem unstrukturierten Gitter sind Delaunay-Triangulationen (auf diese Weise werden die Befehle Griddata und TriScatteredInterp von Matlab implementiert). Nachdem Sie eine Triangulation Ihrer Gitterpunkte erstellt haben, läuft die Interpolation darauf hinaus, das Dreieck mit dem Zielpunkt zu lokalisieren, seine Schwerpunktkoordinaten zu berechnen und den Interpolationswert anhand der Funktionswerte an den Eckpunkten zu berechnen. CGAL kann n-dimensionale Triangulationen (für Medium n) konstruieren und verfügt außerdem über ein eingebautes 2d-Interpolationsmodul .

Ronaldo Carpio
quelle
Ja. Aber ich möchte auch die Werte aus dem feinen Gitter in das grobe Gitter "einspeisen", deshalb habe ich Übertragung gesagt.
Bernardo MR
3

Dies ist, was ich im Moment mache, außer dass ich Funktionswerte an Quadraturpunkten übertrage, nicht an Knoten. Ich implementiere die Technik, die in der gewählten Antwort auf meine Frage hier erklärt wurde: Finden, in welchen Dreiecken sich Punkte befinden .

ABAB

  1. BpiA
  2. pi
  3. AA
  4. Ap1p2p3A

NMAO(NM)O(max(N,M))

Nick Alger
quelle
2

Dies ist die Art von Arbeit, für die Sie wirklich unstrukturierte Netze vermeiden möchten, da es keine Möglichkeit gibt, dies für eine signifikante Anzahl von Punkten effizient durchzuführen. Sie sollten in Betracht ziehen, Netze zu verwenden, die zumindest irgendwie miteinander verwandt sind. Wenn beide beispielsweise durch hierarchische Verfeinerung eines groben Netzes erhalten werden, können Sie relativ einfach und effizient herausfinden, wo sich die Interpolationspunkte eines Netzes auf dem anderen Netz befinden.

Wolfgang Bangerth
quelle
Ich denke, das könnte die beste Option sein (Hierarchie der Gitter). Wenn dies der Fall ist, kennen Sie eine gute Datenstruktur oder eine bestimmte Methode?
Bernardo MR
Ja, hierarchische Netze werden alle als Quad / Oct-Bäume (wenn sie in einer einzelnen Grobzelle beginnen) oder als Wälder solcher Bäume (wenn das Grobnetz mehr als eine Zelle enthält) gespeichert.
Wolfgang Bangerth