summaryrefslogtreecommitdiffstats
path: root/examples/h5_read.c
blob: 8384af9decdb9dbc323cb81bbb6a6b8c4cd091c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*  
 *   This example reads hyperslab from the SDS.h5 file 
 *   created by h5_write.c program into two-dimensional
 *   plane of the tree-dimensional array. 
 *   Information about dataset in the SDS.h5 file is obtained. 
 */
 
#include "hdf5.h"

#define FILE        "SDS.h5"
#define DATASETNAME "IntArray" 
#define NX_SUB  3           /* hyperslab dimensions */ 
#define NY_SUB  4 
#define NX 7           /* output buffer dimensions */ 
#define NY 7 
#define NZ  3 
#define RANK         2
#define RANK_OUT     3

main ()
{
   hid_t       file, dataset;         /* handles */
   hid_t       datatype, dataspace;   
   hid_t       memspace; 
   H5T_class_t class;                 /* data type class */
   H5T_order_t order;                 /* data order */
   size_t      size;                  /* size of the data element
                                         stored in file */ 
   size_t      dimsm[3];              /* memory space dimensions */
   size_t      dims_out[2];           /* dataset dimensions */      
   herr_t      status;                             

   int         data_out[NX][NY][NZ ]; /* output buffer */
   
   size_t      count[2];              /* size of the hyperslab in the file */
   int         offset[2];             /* hyperslab offset in the file */
   size_t      count_out[3];          /* size of the hyperslab in memory */
   int         offset_out[3];         /* hyperslab offset in memory */
   int         i, j, k, status_n, rank;

for (j = 0; j < NX; j++) {
    for (i = 0; i < NY; i++) {
        for (k = 0; k < NZ ; k++)
            data_out[j][i][k] = 0;
    }
} 
 
/*
 * Open the file and the dataset.
 */
file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT);
dataset = H5Dopen(file, DATASETNAME);

/*
 * Get datatype and dataspace handles and then query
 * dataset class, order, size, rank and dimensions.
 */

datatype  = H5Dget_type(dataset);     /* datatype handle */ 
class     = H5Tget_class(datatype);
if (class == H5T_INTEGER) printf("Data set has INTEGER type \n");
order     = H5Tget_order(datatype);
if (order == H5T_ORDER_LE) printf("Little endian order \n");

size  = H5Tget_size(datatype);
printf(" Data size is %d \n", size);

dataspace = H5Dget_space(dataset);    /* dataspace handle */
rank      = H5Sget_ndims(dataspace);
status_n  = H5Sget_dims(dataspace, dims_out);
printf("rank %d, dimensions %d x %d \n", rank, dims_out[0], dims_out[1]);

/* 
 * Define hyperslab in the datatset. 
 */
offset[0] = 1;
offset[1] = 2;
count[0]  = NX_SUB;
count[1]  = NY_SUB;
status = H5Sset_hyperslab(dataspace, offset, count, NULL);

/*
 * Define the memory dataspace.
 */
dimsm[0] = NX;
dimsm[1] = NY;
dimsm[2] = NZ ;
memspace = H5Screate_simple(RANK_OUT,dimsm,NULL);   

/* 
 * Define memory hyperslab. 
 */
offset_out[0] = 3;
offset_out[1] = 0;
offset_out[2] = 0;
count_out[0]  = NX_SUB;
count_out[1]  = NY_SUB;
count_out[2]  = 1;
status = H5Sset_hyperslab(memspace, offset_out, count_out, NULL);

/*
 * Read data from hyperslab in the file into the hyperslab in 
 * memory and display.
 */
status = H5Dread(dataset, H5T_NATIVE_INT, memspace, dataspace,
                 H5P_DEFAULT, data_out);
for (j = 0; j < NX; j++) {
    for (i = 0; i < NY; i++) printf("%d ", data_out[j][i][0]);
    printf("\n");
}
                                         /*  0 0 0 0 0 0 0
                                             0 0 0 0 0 0 0
                                             0 0 0 0 0 0 0
                                             3 4 5 6 0 0 0  
                                             4 5 6 7 0 0 0
                                             5 6 7 8 0 0 0
                                             0 0 0 0 0 0 0 */

/*
 * Close/release resources.
 */
H5Tclose(datatype);
H5Dclose(dataset);
H5Sclose(dataspace);
H5Sclose(memspace);
H5Fclose(file);

}