LCOV - code coverage report
Current view: top level - types - types_xcpot_inbuild.F90 (source / functions) Hit Total Coverage
Test: FLEUR test coverage Lines: 37 57 64.9 %
Date: 2024-04-26 04:44:34 Functions: 3 3 100.0 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------
       2             : ! Copyright (c) 2016 Peter Grünberg Institut, Forschungszentrum Jülich, Germany
       3             : ! This file is part of FLEUR and available as free software under the conditions
       4             : ! of the MIT license as expressed in the LICENSE file in more detail.
       5             : !--------------------------------------------------------------------------------
       6             : MODULE m_types_xcpot_inbuild
       7             :    !This module contains the xcpot-type used for the in-build xc-implementations
       8             :    USE m_types_xcpot_data
       9             :    USE m_types_xcpot
      10             :    USE m_types_xcpot_inbuild_nofunction
      11             :    USE m_judft
      12             :    IMPLICIT NONE
      13             :    PRIVATE
      14             :    CHARACTER(len=4),PARAMETER:: xc_names(20)=[&
      15             :                                 'l91 ','x-a ','wign','mjw ','hl  ','bh  ','vwn ','pz  ', &
      16             :                                 'pw91','pbe ','rpbe','Rpbe','wc  ','PBEs', &
      17             :                                 'pbe0','hse ','vhse','lhse','exx ','hf  ']
      18             : 
      19             :    TYPE, EXTENDS(t_xcpot_inbuild_nf):: t_xcpot_inbuild
      20             :    CONTAINS
      21             :       !overloading t_xcpot:
      22             :       PROCEDURE        :: get_vxc             => xcpot_get_vxc
      23             :       PROCEDURE        :: get_exc             => xcpot_get_exc
      24             :   END TYPE t_xcpot_inbuild
      25             :    PUBLIC t_xcpot_inbuild
      26             :  CONTAINS
      27             : 
      28             : 
      29        2914 :    SUBROUTINE xcpot_get_vxc(xcpot,jspins,rh, vxc,vx, grad,kinEnergyDen_KS)
      30             : !
      31             :       USE m_xcxal, ONLY : vxcxal
      32             :       USE m_xcwgn, ONLY : vxcwgn
      33             :       USE m_xcbh,  ONLY : vxcbh
      34             :       USE m_xcvwn, ONLY : vxcvwn
      35             :       USE m_xcpz,  ONLY : vxcpz
      36             :       USE m_vxcl91
      37             :       USE m_vxcwb91
      38             :       USE m_vxcpw91
      39             :       USE m_vxcepbe
      40             :       IMPLICIT NONE
      41             : !c
      42             : !c---> running mode parameters
      43             : !c
      44             :       CLASS(t_xcpot_inbuild),INTENT(IN) :: xcpot
      45             :       INTEGER, INTENT (IN)     :: jspins
      46             : !c
      47             : !c---> charge density
      48             : !c
      49             :       REAL,INTENT (IN) :: rh(:,:)
      50             : !c
      51             : !c---> xc potential
      52             : !c
      53             :       REAL, INTENT (OUT) :: vx (:,:)
      54             :       REAL, INTENT (OUT) :: vxc(:,:)
      55             : 
      56             :       ! optional arguments for GGA
      57             :       TYPE(t_gradients),INTENT(INOUT),OPTIONAL::grad
      58             :       REAL, INTENT(IN), OPTIONAL            :: kinEnergyDen_KS(:,:)
      59             : !c
      60             : !c ---> local scalars
      61             :       INTEGER :: ngrid
      62             :       REAL, PARAMETER :: hrtr_half = 0.5
      63             : 
      64             :       !used to be dummy arguments for testing
      65             :       INTEGER,PARAMETER   :: idsprs=0,isprsv=0,iofile=6
      66             :       REAL,PARAMETER      :: sprsv=0.0
      67             :       LOGICAL,PARAMETER   :: lwbc=.false. ! l-white-bird-current (ta)
      68             : !c
      69             : !c.....------------------------------------------------------------------
      70             : !c
      71             : !c-----> determine exchange correlation potential
      72             : !c
      73   151278704 :       vx (:,:) = 0.0
      74   151278704 :       vxc(:,:) = 0.0
      75        2914 :       ngrid=SIZE(rh,1)
      76             : 
      77        2914 :       IF (xcpot%needs_grad()) THEN
      78        1932 :          IF (.NOT.PRESENT(grad)) CALL judft_error("Bug: You called get_vxc for a GGA potential without providing derivatives")
      79        1932 :          IF (xcpot%is_name("l91")) THEN    ! local pw91
      80             :             CALL vxcl91(jspins,ngrid,ngrid,rh,grad%agrt(:ngrid),grad%agru(:ngrid),grad%agrd(:ngrid), grad%g2rt(:ngrid),&
      81             :                  grad%g2ru(:ngrid),grad%g2rd(:ngrid),grad%gggrt(:ngrid),grad%gggru(:ngrid),grad%gggrd(:ngrid),&
      82           0 :                  grad%gzgr(:ngrid), vx(:ngrid,:),vxc(:ngrid,:), isprsv,sprsv)
      83        1932 :          ELSEIF (xcpot%is_name("pw91")) THEN  ! pw91
      84             :             IF (lwbc) THEN
      85             :                CALL vxcwb91(jspins,ngrid,ngrid,rh(:ngrid,:),grad%agrt(:ngrid),grad%agru(:ngrid),grad%agrd(:ngrid),&
      86             :                  grad%g2rt(:ngrid),grad%g2ru(:ngrid),grad%g2rd(:ngrid),grad%gggrt(:ngrid),grad%gggru(:ngrid),&
      87             :                  grad%gggrd(:ngrid),grad%gzgr(:ngrid), vx(:ngrid,:),vxc(:ngrid,:), idsprs,isprsv,sprsv)
      88             :             ELSE
      89             : 
      90             :                CALL vxcpw91(jspins,ngrid,ngrid,rh(:ngrid,:),grad%agrt(:ngrid),grad%agru(:ngrid),grad%agrd(:ngrid),&
      91             :                  grad%g2rt(:ngrid),grad%g2ru(:ngrid),grad%g2rd(:ngrid),grad%gggrt(:ngrid),grad%gggru(:ngrid),&
      92           0 :                  grad%gggrd,grad%gzgr, vx(:ngrid,:),vxc(:ngrid,:), idsprs,isprsv,sprsv)
      93             : 
      94             :             ENDIF
      95             :          ELSE  ! pbe or similar
      96     4544307 :             CALL vxcepbe(xcpot%DATA,jspins,ngrid,ngrid,rh(:ngrid,:), grad%agrt,grad%agru,grad%agrd,grad%g2ru,grad%g2rd,grad%gggrt,grad%gggru,grad%gggrd, vx(:ngrid,:),vxc(:ngrid,:))
      97             :          ENDIF
      98             :       ELSE  !LDA potentials
      99         982 :          IF (xcpot%is_name("x-a"))  THEN   ! X-alpha method
     100           0 :             CALL vxcxal(xcpot%data%krla,jspins, ngrid,ngrid,rh(:ngrid,:), vx(:ngrid,:),vxc(:ngrid,:))
     101         982 :          ELSEIF (xcpot%is_name("wign")) THEN    ! Wigner interpolation formula
     102           0 :             CALL vxcwgn(xcpot%data%krla,jspins, ngrid,ngrid,rh(:ngrid,:), vx(:ngrid,:),vxc(:ngrid,:))
     103         982 :          ELSEIF (xcpot%is_name("mjw").OR.xcpot%is_name("bh")) THEN ! von Barth,Hedin correlation
     104           0 :             CALL vxcbh(iofile,xcpot%data,jspins, ngrid,ngrid,rh(:ngrid,:), vx(:ngrid,:),vxc(:ngrid,:))
     105             : 
     106         982 :          ELSEIF (xcpot%is_name("vwn")) THEN     ! Vosko,Wilk,Nusair correlation
     107         855 :             CALL vxcvwn(iofile,xcpot%data%krla,jspins, ngrid,ngrid,rh(:ngrid,:), vx(:ngrid,:),vxc(:ngrid,:))
     108         127 :          ELSEIF (xcpot%is_name("pz")) THEN     ! Perdew,Zunger correlation
     109         127 :             CALL vxcpz(iofile,xcpot%data%krla,jspins, ngrid,ngrid,rh(:ngrid,:), vx(:ngrid,:),vxc(:ngrid,:))
     110           0 :          ELSEIF (xcpot%is_name("hf")) THEN
     111             :             ! Hartree-Fock  calculation: X-alpha potential is added to generate a rational local potential,
     112             :             !                            later it is subtracted again
     113             : !            CALL juDFT_error('HF should now be treated as a GGA functional', calledby='xcpot_get_vxc')
     114           0 :             CALL vxcxal(xcpot%data%krla,jspins, ngrid,ngrid,rh(:ngrid,:), vx(:ngrid,:),vxc(:ngrid,:))
     115             :             !         vxc=0
     116           0 :          ELSEIF (xcpot%is_name("exx")) THEN
     117             :             ! if exact exchange calculation do nothing
     118           0 :             vxc = 0
     119             :          ELSE
     120           0 :             CALL juDFT_error("Unknown LDA potential",calledby="type xcpot")
     121             :          ENDIF
     122             :       ENDIF
     123             : !
     124             : !-----> hartree units
     125             : !
     126   151278704 :       vx  = hrtr_half*vx
     127   151278704 :       vxc = hrtr_half*vxc
     128             : 
     129        2914 :    END SUBROUTINE xcpot_get_vxc
     130             : 
     131             : !***********************************************************************
     132         984 :    SUBROUTINE xcpot_get_exc(xcpot,jspins,rh,exc,grad,kinEnergyDen_KS, mt_call)
     133             : !***********************************************************************
     134             :       USE m_xcxal, ONLY : excxal
     135             :       USE m_xcwgn, ONLY : excwgn
     136             :       USE m_xcbh,  ONLY : excbh
     137             :       USE m_xcvwn, ONLY : excvwn
     138             :       USE m_xcpz,  ONLY : excpz
     139             :       USE m_excl91
     140             :       USE m_excwb91
     141             :       USE m_excpw91
     142             :       USE m_excepbe
     143             :       IMPLICIT NONE
     144             : 
     145             :       CLASS(t_xcpot_inbuild),INTENT(IN)     :: xcpot
     146             :       INTEGER, INTENT (IN)                  :: jspins
     147             :       REAL,INTENT (IN)                      :: rh(:,:)
     148             :       REAL, INTENT (OUT)                    :: exc(:)
     149             :       TYPE(t_gradients),OPTIONAL,INTENT(IN) ::grad
     150             :       LOGICAL, OPTIONAL, INTENT(IN)         :: mt_call
     151             :       REAL, INTENT(IN), OPTIONAL            :: kinEnergyDen_KS(:,:)
     152             : 
     153             : !c
     154             : !c ---> local scalars
     155             :       INTEGER :: ngrid
     156             :       REAL, PARAMETER :: hrtr_half = 0.5
     157             : 
     158             :       !used to be dummy arguments for testing
     159             :       INTEGER,PARAMETER   :: idsprs=0,isprsv=0,iofile=6
     160             :       REAL,PARAMETER      :: sprsv=0.0
     161             :       LOGICAL,PARAMETER   :: lwbc=.false. ! l-white-bird-current (ta)
     162             : !c
     163             : !c-----> determine exchange correlation energy density
     164             : !c
     165    98876487 :       exc(:) = 0.0
     166         984 :       ngrid=SIZE(rh,1)
     167         984 :       IF (xcpot%exc_is_gga()) THEN
     168         807 :          IF (.NOT.PRESENT(grad)) CALL judft_error("Bug: You called get_exc for a GGA potential without providing derivatives")
     169         807 :          IF (xcpot%is_name("l91")) THEN  ! local pw91
     170           0 :             CALL excl91(jspins,ngrid,ngrid,rh(:ngrid,:),grad%agrt,grad%agru,grad%agrd,grad%g2rt,grad%g2ru,grad%g2rd,grad%gggrt,grad%gggru,grad%gggrd,grad%gzgr, exc, isprsv,sprsv)
     171         807 :          ELSEIF (xcpot%is_name("pw91")) THEN     ! pw91
     172             :             IF (lwbc) THEN
     173             :                CALL excwb91(ngrid,ngrid,rh(:ngrid,1),rh(:ngrid,2),grad%agrt,grad%agru,grad%agrd, grad%g2rt,grad%g2ru,grad%g2rd,grad%gggrt,grad%gggru,grad%gggrd,grad%gzgr, exc, idsprs,isprsv,sprsv)
     174             :             ELSE
     175           0 :                CALL excpw91(jspins,ngrid,ngrid,rh(:ngrid,:),grad%agrt,grad%agru,grad%agrd, grad%g2rt,grad%g2ru,grad%g2rd,grad%gggrt,grad%gggru,grad%gggrd,grad%gzgr, exc, idsprs,isprsv,sprsv)
     176             :             ENDIF
     177             :          ELSE
     178         807 :             CALL excepbe(xcpot%data,jspins,ngrid,ngrid, rh(:ngrid,:),grad%agrt,grad%agru,grad%agrd,grad%g2ru,grad%g2rd,grad%gggrt,grad%gggru,grad%gggrd, exc)
     179             :          ENDIF
     180             :       ELSE !LDA
     181         177 :          IF (xcpot%is_name("x-a"))  THEN   ! X-alpha method
     182           0 :             CALL excxal(iofile,xcpot%data%krla,jspins, ngrid,ngrid,rh, exc)
     183         177 :          ELSEIF (xcpot%is_name("wign")) THEN    ! Wigner interpolation formula
     184           0 :             CALL excwgn(iofile,xcpot%data%krla,jspins, ngrid,ngrid,rh, exc)
     185         177 :          ELSEIF (xcpot%is_name("mjw").OR.xcpot%is_name("bh")) THEN ! von Barth,Hedin correlation
     186           0 :             CALL excbh(iofile,xcpot%data,jspins, ngrid,ngrid,rh, exc)
     187         177 :          ELSEIF (xcpot%is_name("vwn")) THEN     ! Vosko,Wilk,Nusair correlation
     188         162 :             CALL excvwn(iofile,xcpot%data%krla,jspins, ngrid,ngrid,rh, exc)
     189          15 :          ELSEIF (xcpot%is_name("pz")) THEN     ! Perdew,Zunger correlation
     190          15 :             CALL excpz(iofile,xcpot%data%krla,jspins, ngrid,ngrid,rh, exc)
     191           0 :          ELSEIF (xcpot%is_name("hf")) THEN
     192             : !            CALL juDFT_error('HF should now be treated as a GGA functional', calledby='xcpot_get_exc')
     193             : !            exc=0
     194           0 :             CALL excxal(iofile,xcpot%data%krla,jspins, ngrid,ngrid,rh, exc)
     195           0 :          ELSEIF (xcpot%is_name("exx")) THEN
     196           0 :             CALL juDFT_error('EXX should now be treated as a GGA functional', calledby='xcpot_get_exc')
     197             :          ELSE
     198           0 :             CALL juDFT_error("Unknown LDA potential",calledby="type xcpot")
     199             :          ENDIF
     200             :       ENDIF
     201             : !c-----> hartree units
     202    98876487 :       exc= hrtr_half*exc
     203             : 
     204         984 :    END SUBROUTINE xcpot_get_exc
     205             : 
     206         160 :  END MODULE m_types_xcpot_inbuild

Generated by: LCOV version 1.14