/*
 *   Create a 1-D dataset and write values to it.
 *   Close all interfaces, re-open and read 3 selected
 *   values from the dataset.
 */

#include <hdf5.h>
#define FILE "2d.h5"

int main() {

   hid_t       file_id, dataset_id, dataspace, memspace;
   hsize_t     dims[2];
   herr_t      status;

   hsize_t     dimsm[2];
   int         i,j, dset_data[5][10], rdset_data[5][10];
   hsize_t     count[2], stride[2], block[2];
   hsize_t    start[2];

   /* Initialize read/write buffers */
   for (i = 0; i < 5; i++)
   for (j = 0; j < 10; j++)
   {
        dset_data[i][j] = 10*i;
        rdset_data[i][j] = 0;
   }

   /* Create a new file using default properties. */
   file_id = H5Fcreate (FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

   /* Create the data space for the dataset. */
   dims[0] = 5; 
   dims[1] = 10; 
   dataspace = H5Screate_simple (2, dims, NULL);

   /* Create dataset and write values to it */
   dataset_id = H5Dcreate (file_id, "dset", H5T_STD_I32BE, dataspace, 
                           H5P_DEFAULT);

   status = H5Dwrite (dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
                      H5P_DEFAULT, dset_data);

   /* End access to dataset, dataspace and file */
   status = H5Dclose (dataset_id);
   status = H5Sclose (dataspace);
   status = H5Fclose (file_id);

/* 
 *  Read selected datapoints. 
 */


   file_id = H5Fopen (FILE, H5F_ACC_RDWR, H5P_DEFAULT);
   dataset_id = H5Dopen(file_id, "dset");

   dataspace = H5Dget_space (dataset_id);
   start [0] = 1;
   start [1] = 2;
   count [0] = 3;
   count [1] = 3;
   status = H5Sselect_hyperslab  (dataspace, H5S_SELECT_SET, start, NULL,
                                  count, NULL);

   dimsm[0] = 5;
   dimsm[1] = 10;
   memspace = H5Screate_simple (2, dimsm, NULL);  
   status = H5Sselect_hyperslab  (memspace, H5S_SELECT_SET, start, NULL,
                                  count, NULL);
   
   status = H5Dread (dataset_id, H5T_NATIVE_INT, memspace, dataspace, 
                     H5P_DEFAULT, rdset_data);

   for (i=0; i<5; i++)
   {
     for (j=0; j<10; j++)
        printf (" %i", rdset_data[i][j]);
     printf ("\n");
   }
   printf ("\n");

   status = H5Dclose (dataset_id);
   status = H5Sclose (memspace);
   status = H5Sclose (dataspace);
   status = H5Fclose(file_id);

}


