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