如何使用Fortran 77个的子程序用Fortran 90/95?(How to use Fort

2019-09-01 18:23发布

我正在写代码的Fortran 90,现在我需要使用特殊功能在*阿莫斯Fotran 77库( http://www.netlib.org/amos/ )。 现在,我发现这些程序模块接口( https://github.com/certik/fortran-utils/blob/master/src/amos.f90 )。

我的问题是:我怎样才能将它们组合起来,在我的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的代码。 但代码是那么的漫长,这是一场灾难。

Answer 1:

极少数的例外,是Fortran 77的Fortran 90/95/2003/2008的一个子集。 而在实践中,编译器还支持过时的功能。 编译FORTRAN 77和Fortran 90/59/2003/2008源具有相同的编译器应该产生兼容的对象的模块。 你可能不得不单独编译两种语言版本,因为不同的编译器选项可能是必要的,例如,用于固定和自由格式源布局。 随着你的FORTAN 90/95/2003/2008代码的接口,编译器将使用兼容的调用约定。

您有什么具体问题? 你需要知道FORTRAN 77的编译器选项? 您正在使用什么编译器?

编辑:你必须编译使用它的源代码之前,该模块。 是很方便的编译FORTRAN 77第一,成目标文件,然后使用Fortran命令编译的Fortran 95连结的一切。 因此,尝试:

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


文章来源: How to use Fortran 77 subroutines in Fortran 90/95?