无法在三对角矩阵求解器中将对角线提取为矢量

时间:2013-09-02 17:40:38

标签: fortran linear-algebra linear

我正在尝试编写Thomas算法来解决AX=b形式的三对角矩阵问题,其中A是三对角矩阵,X是未知向量,{{1独立的术语向量。

当我尝试提取主对角线b,右对角线和左对角线A(i,i)A(i,i+1)时,程序无法提取。真正令人尴尬的是,如果我将A(i,i-1)置于do循环的中间,它就会起作用。

我知道将对角线放在不同的向量中并不是绝对必要的,但是我试图尽可能明确地将其用于解释目的。

有人可以帮忙吗?

提前致谢

这是解决向量X(AM是矩阵)

的子程序
print *,

1 个答案:

答案 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