printinfo.h 18.5 KB
Newer Older
Uwe Schulzweida's avatar
Uwe Schulzweida committed
1
2
// This file is used in CDI and CDO !!!

3
4
5
#define DATE_FORMAT "%5.4d-%2.2d-%2.2d"
#define TIME_FORMAT "%2.2d:%2.2d:%2.2d"

Uwe Schulzweida's avatar
Uwe Schulzweida committed
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void datetime2str(int date, int time, char *datetimestr, int maxlen)
{
  int year, month, day;
  cdiDecodeDate(date, &year, &month, &day);
  int hour, minute, second;
  cdiDecodeTime(time, &hour, &minute, &second);

  int len = sprintf(datetimestr, DATE_FORMAT "T" TIME_FORMAT, year, month, day, hour, minute, second);
  if ( len > ( maxlen-1) )
    fprintf(stderr, "Internal problem (%s): sizeof input string is too small!\n", __func__);
}


void date2str(int date, char *datestr, int maxlen)
20
21
22
23
{
  int year, month, day;
  cdiDecodeDate(date, &year, &month, &day);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
24
  int len = sprintf(datestr, DATE_FORMAT, year, month, day);
25
  if ( len > ( maxlen-1) )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
26
    fprintf(stderr, "Internal problem (%s): sizeof input string is too small!\n", __func__);
27
28
29
}


Uwe Schulzweida's avatar
Uwe Schulzweida committed
30
void time2str(int time, char *timestr, int maxlen)
31
32
33
34
{
  int hour, minute, second;
  cdiDecodeTime(time, &hour, &minute, &second);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
35
  int len = sprintf(timestr, TIME_FORMAT, hour, minute, second);
36
  if ( len > ( maxlen-1) )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
37
    fprintf(stderr, "Internal problem (%s): sizeof input string is too small!\n", __func__);
38
39
40
}


