Literaturempfehlung: Vorlesungsskript von Heidrun Kolinsky zu FORTRAN 90/95: http://www.rz.uni-bayreuth.de/lehre/fortran90/vorlesung/index.html Schmitt, Günter (1996): Fortran 90 Kurs technisch orientiert, R. Oldenbourg Verlag, München Brainerd, W., C. Goldberg and J. Adams (1996): Programme s Guide to Fortran 90, Springer Verlag
EINFÜHRUNG program hallo Programmcode (Quellcode) character(len=50) :: input write(*,*)'bitte Namen eingeben:' read(*,*)input write(*,*)'hallo ',input end program hallo Compilieren Umwandlung des Programmcode in Binärcode (vom Computer lesbar). Ausführen evtl. Eingabedaten read(*,*)input Ausgabedaten write(*,*) Hallo,input WS 2006/07 1
DIE PROGRAMMSTRUKTUR Ein Fortran Programm besteht aus vier Programmteilen: Programmkopf Deklarationsteil Anweisungsteil Programmende program hallo character(len=50) :: input write(*,*) Bitte Namen eingeben: read(*,*)input write(*,*) Hallo,input end program hallo WS 2006/07 2
PROGRAMMKOPF UND ENDE Allgemeine Definition: program <Programmname> end program <Programmname> <Programmname> muss der Fortran Namenssyntax genügen. Fortran Namenssyntax: Ein Name darf in Fortran bis zu 31 Zeichen lang sein. Der Name muss mit einem Buchstaben beginnen. Für die auf das erste Zeichen folgenden Zeichen dürfen alle alphanumerischen Zeichen sowie Unterstriche verwendet werden. Groß- und Kleinschreibung kann eingesetzt werden, bleibt aber vom Compiler unberücksichtigt. Es dürfen keine Schlüsselwörter (z.b. program, integer, real, do, if, else,... ) verwendet werden. WS 2006/07 3
DEKLARATIONSTEIL Allgemeine Definition: Der Deklarationsteil besteht aus einer Reihe von Konstanten und Variablenvereinbarungen. Variablenvereinbarung: <Variablentyp> :: <Variable> Konstantenvereinbarung: parameter (<Variable>=<Variablenwert>,...) <Variable> muss der Fortran Namenssyntax genügen und im Programm eindeutig sein. WS 2006/07 4
Variablentypen und wertebereiche: Datentyp Erw. Erläuterung Wertebereich logical logische Werte.true.,.false. integer *1 ganze Zahlen 2 7 + 1 bis 2 7 1 *2 ganze Zahlen 2 15 + 1 bis 2 15 1 *3 ( ) ganze Zahlen 2 31 + 1 bis 2 31 1 real *4 ( ) reelle Zahlen 10 38,53 bis 10 38,53 *8 reelle Zahlen 10 308,25 bis 10 308,25 character ( ) einzelnes Zeichen alle möglichen Zeichen (LEN=x) Zeichenkette der Länge x alle möglichen Zeichen ( ) : Standardeinstellung; ohne Erweiterung gilt diese Einstellung. WS 2006/07 5
Die Bedeutung von implicit : In Fortran sind Variablen grundsätzlich als integer vordefiniert. Diese Definition führt jedoch häufig zu Programmierfehlern, da man sich während der Programmierung nicht immer dieser Vordefinition bewusst ist. Guter Programmierstil erfordert deshalb die Verwendung des Befehls implicit none. Durch diesen Befehl müssen alle benutzten Variablen explizit definiert werden. Es besteht allerdings auch die Möglichkeit, die Vordefinition von Variablen zu ändern. Dies geschieht mit dem Befehl implicit <Variablentyp> <Variablenbereich>. Beim <Variablenbereich> beschränkt man sich üblicherweise auf die Anfangsbuchstaben der Variablennamen. Beispiele: implicit real*8 (A-F) implicit character(len=20) (H-I,L-N) WS 2006/07 6
ANWEISUNGSTEIL Der Anweisungsteil ist eine strikte Aneinanderreihung von auszuführenden Befehlen. Dieses Vorgehen kann mit Hilfe von Flussdiagrammen modelliert werden. lese Zahl i ein (1) initialisiere j=1, summe=0 (2) summe=summe+j j=j+1 (2) ist j > i? nein (3) ja gebe summe aus (1) WS 2006/07 7
(1) Lesen und Schreiben Befehle: read(*,*)<variable> write(*,*)<variable> write(*,*) <Text> write(*, (f6.3) )<Variable> Liest den vom Benutzer einzugebenden Wert der <Variable> von der Konsole ein. Schreibt den Wert der <Variable> unformatiert auf die Konsole. Schreibt den eingegebenen <Text> auf die Konsole. Schreibt den Wert der <Variable> im Format f6.3 auf die Konsole. WS 2006/07 8
Formatierungsbefehle: i4 a7 Integerzahl mit maximal 4 Stellen. Character mit maximal 7 Stellen. f6.3 Realzahl mit insgesamt 6 Stellen (inkl. Trennzeichen) und 3 Nachkommastellen. 3x 3 Leerzeichen Mehrere Formatierungsbefehle hintereinander werden durch Kommas getrennt. Beispiel: Befehl: write(*, (a5,2x,2(f4.2,2x),a3,i2) ) Hallo,123.456,1.544, hallo,12 Ausgabe: Hallo--****--1.54--hAL12 WS 2006/07 9
(2) Wertzuweisungen Befehl: <Variable>=<Variablenwert> Der <Variablenwert> muss nicht unbedingt eine feste Zahl/Zeichenkette sein. Er kann sich genauso aus der Verknüpfung mehrerer anderer Variablen zusammensetzen. Beispiele: a=6 a=0.5*a+1 (nun hat a den Wert 4(=0.5*6+1) und nicht 2.) a=b+c c=exp(x)+c**2*sqrt(x) l=max(a,b)*sign(-3,1)/mod(9,5)+abs(l) WS 2006/07 10
program array implicit none integer :: a,j,g real*8 :: Cons(0:120,2005:2100,0:1) DO a=0,120! Alter DO j=2005,2100! Jahre DO g=0,1! Geschlecht 0=Mann; 1=Frau Cons(ia,ij,ig)=0.0D0 ENDDO ENDDO ENDDO! Gleichbedeutend mit obigen DO Schleifen waere: Cons=0.0D0! Die ganze Matrix wird auf Null gesetzt Cons(:,:,1)=2.0! Allen Frauen wird ein Konsum von! 2.0 zugewiesen. WS 2006/07 11
Cons(25:61,2005:2010,1)=2.5! Allen Frauen zwischen 25 und 61! in den Jahren 2005 bis 2010! wird ein Konsum von 2.5 zugewiesen. Cons(:,2011:2100,1)=3.0! Allen Frauen wird in den Jahren von! 2011 bis 2100 ein Konsum von 3.0! zugewiesen. write(*,*)cons(50,2008,:)! Der Konsum von 50jaehrigen Maennern! und Frauen im Jahr 2008 wird! auf den Bildschirm geschrieben. end program array WS 2006/07 12
(3) Kontrollstrukturen 1. Schleifen: Sollen Anweisungen mehrmals wiederholt werden, so lässt sich dies mit Hilfe einer do Schleife realisieren. Befehle: do <Laufindex>=<von>,<bis>(,<Schrittweite>) <Anweisungsblock> enddo Standardmäßig ist als Schrittweite 1 eingestellt. Beispiele: do i=2,6 write(*,*)i enddo do j=10,2,-2 write(*,*)j,j**2 enddo WS 2006/07 13
2. Verzweigungen: Sollen Anweisungen nur unter einer Bestimmten Bedingung ausgeführt werden, so können diese Anweisungen in ein if Statement geschrieben werden. Befehle: if(<bedingung1>)then <Anweisungsblock1> alternativ: if(<bedingung>)<anweisung> (elseif(<bedingung2>)then <Anweisungsblock2>) (else <Anweisungsblock3>) endif WS 2006/07 14
Beispiele: if(i.ge.0)then sign=1 else sign=-1 endif j=1 ; summe=0 do summe=summe+j ; j=j+1 if(j.gt.i)exit enddo WS 2006/07 15
FUNKTIONEN Funktionen dienen in FORTRAN zur Berechnung eines Wertes. An eine Funktion können mehrere Werte übergegeben werden, die zur Bestimmung des Funktionswerts benötigt werden. Befehl: <Variablentyp> function <Funktionsname>((<Variable1>,...)) <Variablendeklaration> <Werteberechnung> end function <Funktionsname> In der <Variablendeklaration> müssen alle eingegebenen Variablen deklariert werden. <Variablentyp> legt den Variablentyp des Rückgabewerts der Funktion fest. WS 2006/07 16
Beispiel: integer function summe(a,b) integer :: a,b summe=a+b end function summe real function logsumme(c,d) real :: c,d if(c.le.0.or.d.le.0)then write(*,*) logsumme nicht definiert else logsumme=log(c)+log(d) endif end function logsumme WS 2006/07 17
Beispiele für den Aufruf von Funtionen: integer :: wert1,wert2,erg1 real :: wert3,wert4,erg2 erg1=summe(3,6) erg2=logsumme(2.45,1.0) wert1=5 wert2=19 wert3=-1.45 wert4=4.67 erg1=summe(wert1,wert2) erg2=logsumme(wert3,wert4) WS 2006/07 18
SUBROUTINEN Mit Subroutinen können in FORTRAN Programmabschnitte definiert werden, die in einem Programm mehrmals in gleicher Form verwendet werden können. Auch hier ist die Übergabe von Variablen möglich. Eine Subroutine besitzt jedoch keinen Rückgabewert. Befehl: subroutine <Subroutinenname>((<Variable1>,...)) <Variablendeklaration> <Programmabschnitt> end subroutine <Subroutinenname> WS 2006/07 19
Beispiele: subroutine output(a) real*8 :: a write(*, (a14,1x,f8.3) ) Variablenwert:,a end subroutine output subroutine summen(a,b,c,d,summe,logsumme) integer :: a,b,summe real :: c,d,logsumme summe=a+b if(c.le.0.or.d.le.0)then write(*,*) logsumme nicht definiert else logsumme=log(c)+log(d) endif end subroutine summen WS 2006/07 20
Beispiele für den Aufruf von Subroutinen: real*8 :: wert integer :: wert1,wert2,erg1 real :: wert3,wert4,erg2 call output(23.126723) call summen(3,6,2.34,1.23,erg1,erg2) wert=121.2343 wert1=5 wert2=19 wert3=-1.45 wert4=4.67 call output(wert) call summen(wert1,wert2,wert3,wert4,erg1,erg2) WS 2006/07 21