cdnval.F90 37.2 KB
Newer Older
1 2 3 4
MODULE m_cdnval
  use m_juDFT
CONTAINS
  SUBROUTINE cdnval(eig_id, mpi,kpts,jspin,sliceplot,noco, input,banddos,cell,atoms,enpara,stars,&
5
       vacuum,dimension,sphhar,sym,obsolete,vTot,oneD,coreSpecInput,den,results,&
Gregor Michalicek's avatar
Gregor Michalicek committed
6
       qvac,qvlay,qa21, chmom,clmom)
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
    !
    !     ***********************************************************
    !         this subroutin is a modified version of cdnval.F.
    !         it calculates a layer charge distribution and an orbital
    !         composition for each state in a film.
    !         this information is written in the  'ek_orbcomp'  file
    !                                    Yu.Koroteev  01.12.2003
    !     ***********************************************************
    !     flapw7 valence density generator
    !                                         c.l.fu
    !     zelec used to calculate ne - 6.12.95 r.pentcheva
    !
    !     changed subroutine to allow parallel writing of vacdos&dosinp
    !     used temporary direct access file 84,tmp_dos to store data used
    !     in cdninf
    !     call of cdninf changed, sympsi is called from cdnval now
    !     look for 'ifdef CPP_MPI' -blocks!               d.wortmann 6.5.99
    !
    !******** ABBREVIATIONS ************************************************
    !     nbands   : number of bands in the energy window
    !     noccbd   : number of occupied bands
    !     slice    : when set to .true. the charge density of a enery range
    !                (slice) or a single state is calculated
    !     e1s,e2s  : (used if slice) energy range for the slice. if both
    !                are set to 0.0 the charge density of the band nr. nnne
    !                is calculated
    !     pallst   : (used if slice) if set to .true. bands above the
    !                Fermi-Energy are taken into account
    !     nnne     : (used if slice) number of the band of which the charge
    !                density is calculated if e1s and e2s are 0.0
    !     kk       : (used if slice) if set to 0 all k-points are used to
    !                calculate the charge density of the slice, otherwise
    !                only k-points kk is taken into account
    !     nslibd   : number of bands in slice
    !     ener     : band energy averaged over all bands and k-points,
    !                wheighted with the l-like charge of each atom type
    !     sqal     : l-like charge of each atom type. sum over all k-points
    !                and bands
    !***********************************************************************
    !
Gregor Michalicek's avatar
Gregor Michalicek committed
47
    USE m_constants
48
    USE m_eig66_io,ONLY: write_dos
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
    USE m_radfun
    USE m_radflo
    USE m_rhomt
    USE m_rhonmt
    USE m_rhomtlo
    USE m_rhonmtlo
    USE m_mcdinit
    USE m_sympsi
    USE m_eparas      ! energy parameters and partial charges
    USE m_qal21       ! off-diagonal part of partial charges
    USE m_abcof
    USE m_nmat        ! calculate density matrix for LDA + U
    USE m_vacden
    USE m_nstm3
    USE m_pwden
    USE m_forcea8
    USE m_forcea12
    USE m_forcea21
67
    USE m_checkdopall
68 69 70 71
    USE m_int21       ! integrate (spin) off-diagonal radial functions
    USE m_int21lo     ! -"- for u_lo
    USE m_rhomt21     ! calculate (spin) off-diagonal MT-density coeff's
    USE m_rhonmt21    ! -"-                       non-MT-density coeff's
72
    USE m_cdnmt       ! calculate the density and orbital moments etc.
73 74 75 76 77 78 79 80 81 82
    USE m_orbmom      ! coeffd for orbital moments
    USE m_qmtsl       ! These subroutines divide the input%film into vacuum%layers
    USE m_qintsl      ! (slabs) and intergate the DOS in these vacuum%layers
    USE m_slabdim     ! (mt + interstitial)
    USE m_slabgeom    ! (written by Yu.Koroteev, 2003/2004)
    USE m_orbcomp     ! calculate corbital composition (like p_x,p_y,p_z)
    USE m_Ekwritesl   ! and write to file.
    USE m_abcrot2
    USE m_doswrite
    USE m_cdnread, ONLY : cdn_read0, cdn_read
83 84 85
    USE m_corespec, only : l_cs    ! calculation of core spectra (EELS)
    USE m_corespec_io, only : corespec_init
    USE m_corespec_eval, only : corespec_gaunt,corespec_rme,corespec_dos,corespec_ddscs
86
#ifdef CPP_MPI
87
    USE m_mpi_col_den ! collect density data from parallel nodes
88 89
#endif
    USE m_types
90
    USE m_xmlOutput
91
    IMPLICIT NONE
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
    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_obsolete),INTENT(IN)      :: obsolete
    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
109
    TYPE(t_coreSpecInput),INTENT(IN) :: coreSpecInput
110
    TYPE(t_potden),INTENT(IN)        :: vTot
Gregor Michalicek's avatar
Gregor Michalicek committed
111
    TYPE(t_potden),INTENT(INOUT)     :: den
112

113 114 115 116
    !     .. Scalar Arguments ..
    INTEGER, INTENT (IN) :: eig_id,jspin

    !     .. Array Arguments ..
Daniel Wortmann's avatar
Daniel Wortmann committed
117 118
    COMPLEX, INTENT(INOUT) :: qa21(atoms%ntype)
    REAL, INTENT   (OUT) :: chmom(atoms%ntype,dimension%jspd),clmom(3,atoms%ntype,dimension%jspd)
119 120
    REAL, INTENT (INOUT) :: qvac(dimension%neigd,2,kpts%nkpt,dimension%jspd)
    REAL, INTENT (INOUT) :: qvlay(dimension%neigd,vacuum%layerd,2,kpts%nkpt,dimension%jspd)
121 122 123

#ifdef CPP_MPI
    INCLUDE 'mpif.h'
124
    logical :: mpi_flag, mpi_status
125 126 127 128
#endif
    !     .. Local Scalars ..
    TYPE(t_lapw):: lapw
    INTEGER :: llpd
129
    REAL wronk,emcd_lo,emcd_up
130
    INTEGER i,ie,iv,ivac,j,k,l,l1,lh ,n,ilo,isp,nat,&
131
         nbands,noded,nodeu,noccbd,nslibd,na,&
132
         ikpt,jsp_start,jsp_end,ispin
133 134 135 136 137
    INTEGER  skip_t,skip_tt
    INTEGER n_size,i_rec,n_rank ,ncored,n_start,n_end,noccbd_l
    COMPLEX,parameter:: czero=(0.0,0.0)
    LOGICAL l_fmpl,l_mcd,l_evp,l_orbcomprot
    !     ...Local Arrays ..
