Skip to content

Commit 50e3cf7

Browse files
committed
7d
7d 7d test shapes
1 parent b06118b commit 50e3cf7

File tree

9 files changed

+343
-33
lines changed

9 files changed

+343
-33
lines changed

CMakeLists.txt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ add_executable(testh5 src/test_hdf5_ifc.f90)
1919
target_link_libraries(testh5 PRIVATE hdf5oo)
2020
target_compile_options(testh5 PRIVATE -Wno-compare-reals)
2121
add_test(NAME h5oo COMMAND testh5)
22+
set_tests_properties(h5oo PROPERTIES FIXTURES_SETUP h5files)
2223

23-
add_executable(shaper src/GetShape.f90)
24-
target_link_libraries(shaper PRIVATE hdf5oo)
24+
add_executable(shapes_check src/GetShape.f90)
25+
target_link_libraries(shapes_check PRIVATE hdf5oo)
26+
add_test(NAME ShapeCheck COMMAND shapes_check p5.h5 group69/flux_node)
27+
set_tests_properties(ShapeCheck PROPERTIES FIXTURES_REQUIRED h5files)

README.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@ Straightforward single-file/module access to HDF5.
77
Uses Fortran 2008 `submodule` for clean, templatable structure.
88
This thin object-oriented modern Fortran library abstracts away the messy parts of HDF5 so that you can read/write various types/ranks of data with a single command.
99

10-
Polymorphic API with read/write integer / real32/64:
10+
Polymorphic API with read/write for types integer, real32, real64 with rank:
1111

12-
* scalar
13-
* 1-D .. 6-D
12+
* scalar (0-D)
13+
* 1-D .. 7-D
1414

1515
as well as character (string) variables and attributes.
16-
If you'd like higher-rank arrays, let us know via GitHub Issue.
1716

1817
Tested on systems including
1918

src/hdf5_interface.f90

Lines changed: 99 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,27 +27,35 @@ module hdf5_interface
2727

2828
!> add group or dataset integer/real
2929
generic, public :: add => &
30-
hdf_add_group, hdf_add_int, hdf_add_int_1d, hdf_add_int_2d, hdf_add_int_3d, &
31-
hdf_add_real32, hdf_add_real32_1d, hdf_add_real32_2d, hdf_add_real32_3d, hdf_add_real32_4d, hdf_add_real32_5d, hdf_add_real32_6d, &
32-
hdf_add_real64, hdf_add_real64_1d, hdf_add_real64_2d, hdf_add_real64_3d, hdf_add_real64_4d, hdf_add_real64_5d, hdf_add_real64_6d, &
30+
hdf_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,&
31+
hdf_add_real32, hdf_add_real32_1d, hdf_add_real32_2d, hdf_add_real32_3d, &
32+
hdf_add_real32_4d, hdf_add_real32_5d, hdf_add_real32_6d, hdf_add_real32_7d, &
33+
hdf_add_real64, hdf_add_real64_1d, hdf_add_real64_2d, hdf_add_real64_3d, &
34+
hdf_add_real64_4d, hdf_add_real64_5d, hdf_add_real64_6d, hdf_add_real64_7d, &
3335
hdf_add_string
3436

3537
!> get dataset integer/real
3638
generic, public :: get => &
37-
hdf_get_int, hdf_get_int_1d, hdf_get_int_2d, hdf_get_int_3d,&
38-
hdf_get_real32, hdf_get_real32_1d, hdf_get_real32_2d, hdf_get_real32_3d, hdf_get_real32_4d, hdf_get_real32_5d, hdf_get_real32_6d, &
39-
hdf_get_real64, hdf_get_real64_1d, hdf_get_real64_2d, hdf_get_real64_3d, hdf_get_real64_4d, hdf_get_real64_5d, hdf_get_real64_6d, &
39+
hdf_get_int, hdf_get_int_1d, hdf_get_int_2d, hdf_get_int_3d, hdf_get_int_4d,hdf_get_int_5d, hdf_get_int_6d, hdf_get_int_7d,&
40+
hdf_get_real32, hdf_get_real32_1d, hdf_get_real32_2d, hdf_get_real32_3d, &
41+
hdf_get_real32_4d, hdf_get_real32_5d, hdf_get_real32_6d, hdf_get_real32_7d, &
42+
hdf_get_real64, hdf_get_real64_1d, hdf_get_real64_2d, hdf_get_real64_3d, &
43+
hdf_get_real64_4d, hdf_get_real64_5d, hdf_get_real64_6d, hdf_get_real64_7d, &
4044
hdf_get_string
4145

