C----------------------------------------------------------------------- SUBROUTINE GETGBSS(CBUF,NLEN,NNUM,J,JPDS,JGDS,JENS, & K,KPDS,KGDS,KENS,LSKIP,LGRIB,IRET) C$$$ SUBPROGRAM DOCUMENTATION BLOCK C C SUBPROGRAM: GETGB$S FINDS A GRIB MESSAGE C PRGMMR: IREDELL ORG: W/NMC23 DATE: 95-10-31 C C ABSTRACT: FIND A GRIB MESSAGE. C FIND IN THE INDEX FILE A REFERENCE TO THE GRIB MESSAGE REQUESTED. C THE GRIB MESSAGE REQUEST SPECIFIES THE NUMBER OF MESSAGES TO SKIP C AND THE UNPACKED PDS AND GDS PARAMETERS. (A REQUESTED PARAMETER C OF -1 MEANS TO ALLOW ANY VALUE OF THIS PARAMETER TO BE FOUND.) C C PROGRAM HISTORY LOG: C 95-10-31 IREDELL C C USAGE: CALL GETGBSS(CBUF,NLEN,NNUM,J,JPDS,JGDS,JENS, C & K,KPDS,KGDS,KENS,LSKIP,LGRIB,IRET) C INPUT ARGUMENTS: C CBUF CHARACTER*1 (NLEN*NNUM) BUFFER CONTAINING INDEX DATA C NLEN INTEGER LENGTH OF EACH INDEX RECORD IN BYTES C NNUM INTEGER NUMBER OF INDEX RECORDS C J INTEGER NUMBER OF MESSAGES TO SKIP C (=0 TO SEARCH FROM BEGINNING) C (<0 TO REOPEN INDEX FILE AND SEARCH FROM BEGINNING) C JPDS INTEGER (25) PDS PARAMETERS FOR WHICH TO SEARCH C (=-1 FOR WILDCARD) C JGDS INTEGER (22) GDS PARAMETERS FOR WHICH TO SEARCH C (ONLY SEARCHED IF JPDS(3)=255) C (=-1 FOR WILDCARD) C JENS INTEGER (5) ENSEMBLE PDS PARMS FOR WHICH TO SEARCH C (ONLY SEARCHED IF JPDS(23)=2) C (=-1 FOR WILDCARD) C OUTPUT ARGUMENTS: C K INTEGER MESSAGE NUMBER FOUND C (CAN BE SAME AS J IN CALLING PROGRAM C IN ORDER TO FACILITATE MULTIPLE SEARCHES) C KPDS INTEGER (25) UNPACKED PDS PARAMETERS C KGDS INTEGER (22) UNPACKED GDS PARAMETERS C KENS INTEGER (5) UNPACKED ENSEMBLE PDS PARMS C LSKIP INTEGER NUMBER OF BYTES TO SKIP C LGRIB INTEGER NUMBER OF BYTES TO READ C IRET INTEGER RETURN CODE C 0 ALL OK C 1 REQUEST NOT FOUND C C REMARKS: SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT. C THIS SUBPROGRAM IS INTENDED FOR PRIVATE USE BY GETGB ROUTINES ONLY. C C SUBPROGRAMS CALLED: C GBYTEC UNPACK BYTES C FI632 UNPACK PDS C FI633 UNPACK GDS C PDSEUP UNPACK PDS EXTENSION C C ATTRIBUTES: C LANGUAGE: FORTRAN 77 C MACHINE: CRAY, WORKSTATIONS C C$$$ CHARACTER CBUF(NLEN*NNUM) INTEGER JPDS(25),JGDS(22),JENS(5),KPDS(25),KGDS(22),KENS(5) PARAMETER(LPDS=23,LGDS=22) CHARACTER CPDS(80)*1,CGDS(80)*1, tt*1 INTEGER KPTR(16) INTEGER IPDSP(LPDS),JPDSP(LPDS),IGDSP(LGDS),JGDSP(LGDS) INTEGER IENSP(5),JENSP(5) C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C COMPRESS REQUEST LISTS do i = 1, nnum*nlen tt = cbuf(i) cbuf(i) = tt enddo K=J LSKIP=0 LGRIB=0 IRET=1 C COMPRESS PDS REQUEST LPDSP=0 DO I=1,LPDS IF(JPDS(I).NE.-1) THEN LPDSP=LPDSP+1 IPDSP(LPDSP)=I JPDSP(LPDSP)=JPDS(I) ENDIF ENDDO C COMPRESS GDS REQUEST LGDSP=0 IF(JPDS(3).EQ.255) THEN DO I=1,LGDS IF(JGDS(I).NE.-1) THEN LGDSP=LGDSP+1 IGDSP(LGDSP)=I JGDSP(LGDSP)=JGDS(I) ENDIF ENDDO ENDIF C COMPRESS ENS REQUEST LENSP=0 IF(JPDS(23).EQ.2) THEN DO I=1,5 IF(JENS(I).NE.-1) THEN LENSP=LENSP+1 IENSP(LENSP)=I JENSP(LENSP)=JENS(I) ENDIF ENDDO ENDIF C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C SEARCH FOR REQUEST DOWHILE(IRET.NE.0.AND.K.LT.NNUM) K=K+1 LT=0 C SEARCH FOR PDS REQUEST IF(LPDSP.GT.0) THEN DO I=1,28 CPDS(I)=CBUF((K-1)*NLEN+25+I) ENDDO DO I=1,16 KPTR(I)=0 ENDDO CALL GBYTEC(CBUF,KPTR(3),(K-1)*NLEN*8+25*8,3*8) KPDS(18)=1 CALL GBYTEC(CPDS,KPDS(4),7*8,8) CALL FI632(CPDS,KPTR,KPDS,IRET) DO I=1,LPDSP IP=IPDSP(I) LT=LT+ABS(JPDS(IP)-KPDS(IP)) ENDDO ENDIF C SEARCH FOR GDS REQUEST IF(LT.EQ.0.AND.LGDSP.GT.0) THEN DO I=1,42 CGDS(I)=CBUF((K-1)*NLEN+53+I) ENDDO DO I=1,16 KPTR(I)=0 ENDDO CALL FI633(CGDS,KPTR,KGDS,IRET) DO I=1,LGDSP IP=IGDSP(I) LT=LT+ABS(JGDS(IP)-KGDS(IP)) ENDDO ENDIF C SEARCH FOR ENS REQUEST IF(LT.EQ.0.AND.LENSP.GT.0) THEN DO I=1,40 CPDS(40+I)=CBUF((K-1)*NLEN+112+I) ENDDO CALL PDSEUP(KENS,KPROB,XPROB,KCLUST,KMEMBR,45,CPDS) DO I=1,LENSP IP=IENSP(I) LT=LT+ABS(JENS(IP)-KENS(IP)) ENDDO ENDIF C RETURN IF REQUEST IS FOUND IF(LT.EQ.0) THEN CALL GBYTEC(CBUF,LSKIP,(K-1)*NLEN*8,4*8) CALL GBYTEC(CBUF,LGRIB,(K-1)*NLEN*8+20*8,4*8) IF(LGDSP.EQ.0) THEN DO I=1,42 CGDS(I)=CBUF((K-1)*NLEN+53+I) ENDDO DO I=1,16 KPTR(I)=0 ENDDO CALL FI633(CGDS,KPTR,KGDS,IRET) ENDIF IF(KPDS(23).EQ.2.AND.LENSP.EQ.0) THEN DO I=1,40 CPDS(40+I)=CBUF((K-1)*NLEN+112+I) ENDDO CALL PDSEUP(KENS,KPROB,XPROB,KCLUST,KMEMBR,45,CPDS) ENDIF IRET=0 ENDIF ENDDO C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RETURN END