subroutine gra_init call cho_choose('G') end subroutine gra_open(hardcopy, ok) logical hardcopy, ok character htype*32, dtype*32, file*128, buf*256, popt*1, dest*128 character num*10 integer lf, l, i, j, iostat integer hrddev/0/ integer gradev/0/ integer pgcnt/0/ integer pan/0/ integer filcnt/1/ logical init/.true./ logical xwin/.true./ save htype, dtype, file, lf, hrddev, gradev, pgcnt, pan,init,xwin integer pgopen external gra_close, gra_print_exit ok=.false. if (hardcopy) then if (gradev .ne. 0) then call pgslct(gradev) call pgclos gradev=0 endif if (hrddev .eq. 0) then call cho_choose('P') call sys_getenv('CHOOSER_POPT', popt) if (popt .eq. 'L' .or. popt .eq. 'I') then call sys_temp_name('gra', file) call str_trim(file, file, lf) else call sys_getenv('CHOOSER_FILE', file) call str_trim(file, file, lf) if (popt .eq. 'F') then if (file .eq. '?') then file=' ' print '(x,a,$)', 'filename for graphics: ' read(*,'(a)', iostat=iostat) file if (iostat .ne. 0) file=' ' call str_trim(file, file, lf) else buf=' ' j=0 do i=lf,1,-1 if (file(i:i) .eq. '.') then j=lf-i+1 lf=i-1 buf=file(i:) exit endif enddo write(num, '(i10)') -filcnt i=index(num,'-') num(i:i)='_' write(file(lf+1:), '(a,a)') num(i:), buf(1:max(1,j)) lf=lf+11-i+j endif endif filcnt=filcnt+1 if (file(1:lf) .eq. ' ') then lf=10 file(1:lf)='pgplot.dat' endif endif call sys_getenv('CHOOSER_PAN', num) pan=1 read(num, *, err=10, end=10) pan 10 continue call sys_getenv('CHOOSER_PDEV', htype) if (htype .eq. ' ') then print *,'unknown printer device' return endif hrddev=pgopen(file(1:lf)//'/'//htype) if (hrddev .le. 0) return print *,'Opened print file ',file(1:lf) call cho_calc_pan(pan, i, j) pan=i*j call pgsubp(i,j) call pgpanl(1,1) pgcnt=1 else pgcnt=pgcnt+1 call pgslct(hrddev) call pgpage endif elseif (gradev .eq. 0) then dtype(1:1)='/' call sys_getenv('CHOOSER_GDEV', dtype(2:)) if (dtype .eq. '/') then print *,'unknown display device' return endif if (xwin .and. dtype(1:2) .eq. '/X') then xwin=.false. call sys_getenv('PG_START', buf) if (buf .ne. ' ') call sys_cmd(buf) endif gradev=pgopen(dtype) if (gradev .le. 0) then print *,'cannot open display' gradev=0 return endif call sys_err_hdl(gra_close) else call pgpage !cgt endif ok=.true. return entry gra_end_hcopy if (init) then call sys_exit_hdl(gra_print_exit) init=.false. endif if (mod(pgcnt,pan) .ne. 0) return call sys_getenv('CHOOSER_POPT', popt) if (popt .ne. 'F' .and. popt .ne. 'I') return goto 90 entry gra_print call sys_getenv('CHOOSER_POPT', popt) 90 if (popt .ne. 'I' .and. popt .ne. 'L') then if (hrddev .ne. 0) then call pgslct(hrddev) call pgclos print *,'saved ',pgcnt,' graphs on ',(pgcnt-1)/pan+1,' pages' print *,'on file ',file(1:lf) hrddev=0 endif return endif if (hrddev .ne. 0) then call sys_getenv('CHOOSER_PCMD', buf) call str_trim(buf, buf, l) i=index(buf,'*') call sys_getenv('CHOOSER_DEST', dest) if (dest .eq. ' ' .and. i .ne. 0 .or. buf .eq. ' ') then print *,'missing print command or destination for file ' 1 ,file(1:lf) else c if (htype .ne. 'PS' .and. c 1 htype .ne. 'VPS' .and. c 1 htype .ne. 'CPS' .and. c 1 htype .ne. 'VCPS') return if (i .ne. 0) then call str_trim(dest, dest, j) buf(i:)=dest(1:j)//buf(i+1:) call str_trim(buf, buf, l) endif l=l+1 buf(l+1:)=file l=l+lf call pgslct(hrddev) call pgclos hrddev=0 print *,'print ',pgcnt,' graphs on ',(pgcnt-1)/pan+1,' pages' print *,buf(1:l) print * call sys_cmd(buf(1:l)) endif endif return entry gra_close_it if (gradev .ne. 0) then call pgslct(gradev) call pgclos if ((dtype(1:2) .ne. '/X') .and. 1 (dtype(1:3) .ne. '/GW') .and. 1 (dtype(1:4) .ne. '/CGW')) 1 call sys_rd_tmo(char(0), buf, l) call sys_getenv('PG_SWITCH', buf) if (buf .ne. ' ') call sys_cmd(buf) gradev=0 endif end subroutine gra_close call gra_close_it end subroutine gra_print_exit call gra_print end subroutine gra_mult(px, py, perr, mk, n, nstyl, styl, ncol) C 24.2.95 M. Zolliker implicit none real px(*), py(*), perr(*) integer mk(*), nstyl, styl(*) integer n,ncol integer i,sty,set,maxlin logical pen real nan_value real gra_trf call pgbbuf call gra_get_nan_value(nan_value) maxlin=0 do i=1,n if (ncol .gt. 0) then call pgsci(mod(mk(i)-1, ncol)+1) endif set=mk(i) sty=set if (sty .gt. nstyl) sty=mod(sty-1,nstyl)+1 sty=styl(sty) if (abs(sty) .ge. 10 .and. set .gt. maxlin) maxlin=set if (sty .eq. -8) then ! draw point call pgpt1(px(i), gra_trf(py(i), mk(i)), -1) else if (sty .gt. 0) then ! draw error bars call pgmove(px(i), gra_trf(py(i)+perr(i), mk(i))) call pgdraw(px(i), gra_trf(py(i)-perr(i), mk(i))) endif sty=mod(abs(sty),10) if (sty .lt. 8 .and. sty .ne. 0) then ! draw marker (do not draw for point or none) call pgpt1(px(i), gra_trf(py(i), mk(i)), sty) endif endif enddo do set=1,maxlin if (ncol .gt. 0) then call pgsci(mod(set-1, ncol)+1) endif sty=set if (sty .gt. nstyl) sty=mod(sty-1,nstyl)+1 if (abs(styl(sty)) .ge. 10) then pen=.false. do i=1,n if (mk(i) .eq. set) then if (py(i) .eq. nan_value) then pen=.false. elseif (pen) then call pgdraw(px(i), gra_trf(py(i), mk(i))) else call pgmove(px(i), gra_trf(py(i), mk(i))) pen=.true. endif endif enddo endif enddo if (ncol .gt. 0) then call pgsci(1) endif call pgebuf end subroutine gra_get_nan_value(val) real val val=-0.5**31 end !! subroutine gra_auto_fmt(ndig, vx, erx, units 1 , n, inc, val, ince, err, pdig) !! !! !! determine number of digits needed after decimal point for a table of values and errors !! implicit none real vx, erx !! (out) graphical width of largest value/error integer units !! pglen units for vx/erx real val(*), err(*) !! values, errors integer ndig !! (out) digits after decimal point integer n, inc, ince !! number of values, index increment (of value, of error) integer pdig !! number of digits to add if error is 0.0 real vmax, emax, emin, ex, ey integer i, j, k, n1, n3, numl, l, lmax, mdig character*24 num vmax=0.0 emin=10.0 emax=0.0 j=1 k=1 do i=1,n if (abs(val(j)) .gt. vmax) then vmax=abs(val(j)) ! highest value endif if (err(k) .ne. 0) then if (abs(err(k)) .gt. emax) emax=abs(err(k)) ! highest error if (abs(err(k)) .lt. emin) emin=abs(err(k)) ! lowest error elseif (abs(val(j)) .lt. emin .and. val(j) .ne. 0) then emin=abs(val(j)) ! if error=0 then check for value endif j=j+inc k=k+ince enddo if (vmax .eq. 0.0) then n3=0 else n3=int(3.3-log10(vmax)) ! largest number min. 3.3 digits if (emax .eq. 0.0) n3=n3+pdig ! add more digits if error undefined endif n1=int(1-log10(emin)) ! smallest error min. 1 digit ndig=max(n1,n3) if (emax .gt. 0) then n1=int(2-log10(emax)) if (n1 .gt. ndig) ndig=n1 ! largest error min. 2 digits endif if (n3+5 .lt. ndig) ndig=n3+5 ! largest number max. 8 digits if (ndig .gt. 7) ndig=7 ! max. 7 digits after decimal point ! determine max. width of columns j=1 k=1 vx=0.0 erx=0.0 mdig=ndig do i=1,n call cvt_real_str(num, numl, val(j), 1, ndig, 1, 0) l=numl lmax=numl-mdig do while (l .gt. lmax .and. num(l:l) .eq. '0') l=l-1 enddo if (num(l:l) .eq. '.') l=l-1 mdig=numl-l call pglen(units, num(1:numl), ex, ey) if (ex .gt. vx) vx=ex if (err(k) .ne. 0.0) then call cvt_real_str(num, numl, err(k), 1, ndig, 1, 0) call pglen(units, num(1:numl), ex, ey) if (ex .gt. erx) erx=ex endif j=j+inc k=k+ince enddo if (mdig .gt. 0 .and. erx .eq. 0) then ndig=ndig-mdig if (ndig .lt. 0) ndig=0 call pglen(units, num(numl-mdig+1:numl), ex, ey) vx=vx-ex endif end !! subroutine gra_show_par(gx, gy, columns, txt !! 1 , n, inc, val, ince, err) !! !! !! output parameter(s) !! implicit none real gx, gy !! (in) start coordinates, (out) end coordinates (gx only) real val(*), err(*) !! values, errors integer columns !! 0: name above value(s), else: name to the left, number of columns integer n, inc, ince !! number of values, index increment (of value, of error) character*(*) txt !! name real ex, ey, top, vx, vx0, ve, erx, px, dx integer i, j, k, ndig, numl character*24 num real x1, x2, y1, y2 call pgqvp(0, x1, x2, y1, y2) ! save viewport call pgsvp(0.0, 1.0, 0.0, 1.0) ! set viewport to max. call gra_auto_fmt(ndig, vx, erx, 0, n, inc, val, ince, err, 1) top=gy-1.0 if (txt .ne. ' ') then ! show parameter name call pgmtxt('T', top, gx, 0.0, txt) if (columns .eq. 0) top=top-1.0 endif call pglen(0, char(177), px, ey) ! length of +- character if (columns .ne. 0) then dx=vx+erx+px*1.5 call pglen(0, txt, ex, ey) vx=vx+ex+px else vx=vx+px*0.1 endif vx=gx+vx vx0=vx ve=vx+erx if (erx .gt. 0) ve=ve+px*1.5 j=1 k=1 do i=1,n call cvt_real_str(num, numl, val(j), 1, ndig, 1, 2) call pgmtxt('T', top, vx, 1.0, num(1:numl)) if (err(k) .ne. 0) then call pgmtxt('T', top, vx+px*0.75, 0.5, char(177)) ! show +/- call cvt_real_str(num, numl, err(k), 1, ndig, 1, 2) call pgmtxt('T', top, ve, 1.0, num(1:numl)) endif if (columns .eq. 0) then top=top-1.0 else gx=ve+px if (mod(i,columns) .eq. 0) then vx=vx0 ve=vx+erx+px*1.5 top=top-1.0 else vx=vx+dx ve=ve+dx endif endif j=j+inc k=k+ince enddo call pgsvp(x1, x2, y1, y2) end subroutine gra_trfmode(modus, shift) integer modus real shift integer mode real step common /gra_com/mode, step data mode/0/ data step/0.0/ mode=max(0,min(1,modus)) step=shift end real function gra_trf(y, n) real y integer n integer mode real step common /gra_com/mode, step if (mode .eq. 0) then gra_trf=y+(n-1)*step elseif (mode .eq. 1) then ! logarithmic gra_trf=log10(max(1.e-30,y))+(n-1)*step else stop 'unimplemented transfer function' endif end real function gra_itrf(y) real y integer mode real step common /gra_com/mode, step if (mode .eq. 0) then gra_itrf=y elseif (mode .eq. 1) then ! logarithmic gra_itrf=10**(max(-30.,min(30.,y))) else stop 'unimplemented transfer function' endif end