program HDF5_Test use ISO_C_BINDING use HDF5 implicit none ! simplified element type .................................................... type MeshElement integer :: id = -1 !< element ID end type MeshElement type(MeshElement), target :: element_orig(2) type(MeshElement), target :: element_read(2) ! HDF5 types ................................................................. integer(hid_t) :: H5T_MeshElement = -1 ! auxiliary variables ........................................................ integer :: err, e integer(hid_t) :: file_id, dataspace_id, dataset_id, dtype_id integer(hsize_t) :: dims(1) ! HDF5 initialization ........................................................ call H5open_f(err) call Init_H5T_Element() ! create dummy data .......................................................... do e = 1,2 element_orig(e)%id = e end do ! save data .................................................................. ! Create a new file (or open an existing one) call h5fcreate_f('elements.h5', H5F_ACC_TRUNC_F, file_id, err) ! Create dataspace for the dataset dims = size(element_orig) call h5screate_simple_f(1, dims, dataspace_id, err) ! Create the dataset call h5dcreate_f(file_id, 'mesh_partition', H5T_MeshElement, & dataspace_id, dataset_id, err) ! Write data call h5dwrite_f(dataset_id, H5T_MeshElement, C_LOC(element_orig(1)), err) ! Close the dataset call h5dclose_f(dataset_id, err) ! Close the dataspace call h5sclose_f(dataspace_id, err) ! Close the file call h5fclose_f(file_id, err) ! read data .................................................................. ! Open HDF5 file call h5fopen_f('elements.h5', H5F_ACC_RDWR_F, file_id, err) ! Open the dataspace call h5dopen_f(file_id, 'mesh_partition', dataset_id, err) ! Read the dataset call h5dget_type_f(dataset_id, dtype_id, err) ! Read data call h5dread_f(dataset_id, dtype_id, C_Loc(element_read(1)), err) ! Close the dataset call h5dclose_f(dataset_id, err) ! Close the file call h5fclose_f(file_id, err) contains !----------------------------------------------------------------------------- !> Initialization of H5T_MeshElement subroutine Init_H5T_Element() type(MeshElement), target :: element(2) integer(size_t) :: offset integer :: err ! create HDF5 type offset = H5offsetof(C_Loc(element(1)), C_Loc(element(2))) call H5Tcreate_f(H5T_COMPOUND_F, offset, H5T_MeshElement, err) ! insert id offset = H5offsetof(C_Loc(element(1)), C_Loc(element(1)%id)) call H5Tinsert_f(H5T_MeshElement, 'id', offset, H5T_NATIVE_INTEGER, err) end subroutine Init_H5T_Element !============================================================================= end program HDF5_Test