MsSpec-DFM/New_libraries/DFM_library/NEVANLINNA_FUNCTIONS_LIBRARY/Nevanlinna_functions.f90

643 lines
20 KiB
Fortran
Raw Normal View History

2022-02-02 16:19:10 +01:00
!
!=======================================================================
!
MODULE NEVALINNA_FUNCTIONS
!
! This modules provides Nevalinna functions
!
!
!
USE ACCURACY_REAL
!
CONTAINS
!
!=======================================================================
!
FUNCTION NEVAN2(X,Z,RS,T,TAU,NEV_TYPE)
!
! This function computes the Nevalinna function Q_2(x,omega)
!
! In an electron liquid, the Nevalinna function Q(x,z) plays the role
! of the dynamic local-field correction G(x,z).
!
!
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * Z : dimensionless factor --> Z = omega / omega_q
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : temperature in SI
! * TAU : relaxation time in SI
! * NEV_TYPE : type of Nevalinna function used
! NEV_TYPE = 'NONE' --> no function
! NEV_TYPE = 'RELA' --> static value h(q) = i / tau
! NEV_TYPE = 'STA1' --> static value h(q)
! NEV_TYPE = 'STA2' --> static value h(q)
! NEV_TYPE = 'STA3' --> static value h(q)
! NEV_TYPE = 'STA4' --> static value h(q)
! NEV_TYPE = 'PEEL' --> Perel'-Eliashberg function
! NEV_TYPE = 'PE76' --> Perel'-Eliashberg by V. Arkhipov et al
! NEV_TYPE = 'CPP1' -->
! NEV_TYPE = 'CPP2' -->
! NEV_TYPE = 'CPP3' -->
! NEV_TYPE = 'CPP4' -->
! NEV_TYPE = 'PST1' -->
!
!
! Remark: The Nevalinna function has the dimension of a frequency omega
!
!
! Author : D. Sébilleau
!
! Last modified : 18 Nov 2020
!
!
USE COMPLEX_NUMBERS, ONLY : ZEROC,IC
USE LOSS_MOMENTS
!
IMPLICIT NONE
!
CHARACTER (LEN = 4) :: NEV_TYPE
!
REAL (WP), INTENT(IN) :: X,Z,T,RS,TAU
REAL (WP) :: C0,C2,C4
REAL (WP) :: OM12,OM22
!
COMPLEX (WP) :: NEVAN2
!
! Computing the moments of the loss function
!
CALL LOSS_MOMENTS_AN(X,C0,C2,C4) !
!
OM12 = C2 / C0 !
OM22 = C4 / C2 !
!
IF(NEV_TYPE == 'NONE') THEN !
NEVAN2 = ZEROC !
ELSE IF(NEV_TYPE == 'RELA') THEN !
NEVAN2 = IC / TAU !
ELSE IF(NEV_TYPE == 'STA1') THEN !
NEVAN2 = STA1(OM12,OM22) !
ELSE IF(NEV_TYPE == 'STA2') THEN !
NEVAN2 = STA2(OM22,TAU) !
ELSE IF(NEV_TYPE == 'STA3') THEN !
NEVAN2 = STA3(X,OM12,OM22) !
ELSE IF(NEV_TYPE == 'STA4') THEN !
NEVAN2 = STA4(X,OM12,TAU) !
ELSE IF(NEV_TYPE == 'CPP1') THEN !
NEVAN2 = CPP1(X,Z,RS,OM12,OM22) !
ELSE IF(NEV_TYPE == 'CPP2') THEN !
NEVAN2 = CPP2(X,Z,RS,TAU,OM12,OM22) !
ELSE IF(NEV_TYPE == 'CPP3') THEN !
NEVAN2 = CPP3(X,Z,OM22,TAU) !
ELSE IF(NEV_TYPE == 'CPP4') THEN !
NEVAN2 = CPP4(X,Z,T,OM12,OM22) !
ELSE IF(NEV_TYPE == 'PEEL') THEN !
NEVAN2 = PEEL(X,Z,RS,OM12,OM22) !
ELSE IF(NEV_TYPE == 'PE76') THEN !
NEVAN2 = PE76(X,Z,RS,OM12,OM22) !
ELSE IF(NEV_TYPE == 'PST1') THEN !
NEVAN2 = PST1(X,Z,OM12,OM22) !
END IF !
!
END FUNCTION NEVAN2
!
!=======================================================================
!
FUNCTION STA1(OM12,OM22)
!
! This function computes a static Nevalinna function
!
!
! References: (1) Yu. V. Arkhipov et al, Contrib. Plasma Phys. 58,
! 967975 (2018)
!
!
! Input parameters:
!
! * OM12 : omega_1^2 \ characteristic squared
! * OM22 : omega_2^2 / frequencies
!
!
! Author : D. Sébilleau
!
! Last modified : 18 Nov 2020
!
USE REAL_NUMBERS, ONLY : TWO
USE COMPLEX_NUMBERS, ONLY : IC
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: OM12,OM22
!
REAL (WP) :: SQRT
!
COMPLEX (WP) :: STA1
!
STA1 = IC * OM22 / SQRT(TWO * OM12) ! ref. (1) eq. (13)
!
END FUNCTION STA1
!
!=======================================================================
!
FUNCTION STA2(OM22,TAU)
!
! This function computes a static Nevalinna function
!
!
! References: (1) Yu. V. Arkhipov et al, Contrib. Plasma Phys. 50,
! 165-176 (2010)
!
!
! Input parameters:
!
! * OM22 : omega_2^2 characteristic squared frequency
! * TAU : relaxation time (in SI)
!
!
! Author : D. Sébilleau
!
! Last modified : 18 Nov 2020
!
USE REAL_NUMBERS, ONLY : TWO
USE COMPLEX_NUMBERS, ONLY : IC
USE CONSTANTS_P1, ONLY : H_BAR
USE PLASMON_ENE_SI
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: OM22,TAU
!
REAL (WP) :: OMP,OM2
!
COMPLEX (WP) :: STA2
!
OMP = ENE_P_SI / H_BAR ! omega_p
OM2 = OM22 - OMP * OMP ! ref. (1) eq. (15)
!
STA2 = IC * OM2 * TAU ! ref. (1) eq. (29)
!
END FUNCTION STA2
!
!=======================================================================
!
FUNCTION STA3(X,OM12,OM22)
!
! This function computes a static Nevalinna function
!
!
! References: (1) S. V. Adamjan, T. Meyer and I. M. Tkachenko,
! Contrib. Plasma Phys. 29, 373-375 (1989)
!
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * OM12 : omega_1^2 \ characteristic squared
! * OM22 : omega_2^2 / frequencies
!
!
! Author : D. Sébilleau
!
! Last modified : 26 Nov 2020
!
USE MATERIAL_PROP, ONLY : DMN
!
USE REAL_NUMBERS, ONLY : ONE,TWO,FOUR,HALF
USE COMPLEX_NUMBERS, ONLY : IC
USE PI_ETC, ONLY : PI
USE CONSTANTS_P1, ONLY : BOHR,H_BAR,M_E
USE FERMI_SI, ONLY : KF_SI
USE DFUNC_STATIC, ONLY : RPA1_EPS_S_LG
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X,OM12,OM22
REAL (WP) :: EPSR,EPSI
REAL (WP) :: Q_SI,OMQ
!
COMPLEX (WP) :: STA3
!
Q_SI = TWO * X * KF_SI ! q in SI
!
OMQ = HALF * H_BAR * Q_SI * Q_SI / M_E ! omega_q
!
! Computing the static RPA dielectric function
!
CALL RPA1_EPS_S_LG(X,DMN,EPSR,EPSI) !
!
STA3 = IC * EPSR * (EPSR - ONE) * HALF * PI * OMQ * & !
BOHR * Q_SI * (OM22 / OM12 - ONE) !
!
END FUNCTION STA3
!
!=======================================================================
!
FUNCTION STA4(X,OM12,TAU)
!
! This function computes a static Nevalinna function
!
!
! References: (1) V. M. Adamyan and I. M. Tkachenko,
! Contrib. Plasma Phys. 43, 252-257 (2003)
!
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * OM12 : omega_1^2 characteristic squared frequency
! * TAU : relaxation time (in SI)
!
!
! Author : D. Sébilleau
!
! Last modified : 27 Nov 2020
!
USE REAL_NUMBERS, ONLY : ONE,TWO,FOUR,HALF
USE COMPLEX_NUMBERS, ONLY : IC
USE PI_ETC, ONLY : PI
USE CONSTANTS_P1, ONLY : H_BAR,M_E
USE FERMI_SI, ONLY : KF_SI,EF_SI
USE PLASMON_ENE_SI
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X,OM12,TAU
REAL (WP) :: EPSR,EPSI
REAL (WP) :: Q_SI,OMQ
REAL (WP) :: OMP,OM220
REAL (WP) :: OMP2,OMQ2
REAL (WP) :: AV_KE
!
COMPLEX (WP) :: STA4
!
Q_SI = TWO * X * KF_SI ! q in SI
!
OMP = ENE_P_SI / H_BAR ! omega_p
OMQ = HALF * H_BAR * Q_SI * Q_SI / M_E ! omega_q
!
OMP2 = OMP * OMP !
OMQ2 = OMQ * OMQ !
!
! Computing omega_2^2(0) = C_4(0) / C_2 --> with I(0) = 0
!
OM220 = OMP2 * ( FOUR * AV_KE * OMQ / H_BAR + & !
OMQ2 + OMP2 & !
) !
!
STA4 = IC * TAU * OMP2 * (OM220 / OMP2 - ONE) ! ref. (1), before eq. (29)
!
END FUNCTION STA4
!
!=======================================================================
!
FUNCTION PEEL(X,Z,RS,OM12,OM22)
!
! This function computes the Perel'-Eliashberg dynamic Nevalinna function
!
!
! References: (1) Yu. V. Arkhipov et al, Contrib. Plasma Phys. 55,
! 381-389 (2015)
!
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * Z : dimensionless factor --> Z = omega / omega_q
! * RS : Wigner-Seitz radius (in units of a_0)
! * OM12 : omega_1^2 \ characteristic squared
! * OM22 : omega_2^2 / frequencies
!
!
! Author : D. Sébilleau
!
! Last modified : 27 Nov 2020
!
USE PLASMA, ONLY : ZION
!
USE REAL_NUMBERS, ONLY : TWO,THREE,FIVE
USE COMPLEX_NUMBERS, ONLY : ONEC,IC
USE PI_ETC, ONLY : PI
USE SQUARE_ROOTS, ONLY : SQR2
USE CONSTANTS_P1, ONLY : H_BAR
USE FERMI_SI, ONLY : KF_SI,VF_SI
USE PLASMON_ENE_SI
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X,Z,RS
REAL (WP), INTENT(IN) :: OM12,OM22
!
REAL (WP) :: U,Q_SI,OM,OMP
REAL (WP) :: A,NUM,DEN
!
REAL (WP) :: SQRT
!
COMPLEX (WP) :: PEEL
!
Q_SI = TWO * X * KF_SI ! q in SI
U = X * Z ! omega / (q * v_F)
OM = U * Q_SI * VF_SI ! omega in SI
OMP = ENE_P_SI / H_BAR ! omega_p
!
A = SQR2 * RS**0.75E0_WP * ZION / THREE**1.25E0_WP ! ref. (1) eq. (11)
!
NUM = A * OMP * OMP * SQRT(OMP * OM) !
DEN = OM22 - OM12 !
!
PEEL = NUM * (ONEC + IC) / DEN ! ref. (1) eq. (12)
!
END FUNCTION PEEL
!
!=======================================================================
!
FUNCTION PE76(X,Z,RS,OM12,OM22)
!
! This function computes the Perel'-Eliashberg dynamic Nevalinna function
!
!
! References: (1) Yu. V. Arkhipov et al, Phys. Rev. E 76, 026403 (2007)
!
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * Z : dimensionless factor --> Z = omega / omega_q
! * RS : Wigner-Seitz radius (in units of a_0)
! * OM12 : omega_1^2 \ characteristic squared
! * OM22 : omega_2^2 / frequencies
!
!
! Author : D. Sébilleau
!
! Last modified : 18 Nov 2020
!
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X,Z,RS
REAL (WP), INTENT(IN) :: OM12,OM22
!
COMPLEX (WP) :: PE76
!
PE76 = PEEL(X,Z,RS,OM12,OM22) + STA3(X,OM12,OM22) !
!
END FUNCTION PE76
!
!=======================================================================
!
FUNCTION CPP1(X,Z,RS,OM12,OM22)
!
! This function computes the Perel'-Eliashberg dynamic Nevalinna function
!
!
! References: (1) Yu. V. Arkhipov et al, Contrib. Plasma Phys. 53,
! 375-384 (2013)
!
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * Z : dimensionless factor --> Z = omega / omega_q
! * RS : Wigner-Seitz radius (in units of a_0)
! * OM12 : omega_1^2 \ characteristic squared
! * OM22 : omega_2^2 / frequencies
!
!
! Author : D. Sébilleau
!
! Last modified : 24 Nov 2020
!
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X,Z,RS
REAL (WP), INTENT(IN) :: OM12,OM22
!
COMPLEX (WP) :: CPP1
!
CPP1 = PEEL(X,Z,RS,OM12,OM22) + STA1(OM12,OM22) !
!
END FUNCTION CPP1
!
!=======================================================================
!
FUNCTION CPP2(X,Z,RS,TAU,OM12,OM22)
!
! This function computes the Perel'-Eliashberg dynamic Nevalinna function
!
!
! References: (1) Yu. V. Arkhipov et al, Contrib. Plasma Phys. 53,
! 375-384 (2013)
!
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * Z : dimensionless factor --> Z = omega / omega_q
! * RS : Wigner-Seitz radius (in units of a_0)
! * TAU : relaxation time (in SI)
! * OM12 : omega_1^2 \ characteristic squared
! * OM22 : omega_2^2 / frequencies
!
!
! Author : D. Sébilleau
!
! Last modified : 18 Nov 2020
!
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X,Z,RS,TAU
REAL (WP), INTENT(IN) :: OM12,OM22
!
COMPLEX (WP) :: CPP2
!
CPP2 = PEEL(X,Z,RS,OM12,OM22) + STA2(OM22,TAU) !
!
END FUNCTION CPP2
!
!=======================================================================
!
FUNCTION CPP3(X,Z,OM22,TAU)
!
! This function computes a dynamic Nevalinna function
!
!
! References: (1) D. Ballester and I. M. Tkachenko,
! Contrib. Plasma Phys. 45, 293-299 (2005)
!
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * Z : dimensionless factor --> Z = omega / omega_q
! * OM22 : omega_2^2 characteristic squared frequency
! * TAU : relaxation time (in SI)
!
!
! Author : D. Sébilleau
!
! Last modified : 18 Nov 2020
!
USE REAL_NUMBERS, ONLY : TWO
USE COMPLEX_NUMBERS, ONLY : IC
USE CONSTANTS_P1, ONLY : H_BAR
USE FERMI_SI, ONLY : KF_SI,VF_SI
USE PLASMON_ENE_SI
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X,Z,OM22,TAU
!
REAL (WP) :: U,Q_SI,OM
REAL (WP) :: OMP
REAL (WP) :: ZETA,NUM
!
COMPLEX (WP) :: CPP3
COMPLEX (WP) :: DEN
!
ZETA = 0.27E0_WP !
!
Q_SI = TWO * X * KF_SI ! q in SI
U = X * Z ! omega / (q * v_F)
OM = U * Q_SI * VF_SI ! omega in SI
!
OMP = ENE_P_SI / H_BAR ! omega_p
!
NUM = - ZETA * OMP * OM22 * TAU !
DEN = OM + IC * ZETA * OMP !
!
CPP3 = NUM / DEN ! ref. (1) eq. (16)
!
END FUNCTION CPP3
!
!=======================================================================
!
FUNCTION CPP4(X,Z,T,OM12,OM22)
!
! This function computes a dynamic Nevalinna function
!
!
! References: (1) Yu. V. Arkhipov et al, Contrib. Plasma Phys. 58,
! 967975 (2018)
!
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * Z : dimensionless factor --> Z = omega / omega_q
! * T : temperature in SI
! * OM12 : omega_1^2 \ characteristic squared
! * OM22 : omega_2^2 / frequencies
!
!
! Author : D. Sébilleau
!
! Last modified : 18 Nov 2020
!
USE REAL_NUMBERS, ONLY : ONE
USE COMPLEX_NUMBERS, ONLY : IC
USE CONSTANTS_P1, ONLY : K_B
USE FERMI_SI, ONLY : EF_SI
USE PI_ETC, ONLY : PI_INV
!
USE CHEMICAL_POTENTIAL, ONLY : MU_T
USE SPECIFIC_INT_9
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X,Z,T,OM12,OM22
!
REAL (WP) :: U
REAL (WP) :: ALPHA
REAL (WP) :: KBT,D,ETA
REAL (WP) :: INTG,XI
!
COMPLEX (WP) :: CPP4
!
U = X * Z ! omega / (q * v_F)
!
ALPHA = 0.99E0_WP !
!
KBT = K_B * T !
!
D = EF_SI / KBT ! degeneracy
ETA = MU_T('3D',T) / KBT !
!
! Computing the integral Xi(U)
!
CALL INT_XIZ(U,D,ETA,INTG) !
XI = PI_INV * INTG !
!
CPP4 = STA1(OM12,OM22) / ( & !
ALPHA + IC * (ALPHA - ONE) * XI & ! ref. (1) eq. (23)
) !
!
END FUNCTION CPP4
!
!=======================================================================
!
FUNCTION PST1(X,Z,OM12,OM22)
!
! This function computes a dynamic Nevalinna function
!
!
! References: (1) I. M. Tkachenko, Phys. Sciences and Tech. 5, 16-35 (2016)
!
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * Z : dimensionless factor --> Z = omega / omega_q
! * OM12 : omega_1^2 \ characteristic squared
! * OM22 : omega_2^2 / frequencies
!
!
! Author : D. Sébilleau
!
! Last modified : 27 Nov 2020
!
USE REAL_NUMBERS, ONLY : TWO,TENTH,TTINY
USE COMPLEX_NUMBERS, ONLY : IC
USE PI_ETC, ONLY : SQR_PI,PI
USE CONSTANTS_P1, ONLY : H_BAR
USE EXT_FUNCTIONS, ONLY : DAWSON
USE MINMAX_VALUES
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X,Z,OM12,OM22
!
REAL (WP) :: U,U2
REAL (WP) :: MAX_EXP,MIN_EXP
REAL (WP) :: EXPO
!
REAL (WP) :: EXP
!
COMPLEX (WP) :: PST1
COMPLEX (WP) :: ZF
!
! Computing the max and min value of the exponent of e^x
!
CALL MINMAX_EXP(MAX_EXP,MIN_EXP) !
!
U = X * Z ! omega / (q * v_F)
U2 = U * U !
!
IF(U2 > TENTH * MAX_EXP) THEN !
EXPO = TTINY !
ELSE !
EXPO = EXP(- U2) !
END IF !
!
ZF = IC * SQR_PI * EXPO - TWO * DAWSON(U) !
!
PST1 = OM22 * ZF / SQRT(TWO * PI * OM12) ! ref. (1) eq. (57a)
!
END FUNCTION PST1
!
END MODULE NEVALINNA_FUNCTIONS