6
6
h5pget_layout_f, h5pget_chunk_f, h5pclose_f, h5pget_nfilters_f, h5pget_filter_f, &
7
7
h5dget_type_f, h5dopen_f, h5dclose_f, &
8
8
h5lexists_f, &
9
- h5tclose_f, h5tget_native_type_f, h5tget_class_f, H5Tget_order_f, h5tget_size_f, &
9
+ h5tclose_f, h5tget_native_type_f, h5tget_class_f, H5Tget_order_f, h5tget_size_f, h5tget_strpad_f, &
10
10
h5z_filter_deflate_f, &
11
11
H5T_DIR_ASCEND_F
12
12
35
35
36
36
37
37
module procedure get_class
38
-
39
38
call get_dset_class(self, dname, get_class)
40
-
41
39
end procedure get_class
42
40
43
41
42
+ module procedure get_strpad
43
+ ! ! H5T_STR_NULLTERM Null terminate (as C does).
44
+ ! ! H5T_STR_NULLPAD Pad with zeros.
45
+ ! ! H5T_STR_SPACEPAD Pad with spaces (as FORTRAN does).
46
+
47
+ integer :: class
48
+
49
+ call get_dset_class(self, dset_name, class, pad_type= get_strpad)
50
+
51
+ end procedure get_strpad
52
+
53
+
44
54
module procedure get_deflate
45
55
! ! h5pget_filter_f doesn't work collectively, will crash on h5fclose_f
46
56
! ! if(mpi_id==0) with mpi_bcast does not work, same crash.
61
71
62
72
Naux = size (Aux, kind= SIZE_T)
63
73
74
+ if (.not. self% exist (dname)) error stop " ERROR:h5fortran:get_deflate: " // dname // " does not exist: " // self% filename
64
75
call h5dopen_f(self% file_id, dname, dset_id, ierr)
65
76
if (ierr/= 0 ) error stop " ERROR:h5fortran:get_deflate:h5dopen: " // dname // " in " // self% filename
66
77
99
110
end procedure get_deflate
100
111
101
112
102
- subroutine get_dset_class (self , dname , class , ds_id , size_bytes )
113
+ subroutine get_dset_class (self , dname , class , ds_id , size_bytes , pad_type )
103
114
! ! get the dataset class (integer, float, string, ...)
104
115
! ! {H5T_INTEGER_F, H5T_FLOAT_F, H5T_STRING_F}
105
116
class(hdf5_file), intent (in ) :: self
106
117
character (* ), intent (in ) :: dname
107
118
integer , intent (out ) :: class
108
- integer (hid_t), intent (in ), optional :: ds_id
109
- integer (size_t), intent (out ), optional :: size_bytes
119
+ integer (HID_T), intent (in ), optional :: ds_id
120
+ integer (SIZE_T), intent (out ), optional :: size_bytes
121
+ integer , intent (out ), optional :: pad_type
110
122
111
123
integer :: ierr
112
- integer (hid_t ) :: dtype_id, native_dtype_id, dset_id
124
+ integer (HID_T ) :: dtype_id, native_dtype_id, dset_id
113
125
114
126
if (present (ds_id)) then
115
127
dset_id = ds_id
116
128
else
129
+ if (.not. self% exist (dname)) error stop " ERROR:h5fortran:get_dset_class: " // dname // " does not exist: " // self% filename
130
+
117
131
call h5dopen_f(self% file_id, dname, dset_id, ierr)
118
132
if (ierr/= 0 ) error stop ' ERROR:h5fortran:get_class: ' // dname // ' from ' // self% filename
119
133
endif
120
134
121
135
call h5dget_type_f(dset_id, dtype_id, ierr)
122
136
if (ierr/= 0 ) error stop ' ERROR:h5fortran:get_class: dtype_id ' // dname // ' from ' // self% filename
123
137
124
- if (.not. present (ds_id)) then
125
- call h5dclose_f(dset_id, ierr)
126
- if (ierr/= 0 ) error stop ' ERROR:h5fortran:get_class: close dataset ' // dname // ' from ' // self% filename
127
- endif
128
-
129
138
call h5tget_native_type_f(dtype_id, H5T_DIR_ASCEND_F, native_dtype_id, ierr)
130
139
if (ierr/= 0 ) error stop ' ERROR:h5fortran:get_class: native_dtype_id ' // dname // ' from ' // self% filename
131
140
132
- call h5tclose_f(dtype_id, ierr)
133
- if (ierr/= 0 ) error stop ' ERROR:h5fortran:get_class: closing dtype ' // dname // ' from ' // self% filename
134
-
135
-
136
141
! > compose datatype inferred
137
142
call h5tget_class_f(native_dtype_id, class, ierr)
138
143
if (ierr/= 0 ) error stop ' ERROR:h5fortran:get_class: class ' // dname // ' from ' // self% filename
@@ -142,9 +147,25 @@ subroutine get_dset_class(self, dname, class, ds_id, size_bytes)
142
147
if (ierr/= 0 ) error stop ' ERROR:h5fortran:get_class: byte size ' // dname // ' from ' // self% filename
143
148
endif
144
149
150
+ if (present (pad_type)) then
151
+ if (class /= H5T_STRING_F) error stop " ERROR:h5fortran:get_class: pad_type only for string"
152
+
153
+ call H5Tget_strpad_f(dtype_id, pad_type, ierr)
154
+ if (ierr /= 0 ) error stop " h5fortran:read:h5tget_strpad " // dname // " in " // self% filename
155
+ endif
156
+
157
+ ! > close to avoid memory leaks
145
158
call h5tclose_f(native_dtype_id, ierr)
146
159
if (ierr/= 0 ) error stop ' ERROR:h5fortran:get_class: closing native dtype ' // dname // ' from ' // self% filename
147
160
161
+ call h5tclose_f(dtype_id, ierr)
162
+ if (ierr/= 0 ) error stop ' ERROR:h5fortran:get_class: closing dtype ' // dname // ' from ' // self% filename
163
+
164
+ if (.not. present (ds_id)) then
165
+ call h5dclose_f(dset_id, ierr)
166
+ if (ierr/= 0 ) error stop ' ERROR:h5fortran:get_class: close dataset ' // dname // ' from ' // self% filename
167
+ endif
168
+
148
169
end subroutine get_dset_class
149
170
150
171
@@ -209,7 +230,6 @@ end subroutine get_dset_class
209
230
210
231
211
232
module procedure hdf_get_shape
212
-
213
233
! ! must get rank before info, as "dims" must be allocated first.
214
234
integer (SIZE_T) :: type_size
215
235
integer :: type_class, drank, ier
0 commit comments