Einführung in Fortran 90/95

Transcrição

Einführung in Fortran 90/95
Inhalt
• Einleitung
• Fortran 90
Einführung in Fortran 90/95
Dieter an Mey
RechenRechen- und Kommunikationszentrum der RWTH Aachen
1
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
Form von Fortran-Programmen
Datenobjekte und Attribute
Ausdrücke und Zuweisungen
Programmsteuerung (Kontrollstrukturen)
Programmeinheiten, Module
Feldverarbeitung
Zeiger
Ein-/Ausgabe
Vordefinierte Unterprogramme (intrinsic procedures)
•
•
•
•
•
Compiler
Makefiles
TotalView
Foresys
Profiler (WorkShop,gprof,tcov)
• Programmierhilfsmittel
11. März 2002
anmey@
anmey@rz.
rz.rwthrwth-aachen.de
aachen.de
http://www
http://www..rz.
rz.rwthrwth-aachen.de
aachen.de [/hpc
[/hpc]]
•
•
•
•
•
•
•
•
•
• Zusammenfassung, Empfehlungen, Literatur und Weblinks
11.03.2002
2
Inhalt
SunHPC 2002 – Einführung in Fortran 90/95
11.03.2002
Fortran - Geschichte
• Einleitung
• Fortran 90
•
•
•
•
•
•
•
•
•
Form von Fortran-Programmen
Datenobjekte und Attribute
Ausdrücke und Zuweisungen
Programmsteuerung (Kontrollstrukturen)
Programmeinheiten, Module
Feldverarbeitung
Zeiger
Ein-/Ausgabe
Vordefinierte Unterprogramme (intrinsic procedures)
•
•
•
•
•
Compiler
Makefiles
TotalView
Foresys
Profiler (WorkShop,gprof,tcov)
• Programmierhilfsmittel
• ~1950
Assembler
• ~1955
FORTRAN
• ~1960
FORTRAN IV
• ~1966
FORTRAN 66
• ~1977
FORTRAN 77
• ~1990
Fortran 90
• ~1995
Fortran 95
• Zusammenfassung, Empfehlungen, Literatur und Weblinks
• ~2004
Fortran 200X
3
4
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
Dieter an Mey
11.03.2002
Programmiersprachen im Hochleistungsrechnen
Verbreitung (persönliche Einschätzung)
BASIC
PL/I
PASCAL
ALGOL60
LISP
ALGOL68
C
ADA
BCPL
HPF
OpenMP
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Programmiersprachen
Derzeit im Hochleistungsrechnen hier genutzte Sprachen (Schätzung)
Fortran77 (ext) ca. 80-90%
C ca. 10-20 % (Tendenz steigend)
Fortran90 selten
FORTRAN77
Fortran90/95
C
C++
Java
5
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
C++ selten
Meine Empfehlung: Sehen Sie sich Fortran90 an !
Fortran90 ist zu Fortran77 aufwärts kompatibel
Fortran90 schließt die Möglichkeiten von C weitgehend ein
Fortran90 kann auch einiges von C++
Es ist für techn.-wiss. Aufgabenstellungen häufig
die geeignetere Sprache
Ausgereifte Compiler stehen auf allen Plattformen zur Verfügung
(Es gibt auch eine p.d. Version für Linux, basierend auf g77)
Evtl. ist die Kombination von Fortran90 und C(++) zu erwägen.
6
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
APL
Fortran77
wesentliche Charakteristika
Fortran77
Feldverarbeitung, Call by Reference
PROGRAM MAIN
IMPLICIT REAL (A-H,O-Z)
IMPLICIT INTEGER (I-N)
PARAMETER (LD1=11,LD2=12,LD3=13)
DIMENSION A(LD1,LD2,LD3)
READ (*,*) N1, N2, N3
CALL SUB ( A, LD1, LD2, N1, N2, N3 )
...
SUBROUTINE ( A, LD1, LD2, N1, N2, N3 )
REAL A(LD1,LD2,*)
DO I1=1,N1
DO I2=1,N2
DO I3=1,N3
A(I1,I2,I3) = ...
END DO
END DO
END DO
...
Feldverarbeitung ohne Zeiger (Pointer)
COMMON-Blöcke
Call by Reference
Kein Überlappen von beim Aufruf übergebenen Feldern Seiteneffekte
Nicht vergessen!
Felder werden in Fortran spaltenweise abgespeichert !
(und nicht zeilenweise wie z.B. in C)
7
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
8
SunHPC 2002 – Einführung in Fortran 90/95
Abspeicherung und Übergabe von
mehrdimensionalen Feldern in FORTRAN77
N3
Durch die Nutzung der
führenden Dimension
(leading dimension) ist
die Vermeidung von
ungünstigen Speicherabständen (strides) z.B.
beim Zugriff auf Matrixzeilen einfach möglich.
N1
LD1
N2
LD3
LD2
9
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Dieter an Mey
11.03.2002
Fortran77
COMMONCOMMON-Blöcke
PROGRAM MAIN
PARAMETER (LD1=11,LD2=12,LD3=13)
COMMON / NAME / A(LD1,LD2,LD3)
READ (*,*) N1, N2, N3
CALL SUB ( N1, N2, N3 )
...
SUBROUTINE ( N1, N2, N3 )
PARAMETER (LD1=11,LD2=12,LD3=13)
COMMON / NAME / A(LD1,LD2,LD3)
DO I1=1,N1
DO I2=1,N2
DO I3=1,N3
A(I1,I2,I3) = ...
END DO
END DO
END DO
...
10
Fortran77
COMMONCOMMON-Blöcke
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Fortran77
ACHTUNG! Überlappende Felder
C defs.inc
PARAMETER (LD1=11,LD2=12,LD3=13)
PROGRAM MAIN
COMMON / NAME / A(LD1,LD2,LD3)
INCLUDE ´defs.inc`
READ (*,*) N1, N2, N3
CALL SUB ( N1, N2, N3 )
...
PROGRAM MAIN
PARAMETER (MAX=1000000)
COMMON / NAME / WORK(MAX)
READ (*,*) N1, N2, N3
CALL SUB ( N1,N2,N3,WORK(1),WORK(1+N1),WORK(1+N1+N2) )
...
SUBROUTINE ( N1, N2, N3 )
INCLUDE ´defs.inc`
DO I1=1,N1
DO I2=1,N2
DO I3=1,N3
A(I1,I2,I3) = ...
END DO
END DO
END DO
...
SUBROUTINE SUB ( N1, N2, N3, A, B, C )
REAL A(*), B(*), C(*)
DO I=1,MIN( N1, N2, N3 )
! ACHTUNG weiter darf I nicht laufen
A(I) = B(I) + C(I)
END DO
...
Tipp: Verwenden Sie die automatische
Feldgrenzenüberprüfung, die die meisten
Compiler zur Verfügung stellen, zum Testen.
Sun: f95 –C ...
11
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
12
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Fortran77
ACHTUNG! Seiteneffekt
Fortran90
Ziele
PROGRAM MAIN
CALL SUB ( 1 )
WRITE (*,*) 1
STOP
END
Einbringen von moderenen Sprachkonstrukten in Fortran77
dynamische Speicherverwaltung, Strukturen, Felder, Rekursionen,
Definition von eigenen Typen, Überladen von Operatoren
SUBROUTINE ( IEINS)
IEINS=2
SUN f77:
POSSIBLE ATTEMPT TO MODIFY CONSTANT
RETURN
END
Segmentation Fault(coredump)
SUN frt:
2
SGI f77/f90: 1
VPP frt:
2
HP f90:
1
LINUX g77: Memory fault(coredump)
LINUX pgf77:1
LINUX pgf90:2
13
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Standardisierung der zahlreichen proprietären
Spracherweiterungen von Fortran77
Erhöhung der Programmsicherheit
Module, interne Prozeduren, Schnittstellen (interfaces)
Kompatibilität zu Fortran77
Komfort
14
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Fortran90
Unterrichtsmaterial aus Manchester
Inhalt
• Einleitung
• Fortran 90
•
•
•
•
•
•
•
•
•
Form von Fortran-Programmen
Datenobjekte und Attribute
Ausdrücke und Zuweisungen
Programmsteuerung (Kontrollstrukturen)
Programmeinheiten, Module
Feldverarbeitung
Zeiger
Ein-/Ausgabe
Vordefinierte Unterprogramme (intrinsic procedures)
•
•
•
•
•
Compiler
Makefiles
TotalView
Foresys
Profiler (WorkShop,gprof,tcov)
• Programmierhilfsmittel
• Zusammenfassung, Empfehlungen, Literatur und Weblinks
http://www.mcc.ac.uk/hpc/cluster_computing/IMPACT/training/f90/f77/
15
16
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Form von FortranFortran-Programmen
Zeichenvorrat
Inhalt
• Einleitung
• Fortran 90
Zeichenvorrat
•
•
•
•
•
•
•
•
•
Form von Fortran-Programmen
Datenobjekte und Attribute
Ausdrücke und Zuweisungen
Programmsteuerung (Kontrollstrukturen)
Programmeinheiten, Module
Feldverarbeitung
Zeiger
Ein-/Ausgabe
Vordefinierte Unterprogramme (intrinsic procedures)
•
•
•
•
•
Compiler
Makefiles
TotalView
Foresys
Profiler (WorkShop,gprof,tcov)
Alphanumerische Zeichen
b
Buchstaben
A ... Z
• Programmierhilfsmittel
Ziffern
0 ... 9
Sonderzeichen
=+-*/(),.‘“:%&;<>?!$
Unterstrich
_
• Groß- und Kleinschreibung ist nicht relevant (ausgenommen in Zeichenketten)
• Namen bestehen aus einem Buchstaben gefolgt von max. 31 alphanumerischen
Zeichen (in FORTRAN77 nur bis 6 Zeichen ohne Unterstrich)
• Zusammenfassung, Empfehlungen, Literatur und Weblinks
17
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
18
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Form von FortranFortran-Programmen
Schlüsselworte (1)
Form von FortranFortran-Programmen
Schlüsselworte (2)
•
• ACHTUNG: Schlüsselworte sind nicht geschützt !!!
• Seit Fortran 90 keine überflüssigen Blanks mehr in Schlüsselworten!
• Datentypen, Datenobjekte, Deklarationen
ALLOCATABLE ALLOCATE CHARACTER COMMON COMPLEX DATA
DEALLOCATE DIMENSION DOUBLEPRECISION ENDTYPE
EQUIVALENCE IMPLICIT IMPLICITNONE INTEGER KIND LEN
LOGICAL NAMELIST NULLIFY PARAMETER POINTER PRIVATE
PUBLIC REAL SAVE SEQUENCE STAT TARGET TYPE
• Ausdrücke und Zuweisungen
ASSIGN
• Programmsteuerung
CASE CASEDEFAULT CONTINUE CYCLE DO ELSE ELSEIF
ELSEWHERE END ENDDO ENDIF ENDWHERE EXIT GOTO IF PAUSE
SELECTCASE STOP THEN WHERE WHILE
19
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
•
•
•
Ein- und Ausgabe
ACCESS ACTION ADVANCE BACKSPACE BLANK CLOSE DELIM DIRECT END
ENDFILE EOR ERR EXIST FILE FMT FORMAT FORMATTED INQUIRE
IOLENGTH IOSTAT NAME NAMED NEXTREC NMT NUMBER OPEN OPENED PAD
POSITION PRINT READ READWRITE REC RECL REWIND SEQUENTIAL SIZE
STATUS UNFORMATTED UNIT WRITE
Programmkomponten
ASSIGNMENT BLOCKDATA CALL CONTAINS ENDBLOCKDATA ENDFUNCTION
ENDINTERFACE ENDMODULE ENDPROGRAM ENDSUBROUTINE ENTRY EXTERNAL
FUNCTION IN INTERFACE INOUT INTENT INTRINSIC MODULE ONLY
OPERATOR OPTIONAL OUT PROGRAM RECURSIVE RESULT RETURN
SUBROUTINE USE
Eingebaute Funktionen
ABS ACOS AIMAG AINT ANINT ASIN ATAN2 ATAN CHAR COS COSH DBLE
DIM EXP IABS IAND ICHAR INDEX INT ISIGN LEN LOG10 LOG MAX MIN
MOD NINT REAL SIGN SIN SINH TAN TANH BTEST DATE IBCLR IBITS
IBSET IEOR IOR ISHFT ISHFTC …
Sonstiges
INCLUDE
20
11.03.2002
SunHPC 2002 – Einführung in Fortran 90/95
Programmzeilen
Festes Format (Lochkartenformat)
Dieter an Mey
11.03.2002
Programmzeilen
Freies Format
•
•
•
•
•
•
•
•
•
1
2
3
4
7
8
123456789012345678901234567890123456789012345...6789012
0
C Die meisten heutigen Compiler erlauben auch breitere Zeilen
C Fortran77 Kommentar
Anweisung zwischen Spalte 7 und 72
Marke Anweisung
Kommenta
+erste Fortsetzungszeile der Anweisung
Fzweite Fortsetzungszeile der Anweisung, max. 19
12345 Anweisung
•
•
•
•
•
•
•
•
•
•
•
•
* Fortran90 Kommentar, meist von f77 akzeptiert
! Fortran90 Kommentar, meist von f77 akzeptiert
Anweisung ! Kommentar am Zeilenende, meist von f77 akzep
• max. 132 Zeichen je Zeile
• Mehrere Befehle in einer Zeile erlaubt mit Semikolon (;) als Trennzeichen
• Folgezeilen durch Undzeichen (&) am Ende der vorangehenden Zeile,
21
1
2
3
12
13
123456789012345678901234567890123456...7890123456789012
Eine Anweisung kann in der ersten Spalte beginnen &
und nach dem Kaufmanns-Und fortgesetzt werden &
& welches auch als erstes Zeichen in der Folgzeile
& wiederholt werden darf
Anweisung; Anweisung; Anweisung; ! Kommentar am Ende
! Kommentar über die ganze Zeile
Marke
Anweisung
!Kommenta
die Folgezeile darf als erstes nichtleeres Zeichen ebenfalls damit (&)
beginnen.
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
22
11.03.2002
SunHPC 2002 – Einführung in Fortran 90/95
Programmzeilen
die dem freien und dem festen Format genügen
•
•
•
•
•
•
•
•
1
2
3
4
7
123456789012345678901234567890123456789012345...6789012
! Kommentar
Anweisung zwischen Spalte 7 und 72
Marke Anweisung
&
&erste Fortsetzungszeile der Anweisung
&
&zweite Fortsetzungszeile der Anweisung, max. 19
12345 Anweisung
Dieter an Mey
11.03.2002
Inhalt
8
0
• Einleitung
• Fortran 90
•
•
•
•
•
•
•
•
•
Form von Fortran-Programmen
Datenobjekte und Attribute
Ausdrücke und Zuweisungen
Programmsteuerung (Kontrollstrukturen)
Programmeinheiten, Module
Feldverarbeitung
Zeiger
Ein-/Ausgabe
Vordefinierte Unterprogramme (intrinsic procedures)
•
•
•
•
•
Compiler
Makefiles
TotalView
Foresys
Profiler (WorkShop,gprof,tcov)
• Programmierhilfsmittel
• Zusammenfassung, Empfehlungen, Literatur und Weblinks
23
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
24
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Datenobjekte
INTEGER NMAX
PARAMETER (NMAX=100)
REAL,PARAMETER::pi=3.14
Datenobjekt
Variable
Konstante
benannt
unbenannt
bezeichnet
skalar
skalar
feldwertig
skalar
feldwertig
feldwertig
Literal
Feldelement
Teilzeichenkette
Teilzeichenkette
25
Dieter an Mey
Datenobjekte
unbenannt
bezeichnet
skalar
feldwertig
27
benannt
feldwertig
Literal
Feldelement
Strukturkomponente
skalar
feldwertig
Strukturkomponente
feldwertig
Feldkonstruktor
Teilzeichenkette
Teilfeld
bezeichnet
skalar
Feldelement
Teilzeichenkette
StrukturINTEGER,&
&DIMENSION(4)::fkomponente
f = (/1,2,3,4/)
Strukturkonstruktor&
INTEGER,
benannt
skalar
feldwertig
Literal
Feldelement
PRINT *, 13.0
StrukturStrukturkomponente
komponente
INTEGER,DIMENSION(4), &
& PARAMETER::k_feld=(/1,2,3,4/)
PRINT *, k_feld(4) ** 2
Strukturkonstruktor
Dieter an Mey
11.03.2002
Typvereinbarung:
typ [ par ] [ [, attribute ] :: ] namens_liste
typ ::= INTEGER | REAL | DOUBLE PRECISION | COMPLEX | LOGICAL
par ::= ( [KIND=] kind )
namens_liste ::= name [(indexgrenzen)] [ = ausdruck ] [, ... ]
feldwertig
Feldkonstruktor
Teilfeld
Strukturkomponente
INTEGER,DIMENSION(4), &
& DIMENSION(2,2)::f
& PARAMETER::k_feld=(/1,2,3,4/)
PRINT *,
f(1:2,1)
SunHPC
2002 – Einführung
90/95
Dieter an Mey
11.03.2002
PRINT
*, k_feld(2:4)
**in Fortran
2
Typvereinbarung:
CHARACTER [ par ] [ [, attribute ] :: ] namens_liste
par ::= * länge | ( [LEN=]länge) | ([LEN=]länge,[KIND=] kind )
namens_liste ::= name [(indexgrenzen)] [ = ausdruck ] [, ... ]
28
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Datentypvarianten
Ersatz für
DOUBLE PRECISION
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
komponente
Vordefinierte Datentypen
Typvereinbarungen
Datentypvarianten
29
feldwertig
Feldelement
FeldINTEGER, & konstruktor
Teilzeichenkette
& DIMENSION(2,2)::f
Teilfeld
f(1,1) = 1
Strukturkomponente
Struktur-
REAL::x
SunHPC 2002 – Einführung in Fortran 90/95
skalar
feldwertig
REAL f
Feldkonstruktor
Teilzeichenkette
Teilfeld
bezeichnet
skalar
feldwertig
Teilzeichenkette
26
11.03.2002
skalar
Variable
unbenannt
bezeichnet
Variable
skalar
Teilzeichenkette
Strukturkomponente
INTEGER,&
&DIMENSION(2,2)::i
INTEGER j(5)
Konstante
feldwertig
Teilfeld
Strukturkonstruktor
INTEGER,DIMENSION(4), &
& PARAMETER::k_feld=(/1,2,3,4/)
PRINT *, k_feld ** 2
Datenobjekt
benannt
Feldkonstruktor
Strukturkomponente
Strukturkomponente
SunHPC 2002 – Einführung in Fortran 90/95
skalar
feldwertig
Teilzeichenkette
benannt
skalar
skalar
Feldelement
Teilfeld
Strukturkomponente
bezeichnet
feldwertig
Feldkonstruktor
Datenobjekt
Konstante
benannt
skalar
Datenobjekte
30
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Datentypvarianten
31
SunHPC 2002 – Einführung in Fortran 90/95
Datentypvarianten
Dieter an Mey
32
11.03.2002
Typvereinbarungen
Datentypvarianten
•
SunHPC 2002 – Einführung in Fortran 90/95
par ::= ( [KIND=] kind )
Vereinbarung
(FORTRAN77)
Äquivalente
Vereinbarung
(Fortran 90)
bzw. Literale
Bytes bei
-xtypemap=\
real:32,\
double:64,\
INTEGER:32
Bytes bei
-xtypemap=\
real:64,\
double:128,\
INTEGER:64
integer
KIND(0)
4
8
integer*1 | 2 | 4 | 8
integer (kind=1|2|4|8 )
1|2|4|8
1|2|4|8
Real
KIND(0.0)
4
8
Real* 4 | 8 | 16
Real (kind=4|8|16 )
4 | 8 | 16
4 | 8 | 16
Double precision
KIND(0.0D0)
8
16
Complex
KIND(0.0)
2x4
2x8
Complex*8 | 16 | 32 Complex (kind=4|8|16)
2x4|2x8|2x16
2x4|2x8|2x16
Logical
KIND(.false.)
4
8
Logical*1 | 2 | 4 | 8
Logical (kind=1|2|4|8 )
1|2|4|8
•
kind gibt meist die interne Länge in Byte an ! Üblich: REAL (KIND=4|8|16)
REAL R1
! meist 4 Byte
! Üblich: INTEGER (KIND=2|4|8)
DOUBLEPRECISION D1 ! meist 8 Byte
INTEGER I1 ! meist 4 Byte
! FORTRAN77
! FORTRAN77
REAL*4 R2
INTEGER*4 I2
! Fortran 90
! Fortran 90
REAL (KIND=4) :: R3
INTEGER (KIND=4) :: I3
REAL (4) :: R4
INTEGER (4) :: I4
33
SunHPC 2002 – Einführung in Fortran 90/95
! Üblich: LOGICAL (KIND=1|4)
LOGICAL L1 ! meist 4 Byte
! FORTRAN77
LOGICAL *4 L2
! Fortran 90
LOGICAL(KIND=4) :: L3
LOGICAL(4) :: L4
Dieter an Mey
11.03.2002
Änderung der Maschinendarstellung
durch Compileroptionen (Sun Forte 6U2)
Auswahl der Maschinendarstellung von vordefinierten Typen
! Üblich: COMPLEX (KIND=4|8|16)
COMPLEX C1 ! meist 2x4 Byte
! FORTRAN77
COMPLEX*8 C2 ! 2x4 Byte
! Fortran 90
COMPLEX (KIND=4) :: C3
COMPLEX (4) :: C4
Dieter an Mey
34
11.03.2002
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
1|2|4|8
11.03.2002
Datentypvarianten (kind
(kind))
Empfehlung zur portablen Vereinbarung
Datentypvarianten
Ausgabe auf Sun-Maschinen:
2147483674
Entweder präzise Angabe der Bytes zur Speicherung (alter Stil):
REAL*8
X,Y,Z
INTEGER*4 N,M,K
4
Oder Angabe der gewünschten Genauigkeit in einem Modul (neuer Stil) ....
MODULE MyTypes
INTEGER, PARAMETER :: MyReal = selected_real_kind(10,200)
INTEGER, PARAMETER :: MyInt = selected_ind_kind(10)
END MODULE MyTypes
307
35
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
15
8
11.03.2002
... und Verwendung dieses Modules in allen Programmeinheiten
USE MyTypes
REAL (KIND=MyReal) :: X,Y,Z
INTEGER (KIND=MyInt) :: N,M,K
36
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Datentypvarianten
Beispiel
Typvereinbarungen
Attribute
Interessanter Fall: Ein Programm wird mit oder ohne Autodouble-Option übersetzt.
include ´mpif.h´
REAL, DIMENSION(:,:) :: x
INTEGER :: mpi_float
SELECT CASE (KIND(x))
CASE(4)
mpi_float = MPI_REAL
CASE(8)
mpi_float = MPI_DOUBLE_PRECISION
CASE DEFAULT
STOP ´real kind unsupported by MPI´
END SELECT
CALL MPI_SEND(x,SIZE(x),mpi_float,...)
37
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
•
•
•
•
•
•
•
•
•
•
•
•
•
PARAMETER
Macht einen Namen zur einer Konstante
DIMENSION
Felddeklaration und -dimensionierung
POINTER
Zeiger
TARGET
Zeigerziel
ALLOCATABLE
dynamisch erzeugbares Feld
PUBLIC
außerhalb des Moduls sichtbar (nach Verwendung von USE)
PRIVATE
nicht außerhalb des Moduls verfügbar
INTENT(inout)
Verwendung eines Aufrufparameters
OPTIONAL
Optionaler Aufrufparameter
SAVE
Variable im statischer Speicherbereich (der Inhalt bleibt erhalten)
EXTERNAL
Name von Externen Unterprogrammen
INTRINSIC
Name von Internen Unterprogrammen
Attribute können auch durch gleichnamige Anweisungen gegeben werden.
38
• Variablen der Namen mit den Buchstaben A...H oder O...Z beginnen, sind
automatisch vom Typ REAL
• IMPLICIT REAL (A-H,O-Z)
• Variablen der Namen mit den Buchstaben I ... N beginnen, sind
automatisch vom Typ INTEGER
• Ein modernes Fortran 90 Programme sollte alle Variablen explizit vereinbaren.
Das kann erzwungen werden durch:
39
! Vereinbarung
# Sun Compileroption
SunHPC 2002 – Einführung in Fortran 90/95
• TYPE-Definitionsanweisung
TYPE name
[PRIVATE]
[SEQUENCE]
typkomponenten_vereinbarungen ...
END TYPE name
• TYPE-Deklarationsanweisung
Dieter an Mey
11.03.2002
! TYPE-Definitionsanweisung
TYPE viereck
REAL, DIMENSION(4) :: s
REAL :: flaeche
END TYPE viereck
! TYPE-Deklarationsanweisung
TYPE(viereck),PARAMETER::rechteck=viereck((/4.0,3.0,4.0,3.0/),12.0)
TYPE(viereck) :: v
40
SunHPC 2002 – Einführung in Fortran 90/95
Benutzerdefinierte Datentypen /Strukturen
(derived types)
types)
INTEGER, PARAMETER :: male=1, female=0
female=0
TYPE person
INTEGER :: ident
INTEGER :: sex
REAL :: salary
END TYPE person
TYPE (person),
person), DIMENSION(100) :: group
TYPE (person)
female,100000.0)
,100000.0)
person) :: boss = person(1,
person(1,female
group%
! alles Männer
group%sex = male
group%
group%sex(27) = female ! Huhn im Korb
group(1)
group(1) = boss
41
SunHPC 2002 – Einführung in Fortran 90/95
11.03.2002
TYPE (typname) [[,attribute] ::] namens_liste
• IMPLICIT INTEGER (I-N)
• IMPLICIT NONE
• f90 –u ... *.f90
Dieter an Mey
Benutzerdefinierte Datentypen /Strukturen
(derived types)
types)
Implizite Typvereinbarungen
• Aus dem FORTRAN77 stammt noch die implizite Typvereinbarung:
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Dieter an Mey
11.03.2002
Anweisungen zur Speicherverwaltung
ALLOCATE
Speicherplatz anlegen
DEALLOCATE
Speicherplatz freigeben
NULLIFY
Aufheben einer Zeigerzuordnung
EQUIVALENCE
mehrfache Nutzung von Speicherbereichen veraltet
Vereinbarung globaler Speicherbereiche veraltet
COMMON
SEQUENCE
Festlegen der Speicherfolge von selbstdefinierten Typen
DATA
Initialisierung von Variablen veraltet
42
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Verschiedenes
Inhalt
binäre Konstante
oktale Konstante
hexadezimale Konstante
B‘01010101010101010101010101010101‘
O‘01234567‘
Z‘ABCDEF‘
• Einleitung
• Fortran 90
! leere Zeichenkette
a = ´´
a(:5) = a(3:7)
! Zuweisung von einander überlappenden Zeichenketten
•
•
•
•
•
•
•
•
•
Form von Fortran-Programmen
Datenobjekte und Attribute
Ausdrücke und Zuweisungen
Programmsteuerung (Kontrollstrukturen)
Programmeinheiten, Module
Feldverarbeitung
Zeiger
Ein-/Ausgabe
Vordefinierte Unterprogramme (intrinsic procedures)
•
•
•
•
•
Compiler
Makefiles
TotalView
Foresys
Profiler (WorkShop,gprof,tcov)
• Programmierhilfsmittel
• Zusammenfassung, Empfehlungen, Literatur und Weblinks
43
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
44
SunHPC 2002 – Einführung in Fortran 90/95
Arithmetisch
Logisch
Zeichenketten
Vergleich
*
/
+ (zweistellig)
–- (zweistellig)
+ (einstellig)
–- (einstellig)
** (Exponentiation)
Operandentyp Numerisch
.NOT.
.AND.
.OR.
.EQV.
.NEQV.
//
(Konkatenation)
.EQ. ==
.NE. /=
.LT. <
.LE. <=
.GT. >=
.GE. >=
LOGICAL
CHARACTER
Numerisch oder
CHARACTER
Wert
LOGICAL
CHARACER
LOGICAL
Operatoren
45
Numerisch
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
MODULE operator_overloading
IMPLICIT NONE
! Benutzerdefinierter Operator zur Verkettung von 2 Zeichenketten
INTERFACE OPERATOR (.concat.)
MODULE PROCEDURE concat
END INTERFACE
! Überladener Operator zur Verkettung von 2 Zeichenketten
INTERFACE OPERATOR (+)
MODULE PROCEDURE concat
END INTERFACE
CONTAINS
FUNCTION concat ( ca, cb )
IMPLICIT NONE
CHARACTER (LEN=*), INTENT(IN) :: ca, cb
CHARACTER (LEN=(LEN_TRIM(ca)+LEN_TRIM(cb))) :: concat
concat = TRIM(ca) // TRIM(cb)
END FUNCTION concat
END MODULE operator_overloading
46
SunHPC 2002 – Einführung in Fortran 90/95
Operatorüberladung für benutzerdefinierte Typen
MODULE vector_module
TYPE vector
REAL :: x, y
END TYPE vector
INTERFACE OPERATOR (+)
! overloading operator +
MODULE PROCEDURE vector_add
END INTERFACE
CONTAINS
FUNCTION vector_add(v1, v2)
TYPE (vector) :: vector_add
TYPE (vector), INTENT(IN) :: v1, v2
vector_add%x = v1%x + v2%x
vector_add%y = v1%y + v2%y
END FUNCTION vector_add
END MODULE vector_module
47
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Benutzerdefinierte Operatoren
Überladen von Operatoren
Vordefinierte Operatoren
Ausdruck
Dieter an Mey
11.03.2002
Dieter an Mey
11.03.2002
Vorrang zwischen Operatoren
Art des Operators
Operatoren
Vorrang
Benutzerdefinierte
Operatoren
einstellig
stark
Arithmetische
Operatoren
**
/ *
+ - (einstellig)
+ - (zweistellig)
//
Zeichenkettenoperatoren
Vergleichsoperatoren
.EQ. == .NE. /= .LT. < .LE. <= .GT. >= .GE. >=
Logische Operatoren
.NOT.
.AND.
.OR.
.EQV. .NEQV.
Benutzerdefinierte
Operatoren
zweistellig
48
SunHPC 2002 – Einführung in Fortran 90/95
schwach
Dieter an Mey
11.03.2002
Inhalt
Zuweisungen
• Zuweisung
variable = ausdruck
• Numerische Zuweisung num_var = num_ausdr
• Logische Zuweisung
log_var = bool_ausdr
• Zuweisungsanweisung für Zeichenketten
ch_var = ch_ausdr
• Zuweisungsanweisung für benutzerdefinierte Datentypen
• Vordefinierte Zuweisung
def_var = def_ausdr
• Benutzerdefinierte
MODULE name
Zuweisung
• Maskierte Feldzuweisung (später)
• Zeigerzuweisung
49
zeiger => ziel
SunHPC 2002 – Einführung in Fortran 90/95
...
INTERFACE ASSIGNMENT (=)
MODULE PROCEDURE name
END INTERFACE
CONTAINS
SUBROUTINE name(links,rechts)
...
END SUBROUTINE name
END MODULE name
Dieter an Mey
11.03.2002
• Einleitung
• Fortran 90
name:
name:
51
•
•
•
•
•
Compiler
Makefiles
TotalView
Foresys
Profiler (WorkShop,gprof,tcov)
• Zusammenfassung, Empfehlungen, Literatur und Weblinks
50
SunHPC 2002 – Einführung in Fortran 90/95
name: SELECT CASE (3*i-j)
CASE(0) name
...
CASE(2,4:7) name
...
CASE DEFAULT
...
END SELECT name
Dieter an Mey
11.03.2002
WHERE ... ELSEWHERE ... END WHERE
52
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
Dieter an Mey
11.03.2002
Kontrollstrukturen - Zählschleife
Zählschleifen
DO ...
REAL, DIMENSION(100) :: x, y, z
INTEGER, DIMENSION(100) :: l
...
WHERE ( z >= 1.0e-10 )
x = y / z
ELSEWHERE
x = 0.0e0
END WHERE
...
l = z >= 1.0e-10
x = 0.0e0
WHERE ( l )
x = y/z
END WHERE
SunHPC 2002 – Einführung in Fortran 90/95
11.03.2002
Kontrollstrukturen - Fallunterscheidung
Maskierte Feldzuweisung
53
Dieter an Mey
Fallunterscheidung
IF ( log.exp
. ) THEN
log.exp.
block
ELSE IF ( log.exp
. ) THEN name
log.exp.
block
ELSE name
block
END IF name
SunHPC 2002 – Einführung in Fortran 90/95
Form von Fortran-Programmen
Datenobjekte und Attribute
Ausdrücke und Zuweisungen
Programmsteuerung (Kontrollstrukturen)
Programmeinheiten, Module
Feldverarbeitung
Zeiger
Ein-/Ausgabe
Vordefinierte Unterprogramme (intrinsic procedures)
• Programmierhilfsmittel
Kontrollstrukturen - Bedingung
Bedingung dürfen einen Namen erhalten
•
•
•
•
•
•
•
•
•
END DO
! Endlosschleife
! Hoffentlich gibt es
es eine Abbruchbedingung!
DO WHILE ( log. exp.)
exp.)
...
END DO
Den Schleifen dürfen Namen gegeben werden
name:
DO i = ilow, ihigh, istep
...
END DO name
Beenden des aktuellen
Schleifendurchlaufes
CYCLE name
Beenden der akutellen
Schleifenausführung
EXIT name
11.03.2002
54
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Kontrollstrukturen – das FORALLFORALL-Konstrukt
do i = 1, n
do j = 1, m
if ( b(i,j) /= 0.0 ) then
c(i,j) = a(i,j) / b(i,j)
end if
end do
end do
Fortran 95
Komponentenweise
Verarbeitung von
(Teil-) Feldern
Reihenfolge flexibel!
forall ( i = 1:n, j=1:m, b(i,j) /= 0.0 )
c(i,j) = a(i,j) / b(i,j)
end forall
Dieter an Mey
Reihenfolge flexibel!
=>
!$omp workshare
geeignet
forall (( ii= =
1:n,
j=1:m
)
forall
1:n,
j=1:m,
b(i,j)/=0.0Besonders
)
zur Parallelisierung
if ( b(i,j) /= 0.0 ) then
c(i,j)c(i,j)
= a(i,j)
/ /b(i,j)
z.B. mit OpenMP
= a(i,j)
b(i,j)
end forall
end if
forall
!$omp end
workshare
Bedingung in der
FORALL-Anweisung
forall ( i = 1:n, j=1:m, b(i,j) /= 0.0 ) &
c(i,j) = a(i,j) / b(i,j)
SunHPC 2002 – Einführung in Fortran 90/95
Fortran 95
Geschachtelte DOSchleife mit
Bedingung
forall ( i = 1:n, j=1:m )
if ( b(i,j) /= 0.0 ) then
c(i,j) = a(i,j) / b(i,j)
end if
end forall
55
Kontrollstrukturen – das FORALLFORALL-Konstrukt
Kurzschreibweise
56
11.03.2002
SunHPC 2002 – Einführung in Fortran 90/95
Kontrollstrukturen – das FORALLFORALL-Konstrukt, PURE
...
forall ( i = 1:n, j=1:m )
c(i,j) = div(a(i,j),b(i,j))
end forall
...
contains
...
pure function div (a,b) result(c)
implicit none
real, intent(in) :: a, b
real :: c
if ( b /= 0.0 ) c = a / b
end function div
...
57
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
Fortran 95
• Einleitung
• Fortran 90
•
•
•
•
•
•
•
•
•
Form von Fortran-Programmen
Datenobjekte und Attribute
Ausdrücke und Zuweisungen
Programmsteuerung (Kontrollstrukturen)
Programmeinheiten, Module
Feldverarbeitung
Zeiger
Ein-/Ausgabe
Vordefinierte Unterprogramme (intrinsic procedures)
•
•
•
•
•
Compiler
Makefiles
TotalView
Foresys
Profiler (WorkShop,gprof,tcov)
• Programmierhilfsmittel
• Zusammenfassung, Empfehlungen, Literatur und Weblinks
58
11.03.2002
Programmeinheiten
SunHPC 2002 – Einführung in Fortran 90/95
Externes
Unterprogramm
external subprogram
Dieter an Mey
11.03.2002
Programmkomponenten - Hauptprogramm
Programmeinheiten
program units
Hauptprogram
main program
11.03.2002
Inhalt
Unterprogramme
/Funktionen, die in
FORALL-Konstrukten
gerufen werden
müssen frei von
Seiteneffekten sein
(PURE).
•Keine IO
•Kein STOP
•Vereinbaren aller
Parameter mit INTENT
•Nur PURE
Unterprogramme
Dieter an Mey
Programmeinheiten
program units
BLOCK DATADATAProgrammeinheit
block data
Modul
module
Hauptprogram
main program
Externes
Unterprogramm
external subprogram
BLOCK DATADATAProgrammeinheit
block data
Modul
module
veraltet
Externe
Funktion
external
function
Externe
Subroutine
external
subroutine
Vereinbarungen
specifications
ModulModulUnterprogramm
module subprogram
veraltet
Externe
Externe
Vereinbarungen
Funktion
Subroutine
specifications
external
external
PROGRAM name
function
subroutine
Vereinbarungen
(specification
statements)
ModulModulUnterprogramm
module subprogram
Ausführbare Befehle (executable statements)
Interne Unterprogramme (internal subprograms)
END [ PROGRAM [name] ]
59
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
60
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Programmkomponenten – Externe Unterprogramme
Programmkomponenten – Modul
Programmeinheiten
program units
Hauptprogram
main program
Externes
Unterprogramm
external subprogram
Programmeinheiten
program units
Modul
module
BLOCK DATADATAProgrammeinheit
block data
Hauptprogram
main program
Externes
Unterprogramm
external subprogram
BLOCK DATADATAProgrammeinheit
block data
Modul
module
veraltet
veraltet
Externe
Externe
Vereinbarungen
ModulModulFunktion
Subroutine
specifications
Unterprogramm
external
external
module subprogram
SUBROUTINE |function
FUNCTION subroutine
name ( Formalparameter dummy argument list)
Externe
Funktion
external
function
Vereinbarungen (specification statements)
Ausführbare Befehle (executable statements)
Interne Unterprogramme (internal subprograms)
END [ SUBROUTINE | FUNCTION [name] ]
61
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
•
•
bleiben in den internen Unterprogramme gültig, es sei denn, sie werden
darin neu definiert.
Interne Unterprogramme können nicht geschachtelt werden.
Interne Unterprogramme sind nicht von außen aufrufbar.
SUBROUTINE | FUNCTION name ( ... )
Vereinbarungen (specification statements)
Ausführbare Befehle (executable statements)
CONTAINS
SUBROUTINE | FUNCTION name ( ...)
Vereinbarungen
Ausführbare Befehle
END SUBROUTINE | FUNCTION [name]
ModulModulUnterprogramm
module subprogram
Vereinbarungen (specification statements)
CONTAINS
Modul-Unterprogramme (module subprograms)
END [ MODULE [name] ]
62
Interne Unterprogramme
(internal procedures)
procedures)
• Jede Programmeinheit kann interne Unterprogramme beinhalten
• Alle Variablen, die in der umgebenden Programmeinheit definiert sind,
Externe
Vereinbarungen
Subroutine
specifications
external
subroutinename
MODULE
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Interne Unterprogramme
(internal procedures)
procedures)
PROGRAM main
IMPLICIT NONE
REAL :: a=1.0, b=1.0, c=1.0, s
s = add ()
WRITE (*,*) s
CONTAINS
FUNCTION add()
REAL :: add, c=2.0
add = a + b + c
END FUNCTION add
END PROGRAM main
Die Zahlen a und b werden
in dem umgebenden
Hauptprogram definiert
und sind in dem internen
Unterprogramm bekannt.
Hingegen wird c neu
definiert.
END [ SUBROUTINE | FUNCTION [name] ]
63
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
64
...
print *, func(x) + func(x)
...
65
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
PROGRAM main
IMPLICIT NONE
REAL :: a=1.0, b=1.0, c, s
s = 13.0
CALL add ( a, b, c, s )
WRITE (*,*) s
END PROGRAM main
SUBROUTINE add ( a, b, c, s )
IMPLICIT NONE
REAL, INTENT(IN) :: a, b
REAL, INTENT(OUT) :: c
REAL, INTENT(INOUT) :: s
c = a + b
s = s + c
END SUBROUTINE add
function func(x)
real :: func, x
func=x*x
x=2*x
end function func
11.03.2002
Dieter an Mey
11.03.2002
Aufrufparameter
(procedure arguments)
arguments)
Subroutine versus Funktion
ACHTUNG:
Während es üblich ist, dass die Parameter in einer Subroutine geändert
werden, sollte das bei einer Funktion tunlichst vermieden werden !
Seiteneffekte!
SunHPC 2002 – Einführung in Fortran 90/95
66
SunHPC 2002 – Einführung in Fortran 90/95
Die Art der Verwendung
der Formalparameter
kann mit dem INTENT
Attribut spezifiziert
werden.
Verstöße werden vom
Compiler erkannt.
Dieter an Mey
11.03.2002
Schnittstellenblöcke
(interface blocks)
blocks)
Optionale und Schlüsselwortparameter
(optional and keyword arguments)
arguments)
Schnittstellenbeschreibungen (im Vereinbarungsteil) erlauben
eine strikte Überprüfung der Parameterübergabe durch den Compiler:
Aufruf von Programmeinheiten mit Postions- oder Schlüsselwortparametern,
Verwendung von optionalen Parametern
CALL solve ( a, b, n )
INTERFACE name
SUBROUTINE sub ( n, x, y, z, sum )
INTEGER, INTENT(INOUT) :: n
REAL, DIMENSION(100), INTENT(IN) :: x, y, z
REAL, DIMENSION(100), INTENT(OUT) :: sum
END SUBROUTINE sub
END INTERFACE name
CALL solve ( b=y, a=x )
SUBROUTINE solve ( a, b, n )
REAL, INTENT(IN) :: a
REAL, INTENT(INOUT) :: b
INTEGER, OPTIONAL, INTENT(IN) :: n
IF ( PRESENT(n)) THEN ...
67
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
68
11.03.2002
SunHPC 2002 – Einführung in Fortran 90/95
Programmkomponenten
FORTRAN77 → Fortran90
PROGRAM main
COMMON /COM/ A
F(X) = 2*X+3
...
CALL sub_1
CALL sub_2
CALL sub_4
...
END
SUBROUTINE sub_2
x = func_1
y = func_2
END
SUBROUTINE sub_1
...
END
INCLUDE ‘sub_4.f‘
FUNCTION func_2
func_2
...
CALL sub_3
...
END
BLOCKDATA init
COMMON /COM/ A
END
SUBROUTINE sub_3
...
END
69
SunHPC 2002 – Einführung in Fortran 90/95
sub_1
sub_2
func_1
func_2
sub_3
sub_4
init
PROGRAM main
COMMON /COM/ A
F(X) = 2*X+3
...
CALL sub_1
CALL sub_2
CALL sub_4
...
END
SUBROUTINE sub_4
...
END
11.03.2002
BLOCKDATA init
COMMON /COM/ A
END
70
SUBROUTINE sub_1
...
END
FUNCTION func_1
...
END
INCLUDE ‘sub_4.f‘
FUNCTION func_2
func_2
...
CALL sub_3
...
END
MODULE init
REAL, SAVE :: A
END MODULE init
SUBROUTINE sub_3
...
END
71
SunHPC 2002 – Einführung in Fortran 90/95
sub_1
sub_2
func_1
MODULE modulefunc_2
...
sub_3
CONTAINS
SUBROUTINE
sub_4 sub_4
...
END
SUBROUTINE sub_4
init
END MODULE module
Dieter an Mey
sub_1
sub_2
func_1
func_2
FUNCTION func_2
func_2
...
CALL sub_3
...
END
SUBROUTINE
MODULE
init sub_3
... SAVE :: A
REAL,
ENDEND
MODULE init
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
sub_3
sub_4
init
SUBROUTINE sub_4
...
END
11.03.2002
Programmkomponenten
FORTRAN77 → Fortran90
main
SUBROUTINE sub_2
x = func_1
y = func_2
ENDmodule
USE
main
FUNCTION func_1
...
END
SUBROUTINE sub_1
...
END
Programmkomponenten
FORTRAN77 → Fortran90
PROGRAM main
USE init
F(X) = 2*X+3
...
CALL sub_1
CALL sub_2
CALL sub_4
...
END
SUBROUTINE sub_2
= func_1
USE xinit
y = func_2
END
INCLUDE ‘sub_4.f‘
Dieter an Mey
11.03.2002
Programmkomponenten
FORTRAN77 → Fortran90
main
FUNCTION func_1
...
END
Dieter an Mey
SUBROUTINE sub_4
...
END
11.03.2002
PROGRAM main
USE init
USE module
F(X) = 2*X+3
...
CALL sub_1
CALL sub_2
CALL sub_4
...
END
SUBROUTINE sub_1
...
END
MODULE init
REAL, SAVE :: A
END MODULE init
72
main
PROGRAM
mainsub_2
SUBROUTINE
USE
x = module
func_1
sub_1
USE
y = init
func_2
sub_2
END
...
func_1
CALL sub_1
FUNCTION
func_1
CALL
sub_2
...
func_2
CALL sub_4
END
...
sub_3
CONTAINS
sub_4
FUNCTIONfunc_2
F(X)
FUNCTION
_2
func
F = 2*X+3
...
init
END sub_3
FUNCTION F
CALL
...
MODULE module
SUBROUTINE
sub_1
END
...
...
CONTAINS
END SUBROUTINE
SUBROUTINE
sub_3 sub_1 SUBROUTINE sub_4
END
PROGRAM
main
...
...
END
END SUBROUTINE sub_4
END MODULE module
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Programmkomponenten
FORTRAN77 → Fortran90
PROGRAM main
USE module
USE init
USE interfaces
...
CALL sub_1
CALL sub_2
CALL sub_4
...
CONTAINS
FUNCTION F(X)
F = 2*X+3
END FUNCTION F
SUBROUTINE sub_1
...
END SUBROUTINE sub_1
END PROGRAM main
MODULE init
REAL, SAVE :: A
END MODULE init
73
SUBROUTINE sub_2
x = func_1
y = func_2
END
FUNCTION func_1
...
END
FUNCTION func_2
func_2
...
CALL sub_3
...
END
SUBROUTINE sub_3
...
END
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
MODULE
main interfaces
INTERFACE
sub_1 sub_2
SUBROUTINE
...sub_2
END SUBROUTINE sub_2
func_1
END INTERFACE
INTERFACE func_2
SUBROUTINE func_2
...
sub_3
END SUBROUTINE &
sub_4
func_2
END INTERFACE
ENDinit
MODULE interfaces
MODULE module
...
CONTAINS
SUBROUTINE sub_4
...
END SUBROUTINE sub_4
END MODULE module
11.03.2002
Programmkomponenten
FORTRAN77 → Fortran90
PROGRAM main
USE module
USE init
USE interfaces
...
CALL sub_1
CALL sub_2
CALL sub_4
...
CONTAINS
FUNCTION F(X)
F = 2*X+3
END FUNCTION F
SUBROUTINE sub_2
USE interfaces
x = func_1
y = func_2
..
CONTAINS
FUNCTION func_1
...
END FUNCTION func_1
END SUBROUTINE sub_2
SUBROUTINE sub_1
...
END SUBROUTINE sub_1
END PROGRAM main
MODULE init
REAL, SAVE :: A
END MODULE init
75
FUNCTION func_2
...
CALL sub_3
...
CONTAINS
SUBROUTINE sub_3
...
END SUBROUTINE sub_3
END FUNCTION func_2
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
MODULE init
REAL, SAVE :: A
END MODULE init
74
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
FUNCTION func_2
func_2
...
CALL sub_3
...
END
SUBROUTINE sub_3
...
END
SunHPC 2002 – Einführung in Fortran 90/95
MODULE
SUBROUTINE
sub_2
main interfaces
INTERFACE
USE interfaces
sub_1 sub_2
SUBROUTINE
x = func_1
y ...
= func_2
sub_2
END
.. SUBROUTINE sub_2
func_1
CONTAINS
END INTERFACE
INTERFACE
FUNCTION func_2
func_1
SUBROUTINE
...
func_2
END
...FUNCTION func_1
sub_3
END
ENDSUBROUTINE
SUBROUTINEsub_2
&
sub_4
func_2
FUNCTION
func_2
END INTERFACE
...
init
END MODULE interfaces
CALL sub_3
... module
MODULE
CONTAINS
...
CONTAINS
SUBROUTINE sub_4
sub_3
SUBROUTINE
...
...
END SUBROUTINE
SUBROUTINE sub_4
sub_3
END
END
FUNCTION
func_2
END MODULE module
Dieter an Mey
11.03.2002
Benutzerdefinierte Typen als Parameter
(derived type)
type)
MODULE interfaces
INTERFACE
SUBROUTINE sub_2
...
END SUBROUTINE sub_2
END INTERFACE
INTERFACE
SUBROUTINE func_2
...
END SUBROUTINE &
func_2
END INTERFACE
END MODULE interfaces
MODULE module
...
CONTAINS
SUBROUTINE sub_4
...
END SUBROUTINE sub_4
END MODULE module
11.03.2002
76
Unterprogramme als Parameter
(procedures as arguments)
arguments)
77
FUNCTION func_1
...
END
SUBROUTINE sub_1
...
END SUBROUTINE sub_1
END PROGRAM main
Programmkomponenten
FORTRAN77 → Fortran90
PROGRAM main
USE module
USE init
USE interfaces
...
CALL sub_1
CALL sub_2
CALL sub_4
...
CONTAINS
FUNCTION F(X)
F = 2*X+3
END FUNCTION F
SUBROUTINE sub_2
x = func_1
y = func_2
END
11.03.2002
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Feldwertige Funktionen
(array(array-valued functions)
functions)
78
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Rekursive Prozeduren – RESULT Klausel
Module
(modules)
modules)
Rekursive Funktionen müssen das Ergebnis über eine explizit mit der RESULTKlausel vereinbarte Variable zurückgeben
• Module dienen der besseren Programmstrukturierung
• Mit Modulen können sowohl Daten als auch Unterprogramme (mit der USE-
RECURSIVE FUNCTION fact(n) RESULT(res)
IMPLICIT NONE
INTEGER, INTENT(IN) :: n
INTEGER :: res
IF ( n == 1 ) THEN
res = 1
ELSE
res = n * fact(n-1)
ENDIF
END FUNCTION fact
Achtung: Wenn möglich, aus Performance-Gründen rekursive Funktionen
vermeiden.
79
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
•
Anweisung) anderen Programmeinheiten verfügbar gemacht werden.
• Ersatz von COMMON-Blöcken
Sie sind zur Verwendung zahlreicher neuer Sprachkonstrukte von Fortran90
geeignet:
• Typendefinitionen
• Operatordefinitionen und -überladungen
• Schnittstellenbeschreibungen (INTERFACE)
• Generische Prozeduren
• Datenkapselung mit dem PRIVATE-Attribut
• Übergabe von Daten benutzerdefinierten Typs
• Übergabe von Zeigern
80
Globale Daten
(global data)
data)
USE globals
• Zugriff auf ausgewählte Daten des Moduls
USE globals, ONLY: a, c
• Zugriff auf ausgewählte Daten des Moduls unter anderem Namen
USE globals, ONLY: r=>a, s=>b, c
MODULE globals
REAL, SAVE :: a, b, c
INTEGER, SAVE :: i,j,k
INTEGER, PRIVATE :: keep, out
CONTAINS
...
END MODULE globals
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
Dieter an Mey
11.03.2002
ModulModul-Unterprogramme
(module procedures)
procedures)
• Zugriff auf alle (öffentlichen) Daten des Moduls
81
SunHPC 2002 – Einführung in Fortran 90/95
11.03.2002
Operatordefinition
(operator definition)
definition)
PROGAM main
USE point_m
TYPE (point_t) :: px, py, pz
...
pz = px .plus. py
...
END PROGAM main
MODULE point_m
TYPE point_t
REAL :: x,y
END TYPE point_t
INTERFACE OPERATOR (.plus.)
MODULE PROCEDURE addpoints
END INTERFACE
CONTAINS
FUNCTION addpoints (p,q)
TYPE(point_t), INTENT(IN) :: p,q
TYPE(point_t) :: addpoints
addpoints%x = p%x + q%x
addpoints%y = p%y + q%y
END FUNCTION addpoints
83
SunHPC 2002 – Einführung in
Fortran
90/95
Dieter an Mey
11.03.2002
END
MODULE
point_m
PROGAM main
USE point_m
TYPE (point_t) :: px, py, pz
...
pz = addpoints (px, py )
...
END PROGAM main
MODULE point_m
TYPE point_t
REAL :: x,y
END TYPE point_t
CONTAINS
FUNCTION addpoints (p,q)
TYPE(point_t), INTENT(IN) :: p,q
TYPE(point_t) :: addpoints
addpoints%x = p%x + q%x
addpoints%y = p%y + q%y
END FUNCTION addpoints
END MODULE point_m
82
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Überladung von Operatoren
(operator overloading)
overloading)
PROGAM main
USE point_m
TYPE (point_t) :: px, py, pz
...
pz = px + py
...
END PROGAM main
MODULE point_m
TYPE point_t
REAL :: x,y
END TYPE point_t
INTERFACE OPERATOR (+)
MODULE PROCEDURE addpoints
END INTERFACE
CONTAINS
FUNCTION addpoints (p,q)
TYPE(point_t), INTENT(IN) :: p,q
TYPE(point_t) :: addpoints
addpoints%x = p%x + q%x
addpoints%y = p%y + q%y
END FUNCTION addpoints
84
SunHPC 2002 – Einführung in
Fortran
90/95
Dieter an Mey
11.03.2002
END
MODULE
point_m
Generische Unterprogramme
mit benutzerdefinierten Typen
PROGAM main
MODULE point_m
USE point_m
TYPE rpoint_t
TYPE (rpoint_t):: &
REAL :: x,y
px, py, pz
END TYPE rpoint_t
TYPE (ipoint_t):: &
TYPE ipoint_t
ipx,ipy,ipz
INTEGER :: x,y
...
END TYPE ipoint_t
pz = addpoints(px,py)
INTERFACE addpoints
ipz = addpoints(ipx,ipy)
MODULE PROCEDURE addrpoints, addipoints
pz = px + py
END INTERFACE
ipz = ipx + ipy
INTERFACE OPERATOR (+)
...
MODULE PROCEDURE addrpoints, addipoints
END PROGAM main
END INTERFACE
CONTAINS
FUNCTION addrpoints (p,q)
TYPE(rpoint_t), INTENT(IN) :: p,q
TYPE(rpoint_t) :: addrpoints
addrpoints%x = p%x + q%x
addrpoints%y = p%y + q%y
END FUNCTION addrpoints
FUNCTION
addipoints
(p,q)
85
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
...
Überladung des Zuweisungsoperators
(assignment overloading)
overloading)
PROGAM main
MODULE point_m
TYPE rpoint_t;
USE point_m
REAL :: x,y
TYPE (rpoint_t):: px
END TYPE rpoint_t
TYPE (ipoint_t)::ipx
TYPE ipoint_t
...
INTEGER :: x,y
px = ipx
END TYPE ipoint_t
...
INTERFACE ASSIGNMENT (=)
END PROGAM main
MODULE PROCEDURE r2ipoints, i2rpoints
END INTERFACE
CONTAINS
SUBROUTINE r2ipoints (a,b)
TYPE(ipoint_t), INTENT(OUT) :: a
TYPE(rpoint_t), INTENT(IN) :: b
a%x = b%x
a%y = b%y
END SUBROUTINE r2ipoints
SUBROUTINE i2rpoints (a,b)
...
END SUBROUTINE i2rpoints
END MODULE point_m
86
Benutzerdefinierte Operatoren
Überladen von Operatoren
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Geltungsbereich von Namen
(scope)
scope)
MODULE operator_overloading
IMPLICIT NONE
! Benutzerdefinierter Operator zur Verkettung von 2 Zeichenketten
INTERFACE OPERATOR (.concat.)
MODULE PROCEDURE concat
END INTERFACE
! Überladener Operator zur Verkettung von 2 Zeichenketten
INTERFACE OPERATOR (+)
MODULE PROCEDURE concat
END INTERFACE
CONTAINS
FUNCTION concat ( ca, cb )
CHARACTER (LEN=*), INTENT(IN) :: ca, cb
CHARACTER (LEN=(LEN_TRIM(ca)+LEN_TRIM(cb))) :: concat
concat = TRIM(ca) // TRIM(cb)
END FUNCTION concat
END MODULE operator_overloading
87
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
88
Geltungsbereich von Namen
(scope)
scope)
89
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Geltungsbereich von Namen
(scope)
scope)
90
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Programmstruktur – Wann müssen
Schnittstellenblöcke genutzt werden?
Programmstruktur
ausgenommen
Module
91
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
92
11.03.2002
SunHPC 2002 – Einführung in Fortran 90/95
Programmstruktur - Zusammenfassung
Dieter an Mey
11.03.2002
Inhalt
• Einleitung
• Fortran 90
Globale Analyse mit:
f95 –Xlist
ftncheck (f77)
foresys
•
•
•
•
•
•
•
•
•
Form von Fortran-Programmen
Datenobjekte und Attribute
Ausdrücke und Zuweisungen
Programmsteuerung (Kontrollstrukturen)
Programmeinheiten, Module
Feldverarbeitung
Zeiger
Ein-/Ausgabe
Vordefinierte Unterprogramme (intrinsic procedures)
•
•
•
•
•
Compiler
Makefiles
TotalView
Foresys
Profiler (WorkShop,gprof,tcov)
• Programmierhilfsmittel
• Zusammenfassung, Empfehlungen, Literatur und Weblinks
93
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
94
11.03.2002
Feldverarbeitung - Terminologie
• Rang (rank) eines Feldes(array):
Anzahl der Dimensionen
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Feldverarbeitung - Beispiel
Ein Skalar hat
den Rang 0
• Ausdehnung (extent) einer Dimension eines Feldes:
Anzahl der Elemente dieser Dimension
• Form (shape) eines Feldes:
Vektor aller Ausdehnungen
• Größe (size) eines Feldes:
Gesamtzahl aller Elemente
• Konforme (conformable) Felder haben dieselbe Form (shape)
und können miteinander verknüpft werden (conformance)
• Felder sind immer konform zu einem Skalar,
dieser wird in Ausdrücken passend erweitert (broadcast)
95
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
96
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Feldverarbeitung - Vereinbarungen
Feldverarbeitung - Vereinbarungen
Dynamische
Felder
Felder mit
übernommener
Gestalt
97
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
98
Arbeiten mit ganzen Feldern
(whole arrays)
arrays)
99
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Arbeiten mit ganzen Feldern
(whole arrays)
arrays)
100
Arbeiten mit ganzen Feldern
(whole arrays)
arrays)
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Arbeiten mit ganzen Feldern
(whole arrays)
arrays)
Performance !!??
101
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
102
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Elementweise arbeitende eingebaute Funktionen
(elemental intrinsic procedures)
procedures)
103
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Einfache WHEREWHERE-Anweisung
104
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
106
Teilfelder
(array sections)
sections)
107
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
Dieter an Mey
11.03.2002
Teilfelder
(array sections)
sections)
WHEREWHERE-Konstrukt
105
SunHPC 2002 – Einführung in Fortran 90/95
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Vektorindex
(vector subscripts)
subscripts)
11.03.2002
108
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Feldzuweisung
(array assignment)
assignment)
Rekursionen
Vorsicht bei Rekursionen!
(ein Schleifendurchlauf benötigt die Ergebnisse eines vorherigen)
PROGRAM recursion
INTEGER, PARAMETER :: n = 5
INTEGER, DIMENSION(n) :: a
INTEGER :: i
! rekursive Berechnung von a(i) = a(1)+a(2)+...+a(i)
DO i=2,n
a(i) = a(i-1) + a(i)
END DO
! Berechnung von a(i) = a(i) + a(i-1); keine Rekursion
a(2:n) = a(1:n-1) + a(2:n)
! Fortran 90 Version, Performance? N*(N+1)/2 Flops statt (N-1) !!
a(2:n) = (/ (SUM(a(1:i)),i=2,n) /)
Performance !!??
END PROGRAM recursion
109
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
110
Feldelement versus Feldindex
(element location versus subscript)
subscript)
111
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
Dieter an Mey
11.03.2002
Leere Felder
112
FeldFeld-Konstruktor
(array constructor)
constructor)
113
SunHPC 2002 – Einführung in Fortran 90/95
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Feldparameter
11.03.2002
114
SunHPC 2002 – Einführung in Fortran 90/95
Aber nicht
kopiert !
Dieter an Mey
11.03.2002
Dynamische Felder
Dynamische Felder
REAL, DIMENSION (:,:), ALLOCATABLE :: ra
REAL :: xsum
INTEGER :: n, m, status, iseed
Performance !!??
READ (*,*) n, m
! read Input matrix size
assumed
ALLOCATE (ra(n,m), STAT= status)
shape array
IF (status > 0) STOP “allocation failed“
SUBROUTINE rsum ( ra, xsum )
CALL RANDOM_SEED ()
REAL, DIMENSION (:,:) :: ra
CALL RANDOM_NUMBER (ra)
REAL :: xsum
CALL rsum ( ra, xsum )
xsum = 0.0d0
DO i = 1, SIZE ( ra, 1 )
! So geht‘s auch:
DO j = 1, SIZE ( ra, 2 )
! xsum = SUM( ra )
xsum = xsum + ra(i,j)
END DO
DEALLOCATE (ra)
END DO
RETURN
END SUBROUTINE rsum
115
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
116
Dynamische Felder
(allocatable arrays)
arrays)
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Automatische Felder
SUBROUTINE sub ( n, a )
IMPLICIT NONE
INTEGER :: n
REAL, DIMENSION(n,n), INTENT(INOUT) :: a
REAL, DIMENSION(n,n) :: work1
! automatisch
REAL, DIMENSION(SIZE(a,1)) :: work2
! automatisch
...
RETURN
END SUBROUTINE sub
117
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
118
Automatische Felder
(automatic arrays)
arrays)
119
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Automatische Felder
(automatic arrays)
arrays)
11.03.2002
120
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Felder mit übernommener Gestalt
(assumed shape arrays)
arrays)
Übergabe eines dynamischen Feldes
121
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
122
Felder mit übernommener Gestalt
(assumed shape arrays)
arrays)
123
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Dieter an Mey
11.03.2002
Eingebaute Feldfunktionen
(array intrinsic functions)
functions)
124
Eingebaute Feldfunktionen
(array intrinsic functions)
functions)
125
SunHPC 2002 – Einführung in Fortran 90/95
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Eingebaute Feldfunktionen
(array intrinsic functions)
functions)
126
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Eingebaute Feldfunktionen
(array intrinsic functions)
functions)
127
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Eingebaute Feldfunktionen
(array intrinsic functions)
functions)
128
Eingebaute Feldfunktionen
(array intrinsic functions)
functions)
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Elementare Unterprogramme ()
program f95_test
...
Fortran 95
real,allocatable,dimension(:,:) :: a,b,c
...
c = div ( a, b )
Elementare Funktionen
...
/Unterprogramme dürfen
contains
nur skalare Parameter /
Ergebnisse besitzen (keine
elemental subroutine div (a,b,c)
POINTER).
implicit none
Sie können auch mit
real, intent(in) :: a, b
Feldargumenten benutzt
real, intent(out) :: c
werden und werden dann
real :: c
if ( b /= 0.0 ) c = a / b
komponentenweise
end function div
ausgeführt.
end program f95_test
129
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
130
Beispiel zur Feldverarbeitung:
Conjugate Gradient Verfahren
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Beispiel zur Feldverarbeitung
Beispiele
REAL,DIMENSION(5,5) :: ra,rb,rc
INTEGER :: id,i,j
! äquivalent
ra = rb + rc * id
! SHAPE(/5,5/) and scalar
ra(:,:) = rb(:,:) + rc(:,:) * id(:,:) ! SHAPE(/5,5/) and
scalar
! äquivalent
ra(3:5,3:4) = rb(1::2,3:5:2) + rc(1:3,1:2)
! SHAPE(/3,2/)
DO j=1,2
DO i=1,3;
ra(i+2,j+2) = rb(2*i-1,2*j+1) + rc(i,j)
END DO
END DO
ra(:,1) = rb(:,1) + rb(:,2) + rc(:,3)
131
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
132
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
! SHAPE(/5/)
11.03.2002
Felder ...
•
•
•
Felder ...
adjustable array
The array in a subprogram has a variable dimension just as in Fortran 77 through that
both the array name and the dimension (all dimensions) are
dummy arguments. The actual shape is therefore passed from the actual arguments.
SUBROUTINE SUB (A, NA)
REAL, DIMENSION (NA) :: A
assumed-size array
The array has a variable dimension, like in Fortran 77, through that both the array name
and the parameters of the dimension are dummy arguments,
except the last dimension, which is given by a *
SUBROUTINE SUB (A, NA1, NA2)
REAL, DIMENSION (NA1, NA2,*) :: A
assumed-shape array
An array in a subprogram which is not local and has a certain data type and a certain
rank.
SUBROUTINE SUB (A)
REAL, DIMENSION (:, :, :) :: A
133
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
•
•
•
automatic array
Array in a subprogram where the array is local but the parameters for the dimensions
are among the dummy arguments.
SUBROUTINE SUB (I, J, K)
REAL, DIMENSION (I, J, K) :: X
allocatable array
An array specified as ALLOCATABLE with a certain type and rank. It can later be
allocated a certain extent with the ALLOCATE statement. The
corresponding storage area can be released with the DEALLOCATE statement.
deferred-shape array
The array is an array pointer or an allocatable array.
134
SunHPC 2002 – Einführung in Fortran 90/95
Beispiel (1)
module
util
interface summe1
module procedure &
summe11,summe12
end interface summe1
interface summe2
module procedure &
summe21,summe22
end interface summe2
contains
real function summe11 ( a )
real, dimension(:) :: a
summe11 = sum ( a )
end function summe11
real function summe12 ( a )
real, dimension(:,:) :: a
summe12 = sum ( a )
end function summe12
135
real function summe22 ( a )
real, dimension(:,:) :: a
integer :: i, j
summe22 = 0.0
do j = 1, size(a,2) ! Anzahl in Dim. 2
do i = 1, size(a,1)
summe22 = summe22 + a(i,j)
end do
end do
end function summe22
end module util
Dieter an Mey
11.03.2002
program test
use util
integer, parameter :: n=5
real, dimension(n,n) :: a
a = reshape ( (/ ((i*10+j, i=1,n), j=1,n) /) , SHAPE=(/ n, n /) )
! do j = 1, n
!
do i = 1, n
!
a(i,j) = i*10+j
!
end do
! end do
print *, summe1( a(3,1:n) ),summe2( a(3,1:n) ), sum( a(3,1:n) )
print *, summe1( a(3,1:n:2)),summe2( a(3,1:n:2)), sum( a(3,1:n:2))
print *, summe1( a(2:n:2,3)),summe2( a(2:n:2,3)), sum( a(2:n:2,3))
print *, &
summe3(a(2:n:2,1:n:2)),summe4(a(2:n:2,1:n:2)),sum(a(2:n:2,1:n:2))
end program test
136
SunHPC 2002 – Einführung in Fortran 90/95
LinpackLinpack-Kernel
Fortran77
...
20
30
...
do 30 j = kp1, n
t3 = a(l,j)
if (l.eq.k) goto 20
a(l,j) = a(k,j)
a(k,j) = t3
continue
call daxpy
+
(n-k,t3,a(k+1,k),
+
1,a(k+1,j),1)
Continue
137
Dieter an Mey
Dieter an Mey
11.03.2002
LinpackLinpack-Kernel
Fortran90
subroutine daxpy(n,da,dx,incx,dy,incy)
doubleprecision dx(1),dy(1),da
integer i,incx,incy,ix,iy,m,mp1,n
if (n.le.0 .or. da .eq. 0.0d0) return
if(incx.eq.1.and.incy.eq.1)go to 20
ix = 1
iy = 1
if(incx.lt.0)ix = (-n+1)*incx + 1
if(incy.lt.0)iy = (-n+1)*incy + 1
do 10 i = 1,n
dy(iy) = dy(iy) + da*dx(ix)
ix = ix + incx
iy = iy + incy
10 continue
return
20 continue
do 30 i = 1,n
dy(i) = dy(i) + da*dx(i)
30 continue
return
end
SunHPC 2002 – Einführung in Fortran 90/95
11.03.2002
Beispiel (2)
real function summe21 ( a )
real, dimension(:) :: a
integer :: i
summe21 = 0.0
do i = 1, size(a) ! Anzahl Elemente
summe21 = summe21 + a(i)
end do
end function summe2
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
subroutine daxpy (da,dx,dy)
...
do j = kp1,n
t3 = a(l,j)
if (l /= k) then
a(l,j) = a(k,j)
a(k,j) = t3
end if
call daxpy(t3, &
a(k+1:n:1,k), &
a(k+1:n:1,j))
end do
...
Performance !!??
138
double precision, intent(in) ::
double precision, dimension(:),
intent(in) ::
double precision, dimension(:),
intent(inout)
integer :: m,ix,iy,jx,jy
da
&
dx
&
:: dy
if (size(dy) <= 0) return
if (size(dx) /= size(dy)) then
write (*,*) "***** Error:*****“
return
end if
if (da == 0.0d0) return
dy = dy + da * dx
end subroutine daxpy
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Der Komfort von Fortran95
Lapack versus Lapack95
SGESV – Lösung eines reellen linearen Gleichungssystems
A * B = X (single precision)
SUBROUTINE SGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO )
INTEGER
INFO, LDA, LDB, N, NRHS
INTEGER
IPIV( * )
REAL
A( LDA, * ), B( LDB, * )
LA_GESV - Lösung eines reellen oder komplexen linearen Gleichungssystems
A * B = X (single oder double precision)
SUBROUTINE LA_GESV( A, B, IPIV=ipiv, INFO=info )
type(wp), INTENT(INOUT) :: A(:,:), rhs
INTEGER, INTENT(OUT), OPTIONAL :: IPIV(:)
INTEGER, INTENT(OUT), OPTIONAL :: INFO
Inhalt
• Einleitung
• Fortran 90
•
•
•
•
•
•
•
•
•
Form von Fortran-Programmen
Datenobjekte und Attribute
Ausdrücke und Zuweisungen
Programmsteuerung (Kontrollstrukturen)
Programmeinheiten, Module
Feldverarbeitung
Zeiger
Ein-/Ausgabe
Vordefinierte Unterprogramme (intrinsic procedures)
•
•
•
•
•
Compiler
Makefiles
TotalView
Foresys
Profiler (WorkShop,gprof,tcov)
• Programmierhilfsmittel
Lapack95 ist nutzt die darunter liegenden
where
optimierten Lapack und Blas-Bibliotheken.
type ::= REAL COMPLEX
wp
::= KIND(1.0) KIND(1.0D0) Daher ist Lapack 95 nur geringfügig
rhs ::= B(:,:) B(:)
langsamer. (http://www.netlib.org/lapack95/ )
• Zusammenfassung, Empfehlungen, Literatur und Weblinks
139
140
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Zeiger
(pointer)
pointer)
141
SunHPC 2002 – Einführung in Fortran 90/95
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
ZeigerZeiger-Zuweisung
(pointer assignment)
assignment)
Dieter an Mey
11.03.2002
142
ZeigerZeiger-Status
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Dynamischer Speicher
Fortran 95:
P2 zeigt ins
Leere
REAL, POINTER :: p = NULL()
(Achtung bei der Parallelisierung:
Thread Safety ?)
Speicher nicht
mehr nutzbar
143
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
144
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Zeigerparameter
145
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
ZeigerZeiger-Funktionen
11.03.2002
146
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
Dieter an Mey
11.03.2002
Verkettete Liste
(linked list)
ZeigerZeiger-Felder
147
SunHPC 2002 – Einführung in Fortran 90/95
11.03.2002
148
Verkettete Liste
(linked list)
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Zeiger – Beispiel
Zeiger (pointer), werden nicht als Zeiger auf Speicherplätze verwendet, sondern eher als
Alias-Bezeichnungen. Sie sind mit Vorsicht zu benutzen.
PROGRAM linked_list
TYPE node
INTEGER :: value
! data filed
TYPE (node), POINTER :: next
! pointer field
END TYPE node
INTEGER :: num, status
TYPE (node), POINTER :: head, tail, current
! build up the list
NULLIFY(head, tail)
! initially nullify the list (empty)
PRINT *, 'Type-in an INTEGER number to build a linked list (0 to terminate)'
READ *, num
! read num from keyboard
IF (num /= 0) then
! if 0 is entered, do nothing
ALLOCATE(head, STAT = status)
! create the head of the list
IF (status > 0) STOP 'Fail to allocate a new node'
head%value = num
! give the value
NULLIFY(head%next)
! point to null
tail => head
! update tail of list
149
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
150
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Zeiger – Beispiel
Inhalt
! create rest of list
READ *, num
! read num from keyboard
IF (num == 0) EXIT
! until 0 is entered
ALLOCATE(current, STAT = status) ! create new node
IF (status > 0) STOP 'Fail to allocate a new node'
current%value = num
! giving the value
NULLIFY(current%next)
! point to null (end of list)
tail%next => current
! link to tail of list
tail => current
! update tail of list
END DO
END IF
DO
! transverse the list and print the values
current => head
! make current as alias of list
DO
IF (.NOT. ASSOCIATED(current)) EXIT ! exit if null pointer
PRINT *, current%value
! print the value
current => current%next
! make current alias of next node
END DO
END PROGRAM linked_list
151
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
Form von Fortran-Programmen
Datenobjekte und Attribute
Ausdrücke und Zuweisungen
Programmsteuerung (Kontrollstrukturen)
Programmeinheiten, Module
Feldverarbeitung
Zeiger
Ein-/Ausgabe
Vordefinierte Unterprogramme (intrinsic procedures)
•
•
•
•
•
Compiler
Makefiles
TotalView
Foresys
Profiler (WorkShop,gprof,tcov)
• Programmierhilfsmittel
• Zusammenfassung, Empfehlungen, Literatur und Weblinks
152
SunHPC 2002 – Einführung in Fortran 90/95
Datei
Datei
intern
extern
formatiert
unformatiert
(binär)
Dieter an Mey
11.03.2002
! cat formatted_file.dat
! 12345678
! 12345678
!
! od -cx formatted_file.dat
! gibt den Inhalt der Datei hexadezimal und die Characterdarstellung der einzelnen Bytes aus
! 20 bedeutet Blank. Das erste Zeichen jeder Zeile
dient als Druckersteuerzeichen.
Datei
!
!0000000
1
2
3
4
5
6
7
8 \n
1
2
3
4
5
!
2031
3233
3435
3637
380a
2031
3233
3435
intern
!0000020
6
7
8 extern
\n
!
3637
380a
unformatiert
(binär)
154
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Dieter an Mey
11.03.2002
Dateitypen
! od -Dcx unformatted_file.dat
Datei
! gibt den Inhalt der Datei hexadezimal, die Characterdarstellung der einzelnen Bytes
! und die Darstellung von je 4 Bytes als INTEGER*4 Zahl aus
! Jeder Datensatz (Record) wird von einem 4-Byte-Header und einem 4-Byte-Trailor umschlossen,
intern
! die beide die Laenge des extern
Datensatzes enthalten.
!0000000
0000000008
0825373492
0892745528
0000000008
!
\0 \0 \0 \b
1
2
3
4
5
6
7
8 \0 \0 \0 \b
!
0000
0008
3132
3334
3536
3738
0000
0008
!0000020
0000000004
0012345678
0000000004
formatiert
unformatiert
!
\0 \0 \0 004 \0
¼
a
N \0 \0 \0 004
(binär)
!
0000
0004
00bc
614e
0000
0004
sequentieller
! externe Datei,
formatierte Ein-/Ausgabe direkter
OPEN ( UNIT=1,
FORM="FORMATTED", FILE="formatted_file.dat"
)
Zugriff
Zugriff
WRITE ( UNIT=1, "(1x,a8)" ) "12345678"
WRITE ( UNIT=1, FMT=1000 ) 12345678
1000
FORMAT (1x,i8)
CLOSE ( UNIT=1 )
SunHPC 2002 – Einführung in Fortran 90/95
intern
unformatiert
(binär)
Dateitypen
155
11.03.2002
! interne
Datei
sequentieller
direkter
CHARACTER*10 :: internal_file
Zugriff
WRITE(
internal_file(1:10), Zugriff
"(a3,i1,a4,f2.0)" ) &
"INT", 5, "REAL", 1.0
! sequentielle (frei) formatierte Ausgabe
! auf die Standardausgabeeinheit
PRINT *, internal_file
! Ausgabe: INT5REAL1.
direkter
Zugriff
SunHPC 2002 – Einführung in Fortran 90/95
formatiert
Dieter an Mey
Dateitypen
sequentieller
Zugriff
153
•
•
•
•
•
•
•
•
•
Dateitypen
extern
formatiert
11.03.2002
• Einleitung
• Fortran 90
sequentieller
Zugriff
156
direkter
! unformatierte
Ein-/Ausgabe
Zugriff
OPEN ( UNIT=2, FORM="UNFORMATTED", &
ACCESS="SEQUENTIAL",
&
FILE="unformatted_file.dat" )
WRITE ( UNIT=2 ) "12345678„
WRITE ( UNIT=2 ) 12345678
CLOSE ( UNIT=2 )
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Dateitypen
EinEin-/Ausgabeanweisungen
Datei
! unformatierte Ein-/Ausgabe mit direktem Zugriff
OPEN ( UNIT=3, FORM="UNFORMATTED",
&
ACCESS="DIRECT",
RECL=8,
&
extern
FILE="direct_access_file.dat" )
WRITE ( UNIT=3, REC=2 ) 12345678
WRITE ( UNIT=3, REC=1 ) "12345678"
CLOSE
( UNIT=3 )
formatiert
unformatiert
intern
(binär)
sequentieller
Zugriff
!
!
!
!
!
!
•
direkter
Zugriff
od -Dcx direct_access_file.dat
Alle Datensaetze haben exakt 8 Bytes, wie beim Open-Befehl angegeben
Der zweite Satz wurde mit Nullen aufgefuellt
0000000
0825373492
0892745528
0012345678
1
2
3
4
5
6
7
8 \0
¼
a
N
3132
3334
3536
3738
00bc
614e
157
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
•
•
•
•
•
•
•
OPEN
Öffnen einer Datei
CLOSE Schließen einer Datei
WRITE Schreiben in eine externe oder interne Datei
PRINT
Schreiben auf Standardausgabe
READ
Lesen aus einer externen oder internen Datei
FORMAT Formatierung
BACKSPACE, REWIND, ENDFILE
Positionierung einer sequentiellen Datei
INQUIRE Abfragen der Eigenschaften einer externen Datei
0000000000
\0 \0 \0 \0
0000
0000
11.03.2002
158
SunHPC 2002 – Einführung in Fortran 90/95
EinEin-/Ausgabe
Neuer Parameter IOSTAT zur Abfrage von Fehlerzuständen.
Ersetzt END, ERR, EOR Parameter, die mit einem Sprung zu einem Label
verbunden sind.
neue OPEN-Parameter
POSITION = ASIS | REWIND | APPEND | UNDEFINED
ACTION = READ | WRITE | READWRITE | UNDEFINED
STATUS = OLD | NEW | SCRATCH | REPLACE | UNKNOWN
neue Format-Beschreiber
EN (engenieerung), ES (scientific),
B (binary), O (octal), Z (hex), G (generalized)
NAMELIST /listname/ a, i, x
READ ( unit, NML=listname)
SunHPC 2002 – Einführung in Fortran 90/95
11.03.2002
160
Neue Formatbeschreiber
161
SunHPC 2002 – Einführung in Fortran 90/95
IOSTAT
OPEN
CLOSE
READ
WRITE
0
erfolgreich
erfolgreich
erfolgreich
erfolgreich
-1
Dateiende
-2
Satzende
>0
Dieter an Mey
Dieter an Mey
11.03.2002
IOSTATIOSTAT-Parameter
nicht vorrückende Ein-/Ausgabeanweisung
WRITE (*,´(„Eingabe? “)´,ADVANCE=´NO´)
READ(*,´(I5)´) n
159
Dieter an Mey
11.03.2002
fehlerhaft
fehlerhaft
SunHPC 2002 – Einführung in Fortran 90/95
fehlerhaft
Dieter an Mey
fehlerhaft
11.03.2002
NAMELISTNAMELIST-Gruppen
PROGRAM main
REAL :: p1=1.0, p2=2.0, q1=3.0, q2=4.0
INTEGER ::p3=1, p4=2, q3=3, q4=4
NAMELIST / group_1 / p1, p2, p3, p4
NAMELIST / group_2 / q1, q2, q3, q4
&group_1
p1=13.0 ! ab Fortran95 Kommentare
p3=4
/
&group_2 q2=13.0, q4=17 /
OPEN ( UNIT=13, FILE="namelist.data" )
READ ( UNIT=13, NML=group_2 )
REWIND ( UNIT=13 )
READ ( UNIT=13, NML=group_1 )
CLOSE ( UNIT=13 )
WRITE(*,NML=group_1)
WRITE(*,NML=group_2)
END PROGRAM main
&GROUP_1
P1 = 13.00000
P2 = 2.000000
P3 =
4,
P4 =
2
/
&GROUP_2
Q1 = 3.000000
Q2 = 13.00000
Q3 =
3,
Q4 =
17
/
162
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Vordefinierte Unterprogramme
(intrinsic procedures)
procedures)
Inhalt
• Einleitung
• Fortran 90
•
•
•
•
•
•
•
•
•
Form von Fortran-Programmen
Datenobjekte und Attribute
Ausdrücke und Zuweisungen
Programmsteuerung (Kontrollstrukturen)
Programmeinheiten, Module
Feldverarbeitung
Zeiger
Ein-/Ausgabe
Vordefinierte Unterprogramme (intrinsic procedures)
•
•
•
•
•
Compiler
Makefiles
TotalView
Foresys
Profiler (WorkShop,gprof,tcov)
• Programmierhilfsmittel
• Zusammenfassung, Empfehlungen, Literatur und Weblinks
163
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
164
Neue vordefinierte Unterprogramme
165
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Neue vordefinierte Unterprogramme
166
Neue vordefinierte Unterprogramme
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Feldverarbeitung - Intrinsics (1)
Reduktionen von Feldelementen
ALL, ANY, COUNT, PRODUCT, SUM,
MAXVAL, MINVAL, MAXLOC, MINLOC
Informationen über die Form eines Feldes
ALLOCATED, LBOUND, UBOUND, SHAPE, SIZE
Erstellen von Feldern
MERGE, PACK, UNPACK, SPREAD
Umformen von Feldern
RESHAPE
Feldverarbeitung
CSHIFT, EOSHIFT, TRANSPOSE
Feldarithmetik
DOT_PRODUCT, MATMUL
Achtung: Die Performance der Intrinsics ist nicht immer optimal !
(z.B. besser DGEMM aus einer optimierten Blas-Bibliothek als MATMUL
nehmen)
167
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
168
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Feldverarbeitung - Intrinsics (2)
Neue vordefinierte Unterprogramme - Zufallszahlen
real, allocatable, dimension(:,:) :: a, b, c
integer, allocatable, dimension(:) :: get, put
allocate ( a(n,m), b(n,m), c(n,m) )
Beispiele
REAL s, x(100)
s = SUM ( x, MASK = x > 0.0 )
REAL, DIMENSION(-3:4) :: x
INTEGER, DIMENSION(1) :: locmax
x = (/1.2,3.4,5.4,11.2,1.0,3.7,1.0,1.0/)
locmax = MAXLOC(x)
maxval = x(LBOUND(x) + locmax(1) - 1 )
! = (/4/)
call random_seed (size=size)
write (*,*) "random_seed: size= ", size
allocate ( get(size), put(size) )
put=4711
call random_seed (put=put)
write (*,*) "random_seed: put= ", put
! call random_seed ()
call random_number (a)
call random_number (b)
random_seed: size=
4
random_seed: put=
4711
4711
4711
4711
random_seed: get= 2591103 5059992 1275832 980058
call random_seed (get=get)
write (*,*) "random_seed: get= ", get
169
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
170
11.03.2002
Neue vordefinierte Unterprogramme - Uhren
integer, dimension(8) :: values
real :: t0, t1, t2
integer :: count, count_rate, count_max
integer :: c1, c2
call date_and_time ( date, time, zone, values )
write (*,"(...)") values(3), ".", values(2), ".", values(1), &
values(5), ":", values(6), ":", values(7), ".", values(8)
write (*,*) "date_and_time: date= ", date
write (*,*) "date_and_time: time= ", time
write (*,*) "date_and_time: zone= ", zone
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Fortran95
date_and_time:
values= 03.03.2002
10:35:52.894
date=
20020303
time=
103552.894
zone=
+0100
call system_clock ( count, count_rate, count_max )
write (*,“(...)“) count, count_rate, count_max, count_max/count_rate
call cpu_time ( t1 ) Fortran 95
call system_clock ( count=c1 )
call work
call cpu_time ( t2 )
call system_clock ( count=c2 )
if ( c2 < c1 ) c2 = c2 + count_max
system_clock:
count=
count_rate[1/sec]=
count_max=
wrap around[s]=
0
1000000
2147483647
2147
delta cpu_time[s]:
0.009999
delta system_clock [s]: 0.0110
write (*,"(...)") "delta cpu_time[s]: ", t2-t1
write (*,"(...)") "delta system_clock [s]: ",dble(c2-c1)/dble(count_rate)
171
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
172
Fortran 200x
•
•
•
•
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
F
Ausnahmebehandlung (exception handling)
Objekt-orientierte Programmierung (object-oriented programming)
Verbesserte Verträglichkeit mit C (interoperability)
Standardisierung voraussichtlich im Jahre 2004
•
•
•
•
F = Fortran90/95 – FORTRAN77
Freie Compiler verfügbar
Geeignet für Ausbildung und Entwicklung neuer Programme
http://www.fortran.com/imagine1/
• http://www.J3-Fortran.org/
173
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
174
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Inhalt
Sun FortranFortran-Compiler
•
•
•
•
•
•
•
•
• Einleitung
• Fortran 90
•
•
•
•
•
•
•
•
•
Form von Fortran-Programmen
Datenobjekte und Attribute
Ausdrücke und Zuweisungen
Programmsteuerung (Kontrollstrukturen)
Programmeinheiten, Module
Feldverarbeitung
Zeiger
Ein-/Ausgabe
Vordefinierte Unterprogramme (intrinsic procedures)
•
•
•
•
•
Compiler
Makefiles
TotalView
Foresys
Profiler (WorkShop,gprof,tcov)
• Programmierhilfsmittel
•
f90 ... *.f90
f95 ... *.f95
-M dir # Module Verzeichnis
–u
# implicit none
-fast
# hohe Optimierung
–xtarget=ultra3cu # USIII
-g
# Debugging und Analyse
-Xlist # Listings ...
...
Weitere Informationen:
http://www.rz.rwthhttp://www.rz.rwth-aachen.de/ \
hpc/
hpc/sun/#Bedienungsanleitung
sun/#Bedienungsanleitung
http://sun
http://sun..docs.
docs.com
• Zusammenfassung, Empfehlungen, Literatur und Weblinks
175
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
176
SunHPC 2002 – Einführung in Fortran 90/95
Sun FortranFortran-Compiler
Intervallarithmetik
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Inhalt
PRGOGRAM Intervalle
INTERVAL :: X, Y
http://www
fortran//interval/
http://www..sun.
sun.com/forte/
com/forte/fortran
interval/
INTEGER :: IOS = 0
WRITE(*, 1, ADVANCE='NO')
READ(*, *, IOSTAT=IOS) X
DO WHILE (ios >= 0)
PRINT *, "For X =", X
PRINT *, 'ABS(X) = ', ABS(X)
PRINT *, 'LOG(X) = ', LOG(X)
PRINT *, 'SQRT(X)= ', SQRT(X)
% =f95
PRINT *, 'SIN(X)
', -xia
SIN(X)intervalle.f95
% a.out
PRINT *, 'ACOS(X)=
', ACOS(X)
X = ADVANCE='NO')
?[1.1,1.2]
WRITE(*, " X = ?"),
READ(*, *, IOSTAT=IOS)
For X =X [1.0999999999999998,1.2000000000000002]
END DO
ABS(X) = [1.0999999999999998,1.2000000000000002]
END PROGRAM Intervalle
LOG(X) = [0.095310179804324726,0.18232155679395479]
SQRT(X)= [1.0488088481701514,1.0954451150103324]
SIN(X) = [0.89120736006143519,0.93203908596722652]
ACOS(X)= [EMPTY]
X = ?^d
177
Dieter an Mey
11.03.2002
• Einleitung
• Fortran 90
•
•
•
•
•
•
•
•
•
Form von Fortran-Programmen
Datenobjekte und Attribute
Ausdrücke und Zuweisungen
Programmsteuerung (Kontrollstrukturen)
Programmeinheiten, Module
Feldverarbeitung
Zeiger
Ein-/Ausgabe
Vordefinierte Unterprogramme (intrinsic procedures)
•
•
•
•
•
Compiler
Makefiles
TotalView
Foresys
Profiler (WorkShop,gprof,tcov)
• Programmierhilfsmittel
• Zusammenfassung, Empfehlungen, Literatur und Weblinks
178
SunHPC 2002 – Einführung in Fortran 90/95
Makefiles
Dieter an Mey
11.03.2002
Inhalt
• Einleitung
• Fortran 90
makemake # berücksichtigt die USE-Anweisungen
uptime
# Wieviele CPUs sind frei ?
gmake –j 8 PROG=a.out F90FLAGS=... # parallel
ptime a.out
•
•
•
•
•
•
•
•
•
Form von Fortran-Programmen
Datenobjekte und Attribute
Ausdrücke und Zuweisungen
Programmsteuerung (Kontrollstrukturen)
Programmeinheiten, Module
Feldverarbeitung
Zeiger
Ein-/Ausgabe
Vordefinierte Unterprogramme (intrinsic procedures)
•
•
•
•
•
Compiler
Makefiles
TotalView
Foresys
Profiler (WorkShop,gprof,tcov)
• Programmierhilfsmittel
• Zusammenfassung, Empfehlungen, Literatur und Weblinks
179
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
180
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
TotalView
Inhalt
• Einleitung
• Fortran 90
. Forte61.init
. totalview.init
f90 –g ... –o a.out
totalview a.out
•
•
•
•
•
•
•
•
•
Form von Fortran-Programmen
Datenobjekte und Attribute
Ausdrücke und Zuweisungen
Programmsteuerung (Kontrollstrukturen)
Programmeinheiten, Module
Feldverarbeitung
Zeiger
Ein-/Ausgabe
Vordefinierte Unterprogramme (intrinsic procedures)
•
•
•
•
•
Compiler
Makefiles
TotalView
Foresys
Profiler (WorkShop,gprof,tcov)
• Programmierhilfsmittel
• Zusammenfassung, Empfehlungen, Literatur und Weblinks
181
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
182
Foresys
FORtran Engineering SYStem
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Foresys
FORtran Engineering SYStem - XADMIN
FORESYS (FORtran Engineering SYStem) von SIMULOG ist ein Hilfsmittel
•
•
•
zur Entwicklungsunterstuetzung
zur Qualitaetssicherung
zur Migration nach Fortran90
fuer Fortran77 und Fortran90 Programmierer.
Verfügbar auf dem HP V-Class Server (hpc4)
Aufruf:
foresys
http://www.rz.rwth-aachen.de/sw/prog/foresys/
http://www.simulog.fr/iforef.htm
http://support.rz.rwth-aachen.de/Manuals/FORESYS/Manual/foresys_manual.html
183
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
184
Foresys
FORtran Engineering SYStem - FOrtran RESTructurer
185
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Umwandlung eines Fortran77 Programmes
Vereinbarungen
186
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Umwandlung eines Fortran77 Programmes
Schleifen
187
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Umwandlung eines Fortran77 Programmes
Interface
188
From Fortran77 to Fortran 90
Restructuring with Foresys (Simulog)
Simulog)
subroutine simpeq(is,ie,js,je,ks,
...
common /change/ dqco(-1:mi+2
...
do 0530 n=1,7
do 0530 m=1,7
do 0530 l=lss(itsub),lee
i = ig(l)
j = jg(l)
k = kg(l)
lijk = l2ijk(l)
rhs(l,m)=rhs(l,m)
f
-fjac(lijk,lm00,m,n
f
-fjac(lijk,lp00,m,n
f
-fjac(lijk,l0m0,m,n
f
-fjac(lijk,l0p0,m,n
f
-fjac(lijk,l00m,m,n
f
-fjac(lijk,l00p,m,n
0530
continue
...
end
189
subroutine SIMPEQ(is,ie,js,je,ks,ke,ib,l
...
use common_change
...
!.. Implicit Declarations ..
implicit none
!.. Formal Arguments ..
integer,intent(in) :: it,itsub,ie,is,j
integer,intent(inout) :: ib
!.. Local Scalars ..
integer :: i,l,l0,l000,l00p,l0p0,lijk,
...
! ... Executable Statements ...
...
do n = 1,7
do m = 1,7
do l = LSS(itsub),LEE(itsub)
i = IG(l)
j = JG(l)
k = KG(l)
lijk = L2IJK(l)
RHS(l,m) = &
RHS(l,m) - FJAC(lijk,lm00,
... FJAC(lijk,l00p,m,n)*D
end do
end do
end do
...
end subroutine SIMPEQ
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Dieter an Mey
11.03.2002
Introducing Dynamic Memory Management
module common_change
implicit none
integer,parameter,private :: mbmin = -0
integer,parameter,private :: mbmax = +0
...
integer,parameter,private :: mi = 60
real,dimension(-1:mi+2,-1:mj+2,0:mz+1,7,mbmin:mbmax) :: dqco
end module common_change
module common_change
implicit none
real,allocatable,dimension(:,:,:,:,:) :: dqco
end module common_change
+
allocate (dqco(-1:mi+2,-1:mj+2,0:mz+1,7,mbmin:mbmax))
190
Foresys
Kommandozeilenaufrufe
forlib_create - Erzeugen eines neuen ForLib Datenbank, vollständige
Überprüfung
forlib_delete - Löschen einer ForLib Datenbank
forlib_add - Hinzufügen von Dateien zur Datenbank
forlib_remove - Herausnehmen von Programmdateien aus der Datenbank
forlib_update - Überprüfen geänderter Programmdateien und betroffene
Schnittstellen
forlib_verify - vollständig neue Überprüfung
forlib_list - Auflisten der Programmdateien und Programmmodule
forlib_callgraph - (statischer) Aufrufbaum des gesamten Programmes
SunHPC 2002 – Einführung in Fortran 90/95
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Foresys
Kommandozeilenaufrufe
partitab - Generieren von Fortran90-Feldsyntax (Vektorisierung)
. foresys.init # Umgebung vorbereiten
forlib_create -name Linpack *.f # Datenbank aufbauen
more Linpack.msg
# Fehlermeldungen ?
forlib_list -name Linpack # Liste
forlib_callgraph -name Linpack # Aufrufhierarchie
forest -name Linpack -f90 -free -mem 20 \
-o NewSrcDirectory -log LogFile\
-implicitnone \
-extractcommons \
-regenerateincludes \
-stdinclude \
-removeunusedvars \
-print2write \* \
-explicitcoercions \
-globalcase upperCase -localcase lowerCase \
-routinecase upperCase -intrinsiccase upperCase
191
192
forest - Restrukturierung des gesamten Programmpaketes,
z.B. Umwandlung in Fortran90
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Inhalt
Sun Forte Developer 6 Update 2
• Einleitung
• Fortran 90
•
•
•
•
•
•
•
•
•
Form von Fortran-Programmen
Datenobjekte und Attribute
Ausdrücke und Zuweisungen
Programmsteuerung (Kontrollstrukturen)
Programmeinheiten, Module
Feldverarbeitung
Zeiger
Ein-/Ausgabe
Vordefinierte Unterprogramme (intrinsic procedures)
•
•
•
•
•
Compiler
Makefiles
TotalView
Foresys
Profiler (WorkShop,gprof,tcov)
• Programmierhilfsmittel
f90 –g –fast –xtarget=ultra3plus ...
sample a.out
analyzer experimentfile.er &
• Zusammenfassung, Empfehlungen, Literatur und Weblinks
193
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
194
SunHPC 2002 – Einführung in Fortran 90/95
Sun Forte Developer 7 Update 0 (early
(early access)
access)
Dieter an Mey
11.03.2002
Inhalt
• Einleitung
• Fortran 90
•
•
•
•
•
•
•
•
•
Form von Fortran-Programmen
Datenobjekte und Attribute
Ausdrücke und Zuweisungen
Programmsteuerung (Kontrollstrukturen)
Programmeinheiten, Module
Feldverarbeitung
Zeiger
Ein-/Ausgabe
Vordefinierte Unterprogramme (intrinsic procedures)
•
•
•
•
•
Compiler
Makefiles
TotalView
Foresys
Profiler (WorkShop,gprof,tcov)
• Programmierhilfsmittel
. Forte70.init
f90 –g –fast –xtarget=ultra3cu ...
sample a.out
analyzer experimentfile.er &
• Zusammenfassung, Empfehlungen, Literatur und Weblinks
195
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
196
Fortran90
Neue Eigenschaften
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
Dieter an Mey
11.03.2002
Fortran90
Obsolete Eigenschaften - Empfehlungen
•
•
•
•
•
•
•
Feldverarbeitung
Dynamische Speicherverwaltung, automatische Felder
Module
Prozeduren mit optionalen und Schlüsselwortparametern
interne Prozeduren
rekursive Prozeduren
Zeiger
freies Quellformat
Vereinbarungen, IMPLICIT NONE
abgeleitete Typen
Operatorüberladung
CASE-Anweisung
EXIT und CYLCE
zahlreiche neue Intrinsic-Funktionen
neue IO-Möglichkeiten
197
SunHPC 2002 – Einführung in Fortran 90/95
Arithmetisches IF
DO-Schleifenparameter mit reellem Datentyp
DO-Schleifenenden, die kein separates CONTINUE oder END DO besitzen
ASSIGN und assigned GOTO-Anweisungen
Sprung auf END IF von außerhalb des IF-Blockes
Alternative RETURN-Anweisungen
H- Formatbeschreiber
• Anstelle von INCLUDE sollten Module verwendet werden
• IMPLICIT NONE verwenden
• Anstelle von COMMON, BLOCK DATE und EQUIVALENCE
sollten Module und dynamische Speicherverwaltung genutzt werden
11.03.2002
198
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
Fortran90
Literatur / Weblinks (1)
Fortran90
Literatur / Weblinks (2)
•
Homepage von Wilhelm Gehrke mit zahlreichen weiteren Fortran-Links
http://www.unics.uni-hannover.de/rrzn/gehrke
•
Freier Fortran90-Compiler für Linux und Kommentar dazu
http://www.psrv.com/lnxf90.html
http://www.heise.de/ix/artikel/1998/08/068
Thomas Michel, „Fortran90 Lehr- und Handbuch“
BI Wissenschaftsverlag ISBN 3-411-16861-7
•
User Notes on FortranProgramming
http://SunSITE.Informatik.RWTH-Aachen.DE/fortran
•
Fortran95 - Nachschlagewerk, RRZN Hannover, SPR.F95 1, Mai 2001,
hier im Rechenzentrum erhältlich (€9,60)
•
Weitere Links zum Thema Fortran
•
Fortran95 - Fachwörterliste Englisch-Deutsch, RRZN Hannover, SPR.F95 2, 10/95
•
Fortran90 - A Conversion Course for Fortran 77 Programmers
http://www.mcc.ac.uk/hpc/cluster_computing/IMPACT/training/f90/f77/
•
Fortran 90 for the Fortran 77 Programmer – Online Buch (auch zum Download)
http://www.nsc.liu.se/~boein/f77to90/f77to90.html
•
Chapman „Fortran 90/95 for Scientists and Engineers“
McGraw-Hill ISBN 0-07-011938-4 (teuer, sehr empfehlenswert, Lieferzeit!)
•
Brainerd, Goldberg, Adams, „Programmer‘s Guide to Fortran 90“
Springer ISBN 0-387-94570-9 (gut lesbar)
•
199
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002
http://www.fortranlib.com/
http://www.fortran.com/
http://mrccs.man.ac.uk/hpctec/courses/Fortran90/resource.html
http://www.ifremer.fr/ditigo/molagnon/fortran90/engfaq.html
http://www.uni-karlsruhe.de/~Fortran90/
•
Das g95 Projekt: http://g95.sourceforge.net/
200
SunHPC 2002 – Einführung in Fortran 90/95
Dieter an Mey
11.03.2002