#include <hdf5.h>
#include <hdf5_hl.h>

  void tick(char* data) {
    clock_t c2 = clock();
    double millis = ((c2 - c1)* 1000)/ CLOCKS_PER_SEC;
    printf("%s - elapsed %f ms \n", data, millis);
    c1 = c2;
  }

  void testNetCDFLimits() {

    int num_var = 100;
    int num_elements_var = 100000;
//    size_t buffer_size = 1;          ???
#define buffer_size 1
    int ncid, udim;
    int varids[num_var];
    size_t start;
    int buffer[buffer_size];
    char varname[10];
    char filename[100];

//    sprintf(filename, "%d-test.nc4", num_var);
    sprintf(filename, "%d-test.h5", num_var);

    // create the file //
//    if ( nc_create(filename, NC_CLOBBER | NC_NETCDF4, &ncid) ) NCERR;
    hid_t file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
    if(file < 0) { 
      printf("Can't create file %s\n", filename);
      return(1);
    }

    tick("created");

//  dimensions are senseless here: each dataset(variable) stores its dimensions

//    if ( nc_def_dim(ncid, "udim1", 0, &udim) ) NCERR;
//    if ( nc_def_dim(ncid, "udim2", 0, &udim) ) NCERR;
//    tick("dimensions defined");

/* this is spare code

    for (int j = 0; j < num_var; j++) {
        sprintf(varname,"var-%d",j);
        if ( nc_def_var(ncid, varname, NC_INT, 1, &udim, &varids[j]) ) NCERR;
        if ( nc_set_var_chunk_cache(ncid, varids[j], 0, 0, 0.75) ) NCERR;
    }
    tick("variables defined");

    if( nc_enddef(ncid) ) NCERR;
    tick("endef");
    if ( nc_close(ncid) ) NCERR;
    tick("closed");


    // open for writing //
    if(nc_open(filename, NC_WRITE, &ncid)) NCERR;

    tick("opened");

    for (int j = 0; j < num_var; j++) {
      sprintf(varname,"var-%d",j);
      if ( nc_inq_varid(ncid, varname, &varids[j]) ) NCERR;
      if ( nc_set_var_chunk_cache(ncid, varids[j], 0, 0, 0.75) ) NCERR;
    }
    tick("inquired variables");
*/
    // iterate to write on vars. On every loop buffer_size elements are written on all variables //
    char debug[100];
    for (int k = 0; k < num_elements_var; k = k + buffer_size) {

      for (int j = 0; j < num_var; j++) {

        for (int l = 0; l < buffer_size; l++) {
          buffer[l] = l * j;
        }
//        start = k;
//        if ( nc_put_vara(ncid, varids[j], &start, &buffer_size, buffer) ) NCERR;
        sprintf(varname,"var-%d",j);
        hsize_t dim = buffer_size;    // variable dimension
        if(H5LTmake_dataset_int(file, varname, 1, &dim, buffer) < 0) {
          printf("Can't make dataset %s\n", varname);
        }
      }
      sprintf(debug, "%d", k);
      tick( debug );
    }
    tick("variables written");

//    if( nc_close(ncid) ) NCERR;
    H5Fclose(file);
    tick("closed");



    // open for reading //
//    if ( nc_open(filename, NC_NOWRITE, &ncid) ) NCERR;
    file = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT);
    if(file < 0) { 
      printf("Can't open file %s\n", filename);
      return(1);
    }
    tick("open for reading");
/*    
    for (int j = 0; j < num_var; j++) {
      sprintf(varname,"var-%d",j);
      if( nc_inq_varid(ncid, varname, &varids[j]) ) NCERR;
      if ( nc_set_var_chunk_cache(ncid, varids[j], 0, 0, 0.75) ) NCERR;
    }
    tick("inquired variables");
*/
    for (int k = 0; k < num_elements_var; k = k + buffer_size) {
      for (int j = 0; j < num_var; j++) {
//        start = k;
//        if ( nc_get_vara(ncid, varids[j], &start, &buffer_size, buffer) ) NCERR;
        sprintf(varname,"var-%d",j);
        if(H5LTread_dataset_int(file, varname, buffer) < 0) {
          printf("Can't read dataset %s\n", varname);
        }
      }
      sprintf(debug, "%d", k);
      tick( debug );
    }
    
    tick("variables read");
//    if( nc_close(ncid) ) NCERR;
    H5Fclose(file);
    tick("closed");

}
