SUBROUTINE MAXMIN(KFILDO,HRLY,RMXMN_6HR,ITIMEZ,CCALL,NAME,RESFLD,
     *                  ND1,IFOUR,MAXHRL,MXMN,IPRT,NSTA)
C
C        SEPTEMBER 1998   WEISS  TDL MOS-2000
C                                BASED ON A MAX/MIN CODE WRITTEN BY
C                                JACK SETTELMAIER, APRIL 1997
C        DECEMBER  2000   WEISS  MODIFIED TO ALLOW FOR THE
C                                CALCULATION OF MAX/MIN TEMPERATURES
C                                FOR PART-TIME STATIONS.
C        OCTOBER   2001   WEISS  IF STATEMENTS CONTAINING REAL VALUES
C                                CHANGED TO INTEGERS.
C        MAY       2003   WEISS  ARGUMENT LIST CHANGES; ELIMINATION 
C                                OF THE LOCAL ARRAY HFLD, CCALL1 NOW
C                                REFERENCED AS CCALL
C        MAY       2003   GLAHN  MINOR REARRANGEMENT OF COMMENTS AND
C                                TYPE STATEMENTS; WHITE SPACE 
C        SEPT      2009   VEENHU ADDED THE VARIABLE NAME TO INPUT
C                                LIST. ADDED CODE TO CHECK THE STATION
C                                STATE AND ADDED CALL TO MAXMIN_AK
C                                TO PROCESS ALASKAN STAIONS.
C
C        PURPOSE
C            THIS SUBROUTINE COMPUTES DAYTIME/NIGHTTIME MAX/MIN
C            TEMPERATURES FOR STATION (VECTOR) DATA FOR DATES 
C            STARTING ON DECEMBER 1, 1996 OR LATER. INPUTS INCLUDE
C            THE 6-HRLY MINIMUM OR MAXIMUM TEMPERATURES AND
C            HOURLY OBSERVATIONS.
C
C        DATA SET USE
C            KFILDO - DEFAULT UNIT NUMBER FOR OUTPUT (PRINT) FILE
C                     (OUTPUT).
C
C        VARIABLES
C              KFILDO = DEFAULT UNIT NUMBER FOR OUTPUT (PRINT) FILE
C                       (INPUT).
C           HRLY(N,J) = THE HOURLY TEMPERATURE OBS FOR EACH STATION
C                       WHERE N=1,ND1 AND J=1,MAXHRL (INPUT).
C      RMXMN_6HR(N,J) = ARRAY OF THE 6-HRLY MINS OR MAXS, BEFORE THEY
C                       ARE PUT IN THE ARRAYS MINS AND MAXS, WHERE
C                       N=1,ND1 AND J=1,4 (INPUT).
C           ITIMEZ(N) = ARRAY STATION'S TIME ZONE, WHERE N=1,ND1,
C                       (INPUT).
C           CCALL(N)  = AN ARRAY OF NSTA NUMBER OF STATION CALL
C                       LETTERS USED FOR DIAGNOSTICS, WHERE N=1,ND1
C                       (INPUT).
C           RESFLD(N) = THE RESULTANT FIELD (MAX OR MIN) FOR EACH
C                       STATION, WHERE N=1,ND1 (OUTPUT).
C                 ND1 = MAXIMUM NUMBER OF STATIONS (INPUT).
C               IFOUR = VALUE OF 4, MAXIMUM NUMBER OF 6-HRLY MINS OR 
C                       MAXS IN A GIVEN DAY (INPUT).
C              MAXHRL = MAXIMUM NUMBER OF HOURS (=25) USED TO STORE
C                       THE HOURLY TEMPERATURES FROM ACROSS ALL
C                       POTENTIAL TIME ZONES (INPUT).
C                MXMN = FLAG TO INDICATE DAYTIME MAX (=2) OR
C                       NIGHTTIME MIN (=1) PROCESSING (INPUT).
C             NAME(K) = NAMES OF STATIONS (K=1,NSTA).  USED FOR PRINTOUT
C                       ONLY.  (CHARACTER*20)  (INPUT)
C                IPRT = PRINT FLAG USED TO (IPRT > 0), PRINT OUT
C                       INCREASING AMOUNTS OF DIAGNOSTICS
C                       1=SOME(RECOMMENDED), 2=ALL DIAGNOSTICS (INPUT).
C                NSTA = NUMBER OF STATIONS THAT THE MAX OR MIN WILL BE 
C                       CALCULATED FOR (INPUT).
C
C        OTHER VARIABLES
C
C                 
C                CMAX = LOGICAL PARAMETER FOR DAYTIME MAXIMUM
C                       PROCESSING (INTERNAL).
C                CMIN = LOGICAL PARAMETER FOR NIGHTTIME MINIMUM
C                       PROCESSING (INTERNAL).
C             HOLD(K) = ARRAY USED TO HOLD THE MIN/MAX VALUES (MIN1/MAX1
C                       VS SEGMENT B) AND (MIN3/MAX3 VS SEGMENT C). 
C                       MIN/MAX PROCESSING USES THESE VALUES ONLY IF 
C                       SIMPLE CHECKING FAILS, WHERE K=1,4 (INTERNAL).
C             IMSG(L) = ARRAY TO HOLD THE NUMBER OF MISSINGS IN A RANGE
C                       OF DATA; USUALLY HOURLY, FOR A GIVEN STATION,
C                       WHERE L=1,3 (OUTPUT). 
C              INUMZN = NUMBER OF HOURS (=14) USED TO SELECT HOURLY
C                       OBS REPRESENTING THE FIRST AND THIRD 6-HOUR
C                       TIME PERIODS (INTERNAL).
C           ITIME1(K) = THE STARTING POINT OF A STATION'S 2 HOUR WINDOW
C                       CHECK (6AM, 6PM: MAX, AND 6PM,7AM: MIN), A - B
C                       AND C - D BOUNDARIES, WHERE K=1,4 (INTERNAL).
C           ITIME2(K) = THE ENDING POINT OF A STATION'S 2 HOUR WINDOW
C                       CHECK (8AM, 8PM: MAX, AND 8PM,9AM: MIN), A - B
C                       AND C - D BOUNDARIES, WHERE K=1,4 (INTERNAL).
C           ITIMEZ_AK = USE TO INPUT TIME ZONE INFORMATION TO MAXMIN_AK
C                       (INTERNAL).
C              IWK(M) = THE ARRAY ELEMENT OF RMXMN_6HR TO CHOOSE IN
C                       FILLING ARRAYS MINS AND MAXS DEPENDING ON 
C                       TIME ZONE, WHERE M=1,3 (INTERNAL).
C                       MAX ATLANTIC: 12Z,18Z,00Z  OTHERS: 18Z,00Z,06Z
C                       MIN ATLANTIC: 00Z,06Z,12Z  OTHERS: 06Z,12Z,18Z
C                  IZ = DETERMINES STARTING POINT IN HRLY ARRAY FOR 
C                       RECONSTRUCTING 6 HOUR MAX/MIN VALUES BASED ON 
C                       HOURLY OBS, DEPENDING ON TIME ZONE (INTERNAL).
C                JEND = THE ENDING POINT OF THE RANGE OF HOURLY OBS
C                       MAKING UP THE TIME PERIOD OF A 6-HR MIN/MAX
C                       ESTIMATE (INTERNAL).
C              JSTART = THE STARTING POINT OF THE RANGE OF HOURLY OBS
C                       MAKING UP THE TIME PERIOD OF A 6-HR MIN/MAX
C                       ESTIMATE (INTERNAL).
C                KEND = ENDING ARRAY ELEMENT ASSOCIATED WITH KSTART 
C                       (SEE KSTART) (INTERNAL). 
C              KSTART = STARTING ARRAY ELEMENT TO START CHECKING RMXABCD
C                       OR RMNABCD FOR MISSING VALUES WHEN NECESSARY.
C                       A STATION'S PART-TIME STATUS WILL DETERMINE THE
C                       VALUE (INTERNAL).
C           MAXHRL_AK = MAXIMUM NUMBER OF HOURS (=19) USED TO STORE
C                       THE HOURLY TEMPERATURES FOR PROCESSING OF 
C                       ALASKA MAX/MIN TEMPERATURE (INTERNAL).
C            NUM_MISS = FOR PART-TIME MAX AND MIN ESTIMATES, THE NUMBER
C                       OF MISSING HOURLY OBS FOR SEGMENTS B AND C
C                       (MAXMIN_PART) FOR A GIVEN STATION (INTERNAL).
C              RECON1 = FOR PART-TIME STATIONS, LOGICAL PARAMETER USED 
C                       TO INDICATE EITHER MAX1/MIN1 HAS BEEN
C                       GENERATED SUCCESSFULLY (INTERNAL).
C              RECON3 = FOR PART-TIME STATIONS, LOGICAL PARAMETER USED
C                       TO INDICATE EITHER MAX3/MIN3 HAS BEEN
C                       GENERATED SUCCESSFULLY (INTERNAL).
C               RFILL = LOGICAL PARAMETER INDICATING THAT SUBROUTINE
C                       RMXMN_FILL HAS BEEN CALLED AT LEAST ONCE
C                       (ALL THAT IS REQUIRED) (INPUT/INTERNAL).
C          RMAXS(N,L) = WORK ARRAY USED TO STORE THE THREE 6-HRLY MAXS 
C                       USED FOR DAYTIME MAX ESTIMATION, WHERE 
C                       N=1,ND1 AND L=1,3 (INTERNAL).
C          RMINS(N,L) = WORK ARRAY USED TO STORE THE THREE 6-HRLY MINS 
C                       USED FOR NIGHTTIME MIN ESTIMATION, WHERE 
C                       N=1,ND1 AND L=1,3 (INTERNAL).
C          RMNABCD(J) = HOLDS THE SEGMENTED MIN TEMPERATURES OF THE 
C                       FIRST AND THIRD 6 HOUR TEMPERATURES A,B AND 
C                       C,D RESPECTIVELY. B AND C ARE THE STARTING 
C                       ENDING SEGMENTS OF THE NIGHTTIME MIN WINDOW 
C                       FOR A GIVEN STATION, WHERE J=1,4 (INTERNAL). 
C          RMNHRLY(K) = HOLDS THE HOURLY TEMPERATURES FOR THE FIRST 
C                       AND THIRD SIX HOUR PERIODS AND IS USED TO
C                       GENERATE MIN TEMPERATURE SEGMENTS A,B,C AND D,
C                       WHERE K=1,14 (INTERNAL).  
C          RMXABCD(J) = HOLDS THE SEGMENTED MAX TEMPERATURES OF THE 
C                       FIRST AND THIRD 6 HOUR TEMPERATURES A,B AND 
C                       C,D RESPECTIVELY. B AND C ARE THE STARTING
C                       ENDING SEGMENTS OF THE DAYTIME MAX WINDOW 
C                       FOR A GIVEN STATION, WHERE J=1,4 (INTERNAL).
C          RMXHRLY(K) = HOLDS THE HOURLY TEMPERATURES FOR THE FIRST
C                       AND THIRD SIX HOUR PERIODS AND IS USED TO
C                       GENERATE MAX TEMPERATURE SEGMENTS A,B,C AND D, 
C                       WHERE K=1,14 (INTERNAL).
C             RMXMN13 = THE MAX1/MIN1 AND/OR MAX3/MIN3 VALUE RETURNED
C                       SUBROUTINE MAXMIN_PART, FOR PART-TIME STATION
C                       MAX/MIN ESTIMATES (INTERNAL).
C     RMXMN_6HR_AK(J) = ARRAY OF THE 6-HRLY MINS OR MAXS PASSED TO
C                       MAXMIN_AK WHERE J=1,4 (INTERNAL).
C           RESFLD_AK = THE RESULTING MAX/MIN FROM THE MAXMIN_AK
C                       SUBROUTINE.
C               STATE = CHARACTER LEN=2 WHICH CONTAINS THE STATE OF 
C                       STATION BEING PROCESSED.
C               ZMISS = MISSING VALUE OF 9999. (INTERNAL). 
C
C        INTERNAL SUBROUTINES
C             CKFRMSG = SUBROUTINE TO CHECK HRLY ARRAY FOR NUMBER OF 
C                       MISSINGS OVER 6 HOUR PERIODS OR SPECIFIC
C                       HOURLY OBSERVATIONS. 
C
C              CKABCD = SUBROUTINE TO CHECK THE NUMBER OF MISSING HOURLY 
C                       OBS FOR SEGMENTS A,B,C AND D.
C
C          RMXMN_FILL = SUBROUTINE TO FILL THE ARRAYS RMXHRLY AND 
C                       RMNHRLY WITH HOURLY TEMPERATURE OBS WHICH
C                       ARE THEN USED LATER TO GENERATE 
C                       SEGMENTS A,B,C AND D.
C
C           MAXMIN_AK = SUBROUTINE TO CALCULATE MAX/MIN FOR ALASKA
C                       STATIONS. ALASKA STATION REQUIRED DIFFERENT
C                       PROCESSING DUE TO THE MAX/MIN TIME WINDOW
C                       CHANGE IMPLIMENTED BY THE ALASKA REGION.
C
C         MAXMIN_PART = SUBROUTINE TO CALCULATE (RECONSTRUCT) THE 
C                       MAX1/MIN1 AND/OR MAX3/MIN3 FOR PART-TIME 
C                       STATIONS.
C
      IMPLICIT NONE
