213 lines
8.6 KiB
Fortran
213 lines
8.6 KiB
Fortran
!
|
|
!=======================================================================
|
|
!
|
|
MODULE Q_BOUNDS
|
|
!
|
|
! This module provides subroutines to compute the bounds
|
|
! for the q-integration.
|
|
!
|
|
!
|
|
USE ACCURACY_REAL
|
|
!
|
|
CONTAINS
|
|
!
|
|
!=======================================================================
|
|
!
|
|
SUBROUTINE QBOUNDS(Q_MIN,Q_MAX)
|
|
!
|
|
! This subroutine computes the bounds for q-integration.
|
|
! The lower bounds is zero except when the plasmon is damped.
|
|
! The upper bound is given by the intersection of the plasmon
|
|
! dispersion curve with the electron-hole pair dispersion.
|
|
!
|
|
! The dispersion coefficients in modules DISP_COEF_REAL,
|
|
! DISP_COEF_COMP and DISP_COEF_EH are in atomic units (AU)
|
|
!
|
|
! The subroutines find the roots of the polynomial:
|
|
!
|
|
! AR(6)*q^6 + AR(5)*q^5 + [AR(4)-AE(4)]*q^4 +
|
|
! [AR(3)-AE(3)]*q^3 + [AR(2)-AE(2)]*q^2 +
|
|
! [AR(1)-AE(1)]*q + [AR(0)-AE(0)] = 0
|
|
!
|
|
!
|
|
!
|
|
! Output variables :
|
|
!
|
|
! * Q_MIN : lower bound in SI
|
|
! * Q_MAX : upper bound in SI
|
|
!
|
|
!
|
|
! Author : D. Sébilleau
|
|
!
|
|
! Last modified : 15 Sep 2020
|
|
!
|
|
!
|
|
USE MATERIAL_PROP, ONLY : RS,DMN
|
|
USE FERMI_SI, ONLY : KF_SI
|
|
USE FERMI_AU, ONLY : KF_AU
|
|
USE REAL_NUMBERS, ONLY : ZERO,ONE,TWO,THREE,FOUR,FIVE,NINE, &
|
|
THIRD,FOURTH
|
|
USE PI_ETC, ONLY : PI,PI_INV
|
|
USE PLASMON_DISPERSION
|
|
USE DISP_COEF_REAL
|
|
USE DISP_COEF_COMP
|
|
USE DISP_COEF_EH
|
|
USE UTILITIES_1, ONLY : ALFA
|
|
USE FIND_ZERO
|
|
!
|
|
IMPLICIT NONE
|
|
!
|
|
INTEGER :: NP,NA,NO,I
|
|
INTEGER :: LOGF
|
|
!
|
|
REAL (WP), INTENT(OUT) :: Q_MIN,Q_MAX
|
|
!
|
|
REAL (WP) :: COEF,A0KF
|
|
REAL (WP) :: A,B,C
|
|
REAL (WP) :: XA0,XA1,XA2,XC
|
|
REAL (WP) :: ALPHA,DE
|
|
REAL (WP) :: SMALL,LARGE
|
|
REAL (WP) :: ROOT,MODU
|
|
REAL (WP) :: OP(101),OI(101) ! for CPOLY
|
|
REAL (WP) :: ZR(101),ZI(101) ! for CPOLY
|
|
REAL (WP) :: OP2(101),OI2(101) ! for CPOLY
|
|
REAL (WP) :: ZR2(101),ZI2(101) ! for CPOLY
|
|
!
|
|
REAL (WP) :: SQRT,ABS,REAL,AIMAG,MAX,MIN
|
|
!
|
|
LOGICAL :: FAIL ! for CPOLY
|
|
!
|
|
SMALL = 0.0001E0_WP !
|
|
LARGE = 1.0000E9_WP !
|
|
!
|
|
COEF = ONE / ALFA('3D') ! (9 pi/4^(1/3)
|
|
A0KF = COEF / RS ! (a_0 * k_F) --> dimensionless
|
|
ALPHA = SQRT(FOUR * THIRD * PI_INV / A0KF) ! Nozières-Pines q/k_F = omega_p/V_F
|
|
!
|
|
NA = 4 ! degree of polynomial for
|
|
! ! RPA approximation
|
|
NP = 6 ! max degree of polynomial
|
|
!
|
|
! Initialisation
|
|
!
|
|
DO I = 1,NP !
|
|
ZR(I) = ZERO !
|
|
ZI(I) = ZERO !
|
|
END DO !
|
|
!
|
|
! Checking the order of the polynomial --> NO
|
|
!
|
|
NO = 0 !
|
|
DO I = NP,0,-1 !
|
|
MODU = ABS(AR(I) - AE(I)) !
|
|
IF(MODU > SMALL) THEN !
|
|
NO = I !
|
|
GO TO 5 !
|
|
END IF !
|
|
END DO !
|
|
5 CONTINUE !
|
|
!
|
|
IF(PL_DISP /= 'DAMPED1') THEN !
|
|
!
|
|
! Plasmon not damped --> real value of q
|
|
!
|
|
DO I = 0,NO !
|
|
OP(NO+1-I) = AR(I) - AE(I) ! OP and OI ordered
|
|
OI(NO+1-I) = ZERO ! by decreasing order
|
|
ENDDO !
|
|
!
|
|
Q_MIN = ZERO !
|
|
Q_MAX = LARGE !
|
|
!
|
|
ELSE
|
|
!
|
|
! Plasmon damped --> complex value of q
|
|
!
|
|
DO I = 0,NO !
|
|
OP(NO+1-I) = REAL(AC(I),KIND=WP) - AE(I) ! OP and OI ordered
|
|
OI(NO+1-I) = AIMAG(AC(I)) ! by decreasing order
|
|
END DO !
|
|
!
|
|
Q_MIN = ZERO !
|
|
Q_MAX = LARGE !
|
|
!
|
|
END IF !
|
|
!
|
|
! Computing approximation to the critical reduced momenta x = q_c/k_F
|
|
!
|
|
!
|
|
! 1) Nozières-Pines (XA0)
|
|
!
|
|
XA0 = ALPHA ! 3D value
|
|
!
|
|
! 2) RPA dispersion limited to q^2 and use of hbar omega_q:
|
|
!
|
|
! (1 - 3/5*alpha) x^2 + 2x - 2*alpha = 0 ! 3D value
|
|
!
|
|
A = ONE - THREE / (FIVE * ALPHA) !
|
|
B = TWO !
|
|
C = - TWO * ALPHA !
|
|
!
|
|
DE = B * B - FOUR * A * C ! discriminant Delta
|
|
!
|
|
XA1 = (- B + SQRT(DE)) / (A + A) !
|
|
!
|
|
! 3) RPA dispersion limited to q^2 and use of (hbar omega_q)^2:
|
|
!
|
|
! x^4 + 4 x^3 + (4 - 12/5) x^2 _ 4 alpha^2 = 0 ! 3D value
|
|
!
|
|
OP2(1) = ONE !
|
|
OP2(2 )= FOUR !
|
|
OP2(3) = FOUR - 12.0E0_WP/ FIVE !
|
|
OP2(4) = ZERO !
|
|
OP2(5) = - FOUR * ALPHA * ALPHA !
|
|
OI2(1) = ZERO !
|
|
OI2(2) = ZERO !
|
|
OI2(3) = ZERO !
|
|
OI2(4) = ZERO !
|
|
OI2(5) = ZERO !
|
|
!
|
|
CALL CPOLY(OP2,OI2,NA,ZR2,ZI2,FAIL) !
|
|
!
|
|
XA2 = MAX(ZR2(1),ZR2(2),ZR2(3),ZR2(4)) !
|
|
!
|
|
! Computing the true intersection between plasmons and e-h dispersions
|
|
!
|
|
CALL CPOLY(OP,OI,NO,ZR,ZI,FAIL) !
|
|
!
|
|
! Filtering the roots to keep only the smallest of the positive ones (XC)
|
|
!
|
|
XC = LARGE !
|
|
DO I = 1,NO !
|
|
ROOT = ZR(I) / KF_AU !
|
|
IF(ROOT > SMALL) THEN !
|
|
XC = MIN(ROOT,XC,LARGE) !
|
|
END IF !
|
|
END DO !
|
|
!
|
|
! Printing out the results
|
|
!
|
|
WRITE(LOGF,10) !
|
|
WRITE(LOGF,20) NO !
|
|
WRITE(LOGF,30) XA0 !
|
|
WRITE(LOGF,40) XA1 !
|
|
WRITE(LOGF,50) XA2 !
|
|
WRITE(LOGF,60) XC !
|
|
!
|
|
Q_MAX = XC * KF_SI !
|
|
!
|
|
! Formats:
|
|
!
|
|
10 FORMAT(//,5X,'Critical value q_c/k_F of the plasmon momentum:')
|
|
20 FORMAT(/,13X,'---> solving polynomial of order ',I1,/)
|
|
30 FORMAT(10X,'Nozières-Pines approximation : ', F6.3)
|
|
40 FORMAT(10X,'RPA-q^2 linear approximation : ', F6.3)
|
|
50 FORMAT(10X,'RPA-q^2 approximation : ', F6.3)
|
|
60 FORMAT(10X,'Exact value : ', F6.3,/)
|
|
!
|
|
RETURN
|
|
!
|
|
END SUBROUTINE QBOUNDS
|
|
!
|
|
END MODULE Q_BOUNDS
|