我的Fortran代碼需要從文件中讀取初始化數據(約24000個實數)。有什麼方法可以將數據放入代碼中,以便我可以避免訪問文件系統?有沒有辦法在Fortran中的代碼文件中包含數據?
我試圖用一個模塊,並把所有的數據到一個變量的初始化是這樣的:
real(kind=8) :: a(24000)=(/&
& 1. ,&
& 2. ,&
...
&/)
但因爲有24000行源文件,我不斷收到編譯錯誤「太多的延續線」。有沒有解決這個問題的方法?
我的Fortran代碼需要從文件中讀取初始化數據(約24000個實數)。有什麼方法可以將數據放入代碼中,以便我可以避免訪問文件系統?有沒有辦法在Fortran中的代碼文件中包含數據?
我試圖用一個模塊,並把所有的數據到一個變量的初始化是這樣的:
real(kind=8) :: a(24000)=(/&
& 1. ,&
& 2. ,&
...
&/)
但因爲有24000行源文件,我不斷收到編譯錯誤「太多的延續線」。有沒有解決這個問題的方法?
您可以使用DATA
這個語句。
事實上,您可以將您的數組「切片」成部分(例如在一個部分中設置a[1..100]
,在下一個部分中設置a[101..200]
等)意味着您應該能夠避免出現大規模語句大小問題正在體驗。
正如前面的作者所述,您可以使用數據語句,但手動將其輸入代碼可能非常耗時。是否有理由擔心在do循環中使用READ語句來讀取文件?如果您可以向我們提供有關數據文件格式的任何輸入,我們可以爲您提供更好的幫助。
對於如此大量的數據,我會用一些腳本語言(甚至Fortran語言)生成的簡單的Fortran代碼塊像
a(1) = ..
a(2) = ..
a(3) = ..
這個代碼可以用複製 - 粘貼或包括-d進入你的源代碼。
看起來可能過時了,但您可以使用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文件 - 只要包含的文件位於同一目錄中即可。
'a =(/ 1.0,2.0,... 24000 ./)'在一行中? – xslittlegrass
在一行中,沒有。考慮到這一點之後(並在我的電腦上玩弄它),我認爲這種方法不適合你。我認爲High Performance Mark的建議是在運行時只讀取文件,這可能是獲取數據的最佳選擇(加上讀取24,000個數據點的速度快到0.01秒) –
一個選項可能是指示您的編譯器允許無限行長度 並將整個事物放在一行上。
gfortran -ffree-line-length-none
我已驗證這件作品。我有一個2MB的源文件只有3行
real(kind=8) :: a(24000)=(/ ......... /)
write(*,*)a(24000)
end
,如果一些編譯器有一個實際的線長度的限制,雖然我也不會感到驚訝。
順便說一下,gfortran不喜歡使用大的data
聲明。 無錯誤它只是掛起(或需要很長的時間)
// 想象一下,我的大data
版本實際上編譯(並運行良好)後1.5小時。爲什麼data
由編譯器處理,與初始化分配完全不同,這是一個很好的問題。
就我個人而言,我厭惡在源文件中存儲大量的數據;我認爲解決您的問題的方法是將數據保存在文件中,並在程序啓動時讀取它。爲什麼你想避免訪問文件系統? –
@HighPerformanceMark我討厭在源文件中包含數據,這使得代碼難以閱讀和維護。我正在嘗試將Fortran子程序構建到動態庫中,以便我可以在其他地方使用它。我不知道是否可以將數據文件包含在動態庫中。如果有可能你可以提供一些參考?謝謝。 – xslittlegrass
不是我認爲它是一個好主意,但gfortran編譯和運行這很好。 (甚至超過10倍!)任何人都知道標準中關於允許連續行數的內容嗎? – agentp