summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/h5_select.c131
1 files changed, 115 insertions, 16 deletions
diff --git a/examples/h5_select.c b/examples/h5_select.c
index fe4850b..8d587d4 100644
--- a/examples/h5_select.c
+++ b/examples/h5_select.c
@@ -4,7 +4,9 @@
* Program takes 48 elements from the linear buffer and writes them into
* the matrix using 3x2 blocks, (4,3) stride and (2,4) count.
* Then four elements of the matrix are overwritten with the new values and
- * file is closed. Program reopens the file and reads and displays the result.
+ * file is closed. Program reopens the file and selects the union of two
+ * hyperslabs in the dataset in the file. Then it reads the selection into the
+ * memory dataset preserving the shape of the selectin.
*/
#include <hdf5.h>
@@ -27,7 +29,7 @@
dataspace parameters. */
#define MSPACE_RANK 2
#define MSPACE_DIM1 8
-#define MSPACE_DIM2 12
+#define MSPACE_DIM2 9
#define NPOINTS 4 /* Number of points that will be selected
and overwritten */
@@ -35,13 +37,17 @@ int main (void)
{
hid_t file, dataset; /* File and dataset identifiers */
- hid_t mid1, mid2, fid; /* Dataspace identifiers */
+ hid_t mid1, mid2, mid, fid; /* Dataspace identifiers */
hsize_t dim1[] = {MSPACE1_DIM}; /* Dimension size of the first dataset
(in memory) */
hsize_t dim2[] = {MSPACE2_DIM}; /* Dimension size of the second dataset
(in memory */
hsize_t fdim[] = {FSPACE_DIM1, FSPACE_DIM2};
/* Dimension sizes of the dataset (on disk) */
+ hsize_t mdim[] = {MSPACE_DIM1, MSPACE_DIM2}; /* Dimension sizes of the
+ dataset in memory when we
+ read selection from the
+ dataset on the disk */
hssize_t start[2]; /* Start of hyperslab */
hsize_t stride[2]; /* Stride of hyperslab */
@@ -50,11 +56,13 @@ int main (void)
hssize_t coord[NPOINTS][FSPACE_RANK]; /* Array to store selected points
from the file dataspace */
- herr_t ret;
- uint i,j;
- int matrix[MSPACE_DIM1][MSPACE_DIM2];
- int vector[MSPACE1_DIM];
- int values[] = {53, 59, 61, 67}; /* New values to be written */
+ herr_t ret;
+ uint i,j;
+ int matrix[FSPACE_DIM1][FSPACE_DIM2]; /* Buffer to write to the dataset */
+ int matrix_out[MSPACE_DIM1][MSPACE_DIM2]; /* Buffer to read from the
+ dataset */
+ int vector[MSPACE1_DIM];
+ int values[] = {53, 59, 61, 67}; /* New values to be written */
/*
* Buffers' initialization.
@@ -62,8 +70,8 @@ int main (void)
vector[0] = vector[MSPACE1_DIM - 1] = -1;
for (i = 1; i < MSPACE1_DIM - 1; i++) vector[i] = i;
- for (i = 0; i < MSPACE_DIM1; i++) {
- for (j = 0; j < MSPACE_DIM2; j++)
+ for (i = 0; i < FSPACE_DIM1; i++) {
+ for (j = 0; j < FSPACE_DIM2; j++)
matrix[i][j] = 0;
}
@@ -188,21 +196,112 @@ int main (void)
/*
* Open the dataset.
*/
- dataset = dataset = H5Dopen(file,"Matrix in file");
+ dataset = H5Dopen(file,"Matrix in file");
+
+ /*
+ * Get dataspace of the open dataset.
+ */
+ fid = H5Dget_space(dataset);
+
+ /*
+ * Select first hyperslab for the dataset in the file. The following
+ * elements are selected:
+ * 10 0 11 12
+ * 18 0 19 20
+ * 0 59 0 61
+ *
+ */
+ start[0] = 1; start[1] = 2;
+ block[0] = 1; block[1] = 1;
+ stride[0] = 1; stride[1] = 1;
+ count[0] = 3; count[1] = 4;
+ ret = H5Sselect_hyperslab(fid, H5S_SELECT_SET, start, stride, count, block);
+
+ /*
+ * Add second selected hyperslab to the selection.
+ * The following elements are selected:
+ * 19 20 0 21 22
+ * 0 61 0 0 0
+ * 27 28 0 29 30
+ * 35 36 67 37 38
+ * 43 44 0 45 46
+ * 0 0 0 0 0
+ * Note that two hyperslabs overlap. Common elements are:
+ * 19 20
+ * 0 61
+ */
+ start[0] = 2; start[1] = 4;
+ block[0] = 1; block[1] = 1;
+ stride[0] = 1; stride[1] = 1;
+ count[0] = 6; count[1] = 5;
+ ret = H5Sselect_hyperslab(fid, H5S_SELECT_OR, start, stride, count, block);
+
+ /*
+ * Create memory dataspace.
+ */
+ mid = H5Screate_simple(MSPACE_RANK, mdim, NULL);
+
+ /*
+ * Select two hyperslabs in memory. Hyperslabs has the same
+ * size and shape as the selected hyperslabs for the file dataspace.
+ */
+ start[0] = 0; start[1] = 0;
+ block[0] = 1; block[1] = 1;
+ stride[0] = 1; stride[1] = 1;
+ count[0] = 3; count[1] = 4;
+ ret = H5Sselect_hyperslab(mid, H5S_SELECT_SET, start, stride, count, block);
+ start[0] = 1; start[1] = 2;
+ block[0] = 1; block[1] = 1;
+ stride[0] = 1; stride[1] = 1;
+ count[0] = 6; count[1] = 5;
+ ret = H5Sselect_hyperslab(mid, H5S_SELECT_OR, start, stride, count, block);
+
+ /*
+ * Initialize data buffer.
+ */
+ for (i = 0; i < MSPACE_DIM1; i++) {
+ for (j = 0; j < MSPACE_DIM2; j++)
+ matrix_out[i][j] = 0;
+ }
/*
- * Read data back to the buffer matrix.
+ * Read data back to the buffer matrix_out.
*/
- ret = H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL,
- H5P_DEFAULT, matrix);
+ ret = H5Dread(dataset, H5T_NATIVE_INT, mid, fid,
+ H5P_DEFAULT, matrix_out);
/*
- * Display the result.
+ * Display the result. Memory dataset is:
+ *
+ * 10 0 11 12 0 0 0 0 0
+ * 18 0 19 20 0 21 22 0 0
+ * 0 59 0 61 0 0 0 0 0
+ * 0 0 27 28 0 29 30 0 0
+ * 0 0 35 36 67 37 38 0 0
+ * 0 0 43 44 0 45 46 0 0
+ * 0 0 0 0 0 0 0 0 0
+ * 0 0 0 0 0 0 0 0 0
*/
for (i=0; i < MSPACE_DIM1; i++) {
- for(j=0; j < MSPACE_DIM2; j++) printf("%3d ", matrix[i][j]);
+ for(j=0; j < MSPACE_DIM2; j++) printf("%3d ", matrix_out[i][j]);
printf("\n");
}
+ /*
+ * Close memory file and memory dataspaces.
+ */
+ ret = H5Sclose(mid);
+ ret = H5Sclose(fid);
+
+ /*
+ * Close dataset.
+ */
+ ret = H5Dclose(dataset);
+
+ /*
+ * Close the file.
+ */
+ ret = H5Fclose(file);
+
return 0;
}