|
von Baybora Baran and Seckin Gokaltun <baybora(at)be.itu.edu.tr gokaltun(at)itu.edu.tr> Über den Autor: Wir sind zwei Forschungsassistenten am Institut für Informatik der ITU. Wir arbeiten mit Ingenieur-Anwendungen an Computern und benutzen dafür Linux ... Seckins Webseite findet sich auf www.be.itu.edu.tr/~seckin Übersetzt ins Deutsche von: Hermann-Josef Beckers <beckerst/at/lst-oneline.de> |
Benutzung von PGPLOT für interaktive Grafiken unter LinuxZusammenfassung:
In diesem Artikel lernen Sie, wie man in Fortran geschriebene interaktive Grafikprogramme erstellt. PGPlot ist die Sammlung von Subroutinen, die wir in unserem Fortran-Code verwenden müssen. Wir werden die Installation und einige Anwendungen der PGPLOT-Subroutinen beschreiben. Wir werden zwei Beispiele (einschließlich Fortran-Code) zeigen, die Ihnen Ideen zu möglichen Anwendungen geben werden, die Sie mit PGPlot erstellen können.
|
Die PGPLOT-Bibliothek ist ein aus Fortran oder C aufrufbares, geräteunabhängiges Grafikpaket zum Erstellen einfacher wissenschaftlicher Graphen. Es ist gedacht zum Erzeugen grafischer Bilder in Publikationsqualität mit minimalem Aufwand. Für die meisten Anwendungen kann das Programm geräteunabhängig sein und die Ausgabe wird erst zur Laufzeit auf das passende Gerät umgeleitet.
Die PGPLOT-Bibliothek besteht aus zwei Hauptteilen: einem geräteunabhänigen Teil und einer Menge an geräteabhängigen``Gerätetreiber''-Subroutinen für die Ausgabe auf verschiedene Terminals, Bildanzeigen, Dotmatrix-Drucker, Laserdrucker und Stiftplotter. Die Unterstützung für allgemeine Dateiformate umfasst PostScript und GIF. PGPLOT selbst ist überwiegend in Standard-Fortran-77 geschrieben.
PGPLOT-Subroutinen können direkt aus einem Fortran-77- oder Fortran-90-Programm aufgerufen werden. Eine Bibliothek mit C-Bindungen (cpgplot) und eine Header-Datei (cpgplot.h) werden bereitgestellt, damit PGPLOT direkt aus einem C- oder C++-Programm aufgerufen werden kann; die Bibliothek übernimmt die Konvertierung zwischen C und Fortran. PGPLOT wurde mit UNIX (fast alle Varianten, einschließlich Linux, SunOS, Solaris, HPUX, AIX und Irix) und OpenVMS-Betriebssystemen getestet.
PGPLOT ist keine Public-Domain-Software. Für nichtkommerzielle Nutzung ist es jedoch frei verfügbar. Der Quellcode und die Dokumentation unterliegen dem Copyright des California Institute of Technology mit einigen wenigen nicht-Standard-, systemabhängigen Subroutinen. Zum Abruf der Installationsdatei und Instruktionen klicken Sie einfach hier.
Nachstehend präsentieren wir einige einfache Beispiele für PGPLOT-Anwendungen, um die Fähigkeiten von PGPLOT zu demonstrieren.
/usr/local/src/pgplot
(Distributions-Verzeichnis)
/usr/local/pgplot
(Ziel-Verzeichnis)
cd pub/pgplot
binary
hash
get pgplot5.2.tar.gz
tar
-Datei enthalten.
ftp://ftp.astro.caltech.edu/pub/pgplot/pgplot5.2.tar.gz
.
gunzip
und tar
zum Entkomprimieren und Extrahieren des Archives. Damit wird das Verzeichnis pgplot (einschließlich Unterverzeichnissen) im aktuellen Verzeichnis erstellt. Stellen Sie sicher, das Ihr aktuelles Verzeichnis dasjenige ist, in dem Sie den ``PGPLOT-Distributions''-Verzeichnisbaum erstellen wollen.
cd /usr/local/src
gunzip -c pgplot5.2.tar.gz | tar xvof -
/usr/local/src/pgplot
und die Unterverzeichnisse.
mkdir /usr/local/pgplot
Erstellen Sie die PGPLOT-Bibliothek nicht im Distributionsverzeichnis.drivers.list
aus dem Distributionsverzeichnis in das Zielverzeichnis und benutzen Sie dann einen Editor, um die Gerätetreiber auszuwählen. Diese Datei enthält eine Zeile für jeden verfügbaren Gerätetreiber: löschen Sie das Ausrufezeichen (!) am Anfang der Zeile, um den Treiber zu selektieren oder stellen Sie sicher, dass ein Ausrufezeichen vorhanden ist, wenn Sie den Treiber nicht benutzen wollen. Viele der Treiber können nur mit bestimmten Betriebssystemen benutzt werden (siehe die Hinweise in drivers.list
), daher sollten Sie nur die Treiber selektieren, die Sie auch benutzen wollen. PGPLOT kann später neu konfiguriert werden, indem die Installation an dieser Stelle neu aufgenommen wird. Die meisten Installationen sollten enthalten: das Null-Gerät (/NULL), PostScript-Drucker (/PS, /VPS, /CPS, und /VCPS), Tektronix-Terminal (/TEK, /XTERM, und
evtl. andere Varianten), und, falls das X Window-System auf dem Zielrechner verfügbar ist, auch die X Window-Treiber (/XWINDOW, /XSERVE). Vielleicht möchten Sie auch Treiber für GIF-Dateien (/GIF, /VGIF) oder einige der anderen Drucker aktivieren.
cd /usr/local/pgplot cp /usr/local/src/pgplot/drivers.list . vi drivers.list (oder benutzen Sie Ihren Lieblingseditor)
makemake
, um ein Standard-UNIX-makefile für Ihr Betriebssystem, Ihren Compiler und die ausgewählten PGPLOT-Gerätetreiber zu erstellen. Betriebssstem- und Compilerinformation werden aus einer Konfigurationsdatei genommen. Konfigurationsdateien sind für die folgenden Systeme vorhanden. Wenn Ihre Konfiguration keine der aufgeführten ist oder Sie Schwierigkeiten mit der erstellten makefile-Datei haben, finden Sie unten Informationen über die Erstellung Ihrer eigenen Konfigurationsdatei. f77
den GNU g77-Compiler aufruft, können Sie keine Konfigurationsdatei benutzen, die z. B. für einen SPARC f77-Compiler erstellt wurde. In der folgenden Tabelle ist Arg#2 ein Code für das Betriebssystem, und Arg#3 ist ein Code für die Fortran- und C-Compiler. Für weitere Informationen zu den unterstützten Systemen siehe pgplot/sys_*/aaaread.me
, wobei * für eine der Optionen für Arg#2 steht.
Arg#2 Arg#3 ------ ------ aix xlf_cc alliant fortran_cc bsd g77_gcc convex fc_cc cray cf77_cc epix2 f77_cc (Control Data EP/IX 2.x) freebsd f77_cc fujitsu uxpm_frt_cc fujitsu uxpv_frt_cc hp fort77_c89 hp fort77_gcc irix f77_cc linux absoft_gcc linux f77_gcc linux g77_elf linux g77_gcc next af77_cc next f2c_cc next g77_cc next gf77_cc osf1 f77_cc osf1 f77_cc_shared sol2 f77_cc (Solaris 2.x, SunOs 5.x) sol2 f77_gcc sol2 f90_cc sol2 g77_gcc sun4 f77_acc (SunOS 4.x) sun4 f77_cc sun4 f77_gcc ultrix f77_ccWenn Ihr System eines der aufgeführten ist, gehen Sie wie folgt vor: Machen Sie das Zielverzeichnis zu Ihrem aktuellen Verzeichnis, z.B.
cd /usr/local/pgplotFühren Sie das Skript
makemake
aus dem Distributionsverzeichnis aus, z. B.
/usr/local/src/pgplot/makemake /usr/local/src/pgplot linuxDas erste an
makemake
übergebene Argument ist der Name des Distributionsverzeichnisses. Beachten Sie, dass, wenn Sie makemake
starten, Ihr akuelles Verzeichnis das Zielverzeichnis sein sollte, d. h. das Verzeichnis, in dem Sie die kompilierte Bibliothek ablegen wollen drivers.list
nicht finden kann. Zurück zu Schritt 4!
Beispiel
baybora@bilgi>../pgplot/makemake ../pgplot linux g77_gcc
For additional information, read file ../pgplot/sys_linux/aaaread.me
Reading configuration file: ../pgplot/sys_linux/g77_gcc.conf
Selecting uncommented drivers from ./drivers.list
Found drivers NUDRIV PSDRIV XWDRIV
Creating make file: makefile
Determining object file dependencies.
makemake
generiert die Datei makefile
zur weiteren Benutzung, eine Fortran-Datei grexec.f
, die alle ausgewählten Gerätetreiber enthält und eine Textdatei rgb.txt
, die Farbdefinitionen zur Benutzung durch die Routine PGSCRN enthält. (Wenn Sie bereits eine Datei rgb.txt
haben, evtl. schon mit Ihren eigenen angepaßten Definitionen, wird makemake
diese nicht verändern.) Es kopiert außerdem zwei Fortran-include-Dateien, die während der Kompilierung benötigt werden. Zu diesem Zeitpunkt haben Sie also mindestens die folgenden Dateien im Verzeichnis:
drivers.list
grexec.f
grpckg1.inc
makefile
pgplot.inc
rgb.txt
makemake
gefunden wurden, mit der übereinstimmt, die Sie in der Datei drivers.list
ausgewählt haben. Wenn Ihr UNIX-System keines der oben aufgeführten unterstützten Systeme ist, erstellen Sie Ihre eigene Konfigurationsdatei mit dem Namen local.conf
im Zielverzeichnis. Am besten kopieren Sie eine der in pgplot/sys_*/*.conf
bereitgestellten Konfigurationsdateien und editieren diese entsprechend der Kommentare in der Datei. Die makemake
-Prozedur wird die Datei local.conf
benutzen, wenn sie im aktuellen Verzeichnis existiert und Sie Arg#3 nicht angeben. Beachten Sie, dass Sie trotzdem noch Arg#2 (Betriebssystem) angeben müssen.
make
-Befehl, um die PGPLOT-Bibliothek entsprechend der Anweisungen in der Datei makefile
zu kompilieren:
make
Standardmäßig erstelltmake
: eine Objektmodul-Bibliothek, libpgplot.a
; eine Laufzeit-Bibliothek (falls auf dem gewählten Betriebssystem möglich), die binäre PGPLOT-Schriftendatei grfont.dat
, die Beispielprogramme pgdemo*
, und eine Dokumentationsdatei pgplot.doc
. Zusätzlich, falls in Schritt 4 die Treiber /XWINDOW und/oder /XSERVE ausgewählt wurden, generiert es ein Programm pgxwin_server
, und wenn der /XDISP-Treiber selektiert wurde, auch ein Programm pgdisp
. Wenn dieser Schritt erfolgreich verläuft, könnten Sie nun eintippen:
make clean
um nicht benötigte Zwischendateien zu entfernen. Danach haben Sie die folgenden Dateien im aktuellen Verzeichnis:drivers.list
grexec.f
grfont.dat (binäre Schriftendatei)*
libpgplot.a (PGPLOT-Bibliothek)*
libpgplot.so (Laufzeit-Bibliothek, optional)*
makefile
pgdemo1 ... pgdemo16 (Demonstrations-Programme)
pgdisp (erforderlich für den /XDISP-Treiber)*
pgplot.doc (ASCII-Dokumentations-Datei)
pgxwin_server (erforderlich für den /XWINDOW-Treiber)*
rgb.txt (Datenbank für Farbnamen)*
pgmdemo (ausführbares Demo-Programm)
libXmPgplot.a (Objekt-Bibliothek, erforderlich für PGPLOT/Motif-Anwendungen)*
XmPgplot.h (header-Datei, erforderlich für PGPLOT/Motif-Anwendungen)*
libtkpgplot.a (Objekt-Bibliothek, erforderlich für PGPLOT/Tk-Anwendungen)*
pgtkdemo (ausführbares Demo-Programm)
pgtkdemo.tcl (vom Demo-Programm benutztes Skript)
tkpgplot.h (header-Datei, erforderlich für PGPLOT/Tk-Anwendungen)*
PGPLOT_DIR
korrekt definiert ist. Dies ist der Name des Verzeichnisses, in dem PGPLOT nach den Dateien grfont.dat
und rgb.txt
sucht (soweit nicht die Umgebungsvariablen PGPLOT_FONT
und
PGPLOT_RGB
definiert sind, die dieses Standardverhalten abändern), und, falls erforderlich, auch nach dem X-window Server-Programm
pgxwin_server
:
UNIX csh or tcsh: setenv PGPLOT_DIR /usr/local/pgplot/
UNIX sh or bash: PGPLOT_DIR="/usr/local/pgplot/"; export PGPLOT_DIR
PGPLOT_DEV
zu setzen, z. B.
UNIX csh or tcsh: setenv PGPLOT_DEV /xwindow
Wenn Sie eine UNIX-Laufzeit-Bibliothek (z. B. unter Solaris 2.x) benutzen, könnte es erforderlich sein, das PGPLOT-Verzeichnis in den Suchpfad des Laders aufzunehmen, der in der UmgebungsvariablenLD_LIBRARY_PATH
gesetzt wird. Um ein Programm zu starten, geben Sie dessen Namen ein (mit dem Verzeichnispfad, falls das aktuelle Verzeichnis nicht in Ihrem Pfad enthalten ist):
./pgdemo1
Alle Beispielprogramme fragen nach einem Gerätenamen und -Typ. Geben Sie ein Fragezeichen?
ein, um eine Liste der verfügbaren Gerätetypen zu sehen und zu verifizieren, dass PGPLOT richtig konfiguriert wurde. Was Sie prüfen sollten: dass das PGPLOT-Programm korrekt die Schriftendatei liest und Hoch-/Tiefstellung und spezielle Zeichen korrekt anzeigt (pgdemo2); ob das PGPLOT-Programm die Farbdatenbank korrekt lesen kann (pgdemo10); bei interaktiven Geräten, ob der Cursor korrekt arbeitet (pgdemo5, pgdemo6).
PROGRAM EX1 INTEGER PGOPEN, I REAL XS(9), YS(9), XR(101), YR(101) C Compute numbers to be plotted. DO 10 I=1,101 XR(I) = 0.1*(I-1) YR(I) = XR(I)**2*EXP(-XR(I)) 10 CONTINUE DO 20 I=1,9 XS(I) = I YS(I) = XS(I)**2*EXP(-XS(I)) 20 CONTINUE C Open graphics device. IF (PGOPEN('?') .LT. 1) STOP C Define coordinate range of graph (0 < x < 10, 0 < y < 0.65), C and draw axes. CALL PGENV(0., 10., 0., 0.65, 0, 0) C Label the axes (note use of \u and \d for raising exponent). CALL PGLAB('x', 'y', 'PGPLOT Graph: y = x\u2\dexp(-x)') C Plot the line graph. CALL PGLINE(101, XR, YR) C Plot symbols at selected points. CALL PGPT(9, XS, YS, 18) C Close the graphics device. CALL PGCLOS END
Dieser Code zeichnet den folgenden Graphen:
Um den obigen Code erfolgreich auszuführen, müssen Sie die PGPLOT-Bibliothek und die X11-Bibliotheken mit Ihrem Code linken. Das folgende Skript erreicht das:g77 your_code_name.f -L/X11directory/ -lX11 -L/PGPLOTdirectory/ -lpgplot
Sie müssen die folgenden Dateien in das Verzeichnis einschließen, wenn Sie Ihren Code ausführen:
grfont.dat rgb.txt pgwin serverKopieren Sie einfach diese Dateien aus dem pgplot-Verzeichnis in das Verzeichnis, aus dem Sie Ihren Code starten.
In dieser Anwendung war es unser Ziel, durch Klicken mit der Maus drei Punkte auf dem Bildschirm zu markieren und dann Fortran-Code den Kreis zeichnen zu lassen, der durch diese drei Punkte markiert ist. Dieses Problem war eine Aufgabe in unserer Klasse über "Computational Geometry", die von Dr.Serdar Celebi (mscelebi(at)itu.edu.tr) geleitet wurde.
Die folgenden Routinen definieren den Hintergrund und die Einstellung für den Bereich, in dem der Graph gezeichnet wird. Die Benutzung dieser Subroutinen ist ausführlich im PGPLOT-Handbuch erklärt (s. Link zur PGPLOT-Webseite am Ende).
..
...
call PGSCR(0,1.0,1.0,1.0) !set color representation
call PGENV(-50.0,50.0,-50.0,50.0,1,1) !set window and viewport
and draw labeled frame
call PGSCI(1) !set color index
call PGSFS(2) !set fill-area style
...
..
Wir benutzen die folgende Routine, PGPT1, um einen Zeiger an dem Punkt zu zeichnen, den wir mit der Maus markieren wollen.
.. ... WRITE (*,*) 'Cursor mode:', MODE GOTO 10 END IF CALL PGPT1(X, Y, 3) !draw one graph marker ic=ic+1 xp(i)=x yp(i)=y
Nachdem wir 3 verschiedene Punkte auf dem Bildschirm markiert haben, berechnet der Fortran-Code den Mittelpunkt und zeichnet dann den Kreis, der durch diese 3 Punkte verläuft.
.. ... c-----find the radius---------------- r=(xcenter-xp(1))**2+(ycenter-yp(1))**2 r=r**0.5 c-----draw the circle------------------- call PGCIRC(xcenter,ycenter,r) !draws a circle goto 1 ... ..
Wir zeichnen den Kreis mit der oben gezeigten Routine "PGCIRC". Sie können den vorgezeichneten Kreis löschen und die Punkte erneut zuweisen, um einen anderen Kreis im gleichen Zeichenbereich zu zeichnen. Der vollständige Code ist in den Referenzen enthalten (siehe Ref. circle.f).
In dieser Anwendung war es unser Ziel, eine Näherungskurve durch die verschiedenen diskreten Punkte zu zeichnen, die mit der Maus auf dem Bildschirm markiert wurden, und dann die "porcupine"-Linien auf dieser Kurve zu zeichnen.
Porcupines sind die Linien, die benutzt werden, um unerwünschte Wendepunkte, flache Teile einer Kurve und Diskontinuitäten in Krümmungen zu entdecken. Deshalb ist dies ein wichtiges Konzept in der "Computational Geometry".
Wir entwickelten Code, der die kleinste quadratische Approximation benutzt, um eine Kurve der gewünschten Ordnung (1-4) durch eine Reihe von Punkten zu zeichnen, die vom Benutzer zufällig über eine grafische Schnittstelle mittels der Maus generiert werden können. Er hat die Fähigkeit, "porcupine"-Linien (deren Frequenz durch den Benutzer angepasst werden kann) entlang der Kurve zu zeichnen; dies ist ein Indikator für die Krümmung der Kurve.
Wir überspringen die Details des von uns geschriebenen Fortran-Codes und präsentieren hier die grafischen Ergebnisse (Sie finden den Code am Ende des Artikels).
Wir geben zuerst die diskreten Punkte auf dem Bildschirm mit der Maus ein und der Fortran-Code nimmt die Koordinaten dieser Punkte und speichert sie in einem Feld. Dann approximiert er die durch diese Punkte verlaufende Kurve in dem vom Benutzer angezeigten Bereich.(1-4)
Dann werden die "Porcupine"-Linien entlang der Kurve gezeichnet. Die Anzahl der "Porcupine"-Linien kann vom Benutzer verändert werden, und ohne den Hintergrund oder die Punkte zu verändern, kann die neue Menge an "Porcupine"-Linien entlang der gleichen Kurve gezeichnet werden.
Die Häufigkeit der "Porcupine"-Linien kann, wie unten zu sehen ist, ebenfalls erhöht werden. Außerdem kann das Programm eine neue Kurve mit der gleichen Datenmenge zeichnen.
Der LinuxFocus Redaktion schreiben
© Baybora Baran and Seckin Gokaltun "some rights reserved" see linuxfocus.org/license/ http://www.LinuxFocus.org |
Autoren und Übersetzer:
|
2005-01-14, generated by lfparser_pdf version 2.51