diff options
Diffstat (limited to 'examples')
-rw-r--r-- | examples/h5_group.c | 140 | ||||
-rw-r--r-- | examples/h5_mount.c | 119 | ||||
-rw-r--r-- | examples/h5_select.c | 3 |
3 files changed, 237 insertions, 25 deletions
diff --git a/examples/h5_group.c b/examples/h5_group.c index 2a7ea48..00f9426 100644 --- a/examples/h5_group.c +++ b/examples/h5_group.c @@ -1,8 +1,9 @@ /* - * This example creates a group in the file and dataset in the group. - * Hard link to the group object is created and the dataset is accessed - * under different names. - * Iterator function is used to find the object names in the root group. + * This program creates a group in the file and two datasets in the group. + * Hard link to the group object is created and one of the datasets is accessed + * under new name. + * Iterator functions are used to find information about the objects + * in the root group and in the created group. */ @@ -12,9 +13,10 @@ #define FILE "group.h5" #define RANK 2 - herr_t file_info(hid_t loc_id, const char *name, void *opdata); /* Operator function */ +herr_t group_info(hid_t loc_id, const char *name, void *opdata); + /* Operator function */ int main(void) { @@ -28,7 +30,7 @@ main(void) hsize_t dims[2]; hsize_t cdims[2]; - int idx; + int idx_f, idx_g; /* * Create a file. @@ -56,9 +58,23 @@ main(void) H5Pset_deflate( plist, 6); dataset = H5Dcreate(file, "/Data/Compressed_Data", H5T_NATIVE_INT, dataspace, plist); - /* - * Close the dataset and the file. + * Close the first dataset . + */ + H5Sclose(dataspace); + H5Dclose(dataset); + + /* + * Create the second dataset. + */ + dims[0] = 500; + dims[1] = 20; + dataspace = H5Screate_simple(RANK, dims, NULL); + dataset = H5Dcreate(file, "/Data/Float_Data", H5T_NATIVE_FLOAT, + dataspace, H5P_DEFAULT); + + /* + *Close the second dataset and file. */ H5Sclose(dataspace); H5Dclose(dataset); @@ -74,7 +90,7 @@ main(void) * Access "Compressed_Data" dataset in the group. */ dataset = H5Dopen(grp, "Compressed_Data"); - if( dataset < 0) printf(" Dataset is not found. \n"); + if( dataset < 0) printf(" Dataset 'Compressed-Data' is not found. \n"); printf("\"/Data/Compressed_Data\" dataset is open \n"); /* @@ -100,11 +116,11 @@ main(void) */ status = H5Dclose(dataset); + /* - * Use iterator to see the names of the objects in the file - * root directory. + * Use iterator to see the names of the objects in the root group. */ - idx = H5Giterate(file, "/", NULL, file_info, NULL); + idx_f = H5Giterate(file, "/", NULL, file_info, NULL); /* * Unlink name "Data" and use iterator to see the names @@ -115,8 +131,13 @@ main(void) else printf("\"Data\" is unlinked \n"); - idx = H5Giterate(file, "/", NULL, file_info, NULL); - + idx_f = H5Giterate(file, "/", NULL, file_info, NULL); + + /* + * Use iterator to see the names of the objects in the group + * /Data_new. + */ + idx_g = H5Giterate(grp, "/Data_new", NULL, group_info, NULL); /* * Close the file. @@ -126,25 +147,96 @@ main(void) return 0; } + /* * Operator function. */ -herr_t -file_info(hid_t loc_id, const char *name, void *opdata) +herr_t file_info(hid_t loc_id, const char *name, void *opdata) { - hid_t grp; /* - * Open the group using its name. - */ - grp = H5Gopen(loc_id, name); - - /* - * Display group name. + * Display group name. The name is passed to the function by + * the Library. Some magic :-) */ printf("\n"); printf("Name : "); puts(name); - H5Gclose(grp); return 0; } + + +/* + * Operator function. + */ +herr_t group_info(hid_t loc_id, const char *name, void *opdata) +{ + hid_t did; /* dataset identifier */ + hid_t tid; /* datatype identifier */ + H5T_class_t class; + hid_t pid; /* data_property identifier */ + hsize_t chunk_dims_out[2]; + + int rank_chunk; + /* + * Open the datasets using their names. + */ + did = H5Dopen(loc_id, name); + + /* + * Display dataset name. + */ + printf("\n"); + printf("Name : "); + puts(name); + + /* + * Display dataset information. + */ + tid = H5Dget_type(did); /* get datatype*/ + pid = H5Dget_create_plist(did); /* get creation property list */ + + /* + * Check if dataset is chunked. + */ + if(H5D_CHUNKED == H5Pget_layout(pid)){ + /* + * get chunking information: rank and dimensions. + */ + rank_chunk = H5Pget_chunk(pid, 2, chunk_dims_out); + printf("chunk rank %d, dimensions %lu x %lu\n", rank_chunk, + (unsigned long)(chunk_dims_out[0]), + (unsigned long)(chunk_dims_out[1])); + } + else{ + class = H5Tget_class(tid); + if(class < 0){ + puts(" Invalid datatype.\n"); + } + else { + if(class == H5T_INTEGER) + puts(" Datatype is 'H5T_NATIVE_INTEGER'.\n"); + if(class == H5T_FLOAT) + puts(" Datatype is 'H5T_NATIVE_FLOAT'.\n"); + if(class == H5T_STRING) + puts(" Datatype is 'H5T_NATIVE_STRING'.\n"); + if(class == H5T_BITFIELD) + puts(" Datatype is 'H5T_NATIVE_BITFIELD'.\n"); + if(class == H5T_OPAQUE) + puts(" Datatype is 'H5T_NATIVE_OPAQUE'.\n"); + if(class == H5T_COMPOUND) + puts(" Datatype is 'H5T_NATIVE_COMPOUND'.\n"); + } + } + + + H5Dclose(did); + H5Pclose(pid); + H5Tclose(tid); + return 0; + } + + + + + + diff --git a/examples/h5_mount.c b/examples/h5_mount.c new file mode 100644 index 0000000..452ad6e --- /dev/null +++ b/examples/h5_mount.c @@ -0,0 +1,119 @@ +/* + * This program shows the concept of "mounting files". + * Program creates one file with group G in it, and another + * file with dataset D. Then second file is mounted in the first one + * under the "mounting point" G. Dataset D is accessed in the first file + * under name /G/D and data is printed out. + */ + +#include<hdf5.h> + +#define FILE1 "mount1.h5" +#define FILE2 "mount2.h5" + +#define RANK 2 +#define NX 4 +#define NY 5 + +int main(void) +{ + + hid_t fid1, fid2, gid; /* Files and group identifiers */ + hid_t did, tid, sid; /* Dataset and datatype identifiers */ + + herr_t status; + hsize_t dims[] = {NX,NY}; /* Dataset dimensions */ + + int i, j; + int bm[NX][NY], bm_out[NX][NY]; /* Data buffers */ + + /* + * Initialization of buffer matrix "bm" + */ + for(i =0; i<NX; i++) { + for(j = 0; j<NY; j++) + bm[i][j] = i + j; + } + + /* + * Create first file and a group in it. + */ + fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + gid = H5Gcreate(fid1, "/G", 0); + + /* + * Close group and file + */ + H5Gclose(gid); + H5Fclose(fid1); + + /* + * Create second file and dataset "D" in it. + */ + fid2 = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + dims[0] = NX; + dims[1] = NY; + sid = H5Screate_simple(RANK, dims, NULL); + did = H5Dcreate(fid2, "D", H5T_NATIVE_INT, sid, H5P_DEFAULT); + + /* + * Write data to the dataset. + */ + status = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, bm); + + /* + * Close all identifiers. + */ + H5Sclose(sid); + H5Dclose(did); + H5Fclose(fid2); + + /* + * Reopen both files + */ + fid1 = H5Fopen(FILE1, H5F_ACC_RDONLY, H5P_DEFAULT); + fid2 = H5Fopen(FILE2, H5F_ACC_RDONLY, H5P_DEFAULT); + + /* + * Mount second file under G in the first file. + */ + H5Fmount(fid1, "/G", fid2, H5P_DEFAULT); + + /* + * Access dataset D in the first file under /G/D name. + */ + did = H5Dopen(fid1,"/G/D"); + tid = H5Dget_type(did); + status = H5Dread(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, bm_out); + + /* + * Print out the data. + */ + for(i=0; i<NX; i++){ + for(j=0; j<NY; j++) + printf(" %d", bm_out[i][j]); + printf("\n"); + } + + /* + * Close all identifers + */ + H5Tclose(tid); + H5Dclose(did); + + /* + * Unmounting second file + */ + H5Funmount(fid1, "/G"); + + /* + * Close both files + */ + H5Fclose(fid1); + H5Fclose(fid2); + + return 0; +} + + + diff --git a/examples/h5_select.c b/examples/h5_select.c index fa8ec0c..5626e03 100644 --- a/examples/h5_select.c +++ b/examples/h5_select.c @@ -33,7 +33,8 @@ #define NPOINTS 4 /* Number of points that will be selected and overwritten */ -int main (void) +int +main (void) { hid_t file, dataset; /* File and dataset identifiers */ |