summaryrefslogtreecommitdiffstats
path: root/doc/html/Tutor/examples/h5_mount.c
blob: 452ad6ef797c86ceb8e76371ab1352a3d15e588a (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
/* 
 * This program shows the concept of "mounting files". 
 * Program creates one file with group G in it, and another
 * file with dataset D. Then second file is mounted in the first one
 * under the "mounting point" G. Dataset D is accessed in the first file 
 * under name /G/D and data is printed out. 
 */

#include<hdf5.h>

#define FILE1 "mount1.h5"
#define FILE2 "mount2.h5"

#define RANK 2
#define NX 4
#define NY 5

int main(void) 
{

   hid_t fid1, fid2, gid;  /* Files and group identifiers */
   hid_t did, tid, sid;    /* Dataset and datatype identifiers */ 

   herr_t status;
   hsize_t dims[] = {NX,NY}; /* Dataset dimensions */

   int i, j;
   int bm[NX][NY], bm_out[NX][NY]; /* Data buffers */

   /*
    * Initialization of buffer matrix "bm" 
    */
   for(i =0; i<NX; i++) {
    for(j = 0; j<NY; j++)
      bm[i][j] = i + j;
   }

   /* 
    * Create first file and a group in it.
    */
   fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
   gid = H5Gcreate(fid1, "/G", 0);

   /* 
    * Close group and file 
    */
   H5Gclose(gid);
   H5Fclose(fid1);

   /* 
    * Create second file and dataset "D" in it.
    */
   fid2 = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
   dims[0] = NX;
   dims[1] = NY;
   sid = H5Screate_simple(RANK, dims, NULL);
   did = H5Dcreate(fid2, "D", H5T_NATIVE_INT, sid, H5P_DEFAULT);
  
   /*
    * Write data to the dataset.
    */
   status = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, bm);

   /* 
    * Close all identifiers.
    */
   H5Sclose(sid);
   H5Dclose(did);
   H5Fclose(fid2);

   /* 
    * Reopen both files
    */
   fid1 = H5Fopen(FILE1, H5F_ACC_RDONLY, H5P_DEFAULT);
   fid2 = H5Fopen(FILE2, H5F_ACC_RDONLY, H5P_DEFAULT);
  
   /* 
    * Mount second file under G in the first file.
    */
   H5Fmount(fid1, "/G", fid2, H5P_DEFAULT);

   /* 
    * Access dataset D in the first file under /G/D name.
    */
   did = H5Dopen(fid1,"/G/D");
   tid = H5Dget_type(did);
   status = H5Dread(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, bm_out);

   /*
    * Print out the data.
    */
   for(i=0; i<NX; i++){
    for(j=0; j<NY; j++)
        printf("  %d", bm_out[i][j]);
	printf("\n");
   }

   /* 
    * Close all identifers
    */
   H5Tclose(tid);
   H5Dclose(did);
	
   /* 
    * Unmounting second file
    */
   H5Funmount(fid1, "/G");

   /*
    * Close both files
    */
   H5Fclose(fid1);
   H5Fclose(fid2);

   return 0;
}