SUBROUTINE MAXMIN_AK(KFILDO,HRLY_IN,RMXMN_6HRIN,
     1                     ITIMEZ,CCALL,RESFLD,MAXHRL,
     2                     MXMN,IPRT)
C        CURRENT DEV VERSION, SEPT 24, 2009
C 
C        JUNE   2009   Veenhuis  MDL MOS-2000
C                                BASED ON A THE ORIGINAL
C                                MOS-2000 MAX/MIN CODE
C
C        PURPOSE
C            THIS SUBROUTINE IS ADAPTED FROM MAXIMUM. IT 
C            IS CALLED BY MAXMIN TO COMPUTES DAYTIME/NIGHTTIME 
C            TEMPERATURES FOR STATIONS WITHIN THE STATE OF 
C            ALASKA.  IN 2009 THE ALASKA REGION CHANGED THE
C            TIME WINDOWS USED TO DEFINE DAYTIME MAX AND
C            NIGHTIME MIN.  THESE CHANGES COULD NOT BE
C            EASILY STRUCTURED INTO THE EXISTING MAXMIN
C            SUBROUTINE THEREFORE IT WAS DECIDED TO CREATE
C            A SEPARATE SUBROUTINE JUST FOR ALASKA STATIONS.
C
C        DATA SET USE
C               KFILDO = DEFAULT UNIT NUMBER FOR OUTPUT (PRINT) FILE
C                       (OUTPUT).
C        VARIABLES
C                KFILDO = DEFAULT UNIT NUMBER FOR OUTPUT (PRINT) FILE
C                        (INPUT).
C            HRLY_IN(J) = THE HOURLY TEMPERATURE OBS FOR EACH STATION
C                         WHERE J=1,MAXHRL (INPUT).
C        RMXMN_6HRIN(J) = ARRAY OF THE 6-HRLY MINS OR MAXS, BEFORE THEY
C                         ARE PUT IN THE ARRAYS MINS AND MAXS, WHERE
C                         J=1,3 (INPUT).
C                ITIMEZ = ARRAY STATION'S TIME ZONE (INPUT).
C                 CCALL = STATION CALL LETTERS FOR THE STATION BEING
C                         PROCESSED. LETTERS USED FOR DIAGNOSTICS (INPUT).
C                RESFLD = THE RESULTANT FIELD (MAX OR MIN) (OUTPUT)
C                MAXHRL = MAXIMUM NUMBER OF HOURS (=31) USED TO STORE
C                         THE HOURLY TEMPERATURES (INPUT).
C                  MXMN = FLAG TO INDICATE DAYTIME MAX (=2) OR
C                         NIGHTTIME MIN (=1) PROCESSING (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        OTHER VARIABLES
C
C              CHRLY_AB = LOGICAL VARIABLE WHICH INDICATES IF A CHECK OF THE
C                         HOULY TEMPERATURES IN THE A AND B SEGEMENTS IS
C                         REQUIRED TO COMPUTE THE MIN/MAX (INTERNAL).
C              CHRLY_CD = LOGICAL VARIABLE WHICH INDICATES IF A CHECK OF THE
C                         HOULY TEMPERATURES IN THE C AND D SEGEMENTS IS
C                         REQUIRED TO COMPUTE THE MIN/MAX (INTERNAL).
C              CMXMN_AB = LOGICAL VARIABLE WHICH INDICATES IF A CHECK OF THE
C                         MIN/MAX TEMPERATURE TREND IN THE A AND B SEGMENTS
C                         IS REQUIRED TO COMPUTE THE MIN/MAX (INTERNAL).
C              CMXMN_CD = LOGICAL VARIABLE WHICH INDICATES IF A CHECK OF THE
C                         MIN/MAX TEMPERATURE TREND IN THE C AND D SEGMENTS
C                         IS REQUIRED TO COMPUTE THE MIN/MAX (INTERNAL).
C             CMXMN_SMP = LOGICAL VARIABLE WHICH INDICATES IF THE MIN/MAX
C                         WAS DETERMINED BY ONLY A CHECK OF THE 6-HR MIN/MAX
C                         TEMPERATURES (INTERNAL).
C               HRLY(J) = AN ARRAY USED TO HOLD A WORK COPY OF THE
C                         HOURLY TEMPERATURES WHERE J=1,MAXHRL
C                         (INTERNAL).
C          IABCD_LTH(L) = AN ARRAY WHICH COUNT THE NUMBER OF HOURS
C                         IN EACH SEGMENTS A,B,C,D WHERE
C                         L=1,4 (INTERNAL).
C          IABCD_STR(L) = AN ARRAY WHICH INDICATES THE INDEX OF
C                         HRLY WHICH CORRESPONDS TO THE FIRST
C                         HOUR OF THE SEGMENTS A,B,C,D WHERE
C                         L=1,4 THE INDEX INDICATES WHICH SEGMENT
C                         (INTERNAL).
C          IMSG_ABCD(L) = AN ARRAY WHICH HOLDS THE COUNTS OF THE
C                         NUMBER OF MISSING OBSERVATIONS FOR THE
C                         A,B,C,D SEGMENTS WHERE L=1,4. THE INDEX
C                         INDICATES THE SEGMENT (INTERNAL)0
C               IMSG(J) = AN ARRAY OF THE NUMBER OF MISSING HOURLY OBS
C                         IN EACH 6-HR SEGMENT WHERE J=1,3 (INTERNAL).
C                 IMISS = THE INTEGER MISSING VALUE (INTERNAL).
C         IMISS_HRLY(J) = AN ARRAY WHICH INDICATES IF AN OBSERVATION IN
C                         HRLY IS MISSING WHERE J=1,MAXHRL (INTERNAL). 
C             IMISS_6HR = A COUNT OF THE NUMBER OF MISSING 6-HR MIN/MAX
C                         TEMPERATURES (INTERNAL).
C                ISTART = AN INTEGER USED TO INDEX THE VALUES OF HRLY
C                         (INTERNAL).
C                  IEND = AN INTEGER USED TO INDEX THE VALUES OF HRLY
C                         (INTERNAL).       
C                ITEST1 = A INTEGER USED TO INDEX HRLY (INTERNAL).
C                ITEST2 = A INTEGER USED TO INDEX HRLY (INTERNAL).   
C          RMAX_ABCD(J) = AN ARRAY OF THE MAX TEMPERATURE FOR EACH
C                         A,B,C,D, SEGMENT WHERE J=1,4 (INTERNAL).
C          RMIN_ABCD(J) = AN ARRAY OF THE MIN TEMPERATURE FOR EACH
C                         A,B,C,D, SEGMENT WHERE J=1,4 (INTERNAL).
C          RMXMN_6HR(J) = AN ARRAY USED TO HOLD WORK COPIES OF THE
C                         6-HR MIN/MAX TEMPERAUTRES WHERE J=1,3
C                         (INTERNAL).
C             RTEMP_4LT = THE TEMPERATURE AT 4AM/4PM LOCAL TIME USED
C                         TO CHECK THE TEMPERATURE TREND (INTERNAL). 
C             RTEMP_6LT = THE TEMPERATURE AT 6AM/6PM LOCAL TIME USED
C                         TO CHECK THE TEMPERATURE TREND (INTERNAL).
C             RTEMP_7PM = THE TEMPERATURE AT 7PM LOCAL TIME USED
C                         TO CHECK THE TEMPERATURE TREND (INTERNAL).
C             RTEMP_9PM = THE TEMPERATURE AT 9PM LOCAL TIME USED
C                         TO CHECK THE TEMPERATURE TREND (INTERNAL).               
C                RTESTA = USE TO CALCULATE MIN TEMPERATURE THE SIMPLE
C                         WAY (INTERNAL).
C                 ZMISS = THE FLOATING POINT MISSING VALUE (INTERNAL). 
C
      IMPLICIT NONE
C 
      CHARACTER*8 CCALL
      LOGICAL CMXMN_SMP,CHRLY_AB,CHRLY_CD
      LOGICAL CMXMN_AB,CMXMN_CD
C
      INTEGER ITIMEZ
      INTEGER KFILDO,MAXHRL,MXMN,IPRT,ISTART,IEND
      INTEGER I,J
      INTEGER IMSG(3),IMISS,IMISS_HRLY(MAXHRL)
      INTEGER IMSG_ABCD(4),IABCD_STR(4),IABCD_LTH(4)
      INTEGER IMISS_6HR,ITEST1,ITEST2
C
      REAL RESFLD
      REAL RMXMN_6HR(3),HRLY(MAXHRL),HRLY_IN(MAXHRL)
      REAL RMXMN_6HRIN(3)
      REAL ZMISS,RTESTA,RTEMP_4LT,RTEMP_6LT
      REAL RTEMP_7PM,RTEMP_9PM
      REAL RMAX_ABCD(4),RMIN_ABCD(4)
C
      DATA IMSG/3*0/
C
C        COPY THE INPUT DATA TO THE WORK ARRAYS 
C
      HRLY(1:MAXHRL)=HRLY_IN(1:MAXHRL)
      RMXMN_6HR(1:3)=RMXMN_6HRIN(1:3)
C
C        INITIALIZE RESULTANT DAYTIME/NIGHTTIME MAX/MIN, LOGICAL
C        VARIABLES, AND OTHER VARIABLES 
C
      IMISS_6HR=0
      ZMISS=9999.
      IMISS=9999
      CMXMN_SMP=.FALSE.
      CHRLY_AB=.FALSE.
      CHRLY_CD=.FALSE.
      CMXMN_AB=.FALSE.
      CMXMN_CD=.FALSE.    
      IF(MXMN.EQ.1) RESFLD=ZMISS
      IF(MXMN.EQ.2) RESFLD=-ZMISS
C
      DO 100 I=1,MAXHRL
        IMISS_HRLY(I)=0
 100  CONTINUE     
C
C        IF WE ARE DEALING WITH THE MAX THEN CHANGE THE SIGN
C        OF THE MISSING VALUES IN HRLY AND RMXMN_6HR TO -ZMISS.
C        ALSO KEEP TRACK OF THE NUMBER OF MISSING VALES.
C
      IF(MXMN.EQ.2) THEN 
        DO 110 I=1,MAXHRL
          IF(NINT(ABS(HRLY(I))).EQ.IMISS) THEN
            HRLY(I)=-ZMISS
          ENDIF
 110    CONTINUE
C
        DO 120 I=1,3
          IF(NINT(ABS(RMXMN_6HR(I))).EQ.IMISS) THEN
            RMXMN_6HR(I)=-ZMISS
          ENDIF
 120    CONTINUE
      ENDIF
C
C        FIRST CHECK IF ALL THE 6-HR OBS ARE PRESENT.
C        IF THEY ARE THEN TRY TO FIND THE MAX/MIN THE
C        SIMPLE WAY.
C
      IF(INT(MAXVAL(ABS(RMXMN_6HR(1:3)))).NE.ZMISS) THEN
D       WRITE(KFILDO,*) 'TRYING THE SIMPLE WAY'
C
        IF(MXMN.EQ.1) THEN
          RTESTA=MINVAL(RMXMN_6HR(2:3))
          IF(RTESTA .LE. RMXMN_6HR(1)) THEN
            RESFLD=RTESTA
            CMXMN_SMP=.TRUE.
          ELSE
            CMXMN_SMP=.FALSE.
          ENDIF
        ELSEIF(MXMN.EQ.2) THEN
          IF((RMXMN_6HR(2).GE.RMXMN_6HR(1)).AND.
     1       (RMXMN_6HR(2).GE.RMXMN_6HR(3))) THEN
            RESFLD=RMXMN_6HR(2)
            CMXMN_SMP=.TRUE.
          ELSE
            CMXMN_SMP=.FALSE.
          ENDIF
        ENDIF
C
D       WRITE(KFILDO,*) 'THE RESULT WAS',CMXMN_SMP
        IF(CMXMN_SMP) THEN
          IF(IPRT.GT.1) THEN
            IF(MXMN.EQ.1) THEN
              WRITE(KFILDO,*) 'FOR STATION=',
     1        CCALL,'MINS EASY WAY=',RESFLD
            ELSEIF(MXMN.EQ.2) THEN
              WRITE(KFILDO,*) 'FOR STATION=',
     1        CCALL,'MAXS EASY WAY=',RESFLD
            ENDIF
          ENDIF
C
        GOTO 300
        ENDIF
      ENDIF
C
C        NOW COUNT THE NUMBER OF MISSING IN EACH 6-HR
C        SEGMENT AND STORE THE COUNT IN IMSG. ALSO COUNT
C        THE NUMBER OF MISSING 6-HR MIN/MAX TEMPERATURES.
C      
      DO 130 I=1,MAXHRL
        IF(NINT(ABS(HRLY(I))).EQ.IMISS) THEN
          IMISS_HRLY(I)=1
        ENDIF
 130  CONTINUE
C
C        SUM THE TOTAL MISSING IN EACH SEGMENT
C
      IMSG(1)=SUM(IMISS_HRLY(1:7))
      IMSG(2)=SUM(IMISS_HRLY(7:13))
      IMSG(3)=SUM(IMISS_HRLY(13:19))
C
C
      DO 140 I=1,3
        IF(NINT(ABS(RMXMN_6HR(I))).EQ.IMISS) THEN
C
C        TRY TO RECONSTRUCT THE MISSING 6HR VALUE 
C        IF POSSIBLE
C       
          IF(MXMN.EQ.1) THEN
            IF((I.EQ.1).AND.(IMSG(1).LE.3))THEN
              RMXMN_6HR(I)=MINVAL(HRLY(1:7))
            ELSEIF((I.EQ.2).AND.(IMSG(2).LE.1))THEN       
              RMXMN_6HR(I)=MINVAL(HRLY(7:13))
            ELSEIF((I.EQ.3).AND.(IMSG(3).LE.1))THEN 
              RMXMN_6HR(I)=MINVAL(HRLY(13:19))
            ELSE
              IMISS_6HR=IMISS_6HR+1
              IF(IPRT.GT.1) THEN 
                WRITE(KFILDO,*) 'FOR STATION=',
     1          CCALL,'TOO FEW OBS TO MAKE A 6HR',
     2          ' MIN',I,': PART-T MISS=',IMSG(I)
              ENDIF
            ENDIF
          ELSEIF(MXMN.EQ.2) THEN
            IF((I.EQ.1).AND.(IMSG(1).LE.3))THEN
              RMXMN_6HR(I)=MAXVAL(HRLY(1:7))
            ELSEIF((I.EQ.2).AND.(IMSG(2).LE.1))THEN 
              RMXMN_6HR(I)=MAXVAL(HRLY(7:13))
            ELSEIF((I.EQ.3).AND.(IMSG(3).LE.3))THEN 
              RMXMN_6HR(I)=MAXVAL(HRLY(13:19))
            ELSE
              IMISS_6HR=IMISS_6HR+1
              IF(IPRT.GT.1) THEN 
                WRITE(KFILDO,*) 'FOR STATION=',
     1          CCALL,'TOO FEW OBS TO MAKE A 6HR',
     2          ' MAX',I,': PART-T MISS=',IMSG(I)
              ENDIF
            ENDIF
          ENDIF
        ENDIF
 140  CONTINUE
C
C        IF ALL 6HR MIN/MAX VALUES ARE NOT MISSING OR WERE
C        RECONSTRUCTED THEN WE CAN TRY TO CALCULATE THE
C        MIN/MAX.  IF ANY 6HR MIN/MAX IS STILL MISSING THEN
C        THERE ARE NOT ENOUGH HOURLY OBS TO EVALUATE THE
C        MIN/MAX SO GO TO THE END.
C
      IF(IMISS_6HR.GT.0) THEN
        GOTO 300
      ENDIF
C 
      IF(IPRT.GT.1) THEN
        IF(MXMN.EQ.1) THEN
          WRITE(KFILDO,*) 'FOR STATION=',
     1      CCALL,'MIN1-3=',RMXMN_6HR(1),
     2      RMXMN_6HR(2),RMXMN_6HR(3) 
        ELSEIF(MXMN.EQ.2) THEN
          WRITE(KFILDO,*) 'FOR STATION=',
     1      CCALL,'MAX1-3=',RMXMN_6HR(1),
     2      RMXMN_6HR(2),RMXMN_6HR(3)
        ENDIF
      ENDIF 
C
C        IF ALL 6HR MIN/MAX ARE AVAIABLE THEN FIRST TRY
C        TO CALCULATE THE MIN/MAX THE SIMPLE WAY.
C
      IF(IMISS_6HR.EQ.0) THEN 
        IF(MXMN.EQ.1) THEN
          RTESTA=MINVAL(RMXMN_6HR(2:3))
          IF(RTESTA .LE. RMXMN_6HR(1)) THEN
            RESFLD=RTESTA
            CMXMN_SMP=.TRUE.
          ELSE
            CMXMN_SMP=.FALSE.
          ENDIF
        ELSEIF(MXMN.EQ.2) THEN
          IF((RMXMN_6HR(2).GE.RMXMN_6HR(1)).AND.
     1       (RMXMN_6HR(2).GE.RMXMN_6HR(3))) THEN
            RESFLD=RMXMN_6HR(2)
            CMXMN_SMP=.TRUE.
          ELSE
            CMXMN_SMP=.FALSE.
          ENDIF
        ENDIF  
      ENDIF 
C
C        IF THIS TEST WAS SUCCESSFUL THEN THE CODE IS
C        FINISHED SO GO TO THE END.
C 
      IF(CMXMN_SMP) THEN
        IF(IPRT.GT.1) THEN
          IF(MXMN.EQ.1) THEN
            WRITE(KFILDO,*) 'FOR STATION=',
     1      CCALL,'MINS EASY WAY=',RESFLD
          ELSEIF(MXMN.EQ.2) THEN
            WRITE(KFILDO,*) 'FOR STATION=',
     1      CCALL,'MAXS EASY WAY=',RESFLD
          ENDIF
        ENDIF
C
        GOTO 300
      ELSE
C
C        IF THE SIMPLE TEST WAS NOT CONCLUSIVE THEN WE 
C        CHECK THE A,B,C, AND D SEGMENTS.
C
        IF(IPRT.GT.2) THEN
          IF(MXMN.EQ.1) THEN
            WRITE(KFILDO,*) 'FOR STATION=',
     1      CCALL,'MINS: NEED TO CHECK',
     2      ' INDIVIDUAL HOURS'
          ELSEIF(MXMN.EQ.2) THEN
            WRITE(KFILDO,*) 'FOR STATION=',
     1      CCALL,'MAXS: NEED TO CHECK',
     2      ' INDIVIDUAL HOURS' 
          ENDIF
        ENDIF
      ENDIF 
C
C        FIRST SET UP THE SEGMENTS BASED ON TIME ZONE AND
C        MIN/MAX. THE ARRAY IABCD_START CONTAINS THE 
C        INDICES OF HRLY WHICH ARE THE FIRST HOUR IN THE
C        ABCD SEGMENTS. IF THE SEGMENT IS EMPTY THEN SET 
C        THAT VALUE OF IABCD_STR TO 9999. THE ARRAY 
C        IABCD_LTH IS A COUNT OF THE NUMBER OF HOURS IN
C        EACH SEGMENT.
C
      IF(MXMN.EQ.1) THEN
        IF (ITIMEZ.EQ.-10) THEN
          IABCD_STR(1)=1
          IABCD_STR(2)=4
          IABCD_STR(3)=13
          IABCD_STR(4)=9999 
C
          IABCD_LTH(1)=3
          IABCD_LTH(2)=4
          IABCD_LTH(3)=7
          IABCD_LTH(4)=0
C
        ELSEIF(ITIMEZ.EQ.-9) THEN
          IABCD_STR(1)=1
          IABCD_STR(2)=3
          IABCD_STR(3)=13
          IABCD_STR(4)=9999
C
          IABCD_LTH(1)=2
          IABCD_LTH(2)=5
          IABCD_LTH(3)=7
          IABCD_LTH(4)=0
        ENDIF
      ELSEIF(MXMN.EQ.2) THEN
        IF (ITIMEZ.EQ.-10) THEN
          IABCD_STR(1)=1
          IABCD_STR(2)=4
          IABCD_STR(3)=13
          IABCD_STR(4)=9999
C
          IABCD_LTH(1)=3
          IABCD_LTH(2)=4
          IABCD_LTH(3)=7
          IABCD_LTH(4)=0
C        
        ELSEIF(ITIMEZ.EQ.-9) THEN
          IABCD_STR(1)=1
          IABCD_STR(2)=3
          IABCD_STR(3)=13
          IABCD_STR(4)=19
C
          IABCD_LTH(1)=2
          IABCD_LTH(2)=5
          IABCD_LTH(3)=6
          IABCD_LTH(4)=1
        ENDIF
      ENDIF
C
C        COUNT THE AMOUNT OF MISSING DATA IN EACH SEGMENT
C        USING IMISS_HRLY.
C 
      DO 160 I=1,4
        IF(IABCD_LTH(I).GE.2)THEN
          ISTART=IABCD_STR(I)
          IEND=IABCD_STR(I)+IABCD_LTH(I)-1
          IMSG_ABCD(I)=SUM(IMISS_HRLY(ISTART:IEND))
        ELSEIF(IABCD_LTH(I).EQ.1)THEN
          ISTART=IABCD_STR(I)
          IMSG_ABCD(I)=IMISS_HRLY(ISTART)
        ELSE
          IMSG_ABCD(I)=9999
        ENDIF
 160  CONTINUE
C
C        CHECK IF THE NUMBER OF MISSING HOURS IN EACH SEGMENT
C        EXCEEDS THE ACCEPTABLE AMOUNT OF MISSING DATA. IF ANY
C        SEGMENT DOES THEN GO TO THE END.
C
      DO 170 I=1,4
        IF((IABCD_LTH(I).EQ.1).AND.
     1     (IMSG_ABCD(I).EQ.1)) THEN
          RESFLD=9999
          GOTO 300
        ELSEIF((IABCD_LTH(I).GE.2).AND.
     1         (IMSG_ABCD(I).GE.2)) THEN
          RESFLD=ZMISS
          GOTO 300
        ENDIF
 170  CONTINUE       
C
C        A DROP THROUGH HERE MEANS THERE IS ENOUGH VALID
C        DATA TO CONTINUE. CALCULATE THE MIN AND MAX OF
C        EACH SEGMENT.
C      
      DO 180 I=1,4
        IF(IABCD_LTH(I).EQ.1) THEN
          ISTART=IABCD_STR(I)
          RMIN_ABCD(I)=HRLY(ISTART)
          RMAX_ABCD(I)=HRLY(ISTART)
        ELSEIF(IABCD_LTH(I).GE.2) THEN
          ISTART=IABCD_STR(I)
          IEND=IABCD_STR(I)+IABCD_LTH(I)-1          
          RMIN_ABCD(I)=MINVAL(HRLY(ISTART:IEND),
     1         MASK=ABS(HRLY(ISTART:IEND)).LT.9997) 
          RMAX_ABCD(I)=MAXVAL(HRLY(ISTART:IEND),
     1         MASK=ABS(HRLY(ISTART:IEND)).LT.9997) 
        ELSE
          RMIN_ABCD(I)=9999
          RMAX_ABCD(I)=9999
        ENDIF
 180  CONTINUE
C
C        DO THE MIN TEMPERATURE CHECK. DUE TO THE
C        EXPANDED WINDOW WE ONLY NEED TO CHECK
C        THE LEADING A B SEGMENTS FOR MIN TEMP. 
C
      IF(MXMN.EQ.1) THEN
        IF(IPRT.GT.2) THEN
          WRITE(KFILDO,*) 'MIN CHECKING ',
     1      'A VS B'
        ENDIF 
C
        IF(RMIN_ABCD(2).LT.RMIN_ABCD(1)) THEN
C        KEEP THE CURRENT RMXMN_6HR(1) VALUE
          CHRLY_AB=.FALSE.
        ELSEIF(RMIN_ABCD(2).GT.RMIN_ABCD(1)) THEN
C        SET MIN1=MINB
          RMXMN_6HR(1)=RMIN_ABCD(2)
          CHRLY_AB=.FALSE.
        ELSEIF(RMIN_ABCD(2).EQ.RMIN_ABCD(1)) THEN
          IF(RMIN_ABCD(2).EQ.RMXMN_6HR(1))THEN
C        ALL THREE ARE EQUAL SO JUST KEEP RMXMN_6HR(1)
            CHRLY_AB=.FALSE.
          ELSE
            CHRLY_AB=.TRUE.
          ENDIF
        ENDIF
C      
        IF(CHRLY_AB == .FALSE.) THEN
          RESFLD=MINVAL(RMXMN_6HR)
          GOTO 300
        ENDIF
      ELSEIF(MXMN.EQ.2) THEN
C
C        FOR MAX WE MUST EXAMINE ONLY THE A,B SEGMENTS
C        FOR ITIMEZ=-10 AND ALL SEGMENTS FOR ITIMEZ=-9. 
C        DO THE A,B SEGMENTS FIRST
C
        IF(IPRT.GT.2) THEN
          WRITE(KFILDO,*) 'MAX CHECKING ',
     1      'A VS B'
        ENDIF
C
        IF(RMAX_ABCD(2).GT.RMAX_ABCD(1)) THEN 
C        KEEP THE CURRENT RMXMN_6HR(1) VALUE
          CHRLY_AB=.FALSE.
        ELSEIF(RMAX_ABCD(2).LT.RMAX_ABCD(1)) THEN
          RMXMN_6HR(1)=RMAX_ABCD(2)
          CHRLY_AB=.FALSE.
        ELSEIF(RMAX_ABCD(2).EQ.RMAX_ABCD(1)) THEN
          IF(RMAX_ABCD(2).EQ.RMXMN_6HR(1))THEN
C          ALL THREE ARE EQUAL SO JUST KEEP RMXNX_6HR(1)
            CHRLY_AB=.FALSE.
          ELSE
            CHRLY_AB=.TRUE.
          ENDIF
        ENDIF
C
C        IF THE SIZE OF SEGMENT D IS GREATER THAN 0
C        THEN CHECK C, D
C
        IF(IABCD_LTH(4).GT.0) THEN
C
          IF(IPRT.GT.2) THEN
            WRITE(KFILDO,*) 'MAX CHECKING ',
     1        'C VS D'
          ENDIF
C
          IF(RMAX_ABCD(3).GT.RMAX_ABCD(4)) THEN
C          KEEP THE CURRENT RMXMN_6HR(3) VALUE
            CHRLY_CD=.FALSE.
          ELSEIF(RMAX_ABCD(3).LT.RMAX_ABCD(4)) THEN
            RMXMN_6HR(3)=RMAX_ABCD(3)
            CHRLY_CD=.FALSE. 
          ELSEIF(RMAX_ABCD(3).EQ.RMAX_ABCD(4)) THEN
            IF(RMAX_ABCD(3).EQ.RMXMN_6HR(3))THEN
C            ALL THREE ARE EQUAL SO JUST KEEP RMXNX_6HR(3)
              CHRLY_CD=.FALSE.
            ELSE
              CHRLY_CD=.TRUE.
            ENDIF
          ENDIF
        ELSE
          CHRLY_CD=.FALSE.
        ENDIF
C
        IF((CHRLY_AB == .FALSE.).AND.
     1     (CHRLY_CD == .FALSE.)) THEN
          RESFLD=MAXVAL(RMXMN_6HR)
          GOTO 300
        ENDIF
      ENDIF
C
      IF(CHRLY_AB == .TRUE.) THEN
C
C        CHECK THE HOURLY OBS TEMP TREND BETWEEN 4PM AND 6PM
C        OR BETWEEN 4AM AND 6AM LOCAL TIME.
C
         IF(IPRT.GE.2) THEN
           IF(MXMN.EQ.1) THEN
             WRITE(KFILDO,*) 'NEED TO CHECK 4 & 6 PM OBS'
             WRITE(KFILDO,*) 'FOR MIN A VS B'
           ELSEIF(MXMN.EQ.2) THEN
             WRITE(KFILDO,*) 'NEED TO CHECK 4 & 6 AM OBS'
             WRITE(KFILDO,*) 'FOR MAX A VS B'
           ENDIF
         ENDIF
C
         ITEST1=IABCD_STR(2)-1
         ITEST2=IABCD_STR(2)+1
         RTEMP_4LT=HRLY(ITEST1)
         RTEMP_6LT=HRLY(ITEST2)
C
         IF((ABS(NINT(RTEMP_4LT)).NE.IMISS).AND.
     1      (ABS(NINT(RTEMP_6LT)).NE.IMISS)) THEN
C   
           IF(MXMN.EQ.1) THEN
             IF(RTEMP_4LT.LT.RTEMP_6LT) THEN
               RMXMN_6HR(1)=RMIN_ABCD(2)
               CMXMN_AB=.FALSE.
             ELSEIF(RTEMP_4LT.GT.RTEMP_6LT) THEN  
C               KEEP THE ORIGINAL VALUE OF RMXMN_6HR(1)
               CMXMN_AB=.FALSE.
             ELSE
C               THEY ARE EQUAL SO CHECK THE MAX TEMPS
               CMXMN_AB=.TRUE. 
             ENDIF
C              
           ELSEIF(MXMN.EQ.2) THEN
             IF(RTEMP_4LT.GT.RTEMP_6LT) THEN
               RMXMN_6HR(1)=RMAX_ABCD(2)
               CMXMN_AB=.FALSE.
             ELSEIF(RTEMP_4LT.LT.RTEMP_6LT) THEN
C             KEEP THE ORIGINAL VALUE OF RMXMN_6HR(1)
               CMXMN_AB=.FALSE. 
             ELSE
C             THEY ARE EQUAL SO CHECK THE MIN TEMPS
               CMXMN_AB=.TRUE.
             ENDIF
           ENDIF
C
C
         ELSE
C
C        THE NEEDED HOURLY OBS ARE MISSING SET RESFLD TO
C        MISSING AND GO TO END
C
           IF(IPRT.GE.1) THEN
             IF(MXMN.EQ.1) THEN
               WRITE(KFILDO,*) '4 OR 6 PM OBS ARE MISSING'
             ELSEIF(MXMN.EQ.2) THEN
               WRITE(KFILDO,*) '4 OR 6 AM OBS ARE MISSING'
             ENDIF
           ENDIF
C
           RESFLD=ZMISS
           GOTO 300
         ENDIF
       ENDIF
C
C
       IF((CHRLY_CD == .TRUE.).AND.
     1    (MXMN.EQ.2).AND.(IABCD_LTH(4).GT.0))THEN
C
C        CHECK THE HOURLY OBS TEMP TREND AT 7PM and 9PM
C        LOCAL TIME. THIS WILL ONLY APPLY TO MAX TEMP
C        FOR ITIMEZ EQUALS -9.
C
         IF(IPRT.GE.2) THEN
           WRITE(KFILDO,*) 'NEED TO CHECK 7 & 9 PM OBS'
           WRITE(KFILDO,*) 'FOR MAX C VS D'
         ENDIF
C
         ITEST1=IABCD_STR(4)-2
         ITEST2=IABCD_STR(4)
         RTEMP_7PM=HRLY(ITEST1)
         RTEMP_9PM=HRLY(ITEST2)
C
         IF((ABS(NINT(RTEMP_7PM)).NE.IMISS).AND.
     1      (ABS(NINT(RTEMP_9PM)).NE.IMISS)) THEN
C
           IF(RTEMP_7PM.GT.RTEMP_9PM) THEN
C           KEEP THE ORIGINAL VALUE OF RMXMN_6HR(3)            
             CMXMN_CD=.FALSE.
           ELSEIF(RTEMP_7PM.LT.RTEMP_9PM) THEN
             RMXMN_6HR(3)=RMAX_ABCD(3)
             CMXMN_CD=.FALSE.
           ELSE
C           THEY ARE EQUAL SO CHECK THE MIN TEMPS
             CMXMN_CD=.TRUE.
           ENDIF
         ELSE
C
C        THE NEEDED HOURLY OBS ARE MISSING SET RESFLD
C        TO MISSING AND GO TO END
C
           IF(IPRT.GE.1) THEN
             WRITE(KFILDO,*) '7 & 9 PM OBS ARE MISSING'
           ENDIF
C
           RESFLD=ZMISS
           GOTO 300
         ENDIF
       ENDIF
C
C
C        IF A CHECK OF THE MAX/MIN TEMP TRENDS IS NOT 
C        NEEDED WE CAN EVALUATE THE MIN/MAX AND GO TO
C        THE END
C
       IF((CMXMN_AB == .FALSE.).AND.
     1     (CMXMN_CD == .FALSE.)) THEN 
         IF(MXMN.EQ.1) THEN
           RESFLD=MINVAL(RMXMN_6HR)
         ELSEIF(MXMN.EQ.2) THEN
           RESFLD=MAXVAL(RMXMN_6HR)
         ENDIF
C
         IF(IPRT.GE.1) THEN
           IF(MXMN.EQ.1) THEN
             WRITE(KFILDO,*) 'FOR STATION= ',CCALL,
     1         'MIN FINALLY SET= ',RESFLD
           ELSEIF(MXMN.EQ.2) THEN
             WRITE(KFILDO,*) 'FOR STATION= ',CCALL,
     1         'MAX FINALLY SET= ',RESFLD
           ENDIF
         ENDIF
C
         GOTO 300
       ENDIF
C
       IF(CMXMN_AB == .TRUE.) THEN
         IF(MXMN.EQ.1) THEN
           IF(RMAX_ABCD(1).LT.RMAX_ABCD(2)) THEN
             RMXMN_6HR(1)=RMIN_ABCD(2)
           ENDIF 
         ELSEIF(MXMN.EQ.2) THEN
           IF(RMIN_ABCD(1).GT.RMIN_ABCD(2)) THEN
             RMXMN_6HR(1)=RMAX_ABCD(2)
           ENDIF
         ENDIF
       ENDIF
C
       IF(CMXMN_CD == .TRUE.) THEN             
         IF(MXMN.EQ.1) THEN
           IF(RMAX_ABCD(3).GT.RMAX_ABCD(4)) THEN
             RMXMN_6HR(3)=RMIN_ABCD(3)
           ENDIF
         ELSEIF(MXMN.EQ.2) THEN
           IF(RMIN_ABCD(3).LT.RMIN_ABCD(4)) THEN
             RMXMN_6HR(3)=RMAX_ABCD(3)
           ENDIF
         ENDIF
       ENDIF
C
C        NOW EVALUATE THE MIN/MAX
C
       IF(MXMN.EQ.1) THEN
         RESFLD=MINVAL(RMXMN_6HR)
       ELSEIF(MXMN.EQ.2) THEN
         RESFLD=MAXVAL(RMXMN_6HR)
       ENDIF
C
       IF(IPRT.GE.1) THEN
         IF(MXMN.EQ.1) THEN
           WRITE(KFILDO,*) 'FOR STATION= ',CCALL,
     1       'MIN FINALLY SET= ',RESFLD
         ELSEIF(MXMN.EQ.2) THEN
           WRITE(KFILDO,*) 'FOR STATION= ',CCALL,
     1       'MAX FINALLY SET= ',RESFLD
         ENDIF
       ENDIF
C
 300  CONTINUE
C
C        MAKE SURE RESFLD EQUALS 9999 IF THE VALUE IS
C        MISSING
C
      IF(NINT(ABS(RESFLD)).EQ.9999) THEN
        RESFLD=ZMISS
      ENDIF
C
      RETURN
      END SUBROUTINE MAXMIN_AK