stream_cgribex.c 58.8 KB
Newer Older
Uwe Schulzweida's avatar
Uwe Schulzweida committed
1
2
3
4
#if defined (HAVE_CONFIG_H)
#  include "config.h"
#endif

5
#include <limits.h>
Uwe Schulzweida's avatar
Uwe Schulzweida committed
6
7
8
9
#include <stdio.h>

#include "dmemory.h"
#include "cdi.h"
10
#include "cdi_int.h"
Uwe Schulzweida's avatar
Uwe Schulzweida committed
11
12
13
14
#include "file.h"
#include "varscan.h"
#include "datetime.h"
#include "vlist.h"
Uwe Schulzweida's avatar
Uwe Schulzweida committed
15
#include "stream_grb.h"
16
#include "stream_cgribex.h"
Uwe Schulzweida's avatar
Uwe Schulzweida committed
17

Uwe Schulzweida's avatar
Uwe Schulzweida committed
18
19
20
#if  defined  (HAVE_LIBCGRIBEX)
#  include "cgribex.h"
#endif
Uwe Schulzweida's avatar
Uwe Schulzweida committed
21
22

typedef struct {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
23
  int param;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
24
25
26
  int level1;
  int level2;
  int ltype;
27
  int tsteptype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
28
} compvar_t;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
29
30


Uwe Schulzweida's avatar
Uwe Schulzweida committed
31
#if  defined  (HAVE_LIBCGRIBEX)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
32
static
Uwe Schulzweida's avatar
Uwe Schulzweida committed
33
int cgribexGetGridType(int *isec2)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
34
{
35
  int gridtype = GRID_GENERIC;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
36
37
38

  switch (ISEC2_GridType)
    {
39
    case  GRIB1_GTYPE_LATLON:     { if ( ISEC2_Reduced )      break; }
40
41
42
43
44
45
46
47
48
49
    case  GRIB1_GTYPE_LATLON_ROT: { gridtype = GRID_LONLAT;   break; }
    case  GRIB1_GTYPE_LCC:        { gridtype = GRID_LCC;      break; }
    case  GRIB1_GTYPE_GAUSSIAN:   { if ( ISEC2_Reduced )
	                              gridtype = GRID_GAUSSIAN_REDUCED;
                         	    else
				      gridtype = GRID_GAUSSIAN;
          	                    break;
                                  }
    case  GRIB1_GTYPE_SPECTRAL:   { gridtype = GRID_SPECTRAL; break; }
    case  GRIB1_GTYPE_GME:        { gridtype = GRID_GME;      break; }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
50
51
52
53
54
    }

  return (gridtype);
}

Uwe Schulzweida's avatar
Uwe Schulzweida committed
55
static
Uwe Schulzweida's avatar
Uwe Schulzweida committed
56
int cgribexGetIsRotated(int *isec2)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
57
58
59
{
  int isRotated = 0;

60
  if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
61
62
63
    {
      isRotated = 1;
    }
64

Uwe Schulzweida's avatar
Uwe Schulzweida committed
65
66
67
  return (isRotated);
}

Uwe Schulzweida's avatar
Uwe Schulzweida committed
68
static
Uwe Schulzweida's avatar
Uwe Schulzweida committed
69
int cgribexGetZaxisHasBounds(int grb_ltype)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
70
71
72
{
  int lbounds = 0;

73
  switch (grb_ltype)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
74
    {
75
    case GRIB1_LTYPE_SIGMA_LAYER:
Uwe Schulzweida's avatar
Uwe Schulzweida committed
76
77
    case GRIB1_LTYPE_HYBRID_LAYER:
    case GRIB1_LTYPE_LANDDEPTH_LAYER:
Uwe Schulzweida's avatar
Uwe Schulzweida committed
78
79
80
81
82
83
84
85
86
      {
	lbounds = 1;
	break;
      }
    }

  return (lbounds);
}

Uwe Schulzweida's avatar
Uwe Schulzweida committed
87
static
Uwe Schulzweida's avatar
Uwe Schulzweida committed
88
int cgribexGetTimeUnit(int *isec1)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
89
{
90
  int timeunit = TUNIT_HOUR;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
91
92
93
94
  static int lprint = TRUE;

  switch ( ISEC1_TimeUnit )
    {
95
96
97
98
99
100
101
102
    case ISEC1_TABLE4_MINUTE:    timeunit = TUNIT_MINUTE;    break;
    case ISEC1_TABLE4_QUARTER:   timeunit = TUNIT_QUARTER;   break;
    case ISEC1_TABLE4_30MINUTES: timeunit = TUNIT_30MINUTES; break;
    case ISEC1_TABLE4_HOUR:      timeunit = TUNIT_HOUR;      break;
    case ISEC1_TABLE4_3HOURS:    timeunit = TUNIT_3HOURS;    break;
    case ISEC1_TABLE4_6HOURS:    timeunit = TUNIT_6HOURS;    break;
    case ISEC1_TABLE4_12HOURS:   timeunit = TUNIT_12HOURS;   break;
    case ISEC1_TABLE4_DAY:       timeunit = TUNIT_DAY;       break;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
103
104
105
    default:
      if ( lprint )
	{
106
	  Message("GRIB time unit %d unsupported!", ISEC1_TimeUnit);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
107
108
	  lprint = FALSE;
	}
Uwe Schulzweida's avatar
Uwe Schulzweida committed
109
      break;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
110
111
112
113
114
    }

  return (timeunit);
}