4246

4347
!> private methods
4448
procedure,private :: hdf_add_group, &
45-
hdf_add_int, hdf_add_int_1d, hdf_add_int_2d, hdf_add_int_3d, &
46-
hdf_get_int, hdf_get_int_1d, hdf_get_int_2d, hdf_get_int_3d, &
47-
hdf_add_real32, hdf_add_real32_1d, hdf_add_real32_2d, hdf_add_real32_3d, hdf_add_real32_4d, hdf_add_real32_5d, hdf_add_real32_6d, &
48-
hdf_add_real64, hdf_add_real64_1d, hdf_add_real64_2d, hdf_add_real64_3d, hdf_add_real64_4d, hdf_add_real64_5d, hdf_add_real64_6d, &
49-
hdf_get_real32, hdf_get_real32_1d, hdf_get_real32_2d, hdf_get_real32_3d, hdf_get_real32_4d, hdf_get_real32_5d, hdf_get_real32_6d, &
50-
hdf_get_real64, hdf_get_real64_1d, hdf_get_real64_2d, hdf_get_real64_3d, hdf_get_real64_4d, hdf_get_real64_5d, hdf_get_real64_6d, &
49+
hdf_add_int, hdf_add_int_1d, hdf_add_int_2d, hdf_add_int_3d, hdf_add_int_4d, hdf_add_int_5d, hdf_add_int_6d, hdf_add_int_7d, &
50+
hdf_get_int, hdf_get_int_1d, hdf_get_int_2d, hdf_get_int_3d, hdf_get_int_4d, hdf_get_int_5d, hdf_get_int_6d, hdf_get_int_7d, &
51+
hdf_add_real32, hdf_add_real32_1d, hdf_add_real32_2d, hdf_add_real32_3d, &
52+
hdf_add_real32_4d, hdf_add_real32_5d, hdf_add_real32_6d, hdf_add_real32_7d, &
53+
hdf_add_real64, hdf_add_real64_1d, hdf_add_real64_2d, hdf_add_real64_3d, &
54+
hdf_add_real64_4d, hdf_add_real64_5d, hdf_add_real64_6d, hdf_add_real64_7d, &
55+
hdf_get_real32, hdf_get_real32_1d, hdf_get_real32_2d, hdf_get_real32_3d, &
56+
hdf_get_real32_4d, hdf_get_real32_5d, hdf_get_real32_6d, hdf_get_real32_7d, &
57+
hdf_get_real64, hdf_get_real64_1d, hdf_get_real64_2d, hdf_get_real64_3d, &
58+
hdf_get_real64_4d, hdf_get_real64_5d, hdf_get_real64_6d, hdf_get_real64_7d, &
5159
hdf_add_string, hdf_get_string
5260

5361
end type hdf5_file
@@ -104,6 +112,34 @@ module subroutine hdf_add_int_3d(self,dname,value, chunk_size)
104112
integer, intent(in), optional :: chunk_size(:)
105113
end subroutine hdf_add_int_3d
106114