Daniel Wortmann's avatar
Daniel Wortmann committed
138
    INTEGER n_bands(0:dimension%neigd),ncore(atoms%ntype)
139
    REAL    cartk(3),e_mcd(atoms%ntype,input%jspins,dimension%nstd)
140 141
    REAL    eig(dimension%neigd)
    REAL    vz0(2)
Daniel Wortmann's avatar
Daniel Wortmann committed
142 143
    REAL    uuilon(atoms%nlod,atoms%ntype),duilon(atoms%nlod,atoms%ntype)
    REAL    ulouilopn(atoms%nlod,atoms%nlod,atoms%ntype)
144 145

    INTEGER, PARAMETER :: n2max_nstm3=13
146

147 148 149 150 151
    INTEGER nsld,nsl
    !
    INTEGER, ALLOCATABLE :: nmtsl(:,:),nslat(:,:)
    REAL,    ALLOCATABLE :: zsl(:,:),volsl(:)
    REAL,    ALLOCATABLE :: volintsl(:)
152 153
    REAL,    ALLOCATABLE :: qintsl(:,:),qmtsl(:,:)
    REAL,    ALLOCATABLE :: orbcomp(:,:,:),qmtp(:,:)
154
    REAL,    ALLOCATABLE :: qis(:,:,:)
155 156
    !-new_sl
    !-dw
Daniel Wortmann's avatar
Daniel Wortmann committed
157
    INTEGER, ALLOCATABLE :: gvac1d(:),gvac2d(:)
158 159
    INTEGER, ALLOCATABLE :: jsym(:),ksym(:)

160
    REAL,    ALLOCATABLE :: we(:)
161
    REAL,    ALLOCATABLE :: f(:,:,:,:),g(:,:,:,:),flo(:,:,:,:)
162
    REAL,    ALLOCATABLE :: sqlo(:,:,:)
163 164 165 166 167 168 169 170 171 172
    REAL,    ALLOCATABLE :: qal(:,:,:,:),sqal(:,:,:),ener(:,:,:)
    REAL,    ALLOCATABLE :: svac(:,:),pvac(:,:),mcd(:,:,:)
    REAL,    ALLOCATABLE :: enerlo(:,:,:),qmat(:,:,:,:)
    COMPLEX, ALLOCATABLE :: acof(:,:,:,:),bcof(:,:,:,:),ccof(:,:,:,:,:)
    COMPLEX, ALLOCATABLE :: acoflo(:,:,:,:),bcoflo(:,:,:,:)
    COMPLEX, ALLOCATABLE :: cveccof(:,:,:,:,:),f_a12(:,:)
    COMPLEX, ALLOCATABLE :: e1cof(:,:,:),e2cof(:,:,:),f_a21(:,:)
    COMPLEX, ALLOCATABLE :: f_b4(:,:),f_b8(:,:)
    COMPLEX, ALLOCATABLE :: aveccof(:,:,:,:),bveccof(:,:,:,:)
    COMPLEX, ALLOCATABLE :: qstars(:,:,:,:),m_mcd(:,:,:,:)
173

174 175 176
    TYPE (t_orb)              :: orb
    TYPE (t_denCoeffs)        :: denCoeffs
    TYPE (t_denCoeffsOffdiag) :: denCoeffsOffdiag
177

178 179
    TYPE (t_usdus)             :: usdus
    TYPE (t_zMat)              :: zMat
180
    INTEGER :: nkpt_extended
181

182
    zmat%l_real=sym%invs.AND.(.NOT.noco%l_soc).AND.(.NOT.noco%l_noco)
