我正在尝试编写Thomas算法来解决AX=b
形式的三对角矩阵问题,其中A
是三对角矩阵,X
是未知向量,{{1独立的术语向量。
当我尝试提取主对角线b
,右对角线和左对角线A(i,i)
和A(i,i+1)
时,程序无法提取。真正令人尴尬的是,如果我将A(i,i-1)
置于do循环的中间,它就会起作用。
我知道将对角线放在不同的向量中并不是绝对必要的,但是我试图尽可能明确地将其用于解释目的。
有人可以帮忙吗?
提前致谢
这是解决向量X(AM是矩阵)
的子程序print *,
答案 0 :(得分:0)
我无法使用ifort 12.0或gfortran 4.8.1重现错误。您使用的是哪个编译器/版本?
我还检查了你的例行程序,反对LAPACK,它按预期工作!
subroutine LU_lapack(A, b, x, stat)
implicit none
! Arguments
real(kind=4),intent(inout) :: A(:,:)
real(kind=4),intent(in) :: b(:,:)
real(kind=4),intent(out) :: x(:,:)
integer,intent(out) :: stat
! Local variables
integer, allocatable :: IPIV(:) ! Pivot indices for LAPACK
integer :: N, NRHS
x = b
allocate( IPIV(size(x,1)),stat=stat )
if (stat.ne.0) stop 'solve_LU_double: Cannot allocate memory!'
N = size(b,1)
NRHS = size(b,2)
! Perform the LU-decomposition
call SGETRF(N,N,A,N,IPIV,stat)
if ( stat.ne.0 ) then
deallocate(IPIV)
return
endif
! Solve system
call SGETRS( 'N', N, NRHS, A, N, IPIV, x, N, stat )
deallocate(IPIV)
end subroutine
根据您报告的奇怪行为,我猜您在调用例程之前有一些错误 - 可能是交叉边界或错位指针...... 你应该通过valgrind运行你的代码来找到这样的异常!
编辑:正如之前在其中一篇文章中提到的,使用编译器标志来检查数组边界等也可能有助于找到问题...首先尝试一下,它通常要快得多!对于gfortran,我通常使用gfortran -g -fimplicit-none -ffpe-trap=invalid,zero,overflow \
-fbounds-check -Wall -Wextra
对于ifort,我使用
ifort -g -check noarg_temp_created -implicitnone -fpe0