- FPMD/CP ortho subroutines merged as much as possible.

- Many ortho auxiliary functions (tauset, rhoset, sigset, calphi, updatc)
  are now in common between FPMD/CP, and moved to module ortho_base.f90
- In FPMD, three index vectors, related to real space like charge and potential
  have been substituted with single index vector like in CP, for compatibility
  and efficiency.
- Bug fix in pwtools/matdyn.f90 a logical variable was used in place of a
  character variable


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@2694 c92efa57-630b-4861-b058-cf58834340f0
This commit is contained in:
cavazzon 2006-01-10 14:04:13 +00:00
parent e0a17780ba
commit 1a6b00bbb6
56 changed files with 2415 additions and 3898 deletions

View File

@ -25,7 +25,7 @@
use energies, only: eht, epseu, exc, etot, eself, enl, ekin, & use energies, only: eht, epseu, exc, etot, eself, enl, ekin, &
& atot, entropy, egrand & atot, entropy, egrand
use electrons_base, only: f, nspin, nel, iupdwn, nupdwn, nudx, nelt, & use electrons_base, only: f, nspin, nel, iupdwn, nupdwn, nudx, nelt, &
nx => nbspx, n => nbsp, ispin => fspin nx => nbspx, n => nbsp, ispin
use ensemble_dft, only: tens, tgrand, ninner, ismear, etemp, ef, & use ensemble_dft, only: tens, tgrand, ninner, ismear, etemp, ef, &
& tdynz, tdynf, zmass, fmass, fricz, fricf, z0, c0diag, & & tdynz, tdynf, zmass, fmass, fricz, fricf, z0, c0diag, &
@ -74,6 +74,7 @@
berry_energy, ctabin, gqq, gqqm, df, pberryel berry_energy, ctabin, gqq, gqqm, df, pberryel
use mp, only: mp_sum,mp_bcast use mp, only: mp_sum,mp_bcast
use cp_electronic_mass, ONLY : emass_cutoff use cp_electronic_mass, ONLY : emass_cutoff
use orthogonalize_base, ONLY : calphi
! !
implicit none implicit none
@ -143,7 +144,8 @@
!calculates phi for pcdaga !calculates phi for pcdaga
call calphiid(c0,bec,betae,phi) ! call calphiid(c0,bec,betae,phi)
CALL calphi( c0, SIZE(c0,1), bec, nhsa, betae, phi, n )
!calculates the factors for S and K inversion in US case !calculates the factors for S and K inversion in US case
if(nvb.gt.0) then if(nvb.gt.0) then
@ -694,7 +696,8 @@
call calbec (1,nsp,eigr,c0,bec) call calbec (1,nsp,eigr,c0,bec)
!calculates phi for pc_daga !calculates phi for pc_daga
call calphiid(c0,bec,betae,phi) !call calphiid(c0,bec,betae,phi)
CALL calphi( c0, SIZE(c0,1), bec, nhsa, betae, phi, n )
!======================================================================= !=======================================================================
! !

View File

@ -6,93 +6,6 @@
! or http://www.gnu.org/copyleft/gpl.txt . ! or http://www.gnu.org/copyleft/gpl.txt .
! !
#include "f_defs.h" #include "f_defs.h"
!-------------------------------------------------------------------------
subroutine calphiid(c0,bec,betae,phi)
!-----------------------------------------------------------------------
! input: c0 (orthonormal with s(r(t)), bec=<c0|beta>, betae=|beta>
! computes the matrix phi (with the old positions)
! where |phi> = s'|c0> = |c0> + sum q_ij |i><j|c0>
! where s'=s(r(t))
!
use ions_base, only: na, nsp
use io_global, only: stdout
use cvan
use uspp_param, only: nh
use uspp, only :nhsa=>nkb, nhsavb=>nkbus, qq
use electrons_base, only: n => nbsp
use gvecw, only: ngw
use constants, only: pi, fpi
use control_flags, only: iprint, iprsta
use mp, only: mp_sum
!
implicit none
complex(8) c0(ngw,n), phi(ngw,n), betae(ngw,nhsa)
real(8) bec(nhsa,n) ,emtot
! local variables
integer is, iv, jv, ia, inl, jnl, i, j
real(8) qtemp(nhsavb,n) ! automatic array
!
phi(1:ngw,1:n) = 0.0d0
!
if (nvb.gt.0) then
qtemp = 0.0d0
do is=1,nvb
do iv=1,nh(is)
do jv=1,nh(is)
if(abs(qq(iv,jv,is)).gt.1.e-5) then
do ia=1,na(is)
inl=ish(is)+(iv-1)*na(is)+ia
jnl=ish(is)+(jv-1)*na(is)+ia
do i=1,n
qtemp(inl,i) = qtemp(inl,i) + &
& qq(iv,jv,is)*bec(jnl,i)
end do
end do
endif
end do
end do
end do
!
call MXMA &
& (betae,1,2*ngw,qtemp,1,nhsavb,phi,1,2*ngw,2*ngw,nhsavb,n)
end if
!
do j=1,n
do i=1,ngw
phi(i,j)=(phi(i,j)+c0(i,j))
end do
end do
! =================================================================
if(iprsta.gt.2) then
emtot=0.
do j=1,n
do i=1,ngw
emtot=emtot &
& +2.*DBLE(phi(i,j)*CONJG(c0(i,j)))
end do
end do
emtot=emtot/n
call mp_sum(emtot)
WRITE( stdout,*) 'in calphi sqrt(emtot)=',sqrt(emtot)
WRITE( stdout,*)
do is=1,nsp
if(nsp.gt.1) then
WRITE( stdout,'(33x,a,i4)') ' calphi: bec (is)',is
WRITE( stdout,'(8f9.4)') &
& ((bec(ish(is)+(iv-1)*na(is)+1,i),iv=1,nh(is)),i=1,n)
else
do ia=1,na(is)
WRITE( stdout,'(33x,a,i4)') ' calphi: bec (ia)',ia
WRITE( stdout,'(8f9.4)') &
& ((bec(ish(is)+(iv-1)*na(is)+ia,i),iv=1,nh(is)),i=1,n)
end do
end if
end do
endif
!
return
end subroutine calphiid
!----------------------------------------------------------------------- !-----------------------------------------------------------------------
@ -176,44 +89,26 @@
! !
use parallel_toolkit, only: dspev_drv use parallel_toolkit, only: dspev_drv
implicit none implicit none
integer nx,n,naux,ndim,iopt,iflag,k,i,j,info integer nx,n,ndim,iflag,k,i,j
real(8) dval(n) real(8) dval(n)
real(8) amat(nx,n), dvec(nx,n) real(8) amat(nx,n), dvec(nx,n)
real(8), allocatable:: ap(:) real(8), allocatable:: ap(:)
real(8), allocatable:: aux(:)
ndim=(n*(n+1))/2 ndim=(n*(n+1))/2
naux=3*n
allocate(ap(ndim)) allocate(ap(ndim))
allocate(aux(naux))
ap(:)=0.d0 ap(:)=0.d0
aux(:)=0.d0
if (iflag.eq.1) then
iopt=1
else if (iflag.eq.0) then
iopt=0
else
write(*,*) 'ERROR: diag, iflag not allowed'
stop
end if
k=0 k=0
do j=1,n do j=1,n
do i=1,j do i=1,j
k=k+1 k=k+1
! ap(i + (j-1)*j/2)=amat(i,j)
ap(k)=amat(i,j) ap(k)=amat(i,j)
end do end do
end do end do
CALL dspev_drv( 'V', 'U', n, ap, dval, dvec, nx ) CALL dspev_drv( 'V', 'U', n, ap, dval, dvec, nx )
if(info.ne.0) write(6,*) 'Problems with ddiag'
deallocate(ap) deallocate(ap)
deallocate(aux)
return return
end subroutine ddiag end subroutine ddiag
@ -293,7 +188,7 @@ subroutine pc2(a,beca,b,becb)
use control_flags, only: iprint, iprsta use control_flags, only: iprint, iprsta
use reciprocal_vectors, only: ng0 => gstart use reciprocal_vectors, only: ng0 => gstart
use mp, only: mp_sum use mp, only: mp_sum
use electrons_base, only: n => nbsp, fspin use electrons_base, only: n => nbsp, ispin
use uspp_param, only: nh use uspp_param, only: nh
use uspp, only :nhsa=>nkb use uspp, only :nhsa=>nkb
use uspp, only :qq use uspp, only :qq
@ -312,7 +207,7 @@ subroutine pc2(a,beca,b,becb)
if (ng0.eq.2) then if (ng0.eq.2) then
b(1,i)=0.5d0*(b(1,i)+CONJG(b(1,i))) b(1,i)=0.5d0*(b(1,i)+CONJG(b(1,i)))
endif endif
if(fspin(j) == fspin(i)) then if(ispin(j) == ispin(i)) then
do ig=1,ngw !loop on g vectors do ig=1,ngw !loop on g vectors
sca=sca+2.d0*DBLE(CONJG(a(ig,j))*b(ig,i)) !2. for real wavefunctions sca=sca+2.d0*DBLE(CONJG(a(ig,j))*b(ig,i)) !2. for real wavefunctions
enddo enddo
@ -369,7 +264,7 @@ subroutine pc2(a,beca,b,becb)
use control_flags, only: iprint, iprsta use control_flags, only: iprint, iprsta
use reciprocal_vectors, only: ng0 => gstart use reciprocal_vectors, only: ng0 => gstart
use mp, only: mp_sum use mp, only: mp_sum
use electrons_base, only: n => nbsp, fspin use electrons_base, only: n => nbsp, ispin
use uspp_param, only: nh use uspp_param, only: nh
use uspp, only :nhsa=>nkb use uspp, only :nhsa=>nkb
@ -387,7 +282,7 @@ subroutine pc2(a,beca,b,becb)
if (ng0.eq.2) then if (ng0.eq.2) then
b(1,i)=0.5d0*(b(1,i)+CONJG(b(1,i))) b(1,i)=0.5d0*(b(1,i)+CONJG(b(1,i)))
endif endif
if(fspin(i) == fspin(j)) then if(ispin(i) == ispin(j)) then
do ig=1,ngw !loop on g vectors do ig=1,ngw !loop on g vectors
sca=sca+2.*DBLE(CONJG(a(ig,j))*b(ig,i)) !2. for real weavefunctions sca=sca+2.*DBLE(CONJG(a(ig,j))*b(ig,i)) !2. for real weavefunctions
enddo enddo
@ -422,7 +317,7 @@ subroutine pc2(a,beca,b,becb)
use control_flags, only: iprint, iprsta use control_flags, only: iprint, iprsta
use reciprocal_vectors, only: ng0 => gstart use reciprocal_vectors, only: ng0 => gstart
use mp, only: mp_sum, mp_bcast use mp, only: mp_sum, mp_bcast
use electrons_base, only: n => nbsp, fspin use electrons_base, only: n => nbsp, ispin
use uspp_param, only: nh use uspp_param, only: nh
use uspp, only :nhsa=>nkb,qq, nhsavb=>nkbus use uspp, only :nhsa=>nkb,qq, nhsavb=>nkbus
use io_global, ONLY: ionode, ionode_id use io_global, ONLY: ionode, ionode_id
@ -535,7 +430,7 @@ subroutine pc2(a,beca,b,becb)
use control_flags, only: iprint, iprsta use control_flags, only: iprint, iprsta
use reciprocal_vectors, only: ng0 => gstart use reciprocal_vectors, only: ng0 => gstart
use mp, only: mp_sum, mp_bcast use mp, only: mp_sum, mp_bcast
use electrons_base, only: n => nbsp, fspin use electrons_base, only: n => nbsp, ispin
use uspp_param, only: nh use uspp_param, only: nh
use uspp, only :nhsa=>nkb,qq,nhsavb=>nkbus use uspp, only :nhsa=>nkb,qq,nhsavb=>nkbus
use io_global, ONLY: ionode, ionode_id use io_global, ONLY: ionode, ionode_id

View File

@ -32,7 +32,7 @@
! end of module-scope declarations ! end of module-scope declarations
! ---------------------------------------------- ! ----------------------------------------------
PUBLIC :: checkrho, rhoofr, gradrho PUBLIC :: rhoofr, gradrho
!=----------------------------------------------------------------------=! !=----------------------------------------------------------------------=!
CONTAINS CONTAINS
@ -44,73 +44,6 @@
RETURN RETURN
END SUBROUTINE charge_density_closeup END SUBROUTINE charge_density_closeup
! !
!=----------------------------------------------------------------------=!
SUBROUTINE checkrho(rhoe, desc, rsum, omega)
!=----------------------------------------------------------------------=!
! This Subroutine checks the value of the charge density integral
! that should be equal to the total charge
USE constants, ONLY: rhothr
USE mp_global, ONLY: group, root, mpime
USE io_global, ONLY: ionode, stdout
USE mp, ONLY: mp_sum
USE charge_types, ONLY: charge_descriptor
IMPLICIT NONE
REAL(DP), INTENT(IN) :: omega
REAL(DP) :: rsum(:)
REAL(DP), INTENT(IN) :: rhoe(:,:,:,:)
TYPE (charge_descriptor), INTENT(IN) :: desc
REAL(DP) :: rsum1
INTEGER :: i, j, k, ispin, nspin, nr1, nr2, nr3, ierr
INTEGER :: nxl, nyl, nzl
nr1 = desc%nx
nr2 = desc%ny
nr3 = desc%nz
nxl = desc%nxl
nyl = desc%nyl
nzl = desc%nzl
nspin = desc%nspin
! ... recompute the integral of the charge density (for checking purpose)
DO ispin = 1, nspin
rsum1 = SUM( rhoe( 1:nxl, 1:nyl, 1:nzl, ispin ) )
rsum1 = rsum1 * omega / DBLE( nr1 * nr2 * nr3 )
! ... sum over all processors
CALL mp_sum( rsum1, group )
CALL mp_sum( rsum(ispin), group )
! ... write result (only processor 0)
IF( ionode ) THEN
WRITE( stdout,1) rsum(ispin), rsum1
! ... issue a warning if the result has changed
IF( ABS( rsum(ispin) - rsum1 ) > rhothr ) WRITE( stdout,100)
END IF
END DO
1 FORMAT(//,3X,'Total integrated electronic density',/ &
& ,3X,'in G-space =',F11.6,4X,'in R-space =',F11.6)
100 FORMAT('** WARNING: CHARGE DENSITY **')
RETURN
!=----------------------------------------------------------------------=!
END SUBROUTINE checkrho
!=----------------------------------------------------------------------=!
REAL(DP) FUNCTION dft_total_charge( ispin, c, cdesc, fi ) REAL(DP) FUNCTION dft_total_charge( ispin, c, cdesc, fi )
@ -166,7 +99,7 @@
!=----------------------------------------------------------------------=! !=----------------------------------------------------------------------=!
! BEGIN manual ! BEGIN manual
SUBROUTINE rhoofr (nfi, c0, cdesc, fi, rhoe, desc, box) SUBROUTINE rhoofr (nfi, c0, cdesc, fi, rhoe, box)
! this routine computes: ! this routine computes:
! rhoe = normalized electron density in real space ! rhoe = normalized electron density in real space
@ -198,11 +131,12 @@
USE turbo, ONLY: tturbo, nturbo, turbo_states, allocate_turbo USE turbo, ONLY: tturbo, nturbo, turbo_states, allocate_turbo
USE cell_module, ONLY: boxdimensions USE cell_module, ONLY: boxdimensions
USE wave_types, ONLY: wave_descriptor USE wave_types, ONLY: wave_descriptor
USE charge_types, ONLY: charge_descriptor
USE io_global, ONLY: stdout, ionode USE io_global, ONLY: stdout, ionode
USE control_flags, ONLY: force_pairing, iprint USE control_flags, ONLY: force_pairing, iprint
USE parameters, ONLY: nspinx USE parameters, ONLY: nspinx
USE brillouin, ONLY: kpoints, kp USE brillouin, ONLY: kpoints, kp
USE grid_dimensions, ONLY: nr1, nr2, nr3, nr1x, nr2x, nnrx
IMPLICIT NONE IMPLICIT NONE
@ -213,32 +147,23 @@
COMPLEX(DP) :: c0(:,:,:,:) COMPLEX(DP) :: c0(:,:,:,:)
TYPE (boxdimensions), INTENT(IN) :: box TYPE (boxdimensions), INTENT(IN) :: box
REAL(DP), INTENT(IN) :: fi(:,:,:) REAL(DP), INTENT(IN) :: fi(:,:,:)
REAL(DP), INTENT(OUT) :: rhoe(:,:,:,:) REAL(DP), INTENT(OUT) :: rhoe(:,:)
TYPE (charge_descriptor), INTENT(IN) :: desc
TYPE (wave_descriptor), INTENT(IN) :: cdesc TYPE (wave_descriptor), INTENT(IN) :: cdesc
! ... declare other variables ! ... declare other variables
INTEGER :: i, is1, is2, j, k, ib, ik, nb, nxl, nyl, nzl, ispin INTEGER :: i, is1, is2, j, k, ib, ik, nb, ispin
INTEGER :: nr1x, nr2x, nr3x, nspin, nbnd, nnr INTEGER :: nspin, nbnd, nnr
REAL(DP) :: r2, r1, coef3, coef4, omega, rsumg( nspinx ), rsumgs REAL(DP) :: r2, r1, coef3, coef4, omega, rsumg( nspinx ), rsumgs
REAL(DP) :: fact, rsumr( nspinx ) REAL(DP) :: fact, rsumr( nspinx )
REAL(DP), ALLOCATABLE :: rho(:,:,:) COMPLEX(DP), ALLOCATABLE :: psi2(:)
COMPLEX(DP), ALLOCATABLE :: psi2(:,:,:)
INTEGER :: ierr, ispin_wfc INTEGER :: ierr, ispin_wfc
LOGICAL :: ttprint LOGICAL :: ttprint
! ... end of declarations ! ... end of declarations
! ---------------------------------------------- ! ----------------------------------------------
nxl = dfftp%nr1 nnr = dfftp%nr1x * dfftp%nr2x * dfftp%npl
nyl = dfftp%nr2
nzl = dfftp%npl
nnr = dfftp%nr1 * dfftp%nr2 * dfftp%nr3
nr1x = dfftp%nr1x
nr2x = dfftp%nr2x
nr3x = dfftp%npl
omega = box%deth omega = box%deth
@ -250,29 +175,20 @@
ttprint = .FALSE. ttprint = .FALSE.
IF( nfi == 0 .or. mod( nfi, iprint ) == 0 ) ttprint = .TRUE. IF( nfi == 0 .or. mod( nfi, iprint ) == 0 ) ttprint = .TRUE.
! ... Check consistensy of the charge density grid and fft grid ALLOCATE( psi2( nnrx ), STAT=ierr )
IF( SIZE( rhoe, 1 ) < nxl ) &
CALL errore(' rhoofr ', ' wrong X dimension for rhoe ',1)
IF( SIZE( rhoe, 2 ) < nyl ) &
CALL errore(' rhoofr ', ' wrong Y dimension for rhoe ',1)
IF( SIZE( rhoe, 3 ) < nzl ) &
CALL errore(' rhoofr ', ' wrong Z dimension for rhoe ',1)
ALLOCATE( psi2( nr1x, nr2x, nr3x ), STAT=ierr )
IF( ierr /= 0 ) CALL errore(' rhoofr ', ' allocating psi2 ', ABS(ierr) ) IF( ierr /= 0 ) CALL errore(' rhoofr ', ' allocating psi2 ', ABS(ierr) )
ALLOCATE( rho( nr1x, nr2x, nr3x ), STAT=ierr )
IF( ierr /= 0 ) CALL errore(' rhoofr ', ' allocating rho ', ABS(ierr) )
IF( tturbo ) THEN IF( tturbo ) THEN
! !
! ... if tturbo=.TRUE. some data is stored in memory instead of being ! ... if tturbo=.TRUE. some data is stored in memory instead of being
! ... recalculated (see card 'TURBO') ! ... recalculated (see card 'TURBO')
! !
CALL allocate_turbo( dfftp%nr1x, dfftp%nr2x, dfftp%npl ) CALL allocate_turbo( nnrx )
END IF END IF
rhoe = zero
DO ispin = 1, nspin DO ispin = 1, nspin
! ... arrange for FFT of wave functions ! ... arrange for FFT of wave functions
@ -285,7 +201,7 @@
! ... Gamma-point calculation: wave functions are real and can be ! ... Gamma-point calculation: wave functions are real and can be
! ... Fourier-transformed two at a time as a complex vector ! ... Fourier-transformed two at a time as a complex vector
rho = zero psi2 = zero
nbnd = cdesc%nbl( ispin ) nbnd = cdesc%nbl( ispin )
nb = ( nbnd - MOD( nbnd, 2 ) ) nb = ( nbnd - MOD( nbnd, 2 ) )
@ -302,7 +218,7 @@
IF( tturbo .AND. ( ib <= nturbo ) ) THEN IF( tturbo .AND. ( ib <= nturbo ) ) THEN
! ... store real-space wave functions to be used in force ! ... store real-space wave functions to be used in force
turbo_states( :, :, :, ib ) = psi2( :, :, : ) turbo_states( :, ib ) = psi2( : )
END IF END IF
! ... occupation numbers divided by cell volume ! ... occupation numbers divided by cell volume
@ -313,22 +229,18 @@
! ... compute charge density from wave functions ! ... compute charge density from wave functions
DO k = 1, nzl DO i = 1, nnr
DO j = 1, nyl
DO i = 1, nxl
! ... extract wave functions from psi2 ! ... extract wave functions from psi2
r1 = DBLE( psi2(i,j,k) ) r1 = DBLE( psi2(i) )
r2 = AIMAG( psi2(i,j,k) ) r2 = AIMAG( psi2(i) )
! ... add squared moduli to charge density ! ... add squared moduli to charge density
rho(i,j,k) = rho(i,j,k) + coef3 * r1 * r1 + coef4 * r2 * r2 rhoe(i,ispin) = rhoe(i,ispin) + coef3 * r1 * r1 + coef4 * r2 * r2
END DO END DO
END DO
END DO
END DO END DO
@ -346,21 +258,17 @@
! ... compute charge density from wave functions ! ... compute charge density from wave functions
DO k = 1, nzl DO i = 1, nnr
DO j = 1, nyl
DO i = 1, nxl
! ... extract wave functions from psi2 ! ... extract wave functions from psi2
r1 = DBLE( psi2(i,j,k) ) r1 = DBLE( psi2(i) )
! ... add squared moduli to charge density ! ... add squared moduli to charge density
rho(i,j,k) = rho(i,j,k) + coef3 * r1 * r1 rhoe(i,ispin) = rhoe(i,ispin) + coef3 * r1 * r1
END DO END DO
END DO
END DO
END IF END IF
@ -368,7 +276,7 @@
! ... calculation with generic k points: wave functions are complex ! ... calculation with generic k points: wave functions are complex
rho = zero psi2 = zero
DO ik = 1, cdesc%nkl DO ik = 1, cdesc%nkl
@ -385,25 +293,19 @@
! ... compute charge density ! ... compute charge density
DO k = 1, nzl DO i = 1, nnr
DO j = 1, nyl
DO i = 1, nxl
! ... add squared modulus to charge density ! ... add squared modulus to charge density
rho(i,j,k) = rho(i,j,k) + coef3 * DBLE( psi2(i,j,k) * CONJG(psi2(i,j,k)) ) rhoe(i,ispin) = rhoe(i,ispin) + coef3 * DBLE( psi2(i) * CONJG(psi2(i)) )
END DO END DO
END DO END DO
END DO END DO
END DO
END DO
END IF END IF
IF( ttprint ) rsumr( ispin ) = SUM( rho ) * omega / nnr IF( ttprint ) rsumr( ispin ) = SUM( rhoe( :, ispin ) ) * omega / ( nr1 * nr2 * nr3 )
rhoe( 1:nxl, 1:nyl, 1:nzl, ispin ) = rho( 1:nxl, 1:nyl, 1:nzl )
END DO END DO
@ -443,8 +345,6 @@
DEALLOCATE(psi2, STAT=ierr) DEALLOCATE(psi2, STAT=ierr)
IF( ierr /= 0 ) CALL errore(' rhoofr ', ' deallocating psi2 ', ABS(ierr) ) IF( ierr /= 0 ) CALL errore(' rhoofr ', ' deallocating psi2 ', ABS(ierr) )
DEALLOCATE(rho, STAT=ierr)
IF( ierr /= 0 ) CALL errore(' rhoofr ', ' deallocating rho ', ABS(ierr) )
RETURN RETURN
@ -468,7 +368,7 @@
COMPLEX(DP), INTENT(IN) :: rhoeg(:) ! charge density (Reciprocal Space) COMPLEX(DP), INTENT(IN) :: rhoeg(:) ! charge density (Reciprocal Space)
REAL(DP), INTENT(IN) :: gx(:,:) ! cartesian components of G-vectors REAL(DP), INTENT(IN) :: gx(:,:) ! cartesian components of G-vectors
REAL(DP), INTENT(OUT) :: grho(:,:,:,:) ! charge density gradient REAL(DP), INTENT(OUT) :: grho(:,:) ! charge density gradient
INTEGER :: ig, ipol, ierr INTEGER :: ig, ipol, ierr
COMPLEX(DP), ALLOCATABLE :: tgrho(:) COMPLEX(DP), ALLOCATABLE :: tgrho(:)
@ -484,7 +384,7 @@
rg = rhoeg(ig) * gx( ipol, ig ) rg = rhoeg(ig) * gx( ipol, ig )
tgrho(ig) = tpiba * CMPLX( - AIMAG(rg), DBLE(rg) ) tgrho(ig) = tpiba * CMPLX( - AIMAG(rg), DBLE(rg) )
END DO END DO
CALL pinvfft( grho(:,:,:,ipol), tgrho ) CALL pinvfft( grho(:,ipol), tgrho )
END DO END DO
DEALLOCATE(tgrho, STAT=ierr) DEALLOCATE(tgrho, STAT=ierr)

View File

@ -160,7 +160,7 @@
IMPLICIT NONE IMPLICIT NONE
! ... declare subroutine arguments ! ... declare subroutine arguments
REAL(DP), INTENT(INOUT) :: rhoe(:,:,:) REAL(DP), INTENT(INOUT) :: rhoe(:)
REAL(DP), INTENT(OUT) :: drho REAL(DP), INTENT(OUT) :: drho
INTEGER, INTENT(IN) :: nfi INTEGER, INTENT(IN) :: nfi
@ -170,7 +170,7 @@
REAL(DP) :: g02, g12, ar, den, num, rsc REAL(DP) :: g02, g12, ar, den, num, rsc
REAL(DP) :: alpha(daamax) REAL(DP) :: alpha(daamax)
REAL(DP), ALLOCATABLE :: aa(:,:) REAL(DP), ALLOCATABLE :: aa(:,:)
REAL(DP), ALLOCATABLE :: rho_old(:,:,:) REAL(DP), ALLOCATABLE :: rho_old(:)
INTEGER :: ns, sp, is, ism, i, ig INTEGER :: ns, sp, is, ism, i, ig
LOGICAL, SAVE :: tfirst = .TRUE. LOGICAL, SAVE :: tfirst = .TRUE.
INTEGER, SAVE :: dimaa, dimaaold, nrho_t, ierr INTEGER, SAVE :: dimaa, dimaaold, nrho_t, ierr
@ -305,7 +305,7 @@
END IF END IF
ALLOCATE( rho_old( SIZE(rhoe, 1), SIZE(rhoe, 2), SIZE(rhoe, 3) ), STAT=ierr ) ALLOCATE( rho_old( SIZE(rhoe) ), STAT=ierr )
IF( ierr /= 0 ) CALL errore(' newrho ', ' allocating rho_old ', ierr) IF( ierr /= 0 ) CALL errore(' newrho ', ' allocating rho_old ', ierr)
rho_old = rhoe rho_old = rhoe

View File

@ -50,7 +50,7 @@ MODULE cp_restart
USE gvecw, ONLY : ngw, ngwt, ecutw, gcutw USE gvecw, ONLY : ngw, ngwt, ecutw, gcutw
USE reciprocal_vectors, ONLY : ig_l2g, mill_l USE reciprocal_vectors, ONLY : ig_l2g, mill_l
USE electrons_base, ONLY : nspin, nbnd, nbsp, nelt, nel, & USE electrons_base, ONLY : nspin, nbnd, nbsp, nelt, nel, &
nupdwn, iupdwn, f, fspin, nudx nupdwn, iupdwn, f, nudx
USE cell_base, ONLY : ibrav, alat, celldm, & USE cell_base, ONLY : ibrav, alat, celldm, &
symm_type, s_to_r symm_type, s_to_r
USE ions_base, ONLY : nsp, nat, na, atm, zv, & USE ions_base, ONLY : nsp, nat, na, atm, zv, &
@ -1129,6 +1129,7 @@ MODULE cp_restart
IF ( ( nspin_ /= nspin ) .OR. & IF ( ( nspin_ /= nspin ) .OR. &
( nbnd_ /= nbnd ) .OR. ( NINT( nelec_ ) /= nelt ) ) THEN ( nbnd_ /= nbnd ) .OR. ( NINT( nelec_ ) /= nelt ) ) THEN
! !
attr = "electron, bands or spin do not match"
ierr = 30 ierr = 30
! !
GOTO 100 GOTO 100

View File

@ -238,108 +238,6 @@
! !
!-------------------------------------------------------------------------
SUBROUTINE calphi( c0, ngwx, ema0bg, bec, nkbx, betae, phi, n )
!-----------------------------------------------------------------------
! input: c0 (orthonormal with s(r(t)), bec=<c0|beta>, betae=|beta>
! computes the matrix phi (with the old positions)
! where |phi> = s'|c0> = |c0> + sum q_ij |i><j|c0>
! where s'=s(r(t))
!
USE kinds, ONLY: DP
USE ions_base, ONLY: na, nsp
USE io_global, ONLY: stdout
USE cvan, ONLY: ish, nvb
USE uspp_param, ONLY: nh
USE uspp, ONLY: nhsavb=>nkbus, qq
USE gvecw, ONLY: ngw
USE constants, ONLY: pi, fpi
USE control_flags, ONLY: iprint, iprsta
USE mp, ONLY: mp_sum
!
IMPLICIT NONE
INTEGER, INTENT(IN) :: ngwx, nkbx, n
COMPLEX(DP) :: c0( ngwx, n ), phi( ngwx, n ), betae( ngwx, nkbx )
REAL(DP) :: ema0bg( ngwx ), bec( nkbx, n ), emtot
! local variables
!
INTEGER :: is, iv, jv, ia, inl, jnl, i, j
REAL(DP), ALLOCATABLE :: qtemp( : , : )
!
CALL start_clock( 'calphi' )
ALLOCATE( qtemp( nhsavb, n ) )
phi(:,:) = (0.d0, 0.d0)
!
IF ( nvb > 0 ) THEN
qtemp (:,:) = 0.d0
DO is=1,nvb
DO iv=1,nh(is)
DO jv=1,nh(is)
IF(ABS(qq(iv,jv,is)) > 1.e-5) THEN
DO ia=1,na(is)
inl=ish(is)+(iv-1)*na(is)+ia
jnl=ish(is)+(jv-1)*na(is)+ia
DO i=1,n
qtemp(inl,i) = qtemp(inl,i) + &
& qq(iv,jv,is)*bec(jnl,i)
END DO
END DO
ENDIF
END DO
END DO
END DO
!
CALL MXMA &
& ( betae, 1, 2*ngwx, qtemp, 1, nhsavb, phi, 1, 2*ngwx, 2*ngw, nhsavb, n )
END IF
!
DO j=1,n
DO i=1,ngw
phi(i,j)=(phi(i,j)+c0(i,j))*ema0bg(i)
END DO
END DO
! =================================================================
IF(iprsta > 2) THEN
emtot=0.0d0
DO j=1,n
DO i=1,ngw
emtot=emtot &
& +2.0d0*DBLE(phi(i,j)*CONJG(c0(i,j)))*ema0bg(i)**(-2.0d0)
END DO
END DO
emtot=emtot/n
CALL mp_sum( emtot )
WRITE( stdout,*) 'in calphi sqrt(emtot)=',SQRT(emtot)
WRITE( stdout,*)
DO is=1,nsp
IF(nsp > 1) THEN
WRITE( stdout,'(33x,a,i4)') ' calphi: bec (is)',is
WRITE( stdout,'(8f9.4)') &
& ((bec(ish(is)+(iv-1)*na(is)+1,i),iv=1,nh(is)),i=1,n)
ELSE
DO ia=1,na(is)
WRITE( stdout,'(33x,a,i4)') ' calphi: bec (ia)',ia
WRITE( stdout,'(8f9.4)') &
& ((bec(ish(is)+(iv-1)*na(is)+ia,i),iv=1,nh(is)),i=1,n)
END DO
END IF
END DO
ENDIF
DEALLOCATE( qtemp )
CALL stop_clock( 'calphi' )
!
RETURN
END SUBROUTINE calphi
!----------------------------------------------------------------------- !-----------------------------------------------------------------------
REAL(8) FUNCTION cscnorm( bec, nkbx, cp, ngwx, i, n ) REAL(8) FUNCTION cscnorm( bec, nkbx, cp, ngwx, i, n )
@ -672,7 +570,7 @@
USE uspp_param, ONLY: nhm, nh USE uspp_param, ONLY: nhm, nh
USE smooth_grid_dimensions, ONLY: nr1s, nr2s, nr3s, & USE smooth_grid_dimensions, ONLY: nr1s, nr2s, nr3s, &
nr1sx, nr2sx, nr3sx, nnrsx nr1sx, nr2sx, nr3sx, nnrsx
USE electrons_base, ONLY: n => nbsp, ispin => fspin, f, nspin USE electrons_base, ONLY: n => nbsp, ispin, f, nspin
USE constants, ONLY: pi, fpi USE constants, ONLY: pi, fpi
USE ions_base, ONLY: nsp, na, nat USE ions_base, ONLY: nsp, na, nat
USE gvecw, ONLY: ggp USE gvecw, ONLY: ggp
@ -1151,26 +1049,34 @@
! !
!----------------------------------------------------------------------- !-----------------------------------------------------------------------
REAL(8) FUNCTION enkin(c) FUNCTION enkin( c, ngwx, f, n )
!----------------------------------------------------------------------- !-----------------------------------------------------------------------
! !
! calculation of kinetic energy term ! calculation of kinetic energy term
! !
USE kinds, ONLY: DP
USE constants, ONLY: pi, fpi USE constants, ONLY: pi, fpi
USE electrons_base, ONLY: nx => nbspx, n => nbsp, f
USE gvecw, ONLY: ngw USE gvecw, ONLY: ngw
USE reciprocal_vectors, ONLY: gstart USE reciprocal_vectors, ONLY: gstart
USE gvecw, ONLY: ggp USE gvecw, ONLY: ggp
USE mp, ONLY: mp_sum USE mp, ONLY: mp_sum
USE mp_global, ONLY: group
USE cell_base, ONLY: tpiba2 USE cell_base, ONLY: tpiba2
IMPLICIT NONE IMPLICIT NONE
REAL(DP) :: enkin
! input ! input
COMPLEX(8) c(ngw,nx)
! local INTEGER, INTENT(IN) :: ngwx, n
INTEGER ig, i COMPLEX(DP), INTENT(IN) :: c( ngwx, n )
REAL(8) sk(n) ! automatic array REAL(DP), INTENT(IN) :: f( n )
! !
! local
INTEGER :: ig, i
REAL(DP) :: sk(n) ! automatic array
! !
DO i=1,n DO i=1,n
sk(i)=0.0 sk(i)=0.0
@ -1179,12 +1085,16 @@
END DO END DO
END DO END DO
CALL mp_sum( sk(1:n) ) CALL mp_sum( sk(1:n), group )
enkin=0.0 enkin=0.0
DO i=1,n DO i=1,n
enkin=enkin+f(i)*sk(i) enkin=enkin+f(i)*sk(i)
END DO END DO
! ... reciprocal-space vectors are in units of alat/(2 pi) so a
! ... multiplicative factor (2 pi/alat)**2 is required
enkin = enkin * tpiba2 enkin = enkin * tpiba2
! !
RETURN RETURN
@ -1464,7 +1374,7 @@
USE cvan, ONLY :nvb, ish USE cvan, ONLY :nvb, ish
USE uspp, ONLY : nkb, nhsavb=>nkbus, qq USE uspp, ONLY : nkb, nhsavb=>nkbus, qq
USE uspp_param, ONLY: nh USE uspp_param, ONLY: nh
USE electrons_base, ONLY: ispin => fspin USE electrons_base, ONLY: ispin
USE gvecw, ONLY: ngw USE gvecw, ONLY: ngw
USE mp, ONLY: mp_sum USE mp, ONLY: mp_sum
USE kinds, ONLY: DP USE kinds, ONLY: DP
@ -2106,185 +2016,6 @@
RETURN RETURN
END SUBROUTINE nlfl END SUBROUTINE nlfl
!-----------------------------------------------------------------------
SUBROUTINE ortho &
& (eigr,cp,phi,x0,diff,iter,ccc,eps,max,delt,bephi,becp)
!-----------------------------------------------------------------------
! input = cp (non-orthonormal), beta
! input = phi |phi>=s'|c0>
! output= cp (orthonormal with s( r(t+dt) ) )
! output= bephi, becp
! the method used is similar to the version in les houches 1988
! 'simple molecular systems at..' p. 462-463 (18-22)
! xcx + b x + b^t x^t + a = 1
! where c = <s'c0|s|s'c0> b = <s'c0|s cp> a = <cp|s|cp>
! where s=s(r(t+dt)) and s'=s(r(t))
! for vanderbilt pseudo pot - kl & ap
!
USE ions_base, ONLY: na, nat
USE cvan, ONLY: ish, nvb
USE uspp, ONLY : nkb, qq
USE uspp_param, ONLY: nh
USE electrons_base, ONLY: n => nbsp, nbspx, nudx, nspin, nupdwn, iupdwn, f
USE gvecw, ONLY: ngw
USE control_flags, ONLY: iprint, iprsta
USE io_global, ONLY: stdout
USE orthogonalize_base, ONLY: ortho_iterate, diagonalize_rho, sigset, rhoset, &
tauset
!
IMPLICIT NONE
!
COMPLEX(8) cp(ngw,n), phi(ngw,n), eigr(ngw,nat)
REAL(8) x0( nbspx, nbspx ), diff, ccc, eps, delt
INTEGER iter, max
REAL(8) bephi(nkb,n), becp(nkb,n)
!
REAL(8), ALLOCATABLE :: diag(:), work1(:), work2(:), xloc(:,:), &
rhos(:,:), rhor(:,:), u(:,:), &
sig(:,:), rho(:,:), tau(:,:)
INTEGER :: ngwx, nkbx
INTEGER istart, nss, ifail, i, j, iss, iv, jv, ia, is, inl, jnl
REAL(8), ALLOCATABLE:: qbephi(:,:), qbecp(:,:)
ALLOCATE( diag( nudx ), work1( nudx ), work2( nudx ), xloc( nudx, nudx ), &
rhos( nudx, nudx ), rhor( nudx, nudx ), u( nudx, nudx ), &
sig( nudx, nudx ), rho( nudx, nudx ), tau( nudx, nudx ) )
ngwx = ngw
nkbx = nkb
!
! calculation of becp and bephi
!
CALL start_clock( 'ortho' )
CALL nlsm1( n, 1, nvb, eigr, cp, becp )
CALL nlsm1( n, 1, nvb, eigr, phi, bephi )
!
! calculation of qbephi and qbecp
!
ALLOCATE( qbephi( nkbx, n ) )
ALLOCATE( qbecp ( nkbx, n ) )
!
qbephi = 0.d0
qbecp = 0.d0
!
DO is=1,nvb
DO iv=1,nh(is)
DO jv=1,nh(is)
IF(ABS(qq(iv,jv,is)).GT.1.e-5) THEN
DO ia=1,na(is)
inl=ish(is)+(iv-1)*na(is)+ia
jnl=ish(is)+(jv-1)*na(is)+ia
DO i=1,n
qbephi(inl,i)= qbephi(inl,i) &
& +qq(iv,jv,is)*bephi(jnl,i)
qbecp (inl,i)=qbecp (inl,i) &
& +qq(iv,jv,is)*becp (jnl,i)
END DO
END DO
ENDIF
END DO
END DO
END DO
!
DO iss = 1, nspin
nss = nupdwn(iss)
istart = iupdwn(iss)
!
! rho = <s'c0|s|cp>
! sig = 1-<cp|s|cp>
! tau = <s'c0|s|s'c0>
!
CALL rhoset( cp, ngwx, phi, bephi, nkbx, qbecp, n, nss, istart, rho, nudx )
!
CALL sigset( cp, ngwx, becp, nkbx, qbecp, n, nss, istart, sig, nudx )
!
CALL tauset( phi, ngwx, bephi, nkbx, qbephi, n, nss, istart, tau, nudx )
!
!
IF(iprsta.GT.4) THEN
WRITE( stdout,*)
WRITE( stdout,'(26x,a)') ' rho '
DO i=1,nss
WRITE( stdout,'(7f11.6)') (rho(i,j),j=1,nss)
END DO
WRITE( stdout,*)
WRITE( stdout,'(26x,a)') ' sig '
DO i=1,nss
WRITE( stdout,'(7f11.6)') (sig(i,j),j=1,nss)
END DO
WRITE( stdout,*)
WRITE( stdout,'(26x,a)') ' tau '
DO i=1,nss
WRITE( stdout,'(7f11.6)') (tau(i,j),j=1,nss)
END DO
ENDIF
!
!
!----------------------------------------------------------------by ap--
!
DO j=1,nss
DO i=1,nss
xloc(i,j) = x0(istart-1+i,istart-1+j)*ccc
rhos(i,j)=0.5d0*( rho(i,j)+rho(j,i) )
!
! on some machines (IBM RS/6000 for instance) the following test allows
! to distinguish between Numbers and Sodium Nitride (NaN, Not a Number).
! If a matrix of Not-Numbers is passed to rs, the most likely outcome is
! that the program goes on forever doing nothing and writing nothing.
!
IF (rhos(i,j).NE.rhos(i,j)) &
& CALL errore('ortho','ortho went bananas',1)
rhor(i,j)=rho(i,j)-rhos(i,j)
END DO
END DO
!
ifail=0
CALL start_clock( 'rsg' )
CALL diagonalize_rho( nss, rhos, diag, u )
! CALL rs(nudx,nss,rhos,diag,1,u,work1,work2,ifail)
CALL stop_clock( 'rsg' )
!
! calculation of lagranges multipliers
!
CALL ortho_iterate( u, diag, xloc, sig, rhor, rhos, tau, nudx, nss, max, eps )
IF(iprsta.GT.4) THEN
WRITE( stdout,*)
WRITE( stdout,'(26x,a)') ' lambda '
DO i=1,nss
WRITE( stdout,'(7f11.6)') (xloc(i,j)/f(i+istart-1),j=1,nss)
END DO
ENDIF
!
IF(iprsta.GT.2) THEN
WRITE( stdout,*) ' diff= ',diff,' iter= ',iter
ENDIF
!
! lagrange multipliers
!
DO i=1,nss
DO j=1,nss
x0(istart-1+i,istart-1+j)=xloc(i,j)/ccc
IF (xloc(i,j).NE.xloc(i,j)) &
& CALL errore('ortho','ortho went bananas',2)
END DO
END DO
!
END DO
!
DEALLOCATE(qbecp )
DEALLOCATE(qbephi)
DEALLOCATE( diag, work1, work2, xloc, rhos, rhor, u, sig, rho, tau )
!
CALL stop_clock( 'ortho' )
RETURN
END SUBROUTINE ortho
! !
!----------------------------------------------------------------------- !-----------------------------------------------------------------------
SUBROUTINE pbc(rin,a1,a2,a3,ainv,rout) SUBROUTINE pbc(rin,a1,a2,a3,ainv,rout)
@ -2624,6 +2355,7 @@
! !
RETURN RETURN
END SUBROUTINE rdiag END SUBROUTINE rdiag
!----------------------------------------------------------------------- !-----------------------------------------------------------------------
SUBROUTINE rhoofr (nfi,c,irb,eigrb,bec,rhovan,rhor,rhog,rhos,enl,ekin) SUBROUTINE rhoofr (nfi,c,irb,eigrb,bec,rhovan,rhor,rhog,rhos,enl,ekin)
!----------------------------------------------------------------------- !-----------------------------------------------------------------------
@ -2638,101 +2370,108 @@
! !
! e_v = sum_i,ij rho_i,ij d^ion_is,ji ! e_v = sum_i,ij rho_i,ij d^ion_is,ji
! !
USE kinds, ONLY: dp USE kinds, ONLY: DP
USE control_flags, ONLY: iprint, tbuff, iprsta, thdyn, tpre, trhor USE control_flags, ONLY: iprint, tbuff, iprsta, thdyn, tpre, trhor
USE ions_base, ONLY: nat, nas => nax, nsp USE ions_base, ONLY: nat
USE parameters, ONLY: natx, nsx USE gvecp, ONLY: ngm
USE gvecp, ONLY: ng => ngm USE gvecs, ONLY: ngs, nps, nms
USE gvecs
USE gvecb, ONLY: ngb USE gvecb, ONLY: ngb
USE gvecw, ONLY: ngw USE gvecw, ONLY: ngw
USE reciprocal_vectors, ONLY: gstart
USE recvecs_indexes, ONLY: np, nm USE recvecs_indexes, ONLY: np, nm
USE uspp, ONLY: nhsa => nkb USE reciprocal_vectors, ONLY: gstart
USE uspp, ONLY: nkb
USE uspp_param, ONLY: nh, nhm USE uspp_param, ONLY: nh, nhm
USE grid_dimensions, ONLY: nr1, nr2, nr3, & USE grid_dimensions, ONLY: nr1, nr2, nr3, &
nr1x, nr2x, nr3x, nnr => nnrx nr1x, nr2x, nr3x, nnrx
USE cell_base, ONLY: omega USE cell_base, ONLY: omega
USE smooth_grid_dimensions, ONLY: nr1s, nr2s, nr3s, & USE smooth_grid_dimensions, ONLY: nr1s, nr2s, nr3s, &
nr1sx, nr2sx, nr3sx, nnrsx nr1sx, nr2sx, nr3sx, nnrsx
USE electrons_base, ONLY: nx => nbspx, n => nbsp, f, ispin => fspin, nspin USE electrons_base, ONLY: nx => nbspx, n => nbsp, f, ispin, nspin
USE constants, ONLY: pi, fpi USE constants, ONLY: pi, fpi
USE mp, ONLY: mp_sum USE mp, ONLY: mp_sum
! use local_pseudo USE dener, ONLY: denl, dekin
!
USE cdvan
USE dener
USE io_global, ONLY: stdout USE io_global, ONLY: stdout
USE funct, ONLY: dft_is_meta USE funct, ONLY: dft_is_meta
USE cg_module, ONLY: tcg USE cg_module, ONLY: tcg
USE cp_main_variables, ONLY: rhopr
! !
IMPLICIT NONE IMPLICIT NONE
REAL(8) bec(nhsa,n), rhovan(nhm*(nhm+1)/2,nat,nspin) REAL(DP) bec(nkb,n), rhovan( nhm * ( nhm + 1 ) / 2, nat, nspin )
REAL(8) rhor(nnr,nspin), rhos(nnrsx,nspin) REAL(DP) rhor(nnrx,nspin), rhos(nnrsx,nspin)
REAL(8) enl, ekin REAL(DP) enl, ekin
COMPLEX(8) eigrb(ngb,nat), c(ngw,nx), rhog(ng,nspin) COMPLEX(DP) eigrb( ngb, nat ), c( ngw, nx ), rhog( ngm, nspin )
INTEGER irb( 3, nat ), nfi INTEGER irb( 3, nat ), nfi
! local variables ! local variables
INTEGER iss, isup, isdw, iss1, iss2, ios, i, ir, ig INTEGER iss, isup, isdw, iss1, iss2, ios, i, ir, ig
REAL(8) rsumr(2), rsumg(2), sa1, sa2 REAL(DP) rsumr(2), rsumg(2), sa1, sa2
REAL(8) rnegsum, rmin, rmax, rsum REAL(DP) rnegsum, rmin, rmax, rsum
REAL(8), EXTERNAL :: enkin, ennl REAL(DP), EXTERNAL :: enkin, ennl
COMPLEX(8) ci,fp,fm COMPLEX(DP) ci,fp,fm
COMPLEX(8), ALLOCATABLE :: psi(:), psis(:) COMPLEX(DP), ALLOCATABLE :: psi(:), psis(:)
! LOGICAL, SAVE :: first = .TRUE.
! !
CALL start_clock( 'rhoofr' ) CALL start_clock( 'rhoofr' )
ALLOCATE( psi( nnr ) )
ALLOCATE( psi( nnrx ) )
ALLOCATE( psis( nnrsx ) ) ALLOCATE( psis( nnrsx ) )
ci=(0.0,1.0) ci=(0.0,1.0)
DO iss=1,nspin DO iss=1,nspin
rhor(:,iss) = 0.d0 rhor(:,iss) = 0.d0
rhos(:,iss) = 0.d0 rhos(:,iss) = 0.d0
rhog(:,iss) = (0.d0, 0.d0) rhog(:,iss) = (0.d0, 0.d0)
END DO END DO
! !
! ==================================================================
! calculation of kinetic energy ekin ! calculation of kinetic energy ekin
! ================================================================== !
ekin=enkin(c) ekin = enkin( c, ngw, f, n )
!
IF( tpre ) CALL denkin( c, dekin ) IF( tpre ) CALL denkin( c, dekin )
! !
! ==================================================================
! calculation of non-local energy ! calculation of non-local energy
! ================================================================== !
enl = ennl( rhovan, bec ) enl = ennl( rhovan, bec )
!
IF( tpre ) CALL dennl( bec, denl ) IF( tpre ) CALL dennl( bec, denl )
! !
! warning! trhor and thdyn are not compatible yet! ! warning! trhor and thdyn are not compatible yet!
! !
IF( trhor .AND. ( .NOT. thdyn ) ) THEN IF( trhor .AND. ( .NOT. thdyn ) ) THEN
! ================================================================== !
! non self-consistent calculation
! charge density is read from unit 47 ! charge density is read from unit 47
! ================================================================== !
#ifdef __PARA IF( first ) THEN
CALL read_rho( 47, nspin, rhor ) CALL read_rho( 47, nspin, rhor )
#else rhopr = rhor
READ(47) ((rhor(ir,iss),ir=1,nnr),iss=1,nspin) first = .FALSE.
#endif ELSE
REWIND 47 rhor = rhopr
END IF
! !
IF(nspin.EQ.1)THEN IF(nspin.EQ.1)THEN
iss=1 iss=1
DO ir=1,nnr DO ir=1,nnrx
psi(ir)=CMPLX(rhor(ir,iss),0.d0) psi(ir)=CMPLX(rhor(ir,iss),0.d0)
END DO END DO
CALL fwfft(psi,nr1,nr2,nr3,nr1x,nr2x,nr3x) CALL fwfft(psi,nr1,nr2,nr3,nr1x,nr2x,nr3x)
DO ig=1,ng DO ig=1,ngm
rhog(ig,iss)=psi(np(ig)) rhog(ig,iss)=psi(np(ig))
END DO END DO
ELSE ELSE
isup=1 isup=1
isdw=2 isdw=2
DO ir=1,nnr DO ir=1,nnrx
psi(ir)=CMPLX(rhor(ir,isup),rhor(ir,isdw)) psi(ir)=CMPLX(rhor(ir,isup),rhor(ir,isdw))
END DO END DO
CALL fwfft(psi,nr1,nr2,nr3,nr1x,nr2x,nr3x) CALL fwfft(psi,nr1,nr2,nr3,nr1x,nr2x,nr3x)
DO ig=1,ng DO ig=1,ngm
fp=psi(np(ig))+psi(nm(ig)) fp=psi(np(ig))+psi(nm(ig))
fm=psi(np(ig))-psi(nm(ig)) fm=psi(np(ig))-psi(nm(ig))
rhog(ig,isup)=0.5*CMPLX( DBLE(fp),AIMAG(fm)) rhog(ig,isup)=0.5*CMPLX( DBLE(fp),AIMAG(fm))
@ -2836,7 +2575,7 @@
psi(np(ig))= rhog(ig,iss) psi(np(ig))= rhog(ig,iss)
END DO END DO
CALL invfft(psi,nr1,nr2,nr3,nr1x,nr2x,nr3x) CALL invfft(psi,nr1,nr2,nr3,nr1x,nr2x,nr3x)
DO ir=1,nnr DO ir=1,nnrx
rhor(ir,iss)=DBLE(psi(ir)) rhor(ir,iss)=DBLE(psi(ir))
END DO END DO
ELSE ELSE
@ -2851,7 +2590,7 @@
psi(np(ig))=rhog(ig,isup)+ci*rhog(ig,isdw) psi(np(ig))=rhog(ig,isup)+ci*rhog(ig,isdw)
END DO END DO
CALL invfft(psi,nr1,nr2,nr3,nr1x,nr2x,nr3x) CALL invfft(psi,nr1,nr2,nr3,nr1x,nr2x,nr3x)
DO ir=1,nnr DO ir=1,nnrx
rhor(ir,isup)= DBLE(psi(ir)) rhor(ir,isup)= DBLE(psi(ir))
rhor(ir,isdw)=AIMAG(psi(ir)) rhor(ir,isdw)=AIMAG(psi(ir))
END DO END DO
@ -2898,7 +2637,7 @@
! !
! !
IF(iprsta.GE.2) THEN IF(iprsta.GE.2) THEN
CALL checkrho(nnr,nspin,rhor,rmin,rmax,rsum,rnegsum) CALL checkrho(nnrx,nspin,rhor,rmin,rmax,rsum,rnegsum)
rnegsum=rnegsum*omega/DBLE(nr1*nr2*nr3) rnegsum=rnegsum*omega/DBLE(nr1*nr2*nr3)
rsum=rsum*omega/DBLE(nr1*nr2*nr3) rsum=rsum*omega/DBLE(nr1*nr2*nr3)
WRITE( stdout,'(a,4(1x,f12.6))') & WRITE( stdout,'(a,4(1x,f12.6))') &
@ -3441,100 +3180,6 @@
END SUBROUTINE spinsq END SUBROUTINE spinsq
! !
!-------------------------------------------------------------------------
SUBROUTINE updatc(ccc,x0,phi,bephi,becp,bec,cp)
!-----------------------------------------------------------------------
! input ccc : dt**2/emass (unchanged in output)
! input x0 : converged lambdas from ortho-loop (unchanged in output)
! input cp : non-orthonormal cp=c0+dh/dc*ccc
! input bec : <cp|beta_i>
! input phi
! output cp : orthonormal cp=cp+lambda*phi
! output bec: bec=becp+lambda*bephi
!
USE ions_base, ONLY: nsp, na
USE io_global, ONLY: stdout
USE cvan, ONLY: nvb, ish
USE uspp, ONLY: nhsa => nkb, nhsavb=>nkbus
USE uspp_param, ONLY: nh
USE gvecw, ONLY: ngw
USE electrons_base, ONLY: nx => nbspx, n => nbsp
USE control_flags, ONLY: iprint, iprsta
!
IMPLICIT NONE
!
COMPLEX(8) cp(ngw,n), phi(ngw,n)
REAL(8) bec(nhsa,n), x0(nx,nx), ccc
REAL(8) bephi(nhsa,n), becp(nhsa,n)
! local variables
INTEGER i, j, ig, is, iv, ia, inl
REAL(8) wtemp(n,nhsa) ! automatic array
COMPLEX(8), ALLOCATABLE :: wrk2(:,:)
!
! lagrange multipliers
!
CALL start_clock( 'updatc' )
ALLOCATE( wrk2( ngw, n ) )
wrk2 = (0.d0, 0.d0)
DO j=1,n
CALL DSCAL(n,ccc,x0(1,j),1)
END DO
!
! wrk2 = sum_m lambda_nm s(r(t+dt))|m>
!
CALL MXMA(phi,1,2*ngw,x0,nx,1,wrk2,1,2*ngw,2*ngw,n,n)
!
DO i=1,n
DO ig=1,ngw
cp(ig,i)=cp(ig,i)+wrk2(ig,i)
END DO
END DO
!
! updating of the <beta|c(n,g)>
!
! bec of vanderbilt species are updated
!
IF(nvb.GT.0)THEN
CALL MXMA(x0,1,nx,bephi,nhsa,1,wtemp,1,n,n,n,nhsavb)
!
DO i=1,n
DO inl=1,nhsavb
bec(inl,i)=wtemp(i,inl)+becp(inl,i)
END DO
END DO
ENDIF
!
IF (iprsta.GT.2) THEN
WRITE( stdout,*)
DO is=1,nsp
IF(nsp.GT.1) THEN
WRITE( stdout,'(33x,a,i4)') ' updatc: bec (is)',is
WRITE( stdout,'(8f9.4)') &
& ((bec(ish(is)+(iv-1)*na(is)+1,i),iv=1,nh(is)),i=1,n)
ELSE
DO ia=1,na(is)
WRITE( stdout,'(33x,a,i4)') ' updatc: bec (ia)',ia
WRITE( stdout,'(8f9.4)') &
& ((bec(ish(is)+(iv-1)*na(is)+ia,i),iv=1,nh(is)),i=1,n)
END DO
END IF
WRITE( stdout,*)
END DO
ENDIF
!
DO j=1,n
CALL DSCAL(n,1.0/ccc,x0(1,j),1)
END DO
DEALLOCATE( wrk2 )
!
CALL stop_clock( 'updatc' )
!
RETURN
END SUBROUTINE updatc
!
!----------------------------------------------------------------------- !-----------------------------------------------------------------------
SUBROUTINE vofrho(nfi,rhor,rhog,rhos,rhoc,tfirst,tlast, & SUBROUTINE vofrho(nfi,rhor,rhog,rhos,rhoc,tfirst,tlast, &
& ei1,ei2,ei3,irb,eigrb,sfac,tau0,fion) & ei1,ei2,ei3,irb,eigrb,sfac,tau0,fion)
@ -3551,7 +3196,7 @@
! rhos output: total potential on smooth real space grid ! rhos output: total potential on smooth real space grid
! !
USE kinds, ONLY: dp USE kinds, ONLY: dp
USE control_flags, ONLY: iprint, tvlocw, iprsta, thdyn, tpre, tfor, tprnfor USE control_flags, ONLY: iprint, iprsta, thdyn, tpre, tfor, tprnfor
USE io_global, ONLY: stdout USE io_global, ONLY: stdout
USE parameters, ONLY: natx, nsx USE parameters, ONLY: natx, nsx
USE ions_base, ONLY: nas => nax, nsp, na, nat USE ions_base, ONLY: nas => nax, nsp, na, nat
@ -3841,14 +3486,6 @@
! !
etot=ekin+eht+epseu+enl+exc+ebac etot=ekin+eht+epseu+enl+exc+ebac
IF(tpre) detot=dekin+dh+dps+denl+dxc+dsr IF(tpre) detot=dekin+dh+dps+denl+dxc+dsr
!
IF(tvlocw.AND.tlast)THEN
#ifdef __PARA
CALL write_rho(46,nspin,rhor)
#else
WRITE(46) ((rhor(ir,iss),ir=1,nnr),iss=1,nspin)
#endif
ENDIF
! !
DEALLOCATE(rhotmp) DEALLOCATE(rhotmp)
DEALLOCATE(vtemp) DEALLOCATE(vtemp)

View File

@ -75,7 +75,7 @@
use cell_base use cell_base
use smooth_grid_dimensions, only: nr1s, nr2s, nr3s, & use smooth_grid_dimensions, only: nr1s, nr2s, nr3s, &
nr1sx, nr2sx, nr3sx, nnrsx nr1sx, nr2sx, nr3sx, nnrsx
use electrons_base, only: nx => nbspx, n => nbsp, f, ispin => fspin, nspin use electrons_base, only: nx => nbspx, n => nbsp, f, ispin, nspin
use constants, only: pi, fpi use constants, only: pi, fpi
! !
use cdvan use cdvan

View File

@ -28,7 +28,7 @@ SUBROUTINE cprmain( tau, fion_out, etot_out )
USE energies, ONLY : eht, epseu, exc, etot, eself, enl, & USE energies, ONLY : eht, epseu, exc, etot, eself, enl, &
ekin, atot, entropy, egrand, enthal, & ekin, atot, entropy, egrand, enthal, &
ekincm, print_energies ekincm, print_energies
USE electrons_base, ONLY : nbspx, nbsp, ispin => fspin, f, nspin USE electrons_base, ONLY : nbspx, nbsp, ispin, f, nspin
USE electrons_base, ONLY : nel, iupdwn, nupdwn, nudx, nelt USE electrons_base, ONLY : nel, iupdwn, nupdwn, nudx, nelt
USE efield_module, ONLY : efield, epol, tefield, allocate_efield, & USE efield_module, ONLY : efield, epol, tefield, allocate_efield, &
efield_update, ipolp, qmat, gqq, & efield_update, ipolp, qmat, gqq, &
@ -130,6 +130,8 @@ SUBROUTINE cprmain( tau, fion_out, etot_out )
USE metadyn_base, ONLY : set_target USE metadyn_base, ONLY : set_target
USE autopilot, ONLY : pilot USE autopilot, ONLY : pilot
USE ions_nose, ONLY : ions_nose_allocate, ions_nose_shiftvar USE ions_nose, ONLY : ions_nose_allocate, ions_nose_shiftvar
USE orthogonalize, ONLY : ortho
USE orthogonalize_base, ONLY : updatc
! !
IMPLICIT NONE IMPLICIT NONE
! !
@ -396,8 +398,8 @@ SUBROUTINE cprmain( tau, fion_out, etot_out )
! !
IF ( tortho ) THEN IF ( tortho ) THEN
! !
CALL ortho( eigr, cm, phi, lambda, bigr, iter, ccc, & CALL ortho( eigr, cm(:,:,1,1), phi(:,:,1,1), lambda, bigr, iter, ccc, &
ortho_eps, ortho_max, delt, bephi, becp ) bephi, becp )
! !
ELSE ELSE
! !
@ -417,7 +419,9 @@ SUBROUTINE cprmain( tau, fion_out, etot_out )
! !
IF ( iprsta >= 3 ) CALL print_lambda( lambda, nbsp, 9, 1.D0 ) IF ( iprsta >= 3 ) CALL print_lambda( lambda, nbsp, 9, 1.D0 )
! !
IF ( tortho ) CALL updatc( ccc, lambda, phi, bephi, becp, bec, cm ) IF ( tortho ) &
CALL updatc( ccc, nbsp, lambda, SIZE(lambda,1), phi, SIZE(phi,1), &
bephi, SIZE(bephi,1), becp, bec, cm )
! !
CALL calbec( nvb+1, nsp, eigr, cm, bec ) CALL calbec( nvb+1, nsp, eigr, cm, bec )
! !

View File

@ -687,7 +687,7 @@
SUBROUTINE cp_eigs( nfi, bec, c0, irb, eigrb, rhor, rhog, rhos, lambdap, lambda, tau0, h ) SUBROUTINE cp_eigs( nfi, bec, c0, irb, eigrb, rhor, rhog, rhos, lambdap, lambda, tau0, h )
use ensemble_dft, only: tens, ismear, z0, c0diag, becdiag use ensemble_dft, only: tens, ismear, z0, c0diag, becdiag
use electrons_base, only: nx => nbspx, n => nbsp, ispin => fspin, f, nspin use electrons_base, only: nx => nbspx, n => nbsp, ispin, f, nspin
use electrons_base, only: nel, iupdwn, nupdwn, nudx, nelt use electrons_base, only: nel, iupdwn, nupdwn, nudx, nelt
use energies, only: enl, ekin use energies, only: enl, ekin
use uspp, only: rhovan => becsum use uspp, only: rhovan => becsum

View File

@ -455,7 +455,7 @@
COMPLEX(DP), INTENT(INOUT) :: c_occ(:,:,:,:), c_emp(:,:,:,:) COMPLEX(DP), INTENT(INOUT) :: c_occ(:,:,:,:), c_emp(:,:,:,:)
TYPE (wave_descriptor), INTENT(IN) :: wfill, wempt TYPE (wave_descriptor), INTENT(IN) :: wfill, wempt
TYPE (atoms_type), INTENT(INOUT) :: atoms ! ions structure TYPE (atoms_type), INTENT(INOUT) :: atoms ! ions structure
REAL (DP), INTENT(IN) :: vpot(:,:,:,:) REAL (DP), INTENT(IN) :: vpot(:,:)
LOGICAL, INTENT(IN) :: tortho LOGICAL, INTENT(IN) :: tortho
COMPLEX(DP) :: eigr(:,:) COMPLEX(DP) :: eigr(:,:)
! !
@ -525,7 +525,7 @@
CALL nlsm1 ( n_emp, 1, nspnl, eigr, c_emp( 1, 1, ik, ispin ), bece( 1, (ispin-1)*n_emp + 1 ) ) CALL nlsm1 ( n_emp, 1, nspnl, eigr, c_emp( 1, 1, ik, ispin ), bece( 1, (ispin-1)*n_emp + 1 ) )
CALL dforce_all( ispin, c_emp(:,:,1,ispin), wempt, fi(:,1,ispin), eforce(:,:,1,ispin), & CALL dforce_all( ispin, c_emp(:,:,1,ispin), wempt, fi(:,1,ispin), eforce(:,:,1,ispin), &
vpot(:,:,:,ispin), eigr, bece ) vpot(:,ispin), eigr, bece )
! ... Steepest descent ! ... Steepest descent
DO i = 1, n_emp DO i = 1, n_emp
@ -613,7 +613,7 @@
COMPLEX(DP), INTENT(inout) :: c_emp(:,:,:,:) COMPLEX(DP), INTENT(inout) :: c_emp(:,:,:,:)
TYPE (wave_descriptor), INTENT(IN) :: wempt TYPE (wave_descriptor), INTENT(IN) :: wempt
REAL (DP), INTENT(in) :: vpot(:,:,:,:), fi(:,:,:) REAL (DP), INTENT(in) :: vpot(:,:), fi(:,:,:)
COMPLEX (DP) :: eforce(:,:,:,:) COMPLEX (DP) :: eforce(:,:,:,:)
LOGICAL, INTENT(IN) :: TORTHO LOGICAL, INTENT(IN) :: TORTHO
COMPLEX(DP) :: eigr(:,:) COMPLEX(DP) :: eigr(:,:)
@ -649,7 +649,7 @@
! ... Calculate | dH / dpsi(j) > ! ... Calculate | dH / dpsi(j) >
! !
CALL dforce_all( ispin, c_emp(:,:,1,ispin), wempt, fi(:,1,ispin), eforce(:,:,1,ispin), & CALL dforce_all( ispin, c_emp(:,:,1,ispin), wempt, fi(:,1,ispin), eforce(:,:,1,ispin), &
vpot(:,:,:,ispin), eigr, bece ) vpot(:,ispin), eigr, bece )
! ... Calculate Eij = < psi(i) | H | psi(j) > = < psi(i) | dH / dpsi(j) > ! ... Calculate Eij = < psi(i) | H | psi(j) > = < psi(i) | dH / dpsi(j) >
DO i = 1, n_emp DO i = 1, n_emp

View File

@ -30,37 +30,28 @@
SUBROUTINE v2gc( v2xc, grho, rhoer, vpot ) SUBROUTINE v2gc( v2xc, grho, rhoer, vpot )
USE kinds, ONLY: DP USE kinds, ONLY: DP
USE fft USE fft, ONLY: pfwfft, pinvfft
USE fft_base, ONLY: dfftp
USE cell_base, ONLY: tpiba USE cell_base, ONLY: tpiba
USE mp_global
USE reciprocal_vectors, ONLY: gstart, gx USE reciprocal_vectors, ONLY: gstart, gx
use grid_dimensions, only: nnrx
USE gvecp, ONLY: ngm USE gvecp, ONLY: ngm
! !
implicit none implicit none
! !
REAL(DP) :: vpot(:,:,:,:) REAL(DP) :: vpot(:,:)
REAL(DP), intent(in) :: v2xc(:,:,:,:,:) REAL(DP), intent(in) :: v2xc(:,:,:)
REAL(DP), intent(in) :: grho(:,:,:,:,:) REAL(DP), intent(in) :: grho(:,:,:)
REAL(DP), intent(in) :: rhoer(:,:,:,:) REAL(DP), intent(in) :: rhoer(:,:)
! !
integer :: ig, ipol, nxl, nyl, nzl, i, j, k, is, js, nspin integer :: ig, ipol, is, js, nspin
integer :: ldx, ldy, ldz COMPLEX(DP), allocatable :: psi(:)
COMPLEX(DP), allocatable :: psi(:,:,:)
COMPLEX(DP), allocatable :: vtemp(:) COMPLEX(DP), allocatable :: vtemp(:)
COMPLEX(DP), allocatable :: vtemp_pol(:) COMPLEX(DP), allocatable :: vtemp_pol(:)
REAL(DP), ALLOCATABLE :: v(:,:,:) REAL(DP), ALLOCATABLE :: v(:)
REAL(DP) :: fac REAL(DP) :: fac
! ... ! ...
ldx = dfftp%nr1x nspin = SIZE(rhoer,2)
ldy = dfftp%nr2x
ldz = dfftp%npl
nxl = MIN( dfftp%nr1, SIZE( grho, 1 ) )
nyl = MIN( dfftp%nr2, SIZE( grho, 2 ) )
nzl = MIN( dfftp%npl, SIZE( grho, 3 ) )
nspin = SIZE(rhoer,4)
!fac = REAL(nspin)
fac = 1.0d0 fac = 1.0d0
ALLOCATE( vtemp( ngm ) ) ALLOCATE( vtemp( ngm ) )
@ -68,20 +59,14 @@
DO js = 1, nspin DO js = 1, nspin
! !
ALLOCATE( psi( ldx, ldy, ldz ) ) ALLOCATE( psi( nnrx ) )
! !
vtemp = 0.0d0 vtemp = 0.0d0
DO ipol = 1, 3 DO ipol = 1, 3
DO is = 1, nspin DO is = 1, nspin
! !
DO k = 1, nzl psi( 1:nnrx ) = fac * v2xc( 1:nnrx, js, is ) * grho( 1:nnrx, ipol, is )
DO j = 1, nyl
DO i = 1, nxl
psi(i,j,k) = fac * v2xc(i,j,k,js,is) * grho(i,j,k,ipol,is)
END DO
END DO
END DO
! !
CALL pfwfft( vtemp_pol, psi ) CALL pfwfft( vtemp_pol, psi )
! !
@ -94,17 +79,12 @@
! !
DEALLOCATE( psi ) DEALLOCATE( psi )
ALLOCATE( v( ldx, ldy, ldz ) ) ALLOCATE( v( nnrx ) )
v( 1:nnrx ) = 0.0d0
! !
CALL pinvfft( v, vtemp ) CALL pinvfft( v, vtemp )
DO k = 1, nzl vpot( 1:nnrx, js ) = vpot( 1:nnrx, js) - v( 1:nnrx )
DO j = 1, nyl
DO i = 1, nxl
vpot(i,j,k,js) = vpot(i,j,k,js) - v(i,j,k)
END DO
END DO
END DO
DEALLOCATE( v ) DEALLOCATE( v )
@ -120,25 +100,21 @@
SUBROUTINE stress_gc(grho, v2xc, gcpail, omega) SUBROUTINE stress_gc(grho, v2xc, gcpail, omega)
! !
use grid_dimensions, only: nr1, nr2, nr3 use grid_dimensions, only: nr1, nr2, nr3, nnrx
USE fft_base, ONLY: dfftp
IMPLICIT NONE IMPLICIT NONE
! !
REAL(DP) :: v2xc(:,:,:,:,:) REAL(DP) :: v2xc(:,:,:)
REAL(DP) :: grho(:,:,:,:,:) REAL(DP) :: grho(:,:,:)
REAL(DP) :: gcpail(6) REAL(DP) :: gcpail(6)
REAL(DP) :: omega REAL(DP) :: omega
! !
REAL(DP) :: stre, grhoi, grhoj REAL(DP) :: stre, grhoi, grhoj
INTEGER :: i, j, k, ipol, jpol, ic, nxl, nyl, nzl, is, js, nspin INTEGER :: i, ipol, jpol, ic, is, js, nspin
INTEGER, DIMENSION(6), PARAMETER :: alpha = (/ 1,2,3,2,3,3 /) INTEGER, DIMENSION(6), PARAMETER :: alpha = (/ 1,2,3,2,3,3 /)
INTEGER, DIMENSION(6), PARAMETER :: beta = (/ 1,1,1,2,2,3 /) INTEGER, DIMENSION(6), PARAMETER :: beta = (/ 1,1,1,2,2,3 /)
! ... ! ...
nxl = MIN( dfftp%nr1, SIZE( grho, 1 ) ) nspin = SIZE(grho,3)
nyl = MIN( dfftp%nr2, SIZE( grho, 2 ) )
nzl = MIN( dfftp%npl, SIZE( grho, 3 ) )
nspin = SIZE(grho,5)
DO ic = 1, 6 DO ic = 1, 6
ipol = alpha(ic) ipol = alpha(ic)
@ -146,12 +122,8 @@
stre = 0.0d0 stre = 0.0d0
DO is = 1, nspin DO is = 1, nspin
DO js = 1, nspin DO js = 1, nspin
DO k = 1, nzl DO i = 1, nnrx
DO j = 1, nyl stre = stre + v2xc(i,is,js) * grho(i,ipol,js) * grho(i,jpol,is)
DO i = 1, nxl
stre = stre + v2xc(i,j,k,is,js) * grho(i,j,k,ipol,js) * grho(i,j,k,jpol,is)
END DO
END DO
END DO END DO
END DO END DO
END DO END DO
@ -184,8 +156,8 @@
COMPLEX(DP) :: vxc(:,:) COMPLEX(DP) :: vxc(:,:)
COMPLEX(DP), INTENT(IN) :: sfac(:,:) COMPLEX(DP), INTENT(IN) :: sfac(:,:)
REAL(DP) :: dexc(:), strvxc REAL(DP) :: dexc(:), strvxc
REAL(DP) :: grho(:,:,:,:,:) REAL(DP) :: grho(:,:,:)
REAL(DP) :: v2xc(:,:,:,:,:) REAL(DP) :: v2xc(:,:,:)
REAL(DP) :: GAgx_L(:,:) REAL(DP) :: GAgx_L(:,:)
REAL(DP) :: rhocp(:,:) REAL(DP) :: rhocp(:,:)
@ -276,51 +248,30 @@
SUBROUTINE exch_corr_energy(rhoetr, rhoetg, grho, vpot, sxc, vxc, v2xc) SUBROUTINE exch_corr_energy(rhoetr, rhoetg, grho, vpot, sxc, vxc, v2xc)
USE kinds, ONLY: DP USE kinds, ONLY: DP
USE grid_dimensions, ONLY: nr1l, nr2l, nr3l use grid_dimensions, only: nnrx
USE funct, ONLY: dft_is_gradient USE funct, ONLY: dft_is_gradient
REAL (DP) :: rhoetr(:,:,:,:) REAL (DP) :: rhoetr(:,:)
COMPLEX(DP) :: rhoetg(:,:) COMPLEX(DP) :: rhoetg(:,:)
REAL (DP) :: grho(:,:,:,:,:) REAL (DP) :: grho(:,:,:)
REAL (DP) :: vpot(:,:,:,:) REAL (DP) :: vpot(:,:)
REAL (DP) :: sxc ! E_xc energy REAL (DP) :: sxc ! E_xc energy
REAL (DP) :: vxc ! SUM ( v(r) * rho(r) ) REAL (DP) :: vxc ! SUM ( v(r) * rho(r) )
REAL (DP) :: v2xc(:,:,:,:,:) REAL (DP) :: v2xc(:,:,:)
REAL (DP) :: ddot !
REAL (DP), EXTERNAL :: ddot
INTEGER :: nspin, nnr, ispin, j, k, i
INTEGER :: nspin, ispin
logical :: is_gradient logical :: is_gradient
is_gradient = dft_is_gradient() is_gradient = dft_is_gradient()
! vpot = vxc(rhoetr); vpot(r) <-- u(r) ! vpot = vxc(rhoetr); vpot(r) <-- u(r)
nnr = SIZE( rhoetr, 1 ) * SIZE( rhoetr, 2 ) * SIZE( rhoetr, 3 ) nspin = SIZE( rhoetr, 2 )
nspin = SIZE( rhoetr, 4 )
! !
IF( nnr /= nr3l * nr2l * nr1l ) THEN CALL exch_corr_wrapper( nnrx, nspin, grho(1,1,1), rhoetr(1,1), sxc, vpot(1,1), v2xc(1,1,1) )
DO ispin = 1, nspin
DO k = 1, SIZE( rhoetr, 3 )
DO j = 1, SIZE( rhoetr, 2 )
DO i = 1, SIZE( rhoetr, 1 )
IF( i > nr1l .OR. j > nr2l .OR. k > nr3l ) THEN
rhoetr( i, j, k, ispin ) = 0.0d0
IF( is_gradient ) THEN
grho ( i, j, k, :, ispin ) = 0.0d0
END IF
END IF
END DO
END DO
END DO
END DO
END IF
!
CALL exch_corr_wrapper( nnr, nspin, grho(1,1,1,1,1), rhoetr(1,1,1,1), &
sxc, vpot(1,1,1,1), v2xc(1,1,1,1,1) )
! !
IF( dft_is_gradient() ) THEN IF( dft_is_gradient() ) THEN
! ... vpot additional term for gradient correction ! ... vpot additional term for gradient correction
@ -332,12 +283,7 @@
! !
vxc = 0.0d0 vxc = 0.0d0
DO ispin = 1, nspin DO ispin = 1, nspin
DO k = 1, nr3l vxc = vxc + DDOT ( nnrx, vpot(1,ispin), 1, rhoetr(1,ispin), 1 )
DO j = 1, nr2l
vxc = vxc + &
DDOT ( nr1l, vpot(1,j,k,ispin), 1, rhoetr(1,j,k,ispin), 1 )
END DO
END DO
END DO END DO

View File

@ -154,9 +154,9 @@
IMPLICIT NONE IMPLICIT NONE
COMPLEX(DP), INTENT(INOUT) :: cpsi(:,:,:) COMPLEX(DP), INTENT(INOUT) :: cpsi(:)
COMPLEX(DP), INTENT(OUT) :: C(:) COMPLEX(DP), INTENT(OUT) :: C(:)
COMPLEX(DP), ALLOCATABLE :: psi(:,:,:) COMPLEX(DP), ALLOCATABLE :: psi(:)
COMPLEX(DP), ALLOCATABLE :: zwrk(:) COMPLEX(DP), ALLOCATABLE :: zwrk(:)
REAL(DP) :: t1 REAL(DP) :: t1
INTEGER :: ierr INTEGER :: ierr
@ -166,20 +166,16 @@
IF ( first ) & IF ( first ) &
CALL errore( ' pfwfft 2 ', ' fft not initialized ', 1 ) CALL errore( ' pfwfft 2 ', ' fft not initialized ', 1 )
IF ( SIZE( cpsi, 1 ) /= dfftp%nr1x ) THEN IF ( SIZE( cpsi ) /= dfftp%nnr ) THEN
WRITE( stdout, * ) 'Values = ', SIZE( cpsi, 1 ), dfftp%nr1x WRITE( stdout, * ) 'Values = ', SIZE( cpsi ), dfftp%nnr
CALL errore( ' pfwfft 2 ', ' inconsistent array dimensions ', 1 ) CALL errore( ' pfwfft 2 ', ' inconsistent array dimensions ', 1 )
END IF END IF
IF ( SIZE( cpsi, 2 ) /= dfftp%nr2x ) &
CALL errore( ' pfwfft 2 ', ' inconsistent array dimensions ', 2 )
IF ( SIZE( cpsi, 3 ) /= dfftp%npl ) &
CALL errore( ' pfwfft 2 ', ' inconsistent array dimensions ', 3 )
#if defined __PARA #if defined __PARA
ALLOCATE( zwrk( dfftp%nsp( mpime + 1 ) * dfftp%nr3x ) ) ALLOCATE( zwrk( dfftp%nsp( mpime + 1 ) * dfftp%nr3x ) )
CALL pc3fft_drv(cpsi(1,1,1), zwrk, -1, dfftp, FFT_MODE_POTE) CALL pc3fft_drv(cpsi(1), zwrk, -1, dfftp, FFT_MODE_POTE)
CALL psi2c( zwrk, SIZE( zwrk ), c(1), c(1), ng, 10 ) CALL psi2c( zwrk, SIZE( zwrk ), c(1), c(1), ng, 10 )
@ -187,7 +183,7 @@
#else #else
ALLOCATE( psi( SIZE( cpsi, 1 ), SIZE( cpsi, 2 ), SIZE( cpsi, 3 ) ) ) ALLOCATE( psi( SIZE( cpsi ) ) )
psi = cpsi psi = cpsi
@ -221,10 +217,10 @@
IMPLICIT NONE IMPLICIT NONE
REAL(DP), INTENT(IN) :: A(:,:,:) REAL(DP), INTENT(IN) :: A(:)
COMPLEX(DP) :: C(:) COMPLEX(DP) :: C(:)
COMPLEX(DP), allocatable :: psi(:,:,:) COMPLEX(DP), allocatable :: psi(:)
COMPLEX(DP), ALLOCATABLE :: zwrk(:) COMPLEX(DP), ALLOCATABLE :: zwrk(:)
REAL(DP) :: t1 REAL(DP) :: t1
INTEGER :: ierr, ig, k, is INTEGER :: ierr, ig, k, is
@ -234,14 +230,10 @@
IF ( first ) & IF ( first ) &
CALL errore( ' pfwfft 1 ', ' fft not initialized ', 1 ) CALL errore( ' pfwfft 1 ', ' fft not initialized ', 1 )
IF ( SIZE( A, 1 ) /= dfftp%nr1x ) & IF ( SIZE( A ) /= dfftp%nnr ) &
CALL errore( ' pfwfft 1 ', ' inconsistent array dimensions ', 1 ) CALL errore( ' pfwfft 1 ', ' inconsistent array dimensions ', 1 )
IF ( SIZE( A, 2 ) /= dfftp%nr2x ) &
CALL errore( ' pfwfft 1 ', ' inconsistent array dimensions ', 2 )
IF ( SIZE( A, 3 ) /= dfftp%npl ) &
CALL errore( ' pfwfft 1 ', ' inconsistent array dimensions ', 3 )
ALLOCATE( psi( SIZE(A,1), SIZE(A,2), SIZE(A,3) ), STAT=ierr) ALLOCATE( psi( SIZE(A) ), STAT=ierr)
IF( ierr /= 0 ) call errore(' PFWFFT ', ' allocation of psi failed ' ,0) IF( ierr /= 0 ) call errore(' PFWFFT ', ' allocation of psi failed ' ,0)
psi = CMPLX( A, 0.d0 ) psi = CMPLX( A, 0.d0 )
@ -250,7 +242,7 @@
ALLOCATE( zwrk( dfftp%nsp( mpime + 1 ) * dfftp%nr3x ) ) ALLOCATE( zwrk( dfftp%nsp( mpime + 1 ) * dfftp%nr3x ) )
CALL pc3fft_drv(psi(1,1,1), zwrk, -1, dfftp, FFT_MODE_POTE) CALL pc3fft_drv(psi(1), zwrk, -1, dfftp, FFT_MODE_POTE)
CALL psi2c( zwrk(1), SIZE( zwrk ), c(1), c(1), ng, 10 ) CALL psi2c( zwrk(1), SIZE( zwrk ), c(1), c(1), ng, 10 )
@ -287,12 +279,12 @@
IMPLICIT NONE IMPLICIT NONE
REAL(DP), INTENT(INOUT) :: C(:,:,:) REAL(DP), INTENT(INOUT) :: C(:)
REAL(DP), INTENT(IN), OPTIONAL :: ALPHA REAL(DP), INTENT(IN), OPTIONAL :: ALPHA
COMPLEX(DP), INTENT(IN) :: A(:) COMPLEX(DP), INTENT(IN) :: A(:)
INTEGER :: ierr INTEGER :: ierr
COMPLEX(DP), ALLOCATABLE :: psi(:,:,:) COMPLEX(DP), ALLOCATABLE :: psi(:)
COMPLEX(DP), ALLOCATABLE :: zwrk(:) COMPLEX(DP), ALLOCATABLE :: zwrk(:)
REAL(DP) t1 REAL(DP) t1
! !
@ -301,14 +293,10 @@
IF ( first ) & IF ( first ) &
CALL errore(' pinvfft ',' fft not initialized ', 0 ) CALL errore(' pinvfft ',' fft not initialized ', 0 )
IF ( SIZE( c, 1 ) /= dfftp%nr1x ) & IF ( SIZE( c ) /= dfftp%nnr ) &
CALL errore( ' pinvfft 2 ', ' inconsistent array dimensions ', 1 ) CALL errore( ' pinvfft 2 ', ' inconsistent array dimensions ', 1 )
IF ( SIZE( c, 2 ) /= dfftp%nr2x ) &
CALL errore( ' pinvfft 2 ', ' inconsistent array dimensions ', 2 )
IF ( SIZE( c, 3 ) /= dfftp%npl ) &
CALL errore( ' pinvfft 2 ', ' inconsistent array dimensions ', 3 )
ALLOCATE( psi( SIZE( c, 1 ), SIZE( c, 2 ), SIZE( c, 3 ) ), STAT=ierr) ALLOCATE( psi( SIZE( c ) ), STAT=ierr)
IF( ierr /= 0 ) call errore(' PFWFFT ', ' allocation of psi failed ' ,0) IF( ierr /= 0 ) call errore(' PFWFFT ', ' allocation of psi failed ' ,0)
#if defined __PARA #if defined __PARA
@ -321,7 +309,7 @@
CALL c2psi( zwrk, SIZE( zwrk ), a(1), a(1), ng, 11 ) CALL c2psi( zwrk, SIZE( zwrk ), a(1), a(1), ng, 11 )
END IF END IF
CALL pc3fft_drv(psi(1,1,1), zwrk, +1, dfftp, FFT_MODE_POTE) CALL pc3fft_drv(psi(1), zwrk, +1, dfftp, FFT_MODE_POTE)
DEALLOCATE( zwrk ) DEALLOCATE( zwrk )
@ -370,10 +358,10 @@
COMPLEX(DP) :: C(:) COMPLEX(DP) :: C(:)
COMPLEX(DP), OPTIONAL :: CA(:) COMPLEX(DP), OPTIONAL :: CA(:)
COMPLEX(DP) :: psi(:,:,:) COMPLEX(DP) :: psi(:)
REAL(DP) :: T1 REAL(DP) :: T1
INTEGER :: ierr INTEGER :: ierr
COMPLEX(DP), ALLOCATABLE :: psitmp(:,:,:) COMPLEX(DP), ALLOCATABLE :: psitmp(:)
COMPLEX(DP), ALLOCATABLE :: zwrk(:) COMPLEX(DP), ALLOCATABLE :: zwrk(:)
t1 = cclock() t1 = cclock()
@ -381,19 +369,15 @@
IF ( first ) & IF ( first ) &
CALL errore(' pw_fwfft 1 ',' fft not initialized ', 1 ) CALL errore(' pw_fwfft 1 ',' fft not initialized ', 1 )
IF ( SIZE( psi, 1 ) /= dffts%nr1x ) & IF ( SIZE( psi ) /= dffts%nnr ) &
CALL errore( ' pw_fwfft 1 ', ' inconsistent array dimensions ', 1 ) CALL errore( ' pw_fwfft 1 ', ' inconsistent array dimensions ', 1 )
IF ( SIZE( psi, 2 ) /= dffts%nr2x ) &
CALL errore( ' pw_fwfft 1 ', ' inconsistent array dimensions ', 2 )
IF ( SIZE( psi, 3 ) /= dffts%npl ) &
CALL errore( ' pw_fwfft 1 ', ' inconsistent array dimensions ', 3 )
#if defined __PARA #if defined __PARA
ALLOCATE( zwrk( dffts%nsp( mpime + 1 ) * dffts%nr3x ) ) ALLOCATE( zwrk( dffts%nsp( mpime + 1 ) * dffts%nr3x ) )
CALL pc3fft_drv(psi(1,1,1), zwrk, -1, dffts, FFT_MODE_WAVE) CALL pc3fft_drv(psi(1), zwrk, -1, dffts, FFT_MODE_WAVE)
IF( PRESENT( ca ) ) THEN IF( PRESENT( ca ) ) THEN
CALL psi2c( zwrk, SIZE( zwrk ), c(1), ca(1), ngw, 2 ) CALL psi2c( zwrk, SIZE( zwrk ), c(1), ca(1), ngw, 2 )
@ -405,7 +389,7 @@
#else #else
ALLOCATE( psitmp( SIZE( psi, 1 ), SIZE( psi, 2 ), SIZE( psi, 3 ) ) ) ALLOCATE( psitmp( SIZE( psi ) ) )
psitmp = psi psitmp = psi
@ -441,7 +425,7 @@
COMPLEX(DP), INTENT(IN) :: C(:) COMPLEX(DP), INTENT(IN) :: C(:)
COMPLEX(DP), INTENT(IN), OPTIONAL :: CA(:) COMPLEX(DP), INTENT(IN), OPTIONAL :: CA(:)
COMPLEX(DP) :: psi(:,:,:) COMPLEX(DP) :: psi(:)
COMPLEX(DP), ALLOCATABLE :: zwrk(:) COMPLEX(DP), ALLOCATABLE :: zwrk(:)
REAL(DP) :: T1 REAL(DP) :: T1
@ -451,12 +435,8 @@
T1 = cclock() T1 = cclock()
IF ( SIZE( psi, 1 ) /= dffts%nr1x ) & IF ( SIZE( psi ) /= dffts%nnr ) &
CALL errore( ' pw_invfft 1 ', ' inconsistent array dimensions ', 1 ) CALL errore( ' pw_invfft 1 ', ' inconsistent array dimensions ', 1 )
IF ( SIZE( psi, 2 ) /= dffts%nr2x ) &
CALL errore( ' pw_invfft 1 ', ' inconsistent array dimensions ', 2 )
IF ( SIZE( psi, 3 ) /= dffts%npl ) &
CALL errore( ' pw_invfft 1 ', ' inconsistent array dimensions ', 3 )
#if defined __PARA #if defined __PARA
@ -472,7 +452,7 @@
END IF END IF
END IF END IF
CALL pc3fft_drv(psi(1,1,1), zwrk, +1, dffts, FFT_MODE_WAVE) CALL pc3fft_drv(psi(1), zwrk, +1, dffts, FFT_MODE_WAVE)
DEALLOCATE( zwrk ) DEALLOCATE( zwrk )

View File

@ -9,7 +9,6 @@
USE kinds, ONLY: DP USE kinds, ONLY: DP
USE parallel_types, ONLY: descriptor, processors_grid USE parallel_types, ONLY: descriptor, processors_grid
USE descriptors_module, ONLY: desc_init
IMPLICIT NONE IMPLICIT NONE
PRIVATE PRIVATE
SAVE SAVE

View File

@ -43,13 +43,13 @@
COMPLEX(DP), INTENT(OUT) :: dco(:), dce(:) COMPLEX(DP), INTENT(OUT) :: dco(:), dce(:)
COMPLEX(DP), INTENT(IN) :: co(:), ce(:) COMPLEX(DP), INTENT(IN) :: co(:), ce(:)
REAL(DP), INTENT(IN) :: fio, fie REAL(DP), INTENT(IN) :: fio, fie
REAL(DP), INTENT(IN) :: v(:,:,:) REAL(DP), INTENT(IN) :: v(:)
REAL(DP), INTENT(IN) :: hg(:) REAL(DP), INTENT(IN) :: hg(:)
COMPLEX(DP), OPTIONAL :: psi_stored(:,:,:) COMPLEX(DP), OPTIONAL :: psi_stored(:)
! ... declare other variables ! ... declare other variables
! !
COMPLEX(DP), ALLOCATABLE :: psi(:,:,:) COMPLEX(DP), ALLOCATABLE :: psi(:)
COMPLEX(DP) :: fp, fm, aro, are COMPLEX(DP) :: fp, fm, aro, are
REAL(DP) :: fioby2, fieby2, arg REAL(DP) :: fioby2, fieby2, arg
INTEGER :: ig INTEGER :: ig
@ -60,7 +60,7 @@
psi_stored = psi_stored * CMPLX(v, 0.0d0) psi_stored = psi_stored * CMPLX(v, 0.0d0)
CALL pw_fwfft(psi_stored, dco, dce) CALL pw_fwfft(psi_stored, dco, dce)
ELSE ELSE
ALLOCATE( psi(SIZE(v,1), SIZE(v,2), SIZE(v,3)) ) ALLOCATE( psi( SIZE(v) ) )
CALL pw_invfft(psi, co, ce) CALL pw_invfft(psi, co, ce)
psi = psi * CMPLX(v, 0.0d0) psi = psi * CMPLX(v, 0.0d0)
CALL pw_fwfft(psi, dco, dce) CALL pw_fwfft(psi, dco, dce)
@ -268,7 +268,7 @@
INTEGER, INTENT(IN) :: ib, iss ! band and spin index INTEGER, INTENT(IN) :: ib, iss ! band and spin index
COMPLEX(DP), INTENT(IN) :: c(:,:) COMPLEX(DP), INTENT(IN) :: c(:,:)
COMPLEX(DP), INTENT(OUT) :: df(:), da(:) COMPLEX(DP), INTENT(OUT) :: df(:), da(:)
REAL (DP), INTENT(IN) :: v(:,:,:), bec(:,:), f(:) REAL (DP), INTENT(IN) :: v(:), bec(:,:), f(:)
COMPLEX(DP), INTENT(IN) :: eigr(:,:) COMPLEX(DP), INTENT(IN) :: eigr(:,:)
type (wave_descriptor), INTENT(IN) :: cdesc type (wave_descriptor), INTENT(IN) :: cdesc
! !
@ -327,7 +327,7 @@
INTEGER, INTENT(IN) :: ispin INTEGER, INTENT(IN) :: ispin
COMPLEX(DP), INTENT(INOUT) :: c(:,:) COMPLEX(DP), INTENT(INOUT) :: c(:,:)
type (wave_descriptor), INTENT(IN) :: cdesc type (wave_descriptor), INTENT(IN) :: cdesc
REAL(DP), INTENT(IN) :: vpot(:,:,:), f(:) REAL(DP), INTENT(IN) :: vpot(:), f(:)
COMPLEX(DP), INTENT(OUT) :: cgrad(:,:) COMPLEX(DP), INTENT(OUT) :: cgrad(:,:)
COMPLEX(DP), INTENT(IN) :: eigr(:,:) COMPLEX(DP), INTENT(IN) :: eigr(:,:)
REAL(DP), INTENT(IN) :: bec(:,:) REAL(DP), INTENT(IN) :: bec(:,:)

View File

@ -25,7 +25,7 @@ MODULE from_scratch_module
CONTAINS CONTAINS
! !
!-------------------------------------------------------------------------- !--------------------------------------------------------------------------
SUBROUTINE from_scratch_fpmd( rhoe, desc, cm, c0, cp, ce, cdesc, edesc, & SUBROUTINE from_scratch_fpmd( rhoe, cm, c0, cp, ce, cdesc, edesc, &
eigr, ei1, ei2, ei3, sfac, fi, ht, atoms, & eigr, ei1, ei2, ei3, sfac, fi, ht, atoms, &
bec, becdr, vpot, edft ) bec, becdr, vpot, edft )
!------------------------------------------------------------------------ !------------------------------------------------------------------------
@ -47,7 +47,6 @@ MODULE from_scratch_module
USE orthogonalize, ONLY : ortho USE orthogonalize, ONLY : ortho
USE control_flags, ONLY : tcarpar, tfor, thdyn, tortho, tpre, tranp, & USE control_flags, ONLY : tcarpar, tfor, thdyn, tortho, tpre, tranp, &
force_pairing, iprsta, tprnfor, amprp, tsde force_pairing, iprsta, tprnfor, amprp, tsde
USE charge_types, ONLY : charge_descriptor
USE time_step, ONLY : delt USE time_step, ONLY : delt
USE runcp_module, ONLY : runcp_ncpp USE runcp_module, ONLY : runcp_ncpp
use grid_dimensions, only : nr1, nr2, nr3 use grid_dimensions, only : nr1, nr2, nr3
@ -69,15 +68,14 @@ MODULE from_scratch_module
COMPLEX(DP), INTENT(OUT) :: ei2(:,:) COMPLEX(DP), INTENT(OUT) :: ei2(:,:)
COMPLEX(DP), INTENT(OUT) :: ei3(:,:) COMPLEX(DP), INTENT(OUT) :: ei3(:,:)
COMPLEX(DP), INTENT(OUT) :: sfac(:,:) COMPLEX(DP), INTENT(OUT) :: sfac(:,:)
REAL(DP), INTENT(OUT) :: rhoe(:,:,:,:) REAL(DP), INTENT(OUT) :: rhoe(:,:)
REAL(DP), INTENT(OUT) :: bec(:,:) REAL(DP), INTENT(OUT) :: bec(:,:)
REAL(DP), INTENT(OUT) :: becdr(:,:,:) REAL(DP), INTENT(OUT) :: becdr(:,:,:)
REAL(DP), INTENT(OUT) :: fi(:,:,:) REAL(DP), INTENT(OUT) :: fi(:,:,:)
REAL(DP), INTENT(OUT) :: vpot(:,:,:,:) REAL(DP), INTENT(OUT) :: vpot(:,:)
TYPE(atoms_type) , INTENT(OUT) :: atoms TYPE(atoms_type) , INTENT(OUT) :: atoms
TYPE(dft_energy_type) , INTENT(OUT) :: edft TYPE(dft_energy_type) , INTENT(OUT) :: edft
TYPE(boxdimensions) , INTENT(INOUT) :: ht TYPE(boxdimensions) , INTENT(INOUT) :: ht
TYPE(charge_descriptor), INTENT(IN) :: desc
TYPE(wave_descriptor), INTENT(IN) :: cdesc, edesc TYPE(wave_descriptor), INTENT(IN) :: cdesc, edesc
COMPLEX(DP), INTENT(INOUT) :: cm(:,:,:,:), c0(:,:,:,:) COMPLEX(DP), INTENT(INOUT) :: cm(:,:,:,:), c0(:,:,:,:)
COMPLEX(DP), INTENT(INOUT) :: cp(:,:,:,:), ce(:,:,:,:) COMPLEX(DP), INTENT(INOUT) :: cp(:,:,:,:), ce(:,:,:,:)
@ -164,9 +162,9 @@ MODULE from_scratch_module
! !
edft%enl = nlrh_m( cm, cdesc, ttforce, atoms, fi, bec, becdr, eigr ) edft%enl = nlrh_m( cm, cdesc, ttforce, atoms, fi, bec, becdr, eigr )
! !
CALL rhoofr( 0, cm, cdesc, fi, rhoe, desc, ht ) CALL rhoofr( 0, cm, cdesc, fi, rhoe, ht )
! !
CALL vofrhos( ttprint, ttforce, tstress, rhoe, desc, atoms, & CALL vofrhos( ttprint, ttforce, tstress, rhoe, atoms, &
vpot, bec, cm, cdesc, fi, eigr, ei1, ei2, ei3, & vpot, bec, cm, cdesc, fi, eigr, ei1, ei2, ei3, &
sfac, timepre, ht, edft ) sfac, timepre, ht, edft )
! !
@ -255,6 +253,8 @@ MODULE from_scratch_module
USE runcp_module, ONLY : runcp_uspp USE runcp_module, ONLY : runcp_uspp
USE electrons_base, ONLY : f, nspin USE electrons_base, ONLY : f, nspin
USE phase_factors_module, ONLY : strucf USE phase_factors_module, ONLY : strucf
USE orthogonalize, ONLY : ortho
USE orthogonalize_base, ONLY : updatc, calphi
! !
IMPLICIT NONE IMPLICIT NONE
! !
@ -394,11 +394,10 @@ MODULE from_scratch_module
! calphi calculates phi ! calphi calculates phi
! the electron mass rises with g**2 ! the electron mass rises with g**2
! !
CALL calphi( cm, ngw, ema0bg, bec, nkb, vkb, phi, nbsp ) CALL calphi( cm, ngw, bec, nkb, vkb, phi, nbsp, ema0bg )
if( tortho ) then if( tortho ) then
CALL ortho( eigr, c0, phi, lambda, bigr, iter, ccc, ortho_eps, ortho_max, delt, bephi, becp ) CALL ortho( eigr, c0(:,:,1,1), phi(:,:,1,1), lambda, bigr, iter, ccc, bephi, becp )
else else
CALL gram( vkb, bec, nkb, c0, ngw, nbsp ) CALL gram( vkb, bec, nkb, c0, ngw, nbsp )
endif endif
@ -410,8 +409,11 @@ MODULE from_scratch_module
if ( tpre ) CALL nlfh( bec, dbec, lambda ) if ( tpre ) CALL nlfh( bec, dbec, lambda )
! !
if ( tortho ) CALL updatc( ccc, lambda, phi, bephi, becp, bec, c0 ) if ( tortho ) CALL updatc( ccc, nbsp, lambda, SIZE(lambda,1), phi, SIZE(phi,1), &
bephi, SIZE(bephi,1), becp, bec, c0 )
!
CALL calbec ( nvb+1, nsp, eigr, c0, bec ) CALL calbec ( nvb+1, nsp, eigr, c0, bec )
if ( tpre ) CALL caldbec( ngw, nkb, nbsp, 1, nsp, eigr, cm, dbec, .true. ) if ( tpre ) CALL caldbec( ngw, nkb, nbsp, 1, nsp, eigr, cm, dbec, .true. )
if(iprsta.ge.3) CALL dotcsc(eigr,c0) if(iprsta.ge.3) CALL dotcsc(eigr,c0)

View File

@ -82,34 +82,26 @@
RETURN RETURN
END SUBROUTINE free_blacs_grid END SUBROUTINE free_blacs_grid
SUBROUTINE get_blacs_grid(grid, rows, columns, debug)
SUBROUTINE get_blacs_grid(grid, debug)
TYPE (processors_grid), INTENT(OUT) :: grid TYPE (processors_grid), INTENT(OUT) :: grid
INTEGER, INTENT(IN), OPTIONAL :: rows
INTEGER, INTENT(IN), OPTIONAL :: columns
INTEGER, INTENT(IN), OPTIONAL :: debug INTEGER, INTENT(IN), OPTIONAL :: debug
INTEGER :: iam, nproc , nprow, npcol, context, myrow, mycol INTEGER :: iam, nproc , nprow, npcol, context, myrow, mycol
INTEGER :: ndims, dims(2), coor(2)
LOGICAL :: periods(2), reorder
INTEGER :: comm_cart
INTEGER :: ierr
#if defined __SCALAPACK #if defined __SCALAPACK
CALL BLACS_PINFO( iam, nproc ) CALL BLACS_PINFO( iam, nproc )
#else #else
nproc = -1 ndims = 2
#endif #endif
IF(.NOT.PRESENT(rows) .AND. .NOT.PRESENT(columns) ) THEN
CALL calculate_grid_dims(nproc , nprow, npcol)
ELSE IF (PRESENT(rows) .AND. .NOT.PRESENT(columns) ) THEN
!IF( rows .GT. nproc ) THEN
!END IF
nprow = rows; npcol = nproc / rows
ELSE IF (.NOT.PRESENT(rows) .AND. PRESENT(columns) ) THEN
!IF( columns .GT. nproc ) THEN
!END IF
npcol = columns; nprow = nproc / columns
ELSE
!IF( rows * columns .GT. nproc ) THEN
!END IF
nprow = rows; npcol = columns
END IF
#if defined __SCALAPACK #if defined __SCALAPACK
CALL BLACS_GET( -1, 0, context ) CALL BLACS_GET( -1, 0, context )

View File

@ -6,36 +6,12 @@
! or http://www.gnu.org/copyleft/gpl.txt . ! or http://www.gnu.org/copyleft/gpl.txt .
! !
#include "f_defs.h" #include "f_defs.h"
#if defined __T3E
# define daxpy saxpy
# define zaxpy caxpy
#endif
! AB INITIO COSTANT PRESSURE MOLECULAR DYNAMICS
! ----------------------------------------------
! Car-Parrinello Parallel Program
! Carlo Cavazzoni - Gerardo Ballabio
! SISSA, Trieste, Italy - 1997-99
! Last modified: Sun Nov 21 11:19:43 MET 1999
! ----------------------------------------------
! BEGIN manual
MODULE guess MODULE guess
! (describe briefly what this module does...)
! ----------------------------------------------
! routines in this module:
! SUBROUTINE guess_setup(tguess_inp)
! SUBROUTINE guessc0(tk,c0,cm)
! SUBROUTINE guessrho(rho,cm,c0,occ,ht)
! SUBROUTINE ucalc_kp(a,b,ngw,gzero,n,lambda)
! SUBROUTINE ucalc(a,b,ngw,gzero,n,lambda)
! ----------------------------------------------
! END manual
! ... declare modules ! ... declare modules
USE kinds USE kinds
USE parallel_toolkit, ONLY: matmulp, cmatmulp, & USE parallel_toolkit, ONLY: rep_matmul_drv, &
diagonalize, cdiagonalize diagonalize, cdiagonalize
IMPLICIT NONE IMPLICIT NONE
@ -43,7 +19,7 @@
PRIVATE PRIVATE
REAL(DP), ALLOCATABLE :: rho_save( :, :, :, : ) REAL(DP), ALLOCATABLE :: rho_save( :, : )
! ... declare module-scope variables ! ... declare module-scope variables
LOGICAL :: tguess LOGICAL :: tguess
@ -140,7 +116,8 @@
DO ik = 1, nk DO ik = 1, nk
CALL ucalc_kp(cm(:,:,ik,1),c0(:,:,ik,1),ngw,cdesc%gzero,n,cuu) CALL ucalc_kp(cm(:,:,ik,1),c0(:,:,ik,1),ngw,cdesc%gzero,n,cuu)
CALL cmatmulp('N','C',cuu,cuu,ca,n) ! CALL cmatmulp('N','C',cuu,cuu,ca,n)
CALL errore(' guess ', ' complex matrix mult to be implemented ', 1 )
CALL cdiagonalize(1,ca,costemp,cap,n,nproc,mpime) CALL cdiagonalize(1,ca,costemp,cap,n,nproc,mpime)
DO j=1,n DO j=1,n
DO i=1,n DO i=1,n
@ -150,7 +127,8 @@
DO i=1,n DO i=1,n
costh2(i)=1.0d0/sqrt(costemp(n-i+1)) costh2(i)=1.0d0/sqrt(costemp(n-i+1))
END DO END DO
CALL cmatmulp('N','N',cuu,ca,cap,n) !CALL cmatmulp('N','N',cuu,ca,cap,n)
CALL errore(' guess ', ' complex matrix mult to be implemented ', 1 )
DO j=1,n DO j=1,n
DO i=1,n DO i=1,n
cap(i,j)=cap(i,j) * costh2(i) cap(i,j)=cap(i,j) * costh2(i)
@ -186,7 +164,7 @@
ALLOCATE(crot(ngw,n)) ALLOCATE(crot(ngw,n))
CALL ucalc(cm(:,:,1,1),c0(:,:,1,1),ngw,cdesc%gzero,n,uu) CALL ucalc(cm(:,:,1,1),c0(:,:,1,1),ngw,cdesc%gzero,n,uu)
CALL matmulp('T','N',uu,uu,a,n) CALL rep_matmul_drv('T','N',n,n,n,1.0d0,uu,n,uu,n,0.0d0,a,n,group)
CALL diagonalize(1,a,costemp,ap,n,nproc,mpime) CALL diagonalize(1,a,costemp,ap,n,nproc,mpime)
DO j=1,n DO j=1,n
DO i=1,n DO i=1,n
@ -196,7 +174,7 @@
DO i=1,n DO i=1,n
costh2(i)=1.0d0/sqrt(costemp(n-i+1)) costh2(i)=1.0d0/sqrt(costemp(n-i+1))
END DO END DO
CALL matmulp('N','N',uu,a,ap,n) CALL rep_matmul_drv('N','N',n,n,n,1.0d0,uu,n,a,n,0.0d0,ap,n,group)
DO j=1,n DO j=1,n
DO i=1,n DO i=1,n
ap(i,j)=ap(i,j) * costh2(i) ap(i,j)=ap(i,j) * costh2(i)
@ -245,7 +223,7 @@
! ---------------------------------------------- ! ----------------------------------------------
! ---------------------------------------------- ! ----------------------------------------------
SUBROUTINE guessrho(rho, desc, cm, c0, cdesc, occ, ht ) SUBROUTINE guessrho(rho, cm, c0, cdesc, occ, ht )
! (describe briefly what this routine does...) ! (describe briefly what this routine does...)
! ---------------------------------------------- ! ----------------------------------------------
@ -255,38 +233,33 @@
use brillouin, only: kpoints, kp use brillouin, only: kpoints, kp
USE wave_types USE wave_types
USE parameters, ONLY: nspinx USE parameters, ONLY: nspinx
USE charge_types, ONLY: charge_descriptor
! ... declare subroutine argument ! ... declare subroutine argument
REAL(DP), INTENT(OUT) :: rho(:,:,:,:) REAL(DP), INTENT(OUT) :: rho(:,:)
TYPE (charge_descriptor), INTENT(IN) :: desc
COMPLEX(DP), INTENT(IN) :: c0(:,:,:,:), cm(:,:,:,:) COMPLEX(DP), INTENT(IN) :: c0(:,:,:,:), cm(:,:,:,:)
TYPE (wave_descriptor), INTENT(IN) :: cdesc TYPE (wave_descriptor), INTENT(IN) :: cdesc
TYPE (boxdimensions), INTENT(IN) :: ht TYPE (boxdimensions), INTENT(IN) :: ht
REAL(DP), INTENT(IN) :: occ(:,:,:) REAL(DP), INTENT(IN) :: occ(:,:,:)
! ... declare other variables ! ... declare other variables
REAL(DP), ALLOCATABLE :: rho0( :, :, :, : ) REAL(DP), ALLOCATABLE :: rho0( :, : )
LOGICAL, SAVE :: tfirst = .TRUE. LOGICAL, SAVE :: tfirst = .TRUE.
INTEGER :: ispin, nspin, nx, ny, nz INTEGER :: ispin, nspin
! ... end of declarations ! ... end of declarations
! ---------------------------------------------- ! ----------------------------------------------
nx = SIZE( rho, 1 ) nspin = SIZE( rho, 2 )
ny = SIZE( rho, 2 )
nz = SIZE( rho, 3 )
nspin = SIZE( rho, 4 )
IF( tfirst ) THEN IF( tfirst ) THEN
ALLOCATE( rho_save( nx, ny, nz, nspin ) ) ALLOCATE( rho_save( SIZE( rho, 1 ), nspin ) )
CALL rhoofr( 1, cm, cdesc, occ, rho_save, desc, ht) CALL rhoofr( 1, cm, cdesc, occ, rho_save, ht)
tfirst = .FALSE. tfirst = .FALSE.
END IF END IF
ALLOCATE( rho0( nx, ny, nz, nspin ) ) ALLOCATE( rho0( SIZE( rho, 1 ), nspin ) )
CALL rhoofr( 1, c0, cdesc, occ, rho0, desc, ht) CALL rhoofr( 1, c0, cdesc, occ, rho0, ht)
rho = 2.0d0 * rho0 - rho_save rho = 2.0d0 * rho0 - rho_save

View File

@ -51,8 +51,8 @@ SUBROUTINE init_run()
becdr, sfac, eigr, ei1, ei2, ei3, taub, & becdr, sfac, eigr, ei1, ei2, ei3, taub, &
irb, eigrb, rhog, rhos, rhor, bephi, & irb, eigrb, rhog, rhos, rhor, bephi, &
becp, acc, acc_this_run, wfill, wempt, & becp, acc, acc_this_run, wfill, wempt, &
edft, nfi, atoms0, vpot, occn, desc, & edft, nfi, atoms0, vpot, occn, &
rhoe, atomsm, ht0, htm atomsm, ht0, htm
USE cp_main_variables, ONLY : allocate_mainvar USE cp_main_variables, ONLY : allocate_mainvar
USE energies, ONLY : eself, enl, ekin, etot, enthal, ekincm USE energies, ONLY : eself, enl, ekin, etot, enthal, ekincm
USE stre, ONLY : stress USE stre, ONLY : stress
@ -257,7 +257,7 @@ SUBROUTINE init_run()
! !
ELSE IF ( program_name == 'FPMD' ) THEN ELSE IF ( program_name == 'FPMD' ) THEN
! !
CALL from_scratch( rhoe, desc, cm, c0, cp, ce, wfill, wempt, eigr, & CALL from_scratch( rhor, cm, c0, cp, ce, wfill, wempt, eigr, &
ei1, ei2, ei3, sfac, occn, ht0, atoms0, bec, & ei1, ei2, ei3, sfac, occn, ht0, atoms0, bec, &
becdr, vpot, edft ) becdr, vpot, edft )
! !
@ -280,7 +280,7 @@ SUBROUTINE init_run()
ELSE IF( program_name == 'FPMD' ) THEN ELSE IF( program_name == 'FPMD' ) THEN
! !
CALL readfile( nfi, tps, c0, cm, wfill, occn, atoms0, atomsm, acc, & CALL readfile( nfi, tps, c0, cm, wfill, occn, atoms0, atomsm, acc, &
taui, cdmi, htm, ht0, rhoe, desc, vpot) taui, cdmi, htm, ht0, rhor, vpot)
! !
END IF END IF
! !
@ -294,7 +294,7 @@ SUBROUTINE init_run()
! !
ELSE IF( program_name == 'FPMD' ) THEN ELSE IF( program_name == 'FPMD' ) THEN
! !
CALL from_restart( nfi, acc, rhoe, desc, cm, c0, wfill, eigr, ei1, ei2, & CALL from_restart( nfi, acc, rhor, cm, c0, wfill, eigr, ei1, ei2, &
ei3, sfac, occn, htm, ht0, atomsm, atoms0, bec, & ei3, sfac, occn, htm, ht0, atomsm, atoms0, bec, &
becdr, vpot, edft) becdr, vpot, edft)
! !

View File

@ -24,7 +24,7 @@
use energies, only: eht, epseu, exc, etot, eself, enl, ekin, & use energies, only: eht, epseu, exc, etot, eself, enl, ekin, &
& atot, entropy, egrand & atot, entropy, egrand
use electrons_base, only: f, nspin, nel, iupdwn, nupdwn, nudx, nelt, & use electrons_base, only: f, nspin, nel, iupdwn, nupdwn, nudx, nelt, &
nx => nbspx, n => nbsp, ispin => fspin nx => nbspx, n => nbsp, ispin
use ensemble_dft, only: tens, tgrand, ninner, ismear, etemp, ef, & use ensemble_dft, only: tens, tgrand, ninner, ismear, etemp, ef, &
& tdynz, tdynf, zmass, fmass, fricz, fricf, z0, c0diag, & & tdynz, tdynf, zmass, fmass, fricz, fricf, z0, c0diag, &

View File

@ -320,8 +320,8 @@ MODULE input
! gvectors and charge density, in reciprocal space. ! gvectors and charge density, in reciprocal space.
! !
trhor_ = ( TRIM( calculation ) == 'nscf' ) trhor_ = ( TRIM( calculation ) == 'nscf' )
trhow_ = ( TRIM( disk_io ) == 'high' ) trhow_ = ( TRIM( disk_io ) == 'high' ) ! charge density now written to XML file
tvlocw_ = .FALSE. tvlocw_ = ( TRIM( disk_io ) == 'high' ) ! warning this is not working
! !
SELECT CASE( TRIM( verbosity ) ) SELECT CASE( TRIM( verbosity ) )
CASE( 'minimal' ) CASE( 'minimal' )
@ -1354,9 +1354,9 @@ MODULE input
590 FORMAT( 3X,'Electron temperature control via nose thermostat') 590 FORMAT( 3X,'Electron temperature control via nose thermostat')
! !
700 FORMAT( /,3X, 'Verbosity: iprsta = ',i2,/) 700 FORMAT( /,3X, 'Verbosity: iprsta = ',i2,/)
720 FORMAT( 3X, 'charge density is read from unit 47') 720 FORMAT( 3X, 'charge density is read from file')
721 FORMAT( 3X, 'charge density is written in unit 47') 721 FORMAT( 3X, 'warning trhow has no effect rho is now written to XML save file')
722 FORMAT( 3X, 'local potential is written in unit 46') 722 FORMAT( 3X, 'warning tvlocw has no effect vloc is not written to file')
! !
END SUBROUTINE modules_info END SUBROUTINE modules_info
! !

View File

@ -238,7 +238,7 @@
TYPE (wave_descriptor), INTENT(IN) :: wfill, wempt TYPE (wave_descriptor), INTENT(IN) :: wfill, wempt
COMPLEX(DP) :: eigr(:,:) COMPLEX(DP) :: eigr(:,:)
REAL(DP), INTENT(IN) :: occ(:,:,:), bec(:,:) REAL(DP), INTENT(IN) :: occ(:,:,:), bec(:,:)
REAL (DP) :: vpot(:,:,:,:) REAL (DP) :: vpot(:,:)
! ... declare other variables ! ... declare other variables
INTEGER :: i, ik, ib, nk, ig, ngw, nb_g, nb_l, ispin, nspin, iks INTEGER :: i, ik, ib, nk, ig, ngw, nb_g, nb_l, ispin, nspin, iks
@ -279,7 +279,7 @@
ALLOCATE( eforce( ngw, nb_l, nk )) ALLOCATE( eforce( ngw, nb_l, nk ))
CALL dforce_all( ispin, cf(:,:,1,ispin_wfc), wfill, occ(:,1,ispin), eforce(:,:,1), & CALL dforce_all( ispin, cf(:,:,1,ispin_wfc), wfill, occ(:,1,ispin), eforce(:,:,1), &
vpot(:,:,:,ispin), eigr, bec ) vpot(:,ispin), eigr, bec )
CALL kohn_sham( ispin, cf(:,:,:,ispin_wfc), wfill, eforce ) CALL kohn_sham( ispin, cf(:,:,:,ispin_wfc), wfill, eforce )
@ -302,7 +302,7 @@
ALLOCATE( eforce( ngw, nb_l, nk )) ALLOCATE( eforce( ngw, nb_l, nk ))
CALL dforce_all( ispin, ce(:,:,1,ispin), wempt, fi(:,1), eforce(:,:,1), & CALL dforce_all( ispin, ce(:,:,1,ispin), wempt, fi(:,1), eforce(:,:,1), &
vpot(:,:,:,ispin), eigr, bec ) vpot(:,ispin), eigr, bec )
CALL kohn_sham( ispin, ce(:,:,:,ispin), wempt, eforce ) CALL kohn_sham( ispin, ce(:,:,:,ispin), wempt, eforce )
@ -400,7 +400,7 @@
TYPE (wave_descriptor), INTENT(IN) :: wfill, wempt TYPE (wave_descriptor), INTENT(IN) :: wfill, wempt
COMPLEX(DP) :: eigr(:,:) COMPLEX(DP) :: eigr(:,:)
REAL(DP), INTENT(IN) :: occ(:,:,:), bec(:,:) REAL(DP), INTENT(IN) :: occ(:,:,:), bec(:,:)
REAL (DP) :: vpot(:,:,:,:) REAL (DP) :: vpot(:,:)
! ... declare other variables ! ... declare other variables
INTEGER :: i, ik, ib, nk, ig, ngw, nb_g, nb_l, iks, nb, ispin INTEGER :: i, ik, ib, nk, ig, ngw, nb_g, nb_l, iks, nb, ispin
@ -440,9 +440,9 @@
ALLOCATE( eforce( ngw, nb, 1, 2 ) ) ALLOCATE( eforce( ngw, nb, 1, 2 ) )
CALL dforce_all( 1, cf(:,:,1,1), wfill, occ(:,1,1), eforce(:,:,1,1), & CALL dforce_all( 1, cf(:,:,1,1), wfill, occ(:,1,1), eforce(:,:,1,1), &
vpot(:,:,:,1), eigr, bec ) vpot(:,1), eigr, bec )
CALL dforce_all( 2, cf(:,:,1,1), wfill, occ(:,1,2), eforce(:,:,1,2), & CALL dforce_all( 2, cf(:,:,1,1), wfill, occ(:,1,2), eforce(:,:,1,2), &
vpot(:,:,:,2), eigr, bec ) vpot(:,2), eigr, bec )
DO i = 1, nupdwn(2) DO i = 1, nupdwn(2)
eforce(:,i,1,1) = occ(i,1,1) * eforce(:,i,1,1) + occ(i,1,2) * eforce(:,i,1,2) eforce(:,i,1,1) = occ(i,1,1) * eforce(:,i,1,1) + occ(i,1,2) * eforce(:,i,1,2)
@ -471,12 +471,12 @@
ALLOCATE( eforce( ngw, nb_l, 1, 1 )) ALLOCATE( eforce( ngw, nb_l, 1, 1 ))
CALL dforce_all( 1, ce(:,:,1,1), wempt, fi(:,1), eforce(:,:,1,1), vpot(:,:,:,1), & CALL dforce_all( 1, ce(:,:,1,1), wempt, fi(:,1), eforce(:,:,1,1), vpot(:,1), &
eigr, bec ) eigr, bec )
CALL kohn_sham( 1, ce(:,:,:,1), wempt, eforce(:,:,:,1) ) CALL kohn_sham( 1, ce(:,:,:,1), wempt, eforce(:,:,:,1) )
CALL dforce_all( 2, ce(:,:,1,2), wempt, fi(:,1), eforce(:,:,1,1), vpot(:,:,:,2), & CALL dforce_all( 2, ce(:,:,1,2), wempt, fi(:,1), eforce(:,:,1,1), vpot(:,2), &
eigr, bec ) eigr, bec )
CALL kohn_sham( 2, ce(:,:,:,2), wempt, eforce(:,:,:,1) ) CALL kohn_sham( 2, ce(:,:,:,2), wempt, eforce(:,:,:,1) )
@ -555,6 +555,7 @@
USE io_global, ONLY: ionode, ionode_id USE io_global, ONLY: ionode, ionode_id
USE io_global, ONLY: stdout USE io_global, ONLY: stdout
USE fft_base, ONLY: dfftp USE fft_base, ONLY: dfftp
USE grid_dimensions, ONLY: nr1, nr2, nr3, nr1x, nr2x, nr3x, nnrx
IMPLICIT NONE IMPLICIT NONE
@ -562,27 +563,13 @@
CHARACTER(LEN=*) :: file_name CHARACTER(LEN=*) :: file_name
COMPLEX(DP), ALLOCATABLE :: zcomp(:) COMPLEX(DP), ALLOCATABLE :: zcomp(:)
REAL(DP), ALLOCATABLE :: rcomp2(:) REAL(DP), ALLOCATABLE :: rcomp2(:)
COMPLEX(DP), ALLOCATABLE :: psi2(:,:,:) COMPLEX(DP), ALLOCATABLE :: psi2(:)
INTEGER :: nr1_l, nr2_l, nr3_l, nr1_g, nr2_g, nr3_g
INTEGER :: i, j, k, istr, izl INTEGER :: i, j, k, istr, izl
REAL(DP) :: charge REAL(DP) :: charge
LOGICAL :: top LOGICAL :: top
nr1_g = dfftp%nr1 ALLOCATE( zcomp( nr3 ), rcomp2( nr3 ) )
nr2_g = dfftp%nr2 ALLOCATE( psi2( nnrx ) )
nr3_g = dfftp%nr3
nr1_l = dfftp%nr1x
nr2_l = dfftp%nr2x
nr3_l = dfftp%npl
izl = 1
DO i = 1, mpime
izl = izl + dfftp%npp( i )
END DO
ALLOCATE( zcomp( nr3_g ), rcomp2( nr3_g ) )
ALLOCATE( psi2( nr1_l, nr2_l, nr3_l ) )
CALL pw_invfft( psi2, psi, psi ) CALL pw_invfft( psi2, psi, psi )
@ -597,25 +584,39 @@
END IF END IF
charge = 0.0d0 charge = 0.0d0
DO i = 1, nr1_g
DO j = 1, nr2_g izl = dfftp%ipp( mpime + 1 )
DO i = 1, nr1
DO j = 1, nr2
zcomp = 0.0d0 zcomp = 0.0d0
zcomp( izl : ( izl + nr3_l - 1 ) ) = psi2( i, j, 1 : nr3_l ) istr = i + nr1 * ( j - 1 )
CALL mp_sum( zcomp(1:nr3_g) )
DO k = 1, dfftp%npl
zcomp( izl + k ) = psi2( istr + nr1 * nr2 * ( k - 1 ) )
END DO
CALL mp_sum( zcomp( 1 : nr3 ) )
IF ( ionode ) THEN IF ( ionode ) THEN
rcomp2 = DBLE(zcomp)**2 rcomp2 = DBLE(zcomp)**2
WRITE(ksunit, fmt='(F10.5)') ( rcomp2(k), k=1, nr3_g ) WRITE(ksunit, fmt='(F10.5)') ( rcomp2(k), k=1, nr3 )
charge = charge + SUM(rcomp2) charge = charge + SUM(rcomp2)
END IF END IF
CALL mp_barrier() CALL mp_barrier()
END DO END DO
END DO END DO
IF ( ionode ) THEN IF ( ionode ) THEN
CLOSE(ksunit) CLOSE(ksunit)
WRITE( stdout,'(3X,A15," integrated charge : ",F14.5)') & WRITE( stdout,'(3X,A15," integrated charge : ",F14.5)') &
& file_name(1:istr), charge / DBLE(nr1_g*nr2_g*nr3_g) & file_name(1:istr), charge / DBLE(nr1*nr2*nr3)
END IF END IF
DEALLOCATE(zcomp, rcomp2, psi2) DEALLOCATE(zcomp, rcomp2, psi2)
! ... ! ...

View File

@ -187,7 +187,7 @@
USE io_files , ONLY: outdir, prefix USE io_files , ONLY: outdir, prefix
USE printout_base , ONLY: printout_base_init USE printout_base , ONLY: printout_base_init
USE cp_main_variables, ONLY : atoms0, atomsp, atomsm, ei1, ei2, ei3, eigr, sfac, & USE cp_main_variables, ONLY : atoms0, atomsp, atomsm, ei1, ei2, ei3, eigr, sfac, &
ht0, htm, htp, rhoe, vpot, desc, wfill, wempt, & ht0, htm, htp, rhor, vpot, wfill, wempt, &
acc, acc_this_run, occn, edft, nfi, bec, becdr acc, acc_this_run, occn, edft, nfi, bec, becdr
USE cg_module, ONLY : tcg USE cg_module, ONLY : tcg
IMPLICIT NONE IMPLICIT NONE
@ -344,7 +344,7 @@
! !
! ... perform DIIS minimization on electronic states ! ... perform DIIS minimization on electronic states
! !
CALL runsdiis(ttprint, rhoe, desc, atoms0, bec, becdr, & CALL runsdiis(ttprint, rhor, atoms0, bec, becdr, &
eigr, ei1, ei2, ei3, sfac, c0, cm, cp, wfill, thdyn, ht0, occn, ei, & eigr, ei1, ei2, ei3, sfac, c0, cm, cp, wfill, thdyn, ht0, occn, ei, &
vpot, doions, edft ) vpot, doions, edft )
! !
@ -354,7 +354,7 @@
! !
IF( nspin > 1 ) CALL errore(' cpmain ',' lsd+diis not allowed ',0) IF( nspin > 1 ) CALL errore(' cpmain ',' lsd+diis not allowed ',0)
! !
CALL rundiis(ttprint, rhoe, desc, atoms0, bec, becdr, & CALL rundiis(ttprint, rhor, atoms0, bec, becdr, &
eigr, ei1, ei2, ei3, sfac, c0, cm, cp, wfill, thdyn, ht0, occn, ei, & eigr, ei1, ei2, ei3, sfac, c0, cm, cp, wfill, thdyn, ht0, occn, ei, &
vpot, doions, edft ) vpot, doions, edft )
! !
@ -362,7 +362,7 @@
! !
! ... on entry c0 should contain the wavefunctions to be optimized ! ... on entry c0 should contain the wavefunctions to be optimized
! !
CALL runcg(tortho, ttprint, rhoe, desc, atoms0, bec, becdr, & CALL runcg(tortho, ttprint, rhor, atoms0, bec, becdr, &
eigr, ei1, ei2, ei3, sfac, c0, cm, cp, wfill, thdyn, ht0, occn, ei, & eigr, ei1, ei2, ei3, sfac, c0, cm, cp, wfill, thdyn, ht0, occn, ei, &
vpot, doions, edft, ekin_maxiter, etot_conv_thr, tconv_cg ) vpot, doions, edft, ekin_maxiter, etot_conv_thr, tconv_cg )
! !
@ -371,13 +371,13 @@
! !
ELSE IF ( tsteepdesc ) THEN ELSE IF ( tsteepdesc ) THEN
! !
CALL runsd(tortho, ttprint, ttforce, rhoe, desc, atoms0, bec, becdr, & CALL runsd(tortho, ttprint, ttforce, rhor, atoms0, bec, becdr, &
eigr, ei1, ei2, ei3, sfac, c0, cm, cp, wfill, thdyn, ht0, occn, ei, & eigr, ei1, ei2, ei3, sfac, c0, cm, cp, wfill, thdyn, ht0, occn, ei, &
vpot, doions, edft, ekin_maxiter, ekin_conv_thr ) vpot, doions, edft, ekin_maxiter, ekin_conv_thr )
! !
ELSE IF ( tconjgrad_ion%active ) THEN ELSE IF ( tconjgrad_ion%active ) THEN
! !
CALL runcg_ion(nfi, tortho, ttprint, rhoe, desc, atomsp, atoms0, & CALL runcg_ion(nfi, tortho, ttprint, rhor, atomsp, atoms0, &
atomsm, bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cm, cp, wfill, thdyn, ht0, occn, ei, & atomsm, bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cm, cp, wfill, thdyn, ht0, occn, ei, &
vpot, doions, edft, tconvthrs%derho, tconvthrs%force, tconjgrad_ion%nstepix, & vpot, doions, edft, tconvthrs%derho, tconvthrs%force, tconjgrad_ion%nstepix, &
tconvthrs%ekin, tconjgrad_ion%nstepex ) tconvthrs%ekin, tconjgrad_ion%nstepex )
@ -406,9 +406,9 @@
s5 = cclock() s5 = cclock()
timernl = s5 - s4 timernl = s5 - s4
! ... compute the new charge density "rhoe" ! ... compute the new charge density "rhor"
! !
CALL rhoofr( nfi, c0, wfill, occn, rhoe, desc, ht0) CALL rhoofr( nfi, c0, wfill, occn, rhor, ht0)
IF(memchk) CALL memstat(6) IF(memchk) CALL memstat(6)
@ -418,7 +418,7 @@
! ... vofrhos compute the new DFT potential "vpot", and energies "edft", ! ... vofrhos compute the new DFT potential "vpot", and energies "edft",
! ... ionc forces "fion" and stress "pail". ! ... ionc forces "fion" and stress "pail".
! !
CALL vofrhos(ttprint, ttforce, tstress, rhoe, desc, atoms0, & CALL vofrhos(ttprint, ttforce, tstress, rhor, atoms0, &
vpot, bec, c0, wfill, occn, eigr, ei1, ei2, ei3, sfac, timepre, ht0, edft) vpot, bec, c0, wfill, occn, eigr, ei1, ei2, ei3, sfac, timepre, ht0, edft)
! CALL debug_energies( edft ) ! DEBUG ! CALL debug_energies( edft ) ! DEBUG
@ -578,7 +578,7 @@
IF( self_interaction /= 0 ) THEN IF( self_interaction /= 0 ) THEN
IF ( nat_localisation > 0 .AND. ttprint ) THEN IF ( nat_localisation > 0 .AND. ttprint ) THEN
CALL localisation( cp( : , nupdwn(1), 1, 1 ), atoms0, ht0, desc) CALL localisation( cp( : , nupdwn(1), 1, 1 ), atoms0, ht0)
END IF END IF
END IF END IF
@ -700,7 +700,7 @@
! !
IF( ttsave .OR. ttexit ) THEN IF( ttsave .OR. ttexit ) THEN
CALL writefile( nfi, tps, c0, cm, wfill, occn, atoms0, atomsm, acc, & CALL writefile( nfi, tps, c0, cm, wfill, occn, atoms0, atomsm, acc, &
taui, cdmi, htm, ht0, rhoe, desc, vpot ) taui, cdmi, htm, ht0, rhor, vpot )
END IF END IF
IF( ttexit .AND. .NOT. ttprint ) THEN IF( ttexit .AND. .NOT. ttprint ) THEN
@ -746,12 +746,12 @@
END IF END IF
IF(tprnsfac) THEN IF(tprnsfac) THEN
CALL print_sfac(rhoe, desc, sfac) CALL print_sfac(rhor, sfac)
END IF END IF
! ... report statistics ! ... report statistics
CALL printacc(nfi, rhoe, desc, atomsm, htm, nstep_this_run, acc, acc_this_run) CALL printacc(nfi, nstep_this_run, acc, acc_this_run)
CALL mp_report_buffers() CALL mp_report_buffers()
CALL mp_report() CALL mp_report()

View File

@ -18,7 +18,6 @@ MODULE cp_main_variables
USE metagga, ONLY : kedtaur, kedtaus, kedtaug USE metagga, ONLY : kedtaur, kedtaus, kedtaug
USE atoms_type_module, ONLY : atoms_type USE atoms_type_module, ONLY : atoms_type
USE cell_base, ONLY : boxdimensions USE cell_base, ONLY : boxdimensions
USE charge_types, ONLY : charge_descriptor, charge_descriptor_init
USE wave_types, ONLY : wave_descriptor, wave_descriptor_init USE wave_types, ONLY : wave_descriptor, wave_descriptor_init
USE energies, ONLY : dft_energy_type USE energies, ONLY : dft_energy_type
! !
@ -80,19 +79,17 @@ MODULE cp_main_variables
! !
! charge densities and potentials ! charge densities and potentials
! !
REAL(DP), ALLOCATABLE :: rhoe(:,:,:,:) ! charge density in real space
REAL(DP), ALLOCATABLE :: vpot(:,:,:,:)
TYPE (charge_descriptor) :: desc ! charge density descriptor
!
! rhog = charge density in g space ! rhog = charge density in g space
! rhor = charge density in r space (dense grid) ! rhor = charge density in r space (dense grid)
! rhos = charge density in r space (smooth grid) ! rhos = charge density in r space (smooth grid)
! rhopr since rhor is overwritten in vofrho, ! rhopr since rhor is overwritten in vofrho,
! this array is used to save rhor for restart file ! this array is used to save rhor for restart file
! vpot = potential in r space (dense grid)
! !
COMPLEX(DP), ALLOCATABLE :: rhog(:,:) COMPLEX(DP), ALLOCATABLE :: rhog(:,:)
REAL(DP), ALLOCATABLE :: rhor(:,:), rhos(:,:) REAL(DP), ALLOCATABLE :: rhor(:,:), rhos(:,:)
REAL(DP), ALLOCATABLE :: rhopr(:,:) REAL(DP), ALLOCATABLE :: rhopr(:,:)
REAL(DP), ALLOCATABLE :: vpot(:,:)
! !
TYPE (wave_descriptor) :: wfill, wempt ! wave function descriptor TYPE (wave_descriptor) :: wfill, wempt ! wave function descriptor
! for filled and empty states ! for filled and empty states
@ -162,10 +159,11 @@ MODULE cp_main_variables
! !
ALLOCATE( ema0bg( ngw ) ) ALLOCATE( ema0bg( ngw ) )
! !
ALLOCATE( rhor( nnr, nspin ) )
!
IF( program_name == 'CP90' ) THEN IF( program_name == 'CP90' ) THEN
! !
ALLOCATE( rhopr( nnr, nspin ) ) ALLOCATE( rhopr( nnr, nspin ) )
ALLOCATE( rhor( nnr, nspin ) )
ALLOCATE( rhos( nnrsx, nspin ) ) ALLOCATE( rhos( nnrsx, nspin ) )
ALLOCATE( rhog( ng, nspin ) ) ALLOCATE( rhog( ng, nspin ) )
! !
@ -179,12 +177,7 @@ MODULE cp_main_variables
! !
ELSE IF( program_name == 'FPMD' ) THEN ELSE IF( program_name == 'FPMD' ) THEN
! !
ALLOCATE( rhoe( nr1x, nr2x, npl, nspin ) ) ALLOCATE( vpot( nnr, nspin ) )
!
CALL charge_descriptor_init( desc, nr1, nr2, nr3, &
nr1, nr2, npl, nr1x, nr2x, npl, nspin )
!
ALLOCATE( vpot( nr1x, nr2x, npl, nspin ) )
! !
END IF END IF
! !
@ -241,7 +234,7 @@ MODULE cp_main_variables
IF( ALLOCATED( kedtaur ) ) DEALLOCATE( kedtaur ) IF( ALLOCATED( kedtaur ) ) DEALLOCATE( kedtaur )
IF( ALLOCATED( kedtaus ) ) DEALLOCATE( kedtaus ) IF( ALLOCATED( kedtaus ) ) DEALLOCATE( kedtaus )
IF( ALLOCATED( kedtaug ) ) DEALLOCATE( kedtaug ) IF( ALLOCATED( kedtaug ) ) DEALLOCATE( kedtaug )
IF( ALLOCATED( rhoe ) ) DEALLOCATE( rhoe ) ! IF( ALLOCATED( rhoe ) ) DEALLOCATE( rhoe )
IF( ALLOCATED( vpot ) ) DEALLOCATE( vpot ) IF( ALLOCATED( vpot ) ) DEALLOCATE( vpot )
IF( ALLOCATED( occn ) ) DEALLOCATE( occn ) IF( ALLOCATED( occn ) ) DEALLOCATE( occn )
! !

View File

@ -41,7 +41,7 @@ SUBROUTINE move_electrons( nfi, tfirst, tlast, b1, b2, b3, fion, &
USE runcp_module, ONLY : runcp_uspp USE runcp_module, ONLY : runcp_uspp
USE wave_constrains, ONLY : interpolate_lambda USE wave_constrains, ONLY : interpolate_lambda
USE gvecw, ONLY : ngw USE gvecw, ONLY : ngw
! USE para_mod, ONLY : USE orthogonalize_base, ONLY : calphi
! !
IMPLICIT NONE IMPLICIT NONE
! !
@ -143,7 +143,7 @@ SUBROUTINE move_electrons( nfi, tfirst, tlast, b1, b2, b3, fion, &
! ... calphi calculates phi ! ... calphi calculates phi
! ... the electron mass rises with g**2 ! ... the electron mass rises with g**2
! !
CALL calphi( c0, ngw, ema0bg, bec, nkb, vkb, phi, nbsp ) CALL calphi( c0, ngw, bec, nkb, vkb, phi, nbsp, ema0bg )
! !
! ... begin try and error loop (only one step!) ! ... begin try and error loop (only one step!)
! !

View File

@ -337,7 +337,7 @@
use cvan, only : ish use cvan, only : ish
use uspp_param, only : nhm, nh use uspp_param, only : nhm, nh
use uspp, only : nkb, dvan use uspp, only : nkb, dvan
use electrons_base, only : n => nbsp, nspin, ispin => fspin, f use electrons_base, only : n => nbsp, nspin, ispin, f
use ions_base, only : nsp, nat, na use ions_base, only : nsp, nat, na
! !
implicit none implicit none
@ -400,7 +400,7 @@
use uspp_param, only : nhm, nh use uspp_param, only : nhm, nh
use cvan, only : ish, nvb use cvan, only : ish, nvb
use ions_base, only : nax, nat, nsp, na use ions_base, only : nax, nat, nsp, na
use electrons_base, only : n => nbsp, ispin => fspin, f use electrons_base, only : n => nbsp, ispin, f
use gvecw, only : ngw use gvecw, only : ngw
! !
implicit none implicit none
@ -641,7 +641,7 @@ subroutine dennl( bec, denl )
use cdvan, ONLY : drhovan, dbec use cdvan, ONLY : drhovan, dbec
use ions_base, only : nsp, na use ions_base, only : nsp, na
! !
use electrons_base, only : n => nbsp, ispin => fspin, f, nspin use electrons_base, only : n => nbsp, ispin, f, nspin
use reciprocal_vectors, only : gstart use reciprocal_vectors, only : gstart
implicit none implicit none
@ -710,7 +710,7 @@ subroutine nlfq( c, eigr, bec, becdr, fion )
use uspp_param, only : nhm, nh use uspp_param, only : nhm, nh
use cvan, only : ish, nvb use cvan, only : ish, nvb
use ions_base, only : nax, nat, nsp, na use ions_base, only : nax, nat, nsp, na
use electrons_base, only : n => nbsp, ispin => fspin, f use electrons_base, only : n => nbsp, ispin, f
use gvecw, only : ngw use gvecw, only : ngw
use constants, only : pi, fpi use constants, only : pi, fpi
! !

View File

@ -150,7 +150,7 @@
integer :: nsp integer :: nsp
COMPLEX(DP) :: rhoetg(:) COMPLEX(DP) :: rhoetg(:)
REAL(DP) :: rhoetr(:,:,:) REAL(DP) :: rhoetr(:)
REAL(DP) :: rhoc(:,:) REAL(DP) :: rhoc(:,:)
COMPLEX(DP), INTENT(IN) :: sfac(:,:) COMPLEX(DP), INTENT(IN) :: sfac(:,:)

View File

@ -90,7 +90,7 @@
COMPLEX(DP), INTENT(INOUT) :: ce(:,:,:,:) COMPLEX(DP), INTENT(INOUT) :: ce(:,:,:,:)
TYPE(wave_descriptor), INTENT(IN) :: wempt, wfill TYPE(wave_descriptor), INTENT(IN) :: wempt, wfill
REAL(DP), INTENT(IN) :: occ(:,:,:) REAL(DP), INTENT(IN) :: occ(:,:,:)
REAL (DP), INTENT(in) :: vpot(:,:,:,:) REAL (DP), INTENT(in) :: vpot(:,:)
REAL (DP) :: bec(:,:) REAL (DP) :: bec(:,:)
COMPLEX(DP) :: eigr(:,:) COMPLEX(DP) :: eigr(:,:)
@ -139,7 +139,7 @@
CALL nlsm1 ( nb_l, 1, nspnl, eigr, cf(1,1,1,ispin), bec ) CALL nlsm1 ( nb_l, 1, nspnl, eigr, cf(1,1,1,ispin), bec )
CALL dforce_all( ispin, cf(:,:,1,ispin), wfill, occ(:,1,ispin), eforce(:,:,1), & CALL dforce_all( ispin, cf(:,:,1,ispin), wfill, occ(:,1,ispin), eforce(:,:,1), &
vpot(:,:,:,ispin), eigr, bec ) vpot(:,ispin), eigr, bec )
CALL kohn_sham( ispin, cf(:,:,:,ispin), wfill, eforce ) CALL kohn_sham( ispin, cf(:,:,:,ispin), wfill, eforce )
@ -156,7 +156,7 @@
CALL nlsm1 ( nb_l, 1, nspnl, eigr, ce(1,1,1,ispin), bece ) CALL nlsm1 ( nb_l, 1, nspnl, eigr, ce(1,1,1,ispin), bece )
! !
CALL dforce_all( ispin, ce(:,:,1,ispin), wempt, ff( :, 1), eforce(:,:,1), & CALL dforce_all( ispin, ce(:,:,1,ispin), wempt, ff( :, 1), eforce(:,:,1), &
vpot(:,:,:,ispin), eigr, bece ) vpot(:,ispin), eigr, bece )
! !
CALL kohn_sham( ispin, ce(:,:,:,ispin), wempt, eforce ) CALL kohn_sham( ispin, ce(:,:,:,ispin), wempt, eforce )

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -176,7 +176,7 @@
! ------------------------------------------------------------------------- ! -------------------------------------------------------------------------
SUBROUTINE kspotential & SUBROUTINE kspotential &
( nfi, tprint, tforce, tstress, rhoe, desc, atoms, bec, becdr, eigr, & ( nfi, tprint, tforce, tstress, rhoe, atoms, bec, becdr, eigr, &
ei1, ei2, ei3, sfac, c0, cdesc, tcel, ht, fi, vpot, edft, timepre ) ei1, ei2, ei3, sfac, c0, cdesc, tcel, ht, fi, vpot, edft, timepre )
USE charge_density, ONLY: rhoofr USE charge_density, ONLY: rhoofr
@ -185,7 +185,6 @@
USE cell_module, ONLY: boxdimensions USE cell_module, ONLY: boxdimensions
USE atoms_type_module, ONLY: atoms_type USE atoms_type_module, ONLY: atoms_type
USE wave_types, ONLY: wave_descriptor USE wave_types, ONLY: wave_descriptor
USE charge_types, ONLY: charge_descriptor
! ... declare subroutine arguments ! ... declare subroutine arguments
LOGICAL :: tcel LOGICAL :: tcel
@ -193,7 +192,7 @@
TYPE (atoms_type), INTENT(INOUT) :: atoms TYPE (atoms_type), INTENT(INOUT) :: atoms
COMPLEX(DP), INTENT(INOUT) :: c0(:,:,:,:) COMPLEX(DP), INTENT(INOUT) :: c0(:,:,:,:)
TYPE (wave_descriptor), INTENT(IN) :: cdesc TYPE (wave_descriptor), INTENT(IN) :: cdesc
REAL(DP) :: rhoe(:,:,:,:) REAL(DP) :: rhoe(:,:)
COMPLEX(DP) :: ei1(:,:) COMPLEX(DP) :: ei1(:,:)
COMPLEX(DP) :: ei2(:,:) COMPLEX(DP) :: ei2(:,:)
COMPLEX(DP) :: ei3(:,:) COMPLEX(DP) :: ei3(:,:)
@ -203,17 +202,16 @@
REAL(DP) :: bec(:,:) REAL(DP) :: bec(:,:)
REAL(DP) :: becdr(:,:,:) REAL(DP) :: becdr(:,:,:)
TYPE (dft_energy_type) :: edft TYPE (dft_energy_type) :: edft
REAL(DP) :: vpot(:,:,:,:) REAL(DP) :: vpot(:,:)
COMPLEX(DP), INTENT(IN) :: sfac(:,:) COMPLEX(DP), INTENT(IN) :: sfac(:,:)
LOGICAL, INTENT(IN) :: tforce, tstress, tprint LOGICAL, INTENT(IN) :: tforce, tstress, tprint
REAL(DP), INTENT(OUT) :: timepre REAL(DP), INTENT(OUT) :: timepre
TYPE (charge_descriptor), INTENT(IN) :: desc
edft%enl = nlrh_m( c0, cdesc, tforce, atoms, fi, bec, becdr, eigr ) edft%enl = nlrh_m( c0, cdesc, tforce, atoms, fi, bec, becdr, eigr )
CALL rhoofr( nfi, c0, cdesc, fi, rhoe, desc, ht ) CALL rhoofr( nfi, c0, cdesc, fi, rhoe, ht )
CALL vofrhos( tprint, tforce, tstress, rhoe, desc, atoms, vpot, bec, & CALL vofrhos( tprint, tforce, tstress, rhoe, atoms, vpot, bec, &
c0, cdesc, fi, eigr, ei1, ei2, ei3, sfac, timepre, & c0, cdesc, fi, eigr, ei1, ei2, ei3, sfac, timepre, &
ht, edft ) ht, edft )
@ -223,7 +221,7 @@
!=----------------------------------------------------------------------------=! !=----------------------------------------------------------------------------=!
SUBROUTINE vofrhos & SUBROUTINE vofrhos &
( tprint, tforce, tstress, rhoe, desc, atoms, vpot, bec, c0, cdesc, fi, & ( tprint, tforce, tstress, rhoe, atoms, vpot, bec, c0, cdesc, fi, &
eigr, ei1, ei2, ei3, sfac, timepre, box, edft ) eigr, ei1, ei2, ei3, sfac, timepre, box, edft )
! this routine computes: ! this routine computes:
@ -260,7 +258,7 @@
! ... include modules ! ... include modules
USE control_flags, ONLY: tscreen, tchi2, iprsta USE control_flags, ONLY: tscreen, tchi2, iprsta, force_pairing
USE mp_global, ONLY: nproc, mpime, root, group USE mp_global, ONLY: nproc, mpime, root, group
USE mp, ONLY: mp_sum USE mp, ONLY: mp_sum
USE cell_module, ONLY: boxdimensions USE cell_module, ONLY: boxdimensions
@ -274,9 +272,6 @@
USE charge_density, ONLY: gradrho USE charge_density, ONLY: gradrho
USE chi2, ONLY: rhochi, allocate_chi2, deallocate_chi2 USE chi2, ONLY: rhochi, allocate_chi2, deallocate_chi2
USE vanderwaals, ONLY: tvdw, vdw USE vanderwaals, ONLY: tvdw, vdw
USE charge_density, ONLY: checkrho
USE charge_types, ONLY: charge_descriptor
USE wave_functions, ONLY: dft_kinetic_energy
USE wave_types, ONLY: wave_descriptor USE wave_types, ONLY: wave_descriptor
USE io_global, ONLY: ionode, stdout USE io_global, ONLY: ionode, stdout
USE sic_module, ONLY: self_interaction, sic_epsilon, sic_alpha !!TO ADD!!! USE sic_module, ONLY: self_interaction, sic_epsilon, sic_alpha !!TO ADD!!!
@ -285,15 +280,17 @@
USE atom, ONLY: nlcc USE atom, ONLY: nlcc
USE core, ONLY: nlcc_any, rhocg USE core, ONLY: nlcc_any, rhocg
USE core, ONLY: add_core_charge, core_charge_forces USE core, ONLY: add_core_charge, core_charge_forces
!
USE reciprocal_vectors, ONLY: gx USE reciprocal_vectors, ONLY: gx
USE atoms_type_module, ONLY: atoms_type USE atoms_type_module, ONLY: atoms_type
USE exchange_correlation, ONLY: exch_corr_energy USE exchange_correlation, ONLY: exch_corr_energy
use grid_dimensions, only: nr1, nr2, nr3, nnrx
IMPLICIT NONE IMPLICIT NONE
! ... declare subroutine arguments ! ... declare subroutine arguments
LOGICAL, INTENT(IN) :: tprint, tforce, tstress LOGICAL, INTENT(IN) :: tprint, tforce, tstress
REAL(DP) :: vpot(:,:,:,:) REAL(DP) :: vpot(:,:)
REAL(DP), INTENT(IN) :: fi(:,:,:) REAL(DP), INTENT(IN) :: fi(:,:,:)
REAL(DP) :: bec(:,:) REAL(DP) :: bec(:,:)
COMPLEX(DP) :: ei1(:,:) COMPLEX(DP) :: ei1(:,:)
@ -303,10 +300,9 @@
COMPLEX(DP), INTENT(IN) :: c0(:,:,:,:) COMPLEX(DP), INTENT(IN) :: c0(:,:,:,:)
TYPE (atoms_type), INTENT(INOUT) :: atoms TYPE (atoms_type), INTENT(INOUT) :: atoms
TYPE (wave_descriptor), INTENT(IN) :: cdesc TYPE (wave_descriptor), INTENT(IN) :: cdesc
TYPE (charge_descriptor), INTENT(IN) :: desc
TYPE (boxdimensions), INTENT(INOUT) :: box TYPE (boxdimensions), INTENT(INOUT) :: box
TYPE (dft_energy_type) :: edft TYPE (dft_energy_type) :: edft
REAL(DP) :: rhoe(:,:,:,:) REAL(DP) :: rhoe(:,:)
COMPLEX(DP), INTENT(IN) :: sfac(:,:) COMPLEX(DP), INTENT(IN) :: sfac(:,:)
TYPE (dft_energy_type) :: edft_self TYPE (dft_energy_type) :: edft_self
@ -321,16 +317,16 @@
COMPLEX(DP), ALLOCATABLE :: vloc(:), self_vloc(:) COMPLEX(DP), ALLOCATABLE :: vloc(:), self_vloc(:)
COMPLEX(DP), ALLOCATABLE :: rho12(:), rhoeg(:,:), self_rhoeg(:) COMPLEX(DP), ALLOCATABLE :: rho12(:), rhoeg(:,:), self_rhoeg(:)
COMPLEX(DP), ALLOCATABLE :: rhoetg(:,:) COMPLEX(DP), ALLOCATABLE :: rhoetg(:,:)
REAL(DP), ALLOCATABLE :: rhoetr(:,:,:,:) REAL(DP), ALLOCATABLE :: rhoetr(:,:)
REAL(DP), ALLOCATABLE :: fion_vdw(:,:) REAL(DP), ALLOCATABLE :: fion_vdw(:,:)
REAL(DP), ALLOCATABLE :: grho(:,:,:,:,:) REAL(DP), ALLOCATABLE :: grho(:,:,:)
REAL(DP), ALLOCATABLE :: v2xc(:,:,:,:,:) REAL(DP), ALLOCATABLE :: v2xc(:,:,:)
REAL(DP), ALLOCATABLE :: fion(:,:) REAL(DP), ALLOCATABLE :: fion(:,:)
REAL(DP), ALLOCATABLE :: self_rho(:,:,:,:) REAL(DP), ALLOCATABLE :: self_rho(:,:)
REAL(DP), ALLOCATABLE :: self_vpot(:,:,:,:) REAL(DP), ALLOCATABLE :: self_vpot(:,:)
REAL(DP), ALLOCATABLE :: self_grho(:,:,:,:,:) REAL(DP), ALLOCATABLE :: self_grho(:,:,:)
REAL(DP), ALLOCATABLE :: self_v2xc(:,:,:,:,:) REAL(DP), ALLOCATABLE :: self_v2xc(:,:,:)
REAL(DP) :: pail(3,3) REAL(DP) :: pail(3,3)
@ -347,35 +343,21 @@
LOGICAL :: ttscreen, ttsic, tgc LOGICAL :: ttscreen, ttsic, tgc
INTEGER ig1, ig2, ig3, is, ia, ig, isc, iflag, ispin INTEGER ig1, ig2, ig3, is, ia, ig, isc, iflag, iss
INTEGER ik, i, j, k, isa, idum, nspin INTEGER ik, i, j, k, isa, idum, nspin, iswfc
INTEGER nr1_l, nr2_l, nr3_l, nr1_g, nr2_g, nr3_g, nnr_l
INTEGER :: nr1x, nr2x, nr3x
INTEGER :: ierr INTEGER :: ierr
DATA iflag / 0 / DATA iflag / 0 /
SAVE iflag, desr SAVE iflag, desr
REAL(DP), EXTERNAL :: enkin
! end of declarations ! end of declarations
! ---------------------------------------------- ! ----------------------------------------------
IF(timing) s0 = cclock() IF(timing) s0 = cclock()
nspin = desc % nspin nspin = SIZE( rhoe, 2 )
nr1_l = desc % nxl
nr2_l = desc % nyl
nr3_l = desc % nzl
nr1_g = desc % nx
nr2_g = desc % ny
nr3_g = desc % nz
nnr_l = nr1_l * nr2_l * nr3_l
nr1x = dfftp%nr1x
nr2x = dfftp%nr2x
nr3x = dfftp%npl
edft%evdw = 0.0d0 edft%evdw = 0.0d0
! !
@ -392,7 +374,9 @@
CALL allocate_chi2(ngm) CALL allocate_chi2(ngm)
END IF END IF
ALLOCATE( rhoetr( nr1x, nr2x, nr3x, nspin) ) ALLOCATE( rhoetr( nnrx, nspin ) )
rhoetr = 0.0d0
ALLOCATE( fion( 3, atoms%nat ) ) ALLOCATE( fion( 3, atoms%nat ) )
fion = atoms%for( 1:3, 1:atoms%nat ) fion = atoms%for( 1:3, 1:atoms%nat )
@ -400,44 +384,43 @@
pail = box%pail pail = box%pail
IF(tgc) THEN IF(tgc) THEN
ALLOCATE( grho( nr1x, nr2x, nr3x, 3, nspin ) ) ALLOCATE( grho( nnrx, 3, nspin ) )
ALLOCATE( v2xc( nr1x, nr2x, nr3x, nspin, nspin) ) ALLOCATE( v2xc( nnrx, nspin, nspin) )
ELSE ELSE
ALLOCATE( grho( 1, 1, 1, 1, 1 ) ) ALLOCATE( grho( 1, 1, 1 ) )
ALLOCATE( v2xc( 1, 1, 1, 1, 1 ) ) ALLOCATE( v2xc( 1, 1, 1 ) )
END IF END IF
grho = 0.0d0
v2xc = 0.0d0
ALLOCATE( rhoeg(ngm, nspin) ) ALLOCATE( rhoeg(ngm, nspin) )
ALLOCATE( rhoetg(ngm, nspin) ) ALLOCATE( rhoetg(ngm, nspin) )
!edft%self_sxc = 0.d0
!edft%sxc = 0.d0
!edft%self_ehte = 0.d0
!edft%eht = 0.d0
IF( ttsic ) THEN IF( ttsic ) THEN
IF ( tgc ) THEN IF ( tgc ) THEN
ALLOCATE(self_grho( nr1x, nr2x, nr3x, 3, nspin ), STAT = ierr) ALLOCATE(self_grho( nnrx, 3, nspin ), STAT = ierr)
IF( ierr /= 0 ) CALL errore(' vofrhos ', ' allocating self_grho ', ierr) IF( ierr /= 0 ) CALL errore(' vofrhos ', ' allocating self_grho ', ierr)
ALLOCATE(self_v2xc( nr1x, nr2x, nr3x, nspin, nspin ), STAT = ierr) ALLOCATE(self_v2xc( nnrx, nspin, nspin ), STAT = ierr)
IF( ierr /= 0 ) CALL errore(' vofrhos ', ' allocating self_v2xc ', ierr) IF( ierr /= 0 ) CALL errore(' vofrhos ', ' allocating self_v2xc ', ierr)
self_grho = 0.D0
self_v2xc = 0.D0 self_v2xc = 0.D0
END IF !on tgc END IF !on tgc
ALLOCATE (self_vpot( nr1x, nr2x, nr3x, 2 ), STAT = ierr) ALLOCATE (self_vpot( nnrx, 2 ), STAT = ierr)
IF( ierr /= 0 ) CALL errore(' vofrhos ', ' allocating self_vpot ', ierr) IF( ierr /= 0 ) CALL errore(' vofrhos ', ' allocating self_vpot ', ierr)
self_vpot = 0.D0 self_vpot = 0.D0
ALLOCATE (self_rho( nr1x, nr2x, nr3x, 2), STAT = ierr) ALLOCATE (self_rho( nnrx, 2), STAT = ierr)
IF( ierr /= 0 ) CALL errore(' vofrhos ', ' allocating self_rho ', ierr) IF( ierr /= 0 ) CALL errore(' vofrhos ', ' allocating self_rho ', ierr)
self_rho = 0.D0
END IF !on self_interaction END IF !on self_interaction
IF(timing) s1 = cclock() IF(timing) s1 = cclock()
@ -446,7 +429,12 @@
edft%ekin = 0.0_DP edft%ekin = 0.0_DP
edft%emkin = 0.0_DP edft%emkin = 0.0_DP
edft%ekin = dft_kinetic_energy(c0, cdesc, fi, edft%emkin)
DO iss = 1, nspin
iswfc = iss
IF( force_pairing ) iswfc = 1
edft%ekin = edft%ekin + enkin( c0(1,1,1,iswfc), SIZE(c0,1), fi(1,1,iss), cdesc%nbl(iss) )
END DO
IF(tprint) THEN IF(tprint) THEN
IF( ionode .AND. ttscreen ) & IF( ionode .AND. ttscreen ) &
@ -454,11 +442,6 @@
END IF END IF
! ... reciprocal-space vectors are in units of alat/(2 pi) so a
! ... multiplicative factor (2 pi/alat)**2 is required
edft%ekin = edft%ekin * tpiba2
edft%emkin = edft%emkin * tpiba2
IF( tstress .OR. tforce .OR. iflag == 0 ) THEN IF( tstress .OR. tforce .OR. iflag == 0 ) THEN
CALL vofesr( edft%esr, desr, fion, atoms, tstress, box ) CALL vofesr( edft%esr, desr, fion, atoms, tstress, box )
IF( iflag == 0 ) & IF( iflag == 0 ) &
@ -469,23 +452,26 @@
IF(timing) s2 = cclock() IF(timing) s2 = cclock()
! ... FFT: rho(r) --> rho(g) DO iss = 1, nspin
DO ispin = 1, nspin
CALL pfwfft( rhoeg(:,ispin), rhoe(:,:,:,ispin) ) ! ... FFT: rho(r) --> rho(g)
CALL pfwfft( rhoeg(:,iss), rhoe(:,iss) )
! ... add core contribution to the charge ! ... add core contribution to the charge
CALL ZCOPY( SIZE(rhoetg,1), rhoeg(1,ispin), 1, rhoetg(1,ispin), 1 ) CALL ZCOPY( SIZE(rhoeg,1) , rhoeg(1,iss), 1, rhoetg(1,iss), 1 )
CALL DCOPY( SIZE(rhoe(:,:,:,ispin)), rhoe(1,1,1,ispin), 1, rhoetr(1,1,1,ispin), 1 ) CALL DCOPY( nnrx, rhoe(1,iss), 1, rhoetr(1,iss), 1 )
IF( nlcc_any ) THEN IF( nlcc_any ) THEN
! ... add core correction ! ... add core correction
! ... rhoetg = rhoeg + cc ! ... rhoetg = rhoeg + cc
! ... rhoetr = rhoe + cc ! ... rhoetr = rhoe + cc
CALL add_core_charge( rhoetg(:,ispin), rhoetr(:,:,:,ispin), sfac, rhocg, atoms%nsp )
CALL add_core_charge( rhoetg(:,iss), rhoetr(:,iss), sfac, rhocg, atoms%nsp )
ELSE ELSE
! ... no core correction ! ... no core correction
@ -493,6 +479,7 @@
! ... rhoetr = rhoe ! ... rhoetr = rhoe
! ... chi2 ! ... chi2
IF(tchi2) THEN IF(tchi2) THEN
IF(nspin.GT.1) CALL errore(' vofrho ',' spin + tchi ',nspin) IF(nspin.GT.1) CALL errore(' vofrho ',' spin + tchi ',nspin)
rhochi = rhoeg(:,1) rhochi = rhoeg(:,1)
@ -501,7 +488,7 @@
END IF END IF
IF(tgc) THEN IF(tgc) THEN
CALL gradrho( rhoetg(:,ispin), grho(:,:,:,:,ispin), gx ) CALL gradrho( rhoetg(:,iss), grho(:,:,iss), gx )
END IF END IF
END DO END DO
@ -518,26 +505,26 @@
! !
IF ( ttsic ) THEN IF ( ttsic ) THEN
self_rho(:,:,:,1) = rhoetr(:,:,:,2) self_rho(:,1) = rhoetr(:,2)
self_rho(:,:,:,2) = rhoetr(:,:,:,2) self_rho(:,2) = rhoetr(:,2)
IF (tgc) THEN IF (tgc) THEN
self_grho(:,:,:,:,1) = grho(:,:,:,:,2) self_grho(:,:,1) = grho(:,:,2)
self_grho(:,:,:,:,2) = grho(:,:,:,:,2) self_grho(:,:,2) = grho(:,:,2)
ENDIF ENDIF
CALL exch_corr_energy( self_rho, rhoetg, self_grho, self_vpot, & CALL exch_corr_energy( self_rho, rhoetg, self_grho, self_vpot, &
self_sxcp, self_vxc, self_v2xc ) self_sxcp, self_vxc, self_v2xc )
vpot (:,:,:,1) = ( 1.0d0 - sic_alpha ) * vpot(:,:,:,1) vpot (:,1) = ( 1.0d0 - sic_alpha ) * vpot(:,1)
! !
vpot (:,:,:,2) = ( 1.0d0 - sic_alpha ) * vpot(:,:,:,2) + sic_alpha * ( self_vpot(:,:,:,2) + self_vpot(:,:,:,1) ) vpot (:,2) = ( 1.0d0 - sic_alpha ) * vpot(:,2) + sic_alpha * ( self_vpot(:,2) + self_vpot(:,1) )
IF (tgc) THEN IF (tgc) THEN
! !
v2xc(:,:,:,1,1) = ( 1.0d0 - sic_alpha ) * v2xc(:,:,:,1,1) v2xc(:,1,1) = ( 1.0d0 - sic_alpha ) * v2xc(:,1,1)
! !
v2xc(:,:,:,2,2) = ( 1.0d0 - sic_alpha ) * v2xc(:,:,:,2,2) +sic_alpha * ( self_v2xc(:,:,:,2,2) + self_v2xc(:,:,:,1,1) ) v2xc(:,2,2) = ( 1.0d0 - sic_alpha ) * v2xc(:,2,2) +sic_alpha * ( self_v2xc(:,2,2) + self_v2xc(:,1,1) )
! !
END IF END IF
@ -552,14 +539,14 @@
END IF END IF
IF ( tstress ) THEN IF ( tstress ) THEN
strvxc = ( edft%sxc - vxc ) * omega / DBLE( nr1_g * nr2_g * nr3_g ) strvxc = ( edft%sxc - vxc ) * omega / DBLE( nr1 * nr2 * nr3 )
END IF END IF
IF( nlcc_any ) THEN IF( nlcc_any ) THEN
! ... xc potential (vpot) from real to G space, to compute nlcc forces ! ... xc potential (vpot) from real to G space, to compute nlcc forces
! ... rhoetg = fwfft(vpot) ! ... rhoetg = fwfft(vpot)
DO ispin = 1, nspin DO iss = 1, nspin
CALL pfwfft( rhoetg(:,ispin), vpot(:,:,:,ispin) ) CALL pfwfft( rhoetg(:,iss), vpot(:,iss) )
END DO END DO
! ... now rhoetg contains the xc potential ! ... now rhoetg contains the xc potential
IF (tforce) THEN IF (tforce) THEN
@ -584,7 +571,7 @@
! !
CALL vofloc(ttscreen, tforce, edft%ehte, edft%ehti, ehp, & CALL vofloc(ttscreen, tforce, edft%ehte, edft%ehti, ehp, &
eps, vloc, rhoeg, fion, atoms, rhops, vps, eigr, & eps, vloc, rhoeg, fion, atoms, rhops, vps, eigr, &
ei1, ei2, ei3, sfac, box, desc ) ei1, ei2, ei3, sfac, box )
! !
edft%self_ehte = 0.d0 edft%self_ehte = 0.d0
@ -600,16 +587,16 @@
! working on the total charge density ! working on the total charge density
CALL self_vofloc( ttscreen, self_ehtep, self_vloc, self_rhoeg, box, desc) CALL self_vofloc( ttscreen, self_ehtep, self_vloc, self_rhoeg, box )
! !
CALL pinvfft( self_vpot(:,:,:,1), self_vloc(:)) CALL pinvfft( self_vpot(:,1), self_vloc(:))
self_vpot(:,:,:,1) = sic_epsilon * self_vpot(:,:,:,1) self_vpot(:,1) = sic_epsilon * self_vpot(:,1)
! !
edft%self_ehte = sic_epsilon * DBLE( self_ehtep ) edft%self_ehte = sic_epsilon * DBLE( self_ehtep )
vpot(:,:,:,1) = vpot(:,:,:,1) - self_vpot(:,:,:,1) vpot(:,1) = vpot(:,1) - self_vpot(:,1)
vpot(:,:,:,2) = vpot(:,:,:,2) + self_vpot(:,:,:,1) vpot(:,2) = vpot(:,2) + self_vpot(:,1)
DEALLOCATE( self_vloc, self_rhoeg ) DEALLOCATE( self_vloc, self_rhoeg )
@ -628,13 +615,13 @@
IF(timing) s5 = cclock() IF(timing) s5 = cclock()
DO ispin = 1, nspin DO iss = 1, nspin
! ... add hartree end local pseudo potentials ( invfft(vloc) ) ! ... add hartree end local pseudo potentials ( invfft(vloc) )
! ... to xc potential (vpot). ! ... to xc potential (vpot).
! ... vpot = vpot + invfft(vloc) ! ... vpot = vpot + invfft(vloc)
CALL pinvfft( vpot(:,:,:,ispin), vloc(:), 1.0d0 ) CALL pinvfft( vpot(:,iss), vloc(:), 1.0d0 )
END DO END DO
@ -660,10 +647,10 @@
CALL mp_sum(edft%ehte, group) CALL mp_sum(edft%ehte, group)
CALL mp_sum(edft%ehti, group) CALL mp_sum(edft%ehti, group)
CALL mp_sum(edft%self_ehte, group) CALL mp_sum(edft%self_ehte, group)
CALL mp_sum(edft%ekin, group) ! CALL mp_sum(edft%ekin, group) ! already summed up
CALL mp_sum(edft%emkin, group) CALL mp_sum(edft%emkin, group)
CALL total_energy(edft,omega,vxc,eps,self_vxc,nr1_g*nr2_g*nr3_g) CALL total_energy(edft,omega,vxc,eps,self_vxc,nr1*nr2*nr3)
!fran: the output is introduced only in the print_energies.f90 !fran: the output is introduced only in the print_energies.f90
!fran: in this way you print only each print_step !fran: in this way you print only each print_step
@ -761,21 +748,20 @@
!=----------------------------------------------------------------------------=! !=----------------------------------------------------------------------------=!
SUBROUTINE cluster_bc( screen_coul, hg, box, desc ) SUBROUTINE cluster_bc( screen_coul, hg, box )
USE green_functions, ONLY: greenf USE green_functions, ONLY: greenf
USE mp_global, ONLY: mpime USE mp_global, ONLY: mpime
USE fft, ONLY : pfwfft USE fft, ONLY : pfwfft
USE fft_base, ONLY: dfftp USE fft_base, ONLY: dfftp
USE charge_types, ONLY: charge_descriptor
USE processors_grid_module, ONLY: get_grid_info USE processors_grid_module, ONLY: get_grid_info
USE cell_module, ONLY: boxdimensions, s_to_r, alat USE cell_module, ONLY: boxdimensions, s_to_r, alat
USE constants, ONLY: gsmall, pi USE constants, ONLY: gsmall, pi
USE cell_base, ONLY: tpiba2 USE cell_base, ONLY: tpiba2
use grid_dimensions, only: nr1, nr2, nr3, nr1l, nr2l, nr3l, nnrx
REAL(DP), INTENT(IN) :: hg(:) REAL(DP), INTENT(IN) :: hg(:)
TYPE (boxdimensions), INTENT(IN) :: box TYPE (boxdimensions), INTENT(IN) :: box
TYPE (charge_descriptor), INTENT(IN) :: desc
COMPLEX(DP) :: screen_coul(:) COMPLEX(DP) :: screen_coul(:)
! ... declare external function ! ... declare external function
@ -783,21 +769,12 @@
EXTERNAL erf, erfc EXTERNAL erf, erfc
! ... Locals ! ... Locals
REAL(DP), ALLOCATABLE :: grr(:,:,:) REAL(DP), ALLOCATABLE :: grr(:)
COMPLEX(DP), ALLOCATABLE :: grg(:) COMPLEX(DP), ALLOCATABLE :: grg(:)
REAL(DP) :: rc, r(3), s(3), rmod, g2, rc2, arg, omega, fact REAL(DP) :: rc, r(3), s(3), rmod, g2, rc2, arg, omega, fact
INTEGER :: ig, i, j, k INTEGER :: ig, i, j, k, ir
INTEGER :: nr1_l, nr2_l, nr3_l, nr1_g, nr2_g, nr3_g
INTEGER :: ir1, ir2, ir3 INTEGER :: ir1, ir2, ir3
nr1_l = desc % nxl
nr2_l = desc % nyl
nr3_l = desc % nzl
nr1_g = desc % nx
nr2_g = desc % ny
nr3_g = desc % nz
ir1 = 1 ir1 = 1
ir2 = 1 ir2 = 1
ir3 = 1 ir3 = 1
@ -805,28 +782,31 @@
ir3 = ir3 + dfftp%npp( k ) ir3 = ir3 + dfftp%npp( k )
END DO END DO
ALLOCATE( grr( dfftp%nr1x, dfftp%nr2x, dfftp%npl ) ) ALLOCATE( grr( nnrx ) )
ALLOCATE( grg( SIZE( screen_coul ) ) ) ALLOCATE( grg( SIZE( screen_coul ) ) )
grr = 0.0d0
! ... Martina and Tuckerman convergence criterium ! ... Martina and Tuckerman convergence criterium
rc = 7.0d0 / alat rc = 7.0d0 / alat
rc2 = rc**2 rc2 = rc**2
omega = box%deth omega = box%deth
fact = omega / ( nr1_g * nr2_g * nr3_g ) fact = omega / ( nr1 * nr2 * nr3 )
IF( MOD(nr1_g * nr2_g * nr3_g, 2) /= 0 ) fact = -fact IF( MOD(nr1 * nr2 * nr3, 2) /= 0 ) fact = -fact
DO k = 1, nr3_l DO k = 1, nr3l
s(3) = DBLE ( (k-1) + (ir3 - 1) ) / nr3_g - 0.5d0 s(3) = DBLE ( (k-1) + (ir3 - 1) ) / nr3 - 0.5d0
DO j = 1, nr2_l DO j = 1, nr2l
s(2) = DBLE ( (j-1) + (ir2 - 1) ) / nr2_g - 0.5d0 s(2) = DBLE ( (j-1) + (ir2 - 1) ) / nr2 - 0.5d0
DO i = 1, nr1_l DO i = 1, nr1l
s(1) = DBLE ( (i-1) + (ir1 - 1) ) / nr1_g - 0.5d0 s(1) = DBLE ( (i-1) + (ir1 - 1) ) / nr1 - 0.5d0
CALL S_TO_R(S, R, box) CALL S_TO_R(S, R, box)
rmod = SQRT( r(1)**2 + r(2)**2 + r(3)**2 ) rmod = SQRT( r(1)**2 + r(2)**2 + r(3)**2 )
ir = i + (j-1)*dfftp%nr1x + (k-1)*dfftp%nr1x*dfftp%nr2x
IF( rmod < gsmall ) THEN IF( rmod < gsmall ) THEN
grr(i,j,k) = fact * 2.0d0 * rc / SQRT( pi ) grr( ir ) = fact * 2.0d0 * rc / SQRT( pi )
ELSE ELSE
grr(i,j,k) = fact * erf( rc * rmod ) / rmod grr( ir ) = fact * erf( rc * rmod ) / rmod
END IF END IF
END DO END DO
END DO END DO
@ -856,11 +836,11 @@
! BEGIN manual ! BEGIN manual
SUBROUTINE vofloc(tscreen, tforce, ehte, ehti, eh, eps, vloc, rhoeg, & SUBROUTINE vofloc(tscreen, tforce, ehte, ehti, eh, eps, vloc, rhoeg, &
fion, atoms, rhops, vps, eigr, ei1, ei2, ei3, sfac, ht, desc ) fion, atoms, rhops, vps, eigr, ei1, ei2, ei3, sfac, ht )
! this routine computes: ! this routine computes:
! omega = ht%deth ! omega = ht%deth
! rho_e(ig) = (sum over ispin) rhoeg(ig,ispin) ! rho_e(ig) = (sum over iss) rhoeg(ig,iss)
! rho_I(ig) = (sum over is) sfac(is,ig) * rhops(ig,is) ! rho_I(ig) = (sum over is) sfac(is,ig) * rhops(ig,is)
! vloc_h(ig) = fpi / ( g(ig) * tpiba2 ) * { rho_e(ig) + rho_I(ig) } ! vloc_h(ig) = fpi / ( g(ig) * tpiba2 ) * { rho_e(ig) + rho_I(ig) }
! vloc_ps(ig) = (sum over is) sfac(is,ig) * vps(ig,is) ! vloc_ps(ig) = (sum over is) sfac(is,ig) * vps(ig,is)
@ -884,7 +864,7 @@
! tx_ps(ig,is) = vps(ig,is) * CONJG( rho_e(ig) ) ! tx_ps(ig,is) = vps(ig,is) * CONJG( rho_e(ig) )
! gx(ig) = CMPLX(0.D0, gx(1,ig)) * tpiba ! gx(ig) = CMPLX(0.D0, gx(1,ig)) * tpiba
! fion(x,isa) = fion(x,isa) + ! fion(x,isa) = fion(x,isa) +
! Fact * omega * ( sum over ig, ispin) (tx_h(ig,is) + tx_ps(ig,is)) * ! Fact * omega * ( sum over ig, iss) (tx_h(ig,is) + tx_ps(ig,is)) *
! gx(ig) * eigrx(ig,isa) * eigry(ig,isa) * eigrz(ig,isa) ! gx(ig) * eigrx(ig,isa) * eigry(ig,isa) * eigrz(ig,isa)
! if Gamma symmetry Fact = 2.0 else Fact = 1 ! if Gamma symmetry Fact = 2.0 else Fact = 1
! !
@ -895,7 +875,6 @@
USE control_flags, ONLY: gamma_only USE control_flags, ONLY: gamma_only
USE cell_base, ONLY: tpiba2, tpiba USE cell_base, ONLY: tpiba2, tpiba
USE cell_module, ONLY: boxdimensions USE cell_module, ONLY: boxdimensions
USE charge_types, ONLY: charge_descriptor
USE atoms_type_module, ONLY: atoms_type USE atoms_type_module, ONLY: atoms_type
USE io_global, ONLY: stdout USE io_global, ONLY: stdout
USE grid_dimensions, ONLY: nr1, nr2, nr3 USE grid_dimensions, ONLY: nr1, nr2, nr3
@ -910,7 +889,6 @@
TYPE (atoms_type) :: atoms TYPE (atoms_type) :: atoms
TYPE (boxdimensions), INTENT(in) :: ht TYPE (boxdimensions), INTENT(in) :: ht
TYPE (charge_descriptor), INTENT(IN) :: desc
LOGICAL :: tforce LOGICAL :: tforce
LOGICAL :: tscreen LOGICAL :: tscreen
REAL(DP) :: fion(:,:) REAL(DP) :: fion(:,:)
@ -927,7 +905,7 @@
! ... Locals ! ... Locals
INTEGER :: is, ia, isa, ig, ig1, ig2, ig3, nspin, ispin INTEGER :: is, ia, isa, ig, ig1, ig2, ig3, nspin, iss
REAL(DP) :: fpibg, cost, omega REAL(DP) :: fpibg, cost, omega
COMPLEX(DP) :: cxc, rhet, rhog, vp, rp, gxc, gyc, gzc COMPLEX(DP) :: cxc, rhet, rhog, vp, rp, gxc, gyc, gzc
COMPLEX(DP) :: teigr, cnvg, cvn, tx, ty, tz, vscreen COMPLEX(DP) :: teigr, cnvg, cvn, tx, ty, tz, vscreen
@ -944,7 +922,7 @@
IF( tscreen ) THEN IF( tscreen ) THEN
ALLOCATE( screen_coul( ngm ) ) ALLOCATE( screen_coul( ngm ) )
CALL cluster_bc( screen_coul, g, ht, desc ) CALL cluster_bc( screen_coul, g, ht )
END IF END IF
!======================================================================= !=======================================================================
@ -1020,9 +998,9 @@
IF(TFORCE) THEN IF(TFORCE) THEN
! ... each processor add its own contribution to the array FION ! ... each processor add its own contribution to the array FION
IF( gamma_only ) THEN IF( gamma_only ) THEN
cost = 2.D0 * ht%deth * tpiba cost = 2.D0 * omega * tpiba
ELSE ELSE
cost = ht%deth * tpiba cost = omega * tpiba
END IF END IF
FION = FION + DBLE(ftmp) * cost FION = FION + DBLE(ftmp) * cost
END IF END IF
@ -1046,11 +1024,11 @@
eh = eh + vscreen * rhog * CONJG(rhog) eh = eh + vscreen * rhog * CONJG(rhog)
ehte = ehte + vscreen * DBLE(rhet * CONJG(rhet)) ehte = ehte + vscreen * DBLE(rhet * CONJG(rhet))
ehti = ehti + vscreen * DBLE( rp * CONJG(rp)) ehti = ehti + vscreen * DBLE( rp * CONJG(rp))
DO ispin = 1, nspin DO iss = 1, nspin
IF( gamma_only ) THEN IF( gamma_only ) THEN
eps = eps + vp * CONJG(RHOEG(1,ispin)) * 0.5d0 eps = eps + vp * CONJG(RHOEG(1,iss)) * 0.5d0
ELSE ELSE
eps = eps + vp * CONJG(RHOEG(1,ispin)) eps = eps + vp * CONJG(RHOEG(1,iss))
END IF END IF
END DO END DO
END IF END IF
@ -1079,8 +1057,7 @@
USE cell_module, ONLY: s_to_r, boxdimensions, pbcs USE cell_module, ONLY: s_to_r, boxdimensions, pbcs
USE mp_global, ONLY: nproc, mpime, group USE mp_global, ONLY: nproc, mpime, group
USE mp, ONLY: mp_sum USE mp, ONLY: mp_sum
USE parallel_types, ONLY: BLOCK_PARTITION_SHAPE USE parallel_types, ONLY: BLOCK_PARTITION_DIST
USE descriptors_module, ONLY: global_index, local_dimension
USE atoms_type_module, ONLY: atoms_type USE atoms_type_module, ONLY: atoms_type
USE ions_base, ONLY: rcmax, zv USE ions_base, ONLY: rcmax, zv
@ -1099,6 +1076,9 @@
REAL(DP) :: erf, erfc REAL(DP) :: erf, erfc
EXTERNAL erf, erfc EXTERNAL erf, erfc
INTEGER :: ldim_block, gind_block
EXTERNAL ldim_block, gind_block
! ... LOCALS ! ... LOCALS
@ -1188,10 +1168,8 @@
ESR = 0.0_DP ESR = 0.0_DP
DESR = 0.0_DP DESR = 0.0_DP
! NA_LOC = LOCALDIM(npt,NPROC,ME) NA_LOC = ldim_block( npt, nproc, mpime)
NA_LOC = local_dimension( npt, 1, mpime, 0, nproc, BLOCK_PARTITION_SHAPE) IA_S = gind_block( 1, npt, nproc, mpime )
! IA_S = GLOBALINDEX(1,npt,NPROC,ME)
IA_S = global_index( 1, npt, 1, mpime, 0, nproc, BLOCK_PARTITION_SHAPE )
IA_E = IA_S + NA_LOC - 1 IA_E = IA_S + NA_LOC - 1
DO ia = ia_s, ia_e DO ia = ia_s, ia_e
@ -1286,7 +1264,7 @@
! ---------------------------------------------- ! ----------------------------------------------
! BEGIN manual ! BEGIN manual
SUBROUTINE self_vofloc(tscreen, ehte, vloc, rhoeg, ht, desc) SUBROUTINE self_vofloc(tscreen, ehte, vloc, rhoeg, ht)
! adds the hartree part of the self interaction ! adds the hartree part of the self interaction
! !
@ -1296,7 +1274,6 @@
USE constants, ONLY: fpi USE constants, ONLY: fpi
USE control_flags, ONLY: gamma_only USE control_flags, ONLY: gamma_only
USE cell_module, ONLY: boxdimensions USE cell_module, ONLY: boxdimensions
USE charge_types, ONLY: charge_descriptor
USE cell_base, ONLY: tpiba2 USE cell_base, ONLY: tpiba2
USE gvecp, ONLY: ngm USE gvecp, ONLY: ngm
USE reciprocal_vectors, ONLY: gstart, g USE reciprocal_vectors, ONLY: gstart, g
@ -1305,7 +1282,6 @@
! ... Arguments ! ... Arguments
TYPE (boxdimensions), INTENT(in) :: ht TYPE (boxdimensions), INTENT(in) :: ht
TYPE (charge_descriptor), INTENT(IN) :: desc
LOGICAL :: tscreen LOGICAL :: tscreen
COMPLEX(DP) :: vloc(:) COMPLEX(DP) :: vloc(:)
COMPLEX(DP) :: rhoeg(:) COMPLEX(DP) :: rhoeg(:)
@ -1324,7 +1300,7 @@
IF( tscreen ) THEN IF( tscreen ) THEN
ALLOCATE( screen_coul( ngm ) ) ALLOCATE( screen_coul( ngm ) )
CALL cluster_bc( screen_coul, g, ht, desc ) CALL cluster_bc( screen_coul, g, ht )
END IF END IF
!======================================================================= !=======================================================================
@ -1375,7 +1351,7 @@
SUBROUTINE localisation( wfc, atoms_m, ht, desc) SUBROUTINE localisation( wfc, atoms_m, ht)
! adds the hartree part of the self interaction ! adds the hartree part of the self interaction
! !
@ -1385,7 +1361,6 @@
USE constants, ONLY: fpi USE constants, ONLY: fpi
USE control_flags, ONLY: gamma_only USE control_flags, ONLY: gamma_only
USE cell_module, ONLY: boxdimensions, s_to_r USE cell_module, ONLY: boxdimensions, s_to_r
USE charge_types, ONLY: charge_descriptor
USE atoms_type_module, ONLY: atoms_type USE atoms_type_module, ONLY: atoms_type
USE fft, ONLY : pw_invfft, pfwfft, pinvfft USE fft, ONLY : pw_invfft, pfwfft, pinvfft
USE sic_module, ONLY: ind_localisation, nat_localisation, print_localisation USE sic_module, ONLY: ind_localisation, nat_localisation, print_localisation
@ -1395,6 +1370,7 @@
USE cell_base, ONLY: tpiba2 USE cell_base, ONLY: tpiba2
USE reciprocal_vectors, ONLY: gstart, g USE reciprocal_vectors, ONLY: gstart, g
USE gvecp, ONLY: ngm USE gvecp, ONLY: ngm
use grid_dimensions, only: nr1, nr2, nr3, nr1l, nr2l, nr3l, nnrx
IMPLICIT NONE IMPLICIT NONE
@ -1403,7 +1379,6 @@
COMPLEX(DP), INTENT(IN) :: wfc(:) COMPLEX(DP), INTENT(IN) :: wfc(:)
TYPE (atoms_type), INTENT(in) :: atoms_m TYPE (atoms_type), INTENT(in) :: atoms_m
TYPE (boxdimensions), INTENT(in) :: ht TYPE (boxdimensions), INTENT(in) :: ht
TYPE (charge_descriptor), INTENT(IN) :: desc
! ... Locals ! ... Locals
@ -1411,42 +1386,36 @@
REAL(DP) :: ehte REAL(DP) :: ehte
INTEGER :: ig, at, ia, is, isa_input, isa_sorted, isa_loc INTEGER :: ig, at, ia, is, isa_input, isa_sorted, isa_loc
REAL(DP) :: fpibg, omega, aRe, aR2, R(3) REAL(DP) :: fpibg, omega, aRe, aR2, R(3)
INTEGER :: Xmin, Ymin, Zmin, Xmax, Ymax, Zmax INTEGER :: Xmin, Ymin, Zmin, Xmax, Ymax, Zmax, i,j,k, ir
INTEGER :: nr1_l, nr2_l, nr3_l
REAL(DP) :: work, work2 REAL(DP) :: work, work2
COMPLEX(DP) :: rhog COMPLEX(DP) :: rhog
REAL(DP), ALLOCATABLE :: density(:,:,:), psi(:,:,:) REAL(DP), ALLOCATABLE :: density(:), psi(:)
COMPLEX(DP), ALLOCATABLE :: k_density(:), cpsi(:,:,:) COMPLEX(DP), ALLOCATABLE :: k_density(:), cpsi(:)
COMPLEX(DP) :: vscreen COMPLEX(DP) :: vscreen
COMPLEX(DP), ALLOCATABLE :: screen_coul(:) COMPLEX(DP), ALLOCATABLE :: screen_coul(:)
INTEGER :: nr1x, nr2x, nr3x
! ... Subroutine body ... ! ... Subroutine body ...
IF( .FALSE. ) THEN IF( .FALSE. ) THEN
ALLOCATE( screen_coul( ngm ) ) ALLOCATE( screen_coul( ngm ) )
CALL cluster_bc( screen_coul, g, ht, desc ) CALL cluster_bc( screen_coul, g, ht )
END IF END IF
nr1x = dfftp%nr1x
nr2x = dfftp%nr2x
nr3x = dfftp%npl
omega = ht%deth omega = ht%deth
nr1_l = desc % nxl ALLOCATE( density( nnrx ) )
nr2_l = desc % nyl ALLOCATE( psi( nnrx ) )
nr3_l = desc % nzl
ALLOCATE( density( nr1x, nr2x, nr3x ) )
ALLOCATE( psi( nr1x, nr2x, nr3x ) )
ALLOCATE( cpsi( nr1x, nr2x, nr3x ) )
ALLOCATE( k_density( ngm ) ) ALLOCATE( k_density( ngm ) )
CALL pw_invfft( cpsi(:,:,:), wfc(:), wfc(:) ) ALLOCATE( cpsi( nnrx ) )
cpsi = 0.0d0
CALL pw_invfft( cpsi(:), wfc(:), wfc(:) )
psi = DBLE( cpsi ) psi = DBLE( cpsi )
DEALLOCATE( cpsi ) DEALLOCATE( cpsi )
isa_sorted = 0 isa_sorted = 0
@ -1473,34 +1442,44 @@
!WRITE(6,*) 'ATOM ', ind_localisation( isa_input ) !WRITE(6,*) 'ATOM ', ind_localisation( isa_input )
!WRITE(6,*) 'POS ', atoms_m%taus( :, isa_sorted ) !WRITE(6,*) 'POS ', atoms_m%taus( :, isa_sorted )
work = nr1_l work = nr1l
work2 = sic_rloc * work work2 = sic_rloc * work
work = work * R(1) - work2 work = work * R(1) - work2
Xmin = FLOOR(work) Xmin = FLOOR(work)
work = work + 2*work2 work = work + 2*work2
Xmax = FLOOR(work) Xmax = FLOOR(work)
IF ( Xmax > nr1_l ) Xmax = nr1_l IF ( Xmax > nr1l ) Xmax = nr1l
IF ( Xmin < 1 ) Xmin = 1 IF ( Xmin < 1 ) Xmin = 1
work = nr2_l
work = nr2l
work2 = sic_rloc * work work2 = sic_rloc * work
work = work * R(2) - work2 work = work * R(2) - work2
Ymin = FLOOR(work) Ymin = FLOOR(work)
work = work + 2*work2 work = work + 2*work2
Ymax = FLOOR(work) Ymax = FLOOR(work)
IF ( Ymax > nr2_l ) Ymax = nr2_l IF ( Ymax > nr2l ) Ymax = nr2l
IF ( Ymin < 1 ) Ymin = 1 IF ( Ymin < 1 ) Ymin = 1
work = nr3_l
work = nr3l
work2 = sic_rloc * work work2 = sic_rloc * work
work = work * R(3) - work2 work = work * R(3) - work2
Zmin = FLOOR(work) Zmin = FLOOR(work)
work = work + 2*work2 work = work + 2*work2
Zmax = FLOOR(work) Zmax = FLOOR(work)
IF ( Zmax > nr3_l ) Zmax = nr3_l IF ( Zmax > nr3l ) Zmax = nr3l
IF ( Zmin < 1 ) Zmin = 1 IF ( Zmin < 1 ) Zmin = 1
density = 0.D0 density = 0.D0
density( Xmin:Xmax, Ymin:Ymax, Zmin:Zmax ) = &
psi( Xmin:Xmax, Ymin:Ymax, Zmin:Zmax ) * psi( Xmin:Xmax, Ymin:Ymax, Zmin:Zmax ) DO k = Zmin, Zmax
DO j = Ymin, Ymax
DO i = Xmin, Xmax
ir = i + (j-1)*dfftp%nr1x + (k-1)*dfftp%nr1x*dfftp%nr2x
density( ir ) = psi( ir ) * psi( ir )
END DO
END DO
END DO
CALL pfwfft( k_density, density ) CALL pfwfft( k_density, density )
! ... G /= 0 elements ! ... G /= 0 elements

View File

@ -594,17 +594,15 @@
!=----------------------------------------------------------------------------=! !=----------------------------------------------------------------------------=!
SUBROUTINE print_sfac( rhoe, desc, sfac ) SUBROUTINE print_sfac( rhoe, sfac )
USE mp_global, ONLY: mpime, nproc, group USE mp_global, ONLY: mpime, nproc, group
USE mp, ONLY: mp_max, mp_get, mp_put USE mp, ONLY: mp_max, mp_get, mp_put
USE fft, ONLY : pfwfft, pinvfft USE fft, ONLY : pfwfft, pinvfft
USE charge_types, ONLY: charge_descriptor
USE reciprocal_vectors, ONLY: ig_l2g, gx, g USE reciprocal_vectors, ONLY: ig_l2g, gx, g
USE gvecp, ONLY: ngm USE gvecp, ONLY: ngm
TYPE (charge_descriptor), INTENT(IN) :: desc REAL(DP), INTENT(IN) :: rhoe(:,:)
REAL(DP), INTENT(IN) :: rhoe(:,:,:,:)
COMPLEX(DP), INTENT(IN) :: sfac(:,:) COMPLEX(DP), INTENT(IN) :: sfac(:,:)
INTEGER :: nspin, ispin, ip, nsp, ngx_l, ng, is, ig INTEGER :: nspin, ispin, ip, nsp, ngx_l, ng, is, ig
@ -615,7 +613,7 @@
INTEGER , ALLOCATABLE :: ig_rcv(:) INTEGER , ALLOCATABLE :: ig_rcv(:)
COMPLEX(DP), ALLOCATABLE :: sfac_rcv(:,:) COMPLEX(DP), ALLOCATABLE :: sfac_rcv(:,:)
nspin = SIZE(rhoe,4) nspin = SIZE(rhoe,2)
nsp = SIZE(sfac,2) nsp = SIZE(sfac,2)
ngx_l = ngm ngx_l = ngm
CALL mp_max(ngx_l, group) CALL mp_max(ngx_l, group)
@ -627,7 +625,7 @@
ALLOCATE(sfac_rcv(ngx_l,nsp)) ALLOCATE(sfac_rcv(ngx_l,nsp))
! ... FFT: rho(r) --> rho(g) ! ... FFT: rho(r) --> rho(g)
DO ispin = 1, nspin DO ispin = 1, nspin
CALL pfwfft(rhoeg(:,ispin),rhoe(:,:,:,ispin)) CALL pfwfft(rhoeg(:,ispin),rhoe(:,ispin))
END DO END DO
IF( ionode ) THEN IF( ionode ) THEN
OPEN(sfacunit, FILE=TRIM(sfac_file), STATUS='UNKNOWN') OPEN(sfacunit, FILE=TRIM(sfac_file), STATUS='UNKNOWN')
@ -673,20 +671,15 @@
!=----------------------------------------------------------------------------=! !=----------------------------------------------------------------------------=!
SUBROUTINE printacc( nfi, rhoe, desc, atoms, ht, nstep_run, avgs, avgs_run ) SUBROUTINE printacc( nfi, nstep_run, avgs, avgs_run )
USE cell_module, ONLY: boxdimensions USE cell_module, ONLY: boxdimensions
USE atoms_type_module, ONLY: atoms_type USE atoms_type_module, ONLY: atoms_type
USE charge_types, ONLY: charge_descriptor
IMPLICIT NONE IMPLICIT NONE
INTEGER, INTENT(IN) :: nfi, nstep_run INTEGER, INTENT(IN) :: nfi, nstep_run
REAL(DP), intent(in) :: rhoe(:,:,:,:)
TYPE (charge_descriptor), intent(in) :: desc
REAL (DP) :: avgs(:), avgs_run(:) REAL (DP) :: avgs(:), avgs_run(:)
TYPE (atoms_type) :: atoms
TYPE (boxdimensions), intent(in) :: ht
IF ( nfi < 1 ) THEN IF ( nfi < 1 ) THEN
RETURN RETURN
@ -744,7 +737,7 @@
use kinds, only: DP use kinds, only: DP
use ensemble_dft, only: tens, ismear, z0, c0diag, becdiag, dval, zaux, e0, zx use ensemble_dft, only: tens, ismear, z0, c0diag, becdiag, dval, zaux, e0, zx
use electrons_base, only: nx => nbspx, n => nbsp, ispin => fspin, f, nspin use electrons_base, only: nx => nbspx, n => nbsp, ispin, f, nspin
use electrons_base, only: nel, iupdwn, nupdwn, nudx, nelt use electrons_base, only: nel, iupdwn, nupdwn, nudx, nelt
use energies, only: enl, ekin use energies, only: enl, ekin
use ions_base, only: nsp use ions_base, only: nsp

View File

@ -33,7 +33,7 @@ subroutine qmatrixd(c0, bec0,ctable, gqq, qmat, detq)
use reciprocal_vectors, only: ng0 => gstart use reciprocal_vectors, only: ng0 => gstart
use uspp_param, only: nh, nhm use uspp_param, only: nh, nhm
use uspp, only : nhsa=> nkb use uspp, only : nhsa=> nkb
use electrons_base, only: nx => nbspx, n => nbsp, fspin use electrons_base, only: nx => nbspx, n => nbsp, ispin
use mp, only: mp_sum use mp, only: mp_sum
@ -80,7 +80,7 @@ subroutine qmatrixd(c0, bec0,ctable, gqq, qmat, detq)
! first the local part ! first the local part
sca=(0.,0.) sca=(0.,0.)
if(fspin(ix) == fspin(jx) ) then if(ispin(ix) == ispin(jx) ) then
!#ifdef NEC !#ifdef NEC
! *vdir nodep ! *vdir nodep
@ -133,7 +133,7 @@ subroutine qmatrixd(c0, bec0,ctable, gqq, qmat, detq)
! now the non local vanderbilt part ! now the non local vanderbilt part
sca =(0.,0.) sca =(0.,0.)
if(fspin(ix)==fspin(jx)) then if(ispin(ix)==ispin(jx)) then
do is=1,nvb!loop on vanderbilt species do is=1,nvb!loop on vanderbilt species
do ia=1,na(is)!loop on atoms do ia=1,na(is)!loop on atoms
do iv=1,nh(is)!loop on projectors do iv=1,nh(is)!loop on projectors

View File

@ -230,7 +230,7 @@
SUBROUTINE writefile_fpmd( nfi, trutime, c0, cm, cdesc, occ, & SUBROUTINE writefile_fpmd( nfi, trutime, c0, cm, cdesc, occ, &
atoms_0, atoms_m, acc, taui, cdmi, & atoms_0, atoms_m, acc, taui, cdmi, &
ht_m, ht_0, rho, desc, vpot) ht_m, ht_0, rho, vpot)
USE cell_module, only: boxdimensions, r_to_s USE cell_module, only: boxdimensions, r_to_s
USE brillouin, only: kpoints, kp USE brillouin, only: kpoints, kp
@ -240,7 +240,6 @@
USE atoms_type_module, ONLY: atoms_type USE atoms_type_module, ONLY: atoms_type
USE io_global, ONLY: ionode, ionode_id USE io_global, ONLY: ionode, ionode_id
USE io_global, ONLY: stdout USE io_global, ONLY: stdout
USE charge_types, ONLY: charge_descriptor
USE electrons_nose, ONLY: xnhe0, xnhem, vnhe USE electrons_nose, ONLY: xnhe0, xnhem, vnhe
USE electrons_base, ONLY: nbsp, nspin USE electrons_base, ONLY: nbsp, nspin
USE cell_nose, ONLY: xnhh0, xnhhm, vnhh USE cell_nose, ONLY: xnhh0, xnhhm, vnhh
@ -257,17 +256,15 @@
REAL(DP), INTENT(IN) :: occ(:,:,:) REAL(DP), INTENT(IN) :: occ(:,:,:)
TYPE (boxdimensions), INTENT(IN) :: ht_m, ht_0 TYPE (boxdimensions), INTENT(IN) :: ht_m, ht_0
TYPE (atoms_type), INTENT(IN) :: atoms_0, atoms_m TYPE (atoms_type), INTENT(IN) :: atoms_0, atoms_m
REAL(DP), INTENT(IN) :: rho(:,:,:,:) REAL(DP), INTENT(IN) :: rho(:,:)
TYPE (charge_descriptor), INTENT(IN) :: desc
TYPE (wave_descriptor) :: cdesc TYPE (wave_descriptor) :: cdesc
REAL(DP), INTENT(INOUT) :: vpot(:,:,:,:) REAL(DP), INTENT(INOUT) :: vpot(:,:)
REAL(DP), INTENT(IN) :: taui(:,:) REAL(DP), INTENT(IN) :: taui(:,:)
REAL(DP), INTENT(IN) :: acc(:), cdmi(:) REAL(DP), INTENT(IN) :: acc(:), cdmi(:)
REAL(DP), INTENT(IN) :: trutime REAL(DP), INTENT(IN) :: trutime
REAL(DP), ALLOCATABLE :: lambda(:,:) REAL(DP), ALLOCATABLE :: lambda(:,:)
REAL(DP), ALLOCATABLE :: rhow(:,:)
REAL(DP) :: ekincm REAL(DP) :: ekincm
INTEGER :: i, j, k, iss, ir INTEGER :: i, j, k, iss, ir
@ -278,36 +275,16 @@
! properties on the writefile subroutine ! properties on the writefile subroutine
ALLOCATE( lambda(nbsp,nbsp) ) ALLOCATE( lambda(nbsp,nbsp) )
ALLOCATE( rhow( nr1x * nr2x * SIZE( rho, 3 ), nspin ) )
lambda = 0.0d0 lambda = 0.0d0
ekincm = 0.0d0 ekincm = 0.0d0
! !
! !
IF( SIZE( rho, 1 ) /= nr1x .OR. SIZE( rho, 2 ) /= nr2x ) THEN
WRITE( stdout, * ) nr1x, nr2x
WRITE( stdout, * ) SIZE( rho, 1 ), SIZE( rho, 2 )
CALL errore( ' writefile_fpmd ', ' rho dimensions do not correspond ', 1 )
END IF
!
DO iss = 1, nspin
ir = 0
DO k = 1, SIZE( rho, 3 )
DO j = 1, nr2x
DO i = 1, nr1x
ir = ir + 1
rhow( ir, iss ) = rho( i, j, k, iss )
END DO
END DO
END DO
END DO
CALL cp_writefile( ndw, scradir, .TRUE., nfi, trutime, acc, kp%nkpt, kp%xk, kp%weight, & CALL cp_writefile( ndw, scradir, .TRUE., nfi, trutime, acc, kp%nkpt, kp%xk, kp%weight, &
ht_0%a, ht_m%a, ht_0%hvel, ht_0%gvel, xnhh0, xnhhm, vnhh, taui, cdmi, & ht_0%a, ht_m%a, ht_0%hvel, ht_0%gvel, xnhh0, xnhhm, vnhh, taui, cdmi, &
atoms_0%taus, atoms_0%vels, atoms_m%taus, atoms_m%vels, atoms_0%for, vnhp, & atoms_0%taus, atoms_0%vels, atoms_m%taus, atoms_m%vels, atoms_0%for, vnhp, &
xnhp0, xnhpm, nhpcl, nhpdim, occ, occ, lambda, lambda, & xnhp0, xnhpm, nhpcl, nhpdim, occ, occ, lambda, lambda, &
xnhe0, xnhem, vnhe, ekincm, ei, rhow, c04 = c0, cm4 = cm ) xnhe0, xnhem, vnhe, ekincm, ei, rho, c04 = c0, cm4 = cm )
DEALLOCATE( rhow )
DEALLOCATE( lambda ) DEALLOCATE( lambda )
RETURN RETURN
@ -319,7 +296,7 @@
SUBROUTINE readfile_fpmd( nfi, trutime, & SUBROUTINE readfile_fpmd( nfi, trutime, &
c0, cm, cdesc, occ, atoms_0, atoms_m, acc, taui, cdmi, & c0, cm, cdesc, occ, atoms_0, atoms_m, acc, taui, cdmi, &
ht_m, ht_0, rho, desc, vpot ) ht_m, ht_0, rho, vpot )
use electrons_base, only: nbsp use electrons_base, only: nbsp
USE cell_module, only: boxdimensions, cell_init, r_to_s, s_to_r USE cell_module, only: boxdimensions, cell_init, r_to_s, s_to_r
@ -336,7 +313,6 @@
USE gvecw, ONLY: ecutwfc => ecutw USE gvecw, ONLY: ecutwfc => ecutw
USE gvecp, ONLY: ecutrho => ecutp USE gvecp, ONLY: ecutrho => ecutp
USE fft, ONLY : pfwfft, pinvfft USE fft, ONLY : pfwfft, pinvfft
USE charge_types, ONLY: charge_descriptor
USE ions_base, ONLY: nat, nsp, na USE ions_base, ONLY: nat, nsp, na
USE electrons_module, ONLY: nspin USE electrons_module, ONLY: nspin
USE control_flags, ONLY: twfcollect, force_pairing USE control_flags, ONLY: twfcollect, force_pairing
@ -354,10 +330,9 @@
REAL(DP), INTENT(INOUT) :: occ(:,:,:) REAL(DP), INTENT(INOUT) :: occ(:,:,:)
TYPE (boxdimensions), INTENT(INOUT) :: ht_m, ht_0 TYPE (boxdimensions), INTENT(INOUT) :: ht_m, ht_0
TYPE (atoms_type), INTENT(INOUT) :: atoms_0, atoms_m TYPE (atoms_type), INTENT(INOUT) :: atoms_0, atoms_m
REAL(DP), INTENT(INOUT) :: rho(:,:,:,:) REAL(DP), INTENT(INOUT) :: rho(:,:)
TYPE (charge_descriptor), INTENT(IN) :: desc
TYPE (wave_descriptor) :: cdesc TYPE (wave_descriptor) :: cdesc
REAL(DP), INTENT(INOUT) :: vpot(:,:,:,:) REAL(DP), INTENT(INOUT) :: vpot(:,:)
REAL(DP), INTENT(OUT) :: taui(:,:) REAL(DP), INTENT(OUT) :: taui(:,:)
REAL(DP), INTENT(OUT) :: acc(:), cdmi(:) REAL(DP), INTENT(OUT) :: acc(:), cdmi(:)

View File

@ -72,6 +72,8 @@ MODULE from_restart_module
USE cell_nose, ONLY : xnhh0, xnhhm, vnhh, cell_nosezero USE cell_nose, ONLY : xnhh0, xnhhm, vnhh, cell_nosezero
USE phase_factors_module, ONLY : strucf USE phase_factors_module, ONLY : strucf
USE cg_module, ONLY : tcg USE cg_module, ONLY : tcg
USE orthogonalize, ONLY : ortho
USE orthogonalize_base, ONLY : updatc, calphi
! !
COMPLEX(DP) :: eigr(:,:), ei1(:,:), ei2(:,:), ei3(:,:) COMPLEX(DP) :: eigr(:,:), ei1(:,:), ei2(:,:), ei3(:,:)
COMPLEX(DP) :: eigrb(:,:) COMPLEX(DP) :: eigrb(:,:)
@ -239,7 +241,7 @@ MODULE from_restart_module
! !
! ... calphi calculates phi; the electron mass rises with g**2 ! ... calphi calculates phi; the electron mass rises with g**2
! !
CALL calphi( c0, ngw, ema0bg, bec, nkb, vkb, phi, nbsp ) CALL calphi( c0, ngw, bec, nkb, vkb, phi, nbsp, ema0bg )
! !
! ... begin try and error loop ( only one step! ) ! ... begin try and error loop ( only one step! )
! !
@ -252,10 +254,11 @@ MODULE from_restart_module
! !
IF ( tortho ) THEN IF ( tortho ) THEN
! !
CALL ortho( eigr, cm, phi, lambda, bigr, iter, & CALL ortho( eigr, cm(:,:,1,1), phi(:,:,1,1), lambda, bigr, iter, &
dt2bye, ortho_eps, ortho_max, delt0, bephi, becp ) dt2bye, bephi, becp )
! !
CALL updatc( dt2bye, lambda, phi, bephi, becp, bec, cm ) CALL updatc( dt2bye, nbsp, lambda, SIZE(lambda,1), phi, SIZE(phi,1), &
bephi, SIZE(bephi,1), becp, bec, cm )
! !
ELSE ELSE
! !
@ -414,7 +417,7 @@ MODULE from_restart_module
END SUBROUTINE from_restart_sm END SUBROUTINE from_restart_sm
! !
!-------------------------------------------------------------------------- !--------------------------------------------------------------------------
SUBROUTINE from_restart_fpmd( nfi, acc, rhoe, desc, cm, c0, cdesc, & SUBROUTINE from_restart_fpmd( nfi, acc, rhoe, cm, c0, cdesc, &
eigr, ei1, ei2, ei3, sfac, fi, ht_m, ht_0, & eigr, ei1, ei2, ei3, sfac, fi, ht_m, ht_0, &
atoms_m, atoms_0, bec, becdr, vpot, edft ) atoms_m, atoms_0, bec, becdr, vpot, edft )
!-------------------------------------------------------------------------- !--------------------------------------------------------------------------
@ -454,7 +457,6 @@ MODULE from_restart_module
tprnfor, tpre tprnfor, tpre
USE parameters, ONLY : nacx USE parameters, ONLY : nacx
USE atoms_type_module, ONLY : atoms_type USE atoms_type_module, ONLY : atoms_type
USE charge_types, ONLY : charge_descriptor
USE ions_base, ONLY : vel_srt, tau_units USE ions_base, ONLY : vel_srt, tau_units
USE runcp_module, ONLY : runcp_ncpp USE runcp_module, ONLY : runcp_ncpp
USE grid_dimensions, ONLY : nr1, nr2, nr3 USE grid_dimensions, ONLY : nr1, nr2, nr3
@ -476,12 +478,11 @@ MODULE from_restart_module
COMPLEX(DP), INTENT(INOUT) :: cm(:,:,:,:), c0(:,:,:,:) COMPLEX(DP), INTENT(INOUT) :: cm(:,:,:,:), c0(:,:,:,:)
REAL(DP) :: fi(:,:,:) REAL(DP) :: fi(:,:,:)
TYPE(boxdimensions) :: ht_m, ht_0 TYPE(boxdimensions) :: ht_m, ht_0
REAL(DP) :: rhoe(:,:,:,:) REAL(DP) :: rhoe(:,:)
TYPE(charge_descriptor) :: desc
TYPE(wave_descriptor) :: cdesc TYPE(wave_descriptor) :: cdesc
REAL(DP) :: bec(:,:) REAL(DP) :: bec(:,:)
REAL(DP) :: becdr(:,:,:) REAL(DP) :: becdr(:,:,:)
REAL(DP) :: vpot(:,:,:,:) REAL(DP) :: vpot(:,:)
TYPE(dft_energy_type) :: edft TYPE(dft_energy_type) :: edft
! !
INTEGER :: ig, ib, i, j, k, ik, nb, is, ia, ierr, isa, iss INTEGER :: ig, ib, i, j, k, ik, nb, is, ia, ierr, isa, iss
@ -638,9 +639,9 @@ MODULE from_restart_module
! !
edft%enl = nlrh_m( c0, cdesc, ttforce, atoms_0, fi, bec, becdr, eigr ) edft%enl = nlrh_m( c0, cdesc, ttforce, atoms_0, fi, bec, becdr, eigr )
! !
CALL rhoofr( nfi, c0, cdesc, fi, rhoe, desc, ht_0 ) CALL rhoofr( nfi, c0, cdesc, fi, rhoe, ht_0 )
! !
CALL vofrhos( .true. , ttforce, tstress, rhoe, desc, & CALL vofrhos( .true. , ttforce, tstress, rhoe, &
atoms_0, vpot, bec, c0, cdesc, fi, eigr, & atoms_0, vpot, bec, c0, cdesc, fi, eigr, &
ei1, ei2, ei3, sfac, timepre, ht_0, edft ) ei1, ei2, ei3, sfac, timepre, ht_0, edft )
! !

View File

@ -18,9 +18,8 @@
!=----------------------------------------------------------------------------=! !=----------------------------------------------------------------------------=!
USE kinds USE kinds
USE parallel_types, ONLY: processors_grid, descriptor, BLOCK_PARTITION_SHAPE USE parallel_types, ONLY: processors_grid, descriptor, BLOCK_PARTITION_DIST
USE processors_grid_module, ONLY: grid_init, get_grid_info, calculate_grid_dims USE processors_grid_module, ONLY: grid_init, get_grid_info, calculate_grid_dims
USE descriptors_module, ONLY: desc_init, get_local_dims
USE grid_dimensions, ONLY: nr1, nr2, nr3, nr1x, nr2x, nr3x USE grid_dimensions, ONLY: nr1, nr2, nr3, nr1x, nr2x, nr3x
USE grid_dimensions, ONLY: nr1l, nr2l, nr3l, nnrx USE grid_dimensions, ONLY: nr1l, nr2l, nr3l, nnrx
USE smooth_grid_dimensions, ONLY: nr1s, nr2s, nr3s, nr1sx, nr2sx, nr3sx USE smooth_grid_dimensions, ONLY: nr1s, nr2s, nr3s, nr1sx, nr2sx, nr3sx

View File

@ -53,7 +53,7 @@
! ----------------------------------------------------------------------- ! -----------------------------------------------------------------------
! BEGIN manual ! BEGIN manual
SUBROUTINE runcg_new(tortho, tprint, rhoe, desc, atoms_0, & SUBROUTINE runcg_new(tortho, tprint, rhoe, atoms_0, &
bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cm, cp, cdesc, tcel, ht0, occ, ei, & bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cm, cp, cdesc, tcel, ht0, occ, ei, &
vpot, doions, edft, maxnstep, cgthr, tconv ) vpot, doions, edft, maxnstep, cgthr, tconv )
@ -66,7 +66,6 @@
USE energies, ONLY: dft_energy_type, print_energies USE energies, ONLY: dft_energy_type, print_energies
USE electrons_module, ONLY: pmss, eigs, nb_l USE electrons_module, ONLY: pmss, eigs, nb_l
USE cp_electronic_mass, ONLY: emass USE cp_electronic_mass, ONLY: emass
USE descriptors_module, ONLY: get_local_dims, owner_of, local_index
USE wave_functions, ONLY: cp_kinetic_energy, proj, fixwave USE wave_functions, ONLY: cp_kinetic_energy, proj, fixwave
USE wave_base, ONLY: dotp, hpsi USE wave_base, ONLY: dotp, hpsi
USE wave_constrains, ONLY: update_lambda USE wave_constrains, ONLY: update_lambda
@ -80,7 +79,6 @@
USE potentials, ONLY: kspotential USE potentials, ONLY: kspotential
USE time_step, ONLY: delt USE time_step, ONLY: delt
USE atoms_type_module, ONLY: atoms_type USE atoms_type_module, ONLY: atoms_type
USE charge_types, ONLY: charge_descriptor
USE control_flags, ONLY: force_pairing USE control_flags, ONLY: force_pairing
USE environment, ONLY: start_cclock_val USE environment, ONLY: start_cclock_val
USE reciprocal_space_mesh, ONLY: gkmask_l USE reciprocal_space_mesh, ONLY: gkmask_l
@ -93,8 +91,7 @@
TYPE (atoms_type) :: atoms_0 TYPE (atoms_type) :: atoms_0
COMPLEX(DP), INTENT(INOUT) :: c0(:,:,:,:), cm(:,:,:,:), cp(:,:,:,:) COMPLEX(DP), INTENT(INOUT) :: c0(:,:,:,:), cm(:,:,:,:), cp(:,:,:,:)
TYPE (wave_descriptor) :: cdesc TYPE (wave_descriptor) :: cdesc
TYPE (charge_descriptor) :: desc REAL(DP) :: rhoe(:,:)
REAL(DP) :: rhoe(:,:,:,:)
COMPLEX(DP) :: eigr(:,:) COMPLEX(DP) :: eigr(:,:)
COMPLEX(DP) :: ei1(:,:) COMPLEX(DP) :: ei1(:,:)
COMPLEX(DP) :: ei2(:,:) COMPLEX(DP) :: ei2(:,:)
@ -109,7 +106,7 @@
REAL(DP) :: cgthr REAL(DP) :: cgthr
REAL(DP) :: ei(:,:,:) REAL(DP) :: ei(:,:,:)
REAL(DP) :: vpot(:,:,:,:) REAL(DP) :: vpot(:,:)
! ... declare other variables ! ... declare other variables
LOGICAL :: ttsde, ttprint, ttforce, ttstress, gzero LOGICAL :: ttsde, ttprint, ttforce, ttstress, gzero
@ -178,7 +175,7 @@
s1 = cclock() s1 = cclock()
CALL kspotential( 1, ttprint, ttforce, ttstress, rhoe, desc, & CALL kspotential( 1, ttprint, ttforce, ttstress, rhoe, &
atoms_0, bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cdesc, tcel, ht0, occ, vpot, edft, timepre ) atoms_0, bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cdesc, tcel, ht0, occ, vpot, edft, timepre )
s2 = cclock() s2 = cclock()
@ -189,7 +186,7 @@
! ... |d H / dPsi_j > = H |Psi_j> - Sum{i} <Psi_i|H|Psi_j> |Psi_i> ! ... |d H / dPsi_j > = H |Psi_j> - Sum{i} <Psi_i|H|Psi_j> |Psi_i>
CALL dforce_all( ispin, c0(:,:,1,ispin), cdesc, occ(:,1,ispin), cp(:,:,1,ispin), & CALL dforce_all( ispin, c0(:,:,1,ispin), cdesc, occ(:,1,ispin), cp(:,:,1,ispin), &
vpot(:,:,:,ispin), eigr, bec ) vpot(:,ispin), eigr, bec )
! ... Project the gradient ! ... Project the gradient
IF( gamma_symmetry ) THEN IF( gamma_symmetry ) THEN
@ -237,7 +234,7 @@
! perform line minimization in the direction of "hacca" ! perform line minimization in the direction of "hacca"
CALL CGLINMIN(emin, demin, tbad, edft, cp, c0, cdesc, occ, vpot, rhoe, desc, hacca, & CALL CGLINMIN(emin, demin, tbad, edft, cp, c0, cdesc, occ, vpot, rhoe, hacca, &
atoms_0, ht0, bec, becdr, eigr, ei1, ei2, ei3, sfac) atoms_0, ht0, bec, becdr, eigr, ei1, ei2, ei3, sfac)
! CALL print_energies( edft ) ! CALL print_energies( edft )
@ -323,7 +320,7 @@
DO ispin = 1, nspin DO ispin = 1, nspin
CALL dforce_all( ispin, c0(:,:,1,ispin), cdesc, occ(:,1,ispin), hacca(:,:,1,ispin), & CALL dforce_all( ispin, c0(:,:,1,ispin), cdesc, occ(:,1,ispin), hacca(:,:,1,ispin), &
vpot(:,:,:,ispin), eigr, bec ) vpot(:,ispin), eigr, bec )
nb_g( ispin ) = cdesc%nbt( ispin ) nb_g( ispin ) = cdesc%nbt( ispin )
@ -363,7 +360,7 @@
! !
! ---------------------------------------------------------------------- ! ! ---------------------------------------------------------------------- !
SUBROUTINE cglinmin(emin, ediff, tbad, edft, cp, c, cdesc, occ, vpot, rhoe, desc, hacca, & SUBROUTINE cglinmin(emin, ediff, tbad, edft, cp, c, cdesc, occ, vpot, rhoe, hacca, &
atoms, ht, bec, becdr, eigr, ei1, ei2, ei3, sfac) atoms, ht, bec, becdr, eigr, ei1, ei2, ei3, sfac)
! ... declare modules ! ... declare modules
@ -376,7 +373,6 @@
USE cell_module, ONLY: boxdimensions USE cell_module, ONLY: boxdimensions
USE potentials, ONLY: kspotential USE potentials, ONLY: kspotential
USE atoms_type_module, ONLY: atoms_type USE atoms_type_module, ONLY: atoms_type
USE charge_types, ONLY: charge_descriptor
USE reciprocal_space_mesh, ONLY: gkmask_l USE reciprocal_space_mesh, ONLY: gkmask_l
USE uspp, ONLY : vkb, nkb USE uspp, ONLY : vkb, nkb
@ -389,8 +385,7 @@
COMPLEX(DP), INTENT(IN) :: c(:,:,:,:) COMPLEX(DP), INTENT(IN) :: c(:,:,:,:)
COMPLEX(DP), INTENT(INOUT) :: cp(:,:,:,:) COMPLEX(DP), INTENT(INOUT) :: cp(:,:,:,:)
TYPE (wave_descriptor), INTENT(IN) :: cdesc TYPE (wave_descriptor), INTENT(IN) :: cdesc
TYPE (charge_descriptor) :: desc REAL(DP) :: rhoe(:,:)
REAL(DP) :: rhoe(:,:,:,:)
COMPLEX(DP) :: sfac(:,:) COMPLEX(DP) :: sfac(:,:)
COMPLEX(DP) :: eigr(:,:) COMPLEX(DP) :: eigr(:,:)
COMPLEX(DP) :: ei1(:,:) COMPLEX(DP) :: ei1(:,:)
@ -402,7 +397,7 @@
REAL(DP) :: becdr(:,:,:) REAL(DP) :: becdr(:,:,:)
TYPE (dft_energy_type) :: edft TYPE (dft_energy_type) :: edft
COMPLEX (DP) :: hacca(:,:,:,:) COMPLEX (DP) :: hacca(:,:,:,:)
REAL (DP), INTENT(in) :: vpot(:,:,:,:) REAL (DP), INTENT(in) :: vpot(:,:)
! !
! ... LOCALS ! ... LOCALS
@ -605,7 +600,7 @@
END DO END DO
CALL kspotential( 1, ttprint, ttforce, ttstress, rhoe, desc, & CALL kspotential( 1, ttprint, ttforce, ttstress, rhoe, &
atoms, bec, becdr, eigr, ei1, ei2, ei3, sfac, cp, cdesc, tcel, ht, occ, vpot, edft, timepre ) atoms, bec, becdr, eigr, ei1, ei2, ei3, sfac, cp, cdesc, tcel, ht, occ, vpot, edft, timepre )
cgenergy = edft%etot cgenergy = edft%etot

View File

@ -29,7 +29,7 @@
! ----------------------------------------------------------------------- ! -----------------------------------------------------------------------
! BEGIN manual ! BEGIN manual
SUBROUTINE runcg_ion(nfi, tortho, tprint, rhoe, desc, atomsp, atoms0, atomsm, & SUBROUTINE runcg_ion(nfi, tortho, tprint, rhoe, atomsp, atoms0, atomsm, &
bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cm, cp, cdesc, tcel, ht, occ, ei, & bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cm, cp, cdesc, tcel, ht, occ, ei, &
vpot, doions, edft, etol, ftol, maxiter, sdthr, maxnstep ) vpot, doions, edft, etol, ftol, maxiter, sdthr, maxnstep )
@ -52,7 +52,6 @@
USE atoms_type_module, ONLY: atoms_type USE atoms_type_module, ONLY: atoms_type
USE print_out_module USE print_out_module
USE parameters, ONLY: nacx USE parameters, ONLY: nacx
USE charge_types, ONLY: charge_descriptor
USE runsd_module, ONLY: runsd USE runsd_module, ONLY: runsd
IMPLICIT NONE IMPLICIT NONE
@ -66,8 +65,7 @@
TYPE (atoms_type) :: atomsm TYPE (atoms_type) :: atomsm
COMPLEX(DP), INTENT(INOUT) :: c0(:,:,:,:), cm(:,:,:,:), cp(:,:,:,:) COMPLEX(DP), INTENT(INOUT) :: c0(:,:,:,:), cm(:,:,:,:), cp(:,:,:,:)
TYPE (wave_descriptor) :: cdesc TYPE (wave_descriptor) :: cdesc
TYPE (charge_descriptor) :: desc REAL(DP) :: rhoe(:,:)
REAL(DP) :: rhoe(:,:,:,:)
REAL(DP) :: bec(:,:) REAL(DP) :: bec(:,:)
REAL(DP) :: becdr(:,:,:) REAL(DP) :: becdr(:,:,:)
COMPLEX(DP) :: eigr(:,:) COMPLEX(DP) :: eigr(:,:)
@ -80,7 +78,7 @@
TYPE (dft_energy_type) :: edft TYPE (dft_energy_type) :: edft
REAL(DP) :: ei(:,:,:) REAL(DP) :: ei(:,:,:)
REAL(DP) :: vpot(:,:,:,:) REAL(DP) :: vpot(:,:)
INTEGER, INTENT(IN) :: maxnstep, maxiter INTEGER, INTENT(IN) :: maxnstep, maxiter
REAL(DP), INTENT(IN) :: sdthr, etol, ftol REAL(DP), INTENT(IN) :: sdthr, etol, ftol
@ -156,7 +154,7 @@
s1 = cclock() s1 = cclock()
old_clock_value = s1 old_clock_value = s1
CALL runsd(ttortho, ttprint, ttforce, rhoe, desc, atoms0, & CALL runsd(ttortho, ttprint, ttforce, rhoe, atoms0, &
bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cm, cp, cdesc, tcel, ht, occ, ei, & bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cm, cp, cdesc, tcel, ht, occ, ei, &
vpot, doions, edft, maxnstep, sdthr ) vpot, doions, edft, maxnstep, sdthr )
@ -184,7 +182,7 @@
IF(ionode) & IF(ionode) &
WRITE( stdout,fmt="(/,8X,'cgion: iter',I5,' line minimization along gradient starting')") iter WRITE( stdout,fmt="(/,8X,'cgion: iter',I5,' line minimization along gradient starting')") iter
CALL CGLINMIN(fret, edft, cp, c0, cm, cdesc, occ, ei, vpot, rhoe, desc, xi, atomsp, atoms0, & CALL CGLINMIN(fret, edft, cp, c0, cm, cdesc, occ, ei, vpot, rhoe, xi, atomsp, atoms0, &
ht, bec, becdr, eigr, ei1, ei2, ei3, sfac, maxnstep, sdthr, displ) ht, bec, becdr, eigr, ei1, ei2, ei3, sfac, maxnstep, sdthr, displ)
IF( tbad ) THEN IF( tbad ) THEN
@ -199,7 +197,7 @@
IF( ionode ) WRITE( stdout, fmt='(8X,"cgion: bad step")') ! perform steepest descent IF( ionode ) WRITE( stdout, fmt='(8X,"cgion: bad step")') ! perform steepest descent
displ = displ / 2.0d0 displ = displ / 2.0d0
CALL runsd(ttortho, ttprint, ttforce, rhoe, desc, atoms0, & CALL runsd(ttortho, ttprint, ttforce, rhoe, atoms0, &
bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cm, cp, cdesc, tcel, ht, occ, ei, & bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cm, cp, cdesc, tcel, ht, occ, ei, &
vpot, doions, edft, maxnstep, sdthr ) vpot, doions, edft, maxnstep, sdthr )
@ -289,7 +287,7 @@
! ---------------------------------------------------------------------- ! ! ---------------------------------------------------------------------- !
SUBROUTINE cglinmin(emin, edft, cp, c0, cm, cdesc, occ, ei, vpot, & SUBROUTINE cglinmin(emin, edft, cp, c0, cm, cdesc, occ, ei, vpot, &
rhoe, desc, hacca, atomsp, atoms0, ht, bec, becdr, eigr, ei1, ei2, ei3, sfac, & rhoe, hacca, atomsp, atoms0, ht, bec, becdr, eigr, ei1, ei2, ei3, sfac, &
maxnstep, sdthr, displ) maxnstep, sdthr, displ)
! ... declare modules ! ... declare modules
@ -302,7 +300,6 @@
USE cell_module, ONLY: boxdimensions, r_to_s USE cell_module, ONLY: boxdimensions, r_to_s
USE atoms_type_module, ONLY: atoms_type USE atoms_type_module, ONLY: atoms_type
USE check_stop, ONLY: check_stop_now USE check_stop, ONLY: check_stop_now
USE charge_types, ONLY: charge_descriptor
USE runsd_module, ONLY: runsd USE runsd_module, ONLY: runsd
IMPLICIT NONE IMPLICIT NONE
@ -315,8 +312,7 @@
COMPLEX(DP), INTENT(INOUT) :: cp(:,:,:,:) COMPLEX(DP), INTENT(INOUT) :: cp(:,:,:,:)
COMPLEX(DP), INTENT(INOUT) :: cm(:,:,:,:) COMPLEX(DP), INTENT(INOUT) :: cm(:,:,:,:)
TYPE (wave_descriptor) :: cdesc TYPE (wave_descriptor) :: cdesc
TYPE (charge_descriptor) :: desc REAL(DP) :: rhoe(:,:)
REAL(DP) :: rhoe(:,:,:,:)
COMPLEX(DP) :: eigr(:,:) COMPLEX(DP) :: eigr(:,:)
COMPLEX(DP) :: ei1(:,:) COMPLEX(DP) :: ei1(:,:)
COMPLEX(DP) :: ei2(:,:) COMPLEX(DP) :: ei2(:,:)
@ -326,7 +322,7 @@
REAL(DP) :: occ(:,:,:) REAL(DP) :: occ(:,:,:)
TYPE (dft_energy_type) :: edft TYPE (dft_energy_type) :: edft
REAL (DP) :: hacca(:,:) REAL (DP) :: hacca(:,:)
REAL (DP), INTENT(in) :: vpot(:,:,:,:) REAL (DP), INTENT(in) :: vpot(:,:)
REAL(DP) :: bec(:,:) REAL(DP) :: bec(:,:)
REAL(DP) :: becdr(:,:,:) REAL(DP) :: becdr(:,:,:)
@ -546,7 +542,7 @@
! ... Calculate Forces (fion) and DFT Total Energy (edft) for the new ionic ! ... Calculate Forces (fion) and DFT Total Energy (edft) for the new ionic
! ... positions (atomsp) ! ... positions (atomsp)
CALL runsd(ttortho, ttprint, ttforce, rhoe, desc, atomsp, & CALL runsd(ttortho, ttprint, ttforce, rhoe, atomsp, &
bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cm, cp, cdesc, tcel, ht, occ, ei, & bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cm, cp, cdesc, tcel, ht, occ, ei, &
vpot, doions, edft, maxnstep, sdthr ) vpot, doions, edft, maxnstep, sdthr )

View File

@ -44,7 +44,6 @@
USE mp, ONLY: mp_sum USE mp, ONLY: mp_sum
USE electrons_module, ONLY: pmss, eigs, nb_l USE electrons_module, ONLY: pmss, eigs, nb_l
USE cp_electronic_mass, ONLY: emass USE cp_electronic_mass, ONLY: emass
USE descriptors_module, ONLY: get_local_dims, owner_of, local_index
USE wave_functions, ONLY : cp_kinetic_energy USE wave_functions, ONLY : cp_kinetic_energy
USE wave_base, ONLY: hpsi USE wave_base, ONLY: hpsi
USE cell_module, ONLY: boxdimensions USE cell_module, ONLY: boxdimensions
@ -68,7 +67,7 @@
REAL(DP), INTENT(IN) :: fi(:,:,:) REAL(DP), INTENT(IN) :: fi(:,:,:)
REAL(DP), INTENT(IN) :: bec(:,:) REAL(DP), INTENT(IN) :: bec(:,:)
TYPE (boxdimensions), INTENT(IN) :: ht TYPE (boxdimensions), INTENT(IN) :: ht
REAL (DP) :: vpot(:,:,:,:) REAL (DP) :: vpot(:,:)
REAL(DP) :: ei(:,:,:) REAL(DP) :: ei(:,:,:)
REAL(DP) :: timerd, timeorto REAL(DP) :: timerd, timeorto
REAL(DP) :: ekinc(:) REAL(DP) :: ekinc(:)
@ -191,7 +190,7 @@
TYPE (wave_descriptor), INTENT(IN) :: cdesc TYPE (wave_descriptor), INTENT(IN) :: cdesc
COMPLEX(DP) :: eigr(:,:) COMPLEX(DP) :: eigr(:,:)
REAL(DP), INTENT(IN) :: fi(:,:,:) REAL(DP), INTENT(IN) :: fi(:,:,:)
REAL (DP) :: vpot(:,:,:,:) REAL (DP) :: vpot(:,:)
REAL (DP), INTENT(IN) :: bec(:,:) REAL (DP), INTENT(IN) :: bec(:,:)
REAL(DP), INTENT(IN) :: fccc REAL(DP), INTENT(IN) :: fccc
LOGICAL, OPTIONAL, INTENT(IN) :: lambda, fromscra, diis, restart LOGICAL, OPTIONAL, INTENT(IN) :: lambda, fromscra, diis, restart
@ -255,7 +254,7 @@
DO i = 1, nb, 2 DO i = 1, nb, 2
CALL dforce( i, is, c0(:,:,1,is), cdesc, fi(:,1,is), c2, c3, vpot(:,:,:,is), eigr, bec ) CALL dforce( i, is, c0(:,:,1,is), cdesc, fi(:,1,is), c2, c3, vpot(:,is), eigr, bec )
IF( tlam ) THEN IF( tlam ) THEN
CALL update_lambda( i, gam( :, :,is), c0(:,:,1,is), cdesc, c2 ) CALL update_lambda( i, gam( :, :,is), c0(:,:,1,is), cdesc, c2 )
@ -286,7 +285,7 @@
nb = nx nb = nx
CALL dforce( nx, is, c0(:,:,1,is), cdesc, fi(:,1,is), c2, c3, vpot(:,:,:,is), eigr, bec ) CALL dforce( nx, is, c0(:,:,1,is), cdesc, fi(:,1,is), c2, c3, vpot(:,is), eigr, bec )
IF( tlam ) THEN IF( tlam ) THEN
CALL update_lambda( nb, gam( :, :,is), c0(:,:,1,is), cdesc, c2 ) CALL update_lambda( nb, gam( :, :,is), c0(:,:,1,is), cdesc, c2 )
@ -337,7 +336,6 @@
USE mp, ONLY: mp_sum USE mp, ONLY: mp_sum
USE electrons_module, ONLY: pmss, eigs, nb_l, nupdwn, nspin USE electrons_module, ONLY: pmss, eigs, nb_l, nupdwn, nspin
USE cp_electronic_mass, ONLY: emass USE cp_electronic_mass, ONLY: emass
USE descriptors_module, ONLY: get_local_dims, owner_of, local_index
USE wave_functions, ONLY : cp_kinetic_energy USE wave_functions, ONLY : cp_kinetic_energy
USE wave_base, ONLY: wave_steepest, wave_verlet USE wave_base, ONLY: wave_steepest, wave_verlet
USE wave_base, ONLY: hpsi USE wave_base, ONLY: hpsi
@ -362,7 +360,7 @@
COMPLEX(DP) :: eigr(:,:) COMPLEX(DP) :: eigr(:,:)
REAL(DP), INTENT(INOUT) :: fi(:,:,:) REAL(DP), INTENT(INOUT) :: fi(:,:,:)
TYPE (boxdimensions), INTENT(IN) :: ht TYPE (boxdimensions), INTENT(IN) :: ht
REAL (DP) :: vpot(:,:,:,:) REAL (DP) :: vpot(:,:)
REAL(DP) :: ei(:,:,:) REAL(DP) :: ei(:,:,:)
REAL(DP), INTENT(IN) :: bec(:,:) REAL(DP), INTENT(IN) :: bec(:,:)
REAL(DP) :: timerd, timeorto REAL(DP) :: timerd, timeorto
@ -457,8 +455,8 @@
DO i = 1, nb, 2 DO i = 1, nb, 2
! !
CALL dforce( i, 2, c0(:,:,1,1), cdesc, fi(:,1,1), c2, c3, vpot(:,:,:,1), eigr, bec ) CALL dforce( i, 2, c0(:,:,1,1), cdesc, fi(:,1,1), c2, c3, vpot(:,1), eigr, bec )
CALL dforce( i, 2, c0(:,:,1,1), cdesc, fi(:,1,1), c4, c5, vpot(:,:,:,2), eigr, bec ) CALL dforce( i, 2, c0(:,:,1,1), cdesc, fi(:,1,1), c4, c5, vpot(:,2), eigr, bec )
! !
c2 = occup(i , ik)* (c2 + c4) c2 = occup(i , ik)* (c2 + c4)
c3 = occup(i+1, ik)* (c3 + c5) c3 = occup(i+1, ik)* (c3 + c5)
@ -490,8 +488,8 @@
! !
nb = n_unp - 1 nb = n_unp - 1
! !
CALL dforce( nb, 2, c0(:,:,1,1), cdesc, fi(:,1,1), c2, c3, vpot(:,:,:,1), eigr, bec ) CALL dforce( nb, 2, c0(:,:,1,1), cdesc, fi(:,1,1), c2, c3, vpot(:,1), eigr, bec )
CALL dforce( nb, 2, c0(:,:,1,1), cdesc, fi(:,1,2), c4, c5, vpot(:,:,:,2), eigr, bec ) CALL dforce( nb, 2, c0(:,:,1,1), cdesc, fi(:,1,2), c4, c5, vpot(:,2), eigr, bec )
c2 = occup(nb , ik)* (c2 + c4) c2 = occup(nb , ik)* (c2 + c4)
@ -509,7 +507,7 @@
END IF END IF
! !
CALL dforce( n_unp, 1, c0(:,:,1,1), cdesc, fi(:,1,1), c2, c3, vpot(:,:,:,1), eigr, bec ) CALL dforce( n_unp, 1, c0(:,:,1,1), cdesc, fi(:,1,1), c2, c3, vpot(:,1), eigr, bec )
intermed = -2.d0 * sum( c2 * conjg( c0(:, n_unp, ik, 1 ) ) ) intermed = -2.d0 * sum( c2 * conjg( c0(:, n_unp, ik, 1 ) ) )
intermed3 = sum(c0(:,n_unp, ik, 1) * conjg( c0(:, n_unp, ik, 1))) intermed3 = sum(c0(:,n_unp, ik, 1) * conjg( c0(:, n_unp, ik, 1)))

View File

@ -27,7 +27,7 @@
! ---------------------------------------------- ! ----------------------------------------------
! BEGIN manual ! BEGIN manual
SUBROUTINE rundiis(tprint, rhoe, desc, atoms, & SUBROUTINE rundiis(tprint, rhoe, atoms, &
bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cm, cgrad, cdesc, tcel, ht0, fi, eig, & bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cm, cgrad, cdesc, tcel, ht0, fi, eig, &
vpot, doions, edft ) vpot, doions, edft )
@ -94,7 +94,6 @@
USE brillouin, ONLY: kpoints, kp USE brillouin, ONLY: kpoints, kp
USE wave_types, ONLY: wave_descriptor USE wave_types, ONLY: wave_descriptor
USE atoms_type_module, ONLY: atoms_type USE atoms_type_module, ONLY: atoms_type
USE charge_types, ONLY: charge_descriptor
USE control_flags, ONLY: force_pairing USE control_flags, ONLY: force_pairing
use grid_dimensions, only: nr1, nr2, nr3 use grid_dimensions, only: nr1, nr2, nr3
USE reciprocal_vectors, ONLY: mill_l USE reciprocal_vectors, ONLY: mill_l
@ -109,7 +108,7 @@
TYPE (atoms_type) :: atoms TYPE (atoms_type) :: atoms
COMPLEX(DP), INTENT(INOUT) :: c0(:,:,:,:), cm(:,:,:,:), cgrad(:,:,:,:) COMPLEX(DP), INTENT(INOUT) :: c0(:,:,:,:), cm(:,:,:,:), cgrad(:,:,:,:)
TYPE (wave_descriptor) :: cdesc TYPE (wave_descriptor) :: cdesc
REAL(DP) :: rhoe(:,:,:,:) REAL(DP) :: rhoe(:,:)
REAL(DP) :: bec(:,:) REAL(DP) :: bec(:,:)
REAL(DP) :: becdr(:,:,:) REAL(DP) :: becdr(:,:,:)
COMPLEX(DP) :: sfac(:,:) COMPLEX(DP) :: sfac(:,:)
@ -117,13 +116,12 @@
COMPLEX(DP) :: ei1(:,:) COMPLEX(DP) :: ei1(:,:)
COMPLEX(DP) :: ei2(:,:) COMPLEX(DP) :: ei2(:,:)
COMPLEX(DP) :: ei3(:,:) COMPLEX(DP) :: ei3(:,:)
TYPE (charge_descriptor) :: desc
TYPE (boxdimensions), INTENT(INOUT) :: ht0 TYPE (boxdimensions), INTENT(INOUT) :: ht0
REAL(DP) :: fi(:,:,:) REAL(DP) :: fi(:,:,:)
TYPE (dft_energy_type) :: edft TYPE (dft_energy_type) :: edft
REAL(DP) :: eig(:,:,:) REAL(DP) :: eig(:,:,:)
REAL(DP) :: vpot(:,:,:,:) REAL(DP) :: vpot(:,:)
! ... declare other variables ! ... declare other variables
INTEGER ig, ib, j, k, ik, ngw, i, is, nrt, istate, nrl, ndiis, nowv INTEGER ig, ib, j, k, ik, ngw, i, is, nrt, istate, nrl, ndiis, nowv
@ -197,8 +195,8 @@
CALL phfacs( ei1, ei2, ei3, eigr, mill_l, atoms%taus, nr1, nr2, nr3, atoms%nat ) CALL phfacs( ei1, ei2, ei3, eigr, mill_l, atoms%taus, nr1, nr2, nr3, atoms%nat )
CALL strucf( sfac, ei1, ei2, ei3, mill_l, ngm ) CALL strucf( sfac, ei1, ei2, ei3, mill_l, ngm )
CALL rhoofr( 1, c0, cdesc, fi, rhoe, desc, ht0) CALL rhoofr( 1, c0, cdesc, fi, rhoe, ht0)
CALL newrho(rhoe(:,:,:,1), drho, 0) ! memorize density CALL newrho(rhoe(:,1), drho, 0) ! memorize density
CALL phfacs( ei1, ei2, ei3, eigr, mill_l, atoms%taus, nr1, nr2, nr3, atoms%nat ) CALL phfacs( ei1, ei2, ei3, eigr, mill_l, atoms%taus, nr1, nr2, nr3, atoms%nat )
CALL strucf( sfac, ei1, ei2, ei3, mill_l, ngm ) CALL strucf( sfac, ei1, ei2, ei3, mill_l, ngm )
CALL guessc0( .NOT. kp%gamma_only, bec, c0, cm, cdesc) CALL guessc0( .NOT. kp%gamma_only, bec, c0, cm, cdesc)
@ -236,12 +234,12 @@
! ... self consistent energy ! ... self consistent energy
edft%enl = nlrh_m(c0, cdesc, tforce, atoms, fi, bec, becdr, eigr) edft%enl = nlrh_m(c0, cdesc, tforce, atoms, fi, bec, becdr, eigr)
CALL rhoofr( 1, c0, cdesc, fi, rhoe, desc, ht0) CALL rhoofr( 1, c0, cdesc, fi, rhoe, ht0)
CALL vofrhos(.FALSE., tforce, tstress, rhoe, desc, atoms, & CALL vofrhos(.FALSE., tforce, tstress, rhoe, atoms, &
vpot, bec, c0, cdesc, fi, eigr, ei1, ei2, ei3, sfac, timepre, ht0, edft) vpot, bec, c0, cdesc, fi, eigr, ei1, ei2, ei3, sfac, timepre, ht0, edft)
! ... density upgrade ! ... density upgrade
CALL newrho(rhoe(:,:,:,1), drho, idiis) CALL newrho(rhoe(:,1), drho, idiis)
IF (ionode) WRITE( stdout,45) idiis, edft%etot, drho IF (ionode) WRITE( stdout,45) idiis, edft%etot, drho
dene = abs(edft%etot - etot_m) dene = abs(edft%etot - etot_m)
etot_m = edft%etot etot_m = edft%etot
@ -250,7 +248,7 @@
! ... recalculate potential ! ... recalculate potential
edft%enl = nlrh_m(c0, cdesc, tforce, atoms, fi, bec, becdr, eigr) edft%enl = nlrh_m(c0, cdesc, tforce, atoms, fi, bec, becdr, eigr)
CALL vofrhos(.FALSE., tforce, tstress, rhoe, desc, atoms, & CALL vofrhos(.FALSE., tforce, tstress, rhoe, atoms, &
vpot, bec, c0, cdesc, fi, eigr, ei1, ei2, ei3, sfac, timepre, ht0, edft) vpot, bec, c0, cdesc, fi, eigr, ei1, ei2, ei3, sfac, timepre, ht0, edft)
IF( idiis /= 1 )THEN IF( idiis /= 1 )THEN
@ -269,7 +267,7 @@
edft%enl = nlrh_m(c0, cdesc, tforce, atoms, fs, bec, becdr, eigr) edft%enl = nlrh_m(c0, cdesc, tforce, atoms, fs, bec, becdr, eigr)
CALL dforce_all( 1, c0(:,:,1,1), cdesc, fi(:,1,1), cgrad(:,:,1,1), vpot(:,:,:,1), eigr, bec ) CALL dforce_all( 1, c0(:,:,1,1), cdesc, fi(:,1,1), cgrad(:,:,1,1), vpot(:,1), eigr, bec )
IF(.NOT.kp%gamma_only) THEN IF(.NOT.kp%gamma_only) THEN
DO ik = 1, kp%nkpt DO ik = 1, kp%nkpt
@ -285,7 +283,7 @@
call entropy_s(fi(1,1,1),temp_elec,cdesc%nbl(1),edft%ent) call entropy_s(fi(1,1,1),temp_elec,cdesc%nbl(1),edft%ent)
edft%enl = nlrh_m(c0, cdesc, tforce, atoms, fs, bec, becdr, eigr) edft%enl = nlrh_m(c0, cdesc, tforce, atoms, fs, bec, becdr, eigr)
CALL dforce_all( 1, c0(:,:,1,1), cdesc, fi(:,1,1), cgrad(:,:,1,1), vpot(:,:,:,1), eigr, bec ) CALL dforce_all( 1, c0(:,:,1,1), cdesc, fi(:,1,1), cgrad(:,:,1,1), vpot(:,1), eigr, bec )
DO ik = 1, kp%nkpt DO ik = 1, kp%nkpt
DO ib = 1, cdesc%nbl( 1 ) DO ib = 1, cdesc%nbl( 1 )
@ -298,7 +296,7 @@
! ... DIIS on c0 at FIXED potential ! ... DIIS on c0 at FIXED potential
edft%enl = nlrh_m(c0, cdesc, tforce, atoms, fs, bec, becdr, eigr) edft%enl = nlrh_m(c0, cdesc, tforce, atoms, fs, bec, becdr, eigr)
CALL dforce_all( 1, c0(:,:,1,1), cdesc, fi(:,1,1), cgrad(:,:,1,1), vpot(:,:,:,1), eigr, bec ) CALL dforce_all( 1, c0(:,:,1,1), cdesc, fi(:,1,1), cgrad(:,:,1,1), vpot(:,1), eigr, bec )
IF( kp%gamma_only ) THEN IF( kp%gamma_only ) THEN
CALL proj( 1, cgrad(:,:,1,1), cdesc, c0(:,:,1,1), cdesc, lambda) CALL proj( 1, cgrad(:,:,1,1), cdesc, c0(:,:,1,1), cdesc, lambda)
@ -388,7 +386,7 @@
! ---------------------------------------------- ! ----------------------------------------------
! BEGIN manual ! BEGIN manual
SUBROUTINE runsdiis(tprint, rhoe, desc, atoms, & SUBROUTINE runsdiis(tprint, rhoe, atoms, &
bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cm, cgrad, cdesc, tcel, ht0, fi, eig, & bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cm, cgrad, cdesc, tcel, ht0, fi, eig, &
vpot, doions, edft ) vpot, doions, edft )
@ -451,7 +449,6 @@
USE brillouin, ONLY: kpoints, kp USE brillouin, ONLY: kpoints, kp
USE wave_types USE wave_types
USE atoms_type_module, ONLY: atoms_type USE atoms_type_module, ONLY: atoms_type
USE charge_types, ONLY: charge_descriptor
USE local_pseudo, ONLY: vps USE local_pseudo, ONLY: vps
USE uspp, ONLY : vkb, nkb USE uspp, ONLY : vkb, nkb
@ -462,8 +459,7 @@
TYPE (atoms_type) :: atoms TYPE (atoms_type) :: atoms
COMPLEX(DP), INTENT(INOUT) :: c0(:,:,:,:), cm(:,:,:,:), cgrad(:,:,:,:) COMPLEX(DP), INTENT(INOUT) :: c0(:,:,:,:), cm(:,:,:,:), cgrad(:,:,:,:)
TYPE (wave_descriptor) :: cdesc TYPE (wave_descriptor) :: cdesc
REAL(DP) :: rhoe(:,:,:,:) REAL(DP) :: rhoe(:,:)
TYPE (charge_descriptor) :: desc
COMPLEX(DP) :: eigr(:,:) COMPLEX(DP) :: eigr(:,:)
COMPLEX(DP) :: ei1(:,:) COMPLEX(DP) :: ei1(:,:)
COMPLEX(DP) :: ei2(:,:) COMPLEX(DP) :: ei2(:,:)
@ -476,7 +472,7 @@
TYPE (dft_energy_type) :: edft TYPE (dft_energy_type) :: edft
REAL(DP) :: eig(:,:,:) REAL(DP) :: eig(:,:,:)
REAL(DP) :: vpot(:,:,:,:) REAL(DP) :: vpot(:,:)
! ... declare other variables ! ... declare other variables
LOGICAL :: tlimit, tsteep LOGICAL :: tlimit, tsteep
@ -537,7 +533,7 @@
EXIT DIIS_LOOP EXIT DIIS_LOOP
END IF END IF
CALL kspotential( 1, .FALSE., tforce, tstress, rhoe, desc, & CALL kspotential( 1, .FALSE., tforce, tstress, rhoe, &
atoms, bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cdesc, tcel, ht0, fi, vpot, edft, timepre ) atoms, bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cdesc, tcel, ht0, fi, vpot, edft, timepre )
s0 = cclock() s0 = cclock()
@ -582,7 +578,7 @@
! ... so on). ! ... so on).
CALL dforce_all( ispin, c0(:,:,1,ispin), cdesc, fi(:,1,ispin), cgrad(:,:,1,ispin), & CALL dforce_all( ispin, c0(:,:,1,ispin), cdesc, fi(:,1,ispin), cgrad(:,:,1,ispin), &
vpot(:,:,:,ispin), eigr, bec ) vpot(:,ispin), eigr, bec )
IF(.NOT.kp%gamma_only) THEN IF(.NOT.kp%gamma_only) THEN
DO ik = 1, kp%nkpt DO ik = 1, kp%nkpt
@ -695,7 +691,6 @@
USE constants, ONLY: au USE constants, ONLY: au
USE cell_base, ONLY: tpiba2 USE cell_base, ONLY: tpiba2
USE electrons_module, ONLY: eigs, ei, pmss, emass, nb_l, ib_owner, ib_local USE electrons_module, ONLY: eigs, ei, pmss, emass, nb_l, ib_owner, ib_local
USE descriptors_module, ONLY: get_local_dims, owner_of, local_index
USE forces, ONLY: dforce_all USE forces, ONLY: dforce_all
USE brillouin, ONLY: kpoints, kp USE brillouin, ONLY: kpoints, kp
USE orthogonalize USE orthogonalize
@ -714,7 +709,7 @@
COMPLEX(DP), INTENT(inout) :: c(:,:,:,:) COMPLEX(DP), INTENT(inout) :: c(:,:,:,:)
COMPLEX(DP), INTENT(inout) :: eforce(:,:,:,:) COMPLEX(DP), INTENT(inout) :: eforce(:,:,:,:)
TYPE (wave_descriptor), INTENT(in) :: cdesc TYPE (wave_descriptor), INTENT(in) :: cdesc
REAL (DP), INTENT(in) :: vpot(:,:,:,:), fi(:,:,:) REAL (DP), INTENT(in) :: vpot(:,:), fi(:,:,:)
REAL (DP) :: bec(:,:) REAL (DP) :: bec(:,:)
LOGICAL, INTENT(IN) :: TORTHO LOGICAL, INTENT(IN) :: TORTHO
COMPLEX(DP) :: eigr(:,:) COMPLEX(DP) :: eigr(:,:)
@ -749,7 +744,7 @@
! ... Calculate | dH / dpsi(j) > ! ... Calculate | dH / dpsi(j) >
CALL dforce_all( ispin, c(:,:,1,ispin), cdesc, fi(:,1,ispin), eforce(:,:,1,ispin), & CALL dforce_all( ispin, c(:,:,1,ispin), cdesc, fi(:,1,ispin), eforce(:,:,1,ispin), &
vpot(:,:,:,ispin), eigr, bec ) vpot(:,ispin), eigr, bec )
DO ik = 1, kp%nkpt DO ik = 1, kp%nkpt

View File

@ -28,7 +28,7 @@
! ----------------------------------------------------------------------- ! -----------------------------------------------------------------------
! BEGIN manual ! BEGIN manual
SUBROUTINE runsd(tortho, tprint, tforce, rhoe, desc, atoms_0, & SUBROUTINE runsd(tortho, tprint, tforce, rhoe, atoms_0, &
bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cm, cp, cdesc, tcel, ht0, occ, ei, & bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cm, cp, cdesc, tcel, ht0, occ, ei, &
vpot, doions, edft, maxnstep, sdthr ) vpot, doions, edft, maxnstep, sdthr )
@ -47,7 +47,6 @@
USE atoms_type_module, ONLY: atoms_type USE atoms_type_module, ONLY: atoms_type
USE runcp_module, ONLY: runcp USE runcp_module, ONLY: runcp
USE phase_factors_module, ONLY: strucf, phfacs USE phase_factors_module, ONLY: strucf, phfacs
USE charge_types, ONLY: charge_descriptor
USE control_flags, ONLY: force_pairing USE control_flags, ONLY: force_pairing
use grid_dimensions, only: nr1, nr2, nr3 use grid_dimensions, only: nr1, nr2, nr3
USE reciprocal_vectors, ONLY: mill_l USE reciprocal_vectors, ONLY: mill_l
@ -61,9 +60,8 @@
TYPE (atoms_type), INTENT(INOUT) :: atoms_0 TYPE (atoms_type), INTENT(INOUT) :: atoms_0
COMPLEX(DP), INTENT(INOUT) :: c0(:,:,:,:), cm(:,:,:,:), cp(:,:,:,:) COMPLEX(DP), INTENT(INOUT) :: c0(:,:,:,:), cm(:,:,:,:), cp(:,:,:,:)
TYPE (wave_descriptor) :: cdesc TYPE (wave_descriptor) :: cdesc
REAL(DP) :: rhoe(:,:,:,:) REAL(DP) :: rhoe(:,:)
COMPLEX(DP) :: sfac(:,:) COMPLEX(DP) :: sfac(:,:)
TYPE (charge_descriptor) :: desc
COMPLEX(DP) :: eigr(:,:) COMPLEX(DP) :: eigr(:,:)
COMPLEX(DP) :: ei1(:,:) COMPLEX(DP) :: ei1(:,:)
COMPLEX(DP) :: ei2(:,:) COMPLEX(DP) :: ei2(:,:)
@ -75,7 +73,7 @@
TYPE (dft_energy_type) :: edft TYPE (dft_energy_type) :: edft
REAL(DP) :: ei(:,:,:) REAL(DP) :: ei(:,:,:)
REAL(DP) :: vpot(:,:,:,:) REAL(DP) :: vpot(:,:)
INTEGER :: maxnstep ! maximum number of iteration INTEGER :: maxnstep ! maximum number of iteration
REAL(DP) :: sdthr ! threshold for convergence REAL(DP) :: sdthr ! threshold for convergence
@ -127,7 +125,7 @@
s1 = cclock() s1 = cclock()
CALL kspotential( 1, ttprint, ttforce, ttstress, rhoe, desc, atoms_0, & CALL kspotential( 1, ttprint, ttforce, ttstress, rhoe, atoms_0, &
bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cdesc, tcel, ht0, & bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cdesc, tcel, ht0, &
occ, vpot, edft, timepre ) occ, vpot, edft, timepre )
@ -171,7 +169,7 @@
IF( tforce ) THEN IF( tforce ) THEN
atoms_0%for = 0.0d0 atoms_0%for = 0.0d0
CALL kspotential( 1, ttprint, tforce, ttstress, rhoe, desc, & CALL kspotential( 1, ttprint, tforce, ttstress, rhoe, &
atoms_0, bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cdesc, tcel, ht0, occ, vpot, edft, timepre ) atoms_0, bec, becdr, eigr, ei1, ei2, ei3, sfac, c0, cdesc, tcel, ht0, occ, vpot, edft, timepre )
IF(ionode ) THEN IF(ionode ) THEN
WRITE( stdout,fmt="(12X,'runsd: fion and edft calculated = ',F14.6)") edft%etot WRITE( stdout,fmt="(12X,'runsd: fion and edft calculated = ',F14.6)") edft%etot

View File

@ -93,6 +93,8 @@ SUBROUTINE smdmain( tau, fion_out, etot_out, nat_out )
USE mp_global, ONLY : mp_global_start USE mp_global, ONLY : mp_global_start
USE mp, ONLY : mp_sum USE mp, ONLY : mp_sum
USE fft_base, ONLY : dfftp USE fft_base, ONLY : dfftp
USE orthogonalize, ONLY : ortho
USE orthogonalize_base, ONLY : updatc, calphi
! !
#if ! defined __NOSMD #if ! defined __NOSMD
! !
@ -612,8 +614,8 @@ SUBROUTINE smdmain( tau, fion_out, etot_out, nat_out )
! imposing the orthogonality ! imposing the orthogonality
! ========================================================== ! ==========================================================
! !
CALL calphi( rep_el(sm_k)%cm, ngw, ema0bg,rep_el(sm_k)%bec, nkb, & CALL calphi( rep_el(sm_k)%cm, ngw, rep_el(sm_k)%bec, nkb, &
& vkb,rep_el(sm_k)%phi, nbsp ) & vkb,rep_el(sm_k)%phi, nbsp, ema0bg )
! !
! !
IF(ionode) WRITE( sm_file,*) ' out from calphi' IF(ionode) WRITE( sm_file,*) ' out from calphi'
@ -621,7 +623,7 @@ SUBROUTINE smdmain( tau, fion_out, etot_out, nat_out )
! !
IF(tortho) THEN IF(tortho) THEN
CALL ortho (eigr,rep_el(sm_k)%c0,rep_el(sm_k)%phi,rep_el(sm_k)%lambda, & CALL ortho (eigr,rep_el(sm_k)%c0,rep_el(sm_k)%phi,rep_el(sm_k)%lambda, &
& bigr,iter,ccc(sm_k),ortho_eps,ortho_max,delt,bephi,becp) & bigr,iter,ccc(sm_k),bephi,becp)
ELSE ELSE
CALL gram( vkb, rep_el(sm_k)%bec, nkb, rep_el(sm_k)%c0, ngw, nbsp ) CALL gram( vkb, rep_el(sm_k)%bec, nkb, rep_el(sm_k)%c0, ngw, nbsp )
! !
@ -643,8 +645,9 @@ SUBROUTINE smdmain( tau, fion_out, etot_out, nat_out )
ENDIF ENDIF
! !
IF(tortho) THEN IF(tortho) THEN
CALL updatc(ccc(sm_k),rep_el(sm_k)%lambda,rep_el(sm_k)%phi, & CALL updatc( ccc(sm_k), nbsp, rep_el(sm_k)%lambda, SIZE( rep_el(sm_k)%lambda, 1 ), &
& bephi,becp,rep_el(sm_k)%bec,rep_el(sm_k)%c0) rep_el(sm_k)%phi, SIZE( rep_el(sm_k)%phi, 1 ), bephi, SIZE(bephi,1), &
becp,rep_el(sm_k)%bec,rep_el(sm_k)%c0)
! !
IF(ionode) WRITE( sm_file,*) ' out from updatc' IF(ionode) WRITE( sm_file,*) ' out from updatc'
ENDIF ENDIF
@ -959,7 +962,7 @@ SUBROUTINE smdmain( tau, fion_out, etot_out, nat_out )
! calphi calculates phi ! calphi calculates phi
! the electron mass rises with g**2 ! the electron mass rises with g**2
! !
CALL calphi( rep_el(sm_k)%c0, ngw, ema0bg, rep_el(sm_k)%bec, nkb, vkb, rep_el(sm_k)%phi, nbsp ) CALL calphi( rep_el(sm_k)%c0, ngw, rep_el(sm_k)%bec, nkb, vkb, rep_el(sm_k)%phi, nbsp, ema0bg )
! !
! begin try and error loop (only one step!) ! begin try and error loop (only one step!)
! !
@ -1171,7 +1174,7 @@ SUBROUTINE smdmain( tau, fion_out, etot_out, nat_out )
IF(tortho) THEN IF(tortho) THEN
CALL ortho & CALL ortho &
& (eigr,rep_el(sm_k)%cm,rep_el(sm_k)%phi,rep_el(sm_k)%lambda, & & (eigr,rep_el(sm_k)%cm,rep_el(sm_k)%phi,rep_el(sm_k)%lambda, &
& bigr,iter,ccc(sm_k),ortho_eps,ortho_max,delt,bephi,becp) & bigr,iter,ccc(sm_k),bephi,becp)
ELSE ELSE
CALL gram( vkb, rep_el(sm_k)%bec, nkb, rep_el(sm_k)%cm, ngw, nbsp ) CALL gram( vkb, rep_el(sm_k)%bec, nkb, rep_el(sm_k)%cm, ngw, nbsp )
IF(iprsta.GT.4) CALL dotcsc(eigr,rep_el(sm_k)%cm) IF(iprsta.GT.4) CALL dotcsc(eigr,rep_el(sm_k)%cm)
@ -1183,8 +1186,10 @@ SUBROUTINE smdmain( tau, fion_out, etot_out, nat_out )
! !
IF(iprsta.GE.3) CALL print_lambda( rep_el(sm_k)%lambda, nbsp, 9, 1.0d0 ) IF(iprsta.GE.3) CALL print_lambda( rep_el(sm_k)%lambda, nbsp, 9, 1.0d0 )
! !
IF(tortho) CALL updatc(ccc(sm_k),rep_el(sm_k)%lambda,rep_el(sm_k)%phi,bephi, & IF(tortho) &
& becp,rep_el(sm_k)%bec,rep_el(sm_k)%cm) CALL updatc( ccc(sm_k), nbsp, rep_el(sm_k)%lambda, SIZE(rep_el(sm_k)%lambda,1), &
rep_el(sm_k)%phi, SIZE(rep_el(sm_k)%phi,1), bephi, SIZE(bephi,1), &
becp, rep_el(sm_k)%bec, rep_el(sm_k)%cm )
! !
CALL calbec (nvb+1,nsp,eigr,rep_el(sm_k)%cm,rep_el(sm_k)%bec) CALL calbec (nvb+1,nsp,eigr,rep_el(sm_k)%cm,rep_el(sm_k)%bec)
IF (tpre) CALL caldbec(ngw,nkb,nbsp,1,nsp,eigr,rep_el(sm_k)%cm,dbec,.true.) IF (tpre) CALL caldbec(ngw,nkb,nbsp,1,nsp,eigr,rep_el(sm_k)%cm,dbec,.true.)

View File

@ -85,7 +85,7 @@
! ... declare subroutine arguments ! ... declare subroutine arguments
REAL(DP) :: pail(:,:), desr(:), strvxc REAL(DP) :: pail(:,:), desr(:), strvxc
REAL(DP) :: grho(:,:,:,:,:), v2xc(:,:,:,:,:) REAL(DP) :: grho(:,:,:), v2xc(:,:,:)
REAL(DP) :: bec(:,:) REAL(DP) :: bec(:,:)
COMPLEX(DP) :: rhoeg(:,:), vxc(:,:) COMPLEX(DP) :: rhoeg(:,:), vxc(:,:)
COMPLEX(DP), INTENT(IN) :: sfac(:,:) COMPLEX(DP), INTENT(IN) :: sfac(:,:)

View File

@ -15,7 +15,7 @@
LOGICAL :: TTURBO LOGICAL :: TTURBO
INTEGER :: NTURBO INTEGER :: NTURBO
COMPLEX(DP), ALLOCATABLE :: turbo_states(:,:,:,:) COMPLEX(DP), ALLOCATABLE :: turbo_states(:,:)
PUBLIC :: tturbo, nturbo, turbo_states, turbo_init, allocate_turbo PUBLIC :: tturbo, nturbo, turbo_states, turbo_init, allocate_turbo
PUBLIC :: deallocate_turbo PUBLIC :: deallocate_turbo
@ -35,19 +35,19 @@
RETURN RETURN
END SUBROUTINE turbo_init END SUBROUTINE turbo_init
SUBROUTINE allocate_turbo( nr1, nr2, nr3 ) SUBROUTINE allocate_turbo( nnr )
USE io_global, ONLY: ionode USE io_global, ONLY: ionode
USE io_global, ONLY: stdout USE io_global, ONLY: stdout
USE mp, ONLY: mp_sum USE mp, ONLY: mp_sum
INTEGER :: nr1,nr2,nr3 INTEGER :: nnr
INTEGER :: ierr INTEGER :: ierr
IF( ionode ) THEN IF( ionode ) THEN
WRITE( stdout,fmt='(/,3X,"TURBO: allocating ",I10," bytes ")') & WRITE( stdout,fmt='(/,3X,"TURBO: allocating ",I10," bytes ")') &
16*nr1*nr2*nr3*nturbo 16*nnr*nturbo
END IF END IF
IF( .NOT. ALLOCATED( turbo_states ) ) THEN IF( .NOT. ALLOCATED( turbo_states ) ) THEN
ALLOCATE( turbo_states( nr1, nr2, nr3, nturbo ), STAT = ierr) ALLOCATE( turbo_states( nnr, nturbo ), STAT = ierr)
CALL mp_sum(ierr) CALL mp_sum(ierr)
IF( ierr /= 0 ) THEN IF( ierr /= 0 ) THEN
IF( ionode ) THEN IF( ionode ) THEN

View File

@ -7,27 +7,11 @@
! !
#include "f_defs.h" #include "f_defs.h"
! ----------------------------------------------
! BEGIN manual
!=----------------------------------------------------------------------------=! !=----------------------------------------------------------------------------=!
MODULE wave_functions MODULE wave_functions
!=----------------------------------------------------------------------------=! !=----------------------------------------------------------------------------=!
! (describe briefly what this module does...)
! ----------------------------------------------
! routines in this module:
! REAL(DP) FUNCTION dft_kinetic_energy(c,hg,f,nb)
! REAL(DP) FUNCTION cp_kinetic_energy(cp,cm,pmss,emass,delt)
! SUBROUTINE update_wave_functions(cm,c0,cp)
! SUBROUTINE crot_gamma (c0,lambda,eig)
! SUBROUTINE crot_kp (ik,c0,lambda,eig)
! SUBROUTINE proj_gamma(a,b,lambda)
! SUBROUTINE proj_kp(ik,a,b,lambda)
! ----------------------------------------------
! END manual
! ... include modules ! ... include modules
USE kinds USE kinds
@ -47,202 +31,13 @@
MODULE PROCEDURE fixwave_s, fixwave_v, fixwave_m MODULE PROCEDURE fixwave_s, fixwave_v, fixwave_m
END INTERFACE END INTERFACE
PUBLIC :: dft_kinetic_energy, cp_kinetic_energy PUBLIC :: cp_kinetic_energy
PUBLIC :: update_wave_functions, wave_rand_init PUBLIC :: update_wave_functions, wave_rand_init
! end of module-scope declarations
! ----------------------------------------------
!=----------------------------------------------------------------------------=! !=----------------------------------------------------------------------------=!
CONTAINS CONTAINS
!=----------------------------------------------------------------------------=! !=----------------------------------------------------------------------------=!
! subroutines
! ----------------------------------------------
! ----------------------------------------------
REAL(DP) FUNCTION dft_kinetic_energy(c0, cdesc, f, xmkin)
! This function compute the Total Quanto-Mechanical Kinetic Energy of the Kohn-Sham
! wave function
! ----------------------------------------------
USE cell_base, ONLY: tpiba2
USE brillouin, ONLY: kpoints, kp
USE wave_types, ONLY: wave_descriptor
USE electrons_module, ONLY: pmss
USE control_flags, ONLY: force_pairing, gamma_only
USE reciprocal_space_mesh, ONLY: gkcutz_l
USE reciprocal_vectors, ONLY: ggp
IMPLICIT NONE
COMPLEX(DP), INTENT(IN) :: c0(:,:,:,:) ! wave functions coefficients
TYPE (wave_descriptor), INTENT(IN) :: cdesc ! descriptor of c0
REAL(DP), INTENT(IN) :: f(:,:,:) ! occupation numbers
REAL(DP), OPTIONAL, INTENT(INOUT) :: xmkin
INTEGER :: ib, ik, ispin, ispin_wfc
REAL(DP) :: xkin, fact, xkins, xmkins
! ... end of declarations
! ----------------------------------------------
xkin = 0.d0
DO ispin = 1, cdesc%nspin
ispin_wfc = ispin
IF( force_pairing ) ispin_wfc = 1
DO ik = 1, cdesc%nkl
fact = kp%weight(ik)
IF( cdesc%gamma ) THEN
fact = fact * 2.d0
END IF
IF( cdesc%gamma ) THEN
xkins = dft_kinetic_energy_s( ispin, c0(:,:,ik,ispin_wfc), cdesc, ggp, f(:,ik,ispin) )
IF( PRESENT( xmkin ) ) THEN
xmkins = dft_weighted_kinene( ispin, c0(:,:,ik,ispin_wfc), cdesc, ggp, f(:,ik,ispin) )
END IF
ELSE
xkins = dft_kinetic_energy_s( ispin, c0(:,:,ik,ispin_wfc), cdesc, gkcutz_l(:,ik), f(:,ik,ispin) )
IF( PRESENT( xmkin ) ) THEN
xmkins = dft_weighted_kinene( ispin, c0(:,:,ik,ispin_wfc), cdesc, gkcutz_l(:,ik), f(:,ik,ispin) )
END IF
ENDIF
xkin = xkin + fact * xkins
IF( PRESENT( xmkin ) ) THEN
xmkin = xmkin + fact * xmkins
END IF
END DO
END DO
dft_kinetic_energy = xkin
RETURN
END FUNCTION dft_kinetic_energy
!=----------------------------------------------------------------------------=!
REAL(DP) FUNCTION dft_weighted_kinene( ispin, c, cdesc, g2, fi)
! (describe briefly what this routine does...)
! ----------------------------------------------
USE wave_types, ONLY: wave_descriptor
USE electrons_module, ONLY: pmss
COMPLEX(DP), INTENT(IN) :: c(:,:)
INTEGER, INTENT( IN ) :: ispin
TYPE (wave_descriptor), INTENT(IN) :: cdesc
REAL (DP), INTENT(IN) :: fi(:), g2(:)
INTEGER ib, ig
REAL(DP) skm, xmkin
! ... end of declarations
xmkin = 0.0d0
IF( cdesc%nbl( ispin ) > SIZE( c, 2 ) .OR. &
cdesc%nbl( ispin ) > SIZE( fi ) ) &
CALL errore( ' dft_weighted_kinene ', ' wrong sizes ', 1 )
IF( cdesc%ngwl > SIZE( c, 1 ) .OR. &
cdesc%ngwl > SIZE( g2 ) .OR. &
cdesc%ngwl > SIZE( pmss ) ) &
CALL errore( ' dft_weighted_kinene ', ' wrong sizes ', 2 )
IF( cdesc%gamma .AND. cdesc%gzero ) THEN
DO ib = 1, cdesc%nbl( ispin )
skm = 0.d0
DO ig = 2, cdesc%ngwl
skm = skm + g2(ig) * DBLE( CONJG(c(ig,ib)) * c(ig,ib) ) * pmss(ig)
END DO
skm = skm + g2(1) * DBLE( c(1,ib) )**2 * pmss(1) / 2.0d0
xmkin = xmkin + fi(ib) * skm * 0.5d0
END DO
ELSE
DO ib = 1, cdesc%nbl( ispin )
skm = 0.d0
DO ig = 1, cdesc%ngwl
skm = skm + g2(ig) * DBLE( CONJG( c( ig, ib ) ) * c( ig, ib ) ) * pmss(ig)
END DO
xmkin = xmkin + fi(ib) * skm * 0.5d0
END DO
END IF
dft_weighted_kinene = xmkin
RETURN
END FUNCTION dft_weighted_kinene
!=----------------------------------------------------------------------------=!
REAL(DP) FUNCTION dft_kinetic_energy_s( ispin, c, cdesc, g2, fi)
! (describe briefly what this routine does...)
! ----------------------------------------------
USE wave_types, ONLY: wave_descriptor
COMPLEX(DP), INTENT(IN) :: c(:,:)
INTEGER, INTENT( IN ) :: ispin
TYPE (wave_descriptor), INTENT(IN) :: cdesc
REAL (DP), INTENT(IN) :: fi(:), g2(:)
INTEGER ib, ig, igs
REAL(DP) sk1, xkin
! ... end of declarations
xkin = 0.0d0
IF( cdesc%nbl( ispin ) > SIZE( c, 2 ) .OR. &
cdesc%nbl( ispin ) > SIZE( fi ) ) &
CALL errore( ' dft_total_charge ', ' wrong sizes ', 1 )
IF( cdesc%ngwl > SIZE( c, 1 ) .OR. &
cdesc%ngwl > SIZE( g2 ) ) &
CALL errore( ' dft_total_charge ', ' wrong sizes ', 2 )
IF( cdesc%gamma .AND. cdesc%gzero ) THEN
DO ib = 1, cdesc%nbl( ispin )
sk1 = 0.d0
DO ig = 2, cdesc%ngwl
sk1 = sk1 + g2(ig) * DBLE( CONJG( c(ig,ib) ) * c(ig,ib) )
END DO
sk1 = sk1 + g2(1) * DBLE( c(1,ib) )**2 / 2.0d0
xkin = xkin + fi(ib) * sk1 * 0.5d0
END DO
ELSE
DO ib = 1, cdesc%nbl( ispin )
sk1 = 0.d0
DO ig = 1, cdesc%ngwl
sk1 = sk1 + g2(ig) * DBLE( CONJG( c(ig,ib) ) * c(ig,ib) )
END DO
xkin = xkin + fi(ib) * sk1 * 0.5d0
END DO
END IF
dft_kinetic_energy_s = xkin
RETURN
END FUNCTION dft_kinetic_energy_s
!=----------------------------------------------------------------------------=!
SUBROUTINE fixwave_s ( ispin, c, cdesc, kmask ) SUBROUTINE fixwave_s ( ispin, c, cdesc, kmask )

View File

@ -3569,7 +3569,7 @@ SUBROUTINE dforce_field( bec, deeq, betae, i, c, ca, df, da, v, v1 )
USE cvan, ONLY : ish USE cvan, ONLY : ish
USE smooth_grid_dimensions, ONLY : nr1s, nr2s, nr3s, & USE smooth_grid_dimensions, ONLY : nr1s, nr2s, nr3s, &
nr1sx, nr2sx, nr3sx, nnrsx nr1sx, nr2sx, nr3sx, nnrsx
USE electrons_base, ONLY : nbspx, nbsp, nspin, f, fspin USE electrons_base, ONLY : nbspx, nbsp, nspin, f, ispin
USE constants, ONLY : pi, fpi USE constants, ONLY : pi, fpi
USE ions_base, ONLY : nsp, na, nat USE ions_base, ONLY : nsp, na, nat
USE gvecw, ONLY : ggp USE gvecw, ONLY : ggp
@ -3626,12 +3626,12 @@ SUBROUTINE dforce_field( bec, deeq, betae, i, c, ca, df, da, v, v1 )
! !
ENDIF ENDIF
! !
iss1=fspin(i) iss1=ispin(i)
! !
! the following avoids a potential out-of-bounds error ! the following avoids a potential out-of-bounds error
! !
IF (i.NE.nbsp) THEN IF (i.NE.nbsp) THEN
iss2=fspin(i+1) iss2=ispin(i+1)
ELSE ELSE
iss2=iss1 iss2=iss1
END IF END IF
@ -3874,7 +3874,7 @@ SUBROUTINE rhoiofr( nfi, c, irb, eigrb, bec, &
USE cell_base, ONLY : omega USE cell_base, ONLY : omega
USE smooth_grid_dimensions, ONLY : nr1s, nr2s, nr3s, & USE smooth_grid_dimensions, ONLY : nr1s, nr2s, nr3s, &
nr1sx, nr2sx, nr3sx, nnrsx nr1sx, nr2sx, nr3sx, nnrsx
USE electrons_base, ONLY : nbspx, nbsp, nspin, f, fspin USE electrons_base, ONLY : nbspx, nbsp, nspin, f, ispin
USE constants, ONLY : pi, fpi USE constants, ONLY : pi, fpi
USE wannier_base, ONLY : iwf USE wannier_base, ONLY : iwf
USE dener, ONLY : dekin, denl USE dener, ONLY : dekin, denl
@ -3914,7 +3914,7 @@ SUBROUTINE rhoiofr( nfi, c, irb, eigrb, bec, &
! ================================================================== ! ==================================================================
! calculation of kinetic energy ekin ! calculation of kinetic energy ekin
! ================================================================== ! ==================================================================
ekin=enkin(c) ekin=enkin(c,ngw,f,nbsp)
IF(tpre) CALL denkin(c,dekin) IF(tpre) CALL denkin(c,dekin)
! !
! ================================================================== ! ==================================================================
@ -4018,11 +4018,11 @@ SUBROUTINE rhoiofr( nfi, c, irb, eigrb, bec, &
#else #else
IF(tbuff) WRITE(21,iostat=ios) psis IF(tbuff) WRITE(21,iostat=ios) psis
#endif #endif
! iss1=fspin(i) ! iss1=ispin(i)
iss1=1 iss1=1
sa1=f(i)/omega sa1=f(i)/omega
! if (i.ne.nbsp) then ! if (i.ne.nbsp) then
! iss2=fspin(i+1) ! iss2=ispin(i+1)
! sa2=f(i+1)/omega ! sa2=f(i+1)/omega
! else ! else
iss2=iss1 ! carlo iss2=iss1 ! carlo

View File

@ -12,84 +12,16 @@
IMPLICIT NONE IMPLICIT NONE
SAVE SAVE
INTERFACE desc_init INTEGER ldim_block, ldim_cyclic, ldim_block_cyclic
MODULE PROCEDURE desc_init_1d, desc_init_2d, desc_init_3d INTEGER lind_block, lind_cyclic, lind_block_cyclic
END INTERFACE EXTERNAL ldim_block, ldim_cyclic, ldim_block_cyclic
INTERFACE global_index EXTERNAL lind_block, lind_cyclic, lind_block_cyclic
MODULE PROCEDURE globalindex_desc, globalindex_shape
END INTERFACE
INTERFACE local_index
MODULE PROCEDURE localindex_desc, localindex_shape
END INTERFACE
INTERFACE local_dimension
MODULE PROCEDURE localdim_desc, localdim_shape
END INTERFACE
INTERFACE owner_of
MODULE PROCEDURE ownerof_desc, ownerof_shape
END INTERFACE
INTERFACE get_local_dims
MODULE PROCEDURE desc_ldims
END INTERFACE
INTERFACE get_global_dims
MODULE PROCEDURE desc_gdims
END INTERFACE
INTEGER NUMROC
EXTERNAL NUMROC
CONTAINS CONTAINS
!=----------------------------------------------------------------------------=!
! BEGIN manual
!
SUBROUTINE desc_init_1d(desc, matrix_type, rows, &
row_block, row_src_pe, grid, row_shape)
!
! END manual
!=----------------------------------------------------------------------------=!
TYPE (descriptor) :: desc
INTEGER, INTENT(IN) :: matrix_type
TYPE (processors_grid), INTENT(IN) :: grid
INTEGER, INTENT(IN) :: rows
INTEGER, INTENT(IN) :: row_block
INTEGER, INTENT(IN) :: row_src_pe
INTEGER, INTENT(IN) :: row_shape
desc%matrix_type = matrix_type
desc%grid = grid
CALL desc_init_x(desc%nx, desc%xshape, desc%nxl, &
desc%nxblk, desc%ixl, desc%ipexs, rows, row_shape, &
row_block, row_src_pe, grid%mex, grid%npx)
desc%ny = 1
desc%nyl = 1
desc%nyblk = 1
desc%ipeys = 0
desc%yshape = REPLICATED_DATA_SHAPE
desc%nz = 1
desc%nzl = 1
desc%nzblk = 1
desc%ipezs = 0
desc%zshape = REPLICATED_DATA_SHAPE
desc%ldx = 1
desc%ldy = 1
RETURN
END SUBROUTINE desc_init_1d
!=----------------------------------------------------------------------------=!
! BEGIN manual
SUBROUTINE desc_init_blacs(desc, matrix_type, rows, columns, & SUBROUTINE desc_init_blacs(desc, matrix_type, rows, columns, &
row_block, column_block, row_src_pe, column_src_pe, grid, local_ld) row_block, column_block, row_src_pe, column_src_pe, grid, local_ld)
!
!
! END manual
!=----------------------------------------------------------------------------=!
TYPE (descriptor) :: desc TYPE (descriptor) :: desc
INTEGER, INTENT(IN) :: matrix_type INTEGER, INTENT(IN) :: matrix_type
@ -105,201 +37,73 @@
desc%matrix_type = matrix_type desc%matrix_type = matrix_type
desc%grid = grid desc%grid = grid
CALL desc_init_x(desc%nx, desc%xshape, desc%nxl, & CALL desc_init_x(desc%nx, desc%xdist, desc%nxl, &
desc%nxblk, desc%ixl, desc%ipexs, rows, & desc%nxblk, desc%ixl, desc%ipexs, rows, &
BLOCK_CYCLIC_SHAPE, row_block, row_src_pe, grid%mex, & BLOCK_CYCLIC_DIST, row_block, row_src_pe, grid%mex, &
grid%npx) grid%npx)
CALL desc_init_x(desc%ny, desc%yshape, & CALL desc_init_x(desc%ny, desc%ydist, &
desc%nyl, desc%nyblk, desc%iyl, & desc%nyl, desc%nyblk, desc%iyl, &
desc%ipeys, columns, BLOCK_CYCLIC_SHAPE, column_block, & desc%ipeys, columns, BLOCK_CYCLIC_DIST, column_block, &
column_src_pe, grid%mey, grid%npy) column_src_pe, grid%mey, grid%npy)
desc%nz = 1 desc%nz = 1
desc%nzl = 1 desc%nzl = 1
desc%nzblk = 1 desc%nzblk = 1
desc%ipezs = 0 desc%ipezs = 0
desc%zshape = REPLICATED_DATA_SHAPE desc%zdist = REPLICATED_DATA_DIST
IF(PRESENT(local_ld)) THEN IF(PRESENT(local_ld)) THEN
desc%ldx = local_ld desc%ldx = local_ld
ELSE ELSE
desc%ldx = localdim_shape( rows, row_block, grid%mex, & desc%ldx = ldim_block_cyclic( rows, row_block, grid%npx, grid%mex )
row_src_pe, grid%npx, desc%xshape)
END IF END IF
desc%ldy = 1 desc%ldy = 1
RETURN RETURN
END SUBROUTINE desc_init_blacs END SUBROUTINE desc_init_blacs
!=----------------------------------------------------------------------------=!
! BEGIN manual
SUBROUTINE desc_init_2d(desc, matrix_type, rows, columns, & SUBROUTINE desc_init_x(desc_nxs, desc_nx_dist, desc_local_nxs, &
row_block, column_block, row_src_pe, & desc_nx_block, desc_ix, desc_nx_src_pe, nxs, nx_dist, nx_block, &
column_src_pe, grid, row_shape, column_shape, local_ld)
!
! END manual
!=----------------------------------------------------------------------------=!
TYPE (descriptor) :: desc
INTEGER, INTENT(IN) :: matrix_type
TYPE (processors_grid), INTENT(IN) :: grid
INTEGER, INTENT(IN) :: rows
INTEGER, INTENT(IN) :: columns
INTEGER, INTENT(IN) :: row_block
INTEGER, INTENT(IN) :: column_block
INTEGER, INTENT(IN) :: row_src_pe
INTEGER, INTENT(IN) :: column_src_pe
INTEGER, INTENT(IN) :: row_shape
INTEGER, INTENT(IN) :: column_shape
INTEGER, INTENT(IN), OPTIONAL :: local_ld
LOGICAL :: debug = .FALSE.
desc%matrix_type = matrix_type
desc%grid = grid
CALL desc_init_x(desc%nx, desc%xshape, desc%nxl, &
desc%nxblk, desc%ixl, desc%ipexs, rows, row_shape, &
row_block, row_src_pe, grid%mex, grid%npx)
CALL desc_init_x(desc%ny, desc%yshape, &
desc%nyl, desc%nyblk, desc%iyl, &
desc%ipeys, columns, column_shape, column_block, &
column_src_pe, grid%mey, grid%npy)
IF( debug ) THEN
WRITE( stdout,fmt="(' desc%nx = ', I6 )") desc%nx
WRITE( stdout,fmt="(' desc%xshape = ', I6 )") desc%xshape
WRITE( stdout,fmt="(' desc%nxl = ', I6 )") desc%nxl
WRITE( stdout,fmt="(' desc%nxblk = ', I6 )") desc%nxblk
WRITE( stdout,fmt="(' desc%ixl = ', I6 )") desc%ixl
WRITE( stdout,fmt="(' desc%ipexs = ', I6 )") desc%ipexs
WRITE( stdout,fmt="(' desc%ny = ', I6 )") desc%ny
WRITE( stdout,fmt="(' desc%yshape = ', I6 )") desc%yshape
WRITE( stdout,fmt="(' desc%nyl = ', I6 )") desc%nyl
WRITE( stdout,fmt="(' desc%nyblk = ', I6 )") desc%nyblk
WRITE( stdout,fmt="(' desc%iyl = ', I6 )") desc%iyl
WRITE( stdout,fmt="(' desc%ipeys = ', I6 )") desc%ipeys
END IF
desc%nz = 1
desc%nzl = 1
desc%nzblk = 1
desc%ipezs = 0
desc%zshape = REPLICATED_DATA_SHAPE
IF(PRESENT(local_ld)) THEN
desc%ldx = local_ld
ELSE
desc%ldx = localdim_shape( rows, row_block, grid%mex, &
row_src_pe, grid%npx, desc%xshape)
END IF
desc%ldy = 1
RETURN
END SUBROUTINE desc_init_2d
!=----------------------------------------------------------------------------=!
! BEGIN manual
SUBROUTINE desc_init_3d(desc, matrix_type, rows, columns, &
planes, row_block, column_block, plane_block, row_src_pe, &
column_src_pe, plane_src_pe, grid, row_shape, column_shape, &
plane_shape, local_ld, local_sub_ld)
!
! END manual
!=----------------------------------------------------------------------------=!
TYPE (descriptor) :: desc
INTEGER, INTENT(IN) :: matrix_type
TYPE (processors_grid), INTENT(IN) :: grid
INTEGER, INTENT(IN) :: rows
INTEGER, INTENT(IN) :: columns
INTEGER, INTENT(IN) :: planes
INTEGER, INTENT(IN) :: row_block
INTEGER, INTENT(IN) :: column_block
INTEGER, INTENT(IN) :: plane_block
INTEGER, INTENT(IN) :: row_src_pe
INTEGER, INTENT(IN) :: column_src_pe
INTEGER, INTENT(IN) :: plane_src_pe
INTEGER, INTENT(IN) :: row_shape
INTEGER, INTENT(IN) :: column_shape
INTEGER, INTENT(IN) :: plane_shape
INTEGER, INTENT(IN), OPTIONAL :: local_ld
INTEGER, INTENT(IN), OPTIONAL :: local_sub_ld
desc%matrix_type = matrix_type
desc%grid = grid
CALL desc_init_x(desc%nx, desc%xshape, desc%nxl, &
desc%nxblk, desc%ixl, desc%ipexs, rows, row_shape, &
row_block, row_src_pe, grid%mex, grid%npx)
CALL desc_init_x(desc%ny, desc%yshape, &
desc%nyl, desc%nyblk, desc%iyl, &
desc%ipeys, columns, column_shape, column_block, &
column_src_pe, grid%mey, grid%npy)
CALL desc_init_x(desc%nz, desc%zshape, &
desc%nzl, desc%nzblk, desc%izl, &
desc%ipezs, planes, plane_shape, plane_block, &
plane_src_pe, grid%mez, grid%npz)
IF(PRESENT(local_ld)) THEN
desc%ldx = local_ld
ELSE
desc%ldx = localdim_shape( rows, row_block, grid%mex, &
row_src_pe, grid%npx, desc%xshape)
END IF
IF(PRESENT(local_sub_ld)) THEN
desc%ldy = local_sub_ld
ELSE
desc%ldy = localdim_shape( columns, column_block, &
grid%mey, column_src_pe, grid%npy, &
desc%yshape)
END IF
RETURN
END SUBROUTINE desc_init_3d
!=----------------------------------------------------------------------------=!
! BEGIN manual
SUBROUTINE desc_init_x(desc_nxs, desc_nx_shape, desc_local_nxs, &
desc_nx_block, desc_ix, desc_nx_src_pe, nxs, nx_shape, nx_block, &
nx_src_pe, mype, npes) nx_src_pe, mype, npes)
! !
! END manual
!=----------------------------------------------------------------------------=!
IMPLICIT NONE IMPLICIT NONE
INTEGER, INTENT(OUT) :: desc_nxs INTEGER, INTENT(OUT) :: desc_nxs
INTEGER, INTENT(OUT) :: desc_nx_shape INTEGER, INTENT(OUT) :: desc_nx_dist
INTEGER, INTENT(OUT) :: desc_local_nxs INTEGER, INTENT(OUT) :: desc_local_nxs
INTEGER, INTENT(OUT) :: desc_nx_block INTEGER, INTENT(OUT) :: desc_nx_block
INTEGER, INTENT(OUT) :: desc_ix INTEGER, INTENT(OUT) :: desc_ix
INTEGER, INTENT(OUT) :: desc_nx_src_pe INTEGER, INTENT(OUT) :: desc_nx_src_pe
INTEGER, INTENT(IN) :: nxs INTEGER, INTENT(IN) :: nxs
INTEGER, INTENT(IN) :: nx_shape INTEGER, INTENT(IN) :: nx_dist
INTEGER, INTENT(IN) :: nx_block INTEGER, INTENT(IN) :: nx_block
INTEGER, INTENT(IN) :: nx_src_pe INTEGER, INTENT(IN) :: nx_src_pe
INTEGER, INTENT(IN) :: mype INTEGER, INTENT(IN) :: mype
INTEGER, INTENT(IN) :: npes INTEGER, INTENT(IN) :: npes
desc_nxs = nxs desc_nxs = nxs
desc_nx_shape = nx_shape desc_nx_dist = nx_dist
desc_local_nxs = localdim_shape( nxs, nx_block, mype, nx_src_pe, npes, nx_shape)
desc_ix = localindex_shape( 1, nxs, nx_block, mype, npes, nx_shape)
SELECT CASE (nx_shape) SELECT CASE (nx_dist)
CASE ( BLOCK_CYCLIC_SHAPE ) CASE ( BLOCK_CYCLIC_DIST )
desc_local_nxs = ldim_block_cyclic( nxs, nx_block, npes, mype )
desc_ix = lind_block_cyclic( 1, nxs, nx_block, npes, mype)
desc_nx_block = nx_block desc_nx_block = nx_block
desc_nx_src_pe = nx_src_pe desc_nx_src_pe = nx_src_pe
CASE ( BLOCK_PARTITION_SHAPE ) CASE ( BLOCK_PARTITION_DIST )
desc_local_nxs = ldim_block( nxs, npes, mype )
desc_ix = lind_block( 1, nxs, npes, mype)
desc_nx_block = desc_local_nxs desc_nx_block = desc_local_nxs
desc_nx_src_pe = 0 desc_nx_src_pe = 0
CASE ( CYCLIC_SHAPE ) CASE ( CYCLIC_DIST )
desc_local_nxs = ldim_cyclic( nxs, npes, mype )
desc_ix = lind_cyclic( 1, nxs, npes, mype)
desc_nx_block = 1 desc_nx_block = 1
desc_nx_src_pe = 0 desc_nx_src_pe = 0
CASE ( REPLICATED_DATA_SHAPE ) CASE ( REPLICATED_DATA_DIST )
desc_local_nxs = nxs
desc_ix = 1
desc_nx_block = nxs desc_nx_block = nxs
desc_nx_src_pe = mype desc_nx_src_pe = mype
END SELECT END SELECT
@ -329,324 +133,5 @@
RETURN RETURN
END SUBROUTINE pblas_descriptor END SUBROUTINE pblas_descriptor
!=----------------------------------------------------------------------------=!
! BEGIN manual
INTEGER FUNCTION globalindex_shape( lind, n, nb, me, isrc, np, pshape )
! This function computes the global index of a distributed array entry
! pointed to by the local index lind of the process indicated by me.
! lind local index of the distributed matrix entry.
! N is the size of the global array.
! NB size of the blocks the distributed matrix is split into.
! me The coordinate of the process whose local array row or
! column is to be determined.
! isrc The coordinate of the process that possesses the first
! row/column of the distributed matrix.
! np The total number processes over which the distributed
! matrix is distributed.
!
! END manual
!=----------------------------------------------------------------------------=!
INTEGER, INTENT(IN) :: lind, n, nb, me, isrc, np, pshape
INTEGER r, q
IF( pshape .EQ. BLOCK_PARTITION_SHAPE ) THEN
q = INT(n/np)
r = MOD(n,np)
IF( me < r ) THEN
GLOBALINDEX_SHAPE = (Q+1)*me + lind
ELSE
GLOBALINDEX_SHAPE = Q*me + R + lind
END IF
ELSE IF ( pshape .EQ. BLOCK_CYCLIC_SHAPE ) THEN
GLOBALINDEX_SHAPE = np*NB*((lind-1)/NB) + &
MOD(lind-1,NB) + MOD(np+me-isrc, np)*NB + 1
ELSE IF ( pshape .EQ. CYCLIC_SHAPE ) THEN
GLOBALINDEX_SHAPE = (lind-1) * np + me + 1
ELSE
GLOBALINDEX_SHAPE = lind
END IF
RETURN
END FUNCTION globalindex_shape
!=----------------------------------------------------------------------------=!
! BEGIN manual
INTEGER FUNCTION globalindex_desc( lind, desc, what )
! END manual
!=----------------------------------------------------------------------------=!
INTEGER, INTENT(IN) :: lind
TYPE (descriptor) :: desc
CHARACTER(LEN=*) :: what
INTEGER N, nb, src_pe, my_pe, np, pshape
IF ( what(1:1) .EQ. 'R' .OR. what(1:1) .EQ. 'r' ) THEN
NB = desc%nxblk; N = desc%nx;
np = desc%grid%npx; src_pe = desc%ipexs;
my_pe = desc%grid%mex; pshape = desc%xshape
ELSE IF ( what(1:1) .EQ. 'C' .OR. what(1:1) .EQ. 'c' ) THEN
NB = desc%nyblk; N = desc%ny;
np = desc%grid%npy; src_pe = desc%ipeys;
my_pe = desc%grid%mey; pshape = desc%yshape
ELSE IF ( what(1:1) .EQ. 'P' .OR. what(1:1) .EQ. 'p' ) THEN
NB = desc%nzblk; N = desc%nz;
np = desc%grid%npz; src_pe = desc%ipezs;
my_pe = desc%grid%mez; pshape = desc%zshape
END IF
globalindex_desc = globalindex_shape(lind, n, nb, my_pe, src_pe, np, pshape )
RETURN
END FUNCTION globalindex_desc
!=----------------------------------------------------------------------------=!
! BEGIN manual
INTEGER FUNCTION localdim_shape( n, nb, me, isrc, np, pshape)
! N = Global dimension of the array
! NB = Size of the blocks ( meaningful only for BLOCK_CYCLIC_SHAPE )
! me = Index of the callig processor
! isrc = Index of the processor owning the first element of the array
! np = Number of processors among which the array is subdivided
! pshape = Shape of the distributed data
!
! This function return the number of array elements owned
! by the callig processor
!
! END manual
!=----------------------------------------------------------------------------=!
IMPLICIT NONE
INTEGER, INTENT(IN) :: n, nb, me, isrc, np, pshape
IF( pshape .EQ. BLOCK_PARTITION_SHAPE ) THEN
LOCALDIM_SHAPE = INT(N/np)
IF( me < MOD(N,np) ) LOCALDIM_SHAPE = LOCALDIM_SHAPE + 1
ELSE IF( pshape .EQ. BLOCK_CYCLIC_SHAPE ) THEN
LOCALDIM_SHAPE = NUMROC( N, NB, me, isrc, np )
ELSE IF( pshape .EQ. CYCLIC_SHAPE ) THEN
LOCALDIM_SHAPE = INT(N/np)
IF( me < MOD(N,np) ) LOCALDIM_SHAPE = LOCALDIM_SHAPE + 1
ELSE
LOCALDIM_SHAPE = n
END IF
RETURN
END FUNCTION localdim_shape
!=----------------------------------------------------------------------------=!
! BEGIN manual
INTEGER FUNCTION localdim_desc( desc, what )
! END manual
!=----------------------------------------------------------------------------=!
TYPE (descriptor) :: desc
CHARACTER(LEN=*) :: what
INTEGER n, nb, src_pe, my_pe, np, pshape
IF ( what(1:1) .EQ. 'R' .OR. what(1:1) .EQ. 'r' ) THEN
NB = desc%nxblk; N = desc%nx;
np = desc%grid%npx; src_pe = desc%ipexs;
my_pe = desc%grid%mex; pshape = desc%xshape
ELSE IF ( what(1:1) .EQ. 'C' .OR. what(1:1) .EQ. 'c' ) THEN
NB = desc%nyblk; N = desc%ny;
np = desc%grid%npy; src_pe = desc%ipeys;
my_pe = desc%grid%mey; pshape = desc%yshape
ELSE IF ( what(1:1) .EQ. 'P' .OR. what(1:1) .EQ. 'p' ) THEN
NB = desc%nzblk; N = desc%nz;
np = desc%grid%npz; src_pe = desc%ipezs;
my_pe = desc%grid%mez; pshape = desc%zshape
END IF
localdim_desc = localdim_shape( N, NB, my_pe, src_pe, np, pshape)
RETURN
END FUNCTION localdim_desc
!=----------------------------------------------------------------------------=!
! BEGIN manual
INTEGER FUNCTION localindex_shape(ig, n, nb, me, np, pshape)
! ig global index of the x dimension of array element
! n dimension of the global array
! nb dimension of the block the global array is split into.
! np number of processors onto which the array is distributed
!
! This function return the index of the element in the local block
!
! END manual
!=----------------------------------------------------------------------------=!
INTEGER ig, n, np, pshape, nb, me, q, r
IF( pshape .EQ. BLOCK_PARTITION_SHAPE ) THEN
q = INT(n/np)
r = MOD(n,np)
IF( me < r ) THEN
LOCALINDEX_SHAPE = ig - (q+1) * me
ELSE
LOCALINDEX_SHAPE = ig - (q+1) * r - q * (me - r)
END IF
ELSE IF ( pshape .EQ. BLOCK_CYCLIC_SHAPE ) THEN
LOCALINDEX_SHAPE = NB*((IG-1)/(NB*NP))+MOD(IG-1,NB)+1
ELSE IF ( pshape .EQ. CYCLIC_SHAPE ) THEN
LOCALINDEX_SHAPE = (ig-1)/np + 1
ELSE
LOCALINDEX_SHAPE = ig
END IF
RETURN
END FUNCTION localindex_shape
!=----------------------------------------------------------------------------=!
! BEGIN manual
INTEGER FUNCTION localindex_desc(ig, desc, what )
! END manual
!=----------------------------------------------------------------------------=!
TYPE (descriptor) :: desc
CHARACTER(LEN=*) :: what
INTEGER ig, n, nb, np, pshape, me
IF ( what(1:1) .EQ. 'R' .OR. what(1:1) .EQ. 'r' ) THEN
NB = desc%nxblk; N = desc%nx;
np = desc%grid%npx; pshape = desc%xshape
me = desc%grid%mex
ELSE IF ( what(1:1) .EQ. 'C' .OR. what(1:1) .EQ. 'c' ) THEN
NB = desc%nyblk; N = desc%ny;
np = desc%grid%npy; pshape = desc%yshape
me = desc%grid%mey
ELSE IF ( what(1:1) .EQ. 'P' .OR. what(1:1) .EQ. 'p' ) THEN
NB = desc%nzblk; N = desc%nz;
np = desc%grid%npz; pshape = desc%zshape
me = desc%grid%mez
END IF
localindex_desc = localindex_shape(ig,n,nb,me,np,pshape)
RETURN
END FUNCTION localindex_desc
!=----------------------------------------------------------------------------=!
! BEGIN manual
INTEGER FUNCTION ownerof_shape(ig,n,nb,src_pe,np,pshape)
!
! ig global index of the x dimension of array element
! n dimension of the global array
! nb dimension of the block
! src_pe index of the processor owning the first element of the array
! at the moment meaningfull only for pshape = BLOCK_CYCLIC_SHAPE
! np number of processors
!
! This function return the index of the processor owning the array element
! whose global index is "ig"
!
! END manual
!=----------------------------------------------------------------------------=!
IMPLICIT NONE
INTEGER ig, n, nb, np, pshape, src_pe, r, q
IF( pshape .EQ. BLOCK_PARTITION_SHAPE ) THEN
q = INT(n/np); r = MOD(n,np)
IF ( ig <= ((q+1)*r) ) THEN
ownerof_shape = INT((ig-1)/(q+1))
ELSE
ownerof_shape = INT((ig-1-r*(q+1))/q)+r
END IF
ELSE IF( pshape .EQ. BLOCK_CYCLIC_SHAPE ) THEN
ownerof_shape = MOD( src_pe + (ig - 1) / NB, NP )
ELSE IF( pshape .EQ. CYCLIC_SHAPE ) THEN
ownerof_shape = MOD( ig-1, np )
END IF
RETURN
END FUNCTION ownerof_shape
!=----------------------------------------------------------------------------=!
! BEGIN manual
INTEGER FUNCTION ownerof_desc(ig, desc, what )
! END manual
!=----------------------------------------------------------------------------=!
TYPE (descriptor) :: desc
CHARACTER(LEN=*) :: what
INTEGER ig, n, nb, src_pe, np, pshape
IF ( what(1:1) .EQ. 'R' .OR. what(1:1) .EQ. 'r' ) THEN
NB = desc%nxblk; N = desc%nx;
np = desc%grid%npx; pshape = desc%xshape
src_pe = desc%ipexs
ELSE IF ( what(1:1) .EQ. 'C' .OR. what(1:1) .EQ. 'c' ) THEN
NB = desc%nyblk; N = desc%ny;
np = desc%grid%npy; pshape = desc%yshape
src_pe = desc%ipeys
ELSE IF ( what(1:1) .EQ. 'P' .OR. what(1:1) .EQ. 'p' ) THEN
NB = desc%nzblk; N = desc%nz;
np = desc%grid%npz; pshape = desc%zshape
src_pe = desc%ipezs
END IF
ownerof_desc = ownerof_shape(ig, n, nb, src_pe, np, pshape)
RETURN
END FUNCTION ownerof_desc
!=----------------------------------------------------------------------------=!
! BEGIN manual
SUBROUTINE desc_gdims(d, nx, ny, nz )
! END manual
!=----------------------------------------------------------------------------=!
TYPE (descriptor), INTENT(IN) :: d
INTEGER, INTENT(OUT) :: nx, ny, nz
nx = d%nx
ny = d%ny
nz = d%nz
RETURN
END SUBROUTINE desc_gdims
!=----------------------------------------------------------------------------=!
! BEGIN manual
SUBROUTINE desc_ldims(d, nxl, nyl, nzl )
! END manual
!=----------------------------------------------------------------------------=!
TYPE (descriptor), INTENT(IN) :: d
INTEGER, INTENT(OUT) :: nxl
INTEGER, OPTIONAL, INTENT(OUT) :: nyl, nzl
nxl = d%nxl
IF( PRESENT( nyl ) ) nyl = d%nyl
IF( PRESENT( nzl ) ) nzl = d%nzl
RETURN
END SUBROUTINE desc_ldims
END MODULE descriptors_module END MODULE descriptors_module

View File

@ -31,7 +31,7 @@
REAL(DP), ALLOCATABLE :: f(:) ! occupation numbers ( at gamma ) REAL(DP), ALLOCATABLE :: f(:) ! occupation numbers ( at gamma )
REAL(DP) :: qbac = 0.0d0 ! background neutralizing charge REAL(DP) :: qbac = 0.0d0 ! background neutralizing charge
INTEGER, ALLOCATABLE :: fspin(:) ! spin of each state INTEGER, ALLOCATABLE :: ispin(:) ! spin of each state
! !
!------------------------------------------------------------------------------! !------------------------------------------------------------------------------!
CONTAINS CONTAINS
@ -113,9 +113,9 @@
END IF END IF
ALLOCATE( f ( nbspx ) ) ALLOCATE( f ( nbspx ) )
ALLOCATE( fspin ( nbspx ) ) ALLOCATE( ispin ( nbspx ) )
f = 0.0d0 f = 0.0d0
fspin = 0 ispin = 0
iupdwn ( 1 ) = 1 iupdwn ( 1 ) = 1
nel = 0 nel = 0
@ -265,7 +265,7 @@
do iss = 1, nspin do iss = 1, nspin
do in = iupdwn(iss), iupdwn(iss) - 1 + nupdwn(iss) do in = iupdwn(iss), iupdwn(iss) - 1 + nupdwn(iss)
fspin(in) = iss ispin(in) = iss
end do end do
end do end do
@ -402,7 +402,7 @@
SUBROUTINE deallocate_elct() SUBROUTINE deallocate_elct()
IF( ALLOCATED( f ) ) DEALLOCATE( f ) IF( ALLOCATED( f ) ) DEALLOCATE( f )
IF( ALLOCATED( fspin ) ) DEALLOCATE( fspin ) IF( ALLOCATED( ispin ) ) DEALLOCATE( ispin )
telectrons_base_initval = .FALSE. telectrons_base_initval = .FALSE.
RETURN RETURN
END SUBROUTINE deallocate_elct END SUBROUTINE deallocate_elct

View File

@ -27,12 +27,13 @@
! 0 <= mez < npz-1 ! 0 <= mez < npz-1
END TYPE END TYPE
! ... Valid values for data shape ! ... Valid values for data distribution
INTEGER, PARAMETER :: BLOCK_CYCLIC_SHAPE = 1 !
INTEGER, PARAMETER :: BLOCK_PARTITION_SHAPE = 2 INTEGER, PARAMETER :: BLOCK_CYCLIC_DIST = 1
INTEGER, PARAMETER :: FREE_PATTERN_SHAPE = 3 INTEGER, PARAMETER :: BLOCK_PARTITION_DIST = 2
INTEGER, PARAMETER :: REPLICATED_DATA_SHAPE = 4 INTEGER, PARAMETER :: FREE_PATTERN_DIST = 3
INTEGER, PARAMETER :: CYCLIC_SHAPE = 5 INTEGER, PARAMETER :: REPLICATED_DATA_DIST = 4
INTEGER, PARAMETER :: CYCLIC_DIST = 5
! ---------------------------------------------- ! ----------------------------------------------
! BEGIN manual ! BEGIN manual
@ -40,18 +41,18 @@
! Given the Array |a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11| ! Given the Array |a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11|
! and three processors P0, P1, P2 ! and three processors P0, P1, P2
! !
! in the BLOCK_PARTITION_SHAPE scheme, the Array is partitioned ! in the BLOCK_PARTITION_DIST scheme, the Array is partitioned
! as follow ! as follow
! P0 P1 P2 ! P0 P1 P2
! |a1 a2 a3 a4| |a5 a6 a7 a8| |a9 a10 a11| ! |a1 a2 a3 a4| |a5 a6 a7 a8| |a9 a10 a11|
! !
! in the BLOCK_CYCLIC_SHAPE scheme the Array is first partitioned ! in the BLOCK_CYCLIC_DIST scheme the Array is first partitioned
! into blocks (i.e. of size 2) |a1 a2|a3 a4|a5 a6|a7 a8|a9 a10|a11| ! into blocks (i.e. of size 2) |a1 a2|a3 a4|a5 a6|a7 a8|a9 a10|a11|
! Then the block are distributed cyclically among P0, P1 and P2 ! Then the block are distributed cyclically among P0, P1 and P2
! P0 P1 P2 ! P0 P1 P2
! |a1 a2|a7 a8| |a3 a4|a9 a10| |a5 a6|a11| ! |a1 a2|a7 a8| |a3 a4|a9 a10| |a5 a6|a11|
! !
! in the CYCLIC_SHAPE scheme the Array elements are distributed round robin ! in the CYCLIC_DIST scheme the Array elements are distributed round robin
! among P0, P1 and P2 ! among P0, P1 and P2
! P0 P1 P2 ! P0 P1 P2
! |a1 a4 a7 a10| |a2 a5 a8 a11| |a3 a6 a9| ! |a1 a4 a7 a10| |a2 a5 a8 a11| |a3 a6 a9|
@ -67,7 +68,7 @@
INTEGER :: nx ! rows, number of rows in the global array INTEGER :: nx ! rows, number of rows in the global array
INTEGER :: ny ! columns, number of columns in the global array INTEGER :: ny ! columns, number of columns in the global array
INTEGER :: nz ! planes, number of planes in the global array INTEGER :: nz ! planes, number of planes in the global array
INTEGER :: nxblk ! row_block, if shape = BLOCK_CICLYC_SHAPE, INTEGER :: nxblk ! row_block, if DIST = BLOCK_CICLYC_DIST,
! this value represent the blocking factor ! this value represent the blocking factor
! used to distribute the rows of the array, ! used to distribute the rows of the array,
! otherwise this is the size of local block of rows ! otherwise this is the size of local block of rows
@ -90,9 +91,9 @@
! of the array ! of the array
INTEGER :: ldz ! INTEGER :: ldz !
INTEGER :: xshape ! row_shape INTEGER :: xdist ! row_dist
INTEGER :: yshape ! column_shape INTEGER :: ydist ! column_dist
INTEGER :: zshape ! plane_shape INTEGER :: zdist ! plane_dist
END TYPE END TYPE
@ -150,8 +151,8 @@
complex_parallel_vector, complex_parallel_matrix, & complex_parallel_vector, complex_parallel_matrix, &
complex_parallel_tensor, parallel_allocate, parallel_deallocate complex_parallel_tensor, parallel_allocate, parallel_deallocate
PUBLIC :: BLOCK_CYCLIC_SHAPE, BLOCK_PARTITION_SHAPE, & PUBLIC :: BLOCK_CYCLIC_DIST, BLOCK_PARTITION_DIST, &
FREE_PATTERN_SHAPE, REPLICATED_DATA_SHAPE, CYCLIC_SHAPE FREE_PATTERN_DIST, REPLICATED_DATA_DIST, CYCLIC_DIST
INTERFACE parallel_allocate INTERFACE parallel_allocate
MODULE PROCEDURE allocate_real_vector, allocate_real_matrix, & MODULE PROCEDURE allocate_real_vector, allocate_real_matrix, &

File diff suppressed because it is too large Load Diff

View File

@ -1062,8 +1062,8 @@ MODULE read_namelists_module
IF( calculation == ' ' ) & IF( calculation == ' ' ) &
CALL errore( sub_name,' calculation not specified ',1) CALL errore( sub_name,' calculation not specified ',1)
IF( prog == 'CP' ) THEN IF( prog == 'CP' ) THEN
IF( calculation == 'nscf' .OR. calculation == 'phonon' ) & IF( calculation == 'phonon' ) &
CALL errore( sub_name,' calculation '//TRIM(calculation)// & CALL errore( sub_name,' calculation '//calculation// &
& ' not implemented ',1) & ' not implemented ',1)
END IF END IF
IF( ndr < 50 ) & IF( ndr < 50 ) &
@ -1573,9 +1573,9 @@ MODULE read_namelists_module
cell_dynamics = 'none' cell_dynamics = 'none'
END IF END IF
CASE ('nscf') CASE ('nscf')
IF( prog == 'CP' ) & ! IF( prog == 'CP' ) &
CALL errore( sub_name,' calculation '//TRIM(calculation)// & ! CALL errore( sub_name,' calculation '//calculation// &
& ' not implemented ',1) ! & ' not implemented ',1)
IF( prog == 'CP' ) occupations = 'bogus' IF( prog == 'CP' ) occupations = 'bogus'
IF( prog == 'CP' ) electron_dynamics = 'damp' IF( prog == 'CP' ) electron_dynamics = 'damp'
IF( prog == 'PW' ) startingpot = 'file' IF( prog == 'PW' ) startingpot = 'file'

View File

@ -1001,7 +1001,7 @@ MODULE xml_io_base
CALL mp_bcast( ierr, ionode_id ) CALL mp_bcast( ierr, ionode_id )
! !
CALL errore( ' read_rho_xml ', & CALL errore( ' read_rho_xml ', &
'cannot open rho_file file for writing', ierr ) 'cannot open ' // rho_file // ' file for reading', ierr )
! !
IF ( ionode ) THEN IF ( ionode ) THEN
! !

View File

@ -48,7 +48,6 @@ infog1l.o \
infog2l.o \ infog2l.o \
localdim.o \ localdim.o \
localindex.o \ localindex.o \
matmul.o \
npreroc.o \ npreroc.o \
numroc.o \ numroc.o \
ownerof.o \ ownerof.o \

View File

@ -10,31 +10,40 @@
!----------------------------------------------------------------------- !-----------------------------------------------------------------------
! !
subroutine GRIDSETUP(NPROC,NPROW,NPCOL) SUBROUTINE GRID2D_DIMS( nproc, nprow, npcol )
! !
! This subroutine factorizes the number of processors (NPROC) ! This subroutine factorizes the number of processors (NPROC)
! into NPROW and NPCOL, that are the sizes of the 2D processors mesh. ! into NPROW and NPCOL, that are the sizes of the 2D processors mesh.
! !
! Written by Carlo Cavazzoni ! Written by Carlo Cavazzoni
! !
IMPLICIT NONE IMPLICIT NONE
INTEGER, INTENT(IN) :: nproc
integer nproc,nprow,npcol INTEGER, INTENT(OUT) :: nprow, npcol
integer sqrtnp,i integer sqrtnp,i
sqrtnp = int( sqrt( dble(nproc) ) + 1 )
if(nproc.lt.2) then
npcol = 1
nprow = 1
else
sqrtnp = int( sqrt( DBLE(nproc) ) + 1 )
do i=1,sqrtnp do i=1,sqrtnp
if(mod(nproc,i).eq.0) nprow = i if(mod(nproc,i).eq.0) nprow = i
end do end do
npcol = nproc/nprow npcol = nproc/nprow
endif RETURN
END SUBROUTINE
return SUBROUTINE GRID2D_COORDS( rank, nprow, npcol, row, col )
end subroutine gridsetup IMPLICIT NONE
INTEGER, INTENT(IN) :: rank ! process index starting from 0
INTEGER, INTENT(IN) :: nprow, npcol ! dimensions of the processor grid
INTEGER, INTENT(OUT) :: row, col
row = MOD( rank, nprow )
col = rank / nprow
RETURN
END SUBROUTINE
SUBROUTINE GRID2D_RANK( nprow, npcol, row, col, rank )
IMPLICIT NONE
INTEGER, INTENT(OUT) :: rank ! process index starting from 0
INTEGER, INTENT(IN) :: nprow, npcol ! dimensions of the processor grid
INTEGER, INTENT(IN) :: row, col
rank = row + col * nprow
RETURN
END SUBROUTINE

View File

@ -122,3 +122,83 @@
! End of INDXG2L ! End of INDXG2L
! !
END FUNCTION lind_block_cyclic END FUNCTION lind_block_cyclic
!=----------------------------------------------------------------------------=!
INTEGER FUNCTION gind_cyclic( lind, n, np, me )
! This function computes the global index of a distributed array entry
! pointed to by the local index lind of the process indicated by me.
! lind local index of the distributed matrix entry.
! N is the size of the global array.
! me The coordinate of the process whose local array row or
! column is to be determined.
! np The total number processes over which the distributed
! matrix is distributed.
!
INTEGER, INTENT(IN) :: lind, n, me, np
INTEGER r, q
gind_cyclic = (lind-1) * np + me + 1
RETURN
END FUNCTION gind_cyclic
!=----------------------------------------------------------------------------=!
INTEGER FUNCTION gind_block( lind, n, np, me )
! This function computes the global index of a distributed array entry
! pointed to by the local index lind of the process indicated by me.
! lind local index of the distributed matrix entry.
! N is the size of the global array.
! me The coordinate of the process whose local array row or
! column is to be determined.
! np The total number processes over which the distributed
! matrix is distributed.
INTEGER, INTENT(IN) :: lind, n, me, np
INTEGER r, q
q = INT(n/np)
r = MOD(n,np)
IF( me < r ) THEN
gind_block = (Q+1)*me + lind
ELSE
gind_block = Q*me + R + lind
END IF
RETURN
END FUNCTION gind_block
!=----------------------------------------------------------------------------=!
INTEGER FUNCTION gind_block_cyclic( lind, n, nb, np, me )
! This function computes the global index of a distributed array entry
! pointed to by the local index lind of the process indicated by me.
! lind local index of the distributed matrix entry.
! N is the size of the global array.
! NB size of the blocks the distributed matrix is split into.
! me The coordinate of the process whose local array row or
! column is to be determined.
! np The total number processes over which the distributed
! matrix is distributed.
INTEGER, INTENT(IN) :: lind, n, nb, me, np
INTEGER r, q, isrc
isrc = 0
gind_block_cyclic = np*NB*((lind-1)/NB) + &
MOD(lind-1,NB) + MOD(np+me-isrc, np)*NB + 1
RETURN
END FUNCTION gind_block_cyclic

View File

@ -1614,7 +1614,8 @@ SUBROUTINE a2Fdos &
! !
INTEGER, INTENT(in) :: nat, nq, nr1, nr2, nr3, ibrav, ndos, ntetra, & INTEGER, INTENT(in) :: nat, nq, nr1, nr2, nr3, ibrav, ndos, ntetra, &
tetra(4, ntetra) tetra(4, ntetra)
LOGICAL, INTENT(in) :: dos, asr LOGICAL, INTENT(in) :: dos
CHARACTER(LEN=*), INTENT(IN) :: asr
REAL(DP), INTENT(in) :: freq(3*nat,nq), q(3,nq), at(3,3), bg(3,3), & REAL(DP), INTENT(in) :: freq(3*nat,nq), q(3,nq), at(3,3), bg(3,3), &
tau(3,nat), alat, Emin, DeltaE tau(3,nat), alat, Emin, DeltaE
! !