subroutine gf_unpack2(cgrib,lcgrib,iofst,lencsec2,csec2,ierr),2
!$$$ SUBPROGRAM DOCUMENTATION BLOCK
! . . . .
! SUBPROGRAM: gf_unpack2
! PRGMMR: Gilbert ORG: W/NP11 DATE: 2002-04-09
!
! ABSTRACT: This subroutine unpacks Section 2 (Local Use Section)
! as defined in GRIB Edition 2.
!
! PROGRAM HISTORY LOG:
! 2002-04-09 Gilbert
!
! USAGE: CALL gf_unpack2(cgrib,lcgrib,iofst,lencsec2,csec2,ierr)
! INPUT ARGUMENT LIST:
! cgrib - Character array containing Section 2 of the GRIB2 message
! lcgrib - Length (in bytes) of GRIB message array cgrib.
! iofst - Bit offset of the beginning of Section 2.
!
! OUTPUT ARGUMENT LIST:
! iofst - Bit offset at the end of Section 2, returned.
! lencsec2 - Length (in octets) of Local Use data
! csec2() - Pointer to a character*1 array containing local use data
! ierr - Error return code.
! 0 = no error
! 2 = Array passed is not section 2
! 6 = memory allocation error
!
! REMARKS: None
!
! ATTRIBUTES:
! LANGUAGE: Fortran 90
! MACHINE: IBM SP
!
!$$$
character(len=1),intent(in) :: cgrib(lcgrib)
integer,intent(in) :: lcgrib
integer,intent(inout) :: iofst
integer,intent(out) :: lencsec2
integer,intent(out) :: ierr
character(len=1),pointer,dimension(:) :: csec2
ierr=0
lencsec2=0
nullify(csec2)
call gbyte
(cgrib,lensec,iofst,32) ! Get Length of Section
iofst=iofst+32
lencsec2=lensec-5
call gbyte
(cgrib,isecnum,iofst,8) ! Get Section Number
iofst=iofst+8
ipos=(iofst/8)+1
if ( isecnum.ne.2 ) then
ierr=6
print *,'gf_unpack2: Not Section 2 data. '
return
endif
allocate(csec2(lencsec2),stat=istat)
if (istat.ne.0) then
ierr=6
nullify(csec2)
return
endif
csec2(1:lencsec2)=cgrib(ipos:ipos+lencsec2-1)
iofst=iofst+(lencsec2*8)
return ! End of Section 2 processing
end