5

HDF5 データ ストレージは C 規則を使用します。つまり、行列 A(N,M,K) をバイナリ ファイルに格納する場合、格納されたデータの最も速く変化する次元のサイズは N になります。 HDF5、HDF5 は C と一致するように行列を自動的に転置します。

Fortran で作成されたフォーマットされていないバイナリ ファイルにサイズ (256 x 128 x 256) のデータが格納されています。以下のプログラムを使用して、h5形式に変換しようとしています。しかし、最終的な出力は、格納された行列の次元を (128,256,256) として示しています。最終的な hd5 ファイルが視覚化ソフトウェア (Paraview) で正しく視覚化できるようにするために何をすべきかわかりません。

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

Ian Bush のプログラムをコピーして貼り付け、nx、ny、nz の値をそれぞれ 32、32、64 に変更しました。生成された h5 ファイルの寸法は (32,32,64) であると予想されます。しかし、それは (64,32,32) になりつつあります。これが私のマシンで起こっていることです:

[pradeep@laptop]$gfortran generate_data.f90 
[pradeep@laptop]$./a.out 
[pradeep@laptop]$ls -l data.dat 
-rw-r--r--  1 pradeep  staff  524288 Mar 12 14:04 data.dat
[pradeep@laptop]$h5fc convert_to_h5.f90 
[pradeep@laptop]$./a.out 
[pradeep@laptop]$ls -l out.h5 
-rw-r--r--  1 pradeep  staff  526432 Mar 12 14:05 out.h5
[pradeep@laptop]$h5dump -H out.h5 
HDF5 "out.h5" {
GROUP "/" {
   DATASET "data" {
      DATATYPE  H5T_IEEE_F64LE
      DATASPACE  SIMPLE { ( 64, 32, 32 ) / ( 64, 32, 32 ) }
   }
}
}

同じものが表示されている場合は、確認してください。

4

3 に答える 3

6

また、Fortran アプリケーションで作成した HDF5 ファイルを表示するときに問題が発生しました。基本的な問題は、Fortran と C では多次元配列の格納方法が異なること (Fortran は列優先、C は行優先) であり、Fortran HDF5 ライブラリは C HDF5 ライブラリへのインターフェイスであるため、Fortran ラッパーはデータを渡す前に次元を転置します。 Cコードに。同様に、Fortran アプリケーションが HDF5 ファイルを読み取る場合、Fortran ラッパーは次元を再度転置します。

したがって、Fortran アプリケーションを使用してすべての書き込みと読み取りを行う場合、不一致に気付くことはありません。Fortran アプリでファイルを書き込んでから C アプリ (h5dump など) で読み取ると、次元が転置されて表示されます。これはバグではありません。

データを正しく表示したい場合は、Fortran アプリケーションでデータを読み取るか、C アプリケーションを使用して最初にデータを転置します。(または、最初に書き込む前にデータを転置することもできます。)

すでに述べたように、これはすべてドキュメントのセクション 7.3.2.5 でかなりよく説明されています: http://www.hdfgroup.org/HDF5/doc/UG/UG_frame12Dataspaces.html

于 2013-07-17T18:05:25.873 に答える
0

答えではなく本当に長いコメント...

機能していないと思う理由を明確にできますか? コードのいくつかを修正したら

1) in_file_id が 2 つの異なる種類で 2 回宣言されている

2) 直接アクセス ファイルの Recl は、必ずしもバイト単位ではありません。出力リストによる照会は、はるかに移植性が高くなります。

ランダムデータでダミーファイルを生成すると、次のようになります。

ian@ian-pc:~/test/stack$ cat hdf5.f90
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(HID_T) :: 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 :: recl

 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))

 Inquire( iolength =  recl ) buff_r

 ! Read the input data.
 open (in_file_id,FILE=in_file,form='unformatted',access='direct',recl=recl)  
 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
ian@ian-pc:~/test/stack$ h5fc hdf5.f90
ian@ian-pc:~/test/stack$ ./a.out
ian@ian-pc:~/test/stack$ ls -l out.h5 
-rw-rw-r-- 1 ian ian 33556576 Mar 11 10:29 out.h5
ian@ian-pc:~/test/stack$ ncdump out.h5 | head
netcdf out {
dimensions:
    phony_dim_0 = 256 ;
    phony_dim_1 = 128 ;
variables:
    float vort(phony_dim_0, phony_dim_1, phony_dim_0) ;
data:

 vort =
  0.9975595, 0.5668247, 0.9659153, 0.7479277, 0.3673909, 0.4806369, 
ian@ian-pc:~/test/stack$ 

では、なぜ問題があると思いますか?

于 2013-03-11T10:37:15.237 に答える