Skip to content

Commit 4a03b8a

Browse files
committed
track insertion order for base group
this results in correct ordering for increments in HDFView (which are by default mixed up due to alphanumeric ordering). Note that the status is wrongly reported: - HDFGroup/hdfview#347 - HDFGroup/hdf5#5183
1 parent 4bf32db commit 4a03b8a

File tree

2 files changed

+26
-10
lines changed

2 files changed

+26
-10
lines changed

src/HDF5_utilities.f90

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -184,42 +184,49 @@ integer(HID_T) function HDF5_openFile(fileName,mode,parallel)
184184
logical, intent(in), optional :: parallel
185185

186186
character :: m
187-
integer(HID_T) :: plist_id
187+
integer(HID_T) :: p_access,p_create
188188
integer :: hdferr
189189
logical :: exist
190190

191191

192192
m = misc_optional(mode,'r')
193193

194-
call H5Pcreate_f(H5P_FILE_ACCESS_F, plist_id, hdferr)
194+
call H5Pcreate_f(H5P_FILE_CREATE_F, p_create, hdferr)
195+
call HDF5_chkerr(hdferr)
196+
call H5Pset_link_creation_order_f(p_create, ior(H5P_CRT_ORDER_INDEXED_F,H5P_CRT_ORDER_TRACKED_F), hdferr)
195197
call HDF5_chkerr(hdferr)
196198

199+
call H5Pcreate_f(H5P_FILE_ACCESS_F, p_access, hdferr)
200+
call HDF5_chkerr(hdferr)
197201
#ifdef PETSC
198202
if (misc_optional(parallel,.true.)) &
199203
#if (PETSC_VERSION_MAJOR==3 && PETSC_VERSION_MINOR>14) && !defined(PETSC_HAVE_MPI_F90MODULE_VISIBILITY)
200-
call H5Pset_fapl_mpio_f(plist_id, PETSC_COMM_WORLD, MPI_INFO_NULL_F90, hdferr)
204+
call H5Pset_fapl_mpio_f(p_access, PETSC_COMM_WORLD, MPI_INFO_NULL_F90, hdferr)
201205
#else
202-
call H5Pset_fapl_mpio_f(plist_id, PETSC_COMM_WORLD, MPI_INFO_NULL, hdferr)
206+
call H5Pset_fapl_mpio_f(p_access, PETSC_COMM_WORLD, MPI_INFO_NULL, hdferr)
203207
#endif
204208
call HDF5_chkerr(hdferr)
205209
#endif
206210

207211
if (m == 'w') then
208-
call H5Fcreate_f(fileName,H5F_ACC_TRUNC_F,HDF5_openFile,hdferr,access_prp = plist_id)
212+
call H5Fcreate_f(fileName,H5F_ACC_TRUNC_F,HDF5_openFile,hdferr,&
213+
access_prp=p_access,creation_prp=p_create)
209214
call HDF5_chkerr(hdferr)
210215
elseif (m == 'a') then
211-
call H5Fopen_f(fileName,H5F_ACC_RDWR_F,HDF5_openFile,hdferr,access_prp = plist_id)
216+
call H5Fopen_f(fileName,H5F_ACC_RDWR_F,HDF5_openFile,hdferr,access_prp=p_access)
212217
call HDF5_chkerr(hdferr)
213218
elseif (m == 'r') then
214219
inquire(file=fileName,exist=exist)
215220
if (.not. exist) call IO_error(100,trim(fileName))
216-
call H5Fopen_f(fileName,H5F_ACC_RDONLY_F,HDF5_openFile,hdferr,access_prp = plist_id)
221+
call H5Fopen_f(fileName,H5F_ACC_RDONLY_F,HDF5_openFile,hdferr,access_prp=p_access)
217222
call HDF5_chkerr(hdferr)
218223
else
219224
error stop 'unknown access mode'
220225
end if
221226

222-
call H5Pclose_f(plist_id, hdferr)
227+
call H5Pclose_f(p_access, hdferr)
228+
call HDF5_chkerr(hdferr)
229+
call H5Pclose_f(p_create, hdferr)
223230
call HDF5_chkerr(hdferr)
224231

225232
end function HDF5_openFile

src/test/test_HDF5_utilities.f90

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ end subroutine test_HDF5_utilities_run
1919

2020
subroutine read_write()
2121

22-
integer(HID_T) :: f
22+
integer(HID_T) :: f, create_list
23+
integer :: hdferr, order
2324

2425
real(pREAL), dimension(3) :: real_d1_in,real_d1_out
2526
real(pREAL), dimension(3,3) :: real_d2_in,real_d2_out
@@ -92,7 +93,15 @@ subroutine read_write()
9293
call HDF5_closeFile(f)
9394

9495
f = HDF5_openFile('test.hdf5','r')
95-
96+
call H5Fget_create_plist_f(f,create_list,hdferr)
97+
call HDF5_chkerr(hdferr)
98+
call H5Pget_link_creation_order_f(create_list,order,hdferr)
99+
call HDF5_chkerr(hdferr)
100+
! https://github.com/HDFGroup/hdf5/issues/5183
101+
!if (iand(order,H5P_CRT_ORDER_INDEXED_F) /= H5P_CRT_ORDER_INDEXED_F) error stop 'CRT_ORDER_INDEXED'
102+
!if (iand(order,H5P_CRT_ORDER_TRACKED_F) /= H5P_CRT_ORDER_TRACKED_F) error stop 'CRT_ORDER_TRACKED'
103+
call H5Pclose_f(create_list,hdferr)
104+
call HDF5_chkerr(hdferr)
96105

97106
call HDF5_read(real_d1_out,f,'real_d1')
98107
call HDF5_read(real_d2_out,f,'real_d2')

0 commit comments

Comments
 (0)