MsSpec-DFM/New_libraries/DFM_library/CALCULATORS_LIBRARY/calculators_9.f90

306 lines
11 KiB
Fortran
Raw Normal View History

2022-02-02 16:19:10 +01:00
!
!=======================================================================
!
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