Я скомпилировал программу 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.
-fbacktrace
или запускали свою программу через отладчик? - person Alexander Vogt   schedule 27.09.2014gdb
использования:gdb -ex run ./a.out
... - person Alexander Vogt   schedule 27.09.2014-g
для компиляции кода? - person Alexander Vogt   schedule 27.09.2014valgrind
? - person Stefan   schedule 27.09.2014-g
, и-fbacktrace
, и-fcheck=all -Wall
? Что значит не получилось? Я успешно отлаживал многие программы с этими параметрами и с помощью valgrind. - person Vladimir F   schedule 28.09.2014