如何在Fortran 90/95中使用Fortran 77子程序?

时间:2013-05-02 15:43:09

标签: fortran fortran90 fortran77

我正在使用Fortran 90编写代码,现在我需要使用* amos 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代码。但代码太长了,这是一场灾难。

2 个答案:

答案 0 :(得分:3)

除极少数例外情况外,FORTRAN 77是Fortran 90/95/2003/2008的子集。在实践中,编译器仍然支持过时的功能。使用相同的编译器编译FORTRAN 77和Fortran 90/59/2003/2008源应生成兼容的对象模块。您可能必须单独编译这两种语言版本,因为可能需要不同的编译器选项,例如,对于固定和自由格式的源布局。使用Fortan 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.

答案 1 :(得分:0)

我遇到了同样的问题。就我而言,这是因为从 ZBESI.f 调用的 I1MACH 和 D1MACH 返回了错误的答案。在文件中使用 https://github.com/certik/fortran-utils/blob/master/src/legacy/amos/d1mach.f90 让它发挥作用。