|
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