现在我有一个 1024 * 1024 * 1024 数组,其 dtype 是float32
. 首先,我将此数组以“.bigfile”的格式保存到一个文件中。然后我通过运行如下代码将此大文件转换为 Fortran 无格式文件。
with bigfile.File('filename.bigfile') as bf:
shape = bf['Field'].attrs['ndarray.shape']
data = bf['Field'][:].reshape(shape)
np.asfortranarray(data).tofile('filename.dat')
接下来为了测试这个二进制文件,即“filename.dat”,我分别用 Python 和 Fortran95 读取了这个文件。Python 代码运行良好,代码片段如下所示。
field = np.fromfile('filename.dat',
dtype='float32', count=1024*1024*1024)
density_field = field.reshape(1024, 1024, 1024)
但是,Fortran runtime error
当我运行 Fortran 阅读代码时发生:
Program readout00
Implicit None
Integer, Parameter :: Ng = 1024
Real, Allocatable, Dimension(:,:,:) :: dens
Integer :: istat, ix, iy, iz
! -------------------------------------------------------------------------
! Allocate the arrays for the original simulation data
! -------------------------------------------------------------------------
Allocate(dens(0:Ng-1, 0:Ng-1, 0:Ng-1), STAT=istat)
If( istat/=0 ) Stop "Wrong Allocation-1"
! -------------------------------------------------------------------------
Open(10, file="filename.dat", status="old", form="unformatted")
Read(10) dens
Close(10)
Write(*,*) "read-in finished"
! -------------------------------------------------------------------------
Do ix = 0, 1
Do iy = 0, 1
Do iz = 0, 1
Write(*,*) "ix, iy, iz, rho=", ix, iy, iz, dens(ix, iy, iz)
EndDo
EndDo
EndDo
!--------------------------------------------------------------------------
End Program readout00
错误信息:
At line 13 of file readout00.f90 (unit = 10, file = 'filename.dat')
Fortran runtime error: I/O past end of record on unformatted file
Error termination. Backtrace:
#0 0x7f7d8aff8e3a
#1 0x7f7d8aff9985
#2 0x7f7d8affa13c
#3 0x7f7d8b0c96e0
#4 0x7f7d8b0c59a6
#5 0x400d24
#6 0x400fe1
#7 0x7f7d8a4db730
#8 0x400a58
#9 0xffffffffffffffff
我不明白为什么会出现这些错误。
注意:整体操作在 LINUX 远程服务器中处理。
反复修改read
语句后,发现 Fortran 代码运行良好 if ix<=632
, iy<=632
, iz<=632
. 如果它们大于 632,runtime error
就会出现。我应该如何纠正这个错误,以便dens
可以读取所有 1024^3 元素?
Read(10) (((dens(ix, iy, iz), ix=0,632), iy=0,632), iz=0,632)
补充:
今天我acccess=stream
在open
语句中添加了一个子句,在,read(10) header
之前read(10) dens
Integer :: header
......
Open(10, file="filename.dat", status="old", &
form="unformatted", access='stream')
Read(10) header
Read(10) dens
修改后Fortran代码readout00.f95读入1024*1024*1024数组,即dens
成功。
为什么原始的“readout00.f95”无法读入dens
?