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. :) :)
Antworten:
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:
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 abgeschriebenO(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 weiterhinO(1)
rechtzeitig Zellen hinzufügen können . Dieser Größenänderungsvorgang ist nichtO(1)
.O(1)
O(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.
quelle