SUBROUTINE CATMLD(KFILDO,KFIL10,IP12,KFILRA,RACESS,NUMRA,
     1                  ID,IDPARS,JD,ITAU,
     2                  NDATE,MDATE,CCALL,ISDATA,XDATA,ND1,NSTA,
     3                  ICALLD,CCALLD,IPACK,IWORK,DATA,ND5,
     4                  LSTORE,ND9,LITEMS,CORE,ND10,
     5                  NBLOCK,NFETCH,
     6                  IS0,IS1,IS2,IS4,ND7,
     7                  L3264B,L3264W,IER)
C 
C        MARCH    2016   GLAHN      MDL   MOS-2000
C                                   BASED ON CATGR1
C        JULY     2016   SCHNAPP    CHANGED 123 TO 888 IN ACCORDANCE WITH
C                                   STANDARDS FOR CIG > 12,000 FT
C        APRIL    2023   KOCHENAS   MODIFIED FOR ADDING 15-MIN C&V IDs. 
C        JANUARY  2024   HUANG      CONSOLIDATED THE 15-MIN C&V IDs WITH 
C                                   THE REGULAR C&V IDs. INCREASED NDIM FROM
C                                   2 TO 4.  
C
C        PURPOSE 
C            TO COMPUTE THE BEST CATEGORY FROM A SET OF PROBABILITY
C            FORECASTS USING THRESHOLDS.  CURRENTLY DEALS WITH:
C              --CUMULATIVE PROBABILITIES FROM BELOW, THRESHOLDS FROM
C                BELOW
C            THE VARIABLE IDS COMPUTED ARE:
C               228131095 -- VISIBILITY
C               228071095 -- CEILING
C
C            DEVELOPED TO DEAL WITH THE MELD CEILING AND VISIBILITY
C            PROBABILITIES OF UP TO MAXCAT CATEGORIES.  ALSO TO MAKE
C            SURE THAT A MELD CATEGORY TRIPPED THAT IS BELOW A LAMP
C            CATEGORY IS NOT CONSIDERED TRIPPED UNLESS THE LAMP 
C            CATEGORY IS TRIPPED.
C
C            THE VALUES RETURNED IN XDATA( ) ARE THE ACTUAL VALUES
C            (VIS IN MILES, CIG IN 100'S OF FT) FORECAST, WHICH IN
C            THE CASE OF EVALUATION AT GRIDPOINTS, ARE THE VALUES
C            TO GIVE THE GRIDPONTS.  THE VALUES CORRESPOND TO WHAT
C            WOULD HAVE BEEN OBSERVED TO GIVE THAT CATEGORY.  FOR
C            INSTANCE, CIG CAT 4 WITH A THRESHOILD OF 3.5 MEANS
C            < 400 FT HAS ONLY ONE REPORTABLE VALUE BELOW 400 AND
C            ABOVE THE NEXT LOWER CATEGORY, SO THAT VALUE = 3
C            (HDS FT) IS PUT ON THE GRID.
C
C        DATA SET USE 
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            IP12   - INDICATES WHETHER (>1) OR NOT (=0) THE LIST OF
C                     STATIONS ON THE INPUT FILES WILL BE PRINTED TO 
C                     THE FILE WHOSE UNIT NUMBER IS IP12.  (OUTPUT)
C         KFILRA(J) - THE UNIT NUMBERS FOR WHICH RANDOM ACCESS FILES
C                     ARE AVAILABLE (J=1,NUMRA).  (INPUT)
C 
C        VARIABLES 
C              KFILDO = DEFAULT UNIT NUMBER FOR OUTPUT (PRINT) FILE.
C                       (INPUT) 
C              KFIL10 = UNIT NUMBER OF TDL MOS-2000 FILE SYSTEM ACCESS.
C                       (INPUT)
C                IP12 = INDICATES WHETHER (>0) OR NOT (=0) THE LIST OF
C                       STATIONS ON THE EXTERNAL RANDOM ACCESS FILES
C                       WILL BE LISTED TO UNIT IP12 (IN RETVEC/CONST/
C                       FINDST).  (INPUT)
C           KFILRA(J) = THE UNIT NUMBERS FOR WHICH RANDOM ACCESS FILES
C                       ARE AVAILABLE (J=1,NUMRA).  (INPUT)
C           RACESS(J) = THE FILE NAMES ASSOCIATED WITH KFILRA(J) (J=1,NUMRA).
C                       (CHARACTER*60)  (INPUT)
C               NUMRA = THE NUMBER OF VALUES IN KFILRA( ) AND RACESS( ).
C                       (INPUT)
C               ID(J) = THE VARIABLE ID (J=1,4) FOR WHICH THE BEST
C                       CATEGORY IS DESIRED.  (INPUT)
C           IDPARS(J) = THE PARSED, INDIVIDUAL COMPONENTS OF THE 
C                       VARIABLE ID CORRESPONDING TO ID( ) (J=1,15).
C                       (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 
C                            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 
C                            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) = THE BASIC INTEGER VARIABLE ID (J=1,4).
C                       THIS IS THE SAME AS ID(J), EXCEPT THAT THE
C                       PORTIONS 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                       JD( ) IS USED TO IDENTIFY THE BASIC MODEL FIELDS
C                       AS READ FROM THE ARCHIVE.  (INPUT)
C                ITAU = THE NUMBER OF HOURS AHEAD TO FIND A VARIABLE.
C                       THIS HAS ALREADY BEEN CONSIDERED IN MDATE, BUT
C                       IS NEEDED FOR CALL TO RETVEC.  (INPUT)
C               NDATE = THE DATE/TIME FOR WHICH FORECAST CATEGORY IS
C                       NEEDED.  (INPUT)
C               MDATE = NDATE UPDATED WITH ITAU( ).  (INPUT)
C          CCALL(K,J) = 8-CHARACTER STATION CALL LETTERS (OR GRIDPOINT
C                       LOCATIONS FOR GRID DEVELOPMENT) TO PROVIDE
C                       OUTPUT FOR (J=1) AND 5 POSSIBLE OTHER STATION
C                       CALL LETTERS (J=2,6) THAT CAN BE USED INSTEAD
C                       IF THE PRIMARY (J=1) STATION CANNOT BE FOUND 
C                       IN AN INPUT DIRECTORY (K=1,NSTA).  ALL STATION
C                       DATA ARE KEYED TO THIS LIST, EXCEPT POSSIBLY 
C                       CCALLD( ).  EQUIVALENCED TO ICALL( , , ). 
C                       (CHARACTER*8)  (INPUT)
C           ISDATA(K) = WORK ARRAY (K=1,ND1).  (INTERNAL)
C            XDATA(K) = THE PROBABILITY VALUES (INTERNAL).  THEN, THE
C                       FORECAST VALUES.  (OUTPUT) 
C                 ND1 = MAXIMUM NUMBER OF STATIONS THAT CAN BE DEALT 
C                       WITH.  DIMENSION OF XDATA( ), YDATA( ),
C                       JDATAT( ), AND JDATA( ).  (INPUT)
C                NSTA = NUMBER OF STATIONS OR LOCATIONS BEING DEALT
C                       WITH.  (INPUT)
C         ICALLD(L,K) = 8 STATION CALL LETTERS AS CHARACTERS IN AN INTEGER
C                       VARIABLE (L=1,L3264W) (K=1,ND5).  THIS ARRAY IS USED 
C                       TO READ THE STATION DIRECTORY FROM A MOS-2000
C                       EXTERNAL FILE.  EQUIVALENCED TO CCALLD( ). 
C                       (CHARACTER*8)  (INTERNAL)
C           CCALLD(K) = 8 STATION CALL LETTERS (K=1,ND5).  EQUIVALENCED
C                       TO ICALLD( , ).  (INTERNAL)
C            IPACK(J) = WORK ARRAY (J=1,ND5).  (INTERNAL)
C            IWORK(J) = WORK ARRAY (J=1,ND5).  (INTERNAL)
C             DATA(K) = WORK ARRAY (J=1,ND5).  (INTERNAL)
C                 ND5 = DIMENSION OF IPACK( ), IWORK( ), AND DATA( ).
C                       (INPUT)
C         LSTORE(L,J) = THE ARRAY HOLDING INFORMATION ABOUT THE DATA 
C                       STORED (L=1,12) (J=1,LITEMS).  (INPUT-OUTPUT)
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 TDL GRIB, 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                              CHARACTERISTICS OF THIS GRID.
C                       L=11 --THE NUMBER OF THE PREDICTOR IN THE SORTED
C                              LIST IN ID( ,N) (N=1,NPRED) FOR WHICH 
C                              THIS VARIABLE IS NEEDED, WHEN IT IS 
C                              NEEDED ONLY ONCE FROM LSTORE( , ). 
C                              WHEN IT IS NEEDED MORE THAN ONCE, THE 
C                              VALUE IS SET = 7777.
C                       L=12 --USED INITIALLY IN ESTABLISHING 
C                              MSTORE( , ).  LATER USED AS A WAY OF
C                              DETERMINING WHETHER TO KEEP THIS 
C                              VARIABLE.
C                 ND9 = THE SECOND DIMENSION OF LSTORE( , ).  (INPUT)
C              LITEMS = THE NUMBER OF ITEMS (COLUMNS) IN LSTORE( , )
C                       THAT ARE IN USE.  (INPUT)
C             CORE(J) = THE ARRAY TO STORE OR RETRIEVE THE DATA 
C                       IDENTIFIED IN LSTORE( , ) (J=1,ND10).  WHEN 
C                       CORE( ) IS FULL DATA ARE STORED ON DISK.
C                       (INPUT)
C                ND10 = DIMENSION OF CORE( ).  (INPUT)
C              NBLOCK = THE BLOCK SIZE IN WORDS OF THE MOS-2000 RANDOM
C                       DISK FILE.  (INPUT)
C              NFETCH = THE NUMBER OF TIMES GFETCH HAS BEEN ENTERED.
C                       GFETCH KEEPS TRACK OF THIS AND RETURNS THE
C                       VALUE.  (OUTPUT)
C              IS0(J) = MOS-2000 GRIB SECTION 0 ID'S (J=1,3). 
C                       (INTERNAL)
C              IS1(J) = MOS-2000 GRIB SECTION 1 ID'S (J=1,22+). 
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 IS4( ).
C                       NOT ALL LOCATIONS ARE USED.  (INPUT)
C              L3264B = INTEGER WORD LENGTH IN BITS OF MACHINE BEING
C                       USED (EITHER 32 OR 64).  (INPUT)
C              L3264W = NUMBER OF WORDS IN 64 BITS (EITHER 1 OR 2).  
C                       CALCULATED BY PARAMETER, BASED ON L3464B.
C                       (INPUT)
C                 IER = STATUS RETURN.
C                         0 = GOOD RETURN.
C                       102 = ID NOT ACCOMMODATED OR VALUE IN 
C                             ITABLE( , ) IS INCORRECT.
C                       SEE RETVEC FOR OTHER VALUES.  (OUTPUT)
C               LD(J) = HOLDS THE 4 ID WORDS OF THE DATA RETRIEVED INTO
C                       YDATA( ) (J=1,4).  (INTERNAL)
C           LDPARS(J) = PARSED VALUES CORRESPONDING TO LD( ) (J=1,15)
C                       (INTERNAL)
C               MD(J) = HOLDS THE 4 ID WORDS OF THE DATA RETRIEVED INTO
C                       XDATA( ) (J=1,4).  (INTERNAL)
C           MDPARS(J) = PARSED VALUES CORRESPONDING TO MD( ) (J=1,15)
C                       (INTERNAL)
C                NDIM = DIMENSION OF ITABLE.
C            YDATA(K) = WORK ARRAY (K=1,ND1) WHICH HOLDS THRESHOLDS.
C                       (AUTOMATIC)
C            JDATA(K) = BEST CATEGORY WHILE COMPUTING (K=1,ND1).
C                       (AUTOMATIC)
C           JDATAT(K) = USED IN CONJUNCTION WITH JDATA(K) IN OBTAINING
C                       THE CATEGORY.  (AUTOMATIC)
C         ITABLE(I,J) = I=1--VALUE OF CCCFFF ACCOMMODATED;
C                       I=2--ID(1) FOR THRESHOLDS;
C                       I=3--ID(1) FOR PROBABILITY FORECASTS;
C                       I=4--NUMBER OF THRESHOLDS AND THE NUMBER OF
C                            PROBABILITY FORECASTS NEEDED;
C                       I=5--HOW THE CATEGORICAL FORECASTS ARE TO BE 
C                            DETERMINED
C                            2 = FORECASTS ARE CUMULATIVE FROM BELOW AND
C                                THRESHOLDS ARE DETERMINED CUMULATIVE
C                                FROM BELOW
C                       I=6--KEY REPRESENTING THE TIME SLICING:
C                            1 = 1 SEASON, ALL YEAR, VALUE = 19
C                            2 = TWO SEASONS, APR-SEPT, OCT-MAR,
C                                VALUES = 17, 18
C                            3 = FOUR SEASONS, MARCH-MAY, JUNE-AUG, ETC.
C                                VALUES = 13, 14, 15, 16
C                            4 = EACH MONTH, VALUES = 1-12
C                            5 = LMP TSTM 3 SEASON CYCLE,
C                                MARCH 16-JUNE 30, JULY 1-OCT 15,
C                                OCT 16-MARCH 15
C                                VALUES = 22,20,21
C                            6 = LMP PTYPE 2 SEASON CYCLE, SEPT-MAY,
C                                JUNE-AUG.  VALUES = 23,14
C                       I=7,6+ITABLE(2,J)--THE THRESHOLDS FOR THE 
C                            PROBABILITY FORECASTS (THE FIRST 6 DIGITS
C                            OF ID(4).  NOTE THAT THESE ARE IN THE EXACT
C                            FORM IN ID(4) AND ARE ENTERED IN THE ORDER 
C                            USED IN THE COMPUTATION.
C                       (J=1,NDIM).
C                       WITH M THRESHOLDS PROVIDED FOR, M+1 CATEGORIES
C                       ARE POSSIBLE.  WHEN THE ACTUAL NUMBER OF
C                       CATEGORIES, ITABLE(4, ), IS < MAXCAT, THEN ONLY
C                       THE VIRST NUMBER NEEDED HAVE LEGITIMATE VALUES
C                       IN ITABLE( , ) AND THE REST CAN BE ZERO.
C                       (INTERNAL)
C         LMPCAT(I,J) = INDICATES WHETHER (=1) OR NOT (=0) THE 
C                       THRESHOLD I,J IN ITABLE(I,J) IS A LAMP
C                       CATEGORY (I=1,MAXCAT) (J=1,NDIM).  (INTERNAL)
C         CATMEL(I,J) = THE VALUE TO PUT ON THE GRID WHEN THE THRESHOLD
C                       ITABLE(I,J) IS MET (I=1,MAXCAT) AND THE 
C                       DEFAULT WHEN NO THRESHOLD IS MET (I=MAXCAT+1)
C                       (J=1,NDIM).  (INTERNAL)
C                NCAT = THE NUMBER OF THRESHOLDS AND NUMBER OF 
C                       PROBABILITY FORECASTS NEEDED FOR COMPUTATION.
C                       SET = ITABLE(4, ).  (INTERNAL)
C         L2L2TB(N,J) = VALUES FOR L2L2 IN ID(2) FOR THE THRESHOLDS
C                       CORRESPONDING TO MONTH (N=1,12) AND TIME
C                       SLICE FOR COMPUTING THRESHOLDS (J=1,6).
C                       (SEE TDL ON 00-1; P. 14.2)  (INTERNAL)
C        1         2         3         4         5         6         7 X
C
C        NONSYSTEM SUBROUTINES CALLED 
C            RETVEC, PRSID1
C
      PARAMETER (NDIM=4)
      PARAMETER (MAXCAT=24)
C
      CHARACTER*8 CCALL(ND1,6)
      CHARACTER*8 CCALLD(ND5)
      CHARACTER*60 RACESS(5)
C
      DIMENSION XDATA(ND1)
      DIMENSION YDATA(ND1),JDATA(ND1),JDATAT(ND1)
C        YDATA( ), JDATA( ), AND JDATAT( ) ARE AUTOMATIC ARRAYS.
      DIMENSION ID(4),IDPARS(15),JD(4)
      DIMENSION IPACK(ND5),IWORK(ND5),DATA(ND5)
      DIMENSION IS0(ND7),IS1(ND7),IS2(ND7),IS4(ND7)
      DIMENSION LSTORE(12,ND9)
      DIMENSION CORE(ND10),ICALLD(L3264W,ND5)
      DIMENSION LD(4),LDPARS(15),MD(4),MDPARS(15),KFILRA(5)
      DIMENSION ITABLE(MAXCAT+6,NDIM)
      DIMENSION LMPCAT(MAXCAT,NDIM)
      DIMENSION CATMEL(MAXCAT+1,NDIM)
      DIMENSION L2L2TB(12,6)
C
      DATA ((ITABLE(I,J),I=1,MAXCAT+6),J=1,NDIM)/ 
c
C        BELOW FOR LAMP VIS 15-MIN LAMP+HRRR MELD, 16 CATS
C        DD 35 = LAMP+HRRR
c
     1 208161035, 808130235, 208110235, 16, 2, 2,
C

     2 500052,  245000,  495000,  745000,  950000,  149501,
     3 195001,  249501,  295001,  300501,  400501,  505001,
     4 605001,  700501,  800501,  999501,       0,       0,
     5      0,       0,       0,       0,       0,       0,
C
C        BELOW FOR LAMP CIG 15-MIN LAMP+HRRR MELD, 24 CATS
C        DD 35 = LAMP+HRRR
C
     6 208081035, 808070235, 208060235, 24, 2 ,2,
C
     7 950052,  150001,  250001,  350001,  450001,  550001,
     8 650001,  750001,  850001,  950001,  115002,  145002,
     9 165002,  195002,  245002,  305002,  405002,  495002,
     A 655002,  805002,  905002,  100503,  110503,  120503,
C
C        BELOW FOR LAMP VIS HOURLY LAMP+HRRR MELD, 16 CATS
C        DD 95 = LAMP+HRRR
c
     1 208161095, 808130295, 208130295, 16, 2, 2,
C

     2 500052,  245000,  495000,  745000,  950000,  149501,
     3 195001,  249501,  295001,  300501,  400501,  505001,
     4 605001,  700501,  800501,  999501,       0,       0,
     5      0,       0,       0,       0,       0,       0,
C
C        BELOW FOR LAMP CIG HOURLY LAMP+HRRR MELD, 24 CATS
C        DD 95 = LAMP+HRRR
C
     6 208081095, 808070295, 208070295, 24, 2 ,2,
C
     7 950052,  150001,  250001,  350001,  450001,  550001,
     8 650001,  750001,  850001,  950001,  115002,  145002,
     9 165002,  195002,  245002,  305002,  405002,  495002,
     A 655002,  805002,  905002,  100503,  110503,  120503/
C
      DATA ((LMPCAT(I,J),I=1,MAXCAT),J=1,NDIM)/ 
c
C        BELOW FOR LAMP VIS 15-MIN LAMP+HRRR MELD, 16 CATS
C        DD 35 = LAMP+HRRR
c
     2      0,       0,       1,       0,       1,       0,
     3      1,       0,       1,       0,       0,       1,
     4      1,       0,       0,       1,       0,       0,
     5      0,       0,       0,       0,       0,       0,
C
C        BELOW FOR LAMP CIG 15-MIN LAMP+HRRR MELD, 24 CATS
C        DD 35 = LAMP+HRRR
C
     7      0,       1,       0,       0,       1,       0,
     8      0,       0,       0,       1,       0,       0,
     9      0,       1,       0,       1,       0,       0,
     A      1,       0,       0,       0,       0,       1,
C
C        BELOW FOR LAMP VIS HOURLY LAMP+HRRR MELD, 16 CATS
C        DD 95 = LAMP+HRRR (REPEAT 15-MIN ONE)
c
     2      0,       0,       1,       0,       1,       0,
     3      1,       0,       1,       0,       0,       1,
     4      1,       0,       0,       1,       0,       0,
     5      0,       0,       0,       0,       0,       0,
C
C        BELOW FOR LAMP CIG HOURLY LAMP+HRRR MELD, 24 CATS
C        DD 95 = LAMP+HRRR (REPEAT 15-MIN ONE)
C
     7      0,       1,       0,       0,       1,       0,
     8      0,       0,       0,       1,       0,       0,
     9      0,       1,       0,       1,       0,       0,
     A      1,       0,       0,       0,       0,       1/
C
      DATA ((CATMEL(I,J),I=1,MAXCAT+1),J=1,NDIM)/
C
C        BELOW FOR LAMP VIS 15-MIN LAMP+HRRR MELD, 16 CATS       !LAST VALUE IS DEFAULT IF NO THRESHOLD MET      
C        DD 35 = LAMP+HRRR
C
     2     0.,    .125,     .25,      .5,     .75,    1.12,
     3   1.62,      2.,     2.5,     3.0,     4.0,      5.,
     4     6.,      7.,      8.,      9.,   10.01,      0.,
     5     0.,      0.,      0.,      0.,      0.,      0.,
     X     0.,
C     
C        BELOW FOR LAMP CIG 15-MIN LAMP+HRRR MELD, 24 CATS       !LAST VALUE IS DEFAULT IF NO THRESHOLD MET    
C        DD 35 = LAMP+HRRR
C
     7     0.,      1.,      2.,      3.,      4.,      5.,
     8     6.,      7.,      8.,      9.,     11.,     13.,
     9    15.,     18.,     22.,     27.,     35.,     45.,
     A    58.,     73.,     85.,     95.    ,110.,    120.,
     X   888.,
C
C        BELOW FOR LAMP VIS HOURLY LAMP+HRRR MELD, 16 CATS       !LAST VALUE IS DEFAULT IF NO THRESHOLD MET      
C        DD 95 = LAMP+HRRR (REPEAT 15-MIN ONE)
C
     2     0.,    .125,     .25,      .5,     .75,    1.12,
     3   1.62,      2.,     2.5,     3.0,     4.0,      5.,
     4     6.,      7.,      8.,      9.,   10.01,      0.,
     5     0.,      0.,      0.,      0.,      0.,      0.,
     X     0.,
C     
C        BELOW FOR LAMP CIG HOURLY LAMP+HRRR MELD, 24 CATS       !LAST VALUE IS DEFAULT IF NO THRESHOLD MET    
C        DD 95 = LAMP+HRRR (REPEAT 15-MIN ONE)
C
     7     0.,      1.,      2.,      3.,      4.,      5.,
     8     6.,      7.,      8.,      9.,     11.,     13.,
     9    15.,     18.,     22.,     27.,     35.,     45.,
     A    58.,     73.,     85.,     95.    ,110.,    120.,
     X   888./
C     X   123./

      DATA L2L2TB
     1     /19,19,19,19,19,19,19,19,19,19,19,19,
     2      18,18,18,17,17,17,17,17,17,18,18,18,
     3      16,16,13,13,13,14,14,14,15,15,15,16,
     4       1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,
     5      22,22,22,20,20,20,21,21,21,21,22,22,
     6      23,23,23,23,23,14,14,14,23,23,23,23/
C
      IER=0
C
      CALL TIMPR(KFILDO,KFILDO,'START CATMLD        ')
C
      DO 100 JJ=1,NDIM
C
      IF(ITABLE(1,JJ).EQ.ID(1))GO TO 1075
C        THIS DEFINES THE ELEMENT JJ.
 100  CONTINUE
C     
      WRITE(KFILDO,107)(ID(L),L=1,4)
 107  FORMAT(' ****CATMLD ENTERED FOR VARIABLE',
     1        2X,I9.9,1X,I9.9,1X,I9.9,1X,I10.3,
     2        ' NOT ACCOMMODATED.')
      IER=102
      GO TO 400
C   
 1075 IF(ITABLE(5,JJ).NE.2)THEN
         WRITE(KFILDO,108)ITABLE(5,JJ),(ID(J),J=1,4)
 108     FORMAT(/,' ****ITABLE(5, ) =',I4,' OUT OF RANGE IN ',
     1           'CATMLD.  CANNOT COMPUTE BEST CATEGORY FOR',
     2            2X,I9.9,1X,I9.9,1X,I9.9,1X,I10.3)
         IER=102
         GO TO 400
C
      ELSEIF(ITABLE(6,JJ).GT.6)THEN
         WRITE(KFILDO,109)ITABLE(6,JJ),(ID(J),J=1,4)
 109     FORMAT(/,' ****ITABLE(6, ) =',I4,' OUT OF RANGE IN ',
     1           'CATMLD.  CANNOT COMPUTE BEST CATEGORY FOR',
     2            2X,I9.9,1X,I9.9,1X,I9.9,1X,I10.3)
         IER=102
         GO TO 400
C
      ENDIF         
C       
C        ZERO THE JDATA( ) AND JDATAT( ) ARRAYS WHICH WILL
C        HOLD THE CATEGORY DURING THE COMPUTATION.
C
      DO 111 K=1,NSTA
      JDATA(K)=0
      JDATAT(K)=0
 111  CONTINUE
C
      NCAT=ITABLE(4,JJ)
      NCYCLE=NDATE-(NDATE/100)*100
C        NCYCLE IS L1L1 IN ID(2)
      MONTH=NDATE/10000-(NDATE/1000000)*100
C        MONTH DETERMINES L2L2 IN ID(2) FOR THRESHOLDS.
      L2L2=L2L2TB(MONTH,ITABLE(6,JJ))
C
C        L2L2 IS THE L2L2 IN ID(2) FOR THRESHOLDS.  ADJUST L2L2 FOR
C        SPLIT MONTHS IN THREE-SEASON MODEL FOR TSTMS.
C
      NDAY=MOD(NDATE,10000)/100
      IF(MONTH.EQ.03.AND.L2L2.EQ.22.AND.NDAY.GE.16) THEN
         L2L2=20
      ELSEIF(MONTH.EQ.10.AND.L2L2.EQ.21.AND.NDAY.GE.16) THEN
         L2L2=22
      ENDIF
C
      LD(1)=ITABLE(2,JJ)
C        MODIFY LD(2) TO ACCOUNT 15-MINUTE LAMP C&V
      LD(2)=(NCYCLE*1000000+L2L2*10000)+IDPARS(7)
C      LD(2)=NCYCLE*1000000+L2L2*10000
      LD(3)=IDPARS(12)
C        LD( ) IS FOR ACCESSING THE THRESHOLDS.
C
      MD(1)=ITABLE(3,JJ)
C        MODIFY MD(2) TO ACCOUNT 15-MINUTE LAMP C&V
      MD(2)=IDPARS(7)
C      MD(2)=0
      MD(3)=LD(3)
C        MD( ) IS FOR ACCESSING THE PROBABILITIES.
C
C        START LOOP FOR NCAT THRESHOLDS AND FORECASTS.
C        USE THE THRESHOLDS AND FORECASTS IN THE ORDER
C        SPECIFIED IN ITABLE( ,JJ).
C
      DO 200 N=1,NCAT
C
C        COMPUTE ID(4) FOR THE THRESHOLDS.  THE FIRST 3 IDS DO NOT
C        CHANGE FROM CATEGORY TO CATEGORY.
C        
      LD(4)=ITABLE(N+6,JJ)*1000+IDPARS(13)*100+IDPARS(14)*10+IDPARS(15)
C 
C        FETCH THE THRESHOLDS IN YDATA( ).
C
      CALL PRSID1(KFILDO,LD,LDPARS)
      CALL RETVEC(KFILDO,KFIL10,IP12,KFILRA,RACESS,NUMRA,
     1            LD,LDPARS,JD,ITAU,
     2            NDATE,MDATE,CCALL,ISDATA,YDATA,ND1,NSTA,
     3            ICALLD,CCALLD,IPACK,IWORK,DATA,ND5,
     4            LSTORE,ND9,LITEMS,CORE,ND10,
     5            NBLOCK,NFETCH,
     6            IS0,IS1,IS2,IS4,ND7,
     7            L3264B,L3264W,IER)
C
C      WRITE(KFILDO,*)YDATA
      IF(IER.NE.0)THEN
         WRITE(KFILDO,127)(LD(J),J=1,4),(ID(J),J=1,4)
 127     FORMAT(' ****THRESHOLDS',2X,I9.9,1X,I9.9,1X,I9.9,1X,I10.3,
     1          ' NOT RETRIEVED BY RETVEC IN CATMLD.',
     2          '  CANNOT COMPUTE BEST CATEGORY FOR',/,
     3          '               ',2X,I9.9,1X,I9.9,1X,I9.9,1X,I10.3)
         GO TO 400
C
      ENDIF
C
C        COMPUTE ID(4) FOR THE PROBABILITIES.  THE FIRST 3 IDS DO NOT
C        CHANGE FROM CATEGORY TO CATEGORY.
C
      MD(4)=LD(4)     
C 
C        FETCH THE PROBABILITIES IN XDATA( ).
C
      CALL PRSID1(KFILDO,MD,MDPARS)
      CALL RETVEC(KFILDO,KFIL10,IP12,KFILRA,RACESS,NUMRA,
     1            MD,MDPARS,JD,ITAU,
     2            NDATE,MDATE,CCALL,ISDATA,XDATA,ND1,NSTA,
     3            ICALLD,CCALLD,IPACK,IWORK,DATA,ND5,
     4            LSTORE,ND9,LITEMS,CORE,ND10,
     5            NBLOCK,NFETCH,
     6            IS0,IS1,IS2,IS4,ND7,
     7            L3264B,L3264W,IER)
C 
C        JD( ) IS NOT ACTUALLY USED IN RETVEC.  IT IS USED
C        IN CALL TO CONST, BUT CONST DOES NOT USE IT EITHER.
C
      IF(IER.NE.0)THEN
         WRITE(KFILDO,135)(MD(J),J=1,4),(ID(J),J=1,4)
 135     FORMAT(' ****PROBABILITIES',2X,I9.9,1X,I9.9,1X,I9.9,1X,I10.3,
     1          ' NOT RETRIEVED BY RETVEC IN CATMLD.',
     2          '  CANNOT COMPUTE BEST CATEGORY FOR',/,
     3          '                  ',2X,I9.9,1X,I9.9,1X,I9.9,1X,I10.3)
         GO TO 400
C
      ENDIF
C
      DO 160 K=1,NSTA
C
      IF(JDATA(K).EQ.0)THEN
C           ONCE JDATA( ) HAS BEEN SET NE 0, IT IS NOT CHANGED AGAIN.
C
         IF(NINT(XDATA(K)).EQ.9997)THEN
            XDATA(K)=0.
C              A FORECAST OF 9997 IS TREATED AS 0 PROBABILITY.
         ELSEIF(NINT(XDATA(K)).EQ.9999)THEN
C              IF ANY FORECAST IS TRULY MISSING, THE BEST CATEGORY
C              IS SET MISSING.
            JDATA(K)=9999
         ELSEIF(NINT(YDATA(K)).EQ.9999)THEN
C              IF ANY THRESHOLD IS MISSING, THE BEST CATEGORY
C              IS SET MISSING.
            JDATA(K)=9999
         ELSE
C
            IF(ITABLE(5,JJ).EQ.2)THEN
C                 ALTHOUGH CATMLD CURRENTLY DEALS WITH ONLY CUMULATIVE
C                 FROM BELOW, THE TEST IS LEFT HERE, AS IN CATGR1, IN
C                 CASE OTHER ALTERNATIVES ARE CONSIDERED LATER.
C
C                 THIS SECTION FOR CUMULATIVE FROM BELOW PROBABILITIES,
C                 THE ONLY ONE CURRENTLY CONSIDERED.
C
               IF(XDATA(K).GE.YDATA(K))THEN
C                  WRITE(KFILDO,*)XDATA(K), YDATA(K)
C                    THE THRESHOLD IS TRIPPED.
C
                  IF(LMPCAT(N,JJ).EQ.0)THEN
C                       THIS IS NOT A LAMP CATEGORY.  DO NOT SET
C                       JDATA(K) = N OR THE PROCESSING WILL STOP FOR
C                       STATION K.
C
                     IF(JDATAT(K).EQ.0)THEN
                        JDATAT(K)=N
                     ENDIF
C
                  ELSE
C                       THIS IS A LAMP CATEGORY.
                     JDATA(K)=N
C
                     IF(JDATAT(K).EQ.0)THEN
                        JDATAT(K)=N
                     ENDIF
C
                     JDATA(K)=JDATAT(K)
C                        JDATAT(K) IS THE CATEGORY FIRST TRIPPED, AFTER
C                        THE NEXT LOWER LAMP CATEGORY.
                  ENDIF                  
C
               ELSE
C
                  IF(LMPCAT(N,JJ).EQ.0)THEN
C                       THIS IS NOT A LAMP CATEGORY.  IT DID NOT
C                       TRIP THE THRESHOLD, SO SET JDATAT(K) = 0.
C
CCCC                     IF(JDATAT(K).NE.0)THEN
CCCC                        WRITE(KFILDO,140)CCALL(K,1),JDATA(K),JDATAT(K)
CCCC 140                    FORMAT(' AT 140 IN CATMLD--CCALL(K,1),',
CCCC     1                         'JDATA(K),JDATAT(K),XDATA(K)   ',A8,2I4)
CCCC                     ENDIF
C
                     JDATAT(K)=0
                     JDATA(K)=0
                  ENDIF
C
               ENDIF
C
C              IF(CCALL(K,1).EQ.'10950884')THEN
C                 WRITE(KFILDO,145)CCALL(K,1),IDPARS(12),N,
C     1                            JDATA(K),JDATAT(K)
C 145             FORMAT(/' AT 145--CCALL(K,1),IDPARS(12),N,',
C     1                   'JDATA(K),DATAT(K)   ',A8,4I4)
C              ENDIF
C
            ENDIF
C
         ENDIF
C  
C         IF(CCALL(K,1).EQ.'10950884')THEN
CCCCC
C            WRITE(KFILDO,158)CCALL(K,1),N,IDPARS(12),XDATA(K),YDATA(K),
C     1                       JDATA(K),JDATAT(K)
C 158        FORMAT(' AT 158 IN CATMLD--CCALL(K,1),N,IDPARS(12)XDATA(K)',
C     1             'YDATA(K),JDATA(K),JDATAT(K)   ',A8,2I4,2F8.3,2I4)
C         ENDIF
C
      ENDIF
C
 160  CONTINUE
C
 200  CONTINUE
C
C        SET XDATA( ) TO THE CATEGORY IN JDATA( ).
C
      DO 210 K=1,NSTA
C
      IF(JDATA(K).EQ.9999)THEN
C           JDATA(K) = 9999 INDICATES A MISSING FORECAST OR THRESHOLD.
         XDATA(K)=9999.
      ELSEIF(JDATA(K).EQ.0)THEN   
         XDATA(K)=CATMEL(NCAT+1,JJ)
      ELSE
         XDATA(K)=CATMEL(JDATA(K),JJ)
      ENDIF
C
C      IF(CCALL(K,1).EQ.'10950884')THEN
C         WRITE(KFILDO,205)CCALL(K,1),IDPARS(12),JDATA(K),JDATAT(K),
C     1                    XDATA(K)
C 205     FORMAT(' AT 205 IN CATMLD--CCALL(K,1),IDPARS(12)',
C     1          'JDATA(K),JDATAT(K),XDATA(K)   ',A8,3I4,F6.1)
C      ENDIF
C
 210  CONTINUE
C     
      GO TO 450
C
C        THIS VARIABLE CANNOT BE COMPUTED.  SET THE FORECAST ARRAY TO
C        MISSING.
C
 400  DO 410 K=1,NSTA
         XDATA(K)=9999.
 410  CONTINUE 
C
 450  RETURN
      END