REAL*8 FUNCTION GETVALNB ( LUNIT, TAGPV, NTAGPV, TAGNB, NTAGNB )

C$$$  SUBPROGRAM DOCUMENTATION BLOCK
C
C SUBPROGRAM:    GETVALNB
C   PRGMMR: J. ATOR          ORG: NP12       DATE: 2012-09-12
C
C ABSTRACT:  THIS FUNCTION SHOULD ONLY BE CALLED WHEN A BUFR FILE IS
C   OPENED FOR INPUT, AND A SUBSET DEFINITION MUST ALREADY BE IN SCOPE
C   VIA A PREVIOUS CALL TO BUFR ARCHIVE LIBRARY SUBROUTINE READSB OR
C   EQUIVALENT.  THE FUNCTION WILL FIRST SEARCH FOR THE (NTAGPV)th
C   OCCURRENCE OF MNEMONIC TAGPV WITHIN THE OVERALL SUBSET DEFINITION,
C   COUNTING FROM THE BEGINNING OF THE SUBSET.  IF FOUND, IT WILL THEN
C   SEARCH FORWARD (IF NTAGNB IS POSITIVE) OR BACKWARD (IF NTAGNB IS
C   NEGATIVE) FROM THAT POINT WITHIN THE SUBSET FOR THE (NTAGNB)th
C   OCCURRENCE OF MNEMONIC TAGNB AND RETURN THE VALUE CORRESPONDING
C   TO THAT MNEMONIC. 
C
C PROGRAM HISTORY LOG:
C 2012-09-12  J. ATOR    -- ORIGINAL AUTHOR
C
C USAGE:    CALL GETVALNB (LUNIT, TAGPV, NTAGPV, TAGNB, NTAGNB)
C   INPUT ARGUMENT LIST:
C     LUNIT    - INTEGER: FORTRAN LOGICAL UNIT NUMBER FOR BUFR FILE
C     TAGPV    - CHARACTER*(*): PIVOT MNEMONIC; THE FUNCTION WILL
C                FIRST SEARCH FOR the (NTAGPV)th OCCURRENCE OF THIS
C                MNEMONIC, COUNTING FROM THE BEGINNING OF THE OVERALL
C                SUBSET DEFINITION
C     NTAGPV   - INTEGER: ORDINAL OCCURRENCE OF TAGPV TO SEARCH FOR
C     TAGNB    - CHARACTER*(*): NEARBY MNEMONIC; ASSUMING TAGPV IS
C                SUCCESSFULLY FOUND, THE FUNCTION WILL THEN SEARCH
C                NEARBY FOR THE (NTAGNB)th OCCURRENCE OF TAGNB AND
C                RETURN THE CORRESPONDING VALUE
C     NTAGNB   - INTEGER: ORDINAL OCCURRENCE OF TAGNB TO SEARCH FOR,
C                COUNTING FROM THE LOCATION OF TAGPV WITHIN THE OVERALL
C                SUBSET DEFINITION.  IF TAGNB IS POSITIVE, THE FUNCTION
C                WILL SEARCH IN A FORWARD DIRECTION FROM THE LOCATION OF
C                TAGPV, OR IF TAGNB IS NEGATIVE IT WILL INSTEAD SEARCH
C                IN A BACKWARDS DIRECTION.
C
C   OUTPUT ARGUMENT LIST:
C     GETVALNB - REAL*8: VALUE CORRESPONDING TO (NTAGNB)th OCCURRENCE
C                OF TAGNB.  IF FOR ANY REASON THIS VALUE CANNOT BE
C                LOCATED, THEN THE BUFR ARCHIVE LIBRARY MISSING VALUE
C                BMISS WILL BE RETURNED.
C
C REMARKS:
C    THIS ROUTINE CALLS:        PARSTR   STATUS
C    THIS ROUTINE IS CALLED BY: None
C                               Normally called only by application
C                               programs
C
C ATTRIBUTES:
C   LANGUAGE: FORTRAN 77
C   MACHINE:  PORTABLE TO ALL PLATFORMS
C
C$$$

	INCLUDE 'bufrlib.prm'

	COMMON /MSGCWD/ NMSG(NFILES),NSUB(NFILES),MSUB(NFILES),
     .                  INODE(NFILES),IDATE(NFILES)
	COMMON /TABLES/ MAXTAB,NTAB,TAG(MAXJL),TYP(MAXJL),KNT(MAXJL),
     .                  JUMP(MAXJL),LINK(MAXJL),JMPB(MAXJL),
     .                  IBT(MAXJL),IRF(MAXJL),ISC(MAXJL),
     .                  ITP(MAXJL),VALI(MAXJL),KNTI(MAXJL),
     .                  ISEQ(MAXJL,2),JSEQ(MAXJL)
	COMMON /USRINT/ NVAL(NFILES),INV(MAXSS,NFILES),VAL(MAXSS,NFILES)

	CHARACTER*10  TAG,TGS(15)
	CHARACTER*3   TYP

	CHARACTER*(*) TAGPV, TAGNB

	REAL*8 VAL

	LOGICAL GOTNODPV

	DATA MAXTG  /15/

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

	GETVALNB = BMISS

C	Get LUN from LUNIT.

	CALL STATUS(LUNIT,LUN,IL,IM)
	IF (IL.EQ.0) RETURN
	IF (INODE(LUN).NE.INV(1,LUN)) RETURN

C	Locate the (NTAGPV)th occurrence of TAGPV.

	CALL PARSTR(TAGPV,TGS,MAXTG,NTG,' ',.TRUE.)
	IF (NTG.NE.1) RETURN

	GOTNODPV = .FALSE.
	ITAGCT = 0
	N = 1
	DO WHILE ((.NOT.GOTNODPV).AND.(N.LE.NVAL(LUN)))
	    NOD = INV(N,LUN)
	    IF(TGS(1).EQ.TAG(NOD)) THEN
		ITAGCT = ITAGCT + 1
		IF(ITAGCT.EQ.NTAGPV) THEN
		    GOTNODPV = .TRUE.
		ELSE
	            N = N+1
		ENDIF
	    ELSE
	        N = N+1
	    ENDIF
	ENDDO
	IF (.NOT.GOTNODPV) RETURN

C	Starting from TAGPV, search nearby for the
C       +/-(NTAGNB)th occurrence of TAGNB.

	CALL PARSTR(TAGNB,TGS,MAXTG,NTG,' ',.TRUE.)
	IF (NTG.NE.1) RETURN

	ISTEP = ISIGN(1,NTAGNB)
	ITAGCT = 0
	N = N+ISTEP
	DO WHILE ((N.GE.1).AND.(N.LE.NVAL(LUN)))
	    NOD = INV(N,LUN)
	    IF(TGS(1).EQ.TAG(NOD)) THEN
		ITAGCT = ITAGCT + 1
		IF(ITAGCT.EQ.IABS(NTAGNB)) THEN
		    GETVALNB = VAL(N,LUN)
		    RETURN 
		ELSE
		    N = N+ISTEP
		ENDIF
	    ELSE
		N = N+ISTEP
	    ENDIF
	ENDDO
	    
	RETURN
	END