MsSpec-DFM/New_libraries/epsilon.f90

338 lines
10 KiB
Fortran

!
!=======================================================================
!
PROGRAM EPSILON
!
! This program computes model dielectric functions for many type
! of materials. These dielectric functions are essentially based
! on the Fermi liquid theory.
!
! Several other physical quantities, based on the
! dielectric function can also be computed, namely:
!
! * the loss function
! * the EELS cross-section
! * the plasmon fluctuation potential
! * the stopping power
! * the optical properties
!
!
! Lead developer: Didier Sébilleau
!
! Co-developers : Aditi Mandal, Sylvain Tricot
!
!
!
! Main notations :
!
! * X : dimensionless factor --> X = q / (2 * k_F)
!
! * Y : dimensionless factor --> Y = q / k_F
!
! * Z : dimensionless factor --> Z = omega / omega_q = V / (4 * X * X)
!
! * U : dimensionless factor --> U = omega / (q * v_F) = X * Z = V / (4 * X)
!
! * V : dimensionless factor --> V = omega / omega_{k_F} = Z * Y^2 = 4 U * X
!
!
!
!
! Last modified : 6 Aug 2021
!
!
USE ACCURACY_REAL
USE DIMENSION_CODE, ONLY : NSIZE
!
USE SF_VALUES, ONLY : SQO_TYPE
!
USE REAL_NUMBERS, ONLY : ZERO,ONE,HALF,SMALL
USE MATERIAL_PROP, ONLY : RS,DMN
USE EXT_FIELDS, ONLY : H
!
USE Q_GRID
!
USE FERMI_VALUES
USE FERMI_VALUES_M
USE PLASMON_ENE
USE PLASMA_SCALE
USE CALC_ASYMPT
!
USE PRINT_CALC_TYPE
USE PRINT_HEADERS
USE PRINT_FERMI
USE PRINT_PLASMONS
USE PRINT_ASYMPTOTIC
USE PRINT_SCALE_PARAM
USE PRINT_MAT_LENGTHS
USE PRINT_THERMAL
USE PRINT_THERMODYNAMICS
USE PRINT_ENERGIES_EL
!
USE DAMPING_COEF
USE PLASMON_DISPERSION
!
USE CALL_CALC_1
USE CALL_CALC_2
USE CALL_CALC_3
USE CALL_CALC_5
USE CALL_CALC_7
USE CALL_CALC_9
USE CALL_CALC_P
!
USE TEST_INTEGRALS_2
USE TEST_INTEGRALS_3
USE TEST_INTEGRALS_8
USE TEST_INT_HUBBARD
!
USE RE_EPS_0_TREATMENT
!
USE INPUT_DATA
!
USE OUT_VALUES_10
!
USE OUT_CALC
!
USE CHANGE_FILENAMES
!
USE OPEN_OUTFILES
USE CLOSE_OUTFILES
!
IMPLICIT NONE
!
INTEGER :: N_IF,JF
INTEGER :: IQ,IE
!
REAL (WP) :: Q,X
REAL (WP) :: EPSR(NSIZE),EPSI(NSIZE),EN(NSIZE)
!
CHARACTER (LEN = 100) :: INPDATA(999)
CHARACTER (LEN = 100) :: LOGFILE(999)
!
! Loop on the input data files
!
! N_IF = 11
N_IF = 1
! READ(*,15) N_IF !
! DO JF = 1,N_IF !
! READ(*,25) INPDATA(JF) !
! END DO !
INPDATA(1) = 'Data/epsilon.dat'
! INPDATA(1) = 'Data/epsilon_00.dat'
! INPDATA(2) = 'Data/epsilon_01.dat'
! INPDATA(3) = 'Data/epsilon_02.dat'
! INPDATA(4) = 'Data/epsilon_03.dat'
! INPDATA(5) = 'Data/epsilon_04.dat'
! INPDATA(6) = 'Data/epsilon_05.dat'
! INPDATA(7) = 'Data/epsilon_06.dat'
! INPDATA(8) = 'Data/epsilon_07.dat'
! INPDATA(9) = 'Data/epsilon_08.dat'
! INPDATA(10) = 'Data/epsilon_09.dat'
! INPDATA(11) = 'Data/epsilon_10.dat'
!
!
! Name of the corresponding log files
!
CALL LOGFILE_NAMES(N_IF,LOGFILE) !
!
DO JF = 1,N_IF ! start loop on files
!
! Initialization of the arrays
!
DO IE=1,NSIZE !
EN(IE) = ZERO !
EPSR(IE) = ZERO !
EPSI(IE) = ZERO !
END DO !
!
! Opening input/log data files
!
OPEN(UNIT=5,FILE=TRIM(INPDATA(JF)),STATUS='OLD') !
OPEN(UNIT=6,FILE=TRIM(LOGFILE(JF)),STATUS='UNKNOWN') !
!
! Printing the headers
!
CALL PRINT_ASCII !
!
! Reading the input data file
!
CALL READ_DATA !
!
IF(SQO_TYPE == 'UTI') THEN !
OPEN(UNIT = 1, FILE = 'Results/utic_para.dat', & !
STATUS = 'unknown') !
END IF !
!
! Opening result files
!
CALL OPEN_OUTPUT_FILES(N_IF,JF) !
!
! Post-processing:
!
IF(PL_DISP == ' EXACT') THEN !
I_PP = I_FP + I_PD !
ELSE !
I_PP = I_FP !
END IF !
!
! Printing the information on the calculations to be performed
!
! CALL PRINT_CALC_INFO !
!
! Computation of the Fermi values and storage
!
WRITE(6,10) !
!
IF(H < SMALL) THEN !
CALL CALC_FERMI(DMN,RS) !
CALL PRINT_FERMI_SI !
ELSE !
CALL CALC_FERMI_M(DMN,RS) !
CALL PRINT_FERMI_SI_M !
END IF !
!
! Test of the integrals
!
IF(I_TI /= 0) THEN !
IF(I_TI == 2) CALL CALC_TEST_INT_2 !
IF(I_TI == 3) CALL CALC_TEST_INT_3 !
IF(I_TI == 8) CALL CALC_TEST_INT_8 !
IF(I_TI == 10) CALL CALC_TEST_HUBBARD !
END IF !
!
! Computation of the plasmon properties and storage
!
CALL CALC_PLASMON_ENE !
CALL CALC_PLASMA_SCALE !
!
! Computation of the asymptotic values and storage
!
! CALL CALC_ASYMPT_VALUES !
!
! Selective printing of physical properties (log file)
!
IF(I_WR == 1) THEN !
!
! Printing the plasma properties
!
WRITE(6,10) !
CALL PRINT_PLASMA !
!
! Printing the asymptotic values
!
WRITE(6,10) !
CALL PRINT_ASYMPT_VALUES !
!
! Printing the scale parameters
!
WRITE(6,10) !
CALL PRINT_SCALE_PARAMETERS !
!
! Printing the material's characteristic lengths
!
WRITE(6,10) !
CALL PRINT_CHAR_LENGTHS !
!
! Printing the thermal properties
!
WRITE(6,10) !
CALL PRINT_THERMAL_PROP !
!
! Printing the thermodynamics properties
!
WRITE(6,10) !
CALL PRINT_THERMODYNAMICS_PROP !
!
! Printing the energies at q = 0
!
WRITE(6,10) !
CALL PRINT_ENERGIES(ZERO,0,ZERO,ONE) !
!
END IF !
!
! Calling calculator 5 (Fermi properties)
!
IF(I_C5 > 0) CALL USE_CALC_5 !
!
! Starting the loop on q
! (the loop on energy is inside the calculators)
!
!
!.......... Loop on plasmon momentum Q ..........
!
DO IQ = 1,N_Q !
!
Q = Q_MIN + FLOAT(IQ - 1) * Q_STEP ! Q = q/k_F
!
X = HALF * Q ! X = q/(2k_f)
!
! Computing and printing the damping (if any)
!
CALL CALC_DAMPING(IQ,X)
!
! Calling calculator 1 (eps, pi, chi, sigma)
!
IF(I_C1 > 0) CALL USE_CALC_1(X,EN,EPSR,EPSI) !
!
! Calling calculator 2
!
IF(I_C2 > 0) CALL USE_CALC_2(IQ,X) !
!
! Calling calculator 3
!
IF(I_C3 > 0) CALL USE_CALC_3(IQ,X) !
!
! Calling calculator 9
!
IF(I_C9 > 0) CALL USE_CALC_9(X) !
!
! Calling test calculator
!
! CALL CALC_TEST(IQ,X)
!
!.......... End of loop on plasmon momentum Q ..........
!
END DO !
!
! Calling calculator 7 (Energies)
!
IF(I_C7 > 0) CALL USE_CALC_7 !
!
! Post-processing whenever requested
!
IF(I_PP > 0) CALL USE_CALC_P !
!
IF(I_ZE == 1) THEN !
CALL REORDER_EPS0_PRINT !
END IF !
!
! Closing input/log data files
!
CLOSE(5) !
CLOSE(6) !
!
IF(SQO_TYPE == 'UTI') THEN !
CLOSE(1) !
END IF !
!
! Closing the indexed result files
!
CALL CLOSE_OUTPUT_FILES(0) !
!
! End of input data files loop
!
END DO !
!
! Closing the other result files
!
CALL CLOSE_OUTPUT_FILES(1) !
!
! Formats:
!
10 FORMAT(' ')
15 FORMAT(I3)
25 FORMAT(A50)
!
END PROGRAM EPSILON