SUBROUTINE READMT ( IMT, IMTV, IOGCE, IMTVL )

C$$$  SUBPROGRAM DOCUMENTATION BLOCK
C
C SUBPROGRAM:    READMT
C   PRGMMR: ATOR            ORG: NP12       DATE: 2009-03-23
C
C ABSTRACT:  THIS SUBROUTINE OPENS AND READS BUFR MASTER TABLES AS
C   SPECIFIED BY THE INPUT ARGUMENTS AND USING ADDITIONAL INFORMATION
C   AS WAS DEFINED IN THE MOST RECENT CALL TO BUFR ARCHIVE LIBRARY
C   SUBROUTINE MTINFO (OR AS WAS DEFINED WITHIN BUFR ARCHIVE LIBRARY
C   SUBROUTINE BFRINI, IF SUBROUTINE MTINFO WAS NEVER CALLED).
C
C PROGRAM HISTORY LOG:
C 2009-03-23  J. ATOR    -- ORIGINAL AUTHOR
C
C USAGE:    CALL READMT ( IMT, IMTV, IOGCE, IMTVL )
C   INPUT ARGUMENT LIST:
C     IMT      - INTEGER: MASTER TABLE NUMBER
C     IMTV     - INTEGER: MASTER TABLE VERSION NUMBER
C     IOGCE    - INTEGER: ORIGINATING CENTER
C     IMTVL    - INTEGER: LOCAL TABLE VERSION NUMBER
C
C   INPUT FILES:
C     UNITS 98,99  - IF SUBROUTINE MTINFO WAS NEVER CALLED, THEN THESE
C                    LOGICAL UNIT NUMBERS ARE USED BY THIS ROUTINE FOR
C                    OPENING AND READING THE BUFR MASTER TABLES.
C                    ALTERNATIVELY, IF SUBROUTINE MTINFO WAS CALLED,
C                    THEN THE LOGICAL UNIT NUMBERS SPECIFIED IN THE
C                    MOST RECENT CALL TO MTINFO (ARGUMENTS LUNMT1 AND
C                    LUNMT2) ARE USED INSTEAD.
C REMARKS:
C    THIS ROUTINE CALLS:        BORT2    ERRWRT   ICVIDX   IGETTDI
C                               RDMTBB   RDMTBD
C    THIS ROUTINE IS CALLED BY: READS3
C                               Not normally called by any application
C                               programs but it could be.
C
C ATTRIBUTES:
C   LANGUAGE: FORTRAN 77
C   MACHINE:  PORTABLE TO ALL PLATFORMS
C
C$$$

	INCLUDE 'bufrlib.prm'

	COMMON /QUIET/  IPRT
	COMMON /MSTINF/ LUN1, LUN2, LMTD, MTDIR
	COMMON /MSTABS/ NMTB, IBFXYN(MXMTBB), CBSCL(MXMTBB),
     .                        CBSREF(MXMTBB), CBBW(MXMTBB),
     .                        CBUNIT(MXMTBB), CBMNEM(MXMTBB),
     .                        CBELEM(MXMTBB),
     .                  NMTD, IDFXYN(MXMTBD), CDSEQ(MXMTBD),
     .			      CDMNEM(MXMTBD), NDELEM(MXMTBD),
     .			      IDEFXY(MXMTBD*MAXCD),
     .			      CDELEM(MXMTBD*MAXCD)

	DIMENSION	IMFXYB(MXMTBB), IMFXYD(MXMTBD),
     .			NMELEM(MXMTBD), IEFXYN(MXMTBD,MAXCD)
	CHARACTER*4	CMDSCB(MXMTBB), CMDSCD(MXMTBD),
     .			CBSCL, CMSCL(MXMTBB),
     .			CBBW, CMBW(MXMTBB)
	CHARACTER*8	CBMNEM, CMMNMB(MXMTBB),
     .			CDMNEM, CMMNMD(MXMTBD)
	CHARACTER*12	CBSREF, CMSREF(MXMTBB)
	CHARACTER*14	CBUNIT, CMUNIT(MXMTBB)
	CHARACTER*20	FMTF
	CHARACTER*100	MTDIR
	CHARACTER*120	CBELEM, CMELEM(MXMTBB),
     .			CDSEQ, CMSEQ(MXMTBD),
     .			CDELEM, CEELEM(MXMTBD,MAXCD)
	CHARACTER*128	BORT_STR
	CHARACTER*132	TBLFIL,STDFIL,LOCFIL1,LOCFIL2
	LOGICAL		FOUND

