11submodule(nf_io_hdf5) nf_io_hdf5_submodule
22
33  use  iso_fortran_env, only: int64, real32, stderr = > error_unit
4+   use  functional, only: reverse
45  use  h5fortran, only: hdf5_file
56  use  hdf5, only: H5F_ACC_RDONLY_F, HID_T, &
67                  h5aget_type_f, h5aopen_by_name_f, h5aread_f, &
@@ -50,7 +51,7 @@ module subroutine get_hdf5_dataset_real32_1d(filename, object_name, values)
5051
5152    character (* ), intent (in ) ::  filename
5253    character (* ), intent (in ) ::  object_name
53-     real (real32), allocatable , intent (in   out ) ::  values(:)
54+     real (real32), allocatable , intent (out ) ::  values(:)
5455
5556    type (hdf5_file) ::  f
5657    integer (int64), allocatable  ::  dims(:)
@@ -78,23 +79,15 @@ module subroutine get_hdf5_dataset_real32_2d(filename, object_name, values)
7879
7980    character (* ), intent (in ) ::  filename
8081    character (* ), intent (in ) ::  object_name
81-     real (real32), allocatable , intent (in   out ) ::  values(:,:)
82+     real (real32), allocatable , intent (out ) ::  values(:,:)
8283
8384    type (hdf5_file) ::  f
8485    integer (int64), allocatable  ::  dims(:)
8586
8687    call  f %  open (filename, ' r'  )
8788    call  f %  shape (object_name, dims)
8889
89-     !  If values is already allocated, re-allocate only if incorrect shape
90-     if  (allocated (values)) then 
91-       if  (.not.  all (shape (values) == dims)) then 
92-         deallocate (values)
93-         allocate (values(dims(1 ), dims(2 )))
94-       end if 
95-     else 
96-       allocate (values(dims(1 ), dims(2 )))
97-     end if 
90+     allocate (values(dims(1 ), dims(2 )))
9891
9992    call  f %  read (object_name, values)
10093    call  f %  close ()
@@ -109,43 +102,26 @@ module subroutine get_hdf5_dataset_real32_4d(filename, object_name, values)
109102
110103    character (* ), intent (in ) ::  filename
111104    character (* ), intent (in ) ::  object_name
112-     real (real32), allocatable , intent (in   out ) ::  values(:,:,:,:)
105+     real (real32), allocatable , intent (out ) ::  values(:,:,:,:)
113106
114107    type (hdf5_file) ::  f
115108    integer (int64), allocatable  ::  dims(:)
116109
117110    call  f %  open (filename, ' r'  )
118111    call  f %  shape (object_name, dims)
119112
120-     !  If values is already allocated, re-allocate only if incorrect shape
121-     if  (allocated (values)) then 
122-       if  (.not.  all (shape (values) == dims)) then 
123-         deallocate (values)
124-         allocate (values(dims(1 ), dims(2 ), dims(3 ), dims(4 )))
125-       end if 
126-     else 
127-       allocate (values(dims(1 ), dims(2 ), dims(3 ), dims(4 )))
128-     end if 
113+     allocate (values(dims(1 ), dims(2 ), dims(3 ), dims(4 )))
129114
130115    call  f %  read (object_name, values)
131116    call  f %  close ()
132117
133118    !  Transpose the array to get from C to Fortran order
134-     values =  reverse_dim_order(values)
119+     values =  reshape ( &
120+       values, &
121+       shape= [dims(4 ), dims(3 ), dims(2 ), dims(1 )], &
122+       order= [4 , 3 , 2 , 1 ] &
123+     )
135124
136125  end  subroutine  get_hdf5_dataset_real32_4d 
137126
138- 
139-   pure  function  reverse_dim_order (x ) result(res)
140-     real , intent (in ) ::  x(:,:,:,:)
141-     real , allocatable  ::  res(:,:,:,:)
142-     integer  ::  dims(4 )
143-     integer  ::  i, j, k, l
144-     dims =  shape (x)
145-     allocate (res(dims(4 ), dims(3 ), dims(2 ), dims(1 )))
146-     do  concurrent(i =  1 :dims(1 ), j =  1 :dims(2 ), k =  1 :dims(3 ), l =  1 :dims(4 ))
147-       res(l,k,j,i) =  x(i,j,k,l)
148-     end do 
149-   end  function  reverse_dim_order 
150- 
151127end submodule nf_io_hdf5_submodule
0 commit comments