2016-11-08 96 views
0

在我編寫的並行程序中,我定義了大量多維的allocatable數組(實際上只是一維,二維或三維),這些數組分配了負下限執行期間。 爲什麼這樣做的原因是,每個過程處理,在一個2D例如,由14A矩陣和共享的層與相鄰進程的重疊14,從而所述基質被分配具有邊界(-1:12,-1:12),其中矩陣的「內部」部分對應於從1到的索引。 (斜體代表選擇/輸入依賴)。將可分配數組的子數組傳遞給子例程

的問題是,在做這個我並沒有意識到,這將是不可能依靠this Fortran2003 feature,從而不可能call mysub(A(:,i),...)在主叫單元和使用實際指的A虛擬對應的子程序(-1和),因爲A(:,i)是一個表達式,而不僅僅是一個變量。

如果我將整個數組A傳遞給子程序(如previous linked answer中所述),但是這會迫使我編寫一個「更大」且不太常用的子程序,而這個子程序的意思是作用於一維子陣列。

是否有可能的allocatable陣列(例如A(:,1))的一個子陣列傳遞到的方式的子程序,該子程序是知道的實際變量的邊界的?

+0

本質:是的,有方式(如通過邊界,並使虛擬形狀明確)。但是,這裏適當的可能需要更多的細節。 – francescalus

回答

2

據我所知:不,這是不可能的。

請注意,很多時候,您不會不想想要關心子例程中數組的實際下限。如果你有一個總結數組或類似的子程序,你只需要從1循環到數組的大小。你想能夠將任何數組傳遞給這樣的子程序。

如果你需要從一個特定的指數在子程序中你就可以開始總是

1. 聲明下界爲魔術常量

real, intent(inout) :: array(-1:,-1:,-1:) 

也許不是太漂亮,我卻用它在我的主要生產代碼中,因爲我幾年前就是這樣開始的。

2. 聲明一個模塊中的下限爲恆定,並使用該

use contants 

real, intent(inout) :: array(lb:,lb:,lb:) 

3. 傳遞下界作爲僞參數

integer, intent(in) :: lb 
real, intent(inout) :: array(lb:,lb:,lb:) 
+0

對於最近的回覆,我很抱歉。我還沒有使用過你的解決方案,但我可以接受它,因爲我認爲第2點是一個相當好的答案!謝謝 –

相關問題