MsSpec-DFM/New_libraries/DFM_library/PLASMON_LIBRARY/q_bounds.f90

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