C  
      CHARACTER*8 CCALL(ND1),CCALL_AK
      CHARACTER*20 NAME(ND1),TEMP_NAME
      CHARACTER*2 STATE
C
      LOGICAL CMAX,CMIN,RECON1,RECON3,RFILL
C
      INTEGER, PARAMETER :: INUMZN=14
C
      INTEGER ITIMEZ(NSTA),ITIMEZ_AK
      INTEGER KFILDO,ND1,IFOUR,MAXHRL,MXMN,IPRT,NSTA,JSTART,JEND,
     1        IZ,I,J,NUM_MISS,KSTART,KEND,IZMISS
      INTEGER MAXHRL_AK
      INTEGER IWK(3),IMSG(3),ITIME1(4),ITIME2(4)
C
      REAL RMAXS(ND1,3),RMINS(ND1,3)
C        RMAXS( , ) AND RMINS( , ) ARE AUTOMATIC ARRAYS.
      REAL RMXHRLY(INUMZN),RMNHRLY(INUMZN),RESFLD(ND1)
      REAL RMXABCD(4),RMNABCD(4),HOLD(4),RESFLD_AK
      REAL RMXMN_6HR(ND1,IFOUR),HRLY(ND1,MAXHRL)
      REAL RMXMN13,ZMISS,HRLY_AK(19),RMXMN_6HR_AK(3)
C
      DATA IMSG/3*0/
      MAXHRL_AK=19
C
C******************************************************
C
C        STEP 1A. INITIALIZE RESULTANT DAYTIME/NIGHTTIME MAX/MIN
C
      ZMISS=9999.
      IZMISS=9999
C
      DO 4 I=1,ND1
!         PRINT*,"Loop number 4.  I,ND1,RESFLD=",I,ND1,RESFLD(I)
        RESFLD(I)=-ZMISS
  4   CONTINUE
C
      CMIN=.FALSE.
      CMAX=.FALSE.
      IF(MXMN.EQ.1)CMIN=.TRUE.
      IF(MXMN.EQ.2)CMAX=.TRUE.
      PRINT*, "ENTERING MAXMINT",NSTA
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C        *** MAIN DO LOOP ***
C        *** FOR EACH STATION..............
C
      DO 300 I=1,NSTA
C         PRINT*,"LOOKING AT STATION NUMBER:",I
        IF((IPRT.GE.1).AND.(I.EQ.1)) WRITE(KFILDO,*) '*******'
        IF((IPRT.GE.1).AND. (I.EQ.1))WRITE(KFILDO,*) 'NEW DAY'
        IF((IPRT.GE.1).AND. (I.EQ.1))WRITE(KFILDO,*) '*******'
C
C
C       FIRST CHECK WHICH STATE THE STATION IS IN. IN JULY 2009
C       THE CODE WAS CHANGED TO HANDEL A NEW MAX/MIN TIME 
C       WINDOW DEFINITION USED BY THE ALASKAN REGION. SINCE THE
C       CHANGES APPLY ONLY TO ALASKAN STATIONS A SEPARATE 
C       MAXMIN_AK SUBROUTINE WAS WRITTEN.
C
C
        TEMP_NAME=NAME(I)
C        STATE=TEMP_NAME(19:20)
        STATE=TEMP_NAME(19:20)
C       CHANGE BY LEVINE AFTER LOOKING AT MDL METAR DICTIONARY
C 
        IF(STATE == '  ') THEN
C           PRINT *,'NO STATE FOR STATION: '  
           WRITE(KFILDO,*) 'NO STATE FOR STATION:',CCALL(I),NAME(I)
        ELSE
           WRITE(KFILDO,*) 'STATION,STATE=',CCALL(I),STATE
        ENDIF
C
C       IF THE STATE EQUALS AK THEN CALL MAXMIN_AK
C
        IF(STATE == 'AK') THEN
C
          HRLY_AK(1:19)=HRLY(I,7:25)
          RMXMN_6HR_AK(1:3)=RMXMN_6HR(I,2:4)
          ITIMEZ_AK=ITIMEZ(I)
          CCALL_AK=CCALL(I)
          RESFLD_AK=9999.
C
          CALL MAXMIN_AK(KFILDO,HRLY_AK,RMXMN_6HR_AK,
     1                     ITIMEZ_AK,CCALL_AK,RESFLD_AK,
     2                     MAXHRL_AK,MXMN,IPRT)
 
          RESFLD(I)=RESFLD_AK
          GOTO 300
        ENDIF
C
C        STEP 1B.INITIALIZE THE RECON1, RECON3 AND RFILL FOR 
C                EACH STATION
        RECON1=.FALSE.
        RECON3=.FALSE.
        RFILL=.TRUE.
C
C        STEP 2. MAKE SURE THE TIME ZONE IS A VALID ONE 
C                IF NOT, A SPECIAL MISSING VALUE WILL BE ASSIGNED 
C                TO THE MAX/MIN. (FORMERLY AT STATEMENT NUMBER 29)
C
        IF(ITIMEZ(I).LE.-11.OR.ITIMEZ(I).GE.-3) THEN
          WRITE(KFILDO,*) 'INVALID TIME ZONE= ',
     *    ITIMEZ(I),' FOR STATION= ',CCALL(I)
	  RESFLD(I)=ZMISS
          GO TO 300
       ELSE
          WRITE(KFILDO,*) 'STATION,TIMEZONE=',CCALL(I),ITIMEZ(I)
       ENDIF
C
C         STEP 3. PREPARE TO CHECK IF THE 6 HOUR VALUES ARE MISSING AND 
C                 REPLACE IF POSSIBLE (ONLY IF ONE OR LESS MISSING 
C                 HOURLY VALUES).  
C
C         STEP 3A. SET JSTART, JEND AND IZ TO PROCESS DIFFERENT 
C                  TIME ZONES.
C
C                  FOR MAIN US, AK, AND HI TIME ZONES
	IF(ITIMEZ(I).LE.-5) THEN
	  JSTART=7
	  JEND=25
	  IZ=0
	  IWK(1)=2
	  IWK(2)=3
	  IWK(3)=4
C                FOR PUERTO RICO'S TIME ZONE 
        ELSEIF(ITIMEZ(I).EQ.-4)THEN
	  JSTART=1
	  JEND=19
	  IZ=6
	  IWK(1)=1
	  IWK(2)=2
	  IWK(3)=3
        ENDIF 
C
C        STEP 3B. FOR NIGHTIME MIN DO THE FOLLOWING:
C
C              1. FILL UP WORK ARRAY (MINS) USING THE INPUT ARRAY 
C                 RMXMN_6HR BY COPYING THE THREE 6-HRLY MINS TO BE
C                 USED TO CALCULATE THE NIGHTTIME MIN.
        IF(CMIN) THEN
          RMINS(I,1)=RMXMN_6HR(I,IWK(1))
          RMINS(I,2)=RMXMN_6HR(I,IWK(2))
          RMINS(I,3)=RMXMN_6HR(I,IWK(3))
C
C              2. CHECK THE HOURLY OBS WITHIN THE JSTART AND JEND RANGE
C                 FOR MISSINGS BY CALLING CKFRMSG. THE HOURLY OBS MAY
C                 HAVE TO BE USED TO RECREATE A MISSING 6-HRLY MIN. 
          CALL CKFRMSG(ND1,MAXHRL,MXMN,I,HRLY,JSTART,JEND,6,ZMISS,IMSG)
C
C              3. CHECK EACH OF THE 6-HRLY MINS FOR MISSING VALUES.
C                 IF ONE 6-HRLY MIN IS MISSING, AND THERE ARE ENOUGH
C                 HOURLY OBS TO REGENERATE THE 6-HRLY MIN, THEN DO SO.
C                 IF THERE IS NO 6-HRLY MIN AND NO WAY TO RECREATE ONE,
C                 THEN SET THE NIGHTTIME MIN TO MISSING AND GO 
C                 TO THE NEXT STATION. 
C
	  DO 210 J=1,3
C
            IF(NINT(RMINS(I,J)).EQ.IZMISS) THEN
C
              IF(IMSG(J).GE.2) THEN
C
C                  STEP 3BB. PART-TIME STATION MIN1 AND/OR MIN3
C                            RECONSTRUCTION
C
                IF((J.EQ.1).OR.(J.EQ.3)) THEN
C                   SPECIAL CALL OF RMXMN_FILL (SEE STEP 5A.) 
                  IF(RFILL) CALL RMXMN_FILL(INUMZN,I,IZ,MAXHRL,ND1,
     *                           HRLY,RMXHRLY,RMNHRLY,ZMISS,
     *                           CMAX,CMIN,RFILL)
                  NUM_MISS=0
                  RMXMN13=ZMISS
                  CALL MAXMIN_PART(INUMZN,ITIMEZ(I),J,
     *                             RMXHRLY,RMNHRLY,RMXMN13,ZMISS,
     *                             CMAX,CMIN,RECON1,RECON3,NUM_MISS,
     *                             IPRT,KFILDO)
C
                  IF(NINT(RMXMN13).EQ.IZMISS) THEN
                    RESFLD(I)=ZMISS
                    IF(IPRT.GE.1) WRITE(KFILDO,*) 'FOR STATION= ',
     *                CCALL(I),'TOO FEW OBS TO MAKE A 6HR', 
     *                ' MIN',J,': PART-T MISS=',NUM_MISS,
     *                ' FULL-T MISS=',IMSG(J)
                    GO TO 300
                  ELSE
                    RMINS(I,J)=RMXMN13
                  ENDIF
C
                ELSEIF(J.EQ.2) THEN 
                  RESFLD(I)=ZMISS
                  IF(IPRT.GE.1) WRITE(KFILDO,*) 'FOR STATION= ',
     *                          CCALL(I),'NOT ENOUGH OBS TO MAKE',
     *                          ' A 6HR MIN',J,': MISSING#=',IMSG(J)
                  GO TO 300
                ENDIF
C
              ELSE
                RMINS(I,J)=MIN(HRLY(I,J*6+1-IZ),HRLY(I,J*6+2-IZ),
     *                        HRLY(I,J*6+3-IZ),HRLY(I,J*6+4-IZ),
     *                        HRLY(I,J*6+5-IZ),HRLY(I,J*6+6-IZ),
     *                        HRLY(I,J*6+7-IZ))
                IF(IPRT.GE.1) WRITE(KFILDO,*) ' FOR STATION= ',
     *                        CCALL(I),'6HR MIN',J,' HAD TO BE REMADE'
              ENDIF
