29.06.2015 Aufrufe

Numerische Simulation der Bildung fluider Strukturen auf ...

Numerische Simulation der Bildung fluider Strukturen auf ...

Numerische Simulation der Bildung fluider Strukturen auf ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

A.2.<br />

FINITE ELEMENTE<br />

• Die Kante mit dem lokalen Index 2 ist die Verfeinerungskante.<br />

• Ein neu eingefügter Knoten bekommt in den neuen Elementen den lokalen Index 2.<br />

Die folgende Abbildung zeigt die Verteilung <strong>der</strong> lokalen Indizes beim Unterteilen eines<br />

Elementes. Die schwarzen Zahlen sind die lokalen Indizes des Elementes, die grünen Zahlen<br />

die lokalen Indizes <strong>der</strong> beiden Kin<strong>der</strong>elemente.<br />

2<br />

child[1]<br />

1 0<br />

child[0]<br />

1<br />

0 2 2 1<br />

0<br />

Die Funktion recursiveRefine lautet also wie folgt:<br />

void Element::recursiveRefine(void *arg){<br />

if(nb[2] && nbEdgeIndex[2]!=2){ // gleiche Verfeinerungskante ?<br />

nb[2]->recursiveRefine(arg);<br />

};<br />

if(nb[2]){bisectInteriorEdge(arg);} // Randelement ?<br />

else{bisectBor<strong>der</strong>Edge(arg);};<br />

};<br />

Das Unterteilen <strong>der</strong> Dreiecke selbst erledigen die Methoden bisectInteriorEdge (für Kanten<br />

im Inneren des Gebietes) und bisectBor<strong>der</strong>Edge (für Kanten am Rand des Gebietes).<br />

Es ist theoretisch möglich, dass <strong>der</strong> rekursive Algorithmus nicht terminiert – und bei <strong>der</strong><br />

Suche nach zwei Dreiecken mit gemeinsamer Verfeinerungskante in eine Schleife gerät (wenn<br />

z.B in einem Sechseck aus sechs Dreiecken jeweils die im Uhrzeigersinn liegende Kante<br />

Verfeinerungskante ist). Dies kann aber nur geschehen, wenn eine solche Schleife auch schon<br />

in <strong>der</strong> Makrotriangulierung möglich ist – und kann daher leicht vermieden werden.<br />

Die Klasse Mesh stellt die folgenden Funktionen zur Verfügung, welche das Verfeinern und<br />

Vergröbern des Gitters managen. Zunächst einmal die beiden Routinen<br />

void Mesh::markAllForRef();<br />

void Mesh::markAllForCoa();<br />

welche alle Elemente ohne Kin<strong>der</strong> (genauer: ohne Kin<strong>der</strong>, die als ACTIVE markiert sind)<br />

mit Hilfe <strong>der</strong> Flags REFINE und COARSE zum Verfeinern bzw. Vergröbern markieren. Zum<br />

Verfeinern gibt es die Routine<br />

void Mesh::refineMesh(vector* v1=NULL, vector* v2=NULL);<br />

welche alle mit REFINE markierten Elemente mit Hilfe <strong>der</strong> oben vorgestellten Funktion<br />

recursiveRefine verfeinert. Darüber hinaus können refineMesh noch bis zu zwei Vektoren<br />

übergeben werden, welche Funktionen aus dem Finite-Elemente-Raum V h darstellen.<br />

Beim Verfeinern werden diese automatisch an das neue Gitter angepasst. Die Funktion<br />

refineMesh ist also ein Zweizeiler:<br />

101

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!