	program h5nestcmpd 

	use hdf5

	implicit none

	integer::error

	INTEGER, PARAMETER :: dimsize = 1 ! Size of the dataset

	character(len=20), parameter :: filename="myddf91.h5"

	CHARACTER(LEN=20), PARAMETER :: groupname = "strucDef" ! Group name
 
	CHARACTER(LEN=20),  PARAMETER :: dsetname1 = "Struc1" ! dataset name

!  We do not need long buffers (20), length should be found but we
!  assume that we know the actual length of Forgtran string in each case
!  sub1.name will be read in the new buffer char_member_out1

    CHARACTER(len=6), DIMENSION(dimsize) :: char_member_out ! Buf to read data
    CHARACTER(len=4), DIMENSION(dimsize) :: char_member_out1 ! Buf to read data

        DOUBLE PRECISION, DIMENSION(dimsize) :: double_member_out
 
	integer(hid_t)::file_id, dset_id, dset1_id, group_id
	!read contents from a hdf file

	real,dimension(10,10):: data_out
        INTEGER(HSIZE_T), DIMENSION(7) :: data_dims

	integer::i,j
	
	integer(hid_t):: CHAtype_id,dtCinMem_id, dtNesMem_id

! Sizes variabled for h5tget_size_f subroutine should have INTEGER(SIZE_T) type
! type_size_comp was added to construct compound type in memory for reading 
! sub1.name field
!
	integer(SIZE_T):: typesize, type_sizec, type_size_comp
	integer(SIZE_T):: type_sized

	integer::offset


	integer(hid_t):: dtVALinMem


	data_dims(1) = dimsize

	!open API
	 call h5open_f(error)

	!open an existing file
	 call h5fopen_f(filename, H5F_ACC_RDWR_F, file_id, error)


        ! Open an existing group in the specified file.
        CALL h5gopen_f(file_id, groupname, group_id, error)


	!open dset2 in group_A
        CALL h5dopen_f(group_id, dsetname1, dset1_id, error)

	!create corresponding field in memory

	!1. read "name" field

        !create a field in memory and id it as: CHAtype_id 

        CALL h5tcopy_f(H5T_NATIVE_CHARACTER, CHAtype_id, error)

        typesize = 6

        CALL h5tset_size_f(CHAtype_id, typesize, error)
        CALL h5tget_size_f(CHAtype_id, type_sizec, error)

        !**create a filed in memory for the compound data type, and 
        !give the field an ID: dtCinMem_id 

        CALL h5tcreate_f(H5T_COMPOUND_F, type_sizec, dtCinMem_id, error)

	!insert the filed in memory identified by dtCinMem_id with 
        !the contents in a filed identified 
	!by the field name "char_field" from the file 
        offset = 0
        CALL h5tinsert_f(dtCinMem_id, "name", offset,CHAtype_id, error)

        ! Read the memory field identifield by its ID: dtCinMem_id 
        ! and display it.
        !
        CALL h5dread_f(dset1_id, dtCinMem_id, char_member_out, data_dims, error)
        write(*,*) (char_member_out(i), i=1, dimsize)

	call h5tclose_f(dtCinMem_id,error)
	call h5tclose_f(CHAtype_id,error)


!******  B:    read double_field "var" field  ******

        ! **create a field in memory for double, and give the field 
        ! id as: dtVALinMem

        CALL h5tget_size_f(H5T_NATIVE_DOUBLE, type_sized, error)
	CALL h5tcreate_f(H5T_COMPOUND_F, type_sized, dtVALinMem, error)

	!insert this field with the contents in a field ided by 
        !the field name "integer_field" from the field

        offset = 0
        CALL h5tinsert_f(dtVALinMem, "val", offset, H5T_NATIVE_DOUBLE, error)
   
        CALL h5dread_f(dset1_id, dtVALinMem, double_member_out, data_dims, error)
        write(*,*) (double_member_out(i), i=1, dimsize)

	call h5tclose_f(dtVALinMem,error)


!******  B:    read double_field "start" field  ******

!*** Comparing to the previous one, just change "val" to "start".

! **create a field in memory for double, and give the field id as: dtVALinMem



        CALL h5tget_size_f(H5T_NATIVE_DOUBLE, type_sized, error)

	CALL h5tcreate_f(H5T_COMPOUND_F, type_sized, dtVALinMem, error)

	!insert this field with the contents in a field ided by the field name "integer_field" from the field

	offset = 0
        CALL h5tinsert_f(dtVALinMem, "start", offset, H5T_NATIVE_DOUBLE, error)
   
        CALL h5dread_f(dset1_id, dtVALinMem, double_member_out, data_dims, error)
        write(*,*) (double_member_out(i), i=1, dimsize)

	call h5tclose_f(dtVALinMem,error)

!******  d:    read double_field "end" field  ******

!*** Comparing to the previous one, just change "val" to "start".

! **create a field in memory for double, and give the field id as: dtVALinMem

        CALL h5tget_size_f(H5T_NATIVE_DOUBLE, type_sized, error)

	CALL h5tcreate_f(H5T_COMPOUND_F, type_sized, dtVALinMem, error)

	!insert this field with the contents in a field ided by 
        !the field name "integer_field" from the field

	offset = 0
        CALL h5tinsert_f(dtVALinMem, "end", offset, H5T_NATIVE_DOUBLE, error)
   
        CALL h5dread_f(dset1_id, dtVALinMem, double_member_out, data_dims, error)
        write(*,*) (double_member_out(i), i=1, dimsize)

	call h5tclose_f(dtVALinMem,error)

!-----------
	!5. read "sub1.name" field

        !create a field in memory and id it as: CHAtype_id 

        CALL h5tcopy_f(H5T_NATIVE_CHARACTER, CHAtype_id, error)

        typesize = 5

        CALL h5tset_size_f(CHAtype_id, typesize, error)
        CALL h5tget_size_f(CHAtype_id, type_sizec, error)

	! **create a filed in memory for the compound data type, and 
        ! give the field an ID: dtCinMem_id 
		
        CALL h5tcreate_f(H5T_COMPOUND_F, type_sizec, dtCinMem_id, error)

	! insert the filed in memory identified by dtCinMem_id with 
        ! the contents in a filed identified 
	!by the field name "char_field" from the file 
        offset = 0
        CALL h5tinsert_f(dtCinMem_id, "name", offset,CHAtype_id, error)

        CALL h5tget_size_f(dtCinMem_id, type_size_comp, error)
        CALL h5tcreate_f(H5T_COMPOUND_F, type_size_comp, dtNesMem_id, error)
        CALL h5tinsert_f(dtNesMem_id, "sub1", offset, dtCinMem_id, error)
     
        ! Read the memory field identifield by its ID: dtNesMem_id and 
        ! display it. dtNesMem_id is used to read the nested member
        !
        CALL h5dread_f(dset1_id, dtNesMem_id, char_member_out1, data_dims, error)
        write(*,*) (char_member_out1(i), i=1, dimsize)

        call h5tclose_f(dtNesMem_id,error)
	call h5tclose_f(dtCinMem_id,error)
	call h5tclose_f(CHAtype_id,error)

	!close the dataset, group, and file
	call h5dclose_f(dset1_id, error)
        CALL h5gclose_f(group_id, error)
        call h5fclose_f(file_id,error)

	!close api
	call h5close_f(error)

end program h5nestcmpd