C
            ENDIF
C
  210     CONTINUE
C
          IF(IPRT.GE.1) WRITE(KFILDO,*) 'FOR STATION= ',CCALL(I),
     *    'MIN1-3=',RMINS(I,1),' ',RMINS(I,2),' ',RMINS(I,3)
        ENDIF
C
C         STEP 3C. FOR DAYTIME MAX DO THE FOLLOWING:
C
C              1. FILL UP WORK ARRAY (MAXS) USING THE INPUT ARRAY
C                 RMXMN_6HR BY COPYING THE THREE 6-HRLY MAXS TO BE
C                 USED TO CALCULATE THE DAYTIME MAX.
C
        IF(CMAX) THEN
          RMAXS(I,1)=RMXMN_6HR(I,IWK(1))
          RMAXS(I,2)=RMXMN_6HR(I,IWK(2))
          RMAXS(I,3)=RMXMN_6HR(I,IWK(3))
          IF(IPRT.EQ.2) THEN
             WRITE(KFILDO,*) 'STATION, ORIGINAL MAXES=',CCALL(I),
     *       RMAXS(I,1),RMAXS(I,2),RMAXS(I,3)
          ENDIF
C
C              2. CHECK THE HOURLY OBS WITHIN THE JSTART AND JEND RANGE
C                 FOR MISSINGS BY CALLING CKFRMSG. THE HOURLY OBS MAY
C                 HAVE TO BE USED TO RECREATE A MISSING 6-HRLY MAX.
C              ** ALSO, ZMISS IS CHANGED TO -ZMISS IN THE HRLY ARRAY.**
C
          CALL CKFRMSG(ND1,MAXHRL,MXMN,I,HRLY,JSTART,JEND,6,ZMISS,IMSG)
C
C              3. CHECK EACH OF THE 6-HRLY MAXS FOR MISSING VALUES.
C                 IF ONE 6-HRLY MAX IS MISSING, AND THERE ARE ENOUGH
C                 HOURLY OBS TO REGENERATE THE 6-HRLY MAX, THEN DO SO.
C                 IF THERE IS NO 6-HRLY MAX AND NO WAY TO RECREATE ONE,
C                 THEN SET THE DAYTIME MAX TO MISSING AND GO
C                 TO THE NEXT STATION.
C
          DO 215 J=1,3
C
            IF(NINT(RMAXS(I,J)).EQ.IZMISS) THEN
C
              IF(IMSG(J).GE.2) THEN
C
C                  STEP 3CC. PART-TIME STATION MAX1 AND/OR MAX3
C                            RECONSTRUCTION
C
                IF((J.EQ.1).OR.(J.EQ.3)) THEN
C                      SPECIAL CALL OF RMXMN_FILL (SEE STEP 5A.) 
                  IF(RFILL) CALL RMXMN_FILL(INUMZN,I,IZ,MAXHRL,ND1,
     *                           HRLY,RMXHRLY,RMNHRLY,ZMISS,
     *                           CMAX,CMIN,RFILL)
                  NUM_MISS=0
                  RMXMN13=-ZMISS
                  CALL MAXMIN_PART(INUMZN,ITIMEZ(I),J,
     *                             RMXHRLY,RMNHRLY,RMXMN13,ZMISS,
     *                             CMAX,CMIN,RECON1,RECON3,NUM_MISS,
     *                             IPRT,KFILDO)
C
                  IF(NINT(RMXMN13).EQ.-IZMISS) THEN
                    RESFLD(I)=ZMISS
                    IF(IPRT.GE.1) WRITE(KFILDO,*) 'FOR STATION= ',
     *                CCALL(I),'TOO FEW OBS TO MAKE A 6HR', 
     *                ' MAX',J,': PART-T MISS=',NUM_MISS,
     *                ' FULL-T MISS=',IMSG(J)
                    GO TO 300
                  ELSE
                    RMAXS(I,J)=RMXMN13
                  ENDIF
C
                ELSEIF(J.EQ.2) THEN 
                  RESFLD(I)=ZMISS
                  IF(IPRT.GE.1) WRITE(KFILDO,*) 'FOR STATION= ',
     *                          CCALL(I),'NOT ENOUGH OBS TO MAKE',
     *                          ' A 6HR MAX',J,': MISSING#=',IMSG(J)
                  GO TO 300
                ENDIF
C
              ELSE
                RMAXS(I,J)=MAX(HRLY(I,J*6+1-IZ),HRLY(I,J*6+2-IZ),
     *                        HRLY(I,J*6+3-IZ),HRLY(I,J*6+4-IZ),
     *                        HRLY(I,J*6+5-IZ),HRLY(I,J*6+6-IZ),
     *                        HRLY(I,J*6+7-IZ))
                IF(IPRT.GE.1) WRITE(KFILDO,*) 'FOR STATION= ',
     *          CCALL(I),'6HR MAX',J,' HAD TO BE REMADE'
              ENDIF
C
            ENDIF
C
  215     CONTINUE
C
          IF(IPRT.GE.1) WRITE(KFILDO,*) 'FOR STATION= ',CCALL(I),
     *    'MAX1-3=',RMAXS(I,1),' ',RMAXS(I,2),' ',RMAXS(I,3)
        ENDIF
C
C         STEP 4. SIMPLE CHECK OF THE 6-HR VALUES.
C                 TEST IF MIDDLE 6 HOUR MAX/MIN IS (HIGHEST/LOWEST).
C
C         STEP 4A. IF SIMPLE CHECK FOR MIN IS VALID, SET 
C                  NIGHTTIME MIN AND GO ON TO NEXT STATION.
        IF(CMIN) THEN
C
          IF(NINT(RMINS(I,2)).LE.NINT(RMINS(I,1)).AND.
     *      NINT(RMINS(I,2)).LE.NINT(RMINS(I,3))) THEN
            RESFLD(I)=RMINS(I,2)
            IF(IPRT.GE.1) WRITE(KFILDO,*) 'FOR STATION= ',CCALL(I),
     *                    'MINS EASY WAY= ',RESFLD(I)
            GO TO 300
          ELSE 
C                 IF SIMPLE CHECK IS NOT VALID, SET NIGHTTIME MIN 
C                 TO A UNIQUE MISSING VALUE AND GO TO STEP 5.
            IF(IPRT.GE.2) WRITE(KFILDO,*) 'FOR STATION= ',CCALL(I),
     *                    'MINS:NEED TO CHECK INDIVIDUAL HOURS'
             RESFLD(I)=-888.
          ENDIF
C
        ENDIF
C
C        STEP 4B. IF SIMPLE CHECK FOR MAX IS VALID, SET 
C                 DAYTIME MAX AND GO ON TO NEXT STATION.
C
        IF(CMAX) THEN
C
          IF(NINT(RMAXS(I,2)).GE.NINT(RMAXS(I,1)).AND.
     *      NINT(RMAXS(I,2)).GE.NINT(RMAXS(I,3)))THEN
            RESFLD(I)=RMAXS(I,2)
            IF(IPRT.GE.1) WRITE(KFILDO,*) 'FOR STATION= ',CCALL(I),
     *                    ' MAXS EASY WAY=',RESFLD(I)
            GO TO 300
          ELSE 
C                 IF SIMPLE CHECK IS NOT VALID, SET DAYTIME MAX
C                 TO A UNIQUE MISSING VALUE AND GO TO STEP 5.
            IF(IPRT.GE.2) WRITE(KFILDO,*) 'FOR STATION= ',CCALL(I),
     *                    'MAXS:NEED TO CHECK INDIVIDUAL HOURS'
             RESFLD(I)=-777.
          ENDIF
C
        ENDIF
C
C         STEP 5. THE SIMPLE CHECK WAS INVALID, THEREFORE MUST CHECK 
C                 6 HOUR PERIODS ONE AND THREE. THE 6 HOUR PERIODS ARE
C                 SEGMENTED AS A & B FOR PERIOD ONE AND C & D FOR 
C                 PERIOD 3. B AND C CORRESPOND TO BEGINNING AND 
C                 END OF THE "WINDOW" HOURLY PORTION OF THE 
C                 DAYTIME MAX OR NIGHTTIME MIN. 
C
C         STEP 5A. IF THE SIMPLE CHECK OF THE 6-HRLY VALUES
C                  WAS NOT CONCLUSIVE, THEN RMXHRLY AND RMNHRLY
C                  ARE FILLED WITH THE HOURLY TEMPERATURE OBS USED TO
C                  GENERATE A,B,C AND D FOR EITHER MAX OR MIN.
C
        IF (RFILL) CALL RMXMN_FILL(INUMZN,I,IZ,MAXHRL,ND1, 
     *                    HRLY,RMXHRLY,RMNHRLY,ZMISS,
     *                    CMAX,CMIN,RFILL)
C
C         STEP 5B. SET UP THE THE MAX OR MIN VALUES OF SEGMENTS
C                   A, B, C, AND D FOR EACH TIME ZONE.
C                   MIN WINDOW = 7PM - 8AM 
C                   MAX WINDOW = 7AM - 7PM
C               1. ALEUTIANS/HAWAII
C
        IF(ITIMEZ(I).EQ.-10) THEN
          RMNABCD(1)=MIN(RMNHRLY(1),RMNHRLY(2),RMNHRLY(3),
     *                   RMNHRLY(4),RMNHRLY(5))
          RMNABCD(2)=MIN(RMNHRLY(6),RMNHRLY(7))
          RMNABCD(3)=MIN(RMNHRLY(8),RMNHRLY(9),RMNHRLY(10),RMNHRLY(11),
     *                   RMNHRLY(12),RMNHRLY(13),RMNHRLY(14))
          RMNABCD(4)=9988.
          RMXABCD(1)=MAX(RMXHRLY(1),RMXHRLY(2),RMXHRLY(3),
     *                   RMXHRLY(4),RMXHRLY(5))
          RMXABCD(2)=MAX(RMXHRLY(6),RMXHRLY(7))
          RMXABCD(3)=MAX(RMXHRLY(8),RMXHRLY(9),RMXHRLY(10),
     *                   RMXHRLY(11),RMXHRLY(12),RMXHRLY(13))
          RMXABCD(4)=RMXHRLY(14)
C              2. ALASKA
        ELSEIF(ITIMEZ(I).EQ.-9) THEN
          RMNABCD(1)=MIN(RMNHRLY(1),RMNHRLY(2),RMNHRLY(3),
     *                   RMNHRLY(4))
          RMNABCD(2)=MIN(RMNHRLY(5),RMNHRLY(6),RMNHRLY(7))
          RMNABCD(3)=MIN(RMNHRLY(8),RMNHRLY(9),RMNHRLY(10),
     *                   RMNHRLY(11),RMNHRLY(12),RMNHRLY(13))
          RMNABCD(4)=RMNHRLY(14)
          RMXABCD(1)=MAX(RMXHRLY(1),RMXHRLY(2),RMXHRLY(3),
     *                   RMXHRLY(4))
          RMXABCD(2)=MAX(RMXHRLY(5),RMXHRLY(6),RMXHRLY(7))
          RMXABCD(3)=MAX(RMXHRLY(8),RMXHRLY(9),RMXHRLY(10),
     *                   RMXHRLY(11),RMXHRLY(12))
          RMXABCD(4)=MAX(RMXHRLY(13),RMXHRLY(14))
