Parametrisierung vordefinierter Datentypen

Werbung
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
Herunterladen