cdngen.F90 6.48 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_cdngen
7

8 9 10 11

CONTAINS

SUBROUTINE cdngen(eig_id,mpi,input,banddos,sliceplot,vacuum,&
12
                  dimension,kpts,atoms,sphhar,stars,sym,&
13
                  enpara,cell,noco,vTot,results,oneD,coreSpecInput,&
Matthias Redies's avatar
Matthias Redies committed
14
                  xcpot, archiveType,outDen, kinEnergyDen)
15 16 17 18 19 20 21

   !*****************************************************
   !    Charge density generator
   !    calls cdnval to generate the valence charge and the
   !    core routines for the core contribution
   !*****************************************************

22
   USE m_types
23
   USE m_constants
24
   USE m_juDFT
25 26 27 28 29 30 31
   USE m_prpqfftmap
   USE m_cdnval
   USE m_cdn_io
   USE m_wrtdop
   USE m_cdntot
   USE m_cdnovlp
   USE m_qfix
32
   USE m_genNewNocoInp
33
   USE m_xmlOutput
34
   USE m_magMoms
35
   USE m_orbMagMoms
36
   USE m_cdncore
37 38
   USE m_doswrite
   USE m_Ekwritesl
39
   USE m_banddos_io
Daniel Wortmann's avatar
Daniel Wortmann committed
40
#ifdef CPP_MPI
41
   USE m_mpi_bc_potden
Daniel Wortmann's avatar
Daniel Wortmann committed
42
#endif
43

44
   IMPLICIT NONE
45

46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
   ! Type instance arguments
   TYPE(t_results),INTENT(INOUT)    :: results
   TYPE(t_mpi),INTENT(IN)           :: mpi
   TYPE(t_dimension),INTENT(IN)     :: dimension
   TYPE(t_oneD),INTENT(IN)          :: oneD
   TYPE(t_enpara),INTENT(INOUT)     :: enpara
   TYPE(t_banddos),INTENT(IN)       :: banddos
   TYPE(t_sliceplot),INTENT(IN)     :: sliceplot
   TYPE(t_input),INTENT(IN)         :: input
   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_kpts),INTENT(IN)          :: kpts
   TYPE(t_sphhar),INTENT(IN)        :: sphhar
   TYPE(t_atoms),INTENT(IN)         :: atoms
   TYPE(t_coreSpecInput),INTENT(IN) :: coreSpecInput
   TYPE(t_potden),INTENT(IN)        :: vTot
Matthias Redies's avatar
Matthias Redies committed
65 66
   CLASS(t_xcpot),INTENT(IN)        :: xcpot
   TYPE(t_potden),INTENT(INOUT)     :: outDen, kinEnergyDen
67 68

   !Scalar Arguments
69
   INTEGER, INTENT (IN)             :: eig_id, archiveType
70 71

   ! Local type instances
72 73
   TYPE(t_noco)          :: noco_new
   TYPE(t_regionCharges) :: regCharges
74
   TYPE(t_dos)           :: dos
75
   TYPE(t_moments)       :: moments
76 77
   TYPE(t_mcd)           :: mcd
   TYPE(t_slab)          :: slab
78
   TYPE(t_orbcomp)       :: orbcomp
79
   TYPE(t_cdnvalJob)     :: cdnvalJob
80

81

82
   !Local Scalars
83 84
   REAL                  :: fix, qtot, dummy
   INTEGER               :: jspin, jspmax
85 86 87
#ifdef CPP_HDF
   INTEGER(HID_T)        :: banddosFile_id
#endif
88

89 90
   CALL regCharges%init(input,atoms)
   CALL dos%init(input,atoms,dimension,kpts,vacuum)
91
   CALL moments%init(input,atoms)
92 93 94
   CALL mcd%init1(banddos,dimension,input,atoms,kpts)
   CALL slab%init(banddos,dimension,atoms,cell,input,kpts)
   CALL orbcomp%init(input,banddos,dimension,atoms,kpts)
Matthias Redies's avatar
Matthias Redies committed
95
   CALL outDen%init(stars,atoms,sphhar,vacuum,input%jspins,noco%l_noco,POTDEN_TYPE_DEN)
96

Matthias Redies's avatar
Matthias Redies committed
97
   IF (mpi%irank == 0) CALL openXMLElementNoAttributes('valenceDensity')
98

99
   !In a non-collinear calcuation where the off-diagonal part of the
100 101
   !density matrix in the muffin-tins is calculated, the a- and
   !b-coef. for both spins are needed at once. Thus, cdnval is only
102
   !called once and both spin directions are calculated in a single run.
103 104 105
   jspmax = input%jspins
   IF (noco%l_mperp) jspmax = 1
   DO jspin = 1,jspmax
106
      CALL cdnvalJob%init(mpi,input,kpts,noco,results,jspin,sliceplot,banddos)
