L4 Fortran95-Parametrisierte Datentypen Parametrisierung vordefinierter Datentypen • Normalerweise gewöhnliche Datentypen verwenden ! • Erst seit Fortran 90 – Schwierige Realisierung auf Hardware • Größere/geringere Genauigkeit • Größerer/kleinerer Wertebereich • Rechengeschwindigkeit (Wettervorhersage) Festlegung durch Deklaration mit KIND= INTEGER(KIND=4) :: i1, jeti REAL (KIND=2) :: r1, epsilon ! Es ist nicht sicher dass es ! INTEGER mit KIND=4 gibt ! oder REAL mit KIND=2 gibt allgemein: KIND=integer_zahl (aber welche ?) Zu jedem KIND gehört das richtige Literal !! INTEGER, PARAMETER :: m=2 INTEGER(KIND=m) :: iso iso=15_2 ! Zahl 15 , KIND=2 iso=15_m ! Zahl 15 , m muss ein INTEGER, PARAMETER sein (m=2) 1 L4 Fortran95-Parametrisierte Datentypen INTEGER parametrisiert PROGRAM parametrisierte_Datentypen ! erstmal INTEGER ! Nur ganz erlesene Funktionen duerfen in den Deklarationsteil ! der SIN z.B NICHT INTEGER,PARAMETER :: short=SELECTED_INT_KIND(R=2) ! von -10**R bis 10**R INTEGER,PARAMETER :: medium=SELECTED_INT_KIND(R=4) INTEGER,PARAMETER :: long=SELECTED_INT_KIND(R=10) INTEGER,PARAMETER :: vlong=SELECTED_INT_KIND(R=100) ! jetzt werden diese integers benutzt um zu deklarieren ! ohne eine Ziffer zu verwenden, so ist es portabel INTEGER :: normal INTEGER(KIND=short) INTEGER(KIND=medium) INTEGER(KIND=long) INTEGER(KIND=vlong) ! :: :: :: :: welches KIND= entspricht dem ? klein mittel gross sehrgross mittel=INT(91,KIND=medium); mittel=91_medium klein=1000_short ! absurder FEHLER intyp=INT(91,KIND=NTYP) ! Zuweisungen ! 91 ohne Verlust (oder Gewinn) PRINT*,"KIND(normal)=",KIND(normal) PRINT*,"RANGE(normal)=",RANGE(normal) PRINT*,"KIND(mittel)=",KIND(mittel) PRINT*,"RANGE(mittel)=",RANGE(mittel) END 2 L4 Fortran95-Parametrisierte Datentypen REAL parametrisiert INTEGER,PARAMETER :: P=12; R=99 INTEGER, PARAMETER :: genau=SELECTED_REAL_KIND(P,R) • P (integer) gültige Stellen • R (integer) Exponentenbereich [10−R , 10R ] • liefert Typ der P und R am knappsten erfüllt • genau=negativ falls nicht möglich • Literale: 127.832942602E-98_genau .5_genau ltyp=KIND (1.) ! Typparameterwert REAL-Typ ltyp=KIND (1D0) ! Typparameterwert DOUBLE-PRECISION ltyp=KIND (1._genau) ! Wert der Konstanten genau ndigits=PRECISION (1._genau) ! gueltige Stellen ! (Resultat >= 12) nrange =RANGE (1._genau) ! Exponentenbereich ! (Resultat >=99) Mischung unterschiedlicher Typen → MixedTypes.f90 Mächtige Abfragefunktionen in Fortran 90/95 PROGRAM REALS ! ! was leistet der Datentyp REAL(KIND=?) ! REAL (KIND=2) :: r ! man versuche 1,2,3,4,5,6,7,8 PRINT*,"kleinste positive Modellzahl: PRINT*,"groesste Modellzahl: PRINT*,"Dezimalstellen: PRINT*,"Exponentenbereich: PRINT*,"relative Maschinengenauigkeit: ", ", ", ", ", TINY ( HUGE ( PRECISION( RANGE ( EPSILON ( r r r r r ) ) ) ) ) END PROGRAM REALS Rounded numbers are always false. Samuel Johnson 3 L4 Fortran95-Parametrisierte Datentypen COMPLEX • Wenn in einem Literal sowohl Real- als auch Imaginärteil vom Typ INTEGER sind, ist der Typparameterwert der COMPLEX-Größe gleich dem des gewöhnlichen REAL(!!!)-Typs • Falls ein Teil vom Typ REAL und der andere vom Typ INTEGER ist, so hat die COMPLEX–Größe den Typparameterwert des REAL-Teils. • Sind beide Teile vom Typ REAL (evtl. mit KIND=), dann bestimmt die Komponente mit der größeren Dezimalauflösung den Typparameterwert. • Haben beide Komponenten gleiche Dezimalauflösung, aber verschiedene Typparameterwerte, so ist der Typparameterwert der COMPLEX-Größe der größere der Typparameterwerte der Teile. Die Abfragefunktionen KIND, PRECISION und RANGE sind auch auf COMPLEX–Größen anwendbar! 4 L4 Fortran95-Parametrisierte Datentypen Hausaufgabe: Übung mit komplexen Zahlen. Die Lösung des Gleichungssystemses für die Trägheitsschwingung eines Luftpaketes mit Dämpfung (r > 0). ∂u − f v = −ru ∂t ∂v + f u = −rv ∂t lässt sich (komplex) schreiben als (u + iv) = (u0 + iv0 ) exp(−rt) exp(if t). √ Hier ist i = −1. Die (reellen) Geschwindigkeitskomponenten u und v und der Betrag der komplexen Geschwindigkeit |u + iv| sollen jede Stunde (t =0 bis 48 Stunden) ausgedruckt werden. Es sei der Coriolisparameter f = 10−4 s−1. Die Anfangsgeschwindigkeiten (t = 0) seien u0 = 5 ms−1, v0 = 0. 1 Die Dämpfung (Reibung) sei r = 24h . Zusatz: Die selbe Aufgabe für r = 0. 5