270 likes | 520 Views
Reelle Zahlen. Variablen, die grundsätzlich reelle Werte annehmen können oder in Ausdrücken erscheinen, die einen reelllen Wert liefern, sollten vom Typ REAL sein. Division ganzer Zahlen.
E N D
Reelle Zahlen • Variablen, die grundsätzlich reelle Werte annehmen können oder in Ausdrücken erscheinen, die einen reelllen Wert liefern, sollten vom Typ REAL sein.
Division ganzer Zahlen • Betrachte die Auswertung der Anweisung a = b*c/d, wobei b eine reelle Variable mit dem Wert 100.0 ist, während c und d ganze Zahlen mit den Werten 9 und 10 sind. • b*c wird zuerst ausgewertet, wobei c zunächst in den reellen Wert 9.0 umgewandelt wird. • Danach wird der Wert von d in seinen reellen Gegenwert umgewandelt, bevor die Division ausgeführt wird. Ellis et al. (1994), S. 48
Division ganzer Zahlen • Was passiert, wenn der Ausdruck in der folgenden, mathematisch gleichwertigen Form geschrieben worden wäre: a = c/d*b ? • In der ersten Operation sind beide Operanden ganze Zahlen, so dass der Unterausdruck c/d als ganzzahlige Operation ausgeführt wird. • Das mathematische Ergebnis (0.9) wird abgeschnitten und liefert ein Zwischenergebnis von Null. Ellis et al. (1994), S. 49
Literaturhinweis • Ellis, T.M.R., Phillips, Ivor R., and Lahey, Thomas M.: Fortran 90 Programming, Addison-Wesley Publishing Company, 1994. M. Schulz
Mathematical Operations Deg_C = 5.0 * (Deg_F 32.0) / 9.0 The expression on the RHS is evaluated and assigned to the REAL variable Deg_C * is the multiplication operator, is the subtraction operator, / is the division operator, ** is the exponentiation, and = is the assignment operator. M. Schulz
Important Built-In Functions ABS(x) Absolute value LOG(x) Natural logarithm LOG10(x) Base-10 logarithm EXP(x) Natural exponential SQRT(x) Square root SIN(x) Sine (x in radians!) COS(x) Cosine TAN(x) Tangent ASIN(x) Arcsine ACOS(x) Arccosine ATAN(x) Arctangent INT(x) Convert real to integer, truncation (7.8 7) NINT(x) Convert real to integer, rounding (7.8 8) REAL(i) Convert integer to real (1 1.0)
Unix-Tipp • Wenn das aktuelle Verzeichnis “.” nicht im Suchpfad enthalten ist, dann kann man ein Programm a.exe mit dem Befehl ./a.exe starten.
Tipps zur Fehlersuche • “PRINT”-Anweisungen einbauen, um den Wert bestimmter Variablen zu überprüfen • Spezielle Compileroptionen wählen, um zum Beispiel Feldbereichsüberschrei-tungen anzuzeigen
Fortran-Links • http://www.g95.org/ • http://www.g95.org/G95Manual.pdf • http://de.wikibooks.org/wiki/Fortran • http://de.wikibooks.org/wiki/Fortran:_Fortran_95 • http://de.wikibooks.org/wiki/Fortran:_G95
Energiebilanzmodell(Aufgabe 4) Projektübung Klimamodellierung (05-3034) – A. Paul
Punktmodell der Strahlungsbilanz (Stocker 2004, Abschnitt 2.2) Gewöhnliche, nichtlineare Differentialgleichung erster Ordnung für die unbekannte, zeitabhängige Variable T(t)
Gleichgewichtstemperatur des globalen Energiebilanzmodells: Die aus Messungen bestimmte mittlere Oberflächentemperatur beträgt 14°C (fett ausgezogen).
Eis-Albedo-Rückkopplung • Die Eis-Albedo-Rückkopplung soll durch folgende Abschätzung der Elbedo parameterisiert werden:
Diskretisierung t = n Dt, n=0,1,2,… T(t) in eine Taylorreihe entwickeln: Nach der ersten Ableitung auflösen: Euler-Schema
Ersetzen von Dt durch -Dtund addieren: Schema der zentrierten Differenzen
Das Euler-Verfahren ist das einfachste, aber auch ungenaueste Verfahren zur Lösung der gewöhnlichen Differentialgleichung erster Ordnung mit der Anfangsbedingung Im Fall des Energiebilanzmodells ist
Das Euler-Verfahren wertet die Ableitung nur an den Stellen x und x+Dx aus. • Dies entspricht der Linearisierung der langwelligen Ausstrahlung. • Genauere Verfahren vom Typ “Runge-Kutta k-ter Ordnung” verwenden weitere Stützstellen im Intervall [x, x+Dx]
Runge-Kutta-Verfahren k-ter Ordnung • Durch die Auswertung von f(x,y) an weiteren Stützstellen im Intervall [x, x+Dx] und eine geschickte Linearkombination kann der Fehler von O(Dx) auf O[(Dx)k] reduziert werden
Die Vorschrift für das klassische Runge-Kutta-Verfahren 4. Ordung lautet: Stocker (2004), S. 33
Parameterisierte REAL-Variablen • REAL-Variablen (reelle Zahlen) sind „parameterisiert“. • Der kind-Typparameter legt die Anforderungen an die minimale Genauigkeit und den Bereich des Exponenten fest.
! Parameter declarations ! Symbolic name for a real kind type with at least ! 15 decimal digits of precision and an exponent range ! from 10**300 to 10**(-300) (“double precision”) INTEGER, PARAMETER :: dp=SELECTED_REAL_KIND(P=15,R=300) ! Symbolic name for a real kind type with at least ! 6 decimal digits of precision and an exponent range ! from 10**30 to 10**(-30) (“single precision”) INTEGER, PARAMETER :: sp=SELECTED_REAL_KIND(P=6,R=30) ! Symbolic name for a default real kind type INTEGER, PARAMETER :: q=dp ! Variable declarations REAL(KIND=q) :: dpress REAL(KIND=q), DIMENSION(1:km) :: p
FUNCTION- und SUBROUTINE-Unterprogramme • FUNCTION-Unterprogramme berechnen einen einzigen Wert, der an der Aufrufstelle eingesetzt wird. • SUBROUTINE-Unterprogramme gestatten die gleichzeizige Berechnung mehrerer Werte.
FUNCTION- und SUBROUTINE-Unterprogramme SUBROUTINE rk4(y,dx,yp) IMPLICIT NONE ! Dummy arguments REAL(KIND=q), INTENT(IN) :: y,dx REAL(KIND=q), INTENT(OUT) :: yp ! Local variables ! dy1, dy2, dy3, dy4 = correspond to K1, K2, K3, K4 in ! fourth-order Runge-Kutta formula REAL(KIND=q) :: dy1,dy2,dy3,dy4 dy1 = f(y) dy2 = f(y + dx/2.0_q*dy1) dy3 = f(y + dx/2.0_q*dy2) dy4 = f(y + dx*dy3) yp = (dy1 + 2.0_q*dy2 + 2.0_q*dy3 + dy4)/6.0 END SUBROUTINE rk4
Block IF-Struktur ! Variable declarations ! tol = criteria of convergence (K) REAL(KIND=q) :: tol [..] ! Initializations tol = 1.0E-03_q [..] ! Time loop DO itt=1,ittmax [..] ! Test for convergence IF (ABS(tf – ti) < tol) THEN EXIT END IF END DO