types_xcpot.F90 5.84 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
   use m_types_potden
Matthias Redies's avatar
Matthias Redies committed
16 17
   IMPLICIT NONE
   PRIVATE
Matthias Redies's avatar
Matthias Redies committed
18 19 20 21 22
   PUBLIC           :: t_xcpot,t_gradients, t_lapl

   type t_lapl
      real, allocatable  :: lapl(:,:)
   end type t_lapl
Matthias Redies's avatar
Matthias Redies committed
23
   
Matthias Redies's avatar
Matthias Redies committed
24 25
   TYPE,ABSTRACT :: t_xcpot
      REAL :: gmaxxc
Matthias Redies's avatar
Matthias Redies committed
26
      TYPE(t_potden)   :: comparison_kinED_pw(3)
Matthias Redies's avatar
Matthias Redies committed
27 28
      TYPE(t_lapl)     :: is_lapl
      TYPE(t_lapl), allocatable :: mt_lapl(:)
Daniel Wortmann's avatar
Daniel Wortmann committed
29
   CONTAINS
Matthias Redies's avatar
Matthias Redies committed
30 31
      PROCEDURE        :: vxc_is_LDA=>xcpot_vxc_is_LDA
      PROCEDURE        :: exc_is_LDA=>xcpot_exc_is_LDA
32 33 34
      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
35 36 37 38 39 40 41
      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
42

Matthias Redies's avatar
Matthias Redies committed
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
   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
59
   
60
CONTAINS
Matthias Redies's avatar
Matthias Redies committed
61 62 63 64 65 66 67 68 69 70 71 72 73 74
   ! 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
75
   LOGICAL FUNCTION xcpot_vxc_is_gga(xcpot)
Matthias Redies's avatar
Matthias Redies committed
76 77
      IMPLICIT NONE
      CLASS(t_xcpot),INTENT(IN):: xcpot
78 79
      xcpot_vxc_is_gga=.false.
   END FUNCTION xcpot_vxc_is_gga
Matthias Redies's avatar
Matthias Redies committed
80

81
   LOGICAL FUNCTION xcpot_exc_is_gga(xcpot)
Matthias Redies's avatar
Matthias Redies committed
82 83
      IMPLICIT NONE
      CLASS(t_xcpot),INTENT(IN):: xcpot
84 85 86 87 88 89 90 91
      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
92

Matthias Redies's avatar
Matthias Redies committed
93 94 95
   LOGICAL FUNCTION xcpot_needs_grad(xcpot)
      IMPLICIT NONE
      CLASS(t_xcpot),INTENT(IN):: xcpot
Matthias Redies's avatar
Matthias Redies committed
96

97
      xcpot_needs_grad= xcpot%vxc_is_gga()
Matthias Redies's avatar
Matthias Redies committed
98
   END FUNCTION xcpot_needs_grad
99

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

Matthias Redies's avatar
Matthias Redies committed
106 107 108 109 110 111 112
   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
113

Matthias Redies's avatar
Matthias Redies committed
114
   SUBROUTINE xcpot_get_vxc(xcpot,jspins,rh,vxc,vx,grad)
Matthias Redies's avatar
Matthias Redies committed
115
      USE m_judft
Matthias Redies's avatar
Matthias Redies committed
116 117
      IMPLICIT NONE

Matthias Redies's avatar
Matthias Redies committed
118 119 120 121 122 123 124
      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
Matthias Redies's avatar
Matthias Redies committed
125 126 127 128

      vxc = 0.0
      vx  = 0.0
      call juDFT_error("Can't use XC-parrent class")
Matthias Redies's avatar
Matthias Redies committed
129
   END SUBROUTINE xcpot_get_vxc
130

Matthias Redies's avatar
Matthias Redies committed
131
   SUBROUTINE xcpot_get_exc(xcpot,jspins,rh,exc,grad,kinEnergyDen_KS)
Matthias Redies's avatar
Matthias Redies committed
132
      USE m_types_misc
133
      USE m_judft
Matthias Redies's avatar
Matthias Redies committed
134
      USE, INTRINSIC :: IEEE_ARITHMETIC
Matthias Redies's avatar
Matthias Redies committed
135 136
      IMPLICIT NONE

Matthias Redies's avatar
Matthias Redies committed
137 138
      CLASS(t_xcpot),INTENT(IN)             :: xcpot
      INTEGER, INTENT (IN)                  :: jspins
Matthias Redies's avatar
Matthias Redies committed
139
      !--> charge density
Matthias Redies's avatar
Matthias Redies committed
140
      REAL,INTENT (IN)                      :: rh(:,:)
Matthias Redies's avatar
Matthias Redies committed
141
      !--> kinetic energy density
Matthias Redies's avatar
Matthias Redies committed
142
      !---> xc energy density
Matthias Redies's avatar
Matthias Redies committed
143 144
      REAL, INTENT (OUT)                    :: exc (:)
      TYPE(t_gradients),OPTIONAL,INTENT(IN) :: grad
Matthias Redies's avatar
Matthias Redies committed
145
      REAL, INTENT(IN), OPTIONAL            :: kinEnergyDen_KS(:,:)
Matthias Redies's avatar
Matthias Redies committed
146 147 148

      exc = 0.0
      call juDFT_error("Can't use XC-parrent class")
Matthias Redies's avatar
Matthias Redies committed
149
   END SUBROUTINE xcpot_get_exc
150

Matthias Redies's avatar
Matthias Redies committed
151
   SUBROUTINE xcpot_alloc_gradients(ngrid,jspins,grad)
Matthias Redies's avatar
Matthias Redies committed
152 153
      IMPLICIT NONE

Matthias Redies's avatar
Matthias Redies committed
154 155
      INTEGER, INTENT (IN)         :: jspins,ngrid
      TYPE(t_gradients),INTENT(INOUT):: grad
156

Matthias Redies's avatar
Matthias Redies committed
157 158 159 160 161 162 163 164 165 166 167
      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))
Matthias Redies's avatar
Matthias Redies committed
168
  END SUBROUTINE xcpot_alloc_gradients
169

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