2015-08-14 4 views
0

Я пытаюсь запустить простую программу с библиотекой LAPACK с помощью FORtran 95. Я решение системы линейных уравнений, как: Ax=BСегментации в Фортране LAPACK рутины

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

B=[ 1 
    -7 
    5] 

x является вектор решения

Solution is

x = [-1 
    2 
    3] 

Вот код. Я использую две подпрограммы: SGETRF и SGETRS. Первая функция 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) 

Line 19 является call SGETRS ('N',neqn,1,coeff,neqn,ipiv,lhs,neqn,info2) Я не понимаю, почему это ошибка. Любая идея или комментарии?

ответ

1

Ваша ошибка вызвана вторым параметром SGETRF. Этот параметр является вторым размером coeff и должен быть таким образом 3 или neqn.

0

Чтобы уточнить правильный ответ Стефана, переделайте код. Я считаю, что некоторый потенциал для ошибки удаляется путем тщательного программирования против LAPACK спецификации (например, ipiv массива должен быть ранг-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 

 Смежные вопросы

  • Нет связанных вопросов^_^