From 1d097633a6419dff02c866046606de246204cff0 Mon Sep 17 00:00:00 2001 From: Eugen Wintersberger Date: Sun, 23 Dec 2018 12:33:49 +0100 Subject: [PATCH] Added h5ex_d_alloc HDF group example Update #318 --- examples/CMakeLists.txt | 1 + examples/hdfgroup/CMakeLists.txt | 9 ++ examples/hdfgroup/H5D/CMakeLists.txt | 3 + examples/hdfgroup/H5D/h5ex_d_alloc.cpp | 126 +++++++++++++++++++++++++ 4 files changed, 139 insertions(+) create mode 100644 examples/hdfgroup/CMakeLists.txt create mode 100644 examples/hdfgroup/H5D/CMakeLists.txt create mode 100644 examples/hdfgroup/H5D/h5ex_d_alloc.cpp diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index d685d5574c..ecacae00e4 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -52,6 +52,7 @@ add_dependencies(examples # add_subdirectory(attributes) +add_subdirectory(hdfgroup) if (H5CPP_SWMR_ENABLED) add_subdirectory(swmr) diff --git a/examples/hdfgroup/CMakeLists.txt b/examples/hdfgroup/CMakeLists.txt new file mode 100644 index 0000000000..a065d73757 --- /dev/null +++ b/examples/hdfgroup/CMakeLists.txt @@ -0,0 +1,9 @@ + + +#----------------------------------------------------------------------------- +# Build the C Examples +#----------------------------------------------------------------------------- +add_subdirectory (H5D) +add_subdirectory (H5G) +add_subdirectory (H5T) +#add_subdirectory (${PROJECT_SOURCE_DIR}/Performance ${PROJECT_BINARY_DIR}/Performance) diff --git a/examples/hdfgroup/H5D/CMakeLists.txt b/examples/hdfgroup/H5D/CMakeLists.txt new file mode 100644 index 0000000000..529c29a55c --- /dev/null +++ b/examples/hdfgroup/H5D/CMakeLists.txt @@ -0,0 +1,3 @@ + +add_executable(h5ex_d_alloc h5ex_d_alloc.cpp) +target_link_libraries(h5ex_d_alloc h5cpp) \ No newline at end of file diff --git a/examples/hdfgroup/H5D/h5ex_d_alloc.cpp b/examples/hdfgroup/H5D/h5ex_d_alloc.cpp new file mode 100644 index 0000000000..4b50161b5f --- /dev/null +++ b/examples/hdfgroup/H5D/h5ex_d_alloc.cpp @@ -0,0 +1,126 @@ +/************************************************************ + + This example shows how to set the space allocation time + for a dataset. The program first creates two datasets, + one with the default allocation time (late) and one with + early allocation time, and displays whether each has been + allocated and their allocation size. Next, it writes data + to the datasets, and again displays whether each has been + allocated and their allocation size. + + This file is intended for use with HDF5 Library version 1.8 + + ************************************************************/ + +#include +#include +#include + + +#define FILE "h5ex_d_alloc.h5" +#define DATASET1 "DS1" +#define DATASET2 "DS2" +#define DIM0 4 +#define DIM1 7 +#define FILLVAL 99 + +int32_t generate() +{ + static int32_t value = 0; + return value++; +} + +using namespace hdf5; + +int +main (void) +{ + std::array buffer; + std::generate(buffer.begin(),buffer.end(),generate); + + /* + * Create a new file using the default properties. + */ + file::File file = file::create(FILE, file::AccessFlags::TRUNCATE); + + /* + * Create dataspace. Setting maximum size to NULL sets the maximum + * size to be the current size. + */ + dataspace::Simple space({DIM0,DIM1}); + + /* + * Create the dataset creation property list, and set the chunk + * size. + */ + property::DatasetCreationList dcpl; + property::LinkCreationList lcpl; + + /* + * Set the allocation time to "early". This way we can be sure + * that reading from the dataset immediately after creation will + * return the fill value. + */ + dcpl.allocation_time(property::DatasetAllocTime::EARLY); + + printf ("Creating datasets...\n"); + printf ("%s has allocation time H5D_ALLOC_TIME_LATE\n", DATASET1); + printf ("%s has allocation time H5D_ALLOC_TIME_EARLY\n\n", DATASET2); + + /* + * Create the dataset using the dataset creation property list. + */ + node::Dataset dset1(file.root(),DATASET1,datatype::create(),space); + node::Dataset dset2(file.root(),DATASET2,datatype::create(),space,lcpl,dcpl); + + /* + * Retrieve and print space status and storage size for dset1. + */ + H5D_space_status_t space_status; + H5Dget_space_status (static_cast(dset1), &space_status); + hsize_t storage_size = H5Dget_storage_size (static_cast(dset1)); + printf ("Space for %s has%sbeen allocated.\n", DATASET1, + space_status == H5D_SPACE_STATUS_ALLOCATED ? " " : " not "); + printf ("Storage size for %s is: %ld bytes.\n", DATASET1, + (long) storage_size); + + /* + * Retrieve and print space status and storage size for dset2. + */ + H5Dget_space_status (static_cast(dset2), &space_status); + storage_size = H5Dget_storage_size (static_cast(dset2)); + printf ("Space for %s has%sbeen allocated.\n", DATASET2, + space_status == H5D_SPACE_STATUS_ALLOCATED ? " " : " not "); + printf ("Storage size for %s is: %ld bytes.\n", DATASET2, + (long) storage_size); + + printf ("\nWriting data...\n\n"); + + /* + * Write the data to the datasets. + */ + dset1.write(buffer); + dset2.write(buffer); + + /* + * Retrieve and print space status and storage size for dset1. + */ + H5Dget_space_status (static_cast(dset1), &space_status); + storage_size = H5Dget_storage_size (static_cast(dset1)); + printf ("Space for %s has%sbeen allocated.\n", DATASET1, + space_status == H5D_SPACE_STATUS_ALLOCATED ? " " : " not "); + printf ("Storage size for %s is: %ld bytes.\n", DATASET1, + (long) storage_size); + + /* + * Retrieve and print space status and storage size for dset2. + */ + H5Dget_space_status (static_cast(dset2), &space_status); + storage_size = H5Dget_storage_size (static_cast(dset2)); + printf ("Space for %s has%sbeen allocated.\n", DATASET2, + space_status == H5D_SPACE_STATUS_ALLOCATED ? " " : " not "); + printf ("Storage size for %s is: %ld bytes.\n", DATASET2, + (long) storage_size); + + return 0; +}