C              3.             PACIFIC
        ELSEIF(ITIMEZ(I).EQ.-8) THEN
          RMNABCD(1)=MIN(RMNHRLY(1),RMNHRLY(2),RMNHRLY(3))
          RMNABCD(2)=MIN(RMNHRLY(4),RMNHRLY(5),RMNHRLY(6),
     *                   RMNHRLY(7))
          RMNABCD(3)=MIN(RMNHRLY(8),RMNHRLY(9),RMNHRLY(10),
     *                   RMNHRLY(11),RMNHRLY(12))
          RMNABCD(4)=MIN(RMNHRLY(13),RMNHRLY(14))
          RMXABCD(1)=MAX(RMXHRLY(1),RMXHRLY(2),RMXHRLY(3))
          RMXABCD(2)=MAX(RMXHRLY(4),RMXHRLY(5),RMXHRLY(6),
     *                   RMXHRLY(7))
          RMXABCD(3)=MAX(RMXHRLY(8),RMXHRLY(9),RMXHRLY(10),
     *                   RMXHRLY(11))
          RMXABCD(4)=MAX(RMXHRLY(12),RMXHRLY(13),RMXHRLY(14))
C              4. MOUNTAIN
        ELSEIF(ITIMEZ(I).EQ.-7) THEN
          RMNABCD(1)=MIN(RMNHRLY(1),RMNHRLY(2))
          RMNABCD(2)=MIN(RMNHRLY(3),RMNHRLY(4),RMNHRLY(5),
     *                   RMNHRLY(6),RMNHRLY(7))
          RMNABCD(3)=MIN(RMNHRLY(8),RMNHRLY(9),RMNHRLY(10),
     *                   RMNHRLY(11))
          RMNABCD(4)=MIN(RMNHRLY(12),RMNHRLY(13),RMNHRLY(14))
          RMXABCD(1)=MAX(RMXHRLY(1),RMXHRLY(2))
          RMXABCD(2)=MAX(RMXHRLY(3),RMXHRLY(4),RMXHRLY(5),
     *                   RMXHRLY(6),RMXHRLY(7))
          RMXABCD(3)=MAX(RMXHRLY(8),RMXHRLY(9),RMXHRLY(10))
          RMXABCD(4)=MAX(RMXHRLY(11),RMXHRLY(12),RMXHRLY(13),
     *                   RMXHRLY(14))
C              5. CENTRAL
        ELSEIF(ITIMEZ(I).EQ.-6) THEN
          RMNABCD(1)=RMNHRLY(1)
          RMNABCD(2)=MIN(RMNHRLY(2),RMNHRLY(3),RMNHRLY(4),RMNHRLY(5),
     *                   RMNHRLY(6),RMNHRLY(7))
          RMNABCD(3)=MIN(RMNHRLY(8),RMNHRLY(9),RMNHRLY(10))
          RMNABCD(4)=MIN(RMNHRLY(11),RMNHRLY(12),RMNHRLY(13),
     *                   RMNHRLY(14))
          RMXABCD(1)=RMXHRLY(1)
          RMXABCD(2)=MAX(RMXHRLY(2),RMXHRLY(3),RMXHRLY(4),RMXHRLY(5),
     *                   RMXHRLY(6),RMXHRLY(7))
          RMXABCD(3)=MAX(RMXHRLY(8),RMXHRLY(9))
          RMXABCD(4)=MAX(RMXHRLY(10),RMXHRLY(11),RMXHRLY(12),
     *                   RMXHRLY(13),RMXHRLY(14))
C              6. EASTERN
        ELSEIF(ITIMEZ(I).EQ.-5) THEN
          RMNABCD(1)=9988.
          RMNABCD(2)=MIN(RMNHRLY(1),RMNHRLY(2),RMNHRLY(3),RMNHRLY(4),
     *                   RMNHRLY(5),RMNHRLY(6),RMNHRLY(7))
          RMNABCD(3)=MIN(RMNHRLY(8),RMNHRLY(9))
          RMNABCD(4)=MIN(RMNHRLY(10),RMNHRLY(11),RMNHRLY(12),
     *                   RMNHRLY(13),RMNHRLY(14))
          RMXABCD(1)=-9988.
          RMXABCD(2)=MAX(RMXHRLY(1),RMXHRLY(2),RMXHRLY(3),RMXHRLY(4),
     *                   RMXHRLY(5),RMXHRLY(6),RMXHRLY(7))
          RMXABCD(3)=RMXHRLY(8)
          RMXABCD(4)=MAX(RMXHRLY(9),RMXHRLY(10),RMXHRLY(11),
     *                   RMXHRLY(12),RMXHRLY(13),RMXHRLY(14))
C              7. ATLANTIC
        ELSEIF(ITIMEZ(I).EQ.-4) THEN
          RMNABCD(1)=MIN(RMNHRLY(1),RMNHRLY(2),RMNHRLY(3),RMNHRLY(4),
     *                   RMNHRLY(5))
          RMNABCD(2)=MIN(RMNHRLY(6),RMNHRLY(7))
          RMNABCD(3)=MIN(RMNHRLY(8),RMNHRLY(9),RMNHRLY(10),RMNHRLY(11),
     *                   RMNHRLY(12),RMNHRLY(13),RMNHRLY(14))
          RMNABCD(4)=9988.
          RMXABCD(1)=MAX(RMXHRLY(1),RMXHRLY(2),RMXHRLY(3),RMXHRLY(4),
     *                   RMXHRLY(5))
          RMXABCD(2)=MAX(RMXHRLY(6),RMXHRLY(7))
          RMXABCD(3)=MAX(RMXHRLY(8),RMXHRLY(9),RMXHRLY(10),RMXHRLY(11),
     *                   RMXHRLY(12),RMXHRLY(13))
          RMXABCD(4)=RMXHRLY(14)
        ENDIF
C
C        STEP 5C. SET UP 2 HOUR BREAKPOINTS AROUND EDGES OF SEGMENTS
C                 A,B,C AND D FOR MIN/MAX "TREND". COMPARISONS
C                 USING THESE HOURLY TEMPERATURES WORKS ESSENTIALLY 
C                 LIKE A "TIE BREAKER" IF A=B AND/OR C=D.
C                 FOR EXAMPLE, A=B AND/OR C=D.
C                 MIN WINDOW = 7PM - 8AM
C                 MAX WINDOW = 7AM - 7PM

C        FOR USE WITH AB PART OF MIN (6PM VS 8PM)
                ITIME1(1)=11+ITIMEZ(I)
                ITIME2(1)=13+ITIMEZ(I)
C
C        FOR USE WITH CD PART OF MIN (7AM VS 9AM)
                ITIME1(2)=24+ITIMEZ(I)
                ITIME2(2)=26+ITIMEZ(I)
C
C        FOR USE WITH AB PART OF MAX (6AM VS 8AM)
                ITIME1(3)=11+ITIMEZ(I)
                ITIME2(3)=13+ITIMEZ(I)
C
C        FOR USE WITH CD PART OF MAX (6PM VS 8PM)
                ITIME1(4)=23+ITIMEZ(I)
                ITIME2(4)=25+ITIMEZ(I)
C
C        STEP 5D. CALL SUBROUTINE CKABCD AND DETERMINE IF THE NUMBER 
C                 OF MISSING PER SEGMENT A,B,C, OR D IS LESS THAN 2.
C
        CALL CKABCD(RMNHRLY,RMXHRLY,RMNABCD,RMXABCD,ITIMEZ(I),
     *              ZMISS,INUMZN)
C
        IF(CMAX) THEN
C
          IF((.NOT. RECON1).AND.(.NOT. RECON3))THEN
	    KSTART=1
	    KEND=4
          ELSEIF((RECON1).AND.(.NOT. RECON3))THEN
	    KSTART=3
	    KEND=4
	    HOLD(3)=RMAXS(I,1) 
	  ELSEIF((RECON3).AND.(.NOT. RECON1))THEN
	    KSTART=1
	    KEND=2
	    HOLD(4)=RMAXS(I,3)
          ELSEIF((RECON1).AND.(RECON3))THEN
	    HOLD(3)=RMAXS(I,1)
	    HOLD(4)=RMAXS(I,3)
            KSTART=1
            KEND=0
          ENDIF
C
          IF(IPRT.GE.1) WRITE(KFILDO,*) ' KSTART=',KSTART,' KEND=', KEND
C
          DO 245 J=KSTART,KEND
C
            IF(NINT(RMXABCD(J)).EQ.-IZMISS) THEN
	      RESFLD(I)=ZMISS
              IF(IPRT.GE.1) WRITE(KFILDO,*) 'RMXABCD(',J,') IS MISSING'
            ENDIF
C
 245      CONTINUE
C
          IF(NINT(RESFLD(I)).EQ.IZMISS)GO TO 300
C
        ELSEIF(CMIN) THEN
C
	  IF((.NOT. RECON1).AND.(.NOT. RECON3))THEN
	    KSTART=1
	    KEND=4
          ELSEIF((RECON1).AND.(.NOT. RECON3))THEN
	    KSTART=3
	    KEND=4
	    HOLD(1)=RMINS(I,1) 
	  ELSEIF((RECON3).AND.(.NOT. RECON1))THEN
	    KSTART=1
	    KEND=2
	    HOLD(2)=RMINS(I,3)
          ELSEIF((RECON1).AND.(RECON3))THEN
	    HOLD(1)=RMINS(I,1)
	    HOLD(2)=RMINS(I,3)
            KSTART=1
            KEND=0
          ENDIF
C
          IF(IPRT.GE.1) WRITE(KFILDO,*) ' KSTART=',KSTART,' KEND=', KEND
C
          DO 250 J=KSTART,KEND
C
            IF(NINT(RMNABCD(J)).EQ.IZMISS) THEN
	      RESFLD(I)=ZMISS
	      IF(IPRT.GE.1) WRITE(KFILDO,*) 'RMNABCD(',J,') IS MISSING'
            ENDIF
C
 250      CONTINUE
C
          IF(NINT(RESFLD(I)).EQ.IZMISS) GO TO 300
        ENDIF
C
C         STEP 6. SINCE SIMPLE CHECK WAS NOT SUFFICIENT,
C         CONTINUE ON WITH A SERIES OF IF TESTS TO DETERMINE WHETHER
C         THE MAX/MIN OCCURRED AT THE BEGINNING OR THE END OF THE
C         THE "WINDOW" PERIOD.
C
C         STEP 6A. DO THE FOLLOWING FOR MIN
C
C         1. FIRST CHECK THE A AND B PORTION 
C
        IF(CMIN) THEN
C
	  IF(.NOT. RECON1) THEN
C
            IF(IPRT.GE.2) WRITE(KFILDO,*) 'MIN CHECKING A VS B'
C
            IF(NINT(RMNABCD(1)).LT.NINT(RMNABCD(2))) THEN
              HOLD(1)=RMNABCD(2)
            ELSEIF(NINT(RMNABCD(1)).GT.NINT(RMNABCD(2))) THEN
              HOLD(1)=RMINS(I,1)
            ELSEIF(NINT(RMNABCD(1)).EQ.NINT(RMNABCD(2))) THEN
C
              IF(NINT(RMNABCD(1)).EQ.NINT(RMINS(I,1)).AND.
     *          NINT(RMNABCD(2)).EQ.NINT(RMINS(I,1))) THEN
                HOLD(1)=RMINS(I,1)
              ELSE
                CALL CKFRMSG(ND1,MAXHRL,MXMN,I,HRLY,ITIME1(1),ITIME2(1),
     *                       1,ZMISS,IMSG)
                IF(IPRT.GE.2) WRITE(KFILDO,*) 'NEED TO CHK 6 & 8PM OBS'
                IF(IPRT.GE.2) WRITE(KFILDO,*) 'FOR MIN A VS B '
C
                IF(IMSG(1).GE.1) THEN
                  IF(IPRT.GE.1) WRITE(KFILDO,*) '6 OR 8PM OBS ARE', 
     *            ' MISSING'
                  RESFLD(I)=ZMISS
                  GO TO 300
                ENDIF
