types_xcpot.F90 4.43 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 17 18 19 20
   IMPLICIT NONE
   PRIVATE
   PUBLIC :: t_xcpot,t_gradients

   TYPE,ABSTRACT :: t_xcpot
      REAL :: gmaxxc
Daniel Wortmann's avatar
Daniel Wortmann committed
21
   CONTAINS
Matthias Redies's avatar
Matthias Redies committed
22 23 24 25 26 27 28 29 30
      PROCEDURE        :: is_gga=>xcpot_is_gga
      PROCEDURE        :: is_MetaGGA=>xcpot_is_MetaGGA
      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
31

Matthias Redies's avatar
Matthias Redies committed
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
   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
Daniel Wortmann's avatar
Daniel Wortmann committed
48

49
CONTAINS
Matthias Redies's avatar
Matthias Redies committed
50 51 52 53 54 55 56 57 58 59 60
   LOGICAL FUNCTION xcpot_is_gga(xcpot)
      IMPLICIT NONE
      CLASS(t_xcpot),INTENT(IN):: xcpot
      xcpot_is_gga=.false.
   END FUNCTION xcpot_is_gga

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

Matthias Redies's avatar
Matthias Redies committed
62 63 64
   LOGICAL FUNCTION xcpot_needs_grad(xcpot)
      IMPLICIT NONE
      CLASS(t_xcpot),INTENT(IN):: xcpot
Matthias Redies's avatar
Matthias Redies committed
65

Matthias Redies's avatar
Matthias Redies committed
66 67
      xcpot_needs_grad= xcpot%is_gga() .or. xcpot%is_MetaGGA()
   END FUNCTION xcpot_needs_grad
68

Matthias Redies's avatar
Matthias Redies committed
69 70 71 72 73
   LOGICAL FUNCTION xcpot_is_hybrid(xcpot)
      IMPLICIT NONE
      CLASS(t_xcpot),INTENT(IN):: xcpot
      xcpot_is_hybrid=.FALSE.
   END FUNCTION xcpot_is_hybrid
74

Matthias Redies's avatar
Matthias Redies committed
75 76 77 78 79 80 81
   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
82

Matthias Redies's avatar
Matthias Redies committed
83 84 85 86 87 88 89 90 91
   SUBROUTINE xcpot_get_vxc(xcpot,jspins,rh,vxc,vx,grad)
      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
92

Matthias Redies's avatar
Matthias Redies committed
93 94 95 96 97 98 99 100 101
   SUBROUTINE xcpot_get_exc(xcpot,jspins,rh,exc,grad)
      CLASS(t_xcpot),INTENT(IN) :: xcpot
      INTEGER, INTENT (IN)     :: jspins
      !--> charge density
      REAL,INTENT (IN)         :: rh(:,:)
      !---> xc energy density
      REAL, INTENT (OUT)       :: exc (:)
      TYPE(t_gradients),OPTIONAL,INTENT(IN)::grad
   END SUBROUTINE xcpot_get_exc
102

Matthias Redies's avatar
Matthias Redies committed
103 104 105
   SUBROUTINE xcpot_alloc_gradients(ngrid,jspins,grad)
      INTEGER, INTENT (IN)         :: jspins,ngrid
      TYPE(t_gradients),INTENT(INOUT):: grad
106

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

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