Created a tag for the 2012 HWRF baseline tests.
[WPS.git] / hwrf-baseline-20120103-1354 / ungrib / src / ngl / w3 / getgbemp.f
blobb21b83ce3d3690c6415091babe42765f5a8b2152
1 C-----------------------------------------------------------------------
2 SUBROUTINE GETGBEMP(LUGB,LUGI,JG,J,JPDS,JGDS,JENS,
3 & MBUF,CBUF,NLEN,NNUM,MNUM,
4 & KG,K,KPDS,KGDS,KENS,G,IRET)
5 C$$$ SUBPROGRAM DOCUMENTATION BLOCK
7 C SUBPROGRAM: GETGBEMP FINDS A GRIB MESSAGE
8 C PRGMMR: IREDELL ORG: W/NMC23 DATE: 94-04-01
10 C ABSTRACT: FIND A GRIB MESSAGE.
11 C READ A GRIB INDEX FILE (OR OPTIONALLY THE GRIB FILE ITSELF)
12 C TO GET THE INDEX BUFFER (I.E. TABLE OF CONTENTS) FOR THE GRIB FILE.
13 C FIND IN THE INDEX BUFFER A REFERENCE TO THE GRIB MESSAGE REQUESTED.
14 C THE GRIB MESSAGE REQUEST SPECIFIES THE NUMBER OF MESSAGES TO SKIP
15 C AND THE UNPACKED PDS AND GDS PARAMETERS. (A REQUESTED PARAMETER
16 C OF -1 MEANS TO ALLOW ANY VALUE OF THIS PARAMETER TO BE FOUND.)
17 C IF THE REQUESTED GRIB MESSAGE IS FOUND, THEN IT IS READ FROM THE
18 C GRIB FILE. ITS MESSAGE NUMBER IS RETURNED ALONG WITH THE UNPACKED
19 C PDS AND GDS PARAMETERS AND THE PACKED GRIB MESSAGE. IF THE GRIB
20 C MESSAGE IS NOT FOUND, THEN THE RETURN CODE WILL BE NONZERO.
22 C PROGRAM HISTORY LOG:
23 C 94-04-01 IREDELL
24 C 95-10-31 IREDELL MODULARIZED PORTIONS OF CODE INTO SUBPROGRAMS
25 C AND ALLOWED FOR UNSPECIFIED INDEX FILE
27 C USAGE: CALL GETGBEMP(LUGB,LUGI,JG,J,JPDS,JGDS,JENS,
28 C & MBUF,CBUF,NLEN,NNUM,MNUM,
29 C & KG,K,KPDS,KGDS,KENS,G,IRET)
30 C INPUT ARGUMENTS:
31 C LUGB INTEGER UNIT OF THE UNBLOCKED GRIB DATA FILE
32 C LUGI INTEGER UNIT OF THE UNBLOCKED GRIB INDEX FILE
33 C (=0 TO GET INDEX BUFFER FROM THE GRIB FILE)
34 C JG INTEGER MAXIMUM NUMBER OF BYTES IN THE GRIB MESSAGE
35 C J INTEGER NUMBER OF MESSAGES TO SKIP
36 C (=0 TO SEARCH FROM BEGINNING)
37 C (<0 TO READ INDEX BUFFER AND SKIP -1-J MESSAGES)
38 C JPDS INTEGER (200) PDS PARAMETERS FOR WHICH TO SEARCH
39 C (=-1 FOR WILDCARD)
40 C (1) - ID OF CENTER
41 C (2) - GENERATING PROCESS ID NUMBER
42 C (3) - GRID DEFINITION
43 C (4) - GDS/BMS FLAG (RIGHT ADJ COPY OF OCTET 8)
44 C (5) - INDICATOR OF PARAMETER
45 C (6) - TYPE OF LEVEL
46 C (7) - HEIGHT/PRESSURE , ETC OF LEVEL
47 C (8) - YEAR INCLUDING (CENTURY-1)
48 C (9) - MONTH OF YEAR
49 C (10) - DAY OF MONTH
50 C (11) - HOUR OF DAY
51 C (12) - MINUTE OF HOUR
52 C (13) - INDICATOR OF FORECAST TIME UNIT
53 C (14) - TIME RANGE 1
54 C (15) - TIME RANGE 2
55 C (16) - TIME RANGE FLAG
56 C (17) - NUMBER INCLUDED IN AVERAGE
57 C (18) - VERSION NR OF GRIB SPECIFICATION
58 C (19) - VERSION NR OF PARAMETER TABLE
59 C (20) - NR MISSING FROM AVERAGE/ACCUMULATION
60 C (21) - CENTURY OF REFERENCE TIME OF DATA
61 C (22) - UNITS DECIMAL SCALE FACTOR
62 C (23) - SUBCENTER NUMBER
63 C (24) - PDS BYTE 29, FOR NMC ENSEMBLE PRODUCTS
64 C 128 IF FORECAST FIELD ERROR
65 C 64 IF BIAS CORRECTED FCST FIELD
66 C 32 IF SMOOTHED FIELD
67 C WARNING: CAN BE COMBINATION OF MORE THAN 1
68 C (25) - PDS BYTE 30, NOT USED
69 C JGDS INTEGER (200) GDS PARAMETERS FOR WHICH TO SEARCH
70 C (ONLY SEARCHED IF JPDS(3)=255)
71 C (=-1 FOR WILDCARD)
72 C (1) - DATA REPRESENTATION TYPE
73 C (19) - NUMBER OF VERTICAL COORDINATE PARAMETERS
74 C (20) - OCTET NUMBER OF THE LIST OF VERTICAL COORDINATE
75 C PARAMETERS
76 C OR
77 C OCTET NUMBER OF THE LIST OF NUMBERS OF POINTS
78 C IN EACH ROW
79 C OR
80 C 255 IF NEITHER ARE PRESENT
81 C (21) - FOR GRIDS WITH PL, NUMBER OF POINTS IN GRID
82 C (22) - NUMBER OF WORDS IN EACH ROW
83 C LATITUDE/LONGITUDE GRIDS
84 C (2) - N(I) NR POINTS ON LATITUDE CIRCLE
85 C (3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
86 C (4) - LA(1) LATITUDE OF ORIGIN
87 C (5) - LO(1) LONGITUDE OF ORIGIN
88 C (6) - RESOLUTION FLAG (RIGHT ADJ COPY OF OCTET 17)
89 C (7) - LA(2) LATITUDE OF EXTREME POINT
90 C (8) - LO(2) LONGITUDE OF EXTREME POINT
91 C (9) - DI LONGITUDINAL DIRECTION OF INCREMENT
92 C (10) - DJ LATITUDINAL DIRECTION INCREMENT
93 C (11) - SCANNING MODE FLAG (RIGHT ADJ COPY OF OCTET 28)
94 C GAUSSIAN GRIDS
95 C (2) - N(I) NR POINTS ON LATITUDE CIRCLE
96 C (3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
97 C (4) - LA(1) LATITUDE OF ORIGIN
98 C (5) - LO(1) LONGITUDE OF ORIGIN
99 C (6) - RESOLUTION FLAG (RIGHT ADJ COPY OF OCTET 17)
100 C (7) - LA(2) LATITUDE OF EXTREME POINT
101 C (8) - LO(2) LONGITUDE OF EXTREME POINT
102 C (9) - DI LONGITUDINAL DIRECTION OF INCREMENT
103 C (10) - N - NR OF CIRCLES POLE TO EQUATOR
104 C (11) - SCANNING MODE FLAG (RIGHT ADJ COPY OF OCTET 28)
105 C (12) - NV - NR OF VERT COORD PARAMETERS
106 C (13) - PV - OCTET NR OF LIST OF VERT COORD PARAMETERS
107 C OR
108 C PL - LOCATION OF THE LIST OF NUMBERS OF POINTS IN
109 C EACH ROW (IF NO VERT COORD PARAMETERS
110 C ARE PRESENT
111 C OR
112 C 255 IF NEITHER ARE PRESENT
113 C POLAR STEREOGRAPHIC GRIDS
114 C (2) - N(I) NR POINTS ALONG LAT CIRCLE
115 C (3) - N(J) NR POINTS ALONG LON CIRCLE
116 C (4) - LA(1) LATITUDE OF ORIGIN
117 C (5) - LO(1) LONGITUDE OF ORIGIN
118 C (6) - RESOLUTION FLAG (RIGHT ADJ COPY OF OCTET 17)
119 C (7) - LOV GRID ORIENTATION
120 C (8) - DX - X DIRECTION INCREMENT
121 C (9) - DY - Y DIRECTION INCREMENT
122 C (10) - PROJECTION CENTER FLAG
123 C (11) - SCANNING MODE (RIGHT ADJ COPY OF OCTET 28)
124 C SPHERICAL HARMONIC COEFFICIENTS
125 C (2) - J PENTAGONAL RESOLUTION PARAMETER
126 C (3) - K " " "
127 C (4) - M " " "
128 C (5) - REPRESENTATION TYPE
129 C (6) - COEFFICIENT STORAGE MODE
130 C MERCATOR GRIDS
131 C (2) - N(I) NR POINTS ON LATITUDE CIRCLE
132 C (3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
133 C (4) - LA(1) LATITUDE OF ORIGIN
134 C (5) - LO(1) LONGITUDE OF ORIGIN
135 C (6) - RESOLUTION FLAG (RIGHT ADJ COPY OF OCTET 17)
136 C (7) - LA(2) LATITUDE OF LAST GRID POINT
137 C (8) - LO(2) LONGITUDE OF LAST GRID POINT
138 C (9) - LATIT - LATITUDE OF PROJECTION INTERSECTION
139 C (10) - RESERVED
140 C (11) - SCANNING MODE FLAG (RIGHT ADJ COPY OF OCTET 28)
141 C (12) - LONGITUDINAL DIR GRID LENGTH
142 C (13) - LATITUDINAL DIR GRID LENGTH
143 C LAMBERT CONFORMAL GRIDS
144 C (2) - NX NR POINTS ALONG X-AXIS
145 C (3) - NY NR POINTS ALONG Y-AXIS
146 C (4) - LA1 LAT OF ORIGIN (LOWER LEFT)
147 C (5) - LO1 LON OF ORIGIN (LOWER LEFT)
148 C (6) - RESOLUTION (RIGHT ADJ COPY OF OCTET 17)
149 C (7) - LOV - ORIENTATION OF GRID
150 C (8) - DX - X-DIR INCREMENT
151 C (9) - DY - Y-DIR INCREMENT
152 C (10) - PROJECTION CENTER FLAG
153 C (11) - SCANNING MODE FLAG (RIGHT ADJ COPY OF OCTET 28)
154 C (12) - LATIN 1 - FIRST LAT FROM POLE OF SECANT CONE INTER
155 C (13) - LATIN 2 - SECOND LAT FROM POLE OF SECANT CONE INTER
156 C JENS INTEGER (200) ENSEMBLE PDS PARMS FOR WHICH TO SEARCH
157 C (ONLY SEARCHED IF JPDS(23)=2)
158 C (=-1 FOR WILDCARD)
159 C (1) - APPLICATION IDENTIFIER
160 C (2) - ENSEMBLE TYPE
161 C (3) - ENSEMBLE IDENTIFIER
162 C (4) - PRODUCT IDENTIFIER
163 C (5) - SMOOTHING FLAG
164 C MBUF INTEGER LENGTH OF INDEX BUFFER IN BYTES
165 C CBUF CHARACTER*1 (MBUF) INDEX BUFFER
166 C (INITIALIZE BY SETTING J=-1)
167 C NLEN INTEGER LENGTH OF EACH INDEX RECORD IN BYTES
168 C (INITIALIZE BY SETTING J=-1)
169 C NNUM INTEGER NUMBER OF INDEX RECORDS
170 C (INITIALIZE BY SETTING J=-1)
171 C MNUM INTEGER NUMBER OF INDEX RECORDS SKIPPED
172 C (INITIALIZE BY SETTING J=-1)
173 C OUTPUT ARGUMENTS:
174 C CBUF CHARACTER*1 (MBUF) INDEX BUFFER
175 C NLEN INTEGER LENGTH OF EACH INDEX RECORD IN BYTES
176 C NNUM INTEGER NUMBER OF INDEX RECORDS
177 C MNUM INTEGER NUMBER OF INDEX RECORDS SKIPPED
178 C KG INTEGER NUMBER OF BYTES IN THE GRIB MESSAGE
179 C K INTEGER MESSAGE NUMBER UNPACKED
180 C (CAN BE SAME AS J IN CALLING PROGRAM
181 C IN ORDER TO FACILITATE MULTIPLE SEARCHES)
182 C KPDS INTEGER (200) UNPACKED PDS PARAMETERS
183 C KGDS INTEGER (200) UNPACKED GDS PARAMETERS
184 C KENS INTEGER (200) UNPACKED ENSEMBLE PDS PARMS
185 C G CHARACTER*1 (KG) GRIB MESSAGE
186 C IRET INTEGER RETURN CODE
187 C 0 ALL OK
188 C 96 ERROR READING INDEX FILE
189 C 97 ERROR READING GRIB FILE
190 C 98 NUMBER OF BYTES GREATER THAN JG
191 C 99 REQUEST NOT FOUND
193 C SUBPROGRAMS CALLED:
194 C GETGI READ INDEX FILE
195 C GETGIR READ INDEX BUFFER FROM GRIB FILE
196 C GETGB1S SEARCH INDEX RECORDS
197 C BAREAD READ GRIB RECORD
199 C REMARKS: SPECIFY AN INDEX FILE IF FEASIBLE TO INCREASE SPEED.
200 C SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
201 C DO NOT ENGAGE THE SAME LOGICAL UNIT FROM MORE THAN ONE PROCESSOR.
203 C ATTRIBUTES:
204 C LANGUAGE: FORTRAN 77
205 C MACHINE: CRAY, WORKSTATIONS
207 C$$$
208 INTEGER JPDS(200),JGDS(200),JENS(200)
209 INTEGER KPDS(200),KGDS(200),KENS(200)
210 CHARACTER CBUF(MBUF)
211 CHARACTER G(JG)
212 PARAMETER(MSK1=32000,MSK2=4000)
213 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
214 C SEARCH PREVIOUS INDEX BUFFER IF POSSIBLE
215 IF(J.GE.0) THEN
216 IF(MNUM.GE.0) THEN
217 IRGI=0
218 ELSE
219 MNUM=-1-MNUM
220 IRGI=1
221 ENDIF
222 JR=J-MNUM
223 IF(JR.GE.0.AND.(JR.LT.NNUM.OR.IRGI.EQ.0)) THEN
224 CALL GETGB1S(CBUF,NLEN,NNUM,JR,JPDS,JGDS,JENS,
225 & KR,KPDS,KGDS,KENS,LSKIP,LGRIB,IRGS)
226 IF(IRGS.EQ.0) K=KR+MNUM
227 IF(IRGI.EQ.1.AND.IRGS.EQ.0) MNUM=-1-MNUM
228 IF(IRGI.EQ.1.AND.IRGS.GT.0) MNUM=MNUM+NNUM
229 ELSE
230 MNUM=J
231 IRGI=1
232 IRGS=1
233 ENDIF
234 ELSE
235 MNUM=-1-J
236 IRGI=1
237 IRGS=1
238 ENDIF
239 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
240 C READ AND SEARCH NEXT INDEX BUFFER
241 JR=0
242 DOWHILE(IRGI.EQ.1.AND.IRGS.EQ.1)
243 IF(LUGI.GT.0) THEN
244 CALL GETGI(LUGI,MNUM,MBUF,CBUF,NLEN,NNUM,IRGI)
245 ELSE
246 CALL GETGIR(LUGB,MSK1,MSK2,MNUM,MBUF,CBUF,NLEN,NNUM,IRGI)
247 ENDIF
248 IF(IRGI.LE.1) THEN
249 CALL GETGB1S(CBUF,NLEN,NNUM,JR,JPDS,JGDS,JENS,
250 & KR,KPDS,KGDS,KENS,LSKIP,LGRIB,IRGS)
251 IF(IRGS.EQ.0) K=KR+MNUM
252 IF(IRGI.EQ.1.AND.IRGS.EQ.0) MNUM=-1-MNUM
253 IF(IRGI.EQ.1.AND.IRGS.GT.0) MNUM=MNUM+NNUM
254 ENDIF
255 ENDDO
256 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
257 C READ GRIB RECORD
258 IF(IRGI.GT.1) THEN
259 IRET=96
260 ELSEIF(IRGS.NE.0) THEN
261 IRET=99
262 ELSEIF(LGRIB.GT.JG) THEN
263 IRET=98
264 ELSE
265 IRET=97
266 CALL BAREAD(LUGB,LSKIP,LGRIB,KG,G)
267 IF(KG.EQ.LGRIB) IRET=0
268 ENDIF
269 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
270 RETURN