115
116
117
118
119
120
121
122
123
124
125
126
127
128
static
int cgribexTimeIsFC(int *isec1)
{
  int isFC = TRUE;

  if ( ISEC1_TimeRange == 10 && ISEC1_TimePeriod1 == 0 && ISEC1_TimePeriod2 == 0 )
    isFC = FALSE;

  return (isFC);
}

static
int cgribexGetTsteptype(int timerange)
{
129
  int tsteptype = TSTEP_INSTANT;
130
131
132
133
134
135
136
137
138
139
140
141
142
143
  static int lprint = TRUE;

  switch ( timerange )
    {
    case  0:  tsteptype = TSTEP_INSTANT;  break;
    case  1:  tsteptype = TSTEP_INSTANT2; break;
    case  2:  tsteptype = TSTEP_RANGE;    break;
    case  3:  tsteptype = TSTEP_AVG;      break;
    case  4:  tsteptype = TSTEP_ACCUM;    break;
    case  5:  tsteptype = TSTEP_DIFF;     break;
    case 10:  tsteptype = TSTEP_INSTANT3; break;
    default:
      if ( lprint )
	{
144
	  Message("Time range indicator %d unsupported, set to 0!", timerange);
145
146
	  lprint = FALSE;
	}
Uwe Schulzweida's avatar
Uwe Schulzweida committed
147
      break;
148
149
150
151
152
    }

  return (tsteptype);
}

