Dear members,

Attached are a script for writing a compound data type in HDF5 format and its "h5dump" output named "cc_res.txt". As you might see in the output file, the second group of variables are written erroneously if H5T_NATIVE_DOUBLE is used for real(8) type variable named "wdata%b". However, if I convert the data type to real(4) and use H5T_NATIVE_REAL instead, it is written correctly to the output file . I could not figure out the problem. I would be glad to hear if you have an idea on this. Thank you in advance.

Regards,

--
*Ekin Akoglu*

Research Assistant

Institute of Marine Sciences
Middle East Technical University
P.O. Box 28, 33731
Erdemli, Mersin
Turkey

Web: www.ims.metu.edu.tr
Email: [email protected] <mailto:[email protected]>
Phone: +90 324 521 34 34
GSM: +90 506 554 03 90
Fax: +90 324 521 23 27
program complexcompound

use hdf5

implicit none

! This is the name of the data file we will read. 
character (len = 9), parameter :: filename  = "cc_res.h5"
character (len = 7), parameter :: dsetname1 = "ms_data"     ! name of the Ecopath multistanza dataset

integer(8), parameter             :: arraydim0   = 2
integer(hsize_t), DIMENSION(1)    :: arraydims   = (/arraydim0/)
integer(8), parameter             :: arraydim1   = 3
integer(hsize_t), DIMENSION(1)    :: arraydims1  = (/arraydim1/)

! in-subroutine variable declarations for ms_data
integer          , parameter       :: ms_dim0    = 2                 ! number of stanzas
integer(hid_t)                     :: file_id, plist_id, space, dset ! Handles
integer                            :: hdferr
integer(hsize_t), dimension(1:1)   :: ms_dims = (/ms_dim0/)

integer(hid_t)  :: s1_tid, s2_tid, s3_tid, s4_tid
integer(hid_t)  :: dt1_id, dt2_id, dt3_id
integer(8)      :: sz1, sz2, sz3, sz, offset
type(c_ptr) :: f_ptr

type data
 real(4) :: a(2)
 real(8) :: b(3)
 integer :: c
end type data

type(data), target :: wdata(2)

 wdata(1)%a = (/1.2, 2.2/)
 wdata(1)%b = (/3.2, 4.2, 5.2/)
 wdata(1)%c = 6

 wdata(2)%a = (/7.2, 8.2/)
 wdata(2)%b = (/9.2, 10.2, 11.2/)
 wdata(2)%c = 12

 ! initialize FORTRAN interface
 call h5open_f(hdferr)

 call h5pcreate_f(H5P_DATASET_XFER_F, plist_id, hdferr)
 call h5pset_preserve_f(plist_id, .TRUE., hdferr)

 ! create file, if it already exists overwrite (H5F_ACC_TRUNC_F)
 call h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, hdferr)

 call h5screate_simple_f(1, ms_dims, space, hdferr)

 ! create 2 arrays "s1_tid" and "s2_tid"
 call H5Tarray_create_f(H5T_NATIVE_REAL, 1, arraydims, s1_tid, hdferr)
 call H5Tarray_create_f(H5T_NATIVE_DOUBLE, 1, arraydims1, s2_tid, hdferr)
 call H5Tcopy_f(H5T_NATIVE_INTEGER, s4_tid, hdferr)

 ! get size of each array
 call H5Tget_size_f(s1_tid, sz1, hdferr)
 call H5Tget_size_f(s2_tid, sz2, hdferr)
 call H5Tget_size_f(s4_tid, sz3, hdferr)
 sz = sz1 + sz2 + sz3

 ! create the compound datatype "s3_tid"  which will embrace the "s1_tid" and "s2_tid" arrays
 call H5Tcreate_f(H5T_COMPOUND_F, sz, s3_tid, hdferr)

 ! insert arrays into the compound datatype
 offset = 0
 call H5Tinsert_f(s3_tid, "a", offset, s1_tid, hdferr)
 offset = offset + sizeof(wdata(1)%a)
 call H5Tinsert_f(s3_tid, "b", offset, s2_tid, hdferr)
 offset = offset + sizeof(wdata(1)%b)
 call H5Tinsert_f(s3_tid, "c", offset, s4_tid, hdferr)

 ! Create the dataset and write the array data to it.

 call h5dcreate_f(file_id, dsetname1, s3_tid, space, dset, hdferr)

 f_ptr = c_loc(wdata(1))
 call h5dwrite_f(dset, s3_tid, f_ptr, hdferr)

 !  call h5tcreate_f(H5T_COMPOUND_F, sz1, dt1_id, hdferr)
 !  offset = 0
 !  call h5tinsert_f(dt1_id, "a", offset, s1_tid, hdferr)
     
 !  call h5tcreate_f(H5T_COMPOUND_F, sz2, dt2_id, hdferr)
 !  offset = 0
 !  call h5tinsert_f(dt2_id, "b", offset, s2_tid, hdferr)

 !  call h5tcreate_f(H5T_COMPOUND_F, sz3, dt3_id, hdferr)
 !  offset = 0
 !  call h5tinsert_f(dt3_id, "c", offset, s4_tid, hdferr) 


 ! call h5dwrite_f(dset, dt1_id, wdata(1)%a, ms_dims, hdferr, xfer_prp = plist_id)
 ! call h5dwrite_f(dset, dt2_id, wdata(1)%b, ms_dims, hdferr, xfer_prp = plist_id)
 ! call h5dwrite_f(dset, dt3_id, wdata(1)%c, ms_dims, hdferr, xfer_prp = plist_id)


 call h5dclose_f(dset, hdferr)
 call h5tclose_f(s3_tid, hdferr)
 call h5sclose_f(space, hdferr)
 call h5pclose_f(plist_id, hdferr)
 call h5fclose_f(file_id, hdferr)


end program complexcompound

HDF5 "cc_res.h5" {
GROUP "/" {
   DATASET "ms_data" {
      DATATYPE  H5T_COMPOUND {
         H5T_ARRAY { [2] H5T_IEEE_F32LE } "a";
         H5T_ARRAY { [3] H5T_IEEE_F32LE } "b";
         H5T_IEEE_F32LE "c";
      }
      DATASPACE  SIMPLE { ( 2 ) / ( 2 ) }
      DATA {
      (0): {
            [ 3.2, 4.1 ],
            [ 9.8, 7.6, 5.1 ],
            99.1
         },
      (1): {
            [ 11.2, 0.1 ],
            [ 0.8, 20.6, 11.1 ],
            33.9
         }
      }
   }
}
}
_______________________________________________
Hdf-forum is for HDF software users discussion.
[email protected]
http://mail.hdfgroup.org/mailman/listinfo/hdf-forum_hdfgroup.org

Reply via email to