printinfo.h 18.3 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

  switch ( filetype )
    {
    case FILETYPE_GRB:
      printf("GRIB");
      break;
    case FILETYPE_GRB2:
      printf("GRIB2");
      break;
    case FILETYPE_NC:
54
      printf("NetCDF");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
55
56
      break;
    case FILETYPE_NC2:
57
      printf("NetCDF2");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
58
59
      break;
    case FILETYPE_NC4:
60
      printf("NetCDF4");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
61
      break;
62
    case FILETYPE_NC4C:
63
      printf("NetCDF4 classic");
64
      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
{
Uwe Schulzweida's avatar
Uwe Schulzweida committed
137
  char xname[CDI_MAX_NAME], yname[CDI_MAX_NAME], xunits[CDI_MAX_NAME], yunits[CDI_MAX_NAME];
138
  unsigned char uuidOfHGrid[CDI_UUID_SIZE];
Uwe Schulzweida's avatar
Uwe Schulzweida committed
139

140
141
  int ngrids = vlistNgrids(vlistID);
  for ( int index = 0; index < ngrids; index++ )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
142
    {
143
144
145
146
147
148
149
      int gridID   = vlistGrid(vlistID, index);
      int gridtype = gridInqType(gridID);
      int trunc    = gridInqTrunc(gridID);
      int gridsize = gridInqSize(gridID);
      int xsize    = gridInqXsize(gridID);
      int ysize    = gridInqYsize(gridID);
      int xysize   = xsize*ysize;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
150
151
152
153
154
      gridInqXname(gridID, xname);
      gridInqYname(gridID, yname);
      gridInqXunits(gridID, xunits);
      gridInqYunits(gridID, yunits);

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

      if ( gridtype == GRID_LONLAT   ||
	   gridtype == GRID_LCC2 ||
	   gridtype == GRID_LAEA ||
	   gridtype == GRID_SINUSOIDAL ||
161
	   gridtype == GRID_GENERIC ||
Uwe Schulzweida's avatar
Uwe Schulzweida committed
162
163
164
	   gridtype == GRID_GAUSSIAN ||
	   gridtype == GRID_GAUSSIAN_REDUCED )
	{
165
166
167
	  double yfirst = gridInqYval(gridID, 0);
	  double ylast  = gridInqYval(gridID, ysize-1);
	  double yinc   = gridInqYinc(gridID);
168

Uwe Schulzweida's avatar
Uwe Schulzweida committed
169
          fprintf(stdout, " : points=%d", gridsize);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
170
	  if ( gridtype == GRID_GAUSSIAN_REDUCED )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
171
172
173
	    fprintf(stdout, "  nlat=%d", ysize);
	  else if ( xysize )
	    fprintf(stdout, " (%dx%d)", xsize, ysize);
174

Uwe Schulzweida's avatar
Uwe Schulzweida committed
175
	  if ( gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
176
	    fprintf(stdout, "  np=%d", gridInqNP(gridID));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
177
178

	  fprintf(stdout, "\n");
179

180
181
182
          bool lxcoord = true, lycoord = true;
          if ( gridInqXvals(gridID, NULL) == 0 ) lxcoord = false;
          if ( gridInqYvals(gridID, NULL) == 0 ) lycoord = false;
183
184

	  if ( xsize > 0 && lxcoord )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
185
	    {
186
187
188
              double xfirst = gridInqXval(gridID, 0);
              double xlast  = gridInqXval(gridID, xsize-1);
              double xinc   = gridInqXinc(gridID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
189
190
191
192
193
194
195
196
197
198
              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
199
	    }
200

201
	  if ( ysize > 0 && lycoord )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
202
	    {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
203
	      fprintf(stdout, "%33s : %g", yname, yfirst);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
204
205
206
207
208
209
210
	      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
211
212
	      fprintf(stdout, "\n");
	    }
213

Uwe Schulzweida's avatar
Uwe Schulzweida committed
214
215
	  if ( gridIsRotated(gridID) )
	    {
216
217
218
	      double lonpole = gridInqXpole(gridID);
	      double latpole = gridInqYpole(gridID);
	      double angle   = gridInqAngle(gridID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
219
	      fprintf(stdout, "%33s : lon=%g  lat=%g", "northpole", lonpole, latpole);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
220
	      if ( IS_NOT_EQUAL(angle, 0) ) fprintf(stdout, "  angle=%g", angle);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
221
222
	      fprintf(stdout, "\n");
	    }
223

Uwe Schulzweida's avatar
Uwe Schulzweida committed
224
225
	  if ( gridInqXbounds(gridID, NULL) || gridInqYbounds(gridID, NULL) )
	    {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
226
	      fprintf(stdout, "%33s :", "available");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
227
	      if ( gridInqXbounds(gridID, NULL) && gridInqYbounds(gridID, NULL) ) fprintf(stdout, " cellbounds");
228
	      if ( gridHasArea(gridID) )          fprintf(stdout, " area");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
229
	      if ( gridInqMask(gridID, NULL) )    fprintf(stdout, " mask");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
230
231
	      fprintf(stdout, "\n");
	    }
232

Uwe Schulzweida's avatar
Uwe Schulzweida committed
233
234
235
236
	  if ( gridtype == GRID_LAEA )
	    {
	      double a, lon_0, lat_0;
	      gridInqLaea(gridID, &a, &lon_0, &lat_0);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
237
	      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
238
	    }
239

Uwe Schulzweida's avatar
Uwe Schulzweida committed
240
241
242
243
	  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
244
245
	      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
246
247
248
249
	    }
	}
      else if ( gridtype == GRID_SPECTRAL )
	{
Uwe Schulzweida's avatar
Uwe Schulzweida committed
250
251
252
	  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
253
	}
254
255
      else if ( gridtype == GRID_FOURIER )
	{
Uwe Schulzweida's avatar
Uwe Schulzweida committed
256
	  fprintf(stdout, " : points=%d  nfc=%d  truncation=%d\n", gridsize, gridsize/2, trunc);
257
	}
Uwe Schulzweida's avatar
Uwe Schulzweida committed
258
259
      else if ( gridtype == GRID_GME )
	{
260
261
	  int ni = gridInqGMEni(gridID);
	  int nd = gridInqGMEnd(gridID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
262
	  fprintf(stdout, " : points=%d  nd=%d  ni=%d\n", gridsize, nd, ni);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
263
	}
264
      else if ( gridtype == GRID_CURVILINEAR || gridtype == GRID_UNSTRUCTURED )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
265
266
	{
	  if ( gridtype == GRID_CURVILINEAR )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
267
	    fprintf(stdout, " : points=%d (%dx%d)", gridsize, xsize, ysize);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
268
	  else
Uwe Schulzweida's avatar
Uwe Schulzweida committed
269
	    fprintf(stdout, " : points=%d", gridsize);
270
271

          if ( gridtype == GRID_UNSTRUCTURED && gridInqNvertex(gridID) > 0 )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
272
	    fprintf(stdout, "  nvertex=%d", gridInqNvertex(gridID));
273
274
275
276
277

          fprintf(stdout, "\n");

          if ( gridtype == GRID_UNSTRUCTURED )
            {
278
279
280
              int number   = gridInqNumber(gridID);
              int position = gridInqPosition(gridID);

281
282
              if ( number > 0 )
                {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
283
                  fprintf(stdout, "%33s : number=%d  position=%d\n", "grid", number, position);
284
285
286
287
288
289
                }

              if ( gridInqReference(gridID, NULL) )
                {
                  char reference_link[8192];
                  gridInqReference(gridID, reference_link);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
290
                  fprintf(stdout, "%33s : %s\n", "uri", reference_link);
291
292
                }
            }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
293
294
295

	  if ( gridInqXvals(gridID, NULL) && gridInqYvals(gridID, NULL) )
	    {
296
297
	      double *xvals = (double*) malloc((size_t)gridsize*sizeof(double));
	      double *yvals = (double*) malloc((size_t)gridsize*sizeof(double));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
298
299
300
301

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

302
303
304
305
306
	      double xfirst = xvals[0];
	      double xlast  = xvals[0];
	      double yfirst = yvals[0];
	      double ylast  = yvals[0];
	      for ( int i = 1; i < gridsize; i++ )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
307
308
		{
		  if ( xvals[i] < xfirst ) xfirst = xvals[i];
Uwe Schulzweida's avatar
Uwe Schulzweida committed
309
		  if ( xvals[i] > xlast  ) xlast  = xvals[i];
Uwe Schulzweida's avatar
Uwe Schulzweida committed
310
		  if ( yvals[i] < yfirst ) yfirst = yvals[i];
Uwe Schulzweida's avatar
Uwe Schulzweida committed
311
		  if ( yvals[i] > ylast  ) ylast  = yvals[i];
Uwe Schulzweida's avatar
Uwe Schulzweida committed
312
313
		}

Uwe Schulzweida's avatar
Uwe Schulzweida committed
314
	      fprintf(stdout, "%33s : %g to %g %s", xname, xfirst, xlast, xunits);
315
	      if ( gridIsCircular(gridID) ) fprintf(stdout, "  circular");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
316
	      fprintf(stdout, "\n");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
317
	      fprintf(stdout, "%33s : %g to %g %s\n", yname, yfirst, ylast, yunits);
318

Uwe Schulzweida's avatar
Uwe Schulzweida committed
319
320
321
322
323
324
325
326
327
328
329
330
	      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
331
	  fprintf(stdout, " : points=%d (%dx%d)  ", gridsize, xsize, ysize);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
332
333
334
335
	  if ( (projflag&128) == 0 )
	    fprintf(stdout, "North Pole\n");
	  else
	    fprintf(stdout, "South Pole\n");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
336
337
338

	  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
339
340
341
342
	}
      else /* if ( gridtype == GRID_GENERIC ) */
	{
	  if ( ysize == 0 )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
343
	    fprintf(stdout, " : points=%d\n", gridsize);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
344
	  else
Uwe Schulzweida's avatar
Uwe Schulzweida committed
345
            fprintf(stdout, " : points=%d (%dx%d)\n", gridsize, xsize, ysize);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
346
347
	}

348
      if ( gridtype == GRID_CURVILINEAR || gridtype == GRID_UNSTRUCTURED || gridtype == GRID_LCC )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
349
	{
Uwe Schulzweida's avatar
Uwe Schulzweida committed
350
	  if ( gridHasArea(gridID) ||
Uwe Schulzweida's avatar
Uwe Schulzweida committed
351
352
	       gridInqXbounds(gridID, NULL) || gridInqYbounds(gridID, NULL) )
	    {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
353
	      fprintf(stdout, "%33s :", "available");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
354
	      if ( gridInqXbounds(gridID, NULL) && gridInqYbounds(gridID, NULL) ) fprintf(stdout, " cellbounds");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
355
	      if ( gridHasArea(gridID) )          fprintf(stdout, " area");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
356
	      if ( gridInqMask(gridID, NULL) )    fprintf(stdout, " mask");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
357
358
359
	      fprintf(stdout, "\n");
	    }
	}
360
361

      gridInqUUID(gridID, uuidOfHGrid);
Thomas Jahns's avatar
Thomas Jahns committed
362
      if ( !cdiUUIDIsNull(uuidOfHGrid) )
363
364
        {
          char uuidOfHGridStr[37];
365
          cdiUUID2Str(uuidOfHGrid, uuidOfHGridStr);
366
367
          if ( uuidOfHGridStr[0] != 0  && strlen(uuidOfHGridStr) == 36 )
            {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
368
369
370
371
372
373
374
375
376
377
378
	      fprintf(stdout, "%33s : %s\n", "uuid", uuidOfHGridStr);
            }
        }
    }
}

static
void printZaxisInfo(int vlistID)
{
  char zaxisname[CDI_MAX_NAME], zname[CDI_MAX_NAME], zunits[CDI_MAX_NAME];

379
  int nzaxis = vlistNzaxis(vlistID);
380
  for ( int index = 0; index < nzaxis; index++ )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
381
    {
382
383
384
385
386
      double zinc = 0;
      int zaxisID   = vlistZaxis(vlistID, index);
      int zaxistype = zaxisInqType(zaxisID);
      int ltype     = zaxisInqLtype(zaxisID);
      int levelsize = zaxisInqSize(zaxisID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
387
388
389
390
391
392
393
394
395
396
397
398
399
      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");

400
      double *levels = (double*) malloc((size_t)levelsize*sizeof(double));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
401
402
403
404
      zaxisInqLevels(zaxisID, levels);

      if ( !(zaxistype == ZAXIS_SURFACE && levelsize == 1 && !(fabs(levels[0]) > 0)) )
        {
405
406
          double zfirst = levels[0];
          double zlast  = levels[levelsize-1];
Uwe Schulzweida's avatar
Uwe Schulzweida committed
407
408
          if ( levelsize > 2 )
            {
409
              int levelID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
              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);
437
          fprintf(stdout, "%g-%g", level1, level2);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
438
439
440
441
          if ( levelsize > 1 )
            {
              level1 = zaxisInqLbound(zaxisID, levelsize-1);
              level2 = zaxisInqUbound(zaxisID, levelsize-1);
442
              fprintf(stdout, " to %g-%g", level1, level2);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
443
444
              if ( IS_NOT_EQUAL(zinc, 0) )
                fprintf(stdout, " by %g", zinc);
445
            }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
446
447
          fprintf(stdout, " %s", zunits);
          fprintf(stdout, "\n");
448
        }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
449

Uwe Schulzweida's avatar
Uwe Schulzweida committed
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
      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
465
466
467
468
469
470
471
472
473
474
      if ( zaxistype == ZAXIS_REFERENCE )
        {
          int number   = zaxisInqNumber(zaxisID);

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

475
          unsigned char uuidOfVGrid[CDI_UUID_SIZE];
Uwe Schulzweida's avatar
Uwe Schulzweida committed
476
          zaxisInqUUID(zaxisID, uuidOfVGrid);
Thomas Jahns's avatar
Thomas Jahns committed
477
          if ( !cdiUUIDIsNull(uuidOfVGrid) )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
478
479
            {
              char uuidOfVGridStr[37];
480
              cdiUUID2Str(uuidOfVGrid, uuidOfVGridStr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
481
482
483
484
485
486
487
488
489
490
              if ( uuidOfVGridStr[0] != 0  && strlen(uuidOfVGridStr) == 36 )
                {
                  fprintf(stdout, "%33s : ", "uuid");
                  fprintf(stdout, "%s\n", uuidOfVGridStr);
                }
            }
        }
    }
}

491
492
493
494
495
496
497
498
499
500
501
502
503
504
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
505
506
507
508
509
510
511
512
513
514
515
516
517
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

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
549
  return ndotout;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
550
551
552
}

static
553
void printTimesteps(int streamID, int taxisID, int verbose)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
{
  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;
574

Uwe Schulzweida's avatar
Uwe Schulzweida committed
575
576
577
578
579
  while ( (nrecs = streamInqTimestep(streamID, tsID)) )
    {
      vdate = taxisInqVdate(taxisID);
      vtime = taxisInqVtime(taxisID);

580
      if ( verbose || tsID < NUM_TIMESTEP )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
	{
	  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
611
612
613
614
615
616
617
      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
618
619
620
621
622
623
624
      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
625
626
    }
}
627
628
629
630
631
632
633
634
635
/*
 * Local Variables:
 * c-file-style: "Java"
 * c-basic-offset: 2
 * indent-tabs-mode: nil
 * show-trailing-whitespace: t
 * require-trailing-newline: t
 * End:
 */