Я пытаюсь перекодировать старую C++-программу в Fortran, чтобы использовать LAPACK (я знаю, что C++ имеет LAPACK ++, но у меня много проблем с его установкой, поэтому я дал вверх).Функция return type несоответствие
У меня изначально не возникало проблем с компиляцией, но это было тогда, когда у меня были все переменные, объявленные как REAL
. Когда я начал кодировать раздел программы, требующий LAPACK, я обнаружил, что все параметры, переданные в DSYEV
, должны быть DOUBLE PRECISION
. Поэтому я попытался изменить все на двойную точность (включая изменение всех жестко закодированных чисел на их двойные копии точности, то есть 0.0 -> 0.0D0). Теперь, когда я пытаюсь скомпилировать, я получаю следующую ошибку для всех функций и подпрограмм, которые я 've написал:
Error: Return type mismatch of function <function> at (1) (REAL(4)/REAL(8))
Я не уверен, откуда это происходит, поскольку все в программе было изменено на двойную точность.
Например, я заявил следующее:
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
И функции:
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
И тогда я получаю ошибку
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))
Я использую gfortran Скомпилировать. Это может быть проблема? Я не новичок в программировании, но новичок в Fortran. Не программировать это в Фортране не вариант.
есть и другие библиотеки для C++, которые делают линейную алгебру, просто говоря альтернативный :) – steabert