types_xcpot.F90 5.6 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
   PUBLIC :: t_xcpot,t_gradients
Matthias Redies's avatar
Matthias Redies committed
18
   
Matthias Redies's avatar
Matthias Redies committed
19 20
   TYPE,ABSTRACT :: t_xcpot
      REAL :: gmaxxc
Daniel Wortmann's avatar
Daniel Wortmann committed
21
   CONTAINS
Matthias Redies's avatar
Matthias Redies committed
22 23
      PROCEDURE        :: vxc_is_LDA=>xcpot_vxc_is_LDA
      PROCEDURE        :: exc_is_LDA=>xcpot_exc_is_LDA
24 25 26
      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
27 28 29 30 31 32 33
      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
34

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

73
   LOGICAL FUNCTION xcpot_exc_is_gga(xcpot)
Matthias Redies's avatar
Matthias Redies committed
74 75
      IMPLICIT NONE
      CLASS(t_xcpot),INTENT(IN):: xcpot
76 77 78 79 80 81 82 83
      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
84

Matthias Redies's avatar
Matthias Redies committed
85 86 87
   LOGICAL FUNCTION xcpot_needs_grad(xcpot)
      IMPLICIT NONE
      CLASS(t_xcpot),INTENT(IN):: xcpot
Matthias Redies's avatar
Matthias Redies committed
88

89
      xcpot_needs_grad= xcpot%vxc_is_gga()
Matthias Redies's avatar
Matthias Redies committed
90
   END FUNCTION xcpot_needs_grad
91

Matthias Redies's avatar
Matthias Redies committed
92 93 94 95 96
   LOGICAL FUNCTION xcpot_is_hybrid(xcpot)
      IMPLICIT NONE
      CLASS(t_xcpot),INTENT(IN):: xcpot
      xcpot_is_hybrid=.FALSE.
   END FUNCTION xcpot_is_hybrid
97

Matthias Redies's avatar
Matthias Redies committed
98 99 100 101 102 103 104
   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
105

Matthias Redies's avatar
Matthias Redies committed
106
   SUBROUTINE xcpot_get_vxc(xcpot,jspins,rh,vxc,vx,grad)
Matthias Redies's avatar
Matthias Redies committed
107
      USE m_judft
Matthias Redies's avatar
Matthias Redies committed
108 109
      IMPLICIT NONE

Matthias Redies's avatar
Matthias Redies committed
110 111 112 113 114 115 116
      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
117 118 119 120

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

Matthias Redies's avatar
Matthias Redies committed
123
   SUBROUTINE xcpot_get_exc(xcpot,jspins,rh,exc,grad,kinEnergyDen)
Matthias Redies's avatar
Matthias Redies committed
124
      USE m_types_misc
125
      USE m_judft
Matthias Redies's avatar
Matthias Redies committed
126
      USE, INTRINSIC :: IEEE_ARITHMETIC
Matthias Redies's avatar
Matthias Redies committed
127 128
      IMPLICIT NONE

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

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

Matthias Redies's avatar
Matthias Redies committed
143
   SUBROUTINE xcpot_alloc_gradients(ngrid,jspins,grad)
Matthias Redies's avatar
Matthias Redies committed
144 145
      IMPLICIT NONE

Matthias Redies's avatar
Matthias Redies committed
146 147
      INTEGER, INTENT (IN)         :: jspins,ngrid
      TYPE(t_gradients),INTENT(INOUT):: grad
148

Matthias Redies's avatar
Matthias Redies committed
149 150 151 152 153 154 155 156 157 158 159 160
      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
161

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