Skip to content

Commit ba65dcb

Browse files
committed
add %exist method
1 parent 21ed4b3 commit ba65dcb

File tree

5 files changed

+83
-60
lines changed

5 files changed

+83
-60
lines changed

src/interface.f90

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,25 @@ module h5mpi
4949

5050
contains
5151

52-
procedure, public :: open => ph5open, close => ph5close, &
53-
flush => hdf_flush, ndim => hdf_get_ndim, shape => hdf_get_shape, exist => hdf_exist, &
54-
create => hdf_create, filesize => hdf_filesize, &
55-
class => get_class, dtype => get_native_dtype, &
56-
deflate => get_deflate, &
57-
softlink => create_softlink, &
58-
layout => hdf_get_layout, chunks => hdf_get_chunk, &
59-
is_contig => hdf_is_contig, is_chunked => hdf_is_chunked, is_compact => hdf_is_compact, &
60-
is_open, write_group
52+
procedure, public :: open => ph5open
53+
procedure, public :: close => ph5close
54+
procedure, public :: write_group
55+
procedure, public :: create => hdf_create
56+
procedure, public :: flush => hdf_flush
57+
procedure, public :: filesize => hdf_filesize
58+
procedure, public :: ndim => hdf_get_ndim
59+
procedure, public :: shape => hdf_get_shape
60+
procedure, public :: layout => hdf_get_layout
61+
procedure, public :: chunks => hdf_get_chunk
62+
procedure, public :: exist => hdf_check_exist
63+
procedure, public :: class => get_class
64+
procedure, public :: dtype => get_native_dtype
65+
procedure, public :: deflate => get_deflate
66+
procedure, public :: is_contig => hdf_is_contig
67+
procedure, public :: is_chunked => hdf_is_chunked
68+
procedure, public :: is_compact => hdf_is_compact
69+
procedure, public :: softlink => create_softlink
70+
procedure, public :: is_open
6171
!! procedures without mapping
6272

6373
generic, public :: write => h5write_scalar,ph5write_1d, ph5write_2d, ph5write_3d, ph5write_4d, ph5write_5d, ph5write_6d, ph5write_7d
@@ -269,9 +279,14 @@ end function hdf_get_layout
269279
module subroutine hdf_get_chunk(self, dname, chunk_size)
270280
class(hdf5_file), intent(in) :: self
271281
character(*), intent(in) :: dname
272-
integer(hsize_t), intent(out) :: chunk_size(:)
282+
class(*), intent(out) :: chunk_size(:)
273283
end subroutine hdf_get_chunk
274284

285+
module logical function hdf_check_exist(self, dname)
286+
class(hdf5_file), intent(in) :: self
287+
character(*), intent(in) :: dname
288+
end function hdf_check_exist
289+
275290
end interface
276291

277292

@@ -610,21 +625,6 @@ function hdf5version() result(v)
610625
end function hdf5version
611626

612627

613-
logical function hdf_exist(self, dname) result(exists)
614-
class(hdf5_file), intent(in) :: self
615-
character(*), intent(in) :: dname
616-
617-
integer :: ierr
618-
619-
if(.not. self%is_open()) error stop 'h5fortran:exist: file handle is not open: ' // self%filename
620-
621-
call h5ltpath_valid_f(self%file_id, dname, .true., exists, ierr)
622-
!! h5lexists_f can false error with groups--just use h5ltpath_valid
623-
if (ierr/=0) error stop 'h5fortran:check_exist: could not determine status of ' // dname // ' in ' // self%filename
624-
625-
end function hdf_exist
626-
627-
628628
subroutine hdf5_close()
629629
!! this subroutine will close ALL existing file handles
630630
!! only call it at end of your program

src/read.f90

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -224,36 +224,42 @@ end subroutine get_dset_class
224224

225225
integer :: ierr, drank
226226
integer(HID_T) :: dapl, dset_id
227+
integer(HSIZE_T) :: cs(size(chunk_size))
227228

228-
if(.not. self%is_open()) error stop 'ERROR:h5fortran:read: file handle is not open'
229+
cs = -1
229230

230-
chunk_size = -1
231-
if (.not.self%exist(dname)) then
232-
write(stderr, *) 'ERROR:h5fortran:get_chunk: ' // dname // ' does not exist in ' // self%filename
233-
ierr = -1
234-
return
235-
endif
231+
if (.not.self%is_open()) error stop 'ERROR:h5fortran:read: file handle is not open'
232+
if (.not.self%exist(dname)) error stop 'ERROR:h5fortran:get_chunk: ' // dname // ' does not exist in ' // self%filename
236233

237-
if(.not. self%is_chunked(dname)) return
234+
if(self%is_chunked(dname)) then
235+
call h5ltget_dataset_ndims_f(self%file_id, dname, drank, ierr)
236+
if (ierr /= 0) error stop 'ERROR:h5fortran:get_chunk: get rank ' // dname // ' ' // self%filename
238237

239-
call h5ltget_dataset_ndims_f(self%file_id, dname, drank, ierr)
240-
if (ierr /= 0) error stop 'ERROR:h5fortran:get_chunk: get rank ' // dname // ' ' // self%filename
238+
call h5dopen_f(self%file_id, dname, dset_id, ierr)
239+
if (ierr /= 0) error stop 'ERROR:h5fortran:get_chunk: open dataset ' // dname // ' ' // self%filename
241240

242-
call h5dopen_f(self%file_id, dname, dset_id, ierr)
243-
if (ierr /= 0) error stop 'ERROR:h5fortran:get_chunk: open dataset ' // dname // ' ' // self%filename
241+
call h5dget_create_plist_f(dset_id, dapl, ierr)
242+
if (ierr /= 0) error stop 'ERROR:h5fortran:get_chunk: get property list ID ' // dname // ' ' // self%filename
244243

245-
call h5dget_create_plist_f(dset_id, dapl, ierr)
246-
if (ierr /= 0) error stop 'ERROR:h5fortran:get_chunk: get property list ID ' // dname // ' ' // self%filename
244+
call h5dclose_f(dset_id, ierr)
245+
if (ierr /= 0) error stop 'ERROR:h5fortran:get_chunk: close dataset: ' // dname // ' ' // self%filename
247246

248-
call h5dclose_f(dset_id, ierr)
249-
if (ierr /= 0) error stop 'ERROR:h5fortran:get_chunk: close dataset: ' // dname // ' ' // self%filename
247+
call h5pget_chunk_f(dapl, drank, cs, ierr)
248+
if (ierr /= drank) error stop 'ERROR:h5fortran:get_chunk:h5pget_chunk ' // dname // ' ' // self%filename
249+
!! yes ierr == drank is success for this call
250250

251-
call h5pget_chunk_f(dapl, drank, chunk_size, ierr)
252-
if (ierr /= drank) error stop 'ERROR:h5fortran:get_chunk:h5pget_chunk ' // dname // ' ' // self%filename
253-
!! yes ierr == drank is success for this call
251+
call h5pclose_f(dapl, ierr)
252+
if (ierr /= 0) error stop 'ERROR:h5fortran:get_chunk: close property list ' // dname // ' ' // self%filename
253+
endif
254254

255-
call h5pclose_f(dapl, ierr)
256-
if (ierr /= 0) error stop 'ERROR:h5fortran:get_chunk: close property list ' // dname // ' ' // self%filename
255+
select type (chunk_size)
256+
type is (integer(HSIZE_T))
257+
chunk_size = cs
258+
type is (integer(int32))
259+
chunk_size = int(cs)
260+
class default
261+
error stop 'ERROR:h5fortran:get_chunk: unknown type for chunk_size'
262+
end select
257263

258264
end procedure hdf_get_chunk
259265

@@ -286,4 +292,18 @@ end subroutine get_dset_class
286292

287293
end procedure hdf_get_layout
288294

295+
296+
module procedure hdf_check_exist
297+
298+
integer :: ierr
299+
300+
if(.not. self%is_open()) error stop 'ERROR:h5fortran:exist: file handle is not open: ' // self%filename
301+
302+
call h5ltpath_valid_f(self%file_id, dname, .true., hdf_check_exist, ierr)
303+
!! h5lexists_f can false error with groups--just use h5ltpath_valid
304+
305+
if (ierr/=0) error stop 'ERROR:h5fortran:check_exist: could not determine status of ' // dname // ' in ' // self%filename
306+
307+
end procedure hdf_check_exist
308+
289309
end submodule hdf5_read

src/writer_template.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ type is (integer(int32))
6161
type is (integer(int64))
6262
call h5dwrite_f(dset_id, dtype, value, dims_dset, ier, file_space_id=file_space_id, mem_space_id=mem_space_id, xfer_prp=xfer_id)
6363
class default
64-
error stop "unknown variable type for " // dname
64+
error stop "ERROR:h5fortran:writer: unknown variable type for " // dname
6565
end select
6666
if (ier /= 0) error stop 'ERROR:h5fortran:h5dwrite: could not write ' // dname // ' to ' // self%filename
6767

test/test_deflate_props.f90

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ program test_deflate_props
2525
if(ierr/=0) error stop "mpi_comm_rank"
2626

2727
call test_read_deflate_props(fn1, N, mpi_id)
28-
if(mpi_id==0) print *,'OK: HDF5 read deflate properties'
28+
if(mpi_id == 0) print *,'OK: HDF5 read deflate properties'
2929

3030
call test_get_deflate(fn1)
31-
if (ierr /= 0) print *, 'OK: HDF5 get deflate'
31+
if(mpi_id == 0) print *, 'OK: HDF5 get deflate'
3232

3333
call mpi_finalize(ierr)
3434
if (ierr /= 0) error stop "mpi_finalize"

test/test_deflate_write.f90

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ program test_deflate
2020
integer :: ierr, mpi_id, Nmpi
2121

2222

23+
logical :: debug = .false.
24+
25+
2326
call mpi_init(ierr)
2427
if (ierr /= 0) error stop "mpi_init"
2528

@@ -50,7 +53,6 @@ subroutine test_write_deflate(fn, N, mpi_id, Nmpi)
5053
type(hdf5_file) :: h5f
5154
integer(HSIZE_T) :: i0(2), i1(2), dx2
5255
real(real32), allocatable :: A(:,:)
53-
logical :: debug = .false.
5456

5557
!> MPI partition
5658
if(mpi_id == 0) then
@@ -72,7 +74,7 @@ subroutine test_write_deflate(fn, N, mpi_id, Nmpi)
7274
i1(2) = i0(2) + dx2 - 1
7375

7476
!> write with MPI, compressing if available
75-
if(debug) print '(a,i0,1x,2i5,2x,2i5)', "#1 partition: mpi_id, i0, i1 ", mpi_id, i0, i1
77+
if(debug) print '(a,i0,1x,2i5,2x,2i5)', "write_deflate partition: mpi_id, i0, i1 ", mpi_id, i0, i1
7678

7779
call h5f%open(fn, action='w', comp_lvl=1, mpi=.true.)
7880
call h5f%write('/A', A, N, istart=i0, iend=i1, chunk_size=[5, 50])
@@ -140,14 +142,12 @@ subroutine test_deflate_whole(fn, N)
140142
call h5f%chunks('/A_autochunk', chunks)
141143
if(any(chunks < 1)) error stop '#2 auto chunk unexpected chunk size'
142144

143-
call h5f%close()
144-
145145
if(mpi_id == 0) then
146146
fsize = real(h5f%filesize())
147147
crat = (2 * N(1) * N(2) * 4 * storage_size(A) / 8) / fsize
148148
!! 2* since two datasets same size
149149

150-
print '(A,F6.2,A,I6)','#2 filesize (Mbytes): ', fsize / 1e6, ' compression ratio:', crat
150+
print '(A,F6.2,A,f7.1)','#2 filesize (Mbytes): ', fsize / 1e6, ' compression ratio:', crat
151151

152152
if (h5f%parallel_compression) then
153153
if(crat < MIN_COMP) error stop fn // ' low compression'
@@ -156,6 +156,8 @@ subroutine test_deflate_whole(fn, N)
156156
endif
157157
endif
158158

159+
call h5f%close()
160+
159161
end subroutine test_deflate_whole
160162

161163

@@ -166,8 +168,9 @@ subroutine test_deflate_slice(fn, N)
166168

167169
type(hdf5_file) :: h5f
168170
integer, allocatable :: A(:,:,:)
169-
integer(hsize_t) :: crat, chunks(3), dx2, i0(3), i1(3)
170-
integer :: fsize, mpi_id, Nmpi, M(3)
171+
integer(hsize_t) :: chunks(3), dx2, i0(3), i1(3)
172+
integer :: mpi_id, Nmpi, M(3)
173+
real :: fsize, crat
171174

172175
!> MPI partition
173176
call mpi_comm_size(MPI_COMM_WORLD, Nmpi, ierr)
@@ -196,13 +199,11 @@ subroutine test_deflate_slice(fn, N)
196199
call h5f%chunks('/A', chunks)
197200
if(any(chunks < 1)) error stop '#3 auto chunk unexpected chunk size'
198201

199-
call h5f%close()
200-
201202
if(mpi_id == 0) then
202-
inquire(file=fn, size=fsize)
203+
fsize = real(h5f%filesize())
203204
crat = (N(1) * N(2) * storage_size(A) / 8) / fsize
204205

205-
print '(A,F6.2,A,I6)','#3 filesize (Mbytes): ',fsize / 1e6, ' compression ratio:', crat
206+
print '(A,F6.2,A,f7.1)','#3 filesize (Mbytes): ',fsize / 1e6, ' compression ratio:', crat
206207

207208
if (h5f%parallel_compression) then
208209
if(crat < MIN_COMP) error stop fn // ' low compression'
@@ -211,6 +212,8 @@ subroutine test_deflate_slice(fn, N)
211212
endif
212213
endif
213214

215+
call h5f%close()
216+
214217
end subroutine test_deflate_slice
215218

216219

0 commit comments

Comments
 (0)