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
19 C 2013-08-02 VUONG Removed SAVE and initial index buffer
21 C USAGE: CALL GETIDX(LUGB,LUGI,CINDEX,NLEN,NNUM,IRET)
24 C LUGB INTEGER UNIT OF THE UNBLOCKED GRIB DATA FILE.
25 C FILE MUST BE OPENED WITH BAOPEN OR BAOPENR BEFORE CALLING
27 C LUGI INTEGER UNIT OF THE UNBLOCKED GRIB INDEX FILE.
28 C IF NONZERO, FILE MUST BE OPENED WITH BAOPEN BAOPENR BEFORE
29 C CALLING THIS ROUTINE.
30 C >0 - READ INDEX FROM INDEX FILE LUGI, IF INDEX DOESN"T
32 C =0 - TO GET INDEX BUFFER FROM THE GRIB FILE, IF INDEX
33 C DOESN"T ALREADY EXIST.
34 C <0 - FORCE REREAD OF INDEX FROM INDEX FILE ABS(LUGI).
35 C =LUGB - FORCE REGENERATION OF INDEX FROM GRIB2 FILE LUGB.
38 C CINDEX CHARACTER*1 POINTER TO A BUFFER THAT CONTAINS INDEX RECORDS.
39 C NLEN INTEGER TOTAL LENGTH OF ALL INDEX RECORDS
40 C NNUM INTEGER NUMBER OF INDEX RECORDS
41 C IRET INTEGER RETURN CODE
43 C 90 UNIT NUMBER OUT OF RANGE
44 C 96 ERROR READING/CREATING INDEX FILE
47 C GETG2I READ INDEX FILE
48 C GETG2IR READ INDEX BUFFER FROM GRIB FILE
54 C LANGUAGE: FORTRAN 90
58 INTEGER,INTENT
(IN
) :: LUGB
,LUGI
59 INTEGER,INTENT
(OUT
) :: NLEN
,NNUM
,IRET
60 CHARACTER(LEN
=1),POINTER
,DIMENSION(:) :: CINDEX
62 INTEGER,PARAMETER :: MAXIDX
=100
63 INTEGER,PARAMETER :: MSK1
=32000,MSK2
=4000
68 character(len
=1),pointer
,dimension(:) :: cbuf
71 C TYPE(GINDEX),SAVE :: IDXLIST(100)
72 TYPE
(GINDEX
) :: IDXLIST
(100)
75 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
76 C DECLARE INTERFACES (REQUIRED FOR CBUF POINTER)
78 SUBROUTINE GETG2I
(LUGI
,CBUF
,NLEN
,NNUM
,IRET
)
79 CHARACTER(LEN
=1),POINTER
,DIMENSION(:) :: CBUF
80 INTEGER,INTENT
(IN
) :: LUGI
81 INTEGER,INTENT
(OUT
) :: NLEN
,NNUM
,IRET
83 SUBROUTINE GETG2IR
(LUGB
,MSK1
,MSK2
,MNUM
,CBUF
,NLEN
,NNUM
,
85 CHARACTER(LEN
=1),POINTER
,DIMENSION(:) :: CBUF
86 INTEGER,INTENT
(IN
) :: LUGB
,MSK1
,MSK2
,MNUM
87 INTEGER,INTENT
(OUT
) :: NLEN
,NNUM
,NMESS
,IRET
88 END SUBROUTINE GETG2IR
91 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
92 C DETERMINE WHETHER INDEX BUFFER NEEDS TO BE INITIALIZED
95 IF ( LUGB
.LE
.0 .OR
. LUGB
.GT
.100 ) THEN
99 IF (LUGI
.EQ
.LUGB
) THEN ! Force regeneration of index from GRIB2 File
100 IF ( ASSOCIATED
( IDXLIST
(LUGB
)%CBUF
) )
101 & DEALLOCATE
(IDXLIST
(LUGB
)%CBUF
)
102 NULLIFY
(IDXLIST
(LUGB
)%CBUF
)
108 IF ( ASSOCIATED
( IDXLIST
(LUGB
)%CBUF
) )
109 & DEALLOCATE
(IDXLIST
(LUGB
)%CBUF
)
111 IF (LUGI
.LT
.0) THEN ! Force re
-read of index from indexfile
112 ! associated with unit abs
(lugi
)
113 IF ( ASSOCIATED
( IDXLIST
(LUGB
)%CBUF
) )
114 & DEALLOCATE
(IDXLIST
(LUGB
)%CBUF
)
115 NULLIFY
(IDXLIST
(LUGB
)%CBUF
)
120 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
121 C Check if index already exists in memory
122 IF ( ASSOCIATED
( IDXLIST
(LUGB
)%CBUF
) ) THEN
123 CINDEX
=> IDXLIST
(LUGB
)%CBUF
124 NLEN
= IDXLIST
(LUGB
)%NLEN
125 NNUM
= IDXLIST
(LUGB
)%NNUM
128 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
131 CALL GETG2I
(LUX
,IDXLIST
(LUGB
)%CBUF
,NLEN
,NNUM
,IRGI
)
132 ELSEIF
(LUX
.LE
.0) THEN
134 CALL GETG2IR
(LUGB
,MSK1
,MSK2
,MSKP
,IDXLIST
(LUGB
)%CBUF
,
135 & NLEN
,NNUM
,NMESS
,IRGI
)
138 CINDEX
=> IDXLIST
(LUGB
)%CBUF
139 IDXLIST
(LUGB
)%NLEN
= NLEN
140 IDXLIST
(LUGB
)%NNUM
= NNUM
147 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
148 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -