338 lines
10 KiB
Fortran
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
|