#include "hdf5.h" #include /* * This test program writes out compound data in "NUMBER_OF_BLOCKS" blocks, * each consisting of "ROWS_PER_BLOCK" rows. * * So, the total number of rows written is NUMBER_OF_BLOCKS * ROWS_PER_BLOCK: */ #define NUMBER_OF_BLOCKS (1024 * 10) #define ROWS_PER_BLOCK 1024 #define USE_COMPRESSION 0 #define USE_SPLIT_FILES 0 #define CHUNK_DIMS 1024 #define DATASET_NAME "VARS" typedef struct { int var1; char *str; double d1; int var2; int var4; long long var3; double d2; } ROWDATA; void write_block ( hid_t dataset, hid_t rowType, hsize_t blocknum ) { ROWDATA item[ROWS_PER_BLOCK], *current; char strs[ROWS_PER_BLOCK][25]; int i; herr_t status; hsize_t current_dims[1], dataspace; hsize_t offsets[1], select_dims[1]; hid_t filespace; static int n; memset(item, 0xff, sizeof(item)); for (i = 0; i < ROWS_PER_BLOCK; ++i) { n = (607479349 * n + 307491661) & 0x7fffffff; current = &item[i]; current->var1 = -(((int)blocknum) * 100 + i); sprintf(strs[i], "%10d", n); current->str = strs[i]; current->d1 = ((int)blocknum) * 1000.0 + i; current->var2 = -(((int)blocknum) * 10000 + i); current->var3 = -(((int)blocknum) * 11111 + i); current->var4 = -(((int)blocknum) * 22222 + i); current->d2 = ((int)blocknum) * 2000.0 + i; } current_dims[0] = (blocknum + 1) * ROWS_PER_BLOCK; status = H5Dset_extent(dataset, current_dims); select_dims[0] = ROWS_PER_BLOCK; dataspace = H5Screate_simple(1, select_dims, NULL); filespace = H5Dget_space(dataset); offsets[0] = blocknum * ROWS_PER_BLOCK; select_dims[0] = ROWS_PER_BLOCK; status = H5Sselect_hyperslab(filespace, H5S_SELECT_SET, offsets, NULL, select_dims, NULL); status = H5Dwrite(dataset, rowType, dataspace, filespace, H5P_DEFAULT, item); status = H5Sclose(dataspace); status = H5Sclose(filespace); } void write_data ( hid_t container_object ) { hid_t strType, rowType, dataspace, dataset; hid_t dataset_properties; hsize_t dims[1], maxdims[1], i; herr_t status; strType = H5Tcopy(H5T_C_S1); status = H5Tset_size(strType, H5T_VARIABLE); strType = H5Tcopy(strType); rowType = H5Tcreate(H5T_COMPOUND, sizeof(ROWDATA)); H5Tinsert(rowType, "var1", HOFFSET(ROWDATA, var1), H5T_NATIVE_INT); H5Tinsert(rowType, "str", HOFFSET(ROWDATA, str), strType); H5Tinsert(rowType, "d1", HOFFSET(ROWDATA, d1), H5T_NATIVE_DOUBLE); H5Tinsert(rowType, "var2", HOFFSET(ROWDATA, var2), H5T_NATIVE_INT); H5Tinsert(rowType, "var4", HOFFSET(ROWDATA, var4), H5T_NATIVE_INT); H5Tinsert(rowType, "var3", HOFFSET(ROWDATA, var3), H5T_NATIVE_LLONG); H5Tinsert(rowType, "d2", HOFFSET(ROWDATA, d2), H5T_NATIVE_DOUBLE); dims[0] = 1; maxdims[0] = H5S_UNLIMITED; dataspace = H5Screate_simple(1, dims, maxdims); dataset_properties = H5Pcreate(H5P_DATASET_CREATE); dims[0] = CHUNK_DIMS; status = H5Pset_chunk(dataset_properties, 1, dims); #if USE_COMPRESSION status = H5Pset_deflate(dataset_properties, 1); #endif dataset = H5Dcreate(container_object, DATASET_NAME, rowType, dataspace, H5P_DEFAULT, dataset_properties, H5P_DEFAULT); status = H5Pclose(dataset_properties); for (i = 0; i < NUMBER_OF_BLOCKS; ++i) { write_block(dataset, rowType, i); } status = H5Sclose (dataspace); status = H5Dclose (dataset); } int main (void) { hid_t file, fapl, fcpl; /* handles */ hid_t dataspace, dataset; hid_t filespace; hid_t cparms; hid_t memspace; herr_t status; fapl = H5Pcreate(H5P_FILE_ACCESS); #if USE_SPLIT_FILES status = H5Pset_fapl_split(fapl, "-m.h5", H5P_DEFAULT, "-r.h5", H5P_DEFAULT); #endif #if 0 status = H5Pset_meta_block_size(fapl, 512); #endif #if 0 status = H5Pset_small_data_block_size(fapl, 0); #endif #if 0 status = H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST); #endif /* Create a new file. If file exists its contents will be overwritten. */ file = H5Fcreate ("ext" #if !USE_COMPRESSION ".h5" #endif , H5F_ACC_TRUNC, H5P_DEFAULT, fapl); write_data(file); status = H5Fclose(file); status = H5Pclose(fapl); }