1/* This is part of the netCDF package. Copyright 2007 University
2   Corporation for Atmospheric Research/Unidata See COPYRIGHT file for
3   conditions of use.
4
5   Test HDF5 dataset code, even more. These are not intended to be
6   exhaustive tests, but they use HDF5 the same way that netCDF-4
7   does, so if these tests don't work, than netCDF-4 won't work
8   either.
9*/
10
11#include "h5_err_macros.h"
12#include <hdf5.h>
13#include <H5DSpublic.h>
14
15#define FILE_NAME "tst_h_vars2.h5"
16#define STR_LEN 255
17
18int
19main()
20{
21   printf("\n*** Checking HDF5 variable functions some more.\n");
22   /* If HDF5 has working ordering of variables, then the following
23    * test will work.*/
24   printf("*** Checking HDF5 variable ordering...");
25
26#define NUM_ELEMENTS 6
27#define MAX_SYMBOL_LEN 2
28#define ELEMENTS_NAME "Elements"
29   {
30      hid_t did[NUM_ELEMENTS], fapl_idfcpl_idgcpl_id;
31      hsize_t num_obj;
32      hid_t fileidgrpidspaceid;
33      int i;
34      H5O_info_t obj_info;
35      char names[NUM_ELEMENTS][MAX_SYMBOL_LEN + 1] = {"H", "He", "Li", "Be", "B", "C"};
36      char name[MAX_SYMBOL_LEN + 1];
37      ssize_t size;
38
39      /* Create file, setting latest_format in access propertly list
40       * and H5P_CRT_ORDER_TRACKED in the creation property list. */
41      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
42      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
43      if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
44      if (H5Pset_link_creation_order(fcpl_idH5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0) ERR;
45      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcpl_idfapl_id)) < 0) ERR;
46
47      /* Create group, with link_creation_order set in the group
48       * creation property list. */
49      if ((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0) ERR;
50      if (H5Pset_link_creation_order(gcpl_idH5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0) ERR;
51      if ((grpid = H5Gcreate_anon(fileidgcpl_idH5P_DEFAULT)) < 0) ERR;
52      if ((H5Olink(grpidfileidELEMENTS_NAMEH5P_DEFAULTH5P_DEFAULT)) < 0) ERR;
53
54      /* Create a scalar space. */
55      if ((spaceid = H5Screate(H5S_SCALAR)) < 0) ERR;
56
57      /* Create the variables, one per element. */
58      for (i = 0; i < NUM_ELEMENTSi++)
59      {
60  if ((did[i] = H5Dcreate(grpidnames[i], H5T_NATIVE_INT,
61  spaceidH5P_DEFAULT)) < 0) ERR;
62  if (H5Dclose(did[i]) < 0) ERR;
63      }
64
65      if (H5Pclose(fapl_id) < 0 ||
66   H5Pclose(gcpl_id) < 0 ||
67   H5Sclose(spaceid) < 0 ||
68   H5Gclose(grpid) < 0 ||
69   H5Fclose(fileid) < 0)
70  ERR;
71
72      /* Now reopen the file and check the order. */
73      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
74      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
75      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDONLYfapl_id)) < 0) ERR;
76      if ((grpid = H5Gopen(fileidELEMENTS_NAME)) < 0) ERR;
77
78      if (H5Gget_num_objs(grpid, &num_obj) < 0) ERR;
79      if (num_obj != NUM_ELEMENTSERR;
80      for (i = 0; i < num_obji++)
81      {
82  if (H5Oget_info_by_idx(grpid, ".", H5_INDEX_CRT_ORDERH5_ITER_INC,
83 i, &obj_infoH5P_DEFAULT) < 0) ERR;
84  if (obj_info.type != H5O_TYPE_DATASETERR;
85  if ((size = H5Lget_name_by_idx(grpid, ".", H5_INDEX_CRT_ORDERH5_ITER_INCi,
86 NULL, 0, H5P_DEFAULT)) < 0) ERR;
87  H5Lget_name_by_idx(grpid, ".", H5_INDEX_CRT_ORDERH5_ITER_INCi,
88 namesize+1, H5P_DEFAULT);
89  if (strcmp(namenames[i])) ERR;
90      }
91      if (H5Pclose(fapl_id) < 0 ||
92   H5Gclose(grpid) < 0 ||
93   H5Fclose(fileid) < 0)
94  ERR;
95   }
96   SUMMARIZE_ERR;
97   printf("*** Checking HDF5 variable ordering in root group...");
98
99#define NUM_DIMSCALES 2
100#define MAX_SYMBOL_LEN 2
101#define DIM1_LEN 3
102#define DIMSCALE_NAME "Joe"
103#define NAME_ATTRIBUTE "short"
104   {
105      hid_t fapl_idfcpl_id;
106      hid_t fileidgrpid;
107      hsize_t num_obj;
108      int i;
109      H5O_info_t obj_info;
110      char names[NUM_DIMSCALES][MAX_SYMBOL_LEN + 1] = {"b", "a"};
111      char name[MAX_SYMBOL_LEN + 1];
112      hid_t dimscaleid;
113      hid_t dimscale_spaceid;
114      hsize_t dimscale_dims[1] = {DIM1_LEN};
115      ssize_t size;
116
117      /* Create file, setting latest_format in access propertly list
118       * and H5P_CRT_ORDER_TRACKED in the creation property list. */
119      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
120      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
121      if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
122      if (H5Pset_link_creation_order(fcpl_idH5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0) ERR;
123      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcpl_idfapl_id)) < 0) ERR;
124
125      if ((dimscale_spaceid = H5Screate_simple(1, dimscale_dims,
126        dimscale_dims)) < 0) ERR;
127      /* Create the variables, one per element. */
128      for (i = 0; i < NUM_DIMSCALESi++)
129      {
130  /* Create our dimension scale. Use the built-in NAME attribute
131   * on the dimscale. */
132  if ((dimscaleid = H5Dcreate(fileidnames[i], H5T_NATIVE_INT,
133      dimscale_spaceidH5P_DEFAULT)) < 0) ERR;
134  if (H5DSset_scale(dimscaleidNAME_ATTRIBUTE) < 0) ERR;
135
136  if (H5Dclose(dimscaleid) < 0) ERR;
137      }
138
139      if (H5Pclose(fapl_id) < 0 ||
140   H5Pclose(fcpl_id) < 0 ||
141   H5Sclose(dimscale_spaceid) < 0 ||
142   H5Fclose(fileid) < 0)
143  ERR;
144
145      /* Now reopen the file and check the order. */
146      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
147      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
148      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDONLYfapl_id)) < 0) ERR;
149      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
150
151      if (H5Gget_num_objs(grpid, &num_obj) < 0) ERR;
152      if (num_obj != NUM_DIMSCALESERR;
153      for (i = 0; i < num_obji++)
154      {
155  if (H5Oget_info_by_idx(grpid, ".", H5_INDEX_CRT_ORDERH5_ITER_INC,
156 i, &obj_infoH5P_DEFAULT) < 0) ERR;
157  if (obj_info.type != H5O_TYPE_DATASETERR;
158  if ((size = H5Lget_name_by_idx(grpid, ".", H5_INDEX_CRT_ORDERH5_ITER_INCi,
159                                  NULL, 0, H5P_DEFAULT)) < 0) ERR;
160  if (H5Lget_name_by_idx(grpid, ".", H5_INDEX_CRT_ORDERH5_ITER_INCi,
161 namesize+1, H5P_DEFAULT) < 0) ERR;
162  if (strcmp(namenames[i])) ERR;
163      }
164      if (H5Pclose(fapl_id) < 0 ||
165   H5Gclose(grpid) < 0 ||
166   H5Fclose(fileid) < 0)
167  ERR;
168   }
169   SUMMARIZE_ERR;
170   printf("*** Checking HDF5 variable ordering flags with redef-type situations...");
171
172#define NUM_ELEMENTS 6
173#define MAX_NAME_LEN 50
174#define ELEMENTS_NAME "Elements"
175#define VAR_NAME "Sears_Zemansky_and_Young"
176   {
177      hid_t didfapl_idfcpl_idgcpl_idattid;
178      hsize_t num_obj;
179      hid_t fileidgrpidspaceid;
180      float val = 3.1495;
181      H5O_info_t obj_info;
182      char name[MAX_NAME_LEN + 1];
183      ssize_t size;
184
185      /* Create file, setting latest_format in access propertly list
186       * and H5P_CRT_ORDER_TRACKED in the creation property list. */
187      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
188      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
189      if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
190      if (H5Pset_link_creation_order(fcpl_idH5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0) ERR;
191      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcpl_idfapl_id)) < 0) ERR;
192
193      /* Create group, with link_creation_order set in the group
194       * creation property list. */
195      if ((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0) ERR;
196      if (H5Pset_link_creation_order(gcpl_idH5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0) ERR;
197      if ((grpid = H5Gcreate_anon(fileidgcpl_idH5P_DEFAULT)) < 0) ERR;
198      if ((H5Olink(grpidfileidELEMENTS_NAMEH5P_DEFAULTH5P_DEFAULT)) < 0) ERR;
199
200      /* Create a scalar space. */
201      if ((spaceid = H5Screate(H5S_SCALAR)) < 0) ERR;
202
203      /* Create a scalar variable. */
204      if ((did = H5Dcreate(grpidVAR_NAMEH5T_NATIVE_INT,
205    spaceidH5P_DEFAULT)) < 0) ERR;
206      if (H5Dclose(did) < 0) ERR;
207
208      /* Flush the HDF5 buffers. */
209      H5Fflush(fileidH5F_SCOPE_GLOBAL);
210
211      /* Delete the variable. Just to be mean. */
212      if (H5Gunlink(grpidVAR_NAME) < 0) ERR;
213
214      /* Re-reate the scalar variable. */
215      if ((did = H5Dcreate(grpidVAR_NAMEH5T_NATIVE_INT,
216    spaceidH5P_DEFAULT)) < 0) ERR;
217
218      /* Add an attribute. */
219      if ((attid = H5Acreate(did, "Some_Attribute", H5T_NATIVE_FLOATspaceid,
220      H5P_DEFAULT)) < 0) ERR;
221      if (H5Awrite(attidH5T_NATIVE_FLOAT, &val) < 0) ERR;
222
223      if (H5Aclose(attid) < 0) ERR;
224      if (H5Dclose(did) < 0) ERR;
225
226      if (H5Pclose(fapl_id) < 0 ||
227   H5Pclose(gcpl_id) < 0 ||
228   H5Sclose(spaceid) < 0 ||
229   H5Gclose(grpid) < 0 ||
230   H5Fclose(fileid) < 0)
231  ERR;
232
233      /* Now reopen the file and check the order. */
234      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
235      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
236      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDONLYfapl_id)) < 0) ERR;
237      if ((grpid = H5Gopen(fileidELEMENTS_NAME)) < 0) ERR;
238
239      if (H5Gget_num_objs(grpid, &num_obj) < 0) ERR;
240      if (num_obj != 1) ERR;
241      if (H5Oget_info_by_idx(grpid, ".", H5_INDEX_CRT_ORDERH5_ITER_INC,
242      0, &obj_infoH5P_DEFAULT) < 0) ERR;
243      if (obj_info.type != H5O_TYPE_DATASETERR;
244      if ((size = H5Lget_name_by_idx(grpid, ".", H5_INDEX_CRT_ORDERH5_ITER_INC, 0,
245      NULL, 0, H5P_DEFAULT)) < 0) ERR;
246      H5Lget_name_by_idx(grpid, ".", H5_INDEX_CRT_ORDERH5_ITER_INC, 0,
247                         namesize+1, H5P_DEFAULT);
248      if (strcmp(nameVAR_NAME)) ERR;
249      if (H5Pclose(fapl_id) < 0 ||
250   H5Gclose(grpid) < 0 ||
251   H5Fclose(fileid) < 0)
252  ERR;
253   }
254   SUMMARIZE_ERR;
255   printf("*** Checking HDF5 variable compession and filters...");
256   {
257#define NUM_ELEMENTS 6
258#define MAX_NAME_LEN 50
259#define ELEMENTS_NAME "Elements"
260#define VAR_NAME "Sears_Zemansky_and_Young"
261#define NDIMS 2
262#define NX 60
263#define NY 120
264#define DEFLATE_LEVEL 3
265#define SIMPLE_VAR_NAME "data"
266
267      hid_t fapl_idfcpl_id;
268      hid_t datasetid;
269      hid_t fileidgrpidspaceidplistid;
270      int data_in[NX][NY], data_out[NX][NY];
271      hsize_t fdims[NDIMS], fmaxdims[NDIMS];
272      hsize_t chunksize[NDIMS], dimsize[NDIMS], maxdimsize[NDIMS];
273      int xy;
274
275      /* Create some data to write. */
276      for (x = 0; x < NXx++)
277  for (y = 0; y < NYy++)
278     data_out[x][y] = x * NY + y;
279
280      /* Create file, setting latest_format in access propertly list
281       * and H5P_CRT_ORDER_TRACKED in the creation property list. */
282      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
283      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
284      if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
285      if (H5Pset_link_creation_order(fcpl_idH5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0) ERR;
286      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcpl_idfapl_id)) < 0) ERR;
287
288      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
289
290      dimsize[0] = maxdimsize[0] = NX;
291      dimsize[1] = maxdimsize[1] = NY;
292      if ((spaceid = H5Screate_simple(NDIMSdimsizemaxdimsize)) < 0) ERR;
293
294      /* Create property lust. */
295      if ((plistid = H5Pcreate(H5P_DATASET_CREATE)) < 0) ERR;
296
297      /* Set up chunksizes. */
298      chunksize[0] = NX;
299      chunksize[1] = NY;
300      if (H5Pset_chunk(plistidNDIMSchunksize) < 0)ERR;
301
302      /* Set up compression. */
303      if (H5Pset_deflate(plistidDEFLATE_LEVEL) < 0) ERR;
304
305      /* Create the variable. */
306      if ((datasetid = H5Dcreate(grpidSIMPLE_VAR_NAMEH5T_NATIVE_INT,
307  spaceidplistid)) < 0) ERR;
308
309      /* Write the data. */
310      if (H5Dwrite(datasetidH5T_NATIVE_INTH5S_ALLH5S_ALL,
311    H5P_DEFAULTdata_out) < 0) ERR;
312
313      if (H5Dclose(datasetid) < 0) ERR;
314      if (H5Pclose(fapl_id) < 0 ||
315   H5Sclose(spaceid) < 0 ||
316   H5Gclose(grpid) < 0 ||
317   H5Fclose(fileid) < 0)
318  ERR;
319
320      /* Now reopen the file and check the order. */
321      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
322      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
323      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDONLYfapl_id)) < 0) ERR;
324      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
325
326      if ((datasetid = H5Dopen1(grpidSIMPLE_VAR_NAME)) < 0) ERR;
327      if ((spaceid = H5Dget_space(datasetid)) < 0)
328      if (H5Sget_simple_extent_dims(spaceidfdimsfmaxdims) > 0) ERR;
329      if (H5Dread(datasetidH5T_NATIVE_INTH5S_ALL,
330   spaceidH5P_DEFAULTdata_in) < 0) ERR;
331
332      /* Check the data. */
333      for (x = 0; x < NXx++)
334  for (y = 0; y < NYy++)
335     if (data_in[x][y] != data_out[x][y]) ERR_RET;
336
337      if (H5Pclose(fapl_id) < 0 ||
338   H5Dclose(datasetid) < 0 ||
339   H5Sclose(spaceid) < 0 ||
340   H5Gclose(grpid) < 0 ||
341   H5Fclose(fileid) < 0)
342  ERR;
343   }
344   SUMMARIZE_ERR;
345/* I cant get this to work, I don't think it's allowed in HDF5. - Ed 7/12/7 */
346/*    printf("*** Checking HDF5 scalar variable compession..."); */
347
348/* #define MAX_NAME_LEN 50 */
349/* #define DEFLATE_LEVEL 3 */
350/* #define SIMPLE_VAR_NAME1 "punches" */
351/*    { */
352/*       hid_t fapl_id, fcpl_id; */
353/*       hid_t datasetid; */
354/*       hid_t fileid, grpid, spaceid, plistid; */
355/*       int data_in, data_out = 42; */
356/*       hsize_t chunksize = 1; */
357
358/*       /\* Create file, setting latest_format in access propertly list */
359/*        * and H5P_CRT_ORDER_TRACKED in the creation property list. *\/ */
360/*       if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR; */
361/*      if (H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0) ERR;*/
362/*       if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR; */
363/*       if (H5Pset_link_creation_order(fcpl_id, H5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0) ERR; */
364/*       if ((fileid = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, fcpl_id, fapl_id)) < 0) ERR; */
365
366/*       if ((grpid = H5Gopen(fileid, "/")) < 0) ERR; */
367
368/*       if ((spaceid = H5Screate(H5S_SCALAR)) < 0) ERR; */
369
370/*       /\* Create property lust. *\/ */
371/*       if ((plistid = H5Pcreate(H5P_DATASET_CREATE)) < 0) ERR; */
372
373/*       if (H5Pset_chunk(plistid, 1, &chunksize) < 0)ERR; */
374
375/*       /\* Set up compression. *\/ */
376/*       if (H5Pset_deflate(plistid, DEFLATE_LEVEL) < 0) ERR; */
377
378/*       /\* Create the variable. *\/ */
379/*       if ((datasetid = H5Dcreate(grpid, SIMPLE_VAR_NAME1, H5T_NATIVE_INT, */
380/*   spaceid, plistid)) < 0) ERR; */
381
382/*       /\* Write the data. *\/ */
383/*       if (H5Dwrite(datasetid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL,  */
384/*     H5P_DEFAULT, &data_out) < 0) ERR; */
385
386/*       if (H5Dclose(datasetid) < 0) ERR; */
387/*       if (H5Pclose(fapl_id) < 0 || */
388/*    H5Sclose(spaceid) < 0 || */
389/*    H5Gclose(grpid) < 0 || */
390/*    H5Fclose(fileid) < 0) */
391/*   ERR; */
392
393/*       /\* Now reopen the file and check. *\/ */
394/*       if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR; */
395/*      if (H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0) ERR;*/
396/*       if ((fileid = H5Fopen(FILE_NAME, H5F_ACC_RDONLY, fapl_id)) < 0) ERR; */
397/*       if ((grpid = H5Gopen(fileid, "/")) < 0) ERR; */
398
399/*       if ((datasetid = H5Dopen1(grpid, SIMPLE_VAR_NAME1)) < 0) ERR; */
400/*       if ((spaceid = H5Dget_space(datasetid)) < 0)  */
401/*       if (H5Dread(datasetid, H5T_NATIVE_INT, H5S_ALL,  */
402/*    spaceid, H5P_DEFAULT, &data_in) < 0) ERR; */
403
404/*       /\* Check the data. *\/ */
405/*       if (data_in != data_out) ERR; */
406
407/*       if (H5Pclose(fapl_id) < 0 || */
408/*    H5Dclose(datasetid) < 0 || */
409/*    H5Gclose(grpid) < 0 || */
410/*    H5Fclose(fileid) < 0) */
411/*   ERR; */
412/*    } */
413/*    SUMMARIZE_ERR; */
414
415   printf("*** Checking fill value of compound type...");
416
417   {
418#define VAR_NAME2 "obs"
419#define REF_FILE "ref_tst_compounds.nc"
420#define ATT_NAME "_FillValue"
421
422      typedef struct obs_t {
423     char day ;
424     short elev;
425     int count;
426     float relhum;
427     double time;
428      } obs_t ;
429
430      obs_t f1f2;
431      obs_t m = {-99, -99, -99, -99, -99};
432      hid_t fileidgrpidattidtypeiddatasetidnative_typeidpropid;
433      H5D_fill_value_t fill_status;
434      char file_in[STR_LEN * 2];
435      size_t type_size;
436
437      if (getenv("srcdir"))
438      {
439  strcpy(file_in, getenv("srcdir"));
440  strcat(file_in, "/");
441  strcat(file_inREF_FILE);
442      }
443      else
444  strcpy(file_inREF_FILE);
445
446      /* Open file and read fill value of the variable. */
447      if ((fileid = H5Fopen(file_inH5F_ACC_RDONLYH5P_DEFAULT)) < 0) ERR;
448      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
449      if ((datasetid = H5Dopen1(grpidVAR_NAME2)) < 0) ERR;
450      if ((propid = H5Dget_create_plist(datasetid)) < 0) ERR;
451      if (H5Pfill_value_defined(propid, &fill_status) < 0) ERR;
452      if (fill_status != H5D_FILL_VALUE_USER_DEFINEDERR;
453      if ((typeid = H5Dget_type(datasetid)) < 0) ERR;
454      if ((native_typeid = H5Tget_native_type(typeidH5T_DIR_DEFAULT)) < 0) ERR;
455      if (!(type_size = H5Tget_size(native_typeid))) ERR;
456      if (type_size != sizeof(obs_t)) ERR;
457      if (H5Pget_fill_value(propidnative_typeid, &f1) < 0) ERR;
458      if (f1.day != m.day || f1.elev != m.elev || f1.count != m.count ||
459   f1.relhum != m.relhum || f1.time != m.time) ERR;
460
461      /* It's also in an attribute, netCDF style. */
462      if ((attid = H5Aopen_name(datasetidATT_NAME)) < 0) ERR;
463      if ((typeid = H5Aget_type(attid)) < 0) ERR;
464      if ((native_typeid = H5Tget_native_type(typeidH5T_DIR_DEFAULT)) < 0) ERR;
465      if (H5Aread(attidnative_typeid, &f2) < 0) ERR;
466      if (f2.day != m.day || f2.elev != m.elev || f2.count != m.count ||
467   f2.relhum != m.relhum || f2.time != m.time) ERR;
468
469      if (H5Dclose(datasetid) < 0 ||
470   H5Aclose(attid) < 0 ||
471   H5Tclose(native_typeid) < 0 ||
472   H5Tclose(typeid) < 0 ||
473   H5Pclose(propid) < 0 ||
474   H5Gclose(grpid) < 0 ||
475   H5Fclose(fileid) < 0) ERR;
476
477   }
478   SUMMARIZE_ERR;
479   printf("*** Checking HDF5 lots of datasets...");
480   {
481#define NDIMS1 1
482#define NUM_DATASETS 10000
483#define CHUNKSIZE 1
484
485      hid_t fapl_idfcpl_id;
486      hid_t datasetid[NUM_DATASETS];
487      hid_t fileidgrpidspaceidplistid;
488      hsize_t chunksize[NDIMS1], dimsize[NDIMS1], maxdimsize[NDIMS1];
489      char var_name[STR_LEN + 1];
490      int v;
491
492      /* Create file, setting latest_format in access propertly list
493       * and H5P_CRT_ORDER_TRACKED in the creation property list. */
494      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
495      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
496      if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
497      if (H5Pset_link_creation_order(fcpl_idH5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0) ERR;
498      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcpl_idfapl_id)) < 0) ERR;
499
500      /* Open root group. */
501      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
502
503      /* Create 1 D data space with unlimited dimension. */
504      dimsize[0] = 0;
505      maxdimsize[0] = H5S_UNLIMITED;
506      if ((spaceid = H5Screate_simple(NDIMS1dimsizemaxdimsize)) < 0) ERR;
507
508      /* Create property list. */
509      if ((plistid = H5Pcreate(H5P_DATASET_CREATE)) < 0) ERR;
510
511      /* Set up chunksizes. */
512      chunksize[0] = CHUNKSIZE;
513      if (H5Pset_chunk(plistidNDIMS1chunksize) < 0)ERR;
514
515      /* Create the variables. */
516      for (v = 0; v < NUM_DATASETSv++)
517      {
518  sprintf(var_name, "var_%d", v);
519/*  printf("creating var %s\n", var_name);*/
520  if ((datasetid[v] = H5Dcreate(grpidvar_nameH5T_NATIVE_INT,
521     spaceidplistid)) < 0) ERR_RET;
522      }
523
524      /* Close the datasets. */
525      for (v = 0; v < NUM_DATASETSv++)
526  if (H5Dclose(datasetid[v]) < 0) ERR_RET;
527
528      /* Close everything. */
529      if (H5Pclose(fapl_id) < 0 ||
530   H5Sclose(spaceid) < 0 ||
531   H5Gclose(grpid) < 0 ||
532   H5Fclose(fileid) < 0)
533  ERR;
534
535      /* Now reopen the file and check. */
536      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
537      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
538      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDONLYfapl_id)) < 0) ERR;
539      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
540
541/*       if ((datasetid = H5Dopen1(grpid, SIMPLE_VAR_NAME)) < 0) ERR; */
542/*       if ((spaceid = H5Dget_space(datasetid)) < 0) */
543/*       if (H5Sget_simple_extent_dims(spaceid, fdims, fmaxdims) > 0) ERR; */
544/*       if (H5Dread(datasetid, H5T_NATIVE_INT, H5S_ALL, */
545/*    spaceid, H5P_DEFAULT, data_in) < 0) ERR; */
546
547/*       /\* Check the data. *\/ */
548/*       for (x = 0; x < NX; x++) */
549/*   for (y = 0; y < NY; y++) */
550/*      if (data_in[x][y] != data_out[x][y]) ERR_RET; */
551
552      if (H5Pclose(fapl_id) < 0 ||
553/*   H5Dclose(datasetid) < 0 ||
554   H5Sclose(spaceid) < 0 ||*/
555   H5Gclose(grpid) < 0 ||
556   H5Fclose(fileid) < 0)
557  ERR;
558   }
559   SUMMARIZE_ERR;
560   FINAL_RESULTS;
561}


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