/* Create compressed dataset */ 

#include "hdf5.h"

#define FILE    "zip.h5"

/* Uncomment to remove compression and 
   comment out line above
#define FILE    "unzip.h5"
*/

#define RANK    2
 
int
main(void)
{

    hid_t    file, grp;
    hid_t    dataset, dataspace;
    hid_t    plist; 

    herr_t   status;
    hsize_t  dims[2];
    hsize_t  cdims[2];
 
    int      idx;
    int      i,j;
    int      buf[1000][20];
    int      rbuf [1000][20];

    /*
     * Create a file.
     */
    file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
    printf ("H5Fcreate returns: %d\n", file);

    /*
     * Create a group in the file. 
     */
    grp = H5Gcreate(file, "/Data", 0);
    printf ("H5Gcreate returns: %d\n", grp);

    /*
     * Create dataset "Compressed Data" in the group using absolute
     * name. Dataset creation property list is modified to use 
     * GZIP compression with the compression effort set to 6. 
     * Note that compression can be used only when dataset is chunked. 
     */
    dims[0] = 1000;
    dims[1] = 20;
    cdims[0] = 20;
    cdims[1] = 20;
    dataspace = H5Screate_simple(RANK, dims, NULL);
    printf ("H5Screate_simple: %d\n", dataspace);

/*  Uncomment this section if you want to use GZIP compression
    Be sure to comment out the line following, as well.

*/
    plist  = H5Pcreate(H5P_DATASET_CREATE);
    printf ("H5Pcreate returns: %d\n", plist);
    status = H5Pset_chunk(plist, 2, cdims);
    printf ("H5Pset_chunk returns: %d\n", status);
    status = H5Pset_deflate( plist, 6); 
    printf ("H5Pset_deflate returns: %d\n", status);

    dataset = H5Dcreate(file, "/Data/Compressed_Data", H5T_STD_I32BE, 
                        dataspace, plist); 

/*
    dataset = H5Dcreate(file, "/Data/Uncompressed_Data", H5T_STD_I32BE, 
                        dataspace, H5P_DEFAULT); 
*/

    printf ("H5Dcreate returns: %d\n", dataset);


 
    for (i = 0; i< dims[0]; i++) {
        for (j=0; j<dims[1]; j++) {
           buf[i][j] = i+j;
    }
    }
    status= H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
    printf ("H5Dwrite: %d\n", status);

    status=H5Sclose(dataspace);
    printf ("H5Sclose: %d\n", status);

    status=H5Dclose(dataset);
    printf ("H5Dclose%d\n", status);

    status = H5Gclose (grp);
    printf ("H5Gclose: %d\n", status);

    status=H5Fclose(file);
    printf ("H5Fclose: %d\n", status);

    /*
     * Now reopen the file and group in the file. 
     */
    file = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT);
    printf ("H5Fopen: %d\n", file);
    grp  = H5Gopen(file, "Data");
    printf ("H5Gopen: %d\n", grp);

    dataset = H5Dopen(grp, "Compressed_Data");

/* Uncomment, if removing compression 
   and comment out line above
    dataset = H5Dopen(grp, "Uncompressed_Data");
*/
    printf ("H5Dopen: %d\n", dataset);

    status - H5Dread (dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
                      H5P_DEFAULT, rbuf); 
 
    printf ("\nData (10 lines):\n");

    for (i=0; i<10; i++)
    {
      for (j=0; j<20; j++)
         printf(" %d", rbuf[i][j]);
      printf ("\n");
    }

    status = H5Dclose(dataset);
    printf ("\nH5Dclose: %d\n", status);

    status = H5Gclose (grp);
    printf ("H5Gclose: %d\n", status);

    status = H5Fclose(file);
    printf ("H5Fclose: %d\n", status);

}

