More uspp variables rearrangement (beware undesired side effects!)

qq_spinorb moved into Modules/uspp.f90 as qq_so
dvan => dvan + dvan_so (for spin-orbit only)
PW/clean_pw.f90 replaces PWNC/clean_pw.f90 (PG)


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@945 c92efa57-630b-4861-b058-cf58834340f0
This commit is contained in:
giannozz 2004-06-08 20:00:04 +00:00
parent 595bda9fe8
commit 25ff6785e3
6 changed files with 54 additions and 32 deletions

View File

@ -56,6 +56,7 @@ MODULE uspp
SAVE
PUBLIC :: nlx, lpx, lpl, ap, aainit, indv, nhtol, nhtolm, nkb, vkb, dvan, &
deeq, qq, nhtoj, beta, becsum, deallocate_uspp
PUBLIC :: qq_so, dvan_so!!!, deeq_so,
INTEGER, PARAMETER :: &
nlx = (lmaxx+1)**2, &! maximum number of combined angular momentum
mx = 2*lqmax-1 ! maximum magnetic angular momentum of Q
@ -75,15 +76,22 @@ MODULE uspp
!
COMPLEX(KIND=DP), ALLOCATABLE, TARGET :: &
vkb(:,:) ! all beta functions in reciprocal space
COMPLEX(KIND=DP), ALLOCATABLE :: &
dvan(:,:,:,:), &! the D functions of the solid
deeq(:,:,:,:) ! the integral of V_eff and Q_{nm}
! NB: dvan and deeq are complex because of spin-orbit
REAL(KIND=DP), ALLOCATABLE :: &
dvan(:,:,:,:), &! the D functions of the solid
!!! deeq(:,:,:,:), &! the integral of V_eff and Q_{nm}
becsum(:,:,:), &! \sum_i f(i) <psi(i)|beta_l><beta_m|psi(i)>
qq(:,:,:), &! the q functions in the solid
nhtoj(:,:) ! correspondence n <-> total angular momentum
!
COMPLEX(KIND=DP), ALLOCATABLE :: & ! variables for spin-orbit case:
qq_so(:,:,:,:), &! Q_{nm}
dvan_so(:,:,:,:), &! D_{nm}
deeq(:,:,:,:) ! \int V_{eff}(r) Q_{nm}(r) dr
!
! In a spin-orbit calculations these variable are complex instead of real;
! qq_so has and additional spin index. In order to avoid to make the code
! more complex or slower, separate variables are defined and used
!
REAL(KIND=DP), ALLOCATABLE :: &
beta(:,:,:) ! beta functions for CP (without struct.factor)
!
@ -246,10 +254,13 @@ CONTAINS
IF( ALLOCATED( nhtolm ) ) DEALLOCATE( nhtolm )
IF( ALLOCATED( nhtoj ) ) DEALLOCATE( nhtoj )
IF( ALLOCATED( vkb ) ) DEALLOCATE( vkb )
IF( ALLOCATED( becsum ) ) DEALLOCATE( becsum )
IF( ALLOCATED( qq ) ) DEALLOCATE( qq )
IF( ALLOCATED( dvan ) ) DEALLOCATE( dvan )
IF( ALLOCATED( deeq ) ) DEALLOCATE( deeq )
IF( ALLOCATED( becsum ) ) DEALLOCATE( becsum )
IF( ALLOCATED( qq_so ) ) DEALLOCATE( qq_so )
IF( ALLOCATED( dvan_so ) ) DEALLOCATE( dvan_so )
!! IF( ALLOCATED( deeq_so ) ) DEALLOCATE( deeq_so )
end subroutine deallocate_uspp
end module uspp

View File

