fortran gfortran lapack double-precision

fortran - El tipo de retorno de función no coincide



gfortran lapack (3)

reemplace la doble precisión con:

REAL (Kind=8) INTEGER (Kind=4) COMPLEX (Kind=8)

Estoy intentando recodificar un viejo programa de C ++ en Fortran para hacer uso de LAPACK (soy consciente de que C ++ sí tiene LAPACK ++, pero tengo muchos problemas para instalarlo, así que me di por vencido).

Originalmente no tuve ningún problema con la compilación, pero fue cuando tuve todas las variables declaradas como REAL . Cuando comencé a codificar la sección del programa que requería LAPACK, descubrí que todos los parámetros pasados ​​a DSYEV deben ser DOUBLE PRECISION . Así que traté de cambiar todo a la doble precisión (incluido el cambio de todos los números codificados a sus contrapartes de doble precisión, es decir, 0.0 -> 0.0D0) Ahora cuando intento compilar, aparece el siguiente error para todas las funciones y subrutinas que He escrito:

Error: Return type mismatch of function <function> at (1) (REAL(4)/REAL(8))

No estoy seguro de dónde viene esto, ya que todo en el programa ha cambiado a doble precisión.

Por ejemplo, he declarado lo siguiente:

double precision :: alpha(3),d(3),zeta1,zeta2 double precision :: A1(3),A2(3),D1(3),D2(3) double precision :: PI PI = 3.14159265359D0 alpha = (/0.109818D0, 0.405771D0, 2.22766D0/) d = (/0.444635D0, 0.535328D0, 0.154329D0 /) do 10 i=1,3 A1(i) = alpha(i)*zeta1**2.0D0 A2(i) = alpha(i)*zeta2**2.0D0 D1(i) = d(i)*(2.0D0*A1(i)/PI)**(3.0D0/4.0D0) D2(i) = d(i)*(2.0D0*A2(i)/PI)**(3.0D0/4.0D0) 10 continue

Y la función:

subroutine createS(S,A1,A2,D1,D2,r) double precision A1(3),A2(3),D1(3),D2(3) double precision r double precision S(2,2) integer :: i,j S(1,1) = 1.0D0 S(2,2) = 1.0D0 do 80 i=1,3 do 90 j=1,3 S(1,2) = S(1,2) + getS(A1(i),A2(j),r)*D1(i)*D2(j) 90 continue 80 continue S(2,1) = S(1,2) return end double precision function getS(a,b,r) double precision :: PI double precision a,b,r double precision :: S PI = 3.14159265359D0 S = (PI/(a+b))**1.5D0 S = S*dexp(-(a*b*r*r)/(a+b)) getS = S return end

Y luego recibo el error

HFSTO3G.f:85.28: S(1,2) = S(1,2) + getS(A1(i),A2(j),r)*D1(i)*D2(j) 1 Error: Return type mismatch of function ''gets'' at (1) (REAL(4)/REAL(8))

Estoy usando gfortran para compilar. ¿Podría ese ser el problema? No soy nuevo en programación, pero nuevo para Fortran. No programar esto en Fortran no es una opción.


No está declarando getS como una función en la subrutina createS . Necesita agregar double precision, external :: getS en sus declaraciones de variables de la subrutina createS .


¿Pusiste tus subrutinas y funciones en un módulo y use ese módulo? De lo contrario, probablemente lo que está ocurriendo es que está obteniendo tipeo implícito de getS en subrutina createS como una precisión real única, pero en realidad devuelve una precisión doble. Otra sugerencia: siempre use implicit none para encontrar la variable no declarada. En caso de que olvide incluir implicit none en su código fuente, gfortran proporciona las opciones del compilador -fimplicit-none . La tipificación implícita es perniciosa y probablemente continúe en Fortran para admitir el código heredado.

La double precision PS también es obsoleta, pero mucho menos arriesgada que el tipeo implícito. Si tiene una versión reciente de gfortran, puede usar lo siguiente:

use ISO_FORTRAN_ENV real (real64) ::

Vea el manual de gfortran.

EDITAR: El implicit none cambió el tipo de getS de real (4) (por tipeo implícito) a desconocido (no se declaró el tipo, el tipado implícito se deshabilitó). Si coloca los procedimientos en un módulo, ellos "sabrán" los tipos de cada uno: función regresa y tipos de argumentos. Esto solucionará este error. También ayuda al compilador a encontrar otros errores pero le permite verificar la consistencia de los argumentos entre la llamada y los argumentos del procedimiento. Consulte Uso correcto de módulos, subrutinas y funciones en Fortran y Computing the cross producto de dos vectores en Fortran 90 para ver ejemplos.