MsSpec-DFM/New_libraries/DFM_library/PLASMON_LIBRARY/plasmon_dispersion.f90

2082 lines
74 KiB
Fortran

!
!=======================================================================
!
MODULE PLASMON_DISP_REAL
!
! This module computes analytical plasmon dispersion without damping
!
USE ACCURACY_REAL
!
CONTAINS
!
!=======================================================================
!
SUBROUTINE PLASMON_DISP_R(X,RS,T,PL_DISP,ENE_P_Q)
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * RS : dimensionless factor
! * T : temperature in SI
! * PL_DISP : method used to compute the dispersion
!
!
! Output variables :
!
! * ENE_P_Q : plasmon energy at q in J
!
!
! Author : D. Sébilleau
!
! Last modified : 26 Oct 2020
!
!
USE MATERIAL_PROP, ONLY : DMN
!
IMPLICIT NONE
!
CHARACTER (LEN = 7) :: PL_DISP
!
REAL (WP), INTENT(IN) :: X,RS,T
REAL (WP), INTENT(OUT) :: ENE_P_Q
!
IF(DMN == '3D') THEN !
CALL PLASMON_DISP_3D(X,RS,T,PL_DISP,ENE_P_Q) !
ELSE IF(DMN == '2D') THEN !
CALL PLASMON_DISP_2D(X,RS,T,PL_DISP,ENE_P_Q) !
ELSE IF(DMN == '1D') THEN !
CALL PLASMON_DISP_1D(X,RS,T,PL_DISP,ENE_P_Q) !
END IF !
!
END SUBROUTINE PLASMON_DISP_R
!
!=======================================================================
!
SUBROUTINE PLASMON_DISP_1D(X,RS,T,PL_DISP,ENE_P_Q)
!
! This subroutine computes the coefficients AR of the plasmon dispersion
! according to:
!
! ENE_Q^2 = AR(0) + AR(1)*Q + AR(2)*Q^2 + AR(3)*Q^3 +
! AR(4)*Q^4 + AR(5)*Q^5 + AR(6)*Q^6
!
! = ALPHA2 + BETA2 * Q^2 + GAMMA2 * Q^4 + DELTA^2 Q^6
!
! where Q = q/ k_F
!
! --> This is the real (q, hbar omega_q) case (no damping)
!
! Warnings: i) all input parameters are in SI units
! ii) in the literature, beta^2 and gamma^2 are given
! in atomic units (AU). Here, we work in SI.
! We recall:
!
! ENE : J --> energy
! Q : 1 / M --> wave vector
! V : M / S --> speed
! OMEGA : 1 / S --> angular momentum
! HBAR : J S --> Planck constant / 2 pi
!
! In order to obtain ENE_Q^2 in J^2, a dimension analysis
! shows that:
!
! BETA2_AU = COEF * V_F^2 --> BETA2_SI = HBAR^2 * BETA2_AU
! GAMMA2_AU = 1/4 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU / M^2
! GAMMA2_AU = COEF * V_F^4 / OMEGA_P^2 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU
!
! Alternatively, we can work in atomic units and then change
! from Hartrees to Joules. This is what is coded here.
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * T : temperature in SI
! * PL_DISP : method used to compute the dispersion (3D)
! PL_DISP = 'HYDRODY' hydrodynamic model
! PL_DISP = 'RPA_MOD' RPA model
!
!
! Output variables :
!
! * ENE_P_Q : plasmon energy at q in J
!
!
! Author : D. Sébilleau
!
! Last modified : 17 Nov 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO,TWO
USE CONSTANTS_P2, ONLY : HARTREE
USE FERMI_AU, ONLY : KF_AU
!
USE DISP_COEF_REAL
!
IMPLICIT NONE
!
CHARACTER (LEN = 7) :: PL_DISP
!
!
REAL (WP), INTENT(IN) :: X,RS,T
REAL (WP), INTENT(OUT) :: ENE_P_Q
!
REAL (WP) :: Q,Q2,Q3,Q4,Q5,Q6
REAL (WP) :: ENE2
!
REAL (WP) :: SQRT
!
INTEGER :: I
!
!
DO I = 0, 6 !
AR(I) = ZERO ! initialization
END DO !
!
Q = TWO * X * KF_AU ! q in AU
Q2 = Q * Q !
Q3 = Q2 * Q ! powers of q
Q4 = Q3 * Q !
Q5 = Q4 * Q !
Q6 = Q5 * Q !
!
IF(PL_DISP == 'HYDRODY') THEN !
CALL HYDRODY_DP_1D(RS,T,Q,AR) !
ELSE IF(PL_DISP == 'RPA_MOD') THEN !
CALL RPA_MOD_DP_1D(RS,T,Q,AR) !
END IF !
!
ENE2 = AR(0) + AR(1) * Q + AR(2) * Q2 + AR(3) * Q3 + & !energy^2 in AU
AR(4) * Q4 + AR(5) * Q5 + AR(6) * Q6 !
!
ENE_P_Q = SQRT(ENE2) ! plasmon energy at q in AU
!
! Change of units: AU --> SI
!
ENE_P_Q = ENE_P_Q * HARTREE !
!
END SUBROUTINE PLASMON_DISP_1D
!
!=======================================================================
!
SUBROUTINE PLASMON_DISP_2D(X,RS,T,PL_DISP,ENE_P_Q)
!
! This subroutine computes the coefficients AR of the plasmon dispersion
! according to:
!
! ENE_Q^2 = AR(0) + AR(1)*Q + AR(2)*Q^2 + AR(3)*Q^3 +
! AR(4)*Q^4 + AR(5)*Q^5 + AR(6)*Q^6
!
! = ALPHA2 + BETA2 * Q^2 + GAMMA2 * Q^4 + DELTA^2 Q^6
!
! where Q = q/ k_F
!
! --> This is the real (q, hbar omega_q) case (no damping)
!
! Warnings: i) all input parameters are in SI units
! ii) in the literature, beta^2 and gamma^2 are given
! in atomic units (AU). Here, we work in SI.
! We recall:
!
! ENE : J --> energy
! Q : 1 / M --> wave vector
! V : M / S --> speed
! OMEGA : 1 / S --> angular momentum
! HBAR : J S --> Planck constant / 2 pi
!
! In order to obtain ENE_Q^2 in J^2, a dimension analysis
! shows that:
!
! BETA2_AU = COEF * V_F^2 --> BETA2_SI = HBAR^2 * BETA2_AU
! GAMMA2_AU = 1/4 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU / M^2
! GAMMA2_AU = COEF * V_F^4 / OMEGA_P^2 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU
!
! Alternatively, we can work in atomic units and then change
! from Hartrees to Joules. This is what is coded here.
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : temperature in SI
! * PL_DISP : method used to compute the dispersion (3D)
! PL_DISP = 'HYDRODY' hydrodynamic model
! PL_DISP = 'RPA_MOD' RPA model
! PL_DISP = 'RAJAGOP' Rajagopal formula
!
!
! Output variables :
!
! * ENE_P_Q : plasmon energy at q in J
!
!
! Author : D. Sébilleau
!
! Last modified : 17 Nov 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO,TWO
USE CONSTANTS_P2, ONLY : HARTREE
USE FERMI_AU, ONLY : KF_AU
!
USE DISP_COEF_REAL
!
IMPLICIT NONE
!
CHARACTER (LEN = 7) :: PL_DISP
!
REAL (WP), INTENT(IN) :: X,RS,T
REAL (WP), INTENT(OUT) :: ENE_P_Q
!
REAL (WP) :: Q,Q2,Q3,Q4,Q5,Q6
REAL (WP) :: ENE2
!
REAL (WP) :: SQRT
!
INTEGER :: I
!
DO I = 0, 6 !
AR(I) = ZERO ! initialization
END DO !
!
Q = TWO * X * KF_AU ! q in AU
Q2 = Q * Q !
Q3 = Q2 * Q ! powers of q
Q4 = Q3 * Q ! in AU
Q5 = Q4 * Q !
Q6 = Q5 * Q !
!
IF(PL_DISP == 'HYDRODY') THEN !
CALL HYDRODY_DP_2D(X,RS,T,AR) !
ELSE IF(PL_DISP == 'RPA_MOD') THEN !
CALL RPA_MOD_DP_2D(X,RS,T,AR) !
ELSE IF(PL_DISP == 'RAJAGOP') THEN !
CALL RAJAGOP_DP_2D(X,RS,T,AR) !
END IF !
!
ENE2 = AR(0) + AR(1) * Q + AR(2) * Q2 + AR(3) * Q3 + & !energy^2 in AU
AR(4) * Q4 + AR(5) * Q5 + AR(6) * Q6 !
!
ENE_P_Q = SQRT(ENE2) ! plasmon energy at q in AU
!
! Change of units: AU --> SI
!
ENE_P_Q = ENE_P_Q * HARTREE !
!
END SUBROUTINE PLASMON_DISP_2D
!
!=======================================================================
!
SUBROUTINE PLASMON_DISP_3D(X,RS,T,PL_DISP,ENE_P_Q)
!
! This subroutine computes the coefficients AR of the plasmon dispersion
! according to:
!
! ENE_Q^2 = AR(0) + AR(1)*Q + AR(2)*Q^2 + AR(3)*Q^3 +
! AR(4)*Q^4 + AR(5)*Q^5 + AR(6)*Q^6
!
! = ALPHA2 + BETA2 * Q^2 + GAMMA2 * Q^4 + DELTA^2 Q^6 (1)
!
! or
!
! ENE_Q = omega_p + 2 alpha omega_F q^2 / k_F^2 (2)
!
! where Q = q/ k_F
!
! --> This is the real (q, hbar omega_q) case (no damping)
!
! Warnings: i) all input parameters are in SI units
! ii) in the literature, beta^2 and gamma^2 are given
! in atomic units (AU). Here, we work in SI.
! We recall:
!
! ENE : J --> energy
! Q : 1 / M --> wave vector
! V : M / S --> speed
! OMEGA : 1 / S --> angular momentum
! HBAR : J S --> Planck constant / 2 pi
!
! In order to obtain ENE_Q^2 in J^2, a dimension analysis
! shows that:
!
! BETA2_AU = COEF * V_F^2 --> BETA2_SI = HBAR^2 * BETA2_AU
! GAMMA2_AU = 1/4 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU / M^2
! GAMMA2_AU = COEF * V_F^4 / OMEGA_P^2 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU
!
! Alternatively, we can work in atomic units and then change
! from Hartrees to Joules. This is what is coded here.
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : temperature in SI
! * PL_DISP : method used to compute the dispersion (3D)
! PL_DISP = 'ELASTIC' elastic model
! PL_DISP = 'GOA_MOD' Gorobchenko model
! PL_DISP = 'HER_APP' Hertel-Appel model <-- temperature-dependent
! PL_DISP = 'HUBBARD' Hubbard model
! PL_DISP = 'HYDRODY' hydrodynamic model
! PL_DISP = 'SGBBN_M' SGBBN model
! PL_DISP = 'RP1_MOD' RPA model up to q^2
! PL_DISP = 'RP2_MOD' RPA model up to q^4
! PL_DISP = 'AL0_MOD' gamma_0 limit
! PL_DISP = 'ALI_MOD' gamma_inf limit
! PL_DISP = 'NOP_MOD' Nozières-Pines model
! PL_DISP = 'UTI_MOD' Utsumi-Ichimaru model
! PL_DISP = 'TWA_MOD' Toigo-Woodruff model
! PL_DISP = 'SUM_RU2' f-sum rule sum_rule
! PL_DISP = 'SUM_RU3' 3rd-frequency sum_rule
!
! from Hartrees to Joules. This is what is coded here.
!
! Intermediate parameters:
!
! * I_SI : switch for unit of energy
! I_SI = 0 --> in AU unit
! I_SI = 1 --> in SI unit
! * I_SQ : switch for computation of E or E^2
! I_SQ = 0 --> energy computed
! I_SQ = 1 --> energy^2 computed
! * I_FO : switch for formula used to compute energy
! I_FO = 1 --> formula (1)
! I_FO = 2 --> formula (2)
!
!
! Output variables :
!
! * ENE_P_Q : plasmon energy at q in J
!
!
! Author : D. Sébilleau
!
! Last modified : 7 Dec 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO,TWO,THREE
USE CONSTANTS_P2, ONLY : HARTREE
USE FERMI_AU, ONLY : KF_AU
USE LF_VALUES, ONLY : GQ_TYPE,IQ_TYPE
USE SF_VALUES, ONLY : SQ_TYPE
USE PLASMON_ENE_SI
!
USE DISP_COEF_REAL
!
USE OUT_VALUES_3, ONLY : I_ZE
!
IMPLICIT NONE
!
CHARACTER (LEN = 7) :: PL_DISP
!
REAL (WP), INTENT(IN) :: X,RS,T
REAL (WP), INTENT(OUT) :: ENE_P_Q
!
REAL (WP) :: Q,Q2,Q3,Q4,Q5,Q6
REAL (WP) :: ENE2,EN_P,C1,C2
!
REAL (WP) :: SQRT
!
INTEGER :: CHANGE,I
INTEGER :: I_SI,I_SQ,I_FO
!
C1 = THREE / 32.0E0_WP ! coefficient for 'GOA_MOD'
CHANGE = 0 ! set to 1 only for 'GOA_MOD'
!
I_SI = 0 ! switch for energy computed in SI
I_SQ = 0 ! omega(q) computed [ not omega^2(q) ]
I_FO = 1 ! formula (1) used to compute energy
!
Q = TWO * X * KF_AU ! q in AU
Q2 = Q * Q !
Q3 = Q2 * Q ! powers of q
Q4 = Q3 * Q !
Q5 = Q4 * Q !
Q6 = Q5 * Q !
!
! Computing the plasmon energy in atomic units
!
EN_P = ENE_P_SI / HARTREE ! plasmon energy in AU
!
IF(PL_DISP == 'GOA_MOD') THEN !
PL_DISP = 'RP1_MOD' !
CHANGE = 1 !
END IF !
!
DO I = 0, 6 !
AR(I) = ZERO ! initialization
END DO !
!
IF(PL_DISP == 'ELASTIC') THEN !
CALL ELASTIC_DP_3D(RS,T,AR) !
I_SQ = 1 !
ELSE IF(PL_DISP == ' EXACT') THEN !
I_ZE = 1 ! post-processing calculation
ELSE IF(PL_DISP == 'HER_APP') THEN !
CALL HER_APP_DP_3D(RS,T,AR) !
I_SQ = 1 !
ELSE IF(PL_DISP == 'HUBBARD') THEN !
CALL HUBBARD_DP_3D(RS,T,AR) !
I_SQ = 1 !
ELSE IF(PL_DISP == 'HYDRODY') THEN !
CALL HYDRODY_DP_3D(RS,T,AR) !
I_SQ = 1 !
ELSE IF(PL_DISP == 'RP2_MOD') THEN !
CALL RP2_MOD_DP_3D(RS,T,AR) !
I_SQ = 1 !
ELSE IF(PL_DISP == 'SGBBN_M') THEN !
CALL SGBBN_M_DP_3D(RS,T,AR) !
I_SQ = 1 !
ELSE IF(PL_DISP == 'SUM_RU2') THEN !
CALL SUMRULE1_DP_3D(X,ENE2) !
I_SQ = 1 !
I_SI = 1 !
I_FO = 2 !
ELSE IF(PL_DISP == 'SUM_RU3') THEN !
CALL SUMRULE3_DP_3D(X,ENE2) !
I_SQ = 1 !
I_SI = 1 !
I_FO = 2 !
ELSE !
CALL PLASMON_DISP_3D_2(X,RS,T,PL_DISP,ENE_P_Q) !
I_SI = 1 !
I_FO = 2 !
END IF !
!
IF(I_FO == 1) THEN !
ENE2 = AR(0) + AR(1) * Q + AR(2) * Q2 + AR(3) * Q3 + & !energy^2 in AU
AR(4) * Q4 + AR(5) * Q5 + AR(6) * Q6 !
END IF !
!
IF(I_SQ == 1) THEN !
ENE_P_Q = SQRT(ENE2) !
END IF !
!
IF(CHANGE == 1) THEN !
ENE_P_Q = ENE_P_Q / HARTREE - C1 * EN_P * Q2 ! 'GOA_MOD' case
PL_DISP = 'GOA_MOD' !
CHANGE = 0 !
I_SI = 0 !
I_SQ = 0 !
I_FO = 1 !
END IF !
!
! Change of units: AU --> SI
!
IF(I_SI == 0) THEN !
ENE_P_Q = ENE_P_Q * HARTREE !
END IF !
!
END SUBROUTINE PLASMON_DISP_3D
!
!=======================================================================
!
SUBROUTINE ELASTIC_DP_3D(R_S,T,AD)
!
! This subroutine computes the coefficients of the plasmon dispersion
! within the elastic approach in 3D systems according to:
!
! ENE_Q^2 = AD(0) + AD(1)*Q + AD(2)*Q^2 + AD(3)*Q^3 +
! AD(4)*Q^4 + AD(5)*Q^5 + AD(6)*Q^6
!
! = ALPHA2 + BETA2 * Q^2 + GAMMA2 * Q^4 + DELTA^2 Q^6
!
! where Q = q/ k_F
!
!
! References: (1) Ll. Serra, F. Garcias, M. Barranco, N. Barberan
! and J. Navarro, Phys. Rev. B 44, 1492-1498 (1991)
!
!
! --> This is the real (q, hbar omega_q) case (no damping)
!
! Warnings: i) all input parameters are in SI units
! ii) in the literature, beta^2 and gamma^2 are given
! in atomic units (AU). Here, we work in SI.
! We recall:
!
! ENE : J --> energy
! Q : 1 / M --> wave vector
! V : M / S --> speed
! OMEGA : 1 / S --> angular momentum
! HBAR : J S --> Planck constant / 2 pi
!
! In order to obtain ENE_Q^2 in J^2, a dimension analysis
! shows that:
!
! BETA2_AU = COEF * V_F^2 --> BETA2_SI = HBAR^2 * BETA2_AU
! GAMMA2_AU = 1/4 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU / M^2
! GAMMA2_AU = COEF * V_F^4 / OMEGA_P^2 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU
!
! Alternatively, we can work in atomic units and then change
! from Hartrees to Joules. This is what is coded here.
!
! Input parameters:
!
! * R_S : Wigner-Seitz radius (in units of a_0)
! * T : temperature in SI
!
! Output variables :
!
! * AD(0:6) : coefficients of the squared dispersion in AU
!
!
! Author : D. Sébilleau
!
! Last modified : 7 Dec 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO,NINE,THREE,FOURTH
USE CONSTANTS_P2, ONLY : HARTREE
USE FERMI_AU, ONLY : VF_AU
USE PI_ETC, ONLY : PI
USE PLASMON_ENE_SI
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: R_S,T
REAL (WP), INTENT(OUT) :: AD(0:6)
!
REAL (WP) :: HAR2,VF2,RS
REAL (WP) :: DENOM,XI
!
INTEGER :: I
!
! Initialisations
!
DO I = 0, 6 !
AD(I) = ZERO !
END DO !
!
HAR2 = HARTREE * HARTREE !
RS = R_S ! rs in AU
VF2 = VF_AU * VF_AU ! v_F^2 in AU
DENOM = NINE * (7.8E0_WP + RS)**3 !
XI = 0.88E0_WP * RS * (7.80E0_WP + RS + RS) / DENOM !
!
! Coefficients in AU
!
AD(0) = ENE_P_SI * ENE_P_SI / HAR2 !
AD(2) = (0.60E0_WP * VF2 - VF_AU / (THREE * PI) - XI) ! ref. (1) eq. (6)
AD(4) = FOURTH !
!
END SUBROUTINE ELASTIC_DP_3D
!
!=======================================================================
!
SUBROUTINE HER_APP_DP_3D(RS,T,AD)
!
! This subroutine computes the coefficients of the plasmon dispersion
! within the Hertel-Appel approach in 3D systems according to:
!
! ENE_Q^2 = AD(0) + AD(1)*Q + AD(2)*Q^2 + AD(3)*Q^3 +
! AD(4)*Q^4 + AD(5)*Q^5 + AD(6)*Q^6
!
! = ALPHA2 + BETA2 * Q^2 + GAMMA2 * Q^4 + DELTA^2 Q^6
!
! where Q = q/ k_F
!
!
! References: (1) P. Hertel and J. Appel, Phys. Rev. B 26, 5730-5742 (1982)
!
!
! --> This is the real (q, hbar omega_q) case (no damping)
!
! Warnings: i) all input parameters are in SI units
! ii) in the literature, beta^2 and gamma^2 are given
! in atomic units (AU). Here, we work in SI.
! We recall:
!
! ENE : J --> energy
! Q : 1 / M --> wave vector
! V : M / S --> speed
! OMEGA : 1 / S --> angular momentum
! HBAR : J S --> Planck constant / 2 pi
!
! In order to obtain ENE_Q^2 in J^2, a dimension analysis
! shows that:
!
! BETA2_AU = COEF * V_F^2 --> BETA2_SI = HBAR^2 * BETA2_AU
! GAMMA2_AU = 1/4 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU / M^2
! GAMMA2_AU = COEF * V_F^4 / OMEGA_P^2 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU
!
! Alternatively, we can work in atomic units and then change
! from Hartrees to Joules. This is what is coded here.
!
! Input parameters:
!
! * R_S : Wigner-Seitz radius (in units of a_0)
! * T : temperature in SI
!
! Output variables :
!
! * AD(0:6) : coefficients of the squared dispersion in AU
!
!
! Author : D. Sébilleau
!
! Last modified : 7 Dec 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO,THREE,SIX,HALF
USE CONSTANTS_P1, ONLY : H_BAR,M_E,K_B
USE CONSTANTS_P2, ONLY : HARTREE
USE PLASMON_ENE_SI
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: RS,T
REAL (WP), INTENT(OUT) :: AD(0:6)
!
REAL (WP) :: KBT,H2M
REAL (WP) :: HAR2,EN_P2
!
INTEGER :: I
!
! Initialisations !
!
DO I = 0, 6 !
AD(I) = ZERO !
END DO !
!
KBT = K_B * T / HARTREE ! k_B T in AU
!
HAR2 = HARTREE * HARTREE !
!
EN_P2 = ENE_P_SI * ENE_P_SI / HAR2 ! (plasmon energy)^2 in AU
!
! Coefficients in AU
!
AD(0) = EN_P2 !
AD(2) = THREE * KBT !
!
END SUBROUTINE HER_APP_DP_3D
!
!=======================================================================
!
SUBROUTINE HUBBARD_DP_3D(RS,T,AD)
!
! This subroutine computes the coefficients of the plasmon dispersion
! within the Hubbard approach in 3D systems according to:
!
! ENE_Q^2 = AD(0) + AD(1)*Q + AD(2)*Q^2 + AD(3)*Q^3 +
! AD(4)*Q^4 + AD(5)*Q^5 + AD(6)*Q^6
!
! = ALPHA2 + BETA2 * Q^2 + GAMMA2 * Q^4 + DELTA^2 Q^6
!
! where Q = q/ k_F
!
!
! References: (1) P. Jewsbury, Aust. J. Phys. 32, 361-368 (1979)
!
!
! --> This is the real (q, hbar omega_q) case (no damping)
!
! Warnings: i) all input parameters are in SI units
! ii) in the literature, beta^2 and gamma^2 are given
! in atomic units (AU). Here, we work in SI.
! We recall:
!
! ENE : J --> energy
! Q : 1 / M --> wave vector
! V : M / S --> speed
! OMEGA : 1 / S --> angular momentum
! HBAR : J S --> Planck constant / 2 pi
!
! In order to obtain ENE_Q^2 in J^2, a dimension analysis
! shows that:
!
! BETA2_AU = COEF * V_F^2 --> BETA2_SI = HBAR^2 * BETA2_AU
! GAMMA2_AU = 1/4 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU / M^2
! GAMMA2_AU = COEF * V_F^4 / OMEGA_P^2 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU
!
! Alternatively, we can work in atomic units and then change
! from Hartrees to Joules. This is what is coded here.
!
! Input parameters:
!
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : temperature in SI
!
! Output variables :
!
! * AD(0:6) : coefficients of the squared dispersion in AU
!
!
! Author : D. Sébilleau
!
! Last modified : 7 Dec 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO,NINE,THIRD,FOURTH
USE CONSTANTS_P1, ONLY : BOHR,H_BAR
USE CONSTANTS_P2, ONLY : HARTREE
USE FERMI_AU, ONLY : KF_AU,VF_AU
USE PLASMON_ENE_SI
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: RS,T
REAL (WP), INTENT(OUT) :: AD(0:6)
!
REAL (WP) :: HAR2
REAL (WP) :: VF2,VF4,KF2,KF4
REAL (WP) :: OMP2,G1,G2
!
INTEGER :: I
!
! Initialisations !
!
DO I = 0, 6 !
AD(I) = ZERO !
END DO !
!
HAR2 = HARTREE * HARTREE !
!
VF2 = VF_AU * VF_AU ! v_F^2 in AU
VF4 = VF2 * VF2 ! v_F^4 in AU
KF2 = KF_AU * KF_AU ! k_F^2 in AU
KF4 = KF2 * KF2 ! k_F^4 in AU
!
OMP2 = ENE_P_SI * ENE_P_SI / HAR2 ! omega_p^2 in AU
!
G1 = FOURTH + 0.00636E0_WP * RS ! ref. (1) eq. (16)
G2 = - 0.0391E0_WP + 0.00248E0_WP * RS ! ref. (1) eq. (16)
!
! Coefficients in AU
!
AD(0) = OMP2 !
AD(2) = 0.60E0_WP * VF2 - G1 * OMP2 / KF2 ! ref. (1) eq. (18)
AD(4) = FOURTH + 12.0E0_WP * VF4 / (175.0E0_WP * OMP2) - & !
OMP2 * (G2 + G1 * G1) / KF4 ! ref. (1) eq. (18)
!
END SUBROUTINE HUBBARD_DP_3D
!
!=======================================================================
!
SUBROUTINE HYDRODY_DP_1D(RS,T,Q_SI,AD)
!
! This subroutine computes the coefficients of the plasmon dispersion
! within the hydrodynamic approach in 1D systems according to:
!
! ENE_Q^2 = AD(0) + AD(1)*Q + AD(2)*Q^2 + AD(3)*Q^3 +
! AD(4)*Q^4 + AD(5)*Q^5 + AD(6)*Q^6
!
! = ALPHA2 + BETA2 * Q^2 + GAMMA2 * Q^4 + DELTA^2 Q^6
!
! where Q = q/ k_F
!
! --> This is the real (q, hbar omega_q) case (no damping)
!
! Warnings: i) all input parameters are in SI units
! ii) in the literature, beta^2 and gamma^2 are given
! in atomic units (AU). Here, we work in SI.
! We recall:
!
! ENE : J --> energy
! Q : 1 / M --> wave vector
! V : M / S --> speed
! OMEGA : 1 / S --> angular momentum
! HBAR : J S --> Planck constant / 2 pi
!
! In order to obtain ENE_Q^2 in J^2, a dimension analysis
! shows that:
!
! BETA2_AU = COEF * V_F^2 --> BETA2_SI = HBAR^2 * BETA2_AU
! GAMMA2_AU = 1/4 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU / M^2
! GAMMA2_AU = COEF * V_F^4 / OMEGA_P^2 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU
!
! Alternatively, we can work in atomic units and then change
! from Hartrees to Joules. This is what is coded here.
!
! Input parameters:
!
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : temperature in SI
! * Q_SI : plasmon wave vector in 1/m
!
! Output variables :
!
! * AD(0:6) : coefficients of the squared dispersion in AU
!
!
! Author : D. Sébilleau
!
! Last modified : 28 Jul 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO,TWO,THIRD
USE CONSTANTS_P1, ONLY : BOHR
USE CONSTANTS_P2, ONLY : HARTREE
USE FERMI_AU, ONLY : VF_AU
USE CONFIN_VAL, ONLY : R0
USE PLASMON_ENE_SI
!
IMPLICIT NONE
!
REAL (WP) :: RS,T,Q_SI
REAL (WP) :: HAR2,Q,QR0,EN_P2,VF2
REAL (WP) :: AD(0:6)
!
INTEGER :: I
!
! Initialisations
!
DO I=0,6 !
AD(I)=ZERO !
END DO !
!
HAR2=HARTREE*HARTREE !
Q=Q_SI*BOHR ! q in atomic units
QR0=Q*R0 !
VF2=VF_AU*VF_AU ! v_F^2 in AU
!
EN_P2=ENE_P_SI*ENE_P_SI/HAR2 ! (plasmon energy)^2 in AU
!
! Coefficients in AU
!
AD(2)=EN_P2*(DLOG(TWO/QR0)+ & !
THIRD*VF2) !
!
END SUBROUTINE HYDRODY_DP_1D
!
!=======================================================================
!
SUBROUTINE HYDRODY_DP_2D(X,RS,T,AD)
!
! This subroutine computes the coefficients of the plasmon dispersion
! within the hydrodynamic approach in 2D systems according to:
!
! ENE_Q^2 = AD(0) + AD(1)*Q + AD(2)*Q^2 + AD(3)*Q^3 +
! AD(4)*Q^4 + AD(5)*Q^5 + AD(6)*Q^6
!
! = ALPHA2 + BETA2 * Q^2 + GAMMA2 * Q^4 + DELTA^2 Q^6
!
! where Q = q/ k_F
!
! --> This is the real (q, hbar omega_q) case (no damping)
!
! Warnings: i) all input parameters are in SI units
! ii) in the literature, beta^2 and gamma^2 are given
! in atomic units (AU). Here, we work in SI.
! We recall:
!
! ENE : J --> energy
! Q : 1 / M --> wave vector
! V : M / S --> speed
! OMEGA : 1 / S --> angular momentum
! HBAR : J S --> Planck constant / 2 pi
!
! In order to obtain ENE_Q^2 in J^2, a dimension analysis
! shows that:
!
! BETA2_AU = COEF * V_F^2 --> BETA2_SI = HBAR^2 * BETA2_AU
! GAMMA2_AU = 1/4 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU / M^2
! GAMMA2_AU = COEF * V_F^4 / OMEGA_P^2 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU
!
! Alternatively, we can work in atomic units and then change
! from Hartrees to Joules. This is what is coded here.
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : temperature in SI
!
! Output variables :
!
! * AD(0:6) : coefficients of the squared dispersion in AU
!
!
! Author : D. Sébilleau
!
! Last modified : 28 Jul 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO,HALF
USE CONSTANTS_P2, ONLY : HARTREE
USE FERMI_AU, ONLY : VF_AU
USE PLASMON_ENE_SI
!
IMPLICIT NONE
!
REAL (WP) :: X,RS,T
REAL (WP) :: HAR2
REAL (WP) :: AD(0:6)
!
INTEGER :: I
!
! Initialisations
!
DO I = 0, 6 !
AD(I)=ZERO !
END DO !
!
HAR2=HARTREE*HARTREE !
!
! Coefficients in AU
!
AD(0)=ENE_P_SI*ENE_P_SI/HAR2 !
AD(2)=HALF*VF_AU*VF_AU !
!
END SUBROUTINE HYDRODY_DP_2D
!
!=======================================================================
!
SUBROUTINE HYDRODY_DP_3D(RS,T,AD)
!
! This subroutine computes the coefficients of the plasmon dispersion
! within the hydrodynamic approach in 3D systems according to:
!
! ENE_Q^2 = AD(0) + AD(1)*Q + AD(2)*Q^2 + AD(3)*Q^3 +
! AD(4)*Q^4 + AD(5)*Q^5 + AD(6)*Q^6
!
! = ALPHA2 + BETA2 * Q^2 + GAMMA2 * Q^4 + DELTA^2 Q^6
!
! where Q = q/ k_F
!
! --> This is the real (q, hbar omega_q) case (no damping)
!
! Warnings: i) all input parameters are in SI units
! ii) in the literature, beta^2 and gamma^2 are given
! in atomic units (AU). Here, we work in SI.
! We recall:
!
! ENE : J --> energy
! Q : 1 / M --> wave vector
! V : M / S --> speed
! OMEGA : 1 / S --> angular momentum
! HBAR : J S --> Planck constant / 2 pi
!
! In order to obtain ENE_Q^2 in J^2, a dimension analysis
! shows that:
!
! BETA2_AU = COEF * V_F^2 --> BETA2_SI = HBAR^2 * BETA2_AU
! GAMMA2_AU = 1/4 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU / M^2
! GAMMA2_AU = COEF * V_F^4 / OMEGA_P^2 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU
!
! Alternatively, we can work in atomic units and then change
! from Hartrees to Joules. This is what is coded here.
!
! Input parameters:
!
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : temperature in SI
!
! Output variables :
!
! * AD(0:6) : coefficients of the squared dispersion in AU
!
!
! Author : D. Sébilleau
!
! Last modified : 28 Jun 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO,THIRD,FOURTH
USE CONSTANTS_P2, ONLY : HARTREE
USE FERMI_AU, ONLY : VF_AU
USE PLASMON_ENE_SI
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: RS,T
REAL (WP), INTENT(OUT) :: AD(0:6)
!
REAL (WP) :: HAR2
!
INTEGER :: I
!
! Initialisations
!
DO I = 0, 6 !
AD(I) = ZERO !
END DO !
!
HAR2 = HARTREE * HARTREE !
!
! Coefficients in AU
!
AD(0) = ENE_P_SI * ENE_P_SI / HAR2 !
AD(2) = THIRD * VF_AU * VF_AU !
AD(4) = FOURTH !
!
END SUBROUTINE HYDRODY_DP_3D
!
!=======================================================================
!
SUBROUTINE RPA_MOD_DP_1D(RS,T,Q_SI,AD)
!
! This subroutine computes the coefficients of the plasmon dispersion
! within the RPA approach in 1D systems according to:
!
! ENE_Q^2 = AD(0) + AD(1)*Q + AD(2)*Q^2 + AD(3)*Q^3 +
! AD(4)*Q^4 + AD(5)*Q^5 + AD(6)*Q^6
!
! = ALPHA2 + BETA2 * Q^2 + GAMMA2 * Q^4 + DELTA^2 Q^6
!
! where Q = q/ k_F
!
! --> This is the real (q, hbar omega_q) case (no damping)
!
! Warnings: i) all input parameters are in SI units
! ii) in the literature, beta^2 and gamma^2 are given
! in atomic units (AU). Here, we work in SI.
! We recall:
!
! ENE : J --> energy
! Q : 1 / M --> wave vector
! V : M / S --> speed
! OMEGA : 1 / S --> angular momentum
! HBAR : J S --> Planck constant / 2 pi
!
! In order to obtain ENE_Q^2 in J^2, a dimension analysis
! shows that:
!
! BETA2_AU = COEF * V_F^2 --> BETA2_SI = HBAR^2 * BETA2_AU
! GAMMA2_AU = 1/4 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU / M^2
! GAMMA2_AU = COEF * V_F^4 / OMEGA_P^2 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU
!
! Alternatively, we can work in atomic units and then change
! from Hartrees to Joules. This is what is coded here.
!
! Input parameters:
!
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : temperature in SI
! * Q_SI : plasmon wave vector in 1/m
!
! Output variables :
!
! * AD(0:6) : coefficients of the squared dispersion in AU
!
!
! Author : D. Sébilleau
!
! Last modified : 17 Nov 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO,TWO
USE CONSTANTS_P1, ONLY : BOHR
USE CONSTANTS_P2, ONLY : HARTREE
USE FERMI_AU, ONLY : VF_AU
USE CONFIN_VAL, ONLY : R0
USE PLASMON_ENE_SI
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: RS,T,Q_SI
REAL (WP), INTENT(OUT) :: AD(0:6)
!
REAL (WP) :: HAR2,Q,QR0,EN_P2,VF2
!
REAL (WP) :: LOG
!
INTEGER :: I
!
! Initialisations
!
DO I = 0,6 !
AD(I) = ZERO !
END DO !
!
HAR2 = HARTREE * HARTREE !
!
VF2 = VF_AU * VF_AU ! v_F^2 in AU
Q = Q_SI * BOHR ! q in atomic units
QR0 = Q * R0 !
!
EN_P2 = ENE_P_SI * ENE_P_SI / HAR2 ! (plasmon energy)^2 in AU
!
! Coefficients in AU
!
AD(2) = EN_P2 * ( DLOG(TWO / QR0) + VF2 ) !
!
END SUBROUTINE RPA_MOD_DP_1D
!
!=======================================================================
!
SUBROUTINE RPA_MOD_DP_2D(X,RS,T,AD)
!
! This subroutine computes the coefficients of the plasmon dispersion
! within the RPA approach in 2D systems according to:
!
! ENE_Q^2 = AD(0) + AD(1)*Q + AD(2)*Q^2 + AD(3)*Q^3 +
! AD(4)*Q^4 + AD(5)*Q^5 + AD(6)*Q^6
!
! = ALPHA2 + BETA2 * Q^2 + GAMMA2 * Q^4 + DELTA^2 Q^6
!
! where Q = q/ k_F
!
! --> This is the real (q, hbar omega_q) case (no damping)
!
! Warnings: i) all input parameters are in SI units
! ii) in the literature, beta^2 and gamma^2 are given
! in atomic units (AU). Here, we work in SI.
! We recall:
!
! ENE : J --> energy
! Q : 1 / M --> wave vector
! V : M / S --> speed
! OMEGA : 1 / S --> angular momentum
! HBAR : J S --> Planck constant / 2 pi
!
! In order to obtain ENE_Q^2 in J^2, a dimension analysis
! shows that:
!
! BETA2_AU = COEF * V_F^2 --> BETA2_SI = HBAR^2 * BETA2_AU
! GAMMA2_AU = 1/4 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU / M^2
! GAMMA2_AU = COEF * V_F^4 / OMEGA_P^2 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU
!
! Alternatively, we can work in atomic units and then change
! from Hartrees to Joules. This is what is coded here.
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : temperature in SI
!
! Output variables :
!
! * AD(0:6) : coefficients of the squared dispersion in AU
!
!
! Author : D. Sébilleau
!
! Last modified : 17 Nov 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO,TWO
USE CONSTANTS_P1, ONLY : M_E
USE CONSTANTS_P2, ONLY : HARTREE
USE FERMI_SI, ONLY : KF_SI
USE FERMI_AU, ONLY : VF_AU
USE PLASMON_ENE_SI
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X,RS,T
REAL (WP), INTENT(OUT) :: AD(0:6)
!
REAL (WP) :: Q_SI
REAL (WP) :: HAR2,EN_P2,VF2
!
INTEGER :: I
!
! Initialisations
!
DO I = 0, 6 !
AD(I) = ZERO !
END DO !
!
HAR2 = HARTREE * HARTREE !
!
Q_SI = TWO * X * KF_SI !
!
EN_P2 = ENE_P_SI * ENE_P_SI * Q_SI / HAR2 !
!
VF2 = VF_AU * VF_AU !
!
! Coefficients in AU
!
AD(0) = EN_P2 !
AD(2) = 0.75E0_WP * VF2 !
!
END SUBROUTINE RPA_MOD_DP_2D
!
!=======================================================================
!
SUBROUTINE RAJAGOP_DP_2D(X,RS,T,AD)
!
! This subroutine computes the coefficients of the plasmon dispersion
! within the Rajagopal approach in 2D systems according to:
!
! ENE_Q^2 = AD(0) + AD(1)*Q + AD(2)*Q^2 + AD(3)*Q^3 +
! AD(4)*Q^4 + AD(5)*Q^5 + AD(6)*Q^6
!
! = ALPHA2 + BETA2 * Q^2 + GAMMA2 * Q^4 + DELTA^2 Q^6
!
! where Q = q/ k_F
!
! --> This is the real (q, hbar omega_q) case (no damping)
!
! Warnings: i) all input parameters are in SI units
! ii) in the literature, beta^2 and gamma^2 are given
! in atomic units (AU). Here, we work in SI.
! We recall:
!
! ENE : J --> energy
! Q : 1 / M --> wave vector
! V : M / S --> speed
! OMEGA : 1 / S --> angular momentum
! HBAR : J S --> Planck constant / 2 pi
!
! In order to obtain ENE_Q^2 in J^2, a dimension analysis
! shows that:
!
! BETA2_AU = COEF * V_F^2 --> BETA2_SI = HBAR^2 * BETA2_AU
! GAMMA2_AU = 1/4 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU / M^2
! GAMMA2_AU = COEF * V_F^4 / OMEGA_P^2 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU
!
! Alternatively, we can work in atomic units and then change
! from Hartrees to Joules. This is what is coded here.
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : temperature in SI
!
! Output variables :
!
! * AD(0:6) : coefficients of the squared dispersion in AU
!
!
! Author : D. Sébilleau
!
! Last modified : 17 Nov 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO,ONE,TWO,THREE,FOUR,NINE,TEN
USE PI_ETC, ONLY : PI
USE SQUARE_ROOTS, ONLY : SQR2
USE CONSTANTS_P1, ONLY : M_E
USE CONSTANTS_P2, ONLY : HARTREE
USE FERMI_SI, ONLY : KF_SI
USE FERMI_AU, ONLY : VF_AU
USE PLASMON_ENE_SI
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X,RS,T
REAL (WP), INTENT(OUT) :: AD(0:6)
!
REAL (WP) :: Q_SI
REAL (WP) :: HAR2,EN_P2,VF2
!
INTEGER :: I
!
! Initialisations
!
DO I = 0, 6 !
AD(I) = ZERO !
END DO !
!
HAR2 = HARTREE * HARTREE !
!
Q_SI = TWO * X * KF_SI !
!
EN_P2 = ENE_P_SI * ENE_P_SI * Q_SI / HAR2 !
!
VF2 = VF_AU * VF_AU !
!
! Coefficients in AU
!
AD(0) = EN_P2 !
AD(2) = EN_P2 * ( THREE * SQR2 / (FOUR * RS) ) * ( & !
ONE - TEN * RS / (NINE * SQR2 * PI) ) !
!
END SUBROUTINE RAJAGOP_DP_2D
!
!=======================================================================
!
SUBROUTINE RP2_MOD_DP_3D(RS,T,AD)
!
! This subroutine computes the coefficients of the plasmon dispersion
! within the RPA approach in 3D systems according to:
!
! ENE_Q^2 = AD(0) + AD(1)*Q + AD(2)*Q^2 + AD(3)*Q^3 +
! AD(4)*Q^4 + AD(5)*Q^5 + AD(6)*Q^6
!
! = ALPHA2 + BETA2 * Q^2 + GAMMA2 * Q^4 + DELTA^2 Q^6
!
! where Q = q/ k_F
!
!
! References: (1) Ll. Serra, F. Garcias, M. Barranco, N. Barberan
! and J. Navarro, Phys. Rev. B 44, 1492-1498 (1991)
!
!
! --> This is the real (q, hbar omega_q) case (no damping)
!
! Warnings: i) all input parameters are in SI units
! ii) in the literature, beta^2 and gamma^2 are given
! in atomic units (AU). Here, we work in SI.
! We recall:
!
! ENE : J --> energy
! Q : 1 / M --> wave vector
! V : M / S --> speed
! OMEGA : 1 / S --> angular momentum
! HBAR : J S --> Planck constant / 2 pi
!
! In order to obtain ENE_Q^2 in J^2, a dimension analysis
! shows that:
!
! BETA2_AU = COEF * V_F^2 --> BETA2_SI = HBAR^2 * BETA2_AU
! GAMMA2_AU = 1/4 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU / M^2
! GAMMA2_AU = COEF * V_F^4 / OMEGA_P^2 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU
!
! Alternatively, we can work in atomic units and then change
! from Hartrees to Joules. This is what is coded here.
!
!
! Input parameters:
!
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : temperature in SI
!
! Output variables :
!
! * AD(0:6) : coefficients of the squared dispersion in AU
!
!
! Author : D. Sébilleau
!
! Last modified : 28 Jul 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO,FOURTH
USE CONSTANTS_P2, ONLY : HARTREE
USE FERMI_AU, ONLY : VF_AU
USE PLASMON_ENE_SI
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: RS,T
REAL (WP), INTENT(OUT) :: AD(0:6)
!
REAL (WP) :: HAR2,VF2,VF4
REAL (WP) :: EN_P2
!
INTEGER :: I
!
! Initialisations
!
DO I = 0, 6 !
AD(I) = ZERO !
END DO !
!
HAR2 = HARTREE * HARTREE !
!
VF2 = VF_AU * VF_AU !
VF4 = VF2 * VF2 !
!
EN_P2 = ENE_P_SI * ENE_P_SI / HAR2 !
!
! Coefficients in AU
!
AD(0) = EN_P2 !
AD(2) = 0.60E0_WP * VF2 !
AD(4) = FOURTH + 12.0E0_WP * VF4 / (175.0E0_WP * EN_P2) !
!
END SUBROUTINE RP2_MOD_DP_3D
!
!=======================================================================
!
SUBROUTINE SGBBN_M_DP_3D(R_S,T,AD)
!
! This subroutine computes the coefficients of the plasmon dispersion
! within the SGBBN_M_DISP_3D approach in 3D systems according to:
!
! ENE_Q^2 = AD(0) + AD(1)*Q + AD(2)*Q^2 + AD(3)*Q^3 +
! AD(4)*Q^4 + AD(5)*Q^5 + AD(6)*Q^6
!
! = ALPHA2 + BETA2 * Q^2 + GAMMA2 * Q^4 + DELTA^2 Q^6
!
! where Q = q/ k_F
!
!
! References: (1) Ll. Serra, F. Garcias, M. Barranco, N. Barberan
! and J. Navarro, Phys. Rev. B 44, 1492-1498 (1991)
!
!
! --> This is the real (q, hbar omega_q) case (no damping)
!
! Warnings: i) all input parameters are in SI units
! ii) in the literature, beta^2 and gamma^2 are given
! in atomic units (AU). Here, we work in SI.
! We recall:
!
! ENE : J --> energy
! Q : 1 / M --> wave vector
! V : M / S --> speed
! OMEGA : 1 / S --> angular momentum
! HBAR : J S --> Planck constant / 2 pi
!
! In order to obtain ENE_Q^2 in J^2, a dimension analysis
! shows that:
!
! BETA2_AU = COEF * V_F^2 --> BETA2_SI = HBAR^2 * BETA2_AU
! GAMMA2_AU = 1/4 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU / M^2
! GAMMA2_AU = COEF * V_F^4 / OMEGA_P^2 --> GAMMA2_SI = HBAR^2 * GAMMA2_AU
!
! Alternatively, we can work in atomic units and then change
! from Hartrees to Joules. This is what is coded here.
!
! Input parameters:
!
! * R_S : Wigner-Seitz radius (in units of a_0)
! * T : temperature in SI
!
! Output variables :
!
! * AD(0:6) : coefficients of the squared dispersion in AU
!
!
! Author : D. Sébilleau
!
! Last modified : 8 Dec 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO,ONE,THREE,NINE, &
THIRD,FOURTH,NINTH
USE CONSTANTS_P1, ONLY : BOHR
USE CONSTANTS_P2, ONLY : HARTREE
USE FERMI_AU, ONLY : KF_AU,VF_AU
USE PI_ETC, ONLY : PI
USE PLASMON_ENE_SI
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: R_S,T
REAL (WP), INTENT(OUT) :: AD(0:6)
!
REAL (WP) :: HAR2,VF2,RS
REAL (WP) :: DENOM,XI
REAL (WP) :: BETA
!
INTEGER :: I
!
BETA = NINTH ! Weizsacker coefficient
!
! Initialisations
!
DO I = 0, 6 !
AD(I) = ZERO !
END DO !
!
HAR2 = HARTREE * HARTREE !
RS = R_S ! rs in AU
VF2 = VF_AU * VF_AU ! v_F^2 in AU
DENOM = NINE * (7.8E0_WP+RS)**3 !
XI = 0.88E0_WP * RS * (7.80E0_WP + RS + RS) / DENOM !
!
! Coefficients in AU
!
AD(0) = ENE_P_SI * ENE_P_SI / HAR2 !
AD(2) = (THIRD * VF2 - VF_AU / (THREE * PI) - XI) !
AD(4) = FOURTH * BETA !
AD(6) = ONE / (270.0E0_WP * VF2) !
!
END SUBROUTINE SGBBN_M_DP_3D
!
!=======================================================================
!
SUBROUTINE SUMRULE1_DP_3D(X,OM12)
!
! This subroutine computes the coefficients of the plasmon dispersion
! within the 3rd-frequency sum rule approach in 3D systems.
!
! --> This is the real (q, hbar omega_q) case (no damping)
!
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
!
! Output variables :
!
! * OM12 : squared dispersion frequency in SI
!
!
! Author : D. Sébilleau
!
! Last modified : 23 Nov 2020
!
!
USE CONSTANTS_P1, ONLY : H_BAR
USE LOSS_MOMENTS
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X
REAL (WP), INTENT(OUT) :: OM12
!
REAL (WP) :: C0,C2,C4
!
! Computing the moments of the loss function
!
CALL LOSS_MOMENTS_AN(X,C0,C2,C4) !
!
! Squared energy in SI
!
OM12 = H_BAR * H_BAR * C2 / C0 !
!
END SUBROUTINE SUMRULE1_DP_3D
!
!=======================================================================
!
SUBROUTINE SUMRULE3_DP_3D(X,OM22)
!
! This subroutine computes the coefficients of the plasmon dispersion
! within the 3rd-frequency sum rule approach in 3D systems.
!
! --> This is the real (q, hbar omega_q) case (no damping)
!
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
!
! Output variables :
!
! * OM22 : squared dispersion frequency in SI
!
!
! Author : D. Sébilleau
!
! Last modified : 23 Nov 2020
!
!
USE CONSTANTS_P1, ONLY : H_BAR
USE LOSS_MOMENTS
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X
REAL (WP), INTENT(OUT) :: OM22
!
REAL (WP) :: C0,C2,C4
!
! Computing the moments of the loss function
!
CALL LOSS_MOMENTS_AN(X,C0,C2,C4) !
!
! Squared energy in SI
!
OM22 = H_BAR * H_BAR * C4 / C2 !
!
END SUBROUTINE SUMRULE3_DP_3D
!
!=======================================================================
!
SUBROUTINE PLASMON_DISP_3D_2(X,RS,T,PL_DISP,ENE_P_Q)
!
! This subroutine computes the plasmon dispersion omega(q)
! in the form
!
! Reference: (1) S. Ichimaru, Rev. Mod. Phys. 54, 1018-1059 (1982)
!
!
! 2
! ( q )
! omega(q) = omega_p + 2 alpha omega_F ( ----- )
! ( k_F )
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : temperature in SI
! * PL_DISP : method used to compute the dispersion (3D)
! PL_DISP = 'RP1_MOD' RPA model up to q^2
! PL_DISP = 'AL0_MOD' gamma_0 limit
! PL_DISP = 'ALI_MOD' gamma_inf limit
! PL_DISP = 'NOP_MOD' Nozières-Pines model
! PL_DISP = 'UTI_MOD' Utsumi-Ichimaru model
! PL_DISP = 'TWA_MOD' Toigo-Woodruff model
!
!
! Output variables :
!
! * ENE_P_Q : plasmon energy at q in J
!
!
! Author : D. Sébilleau
!
! Last modified : 7 Dec 2020
!
!
USE REAL_NUMBERS, ONLY : ONE,TWO,THREE,FOURTH,FIFTH
USE SQUARE_ROOTS, ONLY : SQR2
USE CONSTANTS_P1, ONLY : H_BAR
USE FERMI_SI, ONLY : EF_SI
USE PLASMON_ENE_SI
USE UTIC_PARAMETERS, ONLY : UTIC_PARAM
USE ASYMPT, ONLY : G0,GI
USE EXT_FUNCTIONS, ONLY : PDF ! Plasma dispersion function Z(x)
!
IMPLICIT NONE
!
CHARACTER (LEN = 7) :: PL_DISP
!
REAL (WP), INTENT(IN) :: X,RS,T
REAL (WP), INTENT(OUT) :: ENE_P_Q
!
REAL (WP) :: Y
REAL (WP) :: OMP,OMF,RPF,RFP
REAL (WP) :: AL_RPA,ALPHA
REAL (WP) :: OMQ,OM0
REAL (WP) :: R1,R2,W
!
Y = X + X ! Y = q / k_F
!
OMP = ENE_P_SI / H_BAR ! omega_p in SI
OMF = EF_SI / H_BAR ! omega_F in SI
RPF = OMP / OMF !
RFP = OMF / OMP !
!
! Computing alpha
!
AL_RPA = THREE * FIFTH * RFP !
!
IF(PL_DISP == 'RP1_MOD') THEN !
ALPHA = AL_RPA ! ref. (1) eq. (3.97)
ELSE IF(PL_DISP == 'AL0_MOD') THEN !
ALPHA = AL_RPA - FOURTH * RPF * G0 ! ref. (1) eq. (3.98)
ELSE IF(PL_DISP == 'ALI_MOD') THEN !
ALPHA = AL_RPA - FOURTH * RPF * GI ! ref. (1) eq. (3.100)
ELSE IF(PL_DISP == 'NOP_MOD') THEN !
ALPHA = AL_RPA - THREE * RPF / 80.0E0_WP ! ref. (1) eq. (3.101)
ELSE IF(PL_DISP == 'UTI_MOD') THEN !
!
! Computing the Utsumi-Ichimaru parameters Omega(q) and Omega(0)
!
CALL UTIC_PARAM(X,RS,T,OMQ,OM0) !
!
R1 = OMP / OM0 ! argument of W
R2 = R1 / SQR2 ! argument of Z
!
! Computing the W function
!
W = ONE + R1 * REAL(PDF(R2),KIND = WP) !
!
ALPHA = AL_RPA - FOURTH * RPF * (GI * (G0 - GI) * W) ! ref. (1) eq. (3.96)
ELSE IF(PL_DISP == 'TWA_MOD') THEN !
ALPHA = AL_RPA - RPF / 16.0E0_WP ! ref. (1) eq. (3.99)
END IF !
!
ENE_P_Q = H_BAR * (OMP + TWO * ALPHA * OMF * Y * Y) ! ref. (1) eq. (3.95)
!
END SUBROUTINE PLASMON_DISP_3D_2
!
END MODULE PLASMON_DISP_REAL
!
!=======================================================================
!
MODULE PLASMON_DISP_CPLX
!
! This module computes analytical plasmon dispersion with damping
!
USE ACCURACY_REAL
!
CONTAINS
!
!
!=======================================================================
!
SUBROUTINE PLASMON_DISP_D_2D(PL_DISP,Q,RS,T,MASS_E,TAU, &
ENE_Q,Q_STAR)
!
! This subroutine computes the plasmon dispersion relation with damping
! for different cases, in the 2D case
!
! Warning: all input parameters are in SI units
!
!
! Input parameters:
!
! * PL_DISP : method used to compute the dispersion
! PL_DISP = 'GIQUI_D' Jewsbury' model
! * Q : plasmon wave vector
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : temperature in Kelvin
! * MASS_E : mass enhancement m*/m
! * TAU : relaxation time (used for damping) in SI
!
!
! Output variables :
!
! * ENE_Q : plasmon energy at q in J * 1 / bar
! * Q_STAR : critical vector (2D) before which
! no plasmon can be excited
!
!
! Author : D. Sébilleau
!
! Last modified : 5 Jun 2020
!
!
IMPLICIT NONE
!
CHARACTER (LEN = 7) :: PL_DISP
!
REAL (WP) :: RS,T,MASS_E,TAU
REAL (WP) :: Q_STAR
!
COMPLEX (WP) :: Q,ENE_Q
!
IF(PL_DISP == 'GIQUI_D') THEN !
!
CALL GIQUI_D_DP_2D(Q,RS,T,MASS_E,TAU,ENE_Q,Q_STAR) !
!
END IF !
!
END SUBROUTINE PLASMON_DISP_D_2D
!
!=======================================================================
!
SUBROUTINE PLASMON_DISP_D_3D(PL_DISP,Q,RS,T,TAU,ENE_Q)
!
! This subroutine computes the plasmon dispersion relation with damping
! for different cases, in the 3D case
!
! Warning: all input parameters are in SI units
!
!
! Input parameters:
!
! * PL_DISP : method used to compute the dispersion
! PL_DISP = 'JEWSB_D' Jewsbury' model
! PL_DISP = 'HALEV_D' Halevi model
! * Q : plasmon wave vector
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : temperature in Kelvin
! * TAU : relaxation time (used for damping) in SI
!
!
! Output variables :
!
! * ENE_Q : plasmon energy at q in J * 1 / bar
!
!
! Author : D. Sébilleau
!
! Last modified : 5 Jun 2020
!
!
IMPLICIT NONE
!
CHARACTER (LEN = 7) :: PL_DISP
!
REAL (WP) :: RS,T,TAU
!
COMPLEX (WP) :: Q,ENE_Q
!
IF(PL_DISP == 'JEWSB_D') THEN !
!
CALL JEWSB_D_DP_3D(Q,RS,T,ENE_Q) !
!
ELSEIF(PL_DISP == 'HALEV_D') THEN !
!
CALL HALEV_D_DP_3D(Q,RS,TAU,ENE_Q) !
!
ENDIF !
!
END SUBROUTINE PLASMON_DISP_D_3D
!
!=======================================================================
!
SUBROUTINE GIQUI_D_DP_2D(Q,RS,T,MASS_E,TAU,ENE_Q,Q_STAR)
!
! This subroutine computes the plasmon dispersion relation with damping
! for different cases, up to order 2 in q. The dispersion is written as
!
! ENE_Q^2 = ALPHA2 + BETA2 * Q^2
!
! --> This is the complex (q, hbar omega_q) case (includes damping)
!
! Warning: all input parameters are in SI units
!
!
! References: (1) L. Kong, B. Yan and X. Hu, Plasma Science and
! Technology 9, 519 (2007)
! (2) G. F. Giuliani and J. J. Quinn, Phys. Rev. B 26,
! 4421 (1982)
!
!
! Input parameters:
!
! * Q : plasmon wave vector
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : temperature in Kelvin
! * MASS_E : mass enhancement m*/m
! * TAU : relaxation time (used for damping) in SI
!
!
! Output variables :
!
! * ENE_Q : plasmon energy at q in J * 1 / bar
! * Q_STAR : critical vector (2D) before which
! no plasmon can be excited
!
!
!
! Author : D. Sébilleau
!
! Last modified : 5 Jun 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO,ONE,TWO
USE COMPLEX_NUMBERS, ONLY : ZEROC,IC
USE CONSTANTS_P1, ONLY : BOHR
USE CONSTANTS_P2, ONLY : HARTREE
USE FERMI_SI, ONLY : VF_SI
USE PLASMON_ENE_SI
!
USE DISP_COEF_COMP
!
IMPLICIT NONE
!
INTEGER :: BYPASS,I
!
REAL (WP) :: RS,T
REAL (WP) :: ENE_P2,VF2
REAL (WP) :: MASS_E,TAU
REAL (WP) :: K,Q_STAR
!
COMPLEX (WP) :: Q,Q2,Q4,Q6,ENE_Q,ENE2,X
COMPLEX (WP) :: ALPHA2,BETA2,GAMMA2
!
! Initialisation
!
Q_STAR=ZERO !
BYPASS=0 !
ALPHA2=ZEROC !
BETA2=ZEROC !
GAMMA2=ZEROC !
!
DO I=0,6 !
AC(I)=ZEROC !
END DO !
!
Q2=Q*Q !
Q4=Q2*Q2 !
Q6=Q4*Q2 !
!
VF2=VF_SI*VF_SI !
!
! Initialization of ALPHA2 = (hbar omega_p)^2
!
ENE_P2=ENE_P_SI*ENE_P_SI !
ALPHA2=ENE_P2 !
! ! mass-renormalized
K=MASS_E*TWO/BOHR ! Thomas-Fermi vector
X=Q/K !
ENE_Q=DCMPLX((ONE+X)/(TWO+X))* & !
(CDSQRT(X*(TWO+X)*VF2*K*K - & !
ONE/(TAU*TAU)) - IC/TAU) !
BYPASS=1 !
Q_STAR=K*(DSQRT(ONE + ONE/(VF2*K*K*TAU*TAU)) - ONE) !
!
! Dispersion relation:
!
IF(BYPASS == 0) THEN !
!
AC(1)=ALPHA2 !
AC(2)=BETA2 !
AC(4)=GAMMA2 !
!
END IF !
END SUBROUTINE GIQUI_D_DP_2D
!
!=======================================================================
!
SUBROUTINE HALEV_D_DP_3D(Q,RS,TAU,ENE_Q)
!
! This subroutine computes the plasmon dispersion relation with damping
! for different cases, up to order 2 in q. The dispersion is written as
!
! ENE_Q^2 = ALPHA2 + BETA2 * Q^2
!
! --> This is the complex (q, hbar omega_q) case (includes damping)
!
! Warning: all input parameters are in SI units
!
!
! Input parameters:
! * Q : plasmon wave vector
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : temperature in Kelvin
! * TAU : relaxation time (used for damping) in SI
!
!
! Output variables :
!
! * ENE_Q : plasmon energy at q in J * 1 / bar
!
!
!
! Author : D. Sébilleau
!
! Last modified : 5 Jun 2020
!
USE REAL_NUMBERS, ONLY : ZERO,ONE,THREE,FOUR,TEN, &
HALF
USE COMPLEX_NUMBERS, ONLY : ZEROC,IC
USE CONSTANTS_P1, ONLY : BOHR,H_BAR
USE FERMI_SI, ONLY : VF_SI
USE PLASMON_ENE_SI
!
USE DISP_COEF_COMP
!
IMPLICIT NONE
!
INTEGER :: BYPASS,I
!
REAL (WP) :: RS,T
REAL (WP) :: ENE_P2,VF2
REAL (WP) :: TAU
REAL (WP) :: GAMMA,O_P2
!
COMPLEX (WP) :: Q,Q2,ENE_Q,RAT
COMPLEX (WP) :: ALPHA2,BETA2,GAMMA2,DELTA2
!
! Initialisation
!
BYPASS=0 !
ALPHA2=ZEROC !
BETA2=ZEROC !
GAMMA2=ZEROC !
DELTA2=ZEROC !
!
DO I=0,6 !
AC(I)=ZEROC !
END DO !
!
Q2=Q*Q !
!
VF2=VF_SI*VF_SI !
!
! Initialization of ALPHA2 = (hbar omega_p)^2
!
ENE_P2=ENE_P_SI*ENE_P_SI !
ALPHA2=ENE_P2 !
!
GAMMA=ONE/TAU !
O_P2=ENE_P2/(H_BAR*H_BAR) !
RAT=Q2*VF2/O_P2 !
!
!
ENE_Q=DSQRT(ENE_P2) + THREE*DSQRT(ENE_P2)*RAT/TEN - & !
IC*HALF*GAMMA*(ONE+FOUR*RAT/15.0E0_WP) !
!
! Dispersion relation:
!
IF(BYPASS == 0) THEN !
AC(0)=ALPHA2 !
AC(2)=BETA2 !
AC(4)=GAMMA2 !
AC(6)=DELTA2 !
END IF !
!
END SUBROUTINE HALEV_D_DP_3D
!
!=======================================================================
!
SUBROUTINE JEWSB_D_DP_3D(Q,RS,T,ENE_Q)
!
! This subroutine computes the plasmon dispersion relation with damping
! for different cases, up to order 2 in q. The dispersion is written as
!
! ENE_Q^2 = ALPHA2 + BETA2 * Q^2
!
! --> This is the complex (q, hbar omega_q) case (includes damping)
!
! Warning: all input parameters are in SI units
!
!
! Input parameters:
!
! * Q : complex plasmon wave vector
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : temperature in Kelvin
!
!
! Output variables :
!
! * ENE_Q : plasmon energy at q in J * 1 / bar
!
!
!
! Author : D. Sébilleau
!
! Last modified : 5 Jun 2020
!
!
USE REAL_NUMBERS, ONLY : TWO,FIVE,SIX, &
HALF,FOURTH
USE COMPLEX_NUMBERS
USE CONSTANTS_P1, ONLY : BOHR
USE FERMI_SI, ONLY : EF_SI,KF_SI
USE PLASMON_ENE_SI
!
USE DISP_COEF_COMP
!
IMPLICIT NONE
!
INTEGER :: BYPASS,I
!
REAL (WP) :: RS,T
REAL (WP) :: G1,BG0,BG1
REAL (WP) :: NUM,DENOM
REAL (WP) :: KF2,EF2
!
COMPLEX (WP) :: Q,Q2,Q4,Q6,ENE_Q,ENE2
COMPLEX (WP) :: A,B,ALPHA2,BETA2,GAMMA2,DELTA2
!
! Initialisation
!
BYPASS=0 !
ALPHA2=ZEROC !
BETA2=ZEROC !
GAMMA2=ZEROC !
DELTA2=ZEROC !
!
DO I=0,6 !
AC(I)=ZEROC !
END DO !
!
Q2=Q*Q !
Q4=Q2*Q2 !
Q6=Q4*Q2 !
!
KF2=KF_SI*KF_SI !
EF2=EF_SI*EF_SI !
!
! Initialization of ALPHA2 = (hbar omega_p)^2
!
ALPHA2=ENE_P_SI*ENE_P_SI !
!
G1=FOURTH+0.00636E0_WP*RS !
BG0=0.033E0_WP*RS !
BG1=0.15E0_WP*DSQRT(RS) !
NUM=SIX*EF2 !
DENOM=FIVE*ENE_P_SI*ENE_P_SI !
A=(ONEC-HALF*IC*BG0) !
B=(NUM/DENOM-HALF*(G1+IC*BG1))/KF2 !
!
ALPHA2=DCMPLX(A*A)*ENE_P_SI*ENE_P_SI !
BETA2=DCMPLX(TWO*A*B) !
GAMMA2=DCMPLX(B*B) !
!
!
! Dispersion relation:
!
IF(BYPASS == 0) THEN !
AC(0)=ALPHA2 !
AC(2)=BETA2 !
AC(4)=GAMMA2 !
AC(6)=DELTA2 !
END IF !
!
ENE2=AC(0)+AC(1)*Q+AC(2)*Q2+AC(3)*Q*Q2+AC(4)*Q4+ & !
AC(5)*Q*Q4+AC(6)*Q6 !
!
ENE_Q=CDSQRT(ENE2) !
!
END SUBROUTINE JEWSB_D_DP_3D
!
END MODULE PLASMON_DISP_CPLX