@@ -33,19 +33,13 @@ typedef struct h5md_box{
3333typedef struct h5md_group {
3434 char * group_path ;
3535 int natoms_group ;
36+ int nspacedims ;
3637 hid_t pos_dataset_id ;
3738 hid_t species_dataset_id ;
3839 hid_t mass_dataset_id ;
3940 hid_t charge_dataset_id ;
4041 hid_t image_dataset_id ;
4142 hid_t id_dataset_id ;
42- hid_t datatype ;
43- H5T_class_t t_class ;
44- H5T_order_t order ;
45- size_t size_datatype ;
46- hid_t dataspace ;
47- int rank_dataset ;
48- int nspacedims ;
4943} h5md_group ;
5044
5145//file handling
@@ -60,6 +54,7 @@ struct h5md_file{
6054 int correction_timestep_VMD_counting ;
6155};
6256
57+
6358//declaration of "private" functions, cannot be accessed from outside the library
6459//declaration here in order to be able to sort the content of the file according to it's "importance"
6560int initialize_h5md_struct (struct h5md_file * file );
@@ -102,6 +97,8 @@ herr_t check_for_pos_dataset( hid_t g_id, const char* obj_name, const H5L_info_t
10297 return status ; //if status is 0 search for other position datasets continues. If status is negative, search is aborted.
10398}
10499
100+
101+
105102int modify_information_about_file_content (struct h5md_file * file , char * group_name ){
106103 int status = -1 ;
107104
@@ -151,24 +148,24 @@ int modify_information_about_file_content(struct h5md_file* file, char* group_na
151148 * Get datatype and dataspace handles and then query
152149 * dataset class, order, size, rank and dimensions. Since all datasets are checked to be compatible do this only for the first dataset
153150 */
151+ hid_t datatype = H5Dget_type (pos_dataset_id ); // datatype handle
152+ H5T_class_t t_class = H5Tget_class (datatype );
153+ H5T_order_t order = H5Tget_order (datatype );
154154
155- groups [file -> ngroups - 1 ].datatype = H5Dget_type (pos_dataset_id ); // datatype handle
156- groups [file -> ngroups - 1 ].t_class = H5Tget_class (groups [file -> ngroups - 1 ].datatype );
157- groups [file -> ngroups - 1 ].order = H5Tget_order (groups [file -> ngroups - 1 ].datatype );
155+ size_t size_datatype = H5Tget_size (datatype );
156+ hid_t dataspace_id = H5Dget_space (pos_dataset_id ); //dataspace handle
157+ int rank_dataset = H5Sget_simple_extent_ndims (dataspace_id );
158+ hsize_t dims_out [rank_dataset ];
158159
159- groups [file -> ngroups - 1 ].size_datatype = H5Tget_size (groups [file -> ngroups - 1 ].datatype );
160- groups [file -> ngroups - 1 ].dataspace = H5Dget_space (pos_dataset_id ); //dataspace handle
161- groups [file -> ngroups - 1 ].rank_dataset = H5Sget_simple_extent_ndims (groups [file -> ngroups - 1 ].dataspace );
162- hsize_t dims_out [groups [file -> ngroups - 1 ].rank_dataset ];
163- H5Sget_simple_extent_dims (groups [file -> ngroups - 1 ].dataspace , dims_out , NULL );
160+ H5Sget_simple_extent_dims (dataspace_id , dims_out , NULL );
164161 file -> ntime = dims_out [0 ];
165162 file -> natoms += dims_out [1 ];
166163 groups [file -> ngroups - 1 ].nspacedims = dims_out [2 ];
167164 groups [file -> ngroups - 1 ].natoms_group = dims_out [1 ];
168165 groups [file -> ngroups - 1 ].group_path = strdup (group_name );
166+ H5Sclose (dataspace_id );
169167
170- file -> groups = groups ; // assign file->groups here since get_box_information() uses all group_path entries, get_box_information can then be called later
171-
168+ file -> groups = groups ;
172169 status = 0 ;
173170 }else {
174171 printf ("position datasets are not compatible\n" );
@@ -343,12 +340,13 @@ int sort_data_according_to_id_dataset(struct h5md_file* file, int group_number,
343340 /*
344341 * Define hyperslab in the dataset.
345342 */
346- hsize_t dataset_slab_offset [file -> groups [i ].rank_dataset ];
343+ int rank_dataset = H5Sget_simple_extent_ndims (dataspace_id_id );
344+ hsize_t dataset_slab_offset [rank_dataset ];
347345 dataset_slab_offset [2 ] = 0 ;
348346 dataset_slab_offset [0 ] = file -> current_time ;
349347 dataset_slab_offset [1 ] = 0 ;
350348
351- hsize_t dataset_slab_count [file -> groups [ i ]. rank_dataset ];
349+ hsize_t dataset_slab_count [rank_dataset ];
352350 dataset_slab_count [2 ] = 0 ;
353351 dataset_slab_count [0 ] = 1 ;
354352 dataset_slab_count [1 ] = file -> groups [i ].natoms_group ;
@@ -421,12 +419,14 @@ int h5md_get_timestep(struct h5md_file* file, int* natoms, float **coords){
421419 /*
422420 * Define hyperslab in the dataset.
423421 */
424- hsize_t dataset_slab_offset [file -> groups [i ].rank_dataset ];
422+
423+ int rank_dataset = H5Sget_simple_extent_ndims (dataspace_pos_id );
424+ hsize_t dataset_slab_offset [rank_dataset ];
425425 dataset_slab_offset [0 ] = file -> current_time ;
426426 dataset_slab_offset [1 ] = 0 ;
427427 dataset_slab_offset [2 ] = 0 ;
428428
429- hsize_t dataset_slab_count [file -> groups [ i ]. rank_dataset ];
429+ hsize_t dataset_slab_count [rank_dataset ];
430430 dataset_slab_count [0 ] = 1 ;
431431 dataset_slab_count [1 ] = file -> groups [i ].natoms_group ;
432432 dataset_slab_count [2 ] = file -> groups [i ].nspacedims ;
@@ -895,9 +895,10 @@ int h5md_get_all_species_infromation(struct h5md_file *file, int** species_infro
895895 /*
896896 * Define hyperslab in the dataset.
897897 */
898- hsize_t dataset_slab_offset [file -> groups [i ].rank_dataset ];
898+ int rank_dataset = H5Sget_simple_extent_ndims (dataspace_id );
899+ hsize_t dataset_slab_offset [rank_dataset ];
899900 dataset_slab_offset [0 ] = 0 ;
900- hsize_t dataset_slab_count [file -> groups [ i ]. rank_dataset ];
901+ hsize_t dataset_slab_count [rank_dataset ];
901902 dataset_slab_count [0 ] = file -> groups [i ].natoms_group ;
902903 H5Sselect_hyperslab (dataspace_id , H5S_SELECT_SET , dataset_slab_offset , NULL , dataset_slab_count , NULL );
903904
@@ -948,9 +949,10 @@ int h5md_get_all_mass_infromation(struct h5md_file *file, float** mass_infromati
948949 /*
949950 * Define hyperslab in the dataset.
950951 */
951- hsize_t dataset_slab_offset [file -> groups [i ].rank_dataset ];
952+ int rank_dataset = H5Sget_simple_extent_ndims (dataspace_id );
953+ hsize_t dataset_slab_offset [rank_dataset ];
952954 dataset_slab_offset [0 ] = 0 ;
953- hsize_t dataset_slab_count [file -> groups [ i ]. rank_dataset ];
955+ hsize_t dataset_slab_count [rank_dataset ];
954956 dataset_slab_count [0 ] = file -> groups [i ].natoms_group ;
955957 H5Sselect_hyperslab (dataspace_id , H5S_SELECT_SET , dataset_slab_offset , NULL , dataset_slab_count , NULL );
956958
@@ -1000,9 +1002,10 @@ int h5md_get_all_charge_infromation(struct h5md_file *file, float** charge_infro
10001002 /*
10011003 * Define hyperslab in the dataset.
10021004 */
1003- hsize_t dataset_slab_offset [file -> groups [i ].rank_dataset ];
1005+ int rank_dataset = H5Sget_simple_extent_ndims (dataspace_id );
1006+ hsize_t dataset_slab_offset [rank_dataset ];
10041007 dataset_slab_offset [0 ] = 0 ;
1005- hsize_t dataset_slab_count [file -> groups [ i ]. rank_dataset ];
1008+ hsize_t dataset_slab_count [rank_dataset ];
10061009 dataset_slab_count [0 ] = file -> groups [i ].natoms_group ;
10071010 H5Sselect_hyperslab (dataspace_id , H5S_SELECT_SET , dataset_slab_offset , NULL , dataset_slab_count , NULL );
10081011
0 commit comments