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

643 lines
20 KiB
Fortran
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

!
!=======================================================================
!
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