2016-03-08 82 views
0

我想從hdf文件中讀取任意大小的第一維數組。我正在使用「讀取/寫入外部數據集」示例here,但由於我不知道數組維度,所以我需要調用一些額外的子例程。從Fortran HDF文件中讀取未知長度的數組

可以找到數據空間的維數,因爲打印出m給出了正確的值,但數據本身不能被讀取。

測試陣列我想讀的樣子:

HDF5 "test_1d.h5" { 
GROUP "/" { 
    DATASET "sample_array" { 
     DATATYPE H5T_IEEE_F64LE 
     DATASPACE SIMPLE { (5)/(5) } 
     DATA { 
     (0): 1, 4, 2, 8, 6 
     } 
    } 
} 
} 

程序:

program hdf_read_test 

use hdf5 
implicit none 

    integer          :: m,hdferror 
    character(len=1024)       :: fname,dsetname 
    double precision, dimension(:), allocatable :: X 

    integer(hid_t)        :: file_id,dset_id,dspace_id 
    integer(hsize_t), dimension(1)    :: dims,maxdims 

    ! ------------------------------------------ 

    ! Specify filename/dataset name. 
    fname = "test_1d.h5" 
    dsetname = "sample_array" 

    call h5fopen_f(fname, H5F_ACC_RDONLY_F, file_id, hdferror) 
    call h5dopen_f(file_id, dsetname, dset_id, hdferror) 

    ! --------------- 
    ! Figure out the size of the array. 

    ! Get the dataspace ID 
    call h5dget_space_f(dset_id,dspace_id,hdferror) 

    ! Getting dims from dataspace 
    call h5sget_simple_extent_dims_f(dspace_id, dims, maxdims, hdferror) 

    ! Allocate memory for the array. 
    m = dims(1) 
    allocate(X(m)) 

    ! ---------------- 
    ! Read the array. 
    call h5dread_f(dset_id, H5T_IEEE_F64LE, X, dims, hdferror, H5S_ALL_F, dspace_id) 

    ! Check the values. 
    write(*,*) 
    write(*,*) "Array size: ",m 
    write(*,*) "Array elements: ",X 
    write(*,*) 

    ! ----------------- 
    ! Clean up. 
    deallocate(X) 

    call h5sclose_f(dspace_id, hdferror) 
    call h5dclose_f(dset_id, hdferror) 
    call h5fclose_f(file_id, hdferror) 
    call h5close_f(hdferror) 

end program hdf_read_test 

通過

h5fc -o hdf_read_test hdf_read_test.f90 

編譯生成的輸出:

HDF5-DIAG: Error detected in HDF5 (1.8.11) thread 140545957812032: 
    #000: ../../../src/H5Dio.c line 182 in H5Dread(): can't read data 
    major: Dataset 
    minor: Read failed 
    #001: ../../../src/H5Dio.c line 438 in H5D__read(): unable to set up type info 
    major: Dataset 
    minor: Unable to initialize object 
    #002: ../../../src/H5Dio.c line 914 in H5D__typeinfo_init(): not a datatype 
    major: Invalid arguments to routine 
    minor: Inappropriate type 
HDF5-DIAG: Error detected in HDF5 (1.8.11) thread 140545957812032: 
    #000: ../../../src/H5T.c line 1761 in H5Tclose(): not a datatype 
    major: Invalid arguments to routine 
    minor: Inappropriate type 

謝謝。

+0

我沒有看到調用'h5open_f'來初始化庫。 – IanH

+0

這是問題所在。我的眼睛正在玩弄技巧,結合了h5open_f和h5fopen_f。 – moo

回答

0

首先,你的錯誤是與FORTRAN API你需要電話h5open_f(hdferror)並初始化的HDF庫調用h5fopen_f之前。

旁註。

  • 我會在每次調用HDF後檢查hdferror的值。
  • 呼叫h5sget_simple_extent_dims_f()返回最後一個參數(hdferror)中的排名或失敗時的-1。
+0

就是這樣,謝謝。而且我確實檢查了這個值,我只是在這裏刪除了一個最小的例子。 – moo