mirror of https://gitlab.com/QEF/q-e.git
165 lines
4.6 KiB
Fortran
165 lines
4.6 KiB
Fortran
!
|
|
! Copyright (C) 2001-2018 Quantum ESPRESSO group
|
|
! This file is distributed under the terms of the
|
|
! GNU General Public License. See the file `License'
|
|
! in the root directory of the present distribution,
|
|
! or http://www.gnu.org/copyleft/gpl.txt .
|
|
!
|
|
!-------------------------------------------------------------
|
|
SUBROUTINE lr_init_nfo()
|
|
!-------------------------------------------------------------
|
|
!
|
|
! This subroutine prepares several variables which are needed in the
|
|
! TDDFPT program:
|
|
! 1) Initialization of ikks, ikqs, and nksq.
|
|
! 2) EELS: Calculate phases associated with a q vector.
|
|
! 3) Compute the number of occupied bands for each k point.
|
|
! 4) Computes alpha_pv (needed by orthogonalize.f90 when lgauss=.true.)
|
|
!
|
|
USE kinds, ONLY : DP
|
|
USE ions_base, ONLY : nat, tau
|
|
USE klist, ONLY : nks,xk,ngk,igk_k
|
|
USE wvfct, ONLY : nbnd
|
|
USE lr_variables, ONLY : lr_verbosity, eels, size_evc
|
|
USE io_global, ONLY : stdout
|
|
USE constants, ONLY : tpi, eps8
|
|
USE noncollin_module, ONLY : npol
|
|
USE gvect, ONLY : ngm, g
|
|
USE cell_base, ONLY : at, bg, omega, tpiba2
|
|
USE lsda_mod, ONLY : current_spin, nspin
|
|
USE wvfct, ONLY : npwx, wg
|
|
USE gvecw, ONLY : gcutw
|
|
USE io_files, ONLY : prefix, iunwfc, nwordwfc, wfc_dir
|
|
USE gvecs, ONLY : doublegrid
|
|
USE fft_base, ONLY : dfftp
|
|
USE uspp, ONLY : vkb, okvan, nkb
|
|
USE wavefunctions, ONLY : evc
|
|
USE becmod, ONLY : calbec, allocate_bec_type
|
|
USE lrus, ONLY : becp1
|
|
USE control_lr, ONLY : alpha_pv
|
|
USE qpoint, ONLY : xq, ikks, ikqs, nksq, eigqts
|
|
USE eqv, ONLY : evq
|
|
USE buffers, ONLY : open_buffer, get_buffer
|
|
USE control_flags, ONLY : io_level
|
|
!
|
|
IMPLICIT NONE
|
|
!
|
|
! local variables
|
|
!
|
|
REAL(kind=DP) :: arg
|
|
INTEGER :: na, & ! dummy index which runs over atoms
|
|
ik, & ! dummy index which runs over k points
|
|
ikk, & ! index of the point k
|
|
npw ! number of the plane-waves at point k
|
|
LOGICAL :: exst, exst_mem
|
|
! logical variable to check file exists
|
|
! logical variable to check file exists in memory
|
|
!
|
|
! 1) Initialization of ikks, ikqs, and nksq.
|
|
! Inspired by PH/initialize_ph.f90.
|
|
!
|
|
IF (eels) THEN
|
|
!
|
|
! EELS (q!=0)
|
|
!
|
|
! nksq is the number of k-points, NOT including k+q points
|
|
!
|
|
nksq = nks / 2
|
|
!
|
|
ALLOCATE(ikks(nksq), ikqs(nksq))
|
|
DO ik = 1, nksq
|
|
ikks(ik) = 2 * ik - 1
|
|
ikqs(ik) = 2 * ik
|
|
ENDDO
|
|
!
|
|
ELSE
|
|
!
|
|
! Optical case (q=0)
|
|
!
|
|
nksq = nks
|
|
!
|
|
! Note: in this case the arrays ikks and ikqs
|
|
! are needed only in h_prec and ch_psi_all.
|
|
!
|
|
ALLOCATE(ikks(nksq), ikqs(nksq))
|
|
DO ik = 1, nksq
|
|
ikks(ik) = ik
|
|
ikqs(ik) = ik
|
|
ENDDO
|
|
!
|
|
ENDIF
|
|
!
|
|
! 2) EELS-specific operations
|
|
!
|
|
IF (eels) THEN
|
|
!
|
|
size_evc = nbnd * npwx * npol * nksq
|
|
nwordwfc = nbnd * npwx * npol
|
|
!
|
|
CALL open_buffer (iunwfc, 'wfc', nwordwfc, io_level, exst_mem, exst)
|
|
!
|
|
IF (.NOT.exst .AND. .NOT.exst_mem) THEN
|
|
CALL errore ('lr_init_nfo', 'file '//trim(prefix)//'.wfc not found', 1)
|
|
ENDIF
|
|
!
|
|
! USPP-specific initializations
|
|
!
|
|
IF (okvan) THEN
|
|
!
|
|
! Calculate phases associated with the q vector
|
|
!
|
|
ALLOCATE (eigqts(nat))
|
|
!
|
|
DO na = 1, nat
|
|
arg = ( xq(1) * tau(1,na) + &
|
|
xq(2) * tau(2,na) + &
|
|
xq(3) * tau(3,na) ) * tpi
|
|
eigqts(na) = cmplx(cos(arg), -sin(arg) ,kind=DP)
|
|
ENDDO
|
|
!
|
|
! Calculate becp1 = <vkb|evc>
|
|
!
|
|
ALLOCATE (becp1(nksq))
|
|
!
|
|
DO ik = 1, nksq
|
|
!
|
|
CALL allocate_bec_type (nkb,nbnd,becp1(ik))
|
|
!
|
|
ikk = ikks(ik)
|
|
npw = ngk(ikk)
|
|
!
|
|
! Read the wavefunction evc
|
|
CALL get_buffer (evc, nwordwfc, iunwfc, ikk)
|
|
!
|
|
! Calculate beta-functions vkb at point k
|
|
CALL init_us_2(npw, igk_k(1,ikk), xk(1,ikk), vkb)
|
|
!
|
|
! Calculate becp1=<vkb|evc>
|
|
CALL calbec (npw, vkb, evc, becp1(ik))
|
|
!
|
|
ENDDO
|
|
!
|
|
ENDIF
|
|
!
|
|
ENDIF
|
|
!
|
|
! 3) Compute the number of occupied bands for each k point
|
|
!
|
|
CALL setup_nbnd_occ()
|
|
!
|
|
! 4) Compute alpha_pv
|
|
!
|
|
IF (eels) THEN
|
|
!
|
|
alpha_pv = 0.0d0
|
|
!
|
|
ELSE
|
|
!
|
|
CALL setup_alpha_pv()
|
|
!
|
|
ENDIF
|
|
!
|
|
RETURN
|
|
!
|
|
END SUBROUTINE lr_init_nfo
|