      SUBROUTINE SCALE1 ( XMIN, XMAX, N, XMINP, XMAXP, DIST )

c*********************************************************************72
c
cc SCALE1
c
C  ANSI FORTRAN
C  GIVEN XMIN, XMAX AND N, SCALE1 FINDS A NEW RANGE XMINP AND
C  XMAXP DIVISIBLE INTO APPROXIMATELY N LINEAR INTERVALS
C  OF SIZE DIST.
C  VINT IS AN ARRAY OF ACCEPTABLE VALUES FOR DIST (TIMES
C  AN INTEGER POWER OF 10).
C  SQR IS AN ARRAY OF GEOMETRIC MEANS OF ADJACENT VALUES
C  OF VINT.  IT IS USED AS BREAK POINTS TO DETERMINE
C  WHICH VINT VALUE TO ASSIGN TO DIST.
c
      DIMENSION VINT(4), SQR(3)
      DATA VINT(1), VINT(2), VINT(3), VINT(4) / 1., 2., 5., 10. /
      DATA SQR(1), SQR(2), SQR(3) / 1.414214, 3.162278, 7.071068 /
c
C  CHECK WHETHER PROPER INPUT VALUES WERE SUPPLIED.
c
      IF ( XMIN .LT. XMAX .AND. N .GT. 0 ) GO TO 10
      WRITE ( 6, 99999 )
99999 FORMAT ( 34H IMPROPER INPUT SUPPLIED TO SCALE1 )
      RETURN
c
C  DEL ACCOUNTS FOR COMPUTER ROUND-OFF.
C  DEL SHOULD BE GREATER THAN THE ROUND-OFF EXPECTED FROM
C  A DIVISION AND FLOAT OPERATION.  IT SHOULD BE LESS THAN
C  THE MINIMUM INCREMENT OF THE PLOTTING DEVICE USED BY
C  THE MAIN PROGRAM (IN.) DIVIDED BY THE PLOT SIZE (IN.)
C  TIMES NUMBER OF INTERVALS N.
c
10    DEL = .00002
      FN = N
c
C  FIND APPROXIMATE INTERVAL SIZE A.
c
      A = ( XMAX - XMIN ) / FN
      AL = ALOG10 ( A )
      NAL = int ( AL )
      IF ( A .LT. 1. ) NAL = NAL - 1
c
C  A IS SCALED INTO VARIABLE NAMED B BETWEEN 1 AND 10.
c
      B = A / 10.**NAL
c
C  THE CLOSEST PERMISSIBLE VALUE FOR B IS FOUND.
c
      DO I = 1, 3
        IF ( B .LT. SQR ( I ) ) GO TO 30
      end do
      I = 4
c
C  THE INTERVAL SIZE IS COMPUTED.
c
30    DIST = VINT(I) * 10.**NAL
      FM1 = XMIN / DIST
      M1 = int ( FM1 )
      IF ( FM1 .LT. 0. ) M1 = M1 - 1
      IF ( ABS ( FLOAT ( M1 ) + 1. - FM1 ) .LT. DEL ) M1 = M1 + 1
c
C  THE NEW MINIMUM AND MAXIMUM LIMITS ARE FOUND.
c
      XMINP = DIST * FLOAT ( M1 )
      FM2 = XMAX / DIST
      M2 = int ( FM2 + 1. )
      IF ( FM2 .LT. ( -1. ) ) M2 = M2 - 1
      IF ( ABS ( FM2 + 1. - FLOAT ( M2 ) ) .LT. DEL ) M2 = M2 - 1
      XMAXP = DIST * FLOAT ( M2 )
c
C  ADJUST LIMITS TO ACCOUNT FOR ROUND-OFF IF NECESSARY.
c
      IF ( XMINP .GT. XMIN ) XMINP = XMIN
      IF ( XMAXP .LT. XMAX ) XMAXP = XMAX
      RETURN
      END
      SUBROUTINE SCALE2 ( XMIN, XMAX, N, XMINP, XMAXP, DIST )

c*********************************************************************72
c
cc SCALE2
c
C  ANSI FORTRAN
C  GIVEN XMIN, XMAX AND N, SCALE2 FINDS A NEW RANGE XMINP AND
C  XMAXP DIVISIBLE INTO EXACTLY N LINEAR INTERVALS OF SIZE
C  DIST, WHERE N IS GREATER THAN 1.
c
      DIMENSION VINT(5)
      DATA VINT(1), VINT(2), VINT(3), VINT(4), VINT(5) / 1., 2.,
     &  5., 10., 20. /
c
C  CHECK WHETHER PROPER INPUT VALUES WERE SUPPLIED.
c
      IF ( XMIN .LT. XMAX .AND. N .GT. 0 ) GO TO 10
      WRITE ( 6, 99999 )
99999 FORMAT ( 34H IMPROPER INPUT SUPPLIED TO SCALE2 )
      RETURN
10    DEL = .00002
      FN = N
c
C  FIND APPROXIMATE INTERVAL SIZE A.
c
      A = ( XMAX - XMIN ) / FN
      AL = ALOG10 ( A )
      NAL = int ( AL )
      IF ( A .LT. 1. ) NAL = NAL - 1
c
C  A IS SCALED INTO VARIABLE NAMED B BETWEEN 1 AND 10.
c
      B = A / 10.**NAL
c
C  THE CLOSEST PERMISSIBLE VALUE FOR B IS FOUND.
c
      DO 20 I = 1, 3
        IF ( B .LT. ( VINT(I) + DEL ) ) GO TO 30
20    CONTINUE
      I = 4
