subroutine gf_unpack7(cgrib,lcgrib,iofst,igdsnum,igdstmpl,
     & idrsnum,idrstmpl,ndpts,fld,ierr)
!$$$ SUBPROGRAM DOCUMENTATION BLOCK
! . . . .
! SUBPROGRAM: gf_unpack7
! PRGMMR: Gilbert ORG: W/NP11 DATE: 2002-01-24
!
! ABSTRACT: This subroutine unpacks GRIB2 Section 7 (Data Section).
!
! PROGRAM HISTORY LOG:
! 2002-01-24 Gilbert
! 2002-12-17 Gilbert - Added support for new templates using
! PNG and JPEG2000 algorithms/templates.
! 2004-12-29 Gilbert - Added check on comunpack return code.
!
! USAGE: CALL gf_unpack7(cgrib,lcgrib,iofst,igdsnum,igdstmpl,
! & idrsnum,idrstmpl,ndpts,fld,ierr)
! INPUT ARGUMENT LIST:
! cgrib - Character array that contains the GRIB2 message
! lcgrib - Length (in bytes) of GRIB message array cgrib.
! iofst - Bit offset of the beginning of Section 7.
! igdsnum - Grid Definition Template Number ( see Code Table 3.0)
! (Only required to unpack DRT 5.51)
! igdstmpl - Pointer to an integer array containing the data values for
! the specified Grid Definition
! Template ( N=igdsnum ). Each element of this integer
! array contains an entry (in the order specified) of Grid
! Definition Template 3.N
! (Only required to unpack DRT 5.51)
! idrsnum - Data Representation Template Number ( see Code Table 5.0)
! idrstmpl - Pointer to an integer array containing the data values for
! the specified Data Representation
! Template ( N=idrsnum ). Each element of this integer
! array contains an entry (in the order specified) of Data
! Representation Template 5.N
! ndpts - Number of data points unpacked and returned.
!
! OUTPUT ARGUMENT LIST:
! iofst - Bit offset at the end of Section 7, returned.
! fld() - Pointer to a real array containing the unpacked data field.
! ierr - Error return code.
! 0 = no error
! 4 = Unrecognized Data Representation Template
! 5 = One of GDT 3.50 through 3.53 required to unpack DRT 5.51
! 6 = memory allocation error
! 7 = corrupt section 7.
!
! REMARKS: None
!
! ATTRIBUTES:
! LANGUAGE: Fortran 90
! MACHINE: IBM SP
!
!$$$

      character(len=1),intent(in) :: cgrib(lcgrib)
      integer,intent(in) :: lcgrib,ndpts,igdsnum,idrsnum
      integer,intent(inout) :: iofst
      integer,pointer,dimension(:) :: igdstmpl,idrstmpl
      integer,intent(out) :: ierr
      real,pointer,dimension(:) :: fld


      ierr=0
      nullify(fld)

      call gbyte(cgrib,lensec,iofst,32) ! Get Length of Section
      iofst=iofst+32
      iofst=iofst+8 ! skip section number

      ipos=(iofst/8)+1
      istat=0
      allocate(fld(ndpts),stat=istat)
      if (istat.ne.0) then
         ierr=6
         return
      endif

      if (idrsnum.eq.0) then
        call simunpack(cgrib(ipos),lensec-5,idrstmpl,ndpts,fld)
      elseif (idrsnum.eq.2.or.idrsnum.eq.3) then
        call comunpack(cgrib(ipos),lensec-5,lensec,idrsnum,idrstmpl,
     & ndpts,fld,ier)
        if ( ier .NE. 0 ) then
           ierr=7
           return
        endif
      elseif (idrsnum.eq.50) then ! Spectral simple
        call simunpack(cgrib(ipos),lensec-5,idrstmpl,ndpts-1,
     & fld(2))
        ieee=idrstmpl(5)
        call rdieee(ieee,fld(1),1)
      elseif (idrsnum.eq.51) then ! Spectral complex
        if (igdsnum.ge.50.AND.igdsnum.le.53) then
          call specunpack(cgrib(ipos),lensec-5,idrstmpl,ndpts,
     & igdstmpl(1),igdstmpl(2),igdstmpl(3),fld)
        else
          print *,'gf_unpack7: Cannot use GDT 3.',igdsnum,
     & ' to unpack Data Section 5.51.'
          ierr=5
          nullify(fld)
          return
        endif

      elseif (idrsnum.eq.40 .OR. idrsnum.eq.40000) then
        call jpcunpack(cgrib(ipos),lensec-5,idrstmpl,ndpts,fld)


      elseif (idrsnum.eq.41 .OR. idrsnum.eq.40010) then
        call pngunpack(cgrib(ipos),lensec-5,idrstmpl,ndpts,fld)

      else
        print *,'gf_unpack7: Data Representation Template ',idrsnum,
     & ' not yet implemented.'
        ierr=4
        nullify(fld)
        return
      endif

      iofst=iofst+(8*lensec)

      return ! End of Section 7 processing
      end