vgen.F90 3.92 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

8
  USE m_juDFT
9

10
CONTAINS
11 12 13 14 15 16 17 18 19 20
  !> 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
21

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

25
    USE m_types
26
    USE m_rotate_int_den_to_local
27 28 29 30
    USE m_bfield
    USE m_vgen_coulomb
    USE m_vgen_xcpot
    USE m_vgen_finalize
31 32 33
#ifdef CPP_MPI
    USE m_mpi_bc_potden
#endif
34
    IMPLICIT NONE
35

36

37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
    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
55
    TYPE(t_potden),    INTENT(INOUT)  :: vTot,vx,vCoul
56 57

    TYPE(t_potden)                    :: workden,denRot
58

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

62

63 64 65
    CALL vTot%resetPotDen()
    CALL vCoul%resetPotDen()
    CALL vx%resetPotDen()
66
    ALLOCATE(vx%pw_w,mold=vTot%pw)
67
#ifndef CPP_OLDINTEL
68
    ALLOCATE(vTot%pw_w,mold=vTot%pw)
69 70 71
#else
    ALLOCATE( vTot%pw_w(size(vTot%pw,1),size(vTot%pw,2)) )
#endif
Daniel Wortmann's avatar
Daniel Wortmann committed
72
    ALLOCATE(vCoul%pw_w(SIZE(den%pw,1),1))
73

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

76 77
    !sum up both spins in den into workden
    CALL den%sum_both_spin(workden)
78

79
   
80
    CALL vgen_coulomb(1,mpi,dimension,oneD,input,field,vacuum,sym,stars,cell,sphhar,atoms,workden,vCoul,results)
81

82

83
    CALL vCoul%copy_both_spin(vTot)
84
    vCoul%mt(:,:,:,input%jspins)=vCoul%mt(:,:,:,1)
85 86 87 88

    IF (noco%l_noco) THEN
       CALL denRot%init(stars,atoms,sphhar,vacuum,input%jspins,noco%l_noco,0)
       denRot=den
89
       CALL rotate_int_den_to_local(dimension,sym,stars,atoms,sphhar,vacuum,cell,input,noco,oneD,denRot)
90 91
    ENDIF

92

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

96

97
    !ToDo, check if this is needed for more potentials as well...
98
    CALL vgen_finalize(atoms,stars,vacuum,sym,noco,input,vTot,denRot)
99
    DEALLOCATE(vcoul%pw_w)
100

101
    CALL bfield(input,noco,atoms,field,vTot)
102

103
#ifdef CPP_MPI
104 105 106
    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)
107
#endif
108

109
  END SUBROUTINE vgen
110

111
END MODULE m_vgen