IffGit has a new shared runner for building Docker images in GitLab CI. Visit https://iffgit.fz-juelich.de/examples/ci-docker-in-docker for more details.

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

Matthias Redies's avatar
Matthias Redies committed
73
      CALL workDen%init(stars,atoms,sphhar,vacuum,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
84
85
      IF (noco%l_noco) THEN
         CALL denRot%init(stars,atoms,sphhar,vacuum,input%jspins,noco%l_noco,0)
         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