stream_grb.c 11.9 KB
Newer Older
1
#ifdef HAVE_CONFIG_H
2
#include "config.h"
Uwe Schulzweida's avatar
Uwe Schulzweida committed
3
4
5
#endif

#include "cdi.h"
6
#include "cdi_int.h"
Uwe Schulzweida's avatar
Uwe Schulzweida committed
7
#include "stream_cgribex.h"
8
#include "stream_grb.h"
Uwe Schulzweida's avatar
Uwe Schulzweida committed
9
10
11
#include "stream_gribapi.h"
#include "file.h"
#include "cgribex.h"  /* gribZip gribGetZip gribGinfo */
12
13
#include "gribapi.h"

14

15
16
17
18
19
20
int grib1ltypeToZaxisType(int grib_ltype)
{
  int zaxistype = ZAXIS_GENERIC;

  switch ( grib_ltype )
    {
21
22
23
24
25
26
27
28
    case GRIB1_LTYPE_SURFACE:            zaxistype = ZAXIS_SURFACE;                break;
    case GRIB1_LTYPE_CLOUD_BASE:         zaxistype = ZAXIS_CLOUD_BASE;             break;
    case GRIB1_LTYPE_CLOUD_TOP:          zaxistype = ZAXIS_CLOUD_TOP;              break;
    case GRIB1_LTYPE_ISOTHERM0:          zaxistype = ZAXIS_ISOTHERM_ZERO;          break;
    case GRIB1_LTYPE_TOA:                zaxistype = ZAXIS_TOA;                    break;
    case GRIB1_LTYPE_SEA_BOTTOM:         zaxistype = ZAXIS_SEA_BOTTOM;             break;
    case GRIB1_LTYPE_ATMOSPHERE:         zaxistype = ZAXIS_ATMOSPHERE;             break;
    case GRIB1_LTYPE_MEANSEA:            zaxistype = ZAXIS_MEANSEA;                break;
29
    case GRIB1_LTYPE_99:
30
31
32
    case GRIB1_LTYPE_ISOBARIC:           zaxistype = ZAXIS_PRESSURE;               break;
    case GRIB1_LTYPE_HEIGHT:             zaxistype = ZAXIS_HEIGHT;                 break;
    case GRIB1_LTYPE_ALTITUDE:           zaxistype = ZAXIS_ALTITUDE;	           break;
Deike Kleberg's avatar
Deike Kleberg committed
33
    case GRIB1_LTYPE_SIGMA:
34
    case GRIB1_LTYPE_SIGMA_LAYER:        zaxistype = ZAXIS_SIGMA;	           break;
35
    case GRIB1_LTYPE_HYBRID:
36
    case GRIB1_LTYPE_HYBRID_LAYER:       zaxistype = ZAXIS_HYBRID;	           break;
37
    case GRIB1_LTYPE_LANDDEPTH:
38
39
40
41
42
43
44
45
    case GRIB1_LTYPE_LANDDEPTH_LAYER:    zaxistype = ZAXIS_DEPTH_BELOW_LAND;       break;
    case GRIB1_LTYPE_ISENTROPIC:         zaxistype = ZAXIS_ISENTROPIC;             break;
    case GRIB1_LTYPE_SEADEPTH:           zaxistype = ZAXIS_DEPTH_BELOW_SEA;        break;
    case GRIB1_LTYPE_LAKE_BOTTOM:        zaxistype = ZAXIS_LAKE_BOTTOM;            break;
    case GRIB1_LTYPE_SEDIMENT_BOTTOM:    zaxistype = ZAXIS_SEDIMENT_BOTTOM;        break;
    case GRIB1_LTYPE_SEDIMENT_BOTTOM_TA: zaxistype = ZAXIS_SEDIMENT_BOTTOM_TA;     break;
    case GRIB1_LTYPE_SEDIMENT_BOTTOM_TW: zaxistype = ZAXIS_SEDIMENT_BOTTOM_TW;     break;
    case GRIB1_LTYPE_MIX_LAYER:          zaxistype = ZAXIS_MIX_LAYER;              break;
46
47
    }

48
  return zaxistype;
49
50
51
52
53
54
55
56
57
}


