SUBROUTINE EL_BUFR  ( iubfmn, idxbmf, irundt, seqnum, buhd,
     +			      cborg, bulldt, bbb, iret )
C************************************************************************
C* EL_BUFR								*
C*									*
C* This subroutine retrieves data from the interface arrays, converts	*
C* it into BUFR output, and then writes the BUFR output to the BUFR	*
C* output stream.							*
C*									*
C* EL_BUFR  ( IUBFMN, IRUNDT, SEQNUM, BUHD,				*
C*	      CBORG, BULLDT, BBB, IRET )				*
C*									*
C* Input parameters:							*
C*	IUBFMN		INTEGER		Logical unit number of messages	*
C*					file for BUFR output stream	*
C*	IDXBMF		INTEGER		Index of non-NCEP BUFR tables   *
C*                                      file used to read in the data   *
C*	IRUNDT (5)	INTEGER		Run date-time			*
C*					(YYYY, MM, DD, HH, MM)		*
C*	SEQNUM		CHAR*		Bulletin sequence number	*
C*	BUHD		CHAR*		Bulletin header			*
C*	CBORG		CHAR*		Bulletin originator		*
C*	BULLDT		CHAR*		Bulletin date-time		*
C*	BBB		CHAR*		Bulletin BBB indicator		*
C*									*
C* Output parameters:							*
C*	IRET		INTEGER		Return code:			*
C*					  0 = normal return		*
C**									*
C* Log:									*
C* J. Ator/NCEP		11/00						*
C* J. Ator/NCEP		05/01	Changed in response to EUMETSAT changes	*
C* J. Ator/NCEP		06/01	Use UT_WBFR and BUFR.CMN, clean up	*
C* J. Ator/NCEP		10/01	Simplify references to r8vals ( )	*
C* J. Ator/NCEP		01/02	GCLONG -> OGCE				*
C* J. Ator/NCEP         10/04   Add capability for Japan & EUMS HRV/HWW *
C* J. Ator/NCEP         02/05   Adjust for new SWCM values in NC005046	*
C* J. Ator/NCEP         07/05   Add capability for EUMS WVW		*
C* J. Ator/NCEP         09/06   Adjust for 3rd QC level in EUMG reports	*
C* S. Guan/NCEP         06/14   Add RPSEQ1 and MDPT2 to BUFR output     *
C* J. Ator/NCEP		01/18	Add capability for India		*
C* J. Ator/NCEP         09/20   Add capability to process 3-10-077 data *
C************************************************************************
	INCLUDE		'GEMPRM.PRM'
	INCLUDE		'elcmn.cmn'
        PARAMETER       ( MXMN = 10 )
C*
	CHARACTER	seqnum*8, buhd*8, cborg*8, bulldt*8, bbb*8,
     +			bfstyp*8
C*
	REAL*8		r8ary ( MXMN, 13 ), UT_RIBM
C*
	INTEGER		irundt (5)
C*
	INCLUDE		'ERMISS.FNC'
C*-----------------------------------------------------------------------
	iret = 0
C
C*	Set the BUFR message date-time.
C
	year = rivals ( iryear )
	rmth = rivals ( irmnth )
	days = rivals ( irdays )
	hour = rivals ( irhour )
	IF ( ( ERMISS ( year ) ) .or. ( ERMISS ( rmth ) ) .or.
     +	     ( ERMISS ( days ) ) .or. ( ERMISS ( hour ) ) ) THEN
	    RETURN
	END IF
	ibfdt = ( INT ( year ) * 1000000 ) + ( INT ( rmth ) * 10000 ) +
     +		( INT ( days ) * 100 ) + INT ( hour )
