diff options
Diffstat (limited to 'HDF5Examples/C/H5FLT/h5ex_d_zfp.c')
-rw-r--r-- | HDF5Examples/C/H5FLT/h5ex_d_zfp.c | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/HDF5Examples/C/H5FLT/h5ex_d_zfp.c b/HDF5Examples/C/H5FLT/h5ex_d_zfp.c new file mode 100644 index 0000000..cb7d24d --- /dev/null +++ b/HDF5Examples/C/H5FLT/h5ex_d_zfp.c @@ -0,0 +1,233 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * All rights reserved. * + * * + * This file is part of the HDF5 ZFP filter plugin source. The full * + * copyright notice, including terms governing use, modification, and * + * terms governing use, modification, and redistribution, is contained in * + * the file COPYING, which can be found at the root of the ZFP source code * + * distribution tree. If you do not have access to this file, you may * + * request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/************************************************************ + + This example shows how to write data and read it from a dataset + using zfp compression. + zfp filter is not available in HDF5. + The example uses a new feature available in HDF5 version 1.8.11 + to discover, load and register filters at run time. + + ************************************************************/ + +#include "hdf5.h" +#include <stdio.h> +#include <stdlib.h> + +#define FILE "h5ex_d_zfp.h5" +#define DATASET "DS1" +#define DIM0 32 +#define DIM1 64 +#define CHUNK0 4 +#define CHUNK1 8 +#define H5Z_FILTER_ZFP 32013 + +int +main(void) +{ + hid_t file_id = H5I_INVALID_HID; /* Handles */ + hid_t space_id = H5I_INVALID_HID; /* Handles */ + hid_t dset_id = H5I_INVALID_HID; /* Handles */ + hid_t dcpl_id = H5I_INVALID_HID; /* Handles */ + herr_t status; + htri_t avail; + H5Z_filter_t filter_id = 0; + char filter_name[80]; + hsize_t dims[2] = {DIM0, DIM1}, chunk[2] = {CHUNK0, CHUNK1}; + size_t nelmts = 3; /* number of elements in cd_values */ + unsigned int flags; + unsigned filter_config; + const unsigned int cd_values[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + unsigned int values_out[10] = {99, 99, 99, 99, 99, 99, 99, 99, 99, 99}; + float wdata[DIM0][DIM1], /* Write buffer */ + rdata[DIM0][DIM1]; /* Read buffer */ + float max; + hsize_t i, j; + int ret_value = 1; + + /* + * Initialize data. + */ + for (i = 0; i < DIM0; i++) + for (j = 0; j < DIM1; j++) + wdata[i][j] = (float)(i * j) - (float)(j); + + /* + * Create a new file using the default properties. + */ + file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + if (file_id < 0) + goto done; + + /* + * Create dataspace. Setting maximum size to NULL sets the maximum + * size to be the current size. + */ + space_id = H5Screate_simple(2, dims, NULL); + if (space_id < 0) + goto done; + + /* + * Create the dataset creation property list, add the gzip + * compression filter and set the chunk size. + */ + dcpl_id = H5Pcreate(H5P_DATASET_CREATE); + if (dcpl_id < 0) + goto done; + + status = H5Pset_filter(dcpl_id, H5Z_FILTER_ZFP, H5Z_FLAG_OPTIONAL, 0, NULL); + if (status < 0) + goto done; + + /* + * Check that filter is registered with the library now. + * If it is registered, retrieve filter's configuration. + */ + avail = H5Zfilter_avail(H5Z_FILTER_ZFP); + if (avail) { + status = H5Zget_filter_info(H5Z_FILTER_ZFP, &filter_config); + if ((filter_config & H5Z_FILTER_CONFIG_ENCODE_ENABLED) && + (filter_config & H5Z_FILTER_CONFIG_DECODE_ENABLED)) + printf("zfp filter is available for encoding and decoding.\n"); + } + else { + printf("H5Zfilter_avail - not found.\n"); + goto done; + } + status = H5Pset_chunk(dcpl_id, 2, chunk); + if (status < 0) + printf("failed to set chunk.\n"); + + /* + * Create the dataset. + */ + printf("....Create dataset ................\n"); + dset_id = H5Dcreate(file_id, DATASET, H5T_IEEE_F32LE, space_id, H5P_DEFAULT, dcpl_id, H5P_DEFAULT); + if (dset_id < 0) { + printf("failed to create dataset.\n"); + goto done; + } + + /* + * Write the data to the dataset. + */ + printf("....Writing zfp compressed data ................\n"); + status = H5Dwrite(dset_id, H5T_IEEE_F32LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata[0]); + if (status < 0) + printf("failed to write data.\n"); + + /* + * Close and release resources. + */ + H5Dclose(dset_id); + dset_id = -1; + H5Pclose(dcpl_id); + dcpl_id = -1; + H5Sclose(space_id); + space_id = -1; + H5Fclose(file_id); + file_id = -1; + status = H5close(); + if (status < 0) { + printf("/nFAILED to close library/n"); + goto done; + } + + printf("....Close the file and reopen for reading ........\n"); + /* + * Now we begin the read section of this example. + */ + + /* + * Open file and dataset using the default properties. + */ + file_id = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + if (file_id < 0) + goto done; + + dset_id = H5Dopen(file_id, DATASET, H5P_DEFAULT); + if (dset_id < 0) + goto done; + + /* + * Retrieve dataset creation property list. + */ + dcpl_id = H5Dget_create_plist(dset_id); + if (dcpl_id < 0) + goto done; + + /* + * Retrieve and print the filter id, compression level and filter's name for zfp. + */ + filter_id = H5Pget_filter2(dcpl_id, (unsigned)0, &flags, &nelmts, values_out, sizeof(filter_name), + filter_name, NULL); + printf("Filter info is available from the dataset creation property\n"); + printf(" Filter identifier is "); + switch (filter_id) { + case H5Z_FILTER_ZFP: + printf("%d\n", filter_id); + printf(" Number of parameters is %d with the value %u\n", nelmts, values_out[0]); + printf(" To find more about the filter check %s\n", filter_name); + break; + default: + printf("Not expected filter\n"); + break; + } + + /* + * Read the data using the default properties. + */ + printf("....Reading zfp compressed data ................\n"); + status = H5Dread(dset_id, H5T_IEEE_F32LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata[0]); + if (status < 0) + printf("failed to read data.\n"); + + /* + * Find the maximum value in the dataset, to verify that it was + * read correctly. + */ + max = rdata[0][0]; + for (i = 0; i < DIM0; i++) + for (j = 0; j < DIM1; j++) { + /*printf("%f \n", rdata[i][j]); */ + if (max < rdata[i][j]) + max = rdata[i][j]; + } + /* + * Print the maximum value. + */ + printf("Maximum value in %s is %6.4f\n", DATASET, max); + /* + * Check that filter is registered with the library now. + */ + avail = H5Zfilter_avail(H5Z_FILTER_ZFP); + if (avail) + printf("zfp filter is available now since H5Dread triggered loading of the filter.\n"); + + ret_value = 0; + +done: + /* + * Close and release resources. + */ + if (dcpl_id >= 0) + H5Pclose(dcpl_id); + if (dset_id >= 0) + H5Dclose(dset_id); + if (space_id >= 0) + H5Sclose(space_id); + if (file_id >= 0) + H5Fclose(file_id); + + return ret_value; +} |