2014-09-27 31 views
-3

我在Ubuntu 14.04編譯了一個fortran 95程序。在運行時,我得到了以下錯誤: 這是從不同:(1)編程接收到的信號SIGSEGV:分段錯誤 - 無效的存儲器引用。 Backtrace爲這個錯誤:

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

Backtrace for this error: 
^Z 
[9]+ Stopped     ./a.out 

我甚至嘗試

gfortran -g -fcheck=all -Wall DoubExchange.f95

但得到了同樣的錯誤消息。

我的程序:

! HAMILTONIAN Diagonalization for a 2D Lattice of N sites or (N_X) X (N_Y) size, with DOUBLE EXCHANGE. 
!              ! 
      !   D O U B L E E X C H A N G E     ! 
!              ! 
PROGRAM DOUBLE_EXCHANGE 
    implicit none 
    integer:: I, J, K, M, Z, P, L, SIZ, CONT, POINT, S 
    integer,parameter :: seed = 8645642 
! character:: N, U 
    real*8:: H 
    real :: start, finish 
!  .. Parameters .. 
     INTEGER   N, N_X, N_Y 
     INTEGER   LDA 
     INTEGER   LWMAX 
     PARAMETER  (LWMAX = 1000) 
! 
!  .. Local Scalars .. 
! 
     INTEGER   INFO, LWORK 
! 
!  .. Local Arrays .. 
!  RWORK dimension should be at least MAX(1,3*N-2) 
! 
     DOUBLE PRECISION,ALLOCATABLE,DIMENSION(:):: EIG 
     REAL*8,ALLOCATABLE,DIMENSION(:,:):: F1 
     REAL*8,ALLOCATABLE,DIMENSION(:):: WORK 
     call cpu_time(start) 
     open(1,file='DOUBLE_EXCHANGE.dat') 
     open(2,file='DOUBLE_EXCHANGE.txt') 
! 
! We are considering a 2D square lattice of 3 X 3 
! 
    CALL srand(seed) 
    !! LATTICE DESCRIPTION !! 
    N_X = 2 
    N_Y = 2 
    SIZ = 2 * N_X * N_Y 
    N = SIZ*SIZ 
    LDA = N 
    ! PROGRAM STARTING POINT ! 
    ALLOCATE(F1(SIZ, SIZ), EIG(SIZ), WORK(3*siz-1)) 
    CONT = 1 
    S = (N_X*2)-1 
    M = N_Y-1 
DO P=1,1 
    DO I=0,M 
     DO J=0,S 
     POINT = 1 
      DO K=0,M 
      DO L=0,S 
       IF(I==K .AND. ABS(J-L)==2) THEN 
        Z = -1 

       ELSE IF(J==L .AND. ABS(I-K)==1) THEN 
        Z = -1 

       ELSE IF(J==L .AND. ABS(I-K)==M) THEN 
        Z = -1 

       ELSE IF(I==K .AND. ABS(J-L)==S-1) THEN 
        Z = -1 

       ELSE IF(I==K .AND. J==L) THEN 
        Z = (-1)**POINT 

       ELSE 
        Z = 0         !  Potential  0 
       ENDIF 
      F1(CONT,POINT) = Z 
       POINT = POINT + 1 
      ENDDO 
     ENDDO 
      CONT = CONT + 1 
     ENDDO 
    ENDDO 

    WRITE(1,*) 
! 
     WRITE(1,*),'Displaying Matrix for the given Hamiltonian' 
! 
     DO i=1,SIZ 
      WRITE(1,'(18g15.1)') (F1(i,j), j=1,SIZ) 
     ENDDO 
! 
! 
!  DSYEV Example Program Results 
! 
! ALLOCATE(WORK(SIZ)) 
     WRITE(1,*) 
     LWORK = -1 
     CALL DSYEV('Vectors', 'Upper', SIZ, F1, LDA, Eig, WORK, LWORK, INFO) 

     LWORK = INT(WORK(1)) 

