H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, &space4_data); CHECK(ret, FAIL, "H5Dwrite"); /* Close Dataset */ ret = H5Dclose(dataset); CHECK(ret, FAIL, "H5Dclose"); /* Close compound datatype */ ret = H5Tclose(tid1); CHECK(ret, FAIL, "H5Tclose"); /* Close scalar dataspace */ ret = H5Sclose(sid1); CHECK(ret, FAIL, "H5Sclose"); /* Close file */ ret = H5Fclose(fid1); CHECK(ret, FAIL, "H5Fclose"); } /* test_h5s_compound_scalar_write() */ /**************************************************************** ** ** test_h5s_compound_scalar_read(): Test scalar H5S (dataspace) reading for ** compound datatypes. ** ****************************************************************/ static void test_h5s_compound_scalar_read(void) { hid_t fid1; /* HDF5 File IDs */ hid_t dataset; /* Dataset ID */ hid_t sid1; /* Dataspace ID */ hid_t type; /* Datatype */ int rank; /* Logical rank of dataspace */ hsize_t tdims[4]; /* Dimension array to test with */ hssize_t n; /* Number of dataspace elements */ struct space4_struct rdata; /* Scalar data read in */ herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Scalar Dataspace Manipulation for Reading Compound Datatypes\n")); /* Create file */ fid1 = H5Fopen(DATAFILE, H5F_ACC_RDWR, H5P_DEFAULT); CHECK(fid1, FAIL, "H5Fopen"); /* Create a dataset */ dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); CHECK(dataset, FAIL, "H5Dopen2"); sid1 = H5Dget_space(dataset); CHECK(sid1, FAIL, "H5Dget_space"); n = H5Sget_simple_extent_npoints(sid1); CHECK(n, FAIL, "H5Sget_simple_extent_npoints"); VERIFY(n, 1, "H5Sget_simple_extent_npoints"); rank = H5Sget_simple_extent_ndims(sid1); CHECK(rank, FAIL, "H5Sget_simple_extent_ndims"); VERIFY(rank, SPACE3_RANK, "H5Sget_simple_extent_ndims"); rank = H5Sget_simple_extent_dims(sid1, tdims, NULL); VERIFY(rank, 0, "H5Sget_simple_extent_dims"); type=H5Dget_type(dataset); CHECK(type, FAIL, "H5Dget_type"); ret = H5Dread(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata); CHECK(ret, FAIL, "H5Dread"); if(HDmemcmp(&space4_data,&rdata,sizeof(struct space4_struct))) { printf("scalar data different: space4_data.c1=%c, read_data4.c1=%c\n",space4_data.c1,rdata.c1); printf("scalar data different: space4_data.u=%u, read_data4.u=%u\n",space4_data.u,rdata.u); printf("scalar data different: space4_data.f=%f, read_data4.f=%f\n",space4_data.f,rdata.f); TestErrPrintf("scalar data different: space4_data.c1=%c, read_data4.c1=%c\n",space4_data.c1,rdata.c2); } /* end if */ /* Close datatype */ ret = H5Tclose(type); CHECK(ret, FAIL, "H5Tclose"); /* Close Dataset */ ret = H5Dclose(dataset); CHECK(ret, FAIL, "H5Dclose"); /* Close scalar dataspace */ ret = H5Sclose(sid1); CHECK(ret, FAIL, "H5Sclose"); /* Close file */ ret = H5Fclose(fid1); CHECK(ret, FAIL, "H5Fclose"); } /* test_h5s_compound_scalar_read() */ /* Data arrays for chunk test */ double chunk_data_dbl[50000][3]; float chunk_data_flt[50000][3]; /**************************************************************** ** ** test_h5s_chunk(): Exercise chunked I/O, testing when data conversion ** is necessary and the entire chunk read in doesn't fit into the ** conversion buffer ** ****************************************************************/ static void test_h5s_chunk(void) { herr_t status; hid_t fileID, dsetID; hid_t plist_id; hid_t space_id; hsize_t dims[2]; hsize_t csize[2]; int i,j; fileID = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fileID, FAIL, "H5Fcreate"); plist_id = H5Pcreate(H5P_DATASET_CREATE); CHECK(plist_id, FAIL, "H5Pcreate"); csize[0] = 50000; csize[1] = 3; status = H5Pset_chunk(plist_id, 2, csize); CHECK(status, FAIL, "H5Pset_chunk"); /* Create the data space */ dims[0] = 50000; dims[1] = 3; space_id = H5Screate_simple(2, dims, NULL); CHECK(space_id, FAIL, "H5Screate_simple"); dsetID = H5Dcreate2(fileID, "coords", H5T_NATIVE_FLOAT, space_id, H5P_DEFAULT, plist_id, H5P_DEFAULT); CHECK(dsetID, FAIL, "H5Dcreate2"); /* Initialize float array */ for(i = 0; i < 50000; i++) for(j = 0; j < 3; j++) chunk_data_flt[i][j] = (float)((i + 1) * 2.5F - j * 100.3F); status = H5Dwrite(dsetID, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, chunk_data_flt); CHECK(status, FAIL, "H5Dwrite"); status = H5Pclose(plist_id); CHECK(status, FAIL, "H5Pclose"); status = H5Sclose(space_id); CHECK(status, FAIL, "H5Sclose"); status = H5Dclose(dsetID); CHECK(status, FAIL, "H5Dclose"); status = H5Fclose(fileID); CHECK(status, FAIL, "H5Fclose"); /* Reset/initialize the data arrays to read in */ HDmemset(chunk_data_dbl, 0, sizeof(double) * 50000 * 3); HDmemset(chunk_data_flt, 0, sizeof(float) * 50000 * 3); fileID = H5Fopen(DATAFILE, H5F_ACC_RDONLY, H5P_DEFAULT); CHECK(fileID, FAIL, "H5Fopen"); dsetID = H5Dopen2(fileID, "coords", H5P_DEFAULT); CHECK(dsetID, FAIL, "H5Dopen2"); status= H5Dread(dsetID, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, chunk_data_dbl); CHECK(status, FAIL, "H5Dread"); status= H5Dread(dsetID, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, chunk_data_flt); CHECK(status, FAIL, "H5Dread"); status = H5Dclose(dsetID); CHECK(status, FAIL, "H5Dclose"); status = H5Fclose(fileID); CHECK(status, FAIL, "H5Fclose"); for(i=0; i<50000; i++) { for(j=0; j<3; j++) { /* Check if the two values are within 0.001% range. */ if(!DBL_REL_EQUAL(chunk_data_dbl[i][j], chunk_data_flt[i][j], 0.00001F)) TestErrPrintf("%u: chunk_data_dbl[%d][%d]=%e, chunk_data_flt[%d][%d]=%e\n", (unsigned)__LINE__, i, j, chunk_data_dbl[i][j], i, j, chunk_data_flt[i][j]); } /* end for */ } /* end for */ } /* test_h5s_chunk() */ /**************************************************************** ** ** test_h5s_extent_equal(): Exercise extent comparison code ** ****************************************************************/ static void test_h5s_extent_equal(void) { hid_t null_space; /* Null dataspace */ hid_t scalar_space; /* Scalar dataspace */ hid_t d1_space1, d1_space2, d1_space3, d1_space4; /* 1-D dataspaces */ hid_t d2_space1, d2_space2, d2_space3, d2_space4; /* 2-D dataspaces */ hid_t d3_space1, d3_space2, d3_space3, d3_space4; /* 3-D dataspaces */ hsize_t d1_dims1[1] = {10}, /* 1-D dimensions */ d1_dims2[1] = {20}, d1_dims3[1] = {H5S_UNLIMITED}; hsize_t d2_dims1[2] = {10, 10}, /* 2-D dimensions */ d2_dims2[2] = {20, 20}, d2_dims3[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; hsize_t d3_dims1[3] = {10, 10, 10}, /* 3-D dimensions */ d3_dims2[3] = {20, 20, 20}, d3_dims3[3] = {H5S_UNLIMITED, H5S_UNLIMITED, H5S_UNLIMITED}; htri_t ext_equal; /* Whether two dataspace extents are equal */