英特尔 Fortran 形式的标准等效项 = 'binary'

Standard equivalent for Intel Fortran form = 'binary'

我的 Fortran 代码有问题,该代码是为使用英特尔 Fortran 编译器进行编译而编写的。

我遇到的具体问题是 OPEN 语句。我尝试重写源代码,以便可以使用免费的编译器 GNU Fortran 进行编译,我成功了,但我遇到了一些问题。

OPEN(access = 'direct', form = 'binary', status = 'replace'...) 有一些临时文件输出,但 form = 'binary' 不是标准的,GNU Fortran 编译器不支持。

在网上找了解决办法发现form = 'unformatted'应该是等价的,GNU Fortran可以处理。是的,确实如此,我能够正确编译代码 运行s。然而,代码是一种科学计算,在以这种方式打开的这些文件中生成大量数据。我的问题是 form = 'unformatted' 导致文件比 form = 'binary' 大 4 倍。

有了这个,我没有足够的硬盘 space 来成功 运行s 在某些情况下使用未格式化的格式,而使用二进制文件我可以。是否有可与 GNU Fortran 一起使用并产生类似文件大小的 Intel Fortran 'binary' 等效项?

根据要求,我添加了一个简短的简化示例代码:

subroutine init
use module params  ! contains param1, param2, param3, ... which are inetger or real
common /params2/ maxi, maxj, maxk, limit, recnum ! integers defined elsewhere
real*8, allocatable :: x(:)
... other variables
open (unit = 5, file = 'data.txt', access = 'direct',
 *    form = 'binary', recl = 16*maxk+8, status = 'replace')
write(5, rec = 1) param1, param2, param3, maxi, maxj, maxk, limit, recnum ...
recnum = 2
do i = 1, maxi
  do j = 2, maxj
     ... do some stuff with x
     write(55, rec=recnum) x(0), (xt(k), xt(limit-k), k = 1, maxk)
  recnum = recnum + 1
  done
done
close(5)
end subroutine init

program xx
common /params2/ maxi, maxj, maxk, limit, recnum
...
call subroutine init
...
open (unit = 5, file = 'data.txt', access = 'direct',
 *   form = 'binary', recl = 16*maxk+8, status = 'old')
... do some stuff
read(5, rec=1) param1, param2, param3, maxi, maxj, maxk, limit, recnum, ...
... do some stuff
recnum = 1
do i = 1, maxi
  do j = 2, maxj
  recnum = recnum + 1
     ... do some stuff
     read(5, rec=recnum) x(0), (xt(k), xt(limit-k), k = 1, maxk)
     ... do some stuff
  done
done
close(5)
end program

program xx中需要读取第一条记录,因为data.txt生成的文件 subroutine init 我来自之前的 运行(调用 subroutine init 可能不会在每个 运行 发生), 并且需要读取一些参数来解释 data.txt.

中的数据

这样生成了多个文件,并不总是需要第一条记录。 我假设即使没有必要,如果读取第一条记录,access = stream 可能会起作用。

但是当我用 access = stream 替换 access = direct 并删除 reclWRITE()READ() 中每次出现的 rec = 我得到运行文件不一致的时间错误I/O。

我找不到完全相同的副本,但之前在这里接受过治疗。

  form='binary'

完全不规范。标准方法是使用

  access='stream', `form='unformatted'

这将启用从 Fortran 2003 进行的标准流访问,它是在 C 之后建模的,并且可以在所有相当新的编译器中使用。

基本上,form='binary' 与该语言的其余部分不太兼容。正确的方法是真正改变access,这就是你可能感到困惑的原因。

顺序访问和直接访问都是基于记录的,可能会导致记录标记被写入数据之外。非标准 form='binary' 改变了这一点,但正确的方法是使用可以格式化和未格式化的流访问。特别是 unformatted 非常方便,让您可以准确地保存内存中的字节,而无需任何额外的标记。