From aee737fa23753c8ef928ec6bc28ef31d287176e3 Mon Sep 17 00:00:00 2001 From: q-posev Date: Thu, 4 Mar 2021 14:03:34 +0100 Subject: [PATCH] provide dimensions and decouple dataset read/write from parent group --- src/trexio.c | 10 +++- src/trexio.org | 10 +++- src/trexio_hdf5.c | 111 +++++++++++++++--------------------------- src/trexio_hdf5.h | 4 +- src/trexio_hdf5.org | 115 ++++++++++++++++---------------------------- 5 files changed, 100 insertions(+), 150 deletions(-) diff --git a/src/trexio.c b/src/trexio.c index 627f8e6..afe98d1 100644 --- a/src/trexio.c +++ b/src/trexio.c @@ -183,6 +183,9 @@ trexio_exit_code trexio_read_nucleus_coord(trexio_t* file, double* coord) { int64_t dim_coord = nucleus_num*3; if (dim_coord < 0) return TREXIO_FAILURE; + int rank = 2; + uint64_t dims[2] = {nucleus_num, 3}; + switch (file->back_end) { case TREXIO_TEXT: @@ -190,7 +193,7 @@ trexio_exit_code trexio_read_nucleus_coord(trexio_t* file, double* coord) { break; case TREXIO_HDF5: - return trexio_hdf5_read_nucleus_coord(file, coord); + return trexio_hdf5_read_nucleus_coord(file, coord, rank, dims); break; /* case TREXIO_JSON: @@ -213,6 +216,9 @@ trexio_exit_code trexio_write_nucleus_coord(trexio_t* file, const double* coord) int64_t dim_coord = nucleus_num*3; if (dim_coord < 0) return TREXIO_FAILURE; + int rank = 2; + uint64_t dims[2] = {nucleus_num, 3}; + switch (file->back_end) { case TREXIO_TEXT: @@ -220,7 +226,7 @@ trexio_exit_code trexio_write_nucleus_coord(trexio_t* file, const double* coord) break; case TREXIO_HDF5: - return trexio_hdf5_write_nucleus_coord(file, coord); + return trexio_hdf5_write_nucleus_coord(file, coord, rank, dims); break; /* case TREXIO_JSON: diff --git a/src/trexio.org b/src/trexio.org index 050df1c..c0e35fb 100644 --- a/src/trexio.org +++ b/src/trexio.org @@ -345,6 +345,9 @@ trexio_exit_code trexio_read_nucleus_coord(trexio_t* file, double* coord) { int64_t dim_coord = nucleus_num*3; if (dim_coord < 0) return TREXIO_FAILURE; + int rank = 2; + uint64_t dims[2] = {nucleus_num, 3}; + switch (file->back_end) { case TREXIO_TEXT: @@ -352,7 +355,7 @@ trexio_exit_code trexio_read_nucleus_coord(trexio_t* file, double* coord) { break; case TREXIO_HDF5: - return trexio_hdf5_read_nucleus_coord(file, coord); + return trexio_hdf5_read_nucleus_coord(file, coord, rank, dims); break; /* case TREXIO_JSON: @@ -375,6 +378,9 @@ trexio_exit_code trexio_write_nucleus_coord(trexio_t* file, const double* coord) int64_t dim_coord = nucleus_num*3; if (dim_coord < 0) return TREXIO_FAILURE; + int rank = 2; + uint64_t dims[2] = {nucleus_num, 3}; + switch (file->back_end) { case TREXIO_TEXT: @@ -382,7 +388,7 @@ trexio_exit_code trexio_write_nucleus_coord(trexio_t* file, const double* coord) break; case TREXIO_HDF5: - return trexio_hdf5_write_nucleus_coord(file, coord); + return trexio_hdf5_write_nucleus_coord(file, coord, rank, dims); break; /* case TREXIO_JSON: diff --git a/src/trexio_hdf5.c b/src/trexio_hdf5.c index dec5604..b5e5bdd 100644 --- a/src/trexio_hdf5.c +++ b/src/trexio_hdf5.c @@ -406,113 +406,82 @@ trexio_exit_code trexio_hdf5_write_nucleus_num(const trexio_t* file, const uint6 return TREXIO_SUCCESS; } -trexio_exit_code trexio_hdf5_read_nucleus_coord(const trexio_t* file, double* coord) { +trexio_exit_code trexio_hdf5_read_nucleus_coord(const trexio_t* file, double* coord, const int rank, const uint64_t* dims) { assert (file != NULL); assert (coord != NULL); - - /*h5nucleus_t* nucleus = trexio_hdf5_read_nucleus((trexio_hdf5_t*) file); - if (nucleus == NULL) return TREXIO_FAILURE; - assert (nucleus->coord != NULL);*/ - - /* Allocate and read nucleus_coord array */ - h5nucleus_t* nucleus = (h5nucleus_t*) malloc(sizeof(h5nucleus_t)); - assert (nucleus != NULL); - - trexio_exit_code rc = trexio_hdf5_read_nucleus_num(file, &(nucleus->num)); - assert (rc == TREXIO_SUCCESS); - assert (nucleus->num > 0L); - - nucleus->coord = (double*) calloc(3 * nucleus->num, sizeof(double)); - assert (nucleus->coord != NULL); - - trexio_hdf5_t* f = (trexio_hdf5_t*) file; - herr_t status; - /* High-level H5LT API. No need to deal with dataspaces and datatypes */ - status = H5LTread_dataset_double(f->nucleus_group, - NUCLEUS_COORD_NAME, - nucleus->coord); - assert (status >= 0); - for (size_t i=0 ; i<3*nucleus->num ; i++) { - coord[i] = nucleus->coord[i]; + uint64_t nucleus_num; + trexio_exit_code rc = trexio_hdf5_read_nucleus_num(file, &(nucleus_num)); + assert (rc == TREXIO_SUCCESS); + assert (nucleus_num > 0L); + + uint64_t ddims[2] = {nucleus_num, 3}; + for (int i=0; inucleus_group, + NUCLEUS_COORD_NAME, + nucleus_coord); + + assert (status >= 0); + + for (size_t i=0 ; i<3*nucleus_num ; i++) { + coord[i] = nucleus_coord[i]; + } + + free(nucleus_coord); + return TREXIO_SUCCESS; } -trexio_exit_code trexio_hdf5_write_nucleus_coord(const trexio_t* file, const double* coord) { +trexio_exit_code trexio_hdf5_write_nucleus_coord(const trexio_t* file, const double* coord, const int rank, const uint64_t* dims) { assert (file != NULL); assert (coord != NULL); - - /*h5nucleus_t* nucleus = trexio_hdf5_read_nucleus((trexio_hdf5_t*) file); - if (nucleus == NULL) return TREXIO_FAILURE; - assert (nucleus->coord != NULL); - - for (size_t i=0 ; i<3*nucleus->num ; i++) { - nucleus->coord[i] = coord[i]; - } - - trexio_exit_code rc = trexio_hdf5_write_nucleus((trexio_hdf5_t*) file, nucleus); - assert (rc == TREXIO_SUCCESS);*/ - - h5nucleus_t* nucleus = (h5nucleus_t*) malloc(sizeof(h5nucleus_t)); - assert (nucleus != NULL); - - trexio_exit_code rc = trexio_hdf5_read_nucleus_num(file, &(nucleus->num)); + + uint64_t nucleus_num; + trexio_exit_code rc = trexio_hdf5_read_nucleus_num(file, &(nucleus_num)); assert (rc == TREXIO_SUCCESS); - assert (nucleus->num > 0L); + assert (nucleus_num > 0L); - nucleus->coord = (double*) calloc(3 * nucleus->num, sizeof(double)); - assert (nucleus->coord != NULL); + double* nucleus_coord = (double*) calloc(3 * nucleus_num, sizeof(double)); + assert (nucleus_coord != NULL); - for (size_t i=0 ; i<3*nucleus->num ; i++) { - nucleus->coord[i] = coord[i]; + for (size_t i=0 ; i<3*nucleus_num ; i++) { + nucleus_coord[i] = coord[i]; } trexio_hdf5_t* f = (trexio_hdf5_t*) file; - hid_t dset_id, dspace, dtype; herr_t status; - int coord_rank = 2; - const hsize_t coord_dims[2] = {nucleus->num, 3}; if ( H5LTfind_dataset(f->nucleus_group, NUCLEUS_COORD_NAME) != 1) { status = H5LTmake_dataset_double (f->nucleus_group, NUCLEUS_COORD_NAME, - coord_rank, coord_dims, nucleus->coord); + rank, (hsize_t*) dims, nucleus_coord); assert (status >= 0); } else { - dset_id = H5Dopen(f->nucleus_group, NUCLEUS_COORD_NAME, H5P_DEFAULT); + hid_t dset_id = H5Dopen(f->nucleus_group, NUCLEUS_COORD_NAME, H5P_DEFAULT); assert (dset_id > 0); - dspace = H5Dget_space(dset_id); - assert (dspace > 0); - dtype = H5Dget_type(dset_id); - assert (dtype > 0); - int rrank; - hsize_t dims[2] = {0, 0}; - rrank = H5Sget_simple_extent_dims(dspace, - dims, NULL); - assert (rrank == coord_rank); - for (int i=0; icoord); + status = H5Dwrite(dset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, nucleus_coord); assert (status >= 0); - H5Sclose(dspace); - H5Tclose(dtype); H5Dclose(dset_id); } - trexio_hdf5_free_nucleus(nucleus); + free(nucleus_coord); return TREXIO_SUCCESS; } diff --git a/src/trexio_hdf5.h b/src/trexio_hdf5.h index 1689cf8..596b486 100644 --- a/src/trexio_hdf5.h +++ b/src/trexio_hdf5.h @@ -91,7 +91,7 @@ typedef struct four_index_s { trexio_exit_code trexio_hdf5_read_nucleus_num(const trexio_t* file, uint64_t* num); trexio_exit_code trexio_hdf5_write_nucleus_num(const trexio_t* file, const uint64_t num); -trexio_exit_code trexio_hdf5_read_nucleus_coord(const trexio_t* file, double* coord); -trexio_exit_code trexio_hdf5_write_nucleus_coord(const trexio_t* file, const double* coord); +trexio_exit_code trexio_hdf5_read_nucleus_coord(const trexio_t* file, double* coord, const int rank, const uint64_t* dims); +trexio_exit_code trexio_hdf5_write_nucleus_coord(const trexio_t* file, const double* coord, const int rank, const uint64_t* dims); #endif diff --git a/src/trexio_hdf5.org b/src/trexio_hdf5.org index a1d979a..0ad87a0 100644 --- a/src/trexio_hdf5.org +++ b/src/trexio_hdf5.org @@ -564,118 +564,87 @@ trexio_exit_code trexio_hdf5_write_nucleus_num(const trexio_t* file, const uint6 The ~coord~ array is assumed allocated with the appropriate size. #+begin_src c :tangle trexio_hdf5.h -trexio_exit_code trexio_hdf5_read_nucleus_coord(const trexio_t* file, double* coord); -trexio_exit_code trexio_hdf5_write_nucleus_coord(const trexio_t* file, const double* coord); +trexio_exit_code trexio_hdf5_read_nucleus_coord(const trexio_t* file, double* coord, const int rank, const uint64_t* dims); +trexio_exit_code trexio_hdf5_write_nucleus_coord(const trexio_t* file, const double* coord, const int rank, const uint64_t* dims); #+end_src #+begin_src c :tangle trexio_hdf5.c -trexio_exit_code trexio_hdf5_read_nucleus_coord(const trexio_t* file, double* coord) { +trexio_exit_code trexio_hdf5_read_nucleus_coord(const trexio_t* file, double* coord, const int rank, const uint64_t* dims) { assert (file != NULL); assert (coord != NULL); - - /*h5nucleus_t* nucleus = trexio_hdf5_read_nucleus((trexio_hdf5_t*) file); - if (nucleus == NULL) return TREXIO_FAILURE; - assert (nucleus->coord != NULL);*/ - - /* Allocate and read nucleus_coord array */ - h5nucleus_t* nucleus = (h5nucleus_t*) malloc(sizeof(h5nucleus_t)); - assert (nucleus != NULL); - - trexio_exit_code rc = trexio_hdf5_read_nucleus_num(file, &(nucleus->num)); - assert (rc == TREXIO_SUCCESS); - assert (nucleus->num > 0L); - - nucleus->coord = (double*) calloc(3 * nucleus->num, sizeof(double)); - assert (nucleus->coord != NULL); - - trexio_hdf5_t* f = (trexio_hdf5_t*) file; - herr_t status; - /* High-level H5LT API. No need to deal with dataspaces and datatypes */ - status = H5LTread_dataset_double(f->nucleus_group, - NUCLEUS_COORD_NAME, - nucleus->coord); - assert (status >= 0); - for (size_t i=0 ; i<3*nucleus->num ; i++) { - coord[i] = nucleus->coord[i]; + uint64_t nucleus_num; + trexio_exit_code rc = trexio_hdf5_read_nucleus_num(file, &(nucleus_num)); + assert (rc == TREXIO_SUCCESS); + assert (nucleus_num > 0L); + + uint64_t ddims[2] = {nucleus_num, 3}; + for (int i=0; inucleus_group, + NUCLEUS_COORD_NAME, + nucleus_coord); + + assert (status >= 0); + + for (size_t i=0 ; i<3*nucleus_num ; i++) { + coord[i] = nucleus_coord[i]; + } + + free(nucleus_coord); + return TREXIO_SUCCESS; } -trexio_exit_code trexio_hdf5_write_nucleus_coord(const trexio_t* file, const double* coord) { +trexio_exit_code trexio_hdf5_write_nucleus_coord(const trexio_t* file, const double* coord, const int rank, const uint64_t* dims) { assert (file != NULL); assert (coord != NULL); - - /*h5nucleus_t* nucleus = trexio_hdf5_read_nucleus((trexio_hdf5_t*) file); - if (nucleus == NULL) return TREXIO_FAILURE; - assert (nucleus->coord != NULL); - - for (size_t i=0 ; i<3*nucleus->num ; i++) { - nucleus->coord[i] = coord[i]; - } - - trexio_exit_code rc = trexio_hdf5_write_nucleus((trexio_hdf5_t*) file, nucleus); - assert (rc == TREXIO_SUCCESS);*/ - - h5nucleus_t* nucleus = (h5nucleus_t*) malloc(sizeof(h5nucleus_t)); - assert (nucleus != NULL); - - trexio_exit_code rc = trexio_hdf5_read_nucleus_num(file, &(nucleus->num)); + + uint64_t nucleus_num; + trexio_exit_code rc = trexio_hdf5_read_nucleus_num(file, &(nucleus_num)); assert (rc == TREXIO_SUCCESS); - assert (nucleus->num > 0L); + assert (nucleus_num > 0L); - nucleus->coord = (double*) calloc(3 * nucleus->num, sizeof(double)); - assert (nucleus->coord != NULL); + double* nucleus_coord = (double*) calloc(3 * nucleus_num, sizeof(double)); + assert (nucleus_coord != NULL); - for (size_t i=0 ; i<3*nucleus->num ; i++) { - nucleus->coord[i] = coord[i]; + for (size_t i=0 ; i<3*nucleus_num ; i++) { + nucleus_coord[i] = coord[i]; } trexio_hdf5_t* f = (trexio_hdf5_t*) file; - hid_t dset_id, dspace, dtype; herr_t status; - int coord_rank = 2; - const hsize_t coord_dims[2] = {nucleus->num, 3}; if ( H5LTfind_dataset(f->nucleus_group, NUCLEUS_COORD_NAME) != 1) { status = H5LTmake_dataset_double (f->nucleus_group, NUCLEUS_COORD_NAME, - coord_rank, coord_dims, nucleus->coord); + rank, (hsize_t*) dims, nucleus_coord); assert (status >= 0); } else { - dset_id = H5Dopen(f->nucleus_group, NUCLEUS_COORD_NAME, H5P_DEFAULT); + hid_t dset_id = H5Dopen(f->nucleus_group, NUCLEUS_COORD_NAME, H5P_DEFAULT); assert (dset_id > 0); - dspace = H5Dget_space(dset_id); - assert (dspace > 0); - dtype = H5Dget_type(dset_id); - assert (dtype > 0); - int rrank; - hsize_t dims[2] = {0, 0}; - rrank = H5Sget_simple_extent_dims(dspace, - dims, NULL); - assert (rrank == coord_rank); - for (int i=0; icoord); + status = H5Dwrite(dset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, nucleus_coord); assert (status >= 0); - H5Sclose(dspace); - H5Tclose(dtype); H5Dclose(dset_id); } - trexio_hdf5_free_nucleus(nucleus); + free(nucleus_coord); return TREXIO_SUCCESS; }