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 SAVE
PUBLIC :: nlx, lpx, lpl, ap, aainit, indv, nhtol, nhtolm, nkb, vkb, dvan, & PUBLIC :: nlx, lpx, lpl, ap, aainit, indv, nhtol, nhtolm, nkb, vkb, dvan, &
deeq, qq, nhtoj, beta, becsum, deallocate_uspp deeq, qq, nhtoj, beta, becsum, deallocate_uspp
PUBLIC :: qq_so, dvan_so!!!, deeq_so,
INTEGER, PARAMETER :: & INTEGER, PARAMETER :: &
nlx = (lmaxx+1)**2, &! maximum number of combined angular momentum nlx = (lmaxx+1)**2, &! maximum number of combined angular momentum
mx = 2*lqmax-1 ! maximum magnetic angular momentum of Q mx = 2*lqmax-1 ! maximum magnetic angular momentum of Q
@ -75,15 +76,22 @@ MODULE uspp
! !
COMPLEX(KIND=DP), ALLOCATABLE, TARGET :: & COMPLEX(KIND=DP), ALLOCATABLE, TARGET :: &
vkb(:,:) ! all beta functions in reciprocal space 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 :: & 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)> becsum(:,:,:), &! \sum_i f(i) <psi(i)|beta_l><beta_m|psi(i)>
qq(:,:,:), &! the q functions in the solid qq(:,:,:), &! the q functions in the solid
nhtoj(:,:) ! correspondence n <-> total angular momentum 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 :: & REAL(KIND=DP), ALLOCATABLE :: &
beta(:,:,:) ! beta functions for CP (without struct.factor) beta(:,:,:) ! beta functions for CP (without struct.factor)
! !
@ -246,10 +254,13 @@ CONTAINS
IF( ALLOCATED( nhtolm ) ) DEALLOCATE( nhtolm ) IF( ALLOCATED( nhtolm ) ) DEALLOCATE( nhtolm )
IF( ALLOCATED( nhtoj ) ) DEALLOCATE( nhtoj ) IF( ALLOCATED( nhtoj ) ) DEALLOCATE( nhtoj )
IF( ALLOCATED( vkb ) ) DEALLOCATE( vkb ) IF( ALLOCATED( vkb ) ) DEALLOCATE( vkb )
IF( ALLOCATED( becsum ) ) DEALLOCATE( becsum )
IF( ALLOCATED( qq ) ) DEALLOCATE( qq ) IF( ALLOCATED( qq ) ) DEALLOCATE( qq )
IF( ALLOCATED( dvan ) ) DEALLOCATE( dvan ) IF( ALLOCATED( dvan ) ) DEALLOCATE( dvan )
IF( ALLOCATED( deeq ) ) DEALLOCATE( deeq ) 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 subroutine deallocate_uspp
end module uspp end module uspp

View File

@ -34,9 +34,10 @@ subroutine allocate_nlpot
USE ldaU, ONLY: Hubbard_lmax, ns, nsnew USE ldaU, ONLY: Hubbard_lmax, ns, nsnew
USE wvfct, ONLY: npwx, npw, igk, igk_l2g, g2kin USE wvfct, ONLY: npwx, npw, igk, igk_l2g, g2kin
USE us, ONLY: qrad, tab, tab_at, dq, nqx, nqxq 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 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 implicit none
! !
! a few local variables ! a few local variables
@ -83,14 +84,15 @@ subroutine allocate_nlpot
allocate (nhtol(nhm, ntyp)) allocate (nhtol(nhm, ntyp))
allocate (nhtolm(nhm, ntyp)) allocate (nhtolm(nhm, ntyp))
allocate (nhtoj(nhm, ntyp)) allocate (nhtoj(nhm, ntyp))
allocate (qq( nhm, nhm, ntyp))
allocate (dvan( nhm, nhm, nspin, ntyp))
allocate (deeq( nhm, nhm, nat, nspin)) allocate (deeq( nhm, nhm, nat, nspin))
if (lspinorb) then 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)) allocate (fcoef(nhm,nhm,2,2,ntyp))
else
allocate (qq( nhm, nhm, ntyp))
allocate (dvan( nhm, nhm, nspin, ntyp))
endif endif
! !
nqxq = ( (sqrt(gcutm) + sqrt(xqq(1)**2 + xqq(2)**2 + xqq(3)**2) ) & nqxq = ( (sqrt(gcutm) + sqrt(xqq(1)**2 + xqq(2)**2 + xqq(3)**2) ) &
/ dq + 4) * cell_factor / dq + 4) * cell_factor

View File

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

View File

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

View File

@ -44,4 +44,13 @@ MODULE noncollin_module
m_loc(:,:) ! local integrated magnetization m_loc(:,:) ! local integrated magnetization
! mcons(:,:), ! constrained values for local variables ! 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 END MODULE noncollin_module

View File

@ -574,13 +574,6 @@ MODULE spin_orb
! spherical harmonics into complex ones ! spherical harmonics into complex ones
COMPLEX (kind=dp), ALLOCATABLE :: fcoef(:,:,:,:,:) ! function needed to COMPLEX (kind=dp), ALLOCATABLE :: fcoef(:,:,:,:,:) ! function needed to
! account for spinors. ! 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 END MODULE spin_orb
! !