2016-04-26 31 views
0

我想了解Fortran 77代碼,但是偶然發現了代碼上的EQUIVALENCE()語句。Fortran 77中的等價(實數和複數變量)

下面是代碼的一部分:

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)) 

誰能給我說說爲什麼使用等價()語句線索?我的假設是DATA1,它是REAL,被更改爲DATA2,這是COMPLEX變量,其中某些更改是在FFT子例程上執行的。但是如果是這樣的話,DATA2的虛部怎麼樣?因爲FFT子程序只包含REAL變量。爲什麼DATA1和DATA2的數組大小不同?

我找不到任何答案在這個論壇上滿足我的問題。感謝您的回答。它會幫助我很多。

+0

感謝您的鏈接,我找不到它之前。 – mfakhrusy

+0

@HighPerformanceMark因此,讓我說,如果DATA1(0)包含值1,那麼DATA2(0)對於實部和虛部都包含1的值? – mfakhrusy

+2

data1(0)和data1(1)是data2(0)的實部和虛部。 – agentp

回答

2

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)) 

可以被視爲屬於秩-2陣列或秩1陣列以適應程序的需要相同的元件。

equivalence這些日子一般都會皺眉,現在的大多數已經被使用的功能可以用現代Fortran更安全地完成。對於更多,你可能會關心看看我的回答Is the storage of COMPLEX in fortran guaranteed to be two REALs?

+0

關於共享我以前無法理解的內存分配的最佳分析。謝謝。 其實我需要將fortran代碼移植到C++中,所以我必須完全理解代碼,以至少對C++實現應該有一些提示。 – mfakhrusy