@ -34,9 +34,10 @@ subroutine allocate_nlpot
USE ldaU, ONLY: Hubbard_lmax, ns, nsnew
USE wvfct, ONLY: npwx, npw, igk, igk_l2g, g2kin
USE us, ONLY: qrad, tab, tab_at, dq, nqx, nqxq
USE uspp, ONLY: indv, nhtol, nhtolm, qq, dvan, deeq, vkb, nkb, nhtoj, becsum
USE uspp, ONLY: indv, nhtol, nhtolm, qq, dvan, deeq, vkb, nkb, nhtoj, &
becsum, qq_so, dvan_so
USE uspp_param, ONLY: lmaxq, lmaxkb, lll, nbeta, nh, nhm
USE spin_orb, ONLY: lspinorb, qq_spinorb, fcoef
USE spin_orb, ONLY: lspinorb, fcoef
implicit none
!
! a few local variables
@ -83,14 +84,15 @@ subroutine allocate_nlpot
allocate (nhtol(nhm, ntyp))
allocate (nhtolm(nhm, ntyp))
allocate (nhtoj(nhm, ntyp))
allocate (qq( nhm, nhm, ntyp))
allocate (dvan( nhm, nhm, nspin, ntyp))
allocate (deeq( nhm, nhm, nat, nspin))
if (lspinorb) then
allocate (qq_spinorb(nhm, nhm, 4, ntyp))
allocate (qq_so(nhm, nhm, 4, ntyp))
allocate (dvan_so( nhm, nhm, nspin, ntyp))
allocate (fcoef(nhm,nhm,2,2,ntyp))
else
allocate (qq( nhm, nhm, ntyp))
allocate (dvan( nhm, nhm, nspin, ntyp))
endif
!
nqxq = ( (sqrt(gcutm) + sqrt(xqq(1)**2 + xqq(2)**2 + xqq(3)**2) ) &
/ dq + 4) * cell_factor

View File

@ -23,7 +23,7 @@ SUBROUTINE clean_pw()
USE force_mod, ONLY : force
USE scf, ONLY : rho, rho_save,vr, vltot, rho_core, vrs
USE relax, ONLY : if_pos
USE wavefunctions_module, ONLY : evc, psic
USE wavefunctions_module, ONLY : evc, psic, evc_nc, psic_nc
USE us, ONLY : qrad, tab, tab_at
USE uspp, ONLY : deallocate_uspp
USE ldaU, ONLY : ns, nsnew, swfcatom
@ -35,9 +35,9 @@ SUBROUTINE clean_pw()
USE afftnec, ONLY : auxp
#endif
USE fft_types, ONLY : fft_dlay_deallocate
USE spin_orb, ONLY : lspinorb, qq_spinorb, fcoef
USE spin_orb, ONLY : lspinorb, fcoef
USE constraints_module, ONLY : constr, target
USE noncollin_module, ONLY : deallocate_noncol
!
IMPLICIT NONE
!
@ -74,6 +74,7 @@ SUBROUTINE clean_pw()
IF ( ALLOCATED( vnew ) ) DEALLOCATE( vnew )
IF ( ALLOCATED( rho_core ) ) DEALLOCATE( rho_core )
IF ( ALLOCATED( psic ) ) DEALLOCATE( psic )
IF ( ALLOCATED( psic_nc ) ) DEALLOCATE( psic_nc )
IF ( ALLOCATED( vrs ) ) DEALLOCATE( vrs )
IF ( doublegrid ) THEN
IF ( ASSOCIATED( nls ) ) DEALLOCATE( nls )
@ -101,17 +102,20 @@ SUBROUTINE clean_pw()
IF ( ALLOCATED( tab ) ) DEALLOCATE( tab )
IF ( ALLOCATED( tab_at ) ) DEALLOCATE( tab_at )
IF (lspinorb) then
IF ( ALLOCATED( qq_spinorb ) ) DEALLOCATE( qq_spinorb )
IF ( ALLOCATED( fcoef ) ) DEALLOCATE( fcoef )
END IF
!
call deallocate_uspp ()
!
call deallocate_noncol ()
!
! ... arrays allocated in allocate_wfc.f90 ( and never deallocated )
!
IF ( ALLOCATED( et ) ) DEALLOCATE( et )
IF ( ALLOCATED( wg ) ) DEALLOCATE( wg )
IF ( ALLOCATED( evc ) ) DEALLOCATE( evc )
IF ( ALLOCATED( swfcatom ) ) DEALLOCATE( swfcatom )
IF ( ALLOCATED( evc_nc ) ) DEALLOCATE( evc_nc )
!
#ifdef __SX6
!

View File