Uwe Schulzweida's avatar
Uwe Schulzweida committed
41
void printFiletype(int streamID, int vlistID)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
42
{
Uwe Schulzweida's avatar
Uwe Schulzweida committed
43
  int filetype = streamInqFiletype(streamID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

  switch ( filetype )
    {
    case FILETYPE_GRB:
      printf("GRIB");
      break;
    case FILETYPE_GRB2:
      printf("GRIB2");
      break;
    case FILETYPE_NC:
      printf("netCDF");
      break;
    case FILETYPE_NC2:
      printf("netCDF2");
      break;
    case FILETYPE_NC4:
      printf("netCDF4");
      break;
62
63
64
    case FILETYPE_NC4C:
      printf("netCDF4 classic");
      break;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
65
66
67
68
69
70
71
72
73
74
75
    case FILETYPE_SRV:
      printf("SERVICE");
      break;
    case FILETYPE_EXT:
      printf("EXTRA");
      break;
    case FILETYPE_IEG:
      printf("IEG");
      break;
    default:
      printf("  File format: unsupported filetype %d" , filetype);
76
      break;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
    }

  if ( filetype == FILETYPE_SRV || filetype == FILETYPE_EXT || filetype == FILETYPE_IEG )
    {
      switch ( streamInqByteorder(streamID) )
	{
	case CDI_BIGENDIAN:
	  printf("  BIGENDIAN"); break;
	case CDI_LITTLEENDIAN:
	  printf("  LITTLEENDIAN"); break;
	default:
	  printf("  byteorder: %d undefined", streamInqByteorder(streamID)); break;
	}
    }

92
  if ( filetype == FILETYPE_GRB || filetype == FILETYPE_NC4 || filetype == FILETYPE_NC4C )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
93
94
    {
      int nvars, varID;
95
      int comptype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
96
97
98
99
100

      nvars = vlistNvars(vlistID);

      for ( varID = 0; varID < nvars; varID++ )
	{
101
102
	  comptype = vlistInqVarCompType(vlistID, varID);
	  if ( comptype )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
103
	    {
104
	      if ( comptype == COMPRESS_SZIP )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
105
		printf(" SZIP");
106
	      else if ( comptype == COMPRESS_ZIP )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
107
108
109
110
111
112
113
		printf(" ZIP");

	      break;
	    }
	}
    }

114
115
  if ( filetype == FILETYPE_GRB2 )
    {
116
      int comptype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
117
118
      int nvars = vlistNvars(vlistID);
      for ( int varID = 0; varID < nvars; varID++ )
119
	{
120
121
	  comptype = vlistInqVarCompType(vlistID, varID);
	  if ( comptype )
122
	    {
123
	      if ( comptype == COMPRESS_JPEG )
124
125
126
127
128
129
130
		printf(" JPEG");

	      break;
	    }
	}
    }

Uwe Schulzweida's avatar
Uwe Schulzweida committed
131
132
133
  printf("\n");
}

Uwe Schulzweida's avatar
Uwe Schulzweida committed
134
135
static
void printGridInfo(int vlistID)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
136
137
{
  int ngrids, index;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
138
  int gridID, gridtype, trunc, gridsize, xsize, ysize, xysize;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
139
  char xname[CDI_MAX_NAME], yname[CDI_MAX_NAME], xunits[CDI_MAX_NAME], yunits[CDI_MAX_NAME];
140
  unsigned char uuidOfHGrid[CDI_UUID_SIZE];
Uwe Schulzweida's avatar
Uwe Schulzweida committed
141
142
143
144
145
146
147
148
149
150

  ngrids = vlistNgrids(vlistID);
  for ( index = 0; index < ngrids; index++ )
    {
      gridID   = vlistGrid(vlistID, index);
      gridtype = gridInqType(gridID);
      trunc    = gridInqTrunc(gridID);
      gridsize = gridInqSize(gridID);
      xsize    = gridInqXsize(gridID);
      ysize    = gridInqYsize(gridID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
151
      xysize   = xsize*ysize;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
152
153
154
155
156
      gridInqXname(gridID, xname);
      gridInqYname(gridID, yname);
      gridInqXunits(gridID, xunits);
      gridInqYunits(gridID, yunits);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
157
      fprintf(stdout, "  %4d : %-24s", index+1, gridNamePtr(gridtype));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
158
159
160
161
162

      if ( gridtype == GRID_LONLAT   ||
	   gridtype == GRID_LCC2 ||
	   gridtype == GRID_LAEA ||
	   gridtype == GRID_SINUSOIDAL ||
163
	   gridtype == GRID_GENERIC ||
Uwe Schulzweida's avatar
Uwe Schulzweida committed
164
165
166
	   gridtype == GRID_GAUSSIAN ||
	   gridtype == GRID_GAUSSIAN_REDUCED )
	{
167
          int lxcoord = 1, lycoord = 1;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
168
169
170
	  double xfirst = 0.0, xlast = 0.0;
	  double yfirst = 0.0, ylast = 0.0;
	  double xinc = 0.0, yinc = 0.0;
171

Uwe Schulzweida's avatar
Uwe Schulzweida committed
172
173
174
	  yfirst = gridInqYval(gridID, 0);
	  ylast  = gridInqYval(gridID, ysize-1);
	  yinc   = gridInqYinc(gridID);
175

Uwe Schulzweida's avatar
Uwe Schulzweida committed
176
          fprintf(stdout, " : points=%d", gridsize);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
177
	  if ( gridtype == GRID_GAUSSIAN_REDUCED )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
178
179
180
	    fprintf(stdout, "  nlat=%d", ysize);
	  else if ( xysize )
	    fprintf(stdout, " (%dx%d)", xsize, ysize);
181

Uwe Schulzweida's avatar
Uwe Schulzweida committed
182
	  if ( gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
183
	    fprintf(stdout, "  np=%d", gridInqNP(gridID));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
184
185

	  fprintf(stdout, "\n");
186

187
188
189
190
          if ( gridInqXvals(gridID, NULL) == 0 ) lxcoord = 0;
          if ( gridInqYvals(gridID, NULL) == 0 ) lycoord = 0;

	  if ( xsize > 0 && lxcoord )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
191
	    {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
192
193
194
195
196
197
198
199
200
201
202
203
204
              xfirst = gridInqXval(gridID, 0);
              xlast  = gridInqXval(gridID, xsize-1);
              xinc   = gridInqXinc(gridID);
              fprintf(stdout, "%33s : %g", xname, xfirst);
              if ( xsize > 1 )
                {
                  fprintf(stdout, " to %g", xlast);
                  if ( IS_NOT_EQUAL(xinc, 0) )
                    fprintf(stdout, " by %g", xinc);
                }
              fprintf(stdout, " %s", xunits);
              if ( gridIsCircular(gridID) ) fprintf(stdout, "  circular");
              fprintf(stdout, "\n");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
205
	    }
206

207
	  if ( ysize > 0 && lycoord )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
208
	    {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
209
	      fprintf(stdout, "%33s : %g", yname, yfirst);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
210
211
212
213
214
215
216
	      if ( ysize > 1 )
                {
                  fprintf(stdout, " to %g", ylast);
                  if ( IS_NOT_EQUAL(yinc, 0) && gridtype != GRID_GAUSSIAN && gridtype != GRID_GAUSSIAN_REDUCED )
                    fprintf(stdout, " by %g", yinc);
                }
              fprintf(stdout, " %s", yunits);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
217
218
	      fprintf(stdout, "\n");
	    }
219

Uwe Schulzweida's avatar
Uwe Schulzweida committed
220
221
222
223
224
225
	  if ( gridIsRotated(gridID) )
	    {
	      double lonpole, latpole, angle;
	      lonpole = gridInqXpole(gridID);
	      latpole = gridInqYpole(gridID);
	      angle   = gridInqAngle(gridID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
226
	      fprintf(stdout, "%33s : lon=%g  lat=%g", "northpole", lonpole, latpole);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
227
	      if ( IS_NOT_EQUAL(angle, 0) ) fprintf(stdout, "  angle=%g", angle);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
228
229
	      fprintf(stdout, "\n");
	    }
230

Uwe Schulzweida's avatar
Uwe Schulzweida committed
231
232
	  if ( gridInqXbounds(gridID, NULL) || gridInqYbounds(gridID, NULL) )
	    {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
233
	      fprintf(stdout, "%33s :", "available");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
234
	      if ( gridInqXbounds(gridID, NULL) && gridInqYbounds(gridID, NULL) ) fprintf(stdout, " cellbounds");
235
	      if ( gridHasArea(gridID) )          fprintf(stdout, " area");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
236
	      if ( gridInqMask(gridID, NULL) )    fprintf(stdout, " mask");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
237
238
	      fprintf(stdout, "\n");
	    }
239

Uwe Schulzweida's avatar
Uwe Schulzweida committed
240
241
242
243
	  if ( gridtype == GRID_LAEA )
	    {
	      double a, lon_0, lat_0;
	      gridInqLaea(gridID, &a, &lon_0, &lat_0);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
244
	      fprintf(stdout, "%33s : a=%g  lon_0=%g  lat_0=%g\n", "projpar", a, lon_0, lat_0);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
245
	    }
246

Uwe Schulzweida's avatar
Uwe Schulzweida committed
247
248
249
250
	  if ( gridtype == GRID_LCC2 )
	    {
	      double a, lon_0, lat_0, lat_1, lat_2;
	      gridInqLcc2(gridID, &a, &lon_0, &lat_0, &lat_1, &lat_2);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
251
252
	      fprintf(stdout, "%33s : a=%7.0f  lon_0=%g  lat_0=%g  lat_1=%g  lat_2=%g\n",
                      "projpar", a, lon_0, lat_0, lat_1, lat_2);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
253
254
255
256
	    }
	}
      else if ( gridtype == GRID_SPECTRAL )
	{
Uwe Schulzweida's avatar
Uwe Schulzweida committed
257
258
259
	  fprintf(stdout, " : points=%d  nsp=%d  truncation=%d", gridsize, gridsize/2, trunc);
          if ( gridInqComplexPacking(gridID) ) fprintf(stdout, "  complexPacking");
          fprintf(stdout, "\n");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
260
	}
261
262
      else if ( gridtype == GRID_FOURIER )
	{
Uwe Schulzweida's avatar
Uwe Schulzweida committed
263
	  fprintf(stdout, " : points=%d  nfc=%d  truncation=%d\n", gridsize, gridsize/2, trunc);
264
	}
Uwe Schulzweida's avatar
Uwe Schulzweida committed
265
266
267
268
269
      else if ( gridtype == GRID_GME )
	{
	  int ni, nd;
	  ni = gridInqGMEni(gridID);
	  nd = gridInqGMEnd(gridID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
270
	  fprintf(stdout, " : points=%d  nd=%d  ni=%d\n", gridsize, nd, ni);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
271
	}
272
      else if ( gridtype == GRID_CURVILINEAR || gridtype == GRID_UNSTRUCTURED )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
273
274
	{
	  if ( gridtype == GRID_CURVILINEAR )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
275
	    fprintf(stdout, " : points=%d (%dx%d)", gridsize, xsize, ysize);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
276
	  else
Uwe Schulzweida's avatar
Uwe Schulzweida committed
277
	    fprintf(stdout, " : points=%d", gridsize);
278
279

          if ( gridtype == GRID_UNSTRUCTURED && gridInqNvertex(gridID) > 0 )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
280
	    fprintf(stdout, "  nvertex=%d", gridInqNvertex(gridID));
281
282
283
284
285

          fprintf(stdout, "\n");

          if ( gridtype == GRID_UNSTRUCTURED )
            {
286
287
288
              int number   = gridInqNumber(gridID);
              int position = gridInqPosition(gridID);

289
290
              if ( number > 0 )
                {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
291
                  fprintf(stdout, "%33s : number=%d  position=%d\n", "grid", number, position);
292
293
294
295
296
297
                }

              if ( gridInqReference(gridID, NULL) )
                {
                  char reference_link[8192];
                  gridInqReference(gridID, reference_link);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
298
                  fprintf(stdout, "%33s : %s\n", "uri", reference_link);
299
300
                }
            }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
301
302
303
304
305
306

	  if ( gridInqXvals(gridID, NULL) && gridInqYvals(gridID, NULL) )
	    {
	      int i;
	      double *xvals, *yvals;
	      double xfirst, xlast, yfirst, ylast;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
307
308
	      xvals = (double*) malloc((size_t)gridsize*sizeof(double));
	      yvals = (double*) malloc((size_t)gridsize*sizeof(double));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
309
310
311
312
313
314
315
316
317
318
319

	      gridInqXvals(gridID, xvals);
	      gridInqYvals(gridID, yvals);

	      xfirst = xvals[0];
	      xlast  = xvals[0];
	      yfirst = yvals[0];
	      ylast  = yvals[0];
	      for ( i = 1; i < gridsize; i++ )
		{
		  if ( xvals[i] < xfirst ) xfirst = xvals[i];
Uwe Schulzweida's avatar
Uwe Schulzweida committed
320
		  if ( xvals[i] > xlast  ) xlast  = xvals[i];
Uwe Schulzweida's avatar
Uwe Schulzweida committed
321
		  if ( yvals[i] < yfirst ) yfirst = yvals[i];
Uwe Schulzweida's avatar
Uwe Schulzweida committed
322
		  if ( yvals[i] > ylast  ) ylast  = yvals[i];
Uwe Schulzweida's avatar
Uwe Schulzweida committed
323
324
		}

Uwe Schulzweida's avatar
Uwe Schulzweida committed
325
	      fprintf(stdout, "%33s : %g to %g %s", xname, xfirst, xlast, xunits);
326
	      if ( gridIsCircular(gridID) ) fprintf(stdout, "  circular");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
327
	      fprintf(stdout, "\n");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
328
	      fprintf(stdout, "%33s : %g to %g %s\n", yname, yfirst, ylast, yunits);
329

Uwe Schulzweida's avatar
Uwe Schulzweida committed
330
331
332
333
334
335
336
337
338
339
340
341
	      free(xvals);
	      free(yvals);
	    }
	}
      else if ( gridtype == GRID_LCC )
	{
	  double originLon, originLat, lonParY, lat1, lat2, xincm, yincm;
	  int projflag, scanflag;

	  gridInqLCC(gridID, &originLon, &originLat, &lonParY, &lat1, &lat2, &xincm, &yincm,
		     &projflag, &scanflag);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
342
	  fprintf(stdout, " : points=%d (%dx%d)  ", gridsize, xsize, ysize);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
343
344
345
346
	  if ( (projflag&128) == 0 )
	    fprintf(stdout, "North Pole\n");
	  else
	    fprintf(stdout, "South Pole\n");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
347
348
349

	  fprintf(stdout, "%33s : originLon=%g  originLat=%g  lonParY=%g\n", " ", originLon, originLat, lonParY);
	  fprintf(stdout, "%33s : lat1=%g  lat2=%g  xinc=%g m  yinc=%g m\n", " ", lat1, lat2, xincm, yincm);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
350
351
352
353
	}
      else /* if ( gridtype == GRID_GENERIC ) */
	{
	  if ( ysize == 0 )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
354
	    fprintf(stdout, " : points=%d\n", gridsize);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
355
	  else
Uwe Schulzweida's avatar
Uwe Schulzweida committed
356
            fprintf(stdout, " : points=%d (%dx%d)\n", gridsize, xsize, ysize);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
357
358
	}

359
      if ( gridtype == GRID_CURVILINEAR || gridtype == GRID_UNSTRUCTURED || gridtype == GRID_LCC )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
360
	{
Uwe Schulzweida's avatar
Uwe Schulzweida committed
361
	  if ( gridHasArea(gridID) ||
Uwe Schulzweida's avatar
Uwe Schulzweida committed
362
363
	       gridInqXbounds(gridID, NULL) || gridInqYbounds(gridID, NULL) )
	    {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
364
	      fprintf(stdout, "%33s :", "available");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
365
	      if ( gridInqXbounds(gridID, NULL) && gridInqYbounds(gridID, NULL) ) fprintf(stdout, " cellbounds");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
366
	      if ( gridHasArea(gridID) )          fprintf(stdout, " area");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
367
	      if ( gridInqMask(gridID, NULL) )    fprintf(stdout, " mask");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
368
369
370
	      fprintf(stdout, "\n");
	    }
	}
371
372

      gridInqUUID(gridID, uuidOfHGrid);
Thomas Jahns's avatar
Thomas Jahns committed
373
      if ( !cdiUUIDIsNull(uuidOfHGrid) )
374
375
        {
          char uuidOfHGridStr[37];
376
          cdiUUID2Str(uuidOfHGrid, uuidOfHGridStr);
377
378
          if ( uuidOfHGridStr[0] != 0  && strlen(uuidOfHGridStr) == 36 )
            {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
379
380
381
382
383
384
385
386
387
388
389
390
391
392
	      fprintf(stdout, "%33s : %s\n", "uuid", uuidOfHGridStr);
            }
        }
    }
}

static
void printZaxisInfo(int vlistID)
{
  int zaxisID, zaxistype, levelsize, levelID;
  int ltype;
  double *levels = NULL;
  char zaxisname[CDI_MAX_NAME], zname[CDI_MAX_NAME], zunits[CDI_MAX_NAME];

393
394
  int nzaxis = vlistNzaxis(vlistID);
  for ( int index = 0; index < nzaxis; index++)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
    {
      double zfirst = 0, zlast = 0, zinc = 0;
      zaxisID   = vlistZaxis(vlistID, index);
      zaxistype = zaxisInqType(zaxisID);
      ltype     = zaxisInqLtype(zaxisID);
      levelsize = zaxisInqSize(zaxisID);
      zaxisName(zaxistype, zaxisname);
      zaxisInqName(zaxisID, zname);
      zaxisInqUnits(zaxisID, zunits);
      zunits[12] = 0;

      if ( zaxistype == ZAXIS_GENERIC && ltype != 0 )
        fprintf(stdout, "  %4d : %-12s (ltype=%3d) :", vlistZaxisIndex(vlistID, zaxisID)+1, zaxisname, ltype);
      else
        fprintf(stdout, "  %4d : %-24s :", vlistZaxisIndex(vlistID, zaxisID)+1, zaxisname);

      fprintf(stdout, " levels=%d", levelsize);
      fprintf(stdout, "\n");

Uwe Schulzweida's avatar
Uwe Schulzweida committed
414
      levels = (double*) malloc((size_t)levelsize*sizeof(double));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
      zaxisInqLevels(zaxisID, levels);

      if ( !(zaxistype == ZAXIS_SURFACE && levelsize == 1 && !(fabs(levels[0]) > 0)) )
        {
          zfirst = levels[0];
          zlast  = levels[levelsize-1];
          if ( levelsize > 2 )
            {
              zinc = (levels[levelsize-1] - levels[0]) / (levelsize-1);
              for ( levelID = 2; levelID < levelsize; ++levelID )
                if ( fabs(fabs(levels[levelID] - levels[levelID-1]) - zinc) > 0.001*zinc ) break;

              if ( levelID < levelsize ) zinc = 0;
            }

          fprintf(stdout, "%33s : %g", zname, zfirst);
          if ( levelsize > 1 )
            {
              fprintf(stdout, " to %g", zlast);
              if ( IS_NOT_EQUAL(zinc, 0) )
                fprintf(stdout, " by %g", zinc);
            }
          fprintf(stdout, " %s", zunits);
          fprintf(stdout, "\n");
        }

      free(levels);

      if ( zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL) )
        {
          double level1, level2;
          fprintf(stdout, "%33s : ", "bounds");

          level1 = zaxisInqLbound(zaxisID, 0);
          level2 = zaxisInqUbound(zaxisID, 0);
          fprintf(stdout, "%.9g-%.9g", level1, level2);
          if ( levelsize > 1 )
            {
              level1 = zaxisInqLbound(zaxisID, levelsize-1);
              level2 = zaxisInqUbound(zaxisID, levelsize-1);
              fprintf(stdout, " to %.9g-%.9g", level1, level2);
              if ( IS_NOT_EQUAL(zinc, 0) )
                fprintf(stdout, " by %g", zinc);
458
            }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
459
460
          fprintf(stdout, " %s", zunits);
          fprintf(stdout, "\n");
461
        }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
462

Uwe Schulzweida's avatar
Uwe Schulzweida committed
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
      if ( zaxistype == ZAXIS_HYBRID )
        {
          char psname[CDI_MAX_NAME];
          psname[0] = 0;
          zaxisInqPsName(zaxisID, psname);
          int vctsize = zaxisInqVctSize(zaxisID);
          if ( vctsize || psname[0] )
            {
	      fprintf(stdout, "%33s :", "available");
              if ( vctsize   ) fprintf(stdout, " vct");
              if ( psname[0] ) fprintf(stdout, "  ps: %s", psname);
              fprintf(stdout, "\n");
            }
        }

Uwe Schulzweida's avatar
Uwe Schulzweida committed
478
479
480
481
482
483
484
485
486
487
      if ( zaxistype == ZAXIS_REFERENCE )
        {
          int number   = zaxisInqNumber(zaxisID);

          if ( number > 0 )
            {
              fprintf(stdout, "%33s : ", "zaxis");
              fprintf(stdout, "number = %d\n", number);
            }

488
          unsigned char uuidOfVGrid[CDI_UUID_SIZE];
Uwe Schulzweida's avatar
Uwe Schulzweida committed
489
          zaxisInqUUID(zaxisID, uuidOfVGrid);
Thomas Jahns's avatar
Thomas Jahns committed
490
          if ( !cdiUUIDIsNull(uuidOfVGrid) )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
491
492
            {
              char uuidOfVGridStr[37];
493
              cdiUUID2Str(uuidOfVGrid, uuidOfVGridStr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
494
495
496
497
498
499
500
501
502
503
              if ( uuidOfVGridStr[0] != 0  && strlen(uuidOfVGridStr) == 36 )
                {
                  fprintf(stdout, "%33s : ", "uuid");
                  fprintf(stdout, "%s\n", uuidOfVGridStr);
                }
            }
        }
    }
}

504
505
506
507
508
509
510
511
512
513
514
515
516
517
static
void printSubtypeInfo(int vlistID)
{
  int nsubtypes = vlistNsubtypes(vlistID);
  for ( int index = 0; index < nsubtypes; index++)
    {
      int subtypeID = vlistSubtype(vlistID, index);
      int subtypesize = subtypeInqSize(subtypeID);
      // subtypePrint(subtypeID);
      fprintf(stdout, "  %4d : %-24s :", vlistSubtypeIndex(vlistID, subtypeID)+1, "tiles");
      fprintf(stdout, " ntiles=%d", subtypesize);
      fprintf(stdout, "\n");
    }
}
Uwe Schulzweida's avatar
Uwe Schulzweida committed
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561

static
int printDateTime(int ntimeout, int vdate, int vtime)
{
  char vdatestr[32], vtimestr[32];

  if ( ntimeout == 4 )
    {
      ntimeout = 0;
      fprintf(stdout, "\n");
    }

  date2str(vdate, vdatestr, sizeof(vdatestr));
  time2str(vtime, vtimestr, sizeof(vtimestr));

  fprintf(stdout, " %s %s", vdatestr, vtimestr);

  return (++ntimeout);
}

#define NUM_TIMESTEP 60
#define MAX_DOTS     80

static
int printDot(int ndotout, int *nfact, int *ncout)
{
  //printf("ncout %d %d %d\n",*ncout, (*ncout)%(*nfact), *nfact);
  if ( (*ncout)%(*nfact) == 0 )
    {
      if ( ndotout == MAX_DOTS )
	{
	  *ncout = 0;
	  ndotout = 0;
	  fprintf(stdout, "\n   ");
	  (*nfact) *= 10;
	}

      fprintf(stdout, ".");
      fflush(stdout);
      ndotout++;
    }

  (*ncout)++;

Uwe Schulzweida's avatar
Uwe Schulzweida committed
562
  return ndotout;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
563
564
565
}

static
566
void printTimesteps(int streamID, int taxisID, int verbose)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
{
  int nrecs;
  int vdate, vtime;
  struct datetime {
    int vdate;
    int vtime;
    struct datetime *next;
  };
  struct datetime vdatetime[NUM_TIMESTEP];
  struct datetime *next_vdatetime = vdatetime;

  for ( int i = 0; i < NUM_TIMESTEP-1; ++i ) vdatetime[i].next = &vdatetime[i+1];
  vdatetime[NUM_TIMESTEP-1].next = &vdatetime[0];

  int ntimeout = 0;
  int ndotout = 0;
  int nvdatetime = 0;
  int ncout = 0;
  int nfact = 1;
  int tsID = 0;
587

Uwe Schulzweida's avatar
Uwe Schulzweida committed
588
589
590
591
592
  while ( (nrecs = streamInqTimestep(streamID, tsID)) )
    {
      vdate = taxisInqVdate(taxisID);
      vtime = taxisInqVtime(taxisID);

593
      if ( verbose || tsID < NUM_TIMESTEP )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
	{
	  ntimeout = printDateTime(ntimeout, vdate, vtime);
	}
      else
	{
	  if ( tsID == 2*NUM_TIMESTEP ) fprintf(stdout, "\n   ");
	  if ( tsID >= 2*NUM_TIMESTEP ) ndotout = printDot(ndotout, &nfact, &ncout);

	  if ( nvdatetime < NUM_TIMESTEP )
	    {
	      vdatetime[nvdatetime].vdate = vdate;
	      vdatetime[nvdatetime].vtime = vtime;
	      nvdatetime++;
	    }
	  else
	    {
	      next_vdatetime->vdate = vdate;
	      next_vdatetime->vtime = vtime;
	      next_vdatetime = next_vdatetime->next;
	    }
	}

      tsID++;
    }

  if ( nvdatetime )
    {
      fprintf(stdout, "\n");

      ntimeout = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
624
625
626
627
628
629
630
      int toff = 0;
      if ( tsID > 2*NUM_TIMESTEP )
        {
          toff = tsID%4;
          if ( toff > 0 ) toff = 4 - toff;
          for ( int i = 0; i < toff; ++i ) next_vdatetime = next_vdatetime->next;
        }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
631
632
633
634
635
636
637
      for ( int i = toff; i < nvdatetime; ++i )
	{
	  vdate = next_vdatetime->vdate;
	  vtime = next_vdatetime->vtime;
	  ntimeout = printDateTime(ntimeout, vdate, vtime);
	  next_vdatetime = next_vdatetime->next;
	}
Uwe Schulzweida's avatar
Uwe Schulzweida committed
638
639
    }
}
640
641
642
643
644
645
646
647
648
/*
 * Local Variables:
 * c-file-style: "Java"
 * c-basic-offset: 2
 * indent-tabs-mode: nil
 * show-trailing-whitespace: t
 * require-trailing-newline: t
 * End:
 */