2013-05-18 54 views
1

將大量數據(雙數)從FORTRAN程序傳遞到C++程序的最佳和最有效的方法是什麼?現在我正在使用二進制文件,但速度不夠快!將大量數據從FORTRAN傳遞到C++

我試過管道。我跟在http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx的C++部分。但對於FORTRAN部分(它是子處理器),我不知道如何正確寫入數據。我是否必須在控制檯上寫如WRITE(*,*) AllTheNumbers?因爲在控制檯上書寫需要很多時間!

我的Fortran代碼寫入數據:

 DO 281 I=1,NDOF 
     DO 280 J=1,UBW    
     IF (S(I,J).NE.0) THEN  
      WRITE (*, 2770) I,(J+I-1) 
      WRITE (*,2760) (S(I,J))   
     ENDIF   
280 CONTINUE   
281 CONTINUE 
+0

http://msdn.microsoft.com/en-us/library/aa366551(v=vs.85).aspx –

+0

它是一個二維數組嗎? – EvilTeach

+0

我在問題 – VecTor

回答

4

最快的方法是使它一個混合語言編程。在一個(例如,Fortran)中生成數字並從該語言中調用另一個(例如C++)。使用Fortran的ISO C綁定,調用C是Fortran語言標準的一部分。許多Fortran編譯器都支持這一點。在C++端使用「extern C」。傳遞一系列雙打應該很容易。

編輯:如果您繼續使用傳輸信息的IO方法,您可能應該將信息作爲二進制數據傳輸。您將Fortran代碼示例使用格式化的IO ...將數字的內部二進制表示轉換爲人類可讀的字符很慢。在您的Fortran公開聲明中使用:access='stream', form='unformatted'。寫入時不要使用格式。

+0

一個主要的C++程序,它具有該接口調用多個FORTRAN程序(作爲子處理器),並且每個程序都產生一個雙精度數組。我需要將所有數組傳遞給主程序。所以我不能混合他們 – VecTor

+0

人們會注意到,如果它是一個多維數組,然後fortran和c存儲陣列不同。列/行爲fortran vs行/列爲c – EvilTeach

+0

混合它們似乎是可能的:C++調用Fortran子例程sub1返回array1,sub1返回,然後C++調用Fortran sub2返回array2,sub2返回等。如果需要更多速度,使C++程序爲多線程,擁有多個數組,並從不同線程中調用不同的Fortran子例程。 –

1

使用二進制文件可能是最慢的可能途徑。這個問題已經遇到過:

https://en.wikipedia.org/wiki/Inter-process_communication

+0

感謝您的回覆。我也嘗試過管道。我關注了C++部分[http://msdn.microsoft.com/en-CA/library/bb546102.aspx]。但對於FORTRAN部分,我不知道如何正確寫入數據。我必須在控制檯上書寫嗎?因爲在控制檯上書寫需要很多時間! – VecTor

1

考慮創建一些共享內存。 c程序「創建它」,並將數據寫入其中,並調用fortran子程序。 fortran程序「映射」共享內存,並對其進行處理並退出。 c程序然後銷燬內存並退出。

0

答案的一個小變種在這裏:Write unformatted (binary data) to stdout,說明了重複使用一個小緩衝區。

real(kind=8) :: x(256) ! note real(kind=8) is "probably" an 8 byte float. 
          ! but not strictly guaranteed in fortran. 
    character(len=2048):: buffer ! 2048 == 256*8 
    do j=1,1000 
    do i = 1,256 
     x(i)=(i-1)**2+j*256 
    enddo 
    buffer=transfer(x,buffer) 
    write(*,'(a)',advance='no')buffer 
    enddo 
    end 

和Python代碼來讀取它,只是例如。 (蟒蛇結構模塊,使得它比C++我認爲對於調試這些東西更好)

import subprocess 
import struct 
p=subprocess.Popen('./transfer',stdout=subprocess.PIPE) 
a=" " 
while a!="": 
a=p.stdout.read(8) 
if a!="" : print struct.unpack('d',a) 

我從來沒有與「不可打印的字符」,而寫這樣遇到的問題。 但是,由於隨機字符串被解釋爲EOF,您無法使用此技巧從fortran中的stdin中讀取數據。

+0

@VecTor,我只是用Popen(['ssh',..])檢查了這個作品,結果很好。在這種情況下,你當然需要擔心字節順序問題。 – agentp