У меня возникли проблемы с пониманием форматирования двоичных файлов, которые я пишу с помощью Fortran. Я использую следующую подпрограмму для записи двоичных файлов на диск:
SUBROUTINE write_field(d,m,outfile)
IMPLICIT NONE
REAL, INTENT(IN) :: d(m,m,m)
INTEGER, INTENT(IN) :: m
CHARACTER(len=256), INTENT(IN) :: outfile
OPEN(7,file=outfile,form='unformatted',access='stream')
WRITE(7) d
CLOSE(7)
END SUBROUTINE write_field
Мое понимание опции access=stream
заключалось в том, что это подавит стандартный верхний и нижний колонтитулы, которые поставляются с двоичным файлом Fortran (см. Неформатированный формат файла Fortran).
Если я пишу файл с m=512
, то я ожидаю, что файл должен быть 4 x 512^3 bytes = 536870912 bytes ~ 513 Mb
, однако на самом деле они на 8 байтов длиннее этого, начиная с 536870920 bytes
. Я предполагаю, что эти дополнительные байты представляют собой 4-байтовые верхний и нижний колонтитулы, которые я хотел подавить, используя access='stream'
.
Ситуация становится для меня запутанной, если я пишу файл с m=1024
, тогда я ожидаю, что файл должен быть 4 x 1024^3 bytes = 4294967296 ~ 4.1 Gb
, однако на самом деле они на 24 (!) байта длиннее этого, входя в 4294967320 bytes
. Я не понимаю, зачем здесь 24 лишних байта, которые вроде бы соответствуют 6(!) шапкам или футерам.
Мои вопросы:
(a) Можно ли заставить Fortran написать двоичный файл без верхних и нижних колонтитулов?
(б) Если ответ на (а) «нет», могу ли я гарантировать, что больший двоичный файл имеет ту же структуру верхнего и нижнего колонтитула, что и меньший двоичный файл?
(c) Если ответы на (a) и (b) оба «нет», то как мне понять, где в файле находятся эти дополнительные верхние и нижние колонтитулы.
Я использую ifort
(версия 14.0.2) и пишу бинарные файлы на небольшом кластере Linux.
ОБНОВЛЕНИЕ: при запуске того же кода с OSx
и компиляции с gfortran
7.3.0 двоичные файлы получаются с ожидаемыми размерами, так как они всегда 4 x m^3 bytes
, даже если m=1024
. Таким образом, эта проблема, похоже, связана со старым компилятором.
ОБНОВЛЕНИЕ: На самом деле проблема присутствует только при использовании ifort
14.0.2. Я обновил текст, чтобы отразить это.
m
всегда равенm^3+8
, а затем он переключается наm^3+24
где-то междуm=512
иm=1024
. - person Mead   schedule 04.05.2018status='replace'
к командеopen
и удалитеform
- person ptb   schedule 04.05.2018