C-----------------------------------------------------------------------
C-----------------------------------------------------------------------

C*	Reset the scratch table D index for this master table.

	ITMP = IGETTDI ( 0 )

	IF ( IPRT .GE. 2 ) THEN
        CALL ERRWRT(' ')
	CALL ERRWRT('+++++++++++++++++++++++++++++++++++++++++++++++++')
	CALL ERRWRT('BUFRLIB: READMT - OPENING/READING MASTER TABLES')
	ENDIF

C*	Locate and open the master Table B files.  There should be one
C*	file of standard descriptors and one file of local descriptors.

C*	First locate and open the file of standard Table B descriptors.

	IF ( ( IMT .EQ. 0 ) .AND. ( IMTV .LE. 13 ) ) THEN

C*	  For master table 0, version 13 is a superset of all earlier
C*	  versions.

	  STDFIL = MTDIR(1:LMTD) // '/' // 'bufrtab.TableB_STD_0_13'
	ELSE
	  WRITE ( FMTF, '(A,I1,A,I1,A)' )
     .	     '(2A,I', ISIZE(IMT), ',A,I', ISIZE(IMTV), ')'
	  WRITE ( STDFIL, FMTF ) MTDIR(1:LMTD), '/bufrtab.TableB_STD_',
     .	     IMT, '_', IMTV
	ENDIF
	TBLFIL = STDFIL
	IF ( IPRT .GE. 2 ) THEN
	  CALL ERRWRT('Standard Table B:')
	  CALL ERRWRT(TBLFIL)
	ENDIF
	INQUIRE ( FILE = TBLFIL, EXIST = FOUND )
	IF ( .NOT. FOUND ) GOTO 900
	OPEN ( UNIT = LUN1, FILE = TBLFIL, IOSTAT = IER )
	IF ( IER .NE. 0 ) GOTO 901

C*	Now locate and open the file of local Table B descriptors.

C*	Use the local table corresponding to the originating center
C*	and local table version number of the current message, if such
C*	a table exists.  Otherwise use the NCEP local table B.

	LOCFIL2 = MTDIR(1:LMTD) // '/' // 'bufrtab.TableB_LOC_0_7_1'
	WRITE ( FMTF, '(A,I1,A,I1,A,I1,A)' )
     .	   '(2A,I', ISIZE(IMT), ',A,I', ISIZE(IOGCE),
     .	   ',A,I',  ISIZE(IMTVL), ')'
	WRITE ( LOCFIL1, FMTF ) MTDIR(1:LMTD), '/bufrtab.TableB_LOC_',
     .	   IMT, '_', IOGCE, '_', IMTVL
	TBLFIL = LOCFIL1
	IF ( IPRT .GE. 2 ) THEN
	  CALL ERRWRT('Local Table B:')
	  CALL ERRWRT(TBLFIL)
	ENDIF
	INQUIRE ( FILE = TBLFIL, EXIST = FOUND )
	IF ( .NOT. FOUND ) THEN

C*	  Use the NCEP local table B.

	  TBLFIL = LOCFIL2
	  IF ( IPRT .GE. 2 ) THEN
	    CALL ERRWRT('Local Table B not found, so using:')
	    CALL ERRWRT(TBLFIL)
	  ENDIF
	  INQUIRE ( FILE = TBLFIL, EXIST = FOUND )
	  IF ( .NOT. FOUND ) GOTO 900
	ENDIF
	OPEN ( UNIT = LUN2, FILE = TBLFIL, IOSTAT = IER )
	IF ( IER .NE. 0 ) GOTO 901

C*	Read the master Table B files.

	CALL RDMTBB ( LUN1, LUN2, MXMTBB,
     .		      IBMT, IBMTV, IBOGCE, IBLTV,
     .		      NMTBB, IMFXYB, CMSCL, CMSREF, CMBW,
     .		      CMUNIT, CMMNMB, CMDSCB, CMELEM )

