subroutine gf_unpack1(cgrib,lcgrib,iofst,ids,idslen,ierr),2
!$$$ SUBPROGRAM DOCUMENTATION BLOCK
! . . . .
! SUBPROGRAM: gf_unpack1
! PRGMMR: Gilbert ORG: W/NP11 DATE: 2000-05-26
!
! ABSTRACT: This subroutine unpacks Section 1 (Identification Section)
! starting at octet 6 of that Section.
!
! PROGRAM HISTORY LOG:
! 2000-05-26 Gilbert
! 2002-01-24 Gilbert - Changed to dynamically allocate arrays
! and to pass pointers to those arrays through
! the argument list.
!
! USAGE: CALL gf_unpack1(cgrib,lcgrib,iofst,ids,idslen,ierr)
! INPUT ARGUMENT LIST:
! cgrib - Character array containing Section 1 of the GRIB2 message
! lcgrib - Length (in bytes) of GRIB message array cgrib.
! iofst - Bit offset of the beginning of Section 1.
!
! OUTPUT ARGUMENT LIST:
! iofst - Bit offset at the end of Section 1, returned.
! ids - Pointer to integer array containing information read from
! Section 1, the Identification section.
! ids(1) = Identification of originating Centre
! ( see Common Code Table C-1 )
! ids(2) = Identification of originating Sub-centre
! ids(3) = GRIB Master Tables Version Number
! ( see Code Table 1.0 )
! ids(4) = GRIB Local Tables Version Number
! ( see Code Table 1.1 )
! ids(5) = Significance of Reference Time (Code Table 1.2)
! ids(6) = Year ( 4 digits )
! ids(7) = Month
! ids(8) = Day
! ids(9) = Hour
! ids(10) = Minute
! ids(11) = Second
! ids(12) = Production status of processed data
! ( see Code Table 1.3 )
! ids(13) = Type of processed data ( see Code Table 1.4 )
! idslen - Number of elements in ids().
! ierr - Error return code.
! 0 = no error
! 6 = memory allocation error
!
! REMARKS:
!
! ATTRIBUTES:
! LANGUAGE: Fortran 90
! MACHINE: IBM SP
!
!$$$
character(len=1),intent(in) :: cgrib(lcgrib)
integer,intent(in) :: lcgrib
integer,intent(inout) :: iofst
integer,pointer,dimension(:) :: ids
integer,intent(out) :: ierr,idslen
integer,dimension(:) :: mapid(13)
data mapid /2,2,1,1,1,2,1,1,1,1,1,1,1/
ierr=0
idslen=13
nullify(ids)
call gbyte
(cgrib,lensec,iofst,32) ! Get Length of Section
iofst=iofst+32
iofst=iofst+8 ! skip section number
!
! Unpack each value into array ids from the
! the appropriate number of octets, which are specified in
! corresponding entries in array mapid.
!
istat=0
allocate(ids(idslen),stat=istat)
if (istat.ne.0) then
ierr=6
nullify(ids)
return
endif
do i=1,idslen
nbits=mapid(i)*8
call gbyte
(cgrib,ids(i),iofst,nbits)
iofst=iofst+nbits
enddo
return ! End of Section 1 processing
end