#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) { char group_name[32], dataset_path[32]; 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); 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); 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); } H5Gclose(group_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; int N = 25; double3 x[N]; for (int i=0; i step_num; for (int i=0; i