vgen.F90 4.29 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
   !> 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,&
23
                   obsolete,cell,oneD,sliceplot,mpi,results,noco,EnergyDen,den,vTot,vx,vCoul)
Matthias Redies's avatar
Matthias Redies committed
24 25 26 27 28 29 30

      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
Matthias Redies's avatar
Matthias Redies committed
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
Matthias Redies's avatar
Matthias Redies committed
48
      TYPE(t_noco),      INTENT(INOUT)  :: noco
Matthias Redies's avatar
Matthias Redies committed
49 50 51 52 53 54 55
      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
56
      TYPE(t_potden),    INTENT(INOUT)  :: vTot,vx,vCoul
Matthias Redies's avatar
Matthias Redies committed
57 58 59

      TYPE(t_potden)                    :: workden,denRot

Alexander Neukirchen's avatar
Alexander Neukirchen committed
60 61
      INTEGER :: i

Matthias Redies's avatar
Matthias Redies committed
62 63 64 65 66 67
      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
68
      vx%pw_w = 0.0
69

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

78
      CALL workDen%init(stars,atoms,sphhar,vacuum,noco,input%jspins,0)
79

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

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

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

Matthias Redies's avatar
Matthias Redies committed
88
      IF (noco%l_noco) THEN
89
         CALL denRot%init(stars,atoms,sphhar,vacuum,noco,input%jspins,0)
Matthias Redies's avatar
Matthias Redies committed
90
         denRot=den
91 92
         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
93
      ENDIF
94

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

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

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

104
#ifdef CPP_MPI
Matthias Redies's avatar
Matthias Redies committed
105 106 107
      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)
108
#endif
Matthias Redies's avatar
Matthias Redies committed
109
   END SUBROUTINE vgen
110
END MODULE m_vgen