C
C*	Open a BUFR message for output.
C
	iswcm = INT ( rivals ( irswcm ) )
        igctr = INT ( rivals ( irgctr ) )
	bfstyp = '????????'
        IF ( igctr .eq. 34 ) THEN
	    IF ( iswcm .eq. 1 ) THEN
		bfstyp = 'NC005044'
	    ELSE IF ( iswcm .eq. 2 ) THEN
		bfstyp = 'NC005045'
	    ELSE IF ( ( iswcm .eq. 3 ) .or. ( iswcm .eq. 5 ) ) THEN
		bfstyp = 'NC005046'
	    END IF
	ELSE IF ( igctr .eq. 28 ) THEN
	    IF ( iswcm .eq. 1 )  THEN
		bfstyp = 'NC005024'
	    ELSE IF ( iswcm .eq. 2 ) THEN
		bfstyp = 'NC005025'
	    ELSE IF ( ( iswcm .eq. 3 ) .or. ( iswcm .eq. 5 ) ) THEN
		bfstyp = 'NC005026'
	    END IF
	ELSE
	    IF ( iswcm .eq. 1 ) THEN
                IF ( idxbmf .eq. 3 ) THEN
                  bfstyp = 'NC005067'
                ELSE
		  bfstyp = 'NC005064'
                END IF
	    ELSE IF ( iswcm .eq. 2 ) THEN
                IF ( idxbmf .eq. 3 ) THEN
                  bfstyp = 'NC005068'
                ELSE
		  bfstyp = 'NC005065'
                END IF
	    ELSE IF ( ( iswcm .eq. 3 ) .or. ( iswcm .eq. 5 ) ) THEN
                IF ( idxbmf .eq. 3 ) THEN
                  bfstyp = 'NC005069'
                ELSE
		  bfstyp = 'NC005066'
                END IF
	    END IF
	END IF
	IF ( bfstyp .eq. '????????' ) THEN
	    WRITE ( UNIT = logmsg, FMT = '(A, I2, A)' )
     +		'unexpected SWCM value of ', iswcm, ' in report'
	    CALL DC_WLOG ( 2, 'DC', 2, logmsg, ierwlg )
	    RETURN
	END IF
	CALL OPENMB ( iubfmn, bfstyp, ibfdt )
C
C*	Bulletin ID information.
C
	CALL UT_CIBF ( iubfmn, 'SEQNUM', seqnum, 8, iercbf )
	CALL UT_CIBF ( iubfmn, 'BUHD', buhd, 8, iercbf )
	CALL UT_CIBF ( iubfmn, 'BORG', cborg, 8, iercbf )
	CALL UT_CIBF ( iubfmn, 'BULTIM', bulldt, 8, iercbf )
	CALL UT_CIBF ( iubfmn, 'BBB', bbb, 8, iercbf )
C
C*	Report date-time.
C
	CALL UT_RIBF ( iubfmn, 'YEAR', rivals ( iryear ), ierrbf )
	CALL UT_RIBF ( iubfmn, 'MNTH', rivals ( irmnth ), ierrbf )
	CALL UT_RIBF ( iubfmn, 'DAYS', rivals ( irdays ), ierrbf )
C
C*	Corrected report indicator.
C
	corn = 0.0
	IF ( bbb (1:1) .eq. 'C' )  THEN
	    corn = 1.0
	END IF
	CALL UT_RIBF ( iubfmn, 'CORN', corn, ierrbf )
C
C*	Receipt date-time.
C
	CALL UT_RIBF ( iubfmn, 'RCYR', FLOAT ( irundt (1) ), ierrbf )
	CALL UT_RIBF ( iubfmn, 'RCMO', FLOAT ( irundt (2) ), ierrbf )
	CALL UT_RIBF ( iubfmn, 'RCDY', FLOAT ( irundt (3) ), ierrbf )
	CALL UT_RIBF ( iubfmn, 'RCHR', FLOAT ( irundt (4) ), ierrbf )
	CALL UT_RIBF ( iubfmn, 'RCMI', FLOAT ( irundt (5) ), ierrbf )
	CALL UT_RIBF ( iubfmn, 'RCTS', FLOAT ( 0 ), ierrbf )
C
C*      If this is a 3-10-077 report, then there's nothing further
C*      to be done here.
C
        IF ( idxbmf .eq. 3 ) RETURN
C
C*	Satellite identifier.
C
	CALL UT_RIBF ( iubfmn, 'SAID', rivals ( irsaid ), ierrbf )
C
C*	Satellite classification.
C
	CALL UT_RIBF ( iubfmn, 'SCLF', rivals ( irsclf ), ierrbf )
