!
  !----------------------------------------------------------------
  subroutine eigenstates ( xxk, vr, g2kin, psi, et )
  !----------------------------------------------------------------
  ! 
  ! find occupied eigenstates through conjugate gradients
  !
  !----------------------------------------------------------------
  !
  use parameters
  use constants
  use gspace
  implicit none
  !
  complex(dbl) :: psi(ngm, nbnd_occ), vr (nr)
  real(dbl) :: g2kin (ngm), xxk(3), et(nbnd_occ)
  real(dbl) :: precondition (ngm)
  !
  integer :: ideltag, ig1, ig2, ig3, ik, ig, ierr, ibnd
  real(dbl) :: arg, deltag(3)
  real(kind=DP), allocatable :: eval(:), u(:,:), fv1(:), fv2(:), hk(:,:), ss(:), vs(:)
  logical :: equiv
  integer :: notconv
  real(kind=DP) :: avg_iter
  !
  allocate ( eval(ngm0), u(ngm0,ngm0), fv1(ngm0), fv2(ngm0), & 
    ss(ngm), vs(ngm), hk (ngm0, ngm0) )
  !
  !
  ! STARTING WAVEFUNCTIONS FOR CONJUGATE GRADIENTS FROM DIRECT DIAGONALIZATION
  !
  ! the structure factor
  !
  do ig = 1, ngm
    arg = twopi * ( g(1,ig) * tau( 1, 1) + g(2,ig) * tau( 2, 1) + g(3,ig) * tau( 3, 1) )
    ss (ig) = cos ( arg )
  enddo
  !
  ! the empirical pseudopotential
  !
  vs = zero
  ! integer comparison - careful with other structures
  do ig = 1, ngm
    if     ( int ( gl(igtongl(ig)) ) .eq.  3 ) then
      vs (ig) =  v3
    elseif ( int ( gl(igtongl(ig)) ) .eq.  8 ) then
      vs (ig) =  v8
    elseif ( int ( gl(igtongl(ig)) ) .eq. 11 ) then
      vs (ig) =  v11
    endif
  enddo
  !
  ! the k-dependent kinetic energy in Ry
  ! [Eq. (14) of Ihm,Zunger,Cohen J Phys C 12, 4409 (1979)]
  !
  do ig = 1, ngm
    g2kin(ig) = ( (xxk(1) + g(1,ig))**2.d0 + &
                  (xxk(2) + g(2,ig))**2.d0 + &
                  (xxk(3) + g(3,ig))**2.d0 ) * tpiba2
  enddo
  !
  do ig = 1, ngm0
    hk ( ig, ig) = g2kin ( ig )
  enddo
  !
  do ig1 = 1, ngm0
   do ig2 = ig1+1, ngm0
     !
     ! define ideltag
     ! 
     deltag = g(:,ig1) - g(:,ig2)
     ideltag = 1 
     do while ( .not. equiv ( deltag, g(:,ideltag) ) .and. ideltag.lt.ngm )
       ideltag = ideltag + 1
     enddo   
     !
     if (ideltag.ne.ngm) then
       hk ( ig1, ig2) = ss (ideltag) * vs (ideltag) 
       hk ( ig2, ig1) = hk ( ig1, ig2) 
     endif
     !
   enddo
  enddo
  !
  ! the empirical pseudopotential in real space 
  ! for further use in h_psi
  !
  vr = czero
  do ig = 1, ngm
    vr ( nl ( ig ) ) = dcmplx ( ss (ig) * vs (ig), zero )
  enddo
  call cfft3 ( vr, nr1, nr2, nr3,  1)
  !
  call rs ( ngm0, ngm0, hk, eval, 1, u, fv1, fv2, ierr)
  psi = czero
  do ibnd = 1, nbnd_occ
   do ig = 1, ngm0
      psi(ig,ibnd) = dcmplx ( u(ig,ibnd), zero)
   enddo
  enddo
  !
  ! CONJUGATE GRADIENTS DIAGONALIZATION - OCCUPIED STATES
  !
  precondition = max( 1.d0, g2kin )
  !
  call ccgdiagg (ngm, ngm, nbnd_occ, psi, et, precondition, eps, &
     maxter, .true., notconv, avg_iter, g2kin, vr)
  !
  deallocate ( eval, hk, u, fv1, fv2, ss, vs )
  !
  return
  end subroutine eigenstates
  !----------------------------------------------------------------
  !