1 
2 /*
3  * Include ./configure's header file
4  */
5 #ifdef HAVE_CONFIG_H
6 #include <config.h>
7 #endif
8 
9 #include <sys/types.h>
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include <stddef.h>
14 #include <math.h>
15 #include <float.h>
16 /* version 1.2.1 of grib headers  w. ebisuzaki */
17 
18 #ifndef INT2
19 #define INT2(a,b)   ((1-(int) ((unsigned) (a & 0x80) >> 6)) * (int) (((a & 0x7f) << 8) + b))
20 #endif
21 
22 #define BDS_LEN(bds)		((int) ((bds[0]<<16)+(bds[1]<<8)+bds[2]))
23 #define BDS_Flag(bds)		(bds[3])
24 
25 #define BDS_Grid(bds)		((bds[3] & 128) == 0)
26 #define BDS_Harmonic(bds)	(bds[3] & 128)
27 
28 #define BDS_Packing(bds)	((bds[3] & 64) != 0)
29 #define BDS_SimplePacking(bds)	((bds[3] & 64) == 0)
30 #define BDS_ComplexPacking(bds)	((bds[3] & 64) != 0)
31 
32 #define BDS_OriginalType(bds)	((bds[3] & 32) != 0)
33 #define BDS_OriginalFloat(bds)	((bds[3] & 32) == 0)
34 #define BDS_OriginalInt(bds)	((bds[3] & 32) != 0)
35 
36 #define BDS_MoreFlags(bds)      ((bds[3] & 16) != 0)
37 #define BDS_UnusedBits(bds)	((int) (bds[3] & 15))
38 
39 #define BDS_BinScale(bds)	INT2(bds[4],bds[5])
40 
41 #define BDS_RefValue(bds)	(ibm2flt(bds+6))
42 #define BDS_NumBits(bds)	((int) bds[10])
43 
44 #define BDS_DataStart(bds)      ((int) (11 + BDS_MoreFlags(bds)*3))
45 
46 /* breaks if BDS_NumBits(bds) == 0 */
47 #define BDS_NValues(bds)        (((BDS_LEN(bds) - BDS_DataStart(bds))*8 - \
48 				BDS_UnusedBits(bds)) / BDS_NumBits(bds))
49 /*
50 #define BDS_NValues(bds)        ((BDS_NumBits(bds) == 0) ? 0 : \
51 				(((BDS_LEN(bds) - BDS_DataStart(bds))*8 - \
52 				BDS_UnusedBits(bds)) / BDS_NumBits(bds)))
53 */
54 
55 /* undefined value -- if bitmap */
56 #define UNDEFINED		9.999e20
57 
58 /* version 1.2 of grib headers  w. ebisuzaki */
59 
60 #define BMS_LEN(bms)		((bms) == NULL ? 0 : (bms[0]<<16)+(bms[1]<<8)+bms[2])
61 #define BMS_UnusedBits(bms)	((bms) == NULL ? 0 : bms[3])
62 #define BMS_StdMap(bms)		((bms) == NULL ? 0 : ((bms[4]<<8) + bms[5]))
63 #define BMS_bitmap(bms)		((bms) == NULL ? NULL : (bms)+6)
64 #define BMS_nxny(bms)		((((bms) == NULL) || BMS_StdMap(bms)) \
65 	? 0 : (BMS_LEN(bms)*8 - 48 - BMS_UnusedBits(bms)))
66 /* cnames_file.c */
67 
68 /* search order for parameter names
69  *
70  * #define P_TABLE_FIRST
71  * look at external parameter table first
72  *
73  * otherwise use builtin NCEP-2 or ECMWF-160 first
74  */
75 /* #define P_TABLE_FIRST */
76 
77 /* search order for external parameter table
78  * 1) environment variable GRIBTAB
79  * 2) environment variable gribtab
80  * 3) the file 'gribtab' in current directory
81  */
82 
83 
84 /* cnames.c */
85 /* then default values */
86 char *k5toa(unsigned char *pds);
87 char *k5_comments(unsigned char *pds);
88 int setup_user_table(int center, int subcenter, int ptable);
89 
90 
91 struct ParmTable {
92 	char *name, *comment;
93 };
94 
95 /* version 1.4.1 of grib headers  w. ebisuzaki */
96 /* this version is incomplete */
97 
98 #ifndef INT3
99 #define INT3(a,b,c) ((1-(int) ((unsigned) (a & 0x80) >> 6)) * (int) (((a & 127) << 16)+(b<<8)+c))
100 #endif
101 #ifndef INT2
102 #define INT2(a,b)   ((1-(int) ((unsigned) (a & 0x80) >> 6)) * (int) (((a & 127) << 8) + b))
103 #endif
104 
105 #ifndef UINT3
106 #define UINT3(a,b,c) ((int) ((a << 16) + (b << 8) + (c)))
107 #endif
108 
109 #ifndef UINT2
110 #define UINT2(a,b) ((int) ((a << 8) + (b)))
111 #endif
112 
113 
114 #define GDS_Len1(gds)		(gds[0])
115 #define GDS_Len2(gds)		(gds[1])
116 #define GDS_Len3(gds)		(gds[2])
117 #define GDS_LEN(gds)		((int) ((gds[0]<<16)+(gds[1]<<8)+gds[2]))
118 
119 #define GDS_NV(gds)		(gds[3])
120 #define GDS_DataType(gds)	(gds[5])
121 
122 #define GDS_LatLon(gds)		(gds[5] == 0)
123 #define GDS_Mercator(gds)	(gds[5] == 1)
124 #define GDS_Gnomonic(gds)	(gds[5] == 2)
125 #define GDS_Lambert(gds)	(gds[5] == 3)
126 #define GDS_Gaussian(gds)	(gds[5] == 4)
127 #define GDS_Polar(gds)		(gds[5] == 5)
128 #define GDS_RotLL(gds)		(gds[5] == 10)
129 #define GDS_Harmonic(gds)	(gds[5] == 50)
130 #define GDS_ssEgrid(gds)	(gds[5] == 201)	/* semi-staggered E grid */
131 #define GDS_fEgrid(gds)		(gds[5] == 202) /* filled E grid */
132 
133 #define GDS_LatLon_nx(gds)	((int) ((gds[6] << 8) + gds[7]))
134 #define GDS_LatLon_ny(gds)	((int) ((gds[8] << 8) + gds[9]))
135 #define GDS_LatLon_La1(gds)	INT3(gds[10],gds[11],gds[12])
136 #define GDS_LatLon_Lo1(gds)	INT3(gds[13],gds[14],gds[15])
137 #define GDS_LatLon_mode(gds)	(gds[16])
138 #define GDS_LatLon_La2(gds)	INT3(gds[17],gds[18],gds[19])
139 #define GDS_LatLon_Lo2(gds)	INT3(gds[20],gds[21],gds[22])
140 
141 #define GDS_LatLon_dx(gds)      INT2(gds[23],gds[24])
142 #define GDS_LatLon_dy(gds)      INT2(gds[25],gds[26])
143 #define GDS_Gaussian_nlat(gds)  ((gds[25]<<8)+gds[26])
144 
145 #define GDS_LatLon_scan(gds)	(gds[27])
146 
147 #define GDS_Polar_nx(gds)	((gds[6] << 8) + gds[7])
148 #define GDS_Polar_ny(gds)	((gds[8] << 8) + gds[9])
149 #define GDS_Polar_La1(gds)	(INT3(gds[10],gds[11],gds[12]))
150 #define GDS_Polar_Lo1(gds)	(INT3(gds[13],gds[14],gds[15]))
151 #define GDS_Polar_Lov(gds)	(INT3(gds[17],gds[18],gds[19]))
152 #define GDS_Polar_scan(gds)	(gds[27])
153 #define GDS_Polar_Dx(gds)	(INT3(gds[20], gds[21], gds[22]))
154 #define GDS_Polar_Dy(gds)	(INT3(gds[23], gds[24], gds[25]))
155 #define GDS_Polar_pole(gds)	((gds[26] & 128) == 128)
156 
157 #define GDS_Lambert_nx(gds)	((gds[6] << 8) + gds[7])
158 #define GDS_Lambert_ny(gds)	((gds[8] << 8) + gds[9])
159 #define GDS_Lambert_La1(gds)	INT3(gds[10],gds[11],gds[12])
160 #define GDS_Lambert_Lo1(gds)	INT3(gds[13],gds[14],gds[15])
161 #define GDS_Lambert_mode(gds)	(gds[16])
162 #define GDS_Lambert_Lov(gds)	INT3(gds[17],gds[18],gds[19])
163 #define GDS_Lambert_dx(gds)	INT3(gds[20],gds[21],gds[22])
164 #define GDS_Lambert_dy(gds)	INT3(gds[23],gds[24],gds[25])
165 #define GDS_Lambert_NP(gds)	((gds[26] & 128) == 0)
166 #define GDS_Lambert_scan(gds)   (gds[27])
167 #define GDS_Lambert_Latin1(gds)	INT3(gds[28],gds[29],gds[30])
168 #define GDS_Lambert_Latin2(gds)	INT3(gds[31],gds[32],gds[33])
169 #define GDS_Lambert_LatSP(gds)	INT3(gds[34],gds[35],gds[36])
170 #define GDS_Lambert_LonSP(gds)	INT3(gds[37],gds[37],gds[37])
171 
172 #define GDS_ssEgrid_n(gds)	UINT2(gds[6],gds[7])
173 #define GDS_ssEgrid_n_dum(gds)  UINT2(gds[8],gds[9])
174 #define GDS_ssEgrid_La1(gds)	INT3(gds[10],gds[11],gds[12])
175 #define GDS_ssEgrid_Lo1(gds)	INT3(gds[13],gds[14],gds[15])
176 #define GDS_ssEgrid_mode(gds)	(gds[16])
177 #define GDS_ssEgrid_La2(gds)	UINT3(gds[17],gds[18],gds[19])
178 #define GDS_ssEgrid_Lo2(gds)	UINT3(gds[20],gds[21],gds[22])
179 #define GDS_ssEgrid_di(gds)	INT2(gds[23],gds[24])
180 #define GDS_ssEgrid_dj(gds)	INT2(gds[25],gds[26])
181 #define GDS_ssEgrid_scan(gds)	(gds[27])
182 
183 #define GDS_fEgrid_n(gds)	UINT2(gds[6],gds[7])
184 #define GDS_fEgrid_n_dum(gds)   UINT2(gds[8],gds[9])
185 #define GDS_fEgrid_La1(gds)	INT3(gds[10],gds[11],gds[12])
186 #define GDS_fEgrid_Lo1(gds)	INT3(gds[13],gds[14],gds[15])
187 #define GDS_fEgrid_mode(gds)	(gds[16])
188 #define GDS_fEgrid_La2(gds)	UINT3(gds[17],gds[18],gds[19])
189 #define GDS_fEgrid_Lo2(gds)	UINT3(gds[20],gds[21],gds[22])
190 #define GDS_fEgrid_di(gds)	INT2(gds[23],gds[24])
191 #define GDS_fEgrid_dj(gds)	INT2(gds[25],gds[26])
192 #define GDS_fEgrid_scan(gds)	(gds[27])
193 
194 
195 #define GDS_Merc_nx(gds)	UINT2(gds[6],gds[7])
196 #define GDS_Merc_ny(gds)	UINT2(gds[8],gds[9])
197 #define GDS_Merc_La1(gds)	INT3(gds[10],gds[11],gds[12])
198 #define GDS_Merc_Lo1(gds)	INT3(gds[13],gds[14],gds[15])
199 #define GDS_Merc_mode(gds)	(gds[16])
200 #define GDS_Merc_La2(gds)	INT3(gds[17],gds[18],gds[19])
201 #define GDS_Merc_Lo2(gds)	INT3(gds[20],gds[21],gds[22])
202 #define GDS_Merc_Latin(gds)	INT3(gds[23],gds[24],gds[25])
203 #define GDS_Merc_scan(gds)	(gds[27])
204 #define GDS_Merc_dx(gds)        INT3(gds[28],gds[29],gds[30])
205 #define GDS_Merc_dy(gds)        INT3(gds[31],gds[32],gds[33])
206 
207 /* rotated Lat-lon grid */
208 
209 #define GDS_RotLL_nx(gds)	UINT2(gds[6],gds[7])
210 #define GDS_RotLL_ny(gds)	UINT2(gds[8],gds[9])
211 #define GDS_RotLL_La1(gds)	INT3(gds[10],gds[11],gds[12])
212 #define GDS_RotLL_Lo1(gds)	INT3(gds[13],gds[14],gds[15])
213 #define GDS_RotLL_mode(gds)	(gds[16])
214 #define GDS_RotLL_La2(gds)	INT3(gds[17],gds[18],gds[19])
215 #define GDS_RotLL_Lo2(gds)	INT3(gds[20],gds[21],gds[22])
216 #define GDS_RotLL_dx(gds)       INT2(gds[23],gds[24])
217 #define GDS_RotLL_dy(gds)       INT2(gds[25],gds[26])
218 #define GDS_RotLL_scan(gds)	(gds[27])
219 #define GDS_RotLL_LaSP(gds)	INT3(gds[32],gds[33],gds[34])
220 #define GDS_RotLL_LoSP(gds)	INT3(gds[35],gds[36],gds[37])
221 #define GDS_RotLL_RotAng(gds)	ibm2flt(&(gds[38]))
222 
223 /* index of NV and PV */
224 #define GDS_PV(gds)		((gds[3] == 0) ? -1 : (int) gds[4] - 1)
225 #define GDS_PL(gds)		((gds[4] == 255) ? -1 : (int) gds[3] * 4 + (int) gds[4] - 1)
226 
227 enum Def_NCEP_Table {rean, opn, rean_nowarn, opn_nowarn};
228 
229 unsigned char *seek_grib(FILE *file, off_t *pos, off_t *len_grib,
230         unsigned char *buffer, unsigned int buf_len);
231 
232 int read_grib(FILE *file, off_t pos, off_t len_grib, unsigned char *buffer);
233 
234 double ibm2flt(unsigned char *ibm);
235 
236 void BDS_unpack(float *flt, unsigned char *bits, unsigned char *bitmap,
237         int n_bits, int n, double ref, double scale);
238 
239 double int_power(double x, int y);
240 
241 int flt2ieee(float x, unsigned char *ieee);
242 
243 int wrtieee(float *array, int n, int header, FILE *output);
244 int wrtieee_header(unsigned int n, FILE *output);
245 
246 void levels(int, int);
247 
248 void PDStimes(int time_range, int p1, int p2, int time_unit);
249 
250 int missing_points(unsigned char *bitmap, int n);
251 
252 void EC_ext(unsigned char *pds, char *prefix, char *suffix);
253 
254 int GDS_grid(unsigned char *gds, int *nx, int *ny, long int *nxny);
255 void GDS_prt_thin_lon(unsigned char *gds);
256 
257 int PDS_date(unsigned char *pds, int option, int verf_time);
258 
259 int add_time(int *year, int *month, int *day, int *hour, int dtime, int unit);
260 
261 int verf_time(unsigned char *pds, int *year, int *month, int *day, int *hour);
262 
263 void print_pds(unsigned char *pds, int print_PDS, int print_PDS10, int verbose);
264 void print_gds(unsigned char *gds, int print_GDS, int print_GDS10, int verbose);
265 
266 void ensemble(unsigned char *pds, int mode);
267 /* version 3.4 of grib headers  w. ebisuzaki */
268 /* this version is incomplete */
269 
270 #ifndef INT2
271 #define INT2(a,b)   ((1-(int) ((unsigned) (a & 0x80) >> 6)) * (int) (((a & 0x7f) << 8) + b))
272 #endif
273 
274 #define PDS_Len1(pds)		(pds[0])
275 #define PDS_Len2(pds)		(pds[1])
276 #define PDS_Len3(pds)		(pds[2])
277 #define PDS_LEN(pds)		((int) ((pds[0]<<16)+(pds[1]<<8)+pds[2]))
278 #define PDS_Vsn(pds)		(pds[3])
279 #define PDS_Center(pds)		(pds[4])
280 #define PDS_Model(pds)		(pds[5])
281 #define PDS_Grid(pds)		(pds[6])
282 #define PDS_HAS_GDS(pds)	((pds[7] & 128) != 0)
283 #define PDS_HAS_BMS(pds)	((pds[7] & 64) != 0)
284 #define PDS_PARAM(pds)		(pds[8])
285 #define PDS_L_TYPE(pds)		(pds[9])
286 #define PDS_LEVEL1(pds)		(pds[10])
287 #define PDS_LEVEL2(pds)		(pds[11])
288 
289 #define PDS_KPDS5(pds)		(pds[8])
290 #define PDS_KPDS6(pds)		(pds[9])
291 #define PDS_KPDS7(pds)		((int) ((pds[10]<<8) + pds[11]))
292 
293 /* this requires a 32-bit default integer machine */
294 #define PDS_Field(pds)		((pds[8]<<24)+(pds[9]<<16)+(pds[10]<<8)+pds[11])
295 
296 #define PDS_Year(pds)		(pds[12])
297 #define PDS_Month(pds)		(pds[13])
298 #define PDS_Day(pds)		(pds[14])
299 #define PDS_Hour(pds)		(pds[15])
300 #define PDS_Minute(pds)		(pds[16])
301 #define PDS_ForecastTimeUnit(pds)	(pds[17])
302 #define PDS_P1(pds)		(pds[18])
303 #define PDS_P2(pds)		(pds[19])
304 #define PDS_TimeRange(pds)	(pds[20])
305 #define PDS_NumAve(pds)		((int) ((pds[21]<<8)+pds[22]))
306 #define PDS_NumMissing(pds)	(pds[23])
307 #define PDS_Century(pds)	(pds[24])
308 #define PDS_Subcenter(pds)	(pds[25])
309 #define PDS_DecimalScale(pds)	INT2(pds[26],pds[27])
310 /* old #define PDS_Year4(pds)   (pds[12] + 100*(pds[24] - (pds[12] != 0))) */
311 #define PDS_Year4(pds)          (pds[12] + 100*(pds[24] - 1))
312 
313 /* various centers */
314 #define NMC			7
315 #define ECMWF			98
316 
317 /* ECMWF Extensions */
318 
319 #define PDS_EcLocalId(pds)	(PDS_LEN(pds) >= 41 ? (pds[40]) : 0)
320 #define PDS_EcClass(pds)	(PDS_LEN(pds) >= 42 ? (pds[41]) : 0)
321 #define PDS_EcType(pds)		(PDS_LEN(pds) >= 43 ? (pds[42]) : 0)
322 #define PDS_EcStream(pds)	(PDS_LEN(pds) >= 45 ? (INT2(pds[43], pds[44])) : 0)
323 
324 #define PDS_EcENS(pds)		(PDS_LEN(pds) >= 52 && pds[40] == 1 && \
325 				pds[43] * 256 + pds[44] == 1035 && pds[50] != 0)
326 #define PDS_EcFcstNo(pds)	(pds[50])
327 #define PDS_EcNoFcst(pds)	(pds[51])
328 
329 
330 /* NCEP Extensions */
331 
332 #define PDS_NcepENS(pds)	(PDS_LEN(pds) >= 44 && pds[25] == 2 && pds[40] == 1)
333 #define PDS_NcepFcstType(pds)	(pds[41])
334 #define PDS_NcepFcstNo(pds)	(pds[42])
335 #define PDS_NcepFcstProd(pds)	(pds[43])
336 
337 /* time units */
338 
339 #define MINUTE  0
340 #define HOUR    1
341 #define DAY     2
342 #define MONTH   3
343 #define YEAR    4
344 #define DECADE  5
345 #define NORMAL  6
346 #define CENTURY 7
347 #define HOURS3  10
348 #define HOURS6  11
349 #define HOURS12  12
350 #define SECOND  254
351 
352 
353 
354 #define VERSION "v1.7.3.1 (8-5-99) Wesley Ebisuzaki"
355 
356 #define CHECK_GRIB
357 
358 /*
359  * wgrib.c extract/inventory grib records
360  *
361  *                              Wesley Ebisuzaki
362  *
363  * 11/94 - v1.0
364  * 11/94 - v1.1: arbitary size grids, -i option
365  * 11/94 - v1.2: bug fixes, ieee option, more info
366  * 1/95  - v1.2.4: fix headers for SUN acc
367  * 2/95  - v1.2.5: add num_ave in -s listing
368  * 2/95  - v1.2.6: change %d to %ld
369  * 2/95  - v1.2.7: more output, added some polar stereographic support
370  * 2/95  - v1.2.8: max min format changed %f to %g, tidying up more info
371  * 3/95  - v1.3.0: fix bug with bitmap, allow numbers > UNDEFINED
372  * 3/95  - v1.3.1: print number of missing points (verbose)
373  * 3/95  - v1.3.2: -append option added
374  * 4/95  - v1.3.2a,b: more output, polar stereo support (-V option)
375  * 4/95  - v1.3.3: added ECMWF parameter table (prelim)
376  * 6/95  - v1.3.4: nxny from BDS rather than gds?
377  * 9/95  - v1.3.4d: speedup in grib write
378  * 11/95 - v1.3.4f: new ECMWF parameter table (from Mike Fiorino), EC logic
379  * 2/96  - v1.3.4g-h: prelim fix for GDS-less grib files
380  * 2/96  - v1.3.4i: faster missing(), -V: "pos n" -> "n" (field 2)
381  * 3/96  - v1.4: fix return code (!inventory), and short records near EOF
382  * 6/96  - v1.4.1a: faster grib->binary decode, updated ncep parameter table, mod. in clim. desc
383  * 7/96  - v1.5.0: parameter-table aware, -v option changed, added "comments"
384  *                 increased NTRY to 100 in seek_grib
385  * 11/96 - v1.5.0b: added ECMWF parameter table 128
386  * 1/97 - v1.5.0b2: if nxny != nx*ny { nx = nxny; ny = 1 }
387  * 3/97 - v1.5.0b5: added: -PDS -GDS, Lambert Conformal
388  * 3/97 - v1.5.0b6: added: -verf
389  * 4/97 - v1.5.0b7: added -PDS10, -GDS10 and enhanced -PDS -GDS
390  * 4/97 - v1.5.0b8: "bitmap missing x" -> "bitmap: x undef"
391  * 5/97 - v1.5.0b9: thinned grids meta data
392  * 5/97 - v1.5.0b10: changed 0hr fcst to anal for TR=10 and P1=P2=0
393  * 5/97 - v1.5.0b10: added -H option
394  * 6/97 - v1.5.0b12: thinned lat-long grids -V option
395  * 6/97 - v1.5.0b13: -4yr
396  * 6/97 - v1.5.0b14: fix century mark Y=100 not 0
397  * 7/97 - v1.5.0b15: add ncep opn grib table
398  * 12/97 - v1.6.1.a: made ncep_opn the default table
399  * 12/97 - v1.6.1.b: changed 03TOT to O3TOT in operational ncep table
400  * 1/98  - v1.6.2: added Arakawa E grid meta-data
401  * 1/98  - v1.6.2.1: added some mode data, Scan -> scan
402  * 4/98  - v1.6.2.4: reanalysis id code: subcenter==0 && process==180
403  * 5/98  - v1.6.2.5: fix -H code to write all of GDS
404  * 7/98  - v1.7: fix decoding bug for bitmap and no. bits > 24 (theoretical bug)
405  * 7/98  - v1.7.0.b1: add km to Mercator meta-data
406  * 5/99  - v1.7.2: bug with thinned grids & bitmaps (nxny != nx*ny)
407  * 5/99  - v1.7.3: updated NCEP opn grib table
408  * 8/99  - v1.7.3.1: updated level information
409  *
410  */
411 
412 /*
413  * MSEEK = I/O buffer size for seek_grib
414  */
415 
416 #define MSEEK 1024
417 #define BUFF_ALLOC0	40000
418 
419 
420 #ifndef min
421 #define min(a,b)  ((a) < (b) ? (a) : (b))
422 #define max(a,b)  ((a) < (b) ? (b) : (a))
423 #endif
424 
425 #ifndef DEF_T62_NCEP_TABLE
426 #define DEF_T62_NCEP_TABLE	rean
427 #endif
428 enum Def_NCEP_Table def_ncep_table = DEF_T62_NCEP_TABLE;
429 
main(int argc,char ** argv)430 int main(int argc, char **argv) {
431 
432     unsigned char *buffer;
433     float *array;
434     double temp, rmin, rmax;
435     int i, nx, ny, file_arg;
436     off_t len_grib, pos = 0;
437     long nxny, buffer_size, n_dump, count = 1;
438     unsigned char *msg, *pds, *gds, *bms, *bds, *pointer;
439     FILE *input, *dump_file = NULL;
440     char line[200];
441     enum {BINARY, TEXT, IEEE, GRIB, NONE} output_type = NONE;
442     enum {DUMP_ALL, DUMP_RECORD, DUMP_POSITION, DUMP_LIST, INVENTORY}
443 	mode = INVENTORY;
444     long int dump = -1;
445     int verbose = 0, append = 0, v_time = 0, year_4 = 0, output_PDS_GDS = 0;
446     int print_GDS = 0, print_GDS10 = 0, print_PDS = 0, print_PDS10 = 0;
447     char *dump_file_name = "dump", open_parm[3];
448     int header = 1, return_code = 0;
449 
450     if (argc == 1) {
451 	fprintf(stderr, "\nPortable Grib decoder for %s etc.\n",
452 	    (def_ncep_table == opn_nowarn || def_ncep_table == opn) ?
453 	    "NCEP Operations" : "NCEP/NCAR Reanalysis");
454 	fprintf(stderr, "   it slices, dices    %s\n", VERSION);
455 	fprintf(stderr, "   usage: %s [grib file] [options]\n\n", argv[0]);
456 
457 	fprintf(stderr, "Inventory/diagnostic-output selections\n");
458 	fprintf(stderr, "   -s/-v                   short/verbose inventory\n");
459 	fprintf(stderr, "   -V                      diagnostic output (not inventory)\n");
460 	fprintf(stderr, "   (none)                  regular inventory\n");
461 
462 	fprintf(stderr, " Options\n");
463 	fprintf(stderr, "   -PDS/-PDS10             print PDS in hex/decimal\n");
464 	fprintf(stderr, "   -GDS/-GDS10             print GDS in hex/decimal\n");
465 	fprintf(stderr, "   -verf                   print forecast verification time\n");
466 	fprintf(stderr, "   -ncep_opn/-ncep_rean    default T62 NCEP grib table\n");
467 	fprintf(stderr, "   -4yr                    print year using 4 digits\n");
468 
469 	fprintf(stderr, "Decoding GRIB selection\n");
470 	fprintf(stderr, "   -d [record number|all]  decode record number\n");
471 	fprintf(stderr, "   -p [byte position]      decode record at byte position\n");
472 	fprintf(stderr, "   -i                      decode controlled by stdin (inventory list)\n");
473 	fprintf(stderr, "   (none)                  no decoding\n");
474 
475 	fprintf(stderr, " Options\n");
476 	fprintf(stderr, "   -text/-ieee/-grib/-bin  convert to text/ieee/grib/bin (default)\n");
477 	fprintf(stderr, "   -nh/-h                  output will have no headers/headers (default)\n");
478 	fprintf(stderr, "   -H                      output will include PDS and GDS (-bin/-ieee only)\n");
479 	fprintf(stderr, "   -append                 append to output file\n");
480 	fprintf(stderr, "   -o [file]               output file name, 'dump' is default\n");
481 	exit(8);
482     }
483     file_arg = 0;
484     for (i = 1; i < argc; i++) {
485 	if (strcmp(argv[i],"-PDS") == 0) {
486 	    print_PDS = 1;
487 	    continue;
488 	}
489 	if (strcmp(argv[i],"-PDS10") == 0) {
490 	    print_PDS10 = 1;
491 	    continue;
492 	}
493 	if (strcmp(argv[i],"-GDS") == 0) {
494 	    print_GDS = 1;
495 	    continue;
496 	}
497 	if (strcmp(argv[i],"-GDS10") == 0) {
498 	    print_GDS10 = 1;
499 	    continue;
500 	}
501 	if (strcmp(argv[i],"-v") == 0) {
502 	    verbose = 1;
503 	    continue;
504 	}
505 	if (strcmp(argv[i],"-V") == 0) {
506 	    verbose = 2;
507 	    continue;
508 	}
509 	if (strcmp(argv[i],"-s") == 0) {
510 	    verbose = -1;
511 	    continue;
512 	}
513 	if (strcmp(argv[i],"-text") == 0) {
514 	    output_type = TEXT;
515 	    continue;
516 	}
517 	if (strcmp(argv[i],"-bin") == 0) {
518 	    output_type = BINARY;
519 	    continue;
520 	}
521 	if (strcmp(argv[i],"-ieee") == 0) {
522 	    output_type = IEEE;
523 	    continue;
524 	}
525 	if (strcmp(argv[i],"-grib") == 0) {
526 	    output_type = GRIB;
527 	    continue;
528 	}
529 	if (strcmp(argv[i],"-nh") == 0) {
530 	    header = 0;
531 	    continue;
532 	}
533 	if (strcmp(argv[i],"-h") == 0) {
534 	    header = 1;
535 	    continue;
536 	}
537 	if (strcmp(argv[i],"-append") == 0) {
538 	    append = 1;
539 	    continue;
540 	}
541 	if (strcmp(argv[i],"-verf") == 0) {
542 	    v_time = 1;
543 	    continue;
544         }
545 	if (strcmp(argv[i],"-d") == 0) {
546 	    if (strcmp(argv[i+1],"all") == 0) {
547 	        mode = DUMP_ALL;
548 	    }
549 	    else {
550 	        dump = atol(argv[i+1]);
551 	        mode = DUMP_RECORD;
552 	    }
553 	    i++;
554 	    if (output_type == NONE) output_type = BINARY;
555 	    continue;
556 	}
557 	if (strcmp(argv[i],"-p") == 0) {
558 	    pos = atol(argv[i+1]);
559 	    i++;
560 	    dump = 1;
561 	    if (output_type == NONE) output_type = BINARY;
562 	    mode = DUMP_POSITION;
563 	    continue;
564 	}
565 	if (strcmp(argv[i],"-i") == 0) {
566 	    if (output_type == NONE) output_type = BINARY;
567 	    mode = DUMP_LIST;
568 	    continue;
569 	}
570 	if (strcmp(argv[i],"-H") == 0) {
571 	    output_PDS_GDS = 1;
572 	    continue;
573 	}
574 	if (strcmp(argv[i],"-NH") == 0) {
575 	    output_PDS_GDS = 0;
576 	    continue;
577 	}
578 	if (strcmp(argv[i],"-4yr") == 0) {
579 	    year_4 = 1;
580 	    continue;
581 	}
582 	if (strcmp(argv[i],"-ncep_opn") == 0) {
583 	    def_ncep_table = opn_nowarn;
584 	    continue;
585 	}
586 	if (strcmp(argv[i],"-ncep_rean") == 0) {
587 	    def_ncep_table = rean_nowarn;
588 	    continue;
589 	}
590 	if (strcmp(argv[i],"-o") == 0) {
591 	    dump_file_name = argv[i+1];
592 	    i++;
593 	    continue;
594 	}
595 	if (strcmp(argv[i],"--v") == 0) {
596 	    printf("wgrib: %s\n", VERSION);
597 	    exit(0);
598 	}
599 	if (file_arg == 0) {
600 	    file_arg = i;
601 	}
602 	else {
603 	    fprintf(stderr,"argument: %s ????\n", argv[i]);
604 	}
605     }
606 
607 
608     if ((input = fopen(argv[file_arg],"rb")) == NULL) {
609         fprintf(stderr,"could not open file: %s\n", argv[file_arg]);
610         exit(7);
611     }
612 
613     if ((buffer = (unsigned char *) malloc(BUFF_ALLOC0)) == NULL) {
614 	fprintf(stderr,"not enough memory\n");
615     }
616     buffer_size = BUFF_ALLOC0;
617 
618     /* open output file */
619     if (mode != INVENTORY) {
620 	open_parm[0] = append ? 'a' : 'w'; open_parm[1] = 'b'; open_parm[2] = '\0';
621 	if (output_type == TEXT) open_parm[1] = '\0';
622 
623 	if ((dump_file = fopen(dump_file_name,open_parm)) == NULL) {
624 	    fprintf(stderr,"could not open dump file\n");
625 	    exit(8);
626         }
627     }
628 
629     /* skip dump - 1 records */
630     for (i = 1; i < dump; i++) {
631 	msg = seek_grib(input, &pos, &len_grib, buffer, MSEEK);
632 	if (msg == NULL) {
633 	    fprintf(stderr, "ran out of data or bad file\n");
634 	    exit(8);
635 	}
636 	pos += len_grib;
637     }
638     if (dump > 0) count += dump - 1;
639     n_dump = 0;
640 
641     for (;;) {
642 	if (n_dump == 1 && (mode == DUMP_RECORD || mode == DUMP_POSITION)) break;
643 	if (mode == DUMP_LIST) {
644 	    if (fgets(line,sizeof(line), stdin) == NULL) break;
645             line[sizeof(line) - 1] = 0;
646             if (sscanf(line,"%ld:%ld:", &count, &pos) != 2) {
647 		fprintf(stderr,"bad input from stdin\n");
648 	        exit(8);
649 	    }
650 	}
651 
652 	msg = seek_grib(input, &pos, &len_grib, buffer, MSEEK);
653 	if (msg == NULL) {
654 	    if (mode == INVENTORY || mode == DUMP_ALL) break;
655 	    fprintf(stderr,"missing GRIB record(s)\n");
656 	    exit(8);
657 	}
658 
659         /* read all whole grib record */
660         if (len_grib + msg - buffer > buffer_size) {
661             buffer_size = len_grib + msg - buffer + 1000;
662             buffer = (unsigned char *) realloc((void *) buffer, buffer_size);
663             if (buffer == NULL) {
664                 fprintf(stderr,"ran out of memory\n");
665                 exit(8);
666             }
667         }
668         read_grib(input, pos, len_grib, buffer);
669 
670 	/* parse grib message */
671 
672 	msg = buffer;
673         pds = (msg + 8);
674         pointer = pds + PDS_LEN(pds);
675 #ifdef DEBUG
676 	printf("LEN_GRIB= 0x%x\n", len_grib);
677 	printf("PDS_LEN= 0x%x: at 0x%x\n", PDS_LEN(pds),pds-msg);
678 #endif
679         if (PDS_HAS_GDS(pds)) {
680             gds = pointer;
681             pointer += GDS_LEN(gds);
682 #ifdef DEBUG
683 	    printf("GDS_LEN= 0x%x: at 0x%x\n", GDS_LEN(gds), gds-msg);
684 #endif
685         }
686         else {
687             gds = NULL;
688         }
689 
690         if (PDS_HAS_BMS(pds)) {
691             bms = pointer;
692             pointer += BMS_LEN(bms);
693 #ifdef DEBUG
694 	    printf("BMS_LEN= 0x%x: at 0x%x\n", BMS_LEN(bms),bms-msg);
695 #endif
696         }
697         else {
698             bms = NULL;
699         }
700 
701         bds = pointer;
702         pointer += BDS_LEN(bds);
703 #ifdef DEBUG
704 	printf("BDS_LEN= 0x%x: at 0x%x\n", BDS_LEN(bds),bds-msg);
705 #endif
706 
707 #ifdef DEBUG
708 	printf("END_LEN= 0x%x: at 0x%x\n", 4,pointer-msg);
709 	if (pointer-msg+4 != len_grib) {
710 	    fprintf(stderr,"Len of grib message is inconsistent.\n");
711 	}
712 #endif
713 
714         /* end section - "7777" in ascii */
715         if (pointer[0] != 0x37 || pointer[1] != 0x37 ||
716             pointer[2] != 0x37 || pointer[3] != 0x37) {
717             fprintf(stderr,"\n\n    missing end section\n");
718             fprintf(stderr, "%2x %2x %2x %2x\n", pointer[0], pointer[1],
719 		pointer[2], pointer[3]);
720 #ifdef DEBUG
721 	    printf("ignoring missing end section\n");
722 #else
723 	    exit(8);
724 #endif
725         }
726 
727 	/* figure out size of array */
728 	if (gds != NULL) {
729 	    /* this doesn't work for spherical harmonics */
730 	    GDS_grid(gds, &nx, &ny, &nxny);
731 	}
732 	else if (bms != NULL) {
733 	    nxny = nx = BMS_nxny(bms);
734 	    ny = 1;
735 	}
736 	else {
737 	    if (BDS_NumBits(bds) == 0) {
738                 nxny = nx = 1;
739                 fprintf(stderr,"Missing GDS, constant record .. cannot "
740                     "determine number of data points\n");
741 	    }
742 	    else {
743 	        nxny = nx = BDS_NValues(bds);
744 	    }
745 	    ny = 1;
746 	}
747 
748 #ifdef CHECK_GRIB
749         if (BDS_NumBits(bds) != 0) {
750 	    i = BDS_NValues(bds);
751 	    if (bms != NULL) {
752 		i += missing_points(BMS_bitmap(bms),nxny);
753 	    }
754 	    if (i != nxny) {
755 	        fprintf(stderr,"grib header at record %ld: two values of nxny %ld %d\n",
756 			count,nxny,i);
757 	        fprintf(stderr,"   LEN %d DataStart %d UnusedBits %d #Bits %d nxny %ld\n",
758 		    BDS_LEN(bds), BDS_DataStart(bds),BDS_UnusedBits(bds),
759 		    BDS_NumBits(bds), nxny);
760                 return_code = 15;
761 		nxny = nx = i;
762 		ny = 1;
763 	    }
764 	}
765 #endif
766 
767         if (verbose <= 0) {
768 	    printf("%ld:%ld:d=", count, pos);
769 	    PDS_date(pds,year_4,v_time);
770 	    printf(":%s:", k5toa(pds));
771 
772             if (verbose == 0) printf("kpds5=%d:kpds6=%d:kpds7=%d:TR=%d:P1=%d:P2=%d:TimeU=%d:",
773 	        PDS_PARAM(pds),PDS_KPDS6(pds),PDS_KPDS7(pds),
774 	        PDS_TimeRange(pds),PDS_P1(pds),PDS_P2(pds),
775                 PDS_ForecastTimeUnit(pds));
776 	    levels(PDS_KPDS6(pds), PDS_KPDS7(pds)); printf(":");
777 	    PDStimes(PDS_TimeRange(pds),PDS_P1(pds),PDS_P2(pds),
778                 PDS_ForecastTimeUnit(pds));
779 	    if (PDS_Center(pds) == ECMWF) EC_ext(pds,"",":");
780 	    ensemble(pds, verbose);
781 	    printf("NAve=%d",PDS_NumAve(pds));
782 	    if (print_PDS || print_PDS10) print_pds(pds, print_PDS, print_PDS10, verbose);
783 	    if (gds && (print_GDS || print_GDS10)) print_gds(gds, print_GDS, print_GDS10, verbose);
784             printf("\n");
785        }
786        else if (verbose == 1) {
787 	    printf("%ld:%ld:D=", count, pos);
788             PDS_date(pds, 1, v_time);
789 	    printf(":%s:", k5toa(pds));
790 
791 	    levels(PDS_KPDS6(pds), PDS_KPDS7(pds)); printf(":");
792             printf("kpds=%d,%d,%d:",
793 	        PDS_PARAM(pds),PDS_KPDS6(pds),PDS_KPDS7(pds));
794 	    PDStimes(PDS_TimeRange(pds),PDS_P1(pds),PDS_P2(pds),
795                 PDS_ForecastTimeUnit(pds));
796 	    if (PDS_Center(pds) == ECMWF) EC_ext(pds,"",":");
797 	    ensemble(pds, verbose);
798             printf("\"%s", k5_comments(pds));
799 	    if (print_PDS || print_PDS10) print_pds(pds, print_PDS, print_PDS10, verbose);
800 	    if (gds && (print_GDS || print_GDS10)) print_gds(gds, print_GDS, print_GDS10, verbose);
801             printf("\n");
802 	}
803         else if (verbose == 2) {
804 	    printf("rec %ld:%ld:date ", count, pos);
805 	    PDS_date(pds, 1, v_time);
806 	    printf(" %s kpds5=%d kpds6=%d kpds7=%d levels=(%d,%d) grid=%d ",
807 	        k5toa(pds), PDS_PARAM(pds), PDS_KPDS6(pds), PDS_KPDS7(pds),
808                 PDS_LEVEL1(pds), PDS_LEVEL2(pds), PDS_Grid(pds));
809 	        levels(PDS_KPDS6(pds),PDS_KPDS7(pds));
810 
811 	    printf(" ");
812 	    if (PDS_Center(pds) == ECMWF) EC_ext(pds,""," ");
813 	    ensemble(pds, verbose);
814 	    PDStimes(PDS_TimeRange(pds),PDS_P1(pds),PDS_P2(pds),
815                  PDS_ForecastTimeUnit(pds));
816 	    if (bms != NULL)
817 		printf(" bitmap: %d undef", missing_points(BMS_bitmap(bms),nxny));
818             printf("\n  %s=%s\n", k5toa(pds), k5_comments(pds));
819 
820             printf("  timerange %d P1 %d P2 %d TimeU %d  nx %d ny %d GDS grid %d "
821 		"num_in_ave %d missing %d\n",
822 	        PDS_TimeRange(pds),PDS_P1(pds),PDS_P2(pds),
823                 PDS_ForecastTimeUnit(pds), nx, ny,
824                 gds == NULL ? -1 : GDS_DataType(gds),
825                 PDS_NumAve(pds), PDS_NumMissing(pds));
826 
827 	    printf("  center %d subcenter %d process %d Table %d\n",
828 		PDS_Center(pds),PDS_Subcenter(pds),PDS_Model(pds),
829                 PDS_Vsn(pds));
830 
831 	    if (gds && GDS_LatLon(gds) && nx != -1)
832 		printf("  latlon: lat  %f to %f by %f  nxny %ld\n"
833                        "          long %f to %f by %f, (%d x %d) scan %d "
834                        "mode %d bdsgrid %d\n",
835 		  0.001*GDS_LatLon_La1(gds), 0.001*GDS_LatLon_La2(gds),
836 		  0.001*GDS_LatLon_dy(gds), nxny, 0.001*GDS_LatLon_Lo1(gds),
837 		  0.001*GDS_LatLon_Lo2(gds), 0.001*GDS_LatLon_dx(gds),
838 	    	  nx, ny, GDS_LatLon_scan(gds), GDS_LatLon_mode(gds),
839 		  BDS_Grid(bds));
840 	    else if (gds && GDS_LatLon(gds) && nx == -1) {
841 		printf("  thinned latlon: lat  %f to %f by %f  nxny %ld\n"
842                        "          long %f to %f, %ld grid pts   (%d x %d) scan %d"
843 			" mode %d bdsgrid %d\n",
844 		  0.001*GDS_LatLon_La1(gds), 0.001*GDS_LatLon_La2(gds),
845 		  0.001*GDS_LatLon_dy(gds), nxny, 0.001*GDS_LatLon_Lo1(gds),
846 		  0.001*GDS_LatLon_Lo2(gds),
847 	    	  nxny, nx, ny, GDS_LatLon_scan(gds), GDS_LatLon_mode(gds),
848 		  BDS_Grid(bds));
849 		  GDS_prt_thin_lon(gds);
850 	    }
851 	    else if (gds && GDS_Gaussian(gds) && nx != -1)
852 		printf("  gaussian: lat  %f to %f\n"
853                        "            long %f to %f by %f, (%d x %d) scan %d"
854 			" mode %d bdsgrid %d\n",
855 		  0.001*GDS_LatLon_La1(gds), 0.001*GDS_LatLon_La2(gds),
856 		  0.001*GDS_LatLon_Lo1(gds), 0.001*GDS_LatLon_Lo2(gds),
857 		  0.001*GDS_LatLon_dx(gds),
858 	    	  nx, ny, GDS_LatLon_scan(gds), GDS_LatLon_mode(gds),
859 		  BDS_Grid(bds));
860 	    else if (gds && GDS_Gaussian(gds) && nx == -1) {
861 		printf("  thinned gaussian: lat  %f to %f\n"
862                        "     lon %f   %ld grid pts   (%d x %d) scan %d"
863 			" mode %d bdsgrid %d  nlat:\n",
864 		  0.001*GDS_LatLon_La1(gds), 0.001*GDS_LatLon_La2(gds),
865 		  0.001*GDS_LatLon_Lo1(gds),
866 	    	  nxny, nx, ny, GDS_LatLon_scan(gds), GDS_LatLon_mode(gds),
867 		  BDS_Grid(bds));
868 		  GDS_prt_thin_lon(gds);
869 	    }
870 	    else if (gds && GDS_Polar(gds))
871 		printf("  polar stereo: Lat1 %f Long1 %f Orient %f\n"
872 			"     %s pole (%d x %d) Dx %d Dy %d scan %d\n",
873 		    0.001*GDS_Polar_La1(gds),0.001*GDS_Polar_Lo1(gds),
874 		    0.001*GDS_Polar_Lov(gds),
875 		    GDS_Polar_pole(gds) == 0 ? "north" : "south", nx,ny,
876 		    GDS_Polar_Dx(gds),GDS_Polar_Dy(gds),
877 		    GDS_Polar_scan(gds));
878 	    else if (gds && GDS_Lambert(gds))
879 		printf("  Lambert Conf: Lat1 %f Lon1 %f Lov %f\n"
880                        "      Latin1 %f Latin2 %f LatSP %f LonSP %f\n"
881                        "      %s (%d x %d) Dx %f Dy %f scan %d mode %d\n",
882                      0.001*GDS_Lambert_La1(gds),0.001*GDS_Lambert_Lo1(gds),
883                      0.001*GDS_Lambert_Lov(gds),
884                      0.001*GDS_Lambert_Latin1(gds), 0.001*GDS_Lambert_Latin2(gds),
885                      0.001*GDS_Lambert_LatSP(gds), 0.001*GDS_Lambert_LonSP(gds),
886                       GDS_Lambert_NP(gds) ? "North Pole": "South Pole",
887                      GDS_Lambert_nx(gds), GDS_Lambert_ny(gds),
888                      0.001*GDS_Lambert_dx(gds), 0.001*GDS_Lambert_dy(gds),
889                      GDS_Lambert_scan(gds), GDS_Lambert_mode(gds));
890 	    else if (gds && GDS_Mercator(gds))
891 		printf("  Mercator: lat  %f to %f by %f km  nxny %ld\n"
892                        "          long %f to %f by %f km, (%d x %d) scan %d"
893 			" mode %d Latin %f bdsgrid %d\n",
894 		  0.001*GDS_Merc_La1(gds), 0.001*GDS_Merc_La2(gds),
895 		  0.001*GDS_Merc_dy(gds), nxny, 0.001*GDS_Merc_Lo1(gds),
896 		  0.001*GDS_Merc_Lo2(gds), 0.001*GDS_Merc_dx(gds),
897 	    	  nx, ny, GDS_Merc_scan(gds), GDS_Merc_mode(gds),
898 		  0.001*GDS_Merc_Latin(gds), BDS_Grid(bds));
899 	    else if (gds && GDS_ssEgrid(gds))
900 		printf("  Semi-staggered Arakawa E-Grid: lat0 %f lon0 %f nxny %d\n"
901                        "    dLat %f dLon %f (%d x %d) scan %d mode %d\n",
902 		  0.001*GDS_ssEgrid_La1(gds), 0.001*GDS_ssEgrid_Lo1(gds),
903                   GDS_ssEgrid_n(gds)*GDS_ssEgrid_n_dum(gds),
904                   0.001*GDS_ssEgrid_dj(gds), 0.001*GDS_ssEgrid_di(gds),
905                   GDS_ssEgrid_Lo2(gds), GDS_ssEgrid_La2(gds),
906                   GDS_ssEgrid_scan(gds), GDS_ssEgrid_mode(gds));
907 	    else if (gds && GDS_fEgrid(gds))
908 		printf("  filled Arakawa E-Grid: lat0 %f lon0 %f nxny %d\n"
909                        "    dLat %f dLon %f (%d x %d) scan %d mode %d\n",
910 		  0.001*GDS_fEgrid_La1(gds), 0.001*GDS_fEgrid_Lo1(gds),
911                   GDS_fEgrid_n(gds)*GDS_fEgrid_n_dum(gds),
912                   0.001*GDS_fEgrid_dj(gds), 0.001*GDS_fEgrid_di(gds),
913                   GDS_fEgrid_Lo2(gds), GDS_fEgrid_La2(gds),
914                   GDS_fEgrid_scan(gds), GDS_fEgrid_mode(gds));
915 	    else if (gds && GDS_RotLL(gds))
916 		printf("  rotated LatLon grid  lat %f to %f  lon %f to %f\n"
917 		       "    nxny %ld  (%d x %d)  dx %d dy %d  scan %d  mode %d\n"
918 		       "    transform: south pole lat %f lon %f  rot angle %f\n",
919 		   0.001*GDS_RotLL_La1(gds), 0.001*GDS_RotLL_La2(gds),
920 		   0.001*GDS_RotLL_Lo1(gds), 0.001*GDS_RotLL_Lo2(gds),
921 		   nxny, GDS_RotLL_nx(gds), GDS_RotLL_ny(gds),
922 		   GDS_RotLL_dx(gds), GDS_RotLL_dy(gds),
923 		   GDS_RotLL_scan(gds), GDS_RotLL_mode(gds),
924 		   0.001*GDS_RotLL_LaSP(gds), 0.001*GDS_RotLL_LoSP(gds),
925 		   GDS_RotLL_RotAng(gds) );
926 	    else if (gds && GDS_Gnomonic(gds))
927 		printf("  Gnomonic grid\n");
928 	    else if (gds && GDS_Harmonic(gds))
929 		printf("  Harmonic (spectral)\n");
930 
931 	    if (print_PDS || print_PDS10)
932                 print_pds(pds, print_PDS, print_PDS10, verbose);
933 	    if (gds && (print_GDS || print_GDS10))
934                  print_gds(gds, print_GDS, print_GDS10, verbose);
935 	}
936 
937 	if (mode != INVENTORY && output_type == GRIB) {
938 	    fwrite((void *) msg, sizeof(char), len_grib, dump_file);
939 	    n_dump++;
940 	}
941 
942 	if ((mode != INVENTORY && output_type != GRIB) || verbose > 1) {
943 	    /* decode numeric data */
944 
945             if ((array = (float *) malloc(sizeof(float) * nxny)) == NULL) {
946                 fprintf(stderr,"memory problems\n");
947                 exit(8);
948             }
949 
950 	    temp = int_power(10.0, - PDS_DecimalScale(pds));
951 
952 	    BDS_unpack(array, bds + 11, BMS_bitmap(bms), BDS_NumBits(bds), nxny,
953 	        temp*BDS_RefValue(bds),temp*int_power(2.0, BDS_BinScale(bds)));
954 
955 	    if (verbose > 1) {
956 		rmin = FLT_MAX;
957 		rmax = -FLT_MAX;
958 	        for (i = 0; i < nxny; i++) {
959 		    if (fabs(array[i]-UNDEFINED) > 0.0001*UNDEFINED) {
960 	                rmin = min(rmin,array[i]);
961 	                rmax = max(rmax,array[i]);
962 		    }
963 	        }
964 	        printf("  min/max data %g %g  num bits %d "
965 			" BDS_Ref %g  DecScale %d BinScale %d\n",
966 		    rmin, rmax, BDS_NumBits(bds), BDS_RefValue(bds),
967 		    PDS_DecimalScale(pds), BDS_BinScale(bds));
968 	    }
969 
970 	    if (mode != INVENTORY && output_type != GRIB) {
971 		/* dump code */
972 		if (output_PDS_GDS == 1) {
973 		    /* insert code here */
974 	            if (output_type == BINARY || output_type == IEEE) {
975 			/* write PDS */
976 			i = PDS_LEN(pds) + 4;
977 	                if (header && output_type == BINARY)
978 				fwrite((void *) &i, sizeof(int), 1, dump_file);
979 	                if (header && output_type == IEEE) wrtieee_header(i, dump_file);
980 	                fwrite((void *) "PDS ", 1, 4, dump_file);
981 	                fwrite((void *) pds, 1, i - 4, dump_file);
982 	                if (header && output_type == BINARY)
983 				fwrite((void *) &i, sizeof(int), 1, dump_file);
984 	                if (header && output_type == IEEE) wrtieee_header(i, dump_file);
985 
986 			/* write GDS */
987 			i = (gds) ?  GDS_LEN(gds) + 4 : 4;
988 	                if (header && output_type == BINARY)
989 				fwrite((void *) &i, sizeof(int), 1, dump_file);
990 	                if (header && output_type == IEEE) wrtieee_header(i, dump_file);
991 	                fwrite((void *) "GDS ", 1, 4, dump_file);
992 	                if (gds) fwrite((void *) gds, 1, i - 4, dump_file);
993 	                if (header && output_type == BINARY)
994 				fwrite((void *) &i, sizeof(int), 1, dump_file);
995 	                if (header && output_type == IEEE) wrtieee_header(i, dump_file);
996 		    }
997 		}
998 
999 	        if (output_type == BINARY) {
1000 	            i = nxny * sizeof(float);
1001 	            if (header) fwrite((void *) &i, sizeof(int), 1, dump_file);
1002 	            fwrite((void *) array, sizeof(float), nxny, dump_file);
1003 	            if (header) fwrite((void *) &i, sizeof(int), 1, dump_file);
1004 	        }
1005 		else if (output_type == IEEE) {
1006 		    wrtieee(array, nxny, header, dump_file);
1007 		}
1008 	        else if (output_type == TEXT) {
1009 	            /* number of points in grid */
1010 	            if (header) {
1011 		        if (nx <= 0 || ny <= 0 || nxny != nx*ny) {
1012                             fprintf(dump_file, "%ld %d\n", nxny, 1);
1013 			}
1014 			else {
1015 			    fprintf(dump_file, "%d %d\n", nx, ny);
1016 			}
1017 		    }
1018 	            for (i = 0; i < nxny; i++) {
1019 		        fprintf(dump_file,"%g\n", array[i]);
1020 		    }
1021 	        }
1022 	        n_dump++;
1023 	    }
1024 	    free(array);
1025 	    if (verbose > 0) printf("\n");
1026 	}
1027 
1028         pos += len_grib;
1029         count++;
1030     }
1031 
1032     if (mode != INVENTORY) {
1033 	if (ferror(dump_file)) {
1034 		fprintf(stderr,"error writing %s\n",dump_file_name);
1035 		exit(8);
1036 	}
1037     }
1038     fclose(input);
1039     return (return_code);
1040 }
1041 
print_pds(unsigned char * pds,int print_PDS,int print_PDS10,int verbose)1042 void print_pds(unsigned char *pds, int print_PDS, int print_PDS10, int verbose) {
1043     int i, j;
1044 
1045     j = PDS_LEN(pds);
1046     if (verbose < 2) {
1047         if (print_PDS && verbose < 2) {
1048             printf(":PDS=");
1049             for (i = 0; i < j; i++) {
1050                 printf("%2.2x", (int) pds[i]);
1051             }
1052         }
1053         if (print_PDS10 && verbose < 2) {
1054             printf(":PDS10=");
1055             for (i = 0; i < j; i++) {
1056                 printf(" %d", (int) pds[i]);
1057             }
1058         }
1059     }
1060     else {
1061         if (print_PDS) {
1062             printf("  PDS(1..%d)=",j);
1063             for (i = 0; i < j; i++) {
1064                 if (i % 20 == 0) printf("\n    %4d:",i+1);
1065                 printf(" %3.2x", (int) pds[i]);
1066             }
1067             printf("\n");
1068         }
1069         if (print_PDS10) {
1070             printf("  PDS10(1..%d)=",j);
1071             for (i = 0; i < j; i++) {
1072                 if (i % 20 == 0) printf("\n    %4d:",i+1);
1073                 printf(" %3d", (int) pds[i]);
1074             }
1075             printf("\n");
1076         }
1077     }
1078 }
1079 
print_gds(unsigned char * gds,int print_GDS,int print_GDS10,int verbose)1080 void print_gds(unsigned char *gds, int print_GDS, int print_GDS10, int verbose) {
1081     int i, j;
1082 
1083     j = GDS_LEN(gds);
1084     if (verbose < 2) {
1085         if (print_GDS && verbose < 2) {
1086             printf(":GDS=");
1087             for (i = 0; i < j; i++) {
1088                 printf("%2.2x", (int) gds[i]);
1089             }
1090         }
1091         if (print_GDS10 && verbose < 2) {
1092             printf(":GDS10=");
1093             for (i = 0; i < j; i++) {
1094                 printf(" %d", (int) gds[i]);
1095             }
1096         }
1097     }
1098     else {
1099         if (print_GDS) {
1100             printf("  GDS(1..%d)=",j);
1101             for (i = 0; i < j; i++) {
1102                 if (i % 20 == 0) printf("\n    %4d:",i+1);
1103                 printf(" %3.2x", (int) gds[i]);
1104             }
1105             printf("\n");
1106         }
1107         if (print_GDS10) {
1108             printf("  GDS10(1..%d)=",j);
1109             for (i = 0; i < j; i++) {
1110                 if (i % 20 == 0) printf("\n    %4d:",i+1);
1111                 printf(" %3d", (int) gds[i]);
1112             }
1113             printf("\n");
1114         }
1115     }
1116 }
1117 /*
1118  * find next grib header
1119  *
1120  * file = what do you think?
1121  * pos = initial position to start looking at  ( = 0 for 1st call)
1122  *       returns with position of next grib header (units=bytes)
1123  * len_grib = length of the grib record (bytes)
1124  * buffer[buf_len] = buffer for reading/writing
1125  *
1126  * returns (char *) to start of GRIB header+PDS
1127  *         NULL if not found
1128  *
1129  * adapted from SKGB (Mark Iredell)
1130  *
1131  * v1.1 9/94 Wesley Ebisuzaki
1132  * v1.2 3/96 Wesley Ebisuzaki handles short records at end of file
1133  * v1.3 8/96 Wesley Ebisuzaki increase NTRY from 3 to 100 for the folks
1134  *      at Automation decided a 21 byte WMO bulletin header wasn't long
1135  *      enough and decided to go to an 8K header.
1136  *
1137  */
1138 
1139 #ifndef min
1140    #define min(a,b)  ((a) < (b) ? (a) : (b))
1141 #endif
1142 
1143 #define NTRY 100
1144 /* #define LEN_HEADER_PDS (28+42+100) */
1145 #define LEN_HEADER_PDS (28+8)
1146 
seek_grib(FILE * file,off_t * pos,off_t * len_grib,unsigned char * buffer,unsigned int buf_len)1147 unsigned char *seek_grib(FILE *file, off_t *pos, off_t *len_grib,
1148         unsigned char *buffer, unsigned int buf_len) {
1149 
1150     int i, j, len;
1151 
1152     for (j = 0; j < NTRY; j++) {
1153 
1154         if (fseeko(file, *pos, SEEK_SET) == -1) {
1155             *len_grib = 0;
1156             return (unsigned char *) NULL;
1157         }
1158 
1159         i = fread(buffer, sizeof (unsigned char), buf_len, file);
1160 
1161         len = i - LEN_HEADER_PDS;
1162 
1163         for (i = 0; i < len; i++) {
1164             if (buffer[i] == 'G' && buffer[i+1] == 'R' && buffer[i+2] == 'I'
1165                 && buffer[i+3] == 'B' && buffer[i+7] == 1) {
1166                     *pos = i + *pos;
1167                     *len_grib = (buffer[i+4] << 16) + (buffer[i+5] << 8) +
1168                             buffer[i+6];
1169                     return (buffer+i);
1170             }
1171         }
1172 	*pos = *pos + (buf_len - LEN_HEADER_PDS);
1173     }
1174 
1175     *len_grib = 0;
1176     return (unsigned char *) NULL;
1177 }
1178 
1179 /* ibm2flt       wesley ebisuzaki
1180  *
1181  * v1.1 .. faster
1182  * v1.1 .. if mant == 0 -> quick return
1183  *
1184  */
1185 
1186 
ibm2flt(unsigned char * ibm)1187 double ibm2flt(unsigned char *ibm) {
1188 
1189 	int positive, power;
1190 	unsigned int abspower;
1191 	long int mant;
1192 	double value, exp;
1193 
1194 	mant = (ibm[1] << 16) + (ibm[2] << 8) + ibm[3];
1195         if (mant == 0) return 0.0;
1196 
1197 	positive = (ibm[0] & 0x80) == 0;
1198 	power = (int) (ibm[0] & 0x7f) - 64;
1199 	abspower = power > 0 ? power : -power;
1200 
1201 
1202 	/* calc exp */
1203 	exp = 16.0;
1204 	value = 1.0;
1205 	while (abspower) {
1206 		if (abspower & 1) {
1207 			value *= exp;
1208 		}
1209 		exp = exp * exp;
1210 		abspower >>= 1;
1211 	}
1212 
1213 	if (power < 0) value = 1.0 / value;
1214 	value = value * mant / 16777216.0;
1215 	if (positive == 0) value = -value;
1216 	return value;
1217 }
1218 
1219 /*
1220  * read_grib.c
1221  *
1222  * reads grib message
1223  *
1224  * input: pos, byte position of grib message
1225  *        len_grib, length of grib message
1226  * output: *buffer, grib message
1227  *
1228  * note: call seek_grib first
1229  *
1230  * v1.0 9/94 Wesley Ebisuzaki
1231  *
1232  */
1233 
read_grib(FILE * file,off_t pos,off_t len_grib,unsigned char * buffer)1234 int read_grib(FILE *file, off_t pos, off_t len_grib, unsigned char *buffer) {
1235 
1236     int i;
1237 
1238 
1239     if (fseeko(file, pos, SEEK_SET) == -1) {
1240 	    return 0;
1241     }
1242 
1243     i = fread(buffer, sizeof (unsigned char), len_grib, file);
1244     return (i == len_grib);
1245 }
1246 
1247 /*
1248  * w. ebisuzaki
1249  *
1250  *  return x**y
1251  *
1252  *
1253  *  input: double x
1254  *	   int y
1255  */
int_power(double x,int y)1256 double int_power(double x, int y) {
1257 
1258 	double value;
1259 
1260 	if (y < 0) {
1261 		y = -y;
1262 		x = 1.0 / x;
1263 	}
1264 	value = 1.0;
1265 
1266 	while (y) {
1267 		if (y & 1) {
1268 			value *= x;
1269 		}
1270 		x = x * x;
1271 		y >>= 1;
1272 	}
1273 	return value;
1274 }
1275 
1276 /* cnames.c 				Wesley Ebisuzaki
1277  *
1278  * returns strings with either variable name or comment field
1279  * v1.4 4/98
1280  * reanalysis can use process 180 and subcenter 0
1281  */
1282 
1283 
1284 extern  struct ParmTable parm_table_ncep_opn[256];
1285 extern  struct ParmTable parm_table_ncep_reanal[256];
1286 extern  struct ParmTable parm_table_omb[256];
1287 extern  struct ParmTable parm_table_ecmwf_128[256];
1288 extern  struct ParmTable parm_table_ecmwf_129[256];
1289 extern  struct ParmTable parm_table_ecmwf_130[256];
1290 extern  struct ParmTable parm_table_ecmwf_131[256];
1291 extern  struct ParmTable parm_table_ecmwf_140[256];
1292 extern  struct ParmTable parm_table_ecmwf_150[256];
1293 extern  struct ParmTable parm_table_ecmwf_160[256];
1294 extern  struct ParmTable parm_table_ecmwf_170[256];
1295 extern  struct ParmTable parm_table_ecmwf_180[256];
1296 extern  struct ParmTable parm_table_user[256];
1297 
1298 extern enum Def_NCEP_Table def_ncep_table;
1299 
1300 /*
1301  * returns pointer to the parameter table
1302  */
1303 
1304 
1305 
Parm_Table(unsigned char * pds)1306 static struct ParmTable *Parm_Table(unsigned char *pds) {
1307 
1308     int i, center, subcenter, ptable, process;
1309     static int missing_count = 0, reanal_opn_count = 0;
1310 
1311     center = PDS_Center(pds);
1312     subcenter = PDS_Subcenter(pds);
1313     ptable = PDS_Vsn(pds);
1314 
1315 #ifdef P_TABLE_FIRST
1316     i = setup_user_table(center, subcenter, ptable);
1317     if (i == 1) return &parm_table_user[0];
1318 #endif
1319     /* NCEP opn and reanal */
1320     if (center == NMC && ptable <= 3) {
1321 	if (subcenter == 1) return &parm_table_ncep_reanal[0];
1322         process = PDS_Model(pds);
1323 	if (subcenter != 0 || (process != 80 && process != 180) ||
1324 		(ptable != 1 && ptable != 2))
1325             return &parm_table_ncep_opn[0];
1326 
1327 	/* at this point could be either the opn or reanalysis table */
1328 	if (def_ncep_table == opn_nowarn) return &parm_table_ncep_opn[0];
1329 	if (def_ncep_table == rean_nowarn) return &parm_table_ncep_reanal[0];
1330         if (reanal_opn_count++ == 0) {
1331 	    fprintf(stderr, "Using NCEP %s table, see -ncep_opn, -ncep_rean options\n",
1332                (def_ncep_table == opn) ?  "opn" : "reanalysis");
1333 	}
1334         return (def_ncep_table == opn) ?  &parm_table_ncep_opn[0]
1335 		: &parm_table_ncep_reanal[0];
1336     }
1337     if (center == NMC   && ptable == 128) return &parm_table_omb[0];
1338     if (center == ECMWF) {
1339         if (ptable == 128) return &parm_table_ecmwf_128[0];
1340         if (ptable == 129) return &parm_table_ecmwf_129[0];
1341         if (ptable == 130) return &parm_table_ecmwf_130[0];
1342         if (ptable == 131) return &parm_table_ecmwf_131[0];
1343         if (ptable == 140) return &parm_table_ecmwf_140[0];
1344         if (ptable == 150) return &parm_table_ecmwf_150[0];
1345         if (ptable == 160) return &parm_table_ecmwf_160[0];
1346         if (ptable == 170) return &parm_table_ecmwf_170[0];
1347         if (ptable == 180) return &parm_table_ecmwf_180[0];
1348     }
1349 
1350 
1351 #ifndef P_TABLE_FIRST
1352     i = setup_user_table(center, subcenter, ptable);
1353     if (i == 1) return &parm_table_user[0];
1354 #endif
1355 
1356     if ((ptable > 3 || (PDS_PARAM(pds)) > 127) && missing_count++ == 0) {
1357 	fprintf(stderr,
1358             "\nUndefined parameter table (center %d-%d table %d), using NCEP-opn\n",
1359             center, subcenter, ptable);
1360     }
1361     return &parm_table_ncep_opn[0];
1362 }
1363 
1364 /*
1365  * return name field of PDS_PARAM(pds)
1366  */
1367 
k5toa(unsigned char * pds)1368 char *k5toa(unsigned char *pds) {
1369 
1370     return (Parm_Table(pds) + PDS_PARAM(pds))->name;
1371 }
1372 
1373 /*
1374  * return comment field of the PDS_PARAM(pds)
1375  */
1376 
k5_comments(unsigned char * pds)1377 char *k5_comments(unsigned char *pds) {
1378 
1379     return (Parm_Table(pds) + PDS_PARAM(pds))->comment;
1380 }
1381 
1382 /* 1996				wesley ebisuzaki
1383  *
1384  * Unpack BDS section
1385  *
1386  * input: *bits, pointer to packed integer data
1387  *        *bitmap, pointer to bitmap (undefined data), NULL if none
1388  *        n_bits, number of bits per packed integer
1389  *        n, number of data points (includes undefined data)
1390  *        ref, scale: flt[] = ref + scale*packed_int
1391  * output: *flt, pointer to output array
1392  *        undefined values filled with UNDEFINED
1393  *
1394  * note: code assumes an integer > 32 bits
1395  *
1396  * 7/98 v1.2.1 fix bug for bitmaps and nbit >= 25 found by Larry Brasfield
1397  */
1398 
1399 static unsigned int mask[] = {0,1,3,7,15,31,63,127,255};
1400 static unsigned int map_masks[8] = {128, 64, 32, 16, 8, 4, 2, 1};
1401 
BDS_unpack(float * flt,unsigned char * bits,unsigned char * bitmap,int n_bits,int n,double ref,double scale)1402 void BDS_unpack(float *flt, unsigned char *bits, unsigned char *bitmap,
1403 	int n_bits, int n, double ref, double scale) {
1404 
1405     int i, mask_idx, t_bits, c_bits, j_bits;
1406     unsigned int j, map_mask, tbits, jmask, bbits;
1407     long int jj;
1408 
1409     tbits = bbits = 0;
1410 
1411     /* assume integer has 32+ bits */
1412     if (n_bits <= 25) {
1413         jmask = (1 << n_bits) - 1;
1414         t_bits = 0;
1415 
1416         if (bitmap) {
1417 	    for (i = 0; i < n; i++) {
1418 		/* check bitmap */
1419 		mask_idx = i & 7;
1420 		if (mask_idx == 0) bbits = *bitmap++;
1421 	        if ((bbits & map_masks[mask_idx]) == 0) {
1422 		    *flt++ = UNDEFINED;
1423 		    continue;
1424 	        }
1425 
1426 	        while (t_bits < n_bits) {
1427 	            tbits = (tbits * 256) + *bits++;
1428 	            t_bits += 8;
1429 	        }
1430 	        t_bits -= n_bits;
1431 	        j = (tbits >> t_bits) & jmask;
1432 	        *flt++ = ref + scale*j;
1433             }
1434         }
1435         else {
1436 	    for (i = 0; i < n; i++) {
1437                 while (t_bits < n_bits) {
1438                     tbits = (tbits * 256) + *bits++;
1439                     t_bits += 8;
1440                 }
1441                 t_bits -= n_bits;
1442                 flt[i] = (tbits >> t_bits) & jmask;
1443             }
1444 	    /* at least this vectorizes :) */
1445 	    for (i = 0; i < n; i++) {
1446 		flt[i] = ref + scale*flt[i];
1447 	    }
1448         }
1449     }
1450     else {
1451 	/* older unoptimized code, not often used */
1452         c_bits = 8;
1453         map_mask = 128;
1454         while (n-- > 0) {
1455 	    if (bitmap) {
1456 	        j = (*bitmap & map_mask);
1457 	        if ((map_mask >>= 1) == 0) {
1458 		    map_mask = 128;
1459 		    bitmap++;
1460 	        }
1461 	        if (j == 0) {
1462 		    *flt++ = UNDEFINED;
1463 		    continue;
1464 	        }
1465 	    }
1466 
1467 	    jj = 0;
1468 	    j_bits = n_bits;
1469 	    while (c_bits <= j_bits) {
1470 	        if (c_bits == 8) {
1471 		    jj = (jj << 8) + *bits++;
1472 		    j_bits -= 8;
1473 	        }
1474 	        else {
1475 		    jj = (jj << c_bits) + (*bits & mask[c_bits]);
1476 		    bits++;
1477 		    j_bits -= c_bits;
1478 		    c_bits = 8;
1479 	        }
1480 	    }
1481 	    if (j_bits) {
1482 	        c_bits -= j_bits;
1483 	        jj = (jj << j_bits) + ((*bits >> c_bits) & mask[j_bits]);
1484 	    }
1485 	    *flt++ = ref + scale*jj;
1486         }
1487     }
1488     return;
1489 }
1490 
1491 /*
1492  * convert a float to an ieee single precision number v1.1
1493  * (big endian)
1494  *                      Wesley Ebisuzaki
1495  *
1496  * bugs: doesn't handle subnormal numbers
1497  * bugs: assumes length of integer >= 25 bits
1498  */
1499 
flt2ieee(float x,unsigned char * ieee)1500 int flt2ieee(float x, unsigned char *ieee) {
1501 
1502 	int sign, exp;
1503         unsigned int umant;
1504 	double mant;
1505 
1506 	if (x == 0.0) {
1507 		ieee[0] = ieee[1] = ieee[2] = ieee[3] = 0;
1508 		return 0;
1509 	}
1510 
1511 	/* sign bit */
1512 	if (x < 0.0) {
1513 		sign = 128;
1514 		x = -x;
1515 	}
1516 	else sign = 0;
1517 	mant = frexp((double) x, &exp);
1518 
1519         /* 2^24 = 16777216 */
1520 
1521 	umant = mant * 16777216 + 0.5;
1522 	if (umant >= 16777216) {
1523             umant = umant / 2;
1524             exp++;
1525         }
1526         /* bit 24 should be a 1 .. not used in ieee format */
1527 
1528 	exp = exp - 1 + 127;
1529 
1530 	if (exp < 0) {
1531 		/* signed zero */
1532 		ieee[0] = sign;
1533 		ieee[1] = ieee[2] = ieee[3] = 0;
1534 		return 0;
1535 	}
1536 	if (exp > 255) {
1537 		/* signed infinity */
1538 		ieee[0] = sign + 127;
1539 		ieee[1] = 128;
1540                 ieee[2] = ieee[3] = 0;
1541                 return 0;
1542 	}
1543 	/* normal number */
1544 
1545 	ieee[0] = sign + (exp >> 1);
1546 
1547         ieee[3] = umant & 255;
1548         ieee[2] = (umant >> 8) & 255;
1549         ieee[1] = ((exp & 1) << 7) + ((umant >> 16) & 127);
1550 	return 0;
1551 }
1552 
1553 
1554 /* wesley ebisuzaki v1.3
1555  *
1556  * write ieee file -- big endian format
1557  *
1558  * input float *array		data to be written
1559  *	 int n			size of array
1560  *	 int header		1 for f77 style header 0 for none
1561  *				(header is 4 byte header
1562  *	 FILE *output		output file
1563  *
1564  * v1.2 7/97 buffered, faster
1565  * v1.3 2/99 fixed (typo) error in wrtieee_header found by
1566  *     Bob Farquhar
1567  */
1568 
1569 #define BSIZ 1024*4
1570 
wrtieee(float * array,int n,int header,FILE * output)1571 int wrtieee(float *array, int n, int header, FILE *output) {
1572 
1573 	unsigned long int l;
1574 	int i, nbuf;
1575 	unsigned char buff[BSIZ];
1576 	unsigned char h4[4];
1577 
1578 	nbuf = 0;
1579 	if (header) {
1580 		l = n * 4;
1581 		for (i = 0; i < 4; i++) {
1582 			h4[i] = l & 255;
1583 			l >>= 8;
1584 		}
1585 		buff[nbuf++] = h4[3];
1586 		buff[nbuf++] = h4[2];
1587 		buff[nbuf++] = h4[1];
1588 		buff[nbuf++] = h4[0];
1589 	}
1590 	for (i = 0; i < n; i++) {
1591 		if (nbuf >= BSIZ) {
1592 		    fwrite(buff, 1, BSIZ, output);
1593 		    nbuf = 0;
1594 		}
1595 		flt2ieee(array[i], buff + nbuf);
1596 		nbuf += 4;
1597 	}
1598 	if (header) {
1599 		if (nbuf == BSIZ) {
1600 		    fwrite(buff, 1, BSIZ, output);
1601 		    nbuf = 0;
1602 		}
1603 		buff[nbuf++] = h4[3];
1604 		buff[nbuf++] = h4[2];
1605 		buff[nbuf++] = h4[1];
1606 		buff[nbuf++] = h4[0];
1607 	}
1608 	if (nbuf) fwrite(buff, 1, nbuf, output);
1609 	return 0;
1610 }
1611 
1612 /* write a big-endian 4 byte integer .. f77 IEEE  header */
1613 
wrtieee_header(unsigned int n,FILE * output)1614 int wrtieee_header(unsigned int n, FILE *output) {
1615 	unsigned h4[4];
1616 
1617 	h4[0] = n & 255;
1618 	h4[1] = (n >> 8) & 255;
1619 	h4[2] = (n >> 16) & 255;
1620 	h4[3] = (n >> 24) & 255;
1621 
1622 	putc(h4[3],output);
1623 	putc(h4[2],output);
1624 	putc(h4[1],output);
1625 	putc(h4[0],output);
1626 
1627 	return 0;
1628 }
1629 
1630 
1631 /* wesley ebisuzaki v1.0
1632  *
1633  * levels.c
1634  *
1635  * prints out a simple description of kpds6, kpds7
1636  *    (level/layer data)
1637  *  kpds6 = octet 10 of the PDS
1638  *  kpds7 = octet 11 and 12 of the PDS
1639  *    (kpds values are from NMC's grib routines)
1640  *
1641  * the description of the levels is
1642  *   (1) incomplete
1643  *   (2) include some NMC-only values (>= 200?)
1644  *
1645  * v1.1 wgrib v1.7.3.1 updated with new levels
1646  */
1647 
levels(int kpds6,int kpds7)1648 void levels(int kpds6, int kpds7) {
1649 
1650 	int o11, o12;
1651 
1652 	/* octets 11 and 12 */
1653 	o11 = kpds7 / 256;
1654 	o12 = kpds7 % 256;
1655 
1656 
1657 	switch (kpds6) {
1658 
1659 	case 1: printf("sfc");
1660 		break;
1661 	case 2: printf("cld base");
1662 		break;
1663 	case 3: printf("cld top");
1664 		break;
1665 	case 4: printf("0C isotherm");
1666 		break;
1667 	case 5: printf("cond lev");
1668 		break;
1669 	case 6: printf("max wind lev");
1670 		break;
1671 	case 7: printf("tropopause");
1672 		break;
1673 	case 8: printf("nom. top");
1674 		break;
1675 	case 9: printf("sea bottom");
1676 		break;
1677 	case 200:
1678 	case 10: printf("atmos col");
1679 		break;
1680 
1681 	case 12:
1682 	case 212: printf("low cld bot");
1683 		break;
1684 	case 13:
1685 	case 213: printf("low cld top");
1686 		break;
1687 	case 14:
1688 	case 214: printf("low cld lay");
1689 		break;
1690 	case 22:
1691 	case 222: printf("mid cld bot");
1692 		break;
1693 	case 23:
1694 	case 223: printf("mid cld top");
1695 		break;
1696 	case 24:
1697 	case 224: printf("mid cld lay");
1698 		break;
1699 	case 32:
1700 	case 232: printf("high cld bot");
1701 		break;
1702 	case 33:
1703 	case 233: printf("high cld top");
1704 		break;
1705 	case 34:
1706 	case 234: printf("high cld lay");
1707 		break;
1708 
1709 	case 201: printf("ocean column");
1710 		break;
1711 	case 209: printf("bndary-layer cld bot");
1712 		break;
1713 	case 210: printf("bndary-layer cld top");
1714 		break;
1715 	case 211: printf("bndary-layer cld layer");
1716 		break;
1717 	case 242: printf("convect-cld bot");
1718 		break;
1719 	case 243: printf("convect-cld top");
1720 		break;
1721 	case 244: printf("convect-cld layer");
1722 		break;
1723 
1724 	case 100: printf("%d mb",kpds7);
1725 	 	break;
1726 	case 101: printf("%d-%d mb",o11*10,o12*10);
1727 	 	break;
1728 	case 102: printf("MSL");
1729 	 	break;
1730 	case 103: printf("%d m above MSL",kpds7);
1731 	 	break;
1732 	case 104: printf("%d-%d m above msl",o11*100,o12*100);
1733 	 	break;
1734 	case 105: printf("%d m above gnd",kpds7);
1735 	 	break;
1736 	case 106: printf("%d-%d m above gnd",o11*100,o12*100);
1737 	 	break;
1738 	case 107: printf("sigma=%.4f",kpds7/10000.0);
1739 	 	break;
1740 	case 108: printf("sigma %.2f-%.2f",o11/100.0,o12/100.0);
1741 	 	break;
1742 	case 109: printf("hybrid lev %d",kpds7);
1743 	 	break;
1744 	case 110: printf("hybrid %d-%d",o11,o12);
1745 	 	break;
1746 	case 111: printf("%d cm down",kpds7);
1747 	 	break;
1748 	case 112: printf("%d-%d cm down",o11,o12);
1749 	 	break;
1750 	case 113: printf("%dK",kpds7);
1751 	 	break;
1752 	case 114: printf("%d-%dK",475-o11,475-o12);
1753 	 	break;
1754 	case 115: printf("%d mb above gnd",kpds7);
1755 	 	break;
1756 	case 116: printf("%d-%d mb above gnd",o11,o12);
1757 	 	break;
1758 	case 117: printf("%d (pv units)",kpds7); /* units are suspect */
1759 	 	break;
1760 	case 119: printf("%.5f (ETA level)",kpds7/10000.0);
1761 	 	break;
1762 	case 120: printf("%.2f-%.2f (ETA levels)",o11/100.0,o12/100.0);
1763 	 	break;
1764 	case 121: printf("%d-%d mb",1100-o11,1100-o12);
1765 	 	break;
1766 	case 125: printf("%d cm above gnd",kpds7);
1767 	 	break;
1768 	case 128: printf("%.3f-%.3f (sigma)",1.1-o11/1000.0, 1.1-o12/1000.0);
1769 	 	break;
1770 	case 141: printf("%d-%d mb",o11,1100-o12);
1771 	 	break;
1772 	case 160: printf("%d m below sea level",kpds7);
1773 	 	break;
1774 	default:
1775 	 	break;
1776 	}
1777 }
1778 
1779 /*
1780  * PDStimes.c   v1.2 wesley ebisuzaki
1781  *
1782  * prints something readable for time code in grib file
1783  *
1784  * not all cases decoded
1785  * for NCEP/NCAR Reanalysis
1786  *
1787  * v1.2.1 1/99 fixed forecast time unit table
1788  */
1789 
1790 static char *units[] = {
1791 	"min", "hr", "d", "mon", "yr",
1792 	"decade", "normal", "century", "??", "??", " x3 hours", " x6 hours",
1793         " x12 hours",
1794         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1795         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1796         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1797         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1798         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1799         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1800         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1801         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1802         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1803         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1804         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1805         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1806         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1807         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1808         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1809         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1810         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1811         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1812         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1813         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1814         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1815         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1816         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1817         "??", "??", "??", "??", "??", "??", "??", "??", "??", "??",
1818         "??", " sec"};
1819 
PDStimes(int time_range,int p1,int p2,int time_unit)1820 void PDStimes(int time_range, int p1, int p2, int time_unit) {
1821 
1822 	char *unit;
1823 	enum {anal, fcst, unknown} type;
1824 	int fcst_len = 0;
1825 
1826 	if (time_unit >= 0 && time_unit <= sizeof(units)/sizeof(char *))
1827              unit = units[time_unit];
1828 	else unit = "";
1829 
1830 
1831         /* change x3/x6/x12 to hours */
1832 
1833         if (time_unit == HOURS3) {
1834 	    p1 *= 3; p2 *= 3;
1835 	    time_unit = HOUR;
1836         }
1837         else if (time_unit == HOURS6) {
1838 	    p1 *= 6; p2 *= 6;
1839 	    time_unit = HOUR;
1840         }
1841         else if (time_unit == HOURS12) {
1842 	    p1 *= 12; p2 *= 12;
1843 	    time_unit = HOUR;
1844         }
1845 
1846 	if (time_unit >= 0 && time_unit <= sizeof(units)/sizeof(char *))
1847              unit = units[time_unit];
1848 	else unit = "";
1849 
1850 	/* figure out if analysis or forecast */
1851 	/* in GRIB, there is a difference between init and uninit analyses */
1852 	/* not case at NMC .. no longer run initialization */
1853 	/* ignore diff between init an uninit analyses */
1854 
1855 	switch (time_range) {
1856 
1857 	case 0:
1858 	case 1:
1859 	case 113:
1860 	case 114:
1861 	case 118:
1862 		if (p1 == 0) type = anal;
1863 		else {
1864 			type = fcst;
1865 			fcst_len = p1;
1866 		}
1867 		break;
1868 	case 10: /* way NMC uses it, should be unknown? */
1869 		type = fcst;
1870 		fcst_len = p1*256 + p2;
1871 		if (fcst_len == 0) type = anal;
1872 		break;
1873 
1874 	case 51:
1875 	case 123:
1876 	case 124:
1877 		type = anal;
1878 		break;
1879 
1880 	default: type = unknown;
1881 		break;
1882 	}
1883 
1884 	/* ----------------------------------------------- */
1885 
1886 	if (type == anal) printf("anl:");
1887 	else if (type == fcst) printf("%d%s fcst:",fcst_len,unit);
1888 
1889 
1890 	if (time_range == 123 || time_range == 124) {
1891 		if (p1 != 0) printf("start@%d%s:",p1,unit);
1892 	}
1893 
1894 
1895 	/* print time range */
1896 
1897 
1898 	switch (time_range) {
1899 
1900 	case 0:
1901 	case 1:
1902 	case 10:
1903 		break;
1904 	case 2: printf("valid %d-%d%s:",p1,p2,unit);
1905 		break;
1906 	case 3: printf("%d-%d%s ave:",p1,p2,unit);
1907 		break;
1908 	case 4: printf("%d-%d%s acc:",p1,p2,unit);
1909 		break;
1910 	case 5: printf("%d-%d%s diff:",p1,p2,unit);
1911 		break;
1912 	case 51: if (p1 == 0) {
1913 		    printf("clim %d%s:",p2,unit);
1914 		}
1915 		else if (p1 == 1) {
1916 		    printf("clim (diurnal) %d%s:",p2,unit);
1917 		}
1918 		else {
1919 		    printf("clim? p1=%d? %d%s?:",p1,p2,unit);
1920 		}
1921 		break;
1922 	case 113:
1923 	case 123:
1924 		printf("ave@%d%s:",p2,unit);
1925 		break;
1926 	case 114:
1927 	case 124:
1928 		printf("acc@%d%s:",p2,unit);
1929 		break;
1930 	case 115:
1931 		printf("ave of fcst:%d to %d%s:",p1,p2,unit);
1932 		break;
1933 	case 116:
1934 		printf("acc of fcst:%d to %d%s:",p1,p2,unit);
1935 		break;
1936 	case 118:
1937 		printf("var@%d%s:",p2,unit);
1938 		break;
1939 	default: printf("time?:");
1940 	}
1941 }
1942 
1943 /*
1944  *  number of missing data points w. ebisuzaki
1945  *
1946  *  v1.1: just faster my dear
1947  *  v1.2: just faster my dear
1948  *
1949  */
1950 
1951 static int bitsum[256] = {
1952     8, 7, 7, 6, 7, 6, 6, 5, 7, 6, 6, 5, 6, 5, 5, 4,
1953     7, 6, 6, 5, 6, 5, 5, 4, 6, 5, 5, 4, 5, 4, 4, 3,
1954     7, 6, 6, 5, 6, 5, 5, 4, 6, 5, 5, 4, 5, 4, 4, 3,
1955     6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
1956     7, 6, 6, 5, 6, 5, 5, 4, 6, 5, 5, 4, 5, 4, 4, 3,
1957     6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
1958     6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
1959     5, 4, 4, 3, 4, 3, 3, 2, 4, 3, 3, 2, 3, 2, 2, 1,
1960     7, 6, 6, 5, 6, 5, 5, 4, 6, 5, 5, 4, 5, 4, 4, 3,
1961     6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
1962     6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
1963     5, 4, 4, 3, 4, 3, 3, 2, 4, 3, 3, 2, 3, 2, 2, 1,
1964     6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
1965     5, 4, 4, 3, 4, 3, 3, 2, 4, 3, 3, 2, 3, 2, 2, 1,
1966     5, 4, 4, 3, 4, 3, 3, 2, 4, 3, 3, 2, 3, 2, 2, 1,
1967     4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0};
1968 
1969 
missing_points(unsigned char * bitmap,int n)1970 int missing_points(unsigned char *bitmap, int n) {
1971 
1972     int count;
1973     unsigned int tmp;
1974     if (bitmap == NULL) return 0;
1975 
1976     count = 0;
1977     while (n >= 8) {
1978 	tmp = *bitmap++;
1979 	n -= 8;
1980         count += bitsum[tmp];
1981     }
1982     tmp = *bitmap | ((1 << (8 - n)) - 1);
1983     count += bitsum[tmp];
1984 
1985     return count;
1986 }
1987 
1988 /*
1989  * parameter table for NCEP (operations)
1990  * center = 7, subcenter != 2 parameter table = 1, 2, 3 etc
1991  * note: see reanalysis parameter table for problems
1992  * updated 5/11/99
1993  */
1994 
1995 struct ParmTable parm_table_ncep_opn[256] = {
1996    /* 0 */ {"var0", "undefined"},
1997    /* 1 */ {"PRES", "Pressure [Pa]"},
1998    /* 2 */ {"PRMSL", "Pressure reduced to MSL [Pa]"},
1999    /* 3 */ {"PTEND", "Pressure tendency [Pa/s]"},
2000    /* 4 */ {"PVORT", "Pot. vorticity [km^2/kg/s]"},
2001    /* 5 */ {"ICAHT", "ICAO Standard Atmosphere Reference Height [M]"},
2002    /* 6 */ {"GP", "Geopotential [m^2/s^2]"},
2003    /* 7 */ {"HGT", "Geopotential height [gpm]"},
2004    /* 8 */ {"DIST", "Geometric height [m]"},
2005    /* 9 */ {"HSTDV", "Std dev of height [m]"},
2006    /* 10 */ {"TOZNE", "Total ozone [Dobson]"},
2007    /* 11 */ {"TMP", "Temp. [K]"},
2008    /* 12 */ {"VTMP", "Virtual temp. [K]"},
2009    /* 13 */ {"POT", "Potential temp. [K]"},
2010    /* 14 */ {"EPOT", "Pseudo-adiabatic pot. temp. [K]"},
2011    /* 15 */ {"TMAX", "Max. temp. [K]"},
2012    /* 16 */ {"TMIN", "Min. temp. [K]"},
2013    /* 17 */ {"DPT", "Dew point temp. [K]"},
2014    /* 18 */ {"DEPR", "Dew point depression [K]"},
2015    /* 19 */ {"LAPR", "Lapse rate [K/m]"},
2016    /* 20 */ {"VIS", "Visibility [m]"},
2017    /* 21 */ {"RDSP1", "Radar spectra (1) [non-dim]"},
2018    /* 22 */ {"RDSP2", "Radar spectra (2) [non-dim]"},
2019    /* 23 */ {"RDSP3", "Radar spectra (3) [non-dim]"},
2020    /* 24 */ {"PLI", "Parcel lifted index (to 500 hPa) [K]"},
2021    /* 25 */ {"TMPA", "Temp. anomaly [K]"},
2022    /* 26 */ {"PRESA", "Pressure anomaly [Pa]"},
2023    /* 27 */ {"GPA", "Geopotential height anomaly [gpm]"},
2024    /* 28 */ {"WVSP1", "Wave spectra (1) [non-dim]"},
2025    /* 29 */ {"WVSP2", "Wave spectra (2) [non-dim]"},
2026    /* 30 */ {"WVSP3", "Wave spectra (3) [non-dim]"},
2027    /* 31 */ {"WDIR", "Wind direction [deg]"},
2028    /* 32 */ {"WIND", "Wind speed [m/s]"},
2029    /* 33 */ {"UGRD", "u wind [m/s]"},
2030    /* 34 */ {"VGRD", "v wind [m/s]"},
2031    /* 35 */ {"STRM", "Stream function [m^2/s]"},
2032    /* 36 */ {"VPOT", "Velocity potential [m^2/s]"},
2033    /* 37 */ {"MNTSF", "Montgomery stream function [m^2/s^2]"},
2034    /* 38 */ {"SGCVV", "Sigma coord. vertical velocity [/s]"},
2035    /* 39 */ {"VVEL", "Pressure vertical velocity [Pa/s]"},
2036    /* 40 */ {"DZDT", "Geometric vertical velocity [m/s]"},
2037    /* 41 */ {"ABSV", "Absolute vorticity [/s]"},
2038    /* 42 */ {"ABSD", "Absolute divergence [/s]"},
2039    /* 43 */ {"RELV", "Relative vorticity [/s]"},
2040    /* 44 */ {"RELD", "Relative divergence [/s]"},
2041    /* 45 */ {"VUCSH", "Vertical u shear [/s]"},
2042    /* 46 */ {"VVCSH", "Vertical v shear [/s]"},
2043    /* 47 */ {"DIRC", "Direction of current [deg]"},
2044    /* 48 */ {"SPC", "Speed of current [m/s]"},
2045    /* 49 */ {"UOGRD", "u of current [m/s]"},
2046    /* 50 */ {"VOGRD", "v of current [m/s]"},
2047    /* 51 */ {"SPFH", "Specific humidity [kg/kg]"},
2048    /* 52 */ {"RH", "Relative humidity [%]"},
2049    /* 53 */ {"MIXR", "Humidity mixing ratio [kg/kg]"},
2050    /* 54 */ {"PWAT", "Precipitable water [kg/m^2]"},
2051    /* 55 */ {"VAPP", "Vapor pressure [Pa]"},
2052    /* 56 */ {"SATD", "Saturation deficit [Pa]"},
2053    /* 57 */ {"EVP", "Evaporation [kg/m^2]"},
2054    /* 58 */ {"CICE", "Cloud Ice [kg/m^2]"},
2055    /* 59 */ {"PRATE", "Precipitation rate [kg/m^2/s]"},
2056    /* 60 */ {"TSTM", "Thunderstorm probability [%]"},
2057    /* 61 */ {"APCP", "Total precipitation [kg/m^2]"},
2058    /* 62 */ {"NCPCP", "Large scale precipitation [kg/m^2]"},
2059    /* 63 */ {"ACPCP", "Convective precipitation [kg/m^2]"},
2060    /* 64 */ {"SRWEQ", "Snowfall rate water equiv. [kg/m^2/s]"},
2061    /* 65 */ {"WEASD", "Accum. snow [kg/m^2]"},
2062    /* 66 */ {"SNOD", "Snow depth [m]"},
2063    /* 67 */ {"MIXHT", "Mixed layer depth [m]"},
2064    /* 68 */ {"TTHDP", "Transient thermocline depth [m]"},
2065    /* 69 */ {"MTHD", "Main thermocline depth [m]"},
2066    /* 70 */ {"MTHA", "Main thermocline anomaly [m]"},
2067    /* 71 */ {"TCDC", "Total cloud cover [%]"},
2068    /* 72 */ {"CDCON", "Convective cloud cover [%]"},
2069    /* 73 */ {"LCDC", "Low level cloud cover [%]"},
2070    /* 74 */ {"MCDC", "Mid level cloud cover [%]"},
2071    /* 75 */ {"HCDC", "High level cloud cover [%]"},
2072    /* 76 */ {"CWAT", "Cloud water [kg/m^2]"},
2073    /* 77 */ {"BLI", "Best lifted index (to 500 hPa) [K]"},
2074    /* 78 */ {"SNOC", "Convective snow [kg/m^2]"},
2075    /* 79 */ {"SNOL", "Large scale snow [kg/m^2]"},
2076    /* 80 */ {"WTMP", "Water temp. [K]"},
2077    /* 81 */ {"LAND", "Land cover (land=1;sea=0) [fraction]"},
2078    /* 82 */ {"DSLM", "Deviation of sea level from mean [m]"},
2079    /* 83 */ {"SFCR", "Surface roughness [m]"},
2080    /* 84 */ {"ALBDO", "Albedo [%]"},
2081    /* 85 */ {"TSOIL", "Soil temp. [K]"},
2082    /* 86 */ {"SOILM", "Soil moisture content [kg/m^2]"},
2083    /* 87 */ {"VEG", "Vegetation [%]"},
2084    /* 88 */ {"SALTY", "Salinity [kg/kg]"},
2085    /* 89 */ {"DEN", "Density [kg/m^3]"},
2086    /* 90 */ {"WATR", "Water runoff [kg/m^2]"},
2087    /* 91 */ {"ICEC", "Ice concentration (ice=1;no ice=0) [fraction]"},
2088    /* 92 */ {"ICETK", "Ice thickness [m]"},
2089    /* 93 */ {"DICED", "Direction of ice drift [deg]"},
2090    /* 94 */ {"SICED", "Speed of ice drift [m/s]"},
2091    /* 95 */ {"UICE", "u of ice drift [m/s]"},
2092    /* 96 */ {"VICE", "v of ice drift [m/s]"},
2093    /* 97 */ {"ICEG", "Ice growth rate [m/s]"},
2094    /* 98 */ {"ICED", "Ice divergence [/s]"},
2095    /* 99 */ {"SNOM", "Snow melt [kg/m^2]"},
2096    /* 100 */ {"HTSGW", "Sig height of wind waves and swell [m]"},
2097    /* 101 */ {"WVDIR", "Direction of wind waves [deg]"},
2098    /* 102 */ {"WVHGT", "Sig height of wind waves [m]"},
2099    /* 103 */ {"WVPER", "Mean period of wind waves [s]"},
2100    /* 104 */ {"SWDIR", "Direction of swell waves [deg]"},
2101    /* 105 */ {"SWELL", "Sig height of swell waves [m]"},
2102    /* 106 */ {"SWPER", "Mean period of swell waves [s]"},
2103    /* 107 */ {"DIRPW", "Primary wave direction [deg]"},
2104    /* 108 */ {"PERPW", "Primary wave mean period [s]"},
2105    /* 109 */ {"DIRSW", "Secondary wave direction [deg]"},
2106    /* 110 */ {"PERSW", "Secondary wave mean period [s]"},
2107    /* 111 */ {"NSWRS", "Net short wave (surface) [W/m^2]"},
2108    /* 112 */ {"NLWRS", "Net long wave (surface) [W/m^2]"},
2109    /* 113 */ {"NSWRT", "Net short wave (top) [W/m^2]"},
2110    /* 114 */ {"NLWRT", "Net long wave (top) [W/m^2]"},
2111    /* 115 */ {"LWAVR", "Long wave [W/m^2]"},
2112    /* 116 */ {"SWAVR", "Short wave [W/m^2]"},
2113    /* 117 */ {"GRAD", "Global radiation [W/m^2]"},
2114    /* 118 */ {"BRTMP", "Brightness temperature [K]"},
2115    /* 119 */ {"LWRAD", "Radiance with respect to wave no. [W/m/sr]"},
2116    /* 120 */ {"SWRAD", "Radiance with respect ot wave len. [W/m^3/sr]"},
2117    /* 121 */ {"LHTFL", "Latent heat flux [W/m^2]"},
2118    /* 122 */ {"SHTFL", "Sensible heat flux [W/m^2]"},
2119    /* 123 */ {"BLYDP", "Boundary layer dissipation [W/m^2]"},
2120    /* 124 */ {"UFLX", "Zonal momentum flux [N/m^2]"},
2121    /* 125 */ {"VFLX", "Meridional momentum flux [N/m^2]"},
2122    /* 126 */ {"WMIXE", "Wind mixing energy [J]"},
2123    /* 127 */ {"IMGD", "Image data []"},
2124    /* 128 */ {"MSLSA", "Mean sea level pressure (Std Atm) [Pa]"},
2125    /* 129 */ {"MSLMA", "Mean sea level pressure (MAPS) [Pa]"},
2126    /* 130 */ {"MSLET", "Mean sea level pressure (ETA model) [Pa]"},
2127    /* 131 */ {"LFTX", "Surface lifted index [K]"},
2128    /* 132 */ {"4LFTX", "Best (4-layer) lifted index [K]"},
2129    /* 133 */ {"KX", "K index [K]"},
2130    /* 134 */ {"SX", "Sweat index [K]"},
2131    /* 135 */ {"MCONV", "Horizontal moisture divergence [kg/kg/s]"},
2132    /* 136 */ {"VWSH", "Vertical speed shear [1/s]"},
2133    /* 137 */ {"TSLSA", "3-hr pressure tendency (Std Atmos Red) [Pa/s]"},
2134    /* 138 */ {"BVF2", "Brunt-Vaisala frequency^2 [1/s^2]"},
2135    /* 139 */ {"PVMW", "Potential vorticity (mass-weighted) [1/s/m]"},
2136    /* 140 */ {"CRAIN", "Categorical rain [yes=1;no=0]"},
2137    /* 141 */ {"CFRZR", "Categorical freezing rain [yes=1;no=0]"},
2138    /* 142 */ {"CICEP", "Categorical ice pellets [yes=1;no=0]"},
2139    /* 143 */ {"CSNOW", "Categorical snow [yes=1;no=0]"},
2140    /* 144 */ {"SOILW", "Volumetric soil moisture [fraction]"},
2141    /* 145 */ {"PEVPR", "Potential evaporation rate [W/m^2]"},
2142    /* 146 */ {"CWORK", "Cloud work function [J/kg]"},
2143    /* 147 */ {"U-GWD", "Zonal gravity wave stress [N/m^2]"},
2144    /* 148 */ {"V-GWD", "Meridional gravity wave stress [N/m^2]"},
2145    /* 149 */ {"PV", "Potential vorticity [m^2/s/kg]"},
2146    /* 150 */ {"COVMZ", "Covariance between u and v [m^2/s^2]"},
2147    /* 151 */ {"COVTZ", "Covariance between u and T [K*m/s]"},
2148    /* 152 */ {"COVTM", "Covariance between v and T [K*m/s]"},
2149    /* 153 */ {"CLWMR", "Cloud water [kg/kg]"},
2150    /* 154 */ {"O3MR", "Ozone mixing ratio [kg/kg]"},
2151    /* 155 */ {"GFLUX", "Ground heat flux [W/m^2]"},
2152    /* 156 */ {"CIN", "Convective inhibition [J/kg]"},
2153    /* 157 */ {"CAPE", "Convective Avail. Pot. Energy [J/kg]"},
2154    /* 158 */ {"TKE", "Turbulent kinetic energy [J/kg]"},
2155    /* 159 */ {"CONDP", "Lifted parcel condensation pressure [Pa]"},
2156    /* 160 */ {"CSUSF", "Clear sky upward solar flux [W/m^2]"},
2157    /* 161 */ {"CSDSF", "Clear sky downward solar flux [W/m^2]"},
2158    /* 162 */ {"CSULF", "Clear sky upward long wave flux [W/m^2]"},
2159    /* 163 */ {"CSDLF", "Clear sky downward long wave flux [W/m^2]"},
2160    /* 164 */ {"CFNSF", "Cloud forcing net solar flux [W/m^2]"},
2161    /* 165 */ {"CFNLF", "Cloud forcing net long wave flux [W/m^2]"},
2162    /* 166 */ {"VBDSF", "Visible beam downward solar flux [W/m^2]"},
2163    /* 167 */ {"VDDSF", "Visible diffuse downward solar flux [W/m^2]"},
2164    /* 168 */ {"NBDSF", "Near IR beam downward solar flux [W/m^2]"},
2165    /* 169 */ {"NDDSF", "Near IR diffuse downward solar flux [W/m^2]"},
2166    /* 170 */ {"RWMR", "Rain water mixing ratio [kg/kg]"},
2167    /* 171 */ {"SNMR", "Snow mixing ratio [kg/kg]"},
2168    /* 172 */ {"MFLX", "Momentum flux [N/m^2]"},
2169    /* 173 */ {"LMH", "Mass point model surface [non-dim]"},
2170    /* 174 */ {"LMV", "Velocity point model surface [non-dim]"},
2171    /* 175 */ {"MLYNO", "Model layer number (from bottom up) [non-dim]"},
2172    /* 176 */ {"NLAT", "Latitude (-90 to +90) [deg]"},
2173    /* 177 */ {"ELON", "East longitude (0-360) [deg]"},
2174    /* 178 */ {"ICMR", "Ice mixing ratio [kg/kg]"},
2175    /* 179 */ {"GRMR", "Graupel mixing ratio"},
2176    /* 180 */ {"var180", "undefined"},
2177    /* 181 */ {"LPSX", "x-gradient of log pressure [1/m]"},
2178    /* 182 */ {"LPSY", "y-gradient of log pressure [1/m]"},
2179    /* 183 */ {"HGTX", "x-gradient of height [m/m]"},
2180    /* 184 */ {"HGTY", "y-gradient of height [m/m]"},
2181    /* 185 */ {"TURB", "Turbulence SIGMET/AIRMET [non-dim]"},
2182    /* 186 */ {"ICNG", "Icing SIGMET/AIRMET [non-dim]"},
2183    /* 187 */ {"LTNG", "Lightning [non-dim]"},
2184    /* 188 */ {"var188", "undefined"},
2185    /* 189 */ {"VPTMP", "Virtual pot. temp. [K]"},
2186    /* 190 */ {"HLCY", "Storm relative helicity [m^2/s^2]"},
2187    /* 191 */ {"PROB", "Prob. from ensemble [non-dim]"},
2188    /* 192 */ {"PROBN", "Prob. from ensemble norm. to clim. expect. [non-dim]"},
2189    /* 193 */ {"POP", "Prob. of precipitation [%]"},
2190    /* 194 */ {"CPOFP", "Prob. of frozen precipitation [%]"},
2191    /* 195 */ {"CPOZP", "Prob. of freezing precipitation [%]"},
2192    /* 196 */ {"USTM", "u-component of storm motion [m/s]"},
2193    /* 197 */ {"VSTM", "v-component of storm motion [m/s]"},
2194    /* 198 */ {"NCIP", "No. concen. ice particles"},
2195    /* 199 */ {"EVBS", "Direct evaporation from bare soil [W/m^2]"},
2196    /* 200 */ {"EVCW", "Canopy water evaporation [W/m^2]"},
2197    /* 201 */ {"ICWAT", "Ice-free water surface [%]"},
2198    /* 202 */ {"var202", "undefined"},
2199    /* 203 */ {"var203", "undefined"},
2200    /* 204 */ {"DSWRF", "Downward short wave flux [W/m^2]"},
2201    /* 205 */ {"DLWRF", "Downward long wave flux [W/m^2]"},
2202    /* 206 */ {"UVI", "Ultra violet index (1 hour centered at solar noon) [J/m^2]"},
2203    /* 207 */ {"MSTAV", "Moisture availability [%]"},
2204    /* 208 */ {"SFEXC", "Exchange coefficient [(kg/m^3)(m/s)]"},
2205    /* 209 */ {"MIXLY", "No. of mixed layers next to surface [integer]"},
2206    /* 210 */ {"TRANS", "Transpiration [W/m^2]"},
2207    /* 211 */ {"USWRF", "Upward short wave flux [W/m^2]"},
2208    /* 212 */ {"ULWRF", "Upward long wave flux [W/m^2]"},
2209    /* 213 */ {"CDLYR", "Non-convective cloud [%]"},
2210    /* 214 */ {"CPRAT", "Convective precip. rate [kg/m^2/s]"},
2211    /* 215 */ {"TTDIA", "Temp. tendency by all physics [K/s]"},
2212    /* 216 */ {"TTRAD", "Temp. tendency by all radiation [K/s]"},
2213    /* 217 */ {"TTPHY", "Temp. tendency by non-radiation physics [K/s]"},
2214    /* 218 */ {"PREIX", "Precip index (0.0-1.00) [fraction]"},
2215    /* 219 */ {"TSD1D", "Std. dev. of IR T over 1x1 deg area [K]"},
2216    /* 220 */ {"NLGSP", "Natural log of surface pressure [ln(kPa)]"},
2217    /* 221 */ {"HPBL", "Planetary boundary layer height [m]"},
2218    /* 222 */ {"5WAVH", "5-wave geopotential height [gpm]"},
2219    /* 223 */ {"CNWAT", "Plant canopy surface water [kg/m^2]"},
2220    /* 224 */ {"SOTYP", "Soil type (Zobler) [0..9]"},
2221    /* 225 */ {"VGTYP", "Vegetation type (as in SiB) [0..13]"},
2222    /* 226 */ {"BMIXL", "Blackadar's mixing length scale [m]"},
2223    /* 227 */ {"AMIXL", "Asymptotic mixing length scale [m]"},
2224    /* 228 */ {"PEVAP", "Pot. evaporation [kg/m^2]"},
2225    /* 229 */ {"SNOHF", "Snow phase-change heat flux [W/m^2]"},
2226    /* 230 */ {"5WAVA", "5-wave geopot. height anomaly [gpm]"},
2227    /* 231 */ {"MFLUX", "Convective cloud mass flux [Pa/s]"},
2228    /* 232 */ {"DTRF", "Downward total radiation flux [W/m^2]"},
2229    /* 233 */ {"UTRF", "Upward total radiation flux [W/m^2]"},
2230    /* 234 */ {"BGRUN", "Baseflow-groundwater runoff [kg/m^2]"},
2231    /* 235 */ {"SSRUN", "Storm surface runoff [kg/m^2]"},
2232    /* 236 */ {"var236", "undefined"},
2233    /* 237 */ {"O3TOT", "Total ozone [kg/m^2]"},
2234    /* 238 */ {"SNOWC", "Snow cover [%]"},
2235    /* 239 */ {"SNOT", "Snow temp. [K]"},
2236    /* 240 */ {"var240", "undefined"},
2237    /* 241 */ {"LRGHR", "Large scale condensation heating [K/s]"},
2238    /* 242 */ {"CNVHR", "Deep convective heating [K/s]"},
2239    /* 243 */ {"CNVMR", "Deep convective moistening [kg/kg/s]"},
2240    /* 244 */ {"SHAHR", "Shallow convective heating [K/s]"},
2241    /* 245 */ {"SHAMR", "Shallow convective moistening [kg/kg/s]"},
2242    /* 246 */ {"VDFHR", "Vertical diffusion heating [K/s]"},
2243    /* 247 */ {"VDFUA", "Vertical diffusion zonal accel [m/s^2]"},
2244    /* 248 */ {"VDFVA", "Vertical diffusion meridional accel [m/s^2]"},
2245    /* 249 */ {"VDFMR", "Vertical diffusion moistening [kg/kg/s]"},
2246    /* 250 */ {"SWHR", "Solar radiative heating [K/s]"},
2247    /* 251 */ {"LWHR", "Longwave radiative heating [K/s]"},
2248    /* 252 */ {"CD", "Drag coefficient [non-dim]"},
2249    /* 253 */ {"FRICV", "Friction velocity [m/s]"},
2250    /* 254 */ {"RI", "Richardson number [non-dim]"},
2251    /* 255 */ {"var255", "undefined"},
2252 };
2253 
2254 /*
2255  * parameter table for the NCEP/NCAR Reanalysis Project
2256  * center = 7, subcenter = 0/2, parameter table = 1/2
2257  * in a SNAFU the operational and reanalysis tables diverged
2258  * and both retained the same parameter table numbers (1,2)
2259  *
2260  * some of the Reanalysis files have subcenter=2 while others
2261  * use subcenter=0  (subcenter field is not standard (7/97))
2262  *
2263  * Some ways to tell Reanalysis files from OPN files
2264  *  Reanalysis: always generated by process 80 - T62 28 level model
2265  * Original subcenter=0 Reanalysis files had
2266  *  2.5x2.5 (144x73) lat-long grid or 192x94 Gaussian grid (PDS grid=255?)
2267  */
2268 
2269 struct ParmTable parm_table_ncep_reanal[256] = {
2270    /* 0 */ {"var0", "undefined"},
2271    /* 1 */ {"PRES", "Pressure [Pa]"},
2272    /* 2 */ {"PRMSL", "Pressure reduced to MSL [Pa]"},
2273    /* 3 */ {"PTEND", "Pressure tendency [Pa/s]"},
2274    /* 4 */ {"var4", "undefined"},
2275    /* 5 */ {"var5", "undefined"},
2276    /* 6 */ {"GP", "Geopotential [m^2/s^2]"},
2277    /* 7 */ {"HGT", "Geopotential height [gpm]"},
2278    /* 8 */ {"DIST", "Geometric height [m]"},
2279    /* 9 */ {"HSTDV", "Std dev of height [m]"},
2280    /* 10 */ {"HVAR", "Variance of height [m^2]"},
2281    /* 11 */ {"TMP", "Temp. [K]"},
2282    /* 12 */ {"VTMP", "Virtual temp. [K]"},
2283    /* 13 */ {"POT", "Potential temp. [K]"},
2284    /* 14 */ {"EPOT", "Pseudo-adiabatic pot. temp. [K]"},
2285    /* 15 */ {"TMAX", "Max. temp. [K]"},
2286    /* 16 */ {"TMIN", "Min. temp. [K]"},
2287    /* 17 */ {"DPT", "Dew point temp. [K]"},
2288    /* 18 */ {"DEPR", "Dew point depression [K]"},
2289    /* 19 */ {"LAPR", "Lapse rate [K/m]"},
2290    /* 20 */ {"VISIB", "Visibility [m]"},
2291    /* 21 */ {"RDSP1", "Radar spectra (1) [non-dim]"},
2292    /* 22 */ {"RDSP2", "Radar spectra (2) [non-dim]"},
2293    /* 23 */ {"RDSP3", "Radar spectra (3) [non-dim]"},
2294    /* 24 */ {"var24", "undefined"},
2295    /* 25 */ {"TMPA", "Temp. anomaly [K]"},
2296    /* 26 */ {"PRESA", "Pressure anomaly [Pa]"},
2297    /* 27 */ {"GPA", "Geopotential height anomaly [gpm]"},
2298    /* 28 */ {"WVSP1", "Wave spectra (1) [non-dim]"},
2299    /* 29 */ {"WVSP2", "Wave spectra (2) [non-dim]"},
2300    /* 30 */ {"WVSP3", "Wave spectra (3) [non-dim]"},
2301    /* 31 */ {"WDIR", "Wind direction [deg]"},
2302    /* 32 */ {"WIND", "Wind speed [m/s]"},
2303    /* 33 */ {"UGRD", "u wind [m/s]"},
2304    /* 34 */ {"VGRD", "v wind [m/s]"},
2305    /* 35 */ {"STRM", "Stream function [m^2/s]"},
2306    /* 36 */ {"VPOT", "Velocity potential [m^2/s]"},
2307    /* 37 */ {"MNTSF", "Montgomery stream function [m^2/s^2]"},
2308    /* 38 */ {"SGCVV", "Sigma coord. vertical velocity [/s]"},
2309    /* 39 */ {"VVEL", "Pressure vertical velocity [Pa/s]"},
2310    /* 40 */ {"DZDT", "Geometric vertical velocity [m/s]"},
2311    /* 41 */ {"ABSV", "Absolute vorticity [/s]"},
2312    /* 42 */ {"ABSD", "Absolute divergence [/s]"},
2313    /* 43 */ {"RELV", "Relative vorticity [/s]"},
2314    /* 44 */ {"RELD", "Relative divergence [/s]"},
2315    /* 45 */ {"VUCSH", "Vertical u shear [/s]"},
2316    /* 46 */ {"VVCSH", "Vertical v shear [/s]"},
2317    /* 47 */ {"DIRC", "Direction of current [deg]"},
2318    /* 48 */ {"SPC", "Speed of current [m/s]"},
2319    /* 49 */ {"UOGRD", "u of current [m/s]"},
2320    /* 50 */ {"VOGRD", "v of current [m/s]"},
2321    /* 51 */ {"SPFH", "Specific humidity [kg/kg]"},
2322    /* 52 */ {"RH", "Relative humidity [%]"},
2323    /* 53 */ {"MIXR", "Humidity mixing ratio [kg/kg]"},
2324    /* 54 */ {"PWAT", "Precipitable water [kg/m^2]"},
2325    /* 55 */ {"VAPP", "Vapor pressure [Pa]"},
2326    /* 56 */ {"SATD", "Saturation deficit [Pa]"},
2327    /* 57 */ {"EVP", "Evaporation [kg/m^2]"},
2328    /* 58 */ {"CICE", "Cloud Ice [kg/m^2]"},
2329    /* 59 */ {"PRATE", "Precipitation rate [kg/m^2/s]"},
2330    /* 60 */ {"TSTM", "Thunderstorm probability [%]"},
2331    /* 61 */ {"APCP", "Total precipitation [kg/m^2]"},
2332    /* 62 */ {"NCPCP", "Large scale precipitation [kg/m^2]"},
2333    /* 63 */ {"ACPCP", "Convective precipitation [kg/m^2]"},
2334    /* 64 */ {"SRWEQ", "Snowfall rate water equiv. [kg/m^2/s]"},
2335    /* 65 */ {"WEASD", "Accum. snow [kg/m^2]"},
2336    /* 66 */ {"SNOD", "Snow depth [m]"},
2337    /* 67 */ {"MIXHT", "Mixed layer depth [m]"},
2338    /* 68 */ {"TTHDP", "Transient thermocline depth [m]"},
2339    /* 69 */ {"MTHD", "Main thermocline depth [m]"},
2340    /* 70 */ {"MTHA", "Main thermocline anomaly [m]"},
2341    /* 71 */ {"TCDC", "Total cloud cover [%]"},
2342    /* 72 */ {"CDCON", "Convective cloud cover [%]"},
2343    /* 73 */ {"LCDC", "Low level cloud cover [%]"},
2344    /* 74 */ {"MCDC", "Mid level cloud cover [%]"},
2345    /* 75 */ {"HCDC", "High level cloud cover [%]"},
2346    /* 76 */ {"CWAT", "Cloud water [kg/m^2]"},
2347    /* 77 */ {"var77", "undefined"},
2348    /* 78 */ {"SNOC", "Convective snow [kg/m^2]"},
2349    /* 79 */ {"SNOL", "Large scale snow [kg/m^2]"},
2350    /* 80 */ {"WTMP", "Water temp. [K]"},
2351    /* 81 */ {"LAND", "Land-sea mask [1=land; 0=sea]"},
2352    /* 82 */ {"DSLM", "Deviation of sea level from mean [m]"},
2353    /* 83 */ {"SFCR", "Surface roughness [m]"},
2354    /* 84 */ {"ALBDO", "Albedo [%]"},
2355    /* 85 */ {"TSOIL", "Soil temp. [K]"},
2356    /* 86 */ {"SOILM", "Soil moisture content [kg/m^2]"},
2357    /* 87 */ {"VEG", "Vegetation [%]"},
2358    /* 88 */ {"SALTY", "Salinity [kg/kg]"},
2359    /* 89 */ {"DEN", "Density [kg/m^3]"},
2360    /* 90 */ {"RUNOF", "Runoff [kg/m^2]"},
2361    /* 91 */ {"ICEC", "Ice concentration [ice=1;no ice=0]"},
2362    /* 92 */ {"ICETK", "Ice thickness [m]"},
2363    /* 93 */ {"DICED", "Direction of ice drift [deg]"},
2364    /* 94 */ {"SICED", "Speed of ice drift [m/s]"},
2365    /* 95 */ {"UICE", "u of ice drift [m/s]"},
2366    /* 96 */ {"VICE", "v of ice drift [m/s]"},
2367    /* 97 */ {"ICEG", "Ice growth rate [m/s]"},
2368    /* 98 */ {"ICED", "Ice divergence [/s]"},
2369    /* 99 */ {"SNOM", "Snow melt [kg/m^2]"},
2370    /* 100 */ {"HTSGW", "Sig height of wind waves and swell [m]"},
2371    /* 101 */ {"WVDIR", "Direction of wind waves [deg]"},
2372    /* 102 */ {"WVHGT", "Sig height of wind waves [m]"},
2373    /* 103 */ {"WVPER", "Mean period of wind waves [s]"},
2374    /* 104 */ {"SWDIR", "Direction of swell waves [deg]"},
2375    /* 105 */ {"SWELL", "Sig height of swell waves [m]"},
2376    /* 106 */ {"SWPER", "Mean period of swell waves [s]"},
2377    /* 107 */ {"DIRPW", "Primary wave direction [deg]"},
2378    /* 108 */ {"PERPW", "Primary wave mean period [s]"},
2379    /* 109 */ {"DIRSW", "Secondary wave direction [deg]"},
2380    /* 110 */ {"PERSW", "Secondary wave mean period [s]"},
2381    /* 111 */ {"NSWRS", "Net short wave (surface) [W/m^2]"},
2382    /* 112 */ {"NLWRS", "Net long wave (surface) [W/m^2]"},
2383    /* 113 */ {"NSWRT", "Net short wave (top) [W/m^2]"},
2384    /* 114 */ {"NLWRT", "Net long wave (top) [W/m^2]"},
2385    /* 115 */ {"LWAVR", "Long wave [W/m^2]"},
2386    /* 116 */ {"SWAVR", "Short wave [W/m^2]"},
2387    /* 117 */ {"GRAD", "Global radiation [W/m^2]"},
2388    /* 118 */ {"var118", "undefined"},
2389    /* 119 */ {"var119", "undefined"},
2390    /* 120 */ {"var120", "undefined"},
2391    /* 121 */ {"LHTFL", "Latent heat flux [W/m^2]"},
2392    /* 122 */ {"SHTFL", "Sensible heat flux [W/m^2]"},
2393    /* 123 */ {"BLYDP", "Boundary layer dissipation [W/m^2]"},
2394    /* 124 */ {"UFLX", "Zonal momentum flux [N/m^2]"},
2395    /* 125 */ {"VFLX", "Meridional momentum flux [N/m^2]"},
2396    /* 126 */ {"WMIXE", "Wind mixing energy [J]"},
2397    /* 127 */ {"IMGD", "Image data [integer]"},
2398    /* 128 */ {"MSLSA", "Mean sea level pressure (Std Atm) [Pa]"},
2399    /* 129 */ {"MSLMA", "Mean sea level pressure (MAPS) [Pa]"},
2400    /* 130 */ {"MSLET", "Mean sea level pressure (ETA model) [Pa]"},
2401    /* 131 */ {"LFTX", "Surface lifted index [K]"},
2402    /* 132 */ {"4LFTX", "Best (4-layer) lifted index [K]"},
2403    /* 133 */ {"KX", "K index [K]"},
2404    /* 134 */ {"SX", "Sweat index [K]"},
2405    /* 135 */ {"MCONV", "Horizontal moisture divergence [kg/kg/s]"},
2406    /* 136 */ {"VSSH", "Vertical speed shear [1/s]"},
2407    /* 137 */ {"TSLSA", "3-hr pressure tendency [Pa/s]"},
2408    /* 138 */ {"BVF2", "Brunt-Vaisala frequency^2 [1/s^2]"},
2409    /* 139 */ {"PVMW", "Potential vorticity (mass-weighted) [1/s/m]"},
2410    /* 140 */ {"CRAIN", "Categorical rain [yes=1;no=0]"},
2411    /* 141 */ {"CFRZR", "Categorical freezing rain [yes=1;no=0]"},
2412    /* 142 */ {"CICEP", "Categorical ice pellets [yes=1;no=0]"},
2413    /* 143 */ {"CSNOW", "Categorical snow [yes=1;no=0]"},
2414    /* 144 */ {"SOILW", "Volumetric soil moisture [fraction]"},
2415    /* 145 */ {"PEVPR", "Potential evaporation rate [W/m^2]"},
2416    /* 146 */ {"CWORK", "Cloud work function [J/kg]"},
2417    /* 147 */ {"U-GWD", "Zonal gravity wave stress [N/m^2]"},
2418    /* 148 */ {"V-GWD", "Meridional gravity wave stress [N/m^2]"},
2419    /* 149 */ {"PV___", "Potential vorticity [m^2/s/kg]"},
2420    /* 150 */ {"var150", "undefined"},
2421    /* 151 */ {"var151", "undefined"},
2422    /* 152 */ {"var152", "undefined"},
2423    /* 153 */ {"MFXDV", "Moisture flux divergence [gr/gr*m/s/m]"},
2424    /* 154 */ {"var154", "undefined"},
2425    /* 155 */ {"GFLUX", "Ground heat flux [W/m^2]"},
2426    /* 156 */ {"CIN", "Convective inhibition [J/kg]"},
2427    /* 157 */ {"CAPE", "Convective Avail. Pot. Energy [J/kg]"},
2428    /* 158 */ {"TKE", "Turbulent kinetic energy [J/kg]"},
2429    /* 159 */ {"CONDP", "Lifted parcel condensation pressure [Pa]"},
2430    /* 160 */ {"CSUSF", "Clear sky upward solar flux [W/m^2]"},
2431    /* 161 */ {"CSDSF", "Clear sky downward solar flux [W/m^2]"},
2432    /* 162 */ {"CSULF", "Clear sky upward long wave flux [W/m^2]"},
2433    /* 163 */ {"CSDLF", "Clear sky downward long wave flux [W/m^2]"},
2434    /* 164 */ {"CFNSF", "Cloud forcing net solar flux [W/m^2]"},
2435    /* 165 */ {"CFNLF", "Cloud forcing net long wave flux [W/m^2]"},
2436    /* 166 */ {"VBDSF", "Visible beam downward solar flux [W/m^2]"},
2437    /* 167 */ {"VDDSF", "Visible diffuse downward solar flux [W/m^2]"},
2438    /* 168 */ {"NBDSF", "Near IR beam downward solar flux [W/m^2]"},
2439    /* 169 */ {"NDDSF", "Near IR diffuse downward solar flux [W/m^2]"},
2440    /* 170 */ {"USTR", "U wind stress [N/m^2]"},
2441    /* 171 */ {"VSTR", "V wind stress [N/m^2]"},
2442    /* 172 */ {"MFLX", "Momentum flux [N/m^2]"},
2443    /* 173 */ {"LMH", "Mass point model surface [integer]"},
2444    /* 174 */ {"LMV", "Velocity point model surface [integer]"},
2445    /* 175 */ {"SGLYR", "Nearby model level [integer]"},
2446    /* 176 */ {"NLAT", "Latitude [deg]"},
2447    /* 177 */ {"NLON", "Longitude [deg]"},
2448    /* 178 */ {"UMAS", "Mass weighted u [gm/m*K*s]"},
2449    /* 179 */ {"VMAS", "Mass weighted v [gm/m*K*s]"},
2450    /* 180 */ {"XPRATE", "corrected precip [kg/m^2/s]"},
2451    /* 181 */ {"LPSX", "x-gradient of log pressure [1/m]"},
2452    /* 182 */ {"LPSY", "y-gradient of log pressure [1/m]"},
2453    /* 183 */ {"HGTX", "x-gradient of height [m/m]"},
2454    /* 184 */ {"HGTY", "y-gradient of height [m/m]"},
2455    /* 185 */ {"STDZ", "Std dev of Geop. hgt. [m]"},
2456    /* 186 */ {"STDU", "Std dev of zonal wind [m/s]"},
2457    /* 187 */ {"STDV", "Std dev of meridional wind [m/s]"},
2458    /* 188 */ {"STDQ", "Std dev of spec. hum. [gm/gm]"},
2459    /* 189 */ {"STDT", "Std dev of temp. [K]"},
2460    /* 190 */ {"CBUW", "Covar. u and omega [m/s*Pa/s]"},
2461    /* 191 */ {"CBVW", "Covar. v and omega [m/s*Pa/s]"},
2462    /* 192 */ {"CBUQ", "Covar. u and specific hum [m/s*gm/gm]"},
2463    /* 193 */ {"CBVQ", "Covar. v and specific hum [m/s*gm/gm]"},
2464    /* 194 */ {"CBTW", "Covar. T and omega [K*Pa/s]"},
2465    /* 195 */ {"CBQW", "Covar. spec. hum and omega [gm/gm*Pa/s]"},
2466    /* 196 */ {"CBMZW", "Covar. v and u [m^2/s^2]"},
2467    /* 197 */ {"CBTZW", "Covar. u and T [K*m/s]"},
2468    /* 198 */ {"CBTMW", "Covar. v and T [K*m/s]"},
2469    /* 199 */ {"STDRH", "Std dev of Rel. Hum. [%]"},
2470    /* 200 */ {"SDTZ", "Std dev of time tend of geop. hgt [m]"},
2471    /* 201 */ {"ICWAT", "Ice-free water surface [%]"},
2472    /* 202 */ {"SDTU", "Std dev of time tend of zonal wind [m/s]"},
2473    /* 203 */ {"SDTV", "Std dev of time tend of merid wind [m/s]"},
2474    /* 204 */ {"DSWRF", "Downward solar radiation flux [W/m^2]"},
2475    /* 205 */ {"DLWRF", "Downward long wave flux [W/m^2]"},
2476    /* 206 */ {"SDTQ", "Std dev of time tend of spec. hum [gm/gm]"},
2477    /* 207 */ {"MSTAV", "Moisture availability [%]"},
2478    /* 208 */ {"SFEXC", "Exchange coefficient [kg*m/m^3/s]"},
2479    /* 209 */ {"MIXLY", "No. of mixed layers next to sfc [integer]"},
2480    /* 210 */ {"SDTT", "Std dev of time tend of temp. [K]"},
2481    /* 211 */ {"USWRF", "Upward solar radiation flux [W/m^2]"},
2482    /* 212 */ {"ULWRF", "Upward long wave flux [W/m^2]"},
2483    /* 213 */ {"CDLYR", "Non-convective cloud [%]"},
2484    /* 214 */ {"CPRAT", "Convective precip. rate [kg/m^2/s]"},
2485    /* 215 */ {"TTDIA", "Temp. tendency by all physics [K/s]"},
2486    /* 216 */ {"TTRAD", "Temp. tendency by all radiation [K/s]"},
2487    /* 217 */ {"TTPHY", "Temp. tendency by nonrad physics [K/s]"},
2488    /* 218 */ {"PREIX", "Precipitation index [fraction]"},
2489    /* 219 */ {"TSD1D", "Std dev of IR T over 1x1 deg area [K]"},
2490    /* 220 */ {"NLSGP", "Natural log of surface pressure [ln(kPa)]"},
2491    /* 221 */ {"SDTRH", "Std dev of time tend of rel hum [%]"},
2492    /* 222 */ {"5WAVH", "5-wave geopotential height [gpm]"},
2493    /* 223 */ {"CNWAT", "Plant canopy surface water [kg/m^2]"},
2494    /* 224 */ {"PLTRS", "Max. stomato plant resistance [s/m]"},
2495    /* 225 */ {"RHCLD", "RH-type cloud cover [%]"},
2496    /* 226 */ {"BMIXL", "Blackadar's mixing length scale [m]"},
2497    /* 227 */ {"AMIXL", "Asymptotic mixing length scale [m]"},
2498    /* 228 */ {"PEVAP", "Pot. evaporation [kg/m^2]"},
2499    /* 229 */ {"SNOHF", "Snow melt heat flux [W/m^2]"},
2500    /* 230 */ {"SNOEV", "Snow sublimation heat flux [W/m^2]"},
2501    /* 231 */ {"MFLUX", "Convective cloud mass flux [Pa/s]"},
2502    /* 232 */ {"DTRF", "Downward total radiation flux [W/m^2]"},
2503    /* 233 */ {"UTRF", "Upward total radiation flux [W/m^2]"},
2504    /* 234 */ {"BGRUN", "Baseflow-groundwater runoff [kg/m^2]"},
2505    /* 235 */ {"SSRUN", "Storm surface runoff [kg/m^2]"},
2506    /* 236 */ {"var236", "undefined"},
2507    /* 237 */ {"OZONE", "Total column ozone [Dobson]"},
2508    /* 238 */ {"SNOWC", "Snow cover [%]"},
2509    /* 239 */ {"SNOT", "Snow temp. [K]"},
2510    /* 240 */ {"GLCR", "Permanent snow points [mask]"},
2511    /* 241 */ {"LRGHR", "Large scale condensation heating [K/s]"},
2512    /* 242 */ {"CNVHR", "Deep convective heating [K/s]"},
2513    /* 243 */ {"CNVMR", "Deep convective moistening [kg/kg/s]"},
2514    /* 244 */ {"SHAHR", "Shallow convective heating [K/s]"},
2515    /* 245 */ {"SHAMR", "Shallow convective moistening [kg/kg/s]"},
2516    /* 246 */ {"VDFHR", "Vertical diffusion heating [K/s]"},
2517    /* 247 */ {"VDFUA", "Vertical diffusion zonal accel [m/s^2]"},
2518    /* 248 */ {"VDFVA", "Vertical diffusion meridional accel [m/s^2]"},
2519    /* 249 */ {"VDFMR", "Vertical diffusion moistening [kg/kg/s]"},
2520    /* 250 */ {"SWHR", "Solar radiative heating [K/s]"},
2521    /* 251 */ {"LWHR", "Longwave radiative heating [K/s]"},
2522    /* 252 */ {"CD", "Drag coefficient [non-dim]"},
2523    /* 253 */ {"FRICV", "Friction velocity [m/s]"},
2524    /* 254 */ {"RI", "Richardson number [non-dim]"},
2525    /* 255 */ {"var255", "undefined"},
2526 };
2527 
2528 
2529 struct ParmTable parm_table_ecmwf_128[256] = {
2530     /* 0 */ {"var0", "undefined"},
2531     /* 1 */ {"None", "Stream Function m**2 s**-1"},
2532     /* 2 */ {"None", "Velocity Potential m**2 s**-1"},
2533     /* 3 */ {"None", "Potential Temperature K"},
2534     /* 4 */ {"None", "Equivalent Potential Temperature K"},
2535     /* 5 */ {"None", "Saturated Equivalent Potential Temperature K"},
2536     /* 6 */ {"None", "RESERVED FOR METVIEW. -"},
2537     /* 7 */ {"None", "RESERVED FOR METVIEW. -"},
2538     /* 8 */ {"None", "RESERVED FOR METVIEW. -"},
2539     /* 9 */ {"None", "RESERVED FOR METVIEW. -"},
2540     /* 10 */ {"None", "RESERVED FOR METVIEW. -"},
2541     /* 11 */ {"None", "u-component of Divergent Wind m s**-1"},
2542     /* 12 */ {"None", "v-component of Divergent Wind m s**-1"},
2543     /* 13 */ {"None", "u-component of Rotational Wind m s**-1"},
2544     /* 14 */ {"None", "v-component of Rotational Wind m s**-1"},
2545     /* 15 */ {"None", "RESERVED FOR METVIEW. -"},
2546     /* 16 */ {"None", "RESERVED FOR METVIEW. -"},
2547     /* 17 */ {"None", "RESERVED FOR METVIEW. -"},
2548     /* 18 */ {"None", "RESERVED FOR METVIEW. -"},
2549     /* 19 */ {"None", "RESERVED FOR METVIEW. -"},
2550     /* 20 */ {"None", "RESERVED FOR METVIEW. -"},
2551     /* 21 */ {"UCTP", "Unbalanced component of temperature K"},
2552     /* 22 */ {"UCLN", "Unbalanced component of lnsp -"},
2553     /* 23 */ {"UCDV", "Unbalanced component of divergence s**-1"},
2554     /* 24 */ {"None", "Reserved for future unbalanced components -"},
2555     /* 25 */ {"None", "Reserved for future unbalanced components -"},
2556     /* 26 */ {"CL", "Lake cover (0-1)"},
2557     /* 27 */ {"CVL", "Low vegetation cover (0-1)"},
2558     /* 28 */ {"CVH", "High vegetation cover (0-1)"},
2559     /* 29 */ {"TVL", "Type of low vegetation -"},
2560     /* 30 */ {"TVH", "Type of high vegetation -"},
2561     /* 31 */ {"CI", "Sea ice cover (0-1)"},
2562     /* 32 */ {"ASN", "Snow albedo (0-1)"},
2563     /* 33 */ {"RSN", "Snow density kg**-3"},
2564     /* 34 */ {"SSTK", "Sea surface temperature (absolute) K"},
2565     /* 35 */ {"ISTL1", "Ice surface temperature layer 1 K"},
2566     /* 36 */ {"ISTL2", "Ice surface temperature layer 2 K"},
2567     /* 37 */ {"ISTL3", "Ice surface temperature layer 3 K"},
2568     /* 38 */ {"ISTL4", "Ice surface temperature layer 4 K"},
2569     /* 39 */ {"SWVL1", "Volumetric soil water layer 1 m**3 m**-3"},
2570     /* 40 */ {"SWVL2", "Volumetric soil water layer 2 m**3 m**-3"},
2571     /* 41 */ {"SWVL3", "Volumetric soil water layer 3 m**3 m**-3"},
2572     /* 42 */ {"SWVL4", "Volumetric soil water layer 4 m**3 m**-3"},
2573     /* 43 */ {"SLT", "Soil Type -"},
2574     /* 44 */ {"-", "Unused -"},
2575     /* 45 */ {"var45", "undefined"},
2576     /* 46 */ {"var46", "undefined"},
2577     /* 47 */ {"var47", "undefined"},
2578     /* 48 */ {"var48", "undefined"},
2579     /* 49 */ {"var49", "undefined"},
2580     /* 50 */ {"var50", "undefined"},
2581     /* 51 */ {"var51", "undefined"},
2582     /* 52 */ {"var52", "undefined"},
2583     /* 53 */ {"var53", "undefined"},
2584     /* 54 */ {"var54", "undefined"},
2585     /* 55 */ {"var55", "undefined"},
2586     /* 56 */ {"var56", "undefined"},
2587     /* 57 */ {"var57", "undefined"},
2588     /* 58 */ {"var58", "undefined"},
2589     /* 59 */ {"var59", "undefined"},
2590     /* 60 */ {"var60", "undefined"},
2591     /* 61 */ {"var61", "undefined"},
2592     /* 62 */ {"var62", "undefined"},
2593     /* 63 */ {"var63", "undefined"},
2594     /* 64 */ {"var64", "undefined"},
2595     /* 65 */ {"var65", "undefined"},
2596     /* 66 */ {"var66", "undefined"},
2597     /* 67 */ {"var67", "undefined"},
2598     /* 68 */ {"var68", "undefined"},
2599     /* 69 */ {"var69", "undefined"},
2600     /* 70 */ {"var70", "undefined"},
2601     /* 71 */ {"var71", "undefined"},
2602     /* 72 */ {"var72", "undefined"},
2603     /* 73 */ {"var73", "undefined"},
2604     /* 74 */ {"var74", "undefined"},
2605     /* 75 */ {"var75", "undefined"},
2606     /* 76 */ {"var76", "undefined"},
2607     /* 77 */ {"var77", "undefined"},
2608     /* 78 */ {"var78", "undefined"},
2609     /* 79 */ {"var79", "undefined"},
2610     /* 80 */ {"var80", "undefined"},
2611     /* 81 */ {"var81", "undefined"},
2612     /* 82 */ {"var82", "undefined"},
2613     /* 83 */ {"var83", "undefined"},
2614     /* 84 */ {"var84", "undefined"},
2615     /* 85 */ {"var85", "undefined"},
2616     /* 86 */ {"var86", "undefined"},
2617     /* 87 */ {"var87", "undefined"},
2618     /* 88 */ {"var88", "undefined"},
2619     /* 89 */ {"var89", "undefined"},
2620     /* 90 */ {"var90", "undefined"},
2621     /* 91 */ {"var91", "undefined"},
2622     /* 92 */ {"var92", "undefined"},
2623     /* 93 */ {"var93", "undefined"},
2624     /* 94 */ {"var94", "undefined"},
2625     /* 95 */ {"var95", "undefined"},
2626     /* 96 */ {"var96", "undefined"},
2627     /* 97 */ {"var97", "undefined"},
2628     /* 98 */ {"var98", "undefined"},
2629     /* 99 */ {"var99", "undefined"},
2630     /* 100 */ {"var100", "undefined"},
2631     /* 101 */ {"var101", "undefined"},
2632     /* 102 */ {"var102", "undefined"},
2633     /* 103 */ {"var103", "undefined"},
2634     /* 104 */ {"var104", "undefined"},
2635     /* 105 */ {"var105", "undefined"},
2636     /* 106 */ {"var106", "undefined"},
2637     /* 107 */ {"var107", "undefined"},
2638     /* 108 */ {"var108", "undefined"},
2639     /* 109 */ {"var109", "undefined"},
2640     /* 110 */ {"var110", "undefined"},
2641     /* 111 */ {"var111", "undefined"},
2642     /* 112 */ {"var112", "undefined"},
2643     /* 113 */ {"var113", "undefined"},
2644     /* 114 */ {"var114", "undefined"},
2645     /* 115 */ {"var115", "undefined"},
2646     /* 116 */ {"var116", "undefined"},
2647     /* 117 */ {"var117", "undefined"},
2648     /* 118 */ {"var118", "undefined"},
2649     /* 119 */ {"var119", "undefined"},
2650     /* 120 */ {"var120", "undefined"},
2651     /* 121 */ {"var121", "undefined"},
2652     /* 122 */ {"var122", "undefined"},
2653     /* 123 */ {"var123", "undefined"},
2654     /* 124 */ {"var124", "undefined"},
2655     /* 125 */ {"var125", "undefined"},
2656     /* 126 */ {"-", "Unused -"},
2657     /* 127 */ {"AT", "Atmospheric tide -"},
2658     /* 128 */ {"BV", "Budget values -"},
2659     /* 129 */ {"Z", "Geopotential (at the surface = orography) m**2 s**-2"},
2660     /* 130 */ {"T", "Temperature K"},
2661     /* 131 */ {"U", "U-velocity m s**-1"},
2662     /* 132 */ {"V", "V-velocity m s**-1"},
2663     /* 133 */ {"Q", "Specific humidity kg kg**-1"},
2664     /* 134 */ {"SP", "Surface pressure Pa"},
2665     /* 135 */ {"W", "Vertical velocity Pa s**-1"},
2666     /* 136 */ {"TWC", "Total column water kg m**-2"},
2667     /* 137 */ {"PWC", "Precipitable water content kg m**-2"},
2668     /* 138 */ {"VO", "Vorticity (relative) s**-1"},
2669     /* 139 */ {"ST", "Surf.temp/soil temp lev 1 (from 930804) K"},
2670     /* 140 */ {"SSW", "Surf soil wet/soil wet lev1(from 930803) m (of water)"},
2671     /* 141 */ {"SD", "Snow depth m (of water equivalent)"},
2672     /* 142 */ {"LSP", "Large scale precipitation m"},
2673     /* 143 */ {"CP", "Convective precipitation m"},
2674     /* 144 */ {"SF", "Snow fall m(of water equivalent)"},
2675     /* 145 */ {"BLD", "Boundary layer dissipation W m**-2 s"},
2676     /* 146 */ {"SSHF", "Surface sensible heat flux W m**-2 s"},
2677     /* 147 */ {"SLHF", "Surface latent heat flux W m**-2 s"},
2678     /* 148 */ {"SS/CHNK", "Surface stress/Charnock (from 980519) -"},
2679     /* 149 */ {"SNR", "Surface net radiation -"},
2680     /* 150 */ {"AIW", "Top net radiation -"},
2681     /* 151 */ {"MSL", "Mean sea level pressure Pa"},
2682     /* 152 */ {"LNSP", "Log surface pressure -"},
2683     /* 153 */ {"SWHR", "Short wave heating rate K"},
2684     /* 154 */ {"LWH", "Long wave heating rate K"},
2685     /* 155 */ {"D", "Divergence s**-1"},
2686     /* 156 */ {"GH", "Height (geopotential) m"},
2687     /* 157 */ {"R", "Relative humidity %"},
2688     /* 158 */ {"TSP", "Tendency of surface pressure Pa s**-1"},
2689     /* 159 */ {"BLH", "Boundary layer height m"},
2690     /* 160 */ {"SDOR", "Standard deviation of orography -"},
2691     /* 161 */ {"ISOR", "Anisotropy of subgrid scale orography -"},
2692     /* 162 */ {"ANOR", "Angle of subgrid scale orography -"},
2693     /* 163 */ {"SLOR", "Slope of subgrid scale orography -"},
2694     /* 164 */ {"TCC", "Total cloud cover (0 - 1)"},
2695     /* 165 */ {"10U", "10 metre u wind component m s**-1"},
2696     /* 166 */ {"10V", "10 metre v wind component m s**-1"},
2697     /* 167 */ {"2T", "2 metre temperature K"},
2698     /* 168 */ {"2D", "2 metre dewpoint temperature K"},
2699     /* 169 */ {"SSRD", "Surface solar radiation downwards W m**-2 s"},
2700     /* 170 */ {"DST", "Deep soil tmp/soil temp lev2(from 930804) K"},
2701     /* 171 */ {"DSW", "Deep soil wet/soil wet lev2(from 930803) m (of water)"},
2702     /* 172 */ {"LSM", "Land/sea mask (0"},
2703     /* 173 */ {"SR", "Surface roughness m"},
2704     /* 174 */ {"AL", "Albedo -"},
2705     /* 175 */ {"STRD", "Surface thermal radiation downwards W m**-2 s"},
2706     /* 176 */ {"SSR", "Surface solar radiation W m**-2 s"},
2707     /* 177 */ {"STR", "Surface thermal radiation W m**-2 s"},
2708     /* 178 */ {"TSR", "Top solar radiation W m**-2 s"},
2709     /* 179 */ {"TTR", "Top thermal radiation W m**-2 s"},
2710     /* 180 */ {"EWSS", "East/West surface stress N m**-2 s"},
2711     /* 181 */ {"NSSS", "North/South surface stress N m**-2 s"},
2712     /* 182 */ {"E", "Evaporation m (of water)"},
2713     /* 183 */ {"CDST", "Clim deep soil tmp/soil tmp lev3(930804) K"},
2714     /* 184 */ {"CDSW", "Clim deep soil wet/soil wet lev3(930803) m (of water)"},
2715     /* 185 */ {"CCC", "Convective cloud cover (0 - 1)"},
2716     /* 186 */ {"LCC", "Low cloud cover (0 - 1)"},
2717     /* 187 */ {"MCC", "Medium cloud cover (0 - 1)"},
2718     /* 188 */ {"HCC", "High cloud cover (0 - 1)"},
2719     /* 189 */ {"-", "Unused -"},
2720     /* 190 */ {"EWOV", "EW component subgrid orographic variance m**2"},
2721     /* 191 */ {"NSOV", "NS component subgrid orographic variance m**2"},
2722     /* 192 */ {"NWOV", "NWSE component subgrid orographic variance m**2"},
2723     /* 193 */ {"NEOV", "NESW component subgrid orographic variance m**2"},
2724     /* 194 */ {"BTMP", "Brightness temperature K"},
2725     /* 195 */ {"LGWS", "Lat. component of gravity wave stress N m**-2 s"},
2726     /* 196 */ {"MGWS", "Meridional component gravity wave stress N m**-2 s"},
2727     /* 197 */ {"GWD", "Gravity wave dissipation W m**-2 s"},
2728     /* 198 */ {"SRC", "Skin reservoir content m (of water)"},
2729     /* 199 */ {"VEG", "Percentage of vegetation %"},
2730     /* 200 */ {"VSO", "Variance of sub-grid scale orography m**2"},
2731     /* 201 */ {"MX2T", "Max 2m temp since previous post-processing K"},
2732     /* 202 */ {"MN2T", "Min 2m temp since previous post-processing K"},
2733     /* 203 */ {"O3", "Ozone mass mixing ratio kg kg**-1"},
2734     /* 204 */ {"PAW", "Precip. analysis weights -"},
2735     /* 205 */ {"RO", "Runoff* m"},
2736     /* 206 */ {"TCO3", "Total column ozone Dobson (kg m**-2)"},
2737     /* 207 */ {"10SI", "10m. Windspeed (irresp of dir.) m s**-1"},
2738     /* 208 */ {"TSRC", "Top net solar radiation clear sky W m**-2"},
2739     /* 209 */ {"TTRC", "Top upward thermal radiation clear sky W m**-2"},
2740     /* 210 */ {"SSRC", "Surface net solar radiation clear sky W m**-2"},
2741     /* 211 */ {"STRC", "Surface net thermal radiation clear sky W m**-2"},
2742     /* 212 */ {"SI", "Solar insulation W m**-2"},
2743     /* 213 */ {"-", "Unused -"},
2744     /* 214 */ {"DHR", "Diabatic heating by radiation* K"},
2745     /* 215 */ {"DHVD", "Diabatic heating by vertical diffusion K"},
2746     /* 216 */ {"DHCC", "Diabatic heating by cumulus convection K"},
2747     /* 217 */ {"DHLC", "Diabatic heating large-scale condensation K"},
2748     /* 218 */ {"VDZW", "Vertical diffusion of zonal wind m s**-1"},
2749     /* 219 */ {"VDMW", "Vertical diffusion of meridional wind m s**-1"},
2750     /* 220 */ {"EWGD", "EW gravity wave drag m s**-1"},
2751     /* 221 */ {"NSGD", "NS gravity wave drag m s**-1"},
2752     /* 222 */ {"CTZW", "Convective tendency of zonal wind m s**-1"},
2753     /* 223 */ {"CTMW", "Convective tendency of meridional wind m s**-1"},
2754     /* 224 */ {"VDH", "Vertical diffusion of humidity kg kg**-1"},
2755     /* 225 */ {"HTCC", "Humidity tendency by cumulus convection kg kg**-1"},
2756     /* 226 */ {"HTLC", "Humidity tendency large-scale condensation kg kg**-1"},
2757     /* 227 */ {"CRNH", "Change from removing negative humidity kg/kg s-1"},
2758     /* 228 */ {"TP", "Total precipitation m"},
2759     /* 229 */ {"IEWS", "Instantaneous X surface stress N m**-2"},
2760     /* 230 */ {"INSS", "Instantaneous Y surface stress N m**-2"},
2761     /* 231 */ {"ISHF", "Instantaneous surface Heat Flux W m**-2"},
2762     /* 232 */ {"IE", "Instantaneous Moisture Flux (evaporation) kg m**-2 s"},
2763     /* 233 */ {"ASQ", "Apparent Surface Humidity kg kg**-1"},
2764     /* 234 */ {"LSRH", "Log of surface roughness length for heat -"},
2765     /* 235 */ {"SKT", "Skin Temperature K"},
2766     /* 236 */ {"STL4", "Soil temperature level 4 K"},
2767     /* 237 */ {"SWL4", "Soil wetness level 4 m"},
2768     /* 238 */ {"TSN", "Temperature of snow layer K"},
2769     /* 239 */ {"CSF", "Convective snow-fall m (of water equivalent)"},
2770     /* 240 */ {"LSF", "Large scale snow-fall m (of water equivalent)"},
2771     /* 241 */ {"ACF", "Accumulated cloud fraction tendency (-1 to 1)"},
2772     /* 242 */ {"ALW", "Accumulated liquid water tendency (-1 to 1)"},
2773     /* 243 */ {"FAL", "Forecast albedo -"},
2774     /* 244 */ {"FSR", "Forecast surface roughness m"},
2775     /* 245 */ {"FLSR", "Forecast log of surface roughness for heat -"},
2776     /* 246 */ {"CLWC", "Cloud liquid water content kg kg**-1"},
2777     /* 247 */ {"CIWC", "Cloud ice water content kg kg**-1"},
2778     /* 248 */ {"CC", "Cloud cover (0 - 1)"},
2779     /* 249 */ {"AIW", "Accumulated ice water tendency (-1 to 1)"},
2780     /* 250 */ {"ICE", "Ice Age (0 first-year 1 multi-year)"},
2781     /* 251 */ {"ATTE", "Adiabatic tendency of temperature K"},
2782     /* 252 */ {"ATHE", "Adiabatic tendency of humidity kg kg**-1"},
2783     /* 253 */ {"ATZE", "Adiabatic tendency of zonal wind m s**-1"},
2784     /* 254 */ {"ATMW", "Adiabatic tendency of meridional wind m s**-1"},
2785     /* 255 */ {"-", "Indicates a missing value -"},
2786 };
2787 
2788 
2789 struct ParmTable parm_table_ecmwf_129[256] = {
2790     /* 0 */ {"var0", "undefined"},
2791     /* 1 */ {"var1", "undefined"},
2792     /* 2 */ {"var2", "undefined"},
2793     /* 3 */ {"var3", "undefined"},
2794     /* 4 */ {"var4", "undefined"},
2795     /* 5 */ {"var5", "undefined"},
2796     /* 6 */ {"var6", "undefined"},
2797     /* 7 */ {"var7", "undefined"},
2798     /* 8 */ {"var8", "undefined"},
2799     /* 9 */ {"var9", "undefined"},
2800     /* 10 */ {"var10", "undefined"},
2801     /* 11 */ {"var11", "undefined"},
2802     /* 12 */ {"var12", "undefined"},
2803     /* 13 */ {"var13", "undefined"},
2804     /* 14 */ {"var14", "undefined"},
2805     /* 15 */ {"var15", "undefined"},
2806     /* 16 */ {"var16", "undefined"},
2807     /* 17 */ {"var17", "undefined"},
2808     /* 18 */ {"var18", "undefined"},
2809     /* 19 */ {"var19", "undefined"},
2810     /* 20 */ {"var20", "undefined"},
2811     /* 21 */ {"var21", "undefined"},
2812     /* 22 */ {"var22", "undefined"},
2813     /* 23 */ {"var23", "undefined"},
2814     /* 24 */ {"var24", "undefined"},
2815     /* 25 */ {"var25", "undefined"},
2816     /* 26 */ {"var26", "undefined"},
2817     /* 27 */ {"var27", "undefined"},
2818     /* 28 */ {"var28", "undefined"},
2819     /* 29 */ {"var29", "undefined"},
2820     /* 30 */ {"var30", "undefined"},
2821     /* 31 */ {"var31", "undefined"},
2822     /* 32 */ {"var32", "undefined"},
2823     /* 33 */ {"var33", "undefined"},
2824     /* 34 */ {"var34", "undefined"},
2825     /* 35 */ {"var35", "undefined"},
2826     /* 36 */ {"var36", "undefined"},
2827     /* 37 */ {"var37", "undefined"},
2828     /* 38 */ {"var38", "undefined"},
2829     /* 39 */ {"var39", "undefined"},
2830     /* 40 */ {"var40", "undefined"},
2831     /* 41 */ {"var41", "undefined"},
2832     /* 42 */ {"var42", "undefined"},
2833     /* 43 */ {"var43", "undefined"},
2834     /* 44 */ {"var44", "undefined"},
2835     /* 45 */ {"var45", "undefined"},
2836     /* 46 */ {"var46", "undefined"},
2837     /* 47 */ {"var47", "undefined"},
2838     /* 48 */ {"var48", "undefined"},
2839     /* 49 */ {"var49", "undefined"},
2840     /* 50 */ {"var50", "undefined"},
2841     /* 51 */ {"var51", "undefined"},
2842     /* 52 */ {"var52", "undefined"},
2843     /* 53 */ {"var53", "undefined"},
2844     /* 54 */ {"var54", "undefined"},
2845     /* 55 */ {"var55", "undefined"},
2846     /* 56 */ {"var56", "undefined"},
2847     /* 57 */ {"var57", "undefined"},
2848     /* 58 */ {"var58", "undefined"},
2849     /* 59 */ {"var59", "undefined"},
2850     /* 60 */ {"var60", "undefined"},
2851     /* 61 */ {"var61", "undefined"},
2852     /* 62 */ {"var62", "undefined"},
2853     /* 63 */ {"var63", "undefined"},
2854     /* 64 */ {"var64", "undefined"},
2855     /* 65 */ {"var65", "undefined"},
2856     /* 66 */ {"var66", "undefined"},
2857     /* 67 */ {"var67", "undefined"},
2858     /* 68 */ {"var68", "undefined"},
2859     /* 69 */ {"var69", "undefined"},
2860     /* 70 */ {"var70", "undefined"},
2861     /* 71 */ {"var71", "undefined"},
2862     /* 72 */ {"var72", "undefined"},
2863     /* 73 */ {"var73", "undefined"},
2864     /* 74 */ {"var74", "undefined"},
2865     /* 75 */ {"var75", "undefined"},
2866     /* 76 */ {"var76", "undefined"},
2867     /* 77 */ {"var77", "undefined"},
2868     /* 78 */ {"var78", "undefined"},
2869     /* 79 */ {"var79", "undefined"},
2870     /* 80 */ {"var80", "undefined"},
2871     /* 81 */ {"var81", "undefined"},
2872     /* 82 */ {"var82", "undefined"},
2873     /* 83 */ {"var83", "undefined"},
2874     /* 84 */ {"var84", "undefined"},
2875     /* 85 */ {"var85", "undefined"},
2876     /* 86 */ {"var86", "undefined"},
2877     /* 87 */ {"var87", "undefined"},
2878     /* 88 */ {"var88", "undefined"},
2879     /* 89 */ {"var89", "undefined"},
2880     /* 90 */ {"var90", "undefined"},
2881     /* 91 */ {"var91", "undefined"},
2882     /* 92 */ {"var92", "undefined"},
2883     /* 93 */ {"var93", "undefined"},
2884     /* 94 */ {"var94", "undefined"},
2885     /* 95 */ {"var95", "undefined"},
2886     /* 96 */ {"var96", "undefined"},
2887     /* 97 */ {"var97", "undefined"},
2888     /* 98 */ {"var98", "undefined"},
2889     /* 99 */ {"var99", "undefined"},
2890     /* 100 */ {"var100", "undefined"},
2891     /* 101 */ {"var101", "undefined"},
2892     /* 102 */ {"var102", "undefined"},
2893     /* 103 */ {"var103", "undefined"},
2894     /* 104 */ {"var104", "undefined"},
2895     /* 105 */ {"var105", "undefined"},
2896     /* 106 */ {"var106", "undefined"},
2897     /* 107 */ {"var107", "undefined"},
2898     /* 108 */ {"var108", "undefined"},
2899     /* 109 */ {"var109", "undefined"},
2900     /* 110 */ {"var110", "undefined"},
2901     /* 111 */ {"var111", "undefined"},
2902     /* 112 */ {"var112", "undefined"},
2903     /* 113 */ {"var113", "undefined"},
2904     /* 114 */ {"var114", "undefined"},
2905     /* 115 */ {"var115", "undefined"},
2906     /* 116 */ {"var116", "undefined"},
2907     /* 117 */ {"var117", "undefined"},
2908     /* 118 */ {"var118", "undefined"},
2909     /* 119 */ {"var119", "undefined"},
2910     /* 120 */ {"var120", "undefined"},
2911     /* 121 */ {"var121", "undefined"},
2912     /* 122 */ {"var122", "undefined"},
2913     /* 123 */ {"var123", "undefined"},
2914     /* 124 */ {"var124", "undefined"},
2915     /* 125 */ {"var125", "undefined"},
2916     /* 126 */ {"var126", "undefined"},
2917     /* 127 */ {"AT", "Atmospheric tide+ -"},
2918     /* 128 */ {"BV", "Budget values+ -"},
2919     /* 129 */ {"Z", "Geopotential (at the surface=orography) m**2 s**-2"},
2920     /* 130 */ {"T", "Temperature K"},
2921     /* 131 */ {"U", "U-velocity m s**-1"},
2922     /* 132 */ {"V", "V-velocity m s**-1"},
2923     /* 133 */ {"Q", "Specific humidity kg kg**-1"},
2924     /* 134 */ {"SP", "Surface pressure Pa"},
2925     /* 135 */ {"W", "Vertical velocity Pa s**-1"},
2926     /* 136 */ {"var136", "undefined"},
2927     /* 137 */ {"PWC", "Precipitable water content kg m**-2"},
2928     /* 138 */ {"VO", "Vorticity (relative) s**-1"},
2929     /* 139 */ {"ST", "Surf.temp/soil temp lev 1 (from 930804) K"},
2930     /* 140 */ {"SSW", "Surf soil wet/soil wet lev1(from 930803) m (of water)"},
2931     /* 141 */ {"SD", "Snow depth m (of water equivalent)"},
2932     /* 142 */ {"LSP", "Large scale precipitation* m"},
2933     /* 143 */ {"CP", "Convective precipitation* m"},
2934     /* 144 */ {"SF", "Snow fall* m(of water equivalent)"},
2935     /* 145 */ {"BLD", "Boundary layer dissipation* W m**-2 s"},
2936     /* 146 */ {"SSHF", "Surface sensible heat flux* W m**-2 s"},
2937     /* 147 */ {"SLHF", "Surface latent heat flux* W m**-2 s"},
2938     /* 148 */ {"var148", "undefined"},
2939     /* 149 */ {"var149", "undefined"},
2940     /* 150 */ {"var150", "undefined"},
2941     /* 151 */ {"MSL", "Mean sea level pressure Pa"},
2942     /* 152 */ {"LNSP", "Log surface pressure -"},
2943     /* 153 */ {"var153", "undefined"},
2944     /* 154 */ {"var154", "undefined"},
2945     /* 155 */ {"D", "Divergence s**-1"},
2946     /* 156 */ {"GH", "Height (geopotential) m"},
2947     /* 157 */ {"R", "Relative humidity %"},
2948     /* 158 */ {"TSP", "Tendency of surface pressure Pa s**-1"},
2949     /* 159 */ {"var159", "undefined"},
2950     /* 160 */ {"SDOR", "Standard deviation of orography -"},
2951     /* 161 */ {"ISOR", "Anisotropy of subgrid scale orography -"},
2952     /* 162 */ {"ANOR", "Angle of subgrid scale orography -"},
2953     /* 163 */ {"SLOR", "Slope of subgrid scale orography -"},
2954     /* 164 */ {"TCC", "Total cloud cover (0 - 1)"},
2955     /* 165 */ {"10U", "10 metre u wind component m s**-1"},
2956     /* 166 */ {"10V", "10 metre v wind component m s**-1"},
2957     /* 167 */ {"2T", "2 metre temperature K"},
2958     /* 168 */ {"2D", "2 metre dewpoint temperature K"},
2959     /* 169 */ {"var169", "undefined"},
2960     /* 170 */ {"DST", "Deep soil tmp/soil temp lev2(frm 930804) K"},
2961     /* 171 */ {"DSW", "Deep soil wet/soil wet lev2(from 930803) m (of water)"},
2962     /* 172 */ {"LSM", "Land/sea mask (0"},
2963     /* 173 */ {"SR", "Surface roughness m"},
2964     /* 174 */ {"AL", "Albedo -"},
2965     /* 175 */ {"var175", "undefined"},
2966     /* 176 */ {"SSR", "Surface solar radiation* W m**-2 s"},
2967     /* 177 */ {"STR", "Surface thermal radiation* W m**-2 s"},
2968     /* 178 */ {"TSR", "Top solar radiation* W m**-2 s"},
2969     /* 179 */ {"TTR", "Top thermal radiation* W m**-2 s"},
2970     /* 180 */ {"EWSS", "East/West surface stress* N m**-2 s"},
2971     /* 181 */ {"NSSS", "North/South surface stress* N m**-2 s"},
2972     /* 182 */ {"E", "Evaporation* m (of water)"},
2973     /* 183 */ {"CDST", "Clim deep soil tmp/soil tmp lev3(930804) K"},
2974     /* 184 */ {"CDSW", "Clim deep soil wet/soil wet lev3(930803) m (of water)"},
2975     /* 185 */ {"CCC", "Convective cloud cover (0 - 1)"},
2976     /* 186 */ {"LCC", "Low cloud cover (0 - 1)"},
2977     /* 187 */ {"MCC", "Medium cloud cover (0 - 1)"},
2978     /* 188 */ {"HCC", "High cloud cover (0 - 1)"},
2979     /* 189 */ {"var189", "undefined"},
2980     /* 190 */ {"EWOV", "EW component subgrid scale orographic variance m**2"},
2981     /* 191 */ {"NSOV", "NS component subgrid scale orographic variance m**2"},
2982     /* 192 */ {"NWOV", "NWSE component subgrid scale orographic variance m**2"},
2983     /* 193 */ {"NEOV", "NESW component subgrid scale orographic variance m**2"},
2984     /* 194 */ {"var194", "undefined"},
2985     /* 195 */ {"LGWS", "Latitudinal component of gravity wave stress* N m**-2 s"},
2986     /* 196 */ {"MGWS", "Meridional component of gravity wave stress* N m**-2 s"},
2987     /* 197 */ {"GWD", "Gravity wave dissipation* W m**-2 s"},
2988     /* 198 */ {"SRC", "Skin reservoir content m (of water)"},
2989     /* 199 */ {"VEG", "Percentage of vegetation %"},
2990     /* 200 */ {"VSO", "Variance of sub-grid scale orography m**2"},
2991     /* 201 */ {"MX2T", "Max temp. at 2m since previous post-processing K"},
2992     /* 202 */ {"MN2T", "Min temp. at 2m since previous post-processing K"},
2993     /* 203 */ {"var203", "undefined"},
2994     /* 204 */ {"PAW", "Precip. analysis weights -"},
2995     /* 205 */ {"RO", "Runoff* m"},
2996     /* 206 */ {"var206", "undefined"},
2997     /* 207 */ {"var207", "undefined"},
2998     /* 208 */ {"var208", "undefined"},
2999     /* 209 */ {"var209", "undefined"},
3000     /* 210 */ {"var210", "undefined"},
3001     /* 211 */ {"var211", "undefined"},
3002     /* 212 */ {"var212", "undefined"},
3003     /* 213 */ {"var213", "undefined"},
3004     /* 214 */ {"var214", "undefined"},
3005     /* 215 */ {"var215", "undefined"},
3006     /* 216 */ {"var216", "undefined"},
3007     /* 217 */ {"var217", "undefined"},
3008     /* 218 */ {"var218", "undefined"},
3009     /* 219 */ {"var219", "undefined"},
3010     /* 220 */ {"var220", "undefined"},
3011     /* 221 */ {"var221", "undefined"},
3012     /* 222 */ {"var222", "undefined"},
3013     /* 223 */ {"var223", "undefined"},
3014     /* 224 */ {"var224", "undefined"},
3015     /* 225 */ {"var225", "undefined"},
3016     /* 226 */ {"var226", "undefined"},
3017     /* 227 */ {"var227", "undefined"},
3018     /* 228 */ {"TP", "Total precipitation? m"},
3019     /* 229 */ {"IEWS", "Instantaneous X surface stress N m**-2"},
3020     /* 230 */ {"INSS", "Instantaneous Y surface stress N m**-2"},
3021     /* 231 */ {"ISHF", "Instantaneous surface Heat Flux W m**-2"},
3022     /* 232 */ {"IE", "Instantaneous Moisture Flux (evaporation) kg m**-2 s"},
3023     /* 233 */ {"ASQ", "Apparent Surface Humidity kg kg**-1"},
3024     /* 234 */ {"LSRH", "Logarithm of surface roughness length for heat -"},
3025     /* 235 */ {"SKT", "Skin Temperature K"},
3026     /* 236 */ {"STL4", "Soil temperature level 4 K"},
3027     /* 237 */ {"SWL4", "Soil wetness level 4 m"},
3028     /* 238 */ {"TSN", "Temperature of snow layer K"},
3029     /* 239 */ {"CSF", "Convective snow-fall* m (of water equivalent)"},
3030     /* 240 */ {"LSF", "Large scale snow-fall* m (of water equivalent)"},
3031     /* 241 */ {"var241", "undefined"},
3032     /* 242 */ {"var242", "undefined"},
3033     /* 243 */ {"FAL", "Forecast albedo -"},
3034     /* 244 */ {"FSR", "Forecast surface roughness m"},
3035     /* 245 */ {"FLSR", "Forecast logarithm of surface roughness for heat -"},
3036     /* 246 */ {"CLWC", "Cloud liquid water content kg kg**-1"},
3037     /* 247 */ {"CIWC", "Cloud ice water content kg kg**-1"},
3038     /* 248 */ {"CC", "Cloud cover (0 - 1)"},
3039     /* 249 */ {"var249", "undefined"},
3040     /* 250 */ {"", "Ice Age (0 first-year 1 multi-year)"},
3041     /* 251 */ {"var251", "undefined"},
3042     /* 252 */ {"var252", "undefined"},
3043     /* 253 */ {"var253", "undefined"},
3044     /* 254 */ {"var254", "undefined"},
3045     /* 255 */ {"var255", "undefined"},
3046 };
3047 
3048 
3049 struct ParmTable parm_table_ecmwf_130[256] = {
3050     /* 0 */ {"var0", "undefined"},
3051     /* 1 */ {"var1", "undefined"},
3052     /* 2 */ {"var2", "undefined"},
3053     /* 3 */ {"var3", "undefined"},
3054     /* 4 */ {"var4", "undefined"},
3055     /* 5 */ {"var5", "undefined"},
3056     /* 6 */ {"var6", "undefined"},
3057     /* 7 */ {"var7", "undefined"},
3058     /* 8 */ {"var8", "undefined"},
3059     /* 9 */ {"var9", "undefined"},
3060     /* 10 */ {"var10", "undefined"},
3061     /* 11 */ {"var11", "undefined"},
3062     /* 12 */ {"var12", "undefined"},
3063     /* 13 */ {"var13", "undefined"},
3064     /* 14 */ {"var14", "undefined"},
3065     /* 15 */ {"var15", "undefined"},
3066     /* 16 */ {"var16", "undefined"},
3067     /* 17 */ {"var17", "undefined"},
3068     /* 18 */ {"var18", "undefined"},
3069     /* 19 */ {"var19", "undefined"},
3070     /* 20 */ {"var20", "undefined"},
3071     /* 21 */ {"var21", "undefined"},
3072     /* 22 */ {"var22", "undefined"},
3073     /* 23 */ {"var23", "undefined"},
3074     /* 24 */ {"var24", "undefined"},
3075     /* 25 */ {"var25", "undefined"},
3076     /* 26 */ {"var26", "undefined"},
3077     /* 27 */ {"var27", "undefined"},
3078     /* 28 */ {"var28", "undefined"},
3079     /* 29 */ {"var29", "undefined"},
3080     /* 30 */ {"var30", "undefined"},
3081     /* 31 */ {"var31", "undefined"},
3082     /* 32 */ {"var32", "undefined"},
3083     /* 33 */ {"var33", "undefined"},
3084     /* 34 */ {"var34", "undefined"},
3085     /* 35 */ {"var35", "undefined"},
3086     /* 36 */ {"var36", "undefined"},
3087     /* 37 */ {"var37", "undefined"},
3088     /* 38 */ {"var38", "undefined"},
3089     /* 39 */ {"var39", "undefined"},
3090     /* 40 */ {"var40", "undefined"},
3091     /* 41 */ {"var41", "undefined"},
3092     /* 42 */ {"var42", "undefined"},
3093     /* 43 */ {"var43", "undefined"},
3094     /* 44 */ {"var44", "undefined"},
3095     /* 45 */ {"var45", "undefined"},
3096     /* 46 */ {"var46", "undefined"},
3097     /* 47 */ {"var47", "undefined"},
3098     /* 48 */ {"var48", "undefined"},
3099     /* 49 */ {"var49", "undefined"},
3100     /* 50 */ {"var50", "undefined"},
3101     /* 51 */ {"var51", "undefined"},
3102     /* 52 */ {"var52", "undefined"},
3103     /* 53 */ {"var53", "undefined"},
3104     /* 54 */ {"var54", "undefined"},
3105     /* 55 */ {"var55", "undefined"},
3106     /* 56 */ {"var56", "undefined"},
3107     /* 57 */ {"var57", "undefined"},
3108     /* 58 */ {"var58", "undefined"},
3109     /* 59 */ {"var59", "undefined"},
3110     /* 60 */ {"var60", "undefined"},
3111     /* 61 */ {"var61", "undefined"},
3112     /* 62 */ {"var62", "undefined"},
3113     /* 63 */ {"var63", "undefined"},
3114     /* 64 */ {"var64", "undefined"},
3115     /* 65 */ {"var65", "undefined"},
3116     /* 66 */ {"var66", "undefined"},
3117     /* 67 */ {"var67", "undefined"},
3118     /* 68 */ {"var68", "undefined"},
3119     /* 69 */ {"var69", "undefined"},
3120     /* 70 */ {"var70", "undefined"},
3121     /* 71 */ {"var71", "undefined"},
3122     /* 72 */ {"var72", "undefined"},
3123     /* 73 */ {"var73", "undefined"},
3124     /* 74 */ {"var74", "undefined"},
3125     /* 75 */ {"var75", "undefined"},
3126     /* 76 */ {"var76", "undefined"},
3127     /* 77 */ {"var77", "undefined"},
3128     /* 78 */ {"var78", "undefined"},
3129     /* 79 */ {"var79", "undefined"},
3130     /* 80 */ {"var80", "undefined"},
3131     /* 81 */ {"var81", "undefined"},
3132     /* 82 */ {"var82", "undefined"},
3133     /* 83 */ {"var83", "undefined"},
3134     /* 84 */ {"var84", "undefined"},
3135     /* 85 */ {"var85", "undefined"},
3136     /* 86 */ {"var86", "undefined"},
3137     /* 87 */ {"var87", "undefined"},
3138     /* 88 */ {"var88", "undefined"},
3139     /* 89 */ {"var89", "undefined"},
3140     /* 90 */ {"var90", "undefined"},
3141     /* 91 */ {"var91", "undefined"},
3142     /* 92 */ {"var92", "undefined"},
3143     /* 93 */ {"var93", "undefined"},
3144     /* 94 */ {"var94", "undefined"},
3145     /* 95 */ {"var95", "undefined"},
3146     /* 96 */ {"var96", "undefined"},
3147     /* 97 */ {"var97", "undefined"},
3148     /* 98 */ {"var98", "undefined"},
3149     /* 99 */ {"var99", "undefined"},
3150     /* 100 */ {"var100", "undefined"},
3151     /* 101 */ {"var101", "undefined"},
3152     /* 102 */ {"var102", "undefined"},
3153     /* 103 */ {"var103", "undefined"},
3154     /* 104 */ {"var104", "undefined"},
3155     /* 105 */ {"var105", "undefined"},
3156     /* 106 */ {"var106", "undefined"},
3157     /* 107 */ {"var107", "undefined"},
3158     /* 108 */ {"var108", "undefined"},
3159     /* 109 */ {"var109", "undefined"},
3160     /* 110 */ {"var110", "undefined"},
3161     /* 111 */ {"var111", "undefined"},
3162     /* 112 */ {"var112", "undefined"},
3163     /* 113 */ {"var113", "undefined"},
3164     /* 114 */ {"var114", "undefined"},
3165     /* 115 */ {"var115", "undefined"},
3166     /* 116 */ {"var116", "undefined"},
3167     /* 117 */ {"var117", "undefined"},
3168     /* 118 */ {"var118", "undefined"},
3169     /* 119 */ {"var119", "undefined"},
3170     /* 120 */ {"var120", "undefined"},
3171     /* 121 */ {"var121", "undefined"},
3172     /* 122 */ {"var122", "undefined"},
3173     /* 123 */ {"var123", "undefined"},
3174     /* 124 */ {"var124", "undefined"},
3175     /* 125 */ {"var125", "undefined"},
3176     /* 126 */ {"var126", "undefined"},
3177     /* 127 */ {"var127", "undefined"},
3178     /* 128 */ {"var128", "undefined"},
3179     /* 129 */ {"var129", "undefined"},
3180     /* 130 */ {"var130", "undefined"},
3181     /* 131 */ {"var131", "undefined"},
3182     /* 132 */ {"var132", "undefined"},
3183     /* 133 */ {"var133", "undefined"},
3184     /* 134 */ {"var134", "undefined"},
3185     /* 135 */ {"var135", "undefined"},
3186     /* 136 */ {"var136", "undefined"},
3187     /* 137 */ {"var137", "undefined"},
3188     /* 138 */ {"var138", "undefined"},
3189     /* 139 */ {"var139", "undefined"},
3190     /* 140 */ {"var140", "undefined"},
3191     /* 141 */ {"var141", "undefined"},
3192     /* 142 */ {"var142", "undefined"},
3193     /* 143 */ {"var143", "undefined"},
3194     /* 144 */ {"var144", "undefined"},
3195     /* 145 */ {"var145", "undefined"},
3196     /* 146 */ {"var146", "undefined"},
3197     /* 147 */ {"var147", "undefined"},
3198     /* 148 */ {"var148", "undefined"},
3199     /* 149 */ {"var149", "undefined"},
3200     /* 150 */ {"var150", "undefined"},
3201     /* 151 */ {"var151", "undefined"},
3202     /* 152 */ {"var152", "undefined"},
3203     /* 153 */ {"var153", "undefined"},
3204     /* 154 */ {"var154", "undefined"},
3205     /* 155 */ {"var155", "undefined"},
3206     /* 156 */ {"var156", "undefined"},
3207     /* 157 */ {"var157", "undefined"},
3208     /* 158 */ {"var158", "undefined"},
3209     /* 159 */ {"var159", "undefined"},
3210     /* 160 */ {"var160", "undefined"},
3211     /* 161 */ {"var161", "undefined"},
3212     /* 162 */ {"var162", "undefined"},
3213     /* 163 */ {"var163", "undefined"},
3214     /* 164 */ {"var164", "undefined"},
3215     /* 165 */ {"var165", "undefined"},
3216     /* 166 */ {"var166", "undefined"},
3217     /* 167 */ {"var167", "undefined"},
3218     /* 168 */ {"var168", "undefined"},
3219     /* 169 */ {"var169", "undefined"},
3220     /* 170 */ {"var170", "undefined"},
3221     /* 171 */ {"var171", "undefined"},
3222     /* 172 */ {"var172", "undefined"},
3223     /* 173 */ {"var173", "undefined"},
3224     /* 174 */ {"var174", "undefined"},
3225     /* 175 */ {"var175", "undefined"},
3226     /* 176 */ {"var176", "undefined"},
3227     /* 177 */ {"var177", "undefined"},
3228     /* 178 */ {"var178", "undefined"},
3229     /* 179 */ {"var179", "undefined"},
3230     /* 180 */ {"var180", "undefined"},
3231     /* 181 */ {"var181", "undefined"},
3232     /* 182 */ {"var182", "undefined"},
3233     /* 183 */ {"var183", "undefined"},
3234     /* 184 */ {"var184", "undefined"},
3235     /* 185 */ {"var185", "undefined"},
3236     /* 186 */ {"var186", "undefined"},
3237     /* 187 */ {"var187", "undefined"},
3238     /* 188 */ {"var188", "undefined"},
3239     /* 189 */ {"var189", "undefined"},
3240     /* 190 */ {"var190", "undefined"},
3241     /* 191 */ {"var191", "undefined"},
3242     /* 192 */ {"var192", "undefined"},
3243     /* 193 */ {"var193", "undefined"},
3244     /* 194 */ {"var194", "undefined"},
3245     /* 195 */ {"var195", "undefined"},
3246     /* 196 */ {"var196", "undefined"},
3247     /* 197 */ {"var197", "undefined"},
3248     /* 198 */ {"var198", "undefined"},
3249     /* 199 */ {"var199", "undefined"},
3250     /* 200 */ {"var200", "undefined"},
3251     /* 201 */ {"var201", "undefined"},
3252     /* 202 */ {"var202", "undefined"},
3253     /* 203 */ {"var203", "undefined"},
3254     /* 204 */ {"var204", "undefined"},
3255     /* 205 */ {"var205", "undefined"},
3256     /* 206 */ {"var206", "undefined"},
3257     /* 207 */ {"var207", "undefined"},
3258     /* 208 */ {"TSRU", "Top solar radiation upward W m**-2"},
3259     /* 209 */ {"TTRU", "Top thermal radiation upward W m**-2"},
3260     /* 210 */ {"TSUC", "Top solar radiation upward clear sky W m**-2"},
3261     /* 211 */ {"TTUC", "Top thermal radiation upward clear sky W m**-2"},
3262     /* 212 */ {"CLW", "Cloud liquid water kg kg**-1"},
3263     /* 213 */ {"CF", "Cloud fraction 0-1"},
3264     /* 214 */ {"DHR", "Diabatic heating by radiation K s**-1"},
3265     /* 215 */ {"DHVD", "Diabatic heating by vertical diffusion K s**-1"},
3266     /* 216 */ {"DHCC", "Diabatic heating by cumulus convection K s**-1"},
3267     /* 217 */ {"DHLC", "Diabatic heating by large-scale condensation K s**-1"},
3268     /* 218 */ {"VDZW", "Vertical diffusion of zonal wind m**2 s**-3"},
3269     /* 219 */ {"VDMW", "Vertical diffusion of meridional wind m**2 s**-3"},
3270     /* 220 */ {"EWGD", "EW gravity wave drag m**2 s**-3"},
3271     /* 221 */ {"NSGD", "NS gravity wave drag m**2 s**-3"},
3272     /* 222 */ {"CTZW", "Convective tendency of zonal wind m**2 s**-3"},
3273     /* 223 */ {"CTMW", "Convective tendency of meridional wind m**2 s**-3"},
3274     /* 224 */ {"VDH", "Vertical diffusion of humidity kg kg**-1 s**-1"},
3275     /* 225 */ {"HTCC", "Humidity tendency by cumulus convection kg kg**-1 s**-1"},
3276     /* 226 */ {"HTLC", "Humidity tendency by large-scale condensation kg kg**-1 s**-1"},
3277     /* 227 */ {"CRNH", "Change from removing negative humidity kg kg**-1 s**-1"},
3278     /* 228 */ {"ATT", "Adiabatic tendency of temperature K s**-1"},
3279     /* 229 */ {"ATH", "Adiabatic tendency of humidity kg kg**-1 s**-1"},
3280     /* 230 */ {"ATZW", "Adiabatic tendency of zonal wind m**2 s**-3"},
3281     /* 231 */ {"ATMW", "Adiabatic tendency of meridional wind m**2 s**-3"},
3282     /* 232 */ {"MVV", "Mean vertical velocity Pa s**-1"},
3283     /* 233 */ {"var233", "undefined"},
3284     /* 234 */ {"var234", "undefined"},
3285     /* 235 */ {"var235", "undefined"},
3286     /* 236 */ {"var236", "undefined"},
3287     /* 237 */ {"var237", "undefined"},
3288     /* 238 */ {"var238", "undefined"},
3289     /* 239 */ {"var239", "undefined"},
3290     /* 240 */ {"var240", "undefined"},
3291     /* 241 */ {"var241", "undefined"},
3292     /* 242 */ {"var242", "undefined"},
3293     /* 243 */ {"var243", "undefined"},
3294     /* 244 */ {"var244", "undefined"},
3295     /* 245 */ {"var245", "undefined"},
3296     /* 246 */ {"var246", "undefined"},
3297     /* 247 */ {"var247", "undefined"},
3298     /* 248 */ {"var248", "undefined"},
3299     /* 249 */ {"var249", "undefined"},
3300     /* 250 */ {"var250", "undefined"},
3301     /* 251 */ {"var251", "undefined"},
3302     /* 252 */ {"var252", "undefined"},
3303     /* 253 */ {"var253", "undefined"},
3304     /* 254 */ {"var254", "undefined"},
3305     /* 255 */ {"var255", "undefined"},
3306 };
3307 
3308 
3309 struct ParmTable parm_table_ecmwf_131[256] = {
3310     /* 0 */ {"var0", "undefined"},
3311     /* 1 */ {"var1", "undefined"},
3312     /* 2 */ {"var2", "undefined"},
3313     /* 3 */ {"var3", "undefined"},
3314     /* 4 */ {"var4", "undefined"},
3315     /* 5 */ {"var5", "undefined"},
3316     /* 6 */ {"var6", "undefined"},
3317     /* 7 */ {"var7", "undefined"},
3318     /* 8 */ {"var8", "undefined"},
3319     /* 9 */ {"var9", "undefined"},
3320     /* 10 */ {"var10", "undefined"},
3321     /* 11 */ {"var11", "undefined"},
3322     /* 12 */ {"var12", "undefined"},
3323     /* 13 */ {"var13", "undefined"},
3324     /* 14 */ {"var14", "undefined"},
3325     /* 15 */ {"var15", "undefined"},
3326     /* 16 */ {"var16", "undefined"},
3327     /* 17 */ {"var17", "undefined"},
3328     /* 18 */ {"var18", "undefined"},
3329     /* 19 */ {"var19", "undefined"},
3330     /* 20 */ {"var20", "undefined"},
3331     /* 21 */ {"var21", "undefined"},
3332     /* 22 */ {"var22", "undefined"},
3333     /* 23 */ {"var23", "undefined"},
3334     /* 24 */ {"var24", "undefined"},
3335     /* 25 */ {"var25", "undefined"},
3336     /* 26 */ {"var26", "undefined"},
3337     /* 27 */ {"var27", "undefined"},
3338     /* 28 */ {"var28", "undefined"},
3339     /* 29 */ {"var29", "undefined"},
3340     /* 30 */ {"var30", "undefined"},
3341     /* 31 */ {"var31", "undefined"},
3342     /* 32 */ {"var32", "undefined"},
3343     /* 33 */ {"var33", "undefined"},
3344     /* 34 */ {"var34", "undefined"},
3345     /* 35 */ {"var35", "undefined"},
3346     /* 36 */ {"var36", "undefined"},
3347     /* 37 */ {"var37", "undefined"},
3348     /* 38 */ {"var38", "undefined"},
3349     /* 39 */ {"var39", "undefined"},
3350     /* 40 */ {"var40", "undefined"},
3351     /* 41 */ {"var41", "undefined"},
3352     /* 42 */ {"var42", "undefined"},
3353     /* 43 */ {"var43", "undefined"},
3354     /* 44 */ {"var44", "undefined"},
3355     /* 45 */ {"var45", "undefined"},
3356     /* 46 */ {"var46", "undefined"},
3357     /* 47 */ {"var47", "undefined"},
3358     /* 48 */ {"var48", "undefined"},
3359     /* 49 */ {"var49", "undefined"},
3360     /* 50 */ {"var50", "undefined"},
3361     /* 51 */ {"var51", "undefined"},
3362     /* 52 */ {"var52", "undefined"},
3363     /* 53 */ {"var53", "undefined"},
3364     /* 54 */ {"var54", "undefined"},
3365     /* 55 */ {"var55", "undefined"},
3366     /* 56 */ {"var56", "undefined"},
3367     /* 57 */ {"var57", "undefined"},
3368     /* 58 */ {"var58", "undefined"},
3369     /* 59 */ {"var59", "undefined"},
3370     /* 60 */ {"var60", "undefined"},
3371     /* 61 */ {"var61", "undefined"},
3372     /* 62 */ {"var62", "undefined"},
3373     /* 63 */ {"var63", "undefined"},
3374     /* 64 */ {"var64", "undefined"},
3375     /* 65 */ {"var65", "undefined"},
3376     /* 66 */ {"var66", "undefined"},
3377     /* 67 */ {"var67", "undefined"},
3378     /* 68 */ {"var68", "undefined"},
3379     /* 69 */ {"var69", "undefined"},
3380     /* 70 */ {"var70", "undefined"},
3381     /* 71 */ {"var71", "undefined"},
3382     /* 72 */ {"var72", "undefined"},
3383     /* 73 */ {"var73", "undefined"},
3384     /* 74 */ {"var74", "undefined"},
3385     /* 75 */ {"var75", "undefined"},
3386     /* 76 */ {"var76", "undefined"},
3387     /* 77 */ {"var77", "undefined"},
3388     /* 78 */ {"var78", "undefined"},
3389     /* 79 */ {"var79", "undefined"},
3390     /* 80 */ {"var80", "undefined"},
3391     /* 81 */ {"var81", "undefined"},
3392     /* 82 */ {"var82", "undefined"},
3393     /* 83 */ {"var83", "undefined"},
3394     /* 84 */ {"var84", "undefined"},
3395     /* 85 */ {"var85", "undefined"},
3396     /* 86 */ {"var86", "undefined"},
3397     /* 87 */ {"var87", "undefined"},
3398     /* 88 */ {"var88", "undefined"},
3399     /* 89 */ {"var89", "undefined"},
3400     /* 90 */ {"var90", "undefined"},
3401     /* 91 */ {"var91", "undefined"},
3402     /* 92 */ {"var92", "undefined"},
3403     /* 93 */ {"var93", "undefined"},
3404     /* 94 */ {"var94", "undefined"},
3405     /* 95 */ {"var95", "undefined"},
3406     /* 96 */ {"var96", "undefined"},
3407     /* 97 */ {"var97", "undefined"},
3408     /* 98 */ {"var98", "undefined"},
3409     /* 99 */ {"var99", "undefined"},
3410     /* 100 */ {"var100", "undefined"},
3411     /* 101 */ {"var101", "undefined"},
3412     /* 102 */ {"var102", "undefined"},
3413     /* 103 */ {"var103", "undefined"},
3414     /* 104 */ {"var104", "undefined"},
3415     /* 105 */ {"var105", "undefined"},
3416     /* 106 */ {"var106", "undefined"},
3417     /* 107 */ {"var107", "undefined"},
3418     /* 108 */ {"var108", "undefined"},
3419     /* 109 */ {"var109", "undefined"},
3420     /* 110 */ {"var110", "undefined"},
3421     /* 111 */ {"var111", "undefined"},
3422     /* 112 */ {"var112", "undefined"},
3423     /* 113 */ {"var113", "undefined"},
3424     /* 114 */ {"var114", "undefined"},
3425     /* 115 */ {"var115", "undefined"},
3426     /* 116 */ {"var116", "undefined"},
3427     /* 117 */ {"var117", "undefined"},
3428     /* 118 */ {"var118", "undefined"},
3429     /* 119 */ {"var119", "undefined"},
3430     /* 120 */ {"var120", "undefined"},
3431     /* 121 */ {"var121", "undefined"},
3432     /* 122 */ {"var122", "undefined"},
3433     /* 123 */ {"var123", "undefined"},
3434     /* 124 */ {"var124", "undefined"},
3435     /* 125 */ {"var125", "undefined"},
3436     /* 126 */ {"var126", "undefined"},
3437     /* 127 */ {"var127", "undefined"},
3438     /* 128 */ {"var128", "undefined"},
3439     /* 129 */ {"var129", "undefined"},
3440     /* 130 */ {"TAP", "Temperature anomaly probability % K"},
3441     /* 131 */ {"var131", "undefined"},
3442     /* 132 */ {"var132", "undefined"},
3443     /* 133 */ {"var133", "undefined"},
3444     /* 134 */ {"var134", "undefined"},
3445     /* 135 */ {"var135", "undefined"},
3446     /* 136 */ {"var136", "undefined"},
3447     /* 137 */ {"var137", "undefined"},
3448     /* 138 */ {"var138", "undefined"},
3449     /* 139 */ {"var139", "undefined"},
3450     /* 140 */ {"var140", "undefined"},
3451     /* 141 */ {"var141", "undefined"},
3452     /* 142 */ {"var142", "undefined"},
3453     /* 143 */ {"var143", "undefined"},
3454     /* 144 */ {"var144", "undefined"},
3455     /* 145 */ {"var145", "undefined"},
3456     /* 146 */ {"var146", "undefined"},
3457     /* 147 */ {"var147", "undefined"},
3458     /* 148 */ {"var148", "undefined"},
3459     /* 149 */ {"var149", "undefined"},
3460     /* 150 */ {"var150", "undefined"},
3461     /* 151 */ {"var151", "undefined"},
3462     /* 152 */ {"var152", "undefined"},
3463     /* 153 */ {"var153", "undefined"},
3464     /* 154 */ {"var154", "undefined"},
3465     /* 155 */ {"var155", "undefined"},
3466     /* 156 */ {"var156", "undefined"},
3467     /* 157 */ {"var157", "undefined"},
3468     /* 158 */ {"var158", "undefined"},
3469     /* 159 */ {"var159", "undefined"},
3470     /* 160 */ {"var160", "undefined"},
3471     /* 161 */ {"var161", "undefined"},
3472     /* 162 */ {"var162", "undefined"},
3473     /* 163 */ {"var163", "undefined"},
3474     /* 164 */ {"var164", "undefined"},
3475     /* 165 */ {"10SP", "10 metre speed probability % m s**-1"},
3476     /* 166 */ {"var166", "undefined"},
3477     /* 167 */ {"2TP", "2 metre temperature probability %"},
3478     /* 168 */ {"var168", "undefined"},
3479     /* 169 */ {"var169", "undefined"},
3480     /* 170 */ {"var170", "undefined"},
3481     /* 171 */ {"var171", "undefined"},
3482     /* 172 */ {"var172", "undefined"},
3483     /* 173 */ {"var173", "undefined"},
3484     /* 174 */ {"var174", "undefined"},
3485     /* 175 */ {"var175", "undefined"},
3486     /* 176 */ {"var176", "undefined"},
3487     /* 177 */ {"var177", "undefined"},
3488     /* 178 */ {"var178", "undefined"},
3489     /* 179 */ {"var179", "undefined"},
3490     /* 180 */ {"var180", "undefined"},
3491     /* 181 */ {"var181", "undefined"},
3492     /* 182 */ {"var182", "undefined"},
3493     /* 183 */ {"var183", "undefined"},
3494     /* 184 */ {"var184", "undefined"},
3495     /* 185 */ {"var185", "undefined"},
3496     /* 186 */ {"var186", "undefined"},
3497     /* 187 */ {"var187", "undefined"},
3498     /* 188 */ {"var188", "undefined"},
3499     /* 189 */ {"var189", "undefined"},
3500     /* 190 */ {"var190", "undefined"},
3501     /* 191 */ {"var191", "undefined"},
3502     /* 192 */ {"var192", "undefined"},
3503     /* 193 */ {"var193", "undefined"},
3504     /* 194 */ {"var194", "undefined"},
3505     /* 195 */ {"var195", "undefined"},
3506     /* 196 */ {"var196", "undefined"},
3507     /* 197 */ {"var197", "undefined"},
3508     /* 198 */ {"var198", "undefined"},
3509     /* 199 */ {"var199", "undefined"},
3510     /* 200 */ {"var200", "undefined"},
3511     /* 201 */ {"var201", "undefined"},
3512     /* 202 */ {"var202", "undefined"},
3513     /* 203 */ {"var203", "undefined"},
3514     /* 204 */ {"var204", "undefined"},
3515     /* 205 */ {"var205", "undefined"},
3516     /* 206 */ {"var206", "undefined"},
3517     /* 207 */ {"var207", "undefined"},
3518     /* 208 */ {"var208", "undefined"},
3519     /* 209 */ {"var209", "undefined"},
3520     /* 210 */ {"var210", "undefined"},
3521     /* 211 */ {"var211", "undefined"},
3522     /* 212 */ {"var212", "undefined"},
3523     /* 213 */ {"var213", "undefined"},
3524     /* 214 */ {"var214", "undefined"},
3525     /* 215 */ {"var215", "undefined"},
3526     /* 216 */ {"var216", "undefined"},
3527     /* 217 */ {"var217", "undefined"},
3528     /* 218 */ {"var218", "undefined"},
3529     /* 219 */ {"var219", "undefined"},
3530     /* 220 */ {"var220", "undefined"},
3531     /* 221 */ {"var221", "undefined"},
3532     /* 222 */ {"var222", "undefined"},
3533     /* 223 */ {"var223", "undefined"},
3534     /* 224 */ {"var224", "undefined"},
3535     /* 225 */ {"var225", "undefined"},
3536     /* 226 */ {"var226", "undefined"},
3537     /* 227 */ {"var227", "undefined"},
3538     /* 228 */ {"TTP", "Total precipitation probability % m"},
3539     /* 229 */ {"var229", "undefined"},
3540     /* 230 */ {"var230", "undefined"},
3541     /* 231 */ {"var231", "undefined"},
3542     /* 232 */ {"var232", "undefined"},
3543     /* 233 */ {"var233", "undefined"},
3544     /* 234 */ {"var234", "undefined"},
3545     /* 235 */ {"var235", "undefined"},
3546     /* 236 */ {"var236", "undefined"},
3547     /* 237 */ {"var237", "undefined"},
3548     /* 238 */ {"var238", "undefined"},
3549     /* 239 */ {"var239", "undefined"},
3550     /* 240 */ {"var240", "undefined"},
3551     /* 241 */ {"var241", "undefined"},
3552     /* 242 */ {"var242", "undefined"},
3553     /* 243 */ {"var243", "undefined"},
3554     /* 244 */ {"var244", "undefined"},
3555     /* 245 */ {"var245", "undefined"},
3556     /* 246 */ {"var246", "undefined"},
3557     /* 247 */ {"var247", "undefined"},
3558     /* 248 */ {"var248", "undefined"},
3559     /* 249 */ {"var249", "undefined"},
3560     /* 250 */ {"var250", "undefined"},
3561     /* 251 */ {"var251", "undefined"},
3562     /* 252 */ {"var252", "undefined"},
3563     /* 253 */ {"var253", "undefined"},
3564     /* 254 */ {"var254", "undefined"},
3565     /* 255 */ {"var255", "undefined"},
3566 };
3567 
3568 
3569 struct ParmTable parm_table_ecmwf_140[256] = {
3570     /* 0 */ {"var0", "undefined"},
3571     /* 1 */ {"var1", "undefined"},
3572     /* 2 */ {"var2", "undefined"},
3573     /* 3 */ {"var3", "undefined"},
3574     /* 4 */ {"var4", "undefined"},
3575     /* 5 */ {"var5", "undefined"},
3576     /* 6 */ {"var6", "undefined"},
3577     /* 7 */ {"var7", "undefined"},
3578     /* 8 */ {"var8", "undefined"},
3579     /* 9 */ {"var9", "undefined"},
3580     /* 10 */ {"var10", "undefined"},
3581     /* 11 */ {"var11", "undefined"},
3582     /* 12 */ {"var12", "undefined"},
3583     /* 13 */ {"var13", "undefined"},
3584     /* 14 */ {"var14", "undefined"},
3585     /* 15 */ {"var15", "undefined"},
3586     /* 16 */ {"var16", "undefined"},
3587     /* 17 */ {"var17", "undefined"},
3588     /* 18 */ {"var18", "undefined"},
3589     /* 19 */ {"var19", "undefined"},
3590     /* 20 */ {"var20", "undefined"},
3591     /* 21 */ {"var21", "undefined"},
3592     /* 22 */ {"var22", "undefined"},
3593     /* 23 */ {"var23", "undefined"},
3594     /* 24 */ {"var24", "undefined"},
3595     /* 25 */ {"var25", "undefined"},
3596     /* 26 */ {"var26", "undefined"},
3597     /* 27 */ {"var27", "undefined"},
3598     /* 28 */ {"var28", "undefined"},
3599     /* 29 */ {"var29", "undefined"},
3600     /* 30 */ {"var30", "undefined"},
3601     /* 31 */ {"var31", "undefined"},
3602     /* 32 */ {"var32", "undefined"},
3603     /* 33 */ {"var33", "undefined"},
3604     /* 34 */ {"var34", "undefined"},
3605     /* 35 */ {"var35", "undefined"},
3606     /* 36 */ {"var36", "undefined"},
3607     /* 37 */ {"var37", "undefined"},
3608     /* 38 */ {"var38", "undefined"},
3609     /* 39 */ {"var39", "undefined"},
3610     /* 40 */ {"var40", "undefined"},
3611     /* 41 */ {"var41", "undefined"},
3612     /* 42 */ {"var42", "undefined"},
3613     /* 43 */ {"var43", "undefined"},
3614     /* 44 */ {"var44", "undefined"},
3615     /* 45 */ {"var45", "undefined"},
3616     /* 46 */ {"var46", "undefined"},
3617     /* 47 */ {"var47", "undefined"},
3618     /* 48 */ {"var48", "undefined"},
3619     /* 49 */ {"var49", "undefined"},
3620     /* 50 */ {"var50", "undefined"},
3621     /* 51 */ {"var51", "undefined"},
3622     /* 52 */ {"var52", "undefined"},
3623     /* 53 */ {"var53", "undefined"},
3624     /* 54 */ {"var54", "undefined"},
3625     /* 55 */ {"var55", "undefined"},
3626     /* 56 */ {"var56", "undefined"},
3627     /* 57 */ {"var57", "undefined"},
3628     /* 58 */ {"var58", "undefined"},
3629     /* 59 */ {"var59", "undefined"},
3630     /* 60 */ {"var60", "undefined"},
3631     /* 61 */ {"var61", "undefined"},
3632     /* 62 */ {"var62", "undefined"},
3633     /* 63 */ {"var63", "undefined"},
3634     /* 64 */ {"var64", "undefined"},
3635     /* 65 */ {"var65", "undefined"},
3636     /* 66 */ {"var66", "undefined"},
3637     /* 67 */ {"var67", "undefined"},
3638     /* 68 */ {"var68", "undefined"},
3639     /* 69 */ {"var69", "undefined"},
3640     /* 70 */ {"var70", "undefined"},
3641     /* 71 */ {"var71", "undefined"},
3642     /* 72 */ {"var72", "undefined"},
3643     /* 73 */ {"var73", "undefined"},
3644     /* 74 */ {"var74", "undefined"},
3645     /* 75 */ {"var75", "undefined"},
3646     /* 76 */ {"var76", "undefined"},
3647     /* 77 */ {"var77", "undefined"},
3648     /* 78 */ {"var78", "undefined"},
3649     /* 79 */ {"var79", "undefined"},
3650     /* 80 */ {"var80", "undefined"},
3651     /* 81 */ {"var81", "undefined"},
3652     /* 82 */ {"var82", "undefined"},
3653     /* 83 */ {"var83", "undefined"},
3654     /* 84 */ {"var84", "undefined"},
3655     /* 85 */ {"var85", "undefined"},
3656     /* 86 */ {"var86", "undefined"},
3657     /* 87 */ {"var87", "undefined"},
3658     /* 88 */ {"var88", "undefined"},
3659     /* 89 */ {"var89", "undefined"},
3660     /* 90 */ {"var90", "undefined"},
3661     /* 91 */ {"var91", "undefined"},
3662     /* 92 */ {"var92", "undefined"},
3663     /* 93 */ {"var93", "undefined"},
3664     /* 94 */ {"var94", "undefined"},
3665     /* 95 */ {"var95", "undefined"},
3666     /* 96 */ {"var96", "undefined"},
3667     /* 97 */ {"var97", "undefined"},
3668     /* 98 */ {"var98", "undefined"},
3669     /* 99 */ {"var99", "undefined"},
3670     /* 100 */ {"var100", "undefined"},
3671     /* 101 */ {"var101", "undefined"},
3672     /* 102 */ {"var102", "undefined"},
3673     /* 103 */ {"var103", "undefined"},
3674     /* 104 */ {"var104", "undefined"},
3675     /* 105 */ {"var105", "undefined"},
3676     /* 106 */ {"var106", "undefined"},
3677     /* 107 */ {"var107", "undefined"},
3678     /* 108 */ {"var108", "undefined"},
3679     /* 109 */ {"var109", "undefined"},
3680     /* 110 */ {"var110", "undefined"},
3681     /* 111 */ {"var111", "undefined"},
3682     /* 112 */ {"var112", "undefined"},
3683     /* 113 */ {"var113", "undefined"},
3684     /* 114 */ {"var114", "undefined"},
3685     /* 115 */ {"var115", "undefined"},
3686     /* 116 */ {"var116", "undefined"},
3687     /* 117 */ {"var117", "undefined"},
3688     /* 118 */ {"var118", "undefined"},
3689     /* 119 */ {"var119", "undefined"},
3690     /* 120 */ {"var120", "undefined"},
3691     /* 121 */ {"var121", "undefined"},
3692     /* 122 */ {"var122", "undefined"},
3693     /* 123 */ {"var123", "undefined"},
3694     /* 124 */ {"var124", "undefined"},
3695     /* 125 */ {"var125", "undefined"},
3696     /* 126 */ {"var126", "undefined"},
3697     /* 127 */ {"var127", "undefined"},
3698     /* 128 */ {"var128", "undefined"},
3699     /* 129 */ {"var129", "undefined"},
3700     /* 130 */ {"var130", "undefined"},
3701     /* 131 */ {"var131", "undefined"},
3702     /* 132 */ {"var132", "undefined"},
3703     /* 133 */ {"var133", "undefined"},
3704     /* 134 */ {"var134", "undefined"},
3705     /* 135 */ {"var135", "undefined"},
3706     /* 136 */ {"var136", "undefined"},
3707     /* 137 */ {"var137", "undefined"},
3708     /* 138 */ {"var138", "undefined"},
3709     /* 139 */ {"var139", "undefined"},
3710     /* 140 */ {"var140", "undefined"},
3711     /* 141 */ {"var141", "undefined"},
3712     /* 142 */ {"var142", "undefined"},
3713     /* 143 */ {"var143", "undefined"},
3714     /* 144 */ {"var144", "undefined"},
3715     /* 145 */ {"var145", "undefined"},
3716     /* 146 */ {"var146", "undefined"},
3717     /* 147 */ {"var147", "undefined"},
3718     /* 148 */ {"var148", "undefined"},
3719     /* 149 */ {"var149", "undefined"},
3720     /* 150 */ {"var150", "undefined"},
3721     /* 151 */ {"var151", "undefined"},
3722     /* 152 */ {"var152", "undefined"},
3723     /* 153 */ {"var153", "undefined"},
3724     /* 154 */ {"var154", "undefined"},
3725     /* 155 */ {"var155", "undefined"},
3726     /* 156 */ {"var156", "undefined"},
3727     /* 157 */ {"var157", "undefined"},
3728     /* 158 */ {"var158", "undefined"},
3729     /* 159 */ {"var159", "undefined"},
3730     /* 160 */ {"var160", "undefined"},
3731     /* 161 */ {"var161", "undefined"},
3732     /* 162 */ {"var162", "undefined"},
3733     /* 163 */ {"var163", "undefined"},
3734     /* 164 */ {"var164", "undefined"},
3735     /* 165 */ {"var165", "undefined"},
3736     /* 166 */ {"var166", "undefined"},
3737     /* 167 */ {"var167", "undefined"},
3738     /* 168 */ {"var168", "undefined"},
3739     /* 169 */ {"var169", "undefined"},
3740     /* 170 */ {"var170", "undefined"},
3741     /* 171 */ {"var171", "undefined"},
3742     /* 172 */ {"var172", "undefined"},
3743     /* 173 */ {"var173", "undefined"},
3744     /* 174 */ {"var174", "undefined"},
3745     /* 175 */ {"var175", "undefined"},
3746     /* 176 */ {"var176", "undefined"},
3747     /* 177 */ {"var177", "undefined"},
3748     /* 178 */ {"var178", "undefined"},
3749     /* 179 */ {"var179", "undefined"},
3750     /* 180 */ {"var180", "undefined"},
3751     /* 181 */ {"var181", "undefined"},
3752     /* 182 */ {"var182", "undefined"},
3753     /* 183 */ {"var183", "undefined"},
3754     /* 184 */ {"var184", "undefined"},
3755     /* 185 */ {"var185", "undefined"},
3756     /* 186 */ {"var186", "undefined"},
3757     /* 187 */ {"var187", "undefined"},
3758     /* 188 */ {"var188", "undefined"},
3759     /* 189 */ {"var189", "undefined"},
3760     /* 190 */ {"var190", "undefined"},
3761     /* 191 */ {"var191", "undefined"},
3762     /* 192 */ {"var192", "undefined"},
3763     /* 193 */ {"var193", "undefined"},
3764     /* 194 */ {"var194", "undefined"},
3765     /* 195 */ {"var195", "undefined"},
3766     /* 196 */ {"var196", "undefined"},
3767     /* 197 */ {"var197", "undefined"},
3768     /* 198 */ {"var198", "undefined"},
3769     /* 199 */ {"var199", "undefined"},
3770     /* 200 */ {"var200", "undefined"},
3771     /* 201 */ {"var201", "undefined"},
3772     /* 202 */ {"var202", "undefined"},
3773     /* 203 */ {"var203", "undefined"},
3774     /* 204 */ {"var204", "undefined"},
3775     /* 205 */ {"var205", "undefined"},
3776     /* 206 */ {"var206", "undefined"},
3777     /* 207 */ {"var207", "undefined"},
3778     /* 208 */ {"var208", "undefined"},
3779     /* 209 */ {"var209", "undefined"},
3780     /* 210 */ {"var210", "undefined"},
3781     /* 211 */ {"var211", "undefined"},
3782     /* 212 */ {"var212", "undefined"},
3783     /* 213 */ {"var213", "undefined"},
3784     /* 214 */ {"var214", "undefined"},
3785     /* 215 */ {"var215", "undefined"},
3786     /* 216 */ {"var216", "undefined"},
3787     /* 217 */ {"var217", "undefined"},
3788     /* 218 */ {"var218", "undefined"},
3789     /* 219 */ {"var219", "undefined"},
3790     /* 220 */ {"var220", "undefined"},
3791     /* 221 */ {"var221", "undefined"},
3792     /* 222 */ {"var222", "undefined"},
3793     /* 223 */ {"var223", "undefined"},
3794     /* 224 */ {"var224", "undefined"},
3795     /* 225 */ {"var225", "undefined"},
3796     /* 226 */ {"var226", "undefined"},
3797     /* 227 */ {"var227", "undefined"},
3798     /* 228 */ {"var228", "undefined"},
3799     /* 229 */ {"SWH", "Significant wave height m"},
3800     /* 230 */ {"MWD", "Mean wave direction degrees"},
3801     /* 231 */ {"PP1D", "Peak period of 1d spectra s"},
3802     /* 232 */ {"MWP", "Mean wave period s"},
3803     /* 233 */ {"CDWW", "Coefficient of drag with waves -"},
3804     /* 234 */ {"SHWW", "Significant height of wind waves m"},
3805     /* 235 */ {"MDWW", "Mean direction of wind waves degrees"},
3806     /* 236 */ {"MPWW", "Mean period of wind waves s"},
3807     /* 237 */ {"SHPS", "Significant height of primary swell m"},
3808     /* 238 */ {"MDPS", "Mean direction of primary swell degrees"},
3809     /* 239 */ {"MPPS", "Mean period of primary swell s"},
3810     /* 240 */ {"SDHS", "Standard deviation wave height m"},
3811     /* 241 */ {"MU10", "Mean of 10m windspeed m s**-1"},
3812     /* 242 */ {"MDWI", "Mean wind direction degrees"},
3813     /* 243 */ {"SDU", "Standard deviation 10m wind speed m s**-1"},
3814     /* 244 */ {"MSQS", "Mean square slope of waves dimensionless"},
3815     /* 245 */ {"10MS", "Ten metre windspeed m s**-1"},
3816     /* 246 */ {"var246", "undefined"},
3817     /* 247 */ {"var247", "undefined"},
3818     /* 248 */ {"var248", "undefined"},
3819     /* 249 */ {"var249", "undefined"},
3820     /* 250 */ {"2DSP", "2D wave spectra m**2 s radiance**-1"},
3821     /* 251 */ {"None", "2D wave spectra(single direction/single frequency) m**2 s radiance**-1"},
3822     /* 252 */ {"var252", "undefined"},
3823     /* 253 */ {"var253", "undefined"},
3824     /* 254 */ {"var254", "undefined"},
3825     /* 255 */ {"var255", "undefined"},
3826 };
3827 
3828 
3829 struct ParmTable parm_table_ecmwf_150[256] = {
3830     /* 0 */ {"var0", "undefined"},
3831     /* 1 */ {"var1", "undefined"},
3832     /* 2 */ {"var2", "undefined"},
3833     /* 3 */ {"var3", "undefined"},
3834     /* 4 */ {"var4", "undefined"},
3835     /* 5 */ {"var5", "undefined"},
3836     /* 6 */ {"var6", "undefined"},
3837     /* 7 */ {"var7", "undefined"},
3838     /* 8 */ {"var8", "undefined"},
3839     /* 9 */ {"var9", "undefined"},
3840     /* 10 */ {"var10", "undefined"},
3841     /* 11 */ {"var11", "undefined"},
3842     /* 12 */ {"var12", "undefined"},
3843     /* 13 */ {"var13", "undefined"},
3844     /* 14 */ {"var14", "undefined"},
3845     /* 15 */ {"var15", "undefined"},
3846     /* 16 */ {"var16", "undefined"},
3847     /* 17 */ {"var17", "undefined"},
3848     /* 18 */ {"var18", "undefined"},
3849     /* 19 */ {"var19", "undefined"},
3850     /* 20 */ {"var20", "undefined"},
3851     /* 21 */ {"var21", "undefined"},
3852     /* 22 */ {"var22", "undefined"},
3853     /* 23 */ {"var23", "undefined"},
3854     /* 24 */ {"var24", "undefined"},
3855     /* 25 */ {"var25", "undefined"},
3856     /* 26 */ {"var26", "undefined"},
3857     /* 27 */ {"var27", "undefined"},
3858     /* 28 */ {"var28", "undefined"},
3859     /* 29 */ {"var29", "undefined"},
3860     /* 30 */ {"var30", "undefined"},
3861     /* 31 */ {"var31", "undefined"},
3862     /* 32 */ {"var32", "undefined"},
3863     /* 33 */ {"var33", "undefined"},
3864     /* 34 */ {"var34", "undefined"},
3865     /* 35 */ {"var35", "undefined"},
3866     /* 36 */ {"var36", "undefined"},
3867     /* 37 */ {"var37", "undefined"},
3868     /* 38 */ {"var38", "undefined"},
3869     /* 39 */ {"var39", "undefined"},
3870     /* 40 */ {"var40", "undefined"},
3871     /* 41 */ {"var41", "undefined"},
3872     /* 42 */ {"var42", "undefined"},
3873     /* 43 */ {"var43", "undefined"},
3874     /* 44 */ {"var44", "undefined"},
3875     /* 45 */ {"var45", "undefined"},
3876     /* 46 */ {"var46", "undefined"},
3877     /* 47 */ {"var47", "undefined"},
3878     /* 48 */ {"var48", "undefined"},
3879     /* 49 */ {"var49", "undefined"},
3880     /* 50 */ {"var50", "undefined"},
3881     /* 51 */ {"var51", "undefined"},
3882     /* 52 */ {"var52", "undefined"},
3883     /* 53 */ {"var53", "undefined"},
3884     /* 54 */ {"var54", "undefined"},
3885     /* 55 */ {"var55", "undefined"},
3886     /* 56 */ {"var56", "undefined"},
3887     /* 57 */ {"var57", "undefined"},
3888     /* 58 */ {"var58", "undefined"},
3889     /* 59 */ {"var59", "undefined"},
3890     /* 60 */ {"var60", "undefined"},
3891     /* 61 */ {"var61", "undefined"},
3892     /* 62 */ {"var62", "undefined"},
3893     /* 63 */ {"var63", "undefined"},
3894     /* 64 */ {"var64", "undefined"},
3895     /* 65 */ {"var65", "undefined"},
3896     /* 66 */ {"var66", "undefined"},
3897     /* 67 */ {"var67", "undefined"},
3898     /* 68 */ {"var68", "undefined"},
3899     /* 69 */ {"var69", "undefined"},
3900     /* 70 */ {"var70", "undefined"},
3901     /* 71 */ {"var71", "undefined"},
3902     /* 72 */ {"var72", "undefined"},
3903     /* 73 */ {"var73", "undefined"},
3904     /* 74 */ {"var74", "undefined"},
3905     /* 75 */ {"var75", "undefined"},
3906     /* 76 */ {"var76", "undefined"},
3907     /* 77 */ {"var77", "undefined"},
3908     /* 78 */ {"var78", "undefined"},
3909     /* 79 */ {"var79", "undefined"},
3910     /* 80 */ {"var80", "undefined"},
3911     /* 81 */ {"var81", "undefined"},
3912     /* 82 */ {"var82", "undefined"},
3913     /* 83 */ {"var83", "undefined"},
3914     /* 84 */ {"var84", "undefined"},
3915     /* 85 */ {"var85", "undefined"},
3916     /* 86 */ {"var86", "undefined"},
3917     /* 87 */ {"var87", "undefined"},
3918     /* 88 */ {"var88", "undefined"},
3919     /* 89 */ {"var89", "undefined"},
3920     /* 90 */ {"var90", "undefined"},
3921     /* 91 */ {"var91", "undefined"},
3922     /* 92 */ {"var92", "undefined"},
3923     /* 93 */ {"var93", "undefined"},
3924     /* 94 */ {"var94", "undefined"},
3925     /* 95 */ {"var95", "undefined"},
3926     /* 96 */ {"var96", "undefined"},
3927     /* 97 */ {"var97", "undefined"},
3928     /* 98 */ {"var98", "undefined"},
3929     /* 99 */ {"var99", "undefined"},
3930     /* 100 */ {"var100", "undefined"},
3931     /* 101 */ {"var101", "undefined"},
3932     /* 102 */ {"var102", "undefined"},
3933     /* 103 */ {"var103", "undefined"},
3934     /* 104 */ {"var104", "undefined"},
3935     /* 105 */ {"var105", "undefined"},
3936     /* 106 */ {"var106", "undefined"},
3937     /* 107 */ {"var107", "undefined"},
3938     /* 108 */ {"var108", "undefined"},
3939     /* 109 */ {"var109", "undefined"},
3940     /* 110 */ {"var110", "undefined"},
3941     /* 111 */ {"var111", "undefined"},
3942     /* 112 */ {"var112", "undefined"},
3943     /* 113 */ {"var113", "undefined"},
3944     /* 114 */ {"var114", "undefined"},
3945     /* 115 */ {"var115", "undefined"},
3946     /* 116 */ {"var116", "undefined"},
3947     /* 117 */ {"var117", "undefined"},
3948     /* 118 */ {"var118", "undefined"},
3949     /* 119 */ {"var119", "undefined"},
3950     /* 120 */ {"var120", "undefined"},
3951     /* 121 */ {"var121", "undefined"},
3952     /* 122 */ {"var122", "undefined"},
3953     /* 123 */ {"var123", "undefined"},
3954     /* 124 */ {"var124", "undefined"},
3955     /* 125 */ {"var125", "undefined"},
3956     /* 126 */ {"var126", "undefined"},
3957     /* 127 */ {"var127", "undefined"},
3958     /* 128 */ {"var128", "undefined"},
3959     /* 129 */ {"NONE", "Ocean potential temperature deg C"},
3960     /* 130 */ {"NONE", "Ocean salinity psu"},
3961     /* 131 */ {"NONE", "Ocean potential density(reference = surface) kg m**-3 -1000"},
3962     /* 132 */ {"var132", "undefined"},
3963     /* 133 */ {"NONE", "Ocean u velocity m s**-1"},
3964     /* 134 */ {"NONE", "Ocean v velocity m s**-1"},
3965     /* 135 */ {"NONE", "Ocean w velocity m s**-1"},
3966     /* 136 */ {"var136", "undefined"},
3967     /* 137 */ {"NONE", "Richardson number -"},
3968     /* 138 */ {"var138", "undefined"},
3969     /* 139 */ {"NONE", "u*v product m s**-2"},
3970     /* 140 */ {"NONE", "u*T product m s**-1 deg C"},
3971     /* 141 */ {"NONE", "v*T product m s**-1 deg C"},
3972     /* 142 */ {"NONE", "u*u product m s**-2"},
3973     /* 143 */ {"NONE", "v*v product m s**-2"},
3974     /* 144 */ {"NONE", "uv - u~v~ (u~ is time-mean of u) m s**-2"},
3975     /* 145 */ {"NONE", "uT - u~T~ m s**-1 deg C"},
3976     /* 146 */ {"NONE", "vT - v~T~ m s**-1 deg C"},
3977     /* 147 */ {"NONE", "uu - u~u~ m s**-2"},
3978     /* 148 */ {"NONE", "vv - v~v~ m s**-2"},
3979     /* 149 */ {"var149", "undefined"},
3980     /* 150 */ {"var150", "undefined"},
3981     /* 151 */ {"var151", "undefined"},
3982     /* 152 */ {"NONE", "Sea level (departure from geoid tides removed)"},
3983     /* 153 */ {"NONE", "Barotropic stream function -"},
3984     /* 154 */ {"NONE", "Mixed layer depth (Tcr=0.5 C for HOPE model) m"},
3985     /* 155 */ {"NONE", "Depth (eg of isothermal surface) m"},
3986     /* 156 */ {"var156", "undefined"},
3987     /* 157 */ {"var157", "undefined"},
3988     /* 158 */ {"var158", "undefined"},
3989     /* 159 */ {"var159", "undefined"},
3990     /* 160 */ {"var160", "undefined"},
3991     /* 161 */ {"var161", "undefined"},
3992     /* 162 */ {"var162", "undefined"},
3993     /* 163 */ {"var163", "undefined"},
3994     /* 164 */ {"var164", "undefined"},
3995     /* 165 */ {"var165", "undefined"},
3996     /* 166 */ {"var166", "undefined"},
3997     /* 167 */ {"var167", "undefined"},
3998     /* 168 */ {"NONE", "U-stress Pa"},
3999     /* 169 */ {"NONE", "V-stress Pa"},
4000     /* 170 */ {"NONE", "Turbulent Kinetic Energy input -"},
4001     /* 171 */ {"NONE", "Net surface heat flux (+ve = down) -"},
4002     /* 172 */ {"NONE", "Surface solar radiation -"},
4003     /* 173 */ {"NONE", "P-E -"},
4004     /* 174 */ {"var174", "undefined"},
4005     /* 175 */ {"var175", "undefined"},
4006     /* 176 */ {"var176", "undefined"},
4007     /* 177 */ {"var177", "undefined"},
4008     /* 178 */ {"var178", "undefined"},
4009     /* 179 */ {"var179", "undefined"},
4010     /* 180 */ {"NONE", "Diagnosed SST eror deg C"},
4011     /* 181 */ {"NONE", "Heat flux correction W m**-2"},
4012     /* 182 */ {"NONE", "Observed SST deg C"},
4013     /* 183 */ {"NONE", "Observed heat flux W m**-2"},
4014     /* 184 */ {"var184", "undefined"},
4015     /* 185 */ {"var185", "undefined"},
4016     /* 186 */ {"var186", "undefined"},
4017     /* 187 */ {"var187", "undefined"},
4018     /* 188 */ {"var188", "undefined"},
4019     /* 189 */ {"var189", "undefined"},
4020     /* 190 */ {"var190", "undefined"},
4021     /* 191 */ {"var191", "undefined"},
4022     /* 192 */ {"var192", "undefined"},
4023     /* 193 */ {"var193", "undefined"},
4024     /* 194 */ {"var194", "undefined"},
4025     /* 195 */ {"var195", "undefined"},
4026     /* 196 */ {"var196", "undefined"},
4027     /* 197 */ {"var197", "undefined"},
4028     /* 198 */ {"var198", "undefined"},
4029     /* 199 */ {"var199", "undefined"},
4030     /* 200 */ {"var200", "undefined"},
4031     /* 201 */ {"var201", "undefined"},
4032     /* 202 */ {"var202", "undefined"},
4033     /* 203 */ {"var203", "undefined"},
4034     /* 204 */ {"var204", "undefined"},
4035     /* 205 */ {"var205", "undefined"},
4036     /* 206 */ {"var206", "undefined"},
4037     /* 207 */ {"var207", "undefined"},
4038     /* 208 */ {"var208", "undefined"},
4039     /* 209 */ {"var209", "undefined"},
4040     /* 210 */ {"var210", "undefined"},
4041     /* 211 */ {"var211", "undefined"},
4042     /* 212 */ {"var212", "undefined"},
4043     /* 213 */ {"var213", "undefined"},
4044     /* 214 */ {"var214", "undefined"},
4045     /* 215 */ {"var215", "undefined"},
4046     /* 216 */ {"var216", "undefined"},
4047     /* 217 */ {"var217", "undefined"},
4048     /* 218 */ {"var218", "undefined"},
4049     /* 219 */ {"var219", "undefined"},
4050     /* 220 */ {"var220", "undefined"},
4051     /* 221 */ {"var221", "undefined"},
4052     /* 222 */ {"var222", "undefined"},
4053     /* 223 */ {"var223", "undefined"},
4054     /* 224 */ {"var224", "undefined"},
4055     /* 225 */ {"var225", "undefined"},
4056     /* 226 */ {"var226", "undefined"},
4057     /* 227 */ {"var227", "undefined"},
4058     /* 228 */ {"var228", "undefined"},
4059     /* 229 */ {"var229", "undefined"},
4060     /* 230 */ {"var230", "undefined"},
4061     /* 231 */ {"var231", "undefined"},
4062     /* 232 */ {"var232", "undefined"},
4063     /* 233 */ {"var233", "undefined"},
4064     /* 234 */ {"var234", "undefined"},
4065     /* 235 */ {"var235", "undefined"},
4066     /* 236 */ {"var236", "undefined"},
4067     /* 237 */ {"var237", "undefined"},
4068     /* 238 */ {"var238", "undefined"},
4069     /* 239 */ {"var239", "undefined"},
4070     /* 240 */ {"var240", "undefined"},
4071     /* 241 */ {"var241", "undefined"},
4072     /* 242 */ {"var242", "undefined"},
4073     /* 243 */ {"var243", "undefined"},
4074     /* 244 */ {"var244", "undefined"},
4075     /* 245 */ {"var245", "undefined"},
4076     /* 246 */ {"var246", "undefined"},
4077     /* 247 */ {"var247", "undefined"},
4078     /* 248 */ {"var248", "undefined"},
4079     /* 249 */ {"var249", "undefined"},
4080     /* 250 */ {"var250", "undefined"},
4081     /* 251 */ {"var251", "undefined"},
4082     /* 252 */ {"var252", "undefined"},
4083     /* 253 */ {"var253", "undefined"},
4084     /* 254 */ {"var254", "undefined"},
4085     /* 255 */ {"var255", "undefined"},
4086 };
4087 
4088 
4089 struct ParmTable parm_table_ecmwf_160[256] = {
4090     /* 0 */ {"var0", "undefined"},
4091     /* 1 */ {"var1", "undefined"},
4092     /* 2 */ {"var2", "undefined"},
4093     /* 3 */ {"var3", "undefined"},
4094     /* 4 */ {"var4", "undefined"},
4095     /* 5 */ {"var5", "undefined"},
4096     /* 6 */ {"var6", "undefined"},
4097     /* 7 */ {"var7", "undefined"},
4098     /* 8 */ {"var8", "undefined"},
4099     /* 9 */ {"var9", "undefined"},
4100     /* 10 */ {"var10", "undefined"},
4101     /* 11 */ {"var11", "undefined"},
4102     /* 12 */ {"var12", "undefined"},
4103     /* 13 */ {"var13", "undefined"},
4104     /* 14 */ {"var14", "undefined"},
4105     /* 15 */ {"var15", "undefined"},
4106     /* 16 */ {"var16", "undefined"},
4107     /* 17 */ {"var17", "undefined"},
4108     /* 18 */ {"var18", "undefined"},
4109     /* 19 */ {"var19", "undefined"},
4110     /* 20 */ {"var20", "undefined"},
4111     /* 21 */ {"var21", "undefined"},
4112     /* 22 */ {"var22", "undefined"},
4113     /* 23 */ {"var23", "undefined"},
4114     /* 24 */ {"var24", "undefined"},
4115     /* 25 */ {"var25", "undefined"},
4116     /* 26 */ {"var26", "undefined"},
4117     /* 27 */ {"var27", "undefined"},
4118     /* 28 */ {"var28", "undefined"},
4119     /* 29 */ {"var29", "undefined"},
4120     /* 30 */ {"var30", "undefined"},
4121     /* 31 */ {"var31", "undefined"},
4122     /* 32 */ {"var32", "undefined"},
4123     /* 33 */ {"var33", "undefined"},
4124     /* 34 */ {"var34", "undefined"},
4125     /* 35 */ {"var35", "undefined"},
4126     /* 36 */ {"var36", "undefined"},
4127     /* 37 */ {"var37", "undefined"},
4128     /* 38 */ {"var38", "undefined"},
4129     /* 39 */ {"var39", "undefined"},
4130     /* 40 */ {"var40", "undefined"},
4131     /* 41 */ {"var41", "undefined"},
4132     /* 42 */ {"var42", "undefined"},
4133     /* 43 */ {"var43", "undefined"},
4134     /* 44 */ {"var44", "undefined"},
4135     /* 45 */ {"var45", "undefined"},
4136     /* 46 */ {"var46", "undefined"},
4137     /* 47 */ {"var47", "undefined"},
4138     /* 48 */ {"var48", "undefined"},
4139     /* 49 */ {"var49", "undefined"},
4140     /* 50 */ {"var50", "undefined"},
4141     /* 51 */ {"var51", "undefined"},
4142     /* 52 */ {"var52", "undefined"},
4143     /* 53 */ {"var53", "undefined"},
4144     /* 54 */ {"var54", "undefined"},
4145     /* 55 */ {"var55", "undefined"},
4146     /* 56 */ {"var56", "undefined"},
4147     /* 57 */ {"var57", "undefined"},
4148     /* 58 */ {"var58", "undefined"},
4149     /* 59 */ {"var59", "undefined"},
4150     /* 60 */ {"var60", "undefined"},
4151     /* 61 */ {"var61", "undefined"},
4152     /* 62 */ {"var62", "undefined"},
4153     /* 63 */ {"var63", "undefined"},
4154     /* 64 */ {"var64", "undefined"},
4155     /* 65 */ {"var65", "undefined"},
4156     /* 66 */ {"var66", "undefined"},
4157     /* 67 */ {"var67", "undefined"},
4158     /* 68 */ {"var68", "undefined"},
4159     /* 69 */ {"var69", "undefined"},
4160     /* 70 */ {"var70", "undefined"},
4161     /* 71 */ {"var71", "undefined"},
4162     /* 72 */ {"var72", "undefined"},
4163     /* 73 */ {"var73", "undefined"},
4164     /* 74 */ {"var74", "undefined"},
4165     /* 75 */ {"var75", "undefined"},
4166     /* 76 */ {"var76", "undefined"},
4167     /* 77 */ {"var77", "undefined"},
4168     /* 78 */ {"var78", "undefined"},
4169     /* 79 */ {"var79", "undefined"},
4170     /* 80 */ {"var80", "undefined"},
4171     /* 81 */ {"var81", "undefined"},
4172     /* 82 */ {"var82", "undefined"},
4173     /* 83 */ {"var83", "undefined"},
4174     /* 84 */ {"var84", "undefined"},
4175     /* 85 */ {"var85", "undefined"},
4176     /* 86 */ {"var86", "undefined"},
4177     /* 87 */ {"var87", "undefined"},
4178     /* 88 */ {"var88", "undefined"},
4179     /* 89 */ {"var89", "undefined"},
4180     /* 90 */ {"var90", "undefined"},
4181     /* 91 */ {"var91", "undefined"},
4182     /* 92 */ {"var92", "undefined"},
4183     /* 93 */ {"var93", "undefined"},
4184     /* 94 */ {"var94", "undefined"},
4185     /* 95 */ {"var95", "undefined"},
4186     /* 96 */ {"var96", "undefined"},
4187     /* 97 */ {"var97", "undefined"},
4188     /* 98 */ {"var98", "undefined"},
4189     /* 99 */ {"var99", "undefined"},
4190     /* 100 */ {"var100", "undefined"},
4191     /* 101 */ {"var101", "undefined"},
4192     /* 102 */ {"var102", "undefined"},
4193     /* 103 */ {"var103", "undefined"},
4194     /* 104 */ {"var104", "undefined"},
4195     /* 105 */ {"var105", "undefined"},
4196     /* 106 */ {"var106", "undefined"},
4197     /* 107 */ {"var107", "undefined"},
4198     /* 108 */ {"var108", "undefined"},
4199     /* 109 */ {"var109", "undefined"},
4200     /* 110 */ {"var110", "undefined"},
4201     /* 111 */ {"var111", "undefined"},
4202     /* 112 */ {"var112", "undefined"},
4203     /* 113 */ {"var113", "undefined"},
4204     /* 114 */ {"var114", "undefined"},
4205     /* 115 */ {"var115", "undefined"},
4206     /* 116 */ {"var116", "undefined"},
4207     /* 117 */ {"var117", "undefined"},
4208     /* 118 */ {"var118", "undefined"},
4209     /* 119 */ {"var119", "undefined"},
4210     /* 120 */ {"var120", "undefined"},
4211     /* 121 */ {"var121", "undefined"},
4212     /* 122 */ {"var122", "undefined"},
4213     /* 123 */ {"var123", "undefined"},
4214     /* 124 */ {"var124", "undefined"},
4215     /* 125 */ {"var125", "undefined"},
4216     /* 126 */ {"var126", "undefined"},
4217     /* 127 */ {"AT", "Atmospheric tide+ -"},
4218     /* 128 */ {"BV", "Budget values+ -"},
4219     /* 129 */ {"Z", "Geopotential / orography m**2 s**-2"},
4220     /* 130 */ {"T", "Temperature K"},
4221     /* 131 */ {"U", "U-velocity m s**-1"},
4222     /* 132 */ {"V", "V-velocity m s**-1"},
4223     /* 133 */ {"Q", "Specific humidity kg kg**-1"},
4224     /* 134 */ {"SP", "Surface pressure Pa"},
4225     /* 135 */ {"W", "Vertical velocity Pa s**-1"},
4226     /* 136 */ {"var136", "undefined"},
4227     /* 137 */ {"PWC", "Precipitable water content kg m**-2"},
4228     /* 138 */ {"VO", "Vorticity (relative) s**-1"},
4229     /* 139 */ {"STL1", "Soil temperature level 1 K"},
4230     /* 140 */ {"SWL1", "Soil wetness level 1 m"},
4231     /* 141 */ {"SD", "Snow depth m (of water)"},
4232     /* 142 */ {"LSP", "Large scale precipitation kg m**-2 s**-1"},
4233     /* 143 */ {"CP", "Convective precipitation kg m**-2 s**-1"},
4234     /* 144 */ {"SF", "Snow fall kg m**-2 s**-1"},
4235     /* 145 */ {"BLD", "Boundary layer dissipation W m**-2"},
4236     /* 146 */ {"SSHF", "Surface sensible heat flux W m**-2"},
4237     /* 147 */ {"SLHF", "Surface latent heat flux W m**-2"},
4238     /* 148 */ {"var148", "undefined"},
4239     /* 149 */ {"var149", "undefined"},
4240     /* 150 */ {"var150", "undefined"},
4241     /* 151 */ {"MSL", "Mean sea level pressure Pa"},
4242     /* 152 */ {"LNSP", "Ln surface pressure -"},
4243     /* 153 */ {"var153", "undefined"},
4244     /* 154 */ {"var154", "undefined"},
4245     /* 155 */ {"D", "Divergence s**-1"},
4246     /* 156 */ {"GH", "Height (geopotential) m"},
4247     /* 157 */ {"R", "Relative humidity (0 - 1)"},
4248     /* 158 */ {"TSP", "Tendency of surface pressure Pa s**-1"},
4249     /* 159 */ {"var159", "undefined"},
4250     /* 160 */ {"var160", "undefined"},
4251     /* 161 */ {"var161", "undefined"},
4252     /* 162 */ {"var162", "undefined"},
4253     /* 163 */ {"var163", "undefined"},
4254     /* 164 */ {"TCC", "Total cloud cover (0 - 1)"},
4255     /* 165 */ {"10U", "10 metre u wind component m s**-1"},
4256     /* 166 */ {"10V", "10 metre v wind component m s**-1"},
4257     /* 167 */ {"2T", "2 metre temperature K"},
4258     /* 168 */ {"2D", "2 metre dewpoint temperature K"},
4259     /* 169 */ {"var169", "undefined"},
4260     /* 170 */ {"STL2", "Soil temperature level 2 K"},
4261     /* 171 */ {"SWL2", "Soil wetness level 2 m"},
4262     /* 172 */ {"LSM", "Land/sea mask (0 - 1)"},
4263     /* 173 */ {"SR", "Surface roughness m"},
4264     /* 174 */ {"AL", "Albedo (0 - 1)"},
4265     /* 175 */ {"var175", "undefined"},
4266     /* 176 */ {"SSR", "Surface solar radiation W m**-2"},
4267     /* 177 */ {"STR", "Surface thermal radiation W m**-2"},
4268     /* 178 */ {"TSR", "Top solar radiation W m**-2"},
4269     /* 179 */ {"TTR", "Top thermal radiation W m**-2"},
4270     /* 180 */ {"EWSS", "East/west surface stress N m**-2 s**-1"},
4271     /* 181 */ {"NSSS", "North/south surface stress N m**-2 s**-1"},
4272     /* 182 */ {"E", "Evaporation kg m**-2 s**-1"},
4273     /* 183 */ {"STL3", "Soil temperature level 3 K"},
4274     /* 184 */ {"SWL3", "Soil wetness level 3 m"},
4275     /* 185 */ {"CCC", "Convective cloud cover (0 - 1)"},
4276     /* 186 */ {"LCC", "Low cloud cover (0 - 1)"},
4277     /* 187 */ {"MCC", "Medium cloud cover (0 - 1)"},
4278     /* 188 */ {"HCC", "High cloud cover (0 - 1)"},
4279     /* 189 */ {"var189", "undefined"},
4280     /* 190 */ {"EWOV", "EW component of sub-grid scale orographic variance m**2"},
4281     /* 191 */ {"NSOV", "NS component of sub-grid scale orographic variance m**2"},
4282     /* 192 */ {"NWOV", "NWSE component sub-grid scale orographic variance m**2"},
4283     /* 193 */ {"NEOV", "NESW component sub-grid scale orographic variance m**2"},
4284     /* 194 */ {"var194", "undefined"},
4285     /* 195 */ {"LGWS", "Latitudinal component of gravity wave stress N m**-2 s"},
4286     /* 196 */ {"MGWS", "Meridional component of gravity wave stress N m**-2 s"},
4287     /* 197 */ {"GWD", "Gravity wave dissipation W m**-2 s"},
4288     /* 198 */ {"SRC", "Skin reservoir content m (of water)"},
4289     /* 199 */ {"VEG", "Percentage of vegetation %"},
4290     /* 200 */ {"VSO", "Variance of sub-grid scale orography m**2"},
4291     /* 201 */ {"MX2T", "Max temp.2m during averaging time K"},
4292     /* 202 */ {"MN2T", "Min temp.2m during averaging time K"},
4293     /* 203 */ {"var203", "undefined"},
4294     /* 204 */ {"PAW", "Precip. analysis weights -"},
4295     /* 205 */ {"RO", "Runoff kg m**-2 s**-1"},
4296     /* 206 */ {"ZZ", "St.Dev. of Geopotential m**2 s**-2"},
4297     /* 207 */ {"TZ", "Covar Temp & Geopotential K m**2 s**-2"},
4298     /* 208 */ {"TT", "St.Dev. of Temperature K"},
4299     /* 209 */ {"QZ", "Covar Sp.Hum. & Geopotential m**2 s**-2"},
4300     /* 210 */ {"QT", "Covar Sp.Hum & Temp. K"},
4301     /* 211 */ {"QQ", "St.Dev. of Specific humidity (0 - 1)"},
4302     /* 212 */ {"UZ", "Covar U-comp. & Geopotential m**3 s**-3"},
4303     /* 213 */ {"UT", "Covar U-comp. & Temp. K m s**-1"},
4304     /* 214 */ {"UQ", "Covar U-comp. & Sp.Hum. m s**-1"},
4305     /* 215 */ {"UU", "St.Dev. of U-velocity m s**-1"},
4306     /* 216 */ {"VZ", "Covar V-comp. & Geopotential m**3 s**-3"},
4307     /* 217 */ {"VT", "Covar V-comp. & Temp. K m s**-1"},
4308     /* 218 */ {"VQ", "Covar V-comp. & Sp.Hum. m s**-1"},
4309     /* 219 */ {"VU", "Covar V-comp. & U-comp m**2 s**-2"},
4310     /* 220 */ {"VV", "St.Dev. of V-comp m s**-1"},
4311     /* 221 */ {"WZ", "Covar W-comp. & Geopotential Pa m**2 s**-3"},
4312     /* 222 */ {"WT", "Covar W-comp. & Temp. K Pa s**-1"},
4313     /* 223 */ {"WQ", "Covar W-comp. & Sp.Hum. Pa s**-1"},
4314     /* 224 */ {"WU", "Covar W-comp. & U-comp. Pa m s**-2"},
4315     /* 225 */ {"WV", "Covar W-comp. & V-comp. Pa m s**-2"},
4316     /* 226 */ {"WW", "St.Dev. of Vertical velocity Pa s**-1"},
4317     /* 227 */ {"var227", "undefined"},
4318     /* 228 */ {"TP", "Total precipitation m"},
4319     /* 229 */ {"IEWS", "Instantaneous X surface stress N m**-2"},
4320     /* 230 */ {"INSS", "Instantaneous Y surface stress N m**-2"},
4321     /* 231 */ {"ISHF", "Instantaneous surface Heat Flux W m**-2"},
4322     /* 232 */ {"IE", "Instantaneous Moisture Flux (evaporation) kg m**-2 s**-1"},
4323     /* 233 */ {"ASQ", "Apparent Surface Humidity kg kg**-1"},
4324     /* 234 */ {"LSRH", "Logarithm of surface roughness length for heat. -"},
4325     /* 235 */ {"SKT", "Skin Temperature K"},
4326     /* 236 */ {"STL4", "Soil temperature level 4 K"},
4327     /* 237 */ {"SWL4", "Soil wetness level 4 m"},
4328     /* 238 */ {"TSN", "Temperature of snow layer K"},
4329     /* 239 */ {"CSF", "Convective snow-fall kg m**-2 s**-1"},
4330     /* 240 */ {"LSF", "Large scale snow-fall kg m**-2 s**-1"},
4331     /* 241 */ {"CLWC", "Cloud liquid water content kg kg**-1"},
4332     /* 242 */ {"CC", "Cloud cover (at given level) (0 - 1)"},
4333     /* 243 */ {"FAL", "Forecast albedo -"},
4334     /* 244 */ {"FSR", "Forecast surface roughness m"},
4335     /* 245 */ {"FLSR", "Forecast logarithm of surface roughness for heat. -"},
4336     /* 246 */ {"10WS", "10m. Windspeed (irresp of dir.) m s**-1"},
4337     /* 247 */ {"MOFL", "Momentum flux (irresp of dir.) N m**-2"},
4338     /* 248 */ {"HSD", "Heaviside (beta) function (0 - 1)"},
4339     /* 249 */ {"var249", "undefined"},
4340     /* 250 */ {"var250", "undefined"},
4341     /* 251 */ {"var251", "undefined"},
4342     /* 252 */ {"var252", "undefined"},
4343     /* 253 */ {"var253", "undefined"},
4344     /* 254 */ {"var254", "undefined"},
4345     /* 255 */ {"var255", "undefined"},
4346 };
4347 
4348 
4349 struct ParmTable parm_table_ecmwf_170[256] = {
4350     /* 0 */ {"var0", "undefined"},
4351     /* 1 */ {"var1", "undefined"},
4352     /* 2 */ {"var2", "undefined"},
4353     /* 3 */ {"var3", "undefined"},
4354     /* 4 */ {"var4", "undefined"},
4355     /* 5 */ {"var5", "undefined"},
4356     /* 6 */ {"var6", "undefined"},
4357     /* 7 */ {"var7", "undefined"},
4358     /* 8 */ {"var8", "undefined"},
4359     /* 9 */ {"var9", "undefined"},
4360     /* 10 */ {"var10", "undefined"},
4361     /* 11 */ {"var11", "undefined"},
4362     /* 12 */ {"var12", "undefined"},
4363     /* 13 */ {"var13", "undefined"},
4364     /* 14 */ {"var14", "undefined"},
4365     /* 15 */ {"var15", "undefined"},
4366     /* 16 */ {"var16", "undefined"},
4367     /* 17 */ {"var17", "undefined"},
4368     /* 18 */ {"var18", "undefined"},
4369     /* 19 */ {"var19", "undefined"},
4370     /* 20 */ {"var20", "undefined"},
4371     /* 21 */ {"var21", "undefined"},
4372     /* 22 */ {"var22", "undefined"},
4373     /* 23 */ {"var23", "undefined"},
4374     /* 24 */ {"var24", "undefined"},
4375     /* 25 */ {"var25", "undefined"},
4376     /* 26 */ {"var26", "undefined"},
4377     /* 27 */ {"var27", "undefined"},
4378     /* 28 */ {"var28", "undefined"},
4379     /* 29 */ {"var29", "undefined"},
4380     /* 30 */ {"var30", "undefined"},
4381     /* 31 */ {"var31", "undefined"},
4382     /* 32 */ {"var32", "undefined"},
4383     /* 33 */ {"var33", "undefined"},
4384     /* 34 */ {"var34", "undefined"},
4385     /* 35 */ {"var35", "undefined"},
4386     /* 36 */ {"var36", "undefined"},
4387     /* 37 */ {"var37", "undefined"},
4388     /* 38 */ {"var38", "undefined"},
4389     /* 39 */ {"var39", "undefined"},
4390     /* 40 */ {"var40", "undefined"},
4391     /* 41 */ {"var41", "undefined"},
4392     /* 42 */ {"var42", "undefined"},
4393     /* 43 */ {"var43", "undefined"},
4394     /* 44 */ {"var44", "undefined"},
4395     /* 45 */ {"var45", "undefined"},
4396     /* 46 */ {"var46", "undefined"},
4397     /* 47 */ {"var47", "undefined"},
4398     /* 48 */ {"var48", "undefined"},
4399     /* 49 */ {"var49", "undefined"},
4400     /* 50 */ {"var50", "undefined"},
4401     /* 51 */ {"var51", "undefined"},
4402     /* 52 */ {"var52", "undefined"},
4403     /* 53 */ {"var53", "undefined"},
4404     /* 54 */ {"var54", "undefined"},
4405     /* 55 */ {"var55", "undefined"},
4406     /* 56 */ {"var56", "undefined"},
4407     /* 57 */ {"var57", "undefined"},
4408     /* 58 */ {"var58", "undefined"},
4409     /* 59 */ {"var59", "undefined"},
4410     /* 60 */ {"var60", "undefined"},
4411     /* 61 */ {"var61", "undefined"},
4412     /* 62 */ {"var62", "undefined"},
4413     /* 63 */ {"var63", "undefined"},
4414     /* 64 */ {"var64", "undefined"},
4415     /* 65 */ {"var65", "undefined"},
4416     /* 66 */ {"var66", "undefined"},
4417     /* 67 */ {"var67", "undefined"},
4418     /* 68 */ {"var68", "undefined"},
4419     /* 69 */ {"var69", "undefined"},
4420     /* 70 */ {"var70", "undefined"},
4421     /* 71 */ {"var71", "undefined"},
4422     /* 72 */ {"var72", "undefined"},
4423     /* 73 */ {"var73", "undefined"},
4424     /* 74 */ {"var74", "undefined"},
4425     /* 75 */ {"var75", "undefined"},
4426     /* 76 */ {"var76", "undefined"},
4427     /* 77 */ {"var77", "undefined"},
4428     /* 78 */ {"var78", "undefined"},
4429     /* 79 */ {"var79", "undefined"},
4430     /* 80 */ {"var80", "undefined"},
4431     /* 81 */ {"var81", "undefined"},
4432     /* 82 */ {"var82", "undefined"},
4433     /* 83 */ {"var83", "undefined"},
4434     /* 84 */ {"var84", "undefined"},
4435     /* 85 */ {"var85", "undefined"},
4436     /* 86 */ {"var86", "undefined"},
4437     /* 87 */ {"var87", "undefined"},
4438     /* 88 */ {"var88", "undefined"},
4439     /* 89 */ {"var89", "undefined"},
4440     /* 90 */ {"var90", "undefined"},
4441     /* 91 */ {"var91", "undefined"},
4442     /* 92 */ {"var92", "undefined"},
4443     /* 93 */ {"var93", "undefined"},
4444     /* 94 */ {"var94", "undefined"},
4445     /* 95 */ {"var95", "undefined"},
4446     /* 96 */ {"var96", "undefined"},
4447     /* 97 */ {"var97", "undefined"},
4448     /* 98 */ {"var98", "undefined"},
4449     /* 99 */ {"var99", "undefined"},
4450     /* 100 */ {"var100", "undefined"},
4451     /* 101 */ {"var101", "undefined"},
4452     /* 102 */ {"var102", "undefined"},
4453     /* 103 */ {"var103", "undefined"},
4454     /* 104 */ {"var104", "undefined"},
4455     /* 105 */ {"var105", "undefined"},
4456     /* 106 */ {"var106", "undefined"},
4457     /* 107 */ {"var107", "undefined"},
4458     /* 108 */ {"var108", "undefined"},
4459     /* 109 */ {"var109", "undefined"},
4460     /* 110 */ {"var110", "undefined"},
4461     /* 111 */ {"var111", "undefined"},
4462     /* 112 */ {"var112", "undefined"},
4463     /* 113 */ {"var113", "undefined"},
4464     /* 114 */ {"var114", "undefined"},
4465     /* 115 */ {"var115", "undefined"},
4466     /* 116 */ {"var116", "undefined"},
4467     /* 117 */ {"var117", "undefined"},
4468     /* 118 */ {"var118", "undefined"},
4469     /* 119 */ {"var119", "undefined"},
4470     /* 120 */ {"var120", "undefined"},
4471     /* 121 */ {"var121", "undefined"},
4472     /* 122 */ {"var122", "undefined"},
4473     /* 123 */ {"var123", "undefined"},
4474     /* 124 */ {"var124", "undefined"},
4475     /* 125 */ {"var125", "undefined"},
4476     /* 126 */ {"var126", "undefined"},
4477     /* 127 */ {"var127", "undefined"},
4478     /* 128 */ {"var128", "undefined"},
4479     /* 129 */ {"Z", "Geopotential m**2 s**-2"},
4480     /* 130 */ {"T", "Temperature K"},
4481     /* 131 */ {"U", "U-velocity m s**-1"},
4482     /* 132 */ {"V", "V-velocity m s**-1"},
4483     /* 133 */ {"var133", "undefined"},
4484     /* 134 */ {"var134", "undefined"},
4485     /* 135 */ {"var135", "undefined"},
4486     /* 136 */ {"var136", "undefined"},
4487     /* 137 */ {"var137", "undefined"},
4488     /* 138 */ {"VO", "Vorticity (relative) s**-1"},
4489     /* 139 */ {"var139", "undefined"},
4490     /* 140 */ {"SWL1", "Soil wetness level 1 m"},
4491     /* 141 */ {"SD", "Snow depth m (of water equivalent)"},
4492     /* 142 */ {"var142", "undefined"},
4493     /* 143 */ {"var143", "undefined"},
4494     /* 144 */ {"var144", "undefined"},
4495     /* 145 */ {"var145", "undefined"},
4496     /* 146 */ {"var146", "undefined"},
4497     /* 147 */ {"var147", "undefined"},
4498     /* 148 */ {"var148", "undefined"},
4499     /* 149 */ {"TSW", "Total soil moisture m"},
4500     /* 150 */ {"var150", "undefined"},
4501     /* 151 */ {"MSL", "Mean sea level pressure Pa"},
4502     /* 152 */ {"var152", "undefined"},
4503     /* 153 */ {"var153", "undefined"},
4504     /* 154 */ {"var154", "undefined"},
4505     /* 155 */ {"D", "Divergence s**-1"},
4506     /* 156 */ {"var156", "undefined"},
4507     /* 157 */ {"var157", "undefined"},
4508     /* 158 */ {"var158", "undefined"},
4509     /* 159 */ {"var159", "undefined"},
4510     /* 160 */ {"var160", "undefined"},
4511     /* 161 */ {"var161", "undefined"},
4512     /* 162 */ {"var162", "undefined"},
4513     /* 163 */ {"var163", "undefined"},
4514     /* 164 */ {"var164", "undefined"},
4515     /* 165 */ {"var165", "undefined"},
4516     /* 166 */ {"var166", "undefined"},
4517     /* 167 */ {"var167", "undefined"},
4518     /* 168 */ {"var168", "undefined"},
4519     /* 169 */ {"var169", "undefined"},
4520     /* 170 */ {"var170", "undefined"},
4521     /* 171 */ {"SWL2", "Soil wetness level 2 m"},
4522     /* 172 */ {"var172", "undefined"},
4523     /* 173 */ {"var173", "undefined"},
4524     /* 174 */ {"var174", "undefined"},
4525     /* 175 */ {"var175", "undefined"},
4526     /* 176 */ {"var176", "undefined"},
4527     /* 177 */ {"var177", "undefined"},
4528     /* 178 */ {"var178", "undefined"},
4529     /* 179 */ {"TTR", "Top thermal radiation W m-2"},
4530     /* 180 */ {"var180", "undefined"},
4531     /* 181 */ {"var181", "undefined"},
4532     /* 182 */ {"var182", "undefined"},
4533     /* 183 */ {"var183", "undefined"},
4534     /* 184 */ {"SWL3", "Soil wetness level 3 m"},
4535     /* 185 */ {"var185", "undefined"},
4536     /* 186 */ {"var186", "undefined"},
4537     /* 187 */ {"var187", "undefined"},
4538     /* 188 */ {"var188", "undefined"},
4539     /* 189 */ {"var189", "undefined"},
4540     /* 190 */ {"var190", "undefined"},
4541     /* 191 */ {"var191", "undefined"},
4542     /* 192 */ {"var192", "undefined"},
4543     /* 193 */ {"var193", "undefined"},
4544     /* 194 */ {"var194", "undefined"},
4545     /* 195 */ {"var195", "undefined"},
4546     /* 196 */ {"var196", "undefined"},
4547     /* 197 */ {"var197", "undefined"},
4548     /* 198 */ {"var198", "undefined"},
4549     /* 199 */ {"var199", "undefined"},
4550     /* 200 */ {"var200", "undefined"},
4551     /* 201 */ {"MX2T", "Max temp at 2m since previous postprocess K"},
4552     /* 202 */ {"MN2T", "Min temp at 2m since previous postprocess K"},
4553     /* 203 */ {"var203", "undefined"},
4554     /* 204 */ {"var204", "undefined"},
4555     /* 205 */ {"var205", "undefined"},
4556     /* 206 */ {"var206", "undefined"},
4557     /* 207 */ {"var207", "undefined"},
4558     /* 208 */ {"var208", "undefined"},
4559     /* 209 */ {"var209", "undefined"},
4560     /* 210 */ {"var210", "undefined"},
4561     /* 211 */ {"var211", "undefined"},
4562     /* 212 */ {"var212", "undefined"},
4563     /* 213 */ {"var213", "undefined"},
4564     /* 214 */ {"var214", "undefined"},
4565     /* 215 */ {"var215", "undefined"},
4566     /* 216 */ {"var216", "undefined"},
4567     /* 217 */ {"var217", "undefined"},
4568     /* 218 */ {"var218", "undefined"},
4569     /* 219 */ {"var219", "undefined"},
4570     /* 220 */ {"var220", "undefined"},
4571     /* 221 */ {"var221", "undefined"},
4572     /* 222 */ {"var222", "undefined"},
4573     /* 223 */ {"var223", "undefined"},
4574     /* 224 */ {"var224", "undefined"},
4575     /* 225 */ {"var225", "undefined"},
4576     /* 226 */ {"var226", "undefined"},
4577     /* 227 */ {"var227", "undefined"},
4578     /* 228 */ {"TP", "Total precipitation m"},
4579     /* 229 */ {"var229", "undefined"},
4580     /* 230 */ {"var230", "undefined"},
4581     /* 231 */ {"var231", "undefined"},
4582     /* 232 */ {"var232", "undefined"},
4583     /* 233 */ {"var233", "undefined"},
4584     /* 234 */ {"var234", "undefined"},
4585     /* 235 */ {"var235", "undefined"},
4586     /* 236 */ {"var236", "undefined"},
4587     /* 237 */ {"var237", "undefined"},
4588     /* 238 */ {"var238", "undefined"},
4589     /* 239 */ {"var239", "undefined"},
4590     /* 240 */ {"var240", "undefined"},
4591     /* 241 */ {"var241", "undefined"},
4592     /* 242 */ {"var242", "undefined"},
4593     /* 243 */ {"var243", "undefined"},
4594     /* 244 */ {"var244", "undefined"},
4595     /* 245 */ {"var245", "undefined"},
4596     /* 246 */ {"var246", "undefined"},
4597     /* 247 */ {"var247", "undefined"},
4598     /* 248 */ {"var248", "undefined"},
4599     /* 249 */ {"var249", "undefined"},
4600     /* 250 */ {"var250", "undefined"},
4601     /* 251 */ {"var251", "undefined"},
4602     /* 252 */ {"var252", "undefined"},
4603     /* 253 */ {"var253", "undefined"},
4604     /* 254 */ {"var254", "undefined"},
4605     /* 255 */ {"var255", "undefined"},
4606 };
4607 
4608 
4609 struct ParmTable parm_table_ecmwf_180[256] = {
4610     /* 0 */ {"var0", "undefined"},
4611     /* 1 */ {"var1", "undefined"},
4612     /* 2 */ {"var2", "undefined"},
4613     /* 3 */ {"var3", "undefined"},
4614     /* 4 */ {"var4", "undefined"},
4615     /* 5 */ {"var5", "undefined"},
4616     /* 6 */ {"var6", "undefined"},
4617     /* 7 */ {"var7", "undefined"},
4618     /* 8 */ {"var8", "undefined"},
4619     /* 9 */ {"var9", "undefined"},
4620     /* 10 */ {"var10", "undefined"},
4621     /* 11 */ {"var11", "undefined"},
4622     /* 12 */ {"var12", "undefined"},
4623     /* 13 */ {"var13", "undefined"},
4624     /* 14 */ {"var14", "undefined"},
4625     /* 15 */ {"var15", "undefined"},
4626     /* 16 */ {"var16", "undefined"},
4627     /* 17 */ {"var17", "undefined"},
4628     /* 18 */ {"var18", "undefined"},
4629     /* 19 */ {"var19", "undefined"},
4630     /* 20 */ {"var20", "undefined"},
4631     /* 21 */ {"var21", "undefined"},
4632     /* 22 */ {"var22", "undefined"},
4633     /* 23 */ {"var23", "undefined"},
4634     /* 24 */ {"var24", "undefined"},
4635     /* 25 */ {"var25", "undefined"},
4636     /* 26 */ {"var26", "undefined"},
4637     /* 27 */ {"var27", "undefined"},
4638     /* 28 */ {"var28", "undefined"},
4639     /* 29 */ {"var29", "undefined"},
4640     /* 30 */ {"var30", "undefined"},
4641     /* 31 */ {"var31", "undefined"},
4642     /* 32 */ {"var32", "undefined"},
4643     /* 33 */ {"var33", "undefined"},
4644     /* 34 */ {"var34", "undefined"},
4645     /* 35 */ {"var35", "undefined"},
4646     /* 36 */ {"var36", "undefined"},
4647     /* 37 */ {"var37", "undefined"},
4648     /* 38 */ {"var38", "undefined"},
4649     /* 39 */ {"var39", "undefined"},
4650     /* 40 */ {"var40", "undefined"},
4651     /* 41 */ {"var41", "undefined"},
4652     /* 42 */ {"var42", "undefined"},
4653     /* 43 */ {"var43", "undefined"},
4654     /* 44 */ {"var44", "undefined"},
4655     /* 45 */ {"var45", "undefined"},
4656     /* 46 */ {"var46", "undefined"},
4657     /* 47 */ {"var47", "undefined"},
4658     /* 48 */ {"var48", "undefined"},
4659     /* 49 */ {"var49", "undefined"},
4660     /* 50 */ {"var50", "undefined"},
4661     /* 51 */ {"var51", "undefined"},
4662     /* 52 */ {"var52", "undefined"},
4663     /* 53 */ {"var53", "undefined"},
4664     /* 54 */ {"var54", "undefined"},
4665     /* 55 */ {"var55", "undefined"},
4666     /* 56 */ {"var56", "undefined"},
4667     /* 57 */ {"var57", "undefined"},
4668     /* 58 */ {"var58", "undefined"},
4669     /* 59 */ {"var59", "undefined"},
4670     /* 60 */ {"var60", "undefined"},
4671     /* 61 */ {"var61", "undefined"},
4672     /* 62 */ {"var62", "undefined"},
4673     /* 63 */ {"var63", "undefined"},
4674     /* 64 */ {"var64", "undefined"},
4675     /* 65 */ {"var65", "undefined"},
4676     /* 66 */ {"var66", "undefined"},
4677     /* 67 */ {"var67", "undefined"},
4678     /* 68 */ {"var68", "undefined"},
4679     /* 69 */ {"var69", "undefined"},
4680     /* 70 */ {"var70", "undefined"},
4681     /* 71 */ {"var71", "undefined"},
4682     /* 72 */ {"var72", "undefined"},
4683     /* 73 */ {"var73", "undefined"},
4684     /* 74 */ {"var74", "undefined"},
4685     /* 75 */ {"var75", "undefined"},
4686     /* 76 */ {"var76", "undefined"},
4687     /* 77 */ {"var77", "undefined"},
4688     /* 78 */ {"var78", "undefined"},
4689     /* 79 */ {"var79", "undefined"},
4690     /* 80 */ {"var80", "undefined"},
4691     /* 81 */ {"var81", "undefined"},
4692     /* 82 */ {"var82", "undefined"},
4693     /* 83 */ {"var83", "undefined"},
4694     /* 84 */ {"var84", "undefined"},
4695     /* 85 */ {"var85", "undefined"},
4696     /* 86 */ {"var86", "undefined"},
4697     /* 87 */ {"var87", "undefined"},
4698     /* 88 */ {"var88", "undefined"},
4699     /* 89 */ {"var89", "undefined"},
4700     /* 90 */ {"var90", "undefined"},
4701     /* 91 */ {"var91", "undefined"},
4702     /* 92 */ {"var92", "undefined"},
4703     /* 93 */ {"var93", "undefined"},
4704     /* 94 */ {"var94", "undefined"},
4705     /* 95 */ {"var95", "undefined"},
4706     /* 96 */ {"var96", "undefined"},
4707     /* 97 */ {"var97", "undefined"},
4708     /* 98 */ {"var98", "undefined"},
4709     /* 99 */ {"var99", "undefined"},
4710     /* 100 */ {"var100", "undefined"},
4711     /* 101 */ {"var101", "undefined"},
4712     /* 102 */ {"var102", "undefined"},
4713     /* 103 */ {"var103", "undefined"},
4714     /* 104 */ {"var104", "undefined"},
4715     /* 105 */ {"var105", "undefined"},
4716     /* 106 */ {"var106", "undefined"},
4717     /* 107 */ {"var107", "undefined"},
4718     /* 108 */ {"var108", "undefined"},
4719     /* 109 */ {"var109", "undefined"},
4720     /* 110 */ {"var110", "undefined"},
4721     /* 111 */ {"var111", "undefined"},
4722     /* 112 */ {"var112", "undefined"},
4723     /* 113 */ {"var113", "undefined"},
4724     /* 114 */ {"var114", "undefined"},
4725     /* 115 */ {"var115", "undefined"},
4726     /* 116 */ {"var116", "undefined"},
4727     /* 117 */ {"var117", "undefined"},
4728     /* 118 */ {"var118", "undefined"},
4729     /* 119 */ {"var119", "undefined"},
4730     /* 120 */ {"var120", "undefined"},
4731     /* 121 */ {"var121", "undefined"},
4732     /* 122 */ {"var122", "undefined"},
4733     /* 123 */ {"var123", "undefined"},
4734     /* 124 */ {"var124", "undefined"},
4735     /* 125 */ {"var125", "undefined"},
4736     /* 126 */ {"var126", "undefined"},
4737     /* 127 */ {"var127", "undefined"},
4738     /* 128 */ {"var128", "undefined"},
4739     /* 129 */ {"Z", "Geopotential (at the surface=orography) m**2 s**-2"},
4740     /* 130 */ {"T", "Temperature K"},
4741     /* 131 */ {"U", "U-velocity m s**-1"},
4742     /* 132 */ {"V", "V-velocity m s**-1"},
4743     /* 133 */ {"Q", "Specific humidity kg kg**-1"},
4744     /* 134 */ {"SP", "Surface pressure Pa"},
4745     /* 135 */ {"var135", "undefined"},
4746     /* 136 */ {"var136", "undefined"},
4747     /* 137 */ {"TCWV", "Total column water vapour kg m**-2"},
4748     /* 138 */ {"VO", "Vorticity (relative) s**-1"},
4749     /* 139 */ {"var139", "undefined"},
4750     /* 140 */ {"var140", "undefined"},
4751     /* 141 */ {"SD", "Snow depth m (of water equivalent)"},
4752     /* 142 */ {"LSP", "Large scale precipitation* m"},
4753     /* 143 */ {"CP", "Convective precipitation* m"},
4754     /* 144 */ {"SF", "Snow fall m(of water equivalent)"},
4755     /* 145 */ {"var145", "undefined"},
4756     /* 146 */ {"SSHF", "Surface sensible heat flux W m**-2 s"},
4757     /* 147 */ {"SLHF", "Surface latent heat flux W m**-2 s"},
4758     /* 148 */ {"var148", "undefined"},
4759     /* 149 */ {"TSW", "Total soil wetness m"},
4760     /* 150 */ {"var150", "undefined"},
4761     /* 151 */ {"MSL", "Mean sea level pressure Pa"},
4762     /* 152 */ {"var152", "undefined"},
4763     /* 153 */ {"var153", "undefined"},
4764     /* 154 */ {"var154", "undefined"},
4765     /* 155 */ {"D", "Divergence s**-1"},
4766     /* 156 */ {"var156", "undefined"},
4767     /* 157 */ {"var157", "undefined"},
4768     /* 158 */ {"var158", "undefined"},
4769     /* 159 */ {"var159", "undefined"},
4770     /* 160 */ {"var160", "undefined"},
4771     /* 161 */ {"var161", "undefined"},
4772     /* 162 */ {"var162", "undefined"},
4773     /* 163 */ {"var163", "undefined"},
4774     /* 164 */ {"TCC", "Total cloud cover (0 - 1)"},
4775     /* 165 */ {"10U", "10 metre u wind component m s**-1"},
4776     /* 166 */ {"10V", "10 metre v wind component m s**-1"},
4777     /* 167 */ {"2T", "2 metre temperature K"},
4778     /* 168 */ {"2D", "2 metre dewpoint temperature K"},
4779     /* 169 */ {"var169", "undefined"},
4780     /* 170 */ {"var170", "undefined"},
4781     /* 171 */ {"var171", "undefined"},
4782     /* 172 */ {"LSM", "Land/sea mask (0"},
4783     /* 173 */ {"var173", "undefined"},
4784     /* 174 */ {"var174", "undefined"},
4785     /* 175 */ {"var175", "undefined"},
4786     /* 176 */ {"SSR", "Surface solar radiation (net) J m**-2 s"},
4787     /* 177 */ {"STR", "Surface thermal radiation (net) J m**-2 s"},
4788     /* 178 */ {"TSR", "Top solar radiation (net) J m**-2 s"},
4789     /* 179 */ {"TTR", "Top thermal radiation (net) J m**-2 s"},
4790     /* 180 */ {"EWSS", "East/West surface stress N m**-2 s"},
4791     /* 181 */ {"NSSS", "North/South surface stress N m**-2 s"},
4792     /* 182 */ {"E", "Evaporation (surface) m (of water)"},
4793     /* 183 */ {"var183", "undefined"},
4794     /* 184 */ {"var184", "undefined"},
4795     /* 185 */ {"var185", "undefined"},
4796     /* 186 */ {"var186", "undefined"},
4797     /* 187 */ {"var187", "undefined"},
4798     /* 188 */ {"var188", "undefined"},
4799     /* 189 */ {"var189", "undefined"},
4800     /* 190 */ {"var190", "undefined"},
4801     /* 191 */ {"var191", "undefined"},
4802     /* 192 */ {"var192", "undefined"},
4803     /* 193 */ {"var193", "undefined"},
4804     /* 194 */ {"var194", "undefined"},
4805     /* 195 */ {"var195", "undefined"},
4806     /* 196 */ {"var196", "undefined"},
4807     /* 197 */ {"var197", "undefined"},
4808     /* 198 */ {"var198", "undefined"},
4809     /* 199 */ {"var199", "undefined"},
4810     /* 200 */ {"var200", "undefined"},
4811     /* 201 */ {"var201", "undefined"},
4812     /* 202 */ {"var202", "undefined"},
4813     /* 203 */ {"var203", "undefined"},
4814     /* 204 */ {"var204", "undefined"},
4815     /* 205 */ {"RO", "Runoff (total) m"},
4816     /* 206 */ {"var206", "undefined"},
4817     /* 207 */ {"var207", "undefined"},
4818     /* 208 */ {"var208", "undefined"},
4819     /* 209 */ {"var209", "undefined"},
4820     /* 210 */ {"var210", "undefined"},
4821     /* 211 */ {"var211", "undefined"},
4822     /* 212 */ {"var212", "undefined"},
4823     /* 213 */ {"var213", "undefined"},
4824     /* 214 */ {"var214", "undefined"},
4825     /* 215 */ {"var215", "undefined"},
4826     /* 216 */ {"var216", "undefined"},
4827     /* 217 */ {"var217", "undefined"},
4828     /* 218 */ {"var218", "undefined"},
4829     /* 219 */ {"var219", "undefined"},
4830     /* 220 */ {"var220", "undefined"},
4831     /* 221 */ {"var221", "undefined"},
4832     /* 222 */ {"var222", "undefined"},
4833     /* 223 */ {"var223", "undefined"},
4834     /* 224 */ {"var224", "undefined"},
4835     /* 225 */ {"var225", "undefined"},
4836     /* 226 */ {"var226", "undefined"},
4837     /* 227 */ {"var227", "undefined"},
4838     /* 228 */ {"var228", "undefined"},
4839     /* 229 */ {"var229", "undefined"},
4840     /* 230 */ {"var230", "undefined"},
4841     /* 231 */ {"var231", "undefined"},
4842     /* 232 */ {"var232", "undefined"},
4843     /* 233 */ {"var233", "undefined"},
4844     /* 234 */ {"var234", "undefined"},
4845     /* 235 */ {"var235", "undefined"},
4846     /* 236 */ {"var236", "undefined"},
4847     /* 237 */ {"var237", "undefined"},
4848     /* 238 */ {"var238", "undefined"},
4849     /* 239 */ {"var239", "undefined"},
4850     /* 240 */ {"var240", "undefined"},
4851     /* 241 */ {"var241", "undefined"},
4852     /* 242 */ {"var242", "undefined"},
4853     /* 243 */ {"var243", "undefined"},
4854     /* 244 */ {"var244", "undefined"},
4855     /* 245 */ {"var245", "undefined"},
4856     /* 246 */ {"var246", "undefined"},
4857     /* 247 */ {"var247", "undefined"},
4858     /* 248 */ {"var248", "undefined"},
4859     /* 249 */ {"var249", "undefined"},
4860     /* 250 */ {"var250", "undefined"},
4861     /* 251 */ {"var251", "undefined"},
4862     /* 252 */ {"var252", "undefined"},
4863     /* 253 */ {"var253", "undefined"},
4864     /* 254 */ {"var254", "undefined"},
4865     /* 255 */ {"var255", "undefined"},
4866 };
4867 
4868 /* parameter table for ocean modeling branch (OMB) of NCEP */
4869 /* center = 7, subcenter = EMC, parameter table = 128 */
4870 
4871 struct ParmTable parm_table_omb[256] = {
4872  {"var0", "Reserved"},
4873  {"var1", "Reserved"},
4874  {"GHz6", "6.6 GHz - K"},
4875  {"GHz10", "10.7 GHz - K"},
4876  {"GHz18", "18.0 GHz - K"},
4877  {"GHz19V", "SSMI 19 GHz, Vertical Polarization - K"},
4878  {"GHz19H", "SSMI 19 GHz, Horizontal Polarization - K"},
4879  {"GHz21", "21.0 GHz - K"},
4880  {"GHz22V", "SSMI 22 GHz, Vertical Polarization - K"},
4881  {"GHz37V", "SSMI 37 GHz, Vertical Polarization - K"},
4882  {"GHz37H", "SSMI 37 GHz, Horizontal Polarization - K"},
4883  {"MSU1", "MSU Ch 1 - 50.30 GHz - K"},
4884  {"MSU2", "MSU Ch 2 - 53.74 GHz - K"},
4885  {"MSU3", "MSU Ch 3 - 54.96 GHz - K"},
4886  {"MSU4", "MSU Ch 4 - 57.95 GHz - K"},
4887  {"GHz85V", "SSMI 85 GHz, Vertical Polarization - K"},
4888  {"GHz85H", "SSMI 85 GHz, Horizontal Polarization - K"},
4889  {"GHz91", "91.65 GHz - K"},
4890  {"GHz150", "150 GHz - K"},
4891  {"GHz183pm7", "183 +- 7 GHz - K"},
4892  {"GHz183pm3", "183 +- 3 GHz - K"},
4893  {"GHz183pm1", "183 +- 1 GHz - K"},
4894  {"SSMT1C1", "SSM/T1 - ch 1 - K"},
4895  {"SSMT1C2", "SSM/T1 - ch 2 - K"},
4896  {"SSMT1C3", "SSM/T1 - ch 3 - K"},
4897  {"SSMT1C4", "SSM/T1 - ch 4 - K"},
4898  {"SSMT1C5", "SSM/T1 - ch 5 - K"},
4899  {"SSMT1C6", "SSM/T1 - ch 6 - K"},
4900  {"SSMT1C7", "SSM/T1 - ch 7 - K"},
4901  {"var29", "Reserved"},
4902  {"var30", "Reserved"},
4903  {"var31", "Reserved"},
4904  {"var32", "Reserved"},
4905  {"var33", "Reserved"},
4906  {"var34", "Reserved"},
4907  {"var35", "Reserved"},
4908  {"var36", "Reserved"},
4909  {"var37", "Reserved"},
4910  {"var38", "Reserved"},
4911  {"var39", "Reserved"},
4912  {"var40", "Reserved"},
4913  {"var41", "Reserved"},
4914  {"var42", "Reserved"},
4915  {"var43", "Reserved"},
4916  {"var44", "Reserved"},
4917  {"var45", "Reserved"},
4918  {"var46", "Reserved"},
4919  {"var47", "Reserved"},
4920  {"var48", "Reserved"},
4921  {"var49", "Reserved"},
4922  {"var50", "Reserved"},
4923  {"var51", "Reserved"},
4924  {"var52", "Reserved"},
4925  {"var53", "Reserved"},
4926  {"var54", "Reserved"},
4927  {"var55", "Reserved"},
4928  {"var56", "Reserved"},
4929  {"var57", "Reserved"},
4930  {"var58", "Reserved"},
4931  {"var59", "Reserved"},
4932  {"MI14.95", "HIRS/2 ch 1 - 14.95 micron - K"},
4933  {"MI14.71", "HIRS/2, GOES 14.71 micron - K"},
4934  {"MI14.49", "HIRS/2 ch 3 - 14.49 micron - K"},
4935  {"MI14.37", "GOES I-M - 14.37 micron - K"},
4936  {"MI14.22", "HIRS/2 ch 4 - 14.22 micron - K"},
4937  {"MI14.06", "GOES I-M - 14.06 micron - K"},
4938  {"MI13.97", "HIRS/2 ch 5 - 13.97 micron - K"},
4939  {"MI13.64", "HIRS/2, GOES 13.64 micron - K"},
4940  {"MI13.37", "GOES I-M - 13.37 micron - K"},
4941  {"MI13.35", "HIRS/2 ch 7 - 13.35 micron - K"},
4942  {"MI12.66", "GOES I-M - 12.66 micron - K"},
4943  {"MI12.02", "GOES I-M - 12.02 micron - K"},
4944  {"MI12.00", "AVHRR ch 5 - 12.0 micron - K"},
4945  {"MI11.11", "HIRS/2 ch 8 - 11.11 micron - K"},
4946  {"MI11.03", "GOES I-M - 11.03 micron - K"},
4947  {"MI10.80", "AVHRR ch 4 - 10.8 micron - K"},
4948  {"MI9.71", "HIRS/2, GOES - 9.71 micron - K"},
4949  {"var77", "Reserved"},
4950  {"var78", "Reserved"},
4951  {"var79", "Reserved"},
4952  {"MI8.16", "HIRS/2 ch 10 - 8.16 micron - K"},
4953  {"MI7.43", "GOES I-M - 7.43 micron - K"},
4954  {"MI7.33", "HIRS/2 ch 11 - 7.33 micron - K"},
4955  {"MI7.02", "GOES I-M - 7.02 micron - K"},
4956  {"MI6.72", "HIRS/2 ch 12 - 6.72 micron - K"},
4957  {"MI6.51", "GOES I-M - 6.51 micron - K"},
4958  {"MI4.57", "HIRS/2, GOES - 4.57 micron - K"},
4959  {"MI4.52", "HIRS/2, GOES - 4.52 micron - K"},
4960  {"MI4.46", "HIRS/2 ch 15 - 4.46 micron - K"},
4961  {"MI4.45", "GOES I-M - 4.45 micron - K"},
4962  {"MI4.40", "HIRS/2 ch 16 - 4.40 micron - K"},
4963  {"MI4.24", "HIRS/2 ch 17 - 4.24 micron - K"},
4964  {"MI4.13", "GOES I-M - 4.13 micron - K"},
4965  {"MI4.00", "HIRS/2 ch 18 - 4.00 micron - K"},
4966  {"MI8.16", "GOES I-M - 3.98 micron - K"},
4967  {"MI8.16", "HIRS/2 Window - 3.76 micron - K"},
4968  {"MI8.16", "AVHRR, GOES - 3.74 micron - K"},
4969  {"var97", "Reserved"},
4970  {"var98", "Reserved"},
4971  {"var99", "Reserved"},
4972  {"MI0.91", "AVHRR ch 2 - 0.91 micron - K"},
4973  {"MI0.696", "GOES I-M - 0.696 micron - K"},
4974  {"MI0.69", "HIRS/2 Vis - 0.69 micron - K"},
4975  {"MI0.63", "AVHRR ch 1 - 0.63 micron - K"},
4976  {"var104", "Reserved"},
4977  {"var105", "Reserved"},
4978  {"var106", "Reserved"},
4979  {"var107", "Reserved"},
4980  {"var108", "Reserved"},
4981  {"var109", "Reserved"},
4982  {"var110", "Reserved"},
4983  {"var111", "Reserved"},
4984  {"var112", "Reserved"},
4985  {"var113", "Reserved"},
4986  {"var114", "Reserved"},
4987  {"var115", "Reserved"},
4988  {"var116", "Reserved"},
4989  {"var117", "Reserved"},
4990  {"var118", "Reserved"},
4991  {"var119", "Reserved"},
4992  {"var120", "Reserved"},
4993  {"var121", "Reserved"},
4994  {"var122", "Reserved"},
4995  {"var123", "Reserved"},
4996  {"var124", "Reserved"},
4997  {"var125", "Reserved"},
4998  {"var126", "Reserved"},
4999  {"var127", "Reserved"},
5000  {"AVDEPTH", "Ocean depth - mean - m"},
5001  {"DEPTH", "Ocean depth - instantaneous - m"},
5002  {"ELEV", "Ocean surface elevation relative to geoid - m"},
5003  {"MXEL24", "Max ocean surface elevation in last 24 hours - m"},
5004  {"MNEL24", "Min ocean surface elevation in last 24 hours - m"},
5005  {"var133", "Reserved"},
5006  {"var134", "Reserved"},
5007  {"O2", "Oxygen -Mol/kg"},
5008  {"PO4", "PO4 - Mol/kg"},
5009  {"NO3", "NO3 - Mol/kg"},
5010  {"SiO4", "SiO4 - Mol/kg"},
5011  {"CO2aq", "CO2 (aq) - Mol/kg"},
5012  {"HCO3", "HCO3 - - Mol/kg"},
5013  {"CO3", "CO3 -- - Mol/kg"},
5014  {"TCO2", "TCO2 - Mol/kg"},
5015  {"TALK", "TALK - Mol/kg"},
5016  {"var144", "Reserved"},
5017  {"var145", "Reserved"},
5018  {"S11", "S11 - 1,1 component of ice stress tensor"},
5019  {"S12", "S12 - 1,2 component of ice stress tensor"},
5020  {"S22", "S22 - 2,2 component of ice stress tensor"},
5021  {"INV1", "T1 - First invariant of stress tensor"},
5022  {"INV2", "T2 - Second invariant of stress tensor"},
5023  {"var151", "Reserved"},
5024  {"var152", "Reserved"},
5025  {"var153", "Reserved"},
5026  {"var154", "Reserved"},
5027  {"WVRGH", "Wave Roughness"},
5028  {"WVSTRS", "Wave Stresses"},
5029  {"WHITE", "Whitecap coverage"},
5030  {"SWDIRWID", "Swell direction width"},
5031  {"SWFREWID", "Swell frequency width"},
5032  {"WVAGE", "Wave age"},
5033  {"PWVAGE", "Physical Wave age"},
5034  {"var162", "Reserved"},
5035  {"var163", "Reserved"},
5036  {"var164", "Reserved"},
5037  {"LTURB", "Master length scale (turbulence) - m"},
5038  {"var166", "Reserved"},
5039  {"var167", "Reserved"},
5040  {"var168", "Reserved"},
5041  {"var169", "Reserved"},
5042  {"AIHFLX", "Net Air-Ice heat flux - W/m^2"},
5043  {"AOHFLX", "Net Air-Ocean heat flux - W/m^2"},
5044  {"IOHFLX", "Net Ice-Ocean heat flux - W/m^2"},
5045  {"IOSFLX", "Net Ice-Ocean salt flux - kg/s"},
5046  {"var174", "Reserved"},
5047  {"OMLT", "Ocean Mixed Layer Temperature - K"},
5048  {"OMLS", "Ocean Mixed Layer Salinity - kg/kg"},
5049  {"var177", "Reserved"},
5050  {"var178", "Reserved"},
5051  {"var179", "Reserved"},
5052  {"var180", "Reserved"},
5053  {"var181", "Reserved"},
5054  {"var182", "Reserved"},
5055  {"var183", "Reserved"},
5056  {"var184", "Reserved"},
5057  {"var185", "Reserved"},
5058  {"var186", "Reserved"},
5059  {"var187", "Reserved"},
5060  {"var188", "Reserved"},
5061  {"var189", "Reserved"},
5062  {"var190", "Reserved"},
5063  {"var191", "Reserved"},
5064  {"var192", "Reserved"},
5065  {"var193", "Reserved"},
5066  {"var194", "Reserved"},
5067  {"var195", "Reserved"},
5068  {"var196", "Reserved"},
5069  {"var197", "Reserved"},
5070  {"var198", "Reserved"},
5071  {"var199", "Reserved"},
5072  {"var200", "Reserved"},
5073  {"var201", "Reserved"},
5074  {"var202", "Reserved"},
5075  {"var203", "Reserved"},
5076  {"var204", "Reserved"},
5077  {"var205", "Reserved"},
5078  {"var206", "Reserved"},
5079  {"var207", "Reserved"},
5080  {"var208", "Reserved"},
5081  {"var209", "Reserved"},
5082  {"var210", "Reserved"},
5083  {"var211", "Reserved"},
5084  {"var212", "Reserved"},
5085  {"var213", "Reserved"},
5086  {"var214", "Reserved"},
5087  {"var215", "Reserved"},
5088  {"var216", "Reserved"},
5089  {"var217", "Reserved"},
5090  {"var218", "Reserved"},
5091  {"var219", "Reserved"},
5092  {"var220", "Reserved"},
5093  {"var221", "Reserved"},
5094  {"var222", "Reserved"},
5095  {"var223", "Reserved"},
5096  {"var224", "Reserved"},
5097  {"var225", "Reserved"},
5098  {"var226", "Reserved"},
5099  {"var227", "Reserved"},
5100  {"var228", "Reserved"},
5101  {"var229", "Reserved"},
5102  {"var230", "Reserved"},
5103  {"var231", "Reserved"},
5104  {"var232", "Reserved"},
5105  {"var233", "Reserved"},
5106  {"var234", "Reserved"},
5107  {"var235", "Reserved"},
5108  {"var236", "Reserved"},
5109  {"var237", "Reserved"},
5110  {"var238", "Reserved"},
5111  {"var239", "Reserved"},
5112  {"var240", "Reserved"},
5113  {"var241", "Reserved"},
5114  {"var242", "Reserved"},
5115  {"var243", "Reserved"},
5116  {"var244", "Reserved"},
5117  {"var245", "Reserved"},
5118  {"var246", "Reserved"},
5119  {"var247", "Reserved"},
5120  {"var248", "Reserved"},
5121  {"var249", "Reserved"},
5122  {"var250", "Reserved"},
5123  {"var251", "Reserved"},
5124  {"var252", "Reserved"},
5125  {"var253", "Reserved"},
5126  {"var254", "Reserved"},
5127  {"var255", "Reserved"}
5128 };
5129 
5130 
5131 /*
5132  * EC_ext	v1.0 wesley ebisuzaki
5133  *
5134  * prints something readable from the EC stream parameter
5135  *
5136  * prefix and suffix are only printed if EC_ext has text
5137  */
5138 
EC_ext(unsigned char * pds,char * prefix,char * suffix)5139 void EC_ext(unsigned char *pds, char *prefix, char *suffix) {
5140 
5141     /* int i;
5142     printf("\n");
5143     for (i=0; i < PDS_LEN(pds); i++) {
5144       printf("%x ",pds[i]);
5145     }
5146     */
5147     if (PDS_Center(pds) == ECMWF && PDS_LEN(pds) >= 45) {
5148 
5149         switch(PDS_EcStream(pds)) {
5150 	    case 1043:
5151 		printf("%smon mean%s", prefix, suffix);
5152 		break;
5153 	    case 1070:
5154 		printf("%smon (co)var%s", prefix, suffix);
5155 		break;
5156 	    case 1071:
5157 		printf("%smon mean from daily%s", prefix, suffix);
5158 		break;
5159 	    default:
5160 		printf("%sECMWF stream?%s", prefix, suffix);
5161 		break;
5162 	}
5163     }
5164 }
5165 
5166 
5167 /*
5168  * get grid size from GDS
5169  *
5170  */
5171 
GDS_grid(unsigned char * gds,int * nx,int * ny,long int * nxny)5172 int GDS_grid(unsigned char *gds, int *nx, int *ny, long int *nxny) {
5173 
5174     int i, ix, iy, pl;
5175     long int isum;
5176 
5177     *nx = ix = GDS_LatLon_nx(gds);
5178     *ny = iy = GDS_LatLon_ny(gds);
5179     *nxny = ix * iy;
5180 
5181     /* thin grid */
5182 
5183     if (GDS_Gaussian(gds) || GDS_LatLon(gds)) {
5184 	if (ix == 65535) {
5185 	    *nx = -1;
5186 	    /* reduced grid */
5187 	    isum = 0;
5188 	    pl = GDS_PL(gds);
5189 	    for (i = 0; i < iy; i++) {
5190 		isum += gds[pl+i*2]*256 + gds[pl+i*2+1];
5191 	    }
5192 	    *nxny = isum;
5193 	}
5194 	return 0;
5195     }
5196     return 0;
5197 }
5198 
5199 #define NCOL 15
GDS_prt_thin_lon(unsigned char * gds)5200 void GDS_prt_thin_lon(unsigned char *gds) {
5201     int iy, i, col, pl;
5202 
5203     iy = GDS_LatLon_ny(gds);
5204     iy = (iy + 1) / 2;
5205     iy = GDS_LatLon_ny(gds);
5206 
5207     if ((pl = GDS_PL(gds)) == -1) {
5208 	fprintf(stderr,"\nprogram error: GDS_prt_thin\n");
5209 	return;
5210     }
5211     for (col = i = 0; i < iy; i++) {
5212 	if (col == 0) printf("   ");
5213 	printf("%5d", (gds[pl+i*2] << 8) + gds[pl+i*2+1]);
5214 	col++;
5215 	if (col == NCOL) {
5216 	    col = 0;
5217 	    printf("\n");
5218 	}
5219     }
5220     if (col != 0) printf("\n");
5221 }
5222 
5223 #define START -1
5224 
5225 static int user_center = 0, user_subcenter = 0, user_ptable = 0;
5226 static enum {filled, not_found, not_checked, no_file, init} status = init;
5227 
5228 struct ParmTable parm_table_user[256];
5229 
5230 /*
5231  * sets up user parameter table
5232  */
5233 
setup_user_table(int center,int subcenter,int ptable)5234 int setup_user_table(int center, int subcenter, int ptable) {
5235 
5236     int i, j, c0, c1, c2;
5237     FILE *input;
5238     char *filename, line[300];
5239 
5240     if (status == init) {
5241 	for (i = 0; i < 256; i++) {
5242 	    parm_table_user[i].name = parm_table_user[i].comment = NULL;
5243 	}
5244 	status = not_checked;
5245     }
5246 
5247     if (status == no_file) return 0;
5248 
5249     if ((user_center == -1 || center == user_center) &&
5250 	    (user_subcenter == -1 || subcenter == user_subcenter) &&
5251 	    (user_ptable == -1 || ptable == user_ptable)) {
5252 
5253 	if (status == filled) return 1;
5254 	if (status == not_found) return 0;
5255     }
5256 
5257     /* open gribtab file */
5258 
5259     filename = getenv("GRIBTAB");
5260     if (filename == NULL) filename = getenv("gribtab");
5261     if (filename == NULL) filename = "gribtab";
5262 
5263     if ((input = fopen(filename,"r")) == NULL) {
5264         status = no_file;
5265         return 0;
5266     }
5267 
5268     user_center = center;
5269     user_subcenter = subcenter;
5270     user_ptable = ptable;
5271 
5272     /* scan for center & subcenter and ptable */
5273     for (;;) {
5274         if (fgets(line, 299, input) == NULL) {
5275 	    status = not_found;
5276             return 0;
5277         }
5278 	if (atoi(line) != START) continue;
5279 	i = sscanf(line,"%d:%d:%d:%d", &j, &center, &subcenter, &ptable);
5280         if (i != 4) {
5281 	    fprintf(stderr,"illegal gribtab center/subcenter/ptable line: %s\n", line);
5282             continue;
5283         }
5284 	if ((center == -1 || center == user_center) &&
5285 	    (subcenter == -1 || subcenter == user_subcenter) &&
5286 	    (ptable == -1 || ptable == user_ptable)) break;
5287     }
5288 
5289     user_center = center;
5290     user_subcenter = subcenter;
5291     user_ptable = ptable;
5292 
5293     /* free any used memory */
5294     if (parm_table_user[i].name != NULL) {
5295         for (i = 0; i < 256; i++) {
5296 	    free(parm_table_user[i].name);
5297             free(parm_table_user[i].comment);
5298         }
5299     }
5300 
5301     /* read definitions */
5302 
5303     for (;;) {
5304         if (fgets(line, 299, input) == NULL) break;
5305 	if ((i = atoi(line)) == START) break;
5306 	line[299] = 0;
5307 
5308 	/* find the colons and end-of-line */
5309 	for (c0 = 0; line[c0] != ':' && line[c0] != 0; c0++) ;
5310         /* skip blank lines */
5311         if (line[c0] == 0) continue;
5312 
5313 	for (c1 = c0 + 1; line[c1] != ':' && line[c1] != 0; c1++) ;
5314 	c2 = strlen(line);
5315         if (line[c2-1] == '\n') line[--c2] = '\0';
5316         if (c2 <= c1) {
5317 	    fprintf(stderr,"illegal gribtab line:%s\n", line);
5318 	    continue;
5319 	}
5320 	line[c0] = 0;
5321 	line[c1] = 0;
5322 
5323 	parm_table_user[i].name = (char *) malloc(c1 - c0);
5324 	parm_table_user[i].comment = (char *) malloc(c2 - c1);
5325 	strcpy(parm_table_user[i].name, line+c0+1);
5326 	strcpy(parm_table_user[i].comment, line+c1+1);
5327     }
5328 
5329     /* now to fill in undefined blanks */
5330     for (i = 0; i < 255; i++) {
5331 	if (parm_table_user[i].name == NULL) {
5332 	    parm_table_user[i].name = (char *) malloc(7);
5333 	    sprintf(parm_table_user[i].name, "var%d", i);
5334 	    parm_table_user[i].comment = (char *) malloc(strlen("undefined")+1);
5335 	    strcpy(parm_table_user[i].comment, "undefined");
5336         }
5337     }
5338     status = filled;
5339     return 1;
5340 }
5341 
5342 /*
5343  * PDS_date.c  v1.2 wesley ebisuzaki
5344  *
5345  * prints a string with a date code
5346  *
5347  * PDS_date(pds,option, v_time)
5348  *   options=0  .. 2 digit year
5349  *   options=1  .. 4 digit year
5350  *
5351  *   v_time=0   .. initial time
5352  *   v_time=1   .. verification time
5353  *
5354  * assumption: P1 and P2 are unsigned integers (not clear from doc)
5355  *
5356  * v1.2 years that are multiple of 400 are leap years, not 500
5357  * v1.2.1  make the change to the source code for v1.2
5358  * v1.2.2  add 3/6/12 hour forecast time units
5359  */
5360 
5361 static int msg_count = 0;
5362 
PDS_date(unsigned char * pds,int option,int v_time)5363 int PDS_date(unsigned char *pds, int option, int v_time) {
5364 
5365     int year, month, day, hour;
5366 
5367     if (v_time == 0) {
5368         year = PDS_Year4(pds);
5369         month = PDS_Month(pds);
5370         day  = PDS_Day(pds);
5371         hour = PDS_Hour(pds);
5372     }
5373     else {
5374         if (verf_time(pds, &year, &month, &day, &hour) != 0) {
5375 	    if (msg_count++ < 5) fprintf(stderr, "PDS_date: problem\n");
5376 	}
5377     }
5378 
5379     switch(option) {
5380 	case 0:
5381 	    printf("%2.2d%2.2d%2.2d%2.2d", year % 100, month, day, hour);
5382 	    break;
5383 	case 1:
5384 	    printf("%4.4d%2.2d%2.2d%2.2d", year, month, day, hour);
5385 	    break;
5386 	default:
5387 	    fprintf(stderr,"missing code\n");
5388 	    exit(8);
5389     }
5390     return 0;
5391 }
5392 
5393 #define  FEB29   (31+29)
5394 static int monthjday[12] = {
5395         0,31,59,90,120,151,181,212,243,273,304,334};
5396 
leap(int year)5397 static int leap(int year) {
5398 	if (year % 4 != 0) return 0;
5399 	if (year % 100 != 0) return 1;
5400 	return (year % 400 == 0);
5401 }
5402 
5403 
add_time(int * year,int * month,int * day,int * hour,int dtime,int unit)5404 int add_time(int *year, int *month, int *day, int *hour, int dtime, int unit) {
5405     int y, m, d, h, jday, i;
5406 
5407     y = *year;
5408     m = *month;
5409     d = *day;
5410     h = *hour;
5411 
5412     if (unit == YEAR) {
5413 	*year = y + dtime;
5414 	return 0;
5415     }
5416     if (unit == DECADE) {
5417 	*year =  y + (10 * dtime);
5418 	return 0;
5419     }
5420     if (unit == CENTURY) {
5421 	*year = y + (100 * dtime);
5422 	return 0;
5423     }
5424     if (unit == NORMAL) {
5425 	*year = y + (30 * dtime);
5426 	return 0;
5427     }
5428     if (unit == MONTH) {
5429 	dtime += (m - 1);
5430 	*year = y + (dtime / 12);
5431 	*month = 1 + (dtime % 12);
5432 	return 0;
5433     }
5434 
5435     if (unit == SECOND) {
5436 	dtime /= 60;
5437 	unit = MINUTE;
5438     }
5439     if (unit == MINUTE) {
5440 	dtime /= 60;
5441 	unit = HOUR;
5442     }
5443 
5444     if (unit == HOURS3) {
5445         dtime *= 3;
5446         unit = HOUR;
5447     }
5448     else if (unit == HOURS6) {
5449         dtime *= 6;
5450         unit = HOUR;
5451     }
5452     else if (unit == HOURS12) {
5453         dtime *= 12;
5454         unit = HOUR;
5455     }
5456 
5457     if (unit == HOUR) {
5458 	dtime += h;
5459 	*hour = dtime % 24;
5460 	dtime = dtime / 24;
5461         unit = DAY;
5462     }
5463 
5464     /* this is the hard part */
5465 
5466     if (unit == DAY) {
5467 	/* set m and day to Jan 0, and readjust dtime */
5468 	jday = d + monthjday[m-1];
5469 	if (leap(y) && m > 2) jday++;
5470         dtime += jday;
5471 
5472         /* 4 year chuncks */
5473 	i = dtime / (4 * 365 + 1);
5474 	if (i) {
5475 	    /* assume century years are leap */
5476 	    y = y + i*4;
5477 	    dtime -= i*(4 * 365 + 1);
5478             /* see if we have gone past feb 28, 1900, 2000, etc */
5479 	    if ((y - 1) / 100 != (*year-1) / 100) {
5480 	        /* crossed the feb 28, xx00 */
5481 	        /* correct for only one century mark */
5482 		if ((y / 100) % 4 != 0) dtime++;
5483 	    }
5484 	}
5485 
5486 	/* one year chunks */
5487 	while (dtime > 365 + leap(y)) {
5488 	    dtime -= (365 + leap(y));
5489 	    y++;
5490 	}
5491 
5492 	/* calculate the month and day */
5493 
5494 	if (leap(y) && dtime == FEB29) {
5495 	    m = 2;
5496 	    d = 29;
5497 	}
5498 	else {
5499 	    if (leap(y) && dtime > FEB29) dtime--;
5500 	    for (i = 11; monthjday[i] >= dtime; --i);
5501 	    m = i + 1;
5502 	    d = dtime - monthjday[i];
5503 	}
5504 	*year = y;
5505 	*month = m;
5506 	*day = d;
5507 	return 0;
5508    }
5509    fprintf(stderr,"add_time: undefined time unit %d\n", unit);
5510    return 1;
5511 }
5512 
5513 
5514 /*
5515  * verf_time:
5516  *
5517  * this routine returns the "verification" time
5518  * should have behavior similar to gribmap
5519  *
5520  */
5521 
verf_time(unsigned char * pds,int * year,int * month,int * day,int * hour)5522 int verf_time(unsigned char *pds, int *year, int *month, int *day, int *hour) {
5523     int tr, dtime, unit;
5524 
5525     *year = PDS_Year4(pds);
5526     *month = PDS_Month(pds);
5527     *day  = PDS_Day(pds);
5528     *hour = PDS_Hour(pds);
5529 
5530     /* find time increment */
5531 
5532     dtime = PDS_P1(pds);
5533     tr = PDS_TimeRange(pds);
5534     unit = PDS_ForecastTimeUnit(pds);
5535 
5536     if (tr == 10) dtime = PDS_P1(pds) * 256 + PDS_P2(pds);
5537     if (tr > 1 && tr < 6 ) dtime = PDS_P2(pds);
5538 
5539     if (dtime == 0) return 0;
5540 
5541     return add_time(year, month, day, hour, dtime, unit);
5542 }
5543 
5544 
5545 /*
5546  * ensemble.c   v0.1 wesley ebisuzaki
5547  *
5548  * prints ensemble meta-data
5549  *
5550  * only for NCEP and ECMWF
5551  *
5552  * output format:
5553  *
5554  *       ECMWF
5555  *  ens=n/N:       n:  0=ctl, +/-ve
5556  *                 N:  total number of members
5557  *
5558  *       NCEP
5559  *  ens=n/type:    n:  0=ctl, +/-ve, CLUST, PROD/
5560  *                 type: Mn, WtdMn, SDev, NSDev
5561  */
5562 
ensemble(unsigned char * pds,int mode)5563 void ensemble(unsigned char *pds, int mode) {
5564 
5565     int pdslen;
5566     unsigned char ctmp;
5567     char char_end;
5568 
5569     pdslen = PDS_LEN(pds);
5570     char_end = mode == 2 ? ' ' : ':';
5571 
5572     if (PDS_Center(pds) == ECMWF) {
5573     }
5574     else if (PDS_Center(pds) == NMC && pdslen >= 45 && pds[40] == 1) {
5575 
5576 	/* control run */
5577 
5578 	if (pds[41] == 1) {
5579 	    if (mode != 2) {
5580 		printf("ens%c0:", pds[42] == 1 ? '+' : '-');
5581 	    }
5582 	    else {
5583 		printf("%s-res_ens_control ", pds[42] == 1 ? "hi" : "low");
5584 	    }
5585 	}
5586 
5587 	/* perturbation run */
5588 
5589 	else if (pds[41] == 2 || pds[41] == 3) {
5590 	    if (mode != 2) {
5591 	        printf("ens%c%d:", pds[41] == 3 ? '+' : '-', pds[42]);
5592 	    }
5593 	    else {
5594 		printf("ens_perturbation=%c%d ",pds[41] == 3 ? '+' : '-',
5595 		    pds[42]);
5596 	    }
5597 	}
5598 
5599 	/* ensemble mean */
5600 
5601 	else if (pds[41] == 5) {
5602 	    /* makes no sense to say "ensemble mean" for prob forecasts */
5603             if (PDS_PARAM(pds) != 191 && PDS_PARAM(pds) != 192) {
5604 	        if (mode != 2 || pdslen < 61) {
5605 		    printf("ens-mean%c", char_end);
5606 		}
5607 		else {
5608 		    printf("ensemble-mean(%d members) ",pds[60]);
5609 		}
5610 	    }
5611 	}
5612 
5613 	/* other case .. debug code */
5614 
5615 	else {
5616 		printf("ens %d/%d/%d/%d:", pds[41],pds[42],pds[43],pds[44]);
5617 	}
5618 
5619 	/* NCEP probability limits */
5620 
5621 	if ((PDS_PARAM(pds) == 191 || PDS_PARAM(pds) == 192) && pdslen >= 47) {
5622 	    ctmp = PDS_PARAM(pds);
5623 	    PDS_PARAM(pds) = pds[45];
5624 	    if (pds[46] == 1 && pdslen >= 51) {
5625 		printf("prob(%s<%f)%c", k5toa(pds), ibm2flt(pds+47),char_end);
5626 	    }
5627 	    else if (pds[46] == 2 && pdslen >= 54) {
5628 		printf("prob(%s>%f)%c", k5toa(pds), ibm2flt(pds+51), char_end);
5629 	    }
5630 	    else if (pds[46] == 3 && pdslen >= 54) {
5631 		printf("prob(%f<%s<%f)%c", ibm2flt(pds+47), k5toa(pds),
5632 			ibm2flt(pds+51), char_end);
5633 	    }
5634             PDS_PARAM(pds) = ctmp;
5635 	}
5636 
5637     }
5638 }
5639 
5640 #ifndef HAVE_FSEEKO
5641 
fseeko(FILE * stream,off_t offset,int whence)5642 int fseeko(FILE *stream, off_t offset, int whence) {
5643   fseek(stream, (long)offset, whence);
5644 }
5645 
ftello(FILE * stream)5646 off_t ftello(FILE *stream) {
5647   return (off_t)ftell(stream);
5648 }
5649 #endif
5650 
5651