Вы определяете массивы одинарной точности, но вызываете процедуры двойной точности. Позвоните sgetrf
и sgetri
вместо этого. В качестве альтернативы, если вам нужна двойная точность, объявите переменные с помощью:
integer, parameter :: dp = kind(1.d0)
real(kind=dp) :: B(2,2), A(2,2), work(2)
В любом случае, используя одинарную точность, следующий код:
Program Tester
implicit none
real :: B(2, 2), A(2, 2), WORK(2)
integer :: i, j, SIZ, IPIV(2), INFO
SIZ=2
do i=1, SIZ
do j=1, SIZ
A(i, j)=rand(0)/2+0.5
B(i, j)=0
end do
end do
B=A
print *, A
call sgetrf(size(B, 1), size(B, 2), B, size(B, 1), IPIV, INFO)
print *, "========="
print *, B
print *, IPIV
call sgetri(size(B, 1), B, size(B, 1), IPIV, WORK, size(WORK), INFO);
print *, "========="
print *, B
end program Tester
, скомпилированный со следующим make-файлом:
FC =gfortran
MKL_LIB = -L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_gf_lp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl -m64 -I${MKLROOT}/include
all: test.f90
$(FC) -o test.exe $^ $(MKL_LIB) -I$(MKLROOT)/include
дает этот вывод:
0.500003815 0.877802610 0.565768838 0.729325056
=========
0.877802610 0.569608510 0.729325056 0.150339082
2 2
=========
-5.52652836 6.65163040 4.28716612 -3.78882527
Примечание: как отмечено в комментариях, я использовал реализацию LAPACK от MKL для удобства. Независимо от реализации точность подпрограмм и переменных должны совпадать. То, что происходит, когда они этого не делают, может зависеть от реализации, но, скорее всего, будет бесполезным во всех случаях.