Add new fields XLAT_C and XLONG_C
[WPS-merge.git] / ungrib / src / ngl / g2 / gf_unpack1.f
blob9b3cb1bfab26e9ff0827ee623614f33aece368bb
1 subroutine gf_unpack1(cgrib,lcgrib,iofst,ids,idslen,ierr)
2 !$$$ SUBPROGRAM DOCUMENTATION BLOCK
3 ! . . . .
4 ! SUBPROGRAM: gf_unpack1
5 ! PRGMMR: Gilbert ORG: W/NP11 DATE: 2000-05-26
7 ! ABSTRACT: This subroutine unpacks Section 1 (Identification Section)
8 ! starting at octet 6 of that Section.
10 ! PROGRAM HISTORY LOG:
11 ! 2000-05-26 Gilbert
12 ! 2002-01-24 Gilbert - Changed to dynamically allocate arrays
13 ! and to pass pointers to those arrays through
14 ! the argument list.
16 ! USAGE: CALL gf_unpack1(cgrib,lcgrib,iofst,ids,idslen,ierr)
17 ! INPUT ARGUMENT LIST:
18 ! cgrib - Character array containing Section 1 of the GRIB2 message
19 ! lcgrib - Length (in bytes) of GRIB message array cgrib.
20 ! iofst - Bit offset of the beginning of Section 1.
22 ! OUTPUT ARGUMENT LIST:
23 ! iofst - Bit offset at the end of Section 1, returned.
24 ! ids - Pointer to integer array containing information read from
25 ! Section 1, the Identification section.
26 ! ids(1) = Identification of originating Centre
27 ! ( see Common Code Table C-1 )
28 ! ids(2) = Identification of originating Sub-centre
29 ! ids(3) = GRIB Master Tables Version Number
30 ! ( see Code Table 1.0 )
31 ! ids(4) = GRIB Local Tables Version Number
32 ! ( see Code Table 1.1 )
33 ! ids(5) = Significance of Reference Time (Code Table 1.2)
34 ! ids(6) = Year ( 4 digits )
35 ! ids(7) = Month
36 ! ids(8) = Day
37 ! ids(9) = Hour
38 ! ids(10) = Minute
39 ! ids(11) = Second
40 ! ids(12) = Production status of processed data
41 ! ( see Code Table 1.3 )
42 ! ids(13) = Type of processed data ( see Code Table 1.4 )
43 ! idslen - Number of elements in ids().
44 ! ierr - Error return code.
45 ! 0 = no error
46 ! 6 = memory allocation error
48 ! REMARKS:
50 ! ATTRIBUTES:
51 ! LANGUAGE: Fortran 90
52 ! MACHINE: IBM SP
54 !$$$
56 character(len=1),intent(in) :: cgrib(lcgrib)
57 integer,intent(in) :: lcgrib
58 integer,intent(inout) :: iofst
59 integer,pointer,dimension(:) :: ids
60 integer,intent(out) :: ierr,idslen
62 integer,dimension(:) :: mapid(13)
64 data mapid /2,2,1,1,1,2,1,1,1,1,1,1,1/
66 ierr=0
67 idslen=13
68 nullify(ids)
70 call gbyte(cgrib,lensec,iofst,32) ! Get Length of Section
71 iofst=iofst+32
72 iofst=iofst+8 ! skip section number
74 ! Unpack each value into array ids from the
75 ! the appropriate number of octets, which are specified in
76 ! corresponding entries in array mapid.
78 istat=0
79 allocate(ids(idslen),stat=istat)
80 if (istat.ne.0) then
81 ierr=6
82 nullify(ids)
83 return
84 endif
86 do i=1,idslen
87 nbits=mapid(i)*8
88 call gbyte(cgrib,ids(i),iofst,nbits)
89 iofst=iofst+nbits
90 enddo
92 return ! End of Section 1 processing
93 end