int grib2ltypeToZaxisType(int grib_ltype)
{
  int zaxistype = ZAXIS_GENERIC;

  switch ( grib_ltype )
    {
58
59
60
61
62
63
64
65
66
67
68
69
    case GRIB2_LTYPE_SURFACE:            zaxistype = ZAXIS_SURFACE;                break;
    case GRIB2_LTYPE_CLOUD_BASE:         zaxistype = ZAXIS_CLOUD_BASE;             break;
    case GRIB2_LTYPE_CLOUD_TOP:          zaxistype = ZAXIS_CLOUD_TOP;              break;
    case GRIB2_LTYPE_ISOTHERM0:          zaxistype = ZAXIS_ISOTHERM_ZERO;          break;
    case GRIB2_LTYPE_TOA:                zaxistype = ZAXIS_TOA;                    break;
    case GRIB2_LTYPE_SEA_BOTTOM:         zaxistype = ZAXIS_SEA_BOTTOM;             break;
    case GRIB2_LTYPE_ATMOSPHERE:         zaxistype = ZAXIS_ATMOSPHERE;             break;
    case GRIB2_LTYPE_MEANSEA:            zaxistype = ZAXIS_MEANSEA;                break;
    case GRIB2_LTYPE_ISOBARIC:           zaxistype = ZAXIS_PRESSURE;               break;
    case GRIB2_LTYPE_HEIGHT:             zaxistype = ZAXIS_HEIGHT;                 break;
    case GRIB2_LTYPE_ALTITUDE:           zaxistype = ZAXIS_ALTITUDE;               break;
    case GRIB2_LTYPE_SIGMA:              zaxistype = ZAXIS_SIGMA;                  break;
70
    case GRIB2_LTYPE_HYBRID:
71
 /* case GRIB2_LTYPE_HYBRID_LAYER: */    zaxistype = ZAXIS_HYBRID;                 break;
72
    case GRIB2_LTYPE_LANDDEPTH:
73
74
75
76
77
78
79
80
81
82
 /* case GRIB2_LTYPE_LANDDEPTH_LAYER: */ zaxistype = ZAXIS_DEPTH_BELOW_LAND;       break;
    case GRIB2_LTYPE_ISENTROPIC:         zaxistype = ZAXIS_ISENTROPIC;             break;
    case GRIB2_LTYPE_SNOW:               zaxistype = ZAXIS_SNOW;                   break;
    case GRIB2_LTYPE_SEADEPTH:           zaxistype = ZAXIS_DEPTH_BELOW_SEA;        break;
    case GRIB2_LTYPE_LAKE_BOTTOM:        zaxistype = ZAXIS_LAKE_BOTTOM;            break;
    case GRIB2_LTYPE_SEDIMENT_BOTTOM:    zaxistype = ZAXIS_SEDIMENT_BOTTOM;        break;
    case GRIB2_LTYPE_SEDIMENT_BOTTOM_TA: zaxistype = ZAXIS_SEDIMENT_BOTTOM_TA;     break;
    case GRIB2_LTYPE_SEDIMENT_BOTTOM_TW: zaxistype = ZAXIS_SEDIMENT_BOTTOM_TW;     break;
    case GRIB2_LTYPE_MIX_LAYER:          zaxistype = ZAXIS_MIX_LAYER;              break;
    case GRIB2_LTYPE_REFERENCE:          zaxistype = ZAXIS_REFERENCE;              break;
83
84
    }

85
  return zaxistype;
86
}
Uwe Schulzweida's avatar
Uwe Schulzweida committed
87

Uwe Schulzweida's avatar
Uwe Schulzweida committed
88

