2011-08-04 55 views
0

我正在做一個靈敏度分析,因此需要用不同的參數多次運行我的程序。 我確實有一個調用子程序的主程序來計算我需要的值。因此我需要多次調用子程序。Fortran:離開子程序時清除已定義的數組

子程序具有被定義爲某些陣列:

真實的,尺寸(1000):: array_1,array_2

離開陣列的程序不會釋放陣列之後,從而爲函數的兩個呼叫我需要寫:

真實,尺寸(2000):: array_1,array_2

有一個簡單的解決方案呢? 謝謝

回答

1

讓我重申你的問題,只是爲了確保我正確理解它;如果我錯了,請糾正我。

  1. 您有一個子例程,它計算兩個單獨數組中的1000個值:array_1和array_2。
  2. 從您的主程序中,您希望多次調用此子程序,每次生成一組1000個值。

假設你想調用你的子程序N次,你想比較子程序外側的N組數字,即在你的主程序中,還是你想在子程序內進行比較?

無論哪種方式,我宣佈陣列像這樣:

real, dimension(N,1000) :: array_1, array_2 

如果你想這樣做的子程序外的比較,你會在主程序上述聲明。然後你將調用子程序N次,並在每次將這些值複製到main的array_1(i,*)和array_2(i,*)後。在此,子程序只能有一個像這樣定義的數組:

real, dimension(1000) :: array_1, array_2 

每次子程序調用時,它會重用這些陣列,覆蓋以前的值。如果您在主數組中記錄了以前的值,這應該是確定的。

如果你在f90中這樣做,你可以動態分配array_1和array_2,並讓N爲可變長度。或者,您可以最初爲陣列分配足夠的空間,以將所有可能的調用存儲到子例程中。比方說,你是不會跑了一百多個電話給子程序:

real array_1(100,1000), array_2(100,1000) 

我很抱歉,如果這不是你在找什麼,但請澄清,如果我想念理解你的問題。

+0

感謝您的回答。很抱歉,我無法更清楚地解釋我的問題。我的主要程序只consits程序主 打開輸出文件的」 \t做我= 1,20000個 \t讀取參數par_1,par_2,...,par_8 \t調用子程序(par_1,...,par_8) \t enddo end program' 該子程序完成所有工作,我不想保存數組的值。它們主要用於存儲中間結果。 該子程序看起來像: – Jan

1

如果您有許多基本上具有相同數據的數組,那麼將它們命名爲array,array_1,array_2等將很快變得尷尬,正如您已經意識到的那樣。其他兩種可能的設計是:1)使用一個數組並在一個循環中處理數據。處理完一組數據後,讀入下一組並覆蓋同一陣列中的先前數據。 2)使用@Yann建議的二維數組,第二維是數據集的數量/不同的參數值集合。

如果每個數據集的數組長度不同,對於解決方案1,您可以聲明數組爲「allocatable」,並在每次迭代開始時將其分配到正確的長度,然後在每次迭代結束時釋放。對於2來說,它可能是最容易的(但不是最有效的內存),使長度成爲最大長度並且具有指定使用長度的輔助數組。

P.S.這些數組是否是子程序本地的?然後,如果要傳遞的長度的子程序作爲一個參數,例如,「len」的,可以聲明數組爲:

integer, intent (in) :: len 
real, dimension(len) :: array_1, array_2 

和當子程序與特定重新調用的陣列將被重新創建長度「len」。在過程(子例程或函數)內部,如果長度作爲參數傳遞,您可以非常簡單地獲得可變長度數組。您甚至可以使用應用於數組參數的大小函數來獲取長度!在主程序中,或者它的長度不被稱爲過程的常量或參數,那麼可以通過在聲明中爲其指定「allocatable」屬性來推遲數組的大小,並動態分配數組中的「allocate 「聲明。

+0

感謝您的答案。很抱歉,我無法如此清楚地解釋我的問題。我的主要程序只包括 >>程序主
>>打開輸出文件
>> \t做我= 1,20000
>> \t讀取參數par_1,par_2,...,par_8
>> \t通話子程序(par_1,....,par_8)
>> \t enddo
end program
Jan

+0

>感謝您的回答。很抱歉,我無法清楚地解釋我的問題。我的主程序如下所示: – Jan