MsSpec-DFM/New_libraries/DFM_library/UTILITIES_LIBRARY/utilities_3.f90

546 lines
16 KiB
Fortran

!
!=======================================================================
!
MODULE UTILITIES_3
!
USE ACCURACY_REAL
!
! It contains the following functions/subroutines:
!
! * SUBROUTINE EPS_TO_CHI(EPSR,EPSI,VC,CHIR,CHII)
! * SUBROUTINE EPS_TO_PI(EPSR,EPSI,VC,PIR,PII)
! * SUBROUTINE EPS_TO_SIGMA(X,Z,EPSR,EPSI,SIGMAR,SIGMAI)
! * SUBROUTINE EPS_TO_SQO(X,Z,T,RS,DMN,EPSR,EPSI,VC,SQO)
! * FUNCTION LOSS_TO_SF(X,Z,T,LOSS)
! * FUNCTION SF_TO_LOSS(X,Z,T,SQO)
! * SUBROUTINE SQO_TO_EPSI(X,Z,T,RS,DMN,VC,SQO,EPSI)
!
!
CONTAINS
!
!
!=======================================================================
!
SUBROUTINE EPS_TO_CHI(EPSR,EPSI,VC,CHIR,CHII)
!
! This subroutine computes the dielectric susceptibility, also called
! the density-density response function, from the knowledge
! of the dielectric function, following the formula
!
! 1
! EPS(q,omega) = ----------------------------
! 1 + Vc(q) * CHI(q,omega)
!
!
!
! Input parameters:
!
! * EPSR : real part of dielectric function
! * EPSI : imaginary part of dielectric function
! * VC : Coulomb potential in k-space
!
!
! Output variables :
!
! * CHIR : real part of dielectric susceptibility
! * CHII : imaginary part of dielectric susceptibility
!
!
! Author : D. Sébilleau
!
! Last modified : 4 Jun 2020
!
!
USE REAL_NUMBERS, ONLY : ONE
USE COMPLEX_NUMBERS, ONLY : IC
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: EPSR,EPSI,VC
REAL (WP), INTENT(OUT) :: CHIR,CHII
!
REAL (WP) :: REAL,AIMAG
!
COMPLEX (WP) :: EPS,CHI
!
EPS = EPSR + IC * EPSI !
!
CHI = (ONE / EPS - ONE) / VC !
!
CHIR = REAL(CHI,KIND=WP) !
CHII = AIMAG(CHI) !
!
END SUBROUTINE EPS_TO_CHI
!
!=======================================================================
!
SUBROUTINE EPS_TO_PI(EPSR,EPSI,VC,PIR,PII)
!
! This subroutine computes irreducible polarizability,
! following the formula
!
! EPS(q,omega) = 1 - Vc(q) * PI(q,omega)
!
!
!
! Input parameters:
!
! * EPSR : real part of dielectric function
! * EPSI : imaginary part of dielectric function
! * VC : Coulomb potential in k-space
!
!
! Output variables :
!
! * PIR : real part of irreducible polarizability
! * PII : imaginary part of irreducible polarizability
!
!
! Author : D. Sébilleau
!
! Last modified : 4 Jun 2020
!
USE REAL_NUMBERS, ONLY : ONE
USE COMPLEX_NUMBERS, ONLY : IC
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: EPSR,EPSI,VC
REAL (WP), INTENT(OUT) :: PIR,PII
!
REAL (WP) :: REAL,AIMAG
!
COMPLEX (WP) :: EPS,PPI
!
EPS = EPSR + IC * EPSI !
PPI = (EPS - ONE) / VC !
!
PIR = REAL(PPI,KIND=WP) !
PII = AIMAG(PPI) !
!
END SUBROUTINE EPS_TO_PI
!
!=======================================================================
!
SUBROUTINE EPS_TO_SIGMA(X,Z,EPSR,EPSI,SIGMAR,SIGMAI)
!
! This subroutine computes conductivity,
! following the formula
!
! i
! EPS(q,omega) = 1 + --------------- * SIGMA(q,omega)
! omega * EPS_0
!
!
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * Z : omega / omega_q --> dimensionless
! * EPSR : real part of dielectric function
! * EPSI : imaginary part of dielectric function
!
!
! Output variables :
!
! * SIGMAR : real part of conductivity
! * SIGMAI : imaginary part of conductivity
!
!
! Author : D. Sébilleau
!
! Last modified : 23 Oct 2020
!
USE REAL_NUMBERS, ONLY : ONE,HALF
USE COMPLEX_NUMBERS, ONLY : IC
USE CONSTANTS_P1, ONLY : EPS_0
USE FERMI_SI, ONLY : KF_SI,VF_SI
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X,Z,EPSR,EPSI
REAL (WP), INTENT(OUT) :: SIGMAR,SIGMAI
!
REAL (WP) :: Y,U
REAL (WP) :: Q_SI,OMEGA
!
REAL (WP) :: REAL,AIMAG
!
COMPLEX (WP) :: EPS,SIGMA
!
Y = X + X ! Y = q / k_F
U = X * Z ! U = omega / (q v_F)
!
Q_SI = Y * KF_SI ! q in SI
!
OMEGA = Q_SI * VF_SI * U ! omega in SI
!
EPS = EPSR + IC * EPSI !
!
SIGMA = (ONE - EPS) * IC * OMEGA * EPS_0 !
!
SIGMAR = REAL(SIGMA,KIND=WP) !
SIGMAI = AIMAG(SIGMA) !
!
END SUBROUTINE EPS_TO_SIGMA
!
!=======================================================================
!
SUBROUTINE EPS_TO_SQO(X,Z,T,RS,DMN,EPSR,EPSI,VC,SQO)
!
! This subroutine computes dynamic structure factor,
! following the formula
! _ _
! 2*h_bar 1 | 1 |
! S(q,omega) = --------- * ------------------------------- * Im| - --- |
! n*Vc(q) 1 - exp(-h_bar*omega / k_B*T) |_ eps _|
!
!
!
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * Z : omega / omega_q --> dimensionless
! * T : temperature in SI
! * RS : Wigner-Seitz radius (in units of a_0)
! * DMN : problem dimension
! * EPSR : real part of dielectric function
! * EPSI : imaginary part of dielectric function
! * VC : Coulomb potential in k-space
!
!
! Output variables :
!
! * SQO : dynamic structure factor
!
!
! Author : D. Sébilleau
!
! Last modified : 21 Dec 2020
!
!
USE REAL_NUMBERS, ONLY : ZERO,ONE,TWO,HALF
USE COMPLEX_NUMBERS, ONLY : IC
USE CONSTANTS_P1, ONLY : H_BAR,K_B
USE FERMI_SI, ONLY : KF_SI,VF_SI
USE UTILITIES_1, ONLY : RS_TO_N0
USE MINMAX_VALUES
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X,Z,T,RS
REAL (WP), INTENT(IN) :: EPSR,EPSI,VC
REAL (WP), INTENT(OUT) :: SQO
!
REAL (WP) :: MAX_EXP,MIN_EXP
REAL (WP) :: Y,U
REAL (WP) :: Q_SI,OMEGA,EX,KOEF
REAL (WP) :: IMG,EXPO
REAL (WP) :: N0
!
REAL (WP) :: EXP
!
CHARACTER (LEN = 2) :: DMN
!
! Computing the max and min value of the exponent of e^x
!
CALL MINMAX_EXP(MAX_EXP,MIN_EXP) !
!
Y = X + X ! Y = q / k_F
U = X * Z ! U = omega / (q v_F)
!
Q_SI = Y * KF_SI ! q in SI
!
OMEGA = Q_SI * VF_SI * U ! omega in SI
! _ _
! | 1 |
! Computing Im| - --- |
! |_ eps _|
!
IMG = EPSI / (EPSR * EPSR + EPSI * EPSI) !
!
! Computing the electron density from the Wigner-Seitz radius
!
N0 = RS_TO_N0(DMN,RS) !
!
EX = - H_BAR * OMEGA / (K_B * T) !
!
! Checking if exp(- ex) can be represented
!
IF(EX > MIN_EXP) THEN !
EXPO = EXP(EX) !
ELSE !
EXPO = ZERO !
END IF !
!
KOEF = TWO * H_BAR / (N0 * VC) ! coef. of formula
!
SQO = KOEF * ONE / (ONE - EXPO) * IMG !
!
END SUBROUTINE EPS_TO_SQO
!
!=======================================================================
!
FUNCTION LOSS_TO_SF(X,Z,T,LOSS)
!
! This function transforms a loss function L(q,omega) into a
! structure factor S(q,omega)
! Note: It makes use of the fluctuation-dissipation theorem
! to obtain
!
! S(q,omega) = (k_B T / Pi V_C) * B(h_bar omega / k_B T) * L(q,omega)
!
! where B(x) is the Bose factor : B(x) = x / ( 1 - exp(-x) )
!
!
! References: (1) Yu. V. Arkhipov et al, Contrib. Plasma Phys.
! 55, 381-389 (2015)
!
!
! --> Warning: 3D only at present <--
!
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * Z : omega / omega_q --> dimensionless
! * T : temperature in SI
! * LOSS : value of the loss function
!
!
! Author : D. Sébilleau
!
! Last modified : 4 Jun 2020
!
!
USE MATERIAL_PROP, ONLY : DMN,RS
USE SCREENING_TYPE
!
USE REAL_NUMBERS, ONLY : ONE,HALF
USE CONSTANTS_P1, ONLY : H_BAR,K_B
USE FERMI_SI, ONLY : KF_SI,VF_SI
USE PI_ETC, ONLY : PI_INV
!
USE SCREENING_VEC
USE COULOMB_K
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X,Z,T,LOSS
REAL (WP) :: LOSS_TO_SF
REAL (WP) :: Y,U
REAL (WP) :: KBT,XX,BOSE,COEF
REAL (WP) :: Q_SI,OMEGA
REAL (WP) :: KS_SI,VC
!
REAL (WP) :: EXP
!
Y = X + X ! Y = q / k_F
U = X * Z ! U = omega / (q v_F)
!
Q_SI = Y * KF_SI ! q in SI
!
OMEGA = Q_SI * VF_SI * U ! omega in SI
!
KBT = K_B * T !
!
! Computing the screening vector
!
CALL SCREENING_VECTOR(SC_TYPE,DMN,X,RS,T,KS_SI)
!
! Computation of the Coulomb potential
!
CALL COULOMB_FF(DMN,'SIU',Q_SI,KS_SI,VC) !
!
! Computation of the Bose factor
!
XX = H_BAR * OMEGA / KBT !
BOSE = XX / (ONE - EXP(- XX)) !
!
COEF = PI_INV / (KBT * VC) !
!
LOSS_TO_SF = COEF * BOSE * LOSS !
!
END FUNCTION LOSS_TO_SF
!
!=======================================================================
!
FUNCTION SF_TO_LOSS(X,Z,T,SQO)
!
! This function transforms a structure factor S(q,omega) into a
! loss function L(q,omega)
! Note: It makes use of the fluctuation-dissipation theorem
! to obtain
!
! L(q,omega) = S(q,omega) / ( (k_B T / Pi V_C) * B(h_bar omega / k_B T) )
!
!
! where B(x) is the Bose factor : B(x) = x / ( 1 - exp(-x) )
!
!
! References: (1) Yu. V. Arkhipov et al, Contrib. Plasma Phys.
! 55, 381-389 (2015)
!
!
! --> Warning: 3D only at present <--
!
!
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * Z : omega / omega_q --> dimensionless
! * T : temperature in SI
! * SQO : value of the structure factor
!
!
! Author : D. Sébilleau
!
!
! Last modified : 23 Oct 2020
!
USE MATERIAL_PROP, ONLY : DMN,RS
USE SCREENING_TYPE
!
USE REAL_NUMBERS, ONLY : ONE,HALF
USE CONSTANTS_P1, ONLY : H_BAR,K_B
USE FERMI_SI, ONLY : KF_SI,VF_SI
USE PI_ETC, ONLY : PI_INV
!
USE SCREENING_VEC
USE COULOMB_K
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X,Z,T,SQO
REAL (WP) :: SF_TO_LOSS
REAL (WP) :: Y,U
REAL (WP) :: Q_SI,OMEGA
REAL (WP) :: KBT,XX,BOSE,COEF
REAL (WP) :: KS_SI,VC
!
REAL (WP) :: EXP
!
Y = X + X ! Y = q / k_F
U = X * Z ! U = omega / (q v_F)
!
Q_SI = Y * KF_SI ! q in SI
!
OMEGA = Q_SI * VF_SI * U ! omega in SI
!
KBT = K_B * T !
!
! Computing the screening vector
!
CALL SCREENING_VECTOR(SC_TYPE,DMN,X,RS,T,KS_SI)
!
! Computation of the Coulomb potential
!
CALL COULOMB_FF(DMN,'SIU',Q_SI,KS_SI,VC) !
!
! Computation of the Bose factor
!
XX = H_BAR * OMEGA / KBT !
BOSE = XX / (ONE - EXP(- XX)) !
!
COEF = PI_INV / (KBT * VC) !
!
SF_TO_LOSS = SQO / (COEF * BOSE) !
!
END FUNCTION SF_TO_LOSS
!
!=======================================================================
!
SUBROUTINE SQO_TO_EPSI(X,Z,T,RS,SQO,EPSI)
!
! This subroutine computes the imaginary part of the dielectric function
! from the knowledge of the dynamic structure factor,
! following the formula
! _ _
! h_bar 1 | 1 |
! S(q,omega) = ----------- * ------------------------------- * Im| - --- |
! pi*n*Vc(q) 1 - exp(-h_bar*omega / k_B*T) |_ eps _|
!
!
!
!
! Input parameters:
!
! * X : dimensionless factor --> X = q / (2 * k_F)
! * Z : omega / omega_q --> dimensionless
! * T : temperature in SI
! * RS : Wigner-Seitz radius (in units of a_0)
! * SQO : dynamic structure factor
!
!
! Output variables :
!
! * EPSI : imaginary part of dielectric function
!
!
! Author : D. Sébilleau
!
! Last modified : 4 Jun 2020
!
!
USE MATERIAL_PROP, ONLY : DMN
USE SCREENING_TYPE
!
USE REAL_NUMBERS, ONLY : ONE,TWO,HALF
USE PI_ETC, ONLY : PI
USE CONSTANTS_P1, ONLY : H_BAR,K_B
USE FERMI_SI, ONLY : KF_SI,VF_SI
!
USE UTILITIES_1, ONLY : RS_TO_N0
!
USE SCREENING_VEC
USE COULOMB_K
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X,Z,T,RS,SQO
REAL (WP), INTENT(OUT) :: EPSI
REAL (WP) :: Y,U
REAL (WP) :: Q_SI,OMEGA,KBT
REAL (WP) :: N0,KS_SI,VC
REAL (WP) :: EX,KOEF
!
REAL (WP) :: EXP
!
Y = X + X ! Y = q / k_F
U = X * Z ! U = omega / (q v_F)
!
Q_SI = Y * KF_SI ! q in SI
!
OMEGA = Q_SI * VF_SI * U ! omega in SI
!
KBT = K_B * T !
!
! Computing the screening vector
!
CALL SCREENING_VECTOR(SC_TYPE,DMN,X,RS,T,KS_SI)
!
! Computation of the Coulomb potential
!
CALL COULOMB_FF(DMN,'SIU',Q_SI,KS_SI,VC) !
!
! Computing the electron density from the Wigner-Seitz radius
!
N0=RS_TO_N0(DMN,RS) !
!
EX= H_BAR * OMEGA / KBT !
!
KOEF = H_BAR / (PI * N0 * VC) ! coef. of formula
!
EPSI = - KOEF * ONE / ( (ONE - EXP(- EX)) * SQO ) !
!
! Computing the real part
!
END SUBROUTINE SQO_TO_EPSI
!
END MODULE UTILITIES_3