【问题标题】:Equivalence in fortran 77 (real and complex variable)fortran 77 中的等价性(实数和复数变量)
【发布时间】:2016-04-26 20:20:39
【问题描述】:

我试图理解 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 的数组大小不同?

我在这个论坛上找不到任何可以满足我的问题的答案。感谢您的回答。这对我有很大帮助。

【问题讨论】:

  • 感谢链接,之前没找到。
  • @HighPerformanceMark 所以,让我说,如果 DATA1(0) 包含值 1,DATA2(0) 包含值 1 实部和虚部?
  • data1(0)data1(1)data2(0) 的实部和虚部。
  • @agentp 谢谢!现在更有意义了。 :)
  • 是的,金锤是双向的。缺点是链接现在消失了。我不记得它与哪个问题有关。

标签: fortran fortran77


【解决方案1】:

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 的应用之一,现在仍然偶尔会遇到——能够在complexreals 对查看数据之间切换。但是,它并不局限于这种类型转换,没有什么可以说你不能等价整数和实数,或者任何其他类型。

人们偶尔仍会看到的另一种用途是使用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?的回答

【讨论】:

  • 关于共享内存分配的最佳解释,我以前无法理解。谢谢。实际上,我需要将 fortran 代码移植到 c++,所以我必须完全理解代码才能至少对 c++ 实现应该是什么有一些提示。
猜你喜欢
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
  • 2012-03-11
  • 2010-10-18
  • 2015-08-08
  • 1970-01-01
相关资源
最近更新 更多