vgen.F90 3.94 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, &
23
             vacuum, sym, obsolete, cell, oneD, sliceplot, mpi, results, noco, &
24 25
             den, vTot, vx, vCoul )

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
    USE m_types
32 33 34
#ifdef CPP_MPI
    USE m_mpi_bc_potden
#endif
35
    IMPLICIT NONE
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

    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
58

59 60 61 62
    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',/)

    
63 64 65
    CALL vTot%resetPotDen()
    CALL vCoul%resetPotDen()
    CALL vx%resetPotDen()
66 67
    ALLOCATE( vx%pw_w, vTot%pw_w, mold=vTot%pw )
    ALLOCATE( vCoul%pw_w(SIZE(den%pw,1),1) )
68

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

71
    !sum up both spins in den into workden
72
    CALL den%sum_both_spin( workden )
73
    
74
    CALL vgen_coulomb( 1, mpi, DIMENSION, oneD, input, field, vacuum, sym, stars, cell, &
75
         sphhar, atoms, workden, vCoul, results )
76

77
    CALL vCoul%copy_both_spin( vTot )
78 79

    IF (noco%l_noco) THEN
80
       CALL denRot%init( stars, atoms, sphhar, vacuum, input%jspins, noco%l_noco, 0 )
81
       denRot=den
82 83
       CALL rotate_int_den_to_local( DIMENSION, sym, stars, atoms, sphhar, vacuum, cell, input, &
            noco, oneD, denRot )
84 85
    ENDIF

86 87
    call vgen_xcpot( hybrid, input, xcpot, DIMENSION, atoms, sphhar, stars, &
         vacuum, sym, obsolete, cell, oneD, sliceplot, mpi, noco, den, denRot, vTot, vx, results )
88

89
    !ToDo, check if this is needed for more potentials as well...
90 91
    CALL vgen_finalize( atoms, stars, vacuum, sym, noco, input, vTot, denRot )
    DEALLOCATE( vcoul%pw_w, vx%pw_w )
92

Daniel Wortmann's avatar
Daniel Wortmann committed
93
    
94
    CALL bfield( input, noco, atoms, field, vTot )
95 96
    
    ! broadcast potentials
97
#ifdef CPP_MPI
98 99 100
    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 )
101
#endif
102

103
  END SUBROUTINE vgen
104

105
END MODULE m_vgen