C
                IF(NINT(HRLY(I,ITIME1(1))).LT.
     *            NINT(HRLY(I,ITIME2(1)))) THEN
                  HOLD(1)=RMNABCD(2)
                ELSEIF(NINT(HRLY(I,ITIME1(1))).GT.
     *            NINT(HRLY(I,ITIME2(1)))) THEN
                  HOLD(1)=RMINS(I,1)
                ELSEIF(NINT(HRLY(I,ITIME1(1))).EQ.
     *            NINT(HRLY(I,ITIME2(1)))) THEN
C
                  IF(NINT(RMXABCD(1)).NE.-IZMISS.AND.
     *               NINT(RMXABCD(2)).NE.-IZMISS) THEN
C
                    IF(NINT(RMXABCD(1)).LT.NINT(RMXABCD(2))) THEN
                      HOLD(1)=RMNABCD(2)
                    ELSE
                      HOLD(1)=RMINS(I,1)
                    ENDIF
C
                  ELSE
                    HOLD(1)=RMINS(I,1)
                  ENDIF
C
                ENDIF
C
              ENDIF
C
            ENDIF
C
          ENDIF
C
C            2. THEN CHECK THE C AND D PORTION 
C
          IF(.NOT. RECON3) THEN
            IF(IPRT.GE.2) WRITE(KFILDO,*) 'MIN CHECKING C VS D'
C
            IF(NINT(RMNABCD(3)).LT.NINT(RMNABCD(4))) THEN
              HOLD(2)=RMINS(I,3)
            ELSEIF(NINT(RMNABCD(3)).GT.NINT(RMNABCD(4))) THEN
              HOLD(2)=RMNABCD(3)
            ELSEIF(NINT(RMNABCD(3)).EQ.NINT(RMNABCD(4))) THEN
C
              IF(NINT(RMNABCD(3)).EQ.NINT(RMINS(I,3)).AND.
     *          NINT(RMNABCD(4)).EQ.NINT(RMINS(I,3))) THEN
                HOLD(2)=RMINS(I,3)
              ELSE
                CALL CKFRMSG(ND1,MAXHRL,MXMN,I,HRLY,ITIME1(2),ITIME2(2),
     *                       1,ZMISS,IMSG)
                IF(IPRT.GE.2) WRITE(KFILDO,*) 'NEED TO CHK 7 & 9AM OBS'
                IF(IPRT.GE.2) WRITE(KFILDO,*) 'FOR MIN C VS D '
C
                IF(IMSG(1).GE.1) THEN
                  IF(IPRT.GE.1) WRITE(KFILDO,*) '7 OR 9AM OBS ARE', 
     *            ' MISSING'
                  RESFLD(I)=ZMISS
                  GO TO 300
                ENDIF
C
                IF(NINT(HRLY(I,ITIME1(2))).LT.
     *            NINT(HRLY(I,ITIME2(2)))) THEN
                  HOLD(2)=RMINS(I,3)
                ELSEIF(NINT(HRLY(I,ITIME1(2))).GT.
     *            NINT(HRLY(I,ITIME2(2)))) THEN
                  HOLD(2)=RMNABCD(3)
                ELSEIF(NINT(HRLY(I,ITIME1(2))).EQ.
     *            NINT(HRLY(I,ITIME2(2)))) THEN
C
                  IF(NINT(RMXABCD(3)).NE.-IZMISS.AND.
     *              NINT(RMXABCD(4)).NE.-IZMISS) THEN
C
                    IF(NINT(RMXABCD(4)).LT.NINT(RMXABCD(3))) THEN
                      HOLD(2)=RMNABCD(3)
                    ELSE
                      HOLD(2)=RMINS(I,3)
                    ENDIF
C
                  ELSE
                    HOLD(2)=RMINS(I,3)
                  ENDIF
C
                ENDIF
C
              ENDIF
C
            ENDIF
C
          ENDIF
C
          RESFLD(I)=MIN(HOLD(1),RMINS(I,2),HOLD(2))
C
          IF(IPRT.GE.1) WRITE(KFILDO,*) 'FOR STATION= ',CCALL(I),
     *                  'MIN FINALLY SET= ',RESFLD(I)
        ENDIF
C
C         STEP 6B. DO THE FOLLOWING FOR MAX
C
C         1. FIRST CHECK THE A AND B PORTION
C
	IF(CMAX) THEN
C
          IF(.NOT. RECON1) THEN
          IF(IPRT.GE.2) WRITE(KFILDO,*) 'MAX CHECKING A VS B'
C
            IF(NINT(RMXABCD(1)).GT.NINT(RMXABCD(2))) THEN
              HOLD(3)=RMXABCD(2)
            ELSEIF(NINT(RMXABCD(1)).LT.NINT(RMXABCD(2))) THEN
              HOLD(3)=RMAXS(I,1)
            ELSEIF(NINT(RMXABCD(1)).EQ.NINT(RMXABCD(2))) THEN
C
              IF(NINT(RMXABCD(1)).EQ.NINT(RMAXS(I,1)).AND.
     *          NINT(RMXABCD(2)).EQ.NINT(RMAXS(I,1))) THEN
                HOLD(3)=RMAXS(I,1)
              ELSE
                CALL CKFRMSG(ND1,MAXHRL,MXMN,I,HRLY,ITIME1(3),ITIME2(3),
     *                       1,ZMISS,IMSG)
                IF(IPRT.GE.2) WRITE(KFILDO,*) 'NEED TO CHK 6 & 8AM OBS'
                IF(IPRT.GE.2) WRITE(KFILDO,*) 'FOR MAX A VS B'
C
                IF(IMSG(1).GE.1) THEN
                  IF(IPRT.GE.1) WRITE(KFILDO,*) '6 OR 8AM OBS ARE', 
     *            ' MISSING'
                  RESFLD(I)=ZMISS
                  GO TO 300
                ENDIF
C
                IF(NINT(HRLY(I,ITIME1(3))).GT.
     *            NINT(HRLY(I,ITIME2(3)))) THEN
                  HOLD(3)=RMXABCD(2)
                ELSEIF(NINT(HRLY(I,ITIME1(3))).LT.
     *            NINT(HRLY(I,ITIME2(3)))) THEN
                  HOLD(3)=RMAXS(I,1)
                ELSEIF(NINT(HRLY(I,ITIME1(3))).EQ.
     *            NINT(HRLY(I,ITIME2(3)))) THEN
C
                  IF(NINT(RMNABCD(1)).NE.IZMISS.AND.
     *              NINT(RMNABCD(2)).NE.IZMISS) THEN
C
                    IF(NINT(RMNABCD(1)).GT.NINT(RMNABCD(2))) THEN
                      HOLD(3)=RMXABCD(2)
                    ELSE
                      HOLD(3)=RMAXS(I,1)
                    ENDIF
C
                  ELSE
                    HOLD(3)=RMAXS(I,1)
                  ENDIF
C
                ENDIF
C
              ENDIF
C
            ENDIF
C
          ENDIF
C
C           2. THEN CHECK THE C AND D PORTION
C
          IF(.NOT. RECON3) THEN 
            IF(IPRT.GE.2) WRITE(KFILDO,*) 'MAX CHECKING C VS D'
C
            IF(NINT(RMXABCD(3)).GT.NINT(RMXABCD(4))) THEN
              HOLD(4)=RMAXS(I,3)
            ELSEIF(NINT(RMXABCD(3)).LT.NINT(RMXABCD(4))) THEN
              HOLD(4)=RMXABCD(3)
            ELSEIF(NINT(RMXABCD(3)).EQ.NINT(RMXABCD(4))) THEN
C
              IF(NINT(RMXABCD(3)).EQ.NINT(RMAXS(I,3)).AND.
     *          NINT(RMXABCD(4)).EQ.NINT(RMAXS(I,3))) THEN
                HOLD(4)=RMAXS(I,3)
              ELSE
                CALL CKFRMSG(ND1,MAXHRL,MXMN,I,HRLY,ITIME1(4),ITIME2(4),
     *                       1,ZMISS,IMSG)
                IF(IPRT.GE.2) WRITE(KFILDO,*) 'NEED TO CHK 6 & 8PM OBS'
	        IF(IPRT.GE.2) WRITE(KFILDO,*) 'FOR MAX C VS D'
C
                IF(IMSG(1).GE.1) THEN
                  IF(IPRT.GE.1) WRITE(KFILDO,*) '6 OR 8PM OBS ARE', 
     *            ' MISSING'
                  RESFLD(I)=ZMISS
                  GO TO 300
                ENDIF
C
                IF(NINT(HRLY(I,ITIME1(4))).GT.
     *            NINT(HRLY(I,ITIME2(4)))) THEN
                  HOLD(4)=RMAXS(I,3)
                ELSEIF(NINT(HRLY(I,ITIME1(4))).LT.
     *            NINT(HRLY(I,ITIME2(4)))) THEN
                  HOLD(4)=RMXABCD(3)
                ELSEIF(NINT(HRLY(I,ITIME1(4))).EQ.
     *            NINT(HRLY(I,ITIME2(4)))) THEN
C
                  IF(NINT(RMNABCD(3)).NE.IZMISS.AND.
     *              NINT(RMNABCD(4)).NE.IZMISS) THEN
C
                    IF(NINT(RMNABCD(4)).GT.NINT(RMNABCD(3))) THEN
                      HOLD(4)=RMXABCD(3)
                    ELSE
                      HOLD(4)=RMAXS(I,3)
                    ENDIF
C
                  ELSE
                    HOLD(4)=RMAXS(I,3)
                  ENDIF
C
                ENDIF
C
              ENDIF
C
            ENDIF
C
          ENDIF
C
          RESFLD(I)=MAX(HOLD(3),RMAXS(I,2),HOLD(4))
C
          IF(IPRT.GE.1) WRITE(KFILDO,*)'FOR STATION= ',CCALL(I),
     *                  'MAX FINALLY SET= ',RESFLD(I)
        ENDIF
C
 300  CONTINUE
C
      RETURN
      END
C********************************************************
      SUBROUTINE CKABCD(RMNHRLY,RMXHRLY,RMNABCD,RMXABCD,ITZONE,
     *                  ZMISS,INUMZN)
