Inhaltsverzeichnis
1 Einleitung 1.1 Die 2D Gleichung der akkustischen Welle . . . 1.2 Diskretisierung der Wellengleichung . . . . . . . 1.3 Approximation der Ableitung zweiter Ordnung 1.4 Approximierte Version der Wellengleichung . . 2 Programm 2.1 Liste der Variablen und ihrer Bedeutung 2.2 Programmstruktur . . . . . . . . . . . . 2.3 Fortran Code . . . . . . . . . . . . . . . 2.4 Kompilieren und Linken . . . . . . . . . 3 Experimente und Auswertung 3.1 Variation der Wellenfrequenz f . . . 3.2 Simulieren einer Grenzschicht . . . . 3.3 Stabilitt des Euler Verfahrens (CFL 3.4 Dnne Schichten . . . . . . . . . . . 4 Vorschlge zur Verbesserung des Kurses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 5 5 6
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
7 . 7 . 8 . 9 . 13 14 15 17 21 23 25
. . . . . . . . . . . . . . Kriterium) . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
1 Einleitung
Die Aufgabe der Semesterarbeit besteht darin, die zweidimensionalen Wellengleichung mittels Fortran 95 numerisch zu lsen und anschlieend unterschiedliche Experimente durch Variation der Variablen mit MATLAB grasch darzustellen und zu analysieren.
(1.1) (1.2)
(x F )dV +
V
Hierbei steht F fr alle auftretenden Volumenkrfte und P fr den Spannungsvektor der senkrecht auf der Oberche des Volumenelements steht. Aus Pi = pij nj fr alle Raumrichtungen des Spannungsvektors in Schreibweise der Summenkonvention und durch Anwendung des Gauschen Satzes knnen beide Integrale aus (1.1) zusammengefasst werden und es folgt: (Fi + div Pi )dV = 0
V
(1.3)
und da diese Annahme fr alle Volumen gelten soll Fi + ( pij pij + ) = 0. xj zj (1.4)
Durch das Zerlegen der Volumenkrfte Fi in Fi = ddtui +fi , (fi : brige Volumenkrfte) 2 d und durch das Ersetzen der substantiellen Dierentation dt durch die partielle t , da wir nur innitesimale Deformationen betrachten, erhalten wir so die zweidimensionale Bewegungsgleichung mit: pij pij 2 ui + ) + fi . (1.5) 2 =( t xj zj Wird nun weiter von idealer Elastizitt (ohne Deformation tritt keine Spannung im Impulstrger auf) und einem isotropen Medium ausgegangen, so lsst sich durch die lineare SpannungsDehnungsBeziehungen aus der Bewegungsgleichung (1.5) die allgemeine zweidimensionale Wellengleichung im homogenen und isotropen Medium ableiten: 2u 1 2u = 2 2 (+S) (1.6) x2 c t wobei hierbei das Verschiebungsfeld u Gegenstand der Untersuchung ist. In unserer vorliegenden Problemstellung, wird allerdings die Ausbreitung einer Kompressionswelle untersucht, sodass anstelle des Verschiebungsfeldes das Druckfeld p betrachtet wird. Das Lsen der Wellengleichung bedeutet also nichts anderes, als das sich ausbreitende Druckfeld zu einer bestimmten Zeit in einem zweidimensionalen Feld zu berechnen. Hierfr gehen wir weiter von einem homogenen Impulstrger aus, wodurch die Wellengleichung als eine Dierentialgleichung zweiter Ordnung dargestellt wird: 2p 2p 2p = c2 ( 2 + 2 ) + S t2 x z (1.7)
Das Druckfeld wird hierbei durch p=p(x,z,t), die Ausbreitungsgeschwindigkeit der akkustischen Wellen durch c=c(x,z) gegeben. S=(x,z,t) ist der Quellterm der Welle und simuliert eine zweidimensionale und radiale Punktquelle. Hierbei wird das Achsensystem horizontal bzw. vertikal durch x und z aufgespannt, wobei Quellterm und Druckfeld von der Zeit t abhngen.
(1.10)
und
n n pn 2p i,k+1 2pi,k + pi,k1 . z 2 (z)2
(1.11)
(x)2
(z)2
n + Si,k .
(1.12)
n Hierbei ist ci,k die Ausbreitungsgeschwindigkeit der Welle und Si,k unser zeitabhngiger Quellterm. Wie man auf der linken Seite der Gleichung (1.12) sehen kann, beinhaltet die Gleichung Druckfelder zu drei aufeinanderfolgenden Zeitschritten (n + 1,n und n 1). Um nun das Druckfeld pn+1 zu erhalten, muss (1.12) nur noch umgestellt werden. i,k n n pn i+1,k 2pi,k + pi1,k n n pn i,k+1 2pi,k + pi,k1
pn+1 i,k
c2 i,k
(x)2
(z)2
n + Si,k
(1.13) Zwar wurde mit Hilfe der Approximation aus dem Anfangswertproblem zweiter Ordnung eine ausreichend genaue Lsung gefunden, allerdings ist es jetzt notwendig, dass zu Anfang p1 und p2 festgelegt werden, was in unserem Fall bedeutet, dass diese Null gesetzt i,k i,k n1 werden und der Impuls allein durch den Quellterm gegeben wird. Da so pn und pi,k i,k bereits fr jeden Raumpunkt (i, k) bekannt sind, kann pn+1 einfach bestimmt werden. i,k Die folgenden Zeitschritte werden also auf diese Weise rekursiv aus den vorhergehenden Werten berechnet.
2 Programm
2.1 Liste der Variablen und ihrer Bedeutung
In unserem Programm zur Bestimmung der numerischen Lsung der zweidimensionalen Wellengleichung verwenden wir die folgenden Variablen: Type integer,parameter integer,parameter integer integer integer integer integer integer real real real real real real real real,array(nx,nz) real,array(nx,nz) real,array(nx,nz) real,array(nx,nz) real,array(nx,nz) real,array(nx,nz) Name nx nz nt isx isz i k n dx dz dt c fmax t amx p pp c2 aux1 aux2 tmp Startwert 400 400 500 150 160 Bedeutung Anzahl von Gitterpunkten in X-Richtung Anzahl von Gitterpunkten in Z-Richtung Absolute Zahl der Zeitschritte X-Position der Quelle Z-Position der Quelle Zhlervariable X-Richtung Zhlervariable Z-Richtung Zhlervariable Durchlufe rumliche Diskretisierung in Metern in X-Richtung rumliche Diskretisierung in Metern in Z-Richtung Gre der Zeitschritte in Sekunden Wellenausbreitungsgeschwindigkeit in m/s Maximale Wellenfrequenz in Hz aktuelle Zeit Absolutbetrag des grten Drucks aktuelles Druckfeld vorheriges Druckfeld Wellenausbreitungsgeschwindigkeit Hilfsarray 1 Hilfsarray 2 Hilfsarray 3
2.2 Programmstruktur
Der Hauptprogrammteil ac2d ist folgendermaen aufgebaut: Programmanfang Deklaration der Variablen und Arrays nen der snapshots Datei Loop ber die Zeitschritte: Berechnung des nchsten Schrittes im Druckfeld(*) Fr alle 50 Zeitschritte: Maximum des Absolutwerts des Drucks berechnen und ausgeben Fr alle 25 Zeitschritte: Das gesamte Wellenfeld in die snapshots Datei schreiben Schlieen der snapshots Datei
(*) Das Druckfeld pn+1 wird durch Aufrufen der Unterprogramme dif x2d und dif z2d i,k wie folgt berechnet: Berechnung der Ableitung des Druckfelds p nach x (in allen Gitterpunkten) call difx2d(p,aux1,dx,nx,nz)
Berechnung der Ableitung des Druckfelds p nach z (in allen Gitterpunkten) call difz2d(p,aux2,dz,nx,nz)
Die resultierenden Arrays aux1 und aux2 addieren und in aux1 abspeichern Das Ergebnis mit c2 multiplizieren und wiederum in aux1 abspeichern Den Quellterm fwave(t,fmax) an Position (isx, isz) zu aux1 hinzufgen Mit der quadrierten Zeitschrittgre dt multiplizieren Zwei Mal das aktuelle Druckfeld p addieren und dann das vorherige Druckfeld pp subtrahieren Das Ergebnis nach pp schreiben Den Inhalt von p und pp vertauschen
program ac2d implicit none ! -- - - - - - - - - - - - - - - - - - - INTERFACE - - - - - - - - - - - - - - - - - - - - - interface subroutine difx2d (p , aux1 , dx , nx , nz ) integer :: nx , nz real :: dx real , dimension (: ,:) :: p , aux1 end subroutine difx2d subroutine difz2d (p , aux2 , dx , nx , nz ) integer :: nx , nz real :: dx real , dimension (: ,:) :: p , aux2 end subroutine difz2d function fwave (t , fmax ) real :: t , fmax end function fwave end interface ! -------------------------------------------------! - - - -- - - - - - - - - - - - - - - VARIABLEN - - - - - - - - - - - - - - - - - - - - - integer , parameter :: nx =400 , nz =400 ! total number of grid points in x /y - direction integer :: nt , isx , isz , i ,k , n real :: dx , dz , dt , c , fmax , t , amx real , dimension ( nx , nz ) :: p , pp , c2 , aux1 , aux2 , tmp
30 31 32 33 34 35 36 37 38 39 40
! total number of timesteps ! source position index in x - direction ! source postiion index in y - direction
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
dx = 2.5 dz = 2.5
dt = 0.0005 ! timestep size in seconds c = 1500 fmax = 100 ! ARRAYS do i =1 , nx do k =1 , nz p (i , k ) =0.0 ! pressure field pp (i , k ) =0.0 ! pressure field of previous timestep c2 (i , k ) = c * c ! acoustic velocities squared end do end do ! acoustic velocities in m / s ! maximum frequency of wavelet in Hz
! -------------------------------------------------! ------ -- -- - -- open snapshot file - - - - - - - - - - - - - - - - - - open (25 , file = snapshots , form = unformatted )
! -- - - - - - - - - - - - - - - - - - - MAIN LOOP - - - - - - - - - - - - - - - - - - - - do n =1 , nt t = dt * n ! ------ ---- -- SOLVE EQUATION - - - - - - - - - - - - - - - - - - - - - call difx2d (p , aux1 , dx , nx , nz ) ! derivative of p in x call difz2d (p , aux2 , dx , nx , nz ) ! derivative of p in z ! add aux1 and aux2 in aux1 aux1 = aux1 + aux2 ! multiply with c2 aux1 = aux1 * c2 ! add source term fwave to aux1 at ( isx , isz ) aux1 ( isx , isz ) = aux1 ( isx , isz ) + fwave (t , fmax ) ! multiply squared timestep size dt
10
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
aux1 = aux1 * dt * dt ! add 2* p substract pp aux1 = aux1 + p +p - pp ! assign result to pp pp = aux1 ! swap p and pp tmp = pp pp = p p = tmp ! -------------------------------------------------! --------- PRINT AMX EVERY 50 STEPS - - - - - - - - - - - - - - - - if ( mod (n ,50) ==0) then amx = maxval ( p ) print * , amx end if ! --------- WRITE SNAPSHOT EVERY 25 STEPS - - - - - - - - - - - if ( mod (n ,25) ==0) then do i =1 , nx write (25) ( p (i , k ) , k =1 , nz ) end do end if
11
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
subroutine difx2d ( vin , vout , dx , nx , nz ) implicit none real , dimension (: ,:) , intent ( in ) :: vin real , dimension (: ,:) , intent ( out ) :: vout real :: dx integer :: i ,k , nx , nz do i =2 , nx -1 do k =1 , nz vout (i , k ) =( vin ( i +1 , k ) -2* vin (i , k ) + vin (i -1 , k ) ) /( dx **2) end do end do end subroutine difx2d Listing 2.2: difx2d.f90
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
subroutine difz2d ( vin , vout , dz , nx , nz ) implicit none real , dimension (: ,:) , intent ( in ) :: vin real , dimension (: ,:) , intent ( out ) :: vout real :: dz integer :: i ,k , nx , nz do i =1 , nx do k =2 , nz -1 vout (i , k ) =( vin (i , k +1) -2* vin (i , k ) + vin (i ,k -1) ) /( dz **2) end do end do end subroutine difz2d Listing 2.3: difz2d.f90
12
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
function fwave (t , fmax ) result ( res ) implicit none real , intent ( in ) :: t , fmax real :: agauss , tcut ,s , res , pi pi =4* atan (1.) agauss = fmax /2 tcut =3/(2* agauss ) s =( t - tcut ) * agauss
if ( abs ( s ) < 4.) then res = exp (( -2) * s **2) * cos (2* pi * s ) else res =0 end if end function fwave Listing 2.4: fwave.f90
und linken sie dann zu einer ausfhrbaren Datei ac2d.x: f95 -fast ac2d.o difx2d.o difz2d.o fwave.o -o ac2d.x Die -fast Option optimiert den Code und sorgt damit fr eine bessere Performance bei der Ausfhrung des Programms. Ausgefhrt wird das Programm mittels: ./ac2d.x
13
Die Experimente werden in folgender Reihenfolge dargestellt und diskutiert: 1. Variation der Wellenfrequenz 2. Simulierung einer Grenzschicht durch Variation der Wellenausbreitungsgeschwindigkeit c 3. Stabilitt des Algorithmus 4. Dnne Schichten
14
Abbildung 3.1: Gegenberstellung des Versuches mit Frequenzen von 100 Hz (l.) und 200 Hz (r.)
15
Hier noch einmal eine Detailansicht, in der die Abnahme von bei f = 200Hz im Vergleich zu f = 100Hz sehr gut zu erkennen ist:
16
gilt. Einfalls- und Reektionswinkel sind hierbei durch 1 gegeben, 2 entspricht dem Brechungswinkel. cA und cB entsprechen den Kompressionswellengeschwindigkeiten im Medium A und B. Folglich gilt fr eine einfallende Welle aus einem Medium geringer Dichte in ein Medium grerer Dichte, dass die gebrochene Welle vom Lot weggebrochen wird, wohingegen eine Welle, welche von einem dichteren Medium auf eines geringerer Dichte fllt, zum Lot hingebrochen wird. Im Versuch simulieren wir eine Schichtgrenze in einer Tiefe von Z = 450 Metern, indem wir unseren Programmcode in Fortran erweitern: do i=1,nx do k=180,nz c2(i,k)=3000*3000 end do end do Somit haben wir im oberen Bereich des Modellraumes eine Kompressionswellengeschwindigkeit von 1500 m und darunter 3000 m . Folglich ist die Dichte ab einer Tiefe s s von 450m geringer und die eintreenden Wellenfronten brechen vom Lot weg. Zu beachten ist, dass in den Abbildungen die waagerechte Achse die Z-Achse darstellt. Die Schichtgrenze verluft also vertikal. Wir knnen nun kontrollieren, ob unser Modell das Phnomen der Brechung und Reexion korrekt bercksichtigt. Ebenso knnen wir die Energieerhaltung berprfen, indem wir schaun, ob die Druckextrema mit der Zeit abnehmen.
17
Abbildung 3.4: Grenzschicht in 450 Metern Tiefe In den Snapshots des Versuchdurchlaufs ist zu erkennen, dass sich die Grenzschicht in einer Tiefe von Z = 450m bendet und hier sowohl Wellenreexion als auch -brechung stattnden. Der Satz der Energieerhaltung ist hierbei in unserem Modell erfllt. Dies ist duch eine Abnahme der Amplitudenintensitt zu erkennen.
18
Abbildung 3.5: Die Amplitude der Wellen nimmt mit der Entfernung von der Quelle ab. Die Energieerhaltung ist gegeben. Erreicht die Wellenfront mit fortschreitender Zeit den Rand des Versuchsfeldes, so wird diese dort reektiert, sodass Interferenzmuster entstehen. Somit ist auch dieses Wellenphnomen in unserem Modell bercksichtigt:
19
(3.3)
Hierbei ist cmax die maximale Kompressionswellengeschwindigkeit im gesamten System und = x = z. n entspricht der Dimension des Problems; in unserem Fall gilt also n = 2. Um den Grenzfall des Modells zu demonstrieren, erhhen wir die Zeitschrittgre t auf 0.00118 Sekunden. Die Ausbreitungsgeschwindigkeit ist C = 1500 m , die Frequenz bleibt s bei f = 100Hz. Fr ausgewhlte Zeitschritte t erhalten wir:
20
Wie an den Snapshots der Welle zu sehen ist, verlieren wir durch dies Grenzwertbetrachtung den Bezug zur Realitt. Die sich normalerweise radial ausbreitenden Wellenfronten werden rechteckig und verschwinden mit zunehmender Zeit sogar komplett.
21
22
Abbildung 3.8: cA=1500 m ,cB=1000 m ,f=10Hz,=100m, Abbildung 3.9: cA=1500 m ,cB=2500 m ,f=10Hz,=250m, s s s s d=2,5m d=2,5m
23
Unix
Der erste Vorlesungsblock beinhaltete eine kurze und prgnante Einfhrung in das Betriebssystem Unix, was fr viele neu und teilweise eine groe Umstellung war, gerade weil die grasche Oberche bei vielen Programmen komplett fehlt. Nichtsdestotrotz halten wir die Einfhrung als sehr gelungen, da bungsaufgaben selbststndig bearbeitet werden konnten und wir dadurch selbststndiger arbeiten konnten.
24
Fortran 95
Da es sich fr die meisten von uns beim Programmieren um Neuland handelte, war die Einfhrung in Fortran der erste Kontakt in die Welt der Do-und If-Schleifen. Dadurch war es ntig das Ganze etwas ausfhrlicher als die Unix Vorlesung zu behandeln, nicht zuletzt deswegen, da sich Programmiersprachen sehr hneln und durch eine solide Basis neue Sprachen leichter gelernt werden knnen. Desweiteren wurde hierbei der Grundstein fr die Semesterarbeit gelegt. Nichtsdestotrotz erschien die Vorlesung oft als langwierig und teilweise schleppend, da das Skript schritt fr Schritt durchgearbeitet wurde und viele kleine Teilaufgaben das ganze in die Lnge zogen. Oftmals rutschte das eigenstndige Ausprobieren zu sehr in den Hintergrund und viele bungsaufgaben unterschieden sich lediglich geringfgig. Grere Aufgaben, bei denen mehr Zeit zum selbstausprobieren bleibt, htten das ganze, vor allem gegen Ende der Einheit kurzweiliger gemacht. Diese sollten dann auch etwas freier gestaltet sein. In der bisherigen Form lernt man zwar formal in Fortran zu programmieren, da aber der Groteil des essentiellen Programmcodes bereits vorgegeben war, wurde wenig gelernt, wie an ein programmiertechnisches Problem herangegangen werden muss. Die Leistung zur Programmierung der Semesterarbeit beschrnkte sich lediglich auf Abschreiben und Ergnzen von Formalien wie Interfaces und Variableninitialisierung.
A LTEX
Die Einfhrung in Latex halten wir fr sehr gelungen, da es deutlich bersichtlicher als Fortran ist. Dies liegt allerdings weniger an der Vorlesung, sondern eher an der Tatsache, dass wir schon langsam einen berblick ber das Ganze erhalten hatten und der Knstlerischen Freiheit beim Erstellen von Formeln und Tabellen weniger Grenzen gesetzt sind. Gerade fr uns Naturwissenschaftler ist die Einfhrung in dieses Programm sehr willkommen und entwickelte sich in letzter Zeit immer mehr als Programm erster Wahl wenn es um das Schreiben von Arbeiten oder Texten ging. Durch die groe Popularitt des Programmes, ist es fr Anfnger wie uns, einfach Texte von simpel bis kompliziert zu erstellen. Gerade durch die Alltagspraktikabilitt ist es deutlich attraktiver sich in das Programm eigenstndig einzuarbeiten, sodass wir die Stundenanzahl und Vorlesung als ausreichend und gut halten.
Matlab
Matlab ist unserer Meinung nach die komplexeste Blockveranstaltung in der Vorlesung Datenverarbeitung gewesen, weswegen drei Wochen schlicht und einfach zu wenig fr dieses Programm sind. Da sich die Einfhrung mehr oder weniger auf das plotten von Graphen beschrnkt hat, ist es nicht mglich gewesen in der kurzen Zeit einen Gesamteindruck ber das Programm zu bekommen.
25
Wie oben erwhnt, halten wir es fr wichtiger das Spektrum von Matlab kennenzulernen als Befehle und vorgefertigte Programme auszufhren um darin Zahlenwerte zu ndern. Zwar wurde uns dadurch das notwndige Know-How fr die Semestrarbeit serviert, allerdings ist es uns so nicht mglich dies auf andere Problemstellungen zu transferieren. So bleibt fr uns das Gefhl, gerade einmal an der Oberche des Programms herumgekratzt zu haben.
26