Uwe Schulzweida's avatar
Uwe Schulzweida committed
153
static
154
void cgribexGetGrid(stream_t *streamptr, int *isec2, double *fsec2, int *isec4, grid_t *grid, int iret)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
155
{
156
157
  int compyinc = TRUE;
  int gridtype = cgribexGetGridType(isec2);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
158

159
  if ( streamptr->unreduced && gridtype == GRID_GAUSSIAN_REDUCED && iret != -801 )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
160
    {
161
162
163
      int ilat, nlon = 0;
      for ( ilat = 0; ilat < ISEC2_NumLat; ++ilat )
        if ( ISEC2_RowLon(ilat) > nlon ) nlon = ISEC2_RowLon(ilat);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
164
      gridtype = GRID_GAUSSIAN;
165
166
      ISEC2_NumLon = nlon;
      ISEC4_NumValues = nlon*ISEC2_NumLat;
167
      compyinc = FALSE;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
168
169
    }

170
  grid_init(grid);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
171
172
173
174
175
176
  switch (gridtype)
    {
    case GRID_LONLAT:
    case GRID_GAUSSIAN:
      {
	if ( ISEC4_NumValues != ISEC2_NumLon*ISEC2_NumLat )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
177
	  Error("numberOfPoints (%d) and gridSize (%d) differ!", ISEC4_NumValues, ISEC2_NumLon*ISEC2_NumLat);
178
179
180
	grid->size  = ISEC4_NumValues;
	grid->xsize = ISEC2_NumLon;
	grid->ysize = ISEC2_NumLat;
181
        if ( gridtype == GRID_GAUSSIAN ) grid->np = ISEC2_NumPar;
182
183
184
	grid->xinc  = 0;
	grid->yinc  = 0;
	grid->xdef  = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
185
186
	/* if ( ISEC2_FirstLon != 0 || ISEC2_LastLon != 0 ) */
	  {
187
	    if ( grid->xsize > 1 )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
188
	      {
189
                int recompinc = TRUE;
190

191
192
                if ( ISEC2_LastLon < ISEC2_FirstLon && ISEC2_LastLon < 0 ) ISEC2_LastLon += 360000;

Uwe Schulzweida's avatar
Uwe Schulzweida committed
193
		if ( ISEC2_ResFlag && ISEC2_LonIncr > 0 )
194
195
196
197
198
199
200
                  {
                    if ( abs(ISEC2_LastLon - (ISEC2_FirstLon+ISEC2_LonIncr*(grid->xsize-1))) <= 2 )
                      {
                        recompinc = FALSE;
                        grid->xinc = ISEC2_LonIncr * 0.001;
                      }
                  }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
201

202
		/* recompute xinc if necessary */
203
                if ( recompinc ) grid->xinc = (ISEC2_LastLon - ISEC2_FirstLon) * 0.001 / (grid->xsize-1);
204
205
206
207
208
209
210
211
212
213
214
215

		/* correct xinc if necessary */
		if ( ISEC2_FirstLon == 0 && ISEC2_LastLon > 354000 && ISEC2_LastLon < 360000 )
		  {
		    double xinc = 360. / grid->xsize;

		    if ( fabs(grid->xinc-xinc) > 0.0 )
		      {
			grid->xinc = xinc;
			if ( CDI_Debug ) Message("set xinc to %g", grid->xinc);
		      }
		  }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
216
	      }
217
218
	    grid->xfirst = ISEC2_FirstLon * 0.001;
	    grid->xlast  = ISEC2_LastLon  * 0.001;
219
	    grid->xdef   = 2;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
220
	  }
221
	grid->ydef  = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
222
223
	/* if ( ISEC2_FirstLat != 0 || ISEC2_LastLat != 0 ) */
	  {
224
	    if ( grid->ysize > 1 && compyinc )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
225
	      {
226
                int recompinc = TRUE;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
227
		if ( ISEC2_ResFlag && ISEC2_LatIncr > 0 )
228
229
230
231
232
233
234
                  {
                    if ( abs(ISEC2_LastLat - (ISEC2_FirstLat+ISEC2_LatIncr*(grid->ysize-1))) <= 2 )
                      {
                        recompinc = FALSE;
                        grid->yinc = ISEC2_LatIncr * 0.001;
                      }
                  }
235

236
		/* recompute yinc if necessary */
237
                if ( recompinc ) grid->yinc = (ISEC2_LastLat - ISEC2_FirstLat) * 0.001 / (grid->ysize - 1);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
238
	      }
239
240
	    grid->yfirst = ISEC2_FirstLat * 0.001;
	    grid->ylast  = ISEC2_LastLat  * 0.001;
241
	    grid->ydef   = 2;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
242
243
244
245
246
	  }
	break;
      }
    case GRID_GAUSSIAN_REDUCED:
      {
247
        grid->np     = ISEC2_NumPar;
248
249
250
	grid->size   = ISEC4_NumValues;
        grid->rowlon = ISEC2_RowLonPtr;
	grid->ysize  = ISEC2_NumLat;
251
252
253
	grid->xinc   = 0;
	grid->yinc   = 0;
	grid->xdef   = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
254
255
	/* if ( ISEC2_FirstLon != 0 || ISEC2_LastLon != 0 ) */
	  {
256
	    if ( grid->xsize > 1 )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
257
	      {
258
259
                if ( ISEC2_LastLon < ISEC2_FirstLon && ISEC2_LastLon < 0 ) ISEC2_LastLon += 360000;

Uwe Schulzweida's avatar
Uwe Schulzweida committed
260
		if ( ISEC2_ResFlag && ISEC2_LonIncr > 0 )
261
		  grid->xinc = ISEC2_LonIncr * 0.001;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
262
		else
263
		  grid->xinc = (ISEC2_LastLon - ISEC2_FirstLon) * 0.001 / (grid->xsize - 1);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
264
	      }
265
266
	    grid->xfirst = ISEC2_FirstLon * 0.001;
	    grid->xlast  = ISEC2_LastLon  * 0.001;
267
	    grid->xdef   = 2;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
268
	  }
269
	grid->ydef  = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
270
271
	/* if ( ISEC2_FirstLat != 0 || ISEC2_LastLat != 0 ) */
	  {
272
	    if ( grid->ysize > 1 )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
273
274
	      {
		if ( ISEC2_ResFlag && ISEC2_LatIncr > 0 )
275
		  grid->yinc = ISEC2_LatIncr * 0.001;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
276
		else
277
		  grid->yinc = (ISEC2_LastLat - ISEC2_FirstLat) * 0.001 / (grid->ysize - 1);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
278
	      }
279
280
	    grid->yfirst = ISEC2_FirstLat * 0.001;
	    grid->ylast  = ISEC2_LastLat  * 0.001;
281
	    grid->ydef   = 2;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
282
283
284
	  }
	break;
      }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
285
    case GRID_LCC:
286
287
      {
	if ( ISEC4_NumValues != ISEC2_NumLon*ISEC2_NumLat )
288
	  Error("numberOfPoints (%d) and gridSize (%d) differ!",
289
		ISEC4_NumValues, ISEC2_NumLon*ISEC2_NumLat);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
290

291
292
293
	grid->size  = ISEC4_NumValues;
	grid->xsize = ISEC2_NumLon;
	grid->ysize = ISEC2_NumLat;
294

295
296
297
298
299
300
301
302
303
	grid->lcc_xinc      = ISEC2_Lambert_dx;
	grid->lcc_yinc      = ISEC2_Lambert_dy;
	grid->lcc_originLon = ISEC2_FirstLon * 0.001;
	grid->lcc_originLat = ISEC2_FirstLat * 0.001;
	grid->lcc_lonParY   = ISEC2_Lambert_Lov * 0.001;
	grid->lcc_lat1      = ISEC2_Lambert_LatS1 * 0.001;
	grid->lcc_lat2      = ISEC2_Lambert_LatS2 * 0.001;
	grid->lcc_projflag  = ISEC2_Lambert_ProjFlag;
	grid->lcc_scanflag  = ISEC2_ScanFlag;
304

305
	grid->xdef   = 0;
306
	grid->ydef   = 0;
307
308
309

	break;
      }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
310
311
    case GRID_SPECTRAL:
      {
312
313
	grid->size  = ISEC4_NumValues;
	grid->trunc = ISEC2_PentaJ;
314
	if ( ISEC2_RepMode == 2 )
315
	  grid->lcomplex = 1;
316
	else
317
	  grid->lcomplex = 0;
318

Uwe Schulzweida's avatar
Uwe Schulzweida committed
319
320
321
322
	break;
      }
    case GRID_GME:
      {
323
324
325
326
327
	grid->size  = ISEC4_NumValues;
	grid->nd    = ISEC2_GME_ND;
	grid->ni    = ISEC2_GME_NI;
	grid->ni2   = ISEC2_GME_NI2;
	grid->ni3   = ISEC2_GME_NI3;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
328
329
330
331
	break;
      }
    case GRID_GENERIC:
      {
332
333
334
	grid->size  = ISEC4_NumValues;
	grid->xsize = 0;
	grid->ysize = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
335
336
337
338
	break;
      }
    default:
      {
339
	Error("Unsupported grid type: %s", gridNamePtr(gridtype));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
340
341
342
343
	break;
      }
    }

344
  grid->isRotated = FALSE;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
345
  if ( cgribexGetIsRotated(isec2) )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
346
    {
347
      grid->isRotated = TRUE;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
348
349
      grid->ypole     = - ISEC2_LatSP*0.001;
      grid->xpole     =   ISEC2_LonSP*0.001 - 180;
350
      grid->angle     = - FSEC2_RotAngle;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
351
352
    }

353
354
355
356
357
358
  grid->xvals = NULL;
  grid->yvals = NULL;
  grid->type  = gridtype;
}

