SUBROUTINE SETVMI(KFILDO,P,DSAV,NX,NY,
     1                  CCALL,NAME,XP,YP,XDATA,NSTA,IER)
C
C        MARCH     2008   GLAHN   TDL   MOS-2000
C        MARCH     2008   GLAHN   OMITTED SETTING LAST CATEGORY
C
C        PURPOSE
C            TO MAKE SURE THE CLOSEST GRIDPOINT IN P( , ) TO A
C            STATION HAS A VALUE WITHIN THE RANGE OF THE CATEGORY
C            IN XDATA( ).  ITABLE( , ) IS FOR VISIBILITY.
C
C        DATA SET USE
C            KFILDO    - UNIT NUMBER OF OUTPUT (PRINT) FILE.  (OUTPUT)
C
C        VARIABLES
C              KFILDO = UNIT NUMBER OF OUTPUT (PRINT) FILE.  (INPUT)
C            P(IX,JY) = GRID OF VISIBILITIES IN MI (IX=1,NX) (JY=1,NY).
C                       (INPUT/OUTPUT)
C         DSAV(IX,JY) = WORK ARRAY (IX=1,NX) (JY=1,NY).  (INTERNAL)
C                  NX = X EXTENT OF GRID IN P( , ).  (INPUT)
C                  NY = Y EXTENT OF GRID IN P( , ).  (INPUT)
C            CCALL(K) = CALL LETTERS OF STATION K (K=1,NSTA).  
C                       (CHARACTER*8)  (INPUT)
C             NAME(K) = NAME OF STATION K (K=1,NSTA).  
C                       (CHARACTER*8)  (INPUT)
C               XP(K) = THE X POSITION FOR STATION K (K=1,NSTA) ON 
C                       THE GRID IN P( , ).  (INPUT)
C               YP(K) = THE Y POSITION FOR STATION K (K=1,NSTA) ON 
C                       THE GRID IN P( , ).  (INPUT)
C            XDATA(K) = CATEGORICAL VISIBILITY FORECASTS (K=1,NVAL).
C                       (INPUT)
C                NSTA = THE NUMBER OF VALUES IN XDATA( ) BEING DEALT
C                       WITH.  (INPUT)
C                 IER = ERROR RETURN.
C                       0 = GOOD RETURN.
C                       (OUTPUT)
C          TABLE(J,M) = HOLDS THE LOWER AND UPPER CATEGORY BREAKPOINTS
C                       FOR THE NOCAT CATEGORIES OF VISIBILITIES
C                       (M=1,NOCAT), (J=1,2).  (INTERNAL)
C               NOCAT = THE NUMBER OF VISIBILITY CATEGORIES FORECAST
C                       BY LAMP.  (INTERNAL)
C        1         2         3         4         5         6         7 X
C 
C        NONSYSTEM SUBROUTINES USED 
C            NONE
C
      PARAMETER(NOCAT=7)
C
      CHARACTER*8 CCALL(NSTA)
      CHARACTER*20 NAME(NSTA)
C
      DIMENSION XDATA(NSTA),XP(NSTA),YP(NSTA)
      DIMENSION P(NX,NY),DSAV(NX,NY)
      DIMENSION TABLE(2,NOCAT)
C
      DATA TABLE/ .0,    .495,
     1           .495,   .95,
     2           .95,   1.95,
     3          1.95,   2.95,
     4          2.95,   5.05,
     5          5.05,   6.05,
     6          6.05,   8.0/
C
D     CALL TIMPR(KFILDO,KFILDO,'START SETVMI        ')
      IER=0
      ICOUNT=0
C
C        INITIALIZE DSAV( , ).
C
      DO 110 JY=1,NY
      DO 109 IX=1,NX
      DSAV(IX,JY)=9999.
 109  CONTINUE
 110  CONTINUE
C
      DO 200 K=1,NSTA
      IF(XDATA(K).GT.9998.9)GO TO 200
      NCAT=NINT(XDATA(K))
C        THE VALUES IN XDATA( ) ARE STATION CATEGORY VALUES TO
C        WHOLE NUMBERS.
      DMIN=9999.
      IX=XP(K)
      JY=YP(K)
