gpt4 book ai didi

fortran - HDF5 用于使用 Fortran 编写的数据文件

转载 作者:行者123 更新时间:2023-12-02 10:43:47 34 4
gpt4 key购买 nike

HDF5 数据存储使用 C 约定,即如果我在二进制文件中存储矩阵 A(N,M,K),则存储数据的最快变化维度的大小将为 N。显然,当我使用HDF5的Fortran封装,HDF5自动转置矩阵,与C一致。

我有一个大小为(256 x 128 x 256)的数据存储在由 fortran 编写的未格式化的二进制文件中。我正在尝试使用下面给出的程序将其转换为 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 ) }
}
}
}

如果您看到同样的情况,请与我确认。

最佳答案

我在查看用 Fortran 应用程序编写的 HDF5 文件时也遇到了麻烦。基本问题是 Fortran 和 C 以不同的方式存储多维数组(Fortran 是列优先,C 是行优先),并且由于 Fortran HDF5 库是 C HDF5 库的接口(interface),因此 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

关于fortran - HDF5 用于使用 Fortran 编写的数据文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15333740/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com