C
C        AUGUST  1998   WEISS   TDL   MOS-2000
C        OCTOBER 2001   WEISS   IF STATEMENTS CONTAINING REAL VALUES
C                               CHANGED TO INTEGERS
C        MAY     2003   GLAHN   INSERTED WHITE SPACE
C
C        PURPOSE
C             FOR A GIVEN STATION, THIS ROUTINE WILL DETERMINE THE
C             WHETHER SEGMENTS A,B,C AND D CONTAIN A SUFFICIENT 
C             NUMBER OF HOURLY TEMPERATURE VALUES TO BE USED FOR 
C             DAYTIME/MAX AND NIGHTTIME/MIN ESTIMATES.  
C
C        VARIABLES
C
C          RMNHRLY(K) = HOLDS THE HOURLY TEMPERATURES FOR THE FIRST
C                       AND THIRD SIX HOUR PERIODS AND IS USED TO
C                       GENERATE MIN TEMPERATURE SEGMENTS A,B,C AND D,
C                       WHERE K=1,14 (INPUT).
C          RMXHRLY(K) = HOLDS THE HOURLY TEMPERATURES FOR THE FIRST
C                       AND THIRD SIX HOUR PERIODS AND IS USED TO
C                       GENERATE MAX TEMPERATURE SEGMENTS A,B,C AND D,
C                       WHERE K=1,14 (INPUT).
C          RMNABCD(J) = HOLDS THE SEGMENTED MIN TEMPERATURES OF THE
C                       FIRST AND THIRD 6 HOUR TEMPERATURES A,B AND
C                       C,D RESPECTIVELY. B AND C ARE THE STARTING
C                       ENDING SEGMENTS OF THE NIGHTTIME MIN WINDOW
C                       FOR A GIVEN STATION, WHERE J=1,4 (INPUT/OUTPUT).
C          RMXABCD(J) = HOLDS THE SEGMENTED MAX TEMPERATURES OF THE
C                       FIRST AND THIRD 6 HOUR TEMPERATURES A,B AND
C                       C,D RESPECTIVELY. B AND C ARE THE STARTING
C                       ENDING SEGMENTS OF THE DAYTIME MAX WINDOW
C                       FOR A GIVEN STATION, WHERE J=1,4 (INPUT/OUTPUT).
C              ITZONE = ARRAY STATION'S TIME ZONE (INPUT).
C               ZMISS = MISSING VALUE OF 9999. (INPUT).
C              INUMZN = NUMBER OF HOURS (=14) USED TO SELECT HOURLY
C                       OBS REPRESENTING THE FIRST AND THIRD 6-HOUR
C                       TIME PERIODS (INPUT).
C
C        OTHER VARIABLES
C
C                IEND = END COUNTER OF NUMBER OF HOURS PER
C                       SEGMENT (INTERNAL).
C              ISEGHR = NUMBER OF HOURS PER SEGMENT (INTERNAL).
C              ISTART = START COUNTER OF NUMBER OF HOURS PER
C                       SEGMENT (INTERNAL).
C      MAX_COUNT(J,M) = FOR MAX ESTIMATES, THE TOTAL NUMBER OF HOURLY 
C                       OBS USED TO GENERATE SEGMENTS A,B,C, AND D FOR
C                       EACH TIME ZONE, WHERE M=1,7 AND J=1,4 
C                       (INTERNAL). NOTE: M=1,7 = ZONES -10 TO -4.
C             MAXH(L) = FOR MAX ESTIMATES, NUMBER OF HOURLY OBS
C                       PER SEGMENT (A - D) FOR ALL 7 TIME ZONES
C                       (WEST TO EAST) ,WHERE L=1,28 (INTERNAL).
C       MAX_MISSNG(J) = FOR MAX ESTIMATES, THE NUMBER OF MISSING 
C                       HOURLY OBS FOR SEGMENTS A,B,C, AND D FOR EACH
C                       STATION, WHERE J=1,4 (INTERNAL).
C      MIN_COUNT(J,M) = FOR MIN ESTIMATES, THE TOTAL NUMBER OF HOURLY
C                       OBS USED TO GENERATE SEGMENTS A,B,C, AND D FOR
C                       EACH TIME ZONE, WHERE M=1,7 AND J=1,4 
C             MINH(L) = FOR MIN ESTIMATES, NUMBER OF HOURLY OBS
C                       PER SEGMENT (A - D) FOR ALL 7 TIME ZONES
C                       (WEST TO EAST) ,WHERE L=1,28 (INTERNAL).
C                       (INTERNAL). NOTE: M=1,7 = ZONES -10 TO -4.
C       MIN_MISSNG(J) = FOR MIN ESTIMATES, THE NUMBER OF MISSING 
C                       HOURLY OBS FOR SEGMENTS A,B,C, AND D FOR EACH
C                       STATION, WHERE J=1,4 (INTERNAL).
C
      IMPLICIT NONE
C 
      INTEGER ITZONE,INUMZN
      INTEGER MAX_COUNT(4,7),MIN_COUNT(4,7),MAX_MISSNG(4),
     *        MIN_MISSNG(4),MAXH(28),MINH(28) 
      INTEGER ISTART,IEND,ISEGHR,I,II,J,N,NN,IZMISS
C
      REAL RMNABCD(4),RMXABCD(4),RMNHRLY(INUMZN),RMXHRLY(INUMZN),ZMISS
C
      DATA MINH/5,2,7,0,4,3,6,1,3,4,5,2,2,5,4,3,1,6,3,4,0,7,2,5,
     *          5,2,7,0/
      DATA MAXH/5,2,6,1,4,3,5,2,3,4,4,3,2,5,3,4,1,6,2,5,0,7,1,6,
     *          5,2,6,1/
C
C        STEP 1. INITIALIZE
C
      ISTART=0
      IEND=0
      ISEGHR=0
      IZMISS=9999
C
      DO 10 I=1,4
        MAX_MISSNG(I)=0
        MIN_MISSNG(I)=0
 10   CONTINUE
C
      II=0
C
      DO 15 I=1,7
C
        DO 12 J=1,4
          II=II+1
          MAX_COUNT(J,I)=MAXH(II)
          MIN_COUNT(J,I)=MINH(II)
 12     CONTINUE
C
 15   CONTINUE 
C
C        STEP 2A. FOR MAX, COUNT NUMBER OF MISSING PER SEGMENT
C
      ISTART=1
C
      DO 30 N=1,4
        ISEGHR=MAX_COUNT(N,ITZONE+11)
C
        IF(ISEGHR.GT.0) THEN
          IEND=ISTART+ISEGHR-1
C
          DO 25 NN=ISTART,IEND
C
            IF(NINT(RMXHRLY(NN)).EQ.-IZMISS) THEN
              MAX_MISSNG(N)=MAX_MISSNG(N)+1
            ENDIF
C
 25       CONTINUE
C
          ISTART=IEND+1
          IF((ISEGHR.EQ.1).AND.(MAX_MISSNG(N).EQ.1))RMXABCD(N)=-9988.
          IF((ISEGHR.GT.1).AND.(MAX_MISSNG(N).GE.2))RMXABCD(N)=-ZMISS
        ENDIF
C
 30   CONTINUE
C
C        STEP 2B. FOR MIN, COUNT NUMBER OF MISSING PER SEGMENT
C
      ISTART=1
C
      DO 40 N=1,4
        ISEGHR=MIN_COUNT(N,ITZONE+11)
C
        IF(ISEGHR.GT.0) THEN
          IEND=ISTART+ISEGHR-1
C
          DO 35 NN=ISTART,IEND
            IF(NINT(RMNHRLY(NN)).EQ.IZMISS) THEN
              MIN_MISSNG(N)=MIN_MISSNG(N)+1
            ENDIF
 35       CONTINUE
C
          ISTART=IEND+1
          IF((ISEGHR.EQ.1).AND.(MIN_MISSNG(N).EQ.1))RMNABCD(N)=9988.
          IF((ISEGHR.GT.1).AND.(MIN_MISSNG(N).GE.2))RMNABCD(N)=ZMISS
        ENDIF
C
 40   CONTINUE
C
      RETURN    
      END
C*******************************************************************
      SUBROUTINE CKFRMSG(ND1,MAXHRL,MXMN,ISTA,HRLY,JSTART,JEND,IWHICH,
     *                   ZMISS,IMSG)
C
C        AUGUST  1997    SETTELMAIER   TDL   MOS-2000
C        AUGUST  1998    WEISS         MODIFIED FOR REVISED MAXMIN SUBROUTINE
C        OCTOBER 2001    WEISS         IF STATEMENTS CONTAINING REAL VALUES
C                                      CHANGED TO INTEGERS.
C        MAY     2003    GLAHN         INSERTED WHITE SPACE
C
C        PURPOSE
C            THIS SUBROUTINE CHECKS FOR MISSING VALUES AMONGST ELEMENTS
C            OF THE ARRAY HRLY.
C
C        VARIABLES
C
C                 ND1 = MAXIMUM NUMBER OF STATIONS (INPUT).
C              MAXHRL = MAXIMUM NUMBER OF HOURS (=25) USED TO STORE
C                       THE HOURLY TEMPERATURES FROM ACROSS ALL
C                       POTENTIAL TIME ZONES (INPUT).
C                MXMN = FLAG TO INDICATE DAYTIME MAX (=2) OR
C                       NIGHTTIME MIN (=1) PROCESSING (INPUT).
C                ISTA = STATION COUNTER FOR ARRAY HRLY (INPUT). 
C           HRLY(N,J) = THE HOURLY TEMPERATURE OBS FOR EACH STATION
C                       WHERE N=1,ND1 AND J=1,MAXHRL (INTERNAL).
C              JSTART = THE STARTING POINT OF THE RANGE OF HOURLY OBS
C                       MAKING UP THE TIME PERIOD OF A 6-HR MIN/MAX
C                       ESTIMATE (INPUT).
C                JEND = THE ENDING POINT OF THE RANGE OF HOURLY OBS
C                       MAKING UP THE TIME PERIOD OF A 6-HR MIN/MAX
C                       ESTIMATE (INPUT).
C              IWHICH = FLAG FOR 6 HOUR MAX/MIN MISSING CHECK (=6) OR
C                       FLAG FOR 1 HOUR MAX/MIN MISSING CHECK (=1),
C                       (INPUT).
C               ZMISS = MISSING VALUE OF ZMISS (INPUT).
C             IMSG(K) = ARRAY TO HOLD THE NUMBER OF MISSING IN A 
C                       THE HRLY ARRAY, WHERE K=1,3 (INPUT).
C
C        OTHER VARIABLES
C            
C               JFROM = STARTING HOUR FOR A 6 HOUR PERIOD (INTERNAL).
C              JFROM2 = ENDING HOUR FOR A 6 HOUR PERIOD (INTERNAL).
C
      IMPLICIT NONE 
C
      INTEGER ND1,MAXHRL,MXMN,ISTA,JSTART,JEND,IWHICH,IMSG(3)
      INTEGER JFROM,JFROM2
      INTEGER I,J,K,IZMISS
C
      REAL HRLY(ND1,MAXHRL),ZMISS
C
C        STEP 1. INITIALIZE THE MISSING VALUE COUNTER ARRAY 
C
      IZMISS=9999
C
      DO 2 J=1,3
        IMSG(J)=0
  2   CONTINUE
C
C        STEP 2A. FOR IWHICH=6, CHECK A RANGE OF HOURLY OBSERVATIONS
C                 FOR MISSING VALUES OVER A 6-HR PERIOD. THE PERIOD 
C                 IS DETERMINED BY JSTART.
C
      IF(IWHICH.EQ.6) THEN
C
        DO 7 K=1,3
          JFROM=JSTART+(IWHICH*K)-IWHICH
          JFROM2=JSTART+(IWHICH*K)
C
          DO 3 I=JFROM,JFROM2
            IF(NINT(HRLY(ISTA,I)).EQ.IZMISS) THEN
              IMSG(K)=IMSG(K)+1
              IF(MXMN.EQ.2) HRLY(ISTA,I)=-ZMISS
            ENDIF
C
  3       CONTINUE
C
  7     CONTINUE
C
      ENDIF
C
C        STEP 2B. FOR IWHICH=1, CHECK TWO HOURLY OBSERVATIONS
C                 FOR MISSING VALUES. THE PERIOD IS JUST TWO 
C                 SPECIFIC HOURS DETERMINED BY THE JSTART AND JEND.
C
      IF(IWHICH.EQ.1) THEN
        K=1
C
        IF(NINT(HRLY(ISTA,JSTART)).EQ.IZMISS.OR.
     *    NINT(HRLY(ISTA,JSTART)).EQ.-IZMISS) THEN
          IMSG(K)=IMSG(K)+1
        ENDIF
C
        IF(NINT(HRLY(ISTA,JEND)).EQ.IZMISS.OR.
     *    NINT(HRLY(ISTA,JEND)).EQ.-IZMISS) THEN
          IMSG(K)=IMSG(K)+1
        ENDIF
C
      ENDIF
C
      RETURN
      END
C*******************************************************************
      SUBROUTINE RMXMN_FILL(INUMZN,ISTA,IZ,MAXHRL,ND1,
     *                       HRLY,RMXHRLY,RMNHRLY,ZMISS,
     *                       CMAX,CMIN,RFILL)
