quantum-espresso/GWW/bse/qpe_exc.f90

62 lines
1.7 KiB
Fortran

MODULE qpe_exc
!this modules contains variables and subroutines related to the use of QP energies
!in the BSE kernel beyond the scissor operator
USE kinds, ONLY : DP
USE io_global, ONLY : ionode,ionode_id
USE mp, ONLY : mp_bcast
USE mp_world, ONLY : world_comm
REAL(kind=DP), pointer :: qpc(:) ! vector containing QPC
REAL(kind=DP) :: qpcbarc ! average qpc to be applied for higher
! (band index above qpc_imax) energy states
REAL(kind=DP) :: qpcbarv ! average qpc to be applied for lower
! (band index below qpc_imin) energy states
CONTAINS
SUBROUTINE build_qpc(qpc)
!this subroutine reads bands.dat and builds the qp correction vector
USE bse_wannier, ONLY : qpe_imin,qpe_imax
USE kinds, ONLY : DP
USE io_files, ONLY : tmp_dir,prefix
USE wvfct, ONLY : nbnd
USE constants, ONLY: RYTOEV
implicit none
INTEGER, EXTERNAL :: find_free_unit
integer :: ib, iun, idum
logical :: debug
real(kind=DP) :: qpc(qpe_imax)
real(kind=DP) :: rdum,edft,egw,dumm1,dumm2,dumm3,dumm4
qpc(1:qpe_imax)=0.d0
iun = find_free_unit()
if(ionode) then
open(iun,file=trim(tmp_dir)//trim(prefix)//'-bands.dat', status='old', form='formatted')
read(iun,*) idum
read(iun,*) idum
do ib=1,qpe_imin-1
read(iun,*) idum,dumm1,dumm2,dumm3,dumm4
enddo
do ib=qpe_imin,qpe_imax
read(iun,*) idum, edft,rdum,egw,rdum
qpc(ib)=(egw-edft)/RYTOEV
enddo
close(iun)
endif
do ib=qpe_imin,qpe_imax
call mp_bcast(qpc(ib), ionode_id, world_comm )
enddo
return
END SUBROUTINE
end MODULE qpe_exc