static
359
void cgribexAddRecord(stream_t * streamptr, int param, int *isec1, int *isec2, double *fsec2, double *fsec3,
360
		      int *isec4, long recsize, off_t position, int datatype, int comptype, int lmv, int iret)
361
{
362
  int varID;
363
  int levelID = 0;
364
  grid_t *grid = (grid_t *)Malloc(sizeof (*grid));
365

366
367
368
369
  int vlistID = streamptr->vlistID;
  int tsID    = streamptr->curTsID;
  int recID   = recordNewEntry(streamptr, tsID);
  record_t *record  = &streamptr->tsteps[tsID].records[recID];
370

371
372
  int tsteptype = cgribexGetTsteptype(ISEC1_TimeRange);
  int numavg    = ISEC1_AvgNum;
373

374
375
  int level1  = ISEC1_Level1;
  int level2  = ISEC1_Level2;
376
377
378

  /* fprintf(stderr, "param %d %d %d %d\n", param, level1, level2, ISEC1_LevelType); */

379
380
381
382
383
384
385
  record->size      = (size_t)recsize;
  record->position  = position;
  record->param     = param;
  record->ilevel    = level1;
  record->ilevel2   = level2;
  record->ltype     = ISEC1_LevelType;
  record->tsteptype = tsteptype;
386

387
  cgribexGetGrid(streamptr, isec2, fsec2, isec4, grid, iret);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
388

389
390
  int gridID = varDefGrid(vlistID, grid, 0);
  Free(grid);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
391

392
  int zaxistype = grib1ltypeToZaxisType(ISEC1_LevelType);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
393

394
  if ( zaxistype == ZAXIS_HYBRID || zaxistype == ZAXIS_HYBRID_HALF )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
395
    {
396
      size_t vctsize = (size_t)ISEC2_NumVCP;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
397
398
399
400
401
      double *vctptr = &fsec2[10];

      varDefVCT(vctsize, vctptr);
    }

402
  int lbounds = cgribexGetZaxisHasBounds(ISEC1_LevelType);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
403

404
405
  if ( datatype > 32 ) datatype = DATATYPE_PACK32;
  if ( datatype <  0 ) datatype = DATATYPE_PACK;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
406

407
  varAddRecord(recID, param, gridID, zaxistype, lbounds, level1, level2, 0, 0,
408
409
	       datatype, &varID, &levelID, tsteptype, numavg, ISEC1_LevelType, -1,
               NULL, NULL, NULL, NULL, NULL, NULL);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
410

Thomas Jahns's avatar
Thomas Jahns committed
411
412
  record->varID   = (short)varID;
  record->levelID = (short)levelID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
413

414
  varDefCompType(varID, comptype);
415

416
417
418
419
420
421
422
  if ( ISEC1_LocalFLag )
    {
      if      ( ISEC1_CenterID == 78  && isec1[36] == 253 ) // DWD local extension
        varDefEnsembleInfo(varID, isec1[54], isec1[53], isec1[52]);
      else if ( ISEC1_CenterID == 252 && isec1[36] ==   1 ) // MPIM local extension
        varDefEnsembleInfo(varID, isec1[38], isec1[39], isec1[37]);
    }
423

424
425
  if ( lmv ) varDefMissval(varID, FSEC3_MissVal);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
426
  if ( varInqInst(varID) == CDI_UNDEFID )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
427
428
429
430
431
    {
      int center, subcenter, instID;
      center    = ISEC1_CenterID;
      subcenter = ISEC1_SubCenterID;
      instID    = institutInq(center, subcenter, NULL, NULL);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
432
      if ( instID == CDI_UNDEFID )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
433
434
435
436
	instID = institutDef(center, subcenter, NULL, NULL);
      varDefInst(varID, instID);
    }

Uwe Schulzweida's avatar
Uwe Schulzweida committed
437
  if ( varInqModel(varID) == CDI_UNDEFID )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
438
439
440
    {
      int modelID;
      modelID = modelInq(varInqInst(varID), ISEC1_ModelID, NULL);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
441
      if ( modelID == CDI_UNDEFID )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
442
443
444
445
	modelID = modelDef(varInqInst(varID), ISEC1_ModelID, NULL);
      varDefModel(varID, modelID);
    }

Uwe Schulzweida's avatar
Uwe Schulzweida committed
446
  if ( varInqTable(varID) == CDI_UNDEFID )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
447
448
    {
      int tableID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
449

Uwe Schulzweida's avatar
Uwe Schulzweida committed
450
      tableID = tableInq(varInqModel(varID), ISEC1_CodeTable, NULL);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
451

Uwe Schulzweida's avatar
Uwe Schulzweida committed
452
      if ( tableID == CDI_UNDEFID )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
453
454
455
456
	tableID = tableDef(varInqModel(varID), ISEC1_CodeTable, NULL);
      varDefTable(varID, tableID);
    }

Uwe Schulzweida's avatar
Uwe Schulzweida committed
457
458
  streamptr->tsteps[tsID].nallrecs++;
  streamptr->nrecs++;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
459
460
}

