|
1 | 1 | submodule (h5mpi:hdf5_read) read_scalar
|
2 | 2 |
|
3 |
| -use h5lt, only : h5ltread_dataset_string_f |
4 |
| -use hdf5, only : h5dread_f, h5dget_space_f, h5dvlen_get_max_len_f, h5dread_vl_f, h5dvlen_reclaim_f,& |
5 |
| -h5tis_variable_str_f, & |
6 |
| -h5sclose_f, & |
7 |
| -H5T_STR_NULLTERM_F |
| 3 | +use hdf5, only : H5Dread_f, & |
| 4 | +H5Sclose_f |
8 | 5 |
|
9 | 6 | implicit none (type, external)
|
10 | 7 |
|
| 8 | +interface |
| 9 | + |
| 10 | +module subroutine read_scalar_char(A, dset_id, file_space_id, mem_space_id, dims) |
| 11 | +class(*), intent(inout) :: A |
| 12 | +integer(HID_T), intent(in) :: dset_id, file_space_id |
| 13 | +integer(HID_T), intent(inout) :: mem_space_id |
| 14 | +integer(HSIZE_T), intent(in) :: dims(:) |
| 15 | +end subroutine |
| 16 | + |
| 17 | +end interface |
| 18 | + |
11 | 19 | contains
|
12 | 20 |
|
13 | 21 |
|
14 | 22 | module procedure h5read_scalar
|
15 | 23 |
|
16 | 24 | integer(HSIZE_T) :: dims(0)
|
17 |
| -integer(SIZE_T) :: dsize |
18 |
| -integer(HID_T) :: dset_id, type_id, xfer_id, space_id |
19 |
| -integer :: dclass, ier, i, pad_type |
| 25 | +integer(HID_T) :: dset_id, xfer_id, file_space_id, mem_space_id |
| 26 | +integer :: dclass, ier |
20 | 27 |
|
21 |
| -logical :: vector_scalar, vstatus |
| 28 | +logical :: is_scalar |
22 | 29 |
|
23 |
| -real(real32) :: buf_r32(1) |
24 |
| -real(real64) :: buf_r64(1) |
25 |
| -integer(int32) :: buf_i32(1) |
26 |
| -integer(int64) :: buf_i64(1) |
| 30 | +file_space_id = H5S_ALL_F |
| 31 | +mem_space_id = H5S_ALL_F |
27 | 32 |
|
28 |
| -call hdf_rank_check(self, dname, rank(A), vector_scalar) |
29 |
| -if(vector_scalar) then |
30 |
| - select type(A) |
31 |
| - type is (real(real32)) |
32 |
| - call h5read_1d(self, dname, buf_r32) |
33 |
| - A = buf_r32(1) |
34 |
| - type is (real(real64)) |
35 |
| - call h5read_1d(self, dname, buf_r64) |
36 |
| - A = buf_r64(1) |
37 |
| - type is (integer(int32)) |
38 |
| - call h5read_1d(self, dname, buf_i32) |
39 |
| - A = buf_i32(1) |
40 |
| - type is (integer(int64)) |
41 |
| - call h5read_1d(self, dname, buf_i64) |
42 |
| - A = buf_i64(1) |
43 |
| - class default |
44 |
| - error stop "h5fortran:read:vector_scalar: unknown memory variable type" // dname |
45 |
| - end select |
46 |
| - return |
47 |
| -endif |
| 33 | +call hdf_rank_check(self, dname, rank(A), is_scalar) |
48 | 34 |
|
49 |
| -call h5dopen_f(self%file_id, dname, dset_id, ier) |
50 |
| -if(ier/=0) error stop 'h5fortran:reader: ' // dname // ' could not be opened in ' // self%filename |
| 35 | +call H5Dopen_f(self%file_id, dname, dset_id, ier) |
| 36 | +if(ier/=0) error stop 'ERROR:h5fortran:reader: ' // dname // ' could not be opened in ' // self%filename |
51 | 37 |
|
52 | 38 | call get_dset_class(self, dname, dclass, dset_id)
|
53 | 39 |
|
|
62 | 48 | if(dclass == H5T_FLOAT_F) then
|
63 | 49 | select type(A)
|
64 | 50 | type is (real(real64))
|
65 |
| - call h5dread_f(dset_id, H5T_NATIVE_DOUBLE, A, dims, ier) |
| 51 | + call H5Dread_f(dset_id, H5T_NATIVE_DOUBLE, A, dims, ier) |
66 | 52 | type is (real(real32))
|
67 |
| - call h5dread_f(dset_id, H5T_NATIVE_REAL, A, dims, ier) |
| 53 | + call H5Dread_f(dset_id, H5T_NATIVE_REAL, A, dims, ier) |
68 | 54 | class default
|
69 |
| - error stop 'h5fortran:read: real disk dataset ' // dname // ' needs real memory variable' |
| 55 | + error stop 'ERROR:h5fortran:read: real disk dataset ' // dname // ' needs real memory variable' |
70 | 56 | end select
|
71 | 57 | elseif(dclass == H5T_INTEGER_F) then
|
72 | 58 | select type(A)
|
73 | 59 | type is (integer(int32))
|
74 |
| - call h5dread_f(dset_id, H5T_NATIVE_INTEGER, A, dims, ier) |
| 60 | + call H5Dread_f(dset_id, H5T_NATIVE_INTEGER, A, dims, ier) |
75 | 61 | type is (integer(int64))
|
76 |
| - call h5dread_f(dset_id, H5T_STD_I64LE, A, dims, ier) |
| 62 | + call H5Dread_f(dset_id, H5T_STD_I64LE, A, dims, ier) |
77 | 63 | class default
|
78 |
| - error stop 'h5fortran:read: integer disk dataset ' // dname // ' needs integer memory variable' |
| 64 | + error stop 'ERROR:h5fortran:read: integer disk dataset ' // dname // ' needs integer memory variable' |
79 | 65 | end select
|
80 | 66 | elseif(dclass == H5T_STRING_F) then
|
81 |
| - select type(A) |
82 |
| - type is (character(*)) |
83 |
| - call H5Dget_type_f(dset_id, type_id, ier) |
84 |
| - if(ier/=0) error stop "h5fortran:read:h5tget_type " // dname // " in " // self%filename |
85 |
| - call h5tis_variable_str_f(type_id, vstatus, ier) |
86 |
| - if(ier/=0) error stop "h5fortran:read:h5tis_variable_str " // dname // " in " // self%filename |
87 |
| - |
88 |
| - if(vstatus) then |
89 |
| - call H5Dget_space_f(dset_id, space_id, ier) |
90 |
| - if(ier/=0) error stop "h5fortran:read:h5dget_space " // dname // " in " // self%filename |
91 |
| - !call h5dvlen_get_max_len_f(dset_id, type_id, space_id, dsize, ier) |
92 |
| - !if(ier/=0) error stop "h5fortran:read:h5dvlen_get_max_len " // dname // " in " // self%filename |
93 |
| - |
94 |
| - block |
95 |
| - character(10000) :: buf_char(1) |
96 |
| - !! TODO: dynamically determine buffer size |
97 |
| - integer(HSIZE_T) :: vldims(2) |
98 |
| - integer(SIZE_T) :: vlen(1) |
99 |
| - |
100 |
| - vldims = [len(buf_char), 1] |
101 |
| - |
102 |
| - call h5dread_vl_f(dset_id, type_id, buf_char, vldims, vlen, hdferr=ier, mem_space_id=space_id) |
103 |
| - if(ier/=0) error stop "h5fortran:read:h5dread_vl " // dname // " in " // self%filename |
104 |
| - |
105 |
| - i = index(buf_char(1), c_null_char) - 1 |
106 |
| - if (i == -1) i = len_trim(buf_char(1)) |
107 |
| - |
108 |
| - A = buf_char(1)(:i) |
109 |
| - |
110 |
| - ! call h5dvlen_reclaim_f(type_id, H5S_ALL_F, H5P_DEFAULT_F, buf_char, ier) |
111 |
| - end block |
112 |
| - |
113 |
| - call h5sclose_f(space_id, ier) |
114 |
| - if(ier/=0) error stop "h5fortran:read:h5sclose " // dname // " in " // self%filename |
115 |
| - else |
116 |
| - call H5Tget_strpad_f(type_id, pad_type, ier) |
117 |
| - if(ier/=0) error stop "h5fortran:read:h5tget_strpad " // dname // " in " // self%filename |
118 |
| - |
119 |
| - call H5Tget_size_f(type_id, dsize, ier) !< only for non-variable |
120 |
| - if(ier/=0) error stop "h5fortran:read:h5tget_size " // dname // " in " // self%filename |
121 |
| - |
122 |
| - if(dsize > len(A)) then |
123 |
| - write(stderr,'(a,i0,a3,i0,1x,a)') "h5fortran:read:string: buffer too small: ", dsize, " > ", len(A), & |
124 |
| - dname // " in " // self%filename |
125 |
| - error stop |
126 |
| - endif |
127 |
| - |
128 |
| - block |
129 |
| - character(dsize) :: buf_char |
130 |
| - |
131 |
| - call h5ltread_dataset_string_f(self%file_id, dname, buf_char, ier) |
132 |
| - if(ier/=0) error stop "h5fortran:read:h5l5read_dataset_string " // dname // " in " // self%filename |
133 |
| - |
134 |
| - i = index(buf_char, c_null_char) - 1 |
135 |
| - if (i == -1) i = len_trim(buf_char) |
136 |
| - |
137 |
| - A = buf_char(:i) |
138 |
| - end block |
139 |
| - endif |
140 |
| - |
141 |
| - call h5tclose_f(type_id, ier) |
142 |
| - if(ier/=0) error stop "h5fortran:read:h5tclose " // dname // " in " // self%filename |
143 |
| - |
144 |
| - class default |
145 |
| - error stop "h5fortran:read: character disk dataset " // dname // " needs character memory variable" |
146 |
| - end select |
| 67 | + call read_scalar_char(A, dset_id, file_space_id, mem_space_id, dims) |
147 | 68 | else
|
148 | 69 | error stop 'ERROR:h5fortran:reader: non-handled datatype--please reach out to developers.'
|
149 | 70 | end if
|
150 | 71 | if(ier/=0) error stop 'ERROR:h5fortran:reader: reading ' // dname // ' from ' // self%filename
|
151 | 72 |
|
152 |
| -call h5dclose_f(dset_id, ier) |
153 |
| -if(ier /= 0) error stop "ERROR:h5fortran:reader: closing dataset: " // dname // " in " // self%filename |
| 73 | +call H5Dclose_f(dset_id, ier) |
| 74 | +if(ier /= 0) error stop "ERROR:h5fortran:read_scalar: closing dataset: " // dname // " in " // self%filename |
154 | 75 |
|
155 |
| -if(self%use_mpi) call h5pclose_f(xfer_id, ier) |
| 76 | +if(self%use_mpi) call H5Pclose_f(xfer_id, ier) |
156 | 77 | if(ier /= 0) error stop "ERROR:h5fortran:writer closing property: " // dname // " in " // self%filename
|
157 | 78 |
|
| 79 | +if(mem_space_id /= H5S_ALL_F) call H5Sclose_f(mem_space_id, ier) |
| 80 | +if(ier /= 0) error stop "ERROR:h5fortran:read_scalar closing memory dataspace: " // dname // " in " // self%filename |
| 81 | + |
| 82 | +if(file_space_id /= H5S_ALL_F) call H5Sclose_f(file_space_id, ier) |
| 83 | +if(ier /= 0) error stop "ERROR:h5fortran:read_scalar closing file dataspace: " // dname // " in " // self%filename |
| 84 | + |
158 | 85 | end procedure h5read_scalar
|
159 | 86 |
|
160 | 87 | end submodule read_scalar
|
0 commit comments