HDF5 ファイルを書き込むために Fortran アプリケーションをコンパイルしようとしています。私のコンパイラは gfortran 4.7.2 です。具体的には、現在のディメンションと最大ディメンションの特定のセットでデータスペースを作成しようとしています。最後の次元の最大次元を無制限にしたい。Fortran HDF5 に関するドキュメントはあまりありませんが、問題の次元を に設定することでこれを指定できることがわかりましたH5S_UNLIMITED_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
同じ H5S_UNLIMITED_F パラメーター (h5_extend.f90) を使用する HDF5 に付属の Fortran の例の 1 つをコンパイルしましたが、そのアプリケーションでは、パラメーターは -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_create_simple_f
が失敗します。max_array パラメータを使用しないようにメモリ データスペースを変更した場合 (これはオプションであり、私の場合はおそらく不要であるため)、2 回目の呼び出しで同じエラーが発生しますh5s_create_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
-1 に設定max_array(irank)
してみましたが、まったく別のエラーが発生します。