[英]dgtsv - LAPACK not returning answer
I'm trying to solve a simple tridiagonal system of equations using LAPACK library. 我正在尝试使用LAPACK库解决一个简单的方程对角线系统。 The code below explains it all.
下面的代码说明了这一切。
I'm getting an array full of zeros (initialized ones), not the correct answer. 我得到一个充满零的数组(初始化的零),而不是正确的答案。
I checked the inputs, tried to compile with two compilers and everything seems fine. 我检查了输入,尝试使用两个编译器进行编译,一切似乎都很好。 What is wrong?
怎么了?
The compilation line is: 编译行是:
ifort -L/usr/local/lib/ -llapack -lblas tLapack.f90 -o tlapack
gfortran -L/usr/local/lib/ -llapack -lblas tLapack.f90 -o tlapack
the code is: 代码是:
program lapackT
implicit none
! dgtsv( integer(4) :: N,
! integer(4) :: NRHS,
! real(8) :: DL[],
! real(8) :: D [],
! real(8) :: DU[],
! real(8) :: B [],
! integer(4) :: LDB ,
! integer(4) :: info )
! [A][x] = [b]
! N - The order of matrix [A]
! NRHS - Number of coluns in [b]
! DL - Array with the subdiag.
! D - Main diagonal.
! DU - Upper Diagonal.
! B - Answer !!
! LDB - length of array [B].
! INFO - If = 0 .. Uhul !!.
real(8), dimension(3) :: mainDiag
real(8), dimension(2) :: lowerDiag
real(8), dimension(2) :: upperDiag
real(8), dimension(3) :: unknow
real(8), dimension(3) :: equalty
integer(4) :: info = 0
integer(4) :: i = 0
integer(4) :: N = 3
integer(4) :: NRHS = 1
integer(4) :: LDB = 3
mainDiag(1) = 2.0d0
mainDiag(2) = 2.0d0
mainDiag(3) = 2.0d0
upperDiag(1) = 3.0d0
upperDiag(2) = 3.0d0
lowerDiag(1) = 1.0d0
lowerDiag(2) = 1.0d0
equalty(1) = 1.0d0
equalty(2) = 1.0d0
equalty(3) = 1.0d0
unknow = 0.0d0 ! answer
call dgtsv(N,NRHS,lowerDiag,mainDiag,upperDiag,equalty,LDB,info)
write(*,*) info
do i = 1,size(unknow)
write(*,*) unknow(i)
end do
! Correct answer: unknow = (/-1,1,0/) ! real(8) values
! Answer Im getting: unknow = (/0,0,0/) ! real(8) values
end program lapackT
If you look at the documentation you'll see the answer is returned in your equalty argument (ie it overwrites the RHS) - as unknow is not passed how can it be affected by the call? 如果您查看文档,您会看到在等值参数中返回了答案(即,它覆盖了RHS)-由于未传递信息,它将如何受到调用的影响? And I agree, I'm bot convinced this is the greatest design ever ...
而且我同意,我相信机器人是有史以来最伟大的设计...
While I'm here please learn about kinds, some of what you are doing is so quarter of a century ago. 当我在这里时,请了解种类,但是您正在做的事情距今已有25年。 Please look at Fortran 90 kind parameter .
请查看Fortran 90种类参数 。 Anyway here's how I would write your program (which some would say it also slightly out of date nowadays), and the answer it gives:
无论如何,这就是我如何编写您的程序(如今有些人说它也有些过时),并且给出了答案:
ian-admin@agon ~/test/stack $ cat dt.f90
program lapackT
implicit none
Integer, Parameter :: wp = Selected_real_kind( 13, 70 )
real(wp), dimension(3) :: mainDiag
real(wp), dimension(2) :: lowerDiag
real(wp), dimension(2) :: upperDiag
real(wp), dimension(3) :: unknow
real(wp), dimension(3) :: equalty
integer :: info = 0
integer :: i = 0
integer :: N = 3
integer :: NRHS = 1
integer :: LDB = 3
mainDiag(1) = 2.0_wp
mainDiag(2) = 2.0_wp
mainDiag(3) = 2.0_wp
upperDiag(1) = 3.0_wp
upperDiag(2) = 3.0_wp
lowerDiag(1) = 1.0_wp
lowerDiag(2) = 1.0_wp
equalty(1) = 1.0_wp
equalty(2) = 1.0_wp
equalty(3) = 1.0_wp
unknow = 0.0_wp ! answer
call dgtsv(N,NRHS,lowerDiag,mainDiag,upperDiag,equalty,LDB,info)
write(*,*) info
do i = 1,size(unknow)
write(*,*) equalty(i)
end do
! Correct answer: unknow = (/-1,1,0/) ! real(8) values
! Answer Im getting: unknow = (/0,0,0/) ! real(8) values
end program lapackT
ian-admin@agon ~/test/stack $ gfortran -Wall -Wextra -fcheck=all -O -std=f95 dt.f90 -llapack
ian-admin@agon ~/test/stack $ ./a.out
0
-1.0000000000000000
1.0000000000000000
0.0000000000000000E+000
ian-admin@agon ~/test/stack $
Unless dgtsv
operates through side-effects, this sequence of statements (your code, without empty lines): 除非
dgtsv
通过副作用运行,否则dgtsv
语句序列(您的代码,无空行):
unknow = 0.0d0 ! answer
call dgtsv(N,NRHS,lowerDiag,mainDiag,upperDiag,equalty,LDB,info)
write(*,*) info
do i = 1,size(unknow)
write(*,*) unknow(i)
end do
does not update unknow
. 不会更新
unknow
。 How could it not be all 0.0
s ? 怎么可能都不是
0.0
s?
Isn't the result returned through equalty
in your call to dgtsv
? 是不是结果通过返回
equalty
在调用dgtsv
?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.