2013-05-02 2 views
3

Я пишу код с Fortran 90, и теперь мне нужно использовать специальные функции в библиотеке * amos Fotran 77 (http://www.netlib.org/amos/). Теперь я нашел интерфейс модуля для этих подпрограмм (https://github.com/certik/fortran-utils/blob/master/src/amos.f90).Как использовать подпрограммы Fortran 77 в Fortran 90/95?

Мой вопрос: как я могу объединить их и использовать их в своей программе 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 

Кажется, я никогда не мог получить правильный ответ независимо от того, каким образом.

Я попытался преобразовать код Zr.S. Fortran 77 в код Fortran 90 вручную. Но код настолько длинный, и это было катастрофой.

+3

Пожалуйста, покажите образец кода, с которым вы боретесь. Также объясните, что именно не работает: ошибка компиляции? Связать проблему? – wallyk

+0

Это должно быть очень просто. Что-то не так, как только FORTRAN. Более подробная информация поможет. –

+0

должно быть просто бросить некоторые отладочные операторы записи в ZBESI, чтобы понять, почему он выбрасывает эту ошибку. – agentp

ответ

3

За редким исключением, FORTRAN 77 является подмножеством Fortran 90/95/2003/2008. И на практике компиляторы по-прежнему поддерживают устаревшие функции. Компиляция источников FORTRAN 77 и Fortran 90/59/2003/2008 с тем же компилятором должна создавать совместимые объектные модули. Вероятно, вам придется скомпилировать две языковые версии отдельно, поскольку, возможно, понадобятся различные параметры компилятора, например, для исходного и свободного форматов исходного кода. С интерфейсами в коде Fortan 90/95/2003/2008 компилятор будет использовать совместимые соглашения о вызовах.

Какие конкретные проблемы у вас возникают? Вам нужно знать параметры компилятора для FORTRAN 77? Какой компилятор вы используете?

EDIT: Вы должны скомпилировать модуль перед исходным кодом, который его использует. Удобно сначала скомпилировать FORTRAN 77 в объектный файл, а затем использовать команду fortran, которая компилирует Fortran 95, чтобы связать все. Итак, попробуйте:

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

Я использую компилятор Intel. Теперь мой код компилируется в виде чего-то вроде: ifort set_precisions.f90 ZBESI.f amos.f90 test_ZBESI.f90. Пока я помещаю файлы в правильном порядке, все компилируется нормально. Но результат результата кажется неправильным. Я не уверен, что это связано с самим кодом или компиляцией. Я обновил свой тестовый код в своем исходном вопросе. Благодаря! – user1746066