SUBROUTINE SETVTG(KFILDO,KFIL10,ID,IDPARS,JD,NDATE,NAREA,
     1                  CCALL,NAME,DIR,FD2,FD4,ND1,NSTA,
     2                  P,NX,NY,IPACK,IWORK,
     3                  LSTORE,ND9,LITEMS,CORE,ND10,
     4                  NBLOCK,NFETCH,
     5                  IS0,IS1,IS2,IS4,ND7,
     6                  L3264B,ISTOP,JER,IER)
C 
C        NOVEMBER  2019   GLAHN   MDL   MOS-2000 
C                                 TAKEN FROM PIXSM1
C        NOVEMBER  2019   GLAHN   INTERPOLATION REMOVED
c
C        PURPOSE
C            TO READ THE VECTOR MELD FORECASTS THAT HAVE BEEN
C            PUT INTO THE LAMP CATEGORIES AND TO MAKE SURE THE
C            THE FOUR GRIDPOINTS AROUND EACH STATION MATCH THE MELD
C            CATEGORICAL FORECASTS.  IF THEY MATCH, NO CHANGE IS
C            MADE; IF THEY DON'T MATCH, THE FOUR POINTS ARE CHANGED
C            A MINIMAL AMOUNT TO BE WITHIN THE LAMP/MELD CATEGORY.
C
C            THE FORECAST GRID HAS NOT BEEN PACKED YET, BUT WILL BE
C            ON OUTPUT.
C
C        DATA SET USE 
C              KFILDO = DEFAULT UNIT NUMBER FOR OUTPUT (PRINT) FILE. (INPUT) 
C              KFIL10 = UNIT NUMBER OF TDL MOS-2000 FILE SYSTEM ACCESS.
C                       (INPUT)
C 
C        VARIABLES 
C            KFILDO - DEFAULT UNIT NUMBER FOR OUTPUT (PRINT) FILE.
C                     (OUTPUT) 
C            KFIL10 - UNIT NUMBER OF TDL MOS-2000 FILE SYSTEM ACCESS.
C                     (INPUT-OUTPUT) 
C               ID(J) = THE VARIABLE ID (J=1,4).  (INPUT)
C           IDPARS(J) = THE PARSED, INDIVIDUAL COMPONENTS OF THE PREDICTOR
C                       ID CORRESPONDING TO ID( ) (J=1,15).  (INPUT)
C                       J=1--CCC (CLASS OF VARIABLE),
C                       J=2--FFF (SUBCLASS OF VARIABLE),
C                       J=3--B (BINARY INDICATOR),
C                       J=4--DD (DATA SOURCE, MODEL NUMBER),
C                       J=5--V (VERTICAL APPLICATION),
C                       J=6--LBLBLBLB (BOTTOM OF LAYER, 0 IF ONLY 1 LAYER),
C                       J=7--LTLTLTLT (TOP OF LAYER),
C                       J=8--T (TRANSFORMATION),
C                       J=9--RR (RUN TIME OFFSET, ALWAYS + AND BACK IN TIME),
C                       J=10--OT (TIME APPLICATION),
C                       J=11--OH (TIME PERIOD IN HOURS),
C                       J=12--TAU (PROJECTION IN HOURS),
C                       J=13--I (INTERPOLATION TYPE),
C                       J=14--S (SMOOTHING INDICATOR), AND
C                       J=15--G (GRID INDICATOR).
C             JD(J,N) = THE BASIC INTEGER VARIABLE ID (J=1,4) (N=1,NPRED).
C                       THIS IS THE SAME AS ID(J,N), EXCEPT THAT THE PORTIONS
C                       PERTAINING TO PROCESSING ARE OMITTED:
C                       B = IDPARS(3, ),
C                       T = IDPARS(8, ),
C                       I = IDPARS(13, ),
C                       S = IDPARS(14, ),
C                       G = IDPARS(15, ), AND
C                       THRESH( ).
C                       (INPUT)
C               NDATE = THE DATE/TIME FOR WHICH DATA ARE NEEDED.  (INPUT)
C               NAREA = THE AREA BEING USED:
C                       1 = CONUS
C                       2 = ALASKA
C                       3 = HAWAII
C                       4 = PUERTO RICO
C               ISPOT = THE SIZE OF SPOT TO REMOVE.  (INPUT)
C              MTIMES = NUMBER OF PASSES OVER THE DATA.
C                       MTIMES SHOULD BE EVENLY DIVISIBLE BY 4 FOR SYMMETRY.
C                       (INTERNAL)
C               DIFFV = DIFFERENCE BETWEEN END POINTS WHEN EXCEEDED
C                       REMOVAL IS NOT DONE.  (INPUT)
C               DIFFA = THE ELEVATION DIFFERENCE IF EXCEEDED, REMOVAL
C                       IS NOT DONE.  (INPUT) 
C            CCALL(K) = 8-CHARACTER STATION CALL LETTERS TO PROVIDE
C                       OUTPUT FOR (K=1,NSTA).  ALL STATION
C                       DATA ARE KEYED TO THIS LIST.  (CHARACTER*8)
C                       (INPUT)
C             NAME(K) = NAMES OF STATIONS (K=1,NSTA).  (CHARACTER*20)
C                       (INPUT)
C            DIR(K,J) = THE IX (J=1) AND JY (J=2) POSITIONS ON THE GRID
C                       FOR STATION K (K=1,NSTA),  (INPUT/OUTPUT)
C              FD2(J) = WORK ARRAY (J=1,ND1).  HOLDS INTERPOLATED VALUES
C                       BEFORE PIXEL SMOOTHING.  (INTERNAL)
C              FD4(J) = WORK ARRAY (J=1,ND1).  HOLDS THE VECTOR (STATION)
C                       FORECASTS FROM THE STATION PROCESS.  (INTERNAL)
C                 ND1 = MAXIMUM NUMBER OF STATIONS THAT CAN BE DEALT WITH.
C                       DIMENSION OF SEVERAL VARIABLES.  (INPUT)
C                NSTA = NUMBER OF STATIONS OR LOCATIONS BEING DEALT WITH.
C                       (INPUT)
C            P(IX,JY) = HOLDS THE DATA TO PROCESS (IX=1,NX) (JY=1,NY).
C               NX,NY = DIMENSIONS OF P( , ) AND HOLD( , ).  (INPUT)
C                       (INPUT/OUTPUT)
C            IPACK(J) = WORK ARRAY (J=1,ND5).  (INTERNAL)
C             DATA(J) = WORK ARRAY (J=1,ND5).  (INTERNAL)
C            IWORK(J) = WORK ARRAY (J=1,ND5).  (INTERNAL)
C         HOLD(IX,JY) = WORK ARRAY (IX=1,NX) (JY=1,NY).  (INTERNAL)
C        TELEV(IX,JY) = TERRAIN ELEVATION (IX=1,NX) (JY=1,NY).  (INPUT)
C           SEALND(J) = THE LAND/SEA MASK (J=1,NX*NY) AT NOMINAL
C                       MESHLENGTH MESH.
C                       0 = OCEAN WATER GRIDPOINTS;
C                       3 = INLAND WATER GRIDPOINTS.
C                       9 = LAND GRIDPOINTS.
C         LSTORE(L,J) = THE ARRAY HOLDING INFORMATION ABOUT THE DATA 
C                       STORED (L=1,12) (J=1,LITEMS).
C                       L=1,4--THE 4 ID'S FOR THE DATA.
C                       L=5  --LOCATION OF STORED DATA.  WHEN IN CORE,
C                              THIS IS THE LOCATION IN CORE( ) WHERE
C                              THE DATA START.  WHEN ON DISK, 
C                              THIS IS MINUS THE RECORD NUMBER WHERE 
C                              THE DATA START.
C                       L=6  --THE NUMBER OF 4-BYTE WORDS STORED.
C                       L=7  --2 FOR DATA PACKED IN TDLPACK, 1 FOR NOT.
C                       L=8  --THE DATE/TIME OF THE DATA IN FORMAT
C                              YYYYMMDDHH.
C                       L=9  --NUMBER OF TIMES DATA HAVE BEEN RETRIEVED.
C                       L=10 --NUMBER OF THE SLAB IN DIR( , ,L) AND
C                              IN NGRIDC( ,L) DEFINING THE
C                       L=11 --THE NUMBER OF THE FIRST VARIABLE IN THE 
C                              LIST IN ID( ,N) (N=1,NPRED) FOR 
C                              WHICH THIS VARIABLE IS NEEDED, WHEN IT 
C                              DOES NOT NEED TO BE STORED AFTER DAY 1.
C                              WHEN THE VARIABLE MUST BE STORED (TO BE
C                              ACCESSED THROUGH OPTION) FOR ALL DAYS,
C                              ID(11,N) IS 7777 + THE NUMBER OF THE 
C                              FIRST VARIABLE IN THE LIST FOR WHICH 
C                              THIS VARIABLE IS NEEDED.
C                              CHARACTERISTICS OF THIS GRID.
C                       L=12 --USED INITIALLY IN ESTABLISHING 
C                              MSTORE( , ).  LATER USED AS A WAY OF 
C                              DETERMINING WHETHER TO KEEP THIS VARIABLE.
C                              (INPUT)
C                 ND9 = MAXIMUM NUMBER OF FIELDS STORED IN LSTORE( , ).
C                       SECOND DIMENSION OF LSTORE( , ).  (INPUT)
C              LITEMS = THE NUMBER OF ITEMS IN LSTORE( , ).  (INPUT)
C             CORE(J) = SPACE ALLOCATED FOR SAVING PACKED GRIDPOINT 
C                       FIELDS OR UNPACK STATION DATA (J=1,ND10).
C                       WHEN THIS SPACE IS EXHAUSTED, SCRATCH DISK
C                       WILL BE USED.  THIS IS THE SPACE USED FOR
C                       THE MOS-2000 INTERNAL RANDOM ACCESS SYSTEM.
C                       (INPUT)
C                ND10 = THE MEMORY IN WORDS ALLOCATED TO THE SAVING OF 
C                       DATA CORE( ).  WHEN THIS SPACE IS EXHAUSTED,
C                       SCRATCH DISK WILL BE USED.  (INPUT)  
C              NBLOCK = BLOCK SIZE IN WORDS OF INTERNAL MOS-2000 DISK 
C                       STORAGE.  (INPUT)
C              NFETCH = NUMBER OF TIMES A RECORD HAS BEEN FETCHED FROM
C                       INTERNAL STORAGE.  (INPUT/OUTPUT)
C              IS0(J) = MOS-2000 GRIB SECTION 0 ID'S (J=1,4).
C                       (INTERNAL)
C              IS1(J) = MOS-2000 GRIB SECTION 1 ID'S (J=1,21+).
C                       (INTERNAL)
C              IS2(J) = MOS-2000 GRIB SECTION 2 ID'S (J=1,12).
C                       (INTERNAL)
C              IS4(J) = MOS-2000 GRIB SECTION 4 ID'S (J=1,4).
C                       (INTERNAL)
C                 ND7 = DIMENSION OF IS0( ), IS1( ), IS2( ), AND
C                       IS4( ).  (INPUT)
C              L3264B = INTEGER WORD LENGTH IN BITS OF MACHINE BEING USED
C                       (EITHER 32 OR 64).  (INPUT)
C            ISTOP(J) = (J=1,2):
C                       ISTOP(1)--IS INCREMENTED BY 1 EACH TIME AN ERROR 
C                                 OCCURS.
C                       ISTOP(2)--IS INCREMENTED WHEN A DATA RECORD 
C                                 COULD NOT BE FOUND.
C                       (INPUT/OUTPUT)
C                 JER = 0 UNTIL A MAJOR ERROR OCCURS, THEN IT IS
C                       INCREMENTED BY 1.  IT COUNTS THE MAJOR ERRORS 
C                       THAT WILL CAUSE EITHER NO GRID, A COMPROMISED
C                       GRID, OR A 9999 (MISSING) GRID TO BE OUTPUT.
C                       THIS INCLUDES A GRID THAT COULD NOT BE 
C                       CHECKED WITH STATION FORECASTS.  (INPUT/OUTPUT)
C                 IER = STATUS RETURN.
C                         0 = GOOD RETURN.
C                       103 = VARIABLE IN ID( ) IS NOT CEILING OR 
C                             VISIBILITY.
C                       (INTERNAL-OUTPUT)
C        1         2         3         4         5         6         7 X
C
C        NONSYSTEM SUBROUTINES USED 
C            PLASTC1, PLASTV1, GFETCH
C
      PARAMETER (IDIM=2)
