mirror of https://gitlab.com/QEF/q-e.git
450 lines
15 KiB
Fortran
450 lines
15 KiB
Fortran
!
|
|
! Copyright (C) 2001-2011 PWSCF 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 .
|
|
!
|
|
!----------------------------------------------------------------------------
|
|
!
|
|
! ... Common variables for the phonon program
|
|
!
|
|
MODULE modes
|
|
USE kinds, ONLY : DP
|
|
!
|
|
! ... The variables needed to describe the modes and the small group of q
|
|
!
|
|
SAVE
|
|
!
|
|
INTEGER :: irgq(48), nsymq, irotmq, nirr, nmodes
|
|
! selects the operations of the small group
|
|
! the number of symmetry of the small group
|
|
! selects the symmetry sending q <-> -q+G
|
|
! number of irreducible representations contained in the dynamical matrix
|
|
! number of modes
|
|
! number of crystal sym.ops. for q=0
|
|
INTEGER, ALLOCATABLE, TARGET :: npert(:) !3 * nat )
|
|
! the number of perturbations per IR
|
|
INTEGER :: npertx
|
|
! max number of perturbations per IR
|
|
REAL (DP), ALLOCATABLE :: rtau(:,:,:) !3, 48, nat)
|
|
! coordinates of direct translations
|
|
REAL (DP) :: gi(3,48), gimq(3)
|
|
! the possible G associated to each symmetry
|
|
! the G associated to the symmetry q<->-q+G
|
|
COMPLEX (DP), POINTER :: &
|
|
u(:,:), &! 3 * nat, 3 * nat),
|
|
t(:,:,:,:), &! npertx, npertx, 48,3 * nat),
|
|
tmq(:,:,:) ! npertx, npertx, 3 * nat)
|
|
! the transformation modes patterns
|
|
! the mode for deltarho
|
|
! the symmetry in the base of the pattern
|
|
! the symmetry q<->-q in the base of the pa
|
|
LOGICAL :: &
|
|
minus_q, & ! if .TRUE. there is the symmetry sending q<->-q
|
|
invsymq ! if .TRUE. the small group of q has inversion
|
|
|
|
CHARACTER(15), ALLOCATABLE :: name_rap_mode(:) ! symmetry type of each mode
|
|
INTEGER, ALLOCATABLE :: num_rap_mode(:) ! number of the representation for
|
|
! each mode
|
|
!
|
|
END MODULE modes
|
|
!
|
|
!
|
|
MODULE dynmat
|
|
USE kinds, ONLY : DP
|
|
!
|
|
! ... The dynamical matrix
|
|
!
|
|
SAVE
|
|
!
|
|
COMPLEX (DP), ALLOCATABLE :: &
|
|
dyn00(:,:), &! 3 * nat, 3 * nat),
|
|
dyn(:,:), &! 3 * nat, 3 * nat)
|
|
dyn_rec(:,:) ! 3 * nat, 3 * nat)
|
|
! the initial dynamical matrix
|
|
! the dynamical matrix
|
|
! the contribution of each representation to the dynamical matrix
|
|
REAL (DP), ALLOCATABLE :: &
|
|
w2(:) ! 3 * nat)
|
|
! omega^2
|
|
!
|
|
END MODULE dynmat
|
|
!
|
|
!
|
|
MODULE qpoint
|
|
USE kinds, ONLY : DP
|
|
USE parameters, ONLY : npk
|
|
!
|
|
! ... The q point
|
|
!
|
|
SAVE
|
|
!
|
|
INTEGER, POINTER :: igkq(:) ! npwx)
|
|
! correspondence k+q+G <-> G
|
|
INTEGER :: nksq, npwq
|
|
! the real number of k points
|
|
! the number of plane waves for q
|
|
INTEGER, ALLOCATABLE :: ikks(:), ikqs(:)
|
|
! the index of k point in the list of k
|
|
! the index of k+q point in the list of k
|
|
REAL (DP) :: xq(3)
|
|
! the coordinates of the q point
|
|
COMPLEX (DP), ALLOCATABLE :: eigqts(:) ! nat)
|
|
! the phases associated to the q
|
|
!
|
|
END MODULE qpoint
|
|
!
|
|
!
|
|
MODULE eqv
|
|
USE kinds, ONLY : DP
|
|
!
|
|
! ... The wavefunctions at point k+q
|
|
!
|
|
SAVE
|
|
!
|
|
COMPLEX (DP), POINTER :: evq(:,:)
|
|
!
|
|
! ... The variable describing the linear response problem
|
|
!
|
|
COMPLEX (DP), ALLOCATABLE :: dvpsi(:,:), dpsi(:,:), drhoscfs (:,:,:)
|
|
! the product of dV psi
|
|
! the change of the wavefunctions
|
|
REAL (DP), ALLOCATABLE :: dmuxc(:,:,:) ! nrxx, nspin, nspin),
|
|
REAL (DP), ALLOCATABLE, TARGET :: vlocq(:,:) ! ngm, ntyp)
|
|
! the derivative of the xc potential
|
|
! the local potential at q+G
|
|
REAL (DP), ALLOCATABLE :: eprec(:,:) ! needed for preconditioning
|
|
!
|
|
END MODULE eqv
|
|
!
|
|
!
|
|
MODULE efield_mod
|
|
USE kinds, ONLY : DP
|
|
!
|
|
! ... the variables for the electric field perturbation
|
|
!
|
|
SAVE
|
|
!
|
|
REAL (DP) :: epsilon (3, 3)
|
|
REAL (DP), ALLOCATABLE :: &
|
|
zstareu(:,:,:), &! 3, 3, nat),
|
|
zstarue(:,:,:) ! 3, nat, 3)
|
|
! the dielectric constant
|
|
! the effective charges Z(E,Us) (E=scf,Us=bare)
|
|
! the effective charges Z(Us,E) (Us=scf,E=bare)
|
|
COMPLEX (DP), ALLOCATABLE :: &
|
|
zstareu0(:,:), &! 3, 3 * nat),
|
|
zstarue0(:,:), &! 3 * nat, 3)
|
|
zstarue0_rec(:,:) ! 3 * nat, 3)
|
|
! the effective charges
|
|
!
|
|
END MODULE efield_mod
|
|
!
|
|
!
|
|
MODULE nlcc_ph
|
|
USE kinds, ONLY : DP
|
|
!
|
|
! ... The variables needed for non-linear core correction
|
|
!
|
|
SAVE
|
|
!
|
|
COMPLEX (DP), ALLOCATABLE, TARGET :: drc(:,:) ! ngm, ntyp)
|
|
! contain the rhoc (without structure fac) for all atomic types
|
|
LOGICAL :: nlcc_any
|
|
! .T. if any atom-type has nlcc
|
|
!
|
|
END MODULE nlcc_ph
|
|
!
|
|
!
|
|
MODULE gc_ph
|
|
USE kinds, ONLY : DP
|
|
!
|
|
! ... The variables needed for gradient corrected calculations
|
|
!
|
|
SAVE
|
|
!
|
|
REAL (DP), ALLOCATABLE :: &
|
|
grho(:,:,:), &! 3, nrxx, nspin),
|
|
gmag(:,:,:), &! 3, nrxx, nspin),
|
|
vsgga(:), &! nrxx
|
|
segni(:), &! nrxx
|
|
dvxc_rr(:,:,:), &! nrxx, nspin, nspin), &
|
|
dvxc_sr(:,:,:), &! nrxx, nspin, nspin),
|
|
dvxc_ss(:,:,:), &! nrxx, nspin, nspin), &
|
|
dvxc_s(:,:,:) ! nrxx, nspin, nspin)
|
|
!
|
|
! in the noncollinear case gmag contains the gradient of the magnetization
|
|
! grho the gradient of rho+ and of rho-, the eigenvalues of the spin density
|
|
! vsgga= 0.5* (V_up-V_down) to be used in the calculation of the change
|
|
! of the exchange and correlation magnetic field.
|
|
! gradient of the unpert. density
|
|
!
|
|
! derivatives of the E_xc functiona
|
|
! r=rho and s=|grad(rho)|
|
|
!
|
|
END MODULE gc_ph
|
|
!
|
|
!
|
|
MODULE phus
|
|
USE kinds, ONLY : DP
|
|
USE becmod, ONLY : bec_type
|
|
!
|
|
! ... These are additional variables needed for the linear response
|
|
! ... program with the US pseudopotentials
|
|
!
|
|
SAVE
|
|
!
|
|
REAL (DP), ALLOCATABLE :: &
|
|
alphasum(:,:,:,:), &! nhm*(nhm+1)/2,3,nat,nspin)
|
|
! used to compute modes
|
|
dpqq(:,:,:,:) ! (nhm, nhm, 3, ntyp)
|
|
! alphasum contains \sum_i <psi_i| d/du (|\beta_n><beta_m|) | psi_i> + (m-n)
|
|
! dipole moment of each Q
|
|
COMPLEX (DP), ALLOCATABLE :: &
|
|
int1(:,:,:,:,:), &! nhm, nhm, 3, nat, nspin),&
|
|
int2(:,:,:,:,:), &! nhm, nhm, 3,nat, nat),&
|
|
int3(:,:,:,:,:), &! nhm, nhm, npert, nat, nspin),&
|
|
int3_paw(:,:,:,:,:), &! nhm, nhm, npert, nat, nspin),&
|
|
int4(:,:,:,:,:), &! nhm*(nhm+1)/2, 3, 3, nat, nspin),&
|
|
int5(:,:,:,:,:), &! nhm*(nhm+1)/2, 3, 3, nat, nat),&
|
|
int1_nc(:,:,:,:,:), &! nhm, nhm, 3, nat, nspin),&
|
|
int2_so(:,:,:,:,:,:), &! nhm, nhm, 3, nat,nat,nspin),&
|
|
int3_nc(:,:,:,:,:), &! nhm, nhm, npert, nat, nspin),&
|
|
int4_nc(:,:,:,:,:,:), &! nhm, nhm, 3, 3, nat, nspin),&
|
|
int5_so(:,:,:,:,:,:,:), &! nhm*(nhm+1)/2, 3, 3, nat, nat, nspin),&
|
|
!
|
|
! These variables contains the five integrals defined in PRB 64, 35118 (2001)
|
|
! int1 -> \int V_eff d/du (Q) d^3r
|
|
! int2 -> \int d/du (V_loc) Q d^3r
|
|
! int3 -> \int d\du (V_Hxc) Q d^3r
|
|
! int4 -> \int V_eff d^2/dudu (Q) d^3r
|
|
! int5 -> \int d/du (V_loc) d/du (Q) d^3r
|
|
!
|
|
! int3_paw contains d/du (D^1-\tilde D^1)
|
|
!
|
|
!
|
|
becsum_nc(:,:,:,:), &! nhm*(nhm+1)/2,nat,npol,npol)
|
|
becsumort(:,:,:,:), &! nhm*(nhm+1)/2,nat,nspin,3*nat)
|
|
alphasum_nc(:,:,:,:,:), &! nhm*(nhm+1)/2,3,nat,npol,npol)
|
|
dpqq_so(:,:,:,:,:) ! nhm, nhm, nspin, 3, ntyp
|
|
!
|
|
! becsum contains \sum_i <\psi_i | \beta_n><\beta_m| \psi_i > + (m-n)
|
|
! besumort contains alphasum+\sum_i <\psi_i | \beta_n><\beta_m| \delta \psi_i >
|
|
! dpqq_so dipole moment of each Q multiplied by the fcoef factors
|
|
!
|
|
type (bec_type), ALLOCATABLE, TARGET :: &
|
|
becp1(:) ! (nksq); (nkbtot, nbnd)
|
|
!
|
|
! becp1 contains < beta_n | \psi_i >
|
|
!
|
|
type (bec_type), ALLOCATABLE, TARGET :: &
|
|
alphap(:,:) ! nkbtot, nbnd, 3, nksq)
|
|
!
|
|
! alphap contains < d\du (\beta_n) | psi_i>
|
|
!
|
|
END MODULE phus
|
|
!
|
|
!
|
|
MODULE partial
|
|
USE kinds, ONLY : DP
|
|
!
|
|
! ... the variables needed for partial computation of dynamical matrix
|
|
!
|
|
SAVE
|
|
!
|
|
INTEGER, ALLOCATABLE :: &
|
|
comp_irr(:), &! (3*nat) : 1 if this irr.rep. has to be computed
|
|
done_irr(:), &! (3*nat) : 1 if this irr.rep. has been done
|
|
atomo(:) ! (nat) : list of the atoms that moves
|
|
INTEGER :: nat_todo, & ! number of atoms to compute
|
|
nat_todo_input ! nat_todo given in input
|
|
LOGICAL :: all_comp ! if .TRUE. all representation have been computed
|
|
!
|
|
END MODULE partial
|
|
!
|
|
MODULE gamma_gamma
|
|
INTEGER, ALLOCATABLE :: &
|
|
has_equivalent(:), & ! 0 if the atom has to be calculated
|
|
with_symmetry(:), & ! calculated by symmetry
|
|
n_equiv_atoms(:), & ! number of equivalent atoms
|
|
equiv_atoms(:,:) ! which atoms are equivalent
|
|
|
|
INTEGER :: n_diff_sites, & ! Number of different sites
|
|
nasr ! atom calculated with asr
|
|
!
|
|
LOGICAL :: asr ! if true apply the asr
|
|
|
|
END MODULE gamma_gamma
|
|
!
|
|
MODULE control_ph
|
|
USE kinds, ONLY : DP
|
|
USE parameters, ONLY: npk
|
|
!
|
|
! ... the variable controlling the phonon run
|
|
!
|
|
SAVE
|
|
!
|
|
INTEGER, PARAMETER :: maxter = 100 ! maximum number of iterations
|
|
INTEGER :: niter_ph, & ! maximum number of iterations (read from input)
|
|
nmix_ph, & ! mixing type
|
|
nbnd_occ(npk), & ! occupated bands in metals
|
|
start_irr, & ! initial representation
|
|
last_irr, & ! last representation of this run
|
|
current_iq, & ! current q point
|
|
start_q, last_q ! initial q in the list, last_q in the list
|
|
REAL(DP) :: tr2_ph ! threshold for phonon calculation
|
|
REAL(DP) :: alpha_mix(maxter), & ! the mixing parameter
|
|
time_now, & ! CPU time up to now
|
|
alpha_pv ! the alpha value for shifting the bands
|
|
CHARACTER(LEN=10) :: where_rec='no_recover'! where the ph run recovered
|
|
CHARACTER(LEN=12) :: electron_phonon
|
|
CHARACTER(LEN=256) :: flmixdpot, tmp_dir_ph, tmp_dir_phq
|
|
INTEGER :: rec_code, &! code for recover
|
|
rec_code_read=-1000 ! code for recover. Not changed during the run
|
|
LOGICAL :: lgamma, &! if .TRUE. this is a q=0 computation
|
|
lgamma_gamma,&! if .TRUE. this is a q=0 computation with k=0 only
|
|
convt, &! if .TRUE. the phonon has converged
|
|
epsil, &! if .TRUE. computes dielec. const and eff. charges
|
|
done_epsil=.FALSE., &! .TRUE. when diel. constant is available
|
|
trans, &! if .TRUE. computes phonons
|
|
zue, &! if .TRUE. computes eff. charges as induced polarization
|
|
done_zue=.FALSE., &! .TRUE. when the eff. charges are available
|
|
zeu, &! if .TRUE. computes eff. charges as induced forces
|
|
done_zeu=.FALSE., &! .TRUE. when the eff. charges are available
|
|
recover, &! if .TRUE. the run restarts
|
|
ext_restart, &! if .TRUE. there is a restart file
|
|
ext_recover, &! if .TRUE. there is a recover file
|
|
lrpa, &! if .TRUE. calculates the RPA dielectric constant
|
|
lnoloc, &! if .TRUE. calculates the dielectric constant
|
|
! neglecting local field effects
|
|
search_sym=.TRUE., &! if .TRUE. search the mode symmetry
|
|
lnscf, &! if .TRUE. the run makes first a nscf calculation
|
|
ldisp, &! if .TRUE. the run calculates full phonon dispersion
|
|
reduce_io, &! if .TRUE. reduces needed I/O
|
|
done_bands, &! if .TRUE. the bands have been calculated
|
|
bands_computed=.FALSE., & ! if .TRUE. the bands were computed
|
|
! in this run
|
|
nogg, &! if .TRUE. gamma_gamma tricks are disabled
|
|
u_from_file=.FALSE., & ! if true the u are on file
|
|
recover_read=.FALSE., & ! if true the recover data have been read
|
|
ldiag=.FALSE., & ! if true force the diagonalization
|
|
lqdir=.FALSE., & ! if true each q writes in its directory
|
|
xmldyn=.FALSE., & ! if true the dynamical matrix is in xml form
|
|
all_done, & ! if .TRUE. all representations have been done
|
|
newgrid=.FALSE. ! if .TRUE. use new k-point grid nk1,nk2,nk3
|
|
!
|
|
END MODULE control_ph
|
|
!
|
|
!
|
|
MODULE freq_ph
|
|
!
|
|
USE kinds, ONLY : DP
|
|
!
|
|
SAVE
|
|
!
|
|
! ... the variables for computing frequency dependent dielectric constant
|
|
!
|
|
LOGICAL :: fpol ! if .TRUE. dynamic dielectric constant is computed
|
|
!
|
|
INTEGER, PARAMETER :: nfsmax=50 ! # of maximum frequencies
|
|
INTEGER :: nfs ! # of frequencies
|
|
!
|
|
REAL (KIND=DP) :: fiu(nfsmax) ! values of frequency
|
|
!
|
|
END MODULE freq_ph
|
|
!
|
|
!
|
|
MODULE units_ph
|
|
!
|
|
! ... the units of the files and the record lengths
|
|
!
|
|
SAVE
|
|
!
|
|
INTEGER :: &
|
|
iuwfc, & ! iunit with the wavefunctions
|
|
lrwfc, & ! the length of wavefunction record
|
|
iuvkb, & ! unit with vkb
|
|
iubar, & ! unit with the part DV_{bare}
|
|
lrbar, & ! length of the DV_{bare}
|
|
iuebar, & ! unit with the part DV_{bare} for the electric field
|
|
lrebar, & ! length of the DV_{bare} fro the electric field
|
|
iudwf, & ! unit with D psi
|
|
iupsir, & ! unit with evc in real space
|
|
lrdwf, & ! length of D psi record
|
|
iudrhous, lrdrhous, &
|
|
iudyn, & ! the unit for the dynamical matrix
|
|
iupdyn, & ! the unit for the partial dynamical matrix
|
|
iunrec, & ! the unit with the recover data
|
|
iudvscf, & ! the unit where the delta Vscf is written
|
|
iudrho, & ! the unit where the delta rho is written
|
|
lrdrho, & ! the length of the deltarho files
|
|
iucom, & ! the unit of the bare commutator in US case
|
|
lrcom, & ! the length of the bare commutator in US case
|
|
iudvkb3, lrdvkb3, &
|
|
iuint3paw, & ! the unit of the int3_paw coefficients
|
|
lint3paw ! the lenght of the int3_paw coefficients
|
|
! the unit with the products
|
|
! the length of the products
|
|
|
|
logical, ALLOCATABLE :: this_dvkb3_is_on_file(:), &
|
|
this_pcxpsi_is_on_file(:,:)
|
|
!
|
|
END MODULE units_ph
|
|
!
|
|
!
|
|
MODULE output
|
|
!
|
|
! ... the name of the files
|
|
!
|
|
SAVE
|
|
!
|
|
CHARACTER (LEN=256) :: fildyn, fildvscf, fildrho
|
|
! output file for the dynamical matrix
|
|
! output file for deltavscf
|
|
! output file for deltarho
|
|
!
|
|
END MODULE output
|
|
!
|
|
!
|
|
MODULE disp
|
|
!
|
|
USE kinds, ONLY: DP
|
|
!
|
|
SAVE
|
|
!
|
|
INTEGER, PARAMETER :: nqmax = 1000
|
|
!
|
|
INTEGER :: nq1, nq2, nq3 ! number of q-points in each direction
|
|
INTEGER :: nqs ! number of q points to be calculated
|
|
REAL(DP), ALLOCATABLE :: x_q(:,:) ! coordinates of the q points
|
|
INTEGER, ALLOCATABLE :: &
|
|
done_iq(:), &! if 1 this q point has been already calculated
|
|
comp_iq(:), &! if 1 this q point has to be calculated
|
|
rep_iq(:), &! number of irreducible representation per q point
|
|
done_rep_iq(:,:),&! which representation have been already done in each q
|
|
nsymq_iq(:), &! dimension of the small group of q
|
|
comp_irr_iq(:,:),&! for each q, comp_irr. Used for image parallelization
|
|
npert_iq(:,:) ! for each q, the number of perturbation of each irr
|
|
!
|
|
END MODULE disp
|
|
!
|
|
!
|
|
MODULE phcom
|
|
USE modes
|
|
USE dynmat
|
|
USE qpoint
|
|
USE eqv
|
|
USE efield_mod
|
|
USE nlcc_ph
|
|
USE gc_ph
|
|
USE phus
|
|
USE partial
|
|
USE control_ph
|
|
USE freq_ph
|
|
USE units_ph
|
|
USE output
|
|
USE gamma_gamma
|
|
USE disp
|
|
END MODULE phcom
|