Welche Strategien zur lokalen adaptiven Netzverfeinerung (Local AMR) auf unstrukturierten Netzen gibt es?

8

Ich interessiere mich für lokale AMR auf unstrukturierten Netzen. Derzeit arbeite ich mit der OpenFOAM-Bibliothek - sie unterstützt völlig unstrukturierte lokale AMR:

  • Zellverfeinerungskriterien bestimmen eine Liste der Zellen, die geschnitten werden
  • Ausgewählte Zellen werden verfeinert: Das gesamte Netz wird neu aufgebaut
  • Aus dem alten Netz wird eine Karte erstellt
  • Die Konnektivität wird neu berechnet (Gesichtszellen, Randflächen usw.)
  • Felder werden auf das neue Netz abgebildet

Da es sich bei den beteiligten Datenstrukturen im Wesentlichen um C ++ - Vektoren handelt, wird das Netz aufgeblasen und kopiert.

Ich muss alternative Ansätze kennenlernen, die auf einem Netz aufbauen können, das statische Datenstrukturen verwendet. Eine davon ist die parallele lokale AMR von Octree Forrest, die in p4est und Dendro vorhanden ist .

Kann mich jemand auf ein kürzlich veröffentlichtes Übersichtsartikel über lokale adaptive AMR-Strategien für unstrukturierte Netze verweisen ?

Erfahrungsbasierte Beratung wäre sogar noch besser: Welche lokale AMR-Engine ist die optimale Wahl für unstrukturierte Netze mit fester Datenstruktur?

Ich brauche einen Überblick, bevor ich auf der ersten Seite eines Papiers über das Ausbalancieren der Kommunikation zwischen Bäumen lese. :) :)

tmaric
quelle
Was genau meinen Sie mit "statischen Datenstrukturen"? Während der Netzverfeinerung nimmt natürlich die Anzahl der Zellen zu, und daher muss definitiv eine gewisse Datenstruktur wachsen (Ihre "aufgeblasen, kopiert"). Ich bin mir nur nicht ganz sicher, was genau Ihre Frage ist, fürchte ich.
Wolfgang Bangerth
Wenn das Netz auf std :: vector-ähnlichen Datenstrukturen basiert, führt das Hinzufügen einer einzelnen Zelle zum Erstellen eines neuen std :: vector (mit größerer Größe für die neue Zelle, ihre Punkte und Flächen) und zum Kopieren der alte unraffinierte Daten zu den neuen Strukturen. Wenn ich es mit Octree Forrest richtig verstehe, werde ich die Datenstrukturen, die mein Netz definieren, nicht erweitern, der Octree Forrest enthält alle erforderlichen Informationen zur Verfeinerung, und der Octree ist eine dynamische Datenstruktur in dem Sinne, dass eine einzelne Zelle geändert wird kopiert nicht den gesamten Baum und erweitert ihn für ein einzelnes Element.
Tmaric
Noch ein Hinweis: Da ich mich in zwei Phasenströme befinde, selbst bei stark dispergierten Strömungen (viele Blasen), muss möglicherweise bis zu 25% der gesamten Zellzahl verfeinert werden, was bedeutet, dass dies für eine völlig unstrukturierte Strömung gilt Lokale AMR, jedes Mal, wenn ich verfeinere, kopiere ich das gesamte Netz nur für die 25% der Zellen, die in der Verfeinerung aktiv sind.
Tmaric
2
Wenn Sie eine statische Datenstruktur verwenden, gibt es keine effiziente Möglichkeit, neue Daten hinzuzufügen, ohne die alten Daten mühsam auf einen neuen Vektor zu kopieren. Eine Einfüge- / Löschoperation würde dann eine -Operation kosten , wobei n die Länge des Vektors ist. Soweit mir bekannt ist, kann dies nur effizient durchgeführt werden, wenn Sie eine dynamische Datenstruktur (Baum, Grafik usw.) verwenden, die ungefähr Θ ( 1 ) -Operationen verwendet. Θ(n)nΘ(1)
Paul
2
Ich weiß nicht, was andere Bibliotheken verwenden, aber in deal.II haben wir eine Kombination aus statischen und dynamischen Datenstrukturen: Wir haben einen std :: vector für jede Ebene des hierarchischen Netzes. Wenn Zellen vergröbert sind, markieren wir die Elemente des Vektors als nicht verwendet. Wenn Zellen verfeinert werden, werden die untergeordneten Elemente in den std :: -Vektor der nächsten Ebene eingefügt, zuerst in nicht verwendete Elemente und dann am Ende angehängt. Wenn eine Neuzuweisung erforderlich ist, weil Elemente hinzugefügt werden, zählen wir zuerst, wie viele neue Elemente wir während der Verfeinerung benötigen, und führen eine einzelne Zuordnung durch. In diesem Schema sind die Kosten für die Zuweisung / Kopie vernachlässigbar.
Wolfgang Bangerth

Antworten:

4

Aus den obigen Kommentaren geht hervor, dass Sie vermeiden möchten, den Vektor zu kopieren, wenn Sie weitere Zellen hinzufügen. Der einfachste Ansatz besteht darin, Platz für die maximale Anzahl von Zellen zu reservieren, die Sie möglicherweise haben möchten:

std::vector<YourCellType> myVectorOfCells;
vectorOfCells.reserve(maxNoCells);

Ihr Vektor hat Speicherplatz zum Erstellen von maxNoCells-Zellen zugewiesen, es wurden jedoch noch keine Zellen erstellt. Sie können Ihrem Vektor jetzt bei jeder Operation maxNoCells hinzufügen O(1), ohne dass sich der Vektor selbst kopiert. Der C ++ - Standard erfordert jedoch, dass die Push_back-Operation zeitlich abgeschrieben O(1) wird. Wenn Sie mehr als maxNoCells hinzufügen, kopiert sich der Vektor selbst und reserviert Speicherplatz für k-mal so viele Zellen wie zuvor (typische Implementierungen wählen ak zwischen 1,4 und 2), sodass Sie dem Vektor weiterhin O(1)rechtzeitig Zellen hinzufügen können . Dieser Größenänderungsvorgang ist nicht O(1) .

O(1)n/.2n/.2O(1)Zeit ... soweit Sie zuerst Speicher reservieren, können Sie auch Elemente in O (1) -Zeit hinzufügen! Wie Prof. Bangerth oben erwähnt hat, verwenden hierarchische Datenstrukturen wie Bäume auch intern Vektoren zum Speichern ihrer Daten.

Ich denke jedoch, dass es besser ist, zu Beginn der Simulation Speicher zuzuweisen . Sie müssen wissen, wie viele Zellen Sie möglicherweise benötigen können, um zu überprüfen, ob genügend Speicher verfügbar ist. Sie möchten nicht, dass Ihre Simulation in 200.000 Prozessoren Ihre Datenstruktur neu zuordnen muss oder nicht genügend Speicherplatz zur Verfügung steht und auf die Festplatte ausgetauscht werden muss. In diesem Fall sollte mein Programm meiner Meinung nach aufgrund eines Benutzereingabefehlers lautstark ausfallen.

gnzlbg
quelle
Vielen Dank! :) Ich werde die Funktionalität der Reserveoperation für die dynamische Vektordatenstruktur in OpenFOAM überprüfen ... Ich denke, dass die Operation jetzt basierend auf den von der Festplatte gelesenen Netzdaten ausgeführt wird und die Datenstruktur bis zum Ende ausfüllt .
Tmaric