@@ -3,7 +3,8 @@ module h5fortran
33use , intrinsic :: iso_c_binding, only : c_ptr, c_loc
44use , intrinsic :: iso_fortran_env, only : real32, real64, int32, int64, stderr= >error_unit
55use hdf5, only : HID_T, SIZE_T, HSIZE_T, H5F_ACC_RDONLY_F, H5F_ACC_RDWR_F, H5F_ACC_TRUNC_F, &
6- h5open_f, h5close_f, h5gcreate_f, h5gclose_f, h5fopen_f, h5fcreate_f, h5fclose_f, h5lexists_f
6+ h5open_f, h5close_f, h5gcreate_f, h5gclose_f, h5fopen_f, h5fcreate_f, h5fclose_f, h5lexists_f, &
7+ h5get_libversion_f, h5eset_auto_f
78
89use string_utils, only : toLower, strip_trailing_null, truncate_string_null
910
@@ -21,7 +22,8 @@ module h5fortran
2122
2223integer :: comp_lvl = 0 ! < compression level (1-9) 0: disable compression
2324integer (HSIZE_T) :: chunk_size(7 ) = [1 ,1 ,1 ,1 ,1 ,1 ,1 ] ! < chunk size per dimension
24- logical :: verbose= .false.
25+ logical :: verbose= .true.
26+ integer :: libversion(3 ) ! < major, minor, rel
2527
2628contains
2729! > initialize HDF5 file
@@ -38,7 +40,7 @@ module h5fortran
3840 hdf_read_4d,hdf_read_5d, hdf_read_6d, hdf_read_7d
3941
4042! > private methods
41- procedure ,public :: hdf_write_group, &
43+ procedure ,private :: hdf_write_group, &
4244hdf_write_scalar, hdf_write_1d, hdf_write_2d, hdf_write_3d, &
4345 hdf_write_4d, hdf_write_5d, hdf_write_6d, hdf_write_7d, &
4446hdf_read_scalar, hdf_read_1d, hdf_read_2d, hdf_read_3d, &
@@ -228,13 +230,13 @@ end subroutine writeattr
228230integer , parameter :: ENOENT = 2 , EIO = 5
229231
230232private
231- public :: hdf5_file, toLower, hsize_t, strip_trailing_null, truncate_string_null
233+ public :: hdf5_file, toLower, hsize_t, strip_trailing_null, truncate_string_null, check
232234
233235
234236contains
235237
236238
237- subroutine hdf_initialize (self ,filename ,ierr , status ,action ,comp_lvl ,chunk_size )
239+ subroutine hdf_initialize (self ,filename ,ierr , status ,action ,comp_lvl ,chunk_size , verbose )
238240! ! Opens hdf5 file
239241
240242class(hdf5_file), intent (inout ) :: self
@@ -244,6 +246,7 @@ subroutine hdf_initialize(self,filename,ierr, status,action,comp_lvl,chunk_size)
244246character (* ), intent (in ), optional :: action
245247integer , intent (in ), optional :: comp_lvl
246248integer , intent (in ), optional :: chunk_size(:)
249+ logical , intent (in ), optional :: verbose
247250
248251character (:), allocatable :: lstatus, laction
249252logical :: exists
@@ -254,13 +257,23 @@ subroutine hdf_initialize(self,filename,ierr, status,action,comp_lvl,chunk_size)
254257
255258if (present (comp_lvl)) self% comp_lvl = comp_lvl
256259if (present (chunk_size)) self% chunk_size(1 :size (chunk_size)) = chunk_size
260+ if (present (verbose)) self% verbose = verbose
257261
258262! > Initialize FORTRAN interface.
259263call h5open_f(ierr)
260- if (ierr /= 0 ) then
261- write (stderr,* ) ' ERROR: HDF5 library initialize'
262- return
264+ if (check(ierr, ' ERROR: HDF5 library initialize' )) return
265+
266+ ! > get library version
267+ call h5get_libversion_f(self% libversion(1 ), self% libversion(2 ), self% libversion(3 ), ierr)
268+ ! if (self%verbose) print '(A,3I3)', 'HDF5 version: ',self%libversion
269+ if (check(ierr, ' ERROR: HDF5 library get version' )) return
270+
271+ if (self% verbose) then
272+ call h5eset_auto_f(1 , ierr)
273+ else
274+ call h5eset_auto_f(0 , ierr)
263275endif
276+ if (check(ierr, ' ERROR: HDF5 library set traceback' )) return
264277
265278lstatus = ' old'
266279if (present (status)) lstatus = toLower(status)
@@ -277,34 +290,24 @@ subroutine hdf_initialize(self,filename,ierr, status,action,comp_lvl,chunk_size)
277290 if (.not. exists) then
278291 write (stderr,* ) ' ERROR: ' // filename // ' does not exist.'
279292 ierr = ENOENT
280- return
281293 endif
282294 call h5fopen_f(filename,H5F_ACC_RDONLY_F,self% lid,ierr)
283295 case (' write' ,' readwrite' ,' w' ,' rw' , ' r+' , ' append' , ' a' )
284296 call h5fopen_f(filename,H5F_ACC_RDWR_F,self% lid,ierr)
285- if (ierr /= 0 ) then
286- write (stderr,* ) ' ERROR: ' // filename // ' could not be opened'
287- ierr = EIO
288- return
289- endif
297+ if (check(ierr, ' ERROR: ' // filename // ' could not be opened' )) return
290298 case default
291299 write (stderr,* ) ' Unsupported action -> ' // laction
292300 ierr = 128
293- return
294301 endselect
295302 case (' new' ,' replace' )
296303 call h5fcreate_f(filename, H5F_ACC_TRUNC_F, self% lid, ierr)
297- if (ierr /= 0 ) then
298- write (stderr,* ) ' ERROR: ' // filename // ' could not be created'
299- ierr = EIO
300- return
301- endif
304+ if (check(ierr, ' ERROR: ' // filename // ' could not be created' )) return
302305 case default
303306 write (stderr,* ) ' Unsupported status -> ' // lstatus
304307 ierr = 128
305- return
306308endselect
307309
310+
308311end subroutine hdf_initialize
309312
310313
@@ -314,14 +317,11 @@ subroutine hdf_finalize(self, ierr)
314317
315318! > close hdf5 file
316319call h5fclose_f(self% lid, ierr)
317- if (ierr /= 0 ) then
318- write (stderr,* ) ' ERROR: HDF5 file close: ' // self% filename
319- return
320- endif
320+ if (check(ierr, ' ERROR: HDF5 file close: ' // self% filename)) return
321321
322322! > Close Fortran interface.
323323call h5close_f(ierr)
324- if (ierr /= 0 ) write (stderr, * ) ' ERROR: HDF5 library close'
324+ if (check(ierr, ' ERROR: HDF5 library close' )) return
325325
326326end subroutine hdf_finalize
327327
@@ -351,26 +351,30 @@ subroutine hdf_write_group(self, gname, ierr)
351351 ! check subgroup exists
352352 sp = sp + ep
353353 call h5lexists_f(self% lid, gname(1 :sp-1 ), gexist, ierr)
354- if (ierr /= 0 ) then
355- write (stderr,* ) ' ERROR: did not find group ' // gname // ' in ' // self% filename
356- return
357- endif
354+ if (check(ierr, ' ERROR: did not find group ' // gname // ' in ' // self% filename)) return
358355
359356 if (.not. gexist) then
360357 call h5gcreate_f(self% lid, gname(1 :sp-1 ), gid, ierr)
361- if (ierr /= 0 ) then
362- write (stderr,* ) ' ERROR: creating group ' // gname // ' in ' // self% filename
363- return
364- endif
358+ if (check(ierr, ' ERROR: creating group ' // gname // ' in ' // self% filename)) return
365359
366360 call h5gclose_f(gid, ierr)
367- if (ierr /= 0 ) then
368- write (stderr,* ) ' ERROR: closing group ' // gname // ' in ' // self% filename
369- return
370- endif
361+ if (check(ierr, ' ERROR: closing group ' // gname // ' in ' // self% filename)) return
371362 endif
372363end do
373364
374365end subroutine hdf_write_group
375366
367+
368+ logical function check (ierr , msg )
369+ integer , intent (in ) :: ierr
370+ character (* ), intent (in ) :: msg
371+
372+ check = ierr /= 0
373+ if (.not. check) return
374+
375+ write (stderr, * ) msg
376+
377+ end function check
378+
379+
376380end module h5fortran
0 commit comments