C*	Save the output into COMMON /MSTABS/.

	NMTB = NMTBB
	DO I = 1, NMTB
	  IBFXYN(I) = IMFXYB(I)
	  CBSCL(I) = CMSCL(I)
	  CBSREF(I) = CMSREF(I)
	  CBBW(I) = CMBW(I)
	  CBUNIT(I) = CMUNIT(I)
	  CBMNEM(I) = CMMNMB(I)
	  CBELEM(I) = CMELEM(I)
	ENDDO

C*	Close the master Table B files.

	CLOSE ( UNIT = LUN1 )
	CLOSE ( UNIT = LUN2 )

C*	Locate and open the master Table D files.  There should be one
C*	file of standard descriptors and one file of local descriptors.

C*	First locate and open the file of standard Table D descriptors.

	TBLFIL = STDFIL
	TBLFIL(LMTD+15:LMTD+15) = 'D'
	IF ( IPRT .GE. 2 ) THEN
	  CALL ERRWRT('Standard Table D:')
	  CALL ERRWRT(TBLFIL)
	ENDIF
	INQUIRE ( FILE = TBLFIL, EXIST = FOUND )
	IF ( .NOT. FOUND ) GOTO 900
	OPEN ( UNIT = LUN1, FILE = TBLFIL, IOSTAT = IER )
	IF ( IER .NE. 0 ) GOTO 901

C*	Now locate and open the file of local Table D descriptors.

C*	Use the local table corresponding to the originating center
C*	and local table version number of the current message, if such
C*	a table exists.  Otherwise use the NCEP local table D.

	TBLFIL = LOCFIL1
	TBLFIL(LMTD+15:LMTD+15) = 'D'
	IF ( IPRT .GE. 2 ) THEN
	  CALL ERRWRT('Local Table D:')
	  CALL ERRWRT(TBLFIL)
	ENDIF
	INQUIRE ( FILE = TBLFIL, EXIST = FOUND )
	IF ( .NOT. FOUND ) THEN

C*	  Use the NCEP local table D.

	  TBLFIL = LOCFIL2
	  TBLFIL(LMTD+15:LMTD+15) = 'D'
	  IF ( IPRT .GE. 2 ) THEN
	    CALL ERRWRT('Local Table D not found, so using:')
	    CALL ERRWRT(TBLFIL)
	  ENDIF
	  INQUIRE ( FILE = TBLFIL, EXIST = FOUND )
	  IF ( .NOT. FOUND ) GOTO 900
	ENDIF
	OPEN ( UNIT = LUN2, FILE = TBLFIL, IOSTAT = IER )
	IF ( IER .NE. 0 ) GOTO 901

C*	Read the master Table D files.

	CALL RDMTBD ( LUN1, LUN2, MXMTBD, MAXCD,
     .		      IDMT, IDMTV, IDOGCE, IDLTV,
     .		      NMTBD, IMFXYD, CMMNMD, CMDSCD, CMSEQ,
     .		      NMELEM, IEFXYN, CEELEM )

C*	Save the output into COMMON /MSTABS/.

	NMTD = NMTBD
	DO I = 1, NMTD
	  IDFXYN(I) = IMFXYD(I)
	  CDMNEM(I) = CMMNMD(I)
	  CDSEQ(I) = CMSEQ(I)
	  NDELEM(I) = NMELEM(I)
	  DO J = 1, NDELEM(I)
	    IDX = ICVIDX ( I-1, J-1, MAXCD ) + 1
	    IDEFXY(IDX) = IEFXYN(I,J)
	    CDELEM(IDX) = CEELEM(I,J)
	  ENDDO
	ENDDO

C*	Close the master Table D files.

	CLOSE ( UNIT = LUN1 )
	CLOSE ( UNIT = LUN2 )

	IF ( IPRT .GE. 2 ) THEN
	CALL ERRWRT('+++++++++++++++++++++++++++++++++++++++++++++++++')
        CALL ERRWRT(' ')
	ENDIF

	RETURN
900	BORT_STR = 'BUFRLIB: READMT - COULD NOT FIND FILE:'
	CALL BORT2(BORT_STR,TBLFIL)
901	BORT_STR = 'BUFRLIB: READMT - COULD NOT OPEN FILE:'
	CALL BORT2(BORT_STR,TBLFIL)
	END