|
3 | 3 | use hdf5, only : h5dget_create_plist_f, & |
4 | 4 | h5pget_layout_f, h5pget_chunk_f, & |
5 | 5 | h5dget_type_f, h5tget_native_type_f, h5tget_class_f, H5Tget_order_f, h5tclose_f, h5tget_size_f, & |
6 | | - H5T_DIR_ASCEND_F, H5T_INTEGER_F, H5T_FLOAT_F, H5T_STRING_F |
| 6 | + H5T_DIR_ASCEND_F |
7 | 7 |
|
8 | 8 | use H5LT, only : h5ltpath_valid_f |
9 | 9 |
|
|
12 | 12 | contains |
13 | 13 |
|
14 | 14 |
|
15 | | -module procedure get_native_dtype |
16 | | -!! get the dataset variable type: |
17 | | -!! {H5T_NATIVE_REAL, H5T_NATIVE_DOUBLE, H5T_NATIVE_INTEGER, H5T_NATIVE_CHARACTER, H5T_STD_I64LE} |
| 15 | +module procedure get_class |
| 16 | + |
| 17 | +call get_dset_class(self, dname, get_class) |
| 18 | + |
| 19 | +end procedure get_class |
| 20 | + |
| 21 | + |
| 22 | +subroutine get_dset_class(self, dname, class, ds_id, size_bytes) |
| 23 | +!! get the dataset class (integer, float, string, ...) |
| 24 | +!! {H5T_INTEGER_F, H5T_FLOAT_F, H5T_STRING_F} |
| 25 | +class(hdf5_file), intent(in) :: self |
| 26 | +character(*), intent(in) :: dname |
| 27 | +integer, intent(out) :: class |
| 28 | +integer(hid_t), intent(in), optional :: ds_id |
| 29 | +integer(size_t), intent(out), optional :: size_bytes |
18 | 30 |
|
19 | | -integer(hid_t) :: dtype_id, native_dtype_id, dset_id |
20 | | -integer :: class |
21 | 31 | integer :: ierr |
22 | | -! integer :: order, machine_order |
23 | | -integer(size_t) :: size_bytes |
| 32 | +integer(hid_t) :: dtype_id, native_dtype_id, dset_id |
24 | 33 |
|
25 | 34 | if(present(ds_id)) then |
26 | 35 | dset_id = ds_id |
27 | 36 | else |
28 | 37 | call h5dopen_f(self%lid, dname, dset_id, ierr) |
29 | | - if(ierr/=0) error stop 'h5fortran:get_native_dtype: ' // dname // ' from ' // self%filename |
| 38 | + if(ierr/=0) error stop 'h5fortran:get_class: ' // dname // ' from ' // self%filename |
30 | 39 | endif |
31 | 40 |
|
32 | 41 | call h5dget_type_f(dset_id, dtype_id, ierr) |
33 | | -if(ierr/=0) error stop 'h5fortran:get_native_dtype: dtype_id ' // dname // ' from ' // self%filename |
| 42 | +if(ierr/=0) error stop 'h5fortran:get_class: dtype_id ' // dname // ' from ' // self%filename |
34 | 43 |
|
35 | 44 | call h5tget_native_type_f(dtype_id, H5T_DIR_ASCEND_F, native_dtype_id, ierr) |
36 | | -if(ierr/=0) error stop 'h5fortran:get_native_dtype: native_dtype_id ' // dname // ' from ' // self%filename |
37 | | - |
38 | | -!> endianness and within type casting is handled by HDF5 |
39 | | -! call h5tget_order_f(native_dtype_id, order, ierr) |
40 | | -! if(ierr/=0) error stop 'h5fortran:reader: get endianness ' // dname // ' from ' // self%filename |
41 | | -! !> check dataset endianness matches machine (in future, could swap endianness if needed) |
42 | | -! call h5tget_order_f(H5T_NATIVE_INTEGER, machine_order, ierr) |
43 | | -! if(order /= machine_order) error stop 'h5fortran:read: endianness /= machine native: ' & |
44 | | -! // dname // ' from ' // self%filename |
| 45 | +if(ierr/=0) error stop 'h5fortran:get_class: native_dtype_id ' // dname // ' from ' // self%filename |
45 | 46 |
|
46 | 47 | !> compose datatype inferred |
47 | 48 | call h5tget_class_f(native_dtype_id, class, ierr) |
48 | | -if(ierr/=0) error stop 'h5fortran:get_native_dtype: class ' // dname // ' from ' // self%filename |
| 49 | +if(ierr/=0) error stop 'h5fortran:get_class: class ' // dname // ' from ' // self%filename |
49 | 50 |
|
50 | | -call h5tget_size_f(native_dtype_id, size_bytes, ierr) |
51 | | -if(ierr/=0) error stop 'h5fortran:get_native_dtype: byte size ' // dname // ' from ' // self%filename |
| 51 | +if(present(size_bytes)) then |
| 52 | + call h5tget_size_f(native_dtype_id, size_bytes, ierr) |
| 53 | + if(ierr/=0) error stop 'h5fortran:get_class: byte size ' // dname // ' from ' // self%filename |
| 54 | +endif |
52 | 55 |
|
53 | 56 | !> close to avoid memory leaks |
54 | | -call h5tclose_f(dtype_id, ierr) |
55 | | -if(ierr/=0) error stop 'h5fortran:get_native_dtype: closing dtype ' // dname // ' from ' // self%filename |
56 | 57 | call h5tclose_f(native_dtype_id, ierr) |
57 | | -if(ierr/=0) error stop 'h5fortran:get_native_dtype: closing native dtype ' // dname // ' from ' // self%filename |
| 58 | +if(ierr/=0) error stop 'h5fortran:get_class: closing native dtype ' // dname // ' from ' // self%filename |
| 59 | + |
| 60 | +call h5tclose_f(dtype_id, ierr) |
| 61 | +if(ierr/=0) error stop 'h5fortran:get_class: closing dtype ' // dname // ' from ' // self%filename |
| 62 | + |
58 | 63 | if(.not.present(ds_id)) then |
59 | 64 | call h5dclose_f(dset_id, ierr) |
60 | | - if(ierr/=0) error stop 'h5fortran:get_native_dtype: close dataset ' // dname // ' from ' // self%filename |
| 65 | + if(ierr/=0) error stop 'h5fortran:get_class: close dataset ' // dname // ' from ' // self%filename |
61 | 66 | endif |
62 | 67 |
|
| 68 | +end subroutine get_dset_class |
| 69 | + |
| 70 | + |
| 71 | +module procedure get_native_dtype |
| 72 | +!! get the dataset variable type: |
| 73 | +!! {H5T_NATIVE_REAL, H5T_NATIVE_DOUBLE, H5T_NATIVE_INTEGER, H5T_NATIVE_CHARACTER, H5T_STD_I64LE} |
| 74 | + |
| 75 | +integer :: class |
| 76 | +! integer :: order, machine_order |
| 77 | +integer(size_t) :: size_bytes |
| 78 | + |
| 79 | +call get_dset_class(self, dname, class, ds_id, size_bytes) |
| 80 | + |
| 81 | +!> endianness and within type casting is handled by HDF5 |
| 82 | +! call h5tget_order_f(native_dtype_id, order, ierr) |
| 83 | +! if(ierr/=0) error stop 'h5fortran:reader: get endianness ' // dname // ' from ' // self%filename |
| 84 | +! !> check dataset endianness matches machine (in future, could swap endianness if needed) |
| 85 | +! call h5tget_order_f(H5T_NATIVE_INTEGER, machine_order, ierr) |
| 86 | +! if(order /= machine_order) error stop 'h5fortran:read: endianness /= machine native: ' & |
| 87 | +! // dname // ' from ' // self%filename |
63 | 88 |
|
64 | 89 | if(class == H5T_INTEGER_F) then |
65 | 90 | if(size_bytes == 4) then |
|
0 commit comments