Skip to content

Commit f1603fe

Browse files
committed
keep order of objects in groups
1 parent a14503c commit f1603fe

File tree

2 files changed

+52
-26
lines changed

2 files changed

+52
-26
lines changed

src/HDF5_utilities.f90

+31-20
Original file line numberDiff line numberDiff line change
@@ -190,49 +190,49 @@ integer(HID_T) function HDF5_openFile(fileName,mode,parallel)
190190
logical, intent(in), optional :: parallel
191191

192192
character :: m
193-
integer(HID_T) :: p_access,p_create
193+
integer(HID_T) :: plist_access_id,plist_create_id
194194
integer :: hdferr
195195
logical :: exist
196196

197197

198198
m = misc_optional(mode,'r')
199199

200-
call H5Pcreate_f(H5P_FILE_CREATE_F, p_create, hdferr)
200+
call H5Pcreate_f(H5P_FILE_CREATE_F,plist_create_id,hdferr)
201201
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
202-
call H5Pset_link_creation_order_f(p_create, ior(H5P_CRT_ORDER_INDEXED_F,H5P_CRT_ORDER_TRACKED_F), hdferr)
202+
call H5Pset_link_creation_order_f(plist_create_id,ior(H5P_CRT_ORDER_INDEXED_F,H5P_CRT_ORDER_TRACKED_F),hdferr)
203203
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
204204

205-
call H5Pcreate_f(H5P_FILE_ACCESS_F, p_access, hdferr)
205+
call H5Pcreate_f(H5P_FILE_ACCESS_F, plist_access_id,hdferr)
206206
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
207207
#ifdef PETSC
208208
if (misc_optional(parallel,.true.)) &
209209
#if (PETSC_VERSION_MAJOR==3 && PETSC_VERSION_MINOR>14) && !defined(PETSC_HAVE_MPI_F90MODULE_VISIBILITY)
210-
call H5Pset_fapl_mpio_f(p_access, PETSC_COMM_WORLD, MPI_INFO_NULL_F90, hdferr)
210+
call H5Pset_fapl_mpio_f(plist_access_id, PETSC_COMM_WORLD, MPI_INFO_NULL_F90, hdferr)
211211
#else
212-
call H5Pset_fapl_mpio_f(p_access, PETSC_COMM_WORLD, MPI_INFO_NULL, hdferr)
212+
call H5Pset_fapl_mpio_f(plist_access_id, PETSC_COMM_WORLD, MPI_INFO_NULL, hdferr)
213213
#endif
214214
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
215215
#endif
216216

217217
if (m == 'w') then
218218
call H5Fcreate_f(fileName,H5F_ACC_TRUNC_F,HDF5_openFile,hdferr,&
219-
access_prp=p_access,creation_prp=p_create)
219+
access_prp=plist_access_id,creation_prp=plist_create_id)
220220
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
221221
elseif (m == 'a') then
222-
call H5Fopen_f(fileName,H5F_ACC_RDWR_F,HDF5_openFile,hdferr,access_prp=p_access)
222+
call H5Fopen_f(fileName,H5F_ACC_RDWR_F,HDF5_openFile,hdferr,access_prp=plist_access_id)
223223
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
224224
elseif (m == 'r') then
225225
inquire(file=fileName,exist=exist)
226226
if (.not. exist) call IO_error(100,trim(fileName))
227-
call H5Fopen_f(fileName,H5F_ACC_RDONLY_F,HDF5_openFile,hdferr,access_prp=p_access)
227+
call H5Fopen_f(fileName,H5F_ACC_RDONLY_F,HDF5_openFile,hdferr,access_prp=plist_access_id)
228228
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
229229
else
230230
error stop 'unknown access mode'
231231
end if
232232

233-
call H5Pclose_f(p_access, hdferr)
233+
call H5Pclose_f(plist_access_id, hdferr)
234234
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
235-
call H5Pclose_f(p_create, hdferr)
235+
call H5Pclose_f(plist_create_id, hdferr)
236236
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
237237

238238
end function HDF5_openFile
@@ -247,6 +247,7 @@ subroutine HDF5_closeFile(fileHandle)
247247

248248
integer :: hdferr
249249

250+
250251
call H5Fclose_f(fileHandle,hdferr)
251252
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
252253

@@ -262,26 +263,35 @@ integer(HID_T) function HDF5_addGroup(fileHandle,groupName)
262263
character(len=*), intent(in) :: groupName
263264

264265
integer :: hdferr
265-
integer(HID_T) :: aplist_id
266+
integer(HID_T) :: gapl_id, gcpl_id
266267

267-
!-------------------------------------------------------------------------------------------------
268-
! creating a property list for data access properties
269-
call H5Pcreate_f(H5P_GROUP_ACCESS_F, aplist_id, hdferr)
270-
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
271268