@ -37,11 +37,11 @@ subroutine init_us_1
USE pseud, ONLY: lloc, lmax
USE lsda_mod, ONLY : nspin
USE us, ONLY: okvan, nqxq, dq, nqx, tab, qrad
USE uspp, ONLY: nhtol, nhtoj, nhtolm, dvan, qq, indv
USE uspp, ONLY: nhtol, nhtoj, nhtolm, dvan, qq, indv, ap, aainit, &
qq_so, dvan_so
USE uspp_param, ONLY: lmaxq, dion, betar, qfunc, qfcoef, rinner, nbeta, &
kkbeta, nqf, nqlc, lll, jjj, lmaxkb, nh, tvanp, nhm
USE uspp, ONLY : ap, aainit
USE spin_orb, ONLY : lspinorb, rot_ylm, qq_spinorb, fcoef
USE spin_orb, ONLY : lspinorb, rot_ylm, fcoef
implicit none
!
! here a few local variables
@ -77,13 +77,12 @@ subroutine init_us_1
allocate (besr( ndm))
allocate (qtot( ndm , nbrx , nbrx))
allocate (ylmk0( lmaxq * lmaxq))
dvan = 0.d0
qq (:,:,:) = 0.d0
ap (:,:,:) = 0.d0
if (lmaxq > 0) qrad(:,:,:,:)= 0.d0
prefr = fpi / omega
if (lspinorb) then
dvan_so = 0.d0
!
! In the spin-orbit case we need the unitary matrix u which rotates the
! real spherical harmonics and yields the complex ones.
@ -102,7 +101,10 @@ subroutine init_us_1
rot_ylm(n,n1+1)=dcmplx(0.d0, sqrt2)
enddo
fcoef=(0.d0,0.d0)
qq_spinorb=(0.d0,0.d0)
qq_so=(0.d0,0.d0)
else
qq (:,:,:) = 0.d0
dvan = 0.d0
endif
!
! For each pseudopotential we initialize the indices nhtol, nhtolm,
@ -169,7 +171,8 @@ subroutine init_us_1
do is1=1,2
do is2=1,2
ijs=ijs+1
dvan(ih,jh,ijs,nt)=dion(vi,vj,nt)*fcoef(ih,jh,is1,is2,nt)
dvan_so(ih,jh,ijs,nt) = dion(vi,vj,nt) * &
fcoef(ih,jh,is1,is2,nt)
if (vi.ne.vj) fcoef(ih,jh,is1,is2,nt)=(0.d0,0.d0)
enddo
enddo
@ -283,8 +286,8 @@ subroutine init_us_1
do is2=1,2
ijs=ijs+1
do is=1,2
qq_spinorb(kh,lh,ijs,nt) = qq_spinorb(kh,lh,ijs,nt) &
+ omega*DREAL(qgm(1))*fcoef(kh,ih,is1,is,nt) &
qq_so(kh,lh,ijs,nt) = qq_so(kh,lh,ijs,nt) &
+ omega*DREAL(qgm(1))*fcoef(kh,ih,is1,is,nt)&
*fcoef(jh,lh,is,is2,nt)
enddo
enddo
@ -307,7 +310,7 @@ subroutine init_us_1
#ifdef __PARA
100 continue
if (lspinorb) then
call reduce ( nhm * nhm * ntyp * 8, qq_spinorb )
call reduce ( nhm * nhm * ntyp * 8, qq_so )
else
call reduce ( nhm * nhm * ntyp, qq )
endif

View File

@ -44,4 +44,13 @@ MODULE noncollin_module
m_loc(:,:) ! local integrated magnetization
! mcons(:,:), ! constrained values for local variables
!
CONTAINS
subroutine deallocate_noncol()
IF ( ALLOCATED( pointlist) ) DEALLOCATE( pointlist )
IF ( ALLOCATED( factlist ) ) DEALLOCATE( factlist )
IF ( ALLOCATED( pointnum ) ) DEALLOCATE( pointnum )
IF ( ALLOCATED( r_loc ) ) DEALLOCATE( r_loc )
IF ( ALLOCATED( m_loc ) ) DEALLOCATE( m_loc )
end subroutine deallocate_noncol
!
END MODULE noncollin_module

View File

@ -574,13 +574,6 @@ MODULE spin_orb
! spherical harmonics into complex ones
COMPLEX (kind=dp), ALLOCATABLE :: fcoef(:,:,:,:,:) ! function needed to
! account for spinors.
COMPLEX (kind=dp),ALLOCATABLE :: qq_spinorb(:,:,:,:) ! the qq coefficients
! in the spin_orbit case. NB: This variable should
! not be necessary, but to introduce an additional
! index in any place where qq is used was too
! cumbersome. As a first step I have introduced
! another variable with the required index
! (ADC 26/3/04)
END MODULE spin_orb
!