1/* This is part of the netCDF package.
2   Copyright 2005 University Corporation for Atmospheric Research/Unidata
3   See COPYRIGHT file for conditions of use.
4
5   Test HDF5 file code. These are not intended to be exhaustive tests,
6   but they use HDF5 the same way that netCDF-4 does, so if these
7   tests don't work, than netCDF-4 won't work either.
8*/
9#include "h5_err_macros.h"
10#include <hdf5.h>
11#include <H5DSpublic.h>
12#include <ncdimscale.h>
13
14#define FILE_NAME "tst_h_dimscales2.h5"
15#define DIMSCALE_NAME "dimscale"
16#define VAR1_NAME "var1"
17#define NDIMS 1
18#define DIM1_LEN 3
19#define NAME_ATTRIBUTE "dimscale_name_attribute"
20#define DIMSCALE_LABEL "dimscale_label"
21#define STR_LEN 255
22
23herr_t alien_visitor(hid_t did, unsigned dimhid_t dsid,
24      void *visitor_data)
25{
26   char name1[STR_LEN];
27   H5G_stat_t statbuf;
28   HDF5_OBJID_T *objid = visitor_data;
29
30   /* This should get "/var1", the name of the dataset that the scale
31    * is attached to. */
32   if (H5Iget_name(didname1STR_LEN) < 0) ERR;
33   if (strcmp(&name1[1], VAR1_NAME)) ERR;
34
35   /* Get more info on the dimscale object.*/
36   if (H5Gget_objinfo(dsid, ".", 1, &statbuf) < 0) ERR;
37   objid->fileno[0] = statbuf.fileno[0];
38   objid->objno[0] = statbuf.objno[0];
39   objid->fileno[1] = statbuf.fileno[1];
40   objid->objno[1] = statbuf.objno[1];
41
42   return 0;
43}
44
45herr_t alien_visitor2(hid_t did, unsigned dimhid_t dsid, void *visitor_data)
46{
47   H5G_stat_t statbuf;
48   HDF5_OBJID_T *objid = visitor_data;
49
50   /* Get obj id of the dimscale object. THis will be used later to
51    * match dimensions to dimscales. */
52   if (H5Gget_objinfo(dsid, ".", 1, &statbuf) < 0) ERR;
53   objid->fileno[0] = statbuf.fileno[0];
54   objid->objno[0] = statbuf.objno[0];
55   objid->fileno[1] = statbuf.fileno[1];
56   objid->objno[1] = statbuf.objno[1];
57
58   return 0;
59}
60
61int
62main()
63{
64   printf("\n*** Checking HDF5 dimscales some more.\n");
65   printf("*** Creating a file with one var with one dimension scale...");
66
67   {
68      hid_t fileidspaceiddatasetiddimscaleidcparmsid;
69      hsize_t dims[NDIMS] = {DIM1_LEN}, maxdims[NDIMS] = {H5S_UNLIMITED};
70
71      /* Create file. */
72      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULT,
73       H5P_DEFAULT)) < 0) ERR;
74
75      /* Create the space that will be used both for the dimscale and
76       * the 1D dataset that will attach it. */
77      if ((spaceid = H5Screate_simple(NDIMSdimsmaxdims)) < 0) ERR;
78
79      /* Modify dataset creation properties, i.e. enable chunking. */
80      dims[0] = 1;
81      if ((cparmsid = H5Pcreate(H5P_DATASET_CREATE)) < 0) ERR;
82      if (H5Pset_chunk(cparmsidNDIMSdims) < 0) ERR;
83
84      /* Create our dimension scale, as an unlimited dataset. */
85      if ((dimscaleid = H5Dcreate(fileidDIMSCALE_NAMEH5T_NATIVE_INT,
86   spaceidcparmsid)) < 0) ERR;
87      if (H5DSset_scale(dimscaleidNAME_ATTRIBUTE) < 0) ERR;
88
89      /* Create a variable which uses it. */
90      if ((datasetid = H5Dcreate(fileidVAR1_NAMEH5T_NATIVE_INT,
91  spaceidcparmsid)) < 0) ERR;
92      if (H5DSattach_scale(datasetiddimscaleid, 0) < 0) ERR;
93      if (H5DSset_label(datasetid, 0, DIMSCALE_LABEL) < 0) ERR;
94
95      /* Fold up our tents. */
96      if (H5Dclose(dimscaleid) < 0 ||
97   H5Dclose(datasetid) < 0 ||
98   H5Sclose(spaceid) < 0 ||
99   H5Fclose(fileid) < 0) ERR;
100   }
101
102   SUMMARIZE_ERR;
103   printf("*** Checking that one var, one dimscale file can be read...");
104
105   {
106      hid_t fileidspaceid = 0, datasetid = 0;
107      hsize_t num_obji;
108      int obj_class;
109      char obj_name[STR_LEN + 1];
110      char dimscale_name[STR_LEN+1];
111      htri_t is_scale;
112      char label[STR_LEN+1];
113      int num_scales;
114      hsize_t dims[1], maxdims[1];
115      H5G_stat_t statbuf;
116      HDF5_OBJID_T dimscale_objvars_dimscale_obj;
117
118      /* Open the file. */
119      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDWRH5P_DEFAULT)) < 0) ERR;
120
121      /* Loop through objects in the root group. */
122      if (H5Gget_num_objs(fileid, &num_obj) < 0) ERR;
123      for (i=0; i<num_obji++)
124      {
125  /* Get the type (i.e. group, dataset, etc.), and the name of
126   * the object. */
127  if ((obj_class = H5Gget_objtype_by_idx(fileidi)) < 0) ERR;
128  if (H5Gget_objname_by_idx(fileidiobj_nameSTR_LEN) < 0) ERR;
129
130  /* Deal with object based on its obj_class. */
131  switch(obj_class)
132  {
133     case H5G_GROUP:
134        break;
135     case H5G_DATASET:
136        /* Open the dataset. */
137        if ((datasetid = H5Dopen1(fileidobj_name)) < 0) ERR;
138
139        /* This should be an unlimited dataset. */
140        if ((spaceid = H5Dget_space(datasetid)) < 0) ERR;
141        if (H5Sget_simple_extent_dims(spaceiddimsmaxdims) < 0) ERR;
142        if (maxdims[0] != H5S_UNLIMITEDERR;
143
144        /* Is this a dimscale? */
145        if ((is_scale = H5DSis_scale(datasetid)) < 0) ERR;
146        if (is_scale && strcmp(obj_nameDIMSCALE_NAME)) ERR;
147        if (is_scale)
148        {
149   /* A dimscale comes with a NAME attribute, in
150    * addition to its real name. */
151   if (H5DSget_scale_name(datasetiddimscale_nameSTR_LEN) < 0) ERR;
152   if (strcmp(dimscale_nameNAME_ATTRIBUTE)) ERR;
153
154   /* fileno and objno uniquely identify an object and a
155    * HDF5 file. */
156   if (H5Gget_objinfo(datasetid, ".", 1, &statbuf) < 0) ERR;
157   dimscale_obj.fileno[0] = statbuf.fileno[0];
158   dimscale_obj.objno[0] = statbuf.objno[0];
159   dimscale_obj.fileno[1] = statbuf.fileno[1];
160   dimscale_obj.objno[1] = statbuf.objno[1];
161        }
162        else
163        {
164   /* Here's how to get the number of scales attached
165    * to the dataset's dimension 0. */
166   if ((num_scales = H5DSget_num_scales(datasetid, 0)) < 0) ERR;
167   if (num_scales != 1) ERR;
168
169   /* Go through all dimscales for this var and learn about them. */
170   if (H5DSiterate_scales(datasetid, 0, NULLalien_visitor,
171  &vars_dimscale_obj) < 0) ERR;
172   if (vars_dimscale_obj.fileno[0] != dimscale_obj.fileno[0] ||
173       vars_dimscale_obj.objno[0] != dimscale_obj.objno[0] ||
174       vars_dimscale_obj.fileno[1] != dimscale_obj.fileno[1] ||
175       vars_dimscale_obj.objno[1] != dimscale_obj.objno[1]) ERR;
176
177   /* There's also a label for dimension 0. */
178   if (H5DSget_label(datasetid, 0, labelSTR_LEN) < 0) ERR;
179        }
180        if (H5Dclose(datasetid) < 0) ERR;
181        break;
182     case H5G_TYPE:
183        break;
184     case H5G_LINK:
185        break;
186     default:
187        printf("Unknown object class %d!", obj_class);
188  }
189      }
190
191      /* Close up the shop. */
192      if (H5Sclose(spaceid) < 0 ||
193   H5Fclose(fileid) < 0) ERR;
194   }
195
196   SUMMARIZE_ERR;
197   printf("*** Creating a file with one var with two dimension scales...");
198
199   {
200#define LAT_LEN 3
201#define LON_LEN 2
202#define DIMS_2 2
203#define LAT_NAME "lat"
204#define LON_NAME "lon"
205#define PRES_NAME "pres"
206
207      hid_t fileidlat_spaceidlon_spaceidpres_spaceid;
208      hid_t pres_datasetidlat_dimscaleidlon_dimscaleid;
209      hsize_t dims[DIMS_2];
210
211      /* Create file. */
212      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULT,
213       H5P_DEFAULT)) < 0) ERR;
214
215      /* Create the spaces that will be used for the dimscales. */
216      dims[0] = LAT_LEN;
217      if ((lat_spaceid = H5Screate_simple(1, dimsdims)) < 0) ERR;
218      dims[0] = LON_LEN;
219      if ((lon_spaceid = H5Screate_simple(1, dimsdims)) < 0) ERR;
220
221      /* Create the space for the dataset. */
222      dims[0] = LAT_LEN;
223      dims[1] = LON_LEN;
224      if ((pres_spaceid = H5Screate_simple(DIMS_2dimsdims)) < 0) ERR;
225
226      /* Create our dimension scales. */
227      if ((lat_dimscaleid = H5Dcreate(fileidLAT_NAMEH5T_NATIVE_INT,
228       lat_spaceidH5P_DEFAULT)) < 0) ERR;
229      if (H5DSset_scale(lat_dimscaleidNULL) < 0) ERR;
230      if ((lon_dimscaleid = H5Dcreate(fileidLON_NAMEH5T_NATIVE_INT,
231       lon_spaceidH5P_DEFAULT)) < 0) ERR;
232      if (H5DSset_scale(lon_dimscaleidNULL) < 0) ERR;
233
234      /* Create a variable which uses these two dimscales. */
235      if ((pres_datasetid = H5Dcreate(fileidPRES_NAMEH5T_NATIVE_FLOAT,
236       pres_spaceidH5P_DEFAULT)) < 0) ERR;
237      if (H5DSattach_scale(pres_datasetidlat_dimscaleid, 0) < 0) ERR;
238      if (H5DSattach_scale(pres_datasetidlon_dimscaleid, 1) < 0) ERR;
239
240      /* Fold up our tents. */
241      if (H5Dclose(lat_dimscaleid) < 0 ||
242   H5Dclose(lon_dimscaleid) < 0 ||
243   H5Dclose(pres_datasetid) < 0 ||
244   H5Sclose(lat_spaceid) < 0 ||
245   H5Sclose(lon_spaceid) < 0 ||
246   H5Sclose(pres_spaceid) < 0 ||
247   H5Fclose(fileid) < 0) ERR;
248   }
249
250   SUMMARIZE_ERR;
251   printf("*** Checking that one var, two dimscales file can be read...");
252
253   {
254#define NDIMS2 2
255      hid_t fileidspaceid = 0, datasetid = 0;
256      hsize_t num_obji;
257      int obj_class;
258      char obj_name[STR_LEN + 1];
259      htri_t is_scale;
260      int num_scales;
261      hsize_t dims[NDIMS2], maxdims[NDIMS2];
262      H5G_stat_t statbuf;
263      HDF5_OBJID_T dimscale_obj[2], vars_dimscale_obj[2];
264      int dimscale_cnt = 0;
265      int dndims;
266
267      /* Open the file. */
268      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDWRH5P_DEFAULT)) < 0) ERR;
269
270      /* Loop through objects in the root group. */
271      if (H5Gget_num_objs(fileid, &num_obj) < 0) ERR;
272      for (i=0; i<num_obji++)
273      {
274  /* Get the type (i.e. group, dataset, etc.), and the name of
275   * the object. */
276  if ((obj_class = H5Gget_objtype_by_idx(fileidi)) < 0) ERR;
277  if (H5Gget_objname_by_idx(fileidiobj_nameSTR_LEN) < 0) ERR;
278
279  /* Deal with object based on its obj_class. */
280  switch(obj_class)
281  {
282     case H5G_GROUP:
283        break;
284     case H5G_DATASET:
285        /* Open the dataset. */
286        if ((datasetid = H5Dopen1(fileidobj_name)) < 0) ERR;
287
288        /* Get space info. */
289        if ((spaceid = H5Dget_space(datasetid)) < 0) ERR;
290        if (H5Sget_simple_extent_dims(spaceiddimsmaxdims) < 0) ERR;
291        if ((ndims = H5Sget_simple_extent_ndims(spaceid)) < 0) ERR;
292        if (ndims > NDIMS2ERR;
293
294        /* Is this a dimscale? */
295        if ((is_scale = H5DSis_scale(datasetid)) < 0) ERR;
296        if (is_scale)
297        {
298   /* fileno and objno uniquely identify an object and a
299    * HDF5 file. */
300   if (H5Gget_objinfo(datasetid, ".", 1, &statbuf) < 0) ERR;
301   dimscale_obj[dimscale_cnt].fileno[0] = statbuf.fileno[0];
302   dimscale_obj[dimscale_cnt].objno[0] = statbuf.objno[0];
303   dimscale_obj[dimscale_cnt].fileno[1] = statbuf.fileno[1];
304   dimscale_obj[dimscale_cnt].objno[1] = statbuf.objno[1];
305   dimscale_cnt++;
306        }
307        else
308        {
309   /* Here's how to get the number of scales attached
310    * to the dataset's dimension 0 and 1. */
311   if ((num_scales = H5DSget_num_scales(datasetid, 0)) < 0) ERR;
312   if (num_scales != 1) ERR;
313   if ((num_scales = H5DSget_num_scales(datasetid, 1)) < 0) ERR;
314   if (num_scales != 1) ERR;
315
316   /* Go through all dimscales for this var and learn about them. */
317   for (d = 0; d < ndimsd++)
318   {
319      if (H5DSiterate_scales(datasetiddNULLalien_visitor2,
320      &(vars_dimscale_obj[d])) < 0) ERR;
321
322      /* Verify that the object ids passed from the
323       * alien_visitor2 function match the ones we found
324       * for the lat and lon datasets. */
325      if (vars_dimscale_obj[d].fileno[0] != dimscale_obj[d].fileno[0] ||
326      vars_dimscale_obj[d].objno[0] != dimscale_obj[d].objno[0]) ERR;
327      if (vars_dimscale_obj[d].fileno[1] != dimscale_obj[d].fileno[1] ||
328      vars_dimscale_obj[d].objno[1] != dimscale_obj[d].objno[1]) ERR;
329   }
330        }
331        if (H5Dclose(datasetid) < 0) ERR;
332        if (H5Sclose(spaceid) < 0) ERR;
333        break;
334     case H5G_TYPE:
335        break;
336     case H5G_LINK:
337        break;
338     default:
339        printf("Unknown object class %d!", obj_class);
340  }
341      }
342
343      /* Close up the shop. */
344      if (H5Fclose(fileid) < 0) ERR;
345   }
346   SUMMARIZE_ERR;
347   printf("*** Creating a file with one var with two unlimited dimension scales...");
348   {
349#define U1_LEN 3
350#define U2_LEN 2
351#define DIMS2 2
352#define U1_NAME "u1"
353#define U2_NAME "u2"
354#define VNAME "v1"
355
356      hid_t fapl_idfcpl_idgrpidplistidplistid2;
357      hid_t fileidlat_spaceidlon_spaceidpres_spaceid;
358      hid_t pres_datasetidlat_dimscaleidlon_dimscaleid;
359      hsize_t dims[DIMS2], maxdims[DIMS2], chunksize[DIMS2] = {10, 10};
360      hid_t spaceid = 0, datasetid = 0;
361      hsize_t num_obji;
362      int obj_class;
363      char obj_name[STR_LEN + 1];
364      htri_t is_scale;
365      int num_scales;
366      H5G_stat_t statbuf;
367      HDF5_OBJID_T dimscale_obj[2], vars_dimscale_obj[2];
368      int dimscale_cnt = 0;
369      int dndims;
370
371      /* Create file access and create property lists. */
372      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
373      if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
374
375      /* Set latest_format in access propertly list. This ensures that
376       * the latest, greatest, HDF5 versions are used in the file. */
377      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
378
379      /* Set H5P_CRT_ORDER_TRACKED in the creation property list. This
380       * turns on HDF5 creation ordering in the file. */
381      if (H5Pset_link_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
382        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
383      if (H5Pset_attr_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
384        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
385
386      /* Create file. */
387      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcpl_idfapl_id)) < 0) ERR;
388
389      /* Open the root group. */
390      if ((grpid = H5Gopen2(fileid, "/", H5P_DEFAULT)) < 0) ERR;
391
392      /* Create the spaces that will be used for the dimscales. */
393      dims[0] = 0;
394      maxdims[0] = H5S_UNLIMITED;
395      if ((lat_spaceid = H5Screate_simple(1, dimsmaxdims)) < 0) ERR;
396      if ((lon_spaceid = H5Screate_simple(1, dimsmaxdims)) < 0) ERR;
397
398      /* Create the space for the dataset. */
399      dims[0] = 0;
400      dims[1] = 0;
401      maxdims[0] = H5S_UNLIMITED;
402      maxdims[1] = H5S_UNLIMITED;
403      if ((pres_spaceid = H5Screate_simple(DIMS2dimsmaxdims)) < 0) ERR;
404
405      /* Set up the dataset creation property list for the two dimensions. */
406      if ((plistid = H5Pcreate(H5P_DATASET_CREATE)) < 0) ERR;
407      if (H5Pset_chunk(plistid, 1, chunksize) < 0) ERR;
408      if (H5Pset_attr_creation_order(plistidH5P_CRT_ORDER_TRACKED|
409      H5P_CRT_ORDER_INDEXED) < 0) ERR;
410
411      /* Create our dimension scales. */
412      if ((lat_dimscaleid = H5Dcreate(grpidU1_NAMEH5T_NATIVE_INT,
413       lat_spaceidplistid)) < 0) ERR;
414      if (H5DSset_scale(lat_dimscaleidNULL) < 0) ERR;
415      if ((lon_dimscaleid = H5Dcreate(grpidU2_NAMEH5T_NATIVE_INT,
416       lon_spaceidplistid)) < 0) ERR;
417      if (H5DSset_scale(lon_dimscaleidNULL) < 0) ERR;
418
419      /* Set up the dataset creation property list for the variable. */
420      if ((plistid2 = H5Pcreate(H5P_DATASET_CREATE)) < 0) ERR;
421      if (H5Pset_chunk(plistid2DIMS2chunksize) < 0) ERR;
422      if (H5Pset_attr_creation_order(plistid2H5P_CRT_ORDER_TRACKED|
423      H5P_CRT_ORDER_INDEXED) < 0) ERR;
424
425      /* Create a variable which uses these two dimscales. */
426      if ((pres_datasetid = H5Dcreate(grpidVNAMEH5T_NATIVE_DOUBLEpres_spaceid,
427       plistid2)) < 0) ERR;
428      if (H5DSattach_scale(pres_datasetidlat_dimscaleid, 0) < 0) ERR;
429      if (H5DSattach_scale(pres_datasetidlon_dimscaleid, 1) < 0) ERR;
430
431      /* Close down the show. */
432      if (H5Pclose(fapl_id) < 0 ||
433   H5Pclose(fcpl_id) < 0 ||
434   H5Dclose(lat_dimscaleid) < 0 ||
435   H5Dclose(lon_dimscaleid) < 0 ||
436   H5Dclose(pres_datasetid) < 0 ||
437   H5Sclose(lat_spaceid) < 0 ||
438   H5Sclose(lon_spaceid) < 0 ||
439   H5Sclose(pres_spaceid) < 0 ||
440   H5Pclose(plistid) < 0 ||
441   H5Pclose(plistid2) < 0 ||
442   H5Gclose(grpid) < 0 ||
443   H5Fclose(fileid) < 0) ERR;
444
445      /* Open the file. */
446      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDWRH5P_DEFAULT)) < 0) ERR;
447      if ((grpid = H5Gopen2(fileid, "/", H5P_DEFAULT)) < 0) ERR;
448
449      /* Loop through objects in the root group. */
450      if (H5Gget_num_objs(grpid, &num_obj) < 0) ERR;
451
452      for (i = 0; i < num_obji++)
453      {
454  /*Get the type (i.e. group, dataset, etc.), and the name of
455    the object. */
456  if ((obj_class = H5Gget_objtype_by_idx(grpidi)) < 0) ERR;
457  if (H5Gget_objname_by_idx(grpidiobj_nameSTR_LEN) < 0) ERR;
458
459  /* Deal with object based on its obj_class. */
460  switch(obj_class)
461  {
462     case H5G_GROUP:
463        break;
464     case H5G_DATASET:
465        /* Open the dataset. */
466        if ((datasetid = H5Dopen1(grpidobj_name)) < 0) ERR;
467
468        /* Get space info. */
469        if ((spaceid = H5Dget_space(datasetid)) < 0) ERR;
470        if (H5Sget_simple_extent_dims(spaceiddimsmaxdims) < 0) ERR;
471        if ((ndims = H5Sget_simple_extent_ndims(spaceid)) < 0) ERR;
472
473        /* Is this a dimscale? */
474        if ((is_scale = H5DSis_scale(datasetid)) < 0) ERR;
475        if (is_scale)
476        {
477   /* fileno and objno uniquely identify an object and a
478    * HDF5 file. */
479   if (H5Gget_objinfo(datasetid, ".", 1, &statbuf) < 0) ERR;
480   dimscale_obj[dimscale_cnt].fileno[0] = statbuf.fileno[0];
481   dimscale_obj[dimscale_cnt].objno[0] = statbuf.objno[0];
482   dimscale_obj[dimscale_cnt].fileno[1] = statbuf.fileno[1];
483   dimscale_obj[dimscale_cnt].objno[1] = statbuf.objno[1];
484   dimscale_cnt++;
485        }
486        else
487        {
488   /* Here's how to get the number of scales attached
489    * to the dataset's dimension 0 and 1. */
490   if ((num_scales = H5DSget_num_scales(datasetid, 0)) < 0) ERR;
491   if (num_scales != 1) ERR;
492   if ((num_scales = H5DSget_num_scales(datasetid, 1)) < 0) ERR;
493   if (num_scales != 1) ERR;
494
495   /* Go through all dimscales for this var and learn about them. */
496   for (d = 0; d < ndimsd++)
497   {
498      if (H5DSiterate_scales(datasetiddNULLalien_visitor2,
499     &(vars_dimscale_obj[d])) < 0) ERR;
500
501      /* Verify that the object ids passed from the
502       * alien_visitor2 function match the ones we found
503       * for the lat and lon datasets. */
504      if (vars_dimscale_obj[d].fileno[0] != dimscale_obj[d].fileno[0] ||
505  vars_dimscale_obj[d].objno[0] != dimscale_obj[d].objno[0]) ERR;
506      if (vars_dimscale_obj[d].fileno[1] != dimscale_obj[d].fileno[1] ||
507  vars_dimscale_obj[d].objno[1] != dimscale_obj[d].objno[1]) ERR;
508   }
509
510        }
511
512        if (H5Dclose(datasetid) < 0) ERR;
513        break;
514     case H5G_TYPE:
515        break;
516     case H5G_LINK:
517        break;
518     default:
519        printf("Unknown object class %d!", obj_class);
520  }
521     }
522
523      /* Check the dimension lengths. */
524      {
525  hid_t spaceid1;
526  hsize_t h5dimlen[DIMS2], h5dimlenmax[DIMS2];
527  int dataset_ndims;
528
529  /* Check U1. */
530  if ((datasetid = H5Dopen1(grpidU1_NAME)) < 0) ERR;
531  if ((spaceid1 = H5Dget_space(datasetid)) < 0) ERR;
532  if ((dataset_ndims = H5Sget_simple_extent_dims(spaceid1h5dimlen,
533 h5dimlenmax)) < 0) ERR;
534  if (dataset_ndims != 1 || h5dimlen[0] != 0 || h5dimlenmax[0] != H5S_UNLIMITEDERR;
535  if (H5Dclose(datasetid) ||
536      H5Sclose(spaceid1)) ERR;
537
538  /* Check U2. */
539  if ((datasetid = H5Dopen1(grpidU2_NAME)) < 0) ERR;
540  if ((spaceid1 = H5Dget_space(datasetid)) < 0) ERR;
541  if ((dataset_ndims = H5Sget_simple_extent_dims(spaceid1h5dimlen,
542 h5dimlenmax)) < 0) ERR;
543  if (dataset_ndims != 1 || h5dimlen[0] != 0 || h5dimlenmax[0] != H5S_UNLIMITEDERR;
544  if (H5Dclose(datasetid) ||
545      H5Sclose(spaceid1)) ERR;
546
547  /* Check V1. */
548  if ((datasetid = H5Dopen1(grpidVNAME)) < 0) ERR;
549  if ((spaceid1 = H5Dget_space(datasetid)) < 0) ERR;
550  if ((dataset_ndims = H5Sget_simple_extent_dims(spaceid1h5dimlen,
551 h5dimlenmax)) < 0) ERR;
552  if (dataset_ndims != 2 || h5dimlen[0] != 0 || h5dimlen[1] != 0 ||
553      h5dimlenmax[0] != H5S_UNLIMITED || h5dimlenmax[1] != H5S_UNLIMITEDERR;
554
555  /* All done. */
556  if (H5Dclose(datasetid) ||
557      H5Sclose(spaceid1)) ERR;
558      }
559
560      /* Write two hyperslabs. */
561      {
562#define NUM_VALS 3
563  hid_t file_spaceidmem_spaceid;
564  hsize_t h5dimlen[DIMS2], h5dimlenmax[DIMS2], xtend_size[DIMS2] = {1, NUM_VALS};
565  hsize_t start[DIMS2] = {0, 0};
566  hsize_t count[DIMS2] = {1, NUM_VALS};
567  double value[NUM_VALS];
568  int dataset_ndims;
569  int i;
570
571  /* Set up phony data. */
572  for (i = 0; i < NUM_VALSi++)
573     value[i] = (float)i;
574
575  /* Open the dataset, check its dimlens. */
576  if ((datasetid = H5Dopen1(grpidVNAME)) < 0) ERR;
577  if ((file_spaceid = H5Dget_space(datasetid)) < 0) ERR;
578  if ((dataset_ndims = H5Sget_simple_extent_dims(file_spaceidh5dimlen,
579 h5dimlenmax)) < 0) ERR;
580  if (dataset_ndims != 2 || h5dimlen[0] != 0 || h5dimlen[1] != 0 ||
581      h5dimlenmax[0] != H5S_UNLIMITED || h5dimlenmax[1] != H5S_UNLIMITEDERR;
582
583  /* Extend the size of the dataset. */
584  if (H5Dextend(datasetidxtend_size) < 0) ERR;
585  if ((file_spaceid = H5Dget_space(datasetid)) < 0) ERR;
586
587  /* Check the size. */
588  if ((dataset_ndims = H5Sget_simple_extent_dims(file_spaceidh5dimlen,
589 h5dimlenmax)) < 0) ERR;
590  if (dataset_ndims != 2 || h5dimlen[0] != 1 || h5dimlen[1] != NUM_VALS ||
591      h5dimlenmax[0] != H5S_UNLIMITED || h5dimlenmax[1] != H5S_UNLIMITEDERR;
592
593  /* Set up the file and memory spaces. */
594  if (H5Sselect_hyperslab(file_spaceidH5S_SELECT_SET,
595  startNULLcountNULL) < 0) ERR;
596  if ((mem_spaceid = H5Screate_simple(DIMS2countNULL)) < 0) ERR;
597
598  /* Write a slice of data. */
599  if (H5Dwrite(datasetidH5T_NATIVE_DOUBLEmem_spaceidfile_spaceid,
600       H5P_DEFAULTvalue) < 0)
601
602  /* Check the size. */
603  if ((file_spaceid = H5Dget_space(datasetid)) < 0) ERR;
604  if ((dataset_ndims = H5Sget_simple_extent_dims(file_spaceidh5dimlen,
605 h5dimlenmax)) < 0) ERR;
606  if (dataset_ndims != 2 || h5dimlen[0] != 1 || h5dimlen[1] != NUM_VALS ||
607      h5dimlenmax[0] != H5S_UNLIMITED || h5dimlenmax[1] != H5S_UNLIMITEDERR;
608
609  /* Extend the size of the dataset for the second slice. */
610  xtend_size[0]++;
611  if (H5Dextend(datasetidxtend_size) < 0) ERR;
612  if ((file_spaceid = H5Dget_space(datasetid)) < 0) ERR;
613
614  /* Set up the file and memory spaces for a second slice. */
615  start[0]++;
616  if (H5Sselect_hyperslab(file_spaceidH5S_SELECT_SET,
617  startNULLcountNULL) < 0) ERR;
618  if ((mem_spaceid = H5Screate_simple(DIMS2countNULL)) < 0) ERR;
619
620  /* Write a second slice of data. */
621  if (H5Dwrite(datasetidH5T_NATIVE_DOUBLEmem_spaceidfile_spaceid,
622       H5P_DEFAULTvalue) < 0)
623
624  /* Check the size again. */
625  if ((file_spaceid = H5Dget_space(datasetid)) < 0) ERR;
626  if ((dataset_ndims = H5Sget_simple_extent_dims(file_spaceidh5dimlen,
627 h5dimlenmax)) < 0) ERR;
628  if (dataset_ndims != 2 || h5dimlen[0] != 2 || h5dimlen[1] != NUM_VALS ||
629      h5dimlenmax[0] != H5S_UNLIMITED || h5dimlenmax[1] != H5S_UNLIMITEDERR;
630
631  /* All done. */
632  if (H5Dclose(datasetid) ||
633      H5Sclose(mem_spaceid) ||
634      H5Sclose(file_spaceid)) ERR;
635      }
636
637      /* Close up the shop. */
638      if (H5Sclose(spaceid)) ERR;
639      if (H5Gclose(grpid) < 0 ||
640      H5Fclose(fileid) < 0) ERR;
641   }
642   SUMMARIZE_ERR;
643   printf("*** Checking dimension scales with attached dimension scales...");
644
645   {
646#define LAT_LEN 3
647#define LON_LEN 2
648#define TIME_LEN 5
649#define LEN_LEN 10
650#define DIMS_3 3
651#define NUM_DIMSCALES1 4
652#define LAT_NAME "lat"
653#define LON_NAME "lon"
654#define PRES_NAME1 "z_pres"
655#define TIME_NAME "time"
656#define LEN_NAME "u_len"
657
658      hid_t fileidlat_spaceidlon_spaceidtime_spaceidpres_spaceidlen_spaceid;
659      hid_t pres_datasetidlat_dimscaleidlon_dimscaleidtime_dimscaleidlen_dimscaleid;
660      hid_t fapl_idfcpl_id;
661      hsize_t dims[DIMS_3];
662      hid_t spaceid = 0, datasetid = 0;
663      hsize_t num_obji;
664      int obj_class;
665      char obj_name[STR_LEN + 1];
666      htri_t is_scale;
667      int num_scales;
668      hsize_t maxdims[DIMS_3];
669      H5G_stat_t statbuf;
670      HDF5_OBJID_T dimscale_obj[NUM_DIMSCALES1], vars_dimscale_obj[NUM_DIMSCALES1];
671      int dimscale_cnt = 0;
672      int dndims;
673
674      /* Create file access and create property lists. */
675      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
676      if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
677
678      /* Set latest_format in access propertly list. This ensures that
679       * the latest, greatest, HDF5 versions are used in the file. */
680      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
681
682      /* Set H5P_CRT_ORDER_TRACKED in the creation property list. This
683       * turns on HDF5 creation ordering in the file. */
684      if (H5Pset_link_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
685        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
686      if (H5Pset_attr_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
687        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
688
689      /* Create file. */
690      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcpl_idfapl_id)) < 0) ERR;
691
692      /* Create the spaces that will be used for the dimscales. */
693      dims[0] = LAT_LEN;
694      if ((lat_spaceid = H5Screate_simple(1, dimsdims)) < 0) ERR;
695      dims[0] = LON_LEN;
696      if ((lon_spaceid = H5Screate_simple(1, dimsdims)) < 0) ERR;
697      dims[0] = TIME_LEN;
698      if ((time_spaceid = H5Screate_simple(1, dimsdims)) < 0) ERR;
699      dims[0] = LEN_LEN;
700      if ((len_spaceid = H5Screate_simple(1, dimsdims)) < 0) ERR;
701
702      /* Create the space for the dataset. */
703      dims[0] = LAT_LEN;
704      dims[1] = LON_LEN;
705      dims[2] = TIME_LEN;
706      if ((pres_spaceid = H5Screate_simple(DIMS_3dimsdims)) < 0) ERR;
707
708      /* Create our dimension scales. */
709      if ((lat_dimscaleid = H5Dcreate1(fileidLAT_NAMEH5T_NATIVE_INT,
710       lat_spaceidH5P_DEFAULT)) < 0) ERR;
711      if (H5DSset_scale(lat_dimscaleidNULL) < 0) ERR;
712      if ((lon_dimscaleid = H5Dcreate1(fileidLON_NAMEH5T_NATIVE_INT,
713       lon_spaceidH5P_DEFAULT)) < 0) ERR;
714      if (H5DSset_scale(lon_dimscaleidNULL) < 0) ERR;
715      if ((time_dimscaleid = H5Dcreate1(fileidTIME_NAMEH5T_NATIVE_INT,
716       time_spaceidH5P_DEFAULT)) < 0) ERR;
717      if (H5DSset_scale(time_dimscaleidNULL) < 0) ERR;
718      if ((len_dimscaleid = H5Dcreate1(fileidLEN_NAMEH5T_NATIVE_INT,
719       len_spaceidH5P_DEFAULT)) < 0) ERR;
720      if (H5DSset_scale(len_dimscaleidNULL) < 0) ERR;
721
722      /* Create a variable which uses these three dimscales. */
723      if ((pres_datasetid = H5Dcreate1(fileidPRES_NAME1H5T_NATIVE_FLOAT,
724       pres_spaceidH5P_DEFAULT)) < 0) ERR;
725      if (H5DSattach_scale(pres_datasetidlat_dimscaleid, 0) < 0) ERR;
726      if (H5DSattach_scale(pres_datasetidlon_dimscaleid, 1) < 0) ERR;
727      if (H5DSattach_scale(pres_datasetidtime_dimscaleid, 2) < 0) ERR;
728
729      /* Attach a dimscale to a dimscale. Unfortunately, HDF5 does not
730       * allow this. Woe is me. */
731      /*if (H5DSattach_scale(time_dimscaleid, len_dimscaleid, 0) < 0) ERR;*/
732
733      /* Fold up our tents. */
734      if (H5Dclose(lat_dimscaleid) < 0 ||
735   H5Dclose(lon_dimscaleid) < 0 ||
736   H5Dclose(time_dimscaleid) < 0 ||
737   H5Dclose(len_dimscaleid) < 0 ||
738   H5Dclose(pres_datasetid) < 0 ||
739   H5Sclose(lat_spaceid) < 0 ||
740   H5Sclose(lon_spaceid) < 0 ||
741   H5Sclose(time_spaceid) < 0 ||
742   H5Sclose(pres_spaceid) < 0 ||
743   H5Sclose(len_spaceid) < 0 ||
744   H5Pclose(fapl_id) < 0 ||
745   H5Pclose(fcpl_id) < 0 ||
746   H5Fclose(fileid) < 0) ERR;
747
748      /* Open the file. */
749      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDWRH5P_DEFAULT)) < 0) ERR;
750
751      /* Loop through objects in the root group. */
752      if (H5Gget_num_objs(fileid, &num_obj) < 0) ERR;
753      for (i=0; i<num_obji++)
754      {
755  /* Get the type (i.e. group, dataset, etc.), and the name of
756   * the object. */
757  if ((obj_class = H5Gget_objtype_by_idx(fileidi)) < 0) ERR;
758  if (H5Gget_objname_by_idx(fileidiobj_nameSTR_LEN) < 0) ERR;
759
760  /* Deal with object based on its obj_class. */
761  switch(obj_class)
762  {
763     case H5G_GROUP:
764        break;
765     case H5G_DATASET:
766        /* Open the dataset. */
767        if ((datasetid = H5Dopen1(fileidobj_name)) < 0) ERR;
768
769        /* Get space info. */
770        if ((spaceid = H5Dget_space(datasetid)) < 0) ERR;
771        if (H5Sget_simple_extent_dims(spaceiddimsmaxdims) < 0) ERR;
772        if ((ndims = H5Sget_simple_extent_ndims(spaceid)) < 0) ERR;
773
774        /* Is this a dimscale? */
775        if ((is_scale = H5DSis_scale(datasetid)) < 0) ERR;
776        if (is_scale)
777        {
778   /* fileno and objno uniquely identify an object and a
779    * HDF5 file. */
780   if (H5Gget_objinfo(datasetid, ".", 1, &statbuf) < 0) ERR;
781   dimscale_obj[dimscale_cnt].fileno[0] = statbuf.fileno[0];
782   dimscale_obj[dimscale_cnt].objno[0] = statbuf.objno[0];
783   dimscale_obj[dimscale_cnt].fileno[1] = statbuf.fileno[1];
784   dimscale_obj[dimscale_cnt].objno[1] = statbuf.objno[1];
785   dimscale_cnt++;
786        }
787        else
788        {
789   /* Here's how to get the number of scales attached
790    * to the dataset's dimension 0 and 1. */
791   if ((num_scales = H5DSget_num_scales(datasetid, 0)) < 0) ERR;
792   if (num_scales != 1) ERR;
793   if ((num_scales = H5DSget_num_scales(datasetid, 1)) < 0) ERR;
794   if (num_scales != 1) ERR;
795
796   /* Go through all dimscales for this var and learn about them. */
797   for (d = 0; d < ndimsd++)
798   {
799      if (H5DSiterate_scales(datasetiddNULLalien_visitor2,
800      &(vars_dimscale_obj[d])) < 0) ERR;
801
802      /* Verify that the object ids passed from the
803       * alien_visitor2 function match the ones we found
804       * for the lat and lon datasets. */
805      if (vars_dimscale_obj[d].fileno[0] != dimscale_obj[d].fileno[0] ||
806      vars_dimscale_obj[d].objno[0] != dimscale_obj[d].objno[0]) ERR;
807      if (vars_dimscale_obj[d].fileno[1] != dimscale_obj[d].fileno[1] ||
808      vars_dimscale_obj[d].objno[1] != dimscale_obj[d].objno[1]) ERR;
809   }
810        }
811        if (H5Dclose(datasetid) < 0) ERR;
812        if (H5Sclose(spaceid) < 0) ERR;
813        break;
814     case H5G_TYPE:
815        break;
816     case H5G_LINK:
817        break;
818     default:
819        printf("Unknown object class %d!", obj_class);
820  }
821      }
822
823      /* Close up the shop. */
824      if (H5Fclose(fileid) < 0) ERR;
825   }
826
827   SUMMARIZE_ERR;
828   printf("*** Checking cration ordering of datasets which are also dimension scales...");
829
830   {
831#define LAT_LEN 3
832#define LON_LEN 2
833#define TIME_LEN 5
834#define LEN_LEN 10
835#define DIMS_3 3
836#define NUM_DIMSCALES2 4
837#define LAT_NAME "lat"
838#define LON_NAME "lon"
839#define PRES_NAME1 "z_pres"
840#define TIME_NAME "time"
841#define LEN_NAME "u_len"
842
843      hid_t fileidlat_spaceidlon_spaceidtime_spaceidpres_spaceidlen_spaceid;
844      hid_t pres_datasetidlat_dimscaleidlon_dimscaleidtime_dimscaleidlen_dimscaleid;
845      hid_t fapl_idfcpl_id;
846      hsize_t dims[DIMS_3];
847      hid_t spaceid = 0, datasetid = 0;
848      hsize_t num_obji;
849      int obj_class;
850      char obj_name[STR_LEN + 1];
851      htri_t is_scale;
852      int num_scales;
853      hsize_t maxdims[DIMS_3];
854      H5G_stat_t statbuf;
855      HDF5_OBJID_T dimscale_obj[NUM_DIMSCALES2], vars_dimscale_obj[NUM_DIMSCALES2];
856      int dimscale_cnt = 0;
857      int dndims;
858
859      /* Create file access and create property lists. */
860      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
861      if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
862
863      /* Set latest_format in access propertly list. This ensures that
864       * the latest, greatest, HDF5 versions are used in the file. */
865      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
866
867      /* Set H5P_CRT_ORDER_TRACKED in the creation property list. This
868       * turns on HDF5 creation ordering in the file. */
869      if (H5Pset_link_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
870        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
871      if (H5Pset_attr_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
872        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
873
874      /* Create file. */
875      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcpl_idfapl_id)) < 0) ERR;
876
877      /* Create the spaces that will be used for the dimscales. */
878      dims[0] = LAT_LEN;
879      if ((lat_spaceid = H5Screate_simple(1, dimsdims)) < 0) ERR;
880      dims[0] = LON_LEN;
881      if ((lon_spaceid = H5Screate_simple(1, dimsdims)) < 0) ERR;
882      dims[0] = TIME_LEN;
883      if ((time_spaceid = H5Screate_simple(1, dimsdims)) < 0) ERR;
884      dims[0] = LEN_LEN;
885      if ((len_spaceid = H5Screate_simple(1, dimsdims)) < 0) ERR;
886
887      /* Create the space for the dataset. */
888      dims[0] = LAT_LEN;
889      dims[1] = LON_LEN;
890      dims[2] = TIME_LEN;
891      if ((pres_spaceid = H5Screate_simple(DIMS_3dimsdims)) < 0) ERR;
892
893      /* Create our dimension scales. */
894      if ((lat_dimscaleid = H5Dcreate1(fileidLAT_NAMEH5T_NATIVE_INT,
895       lat_spaceidH5P_DEFAULT)) < 0) ERR;
896      if (H5DSset_scale(lat_dimscaleidNULL) < 0) ERR;
897      if ((lon_dimscaleid = H5Dcreate1(fileidLON_NAMEH5T_NATIVE_INT,
898       lon_spaceidH5P_DEFAULT)) < 0) ERR;
899      if (H5DSset_scale(lon_dimscaleidNULL) < 0) ERR;
900      if ((time_dimscaleid = H5Dcreate1(fileidTIME_NAMEH5T_NATIVE_INT,
901       time_spaceidH5P_DEFAULT)) < 0) ERR;
902      if (H5DSset_scale(time_dimscaleidNULL) < 0) ERR;
903      if ((len_dimscaleid = H5Dcreate1(fileidLEN_NAMEH5T_NATIVE_INT,
904       len_spaceidH5P_DEFAULT)) < 0) ERR;
905      if (H5DSset_scale(len_dimscaleidNULL) < 0) ERR;
906
907      /* Create a variable which uses these three dimscales. */
908      if ((pres_datasetid = H5Dcreate1(fileidPRES_NAME1H5T_NATIVE_FLOAT,
909       pres_spaceidH5P_DEFAULT)) < 0) ERR;
910      if (H5DSattach_scale(pres_datasetidlat_dimscaleid, 0) < 0) ERR;
911      if (H5DSattach_scale(pres_datasetidlon_dimscaleid, 1) < 0) ERR;
912      if (H5DSattach_scale(pres_datasetidtime_dimscaleid, 2) < 0) ERR;
913
914      /* Attach a dimscale to a dimscale. Unfortunately, HDF5 does not
915       * allow this. Woe is me. */
916      /*if (H5DSattach_scale(time_dimscaleid, len_dimscaleid, 0) < 0) ERR;*/
917
918      /* Fold up our tents. */
919      if (H5Dclose(lat_dimscaleid) < 0 ||
920   H5Dclose(lon_dimscaleid) < 0 ||
921   H5Dclose(time_dimscaleid) < 0 ||
922   H5Dclose(len_dimscaleid) < 0 ||
923   H5Dclose(pres_datasetid) < 0 ||
924   H5Sclose(lat_spaceid) < 0 ||
925   H5Sclose(lon_spaceid) < 0 ||
926   H5Sclose(time_spaceid) < 0 ||
927   H5Sclose(pres_spaceid) < 0 ||
928   H5Sclose(len_spaceid) < 0 ||
929   H5Pclose(fapl_id) < 0 ||
930   H5Pclose(fcpl_id) < 0 ||
931   H5Fclose(fileid) < 0) ERR;
932
933      /* Open the file. */
934      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDWRH5P_DEFAULT)) < 0) ERR;
935
936      /* Loop through objects in the root group. */
937      if (H5Gget_num_objs(fileid, &num_obj) < 0) ERR;
938      for (i=0; i<num_obji++)
939      {
940  /* Get the type (i.e. group, dataset, etc.), and the name of
941   * the object. */
942  if ((obj_class = H5Gget_objtype_by_idx(fileidi)) < 0) ERR;
943  if (H5Gget_objname_by_idx(fileidiobj_nameSTR_LEN) < 0) ERR;
944
945  /* Deal with object based on its obj_class. */
946  switch(obj_class)
947  {
948     case H5G_GROUP:
949        break;
950     case H5G_DATASET:
951        /* Open the dataset. */
952        if ((datasetid = H5Dopen1(fileidobj_name)) < 0) ERR;
953
954        /* Get space info. */
955        if ((spaceid = H5Dget_space(datasetid)) < 0) ERR;
956        if (H5Sget_simple_extent_dims(spaceiddimsmaxdims) < 0) ERR;
957        if ((ndims = H5Sget_simple_extent_ndims(spaceid)) < 0) ERR;
958
959        /* Is this a dimscale? */
960        if ((is_scale = H5DSis_scale(datasetid)) < 0) ERR;
961        if (is_scale)
962        {
963   /* fileno and objno uniquely identify an object and a
964    * HDF5 file. */
965   if (H5Gget_objinfo(datasetid, ".", 1, &statbuf) < 0) ERR;
966   dimscale_obj[dimscale_cnt].fileno[0] = statbuf.fileno[0];
967   dimscale_obj[dimscale_cnt].objno[0] = statbuf.objno[0];
968   dimscale_obj[dimscale_cnt].fileno[1] = statbuf.fileno[1];
969   dimscale_obj[dimscale_cnt].objno[1] = statbuf.objno[1];
970   dimscale_cnt++;
971        }
972        else
973        {
974   /* Here's how to get the number of scales attached
975    * to the dataset's dimension 0 and 1. */
976   if ((num_scales = H5DSget_num_scales(datasetid, 0)) < 0) ERR;
977   if (num_scales != 1) ERR;
978   if ((num_scales = H5DSget_num_scales(datasetid, 1)) < 0) ERR;
979   if (num_scales != 1) ERR;
980
981   /* Go through all dimscales for this var and learn about them. */
982   for (d = 0; d < ndimsd++)
983   {
984      if (H5DSiterate_scales(datasetiddNULLalien_visitor2,
985      &(vars_dimscale_obj[d])) < 0) ERR;
986
987      /* Verify that the object ids passed from the
988       * alien_visitor2 function match the ones we found
989       * for the lat and lon datasets. */
990      if (vars_dimscale_obj[d].fileno[0] != dimscale_obj[d].fileno[0] ||
991      vars_dimscale_obj[d].objno[0] != dimscale_obj[d].objno[0]) ERR;
992      if (vars_dimscale_obj[d].fileno[1] != dimscale_obj[d].fileno[1] ||
993      vars_dimscale_obj[d].objno[1] != dimscale_obj[d].objno[1]) ERR;
994   }
995        }
996        if (H5Dclose(datasetid) < 0) ERR;
997        if (H5Sclose(spaceid) < 0) ERR;
998        break;
999     case H5G_TYPE:
1000        break;
1001     case H5G_LINK:
1002        break;
1003     default:
1004        printf("Unknown object class %d!", obj_class);
1005  }
1006      }
1007
1008      /* Close up the shop. */
1009      if (H5Fclose(fileid) < 0) ERR;
1010   }
1011
1012   SUMMARIZE_ERR;
1013   FINAL_RESULTS;
1014}
1015


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed