quantum-espresso/flib/sort_gvec.f90

67 lines
1.7 KiB
Fortran

!
! Copyright (C) 2001 PWSCF group
! This file is distributed under the terms of the
! GNU General Public License. See the file `License'
! in the root directory of the present distribution,
! or http://www.gnu.org/copyleft/gpl.txt .
!
!
!---------------------------------------------------------------------
subroutine sort_gvec( ng, g2, mill )
!---------------------------------------------------------------------
!
! first the input variables
!
use kinds, ONLY: dbl
use constants, ONLY: eps8
implicit none
INTEGER, INTENT(IN) :: ng
REAL(dbl) :: g2( ng )
INTEGER :: mill( 3, ng )
REAL(dbl), ALLOCATABLE :: gsort( : )
INTEGER, ALLOCATABLE :: index( : )
INTEGER :: ig, icurr, it, im
REAL(dbl) :: gsq
ALLOCATE( gsort( ng ) )
ALLOCATE( index( ng ) )
DO ig = 1, ng
IF ( g2(ig) > eps8 ) THEN
gsort(ig) = g2(ig)
ELSE
gsort(ig) = 0.d0
END IF
END DO
index(1) = 0
CALL hpsort_eps( ng, gsort( 1 ), index( 1 ), eps8 )
! ... sort indices accordingly
DO ig = 1, ng-1
icurr = ig
30 IF( index(icurr) /= ig ) THEN
! ... swap g-vec indices
im = mill(1,icurr); mill(1,icurr) = mill(1,index(icurr)); mill(1,index(icurr)) = im
im = mill(2,icurr); mill(2,icurr) = mill(2,index(icurr)); mill(2,index(icurr)) = im
im = mill(3,icurr); mill(3,icurr) = mill(3,index(icurr)); mill(3,index(icurr)) = im
! ... swap modules
gsq = g2( icurr ); g2( icurr ) = g2( index(icurr) ); g2( index(icurr) ) = gsq
! ... swap indices
it = icurr; icurr = index(icurr); index(it) = it
IF( index(icurr) == ig ) THEN
index(icurr) = icurr
ELSE
GOTO 30
END IF
END IF
END DO
DEALLOCATE( gsort )
DEALLOCATE( index )
return
end subroutine