NCEPLIBS-w3emc 2.12.0
Loading...
Searching...
No Matches
getgbemh.f
Go to the documentation of this file.
1C> @file
2C> @brief Find a grib message.
3C> @author Mark Iredell @date 1994-04-01
4
5C> Read a grib index file (or optionally the grib file itself)
6C> to get the index buffer (i.e. table of contents) for the grib file.
7C> Find in the index buffer a reference to the grib message requested.
8C> The grib message request specifies the number of messages to skip
9C> and the unpacked pds and gds parameters. (A requested parameter
10C> of -1 means to allow any value of this parameter to be found.)
11C> If the requested grib message is found, then its message number is
12C> returned along with the unpacked pds and gds parameters. If the
13C> grib message is not found, then the return code will be nonzero.
14C>
15C> Program history log:
16C> - Mark Iredell 1994-04-01
17C> - Mark Iredell 1995-10-31 Modularized portions of code into subprograms
18C> and allowed for unspecified index file
19C>
20C> @param[in] lugb integer unit of the unblocked grib data file
21C> (only used if lugi=0).
22C> @param[in] lugi integer unit of the unblocked grib index file
23C> (=0 to get index buffer from the grib file).
24C> @param[in] j integer number of messages to skip
25C> (=0 to search from beginning)
26C> (<0 to read index buffer and skip -1-j messages).
27C> @param[in] jpds integer (200) pds parameters for which to search.
28C> (=-1 for wildcard).
29C> - 1: id of center.
30C> - 2: generating process id number.
31C> - 3: grid definition.
32C> - 4: gds/bms flag (right adj copy of octet 8).
33C> - 5: indicator of parameter.
34C> - 6: type of level.
35C> - 7: height/pressure , etc of level.
36C> - 8: year including (century-1).
37C> - 9: month of year.
38C> - 10: day of month.
39C> - 11: hour of day.
40C> - 12: minute of hour.
41C> - 13: indicator of forecast time unit.
42C> - 14: time range 1.
43C> - 15: time range 2.
44C> - 16: time range flag.
45C> - 17: number included in average.
46C> - 18: version nr of grib specification.
47C> - 19: version nr of parameter table.
48C> - 20: nr missing from average/accumulation.
49C> - 21: century of reference time of data.
50C> - 22: units decimal scale factor.
51C> - 23: subcenter number.
52C> - 24: pds byte 29, for nmc ensemble products.
53C> - 128: if forecast field error.
54C> - 64: if bias corrected fcst field.
55C> - 32: if smoothed field.
56C> - warning: can be combination of more than 1.
57C> - 25: pds byte 30, not used.
58C> @param[in] jgds integer (200) gds parameters for which to search
59C> (only searched if jpds(3)=255)
60C> (=-1 for wildcard).
61C> - 1: data representation type.
62C> - 19: number of vertical coordinate parameters.
63C> - 20: octet number of the list of vertical coordinate parameters or.
64C> octet number of the list of numbers of points in each row or.
65C> 255 if neither are present.
66C> - 21: for grids with pl, number of points in grid.
67C> - 22: number of words in each row.
68C> - Latitude/longitude grids.
69C> - 2: n(i) nr points on latitude circle.
70C> - 3: n(j) nr points on longitude meridian.
71C> - 4: la(1) latitude of origin.
72C> - 5: lo(1) longitude of origin.
73C> - 6: resolution flag (right adj copy of octet 17).
74C> - 7: la(2) latitude of extreme point.
75C> - 8: lo(2) longitude of extreme point.
76C> - 9: di longitudinal direction of increment.
77C> - 10: dj latitudinal direction increment.
78C> - 11: scanning mode flag (right adj copy of octet 28).
79C> - Gaussian grids.
80C> - 2: n(i) nr points on latitude circle.
81C> - 3: n(j) nr points on longitude meridian.
82C> - 4: la(1) latitude of origin.
83C> - 5: lo(1) longitude of origin.
84C> - 6: resolution flag (right adj copy of octet 17).
85C> - 7: la(2) latitude of extreme point.
86C> - 8: lo(2) longitude of extreme point.
87C> - 9: di longitudinal direction of increment.
88C> - 10: n: nr of circles pole to equator.
89C> - 11: scanning mode flag (right adj copy of octet 28).
90C> - 12: nv: nr of vert coord parameters.
91C> - 13:
92C> - pv: octet nr of list of vert coord parameters or.
93C> - pl:location of the list of numbers of points in
94C> each row (if no vert coord parameters are present) or.
95C> - 255: if neither are present.
96C> - Polar stereographic grids.
97C> - 2: n(i) nr points along lat circle.
98C> - 3: n(j) nr points along lon circle.
99C> - 4: la(1) latitude of origin.
100C> - 5: lo(1) longitude of origin.
101C> - 6: resolution flag (right adj copy of octet 17).
102C> - 7: lov grid orientation.
103C> - 8: dx - x direction increment.
104C> - 9: dy - y direction increment.
105C> - 10: projection center flag.
106C> - 11: scanning mode (right adj copy of octet 28).
107C> - Spherical harmonic coefficients.
108C> - 2: j pentagonal resolution parameter.
109C> - 3: k pentagonal resolution parameter.
110C> - 4: m pentagonal resolution parameter.
111C> - 5: representation type.
112C> - 6: coefficient storage mode.
113C> - Mercator grids.
114C> - 2: n(i) nr points on latitude circle.
115C> - 3: n(j) nr points on longitude meridian.
116C> - 4: la(1) latitude of origin.
117C> - 5: lo(1) longitude of origin.
118C> - 6: resolution flag (right adj copy of octet 17).
119C> - 7: la(2) latitude of last grid point.
120C> - 8: lo(2) longitude of last grid point.
121C> - 9: latit - latitude of projection intersection.
122C> - 10: reserved.
123C> - 11: scanning mode flag (right adj copy of octet 28).
124C> - 12: longitudinal dir grid length.
125C> - 13: latitudinal dir grid length.
126C> - Lambert conformal grids.
127C> - 2: nx nr points along x-axis.
128C> - 3: ny nr points along y-axis.
129C> - 4: la1 lat of origin (lower left).
130C> - 5: lo1 lon of origin (lower left).
131C> - 6: resolution (right adj copy of octet 17).
132C> - 7: lov - orientation of grid.
133C> - 8: dx - x-dir increment.
134C> - 9: dy - y-dir increment.
135C> - 10: projection center flag.
136C> - 11: scanning mode flag (right adj copy of octet 28).
137C> - 12: latin 1 - first lat from pole of secant cone inter.
138C> - 13: latin 2 - second lat from pole of secant cone inter.
139C> @param[in] jens integer (200) ensemble pds parms for which to search
140C> (only searched if jpds(23)=2).
141C> (=-1 for wildcard).
142C> - 1: application identifier.
143C> - 2: ensemble type.
144C> - 3: ensemble identifier.
145C> - 4: product identifier.
146C> - 5: smoothing flag.
147C> @param[in] mbuf integer length of index buffer in bytes.
148C> @param[inout] cbuf character*1 (mbuf) index buffer
149C> (initialize by setting j=-1).
150C> @param[inout] nlen integer length of each index record in bytes
151C> (initialize by setting j=-1).
152C> @param[inout] nnum integer number of index records
153C> (initialize by setting j=-1).
154C> @param[inout] mnum integer number of index records skipped
155C> (initialize by setting j=-1).
156C> @param[out] kg integer number of bytes in the grib message.
157C> @param[out] kf integer number of data points in the message.
158C> @param[out] k integer message number unpacked
159C> (can be same as j in calling program in order to facilitate multiple searches).
160C> @param[out] kpds integer (200) unpacked pds parameters.
161C> @param[out] kgds integer (200) unpacked gds parameters.
162C> @param[out] kens integer (200) unpacked ensemble pds parms.
163C> @param[out] iret integer return code.
164C> - 0: all ok.
165C> - 96: error reading index file.
166C> - 99: request not found.
167C>
168C> @note Specify an index file if feasible to increase speed.
169C> Subprogram can be called from a multiprocessing environment.
170C> Do not engage the same logical unit from more than one processor.
171C>
172C> @author Mark Iredell @date 1994-04-01
173C-----------------------------------------------------------------------
174 SUBROUTINE getgbemh(LUGB,LUGI,J,JPDS,JGDS,JENS,
175 & MBUF,CBUF,NLEN,NNUM,MNUM,
176 & KG,KF,K,KPDS,KGDS,KENS,IRET)
177 INTEGER JPDS(200),JGDS(200),JENS(200)
178 INTEGER KPDS(200),KGDS(200),KENS(200)
179 CHARACTER CBUF(MBUF)
180 parameter(msk1=32000,msk2=4000)
181C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
182C SEARCH PREVIOUS INDEX BUFFER IF POSSIBLE
183 IF(j.GE.0) THEN
184 IF(mnum.GE.0) THEN
185 irgi=0
186 ELSE
187 mnum=-1-mnum
188 irgi=1
189 ENDIF
190 jr=j-mnum
191 IF(jr.GE.0.AND.(jr.LT.nnum.OR.irgi.EQ.0)) THEN
192 CALL getgb1s(cbuf,nlen,nnum,jr,jpds,jgds,jens,
193 & kr,kpds,kgds,kens,lskip,lgrib,irgs)
194 IF(irgs.EQ.0) k=kr+mnum
195 IF(irgi.EQ.1.AND.irgs.EQ.0) mnum=-1-mnum
196 IF(irgi.EQ.1.AND.irgs.GT.0) mnum=mnum+nnum
197 ELSE
198 mnum=j
199 irgi=1
200 irgs=1
201 ENDIF
202 ELSE
203 mnum=-1-j
204 irgi=1
205 irgs=1
206 ENDIF
207C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
208C READ AND SEARCH NEXT INDEX BUFFER
209 jr=0
210 dowhile(irgi.EQ.1.AND.irgs.EQ.1)
211 IF(lugi.GT.0) THEN
212 CALL getgi(lugi,mnum,mbuf,cbuf,nlen,nnum,irgi)
213 ELSE
214 CALL getgir(lugb,msk1,msk2,mnum,mbuf,cbuf,nlen,nnum,irgi)
215 ENDIF
216 IF(irgi.LE.1) THEN
217 CALL getgb1s(cbuf,nlen,nnum,jr,jpds,jgds,jens,
218 & kr,kpds,kgds,kens,lskip,lgrib,irgs)
219 IF(irgs.EQ.0) k=kr+mnum
220 IF(irgi.EQ.1.AND.irgs.EQ.0) mnum=-1-mnum
221 IF(irgi.EQ.1.AND.irgs.GT.0) mnum=mnum+nnum
222 ENDIF
223 ENDDO
224C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
225C READ GRIB RECORD
226 IF(irgi.GT.1) THEN
227 iret=96
228 ELSEIF(irgs.NE.0) THEN
229 iret=99
230 ELSE
231 kg=lgrib
232 kf=lengds(kgds)
233 iret=0
234 ENDIF
235C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
236 RETURN
237 END
subroutine getgb1s(cbuf, nlen, nnum, j, jpds, jgds, jens, k, kpds, kgds, kens, lskip, lgrib, iret)
Find a grib message.
Definition getgb1s.f:44
subroutine getgbemh(lugb, lugi, j, jpds, jgds, jens, mbuf, cbuf, nlen, nnum, mnum, kg, kf, k, kpds, kgds, kens, iret)
Read a grib index file (or optionally the grib file itself) to get the index buffer (i....
Definition getgbemh.f:177
subroutine getgi(lugi, mnum, mbuf, cbuf, nlen, nnum, iret)
Read a grib index file and return its contents.
Definition getgi.f:50
subroutine getgir(lugb, msk1, msk2, mnum, mbuf, cbuf, nlen, nnum, iret)
Read a grib file and return its index contents.
Definition getgir.f:45
function lengds(kgds)
Program history log:
Definition lengds.f:15