#include "hdf5.h" #include #include #include #include struct double3 {double x,y,z; }; void h5_write(const std::string file_name, const int step_num, const int N, const double t, 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) { bool write_pot = (write_mode )%2; 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; hsize_t dims[2] = {(hsize_t)N, 3}; hid_t h5_float_type; if (use_double_precision) h5_float_type = H5T_IEEE_F64LE; else h5_float_type = H5T_IEEE_F32LE; file_id = H5Fcreate(file_name.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); char group_name[32]; sprintf(group_name, "/Step#%d", step_num); group_id = H5Gcreate2(file_id, group_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); 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); auto write_dataset = [&](const char dataset_name[], int ndims, double *data) { hid_t dataspace_id = H5Screate_simple(ndims, dims, NULL); char dataset_path[32]; sprintf(dataset_path, "%s/%s", group_name, dataset_name); hid_t 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, data); H5Dclose(dataset_id); H5Sclose(dataspace_id); }; write_dataset("MASS", 1, (double*)m); write_dataset("X", 2, (double*)x); write_dataset("V", 2, (double*)v); if (write_pot) write_dataset("POT", 1, (double*)pot); if (write_acc) write_dataset("ACC", 2, (double*)acc); if (write_jrk) write_dataset("JRK", 2, (double*)jrk); H5Gclose(group_id); H5Fclose(file_id); } void h5_read(const std::string file_name, int *step_num, int *N, double *t, double m[], double3 x[], double3 v[]) { // Open file and root group; count number of top level objects hid_t file_id = H5Fopen(file_name.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT); hid_t group_id = H5Gopen2(file_id, "/", H5P_DEFAULT); H5G_info_t object_info; H5Gget_info(group_id, &object_info); // Iterate over objects and add the number of each "step" group into a vector std::vector step_num_arr; for (int i=0; i