MsSpec-DFM/New_libraries/DFM_library/DAMPING_LIBRARY/mean_free_path.f90

168 lines
5.6 KiB
Fortran
Raw Normal View History

2022-02-02 16:19:10 +01:00
!=======================================================================
!
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