fortran 77中的等价(实数和复数变量)

时间:2016-04-26 20:20:39

标签: fortran fortran77

我试图理解Fortran 77代码,但偶然发现了代码上的EQUIVALENCE()语句。

以下是代码的一部分:

REAL*8 DATA1(0:N-1)
COMPLEX*16 DATA2(0:N/2-1)
EQUIVALENCE(DATA1, DATA2)
...
...
CALL FFT(DATA1, N/2, -1)

基本上,FFT子程序是一维复数到复数的FFT引擎。在子程序中有一些置换和矩阵向量乘法。

代码稍后以这种方式调用DATA2:

K0=DATA2(0)
K1=DCONJG(DATA2(0))

任何人都可以告诉我为什么使用EQUIVALENCE()语句?我的假设是DATA1,它是REAL,被改为DATA2,它是COMPLEX变量,在FFT子程序上执行了一些改变。但如果是这样,那么DATA2的想象部分呢?因为FFT子程序只包含REAL变量。为什么DATA1和DATA2的数组大小不同?

我在这个论坛中找不到满足我问题的答案。谢谢你的回答。这对我很有帮助。

1 个答案:

答案 0 :(得分:3)

equivalence是Fortran实体的存储关联的两个功能之一。 (另一个是common块,我将在这里保持沉默。 equivalence语句声明其参数列表中指定的实体共享相同的存储位置。在这种情况下,data1data2共享相同的内存位置。

如果您有检查内存位置的工具并将其指向data1,您会看到以下内容:

+----------+----------+----------+----------+----------+----------+
|          |          |          |          |          |
| data1(0) | data1(1) | data1(2) | data1(3) | data1(4) | data1(...
|          |          |          |          |          |
+----------+----------+----------+----------+----------+----------+

将同一工具指向data2,您会看到类似这样的内容

+----------+----------+----------+----------+----------+----------+
|                     |                     |                     
|        data2(0)     |        data2(1)     |        data2(....         
|   re          im    |   re          im    |   re          im    
+----------+----------+----------+----------+----------+----------+

但'真相'更像是

+----------+----------+----------+----------+----------+----------+
|                     |                     |          
| data1(0)  data1(1)  | data1(2)   data1(3) | data1(4)   data1(...
|                     |                     |                     
|        data2(0)     |        data2(1)     |        data2(....         
|   re          im    |   re          im    |   re          im    
+----------+----------+----------+----------+----------+----------+

data1(0)data2(0)的真实组件位于同一位置。 data1(1)data2(0)的虚构成分,依此类推。

这是偶然遇到的equivalence应用程序之一 - 能够在查看数据complex或成对reals之间切换。但是,它不仅限于这种类型转换,没有什么可以说你不能等价整数和实数,或任何其他类型。

偶尔会看到的另一个用途是使用equivalence将数组从一个等级重新映射到另一个等级。例如,给定

integer, dimension(3,2) :: array2
integer, dimension(6)   :: array1

equivalence(array1(1),array2(1,1))

可以将相同的元素视为属于rank-2数组或rank-1数组,以满足程序的需要。

equivalence这些天通常不赞成,现代Fortran可以更安全地完成它所使用的大部分内容。有关更多信息,您可能需要查看我对Is the storage of COMPLEX in fortran guaranteed to be two REALs?

的回答