272269
!-------------------------------------------------------------------------------------------------
273-
! setting I/O mode to collective
270+
! set I/O mode to collective (for MPI parallel simulations)
271+
call H5Pcreate_f(H5P_GROUP_ACCESS_F,gapl_id,hdferr)
272+
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
274273
#ifdef PETSC
275-
call H5Pset_all_coll_metadata_ops_f(aplist_id, .true., hdferr)
274+
call H5Pset_all_coll_metadata_ops_f(gapl_id,.true.,hdferr)
276275
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
277276
#endif
278277

278+
!-------------------------------------------------------------------------------------------------
279+
! keep creation order in group
280+
call H5Pcreate_f(H5P_GROUP_CREATE_F,gcpl_id,hdferr)
281+
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
282+
call H5Pset_link_creation_order_f(gcpl_id,ior(H5P_CRT_ORDER_INDEXED_F,H5P_CRT_ORDER_TRACKED_F),hdferr)
283+
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
284+
279285
!-------------------------------------------------------------------------------------------------
280286
! Create group
281-
call H5Gcreate_f(fileHandle, trim(groupName), HDF5_addGroup, hdferr, OBJECT_NAMELEN_DEFAULT_F,gapl_id = aplist_id)
287+
call H5Gcreate_f(fileHandle,trim(groupName),HDF5_addGroup,hdferr, &
288+
OBJECT_NAMELEN_DEFAULT_F,gcpl_id=gcpl_id,gapl_id=gapl_id)
282289
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
283290

284-
call H5Pclose_f(aplist_id,hdferr)
291+
call H5Pclose_f(gcpl_id,hdferr)
292+
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
293+
call H5Pclose_f(gapl_id,hdferr)
294+
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
285295

286296
end function HDF5_addGroup
287297

@@ -331,6 +341,7 @@ subroutine HDF5_closeGroup(group_id)
331341

332342
integer :: hdferr
333343

344+
334345
call H5Gclose_f(group_id, hdferr)
335346
call HDF5_chkerr(hdferr,__FILE__//':'//IO_intAsStr(__LINE__))
336347

src/test/test_HDF5_utilities.f90

+21-6
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ end subroutine test_HDF5_utilities_run
1919

2020
subroutine read_write()
2121

22-
integer(HID_T) :: f, create_list
22+
integer(HID_T) :: f,g, plist_create_id
2323
integer :: hdferr, order
2424

2525
real(pREAL), dimension(3) :: real_d1_in,real_d1_out
@@ -89,20 +89,35 @@ subroutine read_write()
8989
if (any(int_d4_in /= int_d4_out)) error stop 'test_read_write(w)/int_d4'
9090
if (any(int_d5_in /= int_d5_out)) error stop 'test_read_write(w)/int_d5'
9191

92+
call HDF5_closeGroup(HDF5_addGroup(f,'grp'))
9293

9394
call HDF5_closeFile(f)
9495

96+
9597
f = HDF5_openFile('test.hdf5','r')
96-
call H5Fget_create_plist_f(f,create_list,hdferr)
98+
99+
call H5Fget_create_plist_f(f,plist_create_id,hdferr)
97100
call HDF5_chkerr(hdferr)
98-
call H5Pget_link_creation_order_f(create_list,order,hdferr)
101+
call H5Pget_link_creation_order_f(plist_create_id,order,hdferr)
99102
call HDF5_chkerr(hdferr)
100103
! 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+
!if (iand(order,H5P_CRT_ORDER_INDEXED_F) /= H5P_CRT_ORDER_INDEXED_F) error stop 'CRT_ORDER_INDEXED/file'
105+
!if (iand(order,H5P_CRT_ORDER_TRACKED_F) /= H5P_CRT_ORDER_TRACKED_F) error stop 'CRT_ORDER_TRACKED/file'
106+
call H5Pclose_f(plist_create_id,hdferr)
104107
call HDF5_chkerr(hdferr)
105108

109+
g = HDF5_openGroup(f,'grp')
110+
call H5Gget_create_plist_f(g,plist_create_id,hdferr)
111+
call HDF5_chkerr(hdferr,'H5Gget_create_plist_f')
112+
call H5Pget_link_creation_order_f(plist_create_id,order,hdferr)
113+
call HDF5_chkerr(hdferr,'H5Pget_link_creation_order_f')
114+
if (iand(order,H5P_CRT_ORDER_INDEXED_F) /= H5P_CRT_ORDER_INDEXED_F) error stop 'CRT_ORDER_INDEXED/group'
115+
if (iand(order,H5P_CRT_ORDER_TRACKED_F) /= H5P_CRT_ORDER_TRACKED_F) error stop 'CRT_ORDER_TRACKED/group'
116+
call H5Pclose_f(plist_create_id,hdferr)
117+
call HDF5_chkerr(hdferr,'H5Pclose_f')
118+
call HDF5_closeGroup(g)
119+
120+
106121
call HDF5_read(real_d1_out,f,'real_d1')
107122
call HDF5_read(real_d2_out,f,'real_d2')
108123
call HDF5_read(real_d3_out,f,'real_d3')

0 commit comments

Comments
 (0)