Теперь у меня есть один массив размером 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
я обнаружил, что код на Фортране работает нормально, если 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
?
numpy.ndarray.tofile
всегда сохраняет данные в Порядок «C», как указано в документах. - person a_guest   schedule 17.09.2020