为什么Fortran HDF5';s无限最大尺寸参数(H5S_unlimited_F)计算为零而不是-1?

为什么Fortran HDF5';s无限最大尺寸参数(H5S_unlimited_F)计算为零而不是-1?,fortran,constants,dimensions,hdf5,Fortran,Constants,Dimensions,Hdf5,我正在尝试编译一个Fortran应用程序来编写HDF5文件。我的编译器是gfortran 4.7.2。具体地说,我正试图创建一个具有一组当前维度和最大维度的数据空间。我希望最后一个维度有一个无限制的最大维度。Fortran HDF5没有太多文档,但我发现可以通过将该维度设置为H5S\u UNLIMITED\u F来指定它。该值应计算为-1,但在我的应用程序中,它的计算结果为0,这会导致运行时错误,因为0小于相应的当前维度(在我的示例中为20)。这就是错误: HDF5-DIAG: Error de

我正在尝试编译一个Fortran应用程序来编写HDF5文件。我的编译器是gfortran 4.7.2。具体地说,我正试图创建一个具有一组当前维度和最大维度的数据空间。我希望最后一个维度有一个无限制的最大维度。Fortran HDF5没有太多文档,但我发现可以通过将该维度设置为
H5S\u UNLIMITED\u F
来指定它。该值应计算为-1,但在我的应用程序中,它的计算结果为0,这会导致运行时错误,因为0小于相应的当前维度(在我的示例中为20)。这就是错误:

HDF5-DIAG: Error detected in HDF5 (1.8.11) thread 0:
  #000: H5S.c line 1388 in H5Screate_simple(): maxdims is smaller than dims
    major: Invalid arguments to routine
    minor: Bad value
我编译了HDF5附带的一个Fortran示例,它使用了相同的H5S_UNLIMITED_F参数(h5_extend.f90),但对于该应用程序,该参数的计算结果为-1,没有问题

我可能做错了什么

下面是我编写的一个测试程序,用于复制项目中出现的问题:

program simple_test

use hdf5
implicit none

integer :: irank, hdferr
integer(hsize_t) :: ny, nx, nz
real, dimension(:,:,:), allocatable :: dset
character (len = 256) :: hdf_file, dlab
integer(hid_t) :: file_handle, mem_space, file_space, dset_handle
integer(hsize_t), dimension(:), allocatable :: dim_array, max_array

irank = 3
ny = 10
nx = 15
nz = 20
allocate (dset(ny, nx, nz))
hdf_file = 'simple_test.hdf5'
dlab = 'simple_data'
allocate (dim_array(irank))
allocate (max_array(irank))

dim_array = (/ ny, nx, nz /)
max_array = (/ ny, nx, H5S_UNLIMITED_F /)

print *, 'h5s_unlimited_f: ', h5s_unlimited_f
print *, 'dim_array: ', dim_array
print *, 'max_array: ', max_array

call h5open_f(hdferr)
if (hdferr .eq. -1) then
    print *, 'Error opening HDF5 Fortran interface.'
end if

! Create a new file.
call h5fcreate_f(hdf_file, H5F_ACC_TRUNC_F, file_handle, hdferr)
if (hdferr .eq. -1) then
    print *, 'Error creating HDF5 file.'
end if

! Create memory dataspace.
call h5screate_simple_f(irank, dim_array, mem_space, hdferr, max_array)
if (hdferr .eq. -1) then
    print *, 'Error creating HDF5 memory dataspace.'
end if

! Create the dataset.
call h5dcreate_f(file_handle, trim(dlab), H5T_IEEE_F32LE, mem_space, &
        dset_handle, hdferr)
if (hdferr .eq. -1) then
    print *, 'Error creating HDF5 dataset.'
end if

! Create file dataspace.
call h5screate_simple_f(irank, dim_array, file_space, hdferr, max_array)
if (hdferr .eq. -1) then
    print *, 'Error creating HDF5 file dataspace.'
end if

call h5dwrite_f(dset_handle, H5T_IEEE_F32LE, dset, dim_array, hdferr, &
        mem_space, file_space)
if (hdferr .eq. -1) then
    print *, 'Error writing HDF5 dataset.'
end if

call h5close_f(hdferr)
if (hdferr .eq. -1) then
    print *, 'Error closing HDF5 Fortran interface.'
end if

deallocate (dset)
deallocate (dim_array)
deallocate (max_array)

end program simple_test
第一次调用
h5s\u create\u simple\u f
失败。如果我将内存数据空间更改为不使用max_数组参数(因为它是可选的,在我的情况下可能是不必要的),那么在第二次调用
h5s\u create\u simple\f
时仍然会出现相同的错误

我的汇编如下:

gfortran -c simple_test.f90 -o simple_test.o -I<hdf5_include_path>
gfortran -o simple_test simple_test.o -L<hdf5_lib_path> -lhdf5_fortran -lhdf5hl_fortran
gfortran-c simple_test.f90-o simple_test.o-I
gfortran-o simple_test simple_test.o-L-lhdf5_fortran-lhdf5hl_fortran
我还尝试将
max\u array(irank)
设置为-1,但这会产生一个完全不同的错误。

(最初的问题是H5S\u UNLIMITED\u F是一个通过调用
H5open\u F
初始化的变量,不允许在初始化之前引用它。)

您确定调用
H5S\u create\u simple\u f
失败了吗?回溯表示库的数据集部分出现错误


我预计数据集创建会失败,因为对于可变大小的数据集,需要指定块大小。使用
H5Pcreate\u f
创建属性列表,然后使用
H5Pset\u chunk\u f
设置块大小,然后在调用
H5Dcreate\u f
的错误参数后提供该属性列表。如果这不合理,请进行注释,我会找出一个例子。

我的程序正在输出
错误,创建HDF5内存数据空间时有或没有属性列表和分块调用。该输出表明第一个
h5s\u create\u simple\u f
失败。这里的重要元素是,
h5s\u unlimited\u f
的计算值为0(而不是文档中指定的-1),
print
语句确认了这一点。在首次引用h5s\u unlimited\u f变量之后,您调用H5open\u f()初始化库。它不会被初始化的。很确定它在那里!再次检查。:)啊!!没错!如果我在
h5\u open\u f
之后引用它,它的计算结果确实正确为-1。就这样。我现在正在研究其他错误,但我不太担心这一部分。是的,你关于数据集创建的建议也是关键!这解决了其余的错误。不管怎样,我很快就要研究分块了,但是错误的
h5s\u unlimited\u f
让我分心。也谢谢你的建议。