MsSpec-DFM/New_libraries/DFM_library/SCREENING_LIBRARY/screening_vec2.f90

552 lines
16 KiB
Fortran

!
!=======================================================================
!
MODULE SCREENING_VEC2
!
USE ACCURACY_REAL
!
CONTAINS
!
!=======================================================================
!
SUBROUTINE SCREENING_VECTOR2(SC_TYPE,DMN,X,RS,T,KS_SI)
!
! This subroutine computes the screening vector
!
!
! Input parameters:
!
! * SC_TYPE : type of screeening
! SC_TYPE = 'NO' no screening
! SC_TYPE = 'IS' Tago-Utsumi-Ichimaru
! SC_TYPE = 'KL' Kleinman
! SC_TYPE = 'OC' one-component plasma
! SC_TYPE = 'RP' RPA
! SC_TYPE = 'ST' Streitenberger
! SC_TYPE = 'UI' Utsumi-Ichimaru
! SC_TYPE = 'YT' Yasuhara-Takada
! * DMN : dimension of the system
! * X : dimensionless factor --> X = q / (2 * k_F)
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : system temperature in SI
!
!
! Output parameters:
!
! * KS_SI : screening vector expressed in SI
!
!
! Author : D. Sébilleau
!
! Last modified : 9 Oct 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO
!
IMPLICIT NONE
!
CHARACTER (LEN = 2) :: SC_TYPE,DMN
!
INTEGER :: I_KL
!
REAL (WP), INTENT(IN) :: X,RS,T
REAL (WP) :: KS_SI
!
I_KL = 1 ! Kleinman switch
!
IF(SC_TYPE == 'NO') THEN !
KS_SI = ZERO !
ELSE IF(SC_TYPE == 'IS') THEN !
CALL TUI_VECTOR(DMN,T,RS,KS_SI) !
ELSE IF(SC_TYPE == 'KL') THEN !
CALL KLEINMAN_VECTOR(DMN,X,I_KL,KS_SI) !
ELSE IF(SC_TYPE == 'OC') THEN !
CALL OCP_VECTOR(DMN,T,KS_SI) !
ELSE IF(SC_TYPE == 'RP') THEN !
CALL RPA_VECTOR(DMN,X,KS_SI) !
ELSE IF(SC_TYPE == 'ST') THEN !
CALL STREITENBERGER_VECTOR(DMN,RS,KS_SI) !
ELSE IF(SC_TYPE == 'UI') THEN !
CALL UTSUMI_ICHIMARU_VECTOR(DMN,RS,KS_SI) !
ELSE IF(SC_TYPE == 'YT') THEN !
CALL YASUHARA_TAKADA_VECTOR(DMN,RS,T,KS_SI) !
END IF !
!
END SUBROUTINE SCREENING_VECTOR2
!
!=======================================================================
!
SUBROUTINE UTSUMI_ICHIMARU_VECTOR(DMN,RS,K_WS_SI)
!
! This subroutine computes the Utsumi-Ichimaru screening vector
! used for computing the screening static structure factor
!
! Reference: K. Utsumi and S. Ichimaru, Phys. Rev. B 22,
! 5203-5212 (1980)
!
!
! Input parameters:
!
! * DMN : dimension of the system
! * RS : Wigner-Seitz radius (in units of a_0)
!
!
! Output parameters:
!
! * K_WS_SI : screening vector expressed in SI
!
!
! Author : D. Sébilleau
!
! Last modified : 5 Oct 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO,TWO,THREE,HALF
USE PI_ETC, ONLY : PI_INV
USE FERMI_SI, ONLY : KF_SI
USE UTILITIES_1, ONLY : ALFA
USE ENERGIES, ONLY : EC_TYPE
USE CORRELATION_ENERGIES
!
IMPLICIT NONE
!
CHARACTER (LEN = 2) :: DMN
!
REAL (WP), INTENT(IN) :: RS
REAL (WP), INTENT(OUT) :: K_WS_SI
!
REAL (WP) :: ALPHA,EC,D_EC_1,D_EC_2
!
IF(DMN /= '3D') THEN !
K_WS_SI = ZERO !
GO TO 10 !
END IF !
!
ALPHA = ALFA('3D') !
!
! Computing the correlation energy and its derivatives
!
EC = EC_3D(EC_TYPE,1,RS,ZERO) !
CALL DERIVE_EC_3D(EC_TYPE,1,5,RS,ZERO,D_EC_1,D_EC_2) !
!
K_WS_SI = KF_SI * ( THREE * HALF * PI_INV - ALPHA * ( & !
RS * RS * EC + TWO * RS * D_EC_1 ) & ! ref. (1) eq. (38)
) !
!
10 RETURN
!
END SUBROUTINE UTSUMI_ICHIMARU_VECTOR
!
!=======================================================================
!
SUBROUTINE KLEINMAN_VECTOR(DMN,X,I_KL,K_KL_SI)
!
! This subroutine computes the Kleinman screening vector
!
! Reference: (1) : P. R. Antoniewicz and L. Kleinman, Phys. Rev. B 2,
! 2808-2811 (1970)
!
!
! Input parameters:
!
! * DMN : dimension of the system
! * X : dimensionless factor --> X = q / (2 * k_F)
! * I_KL : switch
! I_KL = 1 : for coefficient A
! I_KL = 2 : for coefficient B
!
!
!
! Output parameters:
!
! * K_KL_SI : screening vector expressed in SI
!
!
! Author : D. Sébilleau
!
! Last modified : 5 Oct 2020
!
!
!
USE REAL_NUMBERS, ONLY : ZERO,ONE,TWO,HALF
USE FERMI_SI, ONLY : KF_SI
USE LINDHARD_FUNCTION, ONLY : LINDHARD_S
USE SCREENING_VEC, ONLY : THOMAS_FERMI_VECTOR
!
IMPLICIT NONE
!
CHARACTER (LEN = 2) :: DMN
!
INTEGER, INTENT(IN) :: I_KL
!
REAL (WP), INTENT(IN) :: X
REAL (WP), INTENT(OUT) :: K_KL_SI
!
REAL (WP) :: ALF,K2
REAL (WP) :: Q_SI,K_TF_SI,LR,LI,Z2
!
REAL (WP) :: EXP,SQRT
!
IF(DMN /= '3D') THEN !
K_KL_SI = ZERO !
GO TO 10 !
END IF !
!
Q_SI = TWO * X * KF_SI ! q in SI
!
ALF = HALF * (ONE + EXP(-X)) ! ref. (1) eq. (21)
!
IF(I_KL == 1) THEN !
K2 = TWO * ALF * KF_SI * KF_SI !
ELSE IF(I_KL == 2) THEN !
K2 = TWO * KF_SI * KF_SI * (ALF + TWO * X * X) !
END IF !
!
! Computing the Thomas-Fermi screening vector
!
CALL THOMAS_FERMI_VECTOR(DMN,K_TF_SI) !
!
Z2 = K_TF_SI * K_TF_SI / (Q_SI * Q_SI) ! (q_{TF}/q)^2
!
! Computing the RPA static dielectric function:
!
! epsilon(q) = 1 + (q_{TF}/q)^2 * LR
!
CALL LINDHARD_S(X,DMN,LR,LI) !
!
K_KL_SI = SQRT(K2 * Z2 * LR) ! ref. (1) eq. (20)
!
10 RETURN
!
END SUBROUTINE KLEINMAN_VECTOR
!
!=======================================================================
!
SUBROUTINE STREITENBERGER_VECTOR(DMN,RS,K_ST_SI)
!
! This subroutine computes the Streintenberger screening vector
!
! Reference: (1) : P. Streintenberger, Phys. Stat. Sol. (b) 125,
! 681-692 (1984)
!
!
! Input parameters:
!
! * DMN : dimension of the system
! * RS : Wigner-Seitz radius (in units of a_0)
!
!
!
! Output parameters:
!
! * K_ST_SI : screening vector expressed in SI
!
!
! Author : D. Sébilleau
!
! Last modified : 6 Oct 2020
!
!
!
USE DIMENSION_CODE, ONLY : NSIZE
USE REAL_NUMBERS, ONLY : ZERO,ONE,FOUR,HALF
USE PI_ETC, ONLY : PI
USE FERMI_SI, ONLY : KF_SI
USE FIND_ZERO, ONLY : FIND_ZERO_FUNC
!
IMPLICIT NONE
!
CHARACTER (LEN = 2) :: DMN
!
INTEGER :: I
!
INTEGER, PARAMETER :: N_MAX = 400 ! max. number of points
!
REAL (WP), INTENT(IN) :: RS
REAL (WP), INTENT(OUT) :: K_ST_SI
!
REAL (WP) :: CC,YY,ZEROF
REAL (WP) :: Y(NSIZE),F(NSIZE)
!
REAL (WP), PARAMETER :: Y_MAX = 16.0E0_WP ! max. value of (K_ST_SI / KF_SI)^2
!
REAL (WP) :: FLOAT,LOG,SQRT
!
IF(DMN /= '3D') THEN !
K_ST_SI = ZERO !
GO TO 10 !
END IF !
!
CC = PI * KF_SI !
!
! Constructing the function whose zero is seeked
!
! Abscissa : Y = (K_ST_SI / KF_SI)^2
!
DO I = 1, N_MAX !
Y(I) = FLOAT(I) * Y_MAX / FLOAT(N_MAX) !
YY = Y(I)
F(I) = YY * (CC - HALF + YY * LOG(ONE + FOUR / YY)) - FOUR ! ref. (1) eq. (59)
END DO !
!
! Finding the zero
!
CALL FIND_ZERO_FUNC(Y,F,N_MAX,ZEROF) !
!
K_ST_SI = KF_SI * SQRT(ZEROF) !
!
10 RETURN
!
END SUBROUTINE STREITENBERGER_VECTOR
!
!=======================================================================
!
SUBROUTINE YASUHARA_TAKADA_VECTOR(DMN,RS,T,K_YT_SI)
!
! This subroutine computes the Yasuhara-Takada screening vector
!
! Reference: (1) : H. Yasuhara and Y. Takada, Phys. Rev. B 43,
! 7200-7211 (1991)
!
!
! Input parameters:
!
! * DMN : dimension of the system
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : system temperature in SI
!
!
!
! Output parameters:
!
! * K_YT_SI : screening vector expressed in SI
!
!
! Note: We use here the fact that the isothermal compressibility
! can be expressed as :
!
! K_T^0 4
! 1 - ------- = ---- alpha RS * gamma_0(RS)
! K_T pi
!
! Author : D. Sébilleau
!
! Last modified : 6 Oct 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO,ONE,TWO,FOUR
USE PI_ETC, ONLY : PI_INV
USE GAMMA_ASYMPT, ONLY : GAMMA_0_3D
USE UTILITIES_1, ONLY : ALFA
USE SCREENING_VEC, ONLY : THOMAS_FERMI_VECTOR
!
IMPLICIT NONE
!
CHARACTER (LEN = 2) :: DMN
!
REAL (WP), INTENT(IN) :: RS,T
REAL (WP), INTENT(OUT) :: K_YT_SI
!
REAL (WP) :: G0,ALPHA
REAL (WP) :: K0K,K_TF_SI
!
REAL (WP) :: SQRT
!
IF(DMN /= '3D') THEN !
K_YT_SI = ZERO !
GO TO 10 !
END IF !
!
G0 = GAMMA_0_3D(RS,T) ! gamma_0(RS)
!
ALPHA = ALFA('3D') !
!
K0K = ONE - FOUR * PI_INV * ALPHA * RS * G0 ! K_T^0 / K_T
!
CALL THOMAS_FERMI_VECTOR('3D',K_TF_SI) !
!
K_YT_SI = K_TF_SI / SQRT(TWO - K0K) ! ref. (1) eq. (3.31)
!
10 RETURN
!
END SUBROUTINE YASUHARA_TAKADA_VECTOR
!
!=======================================================================
!
SUBROUTINE OCP_VECTOR(DMN,T,K_OC_SI)
!
! This subroutine computes the one-component plasma screening vector
!
! Reference: (1) : S. V. Adamjan, I. M. Tkachenko,
! J.L. Munoz-Cobo Gonzalez and G. Verdu Martin,
! Phys. Rev. E 48, 2067-2072 (1993)
! (2) : N. G. Nilsson, Phys. Stat. Sol. (a) 19, K75 (1973)
!
!
! Input parameters:
!
! * DMN : dimension of the system
! * T : system temperature in SI
!
!
!
! Output parameters:
!
! * K_YT_SI : screening vector expressed in SI
!
!
! Author : D. Sébilleau
!
! Last modified : 9 Oct 2020
!
!
USE REAL_NUMBERS, ONLY : ONE,TWO,THREE,HALF,THIRD,FOURTH
USE PI_ETC, ONLY : SQR_PI
!
USE PLASMON_SCALE_P, ONLY : NONID
USE SPECIFIC_INT_7
USE SCREENING_VEC, ONLY : THOMAS_FERMI_VECTOR
!
IMPLICIT NONE
!
CHARACTER (LEN = 2) :: DMN
!
REAL (WP), INTENT(IN) :: T
REAL (WP), INTENT(OUT):: K_OC_SI
!
REAL (WP) :: K_TF_SI
REAL (WP) :: TH,U,V,ETA
REAL (WP) :: G3O2,FM1O2
!
REAL (WP) :: LOG,SQRT
!
TH = ONE / NONID !
!
! Computing the Thomas-Fermi screening vector
!
CALL THOMAS_FERMI_VECTOR(DMN,K_TF_SI) !
!
! Calculation of eta = mu / k_B T from the
! relation:
! 3 1
! F (eta) = --- -----------
! 1/2 2 TH^{3/2}
!
! with
!
! F (eta) approximated from ref. (2)
! 1/2
!
G3O2 = HALF * SQR_PI ! Gamma(3/2)
U = G3O2 * THREE * HALF / (TH*1.5E0_WP) ! ref. (1) eq. (3.5)
!
V = (THREE * SQR_PI * U * FOURTH)**(TWO * THIRD) ! ref. (2) eq. (8)
ETA = LOG(U) / (ONE - U*U) + V - & !
V / (0.24E0_WP + 1.08E0_WP * V)**2 !
!
! Computing the Fermi-Dirac integral F (eta)
! -1/2
!
FM1O2 = FD(ETA,-HALF) !
!
K_OC_SI = K_TF_SI * SQRT(HALF * SQRT(TH) * FM1O2) ! ref. (1) eq. (3.3)
!
END SUBROUTINE OCP_VECTOR
!
!=======================================================================
!
SUBROUTINE RPA_VECTOR(DMN,X,K_RP_SI)
!
! This subroutine computes the RPA screening vector
!
!
! Input parameters:
!
! * DMN : dimension of the system
! * X : dimensionless factor --> X = q / (2 * k_F)
!
!
!
! Output parameters:
!
! * K_RP_SI : screening vector expressed in SI
!
!
! Author : D. Sébilleau
!
! Last modified : 9 Oct 2020
!
!
USE LINDHARD_FUNCTION, ONLY : LINDHARD_S
USE SCREENING_VEC, ONLY : THOMAS_FERMI_VECTOR
!
IMPLICIT NONE
!
CHARACTER (LEN = 2) :: DMN
!
REAL (WP), INTENT(IN) :: X
REAL (WP), INTENT(OUT):: K_RP_SI
!
REAL (WP) :: K_TF_SI
REAL (WP) :: LR,LI
!
! Computing the Thomas-Fermi screening vector
!
CALL THOMAS_FERMI_VECTOR(DMN,K_TF_SI) !
!
! Computing the Lindhard static function
!
CALL LINDHARD_S(X,DMN,LR,LI) !
!
K_RP_SI = K_TF_SI * LR !
!
END SUBROUTINE RPA_VECTOR
!
!=======================================================================
!
SUBROUTINE TUI_VECTOR(DMN,RS,T,K_IS_SI)
!
! This subroutine computes the Tago-Utsumi-Ichimaru screening vector
!
! Reference: (1) : K. Tago, K. Utsumi and S. Ichimaru,
! Prog. Theor. Phys. 65, 54-65 (1981)
!
!
! Input parameters:
!
! * DMN : dimension of the system
! * RS : Wigner-Seitz radius (in units of a_0)
! * T : system temperature in SI
!
!
!
! Output parameters:
!
! * K_IS_SI : screening vector expressed in SI
!
!
!
! Author : D. Sébilleau
!
! Last modified : 11 Dec 2020
!
!
USE REAL_NUMBERS, ONLY : TWO
USE CONSTANTS_P1, ONLY : BOHR,K_B
USE PLASMON_SCALE_P, ONLY : NONID
USE THERMODYNAMIC_PROPERTIES, ONLY : U_IT_3D
!
IMPLICIT NONE
!
CHARACTER (LEN = 2) :: DMN
!
REAL (WP), INTENT(IN) :: RS,T
REAL (WP), INTENT(OUT):: K_IS_SI
!
K_IS_SI = - TWO * U_IT_3D(T) / (RS * BOHR * NONID) ! ref. (1) eq. (31)
!
END SUBROUTINE TUI_VECTOR
!
END MODULE SCREENING_VEC2