2014-02-26 47 views
1

我的Fortran代碼需要從文件中讀取初始化數據(約24000個實數)。有什麼方法可以將數據放入代碼中,以便我可以避免訪問文件系統?有沒有辦法在Fortran中的代碼文件中包含數據?

我試圖用一個模塊,並把所有的數據到一個變量的初始化是這樣的:

real(kind=8) :: a(24000)=(/& 
& 1. ,& 
& 2. ,& 
... 
&/) 

但因爲有24000行源文件,我不斷收到編譯錯誤「太多的延續線」。有沒有解決這個問題的方法?

+4

就我個人而言,我厭惡在源文件中存儲大量的數據;我認爲解決您的問題的方法是將數據保存在文件中,並在程序啓動時讀取它。爲什麼你想避免訪問文件系統? –

+0

@HighPerformanceMark我討厭在源文件中包含數據,這使得代碼難以閱讀和維護。我正在嘗試將Fortran子程序構建到動態庫中,以便我可以在其他地方使用它。我不知道是否可以將數據文件包含在動態庫中。如果有可能你可以提供一些參考?謝謝。 – xslittlegrass

+0

不是我認爲它是一個好主意,但gfortran編譯和運行這很好。 (甚至超過10倍!)任何人都知道標準中關於允許連續行數的內容嗎? – agentp

回答

5

您可以使用DATA這個語句。

事實上,您可以將您的數組「切片」成部分(例如在一個部分中設置a[1..100],在下一個部分中設置a[101..200]等)意味着您應該能夠避免出現大規模語句大小問題正在體驗。

0

正如前面的作者所述,您可以使用數據語句,但手動將其輸入代碼可能非常耗時。是否有理由擔心在do循環中使用READ語句來讀取文件?如果您可以向我們提供有關數據文件格式的任何輸入,我們可以爲您提供更好的幫助。

1

對於如此大量的數據,我會用一些腳本語言(甚至Fortran語言)生成的簡單的Fortran代碼塊像

a(1) = .. 
a(2) = .. 
a(3) = .. 

這個代碼可以用複製 - 粘貼或包括-d進入你的源代碼。

0

看起來可能過時了,但您可以使用INCLUDE。你需要修改你的數據文件,有你給的形式,

real(8), dimension(24000) :: a=(/1.0,2.0,...24000./) 

,然後include它在主程序這樣:

program main 
    implicit none 
    include "my_data_file.for" 

    <...> 
end program main 

你不需要改變你的編譯命令,Fortran編譯器將自行導入include d文件 - 只要包含的文件位於同一目錄中即可。

+0

'a =(/ 1.0,2.0,... 24000 ./)'在一行中? – xslittlegrass

+0

在一行中,沒有。考慮到這一點之後(並在我的電腦上玩弄它),我認爲這種方法不適合你。我認爲High Performance Mark的建議是在運行時只讀取文件,這可能是獲取數據的最佳選擇(加上讀取24,000個數據點的速度快到0.01秒) –

1

一個選項可能是指示您的編譯器允許無限行長度 並將整個事物放在一行上。

gfortran -ffree-line-length-none 

我已驗證這件作品。我有一個2MB的源文件只有3行

real(kind=8) :: a(24000)=(/ ......... /) 
write(*,*)a(24000) 
end 

,如果一些編譯器有一個實際的線長度的限制,雖然我也不會感到驚訝。

順便說一下,gfortran不喜歡使用大的data聲明。 無錯誤它只是掛起(或需要很長的時間)

// 想象一下,我的大data版本實際上編譯(並運行良好)後1.5小時。爲什麼data由編譯器處理,與初始化分配完全不同,這是一個很好的問題。

相關問題