Uwe Schulzweida's avatar
Uwe Schulzweida committed
89
90
91
92
93
94
int zaxisTypeToGrib1ltype(int zaxistype)
{
  int grib_ltype = -1;

  switch (zaxistype)
    {
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
    case ZAXIS_SURFACE:               grib_ltype = GRIB1_LTYPE_SURFACE;            break;
    case ZAXIS_MEANSEA:               grib_ltype = GRIB1_LTYPE_MEANSEA;            break;
    case ZAXIS_HEIGHT:                grib_ltype = GRIB1_LTYPE_HEIGHT;             break;
    case ZAXIS_ALTITUDE:              grib_ltype = GRIB1_LTYPE_ALTITUDE;           break;
    case ZAXIS_SIGMA:                 grib_ltype = GRIB1_LTYPE_SIGMA;              break;
    case ZAXIS_DEPTH_BELOW_SEA:       grib_ltype = GRIB1_LTYPE_SEADEPTH;           break;
    case ZAXIS_ISENTROPIC:            grib_ltype = GRIB1_LTYPE_ISENTROPIC;         break;
    case ZAXIS_CLOUD_BASE:            grib_ltype = GRIB1_LTYPE_CLOUD_BASE;         break;
    case ZAXIS_CLOUD_TOP:             grib_ltype = GRIB1_LTYPE_CLOUD_TOP;          break;
    case ZAXIS_ISOTHERM_ZERO:         grib_ltype = GRIB1_LTYPE_ISOTHERM0;          break;
    case ZAXIS_TOA:                   grib_ltype = GRIB1_LTYPE_TOA;                break;
    case ZAXIS_SEA_BOTTOM:            grib_ltype = GRIB1_LTYPE_SEA_BOTTOM;         break;
    case ZAXIS_LAKE_BOTTOM:           grib_ltype = GRIB1_LTYPE_LAKE_BOTTOM;        break;
    case ZAXIS_SEDIMENT_BOTTOM:       grib_ltype = GRIB1_LTYPE_SEDIMENT_BOTTOM;    break;
    case ZAXIS_SEDIMENT_BOTTOM_TA:    grib_ltype = GRIB1_LTYPE_SEDIMENT_BOTTOM_TA; break;
    case ZAXIS_SEDIMENT_BOTTOM_TW:    grib_ltype = GRIB1_LTYPE_SEDIMENT_BOTTOM_TW; break;
    case ZAXIS_MIX_LAYER:             grib_ltype = GRIB1_LTYPE_MIX_LAYER;          break;
    case ZAXIS_ATMOSPHERE:            grib_ltype = GRIB1_LTYPE_ATMOSPHERE;         break;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
113
114
    }

115
  return grib_ltype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
116
117
118
119
120
121
122
123
124
}


int zaxisTypeToGrib2ltype(int zaxistype)
{
  int grib_ltype = -1;

  switch (zaxistype)
    {
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
    case ZAXIS_SURFACE:               grib_ltype = GRIB2_LTYPE_SURFACE;            break;
    case ZAXIS_MEANSEA:               grib_ltype = GRIB2_LTYPE_MEANSEA;            break;
    case ZAXIS_HEIGHT:                grib_ltype = GRIB2_LTYPE_HEIGHT;             break;
    case ZAXIS_ALTITUDE:              grib_ltype = GRIB2_LTYPE_ALTITUDE;           break;
    case ZAXIS_SIGMA:                 grib_ltype = GRIB2_LTYPE_SIGMA;              break;
    case ZAXIS_DEPTH_BELOW_SEA:       grib_ltype = GRIB2_LTYPE_SEADEPTH;           break;
    case ZAXIS_ISENTROPIC:            grib_ltype = GRIB2_LTYPE_ISENTROPIC;         break;
    case ZAXIS_CLOUD_BASE:            grib_ltype = GRIB2_LTYPE_CLOUD_BASE;         break;
    case ZAXIS_CLOUD_TOP:             grib_ltype = GRIB2_LTYPE_CLOUD_TOP;          break;
    case ZAXIS_ISOTHERM_ZERO:         grib_ltype = GRIB2_LTYPE_ISOTHERM0;          break;
    case ZAXIS_TOA:                   grib_ltype = GRIB2_LTYPE_TOA;                break;
    case ZAXIS_SEA_BOTTOM:            grib_ltype = GRIB2_LTYPE_SEA_BOTTOM;         break;
    case ZAXIS_LAKE_BOTTOM:           grib_ltype = GRIB2_LTYPE_LAKE_BOTTOM;        break;
    case ZAXIS_SEDIMENT_BOTTOM:       grib_ltype = GRIB2_LTYPE_SEDIMENT_BOTTOM;    break;
    case ZAXIS_SEDIMENT_BOTTOM_TA:    grib_ltype = GRIB2_LTYPE_SEDIMENT_BOTTOM_TA; break;
    case ZAXIS_SEDIMENT_BOTTOM_TW:    grib_ltype = GRIB2_LTYPE_SEDIMENT_BOTTOM_TW; break;
    case ZAXIS_MIX_LAYER:             grib_ltype = GRIB2_LTYPE_MIX_LAYER;          break;
    case ZAXIS_ATMOSPHERE:            grib_ltype = GRIB2_LTYPE_ATMOSPHERE;         break;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
143
144
    }

145
  return grib_ltype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
146
147
148
}


