einführung in fortran 77 wissenschaftliche...
TRANSCRIPT
1
computational geodynamics Goethe University of Frankfurt
Einführung in wissenschaftliche Programmiersprachen mit Geo-Anwendungen (GeoNumerik)
Do 9 ct – 11:45 in Geowiss-GW 2.106 = Linux-Pool IH. Wallner [email protected]: http://user.uni-frankfurt.de/~wallner/Geonumerik
7. Tag Plan
Aufgabe “alle Fortran 77 Befehle” testenDyke Abkühlung Analytische Lösung Finite Differenzen 1D (?)
computational geodynamics Goethe University of Frankfurt
Ffm, 13. Juni 2013
2
computational geodynamics Goethe University of Frankfurt
Aufgabe (letzte Woche)
Ein Fortran-Programm schreiben, in dem alle (nicht veralteten) Schlüsselwörter benutzt werden und die ihre Verwendung demonstrieren.
FORTRAN 77
3
computational geodynamics Goethe University of Frankfurt
c23456 PROGRAM all77 IMPLICIT LOGICAL(L) PARAMETER (MTDIM=20) INTEGER fall CHARACTER*72 text DIMENSION text(MTDIM) DATA text/ 1'Kopf: PROGRAM prgn, FUNCTION fktn(), SUBROUTINE sbrn()', 2'Aufruf: fktn(), CALL sbrn(), ??ENTRY esbrn()', 3'Ende: RETURN, STOP, END', 4'Deklaration: IMPLICIT, IMPLICIT NONE', 5' INTEGER, REAL, DOUBLE PRECISION, COMPLEX, LOGICAL, CHARACTER', 6' DIMENSION, ?COMMON, ??EQUIVALENCE', 7' PARAMETER, EXTERNAL, INTRINSIC, SAVE, DATA, ?BLOCK DATA', 8'Kontrolle: GOTO mn1', 9' ?GOTO (mn1,mn2,mn3), n123', f' ??GOTO mnvariable,(mn1,mn2,mn3)', 1' ??GOTO mnvariable', 2' ??ASSIGN mn TO mnvariable', 3' IF(logaus) statement', 4' IF(logaus) THEN ... ELSE ... ENDIF', 5' ?IF (numaus) mn1,mn2,mn3', 6' CONTINUE, ??PAUSE', 7' DO mndo i=ia,ie,ink ... mndo, DO i=ia,ie ... ENDDO', 8'I/O: OPEN, CLOSE, INQUIRE', 9' READ, WRITE, PRINT', f' REWIND BACKSPACE ENDFILE FORMAT'/ PRINT *,'Liste aller FORTRAN77 Keywords:' PRINT '(5X,A)',text
FORTRAN 77
c23456 L=.FALSE. PRINT '(/X,A)','Demo GOTO und IF in DO' DO 101 I=-1,7 PRINT 901,I 901 FORMAT(' DO mit',I3) 902 FORMAT(' GOTO-Marke ',I3,' angesprungen.') GOTO (11,12,13), I PRINT *,' I < 1 | I > 3 =>GOTO 14' GOTO 14 11 PRINT 902,11 GOTO 101 12 PRINT 902,12 GOTO 101 13 PRINT 902,13 GOTO 101 14 PRINT 902,14 IF (I) 21,22,23 PRINT *,' nach IF(I) 21,22,23' 21 PRINT 902,21 GOTO 101 22 PRINT 902,22 GOTO 101 23 PRINT 902,23 24 PRINT 902,24 IF (I.EQ.5) PRINT *,' I ist 5 und logisches L =',L IF (I.EQ.6) THEN L=.TRUE. END IF IF (I.EQ.6) PRINT *,' L ist ',L IF (I<6) GOTO 101 IF (I<7) THEN PRINT *,' IF(I<7) THEN - Fall' ELSE PRINT *,' IF(I<7) ELSE - Fall' END IF PRINT *,' vor CONTINUE' 101 CONTINUE
Nicht auf der
Geonumerik “side”.
4
computational geodynamics Goethe University of Frankfurt
c23456 PRINT '(/X,A)','Demo Unterprogramme' DO 201 fall=1,15 CALL uprg(fall) 201 PRINT *,' Nach CALL uprg fall =',fall 1 PRINT *,' SAVE ist aktiv.'
PRINT '(/X,A)','Demo Common' DO 301 fall=1,3 PRINT *,'-FALL',fall CALL ucom1(fall) a=ucomaus(1) CALL ucom2(fall,4) a=ucomaus(1) a=ucomaus(2) 301 PRINT *,' ----'
PRINT '(/X,A)','Demo I/O' CALL rw
STOP 'all77' END INTEGER FUNCTION fktr6(k) fktr6=6 PRINT *,' fktr6 always retruns 6' END FUNCTION trigfkt(fn,arg) trigfkt=fn(arg) END FUNCTION proztest(fn,v) proztest=fn(v) END FUNCTION doppel(v) doppel=2*v END FUNCTION halb(v) halb=v*0.5 END
FORTRAN 77
c23456 SUBROUTINE uprg(flag) INTEGER flag INTEGER fktr6 INTRINSIC sin, cos EXTERNAL doppel, halb inkfkt(k)=k+1 PRINT *,' Aufruf UPRG Fall',flag IF (flag==2) flag=inkfkt(flag) IF (flag<2) RETURN IF (flag==4) flag=fktr6(flag) IF (flag<1) STOP 'uprg'c ab 7 keine Veränderung von flag
PI=4.*ATAN(1.) a=30.*PI/180. IF (flag==7) r=trigfkt(sin,a) IF (flag==8) r=trigfkt(cos,a) IF (flag>6 .AND. flag<9) PRINT *,' trifkt(sin/cos,',a,') =',r
IF (flag==9) r=proztest(doppel,flag) IF (flag==10) r=proztest(halb,flag) a=flag IF (flag==9) r=proztest(doppel,a) IF (flag==10) r=proztest(halb,a) IF (flag>8 .AND. flag<11) * PRINT *,' proztest(doppel/halb,a=',flag,') =',r IF (flag>10) THEN i=0 IF (flag>13) i=1 r=forget(a,i) PRINT *,' forget(',a,',',i,') =>',r END IF
c STOP 'uprg' END
c23456 FUNCTION forget(v,i) DATA alt/0./ if(i==1) alt=0. m01=MOD(int(i),2) IF(m01==0) alt=1. forget=v*alt END
SUBROUTINE ucom1(flag) INTEGER flag CHARACTER SUBT1*16 COMMON KOMMUN,PIF(3),SUBT1 SUBT1='SUBROUTINE ucom1' PRINT *,'CALL of ',SUBT1 KOMMUN=flag IF (flag<2) RETURN DO I=1,3 PIF(I)=I*3.1415 END DO END
SUBROUTINE ucom2(flag,n) INTEGER flag CHARACTER SUBT2*16 DIMENSION PIF(8) COMMON KOMMUN,PIF,SUBT2 SUBT2='SUBROUTINE ucom2' PRINT *,'CALL of ',SUBT2 KOMMUN=flag IF (flag<2) RETURN PIF(4)=n*3.1415 IF (flag<3) RETURN DO 10 I=5,8 10 PIF(I)=-I END
5
computational geodynamics Goethe University of Frankfurt
FORTRAN 77
c23456 FUNCTION ucomaus(flag) INTEGER flag CHARACTER*16 SUBT1,SUBT2 REAL ALT(8),DUM(2) COMMON KOMMUN,PIF(3),SUBT1 EQUIVALENCE (PIF,ALT) EQUIVALENCE (ALT(8),DUM),(DUM(2),SUBT2) PRINT 1000,flag IF (flag==1) THEN PRINT 1001,SUBT1 PRINT 1002,KOMMUN,PIF RETURN END IF IF (flag==2) THEN PRINT 1003,SUBT2 PRINT 1002,KOMMUN,ALT RETURN END IF 1000 FORMAT(' Ausgabe flag',I3) 1001 FORMAT(' SUBT1:"',A,'"') 1002 FORMAT(' KOMMUN =',I2/(' PIF ',F12.5)) 1003 FORMAT(' SUBT2:"',A,'"') END
c23456 SUBROUTINE rw IMPLICIT LOGICAL(L) INTEGER wlun, rlun CHARACTER*16 fn PRINT *,'... in rw :' fn='IOfile77.txt' INQUIRE(FILE=fn,EXIST=lex) IF(.NOT.lex) PRINT *,'File ',fn,' nicht gefunden.'c IF(lex) PRINT *,'File ',FN,' existiert: STOP.'c IF(lex) STOP 'rw' IF(lex) PRINT *,'File ',fn,' wird überschrieben.'
nb=wlun(13,fn) IF (nb.NE.0) STOP 'Schreibfehler' PRINT *,'File geschreiben.'
PRINT *,fn(1:LEN_TRIM(fn)),' lesen:' nb=rlun(21,fn) IF (nb.LT.0) STOP 'Lesefehler' PRINT *,nb,' Zeilen gelesen und gelöscht.'
fn='IOfile77.bin' PRINT *,' Unformattiers File ',fn nb=wbin(14,fn) IF (nb.LT.0) STOP 'Schreibfehler' PRINT *,nb,' Rekords geschreiben.'
PRINT *,fn(1:LEN_TRIM(fn)),' lesen:' nb=rbin(15,fn) IF (nb.LT.0) STOP 'Lesefehler' PRINT *,nb,' Zeilen gelesen und gelöscht.'
END
c23456 INTEGER FUNCTION wlun(lun,fn) CHARACTER*(*) fn OPEN(lun,FILE=fn) WRITE(lun,1001) fn,lun 1001 FORMAT('Ich bin File ',A,' und war Unit',I3,'.') WRITE(lun,1002) (i,i=11,15) 1002 FORMAT(16I5) CLOSE(lun) wlun=0 END
INTEGER FUNCTION rlun(lun,fn) CHARACTER*(*) fn CHARACTER*256 line rlun=0 OPEN(lun,FILE=fn,ERR=3,STATUS='OLD') 1 READ(lun,1001,END=2) line 1001 FORMAT(A) WRITE(6,1001) line(1:LEN_TRIM(line)) rlun=rlun+1 GOTO 1 2 CLOSE(lun,STATUS='DELETE') RETURN 3 rlun=-1 END
6
computational geodynamics Goethe University of Frankfurt
Abkühlung eines Dikes
Basaltisches Magma eruptiert in einer langen Spalte und erstarrt nach einiger Zeit. Das Abkühlverhalten soll modelliert werden.
7
computational geodynamics Goethe University of Frankfurt
Abkühlung eines Dikes
Basaltisches Magma eruptiert in einer langen Spalte und erstarrt nach einiger Zeit. Das Abkühlverhalten soll modelliert werden.Unser erstes Modell sollte einigermaßen einfach sein, damit wir zuviel Physik lernen müssen und damit einhergehend mehr Mathematik und schließlich sollte der Programmieraufwand im Kurs machbar sein.
Ship Rock 8
computational geodynamics Goethe University of Frankfurt
Abkühlung eines Dikes
Basaltisches Magma eruptiert in einer langen Spalte und erstarrt nach einiger Zeit. Das Abkühlverhalten soll modelliert werden.Unser erstes Modell sollte einigermaßen einfach sein, damit wir zuviel Physik lernen müssen und damit einhergehend mehr Mathematik und schließlich sollte der Programmieraufwand im Kurs machbar sein. Vereinfachungen
Geometrie, Struktur:lang erstreckte und tief reichender Gang realtiv zu seiner konstanten Breite 1D - Problemx=0 in Gangmitte symmetrische, nur x ≥ 0
9
computational geodynamics Goethe University of Frankfurt
Abkühlung eines Dikes
Basaltisches Magma eruptiert in einer langen Spalte und erstarrt nach einiger Zeit. Das Abkühlverhalten soll modelliert werden.Unser erstes Modell sollte einigermaßen einfach sein, damit wir zuviel Physik lernen müssen und damit einhergehend mehr Mathematik und schließlich sollte der Programmieraufwand im Kurs machbar sein. Vereinfachungen
Geometrie, Struktur:lang erstreckte und tief reichender Gang realtiv zu seiner konstanten Breite 1D - Problemx=0 in Gangmitte symmetrische, nur x ≥ 0
10
computational geodynamics Goethe University of Frankfurt
Abkühlung eines Dikes
Basaltisches Magma eruptiert in einer langen Spalte und erstarrt nach einiger Zeit. Das Abkühlverhalten soll modelliert werden.Unser erstes Modell sollte einigermaßen einfach sein, damit wir zuviel Physik lernen müssen und damit einhergehend mehr Mathematik und schließlich sollte der Programmieraufwand im Kurs machbar sein. Vereinfachungen
Geometrie, Struktur:lang erstreckte und tief reichender Gang realtiv zu seiner konstanten Breite 1D - Problemx=0 in Gangmitte symmetrische, nur x ≥ 0
Material: Parameter unterscheiden sich wenig relativ anderen Größen,z.B. Diche maximal 30%, Wärmeleitfähigkeit höchstens Faktor 2homogen und isotrop (nur 1D)
Phasen: Gerade erstarrt: fest, keine Schmelze mehr, nur eine Phase
11
computational geodynamics Goethe University of Frankfurt
Abkühlung eines Dikes
Wärmetransport in der ErdeStrahlungKonduktion, WärmeleitungKonvektion
∆
12
computational geodynamics Goethe University of Frankfurt
Abkühlung eines Dikes
Wärmetransport in der ErdeStrahlungKonduktion, WärmeleitungKonvektion
Wärmeleitunggewöhnliche Differentialgleichung 1. OrdnungDiffusion : Fourier's 1. Gesetz
q = - k grad T oder q = -k T
q – Wärmeflussdichte [ W/m2 ], T – Temperatur [ K, °C ]k – Wärmeleitfähigkeit [ W/m/K ] (temperature conductivity)κ – Temperaturleitfähigkeit [ m2/s ] (temperature diffusivity) κ = k / ρ /cP
ρ – Dichte [ kg/m3 ]cP – Wärmekapazität [ J/m3/K ]
∆
13
computational geodynamics Goethe University of Frankfurt
Abkühlung eines Dikes
Analytische Lösung der Wärmeleitung für einen Dike
T(x,t) = T0 + (TD – T0) ( erf( (D+x)/(4 κ t)1/2 ) + erf( (D-x)/(4 κ t)1/2 ) )mitTD – Temperatur des Dikes
T0 – Temperatur der Umgebung
D – halbe Breite des Dikes [m]x – Ort [m]t – Zeit [s]κ – Temperaturleitfähigkeit [ m2/s ]erf(x) – Errorfunction, Gauß'sche Fehlerfunktion
typische Materialwerte für Basalt:k – 1.3 – 2.9 W/m/K Schmelztemperatur ca. 1000°Cρ – 2950 kg/m3 an der ErdoberflächecP – 2.3 – 3.6 MJ/m3/K Breite im Meterbereich
14
computational geodynamics Goethe University of Frankfurt
Abkühlung eines Dikes
Analytische Lösung der Wärmeleitung für einen Dike
T(x,t) = T0 + (TD – T0) ( erf( (D+x)/(4 κ t)1/2 ) + erf( (D-x)/(4 κ t)1/2 ) )
mitTD – Temperatur des Dikes
T0 – Temperatur der Umgebung
D – halbe Breite des Dikes [m]t - Zeit [s]κ – Temperaturleitfähigkeit [ m2/s ]erf(x) – Errorfunction, Gauß'sche Fehlerfunktion
typische Materialwerte für Basalt:k – 1.3 – 2.9 W/m/K Schmelztemperatur ca. 1000°Cρ – 2950 kg/m3 an der ErdoberflächecP – 2.3 – 3.6 MJ/m3/K Breite im MeterbereichDo
it
15
computational geodynamics Goethe University of Frankfurt
Abkühlung eines Dikes
Analytische Lösung der Wärmeleitung für einen Dike
T(x,t) = T0 + (TD – T0) ( erf( (D+x)/(4 κ t)1/2 ) + erf( (D-x)/(4 κ t)1/2 ) )
Plot mitMatlab :
16
computational geodynamics Goethe University of Frankfurt
Begonnenes Dikeprogramm fertigschreibe und erweitern (Fortran zum Berechnen und Matlab zum Plotten).
(Zur Hilfe wird meine Aufgabenlösung bald downloadbar sein. )Dikeprogramm dann erweitern:Zeitlicher Verlauf interessanter Punkte, Gangmitte, Kontakt, im Abstand von 3 Dikebreiten, berechnen und plotten.
( Geplant: Lava fließt an der Oberfläche aus und bildet eine Flutbasaltdecke. Wie verhält sich die Temperatur auf einem Tiefenprofil ?Lösung suchen, programmieren, plotten. )
Aufgabe