@@ -18,7 +18,7 @@ module h5fortran
1818implicit none (type, external )
1919private
2020public :: hdf5_file, hdf5_close, h5write, h5read, h5exist, is_hdf5, h5write_attr, h5read_attr, &
21- check, hdf_shape_check, hdf_get_slice, hdf_wrapup, & ! < for submodules only
21+ check, hdf_shape_check, hdf_rank_check, hdf_get_slice, hdf_wrapup, & ! < for submodules only
2222 HSIZE_T, HID_T, H5T_NATIVE_DOUBLE, H5T_NATIVE_REAL, H5T_NATIVE_INTEGER ! < HDF5 types for end users
2323
2424! > main type
@@ -1367,49 +1367,50 @@ subroutine hdf_get_slice(self, dname, did, sid, mem_sid, i0, i1, i2)
13671367end subroutine hdf_get_slice
13681368
13691369
1370- subroutine hdf_shape_check (self , dname , dims )
1370+ subroutine hdf_rank_check (self , dname , dims )
1371+
13711372class(hdf5_file), intent (in ) :: self
13721373character (* ), intent (in ) :: dname
1373- class( * ), intent (in ) :: dims(:)
1374+ integer (HSIZE_T ), intent (in ) :: dims(:)
13741375
1375- integer :: ierr
1376- integer (SIZE_T) :: dsize
1377- integer (HSIZE_T), dimension (size (dims)):: ddims, vdims
1378- integer :: dtype, drank
1376+ integer :: ierr, drank
13791377
1380- if (.not. self% is_open) error stop ' h5fortran:shape : file handle is not open'
1378+ if (.not. self% is_open) error stop ' h5fortran:rank_check : file handle is not open'
13811379
13821380if (.not. self% exist (dname)) error stop ' ERROR: ' // dname // ' does not exist in ' // self% filename
13831381
1384-
1385- ! > allow user to specify int4 or int8 dims
1386- select type (dims)
1387- type is (integer (int32))
1388- vdims = int (dims, int64)
1389- type is (integer (hsize_t))
1390- vdims = dims
1391- class default
1392- error stop ' ERROR:h5fortran:shape_check: wrong type for dims: ' // dname // ' in ' // self% filename
1393- end select
1394-
13951382! > check for matching rank, else bad reads can occur--doesn't always crash without this check
13961383call h5ltget_dataset_ndims_f(self% lid, dname, drank, ierr)
1397- if (ierr/= 0 ) error stop ' ERROR:h5fortran:shape_check: get_dataset_ndim ' // dname // ' read ' // self% filename
1398-
1384+ if (ierr/= 0 ) error stop ' ERROR:h5fortran:rank_check: get_dataset_ndim ' // dname // ' read ' // self% filename
13991385
1400- if (drank /= size (vdims )) then
1401- write (stderr,' (A,I0,A,I0)' ) ' ERROR:h5fortran:shape_check : rank mismatch ' // dname // ' = ' ,drank,' variable rank =' , size (vdims )
1386+ if (drank /= size (dims )) then
1387+ write (stderr,' (A,I0,A,I0)' ) ' ERROR:h5fortran:rank_check : rank mismatch ' // dname // ' = ' ,drank,' variable rank =' , size (dims )
14021388 error stop
14031389endif
14041390
1391+ end subroutine hdf_rank_check
1392+
1393+
1394+ subroutine hdf_shape_check (self , dname , dims )
1395+ class(hdf5_file), intent (in ) :: self
1396+ character (* ), intent (in ) :: dname
1397+ integer (HSIZE_T), intent (in ) :: dims(:)
1398+
1399+ integer :: ierr
1400+ integer (SIZE_T) :: type_size
1401+ integer (HSIZE_T), dimension (size (dims)):: ddims
1402+ integer :: type_class
1403+
1404+ call hdf_rank_check(self, dname, dims)
1405+
14051406! > check for matching size, else bad reads can occur.
14061407
1407- call h5ltget_dataset_info_f(self% lid, dname, ddims, dtype, dsize , ierr)
1408+ call h5ltget_dataset_info_f(self% lid, dname, ddims, type_class, type_size , ierr)
14081409if (ierr/= 0 ) error stop ' ERROR:h5fortran:shape_check: get_dataset_info ' // dname // ' read ' // self% filename
14091410
14101411
1411- if (.not. all (vdims = = ddims)) then
1412- write (stderr,* ) ' ERROR:h5fortran:shape_check: shape mismatch ' // dname // ' = ' ,ddims,' variable shape =' , vdims
1412+ if (any ( int (dims, int64) / = ddims)) then
1413+ write (stderr,* ) ' ERROR:h5fortran:shape_check: shape mismatch ' // dname // ' = ' ,ddims,' variable shape =' , dims
14131414 error stop
14141415endif
14151416
0 commit comments