461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
static
void MCH_get_undef(int *isec1, double *undef_pds, double *undef_eps)
{
  /* 2010-01-13: Oliver Fuhrer */
  if ( ISEC1_CenterID == 215 ) {
    if (isec1[34] != 0 && isec1[34] != 255) {
      if (isec1[34] & 2) {
        if (isec1[34] & 1) {
          *undef_pds = -0.99*pow(10.0,-isec1[35]);
        } else {
          *undef_pds = +0.99*pow(10.0,-isec1[35]);
        }
        *undef_eps = pow(10.0,-isec1[35]-1);
      } else {
        if (isec1[34] & 1) {
          *undef_pds = -0.99*pow(10.0,+isec1[35]);
        } else {
          *undef_pds = +0.99*pow(10.0,+isec1[35]);
        }
        *undef_eps = pow(10.0,isec1[35]-1);
      }
    }
  }
}

static
void cgribexDecodeHeader(int *isec0, int *isec1, int *isec2, double *fsec2,
488
			 int *isec3, double *fsec3, int *isec4, double *fsec4,
489
			 int *gribbuffer, int recsize, int *lmv, int *iret)
490
{
491
  int ipunp = 0, iword = 0;
492

493
494
  memset(isec1, 0, 256*sizeof(int));

495
  gribExDP(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, fsec4,
496
	   ipunp, (int *) gribbuffer, recsize, &iword, "J", iret);
497
498
499
500
501
502
503
504
505
506
507
508

  *lmv = 0;

  if ( ISEC1_CenterID == 215 && (isec1[34] != 0 && isec1[34] != 255) )
    {
      double undef_pds, undef_eps;

      MCH_get_undef(isec1, &undef_pds, &undef_eps);
      FSEC3_MissVal = undef_pds;
      *lmv = 1;
    }
}
509
510

static
511
compvar_t cgribexVarSet(int param, int level1, int level2, int leveltype, int trange)
512
513
{
  compvar_t compVar;
514
  int tsteptype = cgribexGetTsteptype(trange);
515

516
517
518
519
520
  compVar.param     = param;
  compVar.level1    = level1;
  compVar.level2    = level2;
  compVar.ltype     = leveltype;
  compVar.tsteptype = tsteptype;
521
522
523
524

  return (compVar);
}

Thomas Jahns's avatar
Thomas Jahns committed
525
526
static inline int
cgribexVarCompare(compvar_t compVar, record_t record, int flag)
527
{
Thomas Jahns's avatar
Thomas Jahns committed
528
529
530
531
  int tstepDiff = (!((flag == 0) & (((compVar.tsteptype == TSTEP_INSTANT)
                                     & (record.tsteptype == TSTEP_INSTANT3))
                                    |((compVar.tsteptype == TSTEP_INSTANT3)
                                      & (record.tsteptype == TSTEP_INSTANT)))))
Thomas Jahns's avatar
Thomas Jahns committed
532
533
534
535
536
537
    & (compVar.tsteptype != record.tsteptype);
  int rstatus = (compVar.param != record.param)
    |           (compVar.level1 != record.ilevel)
    |           (compVar.level2 != record.ilevel2)
    |           (compVar.ltype != record.ltype)
    |           tstepDiff;
538
539
  return (rstatus);
}
Uwe Schulzweida's avatar
Uwe Schulzweida committed
540
#endif
Uwe Schulzweida's avatar
Uwe Schulzweida committed
541

542
543
544
#define gribWarning(text, nrecs, timestep, paramstr, level1, level2) \
            Warning("Record %2d (id=%s lev1=%d lev2=%d) timestep %d: %s", nrecs, paramstr, level1, level2, timestep, text)

545
#if  defined  (HAVE_LIBCGRIBEX)
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578

static inline void
cgribexScanTsFixNtsteps(stream_t *streamptr, off_t recpos)
{
  if ( streamptr->ntsteps == -1 )
    {
      int tsID = tstepsNewEntry(streamptr);
      if ( tsID != streamptr->rtsteps )
	Error("Internal error. tsID = %d", tsID);

      streamptr->tsteps[tsID-1].next   = TRUE;
      streamptr->tsteps[tsID].position = recpos;
    }
}

static inline void
cgribexScanTsConstAdjust(stream_t *streamptr, taxis_t *taxis)
{
  int vlistID = streamptr->vlistID;
  if ( streamptr->ntsteps == 1 )
    {
      if ( taxis->vdate == 0 && taxis->vtime == 0 )
	{
	  streamptr->ntsteps = 0;
	  for (int varID = 0; varID < streamptr->nvars; varID++ )
	    {
	      vlistDefVarTsteptype(vlistID, varID, TSTEP_CONSTANT);
	    }
	}
    }
}