C
C
C        DECEMBER 2000   WEISS   MDL   MOS-2000
C        OCTOBER  2001   WEISS   IF STATEMENTS CONTAINING REAL VALUES
C                                CHANGED TO INTEGERS
C
C        PURPOSE
C            THIS SUBROUTINE FILLS THE ARRAYS RMXHRLY AND RMNHRLY WITH
C            HOURLY TEMPERATURE OBS. THESE ARRAY ARE THEN USED TO 
C            GENERATE SEGMENTS A,B,C OR D FOR EITHER MAX OR MIN.
C
C        VARIABLES
C
C              INUMZN = NUMBER OF HOURS (=14) USED TO SELECT HOURLY
C                       OBS REPRESENTING THE FIRST AND THIRD 6-HOUR
C                       TIME PERIODS (INPUT).
C                ISTA = STATION COUNTER FOR ARRAY HRLY (INPUT).
C                  IZ = DETERMINES STARTING POINT IN HRLY ARRAY FOR
C                       RECONSTRUCTING 6 HOUR MAX/MIN VALUES BASED ON
C                       HOURLY OBS, DEPENDING ON TIME ZONE (INPUT).
C              MAXHRL = MAXIMUM NUMBER OF HOURS (=25) USED TO STORE
C                       THE HOURLY TEMPERATURES FROM ACROSS ALL
C                       POTENTIAL TIME ZONES (INPUT).
C                 ND1 = MAXIMUM NUMBER OF STATIONS (INPUT).
C           HRLY(N,J) = THE HOURLY TEMPERATURE OBS FOR EACH STATION
C                       WHERE N=1,ND1 AND J=1,MAXHRL (INPUT).
C          RMNHRLY(K) = HOLDS THE HOURLY TEMPERATURES FOR THE FIRST
C                       AND THIRD SIX HOUR PERIODS AND IS USED TO
C                       GENERATE MIN TEMPERATURE SEGMENTS A,B,C AND D,
C                       WHERE K=1,14 (OUTPUT).
C          RMXHRLY(K) = HOLDS THE HOURLY TEMPERATURES FOR THE FIRST
C                       AND THIRD SIX HOUR PERIODS AND IS USED TO
C                       GENERATE MIN TEMPERATURE SEGMENTS A,B,C AND D,
C                       WHERE K=1,14 (OUTPUT).
C               ZMISS = MISSING VALUE OF 9999. (INPUT).
C                CMAX = LOGICAL PARAMETER FOR DAYTIME MAXIMUM
C                       PROCESSING (INPUT).
C                CMIN = LOGICAL PARAMETER FOR NIGHTTIME MINIMUM
C                       PROCESSING (INPUT).
C               RFILL = LOGICAL PARAMETER INDICATING THAT SUBROUTINE
C                       RMXMN_FILL HAS BEEN CALLED AT LEAST ONCE 
C                       (ALL THAT IS REQUIRED) (INPUT/OUTPUT).
C
      IMPLICIT NONE
C
      LOGICAL CMAX,CMIN,RFILL
C
      INTEGER INUMZN,ISTA,IZ,MAXHRL,ND1
      INTEGER II,J,IZMISS
C
      REAL HRLY(ND1,MAXHRL)
      REAL RMNHRLY(INUMZN),RMXHRLY(INUMZN),ZMISS
C
C        STEP 1. INITIALIZE THE RMXHRLY AND RMNHRLY ARRAYS
C
      IZMISS=9999
C
      DO 2 II=1,INUMZN
          RMXHRLY(II)=-ZMISS
          RMNHRLY(II)=ZMISS
 2    CONTINUE
C
      RFILL=.FALSE.
C
C        STEP 2. FILL ARRAYS RMXHRLY AND RMNHRLY WITH HRLY OBS
C
      IF(CMAX) THEN 
C
        DO 220 J=1,7 
          RMXHRLY(J)=HRLY(ISTA,J+6-IZ) 
          RMNHRLY(J)=HRLY(ISTA,J+6-IZ)
          IF(NINT(HRLY(ISTA,J+6-IZ)).EQ.-IZMISS) RMNHRLY(J)=ZMISS
 220    CONTINUE 
C
        DO 225 J=8,14 
          RMXHRLY(J)=HRLY(ISTA,J+11-IZ) 
          RMNHRLY(J)=HRLY(ISTA,J+11-IZ)
          IF(NINT(HRLY(ISTA,J+11-IZ)).EQ.-IZMISS) RMNHRLY(J)=ZMISS
 225    CONTINUE
C
      ELSEIF(CMIN) THEN
C
        DO 230 J=1,7 
          RMXHRLY(J)=HRLY(ISTA,J+6-IZ)
          IF(NINT(HRLY(ISTA,J+6-IZ)).EQ.IZMISS) RMXHRLY(J)=-ZMISS
          RMNHRLY(J)=HRLY(ISTA,J+6-IZ)
 230    CONTINUE 
C
        DO 235 J=8,14
          RMXHRLY(J)=HRLY(ISTA,J+11-IZ)
          IF(NINT(HRLY(ISTA,J+11-IZ)).EQ.IZMISS) RMXHRLY(J)=-ZMISS
          RMNHRLY(J)=HRLY(ISTA,J+11-IZ) 
 235    CONTINUE
C
      ENDIF
C
      RETURN
      END
C*******************************************************************
      SUBROUTINE MAXMIN_PART(INUMZN,ITZON,JCOUNT,
     *                       RMXHRLY,RMNHRLY,RMXMN13,ZMISS,
     *                       CMAX,CMIN,RECON1,RECON3,NUM_MISS,
     *                       IPRT,KFILDO)
C
C        DECEMBER 2000   WEISS   MDL   MOS-2000
C        OCTOBER  2001   WEISS   IF STATEMENTS CONTAINING REAL VALUES
C                                CHANGED TO INTEGERS.
C
C        PURPOSE
C            THIS SUBROUTINE CALCULATES (RECONSTRUCTS) THE 
C            MAX1/MIN1 AND MAX3/MIN3 VALUES FOR PART-TIME
C            STATIONS. THE MAX1/MIN1 ARE EQUIVALENT TO SEGMENT B
C            AND MAX3/MIN3 ARE EQUIVALENT TO SEGMENT C. THE CHECK
C            OF MISSING HOURLY OBS FOR THE RECONSTRUCTED MAX1/MIN1
C            AND MAX3/MIN3 VALUES IS ALSO CONDUCTED IN THIS SUBROUTINE.
C
C        VARIABLES
C
C              INUMZN = NUMBER OF HOURS (=14) USED TO SELECT HOURLY
C                       OBS REPRESENTING THE FIRST AND THIRD 6-HOUR
C                       TIME PERIODS (INPUT).
C               ITZON = STATION'S TIME ZONE (INPUT).
C              JCOUNT = COUNTER OF THE THREE MAX'S OR MIN'S (INPUT).  
C          RMNHRLY(K) = HOLDS THE HOURLY TEMPERATURES FOR THE FIRST
C                       AND THIRD SIX HOUR PERIODS AND IS USED TO
C                       GENERATE MIN TEMPERATURE SEGMENTS A,B,C AND D,
C                       WHERE K=1,14 (INPUT).
C          RMXHRLY(K) = HOLDS THE HOURLY TEMPERATURES FOR THE FIRST
C                       AND THIRD SIX HOUR PERIODS AND IS USED TO
C                       GENERATE MIN TEMPERATURE SEGMENTS A,B,C AND D,
C                       WHERE K=1,14 (INPUT).
C             RMXMN13 = THE RECONSTRUCTED MAX1/MIN1 AND/OR MAX3/MIN3
C                       VALUE RETURNED BY SUBROUTINE MAXMIN_PART, 
C                       FOR PART-TIME STATION MAX/MIN ESTIMATES 
C                       (OUTPUT).
C               ZMISS = MISSING VALUE OF 9999. (INPUT).
C                CMAX = LOGICAL PARAMETER FOR DAYTIME MAXIMUM
C                       PROCESSING (INPUT).
C                CMIN = LOGICAL PARAMETER FOR NIGHTTIME MINIMUM
C                       PROCESSING (INPUT).
C              RECON1 = LOGICAL PARAMETER USED TO INDICATE EITHER
C                       MAX1/MIN1 HAS BEEN GENERATED FOR A 
C                       PART-TIME STATION (INPUT/OUTPUT).
C              RECON3 = LOGICAL PARAMETER USED TO INDICATE EITHER
C                       MAX3/MIN3 HAS BEEN GENERATED FOR A 
C                       PART-TIME STATION (INPUT/OUTPUT).
C                IPRT = PRINT FLAG USED TO (IPRT > 0), PRINT OUT
C                       INCREASING AMOUNTS OF DIAGNOSTICS
C                       1=SOME(RECOMMENDED), 2=ALL DIAGNOSTICS (INPUT).
C              KFILDO = DEFAULT UNIT NUMBER FOR OUTPUT (PRINT) FILE
C                       (INPUT).
C
C        OTHER VARIABLES
C                IEND = END COUNTER OF NUMBER OF HOURS PER
C                       SEGMENT (INTERNAL).
C              ISEGHR = NUMBER OF HOURS PER SEGMENT (INTERNAL).
C              ISTART = START COUNTER OF NUMBER OF HOURS PER
C                       SEGMENT (INTERNAL).
C      MAX_COUNT(J,M) = FOR MAX ESTIMATES, THE TOTAL NUMBER OF HOURLY
C                       OBS USED TO GENERATE SEGMENTS B AND C FOR
C                       EACH TIME ZONE, WHERE M=1,7 AND J=1,2
C             MAXH(L) = FOR MAX ESTIMATES, NUMBER OF HOURLY OBS
C                       PER SEGMENT (B - C) FOR ALL 7 TIME ZONES
C                       (WEST TO EAST) ,WHERE L=1,14 (INTERNAL).
C            MAXST(L) = FOR MAX ESTIMATES, THE STARTING POINT FOR
C                       TESTING MISSING VALUES OF SEGMENTS B AND C
C                       WHERE L=1,7 (INTERNAL).
C      MIN_COUNT(J,M) = FOR MIN ESTIMATES, THE TOTAL NUMBER OF HOURLY
C                       OBS USED TO GENERATE SEGMENTS B AND C FOR
C                       EACH TIME ZONE, WHERE M=1,7 AND J=1,2
C             MINH(L) = FOR MIN ESTIMATES, NUMBER OF HOURLY OBS
C                       PER SEGMENT (B - C) FOR ALL 7 TIME ZONES
C                       (WEST TO EAST) ,WHERE L=1,14 (INTERNAL).
C            MINST(L) = FOR MIN ESTIMATES, THE STARTING POINT FOR
C                       TESTING MISSING VALUES OF SEGMENTS B AND C
C                       WHERE L=1,7 (INTERNAL).
C            NUM_MISS = FOR MAX AND MIN ESTIMATES, THE NUMBER OF
C                       MISSING HOURLY OBS FOR SEGMENTS B AND C
C                       FOR A GIVEN STATION (INTERNAL/OUTPUT).
C              RMAX1B = THE RECONSTRUCTED MAX1 VALUE (INTERNAL).
C              RMAX3C = THE RECONSTRUCTED MAX3 VALUE (INTERNAL).
C              RMIN1B = THE RECONSTRUCTED MIN1 VALUE (INTERNAL).
C              RMIN3C = THE RECONSTRUCTED MIN3 VALUE (INTERNAL).
C
      IMPLICIT NONE
C
      LOGICAL CMAX,CMIN,RECON1,RECON3
C
      INTEGER JCOUNT,INUMZN,ITZON
      INTEGER ISEGHR,ISTART,IEND,NUM_MISS,IPRT,KFILDO
      INTEGER MAXH(14),MAXST(7),MINH(14),MINST(7)
      INTEGER MAX_COUNT(2,7),MIN_COUNT(2,7)
      INTEGER I,II,J,JJ,IZMISS
C
      REAL RMNHRLY(INUMZN),RMXHRLY(INUMZN),ZMISS
      REAL RMAX1B,RMAX3C,RMIN1B,RMIN3C,RMXMN13