115+
module subroutine hdf_add_int_4d(self,dname,value, chunk_size)
116+
class(hdf5_file), intent(inout) :: self
117+
character(*), intent(in) :: dname
118+
integer, intent(in) :: value(:,:,:,:)
119+
integer, intent(in), optional :: chunk_size(:)
120+
end subroutine hdf_add_int_4d
121+
122+
module subroutine hdf_add_int_5d(self,dname,value, chunk_size)
123+
class(hdf5_file), intent(inout) :: self
124+
character(*), intent(in) :: dname
125+
integer, intent(in) :: value(:,:,:,:,:)
126+
integer, intent(in), optional :: chunk_size(:)
127+
end subroutine hdf_add_int_5d
128+
129+
module subroutine hdf_add_int_6d(self,dname,value, chunk_size)
130+
class(hdf5_file), intent(inout) :: self
131+
character(*), intent(in) :: dname
132+
integer, intent(in) :: value(:,:,:,:,:,:)
133+
integer, intent(in), optional :: chunk_size(:)
134+
end subroutine hdf_add_int_6d
135+
136+
module subroutine hdf_add_int_7d(self,dname,value, chunk_size)
137+
class(hdf5_file), intent(inout) :: self
138+
character(*), intent(in) :: dname
139+
integer, intent(in) :: value(:,:,:,:,:,:,:)
140+
integer, intent(in), optional :: chunk_size(:)
141+
end subroutine hdf_add_int_7d
142+
107143
module subroutine hdf_add_real64(self,dname,value)
108144
class(hdf5_file), intent(in) :: self
109145
character(*), intent(in) :: dname
@@ -151,6 +187,13 @@ module subroutine hdf_add_real64_6d(self,dname,value, chunk_size)
151187
integer, intent(in), optional :: chunk_size(:)
152188
end subroutine hdf_add_real64_6d
153189

190+
module subroutine hdf_add_real64_7d(self,dname,value, chunk_size)
191+
class(hdf5_file), intent(inout) :: self
192+
character(*), intent(in) :: dname
193+
real(real64), intent(in) :: value(:,:,:,:,:,:,:)
194+
integer, intent(in), optional :: chunk_size(:)
195+
end subroutine hdf_add_real64_7d
196+
154197
module subroutine hdf_add_real32(self,dname,value)
155198
class(hdf5_file), intent(in) :: self
156199
character(*), intent(in) :: dname
@@ -198,6 +241,13 @@ module subroutine hdf_add_real32_6d(self,dname,value, chunk_size)
198241
integer, intent(in), optional :: chunk_size(:)
199242
end subroutine hdf_add_real32_6d
200243

244+
module subroutine hdf_add_real32_7d(self,dname,value, chunk_size)
245+
class(hdf5_file), intent(inout) :: self
246+
character(*), intent(in) :: dname
247+
real(real32), intent(in) :: value(:,:,:,:,:,:,:)
248+
integer, intent(in), optional :: chunk_size(:)
249+
end subroutine hdf_add_real32_7d
250+
201251
module subroutine hdf_get_shape(self, dname, dims)
202252
class(hdf5_file), intent(in) :: self
203253
character(*), intent(in) :: dname
@@ -234,6 +284,31 @@ module subroutine hdf_get_int_3d(self, dname, value)
234284
integer, intent(out),allocatable :: value(:,:,:)
235285
end subroutine hdf_get_int_3d
236286

287+
module subroutine hdf_get_int_4d(self, dname, value)
288+
class(hdf5_file), intent(in) :: self
289+
character(*), intent(in) :: dname
290+
integer, intent(out),allocatable :: value(:,:,:,:)
291+
end subroutine hdf_get_int_4d
292+
293+
module subroutine hdf_get_int_5d(self, dname, value)
294+
class(hdf5_file), intent(in) :: self
295+
character(*), intent(in) :: dname
296+
integer, intent(out),allocatable :: value(:,:,:,:,:)
297+
end subroutine hdf_get_int_5d
298+
299+
module subroutine hdf_get_int_6d(self, dname, value)
300+
class(hdf5_file), intent(in) :: self
301+
character(*), intent(in) :: dname
302+
integer, intent(out),allocatable :: value(:,:,:,:,:,:)
303+
end subroutine hdf_get_int_6d
304+
305+
module subroutine hdf_get_int_7d(self, dname, value)
306+
class(hdf5_file), intent(in) :: self
307+
character(*), intent(in) :: dname
308+
integer, intent(out),allocatable :: value(:,:,:,:,:,:,:)
309+
end subroutine hdf_get_int_7d
310+
311+
237312
module subroutine hdf_get_real32(self, dname, value)
238313
class(hdf5_file), intent(in) :: self
239314
character(*), intent(in) :: dname
@@ -276,6 +351,12 @@ module subroutine hdf_get_real32_6d(self, dname, value)
276351
real(real32), intent(out),allocatable :: value(:,:,:,:,:,:)
277352
end subroutine hdf_get_real32_6d
278353

