MsSpec-DFM/New_libraries/DFM_library/CALCULATORS_LIBRARY/calculators_2.f90

486 lines
15 KiB
Fortran

!
!=======================================================================
!
MODULE CALCULATORS_2
!
USE ACCURACY_REAL
!
! This module contains the subroutines allowing to compute
! various properties of the electron/plasma liquids:
!
! * plasmon dispersion : CALC_PDI
! * electron-hole dispersion : CALC_EHD
! * two electron-hole dispersion : CALC_E2D
! * k-space e-e potential : CALC_EEK
! * r-space e-e potential : CALC_EER
! * plasmon kinetic energy : CALC_EKP
!
CONTAINS
!
!=======================================================================
!
SUBROUTINE CALC_PDI(X)
!
!
! This subroutine computes the analytical plasmon dispersion
! without damping
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
!
!
! Output variables :
!
! * ENE_P_Q : plasmon energy at q in J
!
!
! Author : D. Sébilleau
!
! Last modified : 16 Dec 2020
!
!
!
USE MATERIAL_PROP, ONLY : RS,DMN
USE EXT_FIELDS, ONLY : T
USE REAL_NUMBERS, ONLY : ONE,TWO
USE FERMI_SI, ONLY : EF_SI,KF_SI
USE PLASMON_DISPERSION
USE PLASMON_DISP_REAL
USE SCREENING_TYPE
USE SCREENING_VEC
USE COULOMB_K
!
USE OUT_VALUES_2, ONLY : I_PD
USE PRINT_FILES, ONLY : IO_PD
!
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X
!
REAL (WP) :: ENE_P_Q
REAL (WP) :: Y
!
IF(PL_DISP == ' EXACT') GO TO 10 !
!
Y = X + X ! q / k_F
!
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 !
!
! Writes the plasmon dispersion as a function of x
!
IF(I_PD == 1) THEN !
WRITE(IO_PD,*) Y,ENE_P_Q / EF_SI ! x : q/k_F, y : E/E_F
END IF !
!
10 RETURN !
!
END SUBROUTINE CALC_PDI
!
!=======================================================================
!
SUBROUTINE CALC_EHD
!
! This subroutine gives the electron-hole pair dispersion curves.
!
! ---> The result is given in eV <---
!
! We have written: hbar^2 / 2m = a_0^2 * Ryd where a_0 is Bohr's radius
! and Ryd is one Rydberg in eV
!
!
! Output variables :
!
! * EH_M : right-handside dispersion curve
! * EH_P : left-handside dispersion curve
!
!
! In order to compare to the plasmon dispersion, where the coeffiecients
! of (hbar omega)^2 have been stored, we store here the coefficients
! of (EH_M)^2 = AE(0)+AE(1)*Q + AE(2)*Q^2 + AE(3)*Q^3 + AE(4)*Q^4
!
!
! Author : D. Sébilleau
!
! Last modified : 15 Sep 2020
!
!
USE DIMENSION_CODE, ONLY : NSIZE
USE MATERIAL_PROP, ONLY : DMN
USE REAL_NUMBERS, ONLY : ZERO,ONE,TWO,FOUR,FOURTH
USE CONSTANTS_P1, ONLY : BOHR
USE FERMI_SI, ONLY : KF_SI
USE ENE_CHANGE, ONLY : RYD
USE DISP_COEF_EH
!
USE Q_GRID
!
USE OUT_VALUES_2, ONLY : I_EH
USE PRINT_FILES, ONLY : IO_EH
!
IMPLICIT NONE
!
REAL (WP) :: QM,Q
REAL (WP) :: EH_P(NSIZE),EH_M(NSIZE)
!
REAL (WP) :: EF,KF,Y,Q0,Q02,STEP
!
REAL (WP) :: FLOAT,ABS
!
INTEGER :: QN,I,IO
!
KF = BOHR * KF_SI ! k_F in unit of a_O^{-1}
EF = KF * KF * RYD ! E_F in eV
!
STEP = Q_STEP * KF_SI ! step in SI
!
! Initialisation of the coefficients
!
DO I = 0, 6 !
AE(I) = ZERO !
END DO !
!
! Loop on q-points
!
DO QN = 1, N_Q !
!
Q = Q_MIN * KF_SI + FLOAT(QN - 1) * STEP ! step incremented
!
Q0 = BOHR * Q ! q in unit of a_O^{-1}
Q02 = Q0 * Q0 !
Y = Q0 / KF ! dimensionless momentum
!
IF(DMN == '3D') THEN !
!
!.......... 3D case ..........
!
EH_P(QN) = (Q02 + TWO * Q0 * KF) * RYD !
EH_M(QN) = (Q02 - TWO * Q0 * KF) * RYD !
AE(2) = FOUR * KF * KF * FOURTH ! division by 4 because
AE(3) = FOUR * KF * FOURTH ! AU = Hartree = 2 Rydbergs
AE(4) = ONE * FOURTH ! and AE in AU
!
ELSE IF(DMN == '2D') THEN !
!
!.......... 2D case ..........
!
! Reference: G. F. Giuliani and J. J. Quinn, Phys. Rev. B 26, 4421 (1982)
!
EH_P(QN) = (TWO * Q0 * KF + Q02) * RYD !
EH_M(QN) = (TWO * Q0 * KF - Q02) * RYD !
AE(2) = FOUR * KF * KF * FOURTH ! division by 4 because
AE(3) = FOUR * KF * FOURTH ! AU = Hartree = 2 Rydbergs
AE(4) = ONE * FOURTH ! and AE in AU
!
ELSE IF(DMN == '1D') THEN !
!
!.......... 1D case ..........
!
EH_P(QN) = ABS(Q02 + TWO * Q0 * KF) * RYD !
EH_M(QN) = ABS(Q02 - TWO * Q0 * KF) * RYD !
AE(2) = FOUR * KF * KF * FOURTH ! division by 4 because
AE(3) = FOUR * KF * FOURTH ! AU = Hartree = 2 Rydbergs
AE(4) = ONE * FOURTH ! and AE in AU
!
END IF !
!
! Writes the dispersion curves E/E_F as a function of q/k_F
!
IF(I_EH == 1) THEN !
WRITE(IO_EH,*) Y,EH_P(QN) / EF,EH_M(QN) / EF ! x : q/k_F, y : E/E_F
END IF !
!
END DO !
!
END SUBROUTINE CALC_EHD
!
!=======================================================================
!
SUBROUTINE CALC_E2D
!
! This subroutine gives the 2 electron-hole pairs dispersion curves.
!
! Note: in this case, there is no letf-hand side, but only a limit
! on the right-hand side
!
! References: (1) M. E. Bachlechner, A. Holas, H. M. Böhm and A. Schinner,
! Nucl. Instr. and Meth. B 115, 23-26 (1996)
!
! ---> The result is given in eV <---
!
!
! Output variables :
!
! * TWO_EH_M : right-handside dispersion curve
!
!
! Author : D. Sébilleau
!
! Last modified : 15 Sep 2020
!
!
USE DIMENSION_CODE, ONLY : NSIZE
USE MATERIAL_PROP, ONLY : DMN
USE REAL_NUMBERS, ONLY : ZERO,TWO
USE CONSTANTS_P1, ONLY : BOHR
USE FERMI_SI, ONLY : KF_SI
USE ENE_CHANGE, ONLY : RYD
!
USE Q_GRID
!
USE OUT_VALUES_2, ONLY : I_E2
USE PRINT_FILES, ONLY : IO_E2
!
IMPLICIT NONE
!
INTEGER :: QN
!
REAL (WP) :: QM,Q
REAL (WP) :: Y,Q0,Q02,XN,STEP
REAL (WP) :: N_EH_M
REAL (WP) :: EF,KF
!
REAL (WP) :: FLOAT
!
XN = TWO ! number of e-h pairs created
!
STEP = Q_STEP * KF_SI ! step in SI
!
KF = BOHR * KF_SI ! k_F in unit of a_O^{-1}
EF = KF * KF * RYD ! E_F in eV
!
! Loop on q-points
!
DO QN = 1, N_Q !
!
Q = Q_MIN * KF_SI + FLOAT(QN - 1) * STEP ! step incremented
!
Q0 = BOHR * Q ! q in unit of a_O^{-1}
Q02 = Q0 * Q0 !
Y = Q0 / KF ! dimensionless momentum
!
IF(DMN == '3D') THEN !
!
!.......... 3D case ..........
!
IF(Y <= TWO * XN) THEN !
N_EH_M = ZERO !
ELSE !
N_EH_M = (Q02 - TWO * XN * Q0 * KF) * RYD / XN ! ref. (1) eq. (9)
END IF !
!
ELSE IF(DMN == '2D') THEN !
!
!.......... 2D case ..........
!
CONTINUE
!
ELSE IF(DMN == '1D') THEN !
!
!.......... 1D case ..........
!
CONTINUE
!
!
END IF !
!
! Writes the dispersion curves E/E_F as a function of q/k_F
!
IF(I_E2 == 1) THEN !
WRITE(IO_E2,*) Y,N_EH_M / EF ! x : q/k_F, y : E/E_F
END IF !
!
END DO !
!
END SUBROUTINE CALC_E2D
!
!=======================================================================
!
SUBROUTINE CALC_EEK(X)
!
!
! This subroutine computes the electron-electron interaction potential
! in the k-space
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
!
!
! Author : D. Sébilleau
!
! Last modified : 7 Oct 2020
!
!
USE DIMENSION_CODE, ONLY : NSIZE
USE MATERIAL_PROP, ONLY : DMN,RS
USE EXT_FIELDS, ONLY : T
USE UNITS
USE SCREENING_TYPE
USE SCREENING_VEC
USE INTERACTION_POTENTIALS_K
!
USE Q_GRID
!
USE EL_ELE_INTER
!
USE REAL_NUMBERS, ONLY : ONE
USE FERMI_AU, ONLY : KF_AU
USE FERMI_SI, ONLY : KF_SI
!
USE OUT_VALUES_2, ONLY : I_CK
USE PRINT_FILES, ONLY : IO_CK
!
IMPLICIT NONE
!
INTEGER :: IQ
!
REAL (WP), INTENT(IN) :: X
REAL (WP) :: KS_SI,KS
REAL (WP) :: Q,VQ
!
REAL (WP) :: FLOAT
!
! Computing the screening vector
!
CALL SCREENING_VECTOR(SC_TYPE,DMN,X,RS,T,KS_SI) !
!
! Screening vector in units of UNIK
!
IF(UNIK == 'SI') THEN !
KS = KS_SI !
ELSE IF(UNIK == 'AU') THEN !
KS = KS_SI * KF_AU / KF_SI !
END IF !
!
! Loop on q-points
!
DO IQ = 1,N_Q !
!
Q = Q_MIN * KF_SI + FLOAT(IQ - 1) * Q_STEP ! step incremented
!
CALL INTERACT_POT_K_3D(INT_POT,UNIT,UNIK,ONE,ONE,ONE,ONE, & !
Q,KS,VQ) !
!
IF(I_CK == 1) THEN !
WRITE(IO_CK,*) Q,VQ !
END IF !
!
END DO !
!
END SUBROUTINE CALC_EEK
!
!=======================================================================
!
SUBROUTINE CALC_EER(X)
!
!
! This subroutine computes the electron-electron interaction potential
! in the real space
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
!
!
! Author : D. Sébilleau
!
! Last modified : 14 Apr 2021
!
!
USE DIMENSION_CODE, ONLY : NSIZE
USE MATERIAL_PROP, ONLY : DMN,RS
USE EXT_FIELDS, ONLY : T
USE SCREENING_TYPE
USE SCREENING_VEC
USE INTERACTION_POTENTIALS_R
!
USE R_GRID
!
USE REAL_NUMBERS, ONLY : ONE
USE FERMI_AU, ONLY : KF_AU
USE FERMI_SI, ONLY : KF_SI
!
USE OUT_VALUES_2, ONLY : I_CR
USE PRINT_FILES, ONLY : IO_CR
!
IMPLICIT NONE
!
CHARACTER (LEN = 3) :: UNIT
!
INTEGER :: IR
!
REAL (WP), INTENT(IN) :: X
REAL (WP) :: KS_SI,KS
REAL (WP) :: R,VR
!
REAL (WP) :: FLOAT
!
UNIT = 'CGS' !
!
! Computing the screening vector
!
CALL SCREENING_VECTOR(SC_TYPE,DMN,X,RS,T,KS_SI) !
!
! Screening vector in units of 1/a_0
!
KS = KS_SI * KF_AU / KF_SI !
!
DO IR = 1,N_R ! r loop
!
R = R_MIN + FLOAT(IR - 1) * R_STEP ! r/a0 point
!
CALL INTERACT_POT_R_3D(UNIT,R,ONE,ONE,KS,VR) !
!
IF(I_CR == 1) THEN !
WRITE(IO_CR,*) R,VR !
END IF !
!
END DO !
!
END SUBROUTINE CALC_EER
!
!=======================================================================
!
SUBROUTINE CALC_EKP(X)
!
!
! This subroutine computes the plasmon kinetic energy
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
!
!
! Author : D. Sébilleau
!
! Last modified : 29 Oct 2020
!
!
!
USE OUT_VALUES_2, ONLY : I_PK
USE PRINT_FILES, ONLY : IO_PK
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X
REAL (WP) :: Y,Y2
!
Y = X + X ! q / k_F
Y2 = Y * Y !
!
IF(I_PK == 1) THEN !
WRITE(IO_PK,*) X,Y2 !
END IF !
!
END SUBROUTINE CALC_EKP
!
END MODULE CALCULATORS_2