HDF5數據存儲使用C約定,即如果我在二進制文件中存儲矩陣A(N,M,K),則存儲數據的最快變化維度將具有大小N.顯然,當我使用HDF5的Fortran包裝時,HDF5會自動轉換矩陣,以便與C一致。我有一個存儲在由fortran編寫的未格式化二進制文件中的大小數據(256 x 128 x 256) 。我試圖通過使用下面給出的程序將其轉換成h5格式。但最終的輸出結果是將存儲矩陣的維數作爲(128,256,256)。我不知道該怎麼做才能確保最終的hd5文件可以在可視化軟件(Paraview)中正確顯示。HDF5用於用fortran編寫的數據文件
PROGRAM H5_RDWT
USE HDF5 ! This module contains all necessary modules
IMPLICIT NONE
CHARACTER(LEN=6), parameter :: out_file = "out.h5" ! File name
CHARACTER(LEN=6), parameter :: in_file = "in.dat" ! File name
CHARACTER(LEN=4), parameter :: dsetname = "vort"! Dataset name
CHARACTER(LEN=50) :: len
INTEGER(HID_T) :: in_file_id ! File identifier
INTEGER(HID_T) :: out_file_id ! File identifier
INTEGER(HID_T) :: dset_id ! Dataset identifier
INTEGER(HID_T) :: dspace_id ! Dataspace identifier
INTEGER :: in_file_id = 23
INTEGER :: nx = 256, ny=128, nz=256
INTEGER(HSIZE_T), DIMENSION(3) :: dims ! Dataset dimensions
INTEGER :: rank = 3 ! Dataset rank
INTEGER :: error ! Error flag
INTEGER :: i, j, k, ii, jj, kk ! Indices
REAL, allocatable :: buff_r(:,:,:) ! buffer for reading from input file
dims(1) = nx
dims(2) = ny
dims(3) = nz
allocate(buff_r(nx,ny,nz))
! Read the input data.
open (in_file_id,FILE=in_file,form='unformatted',access='direct',recl=4*nx*ny*nz)
read (in_file_id,rec=1) buff_r
! Initialize FORTRAN interface of HDF5.
CALL h5open_f(error)
! Create a new file.
CALL h5fcreate_f (out_file, H5F_ACC_TRUNC_F, out_file_id, error)
! Create the dataspace.
CALL h5screate_simple_f(rank, dims, dspace_id, error)
! Create the dataset with default properties.
CALL h5dcreate_f(out_file_id, dsetname, H5T_NATIVE_REAL, dspace_id, &
dset_id, error)
! Write the dataset.
CALL h5dwrite_f(dset_id, H5T_NATIVE_REAL, buff_r, dims, error)
! End access to the dataset and release resources used by it.
CALL h5dclose_f(dset_id, error)
! Terminate access to the data space.
CALL h5sclose_f(dspace_id, error)
! Close the file.
CALL h5fclose_f(out_file_id, error)
! Close FORTRAN interface.
CALL h5close_f(error)
deallocate(buff_r)
END PROGRAM H5_RDWT
爲了說明發生了什麼,我使用下面的腳本生成一個簡單的數據文件:
program main
!-------- initialize variables -------------
character(8) :: fname
integer, parameter:: n = 32
real*8, dimension(n,n,2*n) :: re
integer i,j,k, recl
Inquire(iolength = recl) re
!------ fill in the array with sample data ----
do k = 1, 2*n
do j = 1, n
do i = 1, n
re(i,j,k) = 1.0
end do
end do
end do
!------ write in data in a file -----------
write(fname, "(A)") "data.dat"
open (10, file=fname, form='unformatted', access='direct', recl=recl)
write(10,rec=1) re
close(10)
stop
end program main
我複製伊恩·布什粘貼的程序,改變x的值, ny和nz分別爲32,32和64。我希望生成的h5文件有尺寸(32,32,64)。但它是(64,32,32)。這裏是正在發生的事情在我的機器:
[[email protected]]$gfortran generate_data.f90
[[email protected]]$./a.out
[[email protected]]$ls -l data.dat
-rw-r--r-- 1 pradeep staff 524288 Mar 12 14:04 data.dat
[[email protected]]$h5fc convert_to_h5.f90
[[email protected]]$./a.out
[[email protected]]$ls -l out.h5
-rw-r--r-- 1 pradeep staff 526432 Mar 12 14:05 out.h5
[[email protected]]$h5dump -H out.h5
HDF5 "out.h5" {
GROUP "/" {
DATASET "data" {
DATATYPE H5T_IEEE_F64LE
DATASPACE SIMPLE { (64, 32, 32)/(64, 32, 32) }
}
}
}
請與我確認,如果你看到了同樣的事情。
感謝您指出的錯誤。感謝recl評論。該程序正常工作。但它給了我一個轉置矩陣。例如,如果使用fortran我寫一個大小爲(256,128,256)的3D數組,當我檢查輸出文件的數組維數時,它是(128,256,256)。要檢查輸出H5文件的尺寸,我用「h5dump -H out.h5」 – jhaprade 2013-03-11 11:37:27
這是從我一個人的HDF5支持組聯繫了迴應:http://www.hdfgroup.org/HDF5/doc/ UG/UG_frame12Dataspaces.html,部分:7.3.2.5。 C與Fortran數據空間。但我不知道如何正確地實現它讀取fortran二進制文件並重寫它在h5格式 – jhaprade 2013-03-11 11:41:23
好的,我完全困惑。我輸出的h5dump -H out.h5給出了DATASPACE SIMPLE {(256,128,256)/(256,128,256)},類似於我的「答案」中的ncdump報告。我看不出你是怎麼得到的(128,256,256)! – 2013-03-11 12:02:02