Uwe Schulzweida's avatar
Uwe Schulzweida committed
149
150
151
152
int grbBitsPerValue(int datatype)
{
  int bitsPerValue = 16;

Uwe Schulzweida's avatar
Uwe Schulzweida committed
153
  if ( datatype == DATATYPE_CPX32 || datatype == DATATYPE_CPX64 )
154
    Error("CDI/GRIB library does not support complex numbers!");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
155

Uwe Schulzweida's avatar
Uwe Schulzweida committed
156
157
158
159
160
161
162
163
164
165
  if ( datatype != CDI_UNDEFID )
    {
      if ( datatype > 0 && datatype <= 32 )
	bitsPerValue = datatype;
      else if ( datatype == DATATYPE_FLT64 )
	bitsPerValue = 24;
      else
	bitsPerValue = 16;
    }

166
  return bitsPerValue;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
167
168
169
}


Uwe Schulzweida's avatar
Uwe Schulzweida committed
170
/*
171
int grbInqRecord(stream_t * streamptr, int *varID, int *levelID)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
172
173
174
{
  int status;

175
  status = cgribexInqRecord(streamptr, varID, levelID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
176
177
178

  return (status);
}
Uwe Schulzweida's avatar
Uwe Schulzweida committed
179
*/
Uwe Schulzweida's avatar
Uwe Schulzweida committed
180

