546 lines
16 KiB
Fortran
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
|
|
|