354+
module subroutine hdf_get_real32_7d(self, dname, value)
355+
class(hdf5_file), intent(in) :: self
356+
character(*), intent(in) :: dname
357+
real(real32), intent(out),allocatable :: value(:,:,:,:,:,:,:)
358+
end subroutine hdf_get_real32_7d
359+
279360
module subroutine hdf_get_real64(self, dname, value)
280361
class(hdf5_file), intent(in) :: self
281362
character(*), intent(in) :: dname
@@ -318,6 +399,12 @@ module subroutine hdf_get_real64_6d(self, dname, value)
318399
real(real64), intent(out),allocatable :: value(:,:,:,:,:,:)
319400
end subroutine hdf_get_real64_6d
320401

402+
module subroutine hdf_get_real64_7d(self, dname, value)
403+
class(hdf5_file), intent(in) :: self
404+
character(*), intent(in) :: dname
405+
real(real64), intent(out),allocatable :: value(:,:,:,:,:,:,:)
406+
end subroutine hdf_get_real64_7d
407+
321408
module subroutine hdf_open_group(self, gname)
322409
class(hdf5_file), intent(inout) :: self
323410
character(*), intent(in) :: gname

src/read_int.f90

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
call h5dopen_f(self%lid, dname, dsid, ierr)
1414
if (ierr /= 0) error stop 'error open dataset '//dname//' read '//self%filename
1515

16-
! read dataset
17-
call h5dread_f(dsid, h5kind_to_type(kind(value),H5_INTEGER_KIND), value,int(shape(value),HSIZE_T), ierr)
16+
!> read dataset
17+
call h5dread_f(dsid, h5kind_to_type(kind(value),H5_REAL_KIND), value,int(shape(value),HSIZE_T), ierr)
1818
if (ierr /= 0) error stop 'error read dataset '//dname//' read '//self%filename
1919

2020
!> close dataset
@@ -75,4 +75,72 @@
7575
end procedure hdf_get_int_3d
7676

7777

78+
module procedure hdf_get_int_4d
79+
80+
integer(HSIZE_T) :: dims(rank(value))
81+
integer(SIZE_T) :: dsize
82+
integer :: ierr, dtype
83+
84+
call h5ltget_dataset_info_f(self%lid, dname, dims, dtype, dsize, ierr)
85+
if (ierr /= 0) error stop 'error open dataset '//dname//' read '//self%filename
86+
87+
allocate(value(dims(1),dims(2),dims(3),dims(4)))
88+
89+
call h5ltread_dataset_f(self%lid, dname, h5kind_to_type(kind(value),H5_INTEGER_KIND), value, dims, ierr)
90+
if (ierr /= 0) error stop 'error read dataset '//dname//' read '//self%filename
91+
92+
end procedure hdf_get_int_4d
93+
94+
95+
module procedure hdf_get_int_5d
96+
97+
integer(HSIZE_T) :: dims(rank(value))
98+
integer(SIZE_T) :: dsize
99+
integer :: ierr, dtype
100+
101+
call h5ltget_dataset_info_f(self%lid, dname, dims, dtype, dsize, ierr)
102+
if (ierr /= 0) error stop 'error open dataset '//dname//' read '//self%filename
103+
104+
allocate(value(dims(1),dims(2),dims(3),dims(4),dims(5)))
105+
106+
call h5ltread_dataset_f(self%lid, dname, h5kind_to_type(kind(value),H5_INTEGER_KIND), value, dims, ierr)
107+
if (ierr /= 0) error stop 'error read dataset '//dname//' read '//self%filename
108+
109+
end procedure hdf_get_int_5d
110+
111+
112+
module procedure hdf_get_int_6d
113+
114+
integer(HSIZE_T) :: dims(rank(value))
115+
integer(SIZE_T) :: dsize
116+
integer :: ierr, dtype
117+
118+
call h5ltget_dataset_info_f(self%lid, dname, dims, dtype, dsize, ierr)
119+
if (ierr /= 0) error stop 'error open dataset '//dname//' read '//self%filename
120+
121+
allocate(value(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)))
122+
123+
call h5ltread_dataset_f(self%lid, dname, h5kind_to_type(kind(value),H5_INTEGER_KIND), value, dims, ierr)
124+
if (ierr /= 0) error stop 'error read dataset '//dname//' read '//self%filename
125+
126+
end procedure hdf_get_int_6d
127+
128+
129+
module procedure hdf_get_int_7d
130+
131+
integer(HSIZE_T) :: dims(rank(value))
132+
integer(SIZE_T) :: dsize
133+
integer :: ierr, dtype
134+
135+
call h5ltget_dataset_info_f(self%lid, dname, dims, dtype, dsize, ierr)
136+
if (ierr /= 0) error stop 'error open dataset '//dname//' read '//self%filename
137+
138+
allocate(value(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)))
139+
140+
call h5ltread_dataset_f(self%lid, dname, h5kind_to_type(kind(value),H5_INTEGER_KIND), value, dims, ierr)
141+
if (ierr /= 0) error stop 'error read dataset '//dname//' read '//self%filename
142+
143+
end procedure hdf_get_int_7d
144+
145+
78146
end submodule read_int