C
C*	Segment size at nadir in X direction.
C
	CALL UT_RIBF ( iubfmn, 'SSNX', rivals ( irssnx ), ierrbf )
C
C*	Segment size at nadir in Y direction.
C
	CALL UT_RIBF ( iubfmn, 'SSNY', rivals ( irssny ), ierrbf )
C
C*	Satellite zenith angle.
C
	CALL UT_RIBF ( iubfmn, 'SAZA', rivals ( irsaza ), ierrbf )
C
C*	Latitude.
C
	CALL UT_RIBF ( iubfmn, 'CLAT', rivals ( irslat ), ierrbf )
C
C*	Longitude.
C
	CALL UT_RIBF ( iubfmn, 'CLON', rivals ( irslon ), ierrbf )
C
C*	Satellite instrument used in data processing.
C
	CALL UT_RIBF ( iubfmn, 'SIDP', rivals ( irsidp ), ierrbf )
C
C*	Satellite derived wind calculation method.
C
	CALL UT_RIBF ( iubfmn, 'SWCM', rivals ( irswcm ), ierrbf )
C
C*	Satellite channel centre frequency.
C
	CALL UFBINT ( iubfmn, r8vals ( irsccf ), 1, 1, ierufb, 'SCCF')
C
C*	Satellite channel band width.
C
	CALL UFBINT ( iubfmn, r8vals ( irscbw ), 1, 1, ierufb, 'SCBW')
C
C*	Coldest cluster temperature.
C
	CALL UT_RIBF ( iubfmn, 'CCST', rivals ( irccst ), ierrbf )
C
C*	Store the QC parameters.
C
C*	Note that this logic and BUFR table design presume that the
C*	same generating center (i.e. OGCE) and generating application
C*	(i.e. GNAP) were used for all three QC parameters (e.g. PCCF,
C*	MAQC and NCTH) at a particular QC level.
C
C*	Reports from RJTD and EUMG contain 3 QC levels, whereas reports
C*	from EUMS contain 2.  For purposes of this routine, just always
C*	store 3 QC levels, and the last level for EUMS reports will
C*	just contain "missing" values.
C
	nqc = 3
C
C*	Generating center.
C
	r8ary ( 1, 1 ) = UT_RIBM ( rivals ( irgctr ) )
	DO ii = 1, nqc
	    r8ary ( 1,          ii + 1 ) =
     +		UT_RIBM ( rivals (irpccfgc(ii)) )
	    r8ary ( 1,    nqc + ii + 1 ) =
     +		UT_RIBM ( rivals (irpccfgc(ii)) )
	    r8ary ( 1, (2*nqc)+ ii + 1 ) =
     +		UT_RIBM ( rivals (irpccfgc(ii)) )
	    r8ary ( 1, (3*nqc)+ ii + 1 ) =
     +		UT_RIBM ( rivals (irpccfgc(ii)) )
	END DO
	CALL UFBREP ( iubfmn, r8ary, MXMN, ((4*nqc)+1), ierufb, 'OGCE' )
C
	DO ii = 1, nqc
C
C*	    Generating application.
C
	    r8ary ( 1,          ii ) = UT_RIBM ( rivals (irpccfga(ii)) )
	    r8ary ( 1,    nqc + ii ) = UT_RIBM ( rivals (irpccfga(ii)) )
	    r8ary ( 1, (2*nqc)+ ii ) = UT_RIBM ( rivals (irpccfga(ii)) )
	    r8ary ( 1, (3*nqc)+ ii ) = UT_RIBM ( rivals (irpccfga(ii)) )
C
C*	    Percent confidence.
C
	    r8ary ( 2,          ii ) = UT_RIBM ( rivals (irpccfpr(ii)) )
	    r8ary ( 2,    nqc + ii ) = UT_RIBM ( rivals (irpccfdr(ii)) )
	    r8ary ( 2, (2*nqc)+ ii ) = UT_RIBM ( rivals (irpccfsp(ii)) )
	    r8ary ( 2, (3*nqc)+ ii ) = UT_RIBM ( rivals (irpccfct(ii)) )