183 184 185 186 187 188 189 190 191 192 193 194 195 196
    !     ..
    !     ..
    llpd=(atoms%lmaxd*(atoms%lmaxd+3))/2
    !---> l_fmpl is meant as a switch to to a plot of the full magnet.
    !---> density without the atomic sphere approximation for the magnet.
    !---> density. It is not completely implemented (lo's missing).
    l_fmpl = .false.
    IF (noco%l_mperp) THEN
       !--->    when the off-diag. part of the desinsity matrix, i.e. m_x and
       !--->    m_y, is calculated inside the muffin-tins (l_mperp = T), cdnval
       !--->    is called only once. therefore, several spin loops have been
       !--->    added. if l_mperp = F, these loops run only from jspin - jspin.
       jsp_start = 1
       jsp_end   = 2
Daniel Wortmann's avatar
Daniel Wortmann committed
197
       ALLOCATE ( qmat(0:3,atoms%ntype,dimension%neigd,4) )
198 199 200
    ELSE
       jsp_start = jspin
       jsp_end   = jspin
201
       ALLOCATE (qmat(1,1,1,1) )
202
    ENDIF
203
    !---> if l_mperp = F, these variables are only needed for one spin
204 205 206 207 208
    !---> at a time, otherwise for both spins:
    ALLOCATE ( f(atoms%jmtd,2,0:atoms%lmaxd,jsp_start:jsp_end) )      ! Deallocation before mpi_col_den
    ALLOCATE ( g(atoms%jmtd,2,0:atoms%lmaxd,jsp_start:jsp_end) )
    ALLOCATE ( jsym(dimension%neigd),ksym(dimension%neigd) )
    ALLOCATE ( gvac1d(dimension%nv2d),gvac2d(dimension%nv2d) )
Daniel Wortmann's avatar
Daniel Wortmann committed
209 210 211 212 213
    ALLOCATE ( qal(0:3,atoms%ntype,dimension%neigd,jsp_start:jsp_end) )
    ALLOCATE ( sqal(0:3,atoms%ntype,jsp_start:jsp_end) )
    ALLOCATE ( ener(0:3,atoms%ntype,jsp_start:jsp_end) )
    ALLOCATE (   sqlo(atoms%nlod,atoms%ntype,jsp_start:jsp_end) )
    ALLOCATE ( enerlo(atoms%nlod,atoms%ntype,jsp_start:jsp_end) )
214 215 216
    ALLOCATE ( svac(2,jsp_start:jsp_end) )
    ALLOCATE ( pvac(2,jsp_start:jsp_end) )
    ALLOCATE ( qstars(vacuum%nstars,dimension%neigd,vacuum%layerd,2) )
217

218
    ! --> Initializations
Gregor Michalicek's avatar
Gregor Michalicek committed
219

220
    CALL usdus%init(atoms,input%jspins)
221 222 223 224
    CALL denCoeffs%init(atoms,sphhar,jsp_start,jsp_end)
    CALL denCoeffsOffdiag%init(atoms,noco,sphhar,l_fmpl)

    IF ((l_fmpl).AND.(.not.noco%l_mperp)) CALL juDFT_error("for fmpl set noco%l_mperp = T!" ,calledby ="cdnval")
Gregor Michalicek's avatar
Gregor Michalicek committed
225

226 227 228
    svac(:,:) = 0.0 ; pvac(:,:) = 0.0
    sqal(:,:,:) = 0.0 ; ener(:,:,:) = 0.0
    !+soc
229
    CALL orb%init(atoms,noco,jsp_start,jsp_end)
230 231
    !+for
    IF (input%l_f) THEN
Daniel Wortmann's avatar
Daniel Wortmann committed
232 233
       ALLOCATE ( f_a12(3,atoms%ntype),f_a21(3,atoms%ntype) )
       ALLOCATE ( f_b4(3,atoms%ntype),f_b8(3,atoms%ntype) )
234 235 236 237 238 239 240 241 242 243 244
       f_b4(:,:) = czero  ; f_a12(:,:) = czero
       f_b8(:,:) = czero  ; f_a21(:,:) = czero
    ELSE
       ALLOCATE ( f_b8(1,1) )
    ENDIF
    !
    INQUIRE (file='mcd_inp',exist=l_mcd)
    IF (l_mcd) THEN
       OPEN (23,file='mcd_inp',STATUS='old',FORM='formatted')
       READ (23,*) emcd_lo,emcd_up
       CLOSE (23)
Daniel Wortmann's avatar
Daniel Wortmann committed
245 246
       ALLOCATE ( m_mcd(dimension%nstd,(3+1)**2,3*atoms%ntype,2) )
       ALLOCATE ( mcd(3*atoms%ntype,dimension%nstd,dimension%neigd) )
247 248 249 250
       IF (.not.banddos%dos) WRITE (*,*) 'For mcd-spectra set banddos%dos=T!'
    ELSE
       ALLOCATE ( m_mcd(1,1,1,1),mcd(1,1,1) )
    ENDIF
251

252
! calculation of core spectra (EELS) initializations -start-
253
    CALL corespec_init(input,atoms,coreSpecInput)
Gregor Michalicek's avatar
Gregor Michalicek committed
254
    IF(l_cs.AND.(mpi%isize.NE.1)) CALL juDFT_error('EELS + MPI not implemented', calledby = 'cdnval')
255 256 257
    IF(l_cs.AND.jspin.EQ.1) CALL corespec_gaunt()
! calculation of core spectra (EELS) initializations -end-

Daniel Wortmann's avatar
Daniel Wortmann committed
258
  
259 260 261
    IF (mpi%irank==0) THEN
       WRITE (6,FMT=8000) jspin
       WRITE (16,FMT=8000) jspin
262
       CALL openXMLElementPoly('mtCharges',(/'spin'/),(/jspin/))
263
    END IF
264 265
8000 FORMAT (/,/,10x,'valence density: spin=',i2)

266 267
    CALL cdn_read0(eig_id,mpi%irank,mpi%isize,jspin,dimension%jspd,&
                   noco%l_noco,n_bands,n_size)
268 269 270 271
#ifdef CPP_MPI
    ! Sinchronizes the RMA operations
    CALL MPI_BARRIER(mpi%mpi_comm,ie) 
#endif
272

273
    ALLOCATE ( qis(dimension%neigd,kpts%nkpt,dimension%jspd))
274

275 276 277 278 279 280 281 282
    skip_tt = dot_product(enpara%skiplo(:atoms%ntype,jspin),atoms%neq(:atoms%ntype))
    IF (noco%l_soc.OR.noco%l_noco)  skip_tt = 2 * skip_tt
    !-lo
    !---> set up l-dependent m.t. wavefunctions
    na = 1
    ncored = 0

    ALLOCATE ( flo(atoms%jmtd,2,atoms%nlod,dimension%jspd) )
283
    DO n = 1,atoms%ntype
284 285
       IF (input%cdinf.AND.mpi%irank==0) WRITE (6,FMT=8001) n
       DO  l = 0,atoms%lmax(n)
Daniel Wortmann's avatar
Daniel Wortmann committed
286
          DO ispin =jsp_start,jsp_end
287 288
             CALL radfun(l,n,ispin,enpara%el0(l,n,ispin),vTot%mt(1,0,n,ispin),atoms,&
                         f(1,1,l,ispin),g(1,1,l,ispin),usdus,nodeu,noded,wronk)
289
             IF (input%cdinf.AND.mpi%irank==0) WRITE (6,FMT=8002) l,&
290
                  enpara%el0(l,n,ispin),usdus%us(l,n,ispin),usdus%dus(l,n,ispin),nodeu,&
291 292
                  usdus%uds(l,n,ispin),usdus%duds(l,n,ispin),noded,usdus%ddn(l,n,ispin),&
                  wronk
293
          END DO
294
          IF (noco%l_mperp) THEN
295
             CALL int_21(f,g,atoms,n,l,denCoeffsOffdiag)
296
          END IF
297 298
       END DO
       IF (l_mcd) THEN
299 300 301
          CALL mcd_init(atoms,input,dimension,&
                        vTot%mt(:,0,:,:),g,f,emcd_up,emcd_lo,n,jspin,&
                        ncore,e_mcd,m_mcd)
302 303
          ncored = max(ncore(n),ncored)
       END IF
304 305 306

       IF(l_cs) CALL corespec_rme(atoms,input,n,dimension%nstd,&
                                  input%jspins,jspin,results%ef,&
307
                                  dimension%msh,vTot%mt(:,0,:,:),f,g)
308

309 310 311 312 313 314
       !
       !--->   generate the extra wavefunctions for the local orbitals,
       !--->   if there are any.
       !
       IF ( atoms%nlo(n) > 0 ) THEN
          DO ispin = jsp_start,jsp_end
315
             CALL radflo(atoms,n,ispin, enpara%ello0(1,1,ispin),vTot%mt(:,0,n,ispin), f(1,1,0,ispin),&
316
                         g(1,1,0,ispin),mpi, usdus, uuilon,duilon,ulouilopn, flo(:,:,:,ispin))
317 318 319 320 321
          END DO
       END IF

       DO ilo = 1, atoms%nlo(n)
          IF (noco%l_mperp) THEN
322
             CALL int_21lo(f,g,atoms,n,flo,ilo,denCoeffsOffdiag)
323 324 325 326 327 328 329
          END IF
       END DO

       na = na + atoms%neq(n)
    END DO
    DEALLOCATE (flo)
8001 FORMAT (1x,/,/,' wavefunction parameters for atom type',i3,':',/,&
330 331 332 333
         t32,'radial function',t79,'energy derivative',/,t3,'l',t8,&
         'energy',t26,'value',t39,'derivative',t53,'nodes',t68,&
         'value',t81,'derivative',t95,'nodes',t107,'norm',t119,&
         'wronskian')
334 335
8002 FORMAT (i3,f10.5,2 (5x,1p,2e16.7,i5),1p,2e16.7)

336
    IF (input%film) vz0(:) = vTot%vacz(vacuum%nmz,:,jspin)
337
    nsld=1
338 339 340 341
    !+q_sl
    IF ((banddos%ndir.EQ.-3).AND.banddos%dos) THEN
       IF (oneD%odi%d1)  CALL juDFT_error("layer-resolved feature does not work with 1D",calledby ="cdnval")
       CALL slab_dim(atoms, nsld)
Daniel Wortmann's avatar
Daniel Wortmann committed
342
       ALLOCATE ( nmtsl(atoms%ntype,nsld),nslat(atoms%nat,nsld) )
343 344 345
       ALLOCATE ( zsl(2,nsld),volsl(nsld) )
       ALLOCATE ( volintsl(nsld) )
       CALL slabgeom(&
346 347
            atoms,cell,nsld,&
            nsl,zsl,nmtsl,nslat,volsl,volintsl)
348 349 350

       ALLOCATE ( qintsl(nsld,dimension%neigd))
       ALLOCATE ( qmtsl(nsld,dimension%neigd))
Daniel Wortmann's avatar
Daniel Wortmann committed
351 352
       ALLOCATE ( orbcomp(dimension%neigd,23,atoms%nat) )
       ALLOCATE ( qmtp(dimension%neigd,atoms%nat) )
353
       IF (.NOT.input%film) qvac(:,:,:,jspin) = 0.0
354 355 356
    ELSE
       ALLOCATE(nmtsl(1,1),nslat(1,1),zsl(1,1),volsl(1),volintsl(1))
       ALLOCATE(qintsl(1,1),qmtsl(1,1),orbcomp(1,1,1),qmtp(1,1))
357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376
    END IF
    !-q_sl
    !
    !-->   loop over k-points: each can be a separate task
    !
    IF (kpts%nkpt < mpi%isize) THEN
       l_evp = .true.
       IF (l_mcd) THEN
          mcd(:,:,:) = 0.0
       ENDIF
       ener(:,:,:) = 0.0
       sqal(:,:,:) = 0.0
       qal(:,:,:,:) = 0.0
       enerlo(:,:,:) = 0.0
       sqlo(:,:,:) = 0.0
    ELSE
       l_evp = .false.
    END IF
    ALLOCATE ( we(dimension%neigd) )
    i_rec = 0 ; n_rank = 0
377 378 379 380 381 382 383 384 385

    ! For k-point paralelization: 
    ! the number of iterations is adjusted to the number of MPI processes to synchronize RMA operations
    if (l_evp) then
       nkpt_extended = kpts%nkpt
    else
       nkpt_extended = (kpts%nkpt / mpi%isize + 1) * mpi%isize
    endif
    DO ikpt = 1,nkpt_extended
386 387
       i_rec = i_rec + 1
       IF ((mod(i_rec-1,mpi%isize).EQ.mpi%irank).OR.l_evp) THEN
388
        IF ( ikpt < kpts%nkpt + 1) THEN
389 390 391 392 393 394 395 396 397 398 399 400 401 402 403
          !-t3e
          we=0.0
          !--->    determine number of occupied bands and set weights (we)
          noccbd = 0
          DO i = 1,dimension%neigd ! nbands
             we(i) = results%w_iks(n_bands(n_rank)+i,ikpt,jspin)
             IF (noco%l_noco) we(i) = results%w_iks(i,ikpt,1)
             IF ((we(i).GE.1.e-8).OR.input%pallst) THEN
                noccbd = noccbd + 1
             ELSE
                we(i)=0.0
             END IF
          END DO
          ! uncomment this so that cdinf plots works for all states
          ! noccbd = neigd
404 405

          !
406
          ! -> Gu test: distribute ev's among the processors...
407
          !
Daniel Wortmann's avatar
Daniel Wortmann committed
408
          CALL lapw%init(input,noco, kpts,atoms,sym,ikpt,cell,.false., mpi)
409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434
          skip_t = skip_tt
          IF (l_evp.AND.(mpi%isize.GT.1)) THEN
             IF (banddos%dos) THEN
                noccbd_l = CEILING( real(n_bands(1)) / mpi%isize )
                n_start = mpi%irank*noccbd_l + 1
                n_end   = min( (mpi%irank+1)*noccbd_l , n_bands(1) )
             ELSE
                noccbd_l = CEILING( real(noccbd) / mpi%isize )
                n_start = mpi%irank*noccbd_l + 1
                n_end   = min( (mpi%irank+1)*noccbd_l , noccbd )
             END IF
             noccbd = n_end - n_start + 1
             IF (noccbd<1) THEN
                noccbd=0
             ELSE
                we(1:noccbd) = we(n_start:n_end)
             END IF
             IF (n_start > skip_tt) THEN
                skip_t  = 0
             END IF
             IF (n_end <= skip_tt) THEN
                skip_t  = noccbd
             END IF
             IF ((n_start <= skip_tt).AND.(n_end > skip_tt)) THEN
                skip_t  = mod(skip_tt,noccbd)
             END IF
435
          ELSE
436 437 438 439 440 441 442 443 444 445
             n_start = 1
             IF (banddos%dos) THEN
                noccbd_l = n_bands(1)
                n_end    = n_bands(1)
                noccbd   = n_bands(1)
             ELSE
                noccbd_l = noccbd
                n_end    = noccbd
             END IF
          END IF
Daniel Wortmann's avatar
Daniel Wortmann committed
446 447
          zMat%nbasfcn=lapw%nv(1)+atoms%nlotot
          IF (noco%l_noco) zMat%nbasfcn=zMat%nbasfcn+lapw%nv(2)+atoms%nlotot
448
          IF (zmat%l_real) THEN
449
             IF (.NOT.ALLOCATED(zMat%z_r)) THEN
Daniel Wortmann's avatar
Daniel Wortmann committed
450
                ALLOCATE (zMat%z_r(zmat%nbasfcn,dimension%neigd))
451 452 453
                zMat%nbands = dimension%neigd
             END IF
             zMat%z_r = 0
454
          ELSE
455
             IF (.NOT.ALLOCATED(zMat%z_c)) THEN
Daniel Wortmann's avatar
Daniel Wortmann committed
456
                ALLOCATE (zMat%z_c(zmat%nbasfcn,dimension%neigd))
457 458 459
                zMat%nbands = dimension%neigd
             END IF
             zMat%z_c = 0
460
          endif
461 462 463
          CALL cdn_read(eig_id,dimension%nvd,dimension%jspd,mpi%irank,mpi%isize,&
                        ikpt,jspin,zmat%nbasfcn,noco%l_ss,noco%l_noco,&
                        noccbd,n_start,n_end,nbands,eig,zMat)
464
#ifdef CPP_MPI
Daniel Wortmann's avatar
Daniel Wortmann committed
465
          ! Sinchronizes the RMA operations
466
          CALL MPI_BARRIER(mpi%mpi_comm,ie)
467
#endif
468 469 470 471 472
          !IF (l_evp.AND.(isize.GT.1)) THEN
          !  eig(1:noccbd) = eig(n_start:n_end)
          !ENDIF
          !
          IF (vacuum%nstm.EQ.3.AND.input%film) THEN
473 474 475 476 477
             CALL nstm3(sym,atoms,vacuum,stars,ikpt,lapw%nv(jspin),&
                        input,jspin,kpts,&
                        cell,kpts%wtkpt(ikpt),lapw%k1(:,jspin),lapw%k2(:,jspin),&
                        enpara%evac0(1,jspin),vTot%vacz(:,:,jspin),vz0,&
                        gvac1d,gvac2d)
478
          END IF
479

480 481 482 483 484 485 486 487 488 489 490
          IF (noccbd.EQ.0) GO TO 199
          !
          !--->    if slice, only a certain bands are taken into account
          !--->    in order to do this the coresponding eigenvalues, eigenvectors
          !--->    and weights have to be copied to the beginning of the arrays
          !--->    eig, z and we and the number of occupied bands (noccbd) has to
          !--->    changed
          IF (sliceplot%slice) THEN
             IF (mpi%irank==0) WRITE (16,FMT=*) 'NNNE',sliceplot%nnne
             IF (mpi%irank==0) WRITE (16,FMT=*) 'sliceplot%kk',sliceplot%kk
             nslibd = 0
491
             IF (input%pallst) we(:nbands) = kpts%wtkpt(ikpt)
492 493 494 495 496 497 498 499 500 501
             IF (sliceplot%kk.EQ.0) THEN
                IF (mpi%irank==0) THEN
                   WRITE (16,FMT='(a)') 'ALL K-POINTS ARE TAKEN IN SLICE'
                   WRITE (16,FMT='(a,i2)') ' sliceplot%slice: k-point nr.',ikpt
                END IF
                DO i = 1,nbands
                   IF (eig(i).GE.sliceplot%e1s .AND. eig(i).LE.sliceplot%e2s) THEN
                      nslibd = nslibd + 1
                      eig(nslibd) = eig(i)
                      we(nslibd) = we(i)
502
                      if (zmat%l_real) THEN
503
                         zMat%z_r(:,nslibd) = zMat%z_r(:,i)
504
                      else
505
                         zMat%z_c(:,nslibd) = zMat%z_c(:,i)
506
                      endif
507 508 509 510 511 512 513
                   END IF
                END DO
                IF (mpi%irank==0) WRITE (16,'(a,i3)') ' eigenvalues in sliceplot%slice:',nslibd
             ELSE IF (sliceplot%kk.EQ.ikpt) THEN
                IF (mpi%irank==0) WRITE (16,FMT='(a,i2)') ' sliceplot%slice: k-point nr.',ikpt
                IF ((sliceplot%e1s.EQ.0.0) .AND. (sliceplot%e2s.EQ.0.0)) THEN
                   IF (mpi%irank==0) WRITE (16,FMT='(a,i5,f10.5)') 'slice: eigenvalue nr.',&
514
                        sliceplot%nnne,eig(sliceplot%nnne)
515 516 517
                   nslibd = nslibd + 1
                   eig(nslibd) = eig(sliceplot%nnne)
                   we(nslibd) = we(sliceplot%nnne)
518
                   if (zmat%l_real) Then
519
                      zMat%z_r(:,nslibd) = zMat%z_r(:,sliceplot%nnne)
520
                   else
521
                      zMat%z_c(:,nslibd) = zMat%z_c(:,sliceplot%nnne)
522
                   endif
523 524 525
                ELSE
                   DO i = 1,nbands
                      IF (eig(i).GE.sliceplot%e1s .AND. eig(i).LE.sliceplot%e2s) THEN
526
                         nslibd = nslibd + 1
527 528
                         eig(nslibd) = eig(i)
                         we(nslibd) = we(i)
529
                         if (zmat%l_real) THEN
530
                            zMat%z_r(:,nslibd) = zMat%z_r(:,i)
531
                         else
532
                            zMat%z_c(:,nslibd) = zMat%z_c(:,i)
533
                         endif
534
                      END IF
535 536 537 538 539 540 541 542 543 544 545 546 547 548
                   END DO
                   IF (mpi%irank==0) WRITE (16,FMT='(a,i3)')' eigenvalues in sliceplot%slice:',nslibd
                END IF
             END IF
             noccbd = nslibd
             IF (nslibd.EQ.0) GO TO 199 !200
          END IF ! sliceplot%slice

          !--->    in normal iterations the charge density of the unoccupied
          !--->    does not need to be calculated (in pwden, vacden and abcof)
          IF (banddos%dos.AND. .NOT.(l_evp.AND.(mpi%isize.GT.1)) ) THEN
             noccbd=nbands
          END IF
          !     ----> add in spin-doubling factor
549
          we(:noccbd) = 2.0 * we(:noccbd) / input%jspins
550 551 552 553 554 555 556 557

          !---> pk non-collinear
          !--->    valence density in the interstitial and vacuum region
          !--->    has to be called only once (if jspin=1) in the non-collinear
          !--->    case
          !     ----> valence density in the interstitial region
          IF (.NOT.((jspin.EQ.2) .AND. noco%l_noco)) THEN
             CALL timestart("cdnval: pwden")
558
             CALL pwden(stars,kpts,banddos,oneD,input,mpi,noco,cell,atoms,sym,ikpt,&
559
                        jspin,lapw,noccbd,we,eig,den,qis,results%force,f_b8,zMat)
560 561 562 563 564 565
             CALL timestop("cdnval: pwden")
          END IF
          !+new
          !--->    charge of each valence state in this k-point of the SBZ
          !--->    in the layer interstitial region of the film
          !
566
          IF (banddos%dos.AND.(banddos%ndir.EQ.-3)) THEN
567
             IF (.NOT.((jspin.EQ.2) .AND. noco%l_noco)) THEN
568
                CALL q_int_sl(jspin,stars,atoms,sym, volsl,volintsl,&
569
                              cell,noccbd,lapw, nsl,zsl,nmtsl,oneD, qintsl(:,:),zMat)
570 571 572 573 574 575 576
             END IF
          END IF
          !-new c
          !--->    valence density in the vacuum region
          IF (input%film) THEN
             IF (.NOT.((jspin.EQ.2) .AND. noco%l_noco)) THEN
                CALL timestart("cdnval: vacden")
577
                CALL vacden(vacuum,dimension,stars,oneD, kpts,input, cell,atoms,noco,banddos,&
578 579
                            gvac1d,gvac2d, we,ikpt,jspin,vTot%vacz(:,:,jspin),vz0, noccbd,lapw, enpara%evac0,eig,&
                            den,qvac,qvlay, qstars,zMat)
580 581 582 583 584 585 586 587 588 589 590
                CALL timestop("cdnval: vacden")
             END IF
             !--->       perform Brillouin zone integration and summation over the
             !--->       bands in order to determine the vacuum energy parameters.
             DO ispin = jsp_start,jsp_end
                DO ivac = 1,vacuum%nvac
                   pvac(ivac,ispin)=pvac(ivac,ispin)+dot_product(eig(:noccbd)*qvac(:noccbd,ivac,ikpt,ispin),we(:noccbd))
                   svac(ivac,ispin)=svac(ivac,ispin)+dot_product(qvac(:noccbd,ivac,ikpt,ispin),we(:noccbd))
                END DO
             END DO
          END IF
591

592 593 594
          !--->    valence density in the atomic spheres
          !--->    construct a(tilta) and b(tilta)
          IF (noco%l_mperp) THEN
Daniel Wortmann's avatar
Daniel Wortmann committed
595
             ALLOCATE ( acof(noccbd,0:dimension%lmd,atoms%nat,dimension%jspd),&
596
                                ! Deallocated before call to sympsi
Daniel Wortmann's avatar
Daniel Wortmann committed
597 598
                  bcof(noccbd,0:dimension%lmd,atoms%nat,dimension%jspd),                &
                  ccof(-atoms%llod:atoms%llod,noccbd,atoms%nlod,atoms%nat,dimension%jspd) )
599
          ELSE
Daniel Wortmann's avatar
Daniel Wortmann committed
600 601 602
             ALLOCATE ( acof(noccbd,0:dimension%lmd,atoms%nat,jspin:jspin),&
                  bcof(noccbd,0:dimension%lmd,atoms%nat,jspin:jspin),&
                  ccof(-atoms%llod:atoms%llod,noccbd,atoms%nlod,atoms%nat,jspin:jspin) )
603 604 605 606 607
          END IF

          DO ispin = jsp_start,jsp_end
             IF (input%l_f) THEN
                CALL timestart("cdnval: to_pulay")
Daniel Wortmann's avatar
Daniel Wortmann committed
608
                ALLOCATE (e1cof(noccbd,0:atoms%lmaxd*(atoms%lmaxd+2),atoms%nat),&
609
                                ! Deallocated after call to force_a21
Daniel Wortmann's avatar
Daniel Wortmann committed
610 611 612 613 614 615
                     e2cof(noccbd,0:atoms%lmaxd*(atoms%lmaxd+2),atoms%nat),&
                     acoflo(-atoms%llod:atoms%llod,noccbd,atoms%nlod,atoms%nat),&
                     bcoflo(-atoms%llod:atoms%llod,noccbd,atoms%nlod,atoms%nat),&
                     aveccof(3,noccbd,0:atoms%lmaxd*(atoms%lmaxd+2),atoms%nat),&
                     bveccof(3,noccbd,0:atoms%lmaxd*(atoms%lmaxd+2),atoms%nat),&
                     cveccof(3,-atoms%llod:atoms%llod,noccbd,atoms%nlod,atoms%nat) )
616
                CALL abcof(input,atoms,sym, cell,lapw,noccbd,usdus, noco,ispin,oneD,&
617 618
                           acof(:,0:,:,ispin),bcof(:,0:,:,ispin),ccof(-atoms%llod:,:,:,:,ispin),zMat,&
                           eig,acoflo,bcoflo,e1cof,e2cof,aveccof,bveccof,cveccof)
619 620 621
                CALL timestop("cdnval: to_pulay")
             ELSE
                CALL timestart("cdnval: abcof")
Daniel Wortmann's avatar
Daniel Wortmann committed
622
                CALL abcof(input,atoms,sym, cell,lapw,noccbd,usdus, noco,ispin,oneD,&
623
                           acof(:,0:,:,ispin),bcof(:,0:,:,ispin),ccof(-atoms%llod:,:,:,:,ispin),zMat)
624
                CALL timestop("cdnval: abcof")
625

626
             END IF
627

628
             IF (atoms%n_u.GT.0) THEN
629 630
                CALL n_mat(atoms,sym,noccbd,usdus,ispin,we,acof(:,0:,:,ispin),bcof(:,0:,:,ispin),&
                           ccof(-atoms%llod:,:,:,:,ispin),den%mmpMat(:,:,:,jspin))
631 632 633 634 635 636 637 638
             END IF
             !
             !--->       perform Brillouin zone integration and summation over the
             !--->       bands in order to determine the energy parameters for each
             !--->       atom and angular momentum
             !
             IF (.not.sliceplot%slice) THEN
                CALL eparas(ispin,atoms,noccbd,mpi,ikpt,noccbd,we,eig,ccof,&
639 640 641 642
                            skip_t,l_evp,acof(:,0:,:,ispin),bcof(:,0:,:,ispin),usdus,&
                            ncore,l_mcd,m_mcd,enerlo(1,1,ispin),sqlo(1,1,ispin),&
                            ener(0,1,ispin),sqal(0,1,ispin),&
                            qal(0:,:,:,ispin),mcd)
643 644

                IF (noco%l_mperp.AND.(ispin == jsp_end)) THEN
645 646
                   CALL qal_21(atoms,input,noccbd,we,ccof,&
                               noco,acof,bcof,denCoeffsOffdiag,qal,qmat)
647 648 649 650 651 652 653 654
                END IF
             END IF
             !
             !+new
             !--->    layer charge of each valence state in this k-point of the SBZ
             !--->    from the mt-sphere region of the film
             !
             IF (banddos%dos.AND.(banddos%ndir.EQ.-3))  THEN
655 656 657
                CALL q_mt_sl(ispin,atoms,noccbd,nsld,ikpt,noccbd,ccof(-atoms%llod,1,1,1,ispin),&
                             skip_t,noccbd,acof(:,0:,:,ispin),bcof(:,0:,:,ispin),usdus,&
                             nmtsl,nsl,qmtsl(:,:))
658 659 660

                INQUIRE (file='orbcomprot',exist=l_orbcomprot)
                IF (l_orbcomprot) THEN                           ! rotate ab-coeffs
661 662
                   CALL abcrot2(atoms,noccbd,acof(:,0:,:,ispin),bcof(:,0:,:,ispin),&
                                ccof(-atoms%llod:,:,:,:,ispin))
663 664 665
                END IF

                CALL orb_comp(ispin,noccbd,atoms,noccbd,usdus,acof(1:,0:,1:,ispin),bcof(1:,0:,1:,ispin),&
666
                              ccof(-atoms%llod:,1:,1:,1:,ispin),orbcomp,qmtp)
667 668 669 670
             END IF
             !-new
             !--->          set up coefficients for the spherical and
             CALL timestart("cdnval: rhomt")
671
             CALL rhomt(atoms,we,noccbd,acof(:,0:,:,ispin),bcof(:,0:,:,ispin),denCoeffs,ispin)
672 673 674
             CALL timestop("cdnval: rhomt")
             !+soc
             IF (noco%l_soc) THEN
675
                CALL orbmom(atoms,noccbd, we,ispin,acof(:,0:,:,ispin),bcof(:,0:,:,ispin),&
676
                            ccof(-atoms%llod:,:,:,:,ispin),orb)
677 678 679 680
             END IF
             !     -soc
             !--->          non-spherical m.t. density
             CALL timestart("cdnval: rhonmt")
681
             CALL rhonmt(atoms,sphhar,we,noccbd,sym,acof(:,0:,:,ispin),bcof(:,0:,:,ispin),denCoeffs,ispin)
682 683 684 685 686 687
             CALL timestop("cdnval: rhonmt")

             !--->          set up coefficients of the local orbitals and the
             !--->          flapw - lo cross terms for the spherical and
             !--->          non-spherical mt density
             CALL timestart("cdnval: rho(n)mtlo")
688 689 690 691 692
             CALL rhomtlo(atoms,noccbd,we,acof(:,0:,:,ispin),bcof(:,0:,:,ispin),&
                          ccof(-atoms%llod:,:,:,:,ispin),denCoeffs,ispin)

             CALL rhonmtlo(atoms,sphhar,noccbd,we,acof(:,0:,:,ispin),bcof(:,0:,:,ispin),&
                           ccof(-atoms%llod:,:,:,:,ispin),denCoeffs,ispin)
693 694 695 696
             CALL timestop("cdnval: rho(n)mtlo")

             IF (input%l_f) THEN
                CALL timestart("cdnval: force_a12/21")
697 698
                IF (.not.input%l_useapw) THEN
                   CALL force_a12(atoms,noccbd,sym, dimension,cell,oneD,&
699 700
                                  we,ispin,noccbd,usdus,acof(:,0:,:,ispin),&
                                  bcof(:,0:,:,ispin),e1cof,e2cof, acoflo,bcoflo, results,f_a12)
701 702
                ENDIF
                CALL force_a21(input,atoms,dimension,noccbd,sym,&
703 704 705
                               oneD,cell,we,ispin,enpara%el0(0:,:,ispin),noccbd,eig,usdus,acof(:,0:,:,ispin),&
                               bcof(:,0:,:,ispin),ccof(-atoms%llod:,:,:,:,ispin), aveccof,bveccof,cveccof,&
                               results,f_a21,f_b4)
706 707 708 709 710

                DEALLOCATE (e1cof,e2cof,aveccof,bveccof)
                DEALLOCATE (acoflo,bcoflo,cveccof)
                CALL timestop("cdnval: force_a12/21")
             END IF
711 712 713 714 715 716 717

             IF(l_cs) THEN
                CALL corespec_dos(atoms,usdus,ispin,dimension%lmd,kpts%nkpt,ikpt,&
                                  dimension%neigd,noccbd,results%ef,banddos%sig_dos,&
                                  eig,we,acof(1,0,1,ispin),bcof(1,0,1,ispin),&
                                  ccof(-atoms%llod,1,1,1,ispin))
             END IF
718 719 720
          END DO !--->    end loop over ispin

          IF (noco%l_mperp) THEN
721
             CALL rhomt21(atoms,we,noccbd,acof,bcof,ccof,denCoeffsOffdiag)
722
             IF (l_fmpl) THEN
723
                CALL rhonmt21(atoms,llpd,sphhar,we,noccbd,sym,acof,bcof,denCoeffsOffdiag)
724 725 726 727
             END IF
          END IF

          DEALLOCATE (acof,bcof,ccof)
728
          !
729 730 731 732 733 734 735 736 737 738 739 740 741
199       CONTINUE
          IF ((banddos%dos .OR. banddos%vacdos .OR. input%cdinf)  ) THEN
             CALL timestart("cdnval: write_info")
             !
             !--->    calculate charge distribution of each state (l-character ...)
             !--->    and write the information to the files dosinp and vacdos
             !--->    for dos and bandstructure plots
             !

             !--dw    parallel writing of vacdos,dosinp....
             !        write data to direct access file first, write to formated file later by PE 0 only!
             !--dw    since z is no longer an argument of cdninf sympsi has to be called here!
             !
Daniel Wortmann's avatar
Daniel Wortmann committed
742
             cartk=matmul(lapw%bkpt,cell%bmat)
743
             IF (banddos%ndir.GT.0) THEN
Daniel Wortmann's avatar
Daniel Wortmann committed
744
                CALL sympsi(lapw%bkpt,lapw%nv(jspin),lapw%k1(:,jspin),lapw%k2(:,jspin),&
745
                            lapw%k3(:,jspin),sym,dimension,nbands,cell,eig,noco, ksym,jsym,zMat)
746 747 748 749 750
             END IF
             !
             !--dw   now write k-point data to tmp_dos
             !
             CALL write_dos(eig_id,ikpt,jspin,qal(:,:,:,jspin),qvac(:,:,ikpt,jspin),qis(:,ikpt,jspin),&
751 752
                            qvlay(:,:,:,ikpt,jspin),qstars,ksym,jsym,mcd,qintsl,&
                            qmtsl(:,:),qmtp(:,:),orbcomp)
753

754 755 756 757 758
             CALL timestop("cdnval: write_info")
             !-new_sl
          END IF

          !--->  end of loop over PE's
759
          IF (zmat%l_real) THEN
760 761 762 763
             DEALLOCATE (zMat%z_r)
          ELSE
             DEALLOCATE (zMat%z_c)
          END IF
764 765 766 767 768 769
        ELSE !(ikpt < nkpt + 1)
#ifdef CPP_MPI
          ! Synchronizes the RMA operations
          CALL MPI_BARRIER(mpi%mpi_comm,ie)
#endif
        END IF
770 771
       END IF ! --> end "IF ((mod(i_rec-1,mpi%isize).EQ.mpi%irank).OR.l_evp) THEN"
    END DO !---> end of k-point loop
Gregor Michalicek's avatar
Gregor Michalicek committed
772
    DEALLOCATE (we,f,g)
773
    !+t3e
774
#ifdef CPP_MPI
775 776 777
    CALL timestart("cdnval: mpi_col_den")
    DO ispin = jsp_start,jsp_end
       CALL mpi_col_den(mpi,sphhar,atoms,oneD,stars,vacuum,&
778 779 780 781 782
                        input,noco,l_fmpl,ispin,llpd, den%vacxy(1,1,1,ispin),&
                        den%vacz(1,1,ispin),den%pw(1,ispin), ener(0,1,ispin),sqal(0,1,ispin),&
                        results,svac(1,ispin),pvac(1,ispin),denCoeffs,&
                        sqlo(1,1,ispin),enerlo(1,1,ispin),orb,&
                        denCoeffsOffdiag,den,den%mmpMat(:,:,:,jspin))
783 784
    END DO
    CALL timestop("cdnval: mpi_col_den")
785
#endif
786 787 788

    IF(l_cs) CALL corespec_ddscs(jspin,input%jspins)

789 790 791
    IF (((jspin.eq.input%jspins).OR.noco%l_mperp) .AND. (banddos%dos.or.banddos%vacdos.or.input%cdinf) ) THEN
       CALL timestart("cdnval: dos")
       IF (mpi%irank==0) THEN
792 793 794 795
          CALL doswrite(eig_id,dimension,kpts,atoms,vacuum,input,banddos,&
                        sliceplot,noco,sym,cell,&
                        l_mcd,ncored,ncore,e_mcd,&
                        results%ef,results%bandgap,nsld,oneD)
796
          IF (banddos%dos.AND.(banddos%ndir.EQ.-3)) THEN
797 798 799
             CALL Ek_write_sl(eig_id,dimension,kpts,atoms,vacuum,&
                              nsld,input,jspin,sym,cell,&
                              nsl,nslat)
800 801
          END IF
       END IF
802
#ifdef CPP_MPI                
803
       CALL MPI_BARRIER(mpi%mpi_comm,ie)
804
#endif
805 806 807 808
       CALL timestop("cdnval: dos")
    END IF

    IF (mpi%irank==0) THEN
809 810 811 812 813 814
       CALL cdnmt(dimension%jspd,atoms,sphhar,llpd,&
                  noco,l_fmpl,jsp_start,jsp_end,&
                  enpara%el0,enpara%ello0,vTot%mt(:,0,:,:),denCoeffs,&
                  usdus,orb,&
                  denCoeffsOffdiag,&
                  chmom,clmom,qa21,den%mt)
815 816

       DO ispin = jsp_start,jsp_end
817 818 819
          IF (.NOT.sliceplot%slice) THEN
             DO n=1,atoms%ntype
             enpara%el1(0:3,n,ispin)=ener(0:3,n,ispin)/sqal(0:3,n,ispin)
820
             IF (atoms%nlo(n)>0) enpara%ello1(:atoms%nlo(n),n,ispin)=enerlo(:atoms%nlo(n),n,ispin)/sqlo(:atoms%nlo(n),n,ispin)
821
          ENDDO
822
          IF (input%film) enpara%evac1(:vacuum%nvac,ispin)=pvac(:vacuum%nvac,ispin)/svac(:vacuum%nvac,ispin)
823 824 825 826 827 828 829
          END IF

          !--->      check continuity of charge density
          IF (input%cdinf) THEN
             CALL timestart("cdnval: cdninf-stuff")
             WRITE (6,FMT=8210) ispin
8210         FORMAT (/,5x,'check continuity of cdn for spin=',i2)
830 831
             CALL checkDOPAll(input,dimension,sphhar,stars,atoms,sym,vacuum,oneD,&
                              cell,den,ispin)
832 833 834 835 836 837
             CALL timestop("cdnval: cdninf-stuff")
          END IF
          !+for
          !--->      forces of equ. A8 of Yu et al.
          IF ((input%l_f)) THEN
             CALL timestart("cdnval: force_a8")
838 839
             CALL force_a8(input,atoms,sphhar,ispin,vTot%mt(:,:,:,ispin),den%mt,&
                           f_a12,f_a21,f_b4,f_b8,results%force)
840 841
             CALL timestop("cdnval: force_a8")
          END IF
842
          !-for
843
       END DO ! end of loop ispin = jsp_start,jsp_end
844
       CALL closeXMLElement('mtCharges')
845 846 847 848 849 850 851 852 853 854

       IF(vacuum%nvac.EQ.1) THEN
          den%vacz(:,2,:) = den%vacz(:,1,:)
          IF (sym%invs) THEN
             den%vacxy(:,:,2,:) = CONJG(den%vacxy(:,:,1,:))
          ELSE
             den%vacxy(:,:,2,:) = den%vacxy(:,:,1,:)
          END IF
       END IF

855 856 857
    END IF ! end of (mpi%irank==0)
    !+t3e
    !Note: no deallocation anymore, we rely on Fortran08 :-)
858

859 860 861 862
    IF ((jsp_end.EQ.input%jspins)) THEN
       IF ((banddos%dos.OR.banddos%vacdos).AND.(banddos%ndir/=-2))  CALL juDFT_end("DOS OK",mpi%irank)
       IF (vacuum%nstm.EQ.3)  CALL juDFT_end("VACWAVE OK",mpi%irank)
    END IF
863

864 865
  END SUBROUTINE cdnval
END MODULE m_cdnval