Version 1.1, December 1996, R.E. Ghosh
Typical environment setup includes:
% setenv PGPLOT_DIR ../libsLgf % setenv PGPLOT_FONT ../libsLgf/grfont.dat % setenv PGPLOT_ILL_DEV_1 /XSERV % setenv PGPLOT_ILL_DEV_2 /VPS % setenv PGPLOT_ILL_PPAGE 2 % ln -s ../libsLgf/libpgplot.a libpgplot.a % ln -s ../libsLgf/librlib.a librlib.a
program templote
c***** a template program using RLIB and PGPLOT libraries
c to perform simple X,Y plots
c
c PGPLOT A Scientific Graphics Library
c copyright T.G. Pearson, California Institute of Technology
c available for use freely for non-commercial use
c with extensions (R. Ghosh) for keeping several
c output devices open simultaneously PGNOPN, PGNSEL, PGNEND
c reference pgplotSS.html
c
c RLIB A general utility library (R.Ghosh)
c reference librlib.s
cUnix
c in current directory
c ln -s ../libsLgf/libpgplot.a libpgplot.a
c ln -s ../libsLgf/librlib.a librlib.a
c gfortran -o templote templote.f librlib.a libpgplot.a /usr/X11R6/libX11.a
c
dimension x(101), y1(101), y2(101)
dimension xlim(2), ylim(2), yy(202)
character*50 text
character*4 pnam
equivalence(yy(1),y1(1)),(y2(1),yy(102))
c***** this program plots f(x) and f(x') vs x, on the same axes
c in different colours, and then asks user if he
c wants a hardcopy plot; the whole then repeats for another
c set of function values
pnam='tplt'
text=' '
xlim(1)=0.
xlim(2)=10
ylim(1)=0.
ylim(2)=10.
write(6,1)
1 format('Simple plotting test using PGPLOT and RLIB')
c***** prepare for plotting by opening output devices
call pgnopn(1,' ',ier)
if(ier.ne.0) stop 'Couldn''t open PGPLOT_ILL_DEV_1 device'
c***** this will use unit 1 for screen typically
call pgnopn(2,pnam//'#',ier)
if(ier.ne.0) stop 'Couldn''t open PGPLOT_ILL_DEV_2 device'
c***** this will be hardcopy, with a filename pnamnnn.xxx
c***** where nnn is a 3 digit number
c***** open devices defined by
c environment variables (logical names) PGPLOT_ILL_DEV_1
c environment variables (logical names) PGPLOT_ILL_DEV_2
c typically PGPLOT_ILL_DEV_1 is set to /XSERV X-window screen
c PGPLOT_ILL_DEV_2 is set to /VPS PostScript file
c***** prepare to plot data on screen
call pgnsel(1,last,ier)
if(ier.ne.0) stop 'PGNSEL_1'
100 write(6,2)
2 format(
1' Give q for plotting sin(qx) and sin(qx)/qx (0 to stop : ',$)
read(5,*) q
if(q.le.0) go to 999
c***** set up data for superposed curves
npt=101
do 10 i=1,101
x(i)=(i-1)/2. +.00001
y1(i)=sin(q*x(i))
y2(i)=sin(q*x(i))/(q*x(i))
10 continue
write(text,6) q
6 format(' Y(green)=sin(qx) Y(red)=sin(qx)/qx q=',f5.1)
c***** let user set scale limits in general case
call lims('X',xlim,x,101)
call lims('Y',ylim,yy,202)
c***** plot data on screen
call myplot(x,y1,y2,npt,text,xlim,ylim)
write(6,3)
3 format(' Hardcopy (y) :',$)
read(5,4) ans
4 format(a)
if(ans.eq.'y'.or.ans.eq.'Y') go to 5
go to 100
5 call pgnsel(2,last,ier)
if(ier.ne.0) stop 'PGNSEL_2'
call myplot(x,y1,y2,npt,text,xlim,ylim)
c
c***** if autometic output of hardcopy has been defined
c by defining an environment variable for the print command
c PGPLOT_ILL_PRINT_CMD
c then calling pgend(2,ier) here will close file and print
c
c e.g. % setenv PGPLOT_ILL_PRINT_CMD "lpr -Plpps"
c or $ DEFINE PGPLOT_ILL_PRINT_CMD "PRINT/QUE=LRP1_ILL4"
c
c call pgnend(2)
c
c call pgnopn(2,pnam//'#',ier)
c***** to reopen new output file...for next picture
c
call pgnsel(last,llast,ier)
if(ier.ne.0) stop 'PGNSEL_3'
go to 100
c***** reset to screen output
999 continue
c***** close all output devices
call pgnend(1)
call pgnend(2)
end
subroutine myplot(x,y1,y2,npt,text,xlim,ylim)
c simple routine to superpose line plots of y1,y2 versus x
c input x,y1,y2,npt,text
c xlim min and max x-scale, ylim min and max of y-scale
dimension x(npt),y1(npt),y2(npt),xlim(2),ylim(2)
character*(*) text,xtxt*20,ytxt*20
xtxt=' x values '
ytxt=' y values '
c***** plot scales and titles
call rsplt(xlim,ylim,ylim,2,0,0,xtxt,ytxt,text)
c***** set to green (3)
call pgqci(isave)
call pgsci(3)
c***** continuous line added
call rsplt(x,y1,y1,npt,-100,0,xtxt,ytxt,text)
c***** second curve in red (2) added
call pgsci(2)
call rsplt(x,y2,y2,npt,-100,0,xtxt,ytxt,text)
call pgsci(isave)
c***** reset default colours
return
end
subroutine lims(str,xy,val,npt)
c displays and sets limits for scales
c input str (character) title
c val real array length npt data values
c xy real array 2 input as scale limits, returned as new
c values or unchanged
dimension xy(2),val(npt)
character*(*) str
xmax= -1e30
xmin= 1e30
do 1 i=1,npt
if(val(i).gt.xmax) xmax=val(i)
if(val(i).lt.xmin) xmin=val(i)
1 continue
10 write(6,2) str,xy,xmin,xmax
2 format(1x,a/' Scale limits : ',g12.4,' to ',g12.4/
1 ' Data range : ',g12.4,' to ',g12.4//
1' Give new scale limits or type / to continue : ',$)
read(5,*) xy
if(xy(2).gt.xy(1)) return
write(6,3) xy
3 format(' Minimum value ',g12.4,' is not less than maximum',g12.4)
go to 10
end