1 C-----------------------------------------------------------------------
2 SUBROUTINE GETIDX
(LUGB
,LUGI
,CINDEX
,NLEN
,NNUM
,IRET
)
3 C$$$ SUBPROGRAM DOCUMENTATION BLOCK
5 C SUBPROGRAM: GETIDX FINDS, READS OR GENERATES A GRIB2 INDEX
6 C PRGMMR: GILBERT ORG: W/NP11 DATE: 2005-03-15
8 C ABSTRACT: FINDS, READS OR GENERATES A GRIB2 INDEX FOR THE GRIB2 FILE
9 C ASSOCIATED WITH UNIT LUGB. IF THE INDEX ALREADY EXISTS, IT IS RETURNED.
10 C OTHERWISE, THE INDEX IS (1) READ FROM AN EXISTING INDEXFILE ASSOCIATED WITH
11 C UNIT LUGI. OR (2) GENERATED FROM THE GRIB2FILE LUGB ( IF LUGI=0 ).
12 C USERS CAN FORCE A REGENERATION OF AN INDEX. IF LUGI EQUALS LUGB, THE INDEX
13 C WILL BE REGENERATED FROM THE DATA IN FILE LUGB. IF LUGI IS LESS THAN
14 C ZERO, THEN THE INDEX IS RE READ FROM INDEX FILE ABS(LUGI).
16 C PROGRAM HISTORY LOG:
18 C 2009-07-09 VUONG Fixed bug for checking (LUGB) unit index file
20 C USAGE: CALL GETIDX(LUGB,LUGI,CINDEX,NLEN,NNUM,IRET)
23 C LUGB INTEGER UNIT OF THE UNBLOCKED GRIB DATA FILE.
24 C FILE MUST BE OPENED WITH BAOPEN OR BAOPENR BEFORE CALLING
26 C LUGI INTEGER UNIT OF THE UNBLOCKED GRIB INDEX FILE.
27 C IF NONZERO, FILE MUST BE OPENED WITH BAOPEN BAOPENR BEFORE
28 C CALLING THIS ROUTINE.
29 C >0 - READ INDEX FROM INDEX FILE LUGI, IF INDEX DOESN"T
31 C =0 - TO GET INDEX BUFFER FROM THE GRIB FILE, IF INDEX
32 C DOESN"T ALREADY EXIST.
33 C <0 - FORCE REREAD OF INDEX FROM INDEX FILE ABS(LUGI).
34 C =LUGB - FORCE REGENERATION OF INDEX FROM GRIB2 FILE LUGB.
37 C CINDEX CHARACTER*1 POINTER TO A BUFFER THAT CONTAINS INDEX RECORDS.
38 C NLEN INTEGER TOTAL LENGTH OF ALL INDEX RECORDS
39 C NNUM INTEGER NUMBER OF INDEX RECORDS
40 C IRET INTEGER RETURN CODE
42 C 90 UNIT NUMBER OUT OF RANGE
43 C 96 ERROR READING/CREATING INDEX FILE
46 C GETG2I READ INDEX FILE
47 C GETG2IR READ INDEX BUFFER FROM GRIB FILE
53 C LANGUAGE: FORTRAN 90
57 INTEGER,INTENT
(IN
) :: LUGB
,LUGI
58 INTEGER,INTENT
(OUT
) :: NLEN
,NNUM
,IRET
59 CHARACTER(LEN
=1),POINTER
,DIMENSION(:) :: CINDEX
61 INTEGER,PARAMETER :: MAXIDX
=100
62 INTEGER,PARAMETER :: MSK1
=32000,MSK2
=4000
67 character(len
=1),pointer
,dimension(:) :: cbuf
70 TYPE
(GINDEX
),SAVE
:: IDXLIST
(100)
73 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
74 C DECLARE INTERFACES (REQUIRED FOR CBUF POINTER)
76 SUBROUTINE GETG2I
(LUGI
,CBUF
,NLEN
,NNUM
,IRET
)
77 CHARACTER(LEN
=1),POINTER
,DIMENSION(:) :: CBUF
78 INTEGER,INTENT
(IN
) :: LUGI
79 INTEGER,INTENT
(OUT
) :: NLEN
,NNUM
,IRET
81 SUBROUTINE GETG2IR
(LUGB
,MSK1
,MSK2
,MNUM
,CBUF
,NLEN
,NNUM
,
83 CHARACTER(LEN
=1),POINTER
,DIMENSION(:) :: CBUF
84 INTEGER,INTENT
(IN
) :: LUGB
,MSK1
,MSK2
,MNUM
85 INTEGER,INTENT
(OUT
) :: NLEN
,NNUM
,NMESS
,IRET
86 END SUBROUTINE GETG2IR
89 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
90 C DETERMINE WHETHER INDEX BUFFER NEEDS TO BE INITIALIZED
93 IF ( LUGB
.LE
.0 .OR
. LUGB
.GT
.100 ) THEN
97 IF (LUGI
.EQ
.LUGB
) THEN ! Force regeneration of index from GRIB2 File
98 IF ( ASSOCIATED
( IDXLIST
(LUGB
)%CBUF
) )
99 & DEALLOCATE
(IDXLIST
(LUGB
)%CBUF
)
100 NULLIFY
(IDXLIST
(LUGB
)%CBUF
)
105 IF (LUGI
.LT
.0) THEN ! Force re
-read of index from indexfile
106 ! associated with unit abs
(lugi
)
107 IF ( ASSOCIATED
( IDXLIST
(LUGB
)%CBUF
) )
108 & DEALLOCATE
(IDXLIST
(LUGB
)%CBUF
)
109 NULLIFY
(IDXLIST
(LUGB
)%CBUF
)
114 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
115 C Check if index already exists in memory
116 IF ( ASSOCIATED
( IDXLIST
(LUGB
)%CBUF
) ) THEN
117 CINDEX
=> IDXLIST
(LUGB
)%CBUF
118 NLEN
= IDXLIST
(LUGB
)%NLEN
119 NNUM
= IDXLIST
(LUGB
)%NNUM
122 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
125 CALL GETG2I
(LUX
,IDXLIST
(LUGB
)%CBUF
,NLEN
,NNUM
,IRGI
)
126 ELSEIF
(LUX
.LE
.0) THEN
128 CALL GETG2IR
(LUGB
,MSK1
,MSK2
,MSKP
,IDXLIST
(LUGB
)%CBUF
,
129 & NLEN
,NNUM
,NMESS
,IRGI
)
132 CINDEX
=> IDXLIST
(LUGB
)%CBUF
133 IDXLIST
(LUGB
)%NLEN
= NLEN
134 IDXLIST
(LUGB
)%NNUM
= NNUM
141 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
142 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -