Programmierpraktikum zum Wiss. Rechnen I, WS 2008/09 Institut für Numerische Simulation Prof. Dr. Martin Rumpf Benedict Geihe, Stefan W. von Deylen Aufgabenblatt 4 Ausgabe: 10. November 2008 Aufgabe 5 [Dart-Iteratoren] In dieser Aufgabe sollen die Funktionen implementiert werden, die es dem Dart-Iterator ermöglichen, sich über ein Dreiecksgitter zu bewegen: • DartIterator :: flipNode (): Bewegt den Iterator zum Knoten am anderen Ende der aktuellen Kante im aktuellen Dreieck. • DartIterator :: flipEdge (): Bewegt den Iterator zur Kante auf der anderen Seite des aktuellen Knotens im aktuellen Dreieck. • DartIterator :: flipTriangle (): Bewegt den Iterator zum Dreieck auf der anderen Seite der aktuellen Kante. Hierfür muss zunächst überprüft werden, ob dort ein Dreieck existiert, z.B. mit einer Funktion DartIterator :: canFlipTriangle (). Beachten Sie, daß Knoten- und Kantenindex natürlich relativ zum neuen Dreieck so bestimmt werden müssen, daß sich Kante und Ecke global gesehen nicht geändert haben. Aufgabe 6 [Verfeinerung] Implementieren Sie die Funktion Grid :: refineMarkedTriangles (). Diese läuft über alle Dreiecke und überprüft, ob das aktuelle Dreieck zur Verfeinerung markiert wurde. In diesem Falle soll es mit dem rekursiven Bisektionsalgorithmus verfeinert werden: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Rekursive Dreiecksverfeinerung durch Bisektion Input: DartIterator d = (t, e, n) (hier globale Indices) Finde längste Kante el in t if e 6= el then Verfeinere t an Kante el Verfeinere t an Kante e else Finde Nachbar t? an Kante e = el Finde längste Kante e?l in t? if e?l 6= e then Verfeinere t? an Kante e?l Verfeinere t an Kante e else Füge neuen Knoten n0 auf e ein Verkleinere t und t? so, daß der Knoten 6= n an Kante e durch n0 ersetzt wird Füge zwei neue Dreiecke t0 und (t? )0 neben t und t? ein, wo die alten zuvor verkleinert wurden Setze alle beteiligten Nachbarschaften Die Klasse Triangle wurde hierfür um eine Membervariable markedForRefinement erweitert. Außerdem stehen Ihnen die Funktionen markForRefinement(), unsetRefinementMarker() und isMarkedForRefinement() zur Verfügung. In der Praktikumsstunde bekommen Sie eine genaue Darstellung des Algorithmus, bei der sämtliche lokale Knoten- und Kantenindizierung über DartIterator-Objekte erledigt wird. Testen Sie Ihre Implementierung mithilfe des aktuellen Hauptprogramms im Musterlösungsordner. Nach zwei Verfeinerungsschritten sollte Ihr Gitter folgende Form besitzen: Nodes: [ 0.00 [ 1.00 [ 0.50 [ 0.00 [ 1.00 [ 0.50 [ 0.25 [ 0.00 0.00 0.00 0.50 1.00 1.00 0.00 0.25 0.50 ] ] ] ] ] ] ] ] Triangles: Index: 0 Nodes: 6 5 2 Neighbours: [ [ [ 4, 1, 0.25 0.50 0.50 7 0.25 ] 0.00 ] 0.50 ] Index: 1 Nodes: 7 2 6 Neighbours: [ [ [ 0, 6, 0.00 0.50 0.25 5 0.50 ] 0.50 ] 0.25 ] Index: 2 Nodes: 4 1 2 Neighbours: [ [ [ 4, 3, 1.00 1.00 0.50 -1 1.00 ] 0.00 ] 0.50 ] Index: 3 Nodes: 2 3 4 Neighbours: [ 0.50 [ 0.00 [ 1.00 -1, 2, 5 0.50 ] 1.00 ] 1.00 ] Index: 4 Nodes: 5 1 2 Neighbours: [ [ [ 2, 0, 0.50 1.00 0.50 -1 0.00 ] 0.00 ] 0.50 ] Index: 5 Nodes: 7 3 2 Neighbours: [ [ [ 3, 1, 0.00 0.00 0.50 -1 0.50 ] 1.00 ] 0.50 ] Index: 6 Nodes: 6 0 7 Neighbours: [ 0.25 [ 0.00 [ 0.00 -1, 1, 7 0.25 ] 0.00 ] 0.50 ] Index: 7 Nodes: 6 0 5 Neighbours: [ 0.25 [ 0.00 [ 0.50 -1, 0, 6 0.25 ] 0.00 ] 0.00 ] Dreiecksnetz 1 0.8 0.6 0.4 0.2 0 0 0.2 0.4 0.6 0.8 1 Zusatzaufgabe B [Globale Verfeinerung] Das gleichzeitige Verfeinern aller Dreiecke ist natürlich möglich, indem alle Dreiecke markiert werden und anschließend der obige Algorithmus verwendet wird. Es bietet sich jedoch an, hier eine nicht rekursive Strategie zu verfolgen, die alle Dreiecke nach dem folgenden Schema in vier kongruente Dreiecke zerlegt: Der Vorteil ist, dass die neuen Dreiecke bis auf Skalierung zu dem alten kongruent sind; insbesondere wird kein Winkel kleiner. Da alle Dreiecke verfeinert werden, können auch keine hängenden Knoten entstehen. Machen Sie sich darüber Gedanken, wie eine entsprechende Funktion Grid :: refine4All () vorzugehen hätte. Notieren Sie den Algorithmus ähnlich detailliert, wie in der Praktikumsstunde Grid :: refine (DartIterator) vorgestellt wurde, und implementieren Sie ihn danach.