NCEPLIBS-g2  3.4.5
getg2i.f
Go to the documentation of this file.
1 C> @file
2 C> @brief This subroutine read a GRIB2 index file and return its content.
3 C> @author Mark Iredell @date 1995-10-31
4 C>
5 
6 C> READ A GRIB2 INDEX FILE AND RETURN ITS CONTENTS.
7 C> VERSION 1 OF THE INDEX FILE HAS THE FOLLOWING FORMAT:
8 C> 81-BYTE S.LORD HEADER WITH 'GB2IX1' IN COLUMNS 42-47 FOLLOWED BY
9 C> 81-BYTE HEADER WITH NUMBER OF BYTES TO SKIP BEFORE INDEX RECORDS,
10 C> TOTAL LENGTH IN BYTES OF THE INDEX RECORDS, NUMBER OF INDEX RECORDS,
11 C> AND GRIB FILE BASENAME WRITTEN IN FORMAT ('IX1FORM:',3I10,2X,A40).
12 C> EACH FOLLOWING INDEX RECORD CORRESPONDS TO A GRIB MESSAGE
13 C> AND HAS THE INTERNAL FORMAT:
14 C> - BYTE 001 - 004 LENGTH OF INDEX RECORD
15 C> - BYTE 005 - 008 BYTES TO SKIP IN DATA FILE BEFORE GRIB MESSAGE
16 C> - BYTE 009 - 012 BYTES TO SKIP IN MESSAGE BEFORE LUS (LOCAL USE)
17 C> SET = 0, IF NO LOCAL USE SECTION IN GRIB2 MESSAGE.
18 C> - BYTE 013 - 016 BYTES TO SKIP IN MESSAGE BEFORE GDS
19 C> - BYTE 017 - 020 BYTES TO SKIP IN MESSAGE BEFORE PDS
20 C> - BYTE 021 - 024 BYTES TO SKIP IN MESSAGE BEFORE DRS
21 C> - BYTE 025 - 028 BYTES TO SKIP IN MESSAGE BEFORE BMS
22 C> - BYTE 029 - 032 BYTES TO SKIP IN MESSAGE BEFORE DATA SECTION
23 C> - BYTE 033 - 040 BYTES TOTAL IN THE MESSAGE
24 C> - BYTE 041 - 041 GRIB VERSION NUMBER (CURRENTLY 2)
25 C> - BYTE 042 - 042 MESSAGE DISCIPLINE
26 C> - BYTE 043 - 044 FIELD NUMBER WITHIN GRIB2 MESSAGE
27 C> - BYTE 045 - II IDENTIFICATION SECTION (IDS)
28 C> - BYTE II+1- JJ GRID DEFINITION SECTION (GDS)
29 C> - BYTE JJ+1- KK PRODUCT DEFINITION SECTION (PDS)
30 C> - BYTE KK+1- LL THE DATA REPRESENTATION SECTION (DRS)
31 C> - BYTE LL+1-LL+6 FIRST 6 BYTES OF THE BIT MAP SECTION (BMS)
32 C>
33 C> PROGRAM HISTORY LOG:
34 C> - 1995-10-31 Mark Iredell
35 C> - 1996-10-31 Mark Iredell AUGMENTED OPTIONAL DEFINITIONS TO BYTE 320
36 C> - 2002-01-03 Stephen Gilbert MODIFIED FROM GETGI TO WORK WITH GRIB2
37 C>
38 C> @param[in] LUGI INTEGER UNIT OF THE UNBLOCKED GRIB INDEX FILE
39 C> @param[out] CBUF CHARACTER*1 POINTER TO A BUFFER THAT CONTAINS INDEX
40 C> RECORDS. USERS SHOULD FREE MEMORY THAT CBUF POINTS TO, USING
41 C> DEALLOCATE(CBUF) WHEN CBUF IS NO LONGER NEEDED.
42 C> @param[out] NLEN INTEGER TOTAL LENGTH OF ALL INDEX RECORDS
43 C> @param[out] NNUM INTEGER NUMBER OF INDEX RECORDS
44 C> @param[out] IRET INTEGER RETURN CODE
45 C> - 0 ALL OK
46 C> - 2 NOT ENOUGH MEMORY TO HOLD INDEX BUFFER
47 C> - 3 ERROR READING INDEX FILE BUFFER
48 C> - 4 ERROR READING INDEX FILE HEADER
49 C>
50 C> @note SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
51 C> DO NOT ENGAGE THE SAME LOGICAL UNIT FROM MORE THAN ONE PROCESSOR.
52 C>
53 C> @author Mark Iredell @date 2000-05-26
54 C>
55 
56  SUBROUTINE getg2i(LUGI,CBUF,NLEN,NNUM,IRET)
57 
58  CHARACTER(LEN=1),POINTER,DIMENSION(:) :: CBUF
59  INTEGER,INTENT(IN) :: LUGI
60  INTEGER,INTENT(OUT) :: NLEN,NNUM,IRET
61  CHARACTER CHEAD*162
62 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
63  IF (ASSOCIATED(cbuf)) NULLIFY(cbuf)
64 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
65  nlen=0
66  nnum=0
67  iret=4
68  CALL baread(lugi,0,162,lhead,chead)
69  IF(lhead.EQ.162.AND.chead(42:47).EQ.'GB2IX1') THEN
70  READ(chead(82:162),'(8X,3I10,2X,A40)',iostat=ios) nskp,nlen,nnum
71  IF(ios.EQ.0) THEN
72 
73  ALLOCATE(cbuf(nlen),stat=istat) ! ALLOCATE SPACE FOR CBUF
74  IF (istat.NE.0) THEN
75  iret=2
76  RETURN
77  ENDIF
78  iret=0
79  CALL baread(lugi,nskp,nlen,lbuf,cbuf)
80  IF(lbuf.NE.nlen) iret=3
81 
82  ENDIF
83  ENDIF
84 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
85  RETURN
86  END
getg2i
subroutine getg2i(LUGI, CBUF, NLEN, NNUM, IRET)
READ A GRIB2 INDEX FILE AND RETURN ITS CONTENTS.
Definition: getg2i.f:57