quantum-espresso/Modules/energies.f90

261 lines
10 KiB
Fortran
Raw Normal View History

!
! Copyright (C) 2002-2005 Quantum-ESPRESSO group
! This file is distributed under the terms of the
! GNU General Public License. See the file `License'
! in the root directory of the present distribution,
! or http://www.gnu.org/copyleft/gpl.txt .
!
MODULE energies
USE io_global, ONLY : stdout
USE kinds
IMPLICIT NONE
SAVE
PRIVATE
TYPE dft_energy_type
REAL(DP) :: ETOT
REAL(DP) :: SKIN
REAL(DP) :: EMKIN
REAL(DP) :: EHT
REAL(DP) :: EH
REAL(DP) :: SELF_EHTE
REAL(DP) :: EHTE
REAL(DP) :: EHTI
REAL(DP) :: EPSEU
REAL(DP) :: ENL
REAL(DP) :: ENT
REAL(DP) :: VXC
REAL(DP) :: EXC
REAL(DP) :: SELF_VXC
REAL(DP) :: SELF_EXC
REAL(DP) :: ESELF
REAL(DP) :: ESR
REAL(DP) :: EVDW
REAL(DP) :: EBAND
REAL(DP) :: EKIN
REAL(DP) :: ATOT ! Ensamble DFT
REAL(DP) :: ENTROPY ! Ensamble DFT
REAL(DP) :: EGRAND ! Ensamble DFT
REAL(DP) :: VAVE ! Ensamble DFT
REAL(DP) :: EEXTFOR ! Energy of the external forces
END TYPE
REAL(DP) :: EHTE = 0.0_DP
REAL(DP) :: SELF_EHTE = 0.0_DP
REAL(DP) :: EHTI = 0.0_DP
REAL(DP) :: EH = 0.0_DP
REAL(DP) :: EHT = 0.0_DP
REAL(DP) :: SELF_EXC = 0.0_DP
REAL(DP) :: SELF_VXC = 0.0_DP
REAL(DP) :: EKIN = 0.0_DP
REAL(DP) :: ESELF = 0.0_DP
REAL(DP) :: EVDW = 0.0_DP
REAL(DP) :: EPSEU = 0.0_DP
REAL(DP) :: ENT = 0.0_DP
REAL(DP) :: ETOT = 0.0_DP
REAL(DP) :: ENL = 0.0_DP
REAL(DP) :: ESR = 0.0_DP
REAL(DP) :: EXC = 0.0_DP
REAL(DP) :: VXC = 0.0_DP
REAL(DP) :: EBAND = 0.0_DP
REAL(DP) :: ATOT = 0.0_DP
REAL(DP) :: ENTROPY = 0.0_DP
REAL(DP) :: EGRAND = 0.0_DP
REAL(DP) :: VAVE = 0.0_DP ! average potential
REAL(DP) :: EEXTFOR = 0.0_DP ! Energy of the external forces
REAL(DP) :: enthal = 0.0_DP, ekincm
PUBLIC :: dft_energy_type, total_energy, eig_total_energy, &
print_energies, debug_energies
PUBLIC :: etot, eself, enl, ekin, epseu, esr, eht, exc, ekincm
PUBLIC :: self_exc, self_ehte
PUBLIC :: atot, entropy, egrand, enthal, vave
PUBLIC :: eextfor
CONTAINS
! ---------------------------------------------------------------------------- !
SUBROUTINE total_energy( edft )
TYPE (dft_energy_type) :: edft
eself = edft%eself
epseu = edft%epseu
ent = edft%ent
enl = edft%enl
evdw = edft%evdw
esr = edft%esr
ekin = edft%ekin
vxc = edft%vxc
ehti = edft%ehti
ehte = edft%ehte
self_ehte = edft%self_ehte
self_exc = edft%self_exc
self_vxc = edft%self_vxc
exc = edft%exc
eht = edft%eht
etot = ekin + eht + epseu + enl + exc + evdw - ent
!
edft%etot = etot
RETURN
END SUBROUTINE total_energy
! ---------------------------------------------------------------------------- !
SUBROUTINE eig_total_energy(ei)
IMPLICIT NONE
REAL(DP), INTENT(IN) :: ei(:)
INTEGER :: i
REAL(DP) etot_band, EII
eband = 0.0_DP
do i = 1, SIZE(ei)
eband = eband + ei(i) * 2.0_DP
end do
EII = ehti + ESR - ESELF
etot_band = eband - ehte + (exc-vxc) + eii
WRITE( stdout,200) etot_band, eband, ehte, (exc-vxc), eii
200 FORMAT(' *** TOTAL ENERGY : ',F14.8,/ &
,' eband : ',F14.8,/ &
,' eh : ',F14.8,/ &
,' xc : ',F14.8,/ &
,' eii : ',F14.8)
RETURN
END SUBROUTINE eig_total_energy
! ---------------------------------------------------------------------------- !
SUBROUTINE print_energies( tsic, iprsta, edft, sic_alpha, sic_epsilon, textfor )
LOGICAL, INTENT(IN) :: tsic
TYPE (dft_energy_type), OPTIONAL, INTENT(IN) :: edft
INTEGER, OPTIONAL, INTENT(IN) :: iprsta
REAL(DP), OPTIONAL, INTENT(IN) :: sic_alpha, sic_epsilon
LOGICAL, OPTIONAL, INTENT(IN) :: textfor
IF( PRESENT ( edft ) ) THEN
WRITE( stdout, * )
WRITE( stdout, * )
WRITE( stdout, 1 ) edft%etot
WRITE( stdout, 2 ) edft%ekin
WRITE( stdout, 3 ) edft%eht
WRITE( stdout, 4 ) edft%eself ! self interaction of the pseudocharges NOT SIC!
WRITE( stdout, 5 ) edft%esr
WRITE( stdout, 9 ) edft%epseu
WRITE( stdout, 10 ) edft%enl
WRITE( stdout, 11 ) edft%exc
IF( PRESENT( iprsta ) ) THEN
IF( iprsta > 1 ) THEN
WRITE( stdout, * )
WRITE( stdout, 6 ) edft%eh
WRITE( stdout, 7 ) edft%ehte
WRITE( stdout, 8 ) edft%ehti
WRITE( stdout, 12 ) edft%evdw
WRITE( stdout, 13 ) edft%emkin
END IF
END IF
ELSE
!
999 WRITE( stdout,100) etot, ekin, eht, esr, eself, epseu, enl, exc, vave
!
END IF
!
IF( tsic ) THEN
!
IF( .NOT. PRESENT( sic_alpha ) .OR. .NOT. PRESENT( sic_epsilon ) ) &
CALL errore( ' print_energies ', ' sic without parameters? ', 1 )
WRITE( stdout, fmt = "('Sic contributes in Mauri&al. approach:')" )
WRITE( stdout, fmt = "('--------------------------------------')" )
!
! qui e' da aggiungere i due parametetri alpha_si e si_epsilon che determinano "quanto"
! correggo lo exc e hartree
!
WRITE( stdout, 14 ) self_ehte, sic_epsilon
WRITE( stdout, 15 ) self_exc, sic_alpha
END IF
!
IF( PRESENT( textfor ) ) THEN
IF( textfor ) WRITE( stdout, 16 ) eextfor
END IF
!
1 FORMAT(6X,' total energy = ',F18.10,' Hartree a.u.')
2 FORMAT(6X,' kinetic energy = ',F18.10,' Hartree a.u.')
3 FORMAT(6X,' electrostatic energy = ',F18.10,' Hartree a.u.')
4 FORMAT(6X,' eself = ',F18.10,' Hartree a.u.')
5 FORMAT(6X,' esr = ',F18.10,' Hartree a.u.')
6 FORMAT(6X,' hartree energy = ',F18.10,' Hartree a.u.')
7 FORMAT(6X,' hartree ehte = ',F18.10,' Hartree a.u.')
8 FORMAT(6X,' hartree ehti = ',F18.10,' Hartree a.u.')
9 FORMAT(6X,' pseudopotential energy = ',F18.10,' Hartree a.u.')
10 FORMAT(6X,' n-l pseudopotential energy = ',F18.10,' Hartree a.u.')
11 FORMAT(6X,' exchange-correlation energy = ',F18.10,' Hartree a.u.')
12 FORMAT(6X,' van der waals energy = ',F18.10,' Hartree a.u.')
13 FORMAT(6X,' emass kinetic energy = ',F18.10,' Hartree a.u.')
14 FORMAT(6X,' hartree sic_ehte = ',F18.10,' Hartree a.u.', 1X, 'corr. factor = ',F6.3)
15 FORMAT(6X,' sic exchange-correla energy = ',F18.10,' Hartree a.u.', 1X, 'corr. factor = ',F6.3)
16 FORMAT(6X,' external force energy = ',F18.10,' Hartree a.u.')
100 format(//' total energy = ',f14.5,' Hartree a.u.'/ &
& ' kinetic energy = ',f14.5,' Hartree a.u.'/ &
& ' electrostatic energy = ',f14.5,' Hartree a.u.'/ &
& ' esr = ',f14.5,' Hartree a.u.'/ &
& ' eself = ',f14.5,' Hartree a.u.'/ &
& ' pseudopotential energy = ',f14.5,' Hartree a.u.'/ &
& ' n-l pseudopotential energy = ',f14.5,' Hartree a.u.'/ &
& ' exchange-correlation energy = ',f14.5,' Hartree a.u.'/ &
& ' average potential = ',f14.5,' Hartree a.u.'//)
RETURN
END SUBROUTINE print_energies
! ---------------------------------------------------------------------------- !
SUBROUTINE debug_energies( edft )
TYPE (dft_energy_type), OPTIONAL, INTENT(IN) :: edft
IF( PRESENT ( edft ) ) THEN
WRITE( stdout,2) edft%ETOT, edft%EKIN, edft%EHT, &
edft%ESELF, edft%ESR, edft%EH, &
edft%EPSEU, edft%ENL, edft%EXC, edft%VXC, edft%EVDW, edft%EHTE, &
edft%EHTI, edft%ENT, edft%EBAND, (edft%EXC-edft%VXC), &
(edft%EHTI+edft%ESR-edft%ESELF), &
edft%EBAND-edft%EHTE+(edft%EXC-edft%VXC)+(edft%EHTI+edft%ESR-edft%ESELF)
ELSE
WRITE( stdout,2) ETOT, EKIN, EHT, ESELF, ESR, EH, EPSEU, ENL, EXC, VXC, &
EVDW, EHTE, EHTI, ENT, EBAND, (EXC-VXC), (EHTI+ESR-ESELF), &
EBAND-EHTE+(EXC-VXC)+(EHTI+ESR-ESELF)
END IF
2 FORMAT(/,/ &
,6X,' ETOT .... = ',F18.10,/ &
,6X,' EKIN .... = ',F18.10,/ &
,6X,' EHT ..... = ',F18.10,/ &
,6X,' ESELF ... = ',F18.10,/ &
,6X,' ESR ..... = ',F18.10,/ &
,6X,' EH ...... = ',F18.10,/ &
,6X,' EPSEU ... = ',F18.10,/ &
,6X,' ENL ..... = ',F18.10,/ &
,6X,' EXC ..... = ',F18.10,/ &
,6X,' VXC ..... = ',F18.10,/ &
,6X,' EVDW .... = ',F18.10,/ &
,6X,' EHTE .... = ',F18.10,/ &
,6X,' EHTI .... = ',F18.10,/ &
,6X,' ENT ..... = ',F18.10,/ &
,6X,' EBAND ... = ',F18.10,/ &
,6X,' EXC-VXC ............................. = ',F18.10,/ &
,6X,' EHTI+ESR-ESELF ...................... = ',F18.10,/ &
,6X,' EBAND-EHTE+(EXC-VXC)+(EHTI+ESR-ESELF) = ',F18.10)
RETURN
END SUBROUTINE debug_energies
END MODULE energies