C
C*	    Manual/automatic quality control.
C
	    r8ary ( 3,          ii ) = UT_RIBM ( rivals (irmaqcpr(ii)) )
	    r8ary ( 3,    nqc + ii ) = UT_RIBM ( rivals (irmaqcdr(ii)) )
	    r8ary ( 3, (2*nqc)+ ii ) = UT_RIBM ( rivals (irmaqcsp(ii)) )
	    r8ary ( 3, (3*nqc)+ ii ) = UT_RIBM ( rivals (irmaqcct(ii)) )
C
C*	    Nominal confidence threshhold.
C
	    r8ary ( 4,          ii ) = UT_RIBM ( rivals (irncthpr(ii)) )
	    r8ary ( 4,    nqc + ii ) = UT_RIBM ( rivals (irncthdr(ii)) )
	    r8ary ( 4, (2*nqc)+ ii ) = UT_RIBM ( rivals (irncthsp(ii)) )
	    r8ary ( 4, (3*nqc)+ ii ) = UT_RIBM ( rivals (irncthct(ii)) )
	END DO
	CALL UFBREP ( iubfmn, r8ary, MXMN, (4*nqc), ierufb,
     +		'GNAP PCCF MAQC NCTH' )
C
C*      HOUR MINU SECO
C
        r8ary ( 1, 1 ) = UT_RIBM ( rivals ( irhour ) )
        r8ary ( 2, 1 ) = UT_RIBM ( rivals ( irminu ) )
        r8ary ( 3, 1 ) = UT_RIBM ( rivals ( irseco ) )
        DO ii = 1, 4
            r8ary ( 1, 2*ii ) = UT_RIBM ( rivals (irfthour(ii)) )
            r8ary ( 2, 2*ii ) = UT_RIBM ( rivals (irftminu(ii)) )
            r8ary ( 3, 2*ii ) = UT_RIBM ( rivals (irftseco(ii)) )
            r8ary ( 1, 2*ii+1 ) = UT_RIBM ( rivals (irsdhour(ii)) )
            r8ary ( 2, 2*ii+1 ) = UT_RIBM ( rivals (irsdminu(ii)) )
            r8ary ( 3, 2*ii+1 ) = UT_RIBM ( rivals (irsdseco(ii)) )
        END DO
        CALL UFBREP ( iubfmn, r8ary, 10, 9, ierufb,
     +          'HOUR MINU SECO' )
C
C*      Wind direction and wind speed.
C
        r8ary ( 1, 1 ) = UT_RIBM ( rivals ( irdrct ) )
        r8ary ( 2, 1 ) = UT_RIBM ( rivals ( irsped ) )
        DO ii = 1, 4
            r8ary ( 1, ii+1 ) = UT_RIBM ( rivals (irsdwdir(ii)) )
            r8ary ( 2, ii+1 ) = UT_RIBM ( rivals (irsdwspd(ii)) )
        END DO
        CALL UFBREP ( iubfmn, r8ary, 10, 5, ierufb,
     +          'WDIR WSPD' )
C
C*      Pressure.
C
        r8ary ( 1, 1 ) = PR_M100 ( rivals ( irpres ) ) 

        DO ii = 1, 10
            r8ary ( 1, ii+1 ) = PR_M100( rivals (irsprlc(ii)) )
        END DO
        CALL UFBREP ( iubfmn, r8ary, 10, 11, ierufb, 'PRLC' )
C
C*      RPSEQ1
C
        DO ii = 1, 4
            r8ary ( 1, 2*ii-1 ) = UT_RIBM ( rivals (irfttsig(ii)) )
            r8ary ( 1, 2*ii ) = UT_RIBM ( rivals (irsdtsig(ii)) )
        END DO
        CALL UFBREP ( iubfmn, r8ary, 10, 8, ierufb, 'TSIG' )
C
C*      MDPT
C
        DO ii = 1, 10
            r8ary ( 1, ii ) = UT_RIBM ( rivals (irshamd(ii)) )
            r8ary ( 2, ii ) = UT_RIBM ( rivals (irstmdbst(ii)) )
        END DO
        CALL UFBREP ( iubfmn, r8ary, MXMN, 10, ierufb,
     +          'HAMD TMDBST' )
C*
	RETURN
	END