从 Fortran 中的 HDF5 文件读取浮点数数组
Reading array of floats from HDF5 file in Fortran
我可以使用 h5py 在 Python 中创建一个 HDF5 文件,例如
import numpy as np
import h5py
outfile = np.zeros((5,2))
for i in range(5):
outfile[i] = i
print(outfile)
print(outfile.dtype)
f = h5py.File('TF.hdf5', 'w')
dset = f.create_dataset('FT', data = outfile, dtype = 'd')
这将打印数据,验证数据类型为 float64
,然后将数据保存到 HDF5 文件,使数据类型明确。
然后我可以用 Fortran 读取这个 HDF5 文件,
PROGRAM HDF_READER
USE HDF5
USE HDF5 ! This module contains all necessary modules
IMPLICIT NONE
CHARACTER(LEN=8), PARAMETER :: filename = "TF.hdf5" ! File name
CHARACTER(LEN=4), PARAMETER :: dsetname = "FT" ! Dataset name
INTEGER(HID_T) :: file_id ! File identifier
INTEGER(HID_T) :: dset_id ! Dataset identifier
INTEGER(HID_T) :: space_id ! Dataspace identifier
INTEGER(HID_T) :: dtype_id ! Dataspace identifier
INTEGER :: error ! Error flag
INTEGER :: i, j, cols, rows
REAL(KIND = 8), DIMENSION(:,:), ALLOCATABLE :: dset_data
INTEGER(HSIZE_T), DIMENSION(2) :: data_dims
INTEGER(HSIZE_T), DIMENSION(2) :: max_dims
print *, 'Starting HDF5 Fortran Read'
! Initialize FORTRAN interface.
CALL h5open_f(error)
! Open an existing file.
CALL h5fopen_f (filename, H5F_ACC_RDWR_F, file_id, error)
! Open an existing dataset.
CALL h5dopen_f(file_id, dsetname, dset_id, error)
!Get dataspace ID
CALL h5dget_space_f(dset_id, space_id,error)
!Get dataspace dims
CALL h5sget_simple_extent_dims_f(space_id,data_dims, max_dims, error)
cols = data_dims(1)
rows = data_dims(2)
!Allocate dimensions to dset_data for reading
ALLOCATE(dset_data(cols, rows))
!Get data
CALL h5dread_f(dset_id, H5T_NATIVE_INTEGER, dset_data, data_dims, error)
print *, dset_data
CALL h5close_f(error)
END PROGRAM HDF_READER
但是,这会打印出一堆极端数字,表明数据未从 HDF5 文件中正确读取。
但是 如果我将 dset_data
数组设置为整数类型,即 INTEGER, DIMENSION(:,:), ALLOCATABLE :: dset_data
那么就没有问题,整数打印正确.
关于如何使它适用于双精度浮点数的任何想法?
谢谢
在 HDF5 中,数据以给定的数据类型存储。读取数据时,您还明确指定了 "in-memory" 数据类型。 HDF5 将处理 inside 文件的文件格式,并将其(如果需要)即时转换为您指定的 "in-memory" 数据类型。 Fortran 中的 HDF5 基于 C 库,最终需要知道这些信息。
因此,您必须指定数组的数据类型,而不是 H5T_NATIVE_INTEGER
。在这里,real(kind=8)
可能是 H5T_NATIVE_DOUBLE
但你也可以声明你的数组 double precision
我会说。
您看到正确的整数数据,因为您在文件中存储了圆形浮点数。否则结果将在读取时四舍五入。
我可以使用 h5py 在 Python 中创建一个 HDF5 文件,例如
import numpy as np
import h5py
outfile = np.zeros((5,2))
for i in range(5):
outfile[i] = i
print(outfile)
print(outfile.dtype)
f = h5py.File('TF.hdf5', 'w')
dset = f.create_dataset('FT', data = outfile, dtype = 'd')
这将打印数据,验证数据类型为 float64
,然后将数据保存到 HDF5 文件,使数据类型明确。
然后我可以用 Fortran 读取这个 HDF5 文件,
PROGRAM HDF_READER
USE HDF5
USE HDF5 ! This module contains all necessary modules
IMPLICIT NONE
CHARACTER(LEN=8), PARAMETER :: filename = "TF.hdf5" ! File name
CHARACTER(LEN=4), PARAMETER :: dsetname = "FT" ! Dataset name
INTEGER(HID_T) :: file_id ! File identifier
INTEGER(HID_T) :: dset_id ! Dataset identifier
INTEGER(HID_T) :: space_id ! Dataspace identifier
INTEGER(HID_T) :: dtype_id ! Dataspace identifier
INTEGER :: error ! Error flag
INTEGER :: i, j, cols, rows
REAL(KIND = 8), DIMENSION(:,:), ALLOCATABLE :: dset_data
INTEGER(HSIZE_T), DIMENSION(2) :: data_dims
INTEGER(HSIZE_T), DIMENSION(2) :: max_dims
print *, 'Starting HDF5 Fortran Read'
! Initialize FORTRAN interface.
CALL h5open_f(error)
! Open an existing file.
CALL h5fopen_f (filename, H5F_ACC_RDWR_F, file_id, error)
! Open an existing dataset.
CALL h5dopen_f(file_id, dsetname, dset_id, error)
!Get dataspace ID
CALL h5dget_space_f(dset_id, space_id,error)
!Get dataspace dims
CALL h5sget_simple_extent_dims_f(space_id,data_dims, max_dims, error)
cols = data_dims(1)
rows = data_dims(2)
!Allocate dimensions to dset_data for reading
ALLOCATE(dset_data(cols, rows))
!Get data
CALL h5dread_f(dset_id, H5T_NATIVE_INTEGER, dset_data, data_dims, error)
print *, dset_data
CALL h5close_f(error)
END PROGRAM HDF_READER
但是,这会打印出一堆极端数字,表明数据未从 HDF5 文件中正确读取。
但是 如果我将 dset_data
数组设置为整数类型,即 INTEGER, DIMENSION(:,:), ALLOCATABLE :: dset_data
那么就没有问题,整数打印正确.
关于如何使它适用于双精度浮点数的任何想法?
谢谢
在 HDF5 中,数据以给定的数据类型存储。读取数据时,您还明确指定了 "in-memory" 数据类型。 HDF5 将处理 inside 文件的文件格式,并将其(如果需要)即时转换为您指定的 "in-memory" 数据类型。 Fortran 中的 HDF5 基于 C 库,最终需要知道这些信息。
因此,您必须指定数组的数据类型,而不是 H5T_NATIVE_INTEGER
。在这里,real(kind=8)
可能是 H5T_NATIVE_DOUBLE
但你也可以声明你的数组 double precision
我会说。
您看到正确的整数数据,因为您在文件中存储了圆形浮点数。否则结果将在读取时四舍五入。