Niezgodność typu powrotu funkcji

Próbuję przekodować stary program C ++ w Fortranie, aby skorzystać z LAPACK (zdaję sobie sprawę, że C ++ ma LAPACK ++, ale mam wiele problemów z jego instalacją, więc zrezygnowałem).

Pierwotnie nie miałem żadnych problemów z kompilacją, ale wtedy wszystkie zmienne zostały zadeklarowane jakoREAL. Kiedy zacząłem kodować sekcję programu wymagającą LAPACK, stwierdziłem, że wszystkie parametry zostały przekazane doDSYEV muszą byćDOUBLE PRECISION. Próbowałem więc zmienić wszystko na podwójną precyzję (w tym zmianę wszystkich zakodowanych liczb na ich podwójne odpowiedniki precyzyjne, tj. 0.0 -> 0.0D0). Teraz, gdy próbuję skompilować, otrzymuję następujący błąd dla wszystkich funkcji i podprogramów, które ja napisałem:

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

Nie wiem, skąd to się bierze, ponieważ wszystko w programie zostało zmienione na podwójną precyzję.

Na przykład zadeklarowałem, co następuje:

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

I funkcja:

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

A potem dostaję błąd

  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))

Używam gfortran do kompilacji. Czy to może być problem? Nie jestem nowy w programowaniu, ale nowy w Fortran. Nie programowanie tego w Fortranie nie jest opcją.

questionAnswers(3)

yourAnswerToTheQuestion