subroutine gf_unpack7(cgrib,lcgrib,iofst,igdsnum,igdstmpl,,8
& 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
#ifdef USE_JPEG2000
elseif (idrsnum.eq.40 .OR. idrsnum.eq.40000) then
call jpcunpack
(cgrib(ipos),lensec-5,idrstmpl,ndpts,fld)
#endif /* USE_JPEG2000 */
#ifdef USE_PNG
elseif (idrsnum.eq.41 .OR. idrsnum.eq.40010) then
call pngunpack
(cgrib(ipos),lensec-5,idrstmpl,ndpts,fld)
#endif /* USE_PNG */
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