1/* This is part of the netCDF package. Copyright 2005-2011, University
2   Corporation for Atmospheric Research/Unidata.  See COPYRIGHT file
3   for conditions of use.
4
5   Test that HDF5 and NetCDF-4 can read and write the same file.
6*/
7#include <config.h>
8#include <nc_tests.h>
9#include "err_macros.h"
10#include <hdf5.h>
11#include <H5DSpublic.h>
12
13#define FILE_NAME "tst_interops5.h5"
14
15int
16main(int argc, char **argv)
17{
18   printf("\n*** Testing HDF5/NetCDF-4 interoperability...\n");
19   printf("*** testing HDF5 compatibility...");
20   {
21#define GRPA_NAME "grpa"
22#define VAR_NAME "vara"
23#define NDIMS 2
24      int nrowCur = 7;               /* current size */
25      int ncolCur = 3;
26      int nrowMax = nrowCur + 0;     /* maximum size */
27      int ncolMax = ncolCur + 0;
28
29      hid_t xdimId;
30      hid_t ydimId;
31      hsize_t xscaleDims[1];
32      hsize_t yscaleDims[1];
33      hid_t xdimSpaceIdspaceId;
34      hid_t fileId;
35      hid_t fapl;
36      hsize_t curDims[2];
37      hsize_t maxDims[2];
38      hid_t dataTypeIddsPropertyIdgrpaIdgrpaPropIddsId;
39      hid_t ydimSpaceId;
40      const char * dimNameBase
41  = "This is a netCDF dimension but not a netCDF variable.";
42      char dimNameBuf[1000];
43      char *varaName = "/grpa/vara";
44      short amat[nrowCur][ncolCur];
45      int iijj;
46
47      xscaleDims[0] = nrowCur;
48      yscaleDims[0] = ncolCur;
49      if ((xdimSpaceId = H5Screate_simple(1, xscaleDimsNULL)) < 0) ERR;
50
51      /* With the SEMI close degree, the HDF5 file close will fail if
52       * anything is left open. */
53      if ((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
54      if (H5Pset_fclose_degree(faplH5F_CLOSE_SEMI)) ERR;
55
56      /* Create file */
57      if((fileId = H5Fcreate(FILE_NAMEH5F_ACC_TRUNC,
58      H5Pcreate(H5P_FILE_CREATE), fapl)) < 0) ERR;
59      if (H5Pclose(fapl) < 0) ERR;
60
61      /* Create data space */
62      curDims[0] = nrowCur;
63      curDims[1] = ncolCur;
64      maxDims[0] = nrowMax;
65      maxDims[1] = ncolMax;
66      if ((spaceId = H5Screate_simple(2, curDimsmaxDims)) < 0) ERR;
67
68      if ((dataTypeId = H5Tcopy(H5T_NATIVE_SHORT)) < 0) ERR;
69
70      if ((dsPropertyId = H5Pcreate(H5P_DATASET_CREATE)) < 0) ERR;
71
72      if ((grpaPropId = H5Pcreate(H5P_GROUP_CREATE)) < 0) ERR;
73      if ((grpaId = H5Gcreate2(fileIdGRPA_NAMEH5P_DEFAULT,
74        grpaPropIdH5P_DEFAULT)) < 0) ERR;
75      if (H5Pclose(grpaPropId) < 0) ERR;
76
77      /* Create vara dataset */
78      if ((dsId = H5Dcreate2(fileIdvaraNamedataTypeIdspaceId,
79      H5P_DEFAULTdsPropertyId,
80      H5P_DEFAULT)) < 0) ERR;
81
82      if (H5Pclose(dsPropertyId) < 0) ERR;
83      if (H5Tclose(dataTypeId) < 0) ERR;
84      if ((ydimSpaceId = H5Screate_simple(1, yscaleDimsNULL)) < 0) ERR;
85
86      /* Create xdim dimension dataset */
87      if ((xdimId = H5Dcreate2(fileId, "/xdim", H5T_IEEE_F32BE,
88        xdimSpaceIdH5P_DEFAULTH5P_DEFAULT,
89        H5P_DEFAULT)) < 0) ERR;
90
91      if (H5Sclose(xdimSpaceId) < 0) ERR;
92
93      /* Create ydim dimension dataset */
94      if ((ydimId = H5Dcreate2(fileId, "/ydim", H5T_IEEE_F32BE,
95        ydimSpaceIdH5P_DEFAULTH5P_DEFAULT,
96        H5P_DEFAULT)) < 0) ERR;
97      if (H5Sclose(ydimSpaceId) < 0) ERR;
98
99      /* Create xdim scale */
100      sprintf(dimNameBuf, "%s%10d", dimNameBasenrowCur);
101      if (H5DSset_scale(xdimIddimNameBuf) < 0) ERR;
102
103      /* Create ydim scale */
104      sprintf(dimNameBuf, "%s%10d", dimNameBasencolCur);
105      if (H5DSset_scale(ydimIddimNameBuf) < 0) ERR;
106
107      /* Attach dimension scales to the dataset */
108      if (H5DSattach_scale(dsIdxdimId, 0) < 0) ERR;
109
110      if (H5DSattach_scale(dsIdydimId, 1) < 0) ERR;
111
112      /* Close stuff. */
113      if (H5Dclose(xdimId) < 0) ERR;
114      if (H5Dclose(ydimId) < 0) ERR;
115      if (H5Dclose(dsId) < 0) ERR;
116      if (H5Gclose(grpaId) < 0) ERR;
117      if (H5Sclose(spaceId) < 0) ERR;
118      if (H5Fclose(fileId) < 0) ERR;
119
120      /* Create some data */
121      for (ii = 0; ii < nrowCurii++)
122  for (jj = 0; jj < ncolCurjj++)
123     amat[ii][jj] = 100 * ii + jj;
124
125      /* Re-open file */
126      if ((fileId = H5Fopen(FILE_NAMEH5F_ACC_RDWRH5P_DEFAULT)) < 0) ERR;
127      if ((grpaId = H5Gopen2(fileIdGRPA_NAMEH5P_DEFAULT)) < 0) ERR;
128      if ((dsId = H5Dopen2(grpaIdvaraName,  H5P_DEFAULT)) < 0) ERR;
129
130      /* Write dataset */
131      if (H5Dwrite(dsIdH5T_NATIVE_SHORTH5S_ALLH5S_ALLH5P_DEFAULT,
132    amat) < 0) ERR;
133
134      /* Write dimension values for both xdim, ydim */
135      {
136      short xydimMatnrowCur >= ncolCur ? nrowCur : ncolCur];
137      for (ii = 0; ii < nrowCurii++)
138  xydimMat[ii] = 0;    /*#### 100 * ii; */
139
140      /* Write xdim */
141      if ((xdimId = H5Dopen2(fileId, "/xdim", H5P_DEFAULT)) < 0) ERR;
142      if (H5Dwrite(xdimIdH5T_NATIVE_SHORTH5S_ALLH5S_ALL,
143    H5P_DEFAULTxydimMat) < 0) ERR;
144      if (H5Dclose(xdimId) < 0) ERR;
145
146      /* Write ydim */
147      if ((ydimId = H5Dopen2(fileId, "/ydim", H5P_DEFAULT)) < 0) ERR;
148      if (H5Dwrite(ydimIdH5T_NATIVE_SHORTH5S_ALLH5S_ALL,
149    H5P_DEFAULTxydimMat) < 0) ERR;
150      if (H5Dclose(ydimId) < 0) ERR;
151      }
152
153      if (H5Dclose(dsId) < 0) ERR;
154      if (H5Gclose(grpaId) < 0) ERR;
155      if (H5Fclose(fileId) < 0) ERR;
156
157      {
158  int ncidgrpidnvarsngattsndimsunlimdimidngrps;
159  char name_in[NC_MAX_NAME + 1];
160  nc_type xtype_in;
161  int ndims_innatts_indimid_in[NDIMS];
162
163/*  nc_set_log_level(5);*/
164  if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
165  if (nc_inq(ncid, &ndims, &nvars, &ngatts, &unlimdimid)) ERR;
166  if (ndims != 2 || nvars != 0 || ngatts != 0 || unlimdimid != -1) ERR;
167  if (nc_inq_grps(ncid, &ngrps, &grpid)) ERR;
168  if (ngrps != 1) ERR;
169  if (nc_inq(grpid, &ndims, &nvars, &ngatts, &unlimdimid)) ERR;
170  if (ndims != 0 || nvars != 1 || ngatts != 0 || unlimdimid != -1) ERR;
171
172  if (nc_inq_var(grpid, 0, name_in, &xtype_in, &ndims_indimid_in,
173 &natts_in)) ERR;
174  if (strcmp(name_inVAR_NAME) || xtype_in != NC_SHORT || ndims_in != NDIMS ||
175      dimid_in[0] != 0 || dimid_in[1] != 1 || natts_in != 0) ERR;
176
177  if (nc_close(ncid)) ERR;
178      }
179   }
180   SUMMARIZE_ERR;
181#ifdef USE_SZIP
182   printf("*** testing HDF5 compatibility with szip...");
183   {
184
185#define DEFLATE_LEVEL 9
186#define MAX_NAME 100
187#define NUM_CD_ELEM 10
188/* HDF5 defines this... */
189#define DEFLATE_NAME "deflate"
190#define DIM1_LEN 3000
191#define GRP_NAME "George_Washington"
192#define BATTLE_RECORD "Battle_Record"
193
194      hid_t fileidgrpidspaceiddatasetid;
195      int data_out[DIM1_LEN], data_in[DIM1_LEN];
196      hsize_t dims[1] = {DIM1_LEN};
197      H5Z_filter_t filter;
198      int num_filters;
199      hid_t propid;
200      unsigned int flagscd_values[NUM_CD_ELEM], filter_config;
201      size_t cd_nelems = NUM_CD_ELEM;
202      size_t namelen = MAX_NAME;
203      char name[MAX_NAME + 1], name_in[MAX_NAME + 1];
204      int ncidndims_innvars_inngatts_inunlimdimid_inngrps_in;
205      int dimid_in[1], natts_in;
206
207      nc_type xtype_in;
208      int i;
209
210      for (i = 0; i < DIM1_LENi++)
211  data_out[i] = i;
212
213      /* Open file and create group. */
214      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULT,
215       H5P_DEFAULT)) < 0) ERR;
216      if ((grpid = H5Gcreate(fileidGRP_NAME, 0)) < 0) ERR;
217
218      /* Write an array of bools, with szip compression. */
219      if ((propid = H5Pcreate(H5P_DATASET_CREATE)) < 0) ERR;
220      if (H5Pset_layout(propidH5D_CHUNKED)) ERR;
221      if (H5Pset_chunk(propid, 1, dims)) ERR;
222      if (H5Pset_szip(propidH5_SZIP_EC_OPTION_MASK, 32)) ERR;
223      if ((spaceid = H5Screate_simple(1, dimsdims)) < 0) ERR;
224      if ((datasetid = H5Dcreate(grpidBATTLE_RECORDH5T_NATIVE_INT,
225  spaceidpropid)) < 0) ERR;
226      if (H5Dwrite(datasetidH5T_NATIVE_INTH5S_ALLH5S_ALLH5P_DEFAULT,
227    data_out) < 0) ERR;
228      if (H5Dclose(datasetid) < 0 ||
229   H5Pclose(propid) < 0 ||
230   H5Sclose(spaceid) < 0 ||
231   H5Gclose(grpid) < 0 ||
232   H5Fclose(fileid) < 0)
233  ERR;
234
235      /* Open the file with netCDF and check it. */
236      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
237      if (nc_inq(ncid, &ndims_in, &nvars_in, &ngatts_in, &unlimdimid_in)) ERR;
238      if (ndims_in != 0 || nvars_in != 0 || ngatts_in != 0 || unlimdimid_in != -1) ERR;
239      if (nc_inq_grps(ncid, &ngrps_in, &grpid)) ERR;
240      if (ngrps_in != 1) ERR;
241      if (nc_inq(grpid, &ndims_in, &nvars_in, &ngatts_in, &unlimdimid_in)) ERR;
242      if (ndims_in != 1 || nvars_in != 1 || ngatts_in != 0 || unlimdimid_in != -1) ERR;
243
244      /* Check the variable. */
245      if (nc_inq_var(grpid, 0, name_in, &xtype_in, &ndims_indimid_in,
246            &natts_in)) ERR;
247      if (strcmp(name_inBATTLE_RECORD) || xtype_in != NC_INT || ndims_in != 1 ||
248         dimid_in[0] != 0 || natts_in != 0) ERR;
249
250      /* Check the data. */
251      if (nc_get_var(grpid, 0, data_in)) ERR;
252      for (i = 0; i < DIM1_LENi++)
253  if (data_in[i] != data_out[i]) ERR;
254
255      if (nc_close(ncid)) ERR;
256
257   }
258   SUMMARIZE_ERR;
259#endif /* USE_SZIP */
260   FINAL_RESULTS;
261}


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