C
      CHARACTER*8 CCALL(ND1)
      CHARACTER*20 NAME(ND1)
C
      DIMENSION ID(4),IDPARS(15),JD(4)
      DIMENSION FD2(ND1),FD4(ND1),IPACK(NX*NY),IWORK(NX*NY)
      DIMENSION DIR(ND1,2)
      DIMENSION P(NX,NY)
      DIMENSION SAVE(NX,NY)
C        SAVE( , ) IS AN AUTOMATIC ARRAY.
      DIMENSION IS0(ND7),IS1(ND7),IS2(ND7),IS4(ND7)
      DIMENSION LSTORE(12,ND9)
      DIMENSION CORE(ND10)
      DIMENSION LD(4),ITABLE(3,IDIM),ISTOP(2)
C
      DATA ITABLE/228080095,1,208071035,           !CEILING FCST (CATEGORICAL) 
     3            228160095,2,208131035/           !VISIBILITY FCST (CATEGORICAL)
C        DD 35 IS FOR LAMP; 95 IS FOR MELD
C        THESE ARE IDS FOR CEILING AND VISIBILITY.  DD=95 IS MELD; DD=35 IS FINAL
C        (BULLETIN) A 1 INDICATES CEILING AND A 2 INDICATES VISIBILITY.
C
      CALL TIMPR(KFILDO,KFILDO,'START SETVTG        ')