181
void grbDefRecord(stream_t * streamptr)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
182
{
183
  UNUSED(streamptr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
184
185
186
}

static
187
int grbScanTimestep1(stream_t * streamptr)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
188
{
189
  int status = CDI_EUFTYPE;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
190

191
#if  defined  (HAVE_LIBCGRIBEX)
192
193
  int filetype  = streamptr->filetype;

Uwe Schulzweida's avatar
Uwe Schulzweida committed
194
  if ( filetype == FILETYPE_GRB )
195
196
197
    status = cgribexScanTimestep1(streamptr);
#endif
#if defined(HAVE_LIBCGRIBEX) && defined (HAVE_LIBGRIB_API)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
198
  else
199
#endif
200
201
202
#ifdef HAVE_LIBGRIB_API
    status = gribapiScanTimestep1(streamptr);
#endif
203

204
  return status;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
205
206
207
}

static
208
int grbScanTimestep2(stream_t * streamptr)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
209
{
210
  int status = CDI_EUFTYPE;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
211

212
#if  defined  (HAVE_LIBCGRIBEX)
213
214
  int filetype = streamptr->filetype;

Uwe Schulzweida's avatar
Uwe Schulzweida committed
215
216
  if ( filetype == FILETYPE_GRB )
    {
217
      status = cgribexScanTimestep2(streamptr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
218
    }
219
220
#endif
#if defined(HAVE_LIBCGRIBEX) && defined (HAVE_LIBGRIB_API)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
221
  else
222
#endif
223
224
225
#ifdef HAVE_LIBGRIB_API
    status = gribapiScanTimestep2(streamptr);
#endif
Uwe Schulzweida's avatar
Uwe Schulzweida committed
226

227
  return status;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
228
229
230
}

static
231
int grbScanTimestep(stream_t * streamptr)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
232
{
233
  int status = CDI_EUFTYPE;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
234
235
236
237
  int filetype;

  filetype  = streamptr->filetype;

238
#if  defined  (HAVE_LIBCGRIBEX)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
239
240
  if ( filetype == FILETYPE_GRB )
    {
241
      status = cgribexScanTimestep(streamptr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
242
243
    }
  else
244
#endif
245
246
247
248
249
#ifdef HAVE_LIBGRIB_API
    status = gribapiScanTimestep(streamptr);
#else
    Error("Sufficient GRIB support unavailable!");
#endif
Uwe Schulzweida's avatar
Uwe Schulzweida committed
250

251
  return status;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
252
253
254
}


255
#if  defined  (HAVE_LIBGRIB)
256
int grbInqContents(stream_t * streamptr)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
257
258
259
260
{
  int fileID;
  int status = 0;

261
  fileID = streamptr->fileID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
262
263
264

  streamptr->curTsID = 0;

265
266
267
  status = grbScanTimestep1(streamptr);

  if ( status == 0 && streamptr->ntsteps == -1 ) status = grbScanTimestep2(streamptr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
268
269
270

  fileSetPos(fileID, 0, SEEK_SET);

271
  return status;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
272
}
273
#endif
Uwe Schulzweida's avatar
Uwe Schulzweida committed
274

275
int grbInqTimestep(stream_t * streamptr, int tsID)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
276
277
278
279
{
  int ntsteps, nrecs;

  if ( tsID == 0 && streamptr->rtsteps == 0 )
280
    Error("Call to cdiInqContents missing!");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
281
282

  if ( CDI_Debug )
283
    Message("tsid = %d rtsteps = %d", tsID, streamptr->rtsteps);
284

Uwe Schulzweida's avatar
Uwe Schulzweida committed
285
286
287
  ntsteps = CDI_UNDEFID;
  while ( (tsID + 1) > streamptr->rtsteps && ntsteps == CDI_UNDEFID )
    {
288
      ntsteps = grbScanTimestep(streamptr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
      if ( ntsteps == CDI_EUFSTRUCT )
	{
	  streamptr->ntsteps = streamptr->rtsteps;
	  break;
	}
    }

  if ( tsID >= streamptr->ntsteps && streamptr->ntsteps != CDI_UNDEFID )
    {
      nrecs = 0;
    }
  else
    {
      streamptr->curTsID = tsID;
      nrecs = streamptr->tsteps[tsID].nrecs;
    }

306
  return nrecs;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
307
308
309
}


Uwe Schulzweida's avatar
Uwe Schulzweida committed
310
void streamInqGRIBinfo(int streamID, int *intnum, float *fltnum, off_t *bignum)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
311
{
312
  stream_t *streamptr = stream_to_pointer(streamID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
313

314
  int filetype = streamptr->filetype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
315
316
317

  if ( filetype == FILETYPE_GRB )
    {
318
319
320
321
322
      int tsID     = streamptr->curTsID;
      int vrecID   = streamptr->tsteps[tsID].curRecID;
      int recID    = streamptr->tsteps[tsID].recIDs[vrecID];
      off_t recpos = streamptr->tsteps[tsID].records[recID].position;
      int zip      = streamptr->tsteps[tsID].records[recID].zip;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
323

324
325
      void *gribbuffer = streamptr->record->buffer;
      size_t gribbuffersize = streamptr->record->buffersize;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
326
327

      if ( zip > 0 )
328
	Error("Compressed GRIB records unsupported!");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
329
      else
Uwe Schulzweida's avatar
Uwe Schulzweida committed
330
        grib_info_for_grads(recpos, (long)gribbuffersize, (unsigned char *) gribbuffer, intnum, fltnum, bignum);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
331
332
    }
}
333
334
335
336
337
338
339
340
341
/*
 * Local Variables:
 * c-file-style: "Java"
 * c-basic-offset: 2
 * indent-tabs-mode: nil
 * show-trailing-whitespace: t
 * require-trailing-newline: t
 * End:
 */