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
|