Post on 06-Feb-2018
PDEs lösen mit Matlab
Matlab PDE-Toolbox, Erweiterungen, Finite-Elemente auf
Viereck-Gittern.
−1 −0.8 −0.6 −0.4 −0.2 0 0.2 0.4 0.6 0.8 1
−0.2
0
0.2
0.4
0.6
0.8
1
1.2
Uwe Prüfert
29. Mai 2013
2
Inhaltsverzeichnis
1. Finite-Elemente-Methode in Matlab 31.1. Exkurs: Definition des Gebietes Ω und der Randbedingungen. . . . . . . . . 51.2. Zwei einfache Beispielprogramme . . . . . . . . . . . . . . . . . . . . . . . 101.3. Die PDE Toolbox erweitern . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2. Funktionen auf einen Blick 192.1. Geometrie Definition. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.2. Gitter-Generierung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.3. Randbedingungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.4. Matrix assembling. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.5. Grafische Ausgabe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.6. Helferfunktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3. Objektorientierter Ansatz 243.1. Konzept: Abstraktion und Vererbung . . . . . . . . . . . . . . . . . . . . . . 243.2. Klasse gridd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263.3. Die Klasse grid2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4. FEM in 3D 314.1. 3D-Gitter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314.2. Assemblierung der Matrizen . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.2.1. Mathematischer Ansatz . . . . . . . . . . . . . . . . . . . . . . . . . 324.2.1.1. Aufgabe im Gebiet Ω . . . . . . . . . . . . . . . . . . . . 324.2.1.2. Randbedingungen . . . . . . . . . . . . . . . . . . . . . . 36
4.2.2. Lineare finite Elemente über Tetraeder . . . . . . . . . . . . . . . . . 374.2.2.1. Basisintegrale und Linear-/Quadratformen . . . . . . . . . 374.2.2.2. Die die lokalen Matrizen Si . . . . . . . . . . . . . . . . . 39
4.2.3. Bilinearer Ansatz über Prismenelemente . . . . . . . . . . . . . . . . 404.2.3.1. Basisintegrale und Linear- /Quadratformen . . . . . . . . . 404.2.3.2. Die lokalen Matrizen Si . . . . . . . . . . . . . . . . . . . 454.2.3.3. Randintegrale . . . . . . . . . . . . . . . . . . . . . . . . 504.2.3.4. Implementierung . . . . . . . . . . . . . . . . . . . . . . . 50
A. Beispielprogramme 54A.1. Klassischer Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
A.1.1. Elliptische PDE mit Dirichlet-Randbedingungen . . . . . . . . . . . 54
4
Inhaltsverzeichnis
A.1.2. Semilineare parabolische PDE mit Neumann-Randbedingungen . . . 55A.1.3. PDE mit Quelle am Rand . . . . . . . . . . . . . . . . . . . . . . . . 55A.1.4. Der Löser parabolic . . . . . . . . . . . . . . . . . . . . . . . . . 56A.1.5. Die Lösung zeitabhängiger Probleme mit den odexxx-Lösern . . . . 58A.1.6. Lösung stationärer Probleme mittels Zeitintegration . . . . . . . . . . 60A.1.7. 1D PDEtool und die Klasse ocp . . . . . . . . . . . . . . . . . . . . 61A.1.8. Kompatibilität zwischen MATLAB’s PDE Toolbox und den 1D Funk-
tionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62A.1.9. Nichtlineares Konvektions-Diffusions-Problem: Die Burgers-Gleichung 64A.1.10. Konvektions-Diffusions-Problem auf Q-Gitter . . . . . . . . . . . . . 66A.1.11. Eine Stoffransportsimulation . . . . . . . . . . . . . . . . . . . . . . 66
A.2. Objektorientierter Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70A.2.1. Konvektions-Diffusionsgleichung in 1D . . . . . . . . . . . . . . . . 70A.2.2. Burgers’s Gleichung . . . . . . . . . . . . . . . . . . . . . . . . . . 70A.2.3. Konvektions-Diffusionsgleichung in 2D . . . . . . . . . . . . . . . . 71A.2.4. Konvektions-Diffusionsgleichung mit nichtlinearer Quelle . . . . . . 72A.2.5. Diffusionsproblem in 3D . . . . . . . . . . . . . . . . . . . . . . . . 76
1
Inhaltsverzeichnis
2
1
Kapitel 1.
Finite-Elemente-Methode in
Matlab
Wir werden im folgenden Abschnitt einleitend auf die zugrunde liegende Finite-Elemente-Methode eingehen.
Sei Ω⊂ R2, offen und Γ sei der Rand von Ω. Wir betrachten das elliptische PDE Problem
−∇(c∇u)+au = f in Ω
~n(c∇u)+qu = g auf Γ, (1.1)
wobei c eine positiv-definite Matrix-Funktion Ω→ R ist. Durch Multiplikation mit einer ge-eigneten Testfunktion v ∈ H1(Ω) und nach partieller Integration mittels der Greenschen For-mel gelangen wir zur schwachen Formulierung der Gleichung (1.1):
ˆΩ
c(x)∇u(x)∇v(x)dx +
ˆΩ
a(x)u(x)v(x)dx −ˆ
Γ
~n(c∇u(s))v(s)ds =
ˆΩ
f (x)v(x)dx.
Jetzt können wir den Ausdruck im Randintegral auf der linken Seite durch die Randbedin-gung ersetzen, also−
´Γ~n(c∇u(s))v(s)ds =
´Γ(q(s)u(s)−g(s))v(s)ds. Damit lässt sich (1.1)
äquivalent als
ˆΩ
c(x)∇u(x)∇v(x)dx+ˆ
Ω
a(x)u(x)v(x)dx+ˆ
Γ
q(x)u(x)v(x)ds
=
ˆΩ
f (x)v(x)dx+ˆ
Γ
g(x)v(x)ds (1.2)
schreiben. Diese Gleichung gilt für alle v ∈ V . Ersetzen wir nun V durch einen endlichdi-mensionalen Unterraum Vh ⊂ V und betrachten uh = ∑uiφi, vh = ∑viφi wobei φi eine Basisdes Raumes Vh seien. Wir wählen die Ansatzfunktionen φ i nun geeignet, das heißt so, dassφi ∈H1(Ω∆), wobei Ω∆ eine endliche Überdeckung von Ω durch Dreiecke sei. Der einfachsteVertreter dieser Klasse von Funktionen sind lineare finite Elemente, die so genannten “Hüt-
3
1. Finite-Elemente-Methode in MATLAB
chenfunktionen.” Die Gleichung (1.2) wird nun zuˆ
Ω∆
c(x)∇∑u jφ j(x)∇∑φi(x)dx+ˆ
Ω∆
a(x)∑u jφ j(x)∑φi(x)dx
+
ˆΓ∆
q(x)∑u jφ j(x)∑φi(x)ds
=
ˆΩ∆
f (x)∑φi(x)dx+ˆ
Γ∆
g(x)∑φi(x)ds,
i, j = 1, ...,nx, wobei wir heimlich noch vorausgesetzt haben, dass sich die Koeffizienten-funktionen stückweise konstant sind, bzw. sich hinreichend genau durch stückweise konstanteFunktionen approximieren lassen. Nachdem wir die obigen Gleichung integriert haben, erhal-ten wir das lineare System
(K +M+Q)u = (F +G),
wobei nun u der Koeffizientenvektor u1, ...,unx und die Matrizen K,M und Q sowie die Vek-toren F und G als
Ki, j =
ˆΩ
c(x)∇φ j(x)∇φi(x)dx
Mi, j =
ˆΩ
a(x)φ j(x)φi(x)dx
Qi, j =
ˆΓ
q(x)φ j(x)φi(x)ds
Fi =
ˆΩ
f (x)φi(x)dx
Gi =
ˆΓ
g(x)φi(x)ds
für i, j = 1, ...,nx definiert sind, wobei nx die Anzahl der Knoten des Gitters ist. Im Prinzipfunktioniert diese Herleitung so auch für räumlich ein- und dreidimensionale Probleme.
In der obigen Herleitung der Diskretisierung geht essentiell ein, dass wir eine Aufgabe mitRobin-Randbedingungen gegeben haben. Dirichlet-Randbedingungen lassen sich nicht in die-ser Weise behandeln. Wir werden später zwei mögliche Lösungen dieses Problems diskutie-ren.
Um die Gleichung (1.1) zu lösen, bietet die Matlab PDE Toolbox eine grafische Nutzer-schnittstelle (GUI) an. Diese wird von der MATLAB Kommandozeile mit
>>pdetool
aufgerufen, vergleiche dazu auch die Dokumentation [?]. In diesem Tutorium sind wir aberan der Lösung der Aufgabe direkt in MATLAB – unter Benutzung der unter der grafischenOberfläche versteckt liegenden Funktionen – interessiert.
Ein Rahmenprogramm für die Lösung der Aufgabe (1.1) sieht in etwas so aus:
4
1. Finite-Elemente-Methode in MATLAB
1g = geomet ry ;2b = boundary ;3l = 1 e3 ;4c = 1 ;5a = 0 ;6f = 1 0 ;7[ p , e , t ] = i n i t m e s h ( g , ’hmax ’ , 0 . 1 ) ;8[ p , e , t ] = r e f i n e m e s h ( g , p , e , t ) ;9[K,M, F ] = assema ( p , t , c , a , f ) ;10[Q, G, H, R] = assemb ( b , p , e ) ;11u = (K+M+Q+ l *H’*H ) \ ( F+ l *H’*R+G ) ;12p d e s u r f ( p , t , u ) ;
In Zeile 1 und 2 sollten wir die Geometrie und die Randbedingungen definieren. Dies istauf der Kommandozeile nicht so einfach, so dass wir Details dazu auf später verschieben. InZeile 3 definieren wir den so genannten “Stiff-spring coefficient” l = 103 . Diese Zahl spielteine wichtige Rolle bei der Approximation von Dirichlet Randbedingungen hu = r. Die Be-rechnung der Matrizen und Vektoren des linearen Systems wird in Zeile 8–10 vorgenommen.Die Lösung der PDE selbst wird dann in Zeile 11 durch Lösen eines linearen Gleichungs-systems erledigt. Der Vektor u enthält die Koeffizienten der Lösung bezüglich der gewähltenAnsatz-Funktionen. Das Rahmenprogramm ist unabhängig von der Dimension des Gebietesund auch vom gewählten finite Elemente Raum, es sind natürlich die Funktionen im Programmanzupassen. Im Abschnitt 1.2 werden wir die Anwendung des obigen Rahmens auf konkreteProbleme demonstrieren.
1.1. Exkurs: Denition des Gebietes Ω und der
Randbedingungen.
Die decomposed geometry Matrix
Im obigen Rahmenprogramm wurde die Geometrie des Gebietes Ω durch die Anweisung
g = geomet ry ;
definiert. Im Prinzip reicht es, wenn geometry eine Matrix – oder eine Funktion, die ei-ne Matrix als Ergebnis liefert – ist, die die Spezifikation der ”decomposed geometry Matrixerfüllt. Wir zitieren [?]:
“The Decomposed Geometry Matrix DL contains a representation of the mi-nimal regions that have been constructed by the DECSG algorithm. Each edgesegment of the minimal regions correspond to a column in DL. In each such co-lumn rows two and three contain the starting and ending x-coordinate, and rowsfour and five the corresponding y-coordinate. Rows six and seven contain left andright minimal region numbers with respect to the direction induced by the startand end points (counter clockwise direction on circle and ellipse segments). The-re are three types of possible edge segments in a minimal regions:
5
1. Finite-Elemente-Methode in MATLAB
1. For circle edge segments row one is 1. Rows eight and nine contain thecoordinates of the center of the circle. Row 10 contains the radius.
2. For line edge segments row one is 2.3. For ellipse edge segments row one is 4. Rows eight and nine contain the
coordinates of the center of the ellipse. Rows 10 and 11 contain the major andminor axes of the ellipse respectively. The rotational angle of the ellipse is storedin row 12.” [?]
Es lassen sich offensichtlich Gebilde definieren, die aus Kreis- und Ellipsensegmenten undLinien bestehen. Wenn man die obigen Anforderungen beherzigt, kann man alle möglichenGeometrien auch auf der MATLAB-Kommandozeile definieren.
Beispiel 1. Definiere ein Fünfeck
g = [2 2 2 2 2
0 1 1.5 0.5 -0.5
1 1.5 0.5 -0.5 0
0 0 1 1.5 1
0 1 1.5 1 0
1 1 1 1 1
0 0 0 0 0]
Beispiel 2. Ein zusammengesetztes Gebiet: Ω = (0,1)× (0,2)∪B1(1,1).
g1 = [2 2 2 1 1
0 1 0 1 2
1 0 0 2 1
0 2 2 0 1
0 2 0 1 2
1 1 1 1 1
0 0 0 0 0
0 0 0 1 1
0 0 0 1 1
0 0 0 1 1];
Für komplexere Gebiete wäre es von Vorteil, wenn man den Rand des Gebietes als parame-trisierte Kurve vorgeben könnte. Ein möglicher Zugang zu solchen Gebieten ist die Approxi-mation des Randes durch einen Polygonzug. Dafür wird die PDE Toolbox um die Funktionpolygong erweitert. Der Aufruf geschieht entweder über Paare xi,yi i = 1, ...,n, wobei n hierdie Anzahl der Ecken des Polygons ist, durch
g = polygong ( [ x1 y1 x2 y2 x3 y3 . . . xn yn ] )
oder durch zwei Vektoren, die die x- und y-Koordinaten der Kurve enthalten, also
g = polygong ( [ x1 x2 x3 . . . xn ] , [ y1 y2 y3 . . . yn ] )
6
1. Finite-Elemente-Methode in MATLAB
Die erste Version ist intuitiver und für die Eingabe per Hand geeignet, die zweite Formeignet sich gut für die Definition über Matlab Funktionen: Im folgenden Beispiel definierenwir die Approximation eines Kreises durch ein 80-Eck.
g = polygong ( cos ( l i n s p a c e ( 0 , 2 * pi , 8 1 ) ) , s i n ( l i n s p a c e ( 0 , 2 * pi , 8 1 ) ) )
Man beachte aber, dass nach einer Gitterverfeinerung das Objekt immer noch ein 80-Eckbleibt. Die Approximation an den Kreis verbessert sich damit nicht. Dies ist bei der Definitionder Kreisgeometrie durch die PDE Toolbox Funktion circleg anders. Wir benötigen für mitpolygong erzeugte Geometrieobjekte für jedes Polygonsegment eine Randbedingung, d.h.eine Spalte in der boundary condition matrix.
Das Format der boundary condition matrix b
Für die Beschreibung der boundary condition matrix zitieren wir das PDE Toolbox Handbuch:
“The format of each column is according to the following list:
• Row one contains the dimension N of the system.
• Row two contains the number M of Dirichlet boundary conditions.
• Row three to 3+N2−1 contain the lengths for the strings representing q. Thelengths are stored in column-wise order with respect to q.
• Row 3+N2 to 3+N2 +N−1 contain the lengths for the strings representingg.
• Row to 3+N2+N to 3+N2+N+MN−1 contain the lengths for the stringsrepresenting h. The lengths are stored in column-wise order with respect toh.
• Row 3+N2 +N +NM to 3+N2 +N +MN +M−1 contain the lengths forthe strings representing r.
The following rows contain text expressions representing the actual boundary con-dition functions. The text strings have the lengths according to above. The MAT-LAB text expressions are stored in column-wise order with respect to h q. Thereare no separation characters between the strings.” [?]
Die boundary condition matrix
b=
1 1 1 1
0 0 0 0
1 1 1 1
6 6 6 6
48 48 48 48
115 115 115 115
105 105 105 105
110 110 110 110
7
1. Finite-Elemente-Methode in MATLAB
40 40 40 40
115 115 115 115
41 41 41 41
repräsentiert die Neumann Randbedingungen~n · (c∇u) = sin(s), also q = 0 und g = sin(s) füreine Geometrie mit vier Randsegmenten. Wir versuchen eine Übersetzung der Kodierung:
• Erste Zeile: eindimensionales Problem, d.h eine einfache PDE, kein System von PDEs,
• Zweite Zeile: keine Dirichlet Randbedingung.
• Dritte Zeile: Die Länge des Eintrags q ist eins,
• Vierte Zeile: Länge von g ist 6. Wir haben keine Dirichlet Randbedingung und folglichgibt es auch kein leeres Feld dafür.
• Daher repräsentiert die fünfte Zeile q. Wir finden dort “48” vor. Hier ist aber das Zeichen“48” gemeint, nicht die Zahl “48”. Also müssen wir die Funktion char anwenden1
char(48)
gibt uns “0”.
• Die nächsten sechs Zeilen repräsentieren g:
char([115 105 110 40 115 41])
ergibt sin(s) .
Obwohl Dirichlet-Randbedingung sich durch Robin Randbedingung approximieren lassen,erlaubt die PDE Toolbox die Definition von Dirichlet Randbedingungen. Im linearen Systemmuss dann die Matrix H ′H und auf der rechten Seite der Vektor H ′R stehen. Diese werden alsGleichungsnebenbedingungen zur PDE betrachtet, vergleiche die Notation H ′ ∗H im Listingauf Seite 4.
Die Funktion boundarymatrix
Die vom Autor bereitgestellte Funktion boundarymatrix erzeugt eine boundary condition
matrix für zwei Randsegmente, die mittels assemb die Berechnung der Randmatrizen undVektoren ermöglicht. Die für eine allgemeine Geometrie benötigte boundary condition
matrix kann dann durch mehrmaliges Anwenden für die jeweiligen Randbedingungen be-rechnet werden, man beachte aber die unterschiedliche Dimension der Ausgabe von boundarymatrixfür verschiedene Randbedingungen, vergleiche dazu Beispiel 4 im nächsten Abschnitt.boundarymatrix erlaubt die Definition der Randbedingungen in “mathematischer Formu-
lierung”, d.h. als String. Wir schauen in die Hilfe zu boundarymatrix.
>>help boundarymatrix
1Für Freunde von OOP. Wir rufen hier den Konstruktor der Klasse char mit dem Parameter “48” auf.
8
1. Finite-Elemente-Methode in MATLAB
ergibt:
b = boundarymatrix([arglist])
defines a 1D boundary Matrix % usage:
same BC on both boundary:
b = boundarymatrix homogeneous Neumann BCs
b = boundarymatrix(g) Neumann BCs
b = boundarymatrix(q,g) Robin BCs
b = boundarymatrix([],[],h,r) Dirichlet BC
different BC: e.g. Dirichlet on the left bound, Robin on the right boundary
b = boundarymatrix([],[],h,r,q,g,[],[])
q,g,h,r are STRINGS like '1' 'sin(s)' etc... but NO inlines
Es gibt einige Kurzaufrufe: .
• Homogene Neumann Randbedingung~n ·∇u = 0 werden erzeugt ohne irgendwelche Ar-gumente durch
b = boundarymatrix
• Für reine Neumann Randbedingung wie~n ·∇u= sin(x), (es gilt q= 0) reicht die Angabeder rechten Seite g:
b = boundarymatrix('sin(x)')
oder äquivalent (und ausführlicher)
b = boundarymatrix('0','sin(x)')
• Robin Randbedingung wie z.B.~n ·∇u+u = sin(x) werden durch
b = boundarymatrix('1','sin(x)')
definiert. Hier sind q = 1 und g = sin(x)
• Dirichlet Randbedingung wie z.B. u = sin(x) können auf zwei Arten definiert werden:
(i) Direkt mittels
b = boundarymatrix([],[],'1','sin(x)')
oder
(ii) via Approximation durch Robin Randbedingung durch
b = boundarymatrix('1000','1000*sin(x)')
was~n ·∇u+1000u = 1000sin(x) ergibt.
Die Assemblierungsfunktion assemb liefert dann einen Satz Matrizen Q,H und Vektoren G,R,die je nach dem Typ der Randbedingung auch Nullmatrizen (“ sparse all zero”) sein können.
Man beachte, dass alle Parameter vom Typ string sein müssen. Alle anderen Formen (auchvom Typ numerical) produzieren Fehler.
9
1. Finite-Elemente-Methode in MATLAB
Die Funktion initmesh
Für die Erweiterung der PDE-Toolbox sind die Daten des Gitters notwendig. Wir zitieren kurzdie Hilfe zu initmesh:
The outputs P, E, and T are the mesh data.
• In the point matrix P, the first and second rows contain x- and y-coordinates of the pointsin the mesh.
• In the edge matrix E, the first and second rows contain indices of the starting andending point, the third and fourth rows contain the starting and ending parametervalues, the fifth row contains the boundary segment number, and the sixth and se-venth row contain the left- and right-hand side subdomain numbers.
• In the triangle matrix T, the first three rows contain indices to the corner points, given incounter clockwise order, and the fourth row contains the subdomain number.
1.2. Zwei einfache Beispielprogramme
Im fogenden geben wir eine kurze Einführung in die Programmierung mittels MATLAB’S
PDE Toolbox. “PDE Toolbox” steht hier für die Sammlung von Funktionen, die mit demPaket “Partial Differential Equation Toolbox for use with MATLAB” der Firma COMSOL ABgeliefert werden.
In unseren Beispielen werden wir aber auch einige zusätzliche Funktionen (polygong,boundarymatrix, xi, check_Funktion,...) benutzen, die von Autor bereitgestellt werden.Diese Funktionen sind nicht in der PDE Toolbox enthalten. Eine ausführliche Beschreibungfolgt später. Insbesonders werden wir die Funktion boundarymatrix als black-box Werkzeugbenutzen.
Beispiel 3. Löse die Aufgabe
−∆u = f in Ω
u = 0 on Γ
wobei Ω⊂ R2 als L-Gebiet Ω = (1,2)2\(32 ,2)
2 und f =
1 x ∈ (1, 3
2)2
0 otherwisedefiniert seien.
Wir teilen unser Programm in vier Teile
(i) Definiere die Geometrie und das Gitter,
(ii) Definiere die Daten f und die Randbedingungen,
(iii) Löse das Problem,
10
1. Finite-Elemente-Methode in MATLAB
(iv) Gebe die Lösung grafisch aus.
Wir führen diese Schritte nun in Detail aus.
(i) Das L-Gebiet ist durch das Polygon (1,1)(2,1)(2, 32)(
32 ,
32)(
32 ,2)(1,2) gegeben. Wir be-
nutzen die Funktion polygong vgl. Abschnitt (1.1) um die Matrix g zu erzeugen.
Als nächstes wird das Gitter mit initmesh. erzeugt. pdemesh gibt das Gitter dann gra-fisch aus.
g = polygong ( [ 1 1 2 1 2 1 . 5 1 . 5 1 . 5 1 . 5 2 1 2 ] ) ;[ p , e , t ] = i n i t m e s h ( g , ’hmax ’ , 0 . 0 5 ) ;pdemesh ( p , e , t ) ;
g ist eine 7×6 Matrix:
>>g
g =
2.0000 2.0000 2.0000 2.0000 2.0000 2.0000
1.0000 2.0000 2.0000 1.5000 1.5000 1.0000
2.0000 2.0000 1.5000 1.5000 1.0000 1.0000
1.0000 1.0000 1.5000 1.5000 2.0000 2.0000
1.0000 1.5000 1.5000 2.0000 2.0000 1.0000
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000
0 0 0 0 0 0
In Zeile 2–5 identifizieren wir die Eckpunkte des L-Gebietes, die Bedeutung der Zeilen6 und 7 ist im Augebblick noch unklar. In Abschnitt 2.1 werden wir etwas Licht ins Dun-kel bringen. Trotzdem, wenn man die Struktur der Matrix kennt, lassen sich Geometrienauch “per Hand” definieren.
(ii) Wir haben die Koeffizienten c = 1, a = 0. Wegen a = 0 ist die Massematrix M die Null-matrix. Um die Dirichlet Randbedingung zu implementieren, benutzen wir die Stiff-Spring-Technik. Wir setzen q = 103 und g = 0. Weil das L-Gebiet sechs Randsegmentehat, müssen wir die beiden Spalten der boundary conditon matrix dreimal aneinan-derfügen. Der Aufruf
b = boundarymatrix('10e3','0')
liefert die ersten beiden Spalten der boundary condition matrix. Um die Quelle fzu definieren, benutzen wir die Indikatorfunktion
χA(x) :=
1 falls A0 sonst
.
Dabei ist A ein logischer Ausdruckt. Die Funktion xi gibt eine Diagonalmatrix zurück,aus der wir für unsere Zwecke die Diagonale herausnehmen müssen. 2Falls die Koeffi-
2xi ist so auch geeignet als “Filter” zu fungieren f =
f (x) in A0 sonst
lässt sich durch g(x) = χA f (x) realisieren.
11
1. Finite-Elemente-Methode in MATLAB
zienten Funktionen sind, erwartet assema die Werte im Masseschwerpunkt der Dreie-cke des Gitters. Wir benutzen the Funktion pdeintrp um die notwendige InterpolationKnoten–Schwerpunkt zu berechnen.
b = b o u n d a r y m a t r i x ( ’ 1 e3 ’ , ’ 0 ’ ) ;b = [ b b b ] ;[K, ~ , F ] = assema ( p , t , 1 , 0 , p d e i n t r p ( p , t , . . .
d i a g ( x i ( p , ’ ( x < 1 . 5 ) ’ , ’&’ , ’ ( y < 1 . 5 ) ’ ) ) ) ) ;[Q, ~ , ~ , ~ ] = assemb ( b , p , e ) ;
Die Randbedingung ist durch
>>boundarymatrix('1e3','0')
b =
1 1
0 0
3 3
1 1
49 49
101 101
51 51
48 48
gegeben.
(iii) Nach dem Matrixassemblieren lösen wir einfach mit dem Matlab “\” Operator:
u = (K+Q ) \ F ;
Hier ist u die Lösung des PDE Problems. Im logischen Ausdruck y<1.5 meint y diezweite Ortsvariable des R2. Dies ist in der Syntax der PDE Toolbox festgelegt: In denAusdrücken sind x und y für die Ortsvariablen (in kartesischen Koordinaten) und s alsBogenlängenparameter erlaubt.3
(iv) Die PDE Toolbox bietet eine Reihe von Visualisierungsfunktionen:
p d e s u r f ( p , t , u )
für einen Flachengraphen,
pdemesh ( p , e , t , u )
gibt einen Netzgraphen aus,
p d e c o n t ( p , t , u )
zeichnet die Höhenlinien von u. Für den Fluß der Lösung müssen wir den Gradientenausrechnen und anschließend mittels pdeplot ausgeben.
3s läuft dabei auf jedem Randsegment von 0 nach 1.
12
1. Finite-Elemente-Methode in MATLAB
[ g rx gry ] = pdegrad ( p , t , u ) ;g r = [ grx ; g ry ] ;p d e p l o t ( p , e , t , ’ f l o w d a t a ’ , gr , ’ f l o w s t y l e ’ , ’ a r row ’ )
Die Funktion pdeplot ist die Funktion, auf der alle Plot-Funktionen der PDE-Seriebasieren.
Das vollständige Programm ist ein Achtzeiler:
1g = polygong ( [ 1 1 2 1 2 1 . 5 1 . 5 1 . 5 1 . 5 2 1 2 ] ) ;2[ p , e , t ] = i n i t m e s h ( g , ’hmax ’ , 0 . 1 2 5 ) ;3b = b o u n d a r y m a t r i x ( ’ 1 e3 ’ , ’ 0 ’ ) ;4b = [ b b b ] ;5[K, ~ , F ] = assema ( p , t , 1 , 0 , p d e i n t r p ( p , t , d i a g ( x i ( p , ’ ( x < 1 . 5 ) ’ ,
’&’ , ’ ( y < 1 . 5 ) ’ ) ) ) ) ;6[Q, ~ , ~ , ~ ] = assemb ( b , p , e ) ;7y = (K+Q) \ F ;8p d e s u r f ( p , t , y ) ;
Abbildung 1.1.: Flächengraph von u. pdesurf mit zusätzlichem Gitter. Eingestellt mittels des“property editor” des Grafikfensters.
Beispiel 4. Wir lösen ein Poisson-Problem auf dem oberen Halb-(Einheits)-Kreis mit homoge-nen Robin-Randdaten auf dem Kreisbogen und einer Dirichlet-Quelle auf einem dem geradenRandstück.
−∆u = 0 in Ω
u = g on ΓD
~n · (c∇u)+u = 0 on ΓR
wobei Ω = x ∈ R2 |‖x‖ < 1,x2 > 0 und g := sin(πx), ΓD = (−1,1)×0. Wir definie-
ren die Randbedingung wieder als Robin Randbedingung mit q =
102 auf ΓD
1 sonstund g =
13
1. Finite-Elemente-Methode in MATLAB102 sin(x) auf ΓD
0 sonst.
Wir definieren zuerst wieder die Geometrie mittels der polygong Funktion. Die Idee ist,den Halbkreis als Polygon zu parametrisieren und dabei den Kreisbogen durch entsprechendviele Segmente (hier N) darzustellen.
Abbildung 1.2.: Gitter des durch ein Polygon approximierten Halbkreises und hmax=0.125.
Beachte, das dies nicht äquivalent zu einer Definition bestehend aus einer Kombination vonKreissegmenten und Geraden wie im Beispiel 2 ist. Das Polygon bleibt auch nach dem Verfei-nern ein Polygon mit zum Beispiel 100 Segmenten, während bei einem aus Kreissegmentenzusammen gesetzten Geometrie-Objekt der Rand bei der Verfeinerung sich der Kreiskurveannähert
.
Wir setzen N = 100 und parametrisieren den Bogen durch (cos(s),sin(s)), s = [0,π]. DieKurve ist gegen den Uhrzeigersinn orientiert, was wichtig für die Kennung “innen”–”außen”innerhalb der Funktion polygong ist. Durch diese Definition wird schon der Halbkreis be-stimmt, da polygong die Kurve automatisch schließt. Das Gitter wird wieder durch initmesherzeugt. Wir wählen hmax gleich 0.125.
n = 100 ;g = polygong ( cos ( l i n s p a c e ( 0 , pi , n ) ) , s i n ( l i n s p a c e ( 0 , pi , n ) ) ) ;[ p , e , t ] = i n i t m e s h ( g , ’hmax ’ , 0 . 1 2 5 ) ;
Die boundary condition matrix besitzt hier eine relativ komplizierte Struktur: Wir ha-ben eine Dirichlet Randbedingung auf dem Basissegment des Halbkreises. Auf den restlichenn−1 Segmenten gilt die Robin-Randbedingung. Wir haben dort q = 1, g = 0. Damit rufen wirboundarymatrix auf:
bR = boundarymatrix('1','0');
ergibt eine 6×2 Matrix. Als nächstes definieren wir die Dirichlet Randbedingung durch
bD = boundarymatrix('1e2','1e2*sin(pi*s)');
14
1. Finite-Elemente-Methode in MATLAB
wir erhalten eine 20×2 Matrix. Für die Matrix b benötigen wir 99 mal eine Spalte der MatrixbD und eine Spalte von bN. Da diese aber unterschiedlicher Dimension sind, müssen wir diesedurch Indexierung setzen. Im folgenden Listing wird diese Prozedur beschrieben.
bR = b o u n d a r y m a t r i x ( ’ 1 ’ , ’ 0 ’ ) ;bD = b o u n d a r y m a t r i x ( ’ 1 e2 ’ , ’ 1 e2 * s i n ( p i * s ) ’ ) ;b ( 1 : l e n g t h ( bR ) , 1 : n−1) = bR ( : , 1 ) * ones ( 1 , n−1);b ( 1 : l e n g t h ( bD ) , n ) = bD ( : , 1 ) ;
Die Assemblierung des linearen Systems ist wieder Standard. Da wir im Gebiet keine Quellehaben, fallen F und M (wegen f = 0 und a= 0) weg. Dafür haben wir ein nichtverschwindendesG. Da wir die Dirichlet Randbedingung durch Robin-Randbedingung approximiert haben, sindauch H und R identisch null. Durch die Tilde in der Argumentliste werden die entsprechendenVariablen nicht in den Speicher geladen.4
[K, ~ , ~ ] = assema ( p , t , 1 , 0 , 0 ) ;[Q, G, ~ , ~ ] = assemb ( b , p , e ) ;u = (K+Q ) \ G;
In vielen Fällen ist neben der Lösung auch der Fluß dieser von Interesse: Dazu müssen wirden (Anti-)Gradienten berechenen. Das Resultat ist in Abbildung 1.3 zu sehen.
[ g rx gry ] = pdegrad ( p , t , y ) ;g r = −[ g rx ; g ry ] ;p d e p l o t ( p , e , t , ’ f l o w d a t a ’ , gr , ’ f l o w s t y l e ’ , ’ a r row ’ )
Das komplette Programm besteht aus 14 Zeilen:
1n = 100 ;2g = polygong ( cos ( l i n s p a c e ( 0 , pi , n ) ) , s i n ( l i n s p a c e ( 0 , pi , n ) ) ) ;3[ p , e , t ] = i n i t m e s h ( g , ’hmax ’ , 0 . 1 2 5 ) ;4pdemesh ( p , e , t ) ; pause ;5bR = b o u n d a r y m a t r i x ( ’ 1 ’ , ’ 0 ’ ) ;6bD = b o u n d a r y m a t r i x ( ’ 1 e2 ’ , ’ 1 e2 * s i n ( p i * s ) ’ ) ;7b ( 1 : l e n g t h ( bR ) , 1 : n−1) = bR ( : , 1 ) * ones ( 1 , n−1) ;8b ( 1 : l e n g t h ( bD ) , n ) = bD ( : , 1 ) ;9[K, ~ , ~ ] = assema ( p , t , 1 , 0 , 0 ) ;10[Q, G, ~ , ~ ] = assemb ( b , p , e ) ;11y = (K+Q) \G;12[ grx gry ] = pdegrad ( p , t , y ) ;13g r = −[ g rx ; g ry ] ;14p d e p l o t ( p , e , t , ’ f l o w d a t a ’ , gr , ’ f l o w s t y l e ’ , ’ a r row ’ )
4Wir sparen aber kaum Speicherplatz, da M,F,H und R sowieso “sparse zero”-Matrizen sind.
15
1. Finite-Elemente-Methode in MATLAB
Abbildung 1.3.: Fluß mit pdeplot und grid on. erzeugt.
1.3. Die PDE Toolbox erweitern
Bis hier her haben wir die Nutzerschnittstelle der PDE Toolbox etwas verbessert. Wir werdennun die PDE Toolbox in ihrer Funktionalität erweitern. Dies wird in vier Richtungen gesche-hen:
(i) Konvektions-Terme,
(ii) Finite Elemente für eindimensionale Ortsgebiete,
(iii) Finite Elemente höherer Ordnung,
(iv) Finite Elemente auf Rechteckgitter.
Mit der PDE Toolbox lassen sich keine PDEs der Form
−∇(c∇u)+ k ·∇u+au = f in Ω
~n(c∇u)+qu = g auf Γ
lösen. Die Erweiterung auf solche Konvektions-Diffusions-Gleichungen ist aber relativ leichtzu realisieren. Wir müssen lediglich eine Assemblierung für das Integral
ˆΩ
k ·∇uvdx
implementieren.5 Dies ist in der Funktionen convection realisiert. Der Programmkern findetsich zum Beispiel in [?] und benutzt wesendlich die PDE Toolbox Funktion pdetrg. Der Ko-effizientenvektor b kann aber variabler definiert werden, so dass die interne Berechnung desKoeffizienten (feldes) b in der hier besprochenen Version etwas komplexer ist. Mit der Funkti-on convection2Dhigher, convectionq und convection1d haben wir weitere Funktionen,die die Punkte (ii), (iii) und (iv) mit Punkt (i) kombinieren. Die Berechnung der Matrizen ist
5Wobei wichtige Fragen wie die nach der (eindeutigen) Lösbarkeit solcher Probleme und der numerischenStabilität der Diskretisierung erstmal nicht geklärt sind.
16
1. Finite-Elemente-Methode in MATLAB
dort völlig anders als in convection implementiert. Wir gehen hierbei wie in [?] vor, wo-bei die Berechnung der Matrizen auf Rechteckgitter mit einem kleinen Trick auf den Fall derBerechnung der Matrizen auf Dreieicksgitter transformiert wurde.
Die Erweiterung der PDE Toolbox auf räumlich eindimensionale Probleme ist ebenfallseine leichte Anwendung des Grundkurses “Numerische Mathematik”. Wichtig ist nur, dass dieSchnittstellen der Funktionen zur Syntax der PDE Toolbox passen. Es werden “1d”-Versionender Kernfunktionen der PDE Toolbox zur Verfügung gestellt:initmesh1d, refinemesh1d, assema1d und assemb1d.Da die Geometrie von eindimensionalen PDE Problemen immer ein reelles Intervall I =
(x1,x2) ist, ist g = [x1 x2] als Geometriedefinition ausreichend. Die Funktionen assema1d
ist aber in der Lage, die Matrizen K und M sowie den Vektor F bezüglich der Basen von Finiten-Elementen höherer Ordnung zu berechnen. Dazu wird eine globale Variable element_type
benötigt, die die Auswahl der Basis steuert. Es sind Lagrange-Elemente der Ordnung 1–3 undein Hermite-Element dritter Ordnung implementiert. Der Code ist wieder an die Darstellungin [?] angelehnt.
Die Erweiterung auf Finite-Elemente höherer Ordnung für die Ortsdimension 2 ist etwaskomplexer. Für Lagrange-Elemente zweiter Ordnung benötigt man beispielsweise Stützstel-len auf den Kanten der Dreiecke sowie zusätzliche Gitterinformationen. Diese werden durchdie Hilfsfunktion meshextend2Dhigher berechnet. Die Funktionen, die die MATLAB PDE-Toolbox um Finite Elemente höherer Ordnung in 2D erweitern, werden mit xxx2Dhigher be-nannt. Im einzelnen sind dies assema2Dhigher, assemb2Dhigher, convection2Dhigherund meshextend2Dhigher.
Die Erweiterung der PDE Toolbox um Gitter, deren Elemente Vierecke sind, macht prak-tisch eine Neuimplementierung der gesamten Funktionalität der PDE-Toolbox notwendig. Wirbenötigen einen Gittergenerator, neue Assemblierungsfunktionen und ebenso neue Grafik- undHilfsfunktionen. Diese Funktionen sind mit xxxqxxx benannt. Es wurden zwei Gittergenerato-ren implementiert. Die Funktion initqmesh ist nur für die Diskretisierung von Rechteckgeo-metrien geeignet. Dies ist aber nützlich, wenn man Raum-Zeit-Gitter für parabolische Proble-me benötigt oder eben nur auf einem Rechteck rechnen will. Für die Diskretisierung beliebigerGebiete ist die Funktion initmeshqelgen vorgesehen. Dies ist ein elliptischer Gittergenera-tor. Der Algorithmus basiert auf einer Transformation des Gebietes Ω auf das Einheitquadrat.Daraus ergeben sich einige Einschränkungen: So gibt es Probleme mit unzulässigen/entartetenViereckselementen bei nichtkonvexen Gebieten.
1
2
3
4
1
2
3
4
Abbildung 1.4.: Entartetes Viereck-Element. Das Problem tritt nach einer uniformen Verfei-nerung auf: Drei linear abhängige Knoten.
17
1. Finite-Elemente-Methode in MATLAB
Die Funktion refineqmesh verfeinert Viereckgitter uniform, wobei die Mittelpunkte ge-genüberliegender Kanten verbunden werden.
1
2
3
4
2
3
4
68
9
7
1
5
Abbildung 1.5.: Viereck mit Z-förmiger Nummerierung der Knoten. Rechts nachVerfeinerung.
Die Vierecksgitter werden analog zur p-e-t Kodierung für Dreiecksgitter aus der PDE-Toolbox in den Feldern p,e,q gespeichert.
Der Kern der Implementierung der Funktion initqmeshelgen stammt von Alexander Ka-bat vel Job, Student am Institut für Strömungsmechanik und Technische Akustik der Techni-schen Universität Berlin.
Die Assemblierung der Matrizen und Vektoren ist im Prinzip Standard. Zur Zeit sind nurLagrange-Elemente erster Ordnung – auf Viereckgittern sind dies bilineare (Hütchen-) Funk-tionen, oder auch unvollständige quadratische Polynome auf R2 – implementiert. Dies wird inassemqa und convectionq realisiert. Da auf den Randkanten von Vierecksgittern die (bili-nearen) Basisfunktionen ebenfalls linear sind, können die assembxxx Funktionen benutzt wer-den. Allerdings sind diese von der PDE Toolbox abhängig. Deshalb wurde assemb2Dhigherum die Abhängigkeiten (und die “higher” Funktionalität) erleichtert und zu assemqb neube-nannt.
Die grafische Ausgabe in pdeqmesh und pdeqsurf stützt sich nur auf Standard-MATLAB
Funktionen. Eine Hilfsfunktion ist pdeqintrp, welche Daten von den Knoten auf die Vier-ecksmittelpunkte durch simple Mittelung projeziert.
18
2
Kapitel 2.
Funktionen auf einen Blick
2.1. Geometrie Denition.
Wir empfehlen die Funktion polygong. Es ist etwas schwierig, eine geometry definiton
matrix “per Hand” korrekt einzugeben. Für komplexe Geometrien kann auch das GUI pdetoolbenutzt werden. Die Definition wird im “draw modus” vorgenommen, anschließend müssendie Matrizen b und g exportiert1 werden. Eine gute Idee ist es, diese Matrizen zu speichern undals Ausgabe zweier Funktionen zu implementieren, siehe dazu z.B. die Funktion unitsquare
im Ordner friends.
2.2. Gitter-Generierung.
initmesh(g[,'hmax',hmax]) generiert Dreieicksgitter für zweidimensionale Ortsgebieteund Intervallteilungen für eindimensionale Ortsgebiete. g ist eine geometry desription
matrix, hmax eine reelle Zahl oder inf. initqmesh und initqmeshelgen sind die entspre-chenden Funktionen für Viereckgitter. x,y sind reelle Vektoren, left/right und upper/lowersind Matrizen, die die Parametrisierung der jeweiligen Randstücke enthalten, die von jeweilsgleicher Länge sein müssen. x(s)/y(s) sind symbolisch (als String) gegebene Parametrisie-rungen der Randkurve des Gebietes Ω, sa/se sind Anfangs und Endwert der Parametrisierung.
Syntax:
[p,e,t] = initmesh(g)
[p,e,t] = initmesh(g,'hmax',hmax)
[p,e,t] = refinemesh(g,p,e,t)
[p,e,q] = initqmesh(x,y)
[p,e,q] = initqmeshelgen(left,right,upper,lower)
[p,e,q] = initqmeshelgen(x(s),y(s),[sa,se])
[p,e,q] = refineqmesh(p,e,t)
1Wobei dann schon die boundary conditon matrix mit erstellt ist.
19
2. Funktionen auf einen Blick
Beispiele
[p,e,t] = initmesh(0,1)
[p,e,t] = initmesh([0,1,pi])
[p,e,t] = initmesh([0,1,pi],'hmax',0.1)
[p,e,t] = initmesh(polygong([0 1 1 0],[0 0 1 1]))
[p,e,t] = refinemesh([0,1,pi],p,e,t)
[p,e,t] = initqmesh(linspace(0,1,12),linspace(0,4,48));
B1 = [-cos(linspace(0,pi/3,12));sin(linspace(0,pi/3,12))];
B2 = [-cos(linspace(pi,2*pi/3,12));sin(linspace(pi,2*pi/3,12))];
B3 = [-cos(linspace(pi/3,2*pi/3,10));sin(linspace(pi/3,2*pi/3,10))];
B4 = [linspace(-1,1,10);zeros(1,10)];
[p,e,q] = initqmeshelgen(B1,B2,B3,B4);
[p,e,q] = initqmeshelgen('sin(s)','cos(s)',2*pi*linspace(0,1,10));
Point-Edges-Triangles: Wie Gitter in der PDE-Toolbox gespeichert werden Wirzitieren das PDE-Toolbox Handbuch:
The outputs P, E, and T are the mesh data.In the point matrix P, the first and second rows contain x- and y-coordinates of
the points in the mesh.In the edge matrix E, the first and second rows contain indices of the starting
and ending point, the third and fourth rows contain the starting and endingparameter values, the fifth row contains the boundary segment number, and thesixth and seventh row contain the left- and right-hand side subdomain numbers.
In the triangle matrix T, the first three rows contain indices to the corner points,given in counter clockwise order, and the fourth row contains the subdomain num-ber.
Dies gilt natürlich auch angepasst für die Dimensionen eins und drei (und auch Dimension n)
P Nichts wesentliches ändert sich. Die Anzahl der Zeilen ist
eins für 1D,
E Die Zeilen 1...N sind die Indizes der Ränder der Randelemente. In 1D ergibt daskeinen Sinn, in 2D sind das die äuKanten
2.3. Randbedingungen
Wir empfehlen die Definition der boundary condition matrixmittels der Funktion boundarymatrixoder mit Hilfe des GUI pdetool und anschließendem Export der Matrizen b und g, aber nichtdie direkte Definition mittels einer Variable.
20
2. Funktionen auf einen Blick
Syntax
b = boundarymatrix()
b = boundarymatrix(g)
b = boundarymatrix(q,g)
b = boundarymatrix([],[],h,r)
b = boundarymatrix(first_segment,second_segment,[nt-h_segment,...])
Beispiele
b = boundarymatrix()
b = boundarymatrix('1')
b = boundarymatrix('1','sin(s)')
b = boundarymatrix([],[],'1','0')
b = boundarymatrix('[],[],'cos(s)','sin(s)')
b = boundarymatrix('1','0',[],[],[],[],'1','0')
2.4. Matrix assembling.
Die Koeffizienten können in einer reichen Auswahl von Formaten gegeben werden: doubles,strings, funktion_handles.
Wir bevorzugen die Definition als Strings wie zum Beispiel '1e3', 'sin(x)+cos(y)',usw. Die Funktionen assemxxx und convectionxxx erledigen die korrekte Berechnung au-tomatisch.
Syntax
[K,M,F] = assema(p,t,c,a,f)
[K,M,F] = assema(p,t,c,a,f)
[Q,G,R,H] = assemb(b,p,e)
C = convection(p,t,k)
[Q,G,R,H] = assemb2Dhigher(b,p,e)
[Q,G,R,H] = assemb2Dhigher(b,p,e,t,g)
C = convection2Dhigher(p,e,t,k)
C = convection2Dhigher(p,e,t,k,g)
[K,M,F] = assemqa(p,t,c,a,f)
[Q,G,R,H] = assemqb(g,p,e)
C = convectionq(p,t,k)
Beispiele
21
2. Funktionen auf einen Blick
[K,~,F] = assema(p,t,'1','0','10')
[K,M,F] = assema(p,t,1,1,'sin(x+y)')
C = convection(p,t,[1 1])
C = convection(p,t,'0' 'sin(x))
C = convection2Dhigher(p,e,t,'0' 'sin(x))
C = convectionq(p,e,t,k,[1 1])
[K,M,F] = assemqa(p,t,[1 'exp(x+y)'],0,10)
C = convectionq(p,t,'1' 'sin(x)')
2.5. Grasche Ausgabe
pdemesh(p,e,t)
pdeqmesh(p,e,t)
pdemesh(p,e,t,u)
pdeqmesh(p,e,t,u)
pdesurf(p,t,y)
pdeqsurf(p,t,y)
Beispiele dazu im nächsten Kapitel.
2.6. Helferfunktionen
Das Überprüfen der Integrität von Daten ist eine wichtige Aufgabe. Gerade in “lax” definiertenSprachen wie MATLAB treten häufig Laufzeitfehler auf, die durch mangelnde Integrität derDaten verursacht wird. Der Dimensionsfehler in
A = ones(3,2);
b = [1 pi 4];
A = A*b;
tritt erst zur Laufzeit zu Tage. Dieses Problem tritt auch auf, wenn man mit den MATLAB
ODE-Löser arbeitet: In der Lösung [time,u] = ode15s(...) werden die Zeitschichten alsZeilenvektoren aufeinander gelegt. Bei der direkten Implementierung
u(:,k) = (Md+tau(k-1)*K)\...
(Md*u(:,k-1)-tau(k-1)*Md*u(:,k-1).^3);
ist es natürlich, u als Spaltenvektor zu interpretieren. Um den Programmierer etwas zu entlas-ten, wurde die Funktion check_function implementiert. Sie kombiniert die Funktionalitätvon eval und feval mit einer Überprüfung der Daten. So ist garantiert, dass nach dem Auf-ruf
22
2. Funktionen auf einen Blick
u = check_function(fun_u,x,t)
der (Spalten-)Vektor u die zu den Argumenten passende Dimension hat.
Syntax
[y] = check_function(f,varargin)
Beispiele
y = check_function('sin(x)',pi/2)
x= linspace(0,1,10);
y = check_function('sin(x)',x);
y = check_function(@eta_6,0.3,0.5)
f = inline('x*y')
y = check_function(f,0.3,0.5)
Eine Indikator-Funktion χA(x) :=
1 falls A0 sonst
ist ebenfalls ein nützlicher Helfer.
Syntax
X = xi(p,expression[,'and'|'or',expression])
X ist eine Diagonalmatrix.
Beispiel
x= linspace(0,1,10);
X = xi(x,'x<0.3','and','x>0.1')
[p,e,t] = initmesh(g);
X = xi(p,'(x>0.3)&(x<.4)&(y>0.45)&(y<.55)')*ones(size(p(1,:)))';
f = X*check_function(@eta_6,p)
23
3
Kapitel 3.
Objektorientierter Ansatz
Die bis hierher vorgestellte Programmierung ist im Wesentlichen eine Erweiterung der PDEToolbox in herkömlicher matlab-typischer Programmierung. Ein auch für Matlab in letzterZeit modern gewordener Ansatz ist die objektorientierte Programmierung.
Nun heißt das nicht, dass wir die Funktionen einfach nur zu Methoden von Klassen um-schreiben – tatsächlich hätten wir damit nicht viel gewonnen, sondern wir werden konzeptio-nell unsere Finite Elemente Tool-Box umorganisieren.
3.1. Konzept: Abstraktion und Vererbung
Wenn man sich den Code der Matrixassemblierung (assema2Dhigher, etc.) anschaut, so istdort im wesentlichen für alle Typen von finiten Elementen und Raumdimensionen der gleicheAlgorithmus implementiert.
Beispiel 5. Berechnung der KonvektionsmatrixWir betrachten das Einheitsdreieck und berechnen vorab die lokalen Matrizen B1 und B2,
anschließend werten wir das Vektorfeld~b an den Schwerpunkten der Dreiecke aus und durch-laufen dann in einer Schleife alle Dreiecke wobei wir die lokalen Koordinaten bestimmensowie die Anteile in x- und y- Richtung des Feldes~b und anschließend die Matrix B in denrichtigen Indizes auf datieren.1
Wenn wir den Code für die linearen mit dem der quadratischen Elemente vergleichen, sofallt auf, dass sich dieser nur in der Form der Matrizen und dem Indexvektor unterscheidet.
Die Idee ist nun, dieses formale Vorgehen in einer abstrakten Klasse (oder einem Klassen-system) zu implementieren und dann davon die konkreten finiten Elemente abzuleiten.
Hier taucht ein kleines Problem auf: So formal der Algorithmus in Bsp. 5 aus ist, im Detailist der Unterschied zwischen 1D und 2D finiten Elementen gravierend. In 1D haben wir esimmer mit jeweils einer Elementmatrix zu tun, in 2D mit dreien im Falle der Steifigkeitsma-trix, mit zwei Elementarmatrizen im Falle der Konvektionsmatrix und mit einer im Falle derMassenmatrix.
Trotzdem werden wir das abstrakt formulieren und erhalten in etwa diese Klassenhierarchie:1Wir werden dass aber nicht so naiv programmieren!
24
3. Objektorientierter Ansatz
Die Klasse finiteElements ist abstrakt und hat als Eigenschaften allgemeine Fehlerobjektedefiniert.
In finiteElements werde aber schon die Methoden assema und convection implementiert.Diese Methoden benutzen abstrakte Methoden, die erst in abgeleiteten Klassen implementiertwerden.
Von finiteElements sind die Klassen finiteElements1D, finiteElements2D und finiteEle-ments3D (nicht im Bild gezeigt) abgeleitet. Dort werden die Methoden implementiert, dievon der Dimension des Raumes abhängen. Beispiele sind createMatrixEntries für die As-semblierung der Matrizen, die z.B. für die Steifigkeitsmatrix eine bis sechs Elementmatrizensummieren muss.
Interessant mag die Tatsache sein, dass finiteElements1D keine Eigenschaften definiert. DieKlasse dient tatsächlich nur zum implementieren von vormals abstrakten Methoden und Me-thoden für abgeleitete Klassen wie lagrange11D.
Der Trick mit den unbestimmten Eigenschaften. Hier wird man sich fragen, warumdie Eigenschaften S, M, C usw., die in lagrange11D definiert werden, nicht schon vorher alsabstrakte Eigenschaften Aufgetaucht sind?
(i) Es ist ja nicht klar, wie viele (und welche) dieser Matrizen(?) wir benötigen.
(ii) Sogar die Gestalt von S, M, C, usw. ist nicht klar.
Für lineare Ansatzfunktionen (Lagrange-Elemente erster Ordnung in 1D, daher lagrange11D)ist z.B. S eine konstante 2× 2-Matrix, die die Koeffizienten der Ansatzfunktionen über demEinheitsintervall darstellen. Die Koeffizientenfunktion c kann dann als stückweise konstant(über jedem Teilintervall) angenommen werden (Treppenfunktion). Für diese kann dann unterErhalt der Fehlerordnung einfach integriert werden, indem der lokal konstante Wert von c vordas Integral gezogen wird.
Für Elemente höherer Ordnung benötigt man aber eine “exaktere” Integration. Dann wirdS keine Eigenschaft der Klasse mehr sein, sondern eine (parameterlose) Methode, die diekorrekten Werte für alle Intervalle(Dreiecken, Tetraeder, usw.) als Matrix liefert. Der folgendeCode bleibt gültig, wenn nur die Dimensionen von S, J1 usw. stimmen.
[ cva l , ava l , f v a l ] = o b j . a C o e f f i c i e n t s ( g r idObj , cf , af , f f ) ;[ J , J1 ] = o b j . makeJ ( g r idObj , c v a l ) ;K = r e s h a p e ( o b j . S* J1 , 1 , n t * s i z e M a t r i x ) ;
Für lagrange11D ist
o b j . S* J1
ein dyadisches Produkt, das Ergebnis eine Matrix der Dimension 4× nelments. Für höhereElemente ist S dann die aus der lokalen Integration stammende Matrix, J1 einfach ein Eins-vector und die Werte für cval, aval, usw. werden in S eingearbeitet. In finiteElements1D istmakeJ abstrakt und damit in den Subklassen zu überschreiben. S benötigt hier Informationenzum Gitter. Das kann erreicht werden, wenn die Klasse dann ein von gridd abgeleitetes Objektals Eigenschaft erhält.
25
3. Objektorientierter Ansatz
3.2. Klasse gridd2
Sinnvollerweise setzen wir das Konzept der Objektorientierung auch für die Gitter- und Geo-metriedaten durch. Die Klasse ist von handle abgeleitet, weswegen sie eine copy-Methodebenötigt.
Wir schlagen die Funktionalität “Koeffizeintenauswerten” der Klasse gridd zu, bzw. dendavon abgeleiteten Klassen. Außerdem sind die Randbedingungen Eigenschaften des Gitters.
3.3. Die Klasse grid2D
Die Eigenschaften sind die Daten für Gitterpunkte, Eckknotenkoordinaten e und Dreieckskno-tenkoordinaten t sowie die boundary-condition-matrix b und die geometry matrix g, alles wiein Kapitel 1.1 beschrieben.
Wir haben die Methoden
grid2D Konstruktor
copy Erstellt eine harte Kopie des Objekts
delete Löscht das Objekt
isvalid Prüft, ob das Objekt gültig ist
disp disp-Methode
plot plot-Methode
triangleDiameters Gibt den Durchmesser der Dreiecke zurück.
tripts2midpts Gibt die Mittelpunkte jeden Dreiecks zurück.
isBoundary Gibt einen Bool-Vektor zurück, der “true” enthält, wenn das Dreieck ein Rand-stück enthält.
refinemesh Uniforme Verfeinerung des Gitters
polygong Statische Methode zur Erstellung von polygon-berandeten Geometrien
unitsquare Statische Methode zur Erstellung einer Rechteckgeometrie
squareMidpt Statische Methode zur Erstellung einer Rechteckgeometrie, wobei der Mittel-punkt des Rechtecks als Parameter gegeben ist.
2Wir müssen die Klassen von der Eigenschaft grid der Figureklasse unterscheiden, deshalb die seltsame Schrei-bung.
26
3. Objektorientierter Ansatz
inverseSquareMidpt Statische Methode zur Erstellung einer Rechteckgeometrie, wobei derRand nach “innen” orientiert ist. Diese Methode kann nur sinnvoll in Kombinationmit polygong, unitsquare, squareMidpt genutzt werden, um in Gebiete “Löcher”zu schneiden.
unitcircle Statische Methode zur Erstellung eines Einheitskreisgebietes.
Das folgende Skript demonstriert die Benutzung von grid2D
c l e a r a l lg r = gr id2D ( ) ;g r . u n i t s q u a r e ( ) ;
g r . r e f i n e m e s h ( )% gr . r e f i n e m e s h ( )f i g u r e ( 1 )g r . p l o t ;ho ld onmpts = gr . m idp t s ;p l o t ( mpts ( 1 , : ) , mpts ( 2 , : ) , ’ k+ ’ )
g r . u n i t c i r c l e ( )f i g u r e ( 2 )g r . p l o t ; ho ld onmpts = gr . m idp t s ;p l o t ( mpts ( 1 , : ) , mpts ( 2 , : ) , ’ k+ ’ )
g r . t r i a n g l e ( 0 . 3 )f i g u r e ( 3 )g r . p l o t ;ho ld onmpts = gr . m idp t s ;p l o t ( mpts ( 1 , : ) , mpts ( 2 , : ) , ’ k+ ’ )
Das folgende Skript initialisiert eine “2D Tragfläche”.
s = l i n s p a c e ( 0 , 1 , 2 5 ) ;g f = gr . po lygong (−0.8* cos (2* p i * s ) , . . .
0 .2*(1−0 .75* s ) . ^ 2 . * s i n (2* p i * s ) ) ;g0 = gr . po lygong ([−1 2 2 −1] ,[− .5 −.5 . 5 . 5 ] ) ;g = [ g0 , g f ] ;g r . i n i t m e s h ( g , 0 . 0 5 ) ;g r . p l o t ;
sowie der Plot in Fig. 3.3
27
3. Objektorientierter Ansatz
finiteElements
+wrongNumberInputs: MException
+wrongNumberOutputs: MException
+wrongFormat: MException
+wrongClass: MException
+wrongSize: MException
+idx: double
+
+assema(gr:gridd,c,a,f): double
+convection(gr:grid,b): double
+assemb(gr:gridd)
+createMatrixEntries(gr:gridd,c,a,f): double
+createConvectionEntries(gr:gridd,b): double
+makeIndex(idx:double,nElem:double): double
finiteElements1D
+assemb(bd:double,gr:gridd): double
+createMatrixEntries(gr:gridd,c,a,f): double
+createConvectionEntries(gr:gridd,b:double): double
+aCoefficients(gr:gridd,c,a,f): double
+convCoefficients(gr:gridd,b:double): double
+makeJ(gr:gridd,c:double): double
handle
lagrange11D
+S: double
+M: double
+C: double
+F: double
+idx: double = 1:2
+assembleStep: double = 1
+makeIndex(idx:double,np:double): double
+makeJ(gr:gridd,c:double): double
gridd
Abbildung 3.1.: Klassenhierarchie Finite Elemente, 1D Zweig.
28
3. Objektorientierter Ansatz
gridd
+b: double
-g: double
-p: doubel
-e: double
-t: double
+wrongNumberInputs: MException
+wrongFormat: MException
+wrongClass: MException
+wrongNumberPoints: MException
+privateProp: MException
+noIndexing: MException
+disp()
+nElements(): double
+nPoints(): double
+nEdges(): double
+nBoundarySegments(): double
+acoefficients(): double
+bcoefficients(): double
+ccoefficients(): double
+makeBoundaryMatrix(): gridd
+robinBC(): double
+dirichletBC(): double
+boundaryCondition(): double
handle
grid1d
+grid1d(): grid1d
+diam(): double
+isBoundary(): logical
+refinemesh(): grid1d
+midpts(): double
+plot()
+copy(): grid1d
+initmesh(): grid1d
+acoefficients(): double
+convCoefficients(): double
-neighbours(): double
Abbildung 3.2.: UML Klasse gridd, grid1d
29
3. Objektorientierter Ansatz
0 0.2 0.4 0.6 0.8 10
0.2
0.4
0.6
0.8
1
Abbildung 3.3.: Gitter produziert mit dem obigen Skript.
30
4
Kapitel 4.
FEM in 3D
Wir beschreiben im folgenden die Implementierung der finiten Elemente Methode für dreiOrtsdimensionen. Wir gehen vom objektorientierten Programmansatz aus, die Codes lassensich aber natürlich auch “klassisch” implementieren.
4.1. 3D-Gitter
Die Spezifikation für die Klassen, die 3D Gitter repräsentieren, sind analog zum 2D Fall. Wirbenötigen Informationen über
(i) die Knoten des Gitters
(ii) welche Knoten zu den Elementen gehören. Darin verbirgt sich ebenfalls der Typ desElements.
(iii) welche Knoten zu Randelementen gehören. Diese können dann wieder als passendeElemente der Dimension zwei interpretiert werden.
(iv) Information über die Orientierung der Randflächen (“Wo ist Außen?”)
(v) Information über Teilmengen des Gebietes.
Wir benutzen wieder die p-e-t-Struktur aus der PDE-Toolbox.
p ist nun eine 3×nPts-Matrix, die die x-,y- und z-Koordinaten der Gitterpukte ent-hält.
t ist eine nEPts+1×nElmts-Matrix, die die Indizes der Eckknoten jedes Elementsenthält und in der Zeile nEPts+ 1 steht die Nummer der Teilmenge zu der dasElement gehört. Ist das Gebiet nicht in Teilmengen unterteilt, ist die Nummergleich eins.
31
4. FEM in 3D
e ist eine Matrix, deren erste drei (Tetraeder) oder vier (Prismenelemente) Zei-len die Indizes der Anfangs und Endpunkte des Randgebietes des jeweiligenElements enthalten. Bei Gittern, die aus Prismenelementen bestehen, stehen beiRanddreiecken in der vierten Zeile Nullen. In Zeile fünf steht die Nummer desRandsegments.
4.2. Assemblierung der Matrizen
4.2.1. Mathematischer Ansatz
4.2.1.1. Aufgabe im Gebiet Ω
Wir betrachten die Aufgabe
−∇ · (C∇u)+~b∇u+au = f in Ω
~n · (C∇u)+qu = g auf ∂Ω
mit C ∈ L∞(Ω). Die Aufgabe ist nun, die Integrale˚
Gi
(c1u2x + c2u2
y + c3u2z )dxdydz
˚
Gi
(b1uxu+b2uyu+b3uzu)dxdydz
˚
Gi
au2dxdydz
˚
Gi
f u dxdydz
für i = 1, ...,nElmts zu berechnen. Wir transformieren wieder auf das Einheitselement (Te-traeder oder Prisma). Die Transformation ist für vier-punkte Tetraeder und parallele Sechs-Punkte Prismen gleich, vergleiche die Situation in 2D.
x = x1 +(x2− x1)ξ +(x3− x1)η +(x4− x1)ζ
y = z1 +(y2− y1)ξ +(y3− y1)η +(y4− y1)ζ
z = z1 +(z2− z1)ξ +(z3− z1)η +(z4− z1)ζ .
Die Jacobi-Determinante ist
32
4. FEM in 3D
z
yη
ζ
(0,0,0) (1,0,0)
(0,1,0)
(0,0,1)
p1
p2
p3
p4
xξ
Abbildung 4.1.: Transformation eines Tetraeders auf das Einheitstetraeder.
z
η
ζ
(0,0,0) (1,0,0)x
ξ
p1p2
p3
p4 p5
y
p6
(0,1,1)
(1,0,1)
(0,1,0)
(0,0,1)
Abbildung 4.2.: Transformation eines parallelen Prisma auf das Einheitsprisma.
J =
∣∣∣∣∣∣(x2− x1) (y2− y1) (z2− z1)(x3− x1) (y3− y1) (z3− z1)(x4− z1) (y4− y1) (z4− z1)
∣∣∣∣∣∣und das Volumenelement im Integral wird mit
dxdydz = J dξ dηdζ
transformiert. Die Ableitungen in den Integralen sind mit der Kettenregel
ux = uξ ξx +uηηx +uζ ζx
uy = uξ ξy +uηηy +uζ ζy
uz = uξ ξz +uηηz +uζ ζz
zu transformieren. Nach Differentiation der Transformation nach x, y bzw. z ergibt sich
1 = (x2− x1)ξx +(x3− x1)ηx +(x4− x1)ζx
0 = (y2− y1)ξx +(y3− y1)ηx +(y4− y1)ζx
0 = (z2− z1)ξx +(z3− z1)ηx +(z4− z1)ζx
und
0 = (x2− x1)ξy +(x3− x1)ηy +(x4− x1)ζy
1 = (y2− y1)ξy +(y3− y1)ηy +(y4− y1)ζy
0 = (z2− z1)ξy +(z3− z1)ηy +(z4− z1)ζ
33
4. FEM in 3D
sowie
0 = (x2− x1)ξz +(x3− x1)ηz +(x4− x1)ζz
0 = (y2− y1)ξz +(y3− y1)ηz +(y4− y1)ζz
1 = (z2− z1)ξz +(z3− z1)ηz +(z4− z1)ζz
Es folgt ξx ξy ξzηx ηy ηzζx ζy ζz
=
(x2− x1) (x3− x1) (x4− x1)(y2− y1) (y3− y1) (y4− y1)(z2− z1) (z3− z1) (z4− z1)
−1
= DFinv
Mit Hilfe der Formel
A−1 =
a b cd e fg h i
−1
=1
det(A)
ei− f h ch−bi b f − cef g−di ai− cg cd−a fdh− eg bg−ah ae−bd
kann man die Ableitungen direkt hinschreiben, wir benutzen später im Code die DarstellungDFinv(:, i).
Die Integrale sind nun darstellbar als
˚
Gi
(c1u2x + cu2
2y + c3u2z )dxdydz =
˚
G0
c1(uξ ξx +uηηx +uζ ζx)2 + c2(uξ ξy +uηηy +uζ ζy)
2 + ...
c3(uξ ξz +uηηz +uζ ζz)2J dξ dηdζ =
J1
˚
G0
u2ξ
dξ dηdζ + J2
˚
G0
u2ηdξ dηdζ + J3
˚
G0
u2ζ
dξ dηdζ + ...
2J4
˚
G0
uξ uηdξ dηdζ +2J5
˚
G0
uξ uζ dξ dηdζ +2J6
˚
G0
uηuζ dξ dηdζ
34
4. FEM in 3D
wobei
J1 = J ·
⟨ ξxξyξz
,C
ξxξyξz
⟩
J2 = J ·
⟨ ηxηyηz
,C
ηxηyηz
⟩
J3 = J ·
⟨ ζxζyζz
,C
ζxζyζz
⟩
J4 = J ·
⟨ ξxξyξz
,C
ηxηyηz
⟩
J5 = J ·
⟨ ξxξyξz
,C
ζxζyζz
⟩
J6 = J ·
⟨ ηxηyηz
,C
ζxζyζz
⟩
Beachte, dass wir den Faktor zwei nicht in Ji integriert haben und wir erst mal ci = constauf Gi.
Für den Konvektionterm gilt
˚
Gi
(b1ux +b2uy +b3uz)u dxdydz =
˚
G0
b1(uξ ξx +uηηx +uζ ζx)u+b2(uξ ξy +uηηy +uζ ζy)u+ ...
b3(uξ ξz +uηηz +uζ ζz)uJ dξ dηdζ =
J7
˚
G0
uξ u dξ dηdζ + J8
˚
G0
uηu dξ dηdζ + J9
˚
G0
uζ u dξ dηdζ
35
4. FEM in 3D
mit
J7 = J ·
⟨~b,
ξxξyξz
⟩
J8 = J ·
⟨~b,
ηxηyηz
⟩
J9 = J ·
⟨~b,
ζxζyζz
⟩Die Integrale ohne Ableitungen sind˚
Gi
u2dxdydz = J˚
G0
u2 dξ dηdζ
˚
Gi
u dxdydz = J˚
G0
u dξ dηdζ
4.2.1.2. Randbedingungen
Wir haben nun noch die Randbedingungen in die finite Elemente Methode zu integrieren. Aus
−∇ · (C∇u)+~b∇u+au = f in Ω
~n · (C∇u)+qu = g auf ∂Ω
folgt mit Ersetzen von~nC∇u in dem Randintegral durch die Randbedingung die Gleichung˚
Ω
−∇ · (C∇u)v+~b∇uv+auvdxdxdz =
=
˚
Ω
C∇u∇ · v+~b∇uv+auvdxdxdz−¨
∂Ω
~nC∇uvdsdr
=
˚
Ω
C∇u∇ · v+~b∇uv+auvdxdxdz+¨
∂Ω
quvdsdr−¨
∂Ω
gvdsdr
=
˚
Ω
f vdxdydz.
Wir müssen uns nur noch um die beiden Randintegrale kümmern, von denen eines nur voneiner von u unabhängigen Funktion g abhängt. Die Berechnung diese Integrale über eine inden R3 eingebetteten zweidimensionalen Mannigfaltigkeit kann dann wie im Abschnitt ??beschrieben erfolgen. Allerdings ist zu beachten, dass z.B. Tetraeder-Elemente Randstückebesitzen, die Dreiecke oder Vierecke sind. Dies ergibt dann aber nur technische Schwierigkei-ten.
36
4. FEM in 3D
4.2.2. Lineare nite Elemente über Tetraeder
4.2.2.1. Basisintegrale und Linear-/Quadratformen
Eine Lineare Funktion in R3 lässt sich als
u(ξ ,η ,ζ ) = a1 +a2ξ +a3η +a4ζ
schreiben. Wir müssen nun nur noch die obigen Integrale für diesen Ansatz auf dem Einheits-Tetraeder bestimmen. Die Ableitungen sind leicht zu berechnen:
uξ = a2
uη = a3
uζ = a4
Beachte, dass die Ji nur von der Transformation der Tetraeder in allgemeiner Lage auf dasEinheits-Tetraeder abhängen und somit für jedes Gi konstant sind. Das Integral über G0 ist
˚
G0
dξ dηdζ =
1ˆ
0
1−ξˆ
0
1−ξ−ηˆ
0
dζ dηdξ =16
wobei 16 das Volumen des Einheits-Tetraeders ist. Es folgt
I1 =
˚
G0
u2ξ
dξ dηdζ =
˚
G0
a22dξ dηdζ =
16
a22
I2 =
˚
G0
u2ηdξ dηdζ =
˚
G0
a23dξ dηdζ =
16
a23
I3 =
˚
G0
u2ζ
dξ dηdζ =
˚
G0
a24dξ dηdζ =
16
a24
Die Integrale mit gemischten Ableitungen sind
I4 = 2˚
G0
uξ uηdξ dηdζ = 2˚
G0
a2a3dξ dηdζ =13
a2a3
I5 = 2˚
G0
uξ uηdξ dηdζ = 2˚
G0
a2a4dξ dηdζ =13
a2a4
I6 = 2˚
G0
uηuζ dξ dηdζ = 2˚
G0
a3a4dξ dηdζ =13
a3a4
Beachte wieder, das der Faktor zwei zum Integral gehört.
37
4. FEM in 3D
Der Konvektionsterm ist dann aus den folgenden Integralen zusammengesetzt
I7 =
˚
G0
a2 · (a1 +a2 ·ξ +a3 ·η +a4 ·ζ )dζ dηdξ =1
24a2 (a4 +a3 +a2 +4a1)
I8 =
˚
G0
a3 · (a1 +a2 ·ξ +a3 ·η +a4 ·ζ )dζ dηdξ =1
24a3 (a4 +a3 +a2 +4a1)
I9 =
˚
G0
a4 · (a1 +a2 ·ξ +a3 ·η +a4 ·ζ )dζ dηdξ =1
24a4 (a4 +a3 +a2 +4a1)
Die Integrale für u2 und u sind dann
I10 =
˚
G0
(a1 +a2 ·ξ +a3 ·η +a4 ·ζ )2 dζ dηdξ
=a2
4 +(a3 +a2 +5a1) a4 +a23 +(a2 +5a1) a3 +a2
2 +5a1 a2 +10a21
60
I11 =
˚
G0
(a1 +a2 ·ξ +a3 ·η +a4 ·ζ )dζ dηdξ =a4 +a3 +a2 +4a1
24
Die Integrale I1 bis I10 liefern quadratische Formen Ii = a>Sia, i = 1, ...,6, wobei die füri = 1, ...,6 und i = 11 symmetrisch sind. I11ist eine Linearform I12 = S12a, wobei a der Koef-fizientenvektor der Ansatzfunktion u ist.
Aus den rechten Seiten der Formeln ??–?? ergeben sich die Matrizen
S1 =16
0 0 0 00 1 0 00 0 0 00 0 0 0
S3 =16
0 0 0 00 0 0 00 0 0 00 0 0 1
S5 =16
0 0 0 00 0 0 10 0 0 00 1 0 0
S2 =16
0 0 0 00 0 0 00 0 1 00 0 0 0
S4 =16
0 0 0 00 0 1 00 1 0 00 0 0 0
S6 =16
0 0 0 00 0 0 00 0 0 10 0 1 0
38
4. FEM in 3D
Die Matrizen Si, i = 7, ...,9 gehören zum Konvektionsterm
S7 =1
24
0 4 0 00 1 0 00 1 0 00 1 0 0
S8 =1
24
0 0 4 00 0 1 00 0 1 00 0 1 0
S9 =124
0 0 0 40 0 0 10 0 0 10 0 0 1
Massematrix und Quellterm
S10 =1
120
20 5 5 55 2 1 15 1 2 15 1 1 2
S11 =1
24
4111
4.2.2.2. Die die lokalen Matrizen Si
Die Koeffizienten ai ergeben sich aus der Forderung nach Interpolation an den Knoten desTetraeders
u1 = a1
u2 = a1 +a2
u3 = a1 +a3
u4 = a1 +a4
wobei die Abbildung linear ist und als Matrix A geschrieben werden kann. Mit
A−1 =
1 0 0 0−1 1 0 0−1 0 1 0−1 0 0 1
haben wir die Zuordnung ai 7→ ui.
Die Integrale sind dann mittels A zu transformieren
Ii = u>(A−1)>SiAu = u>Siu i = 1, ...,10,
I11 = S11A−1u = S11u.
Die folgenden lokalen Matrizen sind dann in der Assemblierung zu verwenden:
39
4. FEM in 3D
S1 =16
1 −1 0 0−1 1 0 0
0 0 0 00 0 0 0
S3 =16
1 0 0 −10 0 0 00 0 0 0−1 0 0 1
S5 =16
2 −1 0 −1−1 0 0 1
0 0 0 0−1 1 0 0
S2 =16
1 0 −1 00 0 0 0−1 0 1 0
0 0 0 0
S4 =16
2 −1 −1 0−1 0 1 0−1 1 0 0
0 0 0 0
S6 =16
2 0 −1 −10 0 0 0−1 0 0 1−1 0 1 0
S7 =1
24
−1 1 0 0−1 1 0 0−1 1 0 0−1 1 0 0
S8 =1
24
−1 0 1 0−1 0 1 0−1 0 1 0−1 0 1 0
S9 =1
24
−1 0 0 1−1 0 0 1−1 0 0 1−1 0 0 1
S10 =1
120
2 1 1 11 2 1 11 1 2 11 1 1 2
S11 =1
24
1111
4.2.3. Bilinearer Ansatz über Prismenelemente
4.2.3.1. Basisintegrale und Linear- /Quadratformen
Die Ansatzfunktion für Prismenelemente in R3 lässt sich als
u(ξ ,η ,ζ ) = a1 +a2ξ +a3η +a4ζ +a5ξ ζ +a6ηζ
schreiben. Die Ableitungen sind hier ebenfalls leicht zu berechnen:
uξ = a2 +a5 ·ζuη = a3 +a6 ·ζuζ = a4 +a5 ·ξ +a6 ·η
Beachte, dass die Ji wie im Falle von Tetraedern nur von der Transformation der Tetraeder inallgemeiner Lage auf das Einheits-Tetraeder abhängen und somit für jedes Gi konstant sind.G0 sei der Einheitstetraeder. Das Volumen von G0 ist
40
4. FEM in 3D
˚
G0
dξ dηdζ =
1ˆ
0
1−ξˆ
0
1ˆ
0
dζ dηdξ =12
Die Integrale I1..., I11 bestimmen sich wie folgt:Quadrate der partiellen Ableitungen
I1 =
˚
G0
uξ (ξ ,η ,ζ )2dξ dηdζ =
1ˆ
0
1−ξˆ
0
1ˆ
0
(a2 +a5 ·ζ )2 dζ dηdξ =a2
5 +3a2 a5 +3a22
6
I2 =
˚
G0
uη(ξ ,η ,ζ )2dξ dηdζ =
1ˆ
0
1−ξˆ
0
1ˆ
0
(a3 +a6 ·ζ )2 dζ dηdξ =a2
6 +3a3 a6 +3a23
6
I3 =
˚
G0
uζ (ξ ,η ,ζ )2dξ dηdζ =
1ˆ
0
1−ξˆ
0
1ˆ
0
(a4 +a5 ·ξ +a6 ·η)2 dζ dηdξ
=a2
6 +(a5 +4a4) a6 +a25 +4a4 a5 +6a2
412
=a62
12+
a5a612
+a4a6
3+
a52
12+
a4a53
+a42
2
die gemischten Ableitungen
I4 =
˚
G0
uξ (ξ ,η ,ζ )uη(ξ ,η ,ζ )dξ dηdζ =
1ˆ
0
1−ξˆ
0
1ˆ
0
(a2 +a5 ·ζ ) · (a3 +a6 ·ζ )dζ dηdξ
=(2a5 +3a2) a6 +3a3 a5 +6a2 a3
12
=a5a6
6+
a2a64
+a3a5
4+
a2a32
I5 =
˚
G0
uξ (ξ ,η ,ζ )uζ (ξ ,η ,ζ )dξ dηdζ =
1ˆ
0
1−ξˆ
0
1ˆ
0
(a2+a5 ·ζ )·(a4+a5 ·ξ +a6 ·η)dζ dηdξ
=(a5 +2a2) (a6 +a5 +3a4)
12
=a5a6
12+
a2a66
+a52
12+
a4a54
+a2a5
6+
a2a42
41
4. FEM in 3D
I6 =
˚
G0
uη(ξ ,η ,ζ )uζ (ξ ,η ,ζ )dξ dηdζ =
1ˆ
0
1−ξˆ
0
1ˆ
0
(a3+a6 ·ζ )·(a4+a5 ·ξ +a6 ·η)dζ dηdξ
=(a6 +2a3) (a6 +a5 +3a4)
12
=a6
2
12+
a5 a6
12+
a4 a6
4+
a3 a6
6+
a3 a5
6+
a3 a4
2
die Konvektionsterme
1ˆ
0
1−ξˆ
0
1ˆ
0
(a2 +a5 ·ζ ) · (a1 +a2 ·ξ +a3 ·η +a4 ·ζ +a5 ·ξ ·ζ +a6 ·η ·ζ )dζ dηdξ
=a5 a6
18+
a2 a6
12+
a52
18+
a4 a5
6+
a3 a5
12+
a2 a5
6+
a1 a5
4+
a2 a4
4+
a2 a3
6+
a22
6+
a1 a2
2
1ˆ
0
1−ξˆ
0
1ˆ
0
(a3 +a6 ·ζ ) · (a1 +a2 ·ξ +a3 ·η +a4 ·ζ +a5 ·ξ ·ζ +a6 ·η ·ζ )dζ dηdξ =
a62
18+
a5 a6
18+
a4 a6
6+
a3 a6
6+
a2 a6
12+
a1 a6
4+
a3 a5
12+
a3 a4
4+
a32
6+
a2 a3
6+
a1 a3
2
1ˆ
0
1−ξˆ
0
1ˆ
0
(a4+a5 ·ξ +a6 ·η) · (a1+a2 ·ξ +a3 ·η +a4 ·ζ +a5 ·ξ ·ζ +a6 ·η ·ζ )dζ dηdξ =
a62
24+
a5 a6
24+
a4 a6
6+
a3 a6
12+
a2 a6
24+
a1 a6
6+ ...
+a5
2
24+
a4 a5
6+
a3 a5
24+
a2 a5
12+
a1 a5
6+
a42
4+
a3 a4
6+
a2 a4
6+
a1 a4
2
der Masse-Term
I10 =
˚
G0
u(ξ ,η ,ζ )2dξ dηdζ =
1ˆ
0
1−ξˆ
0
1ˆ
0
(a1+a2ξ +a3η+a4ζ +a5ξ ζ +a6ηζ )2dξ dηdζ
=a6
2
36+
a5 a6
36+
a4 a6
9+
a3 a6
12+
a2 a6
24+
a1 a6
6+
a52
36+
a4 a5
9+
a3 a5
24+
a2 a5
12+
a1 a5
6...
+a4
2
6+
a3 a4
6+
a2 a4
6+
a1 a4
2+
a32
12+
a2 a3
12+
a1 a3
3+
a22
12+
a1a23
+a1
2
2
42
4. FEM in 3D
und der Quellterm
I11 =
˚
G0
u(ξ ,η ,ζ )dξ dηdζ =
1ˆ
0
1−ξˆ
0
1ˆ
0
a1+a2 ·ξ +a3 ·η+a4 ·ζ +a5 ·ξ ·ζ +a6 ·η ·ζ dζ dηdξ
=a6 +a5 +3a4 +2a3 +2a2 +6a1
12
Die Integrale I1 bis I10 liefern wieder quadratische Formen Ii = a>Sia, i = 1, ...,6, wobei diefür i = 1, ...,6 und i = 11 symmetrisch sind. I12 ist eine Linearform I12 = S12a, wobei a derKoeffizientenvektor der Ansatzfunktion u ist.
Aus den rechten Seiten der Formeln ??–?? ergeben sich die Matrizen
S1 =
0 0 0 0 0 0
012
0 014
0
0 0 0 0 0 00 0 0 0 0 0
014
0 016
0
0 0 0 0 0 0
S3 =
0 0 0 0 0 00 0 0 0 0 00 0 0 0 0 0
0 0 012
16
16
0 0 016
112
124
0 0 016
124
112
S5 =
0 0 0 0 0 0
0 0 014
112
112
0 0 0 0 0 0
014
0 018
0
01
120
18
112
124
01
120 0
124
0
S2 =
0 0 0 0 0 00 0 0 0 0 0
0 012
0 014
0 0 0 0 0 00 0 0 0 0 0
0 014
0 016
S4 =
0 0 0 0 0 0
0 014
0 018
014
0 018
0
0 0 0 0 0 0
0 018
0 01
120
18
0 01
120
S6 =
0 0 0 0 0 00 0 0 0 0 0
0 0 014
112
112
0 014
0 018
0 01
120 0
124
0 01
1218
124
112
Konvektion
43
4. FEM in 3D
S7 =
014
0 018
014
16
112
18
112
124
01
120 0
124
0
018
0 01
120
18
112
124
112
118
136
01
240 0
136
0
S8 =
0 014
0 018
0 0112
0 01
2414
112
16
18
124
112
0 018
0 01
120 0
124
0 01
3618
124
112
112
136
118
S9 =
0 0 014
112
112
0 0 01
121
241
480 0 0
112
148
124
14
112
112
14
112
112
112
124
148
112
124
148
112
148
124
112
148
124
Massematrix und Quellterm
44
4. FEM in 3D
S10 =
12
16
16
14
112
112
16
112
124
112
124
148
16
124
112
112
148
124
14
112
112
16
118
118
112
124
148
118
136
172
112
148
124
118
172
136
S11 =1
12
622311
4.2.3.2. Die lokalen Matrizen Si
Die Koeffizienten ai ergeben sich aus der Forderung nach Interpolation an den Knoten derPrismen
u1 = a1
u2 = a1 +a2
u3 = a1 +a3
u4 = a1 +a4
u5 = a1 +a2 +a4 +a5
u6 = a1 +a3 +a4 +a6
wobei die Abbildung linear ist und als Matrix-Vektor Operation ~u = A~a geschrieben werdenkann, wobei
A =
1 0 0 0 0 01 1 0 0 0 01 0 1 0 0 01 0 0 1 0 01 1 0 1 1 01 0 1 1 0 1
Mit
A−1 =
1 0 0 0 0 0−1 1 0 0 0 0−1 0 1 0 0 0−1 0 0 1 0 0
1 −1 0 −1 1 01 0 −1 −1 0 1
haben wir die Zuordnung ai 7→ ui.
Analog zum Tetraeder sind die Integrale dann mittels A−1 zu transformieren
Ii = u>(A−1)>SiA−1u = u>Siu i = 1, ...,10,
45
4. FEM in 3D
I11 = S11A−1u = S11u.
Die folgenden lokalen Matrizen sind dann in der Assemblierung zu verwenden:
S1 =
16−1
60
112− 1
120
−16
16
0 − 112
112
0
0 0 0 0 0 01
12− 1
120
16
16
0
− 112
112
016
16
0
0 0 0 0 0 0
S2 =
16
0 −16
112
0 − 112
0 0 0 0 0 0
−16
016
− 112
01
121
120 − 1
1216
016
0 0 0 0 0 0
− 112
01
1216
016
S3 =
112
124
124
− 112− 1
24− 1
241
241
121
24− 1
24− 1
12− 1
241
241
241
12− 1
24− 1
24− 1
12− 1
12− 1
24− 1
241
12124
124
− 124− 1
12− 1
241
24112
124
− 124− 1
24− 1
121
24124
112
S4 =
16− 1
12− 1
121
12− 1
24− 1
24− 1
120
112
− 124
01
24− 1
121
120 − 1
24124
01
12− 1
24− 1
2416− 1
12− 1
12− 1
240
124
− 112
01
12− 1
241
240 − 1
12112
0
46
4. FEM in 3D
S5 =
112
01
240 − 1
12− 1
240 − 1
12− 1
241
120
124
124− 1
240
124− 1
240
01
121
24− 1
120 − 1
24− 1
120 − 1
240
112
124
− 124
124
0 − 124
124
0
S6 =
112
124
0 0 − 124
112
124
0 − 124
124
0 − 124
0 − 124− 1
121
12124
0
01
241
12− 1
12− 1
240
− 124
01
24− 1
240
124
− 112− 1
240 0
124
112
S7 =
− 118
0 − 136− 1
360 − 1
720
118
136
01
361
72− 1
36136
0 − 172
172
0
− 136
0 − 172− 1
180 − 1
360
136
172
01
181
36− 1
72172
0 − 136
136
0
S8 =
− 118− 1
360 − 1
36− 1
720
− 136
01
36− 1
720
172
01
361
180
172
136
− 136− 1
720 − 1
18− 1
360
− 172
01
72− 1
360
136
01
721
360
136
118
47
4. FEM in 3D
S9 =
− 124− 1
48− 1
480 0 0
− 148− 1
24− 1
480 0 0
− 148− 1
48− 1
240 0 0
0 0 01
24148
148
0 0 01
48124
148
0 0 01
48148
124
S10 =
136
172
172
172
1144
1144
172
136
172
1144
172
1144
172
172
136
1144
1144
172
172
1144
1144
136
172
172
1144
172
1144
172
136
172
1144
1144
172
172
172
136
S11 =1
12
111111
Die Transformation eines beliebigen parallelen Prismenelementes ist wegen x4− x1 = y4−y1 = 0 und z2−z1 = z3−z1 = 0 etwas einfacher als die des Tetraeder-Elements. Wir betrachtendie Abbildung Φ : (ξ ,η ,ζ ) 7→ (x,y,z)
x = x1 +(x2− x1)ξ +(x3− x1)η
y = y1 +(y2− y1)ξ +(y3− y1)η
z = z1 +(z4− z1)ζ
Die Jacobi-Determinante ist dann
J = ((x2− x1)(y3− y1)− (x3− x1)(y2− y1))(z4− z1).
Ebenfalls dramatisch einfacher werden die Ableitungen ξx, ...,ζz. Die Ableitung nach x ist
1 = x1 +(x2− x1)ξx +(x3− x1)ηx
0 = y1 +(y2− y1)ξx +(y3− y1)ηx
0 = z1 +(z4− z1)ζx
wobei jetzt schon ζx = 0 folgt. Wir schreiben das System als Matrix
A =
x2− x1 x3− x1 0y2− y1 y3− y1 0
0 0 z4− z1
48
4. FEM in 3D
Mit einer bekannten Formel folgt
A−1 =1
det(A)
(y3− y1)(z4− z1) −(x3− x1)(z4− z1) 0−(y2− y1)(z4− z1) (x2− x1)(z4− z1) 0
0 0 (x2− x1)(y3− y1)− (y2− y1)(x3− x1)
Multipliziert man für die Ableitungen nach x, y und z der Transformierten ξ , η und ζ mit denEinheitsvektoren, so erhält man
ξx =1J(y3− y1)(z4− z1)
ηx = −1J(y2− y1)(z4− z1)
ζx = 0
ξy = −1J(x3− x1)(z4− z1)
ηy =1J(x2− x1)(z4− z1)
ζy = 0ξz = 0ηz = 0
ζz =1
z4− z1
wobei z.B.
ξx =1J(y3− y1)(z4− z1) =
y3− y1
(x2− x1)(y3− y2)− (y2− y1)(x3− x1)
die bekannte Formel aus der Dreieckstransformation in 2D ist.Benutzen wir als Abkürzung
xk j = (xk− x j)
yk j = (yk− y j)
zk j = (zk− z j)
erhalten wir für die Ji
J1 =z2
41J(c1y2
31 + c2x231)
J2 =z2
41J(c1y2
21 + c2x221)
J3 = c3J
z241
J4 = −z2
41J(c1y31y21 + c2x31x21)
J5 = 0J6 = 0
49
4. FEM in 3D
4.2.3.3. Randintegrale
Wir müssen ¨∂Gi
qu2dxdy = J¨
∂G0
qu2 dξ dη (4.1)¨
∂Gi
gudxdy = J¨
∂G0
gudξ dη (4.2)
bestimmen. Für den Wert des Integrals ist es nicht wichtig, wie wir die Randelemente auf 2Dtransformieren, die Zuordnung zu den 3D Knoten liefert uns das Feld e, dabei ist nur darauf zuachten, ob das Randelement ein Dreieck oder Rechteck ist. Für die Dreiecksrandelemente giltzi,k = z jk für alle j = 1, ...,3 und alle k, wobei dann für die Randelemente, die Rechtecke sindx1k = x4k, x2k = x3k, y1k = y4k sowie y2k = y3k gilt. Diese einfache Überlegung funktioniert nurfür parallele Prismen-Elemente. Im Tetraeder muss die Transformation tatsächlich berechnetwerden.
Insgesamt kann man leicht einsehen, dass das Problem (4.1)–(4.2) durch die Anwendungder analogen Rechnung für 2-D Probleme gelöst werden kann.
4.2.3.4. Implementierung
Die Implementierung der Assemblierung erfolgt wieder für alle Elemente in den MethodenfiniteElements3D.assema bzw. finiteElements3D.assemb. Die Methode benutzt abstrakte Me-thoden und Eigenschaften der Klasse finiteElements3D, die erst in den Subklassen definiertwerden. Dort wird auch der Komplette Satz I1...I6 von Integralen benutzt, obwohl für dieparallelen Prismenelemente J5 = 0 und J6 = 0 gilt. Siehe auch Abschnitt 4.2.1. Die für diejeweiligen Elemente konkrete Berechnung der Ji erfolgt erst in der Methode makeJ, die infiniteElements3D abstract deklariert wurde.
Der Code für die Assemblierung ist dadurch sehr kompaktDie Assemblierung benutzt die in der jeweilige FE-Klasse definierten Elementmatrizen
S1–S10. Die Koeffizienten c, a und f werden in acoefficients als Matrix der Dimension3×#ELEM bzw. als Vektoren der Länge #ELEM bereitgestellt. Die in Abschnitt ?? definier-ten Zahlen J,J1, ...,J6 werden durch Vektoren der Länge #ELEM ebenfalls für alle Elementebereitgestellt. Die Methode makeIndex liefert eine Umordnung der Indizes und dient nur zumeffektiven Anwenden des Befehls sparse. sparse arbeitet mit Vektoren für die Werte und dieIndizes. Man beachte, dass im reshape ein Dyadisches Produkt steht, damit werden die Spal-tenvektoren mit den Zeilenvektoren multipliziert, die entstehende 36× #ELEM Matrix wirddann mittels reshape zu einem Vektor der Länge 36 ·#ELEM.
Diese Technik lässt sich so nicht auf die Assemblierung der Randdaten anwenden, da dieRanddaten anders codiert sind, siehe Abschnitt ??.
Wir können aber eine ähnliche Technik für jedes Randsegment anwenden. Auch ist zu be-achten, dass die Ränder in 3D aus verschiedenen 2D Elementen (Dreiecken, Rechtecke, ...)bestehen können.
Durch die Codierung der Randdaten analog zur PDE-Toolbox müssen wir die (teure) Aus-wertung der Randdaten für jedes Randelement vornehmen. Anschließend können wir aber
50
4. FEM in 3D
c l a s s d e f ( A b s t r a c t ) f i n i t e E l e m e n t s 3 D < f i n i t e E l e m e n t s
p r o p e r t i e s ( A b s t r a c t , C o n s t a n t )S1 ; S2 ; S3 ; S4 ; S5 ; S6 ;S7 ; S8 ; S9 ;S10 ;S11 ;i d x ;
end
methods ( Access = p u b l i c )[K,M, F ] = assema ( obj , g r idObj , cf , af , f f ) ;[Q, G, H, R] = assemb ( obj , bound , g r i d O b j ) ;B = c o n v e c t i o n ( obj , g r idObj , b ) ;
end
methods ( S t a t i c , Access = p r o t e c t e d )[ cva l , ava l , f v a l ] = c o e f f i c i e n t s ( g , c , a , f ) ;[ qva l , gva l , hva l , r v a l ] = b c o e f f i c i e n t s ( p , b )b v a l v e c = c c o e f f i c i e n t s ( g , b ) ;
end
methods ( S t a t i c , A b s t r a c t )[ J , J1 , J2 , J3 , J4 , J5 , J6 ] = makeJ ( g r idObj , c v a l ) ;
endend
Abbildung 4.3.: Code der Klassendefinition finiteElements3D
die Technik wie in assema benutzen, nur dass wir noch zwischen Dreicksrandelementen undVierecksrandelementen unterscheiden müssen.
51
4. FEM in 3D
f u n c t i o n [ v a r a r g o u t ] = assema ( obj , g r idObj , cf , af , f f )
np = s i z e ( g r i d O b j . p , 2 ) ;n t = s i z e ( g r i d O b j . t , 2 ) ;
[ cva l , ava l , f v a l ] = o b j . a c o e f f i c i e n t s ( g r idObj , cf , af , f f ) ;[ J , J1 , J2 , J3 , J4 , J5 , J6 ] = o b j . makeJ ( g r idObj , c v a l ) ;[ idx1 , idx2 , i dx0 ] = o b j . makeIndex ( g r i d O b j . t ( o b j . idx , : ) , n t ) ;
sw i t ch n a r g o u tcase 2
v a r a r g o u t 1 = s p a r s e ( idx1 , idx2 , . . .r e s h a p e ( o b j . S1* J1+ o b j . S2* J2+ o b j . S3* J3 . . .
+2* o b j . S4* J4 +2* o b j . S5* J5 +2* o b j . S6* J6 . . .+ o b j . S10 *( a v a l . * J ) , 1 , n t * 3 6 ) , np , np ) ;
v a r a r g o u t 2 = s p a r s e ( idx0 , 1 , . . .r e s h a p e ( o b j . S11 *( J . * f v a l ) , 1 , n t * 6 ) , np , 1 ) ;
case 3v a r a r g o u t 1 = s p a r s e ( idx1 , idx2 , . . .
r e s h a p e ( o b j . S1* J1+ o b j . S2* J2+ o b j . S3* J3 . . .+2* o b j . S4* J4 +2* o b j . S5* J5 +2* o b j . S6* J6 , 1 , n t * 3 6 ) , np , np ) ;
v a r a r g o u t 2 = s p a r s e ( idx1 , idx2 , . . .r e s h a p e ( o b j . S10 *( a v a l . * J ) , 1 , n t * 3 6 ) , np , np ) ;
v a r a r g o u t 3 = s p a r s e ( idx0 , 1 , . . .r e s h a p e ( o b j . S11 *( J . * f v a l ) , 1 , n t * 6 ) , np , 1 ) ;
o t h e r w i s eth row ( o b j . wrongNumberOutputs )
endend
Abbildung 4.4.: Code finiteElements3D.assema
52
4. FEM in 3D
f u n c t i o n [Q, G, H, R] = assemb ( obj , g r i d O b j )
nBoundaryElements = s i z e ( g r i d O b j . e , 2 ) ;n T r i = sum ( g r i d O b j . e ( 4 , : ) = = 0 ) ;nSqr = sum ( g r i d O b j . e ( 4 , : ) > 0 ) ;n P t s = s i z e ( g r i d O b j . p , 2 ) ;q v a l = z e r o s ( 1 , n P t s ) ;g v a l = z e r o s ( 1 , n P t s ) ;h v a l = z e r o s ( 1 , n P t s ) ;
r v a l = z e r o s ( 1 , n P t s ) ;
f o r k = 1 : nBoundaryElementsi f g r i d O b j . e ( 4 , k )==0
[ q v a l ( k ) , g v a l ( k ) , h v a l ( k ) , r v a l ( k ) ] = g r i d O b j . b c o e f f i c i e n t s ( . . .g r i d O b j . p ( : , g r i d O b j . e ( 1 : 3 , k ) ) , g r i d O b j . b ( : , g r i d O b j . e ( 5 , k ) ) ) ;
e l s e[ q v a l ( k ) , g v a l ( k ) , h v a l ( k ) , r v a l ( k ) ] = g r i d O b j . b c o e f f i c i e n t s ( . . .
g r i d O b j . p ( : , g r i d O b j . e ( 1 : 4 , k ) ) , g r i d O b j . b ( : , g r i d O b j . e ( 5 , k ) ) ) ;end
end
% Case 2 . TRIANGLESi n d x T r i = f i n d ( g r i d O b j . e ( 4 , : ) = = 0 ) ;
p1 = g r i d O b j . p ( 1 : 2 , g r i d O b j . e ( 1 , i n d x T r i ) ) ;p2 = g r i d O b j . p ( 1 : 2 , g r i d O b j . e ( 2 , i n d x T r i ) ) ;p3 = g r i d O b j . p ( 1 : 2 , g r i d O b j . e ( 3 , i n d x T r i ) ) ;
x21 = p2 ( 1 , : ) − p1 ( 1 , : ) ;x31 = p3 ( 1 , : ) − p1 ( 1 , : ) ;y21 = p2 ( 2 , : ) − p1 ( 2 , : ) ;y31 = p3 ( 2 , : ) − p1 ( 2 , : ) ;
J t r i = x21 . * y31−x31 . * y21 ;
Qe = r e s h a p e ( l ag range12D . S4 *( J t r i . * q v a l ( i n d x T r i ) ) , 1 , 9 * n T r i ) ;ge = r e s h a p e ( l ag range12D . s1 * ( J t r i . * g v a l ( i n d x T r i ) ) , 1 , 3 * n T r i ) ;
He = r e s h a p e ( [ 1 0 0 0 1 0 0 0 1 ] ’ * ( J t r i . * h v a l ( i n d x T r i ) ) , 1 , 9 * n T r i ) ;r e = r e s h a p e ( [ 1 1 1 ] ’ * ( J t r i . * r v a l ( i n d x T r i ) ) , 1 , 3 * n T r i ) ;
i n d x T r i P t s = g r i d O b j . e ( 1 : 3 , i n d x T r i ) ;
[ indx0 , indx1 , indx2 ] = lag range12D . makeIndex ( i n d x T r i P t s , n T r i ) ;
Q = s p a r s e ( indx1 , indx2 , Qe , nPts , n P t s ) ;G = s p a r s e ( indx0 , 1 , ge , nPts , 1 ) ;H = s p a r s e ( indx1 , indx2 , He , nPts , n P t s ) ;R = s p a r s e ( indx0 , 1 , re , nPts , 1 ) ;
% Case 2 . SQUARESi n d x S q r = f i n d ( g r i d O b j . e ( 4 , : ) > 0 ) ;
i n d x S q r P t s = g r i d O b j . e ( 1 : 4 , i n d x S q r ) ;
pSqr1 = g r i d O b j . p ( : , g r i d O b j . e ( 1 , : ) ) ;pSqr2 = g r i d O b j . p ( : , g r i d O b j . e ( 2 , : ) ) ;pSqr3 = g r i d O b j . p ( : , g r i d O b j . e ( 3 , : ) ) ;
p2 = [ s q r t ( ( pSqr2 ( 1 , i n d x S q r )−pSqr1 ( 1 , i n d x S q r ) ) . ^ 2 + ( pSqr2 ( 2 , i n d x S q r )−pSqr1 ( 2 , i n d x S q r ) ) . ^ 2 )z e r o s ( s i z e ( i n d x S q r ) ) ] ;
p3 = [ z e r o s ( s i z e ( i n d x S q r ) )pSqr3 ( 3 , i n d x S q r )−pSqr2 ( 3 , i n d x S q r ) ] ;
h = [1 0 0 0 , 0 1 0 0 , 0 0 1 0 , 0 0 0 1 ] ’ ;r = [1 1 1 1 ] ’ ;
JSq r = p2 ( 1 , : ) . * p3 (2 , : ) − p3 ( 1 , : ) . * p2 ( 2 , : ) ;
Qe = r e s h a p e ( r e s h a p e ( o b j . BMsqr , 1 6 , 1 ) * ( JSq r . * q v a l ( i n d x S q r ) ) , 1 , 1 6 * nSqr ) ;ge = r e s h a p e ( o b j . b e s q r * ( JSq r . * g v a l ( i n d x S q r ) ) , 1 , 4 * nSqr ) ;
He = r e s h a p e ( h * ( JSq r . * h v a l ( i n d x S q r ) ) , 1 , 1 6 * nSqr ) ;
r e = r e s h a p e ( r * ( JSq r . * r v a l ( i n d x S q r ) ) , 1 , 4 * nSqr ) ;
[ indx0 , indx1 , indx2 ] = makeIndex ( i n d x S q r P t s , nSqr ) ;
Q = Q + s p a r s e ( indx1 , indx2 , Qe , nPts , n P t s ) ;G = G + s p a r s e ( indx0 , 1 , ge , nPts , 1 ) ;H = H + s p a r s e ( indx1 , indx2 , He , nPts , n P t s ) ;R = R + s p a r s e ( indx0 , 1 , re , nPts , 1 ) ;
f u n c t i o n [ idxvec0 , idxvec1 , i d x v e c 2 ] = makeIndex ( idx , np )i d x v e c 0 = r e s h a p e ( idx , 1 , np * 4 ) ;i d x v e c 1 = r e s h a p e ( [ i d x ; i d x ; i d x ; i d x ] , 1 , np * 1 6 ) ;i d x v e c 2 = r e s h a p e ( [ i d x ( 1 , : ) ; i d x ( 1 , : ) ; i d x ( 1 , : ) ; i d x ( 1 , : ) ; . . .
i d x ( 2 , : ) ; i d x ( 2 , : ) ; i d x ( 2 , : ) ; i d x ( 2 , : ) ; . . .i d x ( 3 , : ) ; i d x ( 3 , : ) ; i d x ( 3 , : ) ; i d x ( 3 , : ) ; . . .i d x ( 4 , : ) ; i d x ( 4 , : ) ; i d x ( 4 , : ) ; i d x ( 4 , : ) ] , 1 , 1 6 * np ) ;
end
end
Abbildung 4.5.: Code assemb. Diese Version überschreibt die assemb der Klasse finiteEle-mente3D, Grund sind einige kleine Tricks zur effizienzsteigerung, die nur fürparallele Tetraeder-Elemente gelten.
53
A
Anhang A.
Beispielprogramme
Mit den folgenden Beispielprogrammen sollen die Techniken, die in den vorhergehenden Ab-schnitten eingeführt wurden, an konkreten Aufgaben noch einmal erläutert werden. Die Auf-gaben sind so gewählt, dass möglichst viel der Syntax der PDE Toolbox und unserer Erweite-rungen benutzt wird, ohne die Programme aber damit zu überfrachten.
A.1. Klassischer Code
A.1.1. Elliptische PDE mit Dirichlet-Randbedingungen
Wir lösen das Rand-Anfangswertproblem in einer Ortsdimension
−uxx +u = x5 in (0,π)u = 0 in 0∪π.
Die Parameter sind als c = 1,a = 1, f = x5, h = 1,r = 0 gegeben. Das folgende Programm löstdie Aufgabe numerisch.
1c l e a r , c l c , c l e a r a l l2g = [ 0 , p i ] ;3b = b o u n d a r y m a t r i x ( [ ] , [ ] , ’ 1 ’ , ’ 0 ’ ) ;4[ p , e , t ] = i n i t m e s h ( g , ’hmax ’ , 0 . 1 ) ;5[K,M, F ] = assema ( p , t , ’ 1 ’ , ’ 1 ’ , ’ x . ^ 5 ’ ) ;6[ ~ , ~ ,H, ~ ] = assemb ( b , p , e ) ;7u = (K+M+1 e3 *H’*H ) \ ( F ) ;8p l o t ( p , u )
Alle nicht benötigen Matrizen/Vektoren sind mit “~” geblockt.
54
A. Beispielprogramme
A.1.2. Semilineare parabolische PDE mit
Neumann-Randbedingungen
Wir lösen das Rand-Anfangswertproblem
ut−uxx +u3 = 0 in (0,π)× (0,1)~n · (c∇u) = 0 auf 0× (0,1) und π× (0,1)
u(0) = sin(x) in (0,π).
Um das nichtlineare Problem ohne Newton-Verfahren zu lösen, benutzen wir eine Metho-de, die die Nichtlinearität u3(t) durch u3(t− δ t) ersetzt. Hier ist δ t die Zeitschrittweite. DieNichtlinerarität wird damit in den Quellterm verschoben: f (t) = u3(t− δ t)). Dies ist der sogenannte “Semi-linear approach”.
1c l e a r , c l c , c l f2n t = 100 ;3b = b o u n d a r y m a t r i x ( ) ;4g = [ 0 , p i ] ;5[ p , e , t ] = i n i t m e s h ( g , ’hmax ’ , 0 . 1 ) ;6t ime = l i n s p a c e ( 0 , 1 , n t ) ;7t a u = t ime ( 2 : end)− t ime ( 1 : end−1);89u0 = i n l i n e ( ’ s i n ( x ) ’ ) ;10u = u0 ( p ) ’ ;1112[K, Md, ~ ] = assema ( p , t , 1 , 1 , 0 ) ;1314f o r k = 2 : nt ,15u ( : , k ) = (Md+ t a u ( k−1)*K ) \ . . .16(Md*u ( : , k−1)− t a u ( k−1)*Md*u ( : , k− 1 ) . ^ 3 ) ;17end1819s u r f ( t ime , p , u )
A.1.3. PDE mit Quelle am Rand
Wir betrachten das Rand-Anfangswertproblem
ut−uxx +u = 0 in (0,π)−yx = sin(t) on 0× (0,2π)
y = t cos(t) on π× (0,2π)
y(0) = 0 in (0,π).
55
A. Beispielprogramme
Wir haben eine zeitabhängige Neumann-Randbedingungen auf dem linken und eine zeitab-hänge Dirichlet-Randbedingungen auf dem rechten Rand.
Das folgende MATLAB Program löst das Problem:
1c l e a r , c l f , c l c23n t = 3 0 ;4t ime = l i n s p a c e ( 0 , 2 * pi , n t ) ;5g = [ 0 , p i ] ;6[ p , e , t ] = i n i t m e s h ( g , ’hmax ’ , 0 . 1 ) ;78b = b o u n d a r y m a t r i x ( ’ 0 ’ , ’ s i n ( t ) ’ , [ ] , [ ] , [ ] , [ ] , ’ 1 ’ , ’ t * cos ( t ) ’ ) ;9t a u = t ime ( 2 : end)− t ime ( 1 : end−1);1011f = 0 ;12u_0 = 0 ;131415[K,M, F ] = assema ( p , t , 1 , 1 , f ) ;1617u = c h e c k _ f u n c t i o n ( u_0 , p ) ;1819f o r k = 2 : nt ,2021[Q, G, H, R] = assemb ( b , p , e , t ime ( k ) ) ;22u ( : , k ) = (M+ t a u ( k−1)*(K+M+Q+H ) ) \ . . .23(M*u ( : , k−1)+ t a u ( k−1)*(G+F+R ) ) ;24end2526s u r f ( t ime , p , u )
A.1.4. Der Löser parabolic
Die PDE Toolbox bietet einen Löser parabolic zur Lösung von zeitabhängigen Problemenan. Er löst Propbleme vom Typ
dut−∇(c∇u)+au = f~n · (c∇u)+qu = g
u(0) = u0
Wir rufen ihn mit
parabolic(u0,time,b,p,e,t,c,a,f,d)
56
A. Beispielprogramme
auf, wobei time ein Vektor ist, der die Zeit t0 und tend oder ein Zeitintervall t0, t1, ..., tend enthält.Für die Definition der Koefficienten c,a,d und f vergeliche die Hilfe zu assema. Für die PDEToolbox gilt die folgende Konvention:
“In expressions for boundary conditions and PDE coefficients, the symbol t isused to denote time. The variable t is often used to store the triangle Matrix ofthe mesh. You can use any variable to store the triangle Matrix, but in the PartialDifferential Equation Toolbox expressions, t always denotes time.”[?]
Deshalb nennen wir hier die triangle matrix t besser “tt”, und die interne Zeit wird zu “t”.Wir lösen das Problem
ut−∆u = e−t sin(x) in (0,π)× (0,2π)
~n · (∇u) = 0 in x = 0u = t cos(t) in x = π
u(0) = 0.
Durch die Kompatibilität der xxx1d Funktionen mit den entsprechenden PDE-Toolbox-Funktionenläuft parabolic ohne weitere Anpassung.
1c l c , c l e a r , c l f ,2n t = 5 0 ;3g = [ 0 , p i ] ;4[ p , e , t t ] = i n i t m e s h ( g , ’hmax ’ , . 1 ) ;5t ime = l i n s p a c e ( 0 , 2 * pi , n t ) ;6b = b o u n d a r y m a t r i x ( [ ] , [ ] , ’ 1 . 0 ’ , ’ t * cos ( t ) ’ , ’ 0 ’ , ’ 0 ’ , [ ] , [ ] ) ;7u_0 = 0 ;8u = p a r a b o l i c ( c h e c k _ f u n c t i o n ( u_0 , p ) , t ime , b , p , e , t t , . . .9’ 1 ’ , 0 , ’ exp(− t ) * s i n ( x ) ’ , 1 ) ;10s u r f ( t ime , p , u )
Beachte aber, dass parabolic für lineare finite Elemente auf Dreieckgittern programmiertwurde. Wenn wir unsere erweiterte Funktionalität (hier im Ort eindimensionale Probleme,finite Elemente vom Typ Lagrange-2) benutzen wollen, müssen wir einige Anpassungen vor-nehmen: Das Lagrange-2 Element ist definiert auf den Knoten des originalen Dreieicks undauf dessen Kantenmittelpunkten. Die Lösung wird also auf einem feineren Gitter berechnetals ursprünglich gegeben war.
Wir setzen der globalen Variable element_type den Wert element_type = 'L2' zu. DieFunktion parabolic wird intern assema und diese letztlich assema1d aufrufen, welche dannintern ein Hilfsgitter erstellt. Wir müssen nun zwei Dinge beachten:
(i) Der Anfangswert u0 muss auf dem neuen Gitter definiert sein.
(ii) Die grafische Ausgabe kann
57
A. Beispielprogramme
a) auf dem Hilfsgitter (surf(time1,p1,y) ), oder
b) auf dem originalen Gitter (surf(time1,p,y(1:2:end,:))) erfolgen.
1c l c , c l e a r , c l f , c l e a r a l l2n t = 5 0 ;3g = [ 0 , p i ] ;4[ p , e , t ] = i n i t m e s h ( g , ’hmax ’ , . 1 ) ;5t ime1 = l i n s p a c e ( 0 , 2 * pi , n t ) ;6g l o b a l e l e m e n t _ t y p e7e l e m e n t _ t y p e = ’L2 ’ ;8b = b o u n d a r y m a t r i x ( [ ] , [ ] , ’ 1 . 0 ’ , ’ t * cos ( t ) ’ , ’ 0 ’ , ’ 0 ’ , [ ] , [ ] ) ;9[ p1 , e , t ] = r e f i n e m e s h ( g , p , e , t ) ;10u_0 = 0 ; i n l i n e ( ’ s i n ( x ) ’ ) ;11y = p a r a b o l i c ( c h e c k _ f u n c t i o n ( u_0 , p1 ) , . . .12t ime1 , b , p , e , t , ’ 1 ’ , 0 , ’ exp(− t ) * s i n ( x ) ’ , 1 ) ;13s u r f ( t ime1 , p1 , y )
A.1.5. Die Lösung zeitabhängiger Probleme mit den
odexxx-Lösern
Wir lösen noch einmal ein Problem ähnlich wie Aufgabe A.1.4, aber nun nicht indem wirdie Zeitdiskreitisierung explizit in einer Schleife programmieren, sondern indem wir zuerstden Ort diskretisieren und dann mittels der klassischen Linienmethode die Zeitintegration mitHilfe einer geeigneten Funktion aus der MATLAB ODE-Suite vornehmen. Die Syntax allerODE-Löser ist
[T,Y] = solver(odefun,tspan,y0,options),
wobei solver eine Funktion aus der Reihe ode45, ode23, ode113, ode15s, ode23s, ode23t,oder ode23tb ist. odefun ist die rechte Seite der Gleichung
ut = Φ(u,x, t)
also in unserem FallΦ = (K +M+Q+ lH ′H)u+F +G+H ′R
wobei alle Matrizen vom Ort und der Zeit abhängen können. Dies macht eine sehr spezielleProgrammierung der Funktion odefun notwendig. Die ODE-Löser sind so programmiert, dasssie am Ende der Parameterliste die (zusätzlichen) Parameter für odefun erhalten. Die folgen-de Funktion demonstriert diese Technik. Hier ist eine Schwierigkeit, dass der ODE Löser erstzur Laufzeit die Schreitweite und somit den Wert für t berechnet. Wenn eine der Matrizen/-Vektoren von vorgegebenen Daten zu festen Zeitpunkten tk abhängt (dies ist typischerweisebei Optimalitätssystemen der Fall) so müssen diese Daten von den Zeitpunkten tk auf denaktuellen Wert t interpoliert werden. Im Beispiel ist dies in den Zeilen 13–28 implementiert.
58
A. Beispielprogramme
1f u n c t i o n dy = odefun ( t , y , v a r a r g i n )23b = v a r a r g i n 1 ;4p = v a r a r g i n 2 ;5t r i = v a r a r g i n 3 ;6e = v a r a r g i n 4 ;7u = v a r a r g i n 5 ;8t t = v a r a r g i n 6 ;9l = 1 e2 ;10[ ~ ,Md, ~ ] = assema ( p , t r i , 0 , 1 , 0 ) ;11[K, ~ , ~ ] = assema ( p , t r i , ’ 1 ’ , 0 , 0 ) ;12[Q, G, H, R]= assemb ( b , p , e , t ) ;13e x a k t = f a l s e ;14f o r k = 1 : l e n g t h ( t t ) ,15i f t t ( k )== t ,16u t =u ( : , k ) ;17e x a k t = t r u e ;18break ;19end20end21i f ~ exak t ,22k =1;23whi le t t ( k ) < t ,24k = k +1;25end26u t = u ( : , k−1)*( t t ( k)− t ) / ( t t ( k)− t t ( k − 1 ) ) . . .27+u ( : , k ) * ( t− t t ( k−1 ) ) / ( t t ( k)− t t ( k−1 ) ) ;28end29dy = Md* u t +G+ l *H’*R−(K+Q+ l *H’*H)* y ;
Das Programm zur Lösung der zeitabhängigen PDE ist nun im wesentlichen ein Aufruf vonode15s:
1c l c23n t = 5 0 ;4g = [ 0 , p i ] ;5[ p , e , t ] = i n i t m e s h ( g , ’hmax ’ , . 1 ) ;6t ime1 = l i n s p a c e ( 0 , 2 * pi , n t ) ;78b = b o u n d a r y m a t r i x ( [ ] , [ ] , ’ 1 . 0 ’ , ’ t * cos ( t ) ’ , ’ 0 ’ , ’ 0 ’ , [ ] , [ ] ) ;9y_0 = i n l i n e ( ’ s i n ( x ) ’ ) ;1011[ T ,X] = meshgr id ( t ime1 , p ) ;12f u n _ f = i n l i n e ( ’ exp(− t ) . * s i n ( x ) ’ ) ;
59
A. Beispielprogramme
13f = f u n _ f ( T ,X ) ;1415[ ~ ,Md, ~ ] = assema ( p , t , 0 , 1 , 0 ) ;1617o p t i o n s = o d e s e t ( ’ Re lTo l ’ ,1 e−3, ’ MaxOrder ’ , 5 , ’BDF ’ , ’ on ’ , ’ Mass ’ ,Md ) ;18[ t ime2 , y ] = ode15s ( @odefun , [ 0 2* p i ] , c h e c k _ F u n k t i o n ( y_0 , p ) , . . .19o p t i o n s , b , p , t , e , f , t ime1 ) ;2021s u r f ( t ime2 , p , y ’ )
A.1.6. Lösung stationärer Probleme mittels Zeitintegration
Oftmals ist man an der Lösung eines nichtlinearen stationären Problems interessiert. Als Bei-spiel diene
−c∆u+ f (u) = g in Ω
~n · (c∇u) = 0 auf ∂Ω.
Das Problem wird nach Diskretisierung im Ort zu
Ku+F(u)−G = 0,
wobei
F(u)i =
ˆ∆
f (uiφi)φ j dx
G =
ˆ∆
giφiφ j dx.
Wir müssen also ein nichtlineares Gleichungssystem mittels Newtonverfahren zu lösen. Dabeitaucht die Schwierigkeit auf, ein Startwert zu finden, für den das Newtonverfahren konver-giert. Dies ist aber oftmals in praxisrelevanten Problemen nicht möglich. Ein Ansatz ist, einenZeitableitungsterm hinzuzufügen
ddt
u− c∆u+ f (u) = g in Ω
~n · (c∇u) = 0 auf ∂Ω
u(0) = u0
wobei dann giltddt
u = 0⇔ u ist stationär.
Hier ist die Wahl des Anfangswertes wesentlich unkritischer als die Wahl eines Startwertesfür das obige Newtonverfahren. Allerdings taucht hier die Schwierigkeit auf, zu entscheiden,wann die Lösung stationär ist. Ein Kriterum kann sein, solange zu rechen, bis
ddt
u≤ ε.
60
A. Beispielprogramme
Daraus folgt, wir können unsere Zeitintegration stoppen, wenn die obige Bedingung erfülltist. Dazu können die event functions der ODE-Löser benutzt werden. Das Beispiel illustriertdies.
Die Funktion muss folgendermaßen definiert sein:
f u n c t i o n [ va lue , i s t e r m i n a l , d i r e c t i o n ] = e v e n t f u n ( t , y )% e v e n t f u n c t i o n t h a t s t o p p s t h e e v a l u a t i o n o f t h e t i m e% i n t e g r a t i o n . C r i t e r i a f o r b e i n g s t a t i o n a r y% i s | | dY / d t ( t , Y ) | | < 1e−3.
v a l u e = norm ( dY ( t , y ))−1 e−3; % v a l u ei s t e r m i n a l = 1 ; % s t o p p s t h e i n t e g r a t i o nd i r e c t i o n = −1; % n e g a t i v e d i r e c t i o nend
Jetzt können wir das Zeitintervall “offen” lassen:
o p t i o n s = o d e s e t ( ’ Mass ’ ,MM, ’ Re lTo l ’ ,1 e − 3 , . . .’ J a c o b i a n ’ ,@ddY, ’ S t a t s ’ , ’ o f f ’ , ’ Eve n t s ’ , @eventfun ) ;
s o l = ode15s (@dY, [ 0 , I n f ] , y0 , o p t i o n s ) ;
Nach der Rechnung stellen wir fest, dass das Beispiel nach 0.2514 s stationär ist:
>> s o l . t ime ( end )ans =
0 .2514>>
A.1.7. 1D PDEtool und die Klasse ocp
Wir demonstrieren in diesem Beispiel, wie man die 1D Erweiterung zusammen mit der Klasseocp benutzen kann.
Wir lösen das Optimalsteuerproblem1
min12(‖y− sin(x)‖2 +10−3‖u‖2)
unter den Nebenbedingungen
−yxx = u in (0,π)y = 0 in 0,π
und10−3u+ y≤ 0.8 in (0,π).
Im folgenden Programm benutzen wir die Klasse ocp zusammen mit einzelnen Funktionender PDE Toolbox.
1Wobei wir hier die Nomenklatur der Optimalen Steuerung benutzen: y ist der Zustand und u die Steuerung.
61
A. Beispielprogramme
1c l c ; c l e a r ;23g = [ 0 , p i ] ;45b = b o u n d a r y m a t r i x ( [ ] , [ ] , ’ 1 ’ , ’ 0 ’ ) ;67[ p , e , t ] = i n i t m e s h ( g , ’hmax ’ , 0 . 1 ) ;89gd = g r i d d ( ) ;10gd = s e t ( gd , ’ p ’ , p , ’ e ’ , e , ’ t ’ , t ) ;11gd = s e t ( gd , ’ g ’ , g , ’ b ’ , b ) ;12p l o t ( gd )1314o = ocp ;1516o = s e t ( o , ’ y_d ’ , @sin , ’ u_d ’ , 0 , . . .17’mu_a ’ , 1 , ’ t y p e ’ , ’L2 ’ , ’ s o l v e r ’ , ’ i p ’ , . . .18’ p d e _ t y p e ’ , ’ e l l i p t i c ’ , ’ kappa ’ , 1e − 3 , . . .19’ g r i d ’ , gd , ’ l a v r e n t i e v ’ ,1 e − 3 , . . .20’ c ’ ,1 , ’ a ’ , 0 , ’ debug ’ , t r u e , ’mu_e ’ ,1 e − 3 , . . .21’ p o i n t s ’ ,1 e3 , ’ r e f i n e m e n t s ’ , 3 , . . .22’ n e w t o n _ s t a r t ’ , t r u e , ’ y_b ’ , . 8 ) ;2324o = d e f i n e ( o ) ;2526o = s o l v e ( o ) ;2728p l o t ( o )
A.1.8. Kompatibilität zwischen Matlab's PDE Toolbox und den
1D Funktionen
Um die Kompatibilität zwischen der PDE Toolbox und den 1D-Erweiterungen zu demonstrie-ren, betrachten wir das Problem
−∆u = 8 in Ω
u = 0 on ∂Ω
wobei Ω=(0,1)k, k = 1,2, und ∂Ω der Rand von Ω ist. Das Programm benutzt nur MATLAB’sPDE Toolbox Syntax. Nur die Definition des Gebietes und der Randbedinungen ist von derDimension abhängig.
1f u n c t i o n b e i s p i e l 7 ( dim )2i f dim == 2 ,
62
A. Beispielprogramme
3g = u n i t s q u a r e ;4b = b o u n d a r y m a t r i x ( [ ] , [ ] , ’ 1 ’ , ’ 0 ’ ) ;5b = [ b , b ] ;6e l s e7g = [ 0 , 1 ] ;8b = b o u n d a r y m a t r i x ( [ ] , [ ] , ’ 1 ’ , ’ 0 ’ ) ;9end10f = 8 ;11[ p , e , t ] = i n i t m e s h ( g , ’hmax ’ , 0 . 1 ) ;12[ p , e , t ] = r e f i n e m e s h ( g , p , e , t ) ;13[K,M, F ] = assema ( p , t , 1 , 0 , f ) ;14[Q, G, H, R] = assemb ( b , p , e ) ;1516u = (K+1 e3 *H’*H ) \ ( F ) ;1718s u b p l o t ( 2 , 1 , 1 ) , pdemesh ( p , e , t , u ) ;19s u b p l o t ( 2 , 1 , 2 ) , p d e s u r f ( p , t , u ) ;20end
Wir lösen das Problem
−∆u = 8 in Ω
u = 0 auf ∂Ω1
~n · (c∇u) = 0 auf ∂Ω2
Im zweidimensionalen Fall Seien ∂Ω1 und ∂Ω2 jeweils zwei gegenüberliegende Kanten, imeindimensionalen Fall seien ∂Ω1 und ∂Ω2 die beiden Randpunkte des Intervalls Ω. Wir be-nutzen die erweiterte Syntax der Funktion boundarymatrix. Hier wird eine Liste mit Rand-bedingungen übergeben.
1f u n c t i o n b e i s p i e l 7 a ( dim )2i f dim == 2 ,3g = u n i t s q u a r e ;4b = b o u n d a r y m a t r i x ( [ ] , [ ] , ’ 1 ’ , ’ 0 ’ , [ ] , [ ] , ’ 1 ’ , ’ 0 ’ , . . .5’ 0 ’ , ’ 0 ’ , [ ] , [ ] , ’ 0 ’ , ’ 0 ’ , [ ] , [ ] ) ;6e l s e7g = [ 0 , 1 ] ;8b = b o u n d a r y m a t r i x ( [ ] , [ ] , ’ 1 ’ , ’ 0 ’ , ’ 0 ’ , ’ 0 ’ , [ ] , [ ] ) ;9end10f = 8 ;1112[ p , e , t ] = i n i t m e s h ( g , ’hmax ’ , 0 . 1 ) ;13[ p , e , t ] = r e f i n e m e s h ( g , p , e , t ) ;14[K, ~ , F ] = assema ( p , t , 1 , 0 , f ) ;15[ ~ , ~ ,H, ~ ] = assemb ( b , p , e ) ;
63
A. Beispielprogramme
1617u = (K+1 e3 *H’*H ) \ ( F ) ;1819s u b p l o t ( 2 , 1 , 1 ) , pdemesh ( p , e , t , u ) ;20s u b p l o t ( 2 , 1 , 2 ) , p d e s u r f ( p , t , u )21end
A.1.9. Nichtlineares Konvektions-Diusions-Problem: Die
Burgers-Gleichung
Wir betrachten einen klassischen Vertreter nichtlinearer Konvektions-Diffusions Probleme ineiner Ortsdimension, die zeitabhängige Burgers-Gleichung:
ut− cuxx +νuux = f in Σ := Ω× (t0,T )u = g auf Γ := ∂Ω× (t0,T )
u(t0) = u0 in Ω.
Oft wird die Burgers-Gleichung als eindimensionales Gegenstück zu den Navier-Stokes Glei-chungen gesehen. Wir wählen eine bekannte Konfiguration: Sei Ω = (0,π), t0 = 0 und T = 8.Setze weiter c= 10−2, ν = 1, f = g≡ 0 sowie u0 = sin(x). Hier wechselt die Kovektion~b= νubei x = π/2 das Vorzeichen, die Lösung wird also zu x = π/2 hin verschoben, ein sogenannterSchock entsteht. Im folgenden Programm wird das Problem mit dem semilinearen Ansatz ge-löst, vergleiche die Aufdatierung in der Programmzeile B = convection1d(p,u(:,k-1)).Wie in Beispiel 5.2 spart man sich in jedem Zeitschritt die Lösung einer nichtlinearen Glei-chung.
c l e a r a l l ; c l f ; c l c ;
g = [ 0 , p i ] ;[ p , e , t ] = i n i t m e s h ( g , ’hmax ’ , . 0 5 ) ;n t = 2 0 ; t ime = l i n s p a c e ( 0 , 8 , n t ) ;b = b o u n d a r y m a t r i x ( [ ] , [ ] , ’ 1 ’ , ’ 0 ’ ) ;
[K,M, ~ ] = assema ( p , t , . 0 1 , 1 , 0 ) ;[ ~ , ~ ,H, ~ ] = assemb ( b , p , e ) ;
u = s i n (2* p ( 1 , : ) ) ’ ;d t = t ime (2)− t ime ( 1 ) ;
f o r k =2: nt ,B = c o n v e c t i o n 1 d ( p , u ( : , k−1 ) ) ;u ( : , k ) = (M+ d t * (K+B+1 e3 *(H’*H ) ) ) \M*u ( : , k−1);
end
64
A. Beispielprogramme
s u r f ( p ( 1 , : ) , t ime , u ’ )
Abbildung A.1 zeigt die Lösung u der Burgers-Gleichung zu den obigen Parametern.
Abbildung A.1.: Lösung u der Burgers-Gleichung.
Alternativ lösen wir die Burgers-Gleichung in der nichtlinearen Form. In den Zeilen 16–24haben wir ein ungedämpftes Newtonverfahren implementiert.
1c l e a r a l l ; c l f ; c l c ;23g = [ 0 , p i ] ;4[ p , e , t ] = i n i t m e s h ( g , ’hmax ’ , . 0 2 5 ) ;5n t = 2 0 ; t ime = l i n s p a c e ( 0 , 8 , n t ) ;6b = b o u n d a r y m a t r i x ( [ ] , [ ] , ’ 1 ’ , ’ 0 ’ ) ;78[K,M, ~ ] = assema ( p , t , . 0 1 , 1 , 0 ) ;9[ ~ , ~ ,H, ~ ] = assemb ( b , p , e ) ;10B = c o n v e c t i o n 1 d ( p , 1 ) ;1112u = s i n (2* p ( 1 , : ) ) ’ ;13d t = t ime (2)− t ime ( 1 ) ;14f o r k =2: nt ,15u ( : , k ) = u ( : , k−1);16f o r l = 1 : 8 ,17d = −(M+ d t * (K+2*B* d i a g ( u ( : , k ) ) + ( H’*H ) ) ) \ . . .18(M*( u ( : , k)−u ( : , k−1))+ d t * (K*u ( : , k )+ u ( : , k ) . * . . .19(B*u ( : , k ) ) + ( H’*H)* u ( : , k ) ) ) ;20u ( : , k ) = u ( : , k )+ d ;21i f norm ( d ) <1 e−6,22break23end24end25end2627s u r f ( p ( 1 , : ) , t ime , u ’ )
65
A. Beispielprogramme
A.1.10. Konvektions-Diusions-Problem auf Q-Gitter
Sei Ω = (0,1)× (0,4). Wir lösen das Konvektions-Diffusions Problem
−c∆u+~b ·∇u+au = f in Ω
~n · (c∇u) = 0 on Γ
wobei c = 1,~b = (0,10sin(πx1)) und a = 0.1. Die Quelle ist definiert als
f =
10 für (x1x2) ∈ (0.05,0.1)× (1.2,1.3)20 für (x1x2) ∈ (0.85,0.9)× (0.6,0.8)0 sonst.
Dies Aufgabe modelliert ein (langsam) fließendes Medium in einem Kanal mit zwei Quellen(Wärme, Verschmutzung). Die Variable u ist dann die Temperatur bzw. die Konzentration desverschmutzenden Stoffes. Wir benutzen lineare finite Elemente auf einem Vierecksgitter.
1c l c , c l f , c l e a r a l l23nx1 = 4 0 ; nx2 = 160 ;4x1 = l i n s p a c e ( 0 , 1 , nx1 ) ;5x2 = l i n s p a c e ( 0 , 4 , nx2 ) ;6[ p , e , t ] = i n i t q m e s h ( x1 , x2 ) ;78b = [ b o u n d a r y m a t r i x ( ) b o u n d a r y m a t r i x ( ) ] ;910f1 = x i ( p , ’ ( x > 0 . 0 5 ) &(x < 0 . 1 ) &(y > 1 . 2 ) &(y < 1 . 3 ) ’ ) *10* ones ( s i z e ( p
( 1 , : ) ) ) ’ ;11f2 = x i ( p , ’ ( x > 0 . 8 5 ) &(x < 0 . 9 ) &(y > 0 . 6 ) &(y < 0 . 8 ) ’ ) *20* ones ( s i z e ( p
( 1 , : ) ) ) ’ ;12f = f1 + f2 ;1314[K,M, F ] = assemqa ( p , t , ’ 1 ’ , ’ . 1 ’ , f ) ;15[Q, G, H, R] = assemb2Dhigher ( b , p , e ) ;16B = c o n v e c t i o n q ( p , t , ’ 0 ’ ’ 10* s i n ( p i *x ) ’ ) ;1718u = (K+M+Q+B+1 e2 *(H’*H) ) \ ( F+G+1 e2 *H’*R) ;1920p d e q s u r f ( p , t , u ) ; co lormap h o t21a x i s ( [ 0 , 1 , 0 , 4 ] ) ; a x i s e q u a l
A.1.11. Eine Storansportsimulation
Es sei ein L-förmiges Gebiet Ω mit einer rechteckigen “Insel” gegeben. Dazu sei~b die (mit-tels der Navier-Stokes Gleichungen vorberechnete oder einer durch ein Experiment ermittelte)
66
A. Beispielprogramme
0 0.5 1 1.5 2 2.5 3
0
0.2
0.4
0.6
0.8
1
Abbildung A.2.: Gebiet Ω und das bekannte Strömungsfeld~b.
Strömung eines Mediums in Ω, siehe Abbildung A.2. Sei u die Konzentration eines Stoffes(zum Beispiel Tinte) in einem Fluid, (zum Beispiel Wasser) das am linken Rand von Ω miteinem gegebenen Konzentrationsprofil einströmt. Bedingt durch das nichttriviale Strömungs-feld in Ω und die Diffusion wird der Stoff im Fluid verteilt. Dies wird mittels der Konvektions-Diffusions-Gleichung
dddt
u− c∆u+~b ·u = f in Ω× (0, te)
~n · (c∇u) = 0 in Γ× (0, te)u = uΓe in Ω
modelliert. Es seien zwei Quellen für den verschmutzenden Stoff gegeben, wobei nur jeweilseine Mengeneinheit 2 hinzu gegeben wird. Mit den Zeitpunkten t1 und t2 an denen wir mitdem Eingießen beginnen, erhalten wir zwei Kontrollvariablen. Damit können wir die Quelleals f = χt∈(t1,t1+1) · χx∈Ω1 + χt∈(t2,t2+1) · χx∈Ω2 modellieren. Wir wählen d = 1 und als Dif-fusionsparameter c = 0.008. Das folgende MATLAB Programm simuliert dieses Experimentnumerisch. Wir formulieren das Programm als Funktion, die von den beiden Eingießzeitpunk-ten tpr1 und tpt2 abhängt. Mit der Variation dieser Variablem lässt sich zum Beispiel dasAusflussprofil der Konzentration des verschmutzenden Stoffes steuern.
1f u n c t i o n [ u , p , e , t , t i m e s ] = b e i s p i e l 1 0 ( t p t 1 , t p t 2 )23[w]= l o a d ( ’ g r i d _ n s _ s t u f e _ i n s e l ’ ) ;4[ w2]= l o a d ( ’ d a t a _ u _ v _ s t u f e _ i n s e l ’ ) ;
2Dazu ist bei konstanter Menge pro Zeiteinheit: “In einer einer Zeiteinheit” äquivalent.
67
A. Beispielprogramme
56p = w. p ; e = w. e ; t = w. t ;7u = w2 . u ; v = w2 . v ;8g = [ ] ;910BN = b o u n d a r y m a t r i x ( ’ 0 ’ , ’ 0 ’ ) ;11BN = BN( : , 1 ) ;12BD = b o u n d a r y m a t r i x ( ’ 1 ’ , ’ 0 . 1 * s i n ( p i * s ) ’ ) ; BD = BD( : , 1 ) ;1314b = z e r o s ( max ( l e n g t h (BD) , l e n g t h (BN) ) , 1 0 ) ;1516b ( 1 : l e n g t h (BN) , 2 : 1 0 ) = [BN BN BN BN BN BN BN BN BN] ;17b ( 1 : l e n g t h (BD) , 1 ) = BD ;1819un = p d e p r t n i ( p , t ( : , u . e l i n d ) , u . d ) ;20vn = p d e p r t n i ( p , t ( : , v . e l i n d ) , v . d ) ;21f1 = x i ( p , ’ ( x > 0 . 3 ) &(x < . 4 ) &(y > 0 . 4 5 ) &(y < . 5 5 ) ’ ) * ones ( s i z e ( p ( 1 , : ) )
) ’ ;22f2 = x i ( p , ’ ( x > 0 . 3 ) &(x < . 4 ) &(y > 0 . 8 5 ) &(y < . 9 5 ) ’ ) * ones ( s i z e ( p ( 1 , : ) )
) ’ ;2324[K,M, F1 ] = assema2Dhigher ( g , p , e , t , ’ . 0 0 8 ’ , ’ . 0 0 8 ’ , ’ 0 ’ , f1 ) ;25[Q, G, H, R] = assemb ( b , p , e ) ;26B = c o n v e c t i o n 2 D h i g h e r ( p , e , t , un , vn , g ) ;2728u0 = (K+M+Q+B+1 e2 *(H’*H) ) \ ( G+1 e2 *H’*R) ;2930[ ~ , ~ , F2 ] = assema2Dhigher ( g , p , e , t , ’ . 0 0 8 ’ , ’ . 0 0 8 ’ , ’ 0 ’ , f2 ) ;31[ ~ ,Md, ~ ] = assema2Dhigher ( g , p , e , t , 0 , 1 , 0 ) ;3233o p t i o n s = o d e s e t ( ’ Mass ’ ,Md) ;34[ t imes , u ] = ode15s ( @odefun , l i n s p a c e ( 0 , 1 0 , 2 0 0 ) , u0 , . . .35o p t i o n s , K,M, F1 , F2 , B , Q, G, H, R , t p t 1 , t p t 2 ) ;3637%−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−38f u n c t i o n dy = odefun ( t , y , K,M, F1 , F2 , B , Q, G, H, R , t p t 1 , t p t 2 )39dy = ( ( t < t p t 1 +1) * ( t > t p t 1 ) *F1 +( t < t p t 2 +1) . . .40* ( t > t p t 2 ) *F2+G+H’*R) . . .41−(K+M+B+1 e2 *(H’*H) +Q) *y ;42end43end
Die folgenden Abbildungen zeigen Schnappschüsse der Lösung u mit dem Aufruf beispiel10(1,2).
68
A. Beispielprogramme
Abbildung A.3.: Schnappschüsse zu den Zeitpunkten t = 1, t = 2, t = 2.5, t = 3 und t = 4.
69
A. Beispielprogramme
A.2. Objektorientierter Code
A.2.1. Konvektions-Diusionsgleichung in 1D
Im ersten Beispiel lösen wir eine Konvektions-Diffusionsgleichung
−uxx(x)+10 ·ux(x)+u(x) = 1 in (0,π)ux(0)+u(0) = 0
u(π) = 0
in einer Raumdimension. Wir benutzen lineare FE.
g r = gr id1D ( [ 0 p i ] , 0 . 0 1 ) ;fem = lagrange11D ;g r . makeBoundaryMatr ix ( g r . robinBC ( ’ 1 ’ , ’ 0 ’ ) , g r . d i r i c h l e t B C ( ’ 1 ’ , ’ 0 ’ ) ) ;
[K,M, F ] = fem . assema ( gr , 1 , 1 , 1 ) ;[Q, G, H, R] = fem . assemb ( g r ) ;B = fem . c o n v e c t i o n ( gr , 1 0 ) ;
y = (K+M+B+1 e6 *(H’*H)+Q ) \ ( F+(1 e6 *H’*R)+G ) ;
f i g u r e ( 1 )c l fp l o t ( g r . p , y , ’ . ’ ) ;
A.2.2. Burgers's Gleichung
Wir lösen mittels semi-implizitem Eulerverfahren die Burgers-Gleichung
ut−uxxu ·ux = 0u(0,x) = sin(2 · x)u(t,0) = 0u(t,π) = 0
wobei t ∈ (0,5) gewählt ist.
n t = 200 ;t ime = l i n s p a c e ( 0 , 5 , n t ) ;
g r = gr id1D ( [ 0 , p i ] , 0 . 0 0 5 ) ;g r . makeBoundaryMatr ix ( g r . d i r i c h l e t B C ( ’ 1 ’ , ’ 0 ’ ) , g r . d i r i c h l e t B C ( ’ 1 ’ , ’ 0 ’ ) ) ;
fem = lagrange11D ;[K,M, ~ ] = fem . assema ( gr , 0 . 0 0 1 , 1 , 0 ) ;
70
A. Beispielprogramme
[ ~ , ~ ,H, ~ ] = fem . assemb ( g r ) ;
u = s i n (2* gr . p ( 1 , : ) ) ’ ;d t = t ime (2)− t ime ( 1 ) ;
f o r k =2: nt ,B = fem . c o n v e c t i o n ( gr , u ( : , k−1 ) ’ ) ;u ( : , k ) = (M+ d t * (K+B+1 e6 *(H’*H ) ) ) \M*u ( : , k−1);
endf i g u r e ( 2 )c l fs u r f ( g r . p ( 1 , : ) , t ime , u ’ ) ;
A.2.3. Konvektions-Diusionsgleichung in 2D
Wir lösen die Konvektions-Diffusionsgleichung
−∆u+(−10,10) ·∇u+u = 10 in Ω
u = 0 auf ∂Ω
wobei Ω die Einheitskreisfläche ist.
% c r e a t e a u n i t c i r c l e and mesh i tgr = gr id2D ( ) ;g r . u n i t c i r c l e ( ) ;g r . r e f i n e m e s h ( ) ;g r . p l o t ;
% c r e a t e boundary c o n d i t i o n sdb = gr . b o u n d a r y C o n d i t i o n ( [ ] , [ ] , ’ 1 ’ , ’ 0 ’ ) ;g r . makeBoundaryMatr ix ( db , db , db , db ) ;
f e = lag range12D ( ) ;[K,M, F ] = f e . assema ( gr , ’ 1 ’ , ’ 1 ’ , ’ 10 ’ ) ;B = f e . c o n v e c t i o n ( gr , [ −1 0 , 1 0 ] ’ ) ;[Q, G, H, R] = f e . assemb ( g r ) ;y = (K+M+B+1 e6 *(H’*H)+Q ) \ ( F+(1 e6 *H’*R)+G ) ;p d e s u r f ( g r . p , g r . t , y )
71
A. Beispielprogramme
A.2.4. Konvektions-Diusionsgleichung mit nichtlinearer Quelle
Die Aufgabe stammt aus B/W 2010.
−∇ · (κ∇u)+~U∇u− w(u) = 0u = g|ΓD
~n ·κ∇u = 0|ΓN
Das Gebiet ist das Rechteck (0,1.8)× (0,0.9). Wegen der Notwendigkeit, einen Gaseinlasszu modellieren, wird das Rechteck durch ein Polygon mit sechs Punkten definiert.
f u n c t i o n test_BW_FEMc l fg r = gr id2D ( ) ;g r . po lygon ( [ 0 1 . 8 1 . 8 0 0 0 ] , [ 0 0 0 . 9 0 . 9 0 . 6 0 . 3 ] ) ;g r . r e f i n e m e s h ( ) ;g r . r e f i n e m e s h ( ) ;np = gr . n P o i n t s ;
f p r i n t f ( [ ’Mesh c o n s i s t s o f ’ , . . .num2s t r ( g r . n P o i n t s ) , ’ g r i d p o i n t s . \ n ’ ] )
f i g u r e ( 1 )g r . p l o t
bcTempIn l e t = g r . b o u n d a r y C o n d i t i o n ( [ ] , [ ] , ’ 1 ’ , ’ 950 ’ ) ;bcTempOvera l l = g r . b o u n d a r y C o n d i t i o n ( [ ] , [ ] , ’ 1 ’ , ’ 300 ’ ) ;
bc Fu e l = gr . b o u n d a r y C o n d i t i o n ( [ ] , [ ] , ’ 1 ’ , ’ 0 . 028 ’ ) ;bcOx = gr . b o u n d a r y C o n d i t i o n ( [ ] , [ ] , ’ 1 ’ , ’ 0 . 226 ’ ) ;bcProd = gr . b o u n d a r y C o n d i t i o n ( [ ] , [ ] , ’ 1 ’ , ’ 0 ’ ) ;bc Nu l l = g r . b o u n d a r y C o n d i t i o n ( [ ] , [ ] , ’ 1 ’ , ’ 0 ’ ) ;
bcNeuman = gr . b o u n d a r y C o n d i t i o n ( ’ 0 ’ , ’ 0 ’ ) ;
fem = lagrange12D ( ) ;[K,M, ~ ] = fem . assema ( gr , ’ 2 ’ , ’ 1 ’ , ’ 0 ’ ) ;
g r . makeBoundaryMatr ix ( bcNeuman , bcNeuman , . . .bcNeuman , bcNul l , bcFuel , bc Nu l l ) ;
[ ~ , ~ ,H, RF ] = fem . assemb ( g r ) ;
g r . makeBoundaryMatr ix ( bcNeuman , bcNeuman , . . .bcNeuman , bcNul l , bcOx , bc Nu l l ) ;
[ ~ , ~ , ~ ,RO] = fem . assemb ( g r ) ;
72
A. Beispielprogramme
gr . makeBoundaryMatr ix ( bcNeuman , bcNeuman , . . .bcNul l , bcNul l , bcProd , bc Nu l l ) ;
[ ~ , ~ , ~ , RP ] = fem . assemb ( g r ) ;
g r . makeBoundaryMatr ix ( bcNeuman , bcNeuman , . . .bcNeuman , bcTempOveral l , bcTempIn le t , bcTempOvera l l ) ;
[ ~ , ~ , ~ ,RT] = fem . assemb ( g r ) ;
N = s p a r s e ( g r . n P o i n t s , g r . n P o i n t s ) ;B = fem . c o n v e c t i o n ( gr , [ 5 0 0 ] ’ ) ;
DD = −[K+B+1 e8 *(H’*H) N N N;N K+B+1 e8 *(H’*H) N N;N N K+B+1 e8 *(H’*H) N;N N N K+B+1 e8 *(H’*H ) ] ;
MM = [M N N N;N M N NN N M NN N N M] ;
FF = [1 e8 *H’*RT ;1 e8 *H’*RF ;1 e8 *H’*RO;1 e8 *H’*RP ] ;
y0 = −DD\ FF ;f p r i n t f ( ’ S t a r t s o l v i n g t ime d e p e n d e n t problem . \ n ’ ) ;
% d e f i n e ode−o p t i o n so p t i o n s = o d e s e t ( ’ Mass ’ ,MM, ’ Re lTo l ’ ,1 e − 3 , . . .
’ J a c o b i a n ’ ,@ddY, ’ S t a t s ’ , ’ o f f ’ , ’ Eve n t s ’ , @eventfun ) ;
f p r i n t f ( ’ Compute t r a n s i e n t s o l u t i o n . . . \ n ’ ) ;t i c[ x , y ] = ode15s (@dY, l i n s p a c e ( 0 , 0 . 2 , 6 0 0 ) , y0 , o p t i o n s ) ;y = y ( end , : ) ’ ;
f p r i n t f ( [ ’ . . . f i n i s h e d a f t e r ’ , num2s t r ( t o c ) , ’ s e c . \ n ’ ] )f p r i n t f ( [ ’ S o l u t i o n s t a t i o n a r y a t : ’ , num2s t r ( x ( end ) ) , ’ \ n ’ ] ) ;
temp = y ( 1 : g r . n P o i n t s , : ) ;f u e l = y (1+ gr . n P o i n t s : 2 * g r . n P o i n t s , : ) ;
73
A. Beispielprogramme
ox = y (1+2* gr . n P o i n t s : 3 * g r . n P o i n t s , : ) ;p rod = y (1+3* gr . n P o i n t s : 4 * g r . n P o i n t s , : ) ;
% s o l . x i s t h e t i m e
f i g u r e ( 1 )c l f
s u b p l o t ( 2 , 2 , 1 )p d e p l o t ( g r . p , g r . e , g r . t , ’ x y d a t a ’ , temp ( : , end ) , ’ c o n t o u r ’ , ’ on ’ )co lormap j e ta x i s e q u a lc o l o r b a r
s u b p l o t ( 2 , 2 , 2 )p d e p l o t ( g r . p , g r . e , g r . t , ’ x y d a t a ’ , f u e l ( : , end ) , ’ c o n t o u r ’ , ’ on ’ )co lormap j e ta x i s e q u a lc o l o r b a r
s u b p l o t ( 2 , 2 , 3 )p d e p l o t ( g r . p , g r . e , g r . t , ’ x y d a t a ’ , ox ( : , end ) , ’ c o n t o u r ’ , ’ on ’ )co lormap j e ta x i s e q u a lc o l o r b a r
s u b p l o t ( 2 , 2 , 4 )p d e p l o t ( g r . p , g r . e , g r . t , ’ x y d a t a ’ , p rod ( : , end ) , ’ c o n t o u r ’ , ’ on ’ )view ( [ 0 , 9 0 . 0 ] )co lormap j e ta x i s e q u a lc o l o r b a r
% end o f t h e main program
% We d e f i n e now some l o c a l ( n e s t e d ! ) f u n c t i o n sf u n c t i o n dy = dY ( t , y )
% RHS o f Sys temdy = DD*y + MM*w( t , y ) + FF ;
end
% i t ’ s a good i d e a t o g i v e ode15s t h e Jacobian , so here we are . .f u n c t i o n d = ddY ( t , y )
74
A. Beispielprogramme
%d e r i v a t e o f dYd = DD + . . .
MM*dw ( t , y ) ;end
% t h e d e f i n i t i o n o f t h e c h e m i c a l s o u r c e termf u n c t i o n d = w( ~ ,Y)
% c h e m i c a l s o u r c e term f o r t h e% B u f f o n i / W i l l c o x paper p r o j e c t% w = g ( Y , T )% Si mp le one s t e p r e a c t i o n i s 2H2 + O2 => H2O% F i l l t h e Data by u s i n g v a l u s from c a n t e r a% p o s s i b l e i s a l s o a t e m p e r a t u r e d e p e n d e n t% i m p l e m e n t a t i o n f o r A% M o l e c u l a r a r w e i g h t s : t a k e t h i s from L i t e r a t u r e% R e a c t i o n da taA = 5 . 5 e11 ;E = 4 . 5 e3 ;nu = [2 1 −2] ’ ;wc= [ 2 . 0 1 6 3 1 . 9 1 8 . 0 ] ’ ;R = 8 . 3 1 4 4 7 2 ;rho = 1 . 3 9 e−3;Q = 9800 ;% t h i s p a r t i s v a l i d f o r a l l s p e c i e s ,% because o f t h e use o f a% g l o b a l mechanisms c a l a r _ r a t e = . . .
( rho *Y( np +1:2* np ) / wc ( 1 ) ) . ^ nu ( 1 ) . * . . .( rho *Y(2* np +1:3* np ) / wc ( 2 ) ) . ^ nu ( 2 ) . . .. *A. * exp(−E . / ( R . *Y( 1 : np ) ) ) ;
dY = −1/ rho *[ wc ( 1 ) * nu ( 1 ) * s c a l a r _ r a t e ; . . .wc ( 2 ) * nu ( 2 ) * s c a l a r _ r a t e ; wc ( 3 ) * nu ( 3 ) * s c a l a r _ r a t e ] ;
% f o r t e m p e r a t u r e i s d Y _ f u e l / d t * QdT = dY(2* np +1:3* np )*Q;d = [ dT ; dY ] ;
end
% we need t h e J a c o b i a n o f our c h e m i s c a l s o u r c e term ,%r a t h e r c r i p t i c . . .f u n c t i o n d = dw ( ~ ,Y)
% t h e d e r i v a t i v e o f dwA = 5 . 5 e11 ;E = 4 . 5 e3 ;
75
A. Beispielprogramme
nu = [2 1 −2] ’ ;wc= [ 2 . 0 1 6 3 1 . 9 1 8 . 0 ] ’ ;R = 8 . 3 1 4 4 7 2 ;rho = 1 . 3 9 e−3;Q = 9800 ;% computed on paper and coded as a " m a t r i x g r a d i e n t "d _ r a t e = [ . . .
d i a g ( ( rho / wc ( 1 ) *Y( np +1:2* np ) ) . ^ ( nu ( 1 ) ) . * . . .( rho / wc ( 2 ) *Y(2* np +1:3* np ) ) . ^ nu ( 2 ) . * . . .(A* exp(−E . / ( R . *Y( 1 : np ) ) ) ) . * ( E . / R . / ( Y( 1 : np ) . ^ 2 ) ) ) , . . .d i a g ( nu ( 1 ) * ( rho / wc ( 1 ) ) * . . .( rho *Y( np +1:2* np ) / wc ( 1 ) ) . ^ ( nu ( 1 ) − 1 ) . * . . .( rho *Y(2* np +1:3* np ) / wc ( 2 ) ) . ^ nu ( 2 ) . * . . .(A* exp(−E . / ( R . *Y( 1 : np ) ) ) ) ) , . . .d i a g ( nu ( 2 ) * ( rho / wc ( 2 ) ) * ( rho / wc ( 1 ) . . .
*Y( np +1:2* np ) ) . ^ ( nu ( 1 ) ) . * . . .( rho / wc ( 2 ) *Y(2* np +1:3* np ) ) . ^ ( nu ( 2 ) − 1 ) . * . . .(A* exp(−E . / ( R . *Y( 1 : np ) ) ) ) ) , . . .
N ] ;% i n 0D case t h i s i s a d y a d i c p r o d u c t . . .d =−1/ rho * [Q*wc ( 3 ) * nu ( 3 ) * d _ r a t e ; wc ( 1 ) * nu ( 1 ) * d _ r a t e ; . . .
wc ( 2 ) * nu ( 2 ) * d _ r a t e ; wc ( 3 ) * nu ( 3 ) * d _ r a t e ] ;end
% e v e n t t o s t o p p t h e t i m e i n t e g r a t i o n i f s o l u t i o n i s s t a t i o n a r yf u n c t i o n [ va lue , i s t e r m i n a l , d i r e c t i o n ] = e v e n t f u n ( t , y )
% e v e n t f u n c t i o n t h a t s t o p p s t h e e v a l u a t i o n o f t h e t i m e% i n t e g r a t i o n . C r i t e r i a f o r b e i n g% s t a t i o n a r y i s | | dY / d t ( t , Y ) | | <% 1e−3.v a l u e = norm ( dY ( t , y ))−1 e−3;%i s t e r m i n a l = 1 ; % s t o p p s t h e i n t e g r a t i o nd i r e c t i o n = −1; % n e g a t i v e d i r e c t i o n
endend
A.2.5. Diusionsproblem in 3D
Wir lösen die Gleichung
−κ∆u+u = 0~nκ∇u = 0 auf ∂Ω|N
u = f (x,y,z) auf ∂Ω|D
76
A. Beispielprogramme
wobei Ω der Einheitswürfel ist. Die Randfläche ∂Ω|D ist die erste Seitenfläche des Würfelsund f = 100−10∗ ((x−0.5)2 +(y−0.5)2). Die Lösung des linearen Gleichungssystems er-folgt per PCG, wobei die Vorkonditionierer eine unvollständige Choleski-Zerlegung der Ma-trix.
c l e a r a l ln R e f i n e m e n t s = 4 ;g r2 = gr id2D ( ) ;g r2 . u n i t s q u a r e ;f o r k = 1 : n R e f i n e m e n t s
g r2 . r e f i n e m e s h ( ) ;endgr2 . p l o t
g r3 = g r i d 3 D p r ;g r3 . expand ( gr2 , l i n s p a c e ( 0 , 1 , 2 ^ n R e f i n e m e n t s + 1 ) )g r3 . p l o t f a c e s ;
db = gr3 . d i r i c h l e t B C ( ’ 1 ’ , ’ 100−10*((x−0 . 5 ) . ^ 2 + ( y−0 . 5 ) . ^ 2 ) ’ ) ;nb = gr3 . robinBC ( ) ;g r3 . makeBoundaryMatr ix ( db , nb , nb , nb , nb , nb ) ;
fem = b i l i n e a r 3 D ( ) ;[K,M, F ] = fem . assema ( gr3 , ’ 11 ’ , ’ 1 ’ , ’ 0 ’ ) ;[Q, G, H, R] = fem . assemb ( gr3 ) ;L = i c h o l (K+M+1 e6 *(H’*H)+Q ) ;y = pcg (K+M+1 e6 *(H’*H)+Q, ( F+1 e6 *H’*R+G) , 1 e−8 ,200 ,L , L ’ ) ;
f i g u r e ( 1 )g r3 . p l o t m e shf i g u r e ( 2 )g r3 . p l o t f a c e sf i g u r e ( 3 )g r3 . p l o t s l i c e s ( y , n R e f i n e m e n t s )f i g u r e ( 4 )g r3 . p l o t f a c e s ( y )
77