2013-05-02 125 views
3

我正在用Fortran 90編寫代碼,現在我需要使用* amos Fotran 77庫(http://www.netlib.org/amos/)中的特殊功能。現在我找到了這些例程的模塊接口(https://github.com/certik/fortran-utils/blob/master/src/amos.f90)。如何在Fortran 90/95中使用Fortran 77子例程?

我的問題是:如何將它們組合並在我的Fortran 90程序中使用它們以及如何正確編譯它們?

我一直在爲此奮鬥一整天,仍然無法弄清楚。

以下是我的測試代碼:

PROGRAM TEST_ZBESI 
USE set_precisions 
USE amos 
IMPLICIT NONE 
INTEGER :: n, i, nz, ierr 
!double precision :: zr,zi, cyr(5), cyi(5) 
REAL(kind=DBL) :: zr, zi, cyr(5), cyi(5) 

n=5 
zr=1.0_DBL 
zi=2.0_DBL 

call ZBESI(zr,zi,0.0_DBL,1,n,cyr,cyi,nz,ierr) 
print *,' ' 
do i=1, n 
    write(*,10) i-1, cyr(i) 
    write(*,11) i-1, cyi(i) 
end do 
print *,' NZ=', NZ 
print *,' Error code:', ierr 
print *,' ' 

10 format(' zr(',I1,') = ',F10.6) 
11 format(' zi(',I1,') = ',F10.6) 

END PROGRAM TEST_ZBESI 

我得到的結果如下:

zr(0) = 0.000000 
    zi(0) = 0.000000 
    zr(1) = 0.000000 
    zi(1) = 0.000000 
    zr(2) = 0.000000 
    zi(2) = 0.000000 
    zr(3) = 0.000000 
    zi(3) = 0.000000 
    zr(4) = 0.000000 
    zi(4) = 0.000000 
    NZ=   0 
    Error code:   4 

我似乎無法得到正確的答案不管有多。

我試圖手動將ZBESI.f Fortran 77代碼轉換爲Fortran 90代碼。但代碼太長了,這是一場災難。

+3

請顯示您正在努力的代碼示例。還請解釋什麼是不工作的:編譯錯誤?鏈接問題? – wallyk 2013-05-02 15:49:04

+0

這應該是非常簡單的。除了FORTRAN以外,有什麼不對。更多細節將有所幫助。 – 2013-05-02 17:20:03

+0

應該很簡單,向ZBESI拋出一些調試寫入語句,看看爲什麼拋出這個錯誤。 – agentp 2013-05-07 21:53:26

回答

3

除了極少數例外,FORTRAN 77是Fortran 90/95/2003/2008的子集。實際上,編譯器仍然支持過時的功能。使用相同的編譯器編譯FORTRAN 77和Fortran 90/59/2003/2008源應該生成兼容的目標模塊。您可能必須單獨編譯兩種語言版本,因爲可能需要不同的編譯器選項,例如,對於固定和自由格式的源佈局。通過Fortran 90/95/2003/2008代碼中的接口,編譯器將使用兼容的調用約定。

你有什麼具體問題?你需要知道FORTRAN 77的編譯選項嗎?你使用什麼編譯器?

編輯:你必須在使用它的源代碼之前編譯模塊。首先將FORTRAN 77編譯成目標文件,然後使用編譯Fortran 95的fortran命令來鏈接所有內容,這很方便。所以請嘗試:

ifort -c -fixed ZBESI.f 
ifort ZBESI.o set_precisions.f90 amos.f90 test_ZBESI.f90. 
+0

我正在使用英特爾編譯器。現在我的代碼通過如下方式編譯:ifort set_precisions.f90 ZBESI.f amos.f90 test_ZBESI.f90。只要我按正確的順序放置文件,一切都編譯好。但是輸出結果似乎是錯誤的。我不確定這是由於代碼本身還是編譯問題。我在我原來的問題中更新了我的測試代碼。謝謝! – user1746066 2013-05-06 15:29:13