! DEALLOCATE(WORK) 

! ALLOCATE(WORK(LWORK)) 
! 
! Solve eigenproblem. 
! 
     CALL DSYEV('Vectors', 'Upper', SIZ, F1, LDA, Eig, WORK, LWORK, INFO) 
! 
! Checking for convergence. 
! 
     IF(INFO.GT.0) THEN 
      WRITE(*,*)'The algorithm failed to compute eigenvalues.' 
      STOP 
     END IF 
! 
! 
!  Computes all eigenvalues and, optionally, eigenvectors of an 
!  n x n real symmetric matrix A. The eigenvector v(j) of A satisfies 
! 
!    A*v_i(j) = λ(j)*v_i(j) 
! 
! 
     !! Print eigenvalues. !! 
! 
     write(1,*) 
     write(1,*)'Eigenvalues' 
     write(1,*) 
      write(1,'(100g15.5)') (Eig(j), j=1,SIZ) 
! 
     !!  Print eigenvectors. Where ψ_(i)(eqv. F1(i,j)), i-label is for energy and j-label is for site. !! 
! 
     write(1,*) 
     write(1,*)'Orthonormal Eigenvectors (stored columnwise)' 
     write(1,*) 
     do i=1,SIZ 
      write(1,'(100g15.5)') (F1(i,j), j=1,SIZ) 
     end do 
     write(1,*) 

! 
!  Calculation of number operator, ρ(i) at i-th site for n number of electrons 
! 
     WRITE(1,*)'Calculation of number operator, ρ(i) at i-th site' 
! 
!   Considering 3 electrons in the problem 
! 
    k = INT(SIZ/2) 
     CONT = 1 
     L = 1 
    DO I=1,SIZ 
     H = 0D0 
     DO J=1,K 
      H = H + F1(I,J)*F1(I,J)  ! WE ARE CALCULATING Σ_n|ψ_n(i)|^2, Where ψ_n(i) are eigenvectors of i-th site with n-component. 
     ENDDO 
      IF(MOD(I,S) .NE. 0) THEN 
      WRITE(2,'(100g15.5)')L,CONT,H 
      CONT =CONT + 1 

      ELSE 
      WRITE(2,'(100g15.5)')L,CONT,H 
      WRITE(2,*) 
      CONT = 1 
      L = L + 1 
      END IF 
    ENDDO 

     WRITE(1,*) 
     WRITE(1,*) 
     WRITE(1,*) 
ENDDO 
! 900 format (F8.3,F8.3) 
      call cpu_time(finish) 
       print '("Time = ",f6.3," seconds.")',finish-start 
       write(1, '("Time = ",f6.3," seconds.")'),finish-start 
     STOP 
END PROGRAM 

因此,錯誤主要是關於工作的正確初始化。

+0

你嘗試過'-fbacktrace'還是通過調試器運行你的程序? – 2014-09-27 16:23:02

+0

如何通過調試器,我不知道這一點。不是-fbacktrace – 2014-09-27 16:24:36

+0

對於'gdb'使用:'gdb -ex run ./a.out' ... – 2014-09-27 16:25:49

回答

0

感謝您瞭解WORK

但我在我的程序中找出錯誤。問題是因爲我的矩陣F1(siz,siz * siz)大於分配,所以LDA = N(其中,N = siz * siz)的初始化是因爲

所以,我只需要初始化LDA = siz

問題已解決。

3

是的,錯誤是關於WORK。您正在請求並使用來自您的DSYEV工作空間查詢的LWORK的最佳值,但您並未相應地調整WORK的大小。 (你有調整大小的代碼存在,但它被註釋掉了。)

我透過NAG Fortran編譯器跑了-C=all -C=undefined啓用:

Runtime Error: dsyev.f90, line 1: Invalid reference to procedure DSYEV - Dummy array WORK (number 7) has 80 elements but actual argument only has 23 elements

(我不得不針對LAPACK那也曾經鏈接使用-C=undefined構建。)

相關問題