aboutsummaryrefslogtreecommitdiff
path: root/sys/gio/ncarutil/hafton.f
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /sys/gio/ncarutil/hafton.f
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'sys/gio/ncarutil/hafton.f')
-rw-r--r--sys/gio/ncarutil/hafton.f830
1 files changed, 830 insertions, 0 deletions
diff --git a/sys/gio/ncarutil/hafton.f b/sys/gio/ncarutil/hafton.f
new file mode 100644
index 00000000..7d597470
--- /dev/null
+++ b/sys/gio/ncarutil/hafton.f
@@ -0,0 +1,830 @@
+ SUBROUTINE HAFTON (Z,L,M,N,FLO,HI,NLEV,NOPT,NPRM,ISPV,SPVAL)
+C
+C
+C +-----------------------------------------------------------------+
+C | |
+C | Copyright (C) 1986 by UCAR |
+C | University Corporation for Atmospheric Research |
+C | All Rights Reserved |
+C | |
+C | NCARGRAPHICS Version 1.00 |
+C | |
+C +-----------------------------------------------------------------+
+C
+C
+C SUBROUTINE HAFTON (Z,L,M,N,FLO,HI,NLEV,NOPT,NPRM,ISPV,SPVAL)
+C
+C
+C DIMENSION OF Z(L,M)
+C ARGUMENTS
+C
+C LATEST REVISION JULY,1984
+C
+C PURPOSE HAFTON DRAWS A HALF-TONE PICTURE FROM DATA
+C STORED IN A RECTANGULAR ARRAY WITH THE
+C INTENSITY IN THE PICTURE PROPORTIONAL TO
+C THE DATA VALUE.
+C
+C USAGE IF THE FOLLOWING ASSUMPTIONS ARE MET, USE
+C
+C CALL EZHFTN (Z,M,N)
+C
+C ASSUMPTIONS:
+C .ALL OF THE ARRAY IS TO BE DRAWN.
+C .LOWEST VALUE IN Z WILL BE AT LOWEST
+C INTENSITY ON READER/PRINTER OUTPUT.
+C .HIGHEST VALUE IN Z WILL BE AT
+C HIGHEST INTENSITY.
+C .VALUES IN BETWEEN WILL APPEAR
+C LINEARLY SPACED.
+C .MAXIMUM POSSIBLE NUMBER OF
+C INTENSITIES ARE USED.
+C .THE PICTURE WILL HAVE A PERIMETER
+C DRAWN.
+C .FRAME WILL BE CALLED AFTER THE
+C PICTURE IS DRAWN.
+C .Z IS FILLED WITH NUMBERS THAT SHOULD
+C BE USED (NO MISSING VALUES).
+C
+C IF THESE ASSUMPTIONS ARE NOT MET, USE
+C
+C CALL HAFTON (Z,L,M,N,FLO,HI,NLEV,
+C NOPT,NPRM,ISPV,SPVAL)
+C
+C ARGUMENTS
+C
+C ON INPUT Z
+C FOR EZHFTN M BY N ARRAY TO BE USED TO GENERATE A
+C HALF-TONE PLOT.
+C
+C M
+C FIRST DIMENSION OF Z.
+C
+C N
+C SECOND DIMENSION OF Z.
+C
+C ON OUTPUT ALL ARGUMENTS ARE UNCHANGED.
+C FOR EZHFTN
+C
+C ON INPUT Z
+C FOR HAFTON THE ORIGIN OF THE ARRAY TO BE PLOTTED.
+C
+C L
+C THE FIRST DIMENSION OF Z IN THE CALLING
+C PROGRAM.
+C
+C M
+C THE NUMBER OF DATA VALUES TO BE PLOTTED
+C IN THE X-DIRECTION (THE FIRST SUBSCRIPT
+C DIRECTION). WHEN PLOTTING ALL OF AN
+C ARRAY, L = M.
+C
+C N
+C THE NUMBER OF DATA VALUES TO BE PLOTTED
+C IN THE Y-DIRECTION (THE SECOND SUBSCRIPT
+C DIRECTION).
+C
+C FLO
+C THE VALUE OF Z THAT CORRESPONDS TO THE
+C LOWEST INTENSITY. (WHEN NOPT.LT.0, FLO
+C CORRESPONDS TO THE HIGHEST INTENSITY.)
+C IF FLO=HI=0.0, MIN(Z) WILL BE USED FOR FLO.
+C
+C HI
+C THE VALUE OF Z THAT CORRESPONDS TO THE
+C HIGHEST INTENSITY. (WHEN NOPT.LT.0, HI
+C CORRESPONDS TO THE LOWEST INTENSITY.) IF
+C HI=FLO=0.0, MAX(Z) WILL BE USED FOR HI.
+C
+C NLEV
+C THE NUMBER OF INTENSITY LEVELS DESIRED.
+C 16 MAXIMUM. IF NLEV = 0 OR 1, 16 LEVELS
+C ARE USED.
+C
+C NOPT
+C FLAG TO CONTROL THE MAPPING OF Z ONTO THE
+C INTENSITIES. THE SIGN OF NOPT CONTROLS
+C THE DIRECTNESS OR INVERSENESS OF THE
+C MAPPING.
+C
+C . NOPT POSITIVE YIELDS DIRECT MAPPING.
+C THE LARGEST VALUE OF Z PRODUCES THE
+C MOST DENSE DOTS. ON MECHANICAL PLOTTERS,
+C LARGE VALUES OF Z WILL PRODUCE A DARK
+C AREA ON THE PAPER. WITH THE FILM
+C DEVELOPMENT METHODS USED AT NCAR,
+C LARGE VALUES OF Z WILL PRODUCE MANY
+C (WHITE) DOTS ON THE FILM, ALSO
+C RESULTING IN A DARK AREA ON
+C READER-PRINTER PAPER.
+C . NOPT NEGATIVE YIELDS INVERSE MAPPING.
+C THE SMALLEST VALUES OF Z PRODUCE THE
+C MOST DENSE DOTS RESULTING IN DARK
+C AREAS ON THE PAPER.
+C
+C THE ABSOLUTE VALUE OF NOPT DETERMINES THE
+C MAPPING OF Z ONTO THE INTENSITIES. FOR
+C IABS(NOPT)
+C = 0 THE MAPPING IS LINEAR. FOR
+C EACH INTENSITY THERE IS AN EQUAL
+C RANGE IN Z VALUE.
+C = 1 THE MAPPING IS LINEAR. FOR
+C EACH INTENSITY THERE IS AN EQUAL
+C RANGE IN Z VALUE.
+C = 2 THE MAPPING IS EXPONENTIAL. FOR
+C LARGER VALUES OF Z, THERE IS A
+C LARGER DIFFERENCE IN INTENSITY FOR
+C RELATIVELY CLOSE VALUES OF Z. DETAILS
+C IN THE LARGER VALUES OF Z ARE DISPLAYED
+C AT THE EXPENSE OF THE SMALLER VALUES
+C OF Z.
+C = 3 THE MAPPING IS LOGRITHMIC, SO
+C DETAILS OF SMALLER VALUES OF Z ARE SHOWN
+C AT THE EXPENSE OF LARGER VALUES OF Z.
+C = 4 SINUSOIDAL MAPPING, SO MID-RANGE VALUES
+C OF Z SHOW DETAILS AT THE EXPENSE OF
+C EXTREME VALUES OF Z.
+C = 5 ARCSINE MAPPING, SO EXTREME VALUES OF
+C Z ARE SHOWN AT THE EXPENSE OF MID-RANGE
+C VALUES OF Z.
+C
+C NPRM
+C FLAG TO CONTROL THE DRAWING OF A
+C PERIMETER AROUND THE HALF-TONE PICTURE.
+C
+C . NPRM=0: THE PERIMETER IS DRAWN WITH
+C TICKS POINTING AT DATA LOCATIONS.
+C (SIDE LENGTHS ARE PROPORTIONAL TO NUMBER
+C OF DATA VALUES.)
+C . NPRM POSITIVE: NO PERIMETER IS DRAWN. THE
+C PICTURE FILLS THE FRAME.
+C . NPRM NEGATIVE: THE PICTURE IS WITHIN THE
+C CONFINES OF THE USER'S CURRENT VIEWPORT
+C SETTING.
+C
+C ISPV
+C FLAG TO TELL IF THE SPECIAL VALUE FEATURE
+C IS BEING USED. THE SPECIAL VALUE FEATURE
+C IS USED TO MARK AREAS WHERE THE DATA IS
+C NOT KNOWN OR HOLES ARE WANTED IN THE
+C PICTURE.
+C
+C . ISPV = 0: SPECIAL VALUE FEATURE NOT IN
+C USE. SPVAL IS IGNORED.
+C . ISPV NON-ZERO: SPECIAL VALUE FEATURE
+C IN USE. SPVAL DEFINES THE SPECIAL
+C VALUE. WHERE Z CONTAINS THE SPECIAL
+C VALUE, NO HALF-TONE IS DRAWN. IF ISPV
+C = 0 SPECIAL VALUE FEATURE NOT IN USE.
+C SPVAL IS IGNORED.
+C = 1 NOTHING IS DRAWN IN SPECIAL VALUE
+C AREA.
+C = 2 CONTIGUOUS SPECIAL VALUE AREAS ARE
+C SURROUNDED BY A POLYGONAL LINE.
+C = 3 SPECIAL VALUE AREAS ARE FILLED
+C WITH X(S).
+C = 4 SPECIAL VALUE AREAS ARE FILLED IN
+C WITH THE HIGHEST INTENSITY.
+C
+C SPVAL
+C THE VALUE USED IN Z TO DENOTE MISSING
+C VALUES. THIS ARGUMENT IS IGNORED IF
+C ISPV = 0.
+C
+C ON OUTPUT ALL ARGUMENTS ARE UNCHANGED.
+C FOR HAFTON
+C
+C NOTE THIS ROUTINE PRODUCES A HUGE NUMBER OF
+C PLOTTER INSTRUCTIONS PER PICTURE, AVERAGING
+C OVER 100,000 LINE-DRAWS PER FRAME WHEN M = N.
+C
+C
+C ENTRY POINTS EZHFTN, HAFTON, ZLSET, GRAY, BOUND, HFINIT
+C
+C COMMON BLOCKS HAFT01, HAFT02, HAFT03, HAFT04
+C
+C REQUIRED LIBRARY GRIDAL, THE ERPRT77 PACKAGE AND THE SPPS.
+C ROUTINES
+C
+C I/O PLOTS HALF-TONE PICTURE.
+C
+C PRECISION SINGLE
+C
+C LANGUAGE FORTRAN
+C
+C HISTORY REWRITE OF PHOMAP ORIGINALLY WRITTEN BY
+C M. PERRY OF HIGH ALTITUDE OBSERVATORY,
+C NCAR.
+C
+C ALGORITHM BI-LINEAR INTERPOLATION ON PLOTTER
+C (RESOLUTION-LIMITED) GRID OF NORMALIZED
+C REPRESENTATION OF DATA.
+C
+C PORTABILITY ANSI FORTRAN 77.
+C
+C
+C
+C INTERNAL PARAMTERSS
+C VALUES SET IN BLOCK DATA
+C NAME DEFAULT FUNCTION
+C ---- ------- ________
+C
+C XLT 0.1 LEFT-HAND EDGE OF THE PLOT WHEN NSET=0. (0.0=
+C LEFT EDGE OF FRAME, 1.0=RIGHT EDGE OF FRAME.)
+C YBT 0.1 BOTTOM EDGE OF THE PLOT WHEN NSET=0. (0.0=
+C BOTTOM OF FRAME, 1.0=TOP OF FRAME.)
+C SIDE 0.8 LENGTH OF LONGER EDGE OF PLOT (SEE ALSO EXT).
+C EXT .25 LENGTHS OF THE SIDES OF THE PLOT ARE PROPOR-
+C TIONAL TO M AND N (WHEN NSET=0) EXCEPT IN
+C EXTREME CASES, NAMELY, WHEN MIN(M,N)/MAX(M,N)
+C IS LESS THAN EXT. THEN A SQUARE PLOT IS PRO-
+C DUCED. WHEN A RECTANGULAR PLOT IS PRODUCED,
+C THE PLOT IS CENTERED ON THE FRAME (AS LONG AS
+C SIDE+2*XLT = SIDE+2*YBT=1., AS WITH THE
+C DEFAULTS.)
+C ALPHA 1.6 A PARAMETER TO CONTROL THE EXTREMENESS OF THE
+C MAPPING FUNCTION SPECIFIED BY NOPT. (FOR
+C IABS(NOPT)=0 OR 1, THE MAPPING FUNCTION IS
+C LINEAR AND INDEPENDENT OF ALPHA.) FOR THE NON-
+C LINEAR MAPPING FUNCTIONS, WHEN ALPHA IS CHANGED
+C TO A NUMBER CLOSER TO 1., THE MAPPING FUNCTION
+C BECOMES MORE LINEAR; WHEN ALPHA IS CHANGED TO
+C A LARGER NUMBER, THE MAPPING FUNCTION BECOMES
+C MORE EXTREME.
+C MXLEV 16 MAXIMUM NUMBER OF LEVELS. LIMITED BY PLOTTER.
+C NCRTG 8 NUMBER OF CRT UNITS PER GRAY-SCALE CELL.
+C LIMITED BY PLOTTER.
+C NCRTF 1024 NUMBER OF PLOTTER ADDRESS UNITS PER FRAME.
+C IL (BELOW) AN ARRAY DEFINING WHICH OF THE AVAILABLE IN-
+C TENSITIES ARE USED WHEN LESS THAN THE MAXIMUM
+C NUMBER OF INTENSITIES ARE REQUESTED.
+C
+C
+C NLEV INTENSITIES USED
+C ____ ________________
+C 2 5,11,
+C 3 4, 8,12,
+C 4 3, 6,10,13,
+C 5 2, 5, 8,11,14,
+C 6 1, 4, 7, 9,12,15,
+C 7 1, 4, 6, 8,10,12,15,
+C 8 1, 3, 5, 7, 9,11,13,15,
+C 9 1, 3, 4, 6, 8,10,12,13,15
+C 10 1, 3, 4, 6, 7, 9,10,12,13,15,
+C 11 1, 2, 3, 5, 6, 8,10,11,13,14,15,
+C 12 1, 2, 3, 5, 6, 7, 9,10,11,13,14,15,
+C 13 1, 2, 3, 4, 6, 7, 8, 9,10,12,13,14,15
+C 14 1, 2, 3, 4, 5, 6, 7, 9,10,11,12,13,14,15,
+C 15 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,
+C 16 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15
+C
+C
+
+ SAVE
+ DIMENSION Z(L,N) ,PX(2) ,PY(2)
+ DIMENSION ZLEV(16) ,VWPRT(4) ,WNDW(4)
+ DIMENSION VWPR2(4) ,WND2(4)
+ CHARACTER*11 IDUMMY
+C
+C
+ COMMON /HAFTO1/ I ,J ,INTEN
+ COMMON /HAFTO2/ GLO ,HA ,NOPTN ,ALPHA ,
+ 1 NSPV ,SP ,ICNST
+ COMMON /HAFTO3/ XLT ,YBT ,SIDE ,EXT ,
+ 1 IOFFM ,ALPH ,MXLEV ,NCRTG ,
+ 2 NCRTF ,IL(135)
+ COMMON /HAFTO4/ NPTMAX ,NPOINT ,XPNT(50) ,YPNT(50)
+C +NOAO - Blockdata rewritten as run time initialization subroutine
+C
+C EXTERNAL HFINIT
+ call hfinit
+C -NOAO
+C
+C THE FOLLOWING CALL IS FOR GATHERING STATISTICS ON LIBRARY USE AT NCAR
+C
+ CALL Q8QST4 ('GRAPHX','HAFTON','HAFTON','VERSION 1')
+C
+ NPOINT = 0
+ ALPHA = ALPH
+ GLO = FLO
+ HA = HI
+ NLEVL = MIN0(IABS(NLEV),MXLEV)
+ IF (NLEVL .LE. 1) NLEVL = MXLEV
+ NOPTN = NOPT
+ IF (NOPTN .EQ. 0) NOPTN = 1
+ NPRIM = NPRM
+ NSPV = MAX0(MIN0(ISPV,4),0)
+ IF (NSPV .NE. 0) SP = SPVAL
+ MX = L
+ NX = M
+ NY = N
+ CRTF = NCRTF
+ MSPV = 0
+C
+C SET INTENSITY BOUNDARY LEVELS
+C
+ CALL ZLSET (Z,MX,NX,NY,ZLEV,NLEVL)
+C
+C SET UP PERIMETER
+C
+ X3 = NX
+ Y3 = NY
+ CALL GQCNTN (IERR,NTORIG)
+ CALL GETUSV('LS',IOLLS)
+ IF (NPRIM.LT.0) THEN
+ CALL GQNT (NTORIG,IERR,WNDW,VWPRT)
+ X1 = VWPRT(1)
+ X2 = VWPRT(2)
+ Y1 = VWPRT(3)
+ Y2 = VWPRT(4)
+ ELSE IF (NPRIM.EQ.0) THEN
+ X1 = XLT
+ X2 = XLT+SIDE
+ Y1 = YBT
+ Y2 = YBT+SIDE
+ IF (AMIN1(X3,Y3)/AMAX1(X3,Y3) .GE. EXT) THEN
+ IF (NX-NY.LT.0) THEN
+ X2 =SIDE*X3/Y3+XLT
+ X2 = (AINT(X2*CRTF/FLOAT(NCRTG))*FLOAT(NCRTG))/CRTF
+ ELSE IF (NX-NY.GT.0) THEN
+ Y2 = SIDE*Y3/X3+YBT
+ Y2 = (AINT(Y2*CRTF/FLOAT(NCRTG))*FLOAT(NCRTG))/CRTF
+ END IF
+ END IF
+ ELSE IF (NPRIM.GT.0) THEN
+ X1 = 0.0
+ X2 = 1.0
+ Y1 = 0.0
+ Y2 = 1.0
+ END IF
+ MX1 = X1*CRTF
+ MX2 = X2*CRTF
+ MY1 = Y1*CRTF
+ MY2 = Y2*CRTF
+ IF (NPRIM.GT.0) THEN
+ MX1 = 1
+ MY1 = 1
+ MX2 = NCRTF
+ MY2 = NCRTF
+ END IF
+C
+C SAVE NORMALIZATION TRANS 1
+C
+ CALL GQNT (1,IERR,WNDW,VWPRT)
+C
+C DEFINE NORMALIZATION TRANS 1 AND LOG SCALING FOR USE WITH PERIM
+C DRAW PERIMETER IF NPRIM EQUALS 0
+C
+ CALL SET(X1,X2,Y1,Y2,1.0,X3,1.0,Y3,1)
+ IF (NPRIM .EQ. 0) CALL PERIM (NX-1,1,NY-1,1)
+ IF (ICNST .NE. 0) THEN
+ CALL GSELNT (0)
+ CALL WTSTR(XLT*1.1,0.5,'CONSTANT FIELD',2,0,0)
+ GO TO 132
+ END IF
+C
+C FIND OFFSET FOR REFERENCE TO IL, WHICH IS TRIANGULAR
+C
+ IOFFST = NLEVL*((NLEVL-1)/2)+MOD(NLEVL-1,2)*(NLEVL/2)-1
+C
+C OUTPUT INTENSITY SCALE
+C
+ IF (NPRIM .GT. 0) GO TO 112
+ LEV = 0
+ KX = (1.1*XLT+SIDE)*CRTF
+ KY = YBT*CRTF
+ NNX = KX/NCRTG
+ 109 LEV = LEV+1
+C +NOAO
+C The following statement moved from after statement label 111 (CONTINUE) to
+C here. Otherwise an extra (unlabelled) grayscale box was being drawn.
+C This was (eventually) causing a [floating operand error] on a Sun-3.
+ IF (LEV .GT. NLEVL) GO TO 112
+C -NOAO
+ ISUB = IOFFST+LEV
+ INTEN = IL(ISUB)
+ IF (NOPTN .LT. 0) INTEN = MXLEV-INTEN
+ NNY = KY/NCRTG
+ DO 111 JJ=1,3
+ DO 110 II=1,10
+ I = NNX+II
+ J = NNY+JJ
+ CALL GRAY
+ 110 CONTINUE
+ 111 CONTINUE
+C +NOAO - FTN internal write rewritten as call to encode.
+C WRITE(IDUMMY,'(G11.4)') ZLEV(LEV)
+ call encode (11, '(g11.4)', idummy, zlev(lev))
+C -NOAO
+ TKX = KX
+ TKY = KY+38
+ CALL GQNT(1,IERR,WND2,VWPR2)
+ CALL SET(0.,1.,0.,1.,0.,1023.,0.,1023.,1)
+ CALL WTSTR (TKX,TKY,IDUMMY,0,0,-1)
+ CALL SET(VWPR2(1),VWPR2(2),VWPR2(3),VWPR2(4),
+ - WND2(1),WND2(2),WND2(3),WND2(4),1)
+C
+C ADJUST 38 TO PLOTTER.
+C
+ KY = KY+52
+C
+C ADJUST 52 TO PLOTTER.
+C
+ GO TO 109
+C
+C STEP THROUGH PLOTTER GRID OF INTENSITY CELLS.
+C
+ 112 IMIN = (MX1-1)/NCRTG+1
+ IMAX = (MX2-1)/NCRTG
+ JMIN = (MY1-1)/NCRTG+1
+ JMAX = (MY2-1)/NCRTG
+ XL = IMAX-IMIN+1
+ YL = JMAX-JMIN+1
+ XN = NX
+ YN = NY
+ LSRT = NLEVL/2
+ DO 130 J=JMIN,JMAX
+C
+C FIND Y FOR THIS J AND Z FOR THIS Y.
+C
+ YJ = (FLOAT(J-JMIN)+.5)/YL*(YN-1.)+1.
+ LOWY = YJ
+ YPART = YJ-FLOAT(LOWY)
+ IF (LOWY .NE. NY) GO TO 113
+ LOWY = LOWY-1
+ YPART = 1.
+ 113 IPEN = 0
+ ZLFT = Z(1,LOWY)+YPART*(Z(1,LOWY+1)-Z(1,LOWY))
+ ZRHT = Z(2,LOWY)+YPART*(Z(2,LOWY+1)-Z(2,LOWY))
+ IF (NSPV .EQ. 0) GO TO 114
+ IF (Z(1,LOWY).EQ.SP .OR. Z(2,LOWY).EQ.SP .OR.
+ 1 Z(1,LOWY+1).EQ.SP .OR. Z(2,LOWY+1).EQ.SP) IPEN = 1
+ 114 IF (IPEN .EQ. 1) GO TO 117
+C
+C FIND INT FOR THIS Z.
+C
+ IF (ZLFT .GT. ZLEV(LSRT+1)) GO TO 116
+ 115 IF (ZLFT .GE. ZLEV(LSRT)) GO TO 117
+C
+C LOOK LOWER
+C
+ IF (LSRT .LE. 1) GO TO 117
+ LSRT = LSRT-1
+ GO TO 115
+C
+C LOOK HIGHER
+C
+ 116 IF (LSRT .GE. NLEVL) GO TO 117
+ LSRT = LSRT+1
+ IF (ZLFT .GT. ZLEV(LSRT+1)) GO TO 116
+C
+C OK
+C
+ 117 IRHT = 2
+ LAST = LSRT
+ DO 129 I=IMIN,IMAX
+C
+C FIND X FOR THIS I AND Z FOR THIS X AND Y.
+C
+ IADD = 1
+ XI = (FLOAT(I-IMIN)+.5)/XL*(XN-1.)+1.
+ LOWX = XI
+ XPART = XI-FLOAT(LOWX)
+ IF (LOWX .NE. NX) GO TO 118
+ LOWX = LOWX-1
+ XPART = 1.
+C
+C TEST FOR INTERPOLATION POSITIONING
+C
+ 118 IF (LOWX .LT. IRHT) GO TO 119
+C
+C MOVE INTERPOLATION ONE CELL TO THE RIGHT
+C
+ ZLFT = ZRHT
+ IRHT = IRHT+1
+ ZRHT = Z(IRHT,LOWY)+YPART*(Z(IRHT,LOWY+1)-Z(IRHT,LOWY))
+ IF (NSPV .EQ. 0) GO TO 118
+ IPEN = 0
+ IF (Z(IRHT-1,LOWY).EQ.SP .OR. Z(IRHT,LOWY).EQ.SP .OR.
+ 1 Z(IRHT-1,LOWY+1).EQ.SP .OR. Z(IRHT,LOWY+1).EQ.SP)
+ 2 IPEN = 1
+ GO TO 118
+ 119 IF (IPEN .NE. 1) GO TO 123
+C
+C SPECIAL VALUE AREA
+C
+ GO TO (129,120,121,122),NSPV
+ 120 MSPV = 1
+ GO TO 129
+ 121 PX(1) = I*NCRTG
+ PY(1) = J*NCRTG
+ PX(2) = PX(1)+NCRTG-1
+ PY(2) = PY(1)+NCRTG-1
+ CALL GPL (2,PX,PY)
+ PYTMP = PY(1)
+ PY(1) = PY(2)
+ PY(2) = PYTMP
+ CALL GPL (2,PX,PY)
+C
+ GO TO 129
+ 122 INTEN = MXLEV
+ GO TO 128
+ 123 ZZ = ZLFT+XPART*(ZRHT-ZLFT)
+C
+C TEST FOR SAME INT AS LAST TIME.
+C
+ IF (ZZ .GT. ZLEV(LAST+1)) GO TO 126
+ 124 IF (ZZ .GE. ZLEV(LAST)) GO TO 127
+C
+C LOOK LOWER
+C
+ IF (LAST .LE. 1) GO TO 125
+ LAST = LAST-1
+ GO TO 124
+ 125 IF (ZZ .LT. ZLEV(LAST)) IADD = 0
+ GO TO 127
+C
+C LOOK HIGHER
+C
+ 126 IF (LAST .GE. NLEVL) GO TO 127
+ LAST = LAST+1
+ IF (ZZ .GE. ZLEV(LAST+1)) GO TO 126
+C
+C OK
+C
+ 127 ISUB = LAST+IOFFST+IADD
+ INTEN = IL(ISUB)
+ IF (NOPTN .LT. 0) INTEN = MXLEV-INTEN
+ 128 CALL GRAY
+ 129 CONTINUE
+ 130 CONTINUE
+C
+C PUT OUT ANY REMAINING BUFFERED POINTS.
+C
+ IF (NPOINT.GT.0) THEN
+ CALL GQNT(1,IERR,WND2,VWPR2)
+ CALL SET(0.,1.,0.,1.,0.,1023.,0.,1023.,1)
+ CALL POINTS(XPNT,YPNT,NPOINT,0,0)
+ CALL SET(VWPR2(1),VWPR2(2),VWPR2(3),VWPR2(4),
+ - WND2(1),WND2(2),WND2(3),WND2(4),1)
+ ENDIF
+C
+C CALL BOUND IF ISPV=2 AND SPECIAL VALUES WERE FOUND.
+C
+ IF (MSPV .EQ. 1) THEN
+ CALL SET(X1,X2,Y1,Y2,1.0,X3,1.0,Y3,1)
+ CALL BOUND (Z,MX,NX,NY,SP)
+ END IF
+ 132 CONTINUE
+C
+C RESTORE NORMALIZATION TRANS 1 AND ORIGINAL NORMALIZATION NUMBER
+C
+ CALL SET(VWPRT(1),VWPRT(2),VWPRT(3),VWPRT(4),
+ - WNDW(1),WNDW(2),WNDW(3),WNDW(4),IOLLS)
+ CALL SETUSV('LS',IOLLS)
+ CALL GSELNT (NTORIG)
+ RETURN
+C
+ END
+ SUBROUTINE ZLSET (Z,MX,NX,NY,ZL,NLEVL)
+ SAVE
+C
+ DIMENSION Z(MX,NY) ,ZL(NLEVL)
+C
+ COMMON /HAFTO2/ GLO ,HA ,NOPTN ,ALPHA ,
+ 1 NSPV ,SP ,ICNST
+C
+ BIG = R1MACH(2)
+C
+C ZLSET PUTS THE INTENSITY LEVEL BREAK POINTS IN ZL.
+C ALL ARGUMENTS ARE AS IN HAFTON.
+C
+ LX = NX
+ LY = NY
+ NLEV = NLEVL
+ NOPT = IABS(NOPTN)
+ RALPH = 1./ALPHA
+ ICNST = 0
+ IF (GLO.NE.0. .OR. HA.NE.0.) GO TO 106
+C
+C FIND RANGE IF NOT KNOWN.
+C
+ GLO = BIG
+ HA = -GLO
+ IF (NSPV .NE. 0) GO TO 103
+ DO 102 J=1,LY
+ DO 101 I=1,LX
+ ZZ = Z(I,J)
+ GLO = AMIN1(ZZ,GLO)
+ HA = AMAX1(ZZ,HA)
+ 101 CONTINUE
+ 102 CONTINUE
+ GO TO 106
+ 103 DO 105 J=1,LY
+ DO 104 I=1,LX
+ ZZ = Z(I,J)
+ IF (ZZ .EQ. SP) GO TO 104
+ GLO = AMIN1(ZZ,GLO)
+ HA = AMAX1(ZZ,HA)
+ 104 CONTINUE
+ 105 CONTINUE
+C
+C FILL ZL
+C
+ 106 DELZ = HA-GLO
+ IF (DELZ .EQ. 0.) GO TO 115
+ DZ = DELZ/FLOAT(NLEV)
+ NLEVM1 = NLEV-1
+ DO 114 K=1,NLEVM1
+ ZNORM = FLOAT(K)/FLOAT(NLEV)
+ GO TO (107,108,109,110,111),NOPT
+C
+C NOPT=1
+C
+ 107 ZL(K) = GLO+FLOAT(K)*DZ
+ GO TO 114
+C
+C NOPT=2
+C
+ 108 ONORM = (1.-(1.-ZNORM)**ALPHA)**RALPH
+ GO TO 113
+C
+C NOPT=3
+C
+ 109 ONORM = 1.-(1.-ZNORM**ALPHA)**RALPH
+ GO TO 113
+C
+C NOPT=4
+C
+ 110 ONORM = .5*(1.-(ABS(ZNORM+ZNORM-1.))**ALPHA)**RALPH
+ GO TO 112
+C
+C NOPT=5
+C
+ 111 ZNORM2 = ZNORM+ZNORM
+ IF (ZNORM .GT. .5) ZNORM2 = 2.-ZNORM2
+ ONORM = .5*(1.-(1.-ABS(ZNORM2)**ALPHA)**RALPH)
+ 112 IF (ZNORM .GT. .5) ONORM = 1.-ONORM
+ 113 ZL(K) = GLO+DELZ*ONORM
+ 114 CONTINUE
+ ZL(NLEV) = BIG
+ RETURN
+ 115 ICNST = 1
+ RETURN
+ END
+ SUBROUTINE GRAY
+C
+C SUBROUTINE GRAY COLORS HALF-TONE CELL (I,J) WITH INTENSITY INTEN.
+C THE ROUTINE ASSUMES 8X8 CELL SIZE ON A VIRTUAL SCREEN 1024X1024.
+C
+ DIMENSION IFOT(16) ,JFOT(16)
+ DIMENSION WNDW(4) ,VWPRT(4)
+CCC DIMENSION MX(16) ,MY(16)
+ COMMON /HAFTO1/ I ,J ,INTEN
+ COMMON /HAFTO4/ NPTMAX ,NPOINT ,XPNT(50) ,YPNT(50)
+ SAVE
+C
+ DATA
+ 1 IFOT(1),IFOT(2),IFOT(3),IFOT(4),IFOT(5),IFOT(6),IFOT(7),IFOT(8)/
+ 2 1, 5, 1, 5, 3, 7, 3, 7 /
+ DATA
+ 1 IFOT(9),IFOT(10),IFOT(11),IFOT(12),IFOT(13),IFOT(14),IFOT(15)/
+ 2 3, 7, 3, 7, 1, 5, 1/,
+ 3 IFOT(16)/
+ 4 5 /
+C
+ DATA
+ 1 JFOT(1),JFOT(2),JFOT(3),JFOT(4),JFOT(5),JFOT(6),JFOT(7),JFOT(8)/
+ 2 1, 5, 5, 1, 3, 7, 7, 3 /
+ DATA
+ 1 JFOT(9),JFOT(10),JFOT(11),JFOT(12),JFOT(13),JFOT(14),JFOT(15)/
+ 2 1, 5, 5, 1, 3, 7, 7/,
+ 3 JFOT(16)/
+ 4 3 /
+C
+ IF (INTEN) 103,103,101
+ 101 I1 = I*8
+ J1 = J*8
+ IF ((NPOINT+INTEN) .LE.NPTMAX) GO TO 1015
+ CALL GQNT(1,IERR,WNDW,VWPRT)
+ CALL SET(0.,1.,0.,1.,0.,1023.,0.,1023.,1)
+ CALL POINTS(XPNT,YPNT,NPOINT,0,0)
+ CALL SET(VWPRT(1),VWPRT(2),VWPRT(3),VWPRT(4),
+ - WNDW(1),WNDW(2),WNDW(3),WNDW(4),1)
+ NPOINT = 0
+ 1015 DO 102 I2=1,INTEN
+ NPOINT = NPOINT + 1
+ XPNT(NPOINT) = I1+IFOT(I2)
+ YPNT(NPOINT) = J1+JFOT(I2)
+ 102 CONTINUE
+ 103 RETURN
+ END
+ SUBROUTINE BOUND (Z,MX,NNX,NNY,SSP)
+ DIMENSION Z(MX,NNY) ,PX(2) ,PY(2)
+C
+C BOUND DRAWS A POLYGONAL BOUNDRY AROUND ANY SPECIAL-VALUE AREAS IN Z.
+C
+ SAVE
+ NX = NNX
+ NY = NNY
+C
+C VERTICAL LINES
+C
+ SP = SSP
+ DO 103 IP1=3,NX
+ I = IP1-1
+ PX(1) = I
+ PX(2) = I
+ IM1 = I-1
+ DO 102 JP1=2,NY
+ PY(2) = JP1
+ J = JP1-1
+ PY(1) = J
+ KLEFT = 0
+ IF (Z(IM1,J).EQ.SP .OR. Z(IM1,JP1).EQ.SP) KLEFT = 1
+ KCENT = 0
+ IF (Z(I,J).EQ.SP .OR. Z(I,JP1).EQ.SP) KCENT = 1
+ KRIGT = 0
+ IF (Z(IP1,J).EQ.SP .OR. Z(IP1,JP1).EQ.SP) KRIGT = 1
+ JUMP = KLEFT*4+KCENT*2+KRIGT+1
+ GO TO (102,101,102,102,101,102,102,102,102),JUMP
+ 101 CALL GPL (2,PX,PY)
+ 102 CONTINUE
+ 103 CONTINUE
+C
+C HORIZONTAL
+C
+ DO 106 JP1=3,NY
+ J = JP1-1
+ PY(1) = J
+ PY(2) = J
+ JM1 = J-1
+ DO 105 IP1=2,NX
+ PX(2) = IP1
+ I = IP1-1
+ PX(1) = I
+ KLOWR = 0
+ IF (Z(I,JM1).EQ.SP .OR. Z(IP1,JM1).EQ.SP) KLOWR = 1
+ KCENT = 0
+ IF (Z(I,J).EQ.SP .OR. Z(IP1,J).EQ.SP) KCENT = 1
+ KUPER = 0
+ IF (Z(I,JP1).EQ.SP .OR. Z(IP1,JP1).EQ.SP) KUPER = 1
+ JUMP = KLOWR*4+KCENT*2+KUPER+1
+ GO TO (105,104,105,105,104,105,105,105,105),JUMP
+ 104 CALL GPL (2,PX,PY)
+ 105 CONTINUE
+ 106 CONTINUE
+ RETURN
+ END
+ SUBROUTINE EZHFTN (Z,M,N)
+C
+ DIMENSION Z(M,N)
+ SAVE
+C
+C HALF-TONE PICTURE VIA SHORTEST ARGUMENT LIST.
+C ASSUMPTIONS--
+C ALL OF THE ARRAY IS TO BE DRAWN,
+C LOWEST VALUE IN Z WILL BE AT LOWEST INTENSITY ON READER/PRINTER
+C OUTPUT, HIGHEST VALUE IN Z WILL BE AT HIGHEST INTENSITY, VALUES IN
+C BETWEEN WILL APPEAR LINEARLY SPACED, MAXIMUM POSSIBLE NUMBER OF
+C INTENSITIES ARE USED, THE PICTURE WILL HAVE A PERIMETER DRAWN,
+C FRAME WILL BE CALLED AFTER THE PICTURE IS DRAWN, Z IS FILLED WITH
+C NUMBERS THAT SHOULD BE USED (NO UNKNOWN VALUES).
+C IF THESE CONDITIONS ARE NOT MET, USE HAFTON.
+C EZHFTN ARGUMENTS--
+C Z 2 DIMENSIONAL ARRAY TO BE USED TO GENERATE A HALF-TONE PLOT.
+C M FIRST DIMENSION OF Z.
+C N SECOND DIMENSION OF Z.
+C
+ DATA FLO,HI,NLEV,NOPT,NPRM,ISPV,SPV/0.0,0.0,0,0,0,0,0.0/
+C
+C THE FOLLOWING CALL IS FOR GATHERING STATISTICS ON LIBRARY USE AT NCAR
+C
+ CALL Q8QST4 ('GRAPHX','HAFTON','EZHFTN','VERSION 1')
+C
+ CALL HAFTON (Z,M,M,N,FLO,HI,NLEV,NOPT,NPRM,ISPV,SPV)
+C
+C +NOAO - EZHFTN no longer calls frame.
+C CALL FRAME
+C -NOAO
+ RETURN
+ END
+C
+C-----------------------------------------------------------------------
+C
+C REVISION HISTORY---
+C
+C JULY 1984 CONVERTED TO FORTAN 77 AND GKS
+C
+C MARCH 1983 INSTITUTED BUFFERING OF POINTS WITHIN ROUTINE GRAY,
+C WHICH DRAMATICALLY REDUCES SIZE OF OUTPUT PLOT CODE,
+C METACODE. THIS IN TURN GENERALLY IMPROVES THROUGHPUT
+C OF METACODE INTERPRETERS.
+C
+C FEBRUARY 1979 MODIFIED CODE TO CONFORM TO FORTRAN 66 STANDARD
+C
+C JANUARY 1978 DELETED REFERENCES TO THE *COSY CARDS AND
+C ADDED REVISION HISTORY
+C
+C-----------------------------------------------------------------------
+C