C
      IER=0      
C
C        MAKE SURE THIS SUBROUTINE DEALS WITH HRRR OR RAP MELD CEILING
C        HEIGHT OR VISIBILITY.
C
      DO 1005 M=1,IDIM
C
      IF(ID(1).EQ.ITABLE(1,M))THEN
         L=ITABLE(2,M)
C           M IS THE ENTRY INTO ITABLE( ,M).
         WRITE(KFILDO,1003)ID(1)
 1003    FORMAT(/' IN SETVTG, CATEGORICAL VARIABLE BEING PROCESSED =',
     1           I11)
         GO TO 120
      ENDIF
C
 1005 CONTINUE
C
      IER=103
      WRITE(KFILDO,101)(ID(J),J=1,4),IER
 101  FORMAT(/' ****ID(1) DOES NOT INDICATE CIG OR VIS IN SETVTG',
     1       /'     VARIABLE ',I9.9,I10.9,I10.9,I4.3,' NOT',
     2        ' ACCOMMODATED IN SETVTG.  IER =',I4)
      GO TO 800
C
C        FETCH THE STATION FORECASTS THAT WERE MADE FOR THE 
C        BULLETIN IN FD4( ).
C   
 120  LD(1)=ITABLE(3,M)
      LD(2)=0
      LD(3)=IDPARS(12)
      LD(4)=0
      ITIME=0
      CALL GFETCH(KFILDO,KFIL10,LD,7777,LSTORE,ND9,LITEMS,
     1            IS0,IS1,IS2,IS4,ND7,IPACK,IWORK,FD4,ND1,
     2            NWORDS,NPACK,NDATE,NTIMES,CORE,ND10,
     3            NBLOCK,NFETCH,NSLAB,MISSP,MISSS,L3264B,
     4            ITIME,IER)