C
      DO 120 M=0,1
      DO 119 N=0,1
      D=(XP(K)-(IX+N))**2+(YP(K)-(JY+M))**2
C
      IF(D.LT.DMIN)THEN
         DMIN=D
         NSAV=N
         MSAV=M
      ENDIF
C
 119  CONTINUE
 120  CONTINUE
C
      IX=IX+NSAV
      JY=JY+MSAV
      D=(XP(K)-(IX))**2+(YP(K)-(JY))**2
C
      IF(D.LT.DSAV(IX,JY))THEN
C
         IF(P(IX,JY).LT.TABLE(1,NCAT))THEN
C         
D           IF(DSAV(IX,JY).GT.9998.)THEN         
C         
D              WRITE(KFILDO,125)CCALL(K),NAME(K),NCAT,P(IX,JY),
D    1                          TABLE(1,NCAT)
D125           FORMAT(' STATION ',A8,1X,A20,' OF',I3,' ADJUSTED',
D    1                ' CLOSEST GRIDPOINT VALUE OF ',F8.2,'  TO',F7.2,
D    2                ' PLUS 0.1')
D           ELSE
D              WRITE(KFILDO,126)CCALL(K),NAME(K),NCAT,P(IX,JY),
D    1                          TABLE(1,NCAT)
D126           FORMAT(' STATION ',A8,1X,A20,' OF',I3,' ADJUSTED',
D    1                ' CLOSEST GRIDPOINT VALUE OF ',F8.2,'  TO',F7.2,
D    2                ' PLUS 0.1.  SECOND ADJUSTMENT.')
D           ENDIF
C
            P(IX,JY)=TABLE(1,NCAT)+.1
C              THE .1 IS TO MAKE SURE THE VALUE IS SOLIDLY
C              WITHIN RANGE.  IT HAS TO BE BIG ENOUGH TO SURVIVE
C              PACKING TO TENTHS OF MI, THE UNITS IN P( , ).
            ICOUNT=ICOUNT+1
C
         ELSEIF(P(IX,JY).GT.TABLE(2,NCAT).AND.NCAT.LT.NOCAT)THEN
C           DO NOT SET THE LAST CATEGORY TO A SPECIFIC VALUE,
C           BECAUSE THERE IS NO CATEGORY ABOVE IT AND THE VALUE
C           WOULD BE ARBITRARY.
C         
D           IF(DSAV(IX,JY).GT.9998.)THEN         
D              WRITE(KFILDO,127)CCALL(K),NAME(K),NCAT,P(IX,JY),
D    1                          TABLE(2,NCAT)
D127           FORMAT(' STATION ',A8,1X,A20,' OF',I3,' ADJUSTED',
D    2                ' CLOSEST GRIDPOINT VALUE OF',F8.2,'  TO ',F7.2,
D    3                ' MINUS 0.1')
D           ELSE
D              WRITE(KFILDO,128)CCALL(K),NAME(K),NCAT,P(IX,JY),
D    1                          TABLE(2,NCAT)
D128           FORMAT(' STATION ',A8,1X,A20,' OF',I3,' ADJUSTED',
D    1                ' CLOSEST GRIDPOINT VALUE OF ',F8.2,'  TO ',F7.2,
D    2                ' MINUS 0.1.  SECOND ADJUSTMENT.')
D           ENDIF
C
            P(IX,JY)=TABLE(2,NCAT)-.1
C              THE .1 IS TO MAKE SURE THE VALUE IS SOLIDLY
C              WITHIN RANGE.  IT HAS TO BE BIG ENOUGH TO SURVIVE
C              PACKING TO TENTHS OF MI, THE UNITS IN P( , ).
            ICOUNT=ICOUNT+1
            DSAV(IX,JY)=D
         ENDIF
C
      ENDIF
C
 200  CONTINUE
C
      IF(ICOUNT.GT.0)THEN
         WRITE(KFILDO,205)ICOUNT
 205     FORMAT(/,I6,' VALUES IN THE VISIBILITY GRID MODIFIED',
     1           ' BY THE STATION VALUE AFTER THE ANALYSIS.')
      ENDIF
C      
      RETURN
      END