簡體   English   中英

fortran LAPACK例程中的分段錯誤

[英]Segmentation error in fortran LAPACK routine

我正在嘗試使用Fortran 95使用LAPACK庫運行一個簡單程序。我正在將線性方程組求解為: Ax=B

A = [4 -2 3]
    [1 3 -4]
    [3 1 2]

B=[ 1
   -7
   5]

x是解向量

解決方法是

x = [-1
     2
     3]

這是代碼。 我正在使用兩個子例程: SGETRFSGETRS 第一個函數SGETRF計算矩陣的LU分解,第二個子例程求解方程組。

program main
implicit none

integer :: i,j,info1,info2
integer :: neqn ! number of equations
real,dimension(3,3) :: coeff
real,dimension (3,1) :: lhs
real,dimension (3,1) :: ipiv

neqn=3

coeff = reshape( (/4,1,3,-2,3,1,3,-4,2/),(/3,3/))
lhs = reshape ( (/1,-7,5/),(/3,1/) )

call SGETRF (neqn,1,coeff,neqn,ipiv,infO1)
        if (info1==0) then
            call SGETRS ('N',neqn,1,coeff,neqn,ipiv,lhs,neqn,info2) !Error
        else
        end if

write (*,*) 'Answer: '
        do j=1,neqn,1
            write (*,100) lhs(j,1)
            100 format (F12.5,' ,')
        end do

        write (*,100) (lhs)

end program

根據LAPACK文檔SGETRF,在我的情況下, M=neqn=3, N=1, A=coeff, LDA=3我將程序編譯為gfortran main.f95 -o main -fcheck=all -llapack而我得到了錯誤:

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0  0x7F758C3B3777
#1  0x7F758C3B3D7E
#2  0x7F758C00BD3F
#3  0x7F758CA2F3EF
#4  0x7F758C9BE8ED
#5  0x400AE0 in MAIN__ at main.f95:19
Segmentation fault (core dumped)

第19行call SGETRS ('N',neqn,1,coeff,neqn,ipiv,lhs,neqn,info2)我不明白為什么會有錯誤。 有任何想法或意見嗎?

您的錯誤是由SGETRF的第二個參數引起的。 此參數是coeff的第二維,因此應為3neqn

為了詳細說明Stefan的正確答案,這里是對代碼的修改。 我相信,通過針對LAPACK規范進行仔細編程(例如ipiv數組應為rank-1 Integer )並避免使用過多的文字常量,可以消除一些潛在的錯誤:

Program main
  Implicit None
  Integer, Parameter :: neqn = 3, nrhs = 1
  Integer :: info
  Real :: coeff(neqn, neqn)
  Real :: lhs(neqn, nrhs)
  Integer :: ipiv(neqn)
  coeff = reshape([4,1,3,-2,3,1,3,-4,2], shape(coeff))
  lhs = reshape([1,-7,5], shape(lhs))
  Call sgetrf(neqn, size(coeff,2), coeff, size(coeff,1), ipiv, info)
  If (info==0) Then
    Call sgetrs('N', neqn, size(lhs,2), coeff, size(coeff,1), ipiv, lhs, &
      size(lhs,1), info)
    If (info==0) Then
      Write (*, *) 'Answer: '
      Write (*, *)(lhs)
    End If
  End If
End Program

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM