SUBROUTINE QPF6P6(KFILDO,KFIL10,P,FD4,FD5,NX,NY,ND2X3,TRUNC, 1 ID,LSTORE,ND9,LITEMS,NWORDS,NDATE, 2 IS0,IS1,IS2,IS4,ND7, 3 IPACK,IWORK,ND5, 4 CORE,ND10,NBLOCK,NFETCH,L3264B,ISTOP,IER) C C AUGUST 2008 GLAHN MDL MOS-2000 C ADAPTED FROM CKPOP C SEPTEMBER 2011 G. WAGNER CHANGED FFF FOR 12-HOUR QPF TO C 380, FOR CONSISTANCY WITH THE C ID CURRENTLY USED IN OPERATIONS. C JUNE 2014 GLAHN ASSURED AN ERROR RETURNED IER NE 0 C AND ISTOP(1) INCREMENTED C C PURPOSE C TO COMPUTE A 12-H QPF GRID FROM TWO 6-H QPF GRIDS. C THE 6-H GRIDS SHOULD NOT CONTAIN NEGATIVE VALUES. C HOWEVER, AS WRITTEN TO INTERNAL STORAGE, THEY HAVE C NOT HAD SMALL VALUES SET TO ZERO. SO THAT HAS TO C BE DONE. C C CALLED WITH CCCFFF = 223380 FOR 12-H QPF. C ASSUMES CCCFFF = 223270 FOR 6-H QPF. C C DATA SET USE C KFILDO - UNIT NUMBER FOR OUTPUT (PRINT) FILE. (OUTPUT) C KFIL10 - UNIT NUMBER FOR RANDOM FILE ACCESS. (INPUT) C C VARIABLES C KFILDO = UNIT NUMBER FOR OUTPUT (PRINT) FILE. (INPUT) C KFIL10 = THE UNIT NUMBER FOR RANDOM FILE ACCESS. (INPUT) C P(IXY) = THE 12-H QPF GRID IS RETURNED (IXY=1,NX*NY). C (OUTPUT) C FD4(IXY) = WORK ARRAY (IXY=1,NX*NY) FOR THE ON-TIME C 6-H GRID. (INTERNAL) C FD5(IXY) = WORK ARRAY (IXY=1,NX*NY) FOR THE PREVIOUS C 6-H GRID. (INTERNAL) C NX = X-EXTENT OF THE GRIDS IN P( ), FD4( ), C AND FD5( ). (INPUT) C NY = Y-EXTENT OF THE GRIDS IN P( ), FD4( ), C AND FD5( ). (INPUT) C ALL ARRAYS ARE TREATED AS SINGLE DIMENSION C BECAUSE THEY ARE ALL OF THE SAME SIZE. C ND2X3 = THE SIZE OF THE ARRAYS P( ) FD4( ) AND C FD5( ). (INPUT) C TRUNC = THE TRUNCATION VALUE, PROBABLY = .999. C (INPUT) C ID(J) = THE 4-WORD ID OF THE 12-H QPF GRID C (J=1,4). (INPUT) C LSTORE(L,J) = THE ARRAY TO HOLD INFORMATION ABOUT THE DATA C STORED (L=1,12) (J=1,LITEMS). THIS IS C INITIALIZED TO ZERO AS NEEDED ON FIRST ENTRY C ONLY. (INPUT-OUTPUT) C L=1,4--THE 4 ID'S FOR THE DATA. C L=5 --LOCATION OF STORED DATA. WHEN IN CORE, C THIS IS THE LOCATION IN CORE( ) WHERE C THE DATA START. WHEN ON DISK, C THIS IS MINUS THE RECORD NUMBER WHERE C THE DATA START. C L=6 --THE NUMBER OF 4-BYTE WORDS STORED. C L=7 --2 FOR DATA PACKED IN TDL GRIB, 1 FOR NOT. C L=8 --THE DATE/TIME OF THE DATA IN FORMAT C YYYYMMDDHH. C L=9 --NUMBER OF TIMES DATA HAVE BEEN RETRIEVED. C COUNTED IN GFETCH. C L=10 --FOR U201, NSLAB, THE NUMBER OF THE SLAB C IN DIR( , ,L) AND IN NGRIDC( ,L) DEFINING C THE CHARACTERISTICS OF THIS GRID. C FOR OTHER ROUTINES NOT REQUIRING GRID C DEFINITIONS, THIS NUMBER MAY MEAN C SOMETHING ELSE. FOR INSTANCE, IN U600 IT C IS THE "MODEL NUMBER" OR SOURCE OF THE C DATA STORED. C L=11 --VARIOUS USES, DEPENDING ON PROGRAM. C L=12 --USED INITIALLY IN ESTABLISHING C MSTORE( , ). LATER USED AS A WAY OF C DETERMINING WHETHER TO KEEP THIS C VARIABLE. C ND9 = THE SECOND DIMENSION OF LSTORE( , ). (INPUT) C LITEMS = THE NUMBER OF ITEMS (COLUMNS) IN LSTORE( , ) C THAT ARE FILLED. (INPUT) C NWORDS = NUMBER OF WORDS RETURNED FROM GFETCH. C (INTERNAL) C NDATE = DATE/TIME OF THE DATA PROCESSED IN FORMAT C YYYYMMDDHH. THIS IS STORED IN LSTORE(8, ). C (INPUT) C IS0(J) = MOS-2000 GRIB SECTION 0 ID'S (J=1,4). C (INTERNAL) C IS1(J) = MOS-2000 GRIB SECTION 1 ID'S (J=1,21+). C (INTERNAL) C IS2(J) = MOS-2000 GRIB SECTION 2 ID'S (J=1,12). C (INTERNAL) C IS4(J) = MOS-2000 GRIB SECTION 4 ID'S (J=1,4). C (INTERNAL) C ND7 = DIMENSION OF IS0( ), IS1( ), IS2( ), AND C IS4( ). (INPUT) C IPACK(J) = WORK ARRAY FOR GFETCH (J=1,ND5). (INTERNAL) C IWORK(J) = WORK ARRAY FOR GFETCH (J=1,ND5). (INTERNAL) C ND5 = DIMENSION OF IPACK( ) AND WORK( ). (INPUT) C CORE(J) = THE LINEAR ARRAY WHERE THE DATA ARE TO BE C STORED, WHEN SPACE IS AVAILABLE (J=1,ND10). C (INPUT) C ND10 = DIMENSION OF CORE( ). (INPUT) C NBLOCK = THE BLOCK SIZE IN WORDS OF THE RANDOM DISK FILE. C (INPUT) C NFETCH = A COUNT OF THE NUMBER OF TIMES GFETCH IS C ENTERED. IT IS A RUNNING COUNT FROM THE C BEGINNING OF THE PROGRAM. (OUTPUT) C L3264B = INTEGER WORD LENGTH IN BITS OF MACHINE BEING C USED (EITHER 32 OR 64). (INPUT) C ISTOP(J) = ISTOP(1)--IS INCREMENTED BY 1 EACH TIME AN ERROR C OCCURS. C (INPUT/OUTPUT) C IER = STATUS RETURN. (OUTPUT) C 0 = GOOD RETURN. C OTHER VALUES FROM GFETCH. C LD(J) = THE VARIABLE IDS TO RETRIEVE BY GFETCH (J=1,4). C (INTERNAL) C NPACK = RETURNED FROM GFETCH. NOT NEEDED. (INTERNAL) C NSOURC = RETURNED FROM GFETCH. NOT NEEDED. (INTERNAL) C NTIMES = RETURNED FROM GFETCH. NOT NEEDED. (INTERNAL) C MISSP = RETURNED FROM GFETCH. NOT NEEDED. (INTERNAL) C MISSS = RETURNED FROM GFETCH. NOT NEEDED. (INTERNAL) C 1 2 3 4 5 6 7 X C C NON SYSTEM SUBROUTINES CALLED C NONE C DIMENSION ID(4) DIMENSION P(NX*NY),FD4(NX*NY),FD5(NX*NY) DIMENSION IPACK(ND5),IWORK(ND5) DIMENSION IS0(ND7),IS1(ND7),IS2(ND7),IS4(ND7) DIMENSION LSTORE(12,ND9) DIMENSION CORE(ND10) DIMENSION LD(4),ISTOP(6) C IER=0 C C CHECK THE CCCFFF = 223330. C D WRITE(KFILDO,103)(ID(J),J=1,4),NX,NY,TRUNC D103 FORMAT(/' AT 103 IN QPF6P6--(ID(J),J=1,4),NX,NY,TRUNC',6I10,F8.4) C IF(ID(1)/1000.NE.223380)THEN WRITE(KFILDO,105)(ID(J),J=1,4) 105 FORMAT(/' ****CCCFFF NOT CORRECT IN QPF6P6, ID = ', 1 3I10.9,I10.3, 2 '. COMPUTING 12-H QPF GRID ABORTED.') ISTOP(1)=ISTOP(1)+1 IER=103 GO TO 800 ENDIF C C GET THE 6-H QPF ANALYSIS WITH THE SAME TAU. C LD(1)=ID(1)-110000 LD(1)=LD(1)+2000 C THIS MAKES THE FFF OF 380 = 272 FOR 6-H QPF. LD(2)=ID(2) LD(3)=ID(3) LD(4)=ID(4) ITIME=0 CALL GFETCH(KFILDO,KFIL10,LD,7777,LSTORE,ND9,LITEMS, 1 IS0,IS1,IS2,IS4,ND7,IPACK,IWORK,FD4,ND2X3, 2 NWORDS,NPACK,NDATE,NTIMES,CORE,ND10, 3 NBLOCK,NFETCH,NSOURC,MISSP,MISSS,L3264B,ITIME, 4 IER) C IF(IER.NE.0)THEN WRITE(KFILDO,130)(LD(J),J=1,4) 130 FORMAT(/,' ****FIRST 6-H QPF NOT RETRIEVED BY GFETCH IN', 1 ' QPF6P6',2X,I9.9,1X,I9.9,1X,I9.9,1X,I10.3,/ 2 ' 12-H QPF GRID CANNOT BE COMPUTED.') ISTOP(1)=ISTOP(1)+1 GO TO 800 ENDIF C IF(NWORDS.NE.NX*NY)THEN WRITE(KFILDO,131)NWORDS,NX*NY 131 FORMAT(/,' ****NWORDS =',I6,' RETURNED FROM GFETCH', 1 ' NOT EQUAL TO NX*NY =',I6,' IN QPF6P6.'/ 2 ' 12-H QPF GRID CANNOT BE COMPUTED.') ISTOP(1)=ISTOP(1)+1 IER=777 GO TO 800 ENDIF C C GET THE 6-H QPF ANALYSIS WITH THE PREVIOUS 6-H TAU. C LD(3)=ID(3)-6 CALL GFETCH(KFILDO,KFIL10,LD,7777,LSTORE,ND9,LITEMS, 1 IS0,IS1,IS2,IS4,ND7,IPACK,IWORK,FD5,ND2X3, 2 NWORDS,NPACK,NDATE,NTIMES,CORE,ND10, 3 NBLOCK,NFETCH,NSOURC,MISSP,MISSS,L3264B,ITIME, 4 IER) C IF(IER.NE.0)THEN WRITE(KFILDO,140)(LD(J),J=1,4) 140 FORMAT(/,' ****SECOND 6-H QPF NOT RETRIEVED BY GFETCH IN', 1 ' QPF6P6',2X,I9.9,1X,I9.9,1X,I9.9,1X,I10.3,/ 2 ' 12-H QPF GRID CANNOT BE COMPUTED.') ISTOP(1)=ISTOP(1)+1 GO TO 800 ENDIF C IF(NWORDS.NE.NX*NY)THEN WRITE(KFILDO,141)NWORDS,NX*NY 141 FORMAT(/,' ****NWORDS =',I6,' RETURNED FROM GFETCH', 1 ' NOT EQUAL TO NX*NY =',I6,' IN QPF6P6.'/ 2 ' 12-H QPF GRID CANNOT BE COMPUTED.') ISTOP(1)=ISTOP(1)+1 IER=777 GO TO 800 ENDIF C C COMPUTE 12-H GRID. C DO 150 IXY=1,NX*NY C IF(FD4(IXY).GT.9998.9.OR.FD5(IXY).GT.9998.9)THEN P(IXY)=9999. ELSE CCCCCC IF(FD4(IXY).LE.TRUNC)FD4(IXY)=0. CCCCCC IF(FD5(IXY).LE.TRUNC)FD5(IXY)=0. CCCCC THE ARCHIVED 6-H QPFS WERE TRUNCATED BUT THE GRIDS CCCCC WRITTEN TO INTERNAL STORAGE WERE NOT. THIS SHOULD CCCCC MAKE THE 12-H QPF THE EXACT SUM OF THE TWO 6-H, CCCCC PROVIDED TRUNC IS THE SAME. P(IXY)=FD4(IXY)+FD5(IXY) ENDIF C 150 CONTINUE C GO TO 810 C 800 CONTINUE C C IF THE GRID CANNOT BE COMPUTSED, RETURN MISSINGS. C DO 805 IXY=1,NX*NY P(IXY)=9999. 805 CONTINUE C 810 RETURN END