c
C  THE INTERVAL SIZE IS COMPUTED.
c
30    DIST = VINT(I) * 10.**NAL
      FM1 = XMIN / DIST
      M1 = int ( FM1 )
      IF ( FM1 .LT. 0. ) M1 = M1 - 1
      IF ( ABS ( FLOAT ( M1 ) + 1. - FM1 ) .LT. DEL ) M1 = M1 + 1
c
C  THE NEW MINIMUM AND MAXIMUM LIMITS ARE FOUND.
c
      XMINP = DIST * FLOAT ( M1 )
      FM2 = XMAX / DIST
      M2 = int ( FM2 + 1. )
      IF ( FM2 .LT. ( -1. ) ) M2 = M2 - 1
      IF ( ABS ( FM2 + 1. - FLOAT ( M2 ) ) .LT. DEL ) M2 = M2 - 1
      XMAXP = DIST * FLOAT ( M2 )
c
C  CHECK WHETHER A SECOND PASS IS REQUIRED.
c
      NP = M2 - M1
      IF ( NP .LE. N ) GO TO 40
      I = I + 1
      GO TO 30
40    NX = ( N - NP ) / 2
      XMINP = XMINP - FLOAT ( NX ) * DIST
      XMAXP = XMINP + FLOAT ( N ) * DIST
c
C  ADJUST LIMITS TO ACCOUNT FOR ROUND-OFF IF NECESSARY.
c
      IF ( XMINP .GT. XMIN ) XMINP = XMIN
      IF ( XMAXP .LT. XMAX ) XMAXP = XMAX
      RETURN
      END
      SUBROUTINE SCALE3 ( XMIN, XMAX, N, XMINP, XMAXP, DIST )

c*********************************************************************72
c
cc SCALE3
c
C  ANSI FORTRAN
C  GIVEN XMIN, XMAX AND N, WHERE N IS GREATER THAN 1, SCALE3
C  FINDS A NEW RANGE XMINP AND XMAXP DIVISIBLE INTO EXACTLY
C  N LOGARITHMIC INTERVALS, WHERE THE RATIO OF ADJACENT
C  UNIFORMLY SPACED SCALE VALUES IS DIST.
c
      DIMENSION VINT(11)
      DATA VINT(1), VINT(2), VINT(3), VINT(4), VINT(5), VINT(6),
     &  VINT(7), VINT(8), VINT(9), VINT(10), VINT(11) / 10., 9.,
     &  8., 7., 6., 5., 4., 3., 2., 1., .5 /
c
C  CHECK WHETHER PROPER INPUT VALUES WERE SUPPLIED.
c
      IF ( XMIN .LT. XMAX .AND. N .GT. 1 .AND. XMIN .GT. 0. ) GO TO 10
      WRITE ( 6, 99999 )
99999 FORMAT ( 34H IMPROPER INPUT SUPPLIED TO SCALE3 )
      RETURN
10    DEL = .00002
c
C  VALUES ARE TRANSLATED FROM THE LINEAR INTO LOGARITHMIC
C  REGION.
c
      XMINL = ALOG10 ( XMIN )
      XMAXL = ALOG10 ( XMAX )
      FN = N
c
C  FIND APPROXIMATE INTERVAL SIZE A.
c
      A = ( XMAXL - XMINL ) / FN
      AL = ALOG10 ( A )
      NAL = int ( AL )
      IF ( A .LT. 1. ) NAL = NAL - 1
c
C  A IS SCALED INTO VARIABLE NAMED B BETWEEN 1 AND 10.
c
      B = A / 10.**NAL
c
C  THE CLOSEST PERMISSIBLE VALUE FOR B IS FOUND.
c
      DO I = 1, 9
        IF ( B .LT. ( 10. / VINT(I) + DEL ) ) GO TO 30
      end do
      I = 10
c
C  THE INTERVAL SIZE IS COMPUTED.
c
30    DISTL = 10.**( NAL + 1 ) / VINT(I)
      FM1 = XMINL / DISTL
      M1 = int ( FM1 )
      IF ( FM1 .LT. 0. ) M1 = M1 - 1
      IF ( ABS ( FLOAT ( M1 ) + 1. - FM1 ) .LT. DEL ) M1 = M1 + 1
c
C  THE NEW MINIMUM AND MAXIMUM LIMITS ARE FOUND.
c
      XMINP = DISTL * FLOAT ( M1 )
      FM2 = XMAXL / DISTL
      M2 = int ( FM2 + 1. )
      IF ( FM2 .LT. ( -1. ) ) M2 = M2 - 1
      IF ( ABS ( FM2 + 1. - FLOAT ( M2 ) ) .LT. DEL ) M2 = M2 - 1
      XMAXP = DISTL + FLOAT ( M2 )
      NP = M2 - M1
c
C  CHECK WHETHER ANOTHER PASS IS NECESSARY.
c
      IF ( NP .LE. N ) GO TO 40
      I = I + 1
      GO TO 30
40    NX = ( N - NP ) / 2
      XMINP = XMINP - FLOAT ( NX ) * DISTL
      XMAXP = XMINP + FLOAT ( N  ) * DISTL
c
C  VALUES ARE TRANSLATED FROM THE LOGARITHMIC INTO THE LINEAR
C  REGION.
c
      DIST = 10.**DISTL
      XMINP = 10.**XMINP
      XMAXP = 10.**XMAXP
c
C  ADJUST LIMITS TO ACCOUNT FOR ROUND-OFF IF NECESSARY.
c
      IF ( XMINP .GT. XMIN ) XMINP = XMIN
      IF ( XMAXP .LT. XMAX ) XMAXP = XMAX
      RETURN
      END
