306 lines
11 KiB
Fortran
306 lines
11 KiB
Fortran
|
!
|
||
|
!=======================================================================
|
||
|
!
|
||
|
MODULE CALCULATORS_9
|
||
|
!
|
||
|
USE ACCURACY_REAL
|
||
|
USE CALCULATORS_1
|
||
|
!
|
||
|
! This module contains the subroutines allowing to compute
|
||
|
! various properties of the electron/plasma liquids:
|
||
|
!
|
||
|
!
|
||
|
! * loss function : CALC_LOS
|
||
|
! * screened potential : CALC_VSC
|
||
|
!
|
||
|
CONTAINS
|
||
|
!
|
||
|
!=======================================================================
|
||
|
!
|
||
|
SUBROUTINE CALC_LOS(X)
|
||
|
!
|
||
|
! This subroutine computes the loss function L(q, omega),
|
||
|
! defined by
|
||
|
! _ _
|
||
|
! | - 1 |
|
||
|
! L(q, omega) = Im | --------------- |
|
||
|
! |_ EPS(q, omega) _|
|
||
|
!
|
||
|
!
|
||
|
! Input parameters:
|
||
|
!
|
||
|
! * X : dimensionless factor --> X = q / (2 * k_F)
|
||
|
!
|
||
|
!
|
||
|
! Intermediate parameters:
|
||
|
!
|
||
|
! * RS : Wigner-Seitz radius (in units of a_0)
|
||
|
! * T : temperature in SI
|
||
|
! * DMN : problem dimension
|
||
|
!
|
||
|
!
|
||
|
! Output parameters:
|
||
|
!
|
||
|
! * E : energy array
|
||
|
! * VSCR : real part of the screened potential
|
||
|
! * VSCI : imaginary part of the screened potential
|
||
|
!
|
||
|
!
|
||
|
!
|
||
|
!
|
||
|
! Author : D. Sébilleau
|
||
|
!
|
||
|
! Last modified : 15 Oct 2020
|
||
|
!
|
||
|
!
|
||
|
USE DIMENSION_CODE, ONLY : NSIZE
|
||
|
USE REAL_NUMBERS, ONLY : ZERO,ONE,FOURTH,SMALL,TTINY,INF
|
||
|
USE FERMI_SI, ONLY : KF_SI
|
||
|
USE DF_VALUES, ONLY : ESTDY,EPS_T,D_FUNC
|
||
|
USE MATERIAL_PROP, ONLY : RS,DMN
|
||
|
USE EXT_FIELDS, ONLY : T,H
|
||
|
!
|
||
|
USE E_GRID
|
||
|
USE UNITS, ONLY : UNIT
|
||
|
!
|
||
|
USE DFUNC_STATIC
|
||
|
USE DFUNCT_STAN_DYNAMIC
|
||
|
USE DFUNCL_STAN_DYNAMIC
|
||
|
USE DFUNCL_MAGN_DYNAMIC
|
||
|
USE COULOMB_K
|
||
|
!
|
||
|
USE OUT_VALUES_9, ONLY : I_EL
|
||
|
USE PRINT_FILES, ONLY : IO_EL
|
||
|
!
|
||
|
IMPLICIT NONE
|
||
|
!
|
||
|
CHARACTER (LEN = 4) :: D_FUNCL,D_FUNCT
|
||
|
!
|
||
|
REAL (WP) :: X
|
||
|
REAL (WP) :: REPS,IEPS,LOS
|
||
|
REAL (WP) :: Q,Z,EN,VC,A,NU,KS
|
||
|
REAL (WP) :: Y
|
||
|
!
|
||
|
REAL (WP) :: FLOAT
|
||
|
!
|
||
|
INTEGER :: IE
|
||
|
!
|
||
|
Y = X + X ! q/k_F
|
||
|
Q = Y * KF_SI ! q in SI
|
||
|
!
|
||
|
! Computing the Coulomb potential
|
||
|
!
|
||
|
CALL COULOMB_FF(DMN,UNIT,Q,ZERO,VC) !
|
||
|
!
|
||
|
IF(ESTDY == ' STATIC') THEN !
|
||
|
!
|
||
|
! Static susceptibility function
|
||
|
!
|
||
|
IF(EPS_T == 'LONG') THEN !
|
||
|
!
|
||
|
D_FUNCL = D_FUNC !
|
||
|
CALL DFUNCL_STATIC(X,D_FUNCL,REPS,IEPS) ! longitudinal eps
|
||
|
!
|
||
|
ELSE !
|
||
|
D_FUNCT = D_FUNC !
|
||
|
CONTINUE ! transverse eps
|
||
|
END IF !
|
||
|
!
|
||
|
LOS = IEPS / (REPS * REPS + IEPS * IEPS) !
|
||
|
!
|
||
|
IF(I_EL == 1) THEN !
|
||
|
WRITE(IO_EL,*) Y,LOS !
|
||
|
END IF !
|
||
|
!
|
||
|
ELSE !
|
||
|
!
|
||
|
! Loss function
|
||
|
!
|
||
|
DO IE = 1, N_E ! energy loop
|
||
|
!
|
||
|
EN = E_MIN + FLOAT(IE - 1) * E_STEP ! E = hbar omega / E_F
|
||
|
!
|
||
|
Z = FOURTH * EN / (X * X) ! Z = omega / omega_q
|
||
|
!
|
||
|
IF(EPS_T == 'LONG') THEN ! longitudinal eps
|
||
|
!
|
||
|
D_FUNCL = D_FUNC !
|
||
|
IF(H < SMALL) THEN !
|
||
|
CALL DFUNCL_DYNAMIC(X,Z,RS,T,D_FUNCL,IE,REPS,IEPS) ! no magnetic field
|
||
|
ELSE !
|
||
|
CALL DFUNCL_DYNAMIC_M(X,Z,KS,A,NU,D_FUNCL,REPS,IEPS) ! magnetic field
|
||
|
END IF !
|
||
|
ELSE ! transverse eps
|
||
|
D_FUNCT = D_FUNC !
|
||
|
IF(H < SMALL) THEN !
|
||
|
CALL DFUNCT_DYNAMIC(X,Z,D_FUNCT,REPS,IEPS) ! no magnetic field
|
||
|
ELSE !
|
||
|
CONTINUE ! magnetic field
|
||
|
END IF !
|
||
|
END IF !
|
||
|
!
|
||
|
LOS = IEPS / (REPS * REPS + IEPS * IEPS) !
|
||
|
!
|
||
|
IF(I_EL == 1) THEN ! writing to
|
||
|
WRITE(IO_EL,*) Y,EN,LOS ! file
|
||
|
END IF !
|
||
|
!
|
||
|
END DO ! end of energy loop
|
||
|
!
|
||
|
END IF !
|
||
|
!
|
||
|
END SUBROUTINE CALC_LOS
|
||
|
!
|
||
|
!=======================================================================
|
||
|
!
|
||
|
SUBROUTINE CALC_VSC(X)
|
||
|
!
|
||
|
! This subroutine computes the screened Vc(q, omega)
|
||
|
!
|
||
|
!
|
||
|
! Input parameters:
|
||
|
!
|
||
|
! * X : dimensionless factor --> X = q / (2 * k_F)
|
||
|
!
|
||
|
!
|
||
|
! Intermediate parameters:
|
||
|
!
|
||
|
! * RS : Wigner-Seitz radius (in units of a_0)
|
||
|
! * T : temperature in SI
|
||
|
! * DMN : problem dimension
|
||
|
!
|
||
|
!
|
||
|
! Output parameters:
|
||
|
!
|
||
|
! * E : energy array
|
||
|
! * VSCR : real part of the screened potential
|
||
|
! * VSCI : imaginary part of the screened potential
|
||
|
!
|
||
|
!
|
||
|
!
|
||
|
!
|
||
|
! Author : D. Sébilleau
|
||
|
!
|
||
|
! Last modified : 30 Apr 2021
|
||
|
!
|
||
|
!
|
||
|
USE DIMENSION_CODE, ONLY : NSIZE
|
||
|
USE REAL_NUMBERS, ONLY : ZERO,FOURTH,SMALL,TTINY,INF
|
||
|
USE FERMI_SI, ONLY : KF_SI
|
||
|
USE DF_VALUES, ONLY : ESTDY,EPS_T,D_FUNC
|
||
|
USE MATERIAL_PROP, ONLY : RS,DMN
|
||
|
USE EXT_FIELDS, ONLY : T,H
|
||
|
!
|
||
|
USE E_GRID
|
||
|
USE UNITS, ONLY : UNIT
|
||
|
!
|
||
|
USE DFUNC_STATIC
|
||
|
USE DFUNCT_STAN_DYNAMIC
|
||
|
USE DFUNCL_STAN_DYNAMIC
|
||
|
USE DFUNCL_MAGN_DYNAMIC
|
||
|
USE COULOMB_K
|
||
|
!
|
||
|
USE OUT_VALUES_9, ONLY : I_VC
|
||
|
USE PRINT_FILES, ONLY : IO_VC
|
||
|
!
|
||
|
IMPLICIT NONE
|
||
|
!
|
||
|
CHARACTER (LEN = 4) :: D_FUNCL,D_FUNCT
|
||
|
!
|
||
|
REAL (WP) :: X
|
||
|
REAL (WP) :: VSCR(NSIZE),VSCI(NSIZE),E(NSIZE)
|
||
|
REAL (WP) :: REPS,IEPS,RVSC,IVSC
|
||
|
REAL (WP) :: Q,Z,EN,VC,A,NU,KS
|
||
|
REAL (WP) :: Y
|
||
|
!
|
||
|
REAL (WP) :: FLOAT
|
||
|
!
|
||
|
INTEGER :: IE
|
||
|
!
|
||
|
Y = X + X ! q/k_F
|
||
|
Q = Y * KF_SI ! q in SI
|
||
|
!
|
||
|
! Computing the Coulomb potential
|
||
|
!
|
||
|
CALL COULOMB_FF(DMN,UNIT,Q,ZERO,VC) !
|
||
|
!
|
||
|
IF(ESTDY == ' STATIC') THEN !
|
||
|
!
|
||
|
! Static dielectric function
|
||
|
!
|
||
|
IF(EPS_T == 'LONG') THEN !
|
||
|
!
|
||
|
D_FUNCL = D_FUNC !
|
||
|
CALL DFUNCL_STATIC(X,D_FUNCL,REPS,IEPS) ! longitudinal eps
|
||
|
!
|
||
|
IF(REPS > TTINY) THEN !
|
||
|
VSCR(1)= VC / REPS !
|
||
|
ELSE !
|
||
|
VSCR(1) = INF !
|
||
|
END IF !
|
||
|
IF(IEPS > TTINY) THEN !
|
||
|
VSCI(1) = VC / IEPS !
|
||
|
ELSE !
|
||
|
VSCI(1) = INF !
|
||
|
END IF !
|
||
|
!
|
||
|
IF(I_VC == 1) THEN !
|
||
|
WRITE(IO_VC,*) Y,VSCR(1),VSCI(1) !
|
||
|
END IF !
|
||
|
!
|
||
|
ELSE !
|
||
|
D_FUNCT = D_FUNC !
|
||
|
CONTINUE ! transverse eps
|
||
|
END IF !
|
||
|
!
|
||
|
ELSE !
|
||
|
!
|
||
|
! Dynamic dielectric function
|
||
|
!
|
||
|
DO IE = 1, N_E ! energy loop
|
||
|
!
|
||
|
EN = E_MIN + FLOAT(IE - 1) * E_STEP ! E = hbar omega / E_F
|
||
|
!
|
||
|
Z = FOURTH * EN / (X * X) ! Z = omega / omega_q
|
||
|
!
|
||
|
IF(EPS_T == 'LONG') THEN ! longitudinal eps
|
||
|
!
|
||
|
D_FUNCL = D_FUNC !
|
||
|
IF(H < SMALL) THEN !
|
||
|
CALL DFUNCL_DYNAMIC(X,Z,RS,T,D_FUNCL,IE,REPS,IEPS) ! no magnetic field
|
||
|
ELSE !
|
||
|
CALL DFUNCL_DYNAMIC_M(X,Z,KS,A,NU,D_FUNCL,REPS,IEPS) ! magnetic field
|
||
|
END IF !
|
||
|
ELSE ! transverse eps
|
||
|
D_FUNCT = D_FUNC !
|
||
|
IF(H < SMALL) THEN !
|
||
|
CALL DFUNCT_DYNAMIC(X,Z,D_FUNCT,REPS,IEPS) ! no magnetic field
|
||
|
ELSE !
|
||
|
CONTINUE ! magnetic field
|
||
|
END IF !
|
||
|
END IF !
|
||
|
!
|
||
|
IF(REPS > TTINY) THEN !
|
||
|
VSCR(IE) = VC / REPS !
|
||
|
ELSE !
|
||
|
VSCR(IE) = INF !
|
||
|
END IF !
|
||
|
IF(IEPS > TTINY) THEN !
|
||
|
VSCI(IE) = VC / IEPS !
|
||
|
ELSE !
|
||
|
VSCI(IE) = INF !
|
||
|
END IF !
|
||
|
E(IE) = EN !
|
||
|
!
|
||
|
IF(I_VC == 1) THEN ! writing to
|
||
|
WRITE(IO_VC,*) Y,EN,VSCR(IE),VSCI(IE) ! file
|
||
|
END IF !
|
||
|
!
|
||
|
END DO ! end of energy loop
|
||
|
!
|
||
|
END IF !
|
||
|
!
|
||
|
END SUBROUTINE CALC_VSC
|
||
|
!
|
||
|
END MODULE CALCULATORS_9
|