vgen.F90 4.16 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,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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
      IMPLICIT NONE

      TYPE(t_results),   INTENT(INOUT)  :: results
      CLASS(t_xcpot),    INTENT(IN)     :: xcpot
      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
      TYPE(t_noco),      INTENT(IN)     :: noco
      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(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)
66
#ifndef CPP_OLDINTEL
Matthias Redies's avatar
Matthias Redies committed
67
      ALLOCATE(vTot%pw_w,mold=vTot%pw)
68
#else
Matthias Redies's avatar
Matthias Redies committed
69
      ALLOCATE( vTot%pw_w(size(vTot%pw,1),size(vTot%pw,2)) )
70
#endif
Matthias Redies's avatar
Matthias Redies committed
71
      ALLOCATE(vCoul%pw_w(SIZE(den%pw,1),1))
72

73
      CALL workDen%init(stars,atoms,sphhar,vacuum,noco,input%jspins,noco%l_noco,0)
74

Matthias Redies's avatar
Matthias Redies committed
75 76
      !sum up both spins in den into workden
      CALL den%sum_both_spin(workden)
77

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

Matthias Redies's avatar
Matthias Redies committed
80 81
      CALL vCoul%copy_both_spin(vTot)
      vCoul%mt(:,:,:,input%jspins)=vCoul%mt(:,:,:,1)
82

Matthias Redies's avatar
Matthias Redies committed
83
      IF (noco%l_noco) THEN
84
         CALL denRot%init(stars,atoms,sphhar,vacuum,noco,input%jspins,noco%l_noco,0)
Matthias Redies's avatar
Matthias Redies committed
85
         denRot=den
86 87
         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
88
      ENDIF
89

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

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

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

99
#ifdef CPP_MPI
Matthias Redies's avatar
Matthias Redies committed
100 101 102
      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)
103
#endif
104

Matthias Redies's avatar
Matthias Redies committed
105
   END SUBROUTINE vgen
106

107
END MODULE m_vgen