M. Pester - LV im SS 2013
Übung 11 (Ergebnis-Ausgabe)

Ausgabe von Daten in eine Datei

( als PDF-Datei )

  1. Mit einem Rahmenprogramm soll eine Tabelle produziert werden, mit der die Rechenleistung
    Mflops={Anzahl der Operationen}·10-6 / {gemessene Zeit}
    der verschiedenen Unterprogramme für Vektoroperationen in Abhängigkeit von der Länge der verarbeiteten Vektoren gegenübergestellt wird. Eine Tabellenzeile sollte z.B. enthalten:

    • die Vektorlänge N
    • die Zahl der Mflop/s für SCAPR
    • die Zahl der Mflop/s für VSAXPY
    • die Zahl der Mflop/s für ENORM        ||x||= sqrt{sum( xi2)}
    • (evtl. weitere drei Spalten für double precision)
  2. Die Vektorlänge N sollte zwischen 100 und 100 000 variieren. (z.B. 100,500,1000,5000,10000,15000,20000,30000,50000,...)
    Die Anzahl der Wiederholungen eines Unterprogrammaufrufs (zum Zweck der Zeitmessung) ist sinnvollerweise von N abhängig zu wählen, so dass bei jedem N etwa die gleiche Anzahl Operationen in die Zeitmessung eingeht.
    Die Ausgabe in eine Datei kann zunächst ohne spezielle Formatierung erfolgen, indem eine (fast) beliebige Dateinummer (nr > 7) und das Standard-Ausgabeformat (*) verwendet wird:
          nr = 9
          ...
          write (nr,*) N,(mflop(k),k=1,6)   ! schreibt eine Tabellenzeile
          ...
    
    
    Dies erzeugt (unter Linux) eine Datei 'fort.9'.
  3. Die einfachste Variante, den Dateinamen selbst zu bestimmen:
          nr = 9
          OPEN(nr,FILE='dateiname')
          ...
          ...
          ...
          CLOSE(nr)     ! nach Ausgabe der letzten Zeile
          ...
    
    
    Die CLOSE-Anweisung ist nicht notwendig, aber zu empfehlen.
  4. Zur grafischen Auswertung der Ergebnisse ist gnuplot gut geeignet. Das Programm wird (unabhängig vom Fortran-Programm) von der Kommandozeile gestartet und zeigt nach Eingabe folgender Kommandos die Daten der in der Datei gespeicherten Tabelle grafisch an:
       set data style lines
       set grid
       set title "Rechenleistung"
       plot \
       "dateiname" using 1:2 title "scapr", \
       "dateiname" using 1:3 title "vsaxpy", \
       "dateiname" using 1:4 title "enorm", \
       "dateiname" using 1:5 title "dscapr", \
       "dateiname" using 1:6 title "vdaxpy", \
       "dateiname" using 1:7 title "dnorm"
    
    Das Zeichen "\" am Zeilenende bedeutet, dass das Kommando auf der Folgezeile fortgesetzt wird. Sonst muss das gesamte plot-Kommando in einer Zeile stehen.

    Werden diese Kommandos in eine Datei plotcmd geschrieben, so hat man bei gnuplot nur noch einzugeben:

       load "plotcmd"
    
    
  5. Als weitere Vergleichsmöglichkeit bietet sich an, die Unterprogramme mit unterschiedlichen Compileroptionen zu übersetzen. Man teste z.B. (durch entsprechende Definition der Variablen FFLAGS=... im Makefile)
       gfortran -g   ...
       gfortran -O2  ...
       gfortran -O3  ...
       gfortran -ffast-math -fexpensive-optimizations  ...
       gfortran -funroll-all-loops -fomit-frame-pointer ...
     
    
  6. Komfortablere Arbeit mit Dateien:
    Der Hauptname filename der zu schreibenden Dateien soll vom Nutzer eingegeben werden können. Mit Hilfe von Zeichenkettenoperationen sollen aus diesem Wortstamm zwei Dateinamen erzeugt werden, denn das Programm soll unter dem Namen filename.dat eine Datei mit der Rechenzeittabelle und unter filename.plot eine Datei mit den dazugehörigen Gnuplot-Kommandos schreiben.
    Wenn eine der beiden Dateien schon vorhanden ist (mit INQUIRE festzustellen), soll eine Warnung erscheinen, woraufhin der Nutzer zu entscheiden hat, ob die Datei überschrieben wird oder ein anderer Name eingegeben werden soll.

    Bitte beachten, dass Zeichenkettenvariable am Ende mit Leerzeichen aufgefüllt sind. Es ist nicht zu empfehlen, durch Verkettung von Zeichenketten Dateinamen der Art 'name    .dat' zu produzieren. (Funktion LEN_TRIM(...) benutzen)

    Verwendung von INQUIRE:

          CHARACTER*20 filename
          LOGICAL      exists
          INTEGER      nr
          ...
          filename=...
          nr=...
          INQUIRE (FILE=filename,EXIST=exists)
          IF (exists) THEN
             write(*,*) 'schon vorhanden ...'
             ...
          ELSE
             OPEN(nr,FILE=filename)
          ENDIF
          ...
    



File translated from TEX by TTH, version 3.08.
28
Aug
Wir sind am 30. und 31.08. mit einem bunten Programm dabei
03
Sep
Auch wir sind mit zahlreichen Läuferinnen und Läufern am Start
15
Sep
Zusätzliche Einschreibemöglichkeit am Samstag den 20.09.`14 und "72 Stunden Non-Stop Online-Beratung" uvm.
19
Sep
... für ein Studium an der TU Chemnitz zum Wintersemester 2014/2015
20
Sep
Tag der offenen Tür der Chemie ab 15:00 Uhr im Alten Heizhaus (Straße der Nationen 62)