types_xcpot.F90 5.39 KB
Newer Older
1 2 3 4 5
!--------------------------------------------------------------------------------
! Copyright (c) 2016 Peter Grünberg Institut, Forschungszentrum Jülich, Germany
! This file is part of FLEUR and available as free software under the conditions
! of the MIT license as expressed in the LICENSE file in more detail.
!--------------------------------------------------------------------------------
Daniel Wortmann's avatar
Daniel Wortmann committed
6 7 8 9 10 11 12 13
!> This module defines two data-types used in the calculation of xc-potentials
!! a) the abstract t_xcpot which should be overwritten for actual implementations
!! b) the t_gradients that collects the gradients needed in GGAs
!!
!! Currently t_xcpot_inbuild implements the XC-pots directly build into FLEUR
!! and t_xcpot_libxc provides and interface to libxc.
!! In addition to overloading the t_xcpot datatype also mpi_bc_xcpot must be adjusted
!! for additional implementations.
Daniel Wortmann's avatar
Daniel Wortmann committed
14
MODULE m_types_xcpot
Matthias Redies's avatar
Matthias Redies committed
15 16
   IMPLICIT NONE
   PRIVATE
Matthias Redies's avatar
Matthias Redies committed
17 18 19 20 21
   PUBLIC :: t_xcpot,t_gradients,t_RS_potden
   
   TYPE t_RS_potden
      REAL, ALLOCATABLE  :: is(:,:), mt(:,:)
   END TYPE t_RS_potden
Matthias Redies's avatar
Matthias Redies committed
22 23 24

   TYPE,ABSTRACT :: t_xcpot
      REAL :: gmaxxc
Matthias Redies's avatar
Matthias Redies committed
25
      TYPE(t_RS_potden)        :: kinEnergyDen
Daniel Wortmann's avatar
Daniel Wortmann committed
26
   CONTAINS
Matthias Redies's avatar
Matthias Redies committed
27 28
      PROCEDURE        :: vxc_is_LDA=>xcpot_vxc_is_LDA
      PROCEDURE        :: exc_is_LDA=>xcpot_exc_is_LDA
29 30 31
      PROCEDURE        :: vxc_is_gga=>xcpot_vxc_is_gga
      PROCEDURE        :: exc_is_gga=>xcpot_exc_is_gga
      PROCEDURE        :: exc_is_MetaGGA=>xcpot_exc_is_MetaGGA
Matthias Redies's avatar
Matthias Redies committed
32 33 34 35 36 37 38
      PROCEDURE        :: needs_grad=>xcpot_needs_grad
      PROCEDURE        :: is_hybrid=>xcpot_is_hybrid
      PROCEDURE        :: get_exchange_weight=>xcpot_get_exchange_weight
      PROCEDURE        :: get_vxc=>xcpot_get_vxc
      PROCEDURE        :: get_exc=>xcpot_get_exc
      PROCEDURE,NOPASS :: alloc_gradients=>xcpot_alloc_gradients
   END TYPE t_xcpot
Daniel Wortmann's avatar
Daniel Wortmann committed
39

Matthias Redies's avatar
Matthias Redies committed
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
   TYPE t_gradients
      !Naming convention:
      !t,u,d as last letter for total,up,down
      !agr for absolute value of gradient
      !g2r for laplacien of gradient
      !+??
      REAL,ALLOCATABLE :: agrt(:),agru(:),agrd(:)
      REAL,ALLOCATABLE :: g2ru(:),g2rd(:),gggrt(:)
      REAL,ALLOCATABLE :: gggru(:),gzgr(:),g2rt(:)
      REAL,ALLOCATABLE :: gggrd(:),grgru(:),grgrd(:)
      !These are the contracted Gradients used in libxc
      REAL,ALLOCATABLE :: sigma(:,:)
      REAL,ALLOCATABLE :: vsigma(:,:)
      REAL,ALLOCATABLE :: gr(:,:,:)
      REAL,ALLOCATABLE :: laplace(:,:)
   END TYPE t_gradients
Matthias Redies's avatar
Matthias Redies committed
56
   
57
CONTAINS
Matthias Redies's avatar
Matthias Redies committed
58 59 60 61 62 63 64 65 66 67 68 69 70 71
   ! LDA
   LOGICAL FUNCTION xcpot_vxc_is_LDA(xcpot)
      IMPLICIT NONE
      CLASS(t_xcpot),INTENT(IN):: xcpot
      xcpot_vxc_is_LDA=.false.
   END FUNCTION xcpot_vxc_is_LDA

   LOGICAL FUNCTION xcpot_exc_is_LDA(xcpot)
      IMPLICIT NONE
      CLASS(t_xcpot),INTENT(IN):: xcpot
      xcpot_exc_is_LDA=.false.
   END FUNCTION xcpot_exc_is_LDA

   ! GGA
72
   LOGICAL FUNCTION xcpot_vxc_is_gga(xcpot)
Matthias Redies's avatar
Matthias Redies committed
73 74
      IMPLICIT NONE
      CLASS(t_xcpot),INTENT(IN):: xcpot
75 76
      xcpot_vxc_is_gga=.false.
   END FUNCTION xcpot_vxc_is_gga
Matthias Redies's avatar
Matthias Redies committed
77

78
   LOGICAL FUNCTION xcpot_exc_is_gga(xcpot)
