82 lines
2.1 KiB
Fortran
82 lines
2.1 KiB
Fortran
|
!
|
||
|
!=======================================================================
|
||
|
!
|
||
|
MODULE PLASMON_DISP_EXACT
|
||
|
!
|
||
|
! This module computes the exact plasmon dispersion
|
||
|
!
|
||
|
USE ACCURACY_REAL
|
||
|
!
|
||
|
CONTAINS
|
||
|
!
|
||
|
!=======================================================================
|
||
|
!
|
||
|
SUBROUTINE PLASMON_DISP_EX(IS,IC,YB,ENE_P_Q)
|
||
|
!
|
||
|
! This subroutine computes exact plasmon dispersion from the
|
||
|
! dielectric function
|
||
|
!
|
||
|
!
|
||
|
! Output variables :
|
||
|
!
|
||
|
! * YB : q / k_F
|
||
|
! * ENE_P_Q : plasmon energy at q in SI
|
||
|
!
|
||
|
!
|
||
|
! Author : D. Sébilleau
|
||
|
!
|
||
|
! Last modified : 16 Dec 2020
|
||
|
!
|
||
|
!
|
||
|
USE Q_GRID
|
||
|
!
|
||
|
USE REAL_NUMBERS, ONLY : ZERO
|
||
|
USE FERMI_SI, ONLY : EF_SI
|
||
|
!
|
||
|
USE CALCULATORS_3
|
||
|
USE RE_EPS_0_TREATMENT
|
||
|
!
|
||
|
IMPLICIT NONE
|
||
|
!
|
||
|
INTEGER, PARAMETER :: N_ZERO = 10000 ! max number of zeros
|
||
|
!
|
||
|
INTEGER, INTENT(OUT) :: IS,IC
|
||
|
!
|
||
|
INTEGER :: IQ
|
||
|
INTEGER :: NB
|
||
|
INTEGER :: IB
|
||
|
!
|
||
|
REAL (WP), INTENT(OUT) :: ENE_P_Q(N_ZERO)
|
||
|
REAL (WP), INTENT(OUT) :: YB(N_ZERO)
|
||
|
!
|
||
|
REAL (WP) :: Y,X
|
||
|
REAL (WP) :: ZERO_B(N_ZERO)
|
||
|
REAL (WP) :: QS,QC
|
||
|
!
|
||
|
REAL (WP) :: FLOAT
|
||
|
!
|
||
|
! Initialisation of ENE_P_Q
|
||
|
!
|
||
|
DO IB = 1,N_ZERO !
|
||
|
ENE_P_Q(IB) = ZERO !
|
||
|
END DO !
|
||
|
!
|
||
|
! Extract the upper branch of Re[ eps(q,omega) ] = 0
|
||
|
! which is contained in unit IO_ZE
|
||
|
!
|
||
|
CALL SELECT_BRANCH(2,NB,YB,ZERO_B) !
|
||
|
!
|
||
|
! Get the q-bounds
|
||
|
!
|
||
|
CALL COMPUTE_QBOUNDS_3D(NB,YB,ZERO_B,IS,IC,QS,QC) !
|
||
|
!
|
||
|
! Storing the plasmon energy in SI
|
||
|
!
|
||
|
DO IB = IS,IC !
|
||
|
ENE_P_Q(IB) = ZERO_B(IB) * EF_SI !
|
||
|
END DO !
|
||
|
!
|
||
|
END SUBROUTINE PLASMON_DISP_EX
|
||
|
!
|
||
|
END MODULE PLASMON_DISP_EXACT
|