2

我正在修改一些旧的 Fortran 代码(我想是 F77),用 Intel 编译器编译。我遇到了一些这种形式的 SLATEC 例程:

subroutine cffti (n,wsave)

     dimension wsave(1)

     iw1 = n+n+1
     iw2 = iw1+n+n
     call cffti1 (n,wsave(iw1),wsave(iw2))

     return
  end subroutine cffti


 subroutine cffti1 (n,wa,ifac)

     ....
     ....
 end subroutine cffti

Wsave 是一个数组,它的第一部分应该存储浮点数,而第二部分(来自 iw2)存储整数。

所有变量都是隐式的,因此当 wsave(iw2) 传递给 ifac 时,会被解释为整数,而 ifac 中的值没有意义。

我很困惑:所有这些东西怎么能正常工作?我该如何克服这个问题?

4

2 回答 2

2

这种正确填充数据的转换可以EQUIVALENCE在 Fortran 77 中使用。Fortran 95 提供TRANSFER了相同的目的。

wsave(iw2:) = transfer(some_integer_array, wsave)

接收数据不是问题,因为隐式接口只传递指针而不检查类型。如果您需要内部使用显式接口,您也可以在内部使用相同的接口。

在现代代码中,只需使用 2 个不同类型的不同数组,并远离这些技术。

于 2013-04-15T07:28:43.907 回答
1

详细说明 VF 的答案——很可能 cffti1 使用该整数数组作为暂存空间,因此这些值永远不会在其他任何地方访问。IE。您可能找不到(或不需要)等价或转移语句。最高级别子例程的文档可能会说“wsave 应该被声明为 4n+1 并在前 2n 个值中返回您想要的结果”。

在这种情况下,要“现代化”代码,您可以取消 ifac 参数并在子例程中分配暂存空间。但是,如果没有真正详细研究代码,我将不愿意进行此类更改。

也就是说,你有什么“问题”?您可能只需要关闭一些过于激进的类型检查。


编辑,在这里找到文档http://www.maths.bris.ac.uk/~marp/slatec/routin-j.htm

 WSAVE   a work array which must be dimensioned at least 4*N+15...

“工作数组”->“暂存空间”->不要关心内容..

于 2013-04-15T12:39:02.383 回答