Intel Fortran form ='binary'的标准等效值

时间:2016-04-19 11:56:38

标签: file-io fortran binaryfiles gfortran intel-fortran

我遇到了使用英特尔Fortran编译器编译的Fortran代码的问题。

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

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

在网上寻找解决方案后,我发现form = 'unformatted'应该是等价的,GNU Fortran可以处理它。是的,这是真的,我能够编译并且代码正确运行。但是,代码是一种科学计算,在这些文件中以这种方式生成大量数据。我的问题是form = 'unformatted'导致的文件比使用form = 'binary'大4倍。

有了这个,我没有足够的硬盘空间来成功运行在某些情况下使用无格式格式,而使用二进制我可以。英特尔Fortran的'二进制'是否可以与GNU Fortran一起使用并产生类似的文件大小?

正如我们所要求的那样,我正在添加一个简短的简化示例代码:

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 = direct替换access = stream并删除recl并在rec =WRITE()中每次出现READ()时都会出现运行时错误文件I / O期间的不一致。

1 个答案:

答案 0 :(得分:2)

我无法找到完全相同的副本,但之前已在此处理过。

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

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

form='binary'

将启用Fortran 2003的标准流访问,它以C语言建模,可以在所有合理的最新编译器中使用。

基本上,access与其他语言不兼容。正确的方法是真正改变form='binary',这就是为什么你可能会感到困惑。

顺序和直接访问都是基于记录的,除了您的数据之外,还可能导致写入记录标记。非标准<?php define( '_JEXEC', 1 ); define( 'JPATH_BASE', realpath(dirname(__FILE__).'/../../' )); require_once ( JPATH_BASE .'/includes/defines.php' ); require_once ( JPATH_BASE .'/includes/framework.php' ); $db = JFactory::getApplication('site'); $search = $_REQUEST["q"]; $query = "SELECT * FROM ts_djc2_categories WHERE name LIKE '%$search%'"; $db->setQuery($query); $result = $db->query(); $json = array(); $tt = "Nothing Found."; if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { array_push($json, $row['name']); } } else { array_push($json, $tt); } echo json_encode($json); 会更改,但正确的方法是使用可以格式化和未格式化的流访问。特别是未格式化的非常方便,让您在没有任何其他标记的情况下准确保存内存中的字节。