C
      IF(IER.NE.0)THEN
         WRITE(KFILDO,220)
 220     FORMAT(/' ****COULD NOT READ STATION MELD FORECASTS, SO',
     1           ' CANNOT CHECK GRID WITH STATION FORECASTS.')
         ISTOP(2)=ISTOP(2)+1
         JER=JER+1
         IREAD=0
      ELSE
         IREAD=1
C           IREAD INDICATES A GOOD READ AND PLASTC1 OR PLASTV1
C           WILL BE ENTERED.
      ENDIF
C
      WRITE(KFILDO,222)(K,CCALL(K),NAME(K),FD4(K),K=1,NSTA)
 222  FORMAT(' IN SETVTG AT 222--(K,CCALL(K),NAME(K),FD4(K),K=1,NSTA)',
     1        I6,2X,A8,2X,A20,F8.1)
C
C        CHECK TO SEE WHETHER STATION FORECASTS FROM THE GRID ARE 
C        CONSISTENT WITH THE FEWER LAMP CATEGORIES.  IF NOT, THE
C        GRIDPOINTS AROUND THE STATION ARE MADE CONSISTENT.
C
      IF(IREAD.EQ.1)THEN
C
         IF(L.EQ.1)THEN
            CALL PLASTC1(KFILDO,CCALL,NAME,FD4,DIR,ND1,NSTA,
     1                   P,NX,NY,IER)
C              THIS PASSES THE SLAB FOR THE GRID IN DIR( , , ).  THERE IS
C              NO NON-ZERO ERROR RETURN.
         ELSEIF(L.EQ.2)THEN
            CALL PLASTV1(KFILDO,CCALL,NAME,FD4,DIR,ND1,NSTA,
     1                   P,NX,NY,IER)
C              THIS PASSES THE SLAB FOR THE GRID IN DIR( , , ).  THERE IS
C              NO NON-ZERO ERROR RETURN.
         ENDIF               
C
      ENDIF
C
      GO TO 900
C
C        SET OUTPUT FIELD TO MISSING WHEN AN ERROR HAS OCCURRED.
C 
 800  DO 802 JY=1,NY
      DO 801 IX=1,NX
      P(IX,JY)=9999.
 801  CONTINUE
 802  CONTINUE
C
      ISTOP(1)=ISTOP(1)+1
      JER=JER+1
C
 900  CONTINUE
      CALL TIMPR(KFILDO,KFILDO,'END   SETVTG        ')
      RETURN
      END