vgen.F90 4.27 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.
!--------------------------------------------------------------------------------
6
MODULE m_vgen
7

Matthias Redies's avatar
Matthias Redies committed
8
   USE m_juDFT
9

10
CONTAINS
Matthias Redies's avatar
Matthias Redies committed
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
   !> FLAPW potential generator
   !! The full potential is generated by the following main steps:
   !! * generation of Coulomb potential
   !! * copy of VCoul to both spins
   !! * generation of XC potential
   !! In addition, the rotation of the density in the noco case and some scaling is done
   !! In results we store:
   !!     TE_VCOUL  :   charge density-coulomb potential integral
   !!     TE_VEFF:   charge density-effective potential integral
   !!     TE_EXC :   charge density-ex-corr.energy density integral

   SUBROUTINE vgen(hybrid,field,input,xcpot,DIMENSION,atoms,sphhar,stars,vacuum,sym,&
                   obsolete,cell,oneD,sliceplot,mpi,results,noco,EnergyDen,den,vTot,vx,vCoul)

      USE m_types
      USE m_rotate_int_den_to_local
      USE m_bfield
      USE m_vgen_coulomb
      USE m_vgen_xcpot
      USE m_vgen_finalize
31
      USE m_rotate_mt_den_tofrom_local
32
#ifdef CPP_MPI
Matthias Redies's avatar
Matthias Redies committed
33
      USE m_mpi_bc_potden
34
#endif
Matthias Redies's avatar
Matthias Redies committed
35 36 37
      IMPLICIT NONE

      TYPE(t_results),   INTENT(INOUT)  :: results
38
      CLASS(t_xcpot),    INTENT(INOUT)  :: xcpot
Matthias Redies's avatar
Matthias Redies committed
39 40 41 42 43 44 45 46 47
      TYPE(t_hybrid),    INTENT(IN)     :: hybrid
      TYPE(t_mpi),       INTENT(IN)     :: mpi
      TYPE(t_dimension), INTENT(IN)     :: dimension
      TYPE(t_oneD),      INTENT(IN)     :: oneD
      TYPE(t_obsolete),  INTENT(IN)     :: obsolete
      TYPE(t_sliceplot), INTENT(IN)     :: sliceplot
      TYPE(t_input),     INTENT(IN)     :: input
      TYPE(t_field),     INTENT(INOUT)  :: field  !efield can be modified
      TYPE(t_vacuum),    INTENT(IN)     :: vacuum
48
      TYPE(t_noco),      INTENT(INOUT)  :: noco
Matthias Redies's avatar
Matthias Redies committed
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
      TYPE(t_sym),       INTENT(IN)     :: sym
      TYPE(t_stars),     INTENT(IN)     :: stars
      TYPE(t_cell),      INTENT(IN)     :: cell
      TYPE(t_sphhar),    INTENT(IN)     :: sphhar
      TYPE(t_atoms),     INTENT(IN)     :: atoms
      TYPE(t_potden),    INTENT(IN)     :: EnergyDen
      TYPE(t_potden),    INTENT(INOUT)  :: den
      TYPE(t_potden),    INTENT(INOUT)  :: vTot,vx,vCoul

      TYPE(t_potden)                    :: workden,denRot

      if (mpi%irank==0) WRITE (6,FMT=8000)
8000  FORMAT (/,/,t10,' p o t e n t i a l   g e n e r a t o r',/)

      CALL vTot%resetPotDen()
      CALL vCoul%resetPotDen()
      CALL vx%resetPotDen()
      ALLOCATE(vx%pw_w,mold=vTot%pw)
Matthias Redies's avatar
Matthias Redies committed
67
      vx%pw_w = 0.0
68
#ifndef CPP_OLDINTEL
Matthias Redies's avatar
Matthias Redies committed
69
      ALLOCATE(vTot%pw_w,mold=vTot%pw)
70
#else
71
      ALLOCATE( vTot%pw_w(size(vTot%pw,1),size(vTot%pw,2)))
72
#endif
73 74
      ALLOCATE(vCoul%pw_w(SIZE(vCoul%pw,1),size(vCoul%pw,2)))
      vCoul%pw_w = CMPLX(0.0,0.0)
75

76
      CALL workDen%init(stars,atoms,sphhar,vacuum,noco,input%jspins,0)
77

Matthias Redies's avatar
Matthias Redies committed
78 79
      !sum up both spins in den into workden
      CALL den%sum_both_spin(workden)
80

Matthias Redies's avatar
Matthias Redies committed
81
      CALL vgen_coulomb(1,mpi,dimension,oneD,input,field,vacuum,sym,stars,cell,sphhar,atoms,workden,vCoul,results)
82

Matthias Redies's avatar
Matthias Redies committed
83 84
      CALL vCoul%copy_both_spin(vTot)
      vCoul%mt(:,:,:,input%jspins)=vCoul%mt(:,:,:,1)
85

Matthias Redies's avatar
Matthias Redies committed
86
      IF (noco%l_noco) THEN
87
         CALL denRot%init(stars,atoms,sphhar,vacuum,noco,input%jspins,0)
Matthias Redies's avatar
Matthias Redies committed
88
         denRot=den
89 90
         CALL rotate_int_den_to_local(DIMENSION,sym,stars,atoms,sphhar,vacuum,cell,input,noco,oneD,denRot)
         IF (noco%l_mtnocoPot) CALL rotate_mt_den_to_local(atoms,sphhar,sym,denrot)         
Matthias Redies's avatar
Matthias Redies committed
91
      ENDIF
92

Matthias Redies's avatar
Matthias Redies committed
93
      CALL vgen_xcpot(hybrid,input,xcpot,dimension,atoms,sphhar,stars,vacuum,sym,&
94
                      obsolete,cell,oneD,sliceplot,mpi,noco,den,denRot,EnergyDen,vTot,vx,results)
95

Matthias Redies's avatar
Matthias Redies committed
96
      !ToDo, check if this is needed for more potentials as well...
97
      CALL vgen_finalize(atoms,stars,vacuum,sym,noco,input,sphhar,vTot,vCoul,denRot)
98
      !DEALLOCATE(vcoul%pw_w)
99

Matthias Redies's avatar
Matthias Redies committed
100
      CALL bfield(input,noco,atoms,field,vTot)
101

102
#ifdef CPP_MPI
Matthias Redies's avatar
Matthias Redies committed
103 104 105
      CALL mpi_bc_potden(mpi,stars,sphhar,atoms,input,vacuum,oneD,noco,vTot)
      CALL mpi_bc_potden(mpi,stars,sphhar,atoms,input,vacuum,oneD,noco,vCoul)
      CALL mpi_bc_potden(mpi,stars,sphhar,atoms,input,vacuum,oneD,noco,vx)
106
#endif
Matthias Redies's avatar
Matthias Redies committed
107
   END SUBROUTINE vgen
108
END MODULE m_vgen