168 lines
5.6 KiB
Fortran
168 lines
5.6 KiB
Fortran
!=======================================================================
|
|
!
|
|
MODULE IMFP
|
|
!
|
|
USE ACCURACY_REAL
|
|
!
|
|
CONTAINS
|
|
!
|
|
!
|
|
!=======================================================================
|
|
!
|
|
SUBROUTINE MEAN_FREE_PATH(EK,MFP)
|
|
!
|
|
! This subroutine computes the electron inelastic mean free path
|
|
!
|
|
!
|
|
! Reference: (1) D. R. Penn, Phys. Rev. B 13, 5248-5254 (1976)
|
|
! (2) B. Da, H. Shinotsuka, H. Yoshikawa, Z.J. Ding and
|
|
! S. Tanuma, Phys. Rev. Lett. 113, 063201 (2014)
|
|
!
|
|
!
|
|
! Input parameters:
|
|
!
|
|
! * EK : electron kinetic energy (in SI)
|
|
!
|
|
!
|
|
! Output variables :
|
|
!
|
|
! * IMPF : inelastic mean free path (in SI)
|
|
!
|
|
!
|
|
! Note: eps(q,omega) is in fact stored as a function of Y = q / k_F
|
|
! and V = hbar omega / E_F
|
|
!
|
|
! Therefore, in order to be consistent, the integrations have
|
|
! to be performed in Y and V
|
|
!
|
|
!
|
|
!
|
|
! Author : D. Sébilleau
|
|
!
|
|
! Last modified : 30 Apr 2021
|
|
!
|
|
!
|
|
USE DIMENSION_CODE, ONLY : NSIZE
|
|
USE MATERIAL_PROP, ONLY : RS
|
|
USE EXT_FIELDS, ONLY : T
|
|
!
|
|
USE Q_GRID, ONLY : Q_MIN
|
|
USE E_GRID, ONLY : E_MIN
|
|
!
|
|
USE REAL_NUMBERS, ONLY : ZERO,ONE,TWO,HALF,FOURTH,SMALL,TTINY,INF
|
|
USE PI_ETC, ONLY : PI
|
|
USE FERMI_SI, ONLY : EF_SI,KF_SI
|
|
USE CONSTANTS_P1, ONLY : BOHR,H_BAR,M_E
|
|
USE ENE_CHANGE, ONLY : EV
|
|
!
|
|
USE DF_VALUES, ONLY : D_FUNC
|
|
!
|
|
USE INTEGRATION, ONLY : INTEGR_L
|
|
USE INTEGRATION4
|
|
USE DFUNCL_STAN_DYNAMIC
|
|
!
|
|
IMPLICIT NONE
|
|
!
|
|
INTEGER :: IQ,IE
|
|
INTEGER :: ID
|
|
INTEGER :: I_ZQ,I_ZE
|
|
!
|
|
INTEGER, PARAMETER :: NE_MAX = 2000 ! max. number of points in e-grid
|
|
INTEGER, PARAMETER :: NQ_MAX = 1000 ! max. number of points in q-grid
|
|
!
|
|
REAL (WP), INTENT(IN) :: EK
|
|
REAL (WP), INTENT(OUT):: MFP
|
|
REAL (WP) :: MIN_E,MAX_E,MIN_Q,MAX_Q
|
|
REAL (WP) :: STEP_E,STEP_Q
|
|
REAL (WP) :: E,Q
|
|
REAL (WP) :: X,V,Z,EKF,KOEF
|
|
REAL (WP) :: EPSR,EPSI
|
|
REAL (WP) :: ELF(NSIZE),IN(NSIZE)
|
|
REAL (WP) :: A,B
|
|
!
|
|
REAL (WP) :: FLOAT,SQRT
|
|
!
|
|
EKF = EK / EF_SI ! in units of E_F
|
|
!
|
|
KOEF = EKF * PI * BOHR / RS !
|
|
!
|
|
MIN_E = E_MIN ! in units of E_F
|
|
MAX_E = EKF - ONE ! in units of E_F
|
|
STEP_E = (MAX_E - MIN_E) / FLOAT(NE_MAX - 1) ! in units of E_F
|
|
!
|
|
! Constructing the e-grid
|
|
!
|
|
DO IE = 1, NE_MAX ! E_F
|
|
!
|
|
E = MIN_E + FLOAT(IE - 1) * STEP_E ! in units of
|
|
V = E ! hbar * omega / E_F
|
|
!
|
|
! Constructing the q-grid
|
|
!
|
|
MIN_Q = MAX( Q_MIN, SQRT(EKF) - SQRT(EKF - V) ) ! for Z to be defined
|
|
MAX_Q = SQRT(EKF) + SQRT(EKF - V) ! in units of k_F
|
|
STEP_Q = (MAX_Q - MIN_Q) / FLOAT(NQ_MAX - 1) ! in units of k_F
|
|
!
|
|
I_ZQ = 0 ! switch for integrand = 0
|
|
!
|
|
DO IQ = 1, NQ_MAX !
|
|
!
|
|
Q = MIN_Q + FLOAT(IQ - 1) * STEP_Q ! in units of k_F
|
|
!
|
|
X = HALF * Q ! (q / 2k_F)
|
|
Z = FOURTH * V / (X * X) ! omega / omega_q
|
|
!
|
|
! Computing the dielectric function epsilon(q,E)
|
|
!
|
|
CALL DFUNCL_DYNAMIC(X,Z,RS,T,D_FUNC,IE,EPSR,EPSI) !
|
|
!
|
|
! Computing the loss function ELF = Im [ -1 / epsilon(q,E) ]
|
|
!
|
|
ELF(IQ) = EPSI / ( (EPSR * EPSR + EPSI * EPSI) * Q) ! integrand function
|
|
!
|
|
! IF(ELF(IQ) /= ZERO) I_ZQ = IQ !
|
|
IF(ELF(IQ) == ZERO) ELF(IQ) = SMALL !
|
|
!
|
|
END DO ! end of q-grid
|
|
!
|
|
! IF(I_ZQ > 0) THEN !
|
|
!
|
|
! Performing the q-integration
|
|
!
|
|
ID = 1 ! EPSI = 0 at origin
|
|
CALL INTEGR_L(ELF,STEP_Q,NSIZE,NQ_MAX,A,ID) !
|
|
!
|
|
! ELSE ! ELF always = 0
|
|
!
|
|
! A = TTINY !
|
|
!
|
|
! END IF !
|
|
!
|
|
! Constructing the e-integrand
|
|
!
|
|
IN(IE) = A !
|
|
!
|
|
! IF(A /= ZERO) I_ZE = IE !
|
|
IF(IN(IE) == ZERO) IN(IE) = SMALL !
|
|
!
|
|
END DO ! end of e-grid
|
|
!
|
|
! IF(I_ZE > 0) THEN !
|
|
!
|
|
! Performing the e-integration
|
|
!
|
|
ID = 1 !
|
|
CALL INTEGR_L(IN,STEP_E,NSIZE,NE_MAX,B,ID) !
|
|
!
|
|
! ELSE ! IN always = 0
|
|
!
|
|
! B = TTINY !
|
|
!
|
|
! END IF !
|
|
!
|
|
MFP = KOEF / B ! ref. (2) eq. (2)
|
|
!
|
|
END SUBROUTINE MEAN_FREE_PATH
|
|
!
|
|
END MODULE IMFP
|