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