TABLE OF CONTENTS
- ABINIT/m_energies
- m_energies/energies_copy
- m_energies/energies_eval_eint
- m_energies/energies_init
- m_energies/energies_ncwrite
- m_energies/energies_to_array
- m_energies/energies_type
ABINIT/m_energies [ Modules ]
NAME
m_energies
FUNCTION
This module provides the definition of the energies used to store energies from GS calculations.
COPYRIGHT
Copyright (C) 2008-2024 ABINIT group (MT, DC) This file is distributed under the terms of the GNU General Public License, see ~abinit/COPYING or http://www.gnu.org/copyleft/gpl.txt .
SOURCE
17 #if defined HAVE_CONFIG_H 18 #include "config.h" 19 #endif 20 21 #include "abi_common.h" 22 23 module m_energies 24 25 use defs_basis 26 use m_abicore 27 use m_errors 28 use m_nctk 29 use m_dtset 30 #ifdef HAVE_NETCDF 31 use netcdf 32 #endif 33 34 implicit none 35 36 private 37 38 !public parameter 39 integer, public, parameter :: n_energies=38
m_energies/energies_copy [ Functions ]
[ Top ] [ m_energies ] [ Functions ]
NAME
energies_copy
FUNCTION
Copy a type(energies_type) object into another
INPUTS
energies_in <type(energies_type)>=input values (to copy)
OUTPUT
energies_out <type(energies_type)>=output values
SOURCE
285 subroutine energies_copy(energies_in,energies_out) 286 287 !Arguments ------------------------------------ 288 !scalars 289 type(energies_type),intent(in) :: energies_in 290 type(energies_type),intent(out) :: energies_out 291 292 !************************************************************************* 293 294 !@energies_type 295 296 energies_out%e_chempot = energies_in%e_chempot 297 energies_out%e_constrained_dft = energies_in%e_constrained_dft 298 energies_out%e_corepsp = energies_in%e_corepsp 299 energies_out%e_corepspdc = energies_in%e_corepspdc 300 energies_out%e_eigenvalues = energies_in%e_eigenvalues 301 energies_out%e_elecfield = energies_in%e_elecfield 302 energies_out%e_electronpositron = energies_in%e_electronpositron 303 energies_out%edc_electronpositron = energies_in%edc_electronpositron 304 energies_out%e0_electronpositron = energies_in%e0_electronpositron 305 energies_out%entropy = energies_in%entropy 306 energies_out%e_entropy = energies_in%e_entropy 307 energies_out%e_ewald = energies_in%e_ewald 308 energies_out%e_exactX = energies_in%e_exactX 309 energies_out%e_extfpmd = energies_in%e_extfpmd 310 energies_out%edc_extfpmd = energies_in%edc_extfpmd 311 energies_out%e_fermie = energies_in%e_fermie 312 energies_out%e_fermih = energies_in%e_fermih 313 energies_out%e_fock = energies_in%e_fock 314 energies_out%e_fockdc = energies_in%e_fockdc 315 energies_out%e_fock0 = energies_in%e_fock0 316 energies_out%e_hartree = energies_in%e_hartree 317 energies_out%e_hybcomp_E0 = energies_in%e_hybcomp_E0 318 energies_out%e_hybcomp_v0 = energies_in%e_hybcomp_v0 319 energies_out%e_hybcomp_v = energies_in%e_hybcomp_v 320 energies_out%e_kinetic = energies_in%e_kinetic 321 energies_out%e_localpsp = energies_in%e_localpsp 322 energies_out%e_magfield = energies_in%e_magfield 323 energies_out%e_monopole = energies_in%e_monopole 324 energies_out%e_nlpsp_vfock = energies_in%e_nlpsp_vfock 325 energies_out%e_nucdip = energies_in%e_nucdip 326 energies_out%e_paw = energies_in%e_paw 327 energies_out%e_pawdc = energies_in%e_pawdc 328 energies_out%e_sicdc = energies_in%e_sicdc 329 energies_out%e_vdw_dftd = energies_in%e_vdw_dftd 330 energies_out%e_xc = energies_in%e_xc 331 energies_out%e_xcdc = energies_in%e_xcdc 332 energies_out%e_xc_vdw = energies_in%e_xc_vdw 333 energies_out%h0 = energies_in%h0 334 energies_out%e_zeeman = energies_in%e_zeeman 335 336 end subroutine energies_copy
m_energies/energies_eval_eint [ Functions ]
[ Top ] [ m_energies ] [ Functions ]
NAME
energies_eval_eint
FUNCTION
Compute the internal energy (Direct and DC as it was in prtene)
INPUTS
energies <type(energies_type)>=values of parts of total energy dtset <type(dataset_type)>=all input variables in this dataset | berryphase | kptopt | occopt | positron=option for electron-positron calculation usepaw= 0 for non paw calculation; =1 for paw calculation usewvl= 0 for PW calculation; =1 for WVL calculation
OUTPUT
optdc=option for double counting scheme eint=internal energy with direct scheme eintdc=internal energy with double counting scheme
SIDE EFFECTS
SOURCE
490 subroutine energies_eval_eint(energies,dtset,usepaw,optdc,eint,eintdc) 491 492 !Arguments ------------------------------------ 493 !scalars 494 type(energies_type),intent(in) :: energies 495 type(dataset_type),intent(in) :: dtset 496 integer,intent(in) :: usepaw 497 integer , intent(out) :: optdc 498 real(dp), intent(out) :: eint 499 real(dp), intent(out) :: eintdc 500 501 !Local variables------------------------------- 502 ! Do not modify the length of this string 503 !scalars 504 logical :: positron 505 logical :: wvlbigdft=.false. 506 507 ! ************************************************************************* 508 509 !If usewvl: wvlbigdft indicates that the BigDFT workflow will be followed 510 wvlbigdft=(dtset%usewvl==1.and.dtset%wvl_bigdft_comp==1) 511 512 optdc=-1;positron=(dtset%positron/=0) 513 if (.not.positron) then 514 if ((abs(energies%e_xcdc)<1.e-15_dp).and.(abs(energies%e_fockdc)<1.e-15_dp)) optdc=0 515 if (abs(energies%e_localpsp)<1.e-15_dp.and.(abs(energies%e_xcdc)>1.e-15_dp.or.abs(energies%e_fockdc)>1.e-15_dp)) optdc=1 516 if (abs(energies%e_localpsp)>1.e-15_dp.and.(abs(energies%e_xcdc)>1.e-15_dp.or.abs(energies%e_fockdc)>1.e-15_dp)) optdc=2 517 if (wvlbigdft .and. dtset%iscf > 0) optdc=1 518 else 519 if (abs(energies%edc_electronpositron)<1.e-15_dp) optdc=0 520 if (abs(energies%e_electronpositron)<1.e-15_dp.and.abs(energies%edc_electronpositron)>1.e-15_dp) optdc=1 521 if (abs(energies%e_electronpositron)>1.e-15_dp.and.abs(energies%edc_electronpositron)>1.e-15_dp) optdc=2 522 end if 523 524 eint = zero 525 eintdc = zero 526 527 !============= Evaluate some parts of the energy =========== 528 529 if (optdc==0.or.optdc==2) then 530 eint = energies%e_kinetic + energies%e_hartree + energies%e_xc+ & 531 !& +two*energies%e_fock-energies%e_fock0+& ! The Fock energy is already included in the non_local part ... 532 !& energies%e_nlpsp_vfock - energies%e_fock0+& 533 & energies%e_hybcomp_E0 -energies%e_hybcomp_v0 + energies%e_hybcomp_v+& 534 & energies%e_localpsp + energies%e_corepsp + energies%e_constrained_dft+& 535 & energies%e_nucdip 536 537 ! See similar section in m_scfcv_core.F90 538 ! XG 20181025 This gives a variational energy in case of NCPP with all bands occupied - not yet for metals. 539 if (usepaw==0) eint = eint + energies%e_nlpsp_vfock - energies%e_fock0 540 ! XG 20181025 I was expecting the following to give also a variational energy in case of PAW, but this is not true. 541 ! if (usepaw==1) eint = eint + energies%e_paw + energies%e_nlpsp_vfock - energies%e_fock0 542 ! XG 20181025 So, the following is giving a non-variational expression ... 543 if (usepaw==1) eint = eint + energies%e_paw + energies%e_fock 544 545 if (dtset%berryopt==4 .or. dtset%berryopt==6 .or. dtset%berryopt==7 .or. & 546 & dtset%berryopt==14 .or. dtset%berryopt==16 .or. dtset%berryopt==17) eint=eint+energies%e_elecfield !!HONG 547 eint = eint + energies%e_ewald + energies%e_chempot + energies%e_vdw_dftd 548 if (positron) eint=eint+energies%e0_electronpositron+energies%e_electronpositron 549 if(abs(energies%e_extfpmd)>tiny(0.0_dp)) eint=eint+energies%e_extfpmd 550 end if 551 if (optdc>=1) then 552 eintdc = energies%e_eigenvalues - energies%e_hartree + energies%e_xc & 553 & + energies%e_hybcomp_E0 - energies%e_hybcomp_v0 & 554 & - energies%e_xcdc + energies%e_corepsp - energies%e_corepspdc-energies%e_fock0 555 if (usepaw==1) eintdc = eintdc + energies%e_pawdc 556 if (dtset%berryopt==4 .or. dtset%berryopt==6 .or. dtset%berryopt==7 .or. & 557 & dtset%berryopt==14 .or. dtset%berryopt==16 .or. dtset%berryopt==17) eintdc = eintdc + energies%e_elecfield 558 eintdc = eintdc + energies%e_ewald + energies%e_chempot + energies%e_vdw_dftd + energies%e_constrained_dft 559 if (positron) eintdc=eintdc-energies%edc_electronpositron & 560 & +energies%e0_electronpositron+energies%e_electronpositron 561 if(abs(energies%e_extfpmd)>tiny(0.0_dp)) eintdc=eintdc+energies%edc_extfpmd 562 end if 563 564 end subroutine energies_eval_eint
m_energies/energies_init [ Functions ]
[ Top ] [ m_energies ] [ Functions ]
NAME
energies_init
FUNCTION
Set zero in all values of a type(energies_type) object
INPUTS
OUTPUT
energies <type(energies_type)>=values to initialise
SOURCE
214 subroutine energies_init(energies) 215 216 !Arguments ------------------------------------ 217 !scalars 218 type(energies_type),intent(out) :: energies 219 220 ! ************************************************************************* 221 222 !@energies_type 223 224 energies%e_chempot = zero 225 energies%e_constrained_dft = zero 226 energies%e_corepsp = zero 227 energies%e_corepspdc = zero 228 energies%e_eigenvalues = zero 229 energies%e_elecfield = zero 230 energies%e_electronpositron = zero 231 energies%edc_electronpositron = zero 232 energies%e0_electronpositron = zero 233 energies%e_entropy = zero 234 energies%e_exactX = zero 235 energies%entropy = zero 236 energies%e_ewald = zero 237 energies%e_extfpmd = zero 238 energies%edc_extfpmd = zero 239 energies%e_fermie = zero 240 energies%e_fermih = zero 241 energies%e_fock = zero 242 energies%e_fockdc = zero 243 energies%e_fock0 = zero 244 energies%e_hartree = zero 245 energies%e_hybcomp_E0 = zero 246 energies%e_hybcomp_v0 = zero 247 energies%e_hybcomp_v = zero 248 energies%e_kinetic = zero 249 energies%e_localpsp = zero 250 energies%e_magfield = zero 251 energies%e_monopole = zero 252 energies%e_nlpsp_vfock = zero 253 energies%e_nucdip = zero 254 energies%e_paw = zero 255 energies%e_pawdc = zero 256 energies%e_sicdc = zero 257 energies%e_vdw_dftd = zero 258 energies%e_xc = zero 259 energies%e_xcdc = zero 260 energies%e_xc_vdw = zero 261 energies%h0 = zero 262 energies%e_zeeman = zero 263 264 end subroutine energies_init
m_energies/energies_ncwrite [ Functions ]
[ Top ] [ m_energies ] [ Functions ]
NAME
energies_ncwrite
FUNCTION
Write the contenc of the datatype in a netcdf file.
INPUTS
ncid=NC file handle
OUTPUT
Only writing.
SOURCE
584 subroutine energies_ncwrite(enes, ncid) 585 586 !Arguments ------------------------------------ 587 !scalars 588 integer,intent(in) :: ncid 589 type(energies_type),intent(in) :: enes 590 591 !Local variables------------------------------- 592 !scalars 593 #ifdef HAVE_NETCDF 594 integer :: ncerr 595 596 ! ************************************************************************* 597 598 !@energies_type 599 ncerr = nctk_defnwrite_dpvars(ncid, [character(len=nctk_slen) :: & 600 "e_chempot", "e_constrained_dft", "e_corepsp", "e_corepspdc", "e_eigenvalues", "e_elecfield", & 601 "e_electronpositron", "edc_electronpositron", "e0_electronpositron",& 602 "e_entropy", "entropy", "e_ewald", & 603 "e_exactX", "e_extfpmd", "edc_extfpmd", "e_fermie", & 604 "e_fock", "e_fockdc", "e_fock0", "e_hartree", "e_hybcomp_E0", "e_hybcomp_v0", "e_hybcomp_v", "e_kinetic",& 605 "e_localpsp", "e_magfield", "e_monopole", "e_nlpsp_vfock", "e_nucdip", & 606 "e_paw", "e_pawdc", "e_sicdc", "e_vdw_dftd", & 607 "e_xc", "e_xcdc", "e_xc_vdw", & 608 "h0", "e_zeeman", "e_fermih"], & 609 [enes%e_chempot, enes%e_constrained_dft, enes%e_corepsp, enes%e_corepspdc, enes%e_eigenvalues, enes%e_elecfield, & 610 enes%e_electronpositron, enes%edc_electronpositron, enes%e0_electronpositron,& 611 enes%e_entropy, enes%entropy, enes%e_ewald, & 612 enes%e_exactX, enes%e_extfpmd, enes%edc_extfpmd, enes%e_fermie, & 613 enes%e_fock, enes%e_fockdc, enes%e_fock0, enes%e_hartree, & 614 enes%e_hybcomp_E0, enes%e_hybcomp_v0, enes%e_hybcomp_v, enes%e_kinetic,& 615 enes%e_localpsp, enes%e_magfield, enes%e_monopole, enes%e_nlpsp_vfock, enes%e_nucdip, & 616 enes%e_paw, enes%e_pawdc, enes%e_sicdc, enes%e_vdw_dftd,& 617 enes%e_xc, enes%e_xcdc, enes%e_xc_vdw,& 618 enes%h0,enes%e_zeeman,enes%e_fermih]) 619 620 NCF_CHECK(ncerr) 621 622 #else 623 ABI_ERROR("ETSF-IO support is not activated.") 624 #endif 625 626 end subroutine energies_ncwrite
m_energies/energies_to_array [ Functions ]
[ Top ] [ m_energies ] [ Functions ]
NAME
energies_to_array
FUNCTION
Transfer a energies datastructure into a single array or transfer an array into a energies datastructure
INPUTS
option= 1: copy energies datastructure into an array option=-1: copy an array into a energies datastructure
OUTPUT
SIDE EFFECTS
energies <type(energies_type)>=energies stored in a datastructure energies_array=energies stored in a single array
SOURCE
362 subroutine energies_to_array(energies,energies_array,option) 363 364 !Arguments ------------------------------------ 365 !scalars 366 integer,intent(in) :: option 367 !arrays 368 real(dp),intent(inout) :: energies_array(n_energies) 369 type(energies_type),intent(inout) :: energies 370 371 !************************************************************************* 372 373 !@energies_type 374 375 if (option==1) then 376 energies_array(1)=energies%e_chempot 377 energies_array(2)=energies%e_constrained_dft 378 energies_array(3)=energies%e_corepsp 379 energies_array(4)=energies%e_corepspdc 380 energies_array(5)=energies%e_eigenvalues 381 energies_array(6)=energies%e_elecfield 382 energies_array(7)=energies%e_electronpositron 383 energies_array(8)=energies%edc_electronpositron 384 energies_array(9)=energies%e0_electronpositron 385 energies_array(10)=energies%entropy 386 energies_array(11)=energies%e_entropy 387 energies_array(12)=energies%e_ewald 388 energies_array(13)=energies%e_exactX 389 energies_array(14)=energies%e_extfpmd 390 energies_array(15)=energies%edc_extfpmd 391 energies_array(16)=energies%e_fermie 392 energies_array(17)=energies%e_fock 393 energies_array(18)=energies%e_fockdc 394 energies_array(19)=energies%e_fock0 395 energies_array(20)=energies%e_hartree 396 energies_array(21)=energies%e_hybcomp_E0 397 energies_array(22)=energies%e_hybcomp_v0 398 energies_array(23)=energies%e_hybcomp_v 399 energies_array(24)=energies%e_kinetic 400 energies_array(25)=energies%e_localpsp 401 energies_array(26)=energies%e_magfield 402 energies_array(27)=energies%e_monopole 403 energies_array(28)=energies%e_nlpsp_vfock 404 energies_array(29)=energies%e_paw 405 energies_array(30)=energies%e_pawdc 406 energies_array(31)=energies%e_sicdc 407 energies_array(32)=energies%e_vdw_dftd 408 energies_array(33)=energies%e_xc 409 energies_array(34)=energies%e_xcdc 410 energies_array(35)=energies%e_xc_vdw 411 energies_array(36)=energies%h0 412 energies_array(37)=energies%e_zeeman 413 energies_array(38)=energies%e_nucdip 414 end if 415 416 if (option==-1) then 417 energies%e_chempot = energies_array(1) 418 energies%e_constrained_dft = energies_array(2) 419 energies%e_corepsp = energies_array(3) 420 energies%e_corepspdc = energies_array(4) 421 energies%e_eigenvalues = energies_array(5) 422 energies%e_elecfield = energies_array(6) 423 energies%e_electronpositron = energies_array(7) 424 energies%edc_electronpositron = energies_array(8) 425 energies%e0_electronpositron = energies_array(9) 426 energies%entropy = energies_array(10) 427 energies%e_entropy = energies_array(11) 428 energies%e_ewald = energies_array(12) 429 energies%e_exactX = energies_array(13) 430 energies%e_extfpmd = energies_array(14) 431 energies%edc_extfpmd = energies_array(15) 432 energies%e_fermie = energies_array(16) 433 energies%e_fock = energies_array(17) 434 energies%e_fockdc = energies_array(18) 435 energies%e_fock0 = energies_array(19) 436 energies%e_hartree = energies_array(20) 437 energies%e_hybcomp_E0 = energies_array(21) 438 energies%e_hybcomp_v0 = energies_array(22) 439 energies%e_hybcomp_v = energies_array(23) 440 energies%e_kinetic = energies_array(24) 441 energies%e_localpsp = energies_array(25) 442 energies%e_magfield = energies_array(26) 443 energies%e_monopole = energies_array(27) 444 energies%e_nlpsp_vfock = energies_array(28) 445 energies%e_paw = energies_array(29) 446 energies%e_pawdc = energies_array(30) 447 energies%e_sicdc = energies_array(31) 448 energies%e_vdw_dftd = energies_array(32) 449 energies%e_xc = energies_array(33) 450 energies%e_xcdc = energies_array(34) 451 energies%e_xc_vdw = energies_array(35) 452 energies%h0 = energies_array(36) 453 energies%e_zeeman = energies_array(37) 454 energies%e_nucdip = energies_array(38) 455 end if 456 457 end subroutine energies_to_array
m_energies/energies_type [ Types ]
[ Top ] [ m_energies ] [ Types ]
NAME
energies_type
FUNCTION
This structured datatype contains all parts of total energy. Not all attributes may have a value, depending on the scheme used to compute the total energy and several options read from dtset.
SOURCE
54 type, public :: energies_type 55 56 ! WARNING : if you modify this datatype, please check whether there might be creation/destruction/copy routines, 57 ! declared in another part of ABINIT, that might need to take into account your modification. 58 59 real(dp) :: e_chempot=zero 60 ! energy from spatially-varying chemical potential 61 62 real(dp) :: e_constrained_dft=zero 63 ! correction to energy from constrained dft, to make it variational 64 65 real(dp) :: e_corepsp=zero 66 ! psp core-core energy 67 68 real(dp) :: e_corepspdc=zero 69 ! psp core-core energy double-counting 70 71 real(dp) :: e_eigenvalues=zero 72 ! Sum of the eigenvalues - Band energy (Hartree) 73 ! (valid for double-counting scheme dtset%optene == 1) 74 75 real(dp) :: e_entropy=zero 76 ! Entropy energy due to the occupation number smearing (if metal) 77 ! Value is multiplied by dtset%tsmear, see %entropy for the entropy alone. 78 ! (valid for metals, dtset%occopt>=3 .and. dtset%occopt<=8) 79 80 real(dp) :: entropy=zero 81 82 real(dp) :: e_elecfield=zero 83 ! Electric enthalpy, by adding both ionic and electronic contributions 84 85 real(dp) :: e_electronpositron=zero 86 ! Electron-positron: electron-positron interaction energy 87 88 real(dp) :: edc_electronpositron=zero 89 ! Electron-positron: double-counting electron-positron interaction energy 90 91 real(dp) :: e0_electronpositron=zero 92 ! Electron-positron: energy only due to unchanged particles 93 ! (if calctype=1, energy due to electrons only) 94 ! (if calctype=2, energy due to positron only) 95 96 real(dp) :: e_exactX=zero 97 ! Fock exact-exchange energy (hartree) 98 99 real(dp) :: e_ewald=zero 100 ! Ewald energy (hartree), store also the ion/ion energy for free boundary conditions. 101 102 real(dp) :: e_extfpmd=zero 103 ! Kinetic energy contribution of the Extended FPMD model for high temperature simulations 104 105 real(dp) :: edc_extfpmd=zero 106 ! Double counting term of kinetic energy of the Extended FPMD model 107 108 real(dp) :: e_fermie=zero 109 ! Fermie energy 110 111 real(dp) :: e_fermih=zero 112 ! Fermi energy for holes 113 114 real(dp) :: e_fock=zero 115 ! Fock part of total energy (hartree units) 116 117 real(dp) :: e_fockdc=zero 118 ! Fock part of energy double counting (hartree units) 119 120 real(dp) :: e_fock0=zero 121 ! Fock part of total energy, evaluated with the frozen Fock operator (usually in the case of the ACE) 122 123 real(dp) :: e_hartree=zero 124 ! Hartree part of total energy (hartree units) 125 126 real(dp) :: e_hybcomp_E0=zero 127 ! First compensation energy in the case of hybrid functionals, due to the use of two different XC functionals 128 ! Term related to energy, at frozen density 129 130 real(dp) :: e_hybcomp_v0=zero 131 ! Second compensation energy in the case of hybrid functionals, due to the use of two different XC potentials 132 ! Term related to potential, at frozen density 133 134 real(dp) :: e_hybcomp_v=zero 135 ! Third compensation energy in the case of hybrid functionals, due to the use of two different XC potentials 136 ! Term related to potential, at optimized density 137 138 real(dp) :: e_kinetic=zero 139 ! Kinetic energy part of total energy. 140 ! (valid for direct scheme, dtset%optene == 0) 141 142 real(dp) :: e_localpsp=zero 143 ! Local psp energy (hartree) 144 145 real(dp) :: e_magfield=zero 146 ! Orbital magnetic enthalpy, by adding orbital contribution 147 148 real(dp) :: e_monopole=zero 149 ! Monopole correction to the total energy for charged supercells 150 151 real(dp) :: e_nlpsp_vfock=zero 152 ! Nonlocal pseudopotential part of total energy. 153 154 real(dp) :: e_nucdip=zero 155 ! Energy due to array of nuclear magnetic dipoles 156 ! valid for direct scheme 157 158 real(dp) :: e_paw=zero 159 ! PAW spherical part energy 160 161 real(dp) :: e_pawdc=zero 162 ! PAW spherical part double-counting energy 163 164 real(dp) :: e_sicdc=zero 165 ! Self-interaction energy double-counting 166 167 real(dp) :: e_vdw_dftd=zero 168 ! Dispersion energy from DFT-D Van der Waals correction (hartree) 169 170 real(dp) :: e_xc=zero 171 ! Exchange-correlation energy (hartree) 172 173 real(dp) :: e_xcdc=zero 174 ! enxcdc=exchange-correlation double-counting energy (hartree) 175 176 real(dp) :: e_xc_vdw=zero 177 ! vdW-DF correction to the XC energy 178 179 real(dp) :: h0=zero 180 ! h0=e_kinetic+e_localpsp+e_nlpsp_vfock 181 182 real(dp) :: e_zeeman=zero 183 ! Zeeman spin times magnetic field contribution to the XC energy 184 185 end type energies_type 186 187 !public procedures. 188 public :: energies_init 189 public :: energies_copy 190 public :: energies_to_array 191 public :: energies_eval_eint 192 public :: energies_ncwrite