3

我正在用 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 代码。但是代码太长了,简直是一场灾难。

4

2 回答 2

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.
于 2013-05-03T00:15:29.387 回答
0

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

于 2021-01-15T00:29:49.493 回答