!
  !----------------------------------------------------------------
  subroutine ggens ( gcutms )
  !----------------------------------------------------------------
  !
  ! determine G-vectors within the cutoff from the
  ! array already created in ggen
  ! FG - 
  !
  use parameters
  use gspace
  implicit none
  !
  real(kind=DP) :: gcutms
  !
  ! local variables
  !
  integer :: n1, n2, n3, i, j, k, ipol, ng, igl
  !
  do ng = 1, ngm
    if ( gl( igtongl (ng) ) .le. gcutms ) ngms = ng
  enddo
  !
  allocate ( nls(ngms) )
  !
  !     Now set nl with the correct fft correspondence
  !
  do ng = 1, ngms
     ! n1 is going to be i+1, folded to positive when <= 0
     n1 = nint (g (1, ng) * at (1, 1) + g (2, ng) * at (2, 1) + g (3, ng) * at (3, 1) ) + 1
     if (n1.lt.1) n1 = n1 + nr1s
     ! n2 is going to be j+1, folded to positive when <= 0
     n2 = nint (g (1, ng) * at (1, 2) + g (2, ng) * at (2, 2) + g (3, ng) * at (3, 2) ) + 1
     if (n2.lt.1) n2 = n2 + nr2s
     ! n3 is going to be k+1, folded to positive when <= 0
     n3 = nint (g (1, ng) * at (1, 3) + g (2, ng) * at (2, 3) + g (3, ng) * at (3, 3) ) + 1
     if (n3.lt.1) n3 = n3 + nr3s
     !
     if (n1.le.nr1s.and.n2.le.nr2s.and.n3.le.nr3s) then
       nls (ng) = n1 + (n2 - 1) * nr1s + (n3 - 1) * nr1s * nr2s
     else
        call error('ggens','Mesh too small?',ng)
     endif
  enddo
  !
  write(6,'(4x,"ngms = ",i10)') ngms
  !
  ! total number of real-space grid points
  !
  nrs = nr1s * nr2s * nr3s
  write(6,'(4x,"nr1s = ",i10)') nr1s
  write(6,'(4x,"nr2s = ",i10)') nr2s
  write(6,'(4x,"nr3s = ",i10)') nr3s
  write(6,'(4x,"nrs  = ",i10)') nrs
  !
  end subroutine ggens
  !