Blatt 4 - Institute for Numerical Simulation

Werbung
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.
Herunterladen