11module hdf5_interface
22! ! HDF5 object-oriented polymorphic interface
33
4- use , intrinsic :: iso_fortran_env, only: real32, real64, stderr= >error_unit
4+ use , intrinsic :: iso_fortran_env, only: real32, real64, int32, stderr= >error_unit
55use H5LT
66
7+ use string_utils, only : toLower, strip_trailing_null
8+
79implicit none
810
911! > main type
@@ -15,8 +17,8 @@ module hdf5_interface
1517 glid, & ! < group location identifier
1618 sid, did, pid
1719
18- integer :: comp_lvl = 0 ! < compression level (1-9) 0: disable compression
19- integer (HSIZE_T) :: chunk_size(6 ) = [64 ,64 ,1 ,1 ,1 ,1 ] ! < chunk size per dimension (arbitrary)
20+ integer :: comp_lvl = 0 ! < compression level (1-9) 0: disable compression
21+ integer (HSIZE_T) :: chunk_size(7 ) = [64 ,64 , 1 ,1 ,1 ,1 ,1 ] ! < chunk size per dimension (arbitrary)
2022logical :: verbose= .false.
2123
2224
@@ -25,7 +27,7 @@ module hdf5_interface
2527procedure , public :: initialize = > hdf_initialize, finalize = > hdf_finalize, writeattr, &
2628 open = > hdf_open_group, close = > hdf_close_group, shape = > hdf_get_shape
2729
28- ! > add group or dataset integer/real
30+ ! > add group or dataset integer/real
2931generic, public :: add = > &
3032hdf_add_group, hdf_add_int, hdf_add_int_1d, hdf_add_int_2d, hdf_add_int_3d, hdf_add_int_5d, hdf_add_int_6d, hdf_add_int_7d,&
3133hdf_add_real32, hdf_add_real32_1d, hdf_add_real32_2d, hdf_add_real32_3d, &
@@ -57,7 +59,7 @@ module hdf5_interface
5759hdf_get_real64, hdf_get_real64_1d, hdf_get_real64_2d, hdf_get_real64_3d, &
5860 hdf_get_real64_4d, hdf_get_real64_5d, hdf_get_real64_6d, hdf_get_real64_7d, &
5961hdf_add_string, hdf_get_string
60-
62+
6163end type hdf5_file
6264
6365
@@ -89,26 +91,26 @@ end subroutine hdf_add_string
8991module subroutine hdf_add_int (self ,dname ,value )
9092class(hdf5_file), intent (in ) :: self
9193character (* ), intent (in ) :: dname
92- integer , intent (in ) :: value
94+ integer (int32) , intent (in ) :: value
9395end subroutine hdf_add_int
9496
9597module subroutine hdf_add_int_1d (self ,dname ,value )
9698class(hdf5_file), intent (in ) :: self
9799character (* ), intent (in ) :: dname
98- integer , intent (in ) :: value(:)
100+ integer (int32) , intent (in ) :: value(:)
99101end subroutine hdf_add_int_1d
100102
101103module subroutine hdf_add_int_2d (self ,dname ,value , chunk_size )
102104class(hdf5_file), intent (inout ) :: self
103105character (* ), intent (in ) :: dname
104- integer , intent (in ) :: value(:,:)
106+ integer (int32) , intent (in ) :: value(:,:)
105107integer , intent (in ), optional :: chunk_size(:)
106108end subroutine hdf_add_int_2d
107109
108110module subroutine hdf_add_int_3d (self ,dname ,value , chunk_size )
109111class(hdf5_file), intent (inout ) :: self
110112character (* ), intent (in ) :: dname
111- integer , intent (in ) :: value(:,:,:)
113+ integer (int32) , intent (in ) :: value(:,:,:)
112114integer , intent (in ), optional :: chunk_size(:)
113115end subroutine hdf_add_int_3d
114116
@@ -122,21 +124,21 @@ end subroutine hdf_add_int_4d
122124module subroutine hdf_add_int_5d (self ,dname ,value , chunk_size )
123125class(hdf5_file), intent (inout ) :: self
124126character (* ), intent (in ) :: dname
125- integer , intent (in ) :: value(:,:,:,:,:)
127+ integer (int32) , intent (in ) :: value(:,:,:,:,:)
126128integer , intent (in ), optional :: chunk_size(:)
127129end subroutine hdf_add_int_5d
128130
129131module subroutine hdf_add_int_6d (self ,dname ,value , chunk_size )
130132class(hdf5_file), intent (inout ) :: self
131133character (* ), intent (in ) :: dname
132- integer , intent (in ) :: value(:,:,:,:,:,:)
134+ integer (int32) , intent (in ) :: value(:,:,:,:,:,:)
133135integer , intent (in ), optional :: chunk_size(:)
134136end subroutine hdf_add_int_6d
135137
136138module subroutine hdf_add_int_7d (self ,dname ,value , chunk_size )
137139class(hdf5_file), intent (inout ) :: self
138140character (* ), intent (in ) :: dname
139- integer , intent (in ) :: value(:,:,:,:,:,:,:)
141+ integer (int32) , intent (in ) :: value(:,:,:,:,:,:,:)
140142integer , intent (in ), optional :: chunk_size(:)
141143end subroutine hdf_add_int_7d
142144
@@ -263,49 +265,49 @@ end subroutine hdf_get_string
263265module subroutine hdf_get_int (self , dname , value )
264266class(hdf5_file), intent (in ) :: self
265267character (* ), intent (in ) :: dname
266- integer , intent (out ) :: value
268+ integer (int32) , intent (out ) :: value
267269end subroutine hdf_get_int
268270
269271module subroutine hdf_get_int_1d (self , dname , value )
270272class(hdf5_file), intent (in ) :: self
271273character (* ), intent (in ) :: dname
272- integer , intent (out ),allocatable :: value(:)
274+ integer (int32) , intent (out ),allocatable :: value(:)
273275end subroutine hdf_get_int_1d
274276
275277module subroutine hdf_get_int_2d (self , dname , value )
276278class(hdf5_file), intent (in ) :: self
277279character (* ), intent (in ) :: dname
278- integer , intent (out ),allocatable :: value(:,:)
280+ integer (int32) , intent (out ),allocatable :: value(:,:)
279281end subroutine hdf_get_int_2d
280282
281283module subroutine hdf_get_int_3d (self , dname , value )
282284class(hdf5_file), intent (in ) :: self
283285character (* ), intent (in ) :: dname
284- integer , intent (out ),allocatable :: value(:,:,:)
286+ integer (int32) , intent (out ),allocatable :: value(:,:,:)
285287end subroutine hdf_get_int_3d
286288
287289module subroutine hdf_get_int_4d (self , dname , value )
288290class(hdf5_file), intent (in ) :: self
289291character (* ), intent (in ) :: dname
290- integer , intent (out ),allocatable :: value(:,:,:,:)
292+ integer (int32) , intent (out ),allocatable :: value(:,:,:,:)
291293end subroutine hdf_get_int_4d
292294
293295module subroutine hdf_get_int_5d (self , dname , value )
294296class(hdf5_file), intent (in ) :: self
295297character (* ), intent (in ) :: dname
296- integer , intent (out ),allocatable :: value(:,:,:,:,:)
298+ integer (int32) , intent (out ),allocatable :: value(:,:,:,:,:)
297299end subroutine hdf_get_int_5d
298300
299301module subroutine hdf_get_int_6d (self , dname , value )
300302class(hdf5_file), intent (in ) :: self
301303character (* ), intent (in ) :: dname
302- integer , intent (out ),allocatable :: value(:,:,:,:,:,:)
304+ integer (int32) , intent (out ),allocatable :: value(:,:,:,:,:,:)
303305end subroutine hdf_get_int_6d
304306
305307module subroutine hdf_get_int_7d (self , dname , value )
306308class(hdf5_file), intent (in ) :: self
307309character (* ), intent (in ) :: dname
308- integer , intent (out ),allocatable :: value(:,:,:,:,:,:,:)
310+ integer (int32) , intent (out ),allocatable :: value(:,:,:,:,:,:,:)
309311end subroutine hdf_get_int_7d
310312
311313
@@ -422,7 +424,7 @@ end subroutine writeattr
422424end interface
423425
424426
425- public :: hdf5_file, toLower, hsize_t
427+ public :: hdf5_file, toLower, hsize_t, strip_trailing_null
426428
427429private
428430
@@ -446,12 +448,12 @@ subroutine hdf_initialize(self,filename,status,action,comp_lvl)
446448
447449! > Initialize FORTRAN interface.
448450call h5open_f(ierr)
449- if (ierr /= 0 ) error stop ' Error: HDF5 library initialize Failed! '
451+ if (ierr /= 0 ) error stop ' Error: HDF5 library initialize Failed for ' // self % filename
450452
451- lstatus = ' old' ! not merge() due to unequal character length
453+ lstatus = ' old'
452454if (present (status)) lstatus = toLower(status)
453455
454- laction = ' rw' ! not merge() due to unequal character length
456+ laction = ' rw'
455457if (present (action)) laction = toLower(action)
456458
457459
@@ -487,7 +489,6 @@ subroutine hdf_finalize(self)
487489
488490! > Close Fortran interface.
489491call h5close_f(ierr)
490-
491492if (ierr /= 0 ) error stop ' Error: HDF5 finalization: ' // self% filename
492493
493494end subroutine hdf_finalize
@@ -517,38 +518,17 @@ subroutine hdf_add_group(self, gname)
517518 ! check subgroup exists
518519 sp = sp + ep
519520 call h5lexists_f(self% lid, gname(1 :sp-1 ), gexist, ierr)
520- if (ierr /= 0 ) error stop ' problem finding group ' // gname
521+ if (ierr /= 0 ) error stop ' did not find group ' // gname // ' in ' // self % filename
521522
522523 if (.not. gexist) then
523524 call h5gcreate_f(self% lid, gname(1 :sp-1 ), gid, ierr)
524- if (ierr /= 0 ) error stop ' problem creating group ' // gname
525-
525+ if (ierr /= 0 ) error stop ' problem creating group ' // gname // ' in ' // self % filename
526+
526527 call h5gclose_f(gid, ierr)
527- if (ierr /= 0 ) error stop ' problem closing group ' // gname
528+ if (ierr /= 0 ) error stop ' problem closing group ' // gname // ' in ' // self % filename
528529 endif
529530end do
530531
531532end subroutine hdf_add_group
532533
533-
534-
535- !- ---- Helper functions
536-
537- elemental function toLower (str )
538- ! can be trivially extended to non-ASCII
539- character (* ), intent (in ) :: str
540- character (len (str)) :: toLower
541- character (* ), parameter :: lower= " abcdefghijklmnopqrstuvwxyz" , &
542- upper= " ABCDEFGHIJKLMNOPQRSTUVWXYZ"
543- integer :: i,j
544-
545- toLower = str
546-
547- do concurrent (i = 1 :len (str))
548- j = index (upper,str(i:i))
549- if (j > 0 ) toLower(i:i) = lower(j:j)
550- end do
551-
552- end function toLower
553-
554534end module hdf5_interface
0 commit comments