SUBROUTINE RDBFDX(LUNIT,LUN) C$$$ SUBPROGRAM DOCUMENTATION BLOCK C C SUBPROGRAM: RDBFDX C PRGMMR: WOOLLEN ORG: NP20 DATE: 1994-01-06 C C ABSTRACT: BEGINNING AT THE CURRENT FILE POINTER LOCATION WITHIN LUNIT, C THIS SUBROUTINE READS A COMPLETE DICTIONARY TABLE (I.E. ONE OR MORE C ADJACENT BUFR DX (DICTIONARY) MESSAGES) INTO INTERNAL MEMORY ARRAYS C IN COMMON /TABABD/. C C PROGRAM HISTORY LOG: C 1994-01-06 J. WOOLLEN -- ORIGINAL AUTHOR C 1995-06-28 J. WOOLLEN -- INCREASED THE SIZE OF INTERNAL BUFR TABLE C ARRAYS IN ORDER TO HANDLE BIGGER FILES C 1996-12-17 J. WOOLLEN -- FIXED FOR SOME MVS COMPILER'S TREATMENT OF C INTERNAL READS (INCREASES PORTABILITY) C 1998-07-08 J. WOOLLEN -- REPLACED CALL TO CRAY LIBRARY ROUTINE C "ABORT" WITH CALL TO NEW INTERNAL BUFRLIB C ROUTINE "BORT"; CORRECTED SOME MINOR ERRORS C 1999-11-18 J. WOOLLEN -- THE NUMBER OF BUFR FILES WHICH CAN BE C OPENED AT ONE TIME INCREASED FROM 10 TO 32 C (NECESSARY IN ORDER TO PROCESS MULTIPLE C BUFR FILES UNDER THE MPI) C 2000-09-19 J. WOOLLEN -- MAXIMUM MESSAGE LENGTH INCREASED FROM C 10,000 TO 20,000 BYTES C 2003-11-04 S. BENDER -- ADDED REMARKS/BUFRLIB ROUTINE C INTERDEPENDENCIES C 2003-11-04 D. KEYSER -- UNIFIED/PORTABLE FOR WRF; ADDED C DOCUMENTATION (INCLUDING HISTORY); OUTPUTS C MORE COMPLETE DIAGNOSTIC INFO WHEN ROUTINE C TERMINATES ABNORMALLY C 2004-08-09 J. ATOR -- MAXIMUM MESSAGE LENGTH INCREASED FROM C 20,000 TO 50,000 BYTES C 2005-11-29 J. ATOR -- USE GETLENS, IUPBS01 AND RDMSGW C 2009-03-23 J. ATOR -- USE STNTBIA; MODIFY LOGIC TO HANDLE BUFR C TABLE MESSAGES ENCOUNTERED ANYWHERE IN THE C FILE (AND NOT JUST AT THE BEGINNING!) C 2012-09-15 J. WOOLLEN -- MODIFIED FOR C/I/O/BUFR INTERFACE; C REPLACE FORTRAN BACKSPACE WITH C BACKBUFR C C USAGE: CALL RDBFDX (LUNIT, LUN) C INPUT ARGUMENT LIST: C LUNIT - INTEGER: FORTRAN LOGICAL UNIT NUMBER FOR BUFR FILE C LUN - INTEGER: I/O STREAM INDEX INTO INTERNAL MEMORY ARRAYS C (ASSOCIATED WITH FILE CONNECTED TO LOGICAL UNIT LUNIT) C C INPUT FILES: C UNIT "LUNIT" - BUFR FILE C C REMARKS: C C THIS SUBROUTINE PERFORMS A FUNCTION SIMILAR TO BUFR ARCHIVE LIBRARY C SUBROUTINE RDUSDX, EXCEPT THAT RDUSDX READS FROM A FILE CONTAINING C A USER-SUPPLIED BUFR DICTIONARY TABLE IN CHARACTER FORMAT. SEE THE C DOCBLOCK IN RDUSDX FOR A DESCRIPTION OF THE ARRAYS THAT ARE FILLED C IN COMMON BLOCK /TABABD/. C C THIS SUBROUTINE PERFORMS A FUNCTION SIMILAR TO BUFR ARCHIVE LIBRARY C SUBROUTINE CPDXMM, EXCEPT THAT CPDXMM WRITES TO THE INTERNAL MEMORY C ARRAYS IN COMMON BLOCK /MSGMEM/, FOR USE WITH A FILE OF BUFR C MESSAGES THAT IS BEING READ AND STORED INTO INTERNAL MEMORY BY C BUFR ARCHIVE LIBRARY SUBROUTINE UFBMEM. C C THIS ROUTINE CALLS: BORT DXINIT ERRWRT IDXMSG C IUPBS3 MAKESTAB RDMSGW STBFDX C BACKBUFR C THIS ROUTINE IS CALLED BY: POSAPX READDX READMG C Normally not called by any application C programs. C C ATTRIBUTES: C LANGUAGE: FORTRAN 77 C MACHINE: PORTABLE TO ALL PLATFORMS C C$$$ INCLUDE 'bufrlib.prm' COMMON /QUIET/ IPRT DIMENSION MBAY(MXMSGLD4) CHARACTER*128 ERRSTR LOGICAL DONE C----------------------------------------------------------------------- C----------------------------------------------------------------------- CALL DXINIT(LUN,0) ICT = 0 DONE = .FALSE. C Read a complete dictionary table from LUNIT, as a set of one or C more DX dictionary messages. DO WHILE ( .NOT. DONE ) CALL RDMSGW ( LUNIT, MBAY, IER ) IF ( IER .EQ. -1 ) THEN C Don't abort for an end-of-file condition, since it may be C possible for a file to end with dictionary messages. C Instead, backspace the file pointer and let the calling C routine diagnose the end-of-file condition and deal with C it as it sees fit. call backbufr(lun) DONE = .TRUE. ELSE IF ( IER .EQ. -2 ) THEN GOTO 900 ELSE IF ( IDXMSG(MBAY) .NE. 1 ) THEN C This is a non-DX dictionary message. Assume we've reached C the end of the dictionary table, and backspace LUNIT so that C the next read (e.g. in the calling routine) will get this C same message. call backbufr(lun) DONE = .TRUE. ELSE IF ( IUPBS3(MBAY,'NSUB') .EQ. 0 ) THEN C This is a DX dictionary message, but it doesn't contain any C actual dictionary information. Assume we've reached the end C of the dictionary table. DONE = .TRUE. ELSE C Store this message into COMMON /TABABD/. ICT = ICT + 1 CALL STBFDX(LUN,MBAY) ENDIF ENDDO IF ( IPRT .GE. 2 ) THEN CALL ERRWRT('+++++++++++++++++++++++++++++++++++++++++++++++++') WRITE ( UNIT=ERRSTR, FMT='(A,I3,A)' ) . 'BUFRLIB: RDBFDX - STORED NEW DX TABLE CONSISTING OF (', . ICT, ') MESSAGES;' CALL ERRWRT(ERRSTR) ERRSTR = 'WILL APPLY THIS TABLE TO ALL SUBSEQUENT DATA IN '// . 'FILE UNTIL NEXT DX TABLE IS FOUND' CALL ERRWRT(ERRSTR) CALL ERRWRT('+++++++++++++++++++++++++++++++++++++++++++++++++') CALL ERRWRT(' ') ENDIF CALL MAKESTAB RETURN 900 CALL BORT('BUFRLIB: RDBFDX - ERROR READING A BUFR DICTIONARY '// . 'MESSAGE') END