resueltos - ¿Cómo usar las subrutinas Fortran 77 en Fortran 90/95?
programas en fortran ejemplos (1)
Con muy pocas excepciones, FORTRAN 77 es un subconjunto de Fortran 90/95/2003/2008. Y en la práctica, los compiladores aún admiten las características obsoletas. La compilación de la fuente FORTRAN 77 y Fortran 90/59/2003/2008 con el mismo compilador debería producir módulos de objetos compatibles. Es probable que tenga que compilar las dos versiones de idioma por separado ya que probablemente serán necesarias diferentes opciones de compilación, por ejemplo, para el diseño de fuente fija y de forma libre. Con las interfaces en su código Fortan 90/95/2003/2008, el compilador utilizará las convenciones de llamadas compatibles.
¿Qué problemas específicos tienes? ¿Necesita conocer las opciones del compilador para FORTRAN 77? Qué compilador estas usando?
EDITAR: tiene que compilar el módulo antes del código fuente que lo usa. Es conveniente compilar el FORTRAN 77 primero, en un archivo de objeto, y luego usar el comando fortran que compila el Fortran 95 para vincular todo. Así que prueba:
ifort -c -fixed ZBESI.f
ifort ZBESI.o set_precisions.f90 amos.f90 test_ZBESI.f90.
Estoy escribiendo un código con Fortran 90 y ahora necesito usar las funciones especiales en la biblioteca * amos Fotran 77 ( http://www.netlib.org/amos/ ). Ahora encontré una interfaz de módulo para esas rutinas ( https://github.com/certik/fortran-utils/blob/master/src/amos.f90 ).
Mi pregunta es: ¿cómo puedo combinarlos y usarlos en mi programa Fortran 90 y cómo compilarlos correctamente?
He estado luchando por esto durante un día entero y todavía no lo pude resolver.
El siguiente es mi código de prueba:
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
El resultado que obtuve es el siguiente:
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
Parece que no pude obtener la respuesta correcta, sin importar cómo.
Intenté convertir a mano el código de Fortran 77 de ZBESI.f en Fortran 90. Pero el código es tan largo y fue un desastre.