2013-07-17 4 views
1

Fortran 응용 프로그램을 컴파일하여 HDF5 파일을 작성하려고합니다. 내 컴파일러는 gfortran 4.7.2입니다. 특히, 현재 차원과 최대 차원의 특정 집합으로 데이터 공간을 만들려고합니다. 마지막 치수에 무제한 최대 치수가 있어야합니다. Fortran HDF5에 대한 많은 문서는 없지만 문제의 치수를 H5S_UNLIMITED_F으로 설정하여 지정할 수 있음을 알 수있었습니다. 이 값은 -1로 평가되지만, 내 응용 프로그램에서는 0이 현재 오류 (해당 경우 20)보다 작기 때문에 런타임 오류를 발생시키는 대신 0으로 평가됩니다. 이 오류입니다 :Fortran HDF5의 무제한 최대 치수 매개 변수 (H5S_UNLIMITED_F)가 -1 대신 0으로 계산되는 이유는 무엇입니까?

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와 함께 제공되는 포트란 예제 중 하나를 컴파일하지만, 해당 응용 프로그램에 대한 매개 변수가 -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 매개 변수를 사용하지 않도록 메모리 데이터 공간을 변경하면 (선택 사항이고 제 경우에는 필요하지 않을 수도 있음) 두 번째 호출에서 여전히 동일한 오류가 발생합니다 ( 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) 설정을 시도했다, 그러나 그것은 완전히 다른 오류를 얻을 : 다음과 같이

나는 컴파일하고 있습니다.

답변

2

(원래 문제는 H5S_UNLIMITED_F가 초기화가 허용되지 않습니다하기 전에를 참조, H5open_f 호출에 의해 초기화되는 변수입니다 것이 었습니다.)

당신은 확실 H5S_create_simple_f에 대한 호출이 실패 무엇이라고? 추적 표시는 라이브러리의 데이터 세트 부분에서 오류가 발생했음을 나타냅니다.

가변 크기의 데이터 세트의 경우 청크 크기를 지정해야하므로 데이터 세트 생성이 실패 할 것으로 예상됩니다. H5Pcreate_f을 사용하여 등록 정보 목록을 만든 다음 H5Pset_chunk_f을 사용하여 청크 크기를 설정 한 다음 H5Dcreate_f에 대한 호출에서 오류 인수 뒤에 해당 등록 정보 목록을 제공하십시오. 그 말이 이해가되지 않는다면 논평을하고 예를 찾아 보겠습니다.

+0

내 프로그램이 속성 목록 및 청킹 호출의 유무에 관계없이 'HDF5 메모리 데이터 공간 생성 중 오류'를 출력하고 있습니다. 그 출력은 첫 번째'h5s_create_simple_f'가 실패했음을 나타냅니다. 중요한 요소는'h5s_unlimited_f'가'print' 문이 확인하는 (문서에서 명시한 -1 대신) 0으로 평가된다는 것입니다. – patrickvacek

+0

라이브러리를 초기화하기 위해 H5open_f()를 호출하면 먼저 h5s_unlimited_f 변수를 참조해야합니다. 초기화되지 않았습니다. – IanH

+0

정말 확실합니다! 다시 확인하십시오. :) – patrickvacek