2003-06-10 05:27:20 +08:00
|
|
|
!
|
|
|
|
! 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
|
2003-11-04 18:26:03 +08:00
|
|
|
|
|
|
|
USE io_global, ONLY : stdout
|
2003-06-10 05:27:20 +08:00
|
|
|
USE kinds
|
|
|
|
IMPLICIT NONE
|
|
|
|
SAVE
|
|
|
|
|
|
|
|
TYPE dft_energy_type
|
|
|
|
REAL(dbl) :: ETOT
|
2004-06-24 18:13:56 +08:00
|
|
|
REAL(dbl) :: SKIN
|
2003-06-10 05:27:20 +08:00
|
|
|
REAL(dbl) :: EMKIN
|
2004-06-24 18:13:56 +08:00
|
|
|
REAL(dbl) :: SELF_SXC
|
|
|
|
REAL(dbl) :: SXC
|
2003-06-10 05:27:20 +08:00
|
|
|
REAL(dbl) :: EHT
|
2004-06-24 18:13:56 +08:00
|
|
|
REAL(dbl) :: EH
|
|
|
|
REAL(dbl) :: SELF_EHTE
|
2003-06-10 05:27:20 +08:00
|
|
|
REAL(dbl) :: EHTE
|
|
|
|
REAL(dbl) :: EHTI
|
|
|
|
REAL(dbl) :: EPSEU
|
|
|
|
REAL(dbl) :: ENL
|
|
|
|
REAL(dbl) :: ENT
|
|
|
|
REAL(dbl) :: VXC
|
2004-06-24 18:13:56 +08:00
|
|
|
REAL(dbl) :: EXC
|
2003-06-10 05:27:20 +08:00
|
|
|
REAL(dbl) :: ESELF
|
|
|
|
REAL(dbl) :: ESR
|
|
|
|
REAL(dbl) :: EVDW
|
|
|
|
REAL(dbl) :: EBAND
|
2004-06-24 18:13:56 +08:00
|
|
|
REAL(dbl) :: EKIN
|
2003-06-10 05:27:20 +08:00
|
|
|
END TYPE
|
|
|
|
|
|
|
|
REAL(dbl) :: EHTE = 0.0_dbl
|
2004-06-24 18:13:56 +08:00
|
|
|
REAL(dbl) :: SELF_EHTE = 0.0_dbl
|
2003-06-10 05:27:20 +08:00
|
|
|
REAL(dbl) :: EHTI = 0.0_dbl
|
2004-06-24 18:13:56 +08:00
|
|
|
REAL(dbl) :: EH = 0.0_dbl
|
2003-06-10 05:27:20 +08:00
|
|
|
REAL(dbl) :: EHT = 0.0_dbl
|
2004-06-24 18:13:56 +08:00
|
|
|
REAL(dbl) :: SXC = 0.0_dbl
|
|
|
|
REAL(dbl) :: SELF_SXC = 0.0_dbl
|
2003-06-10 05:27:20 +08:00
|
|
|
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
|
2004-06-24 18:13:56 +08:00
|
|
|
REAL(dbl) :: SELF_VXC = 0.0_dbl
|
2003-06-10 05:27:20 +08:00
|
|
|
REAL(dbl) :: EBAND = 0.0_dbl
|
|
|
|
|
|
|
|
|
|
|
|
CONTAINS
|
|
|
|
|
|
|
|
! ---------------------------------------------------------------------------- !
|
|
|
|
|
2004-06-24 18:13:56 +08:00
|
|
|
! 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)
|
2004-04-02 00:30:59 +08:00
|
|
|
|
2003-06-10 05:27:20 +08:00
|
|
|
TYPE (dft_energy_type) :: edft
|
2004-06-24 18:13:56 +08:00
|
|
|
REAL(dbl), INTENT(IN) :: OMEGA, VVXC
|
2003-06-10 05:27:20 +08:00
|
|
|
REAL(dbl) :: VXC
|
2004-06-24 18:13:56 +08:00
|
|
|
REAL(dbl) :: self_vxc_in
|
|
|
|
COMPLEX(dbl), INTENT(IN) :: EPS
|
2003-06-10 05:27:20 +08:00
|
|
|
INTEGER, INTENT(IN) :: nnr
|
|
|
|
|
|
|
|
eself = edft%eself
|
|
|
|
ent = edft%ent
|
|
|
|
enl = edft%enl
|
|
|
|
evdw = edft%evdw
|
|
|
|
esr = edft%esr
|
|
|
|
ekin = edft%ekin
|
2004-06-24 18:13:56 +08:00
|
|
|
sxc = edft%sxc
|
|
|
|
ehti = edft%ehte
|
|
|
|
ehte = edft%ehte
|
|
|
|
self_ehte = edft%ehte
|
|
|
|
self_sxc = edft%self_sxc
|
2003-06-10 05:27:20 +08:00
|
|
|
|
2004-04-02 00:30:59 +08:00
|
|
|
self_vxc = self_vxc_in
|
|
|
|
|
2004-06-24 18:13:56 +08:00
|
|
|
EXC = edft%sxc * omega / REAL(NNR) !EEXC * omega / REAL(NNR)
|
2003-06-10 05:27:20 +08:00
|
|
|
VXC = VVXC * omega / REAL(NNR)
|
2004-06-24 18:13:56 +08:00
|
|
|
|
2003-06-10 05:27:20 +08:00
|
|
|
edft%exc = exc
|
|
|
|
edft%vxc = vxc
|
|
|
|
|
2004-06-24 18:13:56 +08:00
|
|
|
!EHT = REAL( eh ) + esr - eself
|
|
|
|
edft%eht = edft%eh + esr - eself ! = eht
|
|
|
|
EHT = edft%eht
|
2003-06-10 05:27:20 +08:00
|
|
|
|
|
|
|
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
|
2003-11-04 18:26:03 +08:00
|
|
|
WRITE( stdout,200) etot_band, eband, ehte, (exc-vxc), eii
|
2003-06-10 05:27:20 +08:00
|
|
|
200 FORMAT(' *** TOTAL ENERGY : ',F14.8,/ &
|
|
|
|
,' eband : ',F14.8,/ &
|
|
|
|
,' eh : ',F14.8,/ &
|
|
|
|
,' xc : ',F14.8,/ &
|
|
|
|
,' eii : ',F14.8)
|
|
|
|
RETURN
|
|
|
|
END SUBROUTINE
|
|
|
|
|
|
|
|
! ---------------------------------------------------------------------------- !
|
|
|
|
|
2004-06-24 18:13:56 +08:00
|
|
|
SUBROUTINE print_energies( tsic, edft )
|
|
|
|
LOGICAL, INTENT(IN) :: tsic
|
2003-06-10 05:27:20 +08:00
|
|
|
TYPE (dft_energy_type), OPTIONAL, INTENT(IN) :: edft
|
2004-06-24 18:13:56 +08:00
|
|
|
REAL ( dbl ) :: EHT
|
|
|
|
|
2003-06-10 05:27:20 +08:00
|
|
|
IF( PRESENT ( edft ) ) THEN
|
2004-06-24 18:13:56 +08:00
|
|
|
IF( tsic ) THEN
|
2004-06-24 18:30:00 +08:00
|
|
|
WRITE( stdout,1) edft%etot, edft%ekin, edft%eht, &
|
|
|
|
edft%eself, edft%esr, edft%eh, &
|
2004-06-24 18:13:56 +08:00
|
|
|
edft%ehte, edft%self_ehte, edft%ehti, &
|
2004-06-24 18:30:00 +08:00
|
|
|
edft%epseu, edft%enl, edft%exc, edft%self_sxc, &
|
|
|
|
edft%evdw, edft%emkin, vxc, self_vxc
|
2004-06-24 18:13:56 +08:00
|
|
|
ELSE
|
2004-06-24 18:30:00 +08:00
|
|
|
WRITE( stdout,2) edft%etot, edft%ekin, edft%eht, &
|
|
|
|
edft%eself, edft%esr, edft%eh, &
|
|
|
|
edft%ehte, edft%ehti, edft%epseu, edft%enl, edft%exc, &
|
|
|
|
edft%evdw, edft%emkin
|
2004-06-24 18:13:56 +08:00
|
|
|
END IF
|
2003-06-10 05:27:20 +08:00
|
|
|
ELSE
|
2003-11-04 18:26:03 +08:00
|
|
|
WRITE( stdout,1) ETOT, EKIN, EHT, ESELF, ESR, EPSEU, ENL, EXC, EVDW
|
2003-06-10 05:27:20 +08:00
|
|
|
END IF
|
2004-06-24 18:13:56 +08:00
|
|
|
2 FORMAT(/,/,6X,' TOTAL ENERGY = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' KINETIC ENERGY = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' ELECTROSTATIC ENERGY = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' ESELF = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' ESR = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' HARTREE ENERGY = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' HARTREE EHTE = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' HARTREE EHTI = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' PSEUDOPOTENTIAL ENERGY = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' N-L PSEUDOPOTENTIAL ENERGY = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' EXCHANGE-CORRELATION ENERGY = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' VAN DER WAALS ENERGY = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' EMASS KINETIC ENERGY = ',F18.10,' A.U.'/,/)
|
2003-06-10 05:27:20 +08:00
|
|
|
1 FORMAT(/,/,6X,' TOTAL ENERGY = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' KINETIC ENERGY = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' ELECTROSTATIC ENERGY = ',F18.10,' A.U.'/ &
|
2004-06-24 18:13:56 +08:00
|
|
|
,6X,' ESELF = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' ESR = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' HARTREE ENERGY = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' HARTREE EHTE = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' HARTREE SIC_EHTE = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' HARTREE EHTI = ',F18.10,' A.U.'/ &
|
2003-06-10 05:27:20 +08:00
|
|
|
,6X,' PSEUDOPOTENTIAL ENERGY = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' N-L PSEUDOPOTENTIAL ENERGY = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' EXCHANGE-CORRELATION ENERGY = ',F18.10,' A.U.'/ &
|
2004-06-24 18:13:56 +08:00
|
|
|
,6X,' SIC EXCHANGE-CORRELA ENERGY = ',F18.10,' A.U.'/ &
|
2003-06-10 05:27:20 +08:00
|
|
|
,6X,' VAN DER WAALS ENERGY = ',F18.10,' A.U.'/ &
|
2004-04-02 00:30:59 +08:00
|
|
|
,6X,' EMASS KINETIC ENERGY = ',F18.10,' A.U.'/ &
|
2004-06-24 18:13:56 +08:00
|
|
|
,6X,' EXCHANGE-CORRELA POTENT = ',F18.10,' A.U.'/ &
|
|
|
|
,6X,' SIC EXCHANGE-CORRELA POTENT = ',F18.10,' A.U.'/,/)
|
2003-06-10 05:27:20 +08:00
|
|
|
RETURN
|
|
|
|
END SUBROUTINE print_energies
|
|
|
|
|
2004-06-24 18:13:56 +08:00
|
|
|
|
2003-06-10 05:27:20 +08:00
|
|
|
! ---------------------------------------------------------------------------- !
|
|
|
|
|
|
|
|
SUBROUTINE debug_energies( edft )
|
|
|
|
TYPE (dft_energy_type), OPTIONAL, INTENT(IN) :: edft
|
|
|
|
IF( PRESENT ( edft ) ) THEN
|
2004-06-24 18:13:56 +08:00
|
|
|
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), &
|
2003-06-10 05:27:20 +08:00
|
|
|
(edft%EHTI+edft%ESR-edft%ESELF), &
|
2004-06-24 18:13:56 +08:00
|
|
|
edft%EBAND-edft%EHTE+(edft%SXC-edft%VXC)+(edft%EHTI+edft%ESR-edft%ESELF)
|
2003-06-10 05:27:20 +08:00
|
|
|
ELSE
|
2004-06-24 18:13:56 +08:00
|
|
|
WRITE( stdout,2) ETOT, EKIN, EHT, ESELF, ESR, EH, EPSEU, ENL, EXC, VXC, &
|
2003-06-10 05:27:20 +08:00
|
|
|
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,/ &
|
2004-06-24 18:13:56 +08:00
|
|
|
,6X,' EH ...... = ',F18.10,/ &
|
2003-06-10 05:27:20 +08:00
|
|
|
,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
|