|
|
Este artículo está disponible en los siguientes idiomas: English Castellano Deutsch Francais Turkce |
por Baybora Baran and Seckin Gokaltun <baybora(at)be.itu.edu.tr, gokaltun(at)itu.edu.tr> Sobre el autor: Somos dos ayudantes de investigación en el Instituto de informática de ITU. Trabajamos con aplicaciones de ingeniería con ordenadores y empleamos Linux para ello... La página de Seckin está en www.be.itu.edu.tr/~seckin Taducido al español por: Miguel Alfageme Sánchez <malfageme(at)terra.es> Contenidos:
|
Utilizando PGPLOT para gráficos interactivos bajo LinuxResumen:
En este artículo aprenderemos cómo contruir programas
con gráficos interactivos escritos en Fortran. PGPLOT es la
lista de subrutinas que necesitamos utilizar con nuestro código
Fortran. Describiremos la instalación y algunas aplicaciones de
las subrutinas PGPLOT. Se van a mostrar dos ejemplos, con el
código Fortran incluído, que nos dará una idea de
las posibles aplicaciones que podemos hacer con PgPlot.
|
La librería gráfica PGPLOT es un paquete gráfico para la realización de gráficas científicas simples, independiente del dispositivo y que se puede utilizar desde Fortran o C. Su objetivo consiste en la creación de imágenes gráficas con calidad para publicarse y todo con un mínimo esfuerzo. Para la mayoría de las aplicaciones, el programa puede ser independiente del dispositivo, y la salida puede redirigirse al dispositivo adecuado en el momento de la ejecución.
La librería PGPLOT consiste en dos partes principales: una parte independiente del dispositivo y un conjunto de subrutinas controladoras dependientes del dispositivo para la salida en varios tipos de terminales, displays, impresoras matriciales, impresoras láser, y plotters. Están soportados formatos de ficheros comunes, incluyendo PostScript y GIF. PGPLOT, en sí mismo está escrito en su mayor parte en Fortran-77 estándar.
Las subrutinas PGPLOT se pueden llamar directamente desde un programa Fortran-77 o Fortran-90. Se proporciona una librería C de enlace (cpgplot) y un fichero de cabecera (cpgplot.h) para permitir que el PGPLOT pueda ser invocado desde un programa C o C++; la librería de enlace maneja la conversión entre C y Fortran. PGPLOT ha sido probado con sistemas operativos UNIX (la mayoría de sus variantes, incluyendo Linux, SunOS, Solaris, HPUX, AIX, e Irix) y OpenVMS.
PGPLOT no es un software de dominio público. Sin embargo, está disponible gratuitamente para uso no comercial. El código fuente y la documentación tienen el copyright del California Institute of Technology con unas pocas subrutinas no estándar y dependientes del sistema. Para conseguir el fichero de instalación e instrucciones simplemente hay que pinchar aquí.
A continuación se presentan algunos ejemplos sencillos de aplicaciones PGPLOT para demostrar las posibilidades del PGPLOT.
/usr/local/src/pgplot
(directorio de
distribución)
/usr/local/pgplot
(directorio destino)
cd pub/pgplot
binary
hash
get pgplot5.2.tar.gz
tar
. ftp://ftp.astro.caltech.edu/pub/pgplot/pgplot5.2.tar.gz
.
gunzip
y tar
para descomprimir
el fichero y extraer su contenido. Esto creará el directorio
pgplot (y subdirectorios) en el directorio actual. Es conveniente
asegurarse que el directorio actual es donde se quiere crear el
árbol de directorios de la ``distribución PGPLOT''.
cd /usr/local/src
gunzip -c pgplot5.2.tar.gz | tar xvof -
/usr/local/src/pgplot
y
sus subdirectorios.
mkdir /usr/local/pgplot
No se debe intentar crear la librería PGPLOT en el directorio de distribución.drivers.list
del directorio de
distribución al directorio destino, y entonces emplear un
editor de textos para seleccionar los controladores de dispositivo.
Este fichero contiene una línea por cada controlador disponible:
borraremos la exclamación (!) del comienzo de la línea para
incluir el controlador, o nos aseguraremos de que existe la
exclamación si queremos excluir el controlador. Muchos
de los controladores pueden ser utilizador únicamente en ciertos
sistemas operativos (ver las notas en drivers.list
),
por lo que incluiremos sólo los controladores que tenemos
planeado utilizar. PGPLOT se puede reconfigurar posteriormente
recomenzando la instalación en este punto. La mayoría
de las instalaciones deberían incluir: el dispositivo null
(/NULL), impresoras PostScript (/PS, /VPS, /CPS, y /VCPS),
terminales Tektronix (/TEK, /XTERM, y posiblemente otras variantes),
y, si el sistema X window está disponible en el destino,
los controladores X window (/XWINDOW, /XSERVE). También
podríamos querer incluir los controladores para ficheros GIF
(/GIF, /VGIF) o alguno de las otras impresoras.
cd /usr/local/pgplot cp /usr/local/src/pgplot/drivers.list . vi drivers.list (o nuestro editor preferido)
makemake
, para
generar un makefile UNIX estándar para nuestro sistema
operativo, compiladores, y la lista de los controladores de
dispositivo PGPLOT seleccionados. La información del
Sistema operativo y compilador se obtiene de un fichero de
configuración. Los ficheros de configuración
están disponibles para los sistemas enumerados a
continuación. Si nuestra configuración no es una de
las que aparecen en la lista, o si tenemos problemas utilizando el
makefile generado, más abajo podemos encontrar información
acerca de la creación de nuestro propio fichero de
configuración. f77
invoca el compilador GNU g77,
entonces no podemos utilizar un fichero de configuración
diseñado para, digamos, un compilador SPARC f77. Tendremos
que crear un fichero de configuración especial. En la
siguiente tabla, Arg#2 es un código para el sistema
operativo, y Arg#3 es un código para los compiladores de
Fortran y C. Para más información acerca de los
sistemas soportados, podemos ver el fichero
pgplot/sys_*/aaaread.me
, donde * es una de las
opciones para Arg#2.
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_ccSi nuestro sistema es uno de los enumerados, procederemos de la siguiente manera: Estableceremos el directorio destino como nuestro directorio actual por defecto, p.e.,
cd /usr/local/pgplotEjecutaremos el script
makemake
desde el directorio
de distribución: p.e.,
/usr/local/src/pgplot/makemake /usr/local/src/pgplot linuxEl primer argumento proporcionado al
makemake
es el
nombre del directorio de la distribución. Nótese que
cuando ejecutamos makemake
, nuestro directorio actual
debería ser el directorio destino, i.e., el directorio en
el que queremos dejar la librería compilada. drivers.list
. ¡Regresaremos entonces al paso 4!
Ejemplo
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
genera un fichero
makefile
para su uso posterior, un fichero Fortran
grexec.f
que llama a los controladores de dispositivo
seleccionados, y un fichero de texto rgb.txt
que
contiene definiciones de color para ser utilizadas por la PGSCRN.
(Si ya tenemos un fichero rgb.txt
, posiblemente
modificado con nuestras propias definiciones a medida,
makemake
no lo modifica.)
También copia dos ficheros include de Fortran que se
necesitarán durante la compilación. Por tanto en
este punto tendremos al menos los siguientes ficheros:
drivers.list
grexec.f
grpckg1.inc
makefile
pgplot.inc
rgb.txt
makemake
dice que encontró se corresponde
con aquellos que seleccionamos en drivers.list
. Si
nuestro sistema UNIX no es uno de los soportados listados
anteriormente, crearemos nuestro propio fichero de
configuración en el directorio destino, con el nombre
local.conf
. Lo mejor es copiar uno de los ficheros
de configuración proporcionados (de
pgplot/sys_*/*.conf
), y entonces editarlo siguiendo
los comentarios en el fichero. El procedimiento
makemake
utilizará local.conf
si existe en el directorio actual, y si no especificamos Arg#3.
Nótese que todavía debemos especificar Arg#2
(sistema operativo).
make
para compilar
la librería PGPLOT siguiendo las instrucciones del
makefile
:
make
Por defecto,make
generará: una librería
objeto, libpgplot.a
; una librería compartida
(si es posible para el sistema operativo seleccionado), el fichero de
fuente binario PGPLOT grfont.dat
, los programas de
demostración pgdemo*
, y un fichero de
documentación pgplot.doc
. Además, si el
controlador /XWINDOW y/o /XSERVE fue seleccionado en el paso 4,
generará un programa pgxwin_server
, y si fue
seleccionado el controlador /XDISP, generará un programa
pgdisp
. Si este paso se ejecuta correctamente, podemos
teclear
make clean
para eliminar los ficheros intermedios no necesarios. Entonces tendremos los siguiente ficheros en el directorio actual:drivers.list
grexec.f
grfont.dat (fichero de fuente binario)*
libpgplot.a (librería PGPLOT)*
libpgplot.so (librería compartida, opcional)*
makefile
pgdemo1 ... pgdemo16 (programas de demostración)
pgdisp (requerido por el controlador /XDISP)*
pgplot.doc (fichero ASCII de documentación)
pgxwin_server (requerido por el controlador /XWINDOW)*
rgb.txt (base de datos de colores)*
pgmdemo (progama ejecutable de demostración)
libXmPgplot.a (librería objeto requerida por las aplicaciones
PGPLOT/Motif)*
XmPgplot.h (fichero de cabecera requerido por las aplicaciones
PGPLOT/Motif)*
libtkpgplot.a (librería objeto requerida por las aplicaciones
PGPLOT/Tk)*
pgtkdemo (programa ejecutable de demostración)
pgtkdemo.tcl (script utilizado por el programa de demostración)
tkpgplot.h (fichero de cabecera requerido por las aplicaciones
PGPLOT/Tk)*
PGPLOT_DIR
está correctamente definida.
Este es el nombre del directorio en el cual el PGPLOT buscará
los ficheros grfont.dat
y rgb.txt
(a no
ser que las variables de entorno PGPLOT_FONT
y
PGPLOT_RGB
estén definidas para ignorar este
comportamiento por defecto), y, si fuese necesario, el programa
servidor de X-window pgxwin_server
:
UNIX csh o tcsh: setenv PGPLOT_DIR /usr/local/pgplot/
UNIX sh o bash: PGPLOT_DIR="/usr/local/pgplot/"; export PGPLOT_DIR
PGPLOT_DEV
, e.g.
UNIX csh o tcsh: setenv PGPLOT_DEV /xwindow
Cuando se utilice una librería UNIX compartida (p.e., en Solaris 2.x), también se puede necesitar poner el directorio PGPLOT en la ruta de búsqueda del cargador, definida en la variable de entornoLD_LIBRARY_PATH
. Para ejecutar un programa,
teclearemos su nombre (con su directorio si el directorio
actual no está en el path):
./pgdemo1
Todos los programas de demostración piden un nombre y un tipo de dispositivo. Se puede teclear un símbolo de interrogación para ver una lista de los tipos de dispositivos disponibles y verificar que el PGPLOT ha sido adecuadamente configurado. Los puntos que hay que comprobar son: el programa PGPLOT lee correctamente el fichero de fuente y muestra subíndices, superíndices y caracteres especiales (pgdemo2); el programa PGPLOT puede leer la base de datos de colores (pgdemo10); en dispositivos interactivos, el cursor funciona correctamente (pgdemo5, pgdemo6).PROGRAM EX1 INTEGER PGOPEN, I REAL XS(9), YS(9), XR(101), YR(101) C Calcular los numeros a representar. 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 Abrir el dispositivo de graficos. IF (PGOPEN(�') .LT. 1) STOP C Definir el rango de coordenadas del grafico (0 < x < 10, 0 < y < 0.65), C y dibujar los ejes. CALL PGENV(0., 10., 0., 0.65, 0, 0) C Etiquetar los ejes (se usa \u y \d para el exponenete). CALL PGLAB('x', 'y', 'PGPLOT Graph: y = x\u2\dexp(-x)') C Se Dibuja la linea de la grafica. CALL PGLINE(101, XR, YR) C Se dibujan los simbolos en los puntos seleccionados. CALL PGPT(9, XS, YS, 18) C Se cierra el dispositivo de graficos. CALL PGCLOS END
Esto dibuja el siguiente gráfico:
Para ejecutar el código anterior con éxito, necesitamos enlazar la librería PGPLOT y las librerías X11 con nuestro código. El script siguiente hace eso:g77 nombre_del_codigo.f -L/directorioX11/ -lX11 -L/directorioPGPLOT/ -lpgplot
Necesitamos incluir los siguientes ficheros en el directorio donde estamos ejecutando nuestro código:
grfont.dat rgb.txt pgwin serversimplemente copiaremos estos ficheros del directorio del PGPLOT al directorio donde estamos ejecutando nuestro código.
En esta aplicación, nuestro objetivo era marcar tres puntos en la pantalla pinchando con el ratón y dejar que el código Fortran dibuje un círculo que pase por estos tres puntos. Este problema fue un ejercicio de nuestra clase de Geometría Computacional, conducida por Dr.Serdar Celebi (mscelebi(at)itu.edu.tr).
Las siguientes rutinas definen el fondo y configuración del área en la que se va a pintar el gráfico. Un uso detallado de estas subrutinas viene explicado en el manual del PGPLOT. (ver el enlace a la página del PGPLOT al final del artículo)
..
...
call PGSCR(0,1.0,1.0,1.0) !establece la representacion del color
call PGENV(-50.0,50.0,-50.0,50.0,1,1) !establece la ventana y la vista
y dibuja un marco
call PGSCI(1) !establece el indice del color
call PGSFS(2) !establece el tipo de llenado de area
...
..
Utilizamos la siguiente rutina, PGPT1, para dibujar un puntero en el punto que queremos marcar con el ratón.
.. ... WRITE (*,*) 'Modo cursor:', MODE GOTO 10 END IF CALL PGPT1(X, Y, 3) !dibuja una marca ic=ic+1 xp(i)=x yp(i)=y
Después de marcar tres puntos diferentes en la pantalla, el código Fortran calcula el centro y entonces dibuja el círculo pasando por estos 3 puntos.
.. ... c-----encuentra el radio---------------- r=(xcenter-xp(1))**2+(ycenter-yp(1))**2 r=r**0.5 c-----dibuja el circulo------------------- call PGCIRC(xcenter,ycenter,r) !dibuja un circulo goto 1 ... ..
Dibujamos el círculo con la rutina mostrada anteriormente, "PGCIRC". Podemos limpiar el círculo predibujado y asignar los puntos desde el principio para dibujar otro círculo en el mismo área de dibujado. El código completo está incluído en las referencias (ver Ref. circle.f).
En esta aplicación, nuestro objetivo consistía
en dibujar una curva de aproximación a través de
varios puntos discretos marcados con el ratón en la
pantalla y, entonces, dibujar las líneas "porcupine" en
esta curva.
Las porcupines son las líneas que se utilizan para
detectar puntos de inflexión no deseados, partes planas
de una curva, y discontinuidades en su curvatura. Es por esto
que son un concepto importante en la Geometría
computacional.
Nosotros desarrollamos un código que utiliza la
aproximación del mínimo cuadrado para dibujar
una curva del orden deseado (1~4) a través de un
conjunto de puntos que pueden ser generados aleatoriamente
por el usuario a través de una interfaz gráfica
utilizando el ratón. Tiene la capacidad de dibujar
porcupines en la curva (cuya frecuencia se puede ajustar por
el usuario) que son un indicador de la curvatura de la curva.
Saltándonos los detalles del código Fortran que
hemos escrito, aquí presentamos los resultados
gráficos (Podemos encontrar el código al final
del artículo).
Primero introducimos los puntos discretos en la pantalla con el ratón y el código Fortran toma las coordenadas de estos puntos y las almacena en un array. Entonces aproxima la curva pasando por estos puntos según el grado indicado por el usuario.(1-4)
Entonces se dibujan las líneas porcupine en la curva. El número de líneas puede ser modificado por el usuario, y sin cambiar el fondo o los puntos el nuevo conjunto de porcupines puede ser dibujado en la misma curva.
La frecuencia de las porcupines también puede incrementarse tal y como vemos a continuación. Además el programa puede dibujar una nueva curva en el mismo conjunto de datos.
|
Contactar con el equipo de LinuFocus
© Baybora Baran and Seckin Gokaltun, FDL LinuxFocus.org |
Información sobre la traducción:
|
2003-01-28, generated by lfparser version 2.34