quantum-espresso/Modules/energies.f90

237 lines
8.6 KiB
Fortran
Raw Normal View History

!
! Copyright (C) 2002 FPMD 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(dbl) :: ETOT
REAL(dbl) :: SKIN
REAL(dbl) :: EMKIN
REAL(dbl) :: SELF_SXC
REAL(dbl) :: SXC
REAL(dbl) :: EHT
REAL(dbl) :: EH
REAL(dbl) :: SELF_EHTE
REAL(dbl) :: EHTE
REAL(dbl) :: EHTI
REAL(dbl) :: EPSEU
REAL(dbl) :: ENL
REAL(dbl) :: ENT
REAL(dbl) :: VXC
REAL(dbl) :: EXC
REAL(dbl) :: ESELF
REAL(dbl) :: ESR
REAL(dbl) :: EVDW
REAL(dbl) :: EBAND
REAL(dbl) :: EKIN
END TYPE
REAL(dbl) :: EHTE = 0.0_dbl
REAL(dbl) :: SELF_EHTE = 0.0_dbl
REAL(dbl) :: EHTI = 0.0_dbl
REAL(dbl) :: EH = 0.0_dbl
REAL(dbl) :: EHT = 0.0_dbl
REAL(dbl) :: SXC = 0.0_dbl
REAL(dbl) :: SELF_SXC = 0.0_dbl
REAL(dbl) :: EKIN = 0.0_dbl
REAL(dbl) :: ESELF = 0.0_dbl
REAL(dbl) :: EVDW = 0.0_dbl
REAL(dbl) :: EPSEU = 0.0_dbl
REAL(dbl) :: ENT = 0.0_dbl
REAL(dbl) :: ETOT = 0.0_dbl
REAL(dbl) :: ENL = 0.0_dbl
REAL(dbl) :: ESR = 0.0_dbl
REAL(dbl) :: EXC = 0.0_dbl
REAL(dbl) :: VXC = 0.0_dbl
REAL(dbl) :: SELF_VXC = 0.0_dbl
REAL(dbl) :: EBAND = 0.0_dbl
PUBLIC :: dft_energy_type, total_energy, eig_total_energy, &
print_energies, debug_energies
CONTAINS
! ---------------------------------------------------------------------------- !
! SUBROUTINE total_energy( edft, omega, eexc, vvxc, eh, eps, &
! self_ehte_in, self_sxc_in, self_vxc_in, nnr)
SUBROUTINE total_energy( edft, omega, vvxc, eps, self_vxc_in, nnr)
TYPE (dft_energy_type) :: edft
REAL(dbl), INTENT(IN) :: OMEGA, VVXC
REAL(dbl) :: VXC
REAL(dbl) :: self_vxc_in
COMPLEX(dbl), INTENT(IN) :: EPS
INTEGER, INTENT(IN) :: nnr
eself = edft%eself
ent = edft%ent
enl = edft%enl
evdw = edft%evdw
esr = edft%esr
ekin = edft%ekin
sxc = edft%sxc
ehti = edft%ehte
ehte = edft%ehte
self_ehte = edft%ehte
self_sxc = edft%self_sxc
self_vxc = self_vxc_in
EXC = edft%sxc * omega / REAL(NNR) !EEXC * omega / REAL(NNR)
VXC = VVXC * omega / REAL(NNR)
edft%exc = exc
edft%vxc = vxc
!EHT = REAL( eh ) + esr - eself
edft%eht = edft%eh + esr - eself ! = eht
EHT = edft%eht
EPSEU = REAL(eps)
edft%epseu = epseu
ETOT = EKIN + EHT + EPSEU + ENL + EXC + EVDW - ENT
edft%etot = etot
RETURN
END SUBROUTINE total_energy
! ---------------------------------------------------------------------------- !
SUBROUTINE eig_total_energy(ei)
IMPLICIT NONE
REAL(dbl), INTENT(IN) :: ei(:)
INTEGER :: i
REAL(dbl) etot_band, EII
eband = 0.0d0
do i = 1, SIZE(ei)
eband = eband + ei(i) * 2.0d0
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
! ---------------------------------------------------------------------------- !
SUBROUTINE print_energies( tsic, edft )
LOGICAL, INTENT(IN) :: tsic
TYPE (dft_energy_type), OPTIONAL, INTENT(IN) :: edft
REAL ( dbl ) :: EHT
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
WRITE( stdout, 5 ) edft%esr
WRITE( stdout, 9 ) edft%epseu
WRITE( stdout, 10 ) edft%enl
WRITE( stdout, 11 ) edft%exc
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
IF( tsic ) THEN
WRITE( stdout, 14 ) edft%self_ehte
WRITE( stdout, 15 ) edft%self_sxc
WRITE( stdout, 16 ) vxc
WRITE( stdout, 17 ) self_vxc
END IF
! ETOT = EKIN + EHT + EPSEU + ENL + EXC + EVDW - ENT
ELSE
WRITE( stdout, 1 ) edft%etot
WRITE( stdout, 2 ) edft%ekin
WRITE( stdout, 3 ) edft%eht
WRITE( stdout, 4 ) edft%eself
WRITE( stdout, 5 ) edft%esr
WRITE( stdout, 9 ) edft%epseu
WRITE( stdout, 10 ) edft%enl
WRITE( stdout, 11 ) edft%exc
END IF
1 FORMAT( 6X,' TOTAL ENERGY = ',F18.10,' A.U.')
2 FORMAT( 6X,' KINETIC ENERGY = ',F18.10,' A.U.')
3 FORMAT( 6X,' ELECTROSTATIC ENERGY = ',F18.10,' A.U.')
4 FORMAT( 6X,' ESELF = ',F18.10,' A.U.')
5 FORMAT( 6X,' ESR = ',F18.10,' A.U.')
6 FORMAT( 6X,' HARTREE ENERGY = ',F18.10,' A.U.')
7 FORMAT( 6X,' HARTREE EHTE = ',F18.10,' A.U.')
8 FORMAT( 6X,' HARTREE EHTI = ',F18.10,' A.U.')
9 FORMAT( 6X,' PSEUDOPOTENTIAL ENERGY = ',F18.10,' A.U.')
10 FORMAT( 6X,' N-L PSEUDOPOTENTIAL ENERGY = ',F18.10,' A.U.')
11 FORMAT( 6X,' EXCHANGE-CORRELATION ENERGY = ',F18.10,' A.U.')
12 FORMAT( 6X,' VAN DER WAALS ENERGY = ',F18.10,' A.U.')
13 FORMAT( 6X,' EMASS KINETIC ENERGY = ',F18.10,' A.U.')
14 FORMAT( 6X,' HARTREE SIC_EHTE = ',F18.10,' A.U.')
15 FORMAT( 6X,' SIC EXCHANGE-CORRELA ENERGY = ',F18.10,' A.U.')
16 FORMAT( 6X,' EXCHANGE-CORRELA POTENT = ',F18.10,' A.U.')
17 FORMAT( 6X,' SIC EXCHANGE-CORRELA POTENT = ',F18.10,' 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%SXC, edft%VXC, edft%EVDW, edft%EHTE, &
edft%EHTI, edft%ENT, edft%EBAND, (edft%SXC-edft%VXC), &
(edft%EHTI+edft%ESR-edft%ESELF), &
edft%EBAND-edft%EHTE+(edft%SXC-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