Программа получила сигнал SIGSEGV: ошибка сегментации — неверная ссылка на память. Обратная трассировка этой ошибки:

Я скомпилировал программу fortran 95 в Ubuntu 14.04. При запуске я получил следующую ошибку: это отличается от: (1)

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

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

я даже пытался

gfortran -g -fcheck=all -Стена 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

Таким образом, ошибка в основном связана с правильной инициализацией WORK.


person L.K.    schedule 27.09.2014    source источник
comment
Вы пробовали -fbacktrace или запускали свою программу через отладчик?   -  person Alexander Vogt    schedule 27.09.2014
comment
Как через отладчик, этого я не знаю. Не -fbacktrace   -  person L.K.    schedule 27.09.2014
comment
Для gdb использования: gdb -ex run ./a.out...   -  person Alexander Vogt    schedule 27.09.2014
comment
Я получил это, я не знаю об этом. Программа получила сигнал SIGSEGV, Ошибка сегментации. 0x00007ffff6fdebaf в _int_free (av=0x7ffff731e760 ‹main_arena›, p= ‹оптимизировано›, have_lock=0) в malloc.c:3996 3996 malloc.c: Нет такого файла или каталога. (gdb) Выйти   -  person L.K.    schedule 27.09.2014
comment
Вы использовали -g для компиляции кода?   -  person Alexander Vogt    schedule 27.09.2014
comment
Возможно, Вы имели в виду это: gfortran -fbacktrace -g DoubExch.f95 -lblas -llapack   -  person L.K.    schedule 27.09.2014
comment
Давайте продолжим обсуждение в чате.   -  person L.K.    schedule 27.09.2014
comment
Я мало что знаю, не могли бы вы помочь мне в этом вопросе. Это важная программа, которая ставит меня в тупик. Я много пробовал, потратил много времени, но ничего не добился. Пожалуйста, учтите это.   -  person L.K.    schedule 27.09.2014
comment
Вы пытались использовать valgrind?   -  person Stefan    schedule 27.09.2014
comment
@Стефан, я не знаю об этом, спасибо за информацию.   -  person L.K.    schedule 28.09.2014
comment
Вы пробовали и -g, и -fbacktrace, и -fcheck=all -Wall ? Что значит не получилось? Я успешно отлаживал многие программы с этими параметрами и с помощью valgrind.   -  person Vladimir F    schedule 28.09.2014


Ответы (2)


Да, ошибка о WORK. Вы запрашиваете и используете оптимальное значение LWORK из запроса рабочей области DSYEV, но не изменяете размер 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.)

person MatCross    schedule 29.09.2014

Спасибо за знание WORK.

Но я разбираюсь с ошибкой, в моей программе. Проблема была из-за инициализации LDA = N(где, N = siz*siz), в результате моя матрица F1(siz,siz*siz) больше, чем распределение.

Итак, мне просто нужно инициализировать LDA = siz.

Проблема была решена.

person L.K.    schedule 30.09.2014