From 0b9fa6e46d6d83809f95755e8877841e40fa7342 Mon Sep 17 00:00:00 2001 From: Yohai Meiron Date: Thu, 26 Mar 2020 19:56:12 -0400 Subject: [PATCH] Working on HDF5 reader --- io.cpp | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 82 insertions(+), 9 deletions(-) diff --git a/io.cpp b/io.cpp index 6cacd25..40f009c 100644 --- a/io.cpp +++ b/io.cpp @@ -1,5 +1,7 @@ #include "hdf5.h" #include +#include +#include struct double3 {double x,y,z;}; void h5_write(const std::string file_name, const int step_num, const double t, const int N, const double *m, const double3 *x, const double3 *v, const double *pot, const double3 *acc, const double3 *jrk, const int write_mode=0, const bool use_double_precision=true) @@ -9,9 +11,8 @@ void h5_write(const std::string file_name, const int step_num, const double t, c bool write_acc = (write_mode>>1)%2; bool write_jrk = (write_mode>>2)%2; - hid_t file_id, group_id, attribute_id, dataset_id, dataspace_id; /* identifiers */ + hid_t file_id, group_id, attribute_id, dataset_id, dataspace_id; hsize_t dims[2] = {(hsize_t)N, 3}; - herr_t status; hid_t h5_float_type; if (use_double_precision) h5_float_type = H5T_IEEE_F64LE; @@ -23,53 +24,99 @@ void h5_write(const std::string file_name, const int step_num, const double t, c dataspace_id = H5Screate(H5S_SCALAR); attribute_id = H5Acreate2 (group_id, "Time", H5T_IEEE_F64LE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT); H5Awrite(attribute_id, H5T_NATIVE_DOUBLE, &t); + H5Sclose(dataspace_id); dataspace_id = H5Screate_simple(1, dims, NULL); sprintf(dataset_path, "%s/MASS", group_name); dataset_id = H5Dcreate2(file_id, dataset_path, h5_float_type, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); H5Dwrite(dataset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, m); + H5Dclose(dataset_id); + H5Sclose(dataspace_id); dataspace_id = H5Screate_simple(2, dims, NULL); sprintf(dataset_path, "%s/X", group_name); dataset_id = H5Dcreate2(file_id, dataset_path, h5_float_type, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); H5Dwrite(dataset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, x); + H5Dclose(dataset_id); + H5Sclose(dataspace_id); dataspace_id = H5Screate_simple(2, dims, NULL); sprintf(dataset_path, "%s/V", group_name); dataset_id = H5Dcreate2(file_id, dataset_path, h5_float_type, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); H5Dwrite(dataset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, v); + H5Dclose(dataset_id); + H5Sclose(dataspace_id); if (write_pot) { dataspace_id = H5Screate_simple(1, dims, NULL); sprintf(dataset_path, "%s/POT", group_name); dataset_id = H5Dcreate2(file_id, dataset_path, h5_float_type, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); H5Dwrite(dataset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, pot); + H5Dclose(dataset_id); + H5Sclose(dataspace_id); } - if (write_acc) { dataspace_id = H5Screate_simple(2, dims, NULL); sprintf(dataset_path, "%s/ACC", group_name); dataset_id = H5Dcreate2(file_id, dataset_path, h5_float_type, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); H5Dwrite(dataset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, acc); + H5Dclose(dataset_id); + H5Sclose(dataspace_id); } - if (write_jrk) { dataspace_id = H5Screate_simple(2, dims, NULL); sprintf(dataset_path, "%s/JRK", group_name); dataset_id = H5Dcreate2(file_id, dataset_path, h5_float_type, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); H5Dwrite(dataset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, jrk); + H5Dclose(dataset_id); + H5Sclose(dataspace_id); } - - H5Dclose(dataset_id); H5Gclose(group_id); - H5Sclose(dataspace_id); + + + group_id = H5Gcreate2(file_id, "/Step#22", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + H5Gclose(group_id); + + H5Fclose(file_id); } + + + +herr_t file_info(hid_t loc_id, const char *name, void *opdata) +{ + H5G_stat_t statbuf; + + /* + * Get type of the object and display its name and type. + * The name of the object is passed to this function by + * the Library. Some magic :-) + */ + H5Gget_objinfo(loc_id, name, 0, &statbuf); + switch (statbuf.type) { + case H5G_GROUP: + printf(" Object with name %s is a group \n", name); + break; + case H5G_DATASET: + printf(" Object with name %s is a dataset \n", name); + break; + case H5G_TYPE: + printf(" Object with name %s is a named datatype \n", name); + break; + default: + printf(" Unable to identify an object "); + } + return 0; + } + + + + int main() { - double3 aaa; - double pot; +// double3 aaa; +// double pot; int N = 25; double3 x[N]; for (int i=0; i step_num; + for (int i=0; i