我正在做一個靈敏度分析,因此需要用不同的參數多次運行我的程序。 我確實有一個調用子程序的主程序來計算我需要的值。因此我需要多次調用子程序。Fortran:離開子程序時清除已定義的數組
子程序具有被定義爲某些陣列:
真實的,尺寸(1000):: array_1,array_2
離開陣列的程序不會釋放陣列之後,從而爲函數的兩個呼叫我需要寫:
真實,尺寸(2000):: array_1,array_2
有一個簡單的解決方案呢? 謝謝
我正在做一個靈敏度分析,因此需要用不同的參數多次運行我的程序。 我確實有一個調用子程序的主程序來計算我需要的值。因此我需要多次調用子程序。Fortran:離開子程序時清除已定義的數組
子程序具有被定義爲某些陣列:
真實的,尺寸(1000):: array_1,array_2
離開陣列的程序不會釋放陣列之後,從而爲函數的兩個呼叫我需要寫:
真實,尺寸(2000):: array_1,array_2
有一個簡單的解決方案呢? 謝謝
讓我重申你的問題,只是爲了確保我正確理解它;如果我錯了,請糾正我。
假設你想調用你的子程序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)
我很抱歉,如果這不是你在找什麼,但請澄清,如果我想念理解你的問題。
如果您有許多基本上具有相同數據的數組,那麼將它們命名爲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 「聲明。
感謝您的回答。很抱歉,我無法更清楚地解釋我的問題。我的主要程序只consits程序主 打開輸出文件的」 \t做我= 1,20000個 \t讀取參數par_1,par_2,...,par_8 \t調用子程序(par_1,...,par_8) \t enddo end program' 該子程序完成所有工作,我不想保存數組的值。它們主要用於存儲中間結果。 該子程序看起來像: – Jan