C
      DATA MAXH/2,6,3,5,4,4,5,3,6,2,7,1,2,6/
      DATA MAXST/5,4,3,2,1,0,5/
      DATA MINH/2,7,3,6,4,5,5,4,6,3,7,2,2,7/
      DATA MINST/5,4,3,2,1,0,5/
C
C        STEP 1. INITIALIZE MAX1B, MAX3C, MIN1B, MIN3C.
C
          RMAX1B=-ZMISS
	  RMAX3C=-ZMISS
          RMIN1B=ZMISS
	  RMIN3C=ZMISS
          NUM_MISS=0
          RMXMN13=ZMISS
          IZMISS=9999
C
C*********************************************************
C
C        STEP 2A.SET UP THE THE MAX VALUES SEGMENT B
C                AND C FOR EACH TIME ZONE.
C                  MAX WINDOW = 7AM - 7PM
C
      IF(CMAX) THEN
C
        IF(JCOUNT.EQ.1) THEN
C
          SELECT CASE (ITZON)
            CASE (-10)
C               1. ALEUTIANS/HAWAII
              RMAX1B=MAX(RMXHRLY(6),RMXHRLY(7))
            CASE (-9)
C               2. ALASKA
              RMAX1B=MAX(RMXHRLY(5),RMXHRLY(6),RMXHRLY(7))
            CASE (-8)          
C               3. PACIFIC
              RMAX1B=MAX(RMXHRLY(4),RMXHRLY(5),RMXHRLY(6),
     *                   RMXHRLY(7))
            CASE (-7)
C               4. MOUNTAIN
              RMAX1B=MAX(RMXHRLY(3),RMXHRLY(4),RMXHRLY(5),
     *                   RMXHRLY(6),RMXHRLY(7))
            CASE (-6)
C               5. CENTRAL
              RMAX1B=MAX(RMXHRLY(2),RMXHRLY(3),RMXHRLY(4),RMXHRLY(5),
     *                   RMXHRLY(6),RMXHRLY(7))
            CASE (-5)
C               6. EASTERN
              RMAX1B=MAX(RMXHRLY(1),RMXHRLY(2),RMXHRLY(3),RMXHRLY(4),
     *                   RMXHRLY(5),RMXHRLY(6),RMXHRLY(7))
            CASE (-4)
C               7. ATLANTIC
              RMAX1B=MAX(RMXHRLY(6),RMXHRLY(7))
          END SELECT
C
          RECON1=.TRUE.
          RMXMN13=RMAX1B
        ELSEIF(JCOUNT.EQ.3) THEN
C
          SELECT CASE (ITZON)
          CASE(-10) 
C             1. ALEUTIANS/HAWAII
            RMAX3C=MAX(RMXHRLY(8),RMXHRLY(9),RMXHRLY(10),
     *                 RMXHRLY(11),RMXHRLY(12),RMXHRLY(13))
          CASE(-9)
C              2. ALASKA
            RMAX3C=MAX(RMXHRLY(8),RMXHRLY(9),RMXHRLY(10),
     *                 RMXHRLY(11),RMXHRLY(12))
          CASE(-8)
C              3. PACIFIC
            RMAX3C=MAX(RMXHRLY(8),RMXHRLY(9),RMXHRLY(10),
     *                 RMXHRLY(11))
          CASE(-7)
C              4. MOUNTAIN
            RMAX3C=MAX(RMXHRLY(8),RMXHRLY(9),RMXHRLY(10))
          CASE(-6)
C              5. CENTRAL
            RMAX3C=MAX(RMXHRLY(8),RMXHRLY(9))
          CASE(-5)
C              6. EASTERN
            RMAX3C=RMXHRLY(8)
          CASE(-4)
C              7. ATLANTIC
            RMAX3C=MAX(RMXHRLY(8),RMXHRLY(9),RMXHRLY(10),RMXHRLY(11),
     *                 RMXHRLY(12),RMXHRLY(13))
          END SELECT
C
          RECON3=.TRUE.
          RMXMN13=RMAX3C
        ENDIF
C
      ENDIF
C
C        STEP 2B. SET UP THE THE MIN VALUES SEGMENT B
C                 AND C FOR EACH TIME ZONE
C                 MIN WINDOW = 7PM - 8AM
C
      IF(CMIN) THEN
C
        IF(JCOUNT.EQ.1) THEN
C
          SELECT CASE (ITZON)
          CASE (-10)
C              1. ALEUTIANS/HAWAII
            RMIN1B=MIN(RMNHRLY(6),RMNHRLY(7))
          CASE (-9)
C              2. ALASKA
            RMIN1B=MIN(RMNHRLY(5),RMNHRLY(6),RMNHRLY(7))
          CASE (-8)
C              3. PACIFIC
            RMIN1B=MIN(RMNHRLY(4),RMNHRLY(5),RMNHRLY(6),
     *                 RMNHRLY(7))
          CASE (-7)
C              4. MOUNTAIN
            RMIN1B=MIN(RMNHRLY(3),RMNHRLY(4),RMNHRLY(5),
     *                 RMNHRLY(6),RMNHRLY(7))
          CASE (-6)
C              5. CENTRAL
            RMIN1B=MIN(RMNHRLY(2),RMNHRLY(3),RMNHRLY(4),RMNHRLY(5),
     *                 RMNHRLY(6),RMNHRLY(7))
          CASE (-5)
C              6. EASTERN
            RMIN1B=MIN(RMNHRLY(1),RMNHRLY(2),RMNHRLY(3),RMNHRLY(4),
     *                 RMNHRLY(5),RMNHRLY(6),RMNHRLY(7))
          CASE (-4)
C              7. ATLANTIC
            RMIN1B=MIN(RMNHRLY(6),RMNHRLY(7))
          END SELECT
C
          RECON1=.TRUE.
          RMXMN13=RMIN1B
        ELSEIF(JCOUNT.EQ.3) THEN
C
          SELECT CASE (ITZON)
          CASE (-10)
C             1. ALEUTIANS/HAWAII
            RMIN3C=MIN(RMNHRLY(8),RMNHRLY(9),RMNHRLY(10),RMNHRLY(11),
     *                 RMNHRLY(12),RMNHRLY(13),RMNHRLY(14))
          CASE (-9)
C             2. ALASKA
            RMIN3C=MIN(RMNHRLY(8),RMNHRLY(9),RMNHRLY(10),
     *                 RMNHRLY(11),RMNHRLY(12),RMNHRLY(13))
          CASE (-8)
C             3. PACIFIC
            RMIN3C=MIN(RMNHRLY(8),RMNHRLY(9),RMNHRLY(10),
     *               RMNHRLY(11),RMNHRLY(12))
          CASE (-7)
C             4. MOUNTAIN
            RMIN3C=MIN(RMNHRLY(8),RMNHRLY(9),RMNHRLY(10),
     *                 RMNHRLY(11))
          CASE (-6)
C             5. CENTRAL
            RMIN3C=MIN(RMNHRLY(8),RMNHRLY(9),RMNHRLY(10))
          CASE (-5)
C             6. EASTERN
            RMIN3C=MIN(RMNHRLY(8),RMNHRLY(9))
          CASE (-4)
C             7. ATLANTIC
            RMIN3C=MIN(RMNHRLY(8),RMNHRLY(9),RMNHRLY(10),RMNHRLY(11),
     *                 RMNHRLY(12),RMNHRLY(13),RMNHRLY(14))
          END SELECT
C
          RECON3=.TRUE.
          RMXMN13=RMIN3C
        ENDIF
C
      ENDIF
C
C*****************************************************************
C
C        STEP 3. CHECK THE RECONSTRUCTED MAX1/MIN1 AND MAX3/MIN3
C                FOR MISSING DATA. THE CHECK WILL BE CONSISTENT
C                THE CHECKS FOUND IN SUBROUTINE CKABCD.
C
      II=0
C
      DO 200 I=1,7
C
        DO 190 J=1,2
          II=II+1
          IF(CMAX) MAX_COUNT(J,I)=MAXH(II)
          IF(CMIN) MIN_COUNT(J,I)=MINH(II)
 190    CONTINUE
C
 200    CONTINUE
C
C
C        STEP 3A. FOR MAX, COUNT NUMBER OF MISSING PER SEGMENT
C
      IF(CMAX) THEN
C
        IF(RECON1) THEN
          ISTART=MAXST(ITZON+11)+1
          J=1
        ENDIF
C
        IF(RECON3) THEN
          ISTART=MAXST(ITZON+11)+MAX_COUNT(1,ITZON+11)+1
          J=2
        ENDIF
C
        ISEGHR=MAX_COUNT(J,ITZON+11)
C
        IF(ISEGHR.GT.0) THEN
          IEND=ISTART+ISEGHR-1
            IF(IPRT.GE.1) WRITE(KFILDO,*) 'PART-TIME MAX'
C
          DO 250 JJ=ISTART,IEND
            IF(NINT(RMXHRLY(JJ)).EQ.-IZMISS) NUM_MISS=NUM_MISS+1
            IF(IPRT.GE.1) WRITE(KFILDO,*) 'MAX HOURLY=',RMXHRLY(JJ),
     *      ' ISEGHR=',ISEGHR,' NUM_MISS=',NUM_MISS
 250      CONTINUE
C
          ISTART=IEND+1
          IF((ISEGHR.EQ.1).AND.(NUM_MISS.EQ.1))RMXMN13=-9998.
          IF((ISEGHR.GT.1).AND.(NUM_MISS.GE.2))RMXMN13=-ZMISS
        ENDIF
CCC
        IF((RECON1).AND.(IPRT.GE.1)) THEN
          IF(.NOT. RECON3) WRITE(KFILDO,*) 'RECONSTRUCTED',
     *    ' MAX1=',RMXMN13
        ENDIF
C
        IF((RECON3).AND.(IPRT.GE.1)) WRITE(KFILDO,*) 'RECONSTRUCTED',
     *  ' MAX3=',RMXMN13
CCC
      ENDIF
C
C        STEP 3B. FOR MIN, COUNT NUMBER OF MISSING PER SEGMENT
C
      IF(CMIN) THEN
C
        IF(RECON1) THEN
          ISTART=MINST(ITZON+11)+1
          J=1
        ENDIF
C
        IF(RECON3) THEN
          ISTART=MINST(ITZON+11)+MIN_COUNT(1,ITZON+11)+1
          J=2
        ENDIF
C
        ISEGHR=MIN_COUNT(J,ITZON+11)
C
        IF(ISEGHR.GT.0) THEN
          IEND=ISTART+ISEGHR-1
	    IF(IPRT.GE.1) WRITE(KFILDO,*) 'PART-TIME MIN'
C
          DO 260 JJ=ISTART,IEND
            IF(NINT(RMNHRLY(JJ)).EQ.IZMISS) NUM_MISS=NUM_MISS+1
	    IF(IPRT.GE.1) WRITE(KFILDO,*) 'MIN HOURLY=',RMXHRLY(JJ),
     *      ' ISEGHR=',ISEGHR,' NUM_MISS=',NUM_MISS
 260      CONTINUE
C
          ISTART=IEND+1
          IF((ISEGHR.EQ.1).AND.(NUM_MISS.EQ.1))RMXMN13=9998.
          IF((ISEGHR.GT.1).AND.(NUM_MISS.GE.2))RMXMN13=ZMISS
        ENDIF
C
        IF((RECON1).AND.(IPRT.GE.1)) THEN
          IF(.NOT. RECON3) WRITE(KFILDO,*) 'RECONSTRUCTED',
     *    ' MIN1=',RMXMN13
        ENDIF
C
        IF((RECON3).AND.(IPRT.GE.1)) WRITE(KFILDO,*) 'RECONSTRUCTED',
     *  ' MIN3=',RMXMN13
C
      ENDIF
C
      RETURN
      END