diff options
Diffstat (limited to 'test/extend.c')
-rw-r--r-- | test/extend.c | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/test/extend.c b/test/extend.c new file mode 100644 index 0000000..8cadd6a --- /dev/null +++ b/test/extend.c @@ -0,0 +1,131 @@ +/* + * Copyright (C) 1998 Spizella Software + * All rights reserved. + * + * Programmer: Robb Matzke <matzke@llnl.gov> + * Friday, January 30, 1998 + * + * Purpose: Tests extendable datasets. + */ +#include <assert.h> +#include <hdf5.h> + +#define NX 100 /* USE AN EVEN NUMBER!*/ +#define NY 100 /* USE AN EVEN NUMBER!*/ + + +/*------------------------------------------------------------------------- + * Function: main + * + * Purpose: Tests extendable datasets + * + * Return: Success: exit(0) + * + * Failure: exit(non-zero) + * + * Programmer: Robb Matzke + * Friday, January 30, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +int +main (void) +{ + hid_t file, dataset, mem_space, file_space, cparms; + herr_t status; + int i, j, k, m; + static int buf1[NY][NX], buf2[NX/2][NY/2]; + static const size_t dims[2] = {NX, NY}; + static const size_t half_dims[2] = {NX/2, NY/2}; + static size_t maxdims[2] = {H5P_UNLIMITED, H5P_UNLIMITED}; + static size_t size[2]; + int offset[2]; + + /* Initialize buffer and space */ + for (i=0; i<NX; i++) { + for (j=0; j<NY; j++) { + buf1[i][j] = i*NY+j; + } + } + mem_space = H5Pcreate_simple (2, dims, maxdims); + assert (mem_space>=0); + + /* Create the file */ + file = H5Fcreate ("extend.h5", H5ACC_OVERWRITE, H5C_DEFAULT, H5C_DEFAULT); + assert (file>=0); + + /* Create the dataset which is originally NX by NY */ + cparms = H5Ccreate (H5C_DATASET_CREATE); + assert (cparms>=0); + status = H5Cset_chunk (cparms, 2, dims); + assert (status>=0); + dataset = H5Dcreate (file, "dataset", H5T_NATIVE_INT, mem_space, cparms); + assert (dataset>=0); + + /* Write the data */ + for (i=0; i<5; i++) { + for (j=0; j<5; j++) { + + /* Extend the dataset */ + offset[0] = i * NX; + offset[1] = j * NY; + size[0] = offset[0] + NX; + size[1] = offset[1] + NY; + status = H5Dextend (dataset, size); + assert (status>=0); + + /* Select a hyperslab */ + file_space = H5Dget_space (dataset); + assert (file_space>=0); + status = H5Pset_hyperslab (file_space, offset, dims, NULL); + assert (status>=0); + + /* Write to the hyperslab */ + status = H5Dwrite (dataset, H5T_NATIVE_INT, mem_space, file_space, + H5C_DEFAULT, buf1); + assert (status>=0); + H5Pclose (file_space); + } + } + H5Pclose (mem_space); + + + /* Read the data */ + mem_space = H5Pcreate_simple (2, half_dims, NULL); + for (i=0; i<10; i++) { + for (j=0; j<10; j++) { + + /* Select a hyperslab */ + offset[0] = i * NX/2; + offset[1] = j * NY/2; + file_space = H5Dget_space (dataset); + assert (file_space>=0); + status = H5Pset_hyperslab (file_space, offset, half_dims, NULL); + assert (status>=0); + + /* Read */ + status = H5Dread (dataset, H5T_NATIVE_INT, mem_space, file_space, + H5C_DEFAULT, buf2); + assert (status>=0); + H5Pclose (file_space); + + /* Compare */ + for (k=0; k<NX/2; k++) { + for (m=0; m<NY/2; m++) { + assert (buf2[k][m]==buf1[(i%2)*NX/2+k][(j%2)*NY/2+m]); + } + } + } + } + + + H5Dclose (dataset); + H5Fclose (file); + + exit (0); +} + + + |