src/read_real32.f90

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
module procedure hdf_get_real32_1d
2828

29-
integer(HSIZE_T) :: dims(1)
29+
integer(HSIZE_T) :: dims(rank(value))
3030
integer(SIZE_T) :: dsize
3131
integer :: ierr, dtype
3232

@@ -43,7 +43,7 @@
4343

4444
module procedure hdf_get_real32_2d
4545

46-
integer(HSIZE_T) :: dims(2)
46+
integer(HSIZE_T) :: dims(rank(value))
4747
integer(SIZE_T) :: dsize
4848
integer :: ierr, dtype
4949

@@ -60,7 +60,7 @@
6060

6161
module procedure hdf_get_real32_3d
6262

63-
integer(HSIZE_T) :: dims(3)
63+
integer(HSIZE_T) :: dims(rank(value))
6464
integer(SIZE_T) :: dsize
6565
integer :: ierr, dtype
6666

@@ -77,7 +77,7 @@
7777

7878
module procedure hdf_get_real32_4d
7979

80-
integer(HSIZE_T) :: dims(4)
80+
integer(HSIZE_T) :: dims(rank(value))
8181
integer(SIZE_T) :: dsize
8282
integer :: ierr, dtype
8383

@@ -94,7 +94,7 @@
9494

9595
module procedure hdf_get_real32_5d
9696

97-
integer(HSIZE_T) :: dims(5)
97+
integer(HSIZE_T) :: dims(rank(value))
9898
integer(SIZE_T) :: dsize
9999
integer :: ierr, dtype
100100

@@ -111,7 +111,7 @@
111111

112112
module procedure hdf_get_real32_6d
113113

114-
integer(HSIZE_T) :: dims(6)
114+
integer(HSIZE_T) :: dims(rank(value))
115115
integer(SIZE_T) :: dsize
116116
integer :: ierr, dtype
117117

@@ -126,4 +126,21 @@
126126
end procedure hdf_get_real32_6d
127127

128128

129+
module procedure hdf_get_real32_7d
130+
131+
integer(HSIZE_T) :: dims(rank(value))
132+
integer(SIZE_T) :: dsize
133+
integer :: ierr, dtype
134+
135+
call h5ltget_dataset_info_f(self%lid, dname, dims, dtype, dsize, ierr)
136+
if (ierr /= 0) error stop 'error open dataset '//dname//' read '//self%filename
137+
138+
allocate(value(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)))
139+
140+
call h5ltread_dataset_f(self%lid, dname, h5kind_to_type(kind(value),H5_REAL_KIND), value, dims, ierr)
141+
if (ierr /= 0) error stop 'error read dataset '//dname//' read '//self%filename
142+
143+
end procedure hdf_get_real32_7d
144+
145+
129146
end submodule read_real32

0 commit comments

Comments
 (0)