Recuring error with dstev (Lapack & f90 newbie...)

Post here if you have a question about linking your program with LAPACK or ScaLAPACK library

Recuring error with dstev (Lapack & f90 newbie...)

Postby Schrall » Fri Apr 15, 2011 4:21 am

Hello everybody

As said in the title, I'm new in fortran and lapack as well, so I hope that my question will not be too trivial.
Anyway, I'm banging my head on that particular problem since two days and google was not helpful this time therefore I'm here.
The code which I have problem with is the following (cleaned a bit for readability):
Code: Select all
program hubbard_1D
implicit none
!variables
  double precision :: n,mz,U,t
  !real :: y
  integer :: site,Hsize,i,j
  double precision, dimension (:,:), allocatable :: Hamilt,Heigvec
  double precision, dimension (:), allocatable :: Hdiag,Hoffdiag,Heigval
!program
  write (*,*) "********************"
  write (*,*) "* 1D Hubbard Model *"
  write (*,*) "********************"
  write (*,*)
  n = 4.
  mz = 2.
  U = 2.
  t = 1.

!Hamiltonian Matrix creation
  allocate ( Hamilt ( Hsize , Hsize ) )
  allocate ( Hdiag ( Hsize ) )
  allocate ( Hoffdiag ( Hsize - 1 ) )
  do i = 1,Hsize
    do j = 1,Hsize
      if (i == j) then
        Hamilt(i,j) = U*(n+(-1)**i*mz)/2
      else if ((i == j+1) .or. (i == j-1)) then
        Hamilt(i,j) = -t
      else
        Hamilt(i,j) = 0.
      end if
    end do
  end do

  do i = 1,Hsize
    Hdiag(i) = Hamilt(i,i)
  end do
 
  do i = 1,(Hsize - 1)
    Hoffdiag(i) = Hamilt(i,i+1)
  end do

!Call Lapack routine dstev : eigenvect+eigenval of tridiagonal matrix
  call diatri(Hdiag,Hoffdiag,Heigval,Heigvec,Hsize)
 
  write (*,*) "Eigenvalue list:",Heigval
 
  deallocate ( Hamilt )
  deallocate ( Hdiag )
  deallocate ( Hoffdiag )

end program hubbard_1D


!---------------------------------------------------------!
!Diagonalization of a real symmetric tridiagonal matrix   !
!---------------------------------------------------------!
!input:  a(n)     = diagonal matrix elements              !
!        b(n)     = off-diagonal matrix elements          !
!        n        = size of the matrix                    !
!output: eig(n)   = eigenvalues in ascending order        !
!        vec(n,n) = eigenvectors                          !
!---------------------------------------------------------!
!Uses the LAPACK subroutine DSTEV                         !
!---------------------------------------------------------!
 subroutine diatri(a,b,eig,vec,n)
!-------------------------------!
 implicit none
 
 integer :: n,inf
 real(8) :: a(n),b(n),d(n),e(n),eig(n),vec(n,n),work(max(1,2*n-2))
 
 d=a
 e=b
 call dstev('V',n,d,e,vec,n,work,inf)
 eig=d
 
 end subroutine diatri
!---------------------!


As you can see, I stole the subroutine calling dstev on the net, assuming that it will work better that the one I first wrote (not included in the previous lines).
Apparently it is not the problem.

I compiled this code on at least two different machines (mac OSX using -framework vecLib OR direct -llapack - lblas option ; and a small Unix cluster) using two different compilers (g95 or gfortran) and I don't get errors at compilation time.
BUT
when I execute the program, I get a segfault. I traced it to the call of dstev and...I'm stuck ! No idea what the problem is !

Any help will be warmly welcomed.

Thanks,

Schrall
Schrall
 
Posts: 2
Joined: Fri Apr 15, 2011 3:57 am

Re: Recuring error with dstev (Lapack & f90 newbie...)

Postby Schrall » Sun Apr 17, 2011 10:48 pm

Ok, I finally found out the problem.
I simply forgot to allocate Heigvec and Heigval.

Therefore, my apologies for this post unrelated to Lapack.
Schrall
 
Posts: 2
Joined: Fri Apr 15, 2011 3:57 am


Return to Linking Problem

Who is online

Users browsing this forum: Bing [Bot] and 2 guests