/*******************************************************************

   h5shzip.c - This example uses the data shuffle filter with 
               deflate compression

*******************************************************************/  

#include "hdf5.h"

#define FILE    "shzip.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);

    dims[0] = 1000;
    dims[1] = 20;
    cdims[0] = 20;
    cdims[1] = 20;
    dataspace = H5Screate_simple(RANK, dims, NULL);
    printf ("H5Screate_simple: %d\n", dataspace);

 /* Get property list for gzip compression. Specify shuffle filter. */
 /* Note that compression and shuffle filter must be used with chunking */
    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_shuffle (plist);
    printf ("H5Pset_shuffle returns: %d\n", status);
    status = H5Pset_deflate( plist, 6); 
    printf ("H5Pset_deflate returns: %d\n", status);

 /* Create dataset with property list just created */
    dataset = H5Dcreate(file, "/Data/Compressed_Data", H5T_STD_I32BE, 
                        dataspace, plist); 

    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 = H5Pclose (plist);
    printf ("H5Pclose: %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 dataset and read data */
    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");
    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);

}