579
int cgribexScanTimestep1(stream_t * streamptr)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
580
581
{
  double fsec2[512], fsec3[2], *fsec4 = NULL;
582
  int lmv = 0, iret = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
583
  off_t recpos = 0;
584
  void *gribbuffer = NULL;
585
  size_t buffersize = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
586
  int rstatus;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
587
588
  int param = 0;
  int level1 = 0, level2 = 0, vdate = 0, vtime = 0;
589
  DateTime datetime, datetime0 = { LONG_MIN, LONG_MIN };
Uwe Schulzweida's avatar
Uwe Schulzweida committed
590
  size_t readsize;
591
  unsigned nrecords, recID;
592
  int nrecs_scanned = 0;
593
  int datatype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
594
  long recsize = 0;
595
  int warn_time = TRUE;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
596
597
598
599
  int warn_numavg = TRUE;
  int taxisID = -1;
  int rdate = 0, rtime = 0, tunit = 0, fcast = 0;
  int vlistID;
600
  int comptype;
601
  long unzipsize;
602
  char paramstr[32];
603
  int nskip = cdiSkipRecords;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
604
605

  streamptr->curTsID = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
606

607
608
609
610
611
  int *isec0 = streamptr->record->sec0;
  int *isec1 = streamptr->record->sec1;
  int *isec2 = streamptr->record->sec2;
  int *isec3 = streamptr->record->sec3;
  int *isec4 = streamptr->record->sec4;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
612

613
614
  int tsID  = tstepsNewEntry(streamptr);
  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
615
616

  if ( tsID != 0 )
617
    Error("Internal problem! tstepsNewEntry returns %d", tsID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
618

619
  int fileID = streamptr->fileID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
620

621
622
623
  while ( nskip-- > 0 )
    {
      recsize = gribGetSize(fileID);
624
      if ( recsize == 0 )
625
	Error("Skipping of %d records failed!", cdiSkipRecords);
626

627
      recpos  = fileGetPos(fileID);
628
      fileSetPos(fileID, (off_t)recsize, SEEK_CUR);
629
630
    }

631
  unsigned nrecs = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
632
633
634
635
636
637
638
  while ( TRUE )
    {
      recsize = gribGetSize(fileID);
      recpos  = fileGetPos(fileID);

      if ( recsize == 0 )
	{
639
	  if ( nrecs == 0 )
640
	    Error("No GRIB records found!");
641

Uwe Schulzweida's avatar
Uwe Schulzweida committed
642
	  streamptr->ntsteps = 1;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
643
644
	  break;
	}
645
      if ( (size_t)recsize > buffersize )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
646
	{
647
	  buffersize = (size_t)recsize;
648
	  gribbuffer = Realloc(gribbuffer, buffersize);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
649
650
	}

651
      readsize = (size_t)recsize;
652
      rstatus = gribRead(fileID, (unsigned char *)gribbuffer, &readsize);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
653
      if ( rstatus ) break;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
654

655
      comptype = COMPRESS_NONE;
656
      if ( gribGetZip(recsize, (unsigned char *)gribbuffer, &unzipsize) > 0 )
657
	{
658
	  comptype = COMPRESS_SZIP;
659
	  unzipsize += 100; /* need 0 to 1 bytes for rounding of bds */
660
	  if ( buffersize < (size_t)unzipsize )
661
	    {
662
	      buffersize = (size_t)unzipsize;
663
	      gribbuffer = Realloc(gribbuffer, buffersize);
664
665
666
	    }
	}

667
      nrecs_scanned++;
668
      cgribexDecodeHeader(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, fsec4,
669
			  (int *) gribbuffer, (int)recsize, &lmv, &iret);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
670

Uwe Schulzweida's avatar
Uwe Schulzweida committed
671
      param = cdiEncodeParam(ISEC1_Parameter, ISEC1_CodeTable, 255);
672
673
      cdiParamToString(param, paramstr, sizeof(paramstr));

674
675
      if ( ISEC1_LevelType == 100 ) ISEC1_Level1 *= 100;
      if ( ISEC1_LevelType ==  99 ) ISEC1_LevelType = 100;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
676
677
678
      level1   = ISEC1_Level1;
      level2   = ISEC1_Level2;

Uwe Schulzweida's avatar
Uwe Schulzweida committed
679
680
      gribDateTime(isec1, &vdate, &vtime);

681
      if ( ISEC4_NumBits > 0 && ISEC4_NumBits <= 32 )
682
	datatype = ISEC4_NumBits;
683
      else
684
        datatype = DATATYPE_PACK;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
685
686
687
688
689
690
691

      if ( nrecs == 0 )
	{
	  datetime0.date = vdate;
	  datetime0.time = vtime;
	  rdate = gribRefDate(isec1);
	  rtime = gribRefTime(isec1);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
692
	  tunit = cgribexGetTimeUnit(isec1);
693
	  fcast = cgribexTimeIsFC(isec1);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
694
695
696
697
698
	}
      else
	{
	  datetime.date  = vdate;
	  datetime.time  = vtime;
699
	  compvar_t compVar = cgribexVarSet(param, level1, level2, ISEC1_LevelType, ISEC1_TimeRange);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
700
701
	  for ( recID = 0; recID < nrecs; recID++ )
	    {
702
	      if ( cgribexVarCompare(compVar, streamptr->tsteps[0].records[recID], 0) == 0 ) break;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
703
	    }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
704
705
706
707
708

	  if ( cdiInventoryMode == 1 )
	    {
	      if ( recID < nrecs ) break;
	      if ( warn_time )
709
		if ( datetimeCmp(datetime, datetime0) != 0 )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
710
		  {
711
                    gribWarning("Inconsistent verification time!", nrecs_scanned, tsID+1, paramstr, level1, level2);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
712
713
714
715
716
		    warn_time = FALSE;
		  }
	    }
	  else
	    {
717
	      if ( datetimeCmp(datetime, datetime0) != 0 ) break;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
718
719
720

	      if ( recID < nrecs )
		{
721
		  gribWarning("Parameter already exist, skipped!", nrecs_scanned, tsID+1, paramstr, level1, level2);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
722
723
724
		  continue;
		}
	    }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
725
726
727
728
729
730
	}

      if ( ISEC1_AvgNum )
	{
	  if (  taxis->numavg && warn_numavg && (taxis->numavg != ISEC1_AvgNum) )
	    {
731
	      Warning("Changing numavg from %d to %d not supported!", taxis->numavg, ISEC1_AvgNum);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
732
733
734
735
736
737
738
739
740
741
742
	      warn_numavg = FALSE;
	    }
	  else
	    {
	      taxis->numavg = ISEC1_AvgNum;
	    }
	}

      nrecs++;

      if ( CDI_Debug )
743
	Message("Read record %2d (id=%s lev1=%d lev2=%d) %8d %6d", nrecs_scanned, paramstr, level1, level2, vdate, vtime);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
744

745
      cgribexAddRecord(streamptr, param, isec1, isec2, fsec2, fsec3,
746
		       isec4, recsize, recpos, datatype, comptype, lmv, iret);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
747
748
    }

Uwe Schulzweida's avatar
Uwe Schulzweida committed
749
  streamptr->rtsteps = 1;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
750

751
752
  if ( nrecs == 0 ) return (CDI_EUFSTRUCT);

753
  cdi_generate_vars(streamptr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
754
755
756

  if ( fcast )
    {
757
      taxisID = taxisCreate(TAXIS_RELATIVE);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
758
759
760
761
762
763
764
      taxis->type  = TAXIS_RELATIVE;
      taxis->rdate = rdate;
      taxis->rtime = rtime;
      taxis->unit  = tunit;
    }
  else
    {
765
      taxisID = taxisCreate(TAXIS_ABSOLUTE);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
766
      taxis->type  = TAXIS_ABSOLUTE;
767
      taxis->unit  = tunit;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
768
769
    }

770
771
  taxis->vdate = (int)datetime0.date;
  taxis->vtime = (int)datetime0.time;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
772

Uwe Schulzweida's avatar
Uwe Schulzweida committed
773
  vlistID = streamptr->vlistID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
774
775
  vlistDefTaxis(vlistID, taxisID);

776
777
  nrecords = (unsigned)streamptr->tsteps[0].nallrecs;
  if ( nrecords < (unsigned)streamptr->tsteps[0].recordSize )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
778
    {
779
      streamptr->tsteps[0].recordSize = (int)nrecords;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
780
      streamptr->tsteps[0].records =
781
      (record_t *) Realloc(streamptr->tsteps[0].records, nrecords*sizeof(record_t));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
782
783
    }

784
  streamptr->tsteps[0].recIDs = (int *) Malloc(nrecords*sizeof(int));
785
  streamptr->tsteps[0].nrecs = (int)nrecords;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
786
  for ( recID = 0; recID < nrecords; recID++ )
787
    streamptr->tsteps[0].recIDs[recID] = (int)recID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
788

Uwe Schulzweida's avatar
Uwe Schulzweida committed
789
  streamptr->record->buffer     = gribbuffer;
790
  streamptr->record->buffersize = (size_t)buffersize;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
791

792
793
  cgribexScanTsFixNtsteps(streamptr, recpos);
  cgribexScanTsConstAdjust(streamptr, taxis);
794
795

  return (0);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
796
797
}

Uwe Schulzweida's avatar
Uwe Schulzweida committed
798

799
int cgribexScanTimestep2(stream_t * streamptr)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
800
{
Uwe Schulzweida's avatar
Uwe Schulzweida committed
801
  int rstatus = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
802
  double fsec2[512], fsec3[2], *fsec4 = NULL;
803
  int lmv = 0, iret = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
804
  off_t recpos = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
805
806
  int param = 0;
  int level1 = 0, level2 = 0, vdate = 0, vtime = 0;
807
  DateTime datetime, datetime0 = { LONG_MIN, LONG_MIN };
Uwe Schulzweida's avatar
Uwe Schulzweida committed
808
809
  int varID, gridID;
  size_t readsize;
810
  int nrecs, recID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
811
812
  long recsize = 0;
  int warn_numavg = TRUE;
813
  int tsteptype;
814
  long unzipsize;
815
  char paramstr[32];
Uwe Schulzweida's avatar
Uwe Schulzweida committed
816

Uwe Schulzweida's avatar
Uwe Schulzweida committed
817
818
  streamptr->curTsID = 1;

819
820
821
822
823
  int *isec0 = streamptr->record->sec0;
  int *isec1 = streamptr->record->sec1;
  int *isec2 = streamptr->record->sec2;
  int *isec3 = streamptr->record->sec3;
  int *isec4 = streamptr->record->sec4;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
824

825
826
827
  int fileID  = streamptr->fileID;
  int vlistID = streamptr->vlistID;
  int taxisID = vlistInqTaxis(vlistID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
828

829
830
  void *gribbuffer = streamptr->record->buffer;
  size_t buffersize = streamptr->record->buffersize;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
831

832
  int tsID = streamptr->rtsteps;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
833
  if ( tsID != 1 )
Thomas Jahns's avatar
Thomas Jahns committed
834
    Error("Internal problem! unexpected timestep %d", tsID+1);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
835

836
  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
837

Uwe Schulzweida's avatar
Uwe Schulzweida committed
838
  fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
839

840
  cdi_create_records(streamptr, tsID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
841

842
  int nrecords = streamptr->tsteps[tsID].nallrecs;
843
  if ( nrecords ) streamptr->tsteps[1].recIDs = (int *) Malloc((size_t)nrecords * sizeof(int));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
844
  streamptr->tsteps[1].nrecs = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
845
  for ( recID = 0; recID < nrecords; recID++ )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
846
    streamptr->tsteps[1].recIDs[recID] = -1;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
847

Uwe Schulzweida's avatar
Uwe Schulzweida committed
848
849
  for ( recID = 0; recID < nrecords; recID++ )
    {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
850
      varID = streamptr->tsteps[0].records[recID].varID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
851
852
      streamptr->tsteps[tsID].records[recID].position =	streamptr->tsteps[0].records[recID].position;
      streamptr->tsteps[tsID].records[recID].size     =	streamptr->tsteps[0].records[recID].size;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
853
854
    }

855
856
  int nrecs_scanned = nrecords;
  int rindex = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
857
  while ( TRUE )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
858
    {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
859
860
      if ( rindex > nrecords ) break;

Uwe Schulzweida's avatar
Uwe Schulzweida committed
861
862
863
864
      recsize = gribGetSize(fileID);
      recpos  = fileGetPos(fileID);
      if ( recsize == 0 )
	{
Uwe Schulzweida's avatar
Uwe Schulzweida committed
865
	  streamptr->ntsteps = 2;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
866
867
	  break;
	}
868
      if ( (size_t)recsize > buffersize )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
869
	{
870
	  buffersize = (size_t)recsize;
871
	  gribbuffer = Realloc(gribbuffer, buffersize);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
872
873
	}

874
      readsize = (size_t)recsize;
875
      rstatus = gribRead(fileID, (unsigned char *)gribbuffer, &readsize);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
876
      if ( rstatus ) break;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
877

878
      if ( gribGetZip(recsize, (unsigned char *)gribbuffer, &unzipsize) > 0 )
879
880
	{
	  unzipsize += 100; /* need 0 to 1 bytes for rounding of bds */
881
	  if ( buffersize < (size_t)unzipsize )
882
	    {
883
	      buffersize = (size_t)unzipsize;
884
	      gribbuffer = Realloc(gribbuffer, buffersize);
885
886
887
	    }
	}

888
      cgribexDecodeHeader(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, fsec4,
889
			  (int *) gribbuffer, (int)recsize, &lmv, &iret);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
890

891
892
      nrecs_scanned++;

Uwe Schulzweida's avatar
Uwe Schulzweida committed
893
      param = cdiEncodeParam(ISEC1_Parameter, ISEC1_CodeTable, 255);
894
895
      cdiParamToString(param, paramstr, sizeof(paramstr));

896
897
      if ( ISEC1_LevelType == 100 ) ISEC1_Level1 *= 100;
      if ( ISEC1_LevelType ==  99 ) ISEC1_LevelType = 100;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
      level1    = ISEC1_Level1;
      level2    = ISEC1_Level2;

      gribDateTime(isec1, &vdate, &vtime);

      if ( rindex == 0 )
	{
	  if ( taxisInqType(taxisID) == TAXIS_RELATIVE )
	    {
	      taxis->type  = TAXIS_RELATIVE;
	      taxis->rdate = gribRefDate(isec1);
	      taxis->rtime = gribRefTime(isec1);
	    }
	  else
	    {
	      taxis->type  = TAXIS_ABSOLUTE;
	    }
915
	  taxis->unit  = cgribexGetTimeUnit(isec1);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
916
917
	  taxis->vdate = vdate;
	  taxis->vtime = vtime;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
918
919
920

	  datetime0.date = vdate;
	  datetime0.time = vtime;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
921
922
	}

923
924
      tsteptype = cgribexGetTsteptype(ISEC1_TimeRange);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
925
926
927
      if ( ISEC1_AvgNum )
	{
	  if (  taxis->numavg && warn_numavg &&
928
        	(taxis->numavg != ISEC1_AvgNum) )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
929
930
	    {
	  /*
931
	      Warning("Changing numavg from %d to %d not supported!", taxis->numavg, ISEC1_AvgNum);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
932
933
934
935
936
937
938
939
940
	  */
	      warn_numavg = FALSE;
	    }
	  else
	    {
	      taxis->numavg = ISEC1_AvgNum;
	    }
	}

Uwe Schulzweida's avatar
Uwe Schulzweida committed
941
942
      datetime.date  = vdate;
      datetime.time  = vtime;
943

944
      compvar_t compVar = cgribexVarSet(param, level1, level2, ISEC1_LevelType, ISEC1_TimeRange);
945

Uwe Schulzweida's avatar
Uwe Schulzweida committed
946