LCOV - code coverage report
Current view: top level - cdn - vacden.F90 (source / functions) Hit Total Coverage
Test: FLEUR test coverage Lines: 99 364 27.2 %
Date: 2024-04-26 04:44:34 Functions: 1 1 100.0 %

          Line data    Source code
       1             : MODULE m_vacden
       2             :    USE m_juDFT
       3             :    ! Legacy comments:
       4             :    !     *************************************************************
       5             :    !     determines the 2-d star function expansion coefficients of
       6             :    !     vacuum charge density. speed up by r. wu 1992
       7             :    !     *************************************************************
       8             :    !***********************************************************************
       9             :    !     ****** change vacden(....,q) for vacuum density of states shz Jan.96
      10             :    !     ****** change vacden(......,vacdos%qstars) for starcoefficients, shz. Jan.99
      11             :    !     ****** changed for fleur dw
      12             :    !     In non-collinear calculations the density becomes a hermitian 2x2
      13             :    !     matrix. This subroutine generates this density matrix in the
      14             :    !     vacuum region. The diagonal elements of this matrix (n_11 & n_22)
      15             :    !     are store in den%vacz and den%vacxy, while the real and imaginary part
      16             :    !     of the off-diagonal element are stored in den%vacz(:,:,3:4) and den%vacxy(:,:,:,3).
      17             :    !
      18             :    !     Philipp Kurz 99/07
      19             :    !***********************************************************************
      20             : 
      21             :    !******** ABBREVIATIONS ************************************************
      22             :    !     qvac     : vacuum charge of each eigenstate, needed in in cdnval
      23             :    !                to determine the vacuum energy parameters
      24             :    !     vz       : non-warping part of the vacuum potential (matrix)
      25             :    !                collinear    : 2. index = ivac (# of vaccum)
      26             :    !                non-collinear: 2. index = ipot (comp. of pot. matr.)
      27             :    !     den%vacz : non-warping part of the vacuum density matrix,
      28             :    !                diagonal elements n_11 and n_22
      29             :    !     den%vacxy: warping part of the vacuum density matrix,
      30             :    !                diagonal elements n_11 and n_22
      31             :    !     den%vacz(:,:,3:4): non-warping part of the vacuum density matrix,
      32             :    !                off-diagonal elements n_21 (real part in (:,:,3), imaginary part in (:,:,4))
      33             :    !     den%vacxy(:,:,:,3): warping part of the vacuum density matrix,
      34             :    !                off-diagonal elements n_21
      35             :    !***********************************************************************
      36             :    !     *******************************************************************************
      37             :    !    layers: no. of layers to be calculated (in vertical direction with z-values as given by izlay)
      38             :    !    izlay : defines vertical position of layers in delz (=0.1 a.u.) units from begining of vacuum region
      39             :    !    vacdos: =T: calculate vacuum dos in layers as given by the above
      40             :    !    integ : =T: integrate in vertical position between izlay(layer,1)..izlay(layer,2)
      41             :    !    nstm  : 0: s-Tip, 1: p_z-Tip, 2: d_z^2-Tip (following Chen's derivative rule) ->rhzgrd.f is used
      42             :    !                 to calculate derivatives
      43             :    !    tworkf: Workfunction of Tip (in hartree units) is needed for d_z^2-Orbital)
      44             :    !    starcoeff: =T: star coefficients are calculated at values of izlay for 0th (=q) to nstars-1. star
      45             :    !                (vacdos%qstars(1..nstars-1))
      46             :    !    nstars: number of star functions to be used (0th star is given by value of q=charge integrated in 2D)
      47             :    !
      48             :    !    further possibility: (readin of locx, locy has to be implemented in flapw7.f or they have to be set explicitly)
      49             :    !
      50             :    !     locx and locy can be used to calculate local DOS at a certain vertical position z (or integrated in z)
      51             :    !     within a restricted area of the 2D unit cell, the corners of this area is given by locx and locy
      52             :    !     they are defined in internal coordinates, i.e. \vec{r}_1=locx(1)*\vec{a}_1+locy(1)*\vec{a}_2
      53             :    !                                                    \vec{r}_2=locx(2)*\vec{a}_1+locy(2)*\vec{a}_2
      54             :    !                 \vec{a}_1,2 are the 2D lattice vectors
      55             :    !
      56             :    !     **************************************************************************************************
      57             : CONTAINS
      58         140 :    SUBROUTINE vacden(vacuum,stars,input,cell,atoms,noco,nococonv,banddos,&
      59         140 :                      we,ikpt,jspin,vz,ne,ev_list,lapw,evac,den,zMat,vacdos,dos,lapwq,we1,zMat1)
      60             :       !! Calculates the vacuum part of the density and puts it into den%vac. The variable has
      61             :       !! four dimensions: The z, star, vacuum and spin index. Recent refactoring combined the
      62             :       !! real variable vacz and the complex star expansion vacxy into one. vacz is identical
      63             :       !! to the array for the first star (\(\boldsymbol{G}_{||}=0\)), which was not present in vacxy. The
      64             :       !! array is bounded by vacuum%nmzd in the first dimension, but only filled up to
      65             :       !! vacuum%nmzxyd for any star but the first.
      66             :       !!
      67             :       !! In practice, the density looks as follows:
      68             :       !! $$$$
      69             :       USE m_constants
      70             :       USE m_grdchlh
      71             :       USE m_qsf
      72             :       USE m_cylbes
      73             :       USE m_dcylbs
      74             :       USE m_vacuz
      75             :       USE m_vacudz
      76             :       USE m_types
      77             :       USE m_types_vacdos
      78             :       USE m_types_dos
      79             :       USE m_npy
      80             :       
      81             :       IMPLICIT NONE
      82             :       
      83             :       TYPE(t_lapw),     INTENT(IN)    :: lapw !I just removed the assignment and made lapw INTENT(IN).
      84             :       TYPE(t_banddos),  INTENT(IN)    :: banddos
      85             :       TYPE(t_input),    INTENT(IN)    :: input
      86             :       TYPE(t_vacuum),   INTENT(IN)    :: vacuum
      87             :       TYPE(t_noco),     INTENT(IN)    :: noco
      88             :       TYPE(t_nococonv), INTENT(IN)    :: nococonv
      89             :       TYPE(t_stars),    INTENT(IN)    :: stars
      90             :       TYPE(t_cell),     INTENT(IN)    :: cell
      91             :       TYPE(t_atoms),    INTENT(IN)    :: atoms
      92             :       TYPE(t_mat),      INTENT(IN)    :: zMat
      93             :       TYPE(t_potden),   INTENT(INOUT) :: den
      94             :       TYPE(t_vacdos),   INTENT(INOUT) :: vacdos
      95             :       TYPE(t_dos),      INTENT(INOUT) :: dos
      96             : 
      97             :       INTEGER,          INTENT (IN)   :: jspin
      98             :       INTEGER,          INTENT (IN)   :: ne
      99             :       INTEGER,          INTENT (IN)   :: ikpt
     100             : 
     101             :       INTEGER,          INTENT(IN)    :: ev_list(ne)
     102             :       REAL,             INTENT(IN)    :: evac(2,input%jspins)
     103             :       REAL,             INTENT(IN)    :: we(input%neig)
     104             :       REAL,             INTENT(IN)    :: vz(:,:,:) !(vacuum%nmzd,ivac,ispin)
     105             : 
     106             :       ! Optional DFPT variables
     107             :       TYPE(t_lapw), OPTIONAL, INTENT(IN) :: lapwq
     108             :       TYPE(t_mat),  OPTIONAL, INTENT(IN) :: zMat1
     109             :       REAL,         OPTIONAL, INTENT(IN) :: we1(:)
     110             :       
     111             :       ! STM/unused arguments
     112             :       !TYPE(t_gVacMap),  INTENT(IN)    :: gVacMap ! STM
     113             :       !REAL,    INTENT (IN)    :: eig(input%neig)
     114             :       !TYPE(t_sym),      INTENT(IN)    :: sym
     115             : 
     116             :       COMPLEX :: aa, ab, av, ba, bb, bv, t1, factorx, factory, c_1, tempCmplx
     117             :       REAL    :: arg, const, eps, ev, evacp, phs, phsp, qout, scale, sign, &
     118             :                  uei, uej, ui, uj, wronk, zks, RESULT(1), ui2, uei2, &
     119             :                  k_diff,k_d1,k_d2
     120             :       INTEGER :: ii, i1, i2, i3, ig3, ig3p, ik, ind2, ind2p, ivac, j, jj, &
     121             :                  jz, k, ikG, ll, ikGPr, n, n2, ispin, kspin, jsp_start, jsp_end, &
     122             :                  ie, isp_start, isp_end, nv2_outer
     123             :       LOGICAL :: l_dfpt
     124             : 
     125         140 :       INTEGER :: nv2(input%jspins)
     126         140 :       INTEGER :: kvac1(lapw%dim_nv2d(),input%jspins), kvac2(lapw%dim_nv2d(),input%jspins), map2(lapw%dim_nvd(),input%jspins)
     127             :       REAL    :: qssbti(3,2), v(3)
     128             : 
     129         140 :       COMPLEX, ALLOCATABLE :: ac(:,:,:), bc(:,:,:), t1jz(:)
     130         140 :       REAL,    ALLOCATABLE :: dt(:), dte(:)
     131         140 :       REAL,    ALLOCATABLE :: t(:), te(:), tei(:,:)
     132         140 :       REAL,    ALLOCATABLE :: u(:,:,:), ue(:,:,:), yy(:)
     133             : 
     134             :       ! DFPT stuff:
     135         140 :       COMPLEX, ALLOCATABLE :: ac1(:,:,:), bc1(:,:,:)
     136         140 :       REAL,    ALLOCATABLE :: dtq(:), dteq(:)
     137         140 :       REAL,    ALLOCATABLE :: tq(:), teq(:), teiq(:,:)
     138         140 :       REAL,    ALLOCATABLE :: uq(:,:,:), ueq(:,:,:)
     139         140 :       INTEGER :: nv2q(input%jspins)
     140         140 :       INTEGER :: kvac1q(lapw%dim_nv2d(),input%jspins), kvac2q(lapw%dim_nv2d(),input%jspins), map2q(lapw%dim_nvd(),input%jspins)
     141             : 
     142             :       ! local STM/unused variables
     143             :       !INTEGER              :: i,imz,ind1,ind1p,irec2,irec3,m,ipot
     144             :       !REAL                 :: ddui,dduj,dduei,dduej,ui_1,uei_1,uj_1,uej_1,wronk_1
     145             :       !COMPLEX              :: aa_1,ab_1,ba_1,bb_1,av_1,bv_1,aae,bbe,abe,bae,aaee,bbee,abee,baee,d
     146             :       !INTEGER              :: mapg2k(lapw%dim_nv2d())
     147             :       !INTEGER, PARAMETER   :: n2max=13
     148             :       !REAL,    PARAMETER   :: emax=2.0/hartree_to_ev_const
     149             :       !REAL,    ALLOCATABLE :: du(:),ddu(:,:),due(:),ddue(:,:),dummy(:)
     150             : 
     151         140 :       CALL timestart("vacden")
     152             : 
     153         140 :       l_dfpt = PRESENT(zMat1)
     154             : 
     155           0 :       ALLOCATE(ac(lapw%dim_nv2d(),input%neig,input%jspins), bc(lapw%dim_nv2d(),input%neig,input%jspins), dt(lapw%dim_nv2d()), &
     156             :                dte(lapw%dim_nv2d()), t(lapw%dim_nv2d()), te(lapw%dim_nv2d()), tei(lapw%dim_nv2d(),input%jspins), &
     157        4200 :                u(vacuum%nmzd,lapw%dim_nv2d(),input%jspins), ue(vacuum%nmzd,lapw%dim_nv2d(),input%jspins), yy(vacuum%nmzd))
     158         140 :       IF (l_dfpt) THEN
     159           0 :          ALLOCATE(ac1(lapw%dim_nv2d(),input%neig,input%jspins), bc1(lapw%dim_nv2d(),input%neig,input%jspins), dtq(lapw%dim_nv2d()), &
     160             :                   dteq(lapw%dim_nv2d()), tq(lapw%dim_nv2d()), teq(lapw%dim_nv2d()), teiq(lapw%dim_nv2d(),input%jspins), &
     161           0 :                   uq(vacuum%nmzd,lapw%dim_nv2d(),input%jspins), ueq(vacuum%nmzd,lapw%dim_nv2d(),input%jspins))
     162             :       END IF
     163             :       !ALLOCATE(du(vacuum%nmzd),ddu(vacuum%nmzd,lapw%dim_nv2d()),due(vacuum%nmzd),ddue(vacuum%nmzd,lapw%dim_nv2d()),)
     164             : 
     165         140 :       eps=0.01
     166             :       !     -----> set up mapping arrays
     167         140 :       IF (noco%l_ss) THEN
     168             :          jsp_start = 1
     169             :          jsp_end   = 2
     170             :       ELSE
     171         140 :          jsp_start = jspin
     172         140 :          jsp_end   = jspin
     173             :       END IF
     174             : 
     175         280 :       DO ispin = jsp_start, jsp_end
     176         140 :          n2 = 0
     177       56166 :          k_loop2: DO k = 1, lapw%nv(ispin)
     178     1414576 :             DO j = 1, n2
     179     1414576 :                IF (lapw%gvec(1,k,ispin).EQ.kvac1(j,ispin).AND.lapw%gvec(2,k,ispin).EQ.kvac2(j,ispin)) THEN
     180       47348 :                   map2(k,ispin) = j
     181       47348 :                   CYCLE k_loop2
     182             :                END IF
     183             :             END DO
     184        8678 :             n2 = n2 + 1
     185        8678 :             IF (n2>lapw%dim_nv2d()) CALL juDFT_error("vacden0","vacden")
     186        8678 :             kvac1(n2,ispin) = lapw%gvec(1,k,ispin)
     187        8678 :             kvac2(n2,ispin) = lapw%gvec(2,k,ispin)
     188        8818 :             map2(k,ispin) = n2
     189             :          END DO k_loop2
     190         280 :          nv2(ispin) = n2
     191             :       END DO
     192         140 :       IF (l_dfpt) THEN
     193           0 :          DO ispin = jsp_start, jsp_end
     194           0 :             n2 = 0
     195           0 :             k_loop2q: DO k = 1, lapwq%nv(ispin)
     196           0 :                DO j = 1, n2
     197           0 :                   IF (lapwq%gvec(1,k,ispin).EQ.kvac1q(j,ispin).AND.lapwq%gvec(2,k,ispin).EQ.kvac2q(j,ispin)) THEN
     198           0 :                      map2q(k,ispin) = j
     199           0 :                      CYCLE k_loop2q
     200             :                   END IF
     201             :                END DO
     202           0 :                n2 = n2 + 1
     203           0 :                IF (n2>lapw%dim_nv2d()) CALL juDFT_error("vacden0","vacden")
     204           0 :                kvac1q(n2,ispin) = lapwq%gvec(1,k,ispin)
     205           0 :                kvac2q(n2,ispin) = lapwq%gvec(2,k,ispin)
     206           0 :                map2q(k,ispin) = n2
     207             :             END DO k_loop2q
     208           0 :             nv2q(ispin) = n2
     209             :          END DO
     210             :       END IF
     211             : 
     212         140 :       IF ( noco%l_noco .AND. (.NOT. noco%l_ss) ) THEN
     213             :          !lapw%nv(2)  = lapw%nv(1) ! I just removed this and made lapw INTENT(IN).
     214           0 :          nv2(2) = nv2(1)
     215           0 :          DO k = 1,nv2(1)
     216           0 :             kvac1(k,2) = kvac1(k,1)
     217           0 :             kvac2(k,2) = kvac2(k,1)
     218             :          END DO
     219           0 :          DO k = 1,lapw%nv(1)
     220             :             !lapw%k3(k,2) = lapw%k3(k,1) ! I just removed this and made lapw INTENT(IN).
     221           0 :             map2(k,2) = map2(k,1)
     222             :          END DO
     223             :       END IF
     224             : 
     225             : !    !+dw
     226             : !    !    if tunneling current should be calculated we need to write out
     227             : !    !     info on electronic structure: --> mapping from kvac to gvac by mapg2k
     228             : !    !                                             shz, Jan.99
     229             : !    IF (.false.) then !vacuum%nstm.EQ.3
     230             : !       DO j=1, n2max
     231             : !          mapg2k(j)=j
     232             : !          DO i=1, nv2(jspin)
     233             : !             IF (kvac1(i,jspin).EQ.gVacMap%gvac1d(j).AND.kvac2(i,jspin).EQ.gVacMap%gvac2d(j)) mapg2k(j)=i
     234             : !          END DO
     235             : !       END DO
     236             : !    END IF
     237             : !    !
     238             : !    !-dw
     239             : 
     240         140 :       wronk = 2.0
     241         140 :       const = 1.0 / ( SQRT(cell%omtil)*wronk )
     242         320 :       DO  ivac = 1,vacuum%nvac
     243      460048 :          ac(:,:,:) = CMPLX(0.0,0.0)
     244      460048 :          bc(:,:,:) = CMPLX(0.0,0.0)
     245         180 :          IF (l_dfpt) THEN
     246           0 :             ac1(:,:,:) = CMPLX(0.0,0.0)
     247           0 :             bc1(:,:,:) = CMPLX(0.0,0.0)
     248             :          END IF
     249         180 :          sign = 3. - 2.*ivac
     250             : 
     251         180 :          IF (noco%l_noco) THEN
     252             :             !--->    In a non-collinear calculation vacden is only called once.
     253             :             !--->    Thus, the vaccum wavefunctions and the A- and B-coeff. (ac bc)
     254             :             !--->    have to be calculated for both spins on that call.
     255             :             !--->       setup the spin-spiral q-vector
     256           0 :             qssbti(1,1) = - nococonv%qss(1)/2
     257           0 :             qssbti(2,1) = - nococonv%qss(2)/2
     258           0 :             qssbti(1,2) = + nococonv%qss(1)/2
     259           0 :             qssbti(2,2) = + nococonv%qss(2)/2
     260           0 :             qssbti(3,1) = - nococonv%qss(3)/2
     261           0 :             qssbti(3,2) = + nococonv%qss(3)/2
     262           0 :             DO ispin = 1,input%jspins
     263             :                !     -----> set up vacuum wave functions
     264           0 :                evacp = evac(ivac,ispin)
     265           0 :                DO ik = 1,nv2(ispin)
     266           0 :                   v(1) = lapw%bkpt(1) + kvac1(ik,ispin) + qssbti(1,ispin)
     267           0 :                   v(2) = lapw%bkpt(2) + kvac2(ik,ispin) + qssbti(2,ispin)
     268           0 :                   v(3) = 0.
     269             :                   
     270           0 :                   ev = evacp - 0.5*DOT_PRODUCT(v,MATMUL(v,cell%bbmat))
     271             : 
     272             :                   CALL vacuz(ev,vz(:,ivac,ispin),vz(vacuum%nmz,ivac,ispin),vacuum%nmz,vacuum%delz,t(ik),&
     273           0 :                              dt(ik),u(1,ik,ispin))
     274             :                   CALL vacudz(ev,vz(:,ivac,ispin),vz(vacuum%nmz,ivac,ispin),vacuum%nmz,vacuum%delz,te(ik),&
     275             :                               dte(ik),tei(ik,ispin),ue(1,ik,ispin),dt(ik),&
     276           0 :                               u(1,ik,ispin))
     277             :                   
     278           0 :                   scale = wronk/ (te(ik)*dt(ik)-dte(ik)*t(ik))
     279           0 :                   te(ik) = scale*te(ik)
     280           0 :                   dte(ik) = scale*dte(ik)
     281           0 :                   tei(ik,ispin) = scale*tei(ik,ispin)
     282           0 :                   DO j = 1,vacuum%nmz
     283           0 :                      ue(j,ik,ispin) = scale*ue(j,ik,ispin)
     284             :                   END DO
     285             :                END DO
     286             :                 !     -----> construct a and b coefficients
     287           0 :                DO k = 1,lapw%nv(ispin)
     288             :                   !--->          the coefficients of the spin-down basis functions are
     289             :                   !--->          stored in the second half of the eigenvector
     290           0 :                   kspin = (lapw%nv(1)+atoms%nlotot)*(ispin-1) + k
     291           0 :                   ikG = map2(k,ispin)
     292           0 :                   zks = lapw%k3(k,ispin)*cell%bmat(3,3)*sign
     293           0 :                   arg = zks*cell%z1
     294           0 :                   c_1 = CMPLX(COS(arg),SIN(arg)) * const
     295           0 :                   av = -c_1 * CMPLX( dte(ikG),zks*te(ikG) )
     296           0 :                   bv =  c_1 * CMPLX(  dt(ikG),zks* t(ikG) )
     297             :                   !     -----> loop over basis functions
     298           0 :                   IF (zmat%l_real) THEN
     299           0 :                      ac(ikG,:ne,ispin) = ac(ikG,:ne,ispin) + zMat%data_r(kspin,:ne)*av
     300           0 :                      bc(ikG,:ne,ispin) = bc(ikG,:ne,ispin) + zMat%data_r(kspin,:ne)*bv
     301             :                   ELSE
     302           0 :                      ac(ikG,:ne,ispin) = ac(ikG,:ne,ispin) + zMat%data_c(kspin,:ne)*av
     303           0 :                      bc(ikG,:ne,ispin) = bc(ikG,:ne,ispin) + zMat%data_c(kspin,:ne)*bv
     304             :                   END IF
     305             :                END DO
     306             :                !--->       end of spin loop
     307             :             END DO
     308             :             !--->       output for testing
     309             :             !            DO k = 1,10
     310             :             !               DO n = 1,5
     311             :             !                  DO ispin = 1,jspins
     312             :             !                     write(*,9000)k,n,ispin,ac(k,n,ispin),bc(k,n,ispin)
     313             :             !                  ENDDO
     314             :             !               ENDDO
     315             :             !            ENDDO
     316             :             ! 9000       FORMAT('k=',i3,' ie=',i3,' isp=',i3,
     317             :             !     +             ' ac= (',e12.6,',',e12.6,')',
     318             :             !     +             ' bc= (',e12.6,',',e12.6,')')
     319             :          ELSE
     320             :             !     -----> set up vacuum wave functions
     321         180 :             evacp = evac(ivac,jspin)
     322       10938 :             DO ik = 1,nv2(jspin)
     323       10758 :                v(1) = lapw%bkpt(1) + kvac1(ik,jspin)
     324       10758 :                v(2) = lapw%bkpt(2) + kvac2(ik,jspin)
     325       10758 :                v(3) = 0.
     326             : 
     327      172128 :                ev = evacp - 0.5*DOT_PRODUCT(v,MATMUL(v,cell%bbmat))
     328             :                
     329       10758 :                CALL vacuz(ev,vz(:,ivac,jspin),vz(vacuum%nmz,ivac,jspin),vacuum%nmz,vacuum%delz,t(ik),dt(ik),u(1,ik,jspin))
     330             :                CALL vacudz(ev,vz(:,ivac,jspin),vz(vacuum%nmz,ivac,jspin),vacuum%nmz,vacuum%delz,te(ik),&
     331       10758 :                            dte(ik),tei(ik,jspin),ue(1,ik,jspin),dt(ik),u(1,ik,jspin))
     332             : 
     333       10758 :                scale = wronk/ (te(ik)*dt(ik)-dte(ik)*t(ik))
     334       10758 :                te(ik) = scale*te(ik)
     335       10758 :                dte(ik) = scale*dte(ik)
     336       10758 :                tei(ik,jspin) = scale*tei(ik,jspin)
     337     2700438 :                DO j = 1,vacuum%nmz
     338     2700258 :                   ue(j,ik,jspin) = scale*ue(j,ik,jspin)
     339             :                END DO
     340             :             END DO
     341         180 :             IF (l_dfpt) THEN
     342           0 :                DO ik = 1,nv2q(jspin)
     343           0 :                   v(1) = lapwq%bkpt(1) + kvac1q(ik,jspin) + lapwq%qphon(1)
     344           0 :                   v(2) = lapwq%bkpt(2) + kvac2q(ik,jspin) + lapwq%qphon(2)
     345           0 :                   v(3) = 0.
     346             : 
     347           0 :                   ev = evacp - 0.5*DOT_PRODUCT(v,MATMUL(v,cell%bbmat))
     348             :                   
     349           0 :                   CALL vacuz(ev,vz(:,ivac,jspin),vz(vacuum%nmz,ivac,jspin),vacuum%nmz,vacuum%delz,tq(ik),dtq(ik),uq(1,ik,jspin))
     350             :                   CALL vacudz(ev,vz(:,ivac,jspin),vz(vacuum%nmz,ivac,jspin),vacuum%nmz,vacuum%delz,teq(ik),&
     351           0 :                               dteq(ik),teiq(ik,jspin),ueq(1,ik,jspin),dtq(ik),uq(1,ik,jspin))
     352             : 
     353           0 :                   scale = wronk/ (teq(ik)*dtq(ik)-dteq(ik)*tq(ik))
     354           0 :                   teq(ik) = scale*teq(ik)
     355           0 :                   dteq(ik) = scale*dteq(ik)
     356           0 :                   teiq(ik,jspin) = scale*teiq(ik,jspin)
     357           0 :                   DO j = 1,vacuum%nmz
     358           0 :                      ueq(j,ik,jspin) = scale*ueq(j,ik,jspin)
     359             :                   END DO
     360             :                END DO
     361             :             END IF
     362             :             !     -----> construct a and b coefficients
     363       75006 :             DO k = 1,lapw%nv(jspin)
     364       74826 :                ikG = map2(k,jspin)
     365       74826 :                zks = lapw%k3(k,jspin)*cell%bmat(3,3)*sign
     366       74826 :                arg = zks*cell%z1
     367       74826 :                c_1 = CMPLX(COS(arg),SIN(arg)) * const
     368       74826 :                av = -c_1 * CMPLX( dte(ikG),zks*te(ikG) )
     369       74826 :                bv =  c_1 * CMPLX(  dt(ikG),zks* t(ikG) )
     370             :                !     -----> loop over basis functions
     371       75006 :                IF (zmat%l_real) THEN
     372      645575 :                   ac(ikG,:ne,jspin) = ac(ikG,:ne,jspin) + zMat%data_r(k,:ne)*av
     373      645575 :                   bc(ikG,:ne,jspin) = bc(ikG,:ne,jspin) + zMat%data_r(k,:ne)*bv
     374             :                ELSE
     375      600904 :                   ac(ikG,:ne,jspin) = ac(ikG,:ne,jspin) + zMat%data_c(k,:ne)*av
     376      600904 :                   bc(ikG,:ne,jspin) = bc(ikG,:ne,jspin) + zMat%data_c(k,:ne)*bv
     377             :                END IF
     378             :             END DO
     379         180 :             IF (l_dfpt) THEN
     380           0 :                DO k = 1,lapwq%nv(jspin)
     381           0 :                   ikG = map2q(k,jspin)
     382           0 :                   zks = lapwq%k3(k,jspin)*cell%bmat(3,3)*sign
     383           0 :                   arg = zks*cell%z1
     384           0 :                   c_1 = CMPLX(COS(arg),SIN(arg)) * const
     385           0 :                   av = -c_1 * CMPLX( dteq(ikG),zks*teq(ikG) )
     386           0 :                   bv =  c_1 * CMPLX(  dtq(ikG),zks* tq(ikG) )
     387             :                   !     -----> loop over basis functions
     388           0 :                   ac1(ikG,:ne,jspin) = ac1(ikG,:ne,jspin) + 2*zMat1%data_c(k,:ne)*av
     389           0 :                   bc1(ikG,:ne,jspin) = bc1(ikG,:ne,jspin) + 2*zMat1%data_c(k,:ne)*bv
     390             :                END DO
     391             :             END IF
     392             :          END IF
     393             :        !
     394             :        !   ----> calculate first and second derivative of u,ue
     395             :        !        in order to simulate p_z or d_z^2 Tip in Chen's model , shz. 97
     396             :        !
     397             : !       IF (.false.) THEN !vacuum%nstm.GT.0
     398             : !          DO  ik = 1,nv2(jspin)
     399             : !             !               CALL rhzgrd(nmz,delz,u(1,ik,jspin),4,du,ddu(1,ik))
     400             : !             !               CALL rhzgrd(nmz,delz,ue(1,ik,jspin),4,due,ddue(1,ik))
     401             : !
     402             : !             ALLOCATE ( dummy(vacuum%nmz) )
     403             : !             CALL grdchlh(&
     404             : !                  vacuum%delz,u(1:vacuum%nmz,ik,jspin),&
     405             : !                  du,ddu(:,ik),order=4)
     406             : !             CALL grdchlh(&
     407             : !                  vacuum%delz,ue(1:vacuum%nmz,ik,jspin),&
     408             : !                  due,ddue(:,ik),order=4)
     409             : !             DEALLOCATE ( dummy )
     410             : !
     411             : !             IF (.FALSE.) THEN !IF (vacuum%nstm.EQ.1) THEN
     412             : !                u(:vacuum%nmz,ik,jspin)=du(:vacuum%nmz)
     413             : !                ue(:vacuum%nmz,ik,jspin)=due(:vacuum%nmz)
     414             : !             END IF
     415             : !          ENDDO
     416             : !       END IF
     417             : 
     418             :        !+dw
     419             : 
     420             :        !
     421             :        !       --> to calculate Tunneling Current between two systems
     422             :        !           within Bardeens Approach one needs ac(l,n), bc(l,n);
     423             :        !           they are written to the file vacwave
     424             :        !                           IF nstm=3
     425             :        !                              tworkf is then the fermi energy (in hartree)
     426             :        !
     427             : !       IF (.false.)then !(vacuum%nstm.EQ.3) THEN
     428             : !#ifdef CPP_MPI
     429             : !          CALL judft_error("nstm==3 does not work in parallel",calledby="vacden")
     430             : !#else
     431             : !          i=0
     432             : !          DO n = 1, ne
     433             : !             IF (ABS(eig(n)-banddos%tworkf).LE.emax) i=i+1
     434             : !          END DO
     435             : !          WRITE (87,FMT=990) lapw%bkpt(1),lapw%bkpt(2), i, n2max
     436             : !          DO n = 1, ne
     437             : !             IF (ABS(eig(n)-banddos%tworkf).LE.emax) THEN
     438             : !                WRITE (87,FMT=1000) eig(n)
     439             : !                DO j=1,n2max
     440             : !                   WRITE (87,FMT=1010) ac(mapg2k(j),n,jspin),&
     441             : !                        bc(mapg2k(j),n,jspin)
     442             : !                END DO
     443             : !             END IF
     444             : !          END DO
     445             : !#endif
     446             : !       END IF
     447             : !990    FORMAT(2(f8.4,1x),i3,1x,i3)
     448             : !1000   FORMAT(e12.4)
     449             : !1010   FORMAT(2(2e20.8,1x))
     450             :        !
     451             :        !        ------------------------------------------------------------
     452             :        !-dw
     453             :        !
     454             :        !---->   non-warping part of the density (g=0 star)
     455             :        !
     456             : !       IF (.false.) then !vacuum%nstm.EQ.2) THEN
     457             : !          !
     458             : !          !  ----> d_z^2-Tip needs: |d^2(psi)/dz^2 - kappa^2/3 psi|^2
     459             : !          !
     460             : !          DO l = 1,nv2(jspin)
     461             : !             aa = 0.0
     462             : !             bb = 0.0
     463             : !             ba = 0.0
     464             : !             ab = 0.0
     465             : !             DO n = 1,ne
     466             : !                aa = aa + we(n)*CONJG(ac(l,n,jspin))*ac(l,n,jspin)
     467             : !                bb = bb + we(n)*CONJG(bc(l,n,jspin))*bc(l,n,jspin)
     468             : !                ab = ab + we(n)*CONJG(ac(l,n,jspin))*bc(l,n,jspin)
     469             : !                ba = ba + we(n)*CONJG(bc(l,n,jspin))*ac(l,n,jspin)
     470             : !                qout = REAL(CONJG(ac(l,n,jspin))*ac(l,n,jspin)+tei(l,jspin)*CONJG(bc(l,n,jspin))*bc(l,n,jspin))
     471             : !                vacdos%qvac(ev_list(n),ivac,ikpt,jspin) = vacdos%qvac(ev_list(n),ivac,ikpt,jspin) + qout*cell%area
     472             : !                dos%qTot(ev_list(n),ikpt,jspin) = dos%qTot(ev_list(n),ikpt,jspin) + qout*cell%area
     473             : !             END DO
     474             : !             aae=-aa*banddos%tworkf*2/3
     475             : !             bbe=-bb*banddos%tworkf*2/3
     476             : !             abe=-ab*banddos%tworkf*2/3
     477             : !             bae=-ba*banddos%tworkf*2/3
     478             : !             aaee=aa*banddos%tworkf*banddos%tworkf*4/9
     479             : !             bbee=bb*banddos%tworkf*banddos%tworkf*4/9
     480             : !             abee=ab*banddos%tworkf*banddos%tworkf*4/9
     481             : !             baee=ba*banddos%tworkf*banddos%tworkf*4/9
     482             : !             DO  jz = 1,vacuum%nmz
     483             : !                ui = u(jz,l,jspin)
     484             : !                uei = ue(jz,l,jspin)
     485             : !                ddui = ddu(jz,l)
     486             : !                dduei = ddue(jz,l)
     487             : !                den%vacz(jz,ivac,jspin) = den%vacz(jz,ivac,jspin) +&
     488             : !                     REAL(aaee*ui*ui+bbee*uei*uei+&
     489             : !                     (abee+baee)*ui*uei+aa*ddui*ddui+&
     490             : !                     bb*dduei*dduei+(ab+ba)*ddui*dduei+&
     491             : !                     2*aae*ui*ddui+2*bbe*uei*dduei+&
     492             : !                     (abe+bae)*(ui*dduei+uei*ddui))
     493             : !
     494             : !             ENDDO
     495             : !          END DO
     496             : !          !
     497             : !          !    -----> s-Tip: |psi|^2 and p-Tip: |d(psi)/dz|^2
     498             : !          !
     499             : !       ELSE
     500         180 :          IF (noco%l_noco) THEN
     501             :             !--->          diagonal elements of the density matrix, n_11 and n_22
     502             :             !--->          the non-warping part of n_21 is calculated together with
     503             :             !--->          the warping part of n_21
     504           0 :             DO ispin = 1,input%jspins
     505           0 :                DO ikG = 1,nv2(ispin)
     506             :                   aa = 0.0
     507             :                   bb = 0.0
     508             :                   ba = 0.0
     509             :                   ab = 0.0
     510           0 :                   DO n = 1,ne
     511           0 :                      aa=aa + we(n)*CONJG(ac(ikG,n,ispin))*ac(ikG,n,ispin)
     512           0 :                      bb=bb + we(n)*CONJG(bc(ikG,n,ispin))*bc(ikG,n,ispin)
     513           0 :                      ab=ab + we(n)*CONJG(ac(ikG,n,ispin))*bc(ikG,n,ispin)
     514           0 :                      ba=ba + we(n)*CONJG(bc(ikG,n,ispin))*ac(ikG,n,ispin)
     515           0 :                      qout = REAL(CONJG(ac(ikG,n,ispin))*ac(ikG,n,ispin)+tei(ikG,ispin)*CONJG(bc(ikG,n,ispin))*bc(ikG,n,ispin))
     516           0 :                      vacdos%qvac(ev_list(n),ivac,ikpt,ispin) = vacdos%qvac(ev_list(n),ivac,ikpt,ispin) + qout*cell%area
     517           0 :                      dos%qTot(ev_list(n),ikpt,ispin) = dos%qTot(ev_list(n),ikpt,ispin) + qout*cell%area
     518             :                   END DO
     519           0 :                   DO jz = 1,vacuum%nmz
     520           0 :                      ui = u(jz,ikG,ispin)
     521           0 :                      uei = ue(jz,ikG,ispin)
     522           0 :                      den%vac(jz,1,ivac,ispin) = den%vac(jz,1,ivac,ispin) + REAL(aa*ui*ui+bb*uei*uei+(ab+ba)*ui*uei) ! TODO: AN TB; sollte man das REAL killen? 
     523             :                   END DO
     524             :                END DO  
     525             :             END DO
     526         720 :          ELSE IF ((.NOT.l_dfpt).OR.(norm2(stars%center)<1e-8)) THEN
     527       10938 :             DO ikG = 1,nv2(jspin)
     528             :                aa = CMPLX(0.0,0.0)
     529             :                bb = CMPLX(0.0,0.0)
     530             :                ba = CMPLX(0.0,0.0)
     531             :                ab = CMPLX(0.0,0.0)
     532      186571 :                DO n = 1,ne
     533      175813 :                   IF (.NOT.l_dfpt) THEN
     534      175813 :                      aa = aa + we(n)*CONJG(ac(ikG,n,jspin))*ac(ikG,n,jspin)
     535      175813 :                      bb = bb + we(n)*CONJG(bc(ikG,n,jspin))*bc(ikG,n,jspin)
     536      175813 :                      ab = ab + we(n)*CONJG(ac(ikG,n,jspin))*bc(ikG,n,jspin)
     537      175813 :                      ba = ba + we(n)*CONJG(bc(ikG,n,jspin))*ac(ikG,n,jspin)
     538             :                   ELSE
     539           0 :                      aa = aa + we1(n)*CONJG(ac(ikG,n,jspin))*ac(ikG,n,jspin)
     540           0 :                      bb = bb + we1(n)*CONJG(bc(ikG,n,jspin))*bc(ikG,n,jspin)
     541           0 :                      ab = ab + we1(n)*CONJG(ac(ikG,n,jspin))*bc(ikG,n,jspin)
     542           0 :                      ba = ba + we1(n)*CONJG(bc(ikG,n,jspin))*ac(ikG,n,jspin)
     543           0 :                      aa = aa + we(n)*CONJG(ac(ikG,n,jspin))*ac1(ikG,n,jspin)
     544           0 :                      bb = bb + we(n)*CONJG(bc(ikG,n,jspin))*bc1(ikG,n,jspin)
     545           0 :                      ab = ab + we(n)*CONJG(ac(ikG,n,jspin))*bc1(ikG,n,jspin)
     546           0 :                      ba = ba + we(n)*CONJG(bc(ikG,n,jspin))*ac1(ikG,n,jspin)
     547             :                   END IF
     548      175813 :                   qout = REAL(CONJG(ac(ikG,n,jspin))*ac(ikG,n,jspin)+tei(ikG,jspin)*CONJG(bc(ikG,n,jspin))*bc(ikG,n,jspin))
     549      175813 :                   vacdos%qvac(ev_list(n),ivac,ikpt,jspin) = vacdos%qvac(ev_list(n),ivac,ikpt,jspin) + qout*cell%area
     550      186571 :                   dos%qTot(ev_list(n),ikpt,jspin) = dos%qTot(ev_list(n),ikpt,jspin) + qout*cell%area
     551             :                END DO
     552     2700438 :                DO  jz = 1,vacuum%nmz
     553     2689500 :                   ui = u(jz,ikG,jspin)
     554     2689500 :                   uei = ue(jz,ikG,jspin)
     555     2700258 :                   IF (.NOT.l_dfpt) THEN
     556     2689500 :                      den%vac(jz,1,ivac,jspin) = den%vac(jz,1,ivac,jspin) +REAL(aa*ui*ui+bb*uei*uei+(ab+ba)*ui*uei) ! TODO: REAL weg?
     557             :                   ELSE
     558           0 :                      den%vac(jz,1,ivac,jspin) = den%vac(jz,1,ivac,jspin) + aa*ui*ui+bb*uei*uei+(ab+ba)*ui*uei
     559             :                   END IF
     560             :                END DO
     561             :             END DO
     562             :          END IF
     563             : !       END IF
     564             :        !
     565             :        !     ****************** change for vacuum density of states shz Jan.96 ***
     566             :        !
     567         180 :          IF (banddos%vacdos) THEN
     568             :           !
     569             :           !  ----> d_z^2-Tip needs: |d^2(psi)/dz^2 - kappa^2/3 psi|^2
     570             :           !
     571             : !          IF (.false.) THEN !IF (vacuum%nstm.EQ.2) THEN
     572             : !             DO l=1,nv2(jspin)
     573             : !                DO n = 1,ne
     574             : !                   aa = CONJG(ac(l,n,jspin))*ac(l,n,jspin)
     575             : !                   bb = CONJG(bc(l,n,jspin))*bc(l,n,jspin)
     576             : !                   ab = CONJG(ac(l,n,jspin))*bc(l,n,jspin)
     577             : !                   ba = CONJG(bc(l,n,jspin))*ac(l,n,jspin)
     578             : !                   aae = -banddos%tworkf*aa*2/3
     579             : !                   bbe = -banddos%tworkf*bb*2/3
     580             : !                   abe = -banddos%tworkf*ab*2/3
     581             : !                   bae = -banddos%tworkf*ba*2/3
     582             : !                   aaee = aa*banddos%tworkf*banddos%tworkf*4/9
     583             : !                   bbee = bb*banddos%tworkf*banddos%tworkf*4/9
     584             : !                   abee = ab*banddos%tworkf*banddos%tworkf*4/9
     585             : !                   baee = ba*banddos%tworkf*banddos%tworkf*4/9
     586             : !                   DO jj = 1,banddos%layers
     587             : !                      !
     588             : !                      !     ----> either integrated LDOS(z1,z2) or LDOS(z1)
     589             : !                      !
     590             : !                      IF (input%integ) THEN
     591             : !                         ll = 1
     592             : !                         DO ii = banddos%izlay(jj,1),banddos%izlay(jj,2)
     593             : !                            ui = u(ii,l,jspin)
     594             : !                            uei = ue(ii,l,jspin)
     595             : !                            ddui = ddu(ii,l)
     596             : !                            dduei = ddue(ii,l)
     597             : !                            yy(ll) = REAL(aaee*ui*ui+bbee*uei*uei+(abee+baee)*ui*uei+aa*ddui*ddui+bb*&
     598             : !                                 dduei*dduei+(ab+ba)*ddui*dduei+2*aae*ui*ddui+2*bbe*uei*dduei+&
     599             : !                                 (abe+bae)*(ui*dduei+uei*ddui))*cell%area
     600             : !                            ll = ll+1
     601             : !                         END DO
     602             : !                         CALL qsf(vacuum%delz,yy,RESULT,ll-1,0)
     603             : !                         vacdos%qvlay(ev_list(n),jj,ivac,ikpt,jspin) = vacdos%qvlay(ev_list(n),jj,ivac,ikpt,jspin) + RESULT(1)
     604             : !                      ELSE
     605             : !                         ui = u(banddos%izlay(jj,1),l,jspin)
     606             : !                         uei = ue(banddos%izlay(jj,1),l,jspin)
     607             : !                         ddui = ddu(banddos%izlay(jj,1),l)
     608             : !                         dduei = ddue(banddos%izlay(jj,1),l)
     609             : !                         yy(1) = REAL(aaee*ui*ui+bbee*uei*uei+&
     610             : !                              (abee+baee)*ui*uei+aa*ddui*ddui+&
     611             : !                              bb*dduei*dduei+(ab+ba)*ddui*dduei+&
     612             : !                              2*aae*ui*ddui+2*bbe*uei*dduei+&
     613             : !                              (abe+bae)*(ui*dduei+uei*ddui))
     614             : !                         vacdos%qvlay(ev_list(n),jj,ivac,ikpt,jspin) = vacdos%qvlay(ev_list(n),jj,ivac,ikpt,jspin) +yy (1)
     615             : !                      END IF
     616             : !                   END DO
     617             : !                END DO
     618             : !             END DO
     619             : !             !
     620             : !             !     ----> s-Tip = calculate LDOS and(!) p_z-Tip (since u->du/dz, ue->due/dz)
     621             : !             !
     622             : !          ELSE
     623           0 :             IF (ABS(banddos%locx(1)-banddos%locx(2)).LE.eps) THEN
     624             :                !----> integrated over 2D-unit cell
     625           0 :                IF (noco%l_noco) THEN
     626             :                   isp_start = 1
     627             :                   isp_end   = input%jspins
     628             :                ELSE
     629           0 :                   isp_start = jspin
     630           0 :                   isp_end   = jspin
     631             :                END IF
     632           0 :                DO ispin = isp_start, isp_end
     633           0 :                   DO ikG=1,nv2(ispin)
     634           0 :                      DO n = 1,ne
     635           0 :                         aa = CONJG(ac(ikG,n,ispin))*ac(ikG,n,ispin)
     636           0 :                         bb = CONJG(bc(ikG,n,ispin))*bc(ikG,n,ispin)
     637           0 :                         ab = CONJG(ac(ikG,n,ispin))*bc(ikG,n,ispin)
     638           0 :                         ba = CONJG(bc(ikG,n,ispin))*ac(ikG,n,ispin)
     639           0 :                         DO jj = 1,banddos%layers
     640             :                            !---> either integrated (z1,z2) or slice (z1)
     641           0 :                            IF (input%integ) THEN
     642           0 :                               ll = 1
     643           0 :                               DO ii = banddos%izlay(jj,1),banddos%izlay(jj,2)
     644           0 :                                  ui = u(ii,ikG,ispin)
     645           0 :                                  uei = ue(ii,ikG,ispin)
     646           0 :                                  yy(ll) = REAL(aa*ui*ui+bb*uei*uei+(ab+ba)*ui*uei)
     647           0 :                                  ll = ll+1
     648             :                               END DO
     649           0 :                               CALL qsf(vacuum%delz,yy,RESULT,ll-1,0)
     650           0 :                               vacdos%qvlay(ev_list(n),jj,ivac,ikpt,ispin) = vacdos%qvlay(ev_list(n),jj,ivac,ikpt,ispin) + RESULT(1)
     651             :                            ELSE
     652           0 :                               ui = u(banddos%izlay(jj,1),ikG,ispin)
     653           0 :                               uei = ue(banddos%izlay(jj,1),ikG,ispin)
     654             :                               vacdos%qvlay(ev_list(n),jj,ivac,ikpt,ispin) = vacdos%qvlay(ev_list(n),jj,ivac,ikpt,ispin) &
     655           0 :                                                                           + REAL(aa*ui*ui+bb*uei*uei+(ab+ba)*ui*uei)
     656             : 
     657             :                            END IF
     658             :                         END DO
     659             :                      END DO
     660             :                   END DO
     661             :                END DO
     662             :             ELSE
     663             :                !----> if LDOS should be calculated over restricted area of the 2D-unit cell
     664             :                !     lower left corner: (locx(1), locy(1))   }  in internal
     665             :                !     upper right corner: (locx(2), locy(2))  }  coordinates
     666             :                !
     667           0 :                DO ikG=1, nv2(jspin)
     668           0 :                   DO ikGPr=1, nv2(jspin)
     669           0 :                      IF (kvac1(ikG,jspin).EQ.kvac1(ikGPr,jspin)) THEN
     670           0 :                         factorx = CMPLX((banddos%locx(2)-banddos%locx(1)), 0.)
     671             :                      ELSE
     672           0 :                         k_diff=tpi_const*(kvac1(ikG,jspin)-kvac1(ikGPr,jspin))
     673           0 :                         k_d1 = k_diff*banddos%locx(1)
     674           0 :                         k_d2 = k_diff*banddos%locx(2)
     675             :                         factorx=(CMPLX( COS(k_d2), SIN(k_d2)) - &
     676             :                                  CMPLX( COS(k_d1), SIN(k_d1)) ) / &
     677           0 :                                  CMPLX( 0.,k_diff )
     678             :                      END IF
     679           0 :                      IF (kvac2(ikG,jspin).EQ.kvac2(ikGPr,jspin)) THEN
     680           0 :                         factory = CMPLX((banddos%locy(2)-banddos%locy(1)), 0.)
     681             :                      ELSE
     682           0 :                         k_diff=tpi_const*(kvac2(ikG,jspin)-kvac2(ikGPr,jspin))
     683           0 :                         k_d1 = k_diff*banddos%locy(1)
     684           0 :                         k_d2 = k_diff*banddos%locy(2)
     685             :                         factory=(CMPLX( COS(k_d2), SIN(k_d2)) - &
     686             :                                  CMPLX( COS(k_d1), SIN(k_d1)) ) / &
     687           0 :                                  CMPLX( 0.,k_diff )
     688             :                      END IF
     689           0 :                      DO n=1, ne
     690           0 :                         aa = CONJG(ac(ikGPr,n,jspin))*ac(ikG,n,jspin)
     691           0 :                         bb = CONJG(bc(ikGPr,n,jspin))*bc(ikG,n,jspin)
     692           0 :                         ab = CONJG(ac(ikGPr,n,jspin))*bc(ikG,n,jspin)
     693           0 :                         ba = CONJG(bc(ikGPr,n,jspin))*ac(ikG,n,jspin)
     694           0 :                         DO jj = 1,banddos%layers
     695             :                            !---> either integrated (z1,z2) or slice (z1)
     696           0 :                            IF (input%integ) THEN
     697           0 :                               ll = 1
     698           0 :                               DO ii = banddos%izlay(jj,1), banddos%izlay(jj,2)
     699           0 :                                  ui = u(ii,ikG,jspin)
     700           0 :                                  uei = ue(ii,ikG,jspin)
     701           0 :                                  uj = u(ii,ikGPr,jspin)
     702           0 :                                  uej = ue(ii,ikGPr,jspin)
     703           0 :                                  yy(ll) = REAL((aa*ui*uj+bb*uei*uej+ab*uei*uj+ba*ui*uej)*factorx*factory)
     704           0 :                                  ll = ll+1
     705             :                               END DO
     706           0 :                               CALL qsf(vacuum%delz,yy,RESULT,ll-1,0)
     707           0 :                               vacdos%qvlay(ev_list(n),jj,ivac,ikpt,jspin) = vacdos%qvlay(ev_list(n),jj,ivac,ikpt,jspin) + RESULT(1)
     708             :                            ELSE
     709           0 :                               ui = u(banddos%izlay(jj,1),ikG,jspin)
     710           0 :                               uei = ue(banddos%izlay(jj,1),ikG,jspin)
     711           0 :                               uj = u(banddos%izlay(jj,1),ikGPr,jspin)
     712           0 :                               uej = ue(banddos%izlay(jj,1),ikGPr,jspin)
     713           0 :                               vacdos%qvlay(ev_list(n),jj,ivac,ikpt,jspin) = REAL((aa*ui*uj + bb*uei*uej+ab*uei*uj+ba*ui**uej)*factorx*factory)
     714             :                            END IF
     715             :                         END DO
     716             :                      END DO
     717             :                   END DO
     718             :                END DO
     719             :             END IF
     720             :           !END IF
     721             :          END IF
     722             :        !
     723             :        !     **********************************************************************
     724             :        !
     725             :        !--->    warping part of the density (g.ne.0 stars)
     726             :        !
     727             :        !   ---> d_z^2-Tip
     728             :        !
     729             : !       if (.false.) then !IF (vacuum%nstm.EQ.2) THEN
     730             : !          DO l = 1,nv2(jspin)
     731             : !             DO  l1 = 1,l - 1
     732             : !                i1 = kvac1(l,jspin) - kvac1(l1,jspin)
     733             : !                i2 = kvac2(l,jspin) - kvac2(l1,jspin)
     734             : !                i3 = 0
     735             : !                IF (iabs(i1).GT.stars%mx1) CYCLE
     736             : !                IF (iabs(i2).GT.stars%mx2) CYCLE
     737             : !                ig3 = stars%ig(i1,i2,i3)
     738             : !                IF (ig3.EQ.0)  CYCLE
     739             : !                phs = stars%rgphs(i1,i2,i3)
     740             : !                ig3p = stars%ig(-i1,-i2,i3)
     741             : !                phsp = stars%rgphs(-i1,-i2,i3)
     742             : !                ind2 = stars%ig2(ig3)
     743             : !                ind2p = stars%ig2(ig3p)
     744             : !                aa = 0.0
     745             : !                bb = 0.0
     746             : !                ba = 0.0
     747             : !                ab = 0.0
     748             : !                DO n = 1,ne
     749             : !                   aa = aa + we(n)*CONJG(ac(l1,n,jspin))*ac(l,n,jspin)
     750             : !                   bb = bb + we(n)*CONJG(bc(l1,n,jspin))*bc(l,n,jspin)
     751             : !                   ab = ab + we(n)*CONJG(ac(l1,n,jspin))*bc(l,n,jspin)
     752             : !                   ba = ba + we(n)*CONJG(bc(l1,n,jspin))*ac(l,n,jspin)
     753             : !                END DO
     754             : !                aae=-aa*2/3*banddos%tworkf
     755             : !                bbe=-bb*2/3*banddos%tworkf
     756             : !                abe=-ab*2/3*banddos%tworkf
     757             : !                bae=-ba*2/3*banddos%tworkf
     758             : !                aaee=aa*4/9*banddos%tworkf*banddos%tworkf
     759             : !                bbee=bb*4/9*banddos%tworkf*banddos%tworkf
     760             : !                abee=ab*4/9*banddos%tworkf*banddos%tworkf
     761             : !                baee=ba*4/9*banddos%tworkf*banddos%tworkf
     762             : !                DO  jz = 1,vacuum%nmzxy
     763             : !                   ui = u(jz,l,jspin)
     764             : !                   uj = u(jz,l1,jspin)
     765             : !                   ddui = ddu(jz,l)
     766             : !                   dduj = ddu(jz,l1)
     767             : !                   uei = ue(jz,l,jspin)
     768             : !                   uej = ue(jz,l1,jspin)
     769             : !                   dduei = ddue(jz,l)
     770             : !                   dduej = ddue(jz,l1)
     771             : !                   t1=aaee*ui*uj+bbee*uei*uej+baee*ui*uej+abee*uei*uj&
     772             : !                        + aae*(ui*dduj+uj*ddui)+bbe*(uei*dduej+uej*dduei)&
     773             : !                        + abe*(ui*dduej+uj*dduei)+bae*(ddui*uej+dduj*uei)&
     774             : !                        + aa*ddui*dduj+bb*dduei*dduej+ba*ddui*dduej&
     775             : !                        + ab*dduei*dduj
     776             : !                   den%vacxy(jz,ind2-1,ivac,jspin) = den%vacxy(jz,ind2-1,ivac,jspin) + t1*phs/stars%nstr2(ind2)
     777             : !                   den%vacxy(jz,ind2p-1,ivac,jspin)= den%vacxy(jz,ind2p-1,ivac,jspin) + CONJG(t1)*phsp/stars%nstr2(ind2p)
     778             : !                ENDDO
     779             : !             ENDDO
     780             : !          END DO
     781             : !          !
     782             : !          ! ---> s-Tip and p_z-Tip
     783             : !          !
     784             : !       ELSE
     785             :           !=============================================================
     786             :           !           continuation of vacden....
     787             :           !=============================================================
     788         180 :          IF (noco%l_noco) THEN
     789             :             !--->       diagonal elements of the density matrix, n_11 and n_22
     790           0 :             CALL timestart("vacden4_noco")
     791           0 :             DO ispin = 1,input%jspins
     792           0 :                DO ikG = 1,nv2(ispin)
     793           0 :                   DO ikGPr = 1, ikG - 1
     794           0 :                      i1 = kvac1(ikG,ispin) - kvac1(ikGPr,ispin)
     795           0 :                      i2 = kvac2(ikG,ispin) - kvac2(ikGPr,ispin)
     796           0 :                      i3 = 0
     797           0 :                      IF (iabs(i1).GT.stars%mx1) CYCLE
     798           0 :                      IF (iabs(i2).GT.stars%mx2) CYCLE
     799           0 :                      ig3 = stars%ig(i1,i2,i3)
     800           0 :                      IF (ig3.EQ.0)  CYCLE
     801           0 :                      phs = stars%rgphs(i1,i2,i3)
     802           0 :                      ig3p = stars%ig(-i1,-i2,i3)
     803           0 :                      phsp = stars%rgphs(-i1,-i2,i3)
     804           0 :                      ind2 = stars%ig2(ig3)
     805           0 :                      ind2p = stars%ig2(ig3p)
     806           0 :                      aa = 0.0
     807           0 :                      bb = 0.0
     808           0 :                      ba = 0.0
     809           0 :                      ab = 0.0
     810           0 :                      DO n = 1,ne
     811           0 :                         aa=aa+we(n)*CONJG(ac(ikGPr,n,ispin))*ac(ikG,n,ispin)
     812           0 :                         bb=bb+we(n)*CONJG(bc(ikGPr,n,ispin))*bc(ikG,n,ispin)
     813           0 :                         ab=ab+we(n)*CONJG(ac(ikGPr,n,ispin))*bc(ikG,n,ispin)
     814           0 :                         ba=ba+we(n)*CONJG(bc(ikGPr,n,ispin))*ac(ikG,n,ispin)
     815             :                      END DO
     816           0 :                      DO jz = 1,vacuum%nmzxy
     817           0 :                         ui = u(jz,ikG,ispin)
     818           0 :                         uj = u(jz,ikGPr,ispin)
     819           0 :                         uei = ue(jz,ikG,ispin)
     820           0 :                         uej = ue(jz,ikGPr,ispin)
     821           0 :                         t1 = aa*ui*uj+bb*uei*uej+ba*ui*uej+ab*uei*uj
     822           0 :                         den%vac(jz,ind2,ivac,ispin) = den%vac(jz,ind2,ivac,ispin) + t1*phs/stars%nstr2(ind2)
     823           0 :                         den%vac(jz,ind2p,ivac,ispin) = den%vac(jz,ind2p,ivac,ispin) + CONJG(t1)*phsp/stars%nstr2(ind2p)
     824             :                      END DO
     825             :                   END DO
     826             :                END DO
     827             :             END DO
     828             :             !--->          off-diagonal element of the density matrix, n_21
     829           0 :             DO ikG = 1,nv2(1)
     830           0 :                DO  ikGPr = 1,nv2(2)
     831           0 :                   i1 = kvac1(ikG,1) - kvac1(ikGPr,2)
     832           0 :                   i2 = kvac2(ikG,1) - kvac2(ikGPr,2)
     833           0 :                   i3 = 0
     834             :                   !--->                treat only the warping part
     835           0 :                   IF (iabs(i1).GT.stars%mx1) CYCLE
     836           0 :                   IF (iabs(i2).GT.stars%mx2) CYCLE
     837           0 :                   ig3 = stars%ig(i1,i2,i3)
     838           0 :                   IF (ig3.EQ.0)  CYCLE
     839           0 :                   phs = stars%rgphs(i1,i2,i3)
     840           0 :                   ind2 = stars%ig2(ig3)
     841           0 :                   IF ( ind2.EQ.1) THEN
     842             :                      !--->                non-warping part (1st star G=0)
     843             :                      aa = 0.0
     844             :                      bb = 0.0
     845             :                      ba = 0.0
     846             :                      ab = 0.0
     847           0 :                      DO ie = 1,ne
     848           0 :                         aa=aa+we(ie)*CONJG(ac(ikGPr,ie,2))*ac(ikG,ie,1)
     849           0 :                         bb=bb+we(ie)*CONJG(bc(ikGPr,ie,2))*bc(ikG,ie,1)
     850           0 :                         ab=ab+we(ie)*CONJG(ac(ikGPr,ie,2))*bc(ikG,ie,1)
     851           0 :                         ba=ba+we(ie)*CONJG(bc(ikGPr,ie,2))*ac(ikG,ie,1)
     852             :                      END DO
     853           0 :                      DO jz = 1,vacuum%nmz
     854           0 :                         ui = u(jz,ikG,1)
     855           0 :                         ui2 = u(jz,ikGPr,2)
     856           0 :                         uei = ue(jz,ikG,1)
     857           0 :                         uei2 = ue(jz,ikGPr,2)
     858           0 :                         tempCmplx = aa*ui2*ui + bb*uei2*uei + ab*ui2*uei + ba*uei2*ui
     859           0 :                         den%vac(jz,1,ivac,3) = den%vac(jz,1,ivac,3) + CONJG(tempCmplx) !!!! MAGIC MINUS
     860             :                      END DO
     861             :                   ELSE
     862             :                      !--->                warping part
     863             :                      aa = 0.0
     864             :                      bb = 0.0
     865             :                      ba = 0.0
     866             :                      ab = 0.0
     867           0 :                      DO ie = 1,ne
     868           0 :                         aa=aa + we(ie)*CONJG(ac(ikGPr,ie,2))*ac(ikG,ie,1)
     869           0 :                         bb=bb + we(ie)*CONJG(bc(ikGPr,ie,2))*bc(ikG,ie,1)
     870           0 :                         ab=ab + we(ie)*CONJG(ac(ikGPr,ie,2))*bc(ikG,ie,1)
     871           0 :                         ba=ba + we(ie)*CONJG(bc(ikGPr,ie,2))*ac(ikG,ie,1)
     872             :                      END DO
     873           0 :                      DO jz = 1,vacuum%nmzxy
     874           0 :                         ui = u(jz,ikG,1)
     875           0 :                         uj = u(jz,ikGPr,2)
     876           0 :                         uei = ue(jz,ikG,1)
     877           0 :                         uej = ue(jz,ikGPr,2)
     878           0 :                         t1 = aa*ui*uj+bb*uei*uej+ba*ui*uej+ab*uei*uj
     879           0 :                         den%vac(jz,ind2,ivac,3) = den%vac(jz, ind2,ivac,3) + conjg(t1*phs/stars%nstr2(ind2))
     880             :                      END DO
     881             :                   END IF
     882             :                END DO
     883             :             END DO
     884           0 :             CALL timestop("vacden4_noco")
     885             :          ELSE ! collinear part
     886         180 :             IF (.NOT.l_dfpt) THEN
     887         180 :                nv2_outer = nv2(jspin)
     888             :             ELSE
     889           0 :                nv2_outer = nv2q(jspin)
     890             :             END IF
     891             :             !$OMP PARALLEL DEFAULT(none) &
     892             :             !$OMP SHARED(nv2,nv2_outer,jspin,kvac1,kvac2,kvac1q,kvac2q,stars,ne,we,we1,vacuum,den,ac,bc,ac1,bc1,u,ue,uq,ueq,ivac,l_dfpt) &
     893             :             !$OMP PRIVATE(ikGPr,i1,i2,i3,ig3,phs,ig3p,phsp,ind2,ind2p,n,jz,ui,uj,uei,uej)&
     894         180 :             !$OMP PRIVATE(aa,bb,ab,ba,t1jz,ikG) 
     895             :             ALLOCATE(t1jz(vacuum%nmzxy))
     896             :             !$OMP DO SCHEDULE(dynamic,5)
     897             :             DO ikG = 1, nv2_outer
     898             :                IF (.NOT.l_dfpt) THEN
     899             :                   DO ikGPr = 1, ikG - 1
     900             :                      i1 = kvac1(ikG,jspin) - kvac1(ikGPr,jspin)
     901             :                      i2 = kvac2(ikG,jspin) - kvac2(ikGPr,jspin)
     902             :                      i3 = 0
     903             :                      ig3 = stars%ig(i1,i2,i3)
     904             :                      ind2 = stars%ig2(ig3)
     905             :                      !IF (ind2 .ne.stars%ig2(ig3)) CYCLE
     906             :                      IF (iabs(i1).GT.stars%mx1) CYCLE
     907             :                      IF (iabs(i2).GT.stars%mx2) CYCLE
     908             :                      IF (ig3.EQ.0)  CYCLE
     909             :                      phs = stars%rgphs(i1,i2,i3)
     910             :                      ig3p = stars%ig(-i1,-i2,i3)
     911             :                      phsp = stars%rgphs(-i1,-i2,i3)
     912             :                      ind2p = stars%ig2(ig3p)
     913             :                      aa = 0.0
     914             :                      bb = 0.0
     915             :                      ba = 0.0
     916             :                      ab = 0.0
     917             :                      DO n = 1,ne
     918             :                         aa=aa+we(n)*CONJG(ac(ikGPr,n,jspin))*ac(ikG,n,jspin)
     919             :                         bb=bb+we(n)*CONJG(bc(ikGPr,n,jspin))*bc(ikG,n,jspin)
     920             :                         ab=ab+we(n)*CONJG(ac(ikGPr,n,jspin))*bc(ikG,n,jspin)
     921             :                         ba=ba+we(n)*CONJG(bc(ikGPr,n,jspin))*ac(ikG,n,jspin)
     922             :                      END DO
     923             :                      DO  jz = 1,vacuum%nmzxy
     924             :                         ui = u(jz,ikG,jspin)
     925             :                         uj = u(jz,ikGPr,jspin)
     926             :                         uei = ue(jz,ikG,jspin)
     927             :                         uej = ue(jz,ikGPr,jspin)
     928             :                         t1jz(jz) = aa*ui*uj+bb*uei*uej+ba*ui*uej+ab*uei*uj
     929             :                      END DO
     930             :                      !$OMP CRITICAL ! (denvacxy,denvac)
     931             :                      den%vac(:vacuum%nmzxy,ind2,ivac,jspin) = den%vac(:vacuum%nmzxy,ind2, ivac,jspin) &
     932             :                                                             + t1jz(:vacuum%nmzxy)*phs/stars%nstr2(ind2)
     933             :                      den%vac(:vacuum%nmzxy,ind2p,ivac,jspin) = den%vac(:vacuum%nmzxy,ind2p,ivac,jspin) &
     934             :                                                             + CONJG(t1jz(:vacuum%nmzxy))*phsp/stars%nstr2(ind2p)
     935             :                      !$OMP END CRITICAL ! (denvacxy,denvac)
     936             :                   END DO
     937             :                ELSE
     938             :                   DO ikGPr = 1, nv2(jspin)
     939             :                      i1 = kvac1q(ikG,jspin) - kvac1(ikGPr,jspin)
     940             :                      i2 = kvac2q(ikG,jspin) - kvac2(ikGPr,jspin)
     941             :                      i3 = 0
     942             :                      ig3 = stars%ig(i1,i2,i3)
     943             :                      ind2 = stars%ig2(ig3)
     944             :                      IF ((ind2==1).AND.(norm2(stars%center)<1e-8)) CYCLE
     945             :                      IF (iabs(i1).GT.stars%mx1) CYCLE
     946             :                      IF (iabs(i2).GT.stars%mx2) CYCLE
     947             :                      IF (ig3.EQ.0) CYCLE
     948             :                      phs = stars%rgphs(i1,i2,i3)
     949             :                      aa = 0.0
     950             :                      bb = 0.0
     951             :                      ba = 0.0
     952             :                      ab = 0.0
     953             :                      DO n = 1,ne
     954             :                         aa=aa+we(n)*CONJG(ac(ikGPr,n,jspin))*ac1(ikG,n,jspin)
     955             :                         bb=bb+we(n)*CONJG(bc(ikGPr,n,jspin))*bc1(ikG,n,jspin)
     956             :                         ab=ab+we(n)*CONJG(ac(ikGPr,n,jspin))*bc1(ikG,n,jspin)
     957             :                         ba=ba+we(n)*CONJG(bc(ikGPr,n,jspin))*ac1(ikG,n,jspin)
     958             :                         IF (norm2(stars%center)<1e-8) THEN
     959             :                            aa=aa+we1(n)*CONJG(ac(ikGPr,n,jspin))*ac(ikG,n,jspin)
     960             :                            bb=bb+we1(n)*CONJG(bc(ikGPr,n,jspin))*bc(ikG,n,jspin)
     961             :                            ab=ab+we1(n)*CONJG(ac(ikGPr,n,jspin))*bc(ikG,n,jspin)
     962             :                            ba=ba+we1(n)*CONJG(bc(ikGPr,n,jspin))*ac(ikG,n,jspin)
     963             :                         END IF
     964             :                      END DO
     965             :                      DO  jz = 1,vacuum%nmzxy
     966             :                         ui = uq(jz,ikG,jspin)
     967             :                         uj = u(jz,ikGPr,jspin)
     968             :                         uei = ueq(jz,ikG,jspin)
     969             :                         uej = ue(jz,ikGPr,jspin)
     970             :                         t1jz(jz) = aa*ui*uj+bb*uei*uej+ba*ui*uej+ab*uei*uj
     971             :                      END DO
     972             :                      !$OMP CRITICAL ! (denvacxy,denvac)
     973             :                      den%vac(:vacuum%nmzxy,ind2,ivac,jspin) = den%vac(:vacuum%nmzxy,ind2, ivac,jspin) &
     974             :                                                             + t1jz(:vacuum%nmzxy)*phs/stars%nstr2(ind2)
     975             :                      !$OMP END CRITICAL ! (denvacxy,denvac)
     976             :                   END DO
     977             :                END IF
     978             :             END DO
     979             :             !$OMP END DO
     980             :             DEALLOCATE(t1jz)
     981             :             !$OMP END PARALLEL
     982             :          END IF
     983             :        !END IF
     984             :       !=============================================================
     985             :       !
     986             :       !       calculate 1. to nstars. starcoefficient for each k and energy eigenvalue
     987             :       !           to vacdos%qstars(ne,layer,ivac,ikpt) if starcoeff=T (the star coefficient values are written to vacdos)
     988             :       !
     989         320 :          IF (banddos%starcoeff .AND. banddos%vacdos) THEN
     990           0 :             DO  n=1,ne
     991           0 :                DO ikG = 1,nv2(jspin)
     992           0 :                   DO ikGPr = 1, ikG - 1
     993           0 :                      i1 = kvac1(ikG,jspin) - kvac1(ikGPr,jspin)
     994           0 :                      i2 = kvac2(ikG,jspin) - kvac2(ikGPr,jspin)
     995           0 :                      i3 = 0
     996           0 :                      IF (iabs(i1).GT.stars%mx1) CYCLE
     997           0 :                      IF (iabs(i2).GT.stars%mx2) CYCLE
     998           0 :                      ig3 = stars%ig(i1,i2,i3)
     999           0 :                      IF (ig3.EQ.0)  CYCLE
    1000           0 :                      ind2 = stars%ig2(ig3)
    1001           0 :                      ig3p = stars%ig(-i1,-i2,i3)
    1002           0 :                      ind2p = stars%ig2(ig3p)
    1003           0 :                      IF ((ind2.GE.2.AND.ind2.LE.banddos%nstars).OR.&
    1004           0 :                         (ind2p.GE.2.AND.ind2p.LE.banddos%nstars)) THEN
    1005           0 :                         phs = stars%rgphs(i1,i2,i3)
    1006           0 :                         phsp = stars%rgphs(-i1,-i2,i3)
    1007           0 :                         aa = CONJG(ac(ikGPr,n,jspin))*ac(ikG,n,jspin)
    1008           0 :                         bb = CONJG(bc(ikGPr,n,jspin))*bc(ikG,n,jspin)
    1009           0 :                         ab = CONJG(ac(ikGPr,n,jspin))*bc(ikG,n,jspin)
    1010           0 :                         ba = CONJG(bc(ikGPr,n,jspin))*ac(ikG,n,jspin)
    1011           0 :                         DO jj = 1,banddos%layers
    1012           0 :                            ui = u(banddos%izlay(jj,1),ikG,jspin)
    1013           0 :                            uj = u(banddos%izlay(jj,1),ikGPr,jspin)
    1014           0 :                            uei = ue(banddos%izlay(jj,1),ikG,jspin)
    1015           0 :                            uej = ue(banddos%izlay(jj,1),ikGPr,jspin)
    1016           0 :                            t1 = aa*ui*uj + bb*uei*uej +ba*ui*uej + ab*uei*uj
    1017           0 :                            IF (ind2.GE.2.AND.ind2.LE.banddos%nstars) &
    1018           0 :                                vacdos%qstars(ind2-1,ev_list(n),jj,ivac,ikpt,jspin) = vacdos%qstars(ind2-1,ev_list(n),jj,ivac,ikpt,jspin)+ t1*phs/stars%nstr2(ind2)
    1019           0 :                            IF (ind2p.GE.2.AND.ind2p.LE.banddos%nstars) &
    1020           0 :                                vacdos%qstars(ind2p-1,ev_list(n),jj,ivac,ikpt,jspin) = vacdos%qstars(ind2p-1,ev_list(n),jj,ivac,ikpt,jspin) +CONJG(t1)*phs/stars%nstr2(ind2p)
    1021             :                         END DO
    1022             :                      END IF
    1023             :                   END DO
    1024             :                END DO
    1025             :             END DO
    1026             :          END IF
    1027             :       END DO ! vacuum loop
    1028         140 :       DEALLOCATE (ac,bc,dt,dte,t,te,tei,u,ue,yy )
    1029             : 
    1030             : !    DEALLOCATE (du,ddu,due,ddue)
    1031             :     !IF(vacuum%nvac.EQ.1) THEN
    1032             :     !   den%vacz(:,2,:) = den%vacz(:,1,:)
    1033             :     !   IF (sym%invs) THEN
    1034             :     !      den%vacxy(:,:,2,:) = CONJG(den%vacxy(:,:,1,:))
    1035             :     !   ELSE
    1036             :     !      den%vacxy(:,:,2,:) = den%vacxy(:,:,1,:)
    1037             :     !   END IF
    1038             :     !END IF
    1039             : 
    1040         140 :       CALL timestop("vacden")
    1041             : 
    1042         140 :    END SUBROUTINE vacden
    1043             : END MODULE m_vacden

Generated by: LCOV version 1.14