107
      CALL cdnval(eig_id,mpi,kpts,jspin,noco,input,banddos,cell,atoms,enpara,stars,vacuum,dimension,&
108
                  sphhar,sym,vTot,oneD,cdnvalJob,outDen,regCharges,dos,results,moments,coreSpecInput,mcd,slab,orbcomp)
Matthias Redies's avatar
Matthias Redies committed
109 110 111 112

      !IF(xcpot%is_MetaGGA()) THEN
         !CALL bla
      !ENDIF
113 114
   END DO

Matthias Redies's avatar
Matthias Redies committed
115
   IF (mpi%irank == 0) THEN
116
      IF (banddos%dos.or.banddos%vacdos.or.input%cdinf) THEN
117
#ifdef CPP_HDF
118 119 120
         CALL openBandDOSFile(banddosFile_id,input,atoms,cell,kpts)
         CALL writeBandDOSData(banddosFile_id,input,atoms,cell,kpts,results,banddos,dos,vacuum)
         CALL closeBandDOSFile(banddosFile_id)
121
#endif
122
         CALL timestart("cdngen: dos")
123
         CALL doswrite(eig_id,dimension,kpts,atoms,vacuum,input,banddos,sliceplot,noco,sym,cell,dos,mcd,results,slab,orbcomp,oneD)
Matthias Redies's avatar
Matthias Redies committed
124
         IF (banddos%dos.AND.(banddos%ndir == -3)) THEN
125
            CALL Ek_write_sl(eig_id,dimension,kpts,atoms,vacuum,input,jspmax,sym,cell,dos,slab,orbcomp,results)
126
         END IF
127
         CALL timestop("cdngen: dos")
128 129 130 131
      END IF
   END IF

   IF ((banddos%dos.OR.banddos%vacdos).AND.(banddos%ndir/=-2)) CALL juDFT_end("DOS OK",mpi%irank)
Matthias Redies's avatar
Matthias Redies committed
132
   IF (vacuum%nstm == 3) CALL juDFT_end("VACWAVE OK",mpi%irank)
133

Matthias Redies's avatar
Matthias Redies committed
134
   IF (mpi%irank == 0) THEN
135
      CALL cdntot(stars,atoms,sym,vacuum,input,cell,oneD,outDen,.TRUE.,qtot,dummy)
136 137 138
      CALL closeXMLElement('valenceDensity')
   END IF ! mpi%irank = 0

139
   IF (sliceplot%slice) THEN
Matthias Redies's avatar
Matthias Redies committed
140
      IF (mpi%irank == 0) THEN
141
         CALL writeDensity(stars,vacuum,atoms,cell,sphhar,input,sym,oneD,CDN_ARCHIVE_TYPE_CDN_const,CDN_INPUT_DEN_const,&
142
                           0,-1.0,0.0,.FALSE.,outDen,'cdn_slice')
143
      END IF
144
      CALL juDFT_end("slice OK",mpi%irank)
145
   END IF
146

147 148
   CALL cdncore(mpi,dimension,oneD,input,vacuum,noco,sym,&
                stars,cell,sphhar,atoms,vTot,outDen,moments,results)
149

150 151
   CALL enpara%calcOutParams(input,atoms,vacuum,regCharges)

Matthias Redies's avatar
Matthias Redies committed
152
   IF (mpi%irank == 0) THEN
153
      CALL openXMLElementNoAttributes('allElectronCharges')
154
      CALL qfix(stars,atoms,sym,vacuum,sphhar,input,cell,oneD,outDen,noco%l_noco,.TRUE.,.true.,fix)
155 156
      CALL closeXMLElement('allElectronCharges')

Matthias Redies's avatar
Matthias Redies committed
157
      IF (input%jspins == 2) THEN
158 159 160
         noco_new = noco

         !Calculate and write out spin densities at the nucleus and magnetic moments in the spheres
161
         CALL magMoms(dimension,input,atoms,noco_new,vTot,moments)
162 163 164 165

         !Generate and save the new nocoinp file if the directions of the local
         !moments are relaxed or a constraint B-field is calculated.
         IF (ANY(noco%l_relax(:atoms%ntype)).OR.noco%l_constr) THEN
166
            CALL genNewNocoInp(input,atoms,noco,noco_new)
167 168
         END IF

169
         IF (noco%l_soc) CALL orbMagMoms(dimension,atoms,noco,moments%clmom)
170
      END IF
Matthias Redies's avatar
Matthias Redies committed
171
   END IF ! mpi%irank == 0
172

173 174 175 176 177
#ifdef CPP_MPI
   CALL mpi_bc_potden(mpi,stars,sphhar,atoms,input,vacuum,oneD,noco,outDen)
#endif

END SUBROUTINE cdngen
178

179
END MODULE m_cdngen