Matthias Redies's avatar
Matthias Redies committed
79 80
      IMPLICIT NONE
      CLASS(t_xcpot),INTENT(IN):: xcpot
81 82 83 84 85 86 87 88
      xcpot_exc_is_gga=.false.
   END FUNCTION xcpot_exc_is_gga

   LOGICAL FUNCTION xcpot_exc_is_MetaGGA(xcpot)
      IMPLICIT NONE
      CLASS(t_xcpot),INTENT(IN):: xcpot
      xcpot_exc_is_MetaGGA=.false.
   END FUNCTION xcpot_exc_is_MetaGGA
Daniel Wortmann's avatar
Daniel Wortmann committed
89

Matthias Redies's avatar
Matthias Redies committed
90 91 92
   LOGICAL FUNCTION xcpot_needs_grad(xcpot)
      IMPLICIT NONE
      CLASS(t_xcpot),INTENT(IN):: xcpot
Matthias Redies's avatar
Matthias Redies committed
93

94
      xcpot_needs_grad= xcpot%vxc_is_gga()
Matthias Redies's avatar
Matthias Redies committed
95
   END FUNCTION xcpot_needs_grad
96

Matthias Redies's avatar
Matthias Redies committed
97 98 99 100 101
   LOGICAL FUNCTION xcpot_is_hybrid(xcpot)
      IMPLICIT NONE
      CLASS(t_xcpot),INTENT(IN):: xcpot
      xcpot_is_hybrid=.FALSE.
   END FUNCTION xcpot_is_hybrid
102

Matthias Redies's avatar
Matthias Redies committed
103 104 105 106 107 108 109
   FUNCTION xcpot_get_exchange_weight(xcpot) RESULT(a_ex)
      USE m_judft
      IMPLICIT NONE
      CLASS(t_xcpot),INTENT(IN):: xcpot
      REAL:: a_ex
      a_ex=-1
   END FUNCTION xcpot_get_exchange_weight
110

Matthias Redies's avatar
Matthias Redies committed
111
   SUBROUTINE xcpot_get_vxc(xcpot,jspins,rh,vxc,vx,grad)
Matthias Redies's avatar
Matthias Redies committed
112 113
      IMPLICIT NONE

Matthias Redies's avatar
Matthias Redies committed
114 115 116 117 118 119 120 121
      CLASS(t_xcpot),INTENT(IN) :: xcpot
      INTEGER, INTENT (IN)     :: jspins
      !--> charge density
      REAL,INTENT (IN)         :: rh(:,:)
      !---> xc potential
      REAL, INTENT (OUT)       :: vxc (:,:),vx(:,:)
      TYPE(t_gradients),OPTIONAL,INTENT(INOUT)::grad
   END SUBROUTINE xcpot_get_vxc
122

Matthias Redies's avatar
Matthias Redies committed
123
   SUBROUTINE xcpot_get_exc(xcpot,jspins,rh,exc,grad)
Matthias Redies's avatar
Matthias Redies committed
124 125 126
      USE m_types_misc
      IMPLICIT NONE

Matthias Redies's avatar
Matthias Redies committed
127 128 129 130
      CLASS(t_xcpot),INTENT(IN) :: xcpot
      INTEGER, INTENT (IN)     :: jspins
      !--> charge density
      REAL,INTENT (IN)         :: rh(:,:)
Matthias Redies's avatar
Matthias Redies committed
131
      !--> kinetic energy density
Matthias Redies's avatar
Matthias Redies committed
132 133 134 135
      !---> xc energy density
      REAL, INTENT (OUT)       :: exc (:)
      TYPE(t_gradients),OPTIONAL,INTENT(IN)::grad
   END SUBROUTINE xcpot_get_exc
136

Matthias Redies's avatar
Matthias Redies committed
137
   SUBROUTINE xcpot_alloc_gradients(ngrid,jspins,grad)
Matthias Redies's avatar
Matthias Redies committed
138 139
      IMPLICIT NONE

Matthias Redies's avatar
Matthias Redies committed
140 141
      INTEGER, INTENT (IN)         :: jspins,ngrid
      TYPE(t_gradients),INTENT(INOUT):: grad
142

Matthias Redies's avatar
Matthias Redies committed
143 144 145 146 147 148 149 150 151 152 153 154
      IF (allocated(grad%agrt)) THEN
         DEALLOCATE(grad%agrt,grad%agru,grad%agrd)
         DEALLOCATE(grad%g2ru,grad%g2rd,grad%gggrt)
         DEALLOCATE(grad%gggru,grad%gzgr,grad%g2rt)
         DEALLOCATE(grad%gggrd,grad%grgru,grad%grgrd)
      ENDIF
      !For the in-build xc-pots
      ALLOCATE(grad%agrt(ngrid),grad%agru(ngrid),grad%agrd(ngrid))
      ALLOCATE(grad%g2ru(ngrid),grad%g2rd(ngrid),grad%gggrt(ngrid))
      ALLOCATE(grad%gggru(ngrid),grad%gzgr(ngrid),grad%g2rt(ngrid))
      ALLOCATE(grad%gggrd(ngrid),grad%grgru(ngrid),grad%grgrd(ngrid))
   END SUBROUTINE xcpot_alloc_gradients
155

Daniel Wortmann's avatar
Daniel Wortmann committed
156
END MODULE m_types_xcpot