LCOV - code coverage report
Current view: top level - cdn - eparas.f90 (source / functions) Hit Total Coverage
Test: FLEUR test coverage Lines: 108 123 87.8 %
Date: 2024-04-24 04:44:14 Functions: 1 1 100.0 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------
       2             : ! Copyright (c) 2016 Peter Grünberg Institut, Forschungszentrum Jülich, Germany
       3             : ! This file is part of FLEUR and available as free software under the conditions
       4             : ! of the MIT license as expressed in the LICENSE file in more detail.
       5             : !--------------------------------------------------------------------------------
       6             : 
       7             : MODULE m_eparas
       8             :   !***********************************************************************
       9             :   ! Calculates qlo, enerlo and sqlo, which are needed to determine the
      10             :   ! new energy parameters.
      11             :   ! Philipp Kurz 99/04
      12             :   !***********************************************************************
      13             :   ! also the 'normal' energy parameters are now included...
      14             :   !
      15             :   ! if (l_mcd) then mcd contains mcd spectrum: first index = polarization
      16             :   ! second = core level ; third = band index                  gb.2001
      17             :   ! corrected to work also for multiple LO's of same l at the same atom
      18             :   !                                                           gb.2005
      19             :   !*************** ABBREVIATIONS *****************************************
      20             :   ! qlo     : charge density of one local orbital at the current k-point
      21             :   ! sqlo    : qlo integrated over the Brillouin zone
      22             :   ! enerlo  : qlo*energy integrated over the Brillouin zone
      23             :   !***********************************************************************
      24             :   !
      25             : CONTAINS
      26        8018 :   SUBROUTINE eparas(jsp,atoms,banddos,noccbd,ev_list,fmpi,ikpt,ne,we,eig,skip_t,l_evp,eigVecCoeffs,&
      27             :                     usdus,regCharges,dos,mcd)
      28             :     USE m_types
      29             :     use m_types_dos
      30             :     use m_types_mcd
      31             :     IMPLICIT NONE
      32             :     TYPE(t_usdus),         INTENT(IN)    :: usdus
      33             :     TYPE(t_mpi),           INTENT(IN)    :: fmpi
      34             :     TYPE(t_atoms),         INTENT(IN)    :: atoms
      35             :     TYPE(t_banddos),       INTENT(IN)    :: banddos
      36             :     TYPE(t_eigVecCoeffs),  INTENT(IN)    :: eigVecCoeffs
      37             :     TYPE(t_regionCharges), INTENT(INOUT) :: regCharges
      38             :     TYPE(t_dos),           INTENT(INOUT) :: dos
      39             :     TYPE(t_mcd), OPTIONAL, INTENT(INOUT) :: mcd
      40             :     !     ..
      41             :     !     .. Scalar Arguments ..
      42             :     INTEGER, INTENT (IN) :: noccbd,jsp
      43             :     INTEGER, INTENT (IN) :: ne,ikpt  ,skip_t
      44             :     LOGICAL, INTENT (IN) :: l_evp
      45             :     INTEGER, INTENT (IN) :: ev_list(noccbd)
      46             :     !     ..
      47             :     !     .. Array Arguments ..
      48             :     REAL,    INTENT (IN)  :: eig(:)!(input%neig),
      49             :     REAL,    INTENT (IN)  :: we(noccbd)
      50             : 
      51             :     !     ..
      52             :     !     .. Local Scalars ..
      53             :     INTEGER i,l,lo,lop ,natom,nn,ntyp,m,n_dos
      54             :     INTEGER nt1,nt2,lm,n,ll1,ipol,icore,index
      55             :     REAL fac
      56             :     COMPLEX suma,sumb,sumab,sumba,sumaa,sumbb
      57             :     !     ..
      58             :     !     .. Local Arrays ..
      59        8018 :     REAL qlo(noccbd,atoms%nlod,atoms%nlod,atoms%ntype)
      60        8018 :     REAL qaclo(noccbd,atoms%nlod,atoms%ntype),qbclo(noccbd,atoms%nlod,atoms%ntype)
      61        8018 :     LOGICAL atomTypeCovered(atoms%ntype)
      62             :     !     ..
      63             :     !
      64             :     !---> initialize ener, sqal, enerlo and sqlo on first call
      65             :     !
      66             : 
      67        8018 :     IF ((ikpt.LE.fmpi%isize).AND..NOT.l_evp) THEN
      68        2004 :        regCharges%ener(:,:,jsp) = 0.0
      69        2004 :        regCharges%sqal(:,:,jsp) = 0.0
      70        1052 :        regCharges%enerlo(:,:,jsp) = 0.0
      71        1052 :        regCharges%sqlo(:,:,jsp) = 0.0
      72       13868 :        dos%qal(:,:,:,ikpt,jsp) = 0.0
      73             :     END IF
      74             : 
      75       25290 :     atomTypeCovered(:) = .FALSE.
      76             :     !--->    l-decomposed density for each occupied state
      77             :     !
      78             :     !         DO 140 i = (skip_t+1),ne    ! this I need for all states
      79      113628 :     DO i = 1,ne              ! skip in next loop
      80      121596 :        DO n_dos = 1,size(banddos%dos_typelist)
      81        7968 :          n=banddos%dos_typelist(n_dos)
      82        7968 :          atomTypeCovered(n) = .TRUE.
      83        7968 :          fac = 1./atoms%neq(n)
      84        7968 :          nt1 = atoms%firstAtom(n)
      85        7968 :          nt2 = nt1 + atoms%neq(n) - 1
      86       39840 :          DO l = 0,3
      87       31872 :            suma = CMPLX(0.,0.)
      88       31872 :            sumb = CMPLX(0.,0.)
      89       31872 :            ll1 = l* (l+1)
      90      159360 :            DO m = -l,l
      91      127488 :              lm = ll1 + m
      92      159360 :              IF (.NOT.banddos%l_mcd) THEN
      93      377856 :                 DO natom = nt1,nt2
      94      250368 :                    suma = suma + eigVecCoeffs%abcof(i,lm,0,natom,jsp)*CONJG(eigVecCoeffs%abcof(i,lm,0,natom,jsp))
      95      377856 :                    sumb = sumb + eigVecCoeffs%abcof(i,lm,1,natom,jsp)*CONJG(eigVecCoeffs%abcof(i,lm,1,natom,jsp))
      96             :                 ENDDO
      97             :              ELSE
      98             :                sumaa = CMPLX(0.,0.) ; sumab = CMPLX(0.,0.)
      99             :                sumbb = CMPLX(0.,0.) ; sumba = CMPLX(0.,0.)
     100           0 :                DO natom = nt1,nt2
     101           0 :                  sumaa = sumaa + eigVecCoeffs%abcof(i,lm,0,natom,jsp)*CONJG(eigVecCoeffs%abcof(i,lm,0,natom,jsp))
     102           0 :                  sumbb = sumbb + eigVecCoeffs%abcof(i,lm,1,natom,jsp)*CONJG(eigVecCoeffs%abcof(i,lm,1,natom,jsp))
     103           0 :                  sumab = sumab + eigVecCoeffs%abcof(i,lm,0,natom,jsp) *CONJG(eigVecCoeffs%abcof(i,lm,1,natom,jsp))
     104           0 :                  sumba = sumba + eigVecCoeffs%abcof(i,lm,1,natom,jsp) *CONJG(eigVecCoeffs%abcof(i,lm,0,natom,jsp))
     105             :                ENDDO
     106           0 :                DO icore = 1, mcd%ncore(n)
     107           0 :                  DO ipol = 1, 3
     108           0 :                    index = 3*(n_dos-1) + ipol
     109             :                    mcd%mcd(index,icore,ev_list(i),ikpt,jsp) = mcd%mcd(index,icore,ev_list(i),ikpt,jsp) + fac * &
     110             :                       (sumaa * CONJG(mcd%m_mcd(icore,lm+1,index,1))*mcd%m_mcd(icore,lm+1,index,1) + &
     111             :                        sumbb * CONJG(mcd%m_mcd(icore,lm+1,index,2))*mcd%m_mcd(icore,lm+1,index,2) + &
     112             :                        sumab * CONJG(mcd%m_mcd(icore,lm+1,index,2))*mcd%m_mcd(icore,lm+1,index,1) + &
     113           0 :                        sumba * CONJG(mcd%m_mcd(icore,lm+1,index,1))*mcd%m_mcd(icore,lm+1,index,2))
     114             :                  ENDDO
     115             :                ENDDO
     116             :              ENDIF     ! end MCD
     117             :            ENDDO
     118       31872 :            dos%qal(l,n_dos,ev_list(i),ikpt,jsp) = (suma+sumb*usdus%ddn(l,n,jsp))/atoms%neq(n)
     119       39840 :            dos%qTot(ev_list(i),ikpt,jsp) = dos%qTot(ev_list(i),ikpt,jsp) + (suma+sumb*usdus%ddn(l,n,jsp))
     120             :          ENDDO
     121             : 
     122      162154 :          DO l = 4, atoms%lmax(n)
     123       48576 :            suma = CMPLX(0.,0.)
     124       48576 :            sumb = CMPLX(0.,0.)
     125       48576 :            ll1 = l* (l+1)
     126      758496 :            DO m = -l,l
     127      709920 :              lm = ll1 + m
     128     1967616 :              DO natom = nt1,nt2
     129     1209120 :                 suma = suma + eigVecCoeffs%abcof(i,lm,0,natom,jsp)*CONJG(eigVecCoeffs%abcof(i,lm,0,natom,jsp))
     130     1919040 :                 sumb = sumb + eigVecCoeffs%abcof(i,lm,1,natom,jsp)*CONJG(eigVecCoeffs%abcof(i,lm,1,natom,jsp))
     131             :              ENDDO
     132             :            ENDDO
     133       56544 :            dos%qTot(ev_list(i),ikpt,jsp) = dos%qTot(ev_list(i),ikpt,jsp) + (suma+sumb*usdus%ddn(l,n,jsp))
     134             :          ENDDO
     135             : 
     136             :          
     137             :        ENDDO
     138             :     ENDDO
     139             : 
     140       25290 :     DO n = 1, atoms%ntype
     141       17272 :        IF(atomTypeCovered(n)) THEN
     142             :           CYCLE
     143             :        END IF
     144       17076 :        nt1 = atoms%firstAtom(n)
     145       17076 :        nt2 = nt1 + atoms%neq(n) - 1
     146      245056 :        DO i = 1,ne              ! skip in next loop
     147     2244064 :          DO l = 0, atoms%lmax(n)
     148     2006830 :            suma = CMPLX(0.,0.)
     149     2006830 :            sumb = CMPLX(0.,0.)
     150     2006830 :            ll1 = l* (l+1)
     151    20756840 :            DO m = -l,l
     152    18750010 :              lm = ll1 + m
     153    39854834 :              DO natom = nt1,nt2
     154    19097994 :                 suma = suma + eigVecCoeffs%abcof(i,lm,0,natom,jsp)*CONJG(eigVecCoeffs%abcof(i,lm,0,natom,jsp))
     155    37848004 :                 sumb = sumb + eigVecCoeffs%abcof(i,lm,1,natom,jsp)*CONJG(eigVecCoeffs%abcof(i,lm,1,natom,jsp))
     156             :              ENDDO
     157             :            ENDDO
     158     2226792 :            dos%qTot(ev_list(i),ikpt,jsp) = dos%qTot(ev_list(i),ikpt,jsp) + (suma+sumb*usdus%ddn(l,n,jsp))
     159             :          ENDDO
     160             :        ENDDO
     161             :     ENDDO
     162             : 
     163             : 
     164             :      !
     165             :     !--->    perform Brillouin zone integration and summation over the
     166             :     !--->    bands in order to determine the energy parameters for each
     167             :     !--->    atom and angular momentum
     168             :     !
     169       40090 :     DO l = 0,3
     170      109178 :       DO n = 1,atoms%ntype
     171      101160 :         if (banddos%map_atomtype(n)==0) then
     172      947640 :           DO i = (skip_t+1),noccbd
     173      879336 :             suma = CMPLX(0.,0.)
     174      879336 :             sumb = CMPLX(0.,0.)
     175     1776016 :             DO natom = atoms%firstAtom(n), atoms%firstAtom(n) + atoms%neq(n) - 1
     176     4483400 :               suma=suma+dot_product(eigVecCoeffs%abcof(i,l* (l+1)-l:l* (l+1)+l,0,natom,jsp),eigVecCoeffs%abcof(i,l* (l+1)-l:l* (l+1)+l,0,natom,jsp))
     177     5362736 :               sumb=sumb+dot_product(eigVecCoeffs%abcof(i,l* (l+1)-l:l* (l+1)+l,1,natom,jsp),eigVecCoeffs%abcof(i,l* (l+1)-l:l* (l+1)+l,1,natom,jsp))
     178             :             ENDDO
     179      879336 :             regCharges%ener(l,n,jsp) = regCharges%ener(l,n,jsp) + (suma+sumb*usdus%ddn(l,n,jsp))/atoms%neq(n)*we(i)*eig(i)
     180      947640 :             regCharges%sqal(l,n,jsp) = regCharges%sqal(l,n,jsp) + (suma+sumb*usdus%ddn(l,n,jsp))/atoms%neq(n)*we(i)
     181             :           ENDDO
     182             :         ELSE
     183         784 :           n_dos=banddos%map_atomtype(n)
     184             :           !data present in dos-type
     185       32656 :           DO i = (skip_t+1),noccbd
     186       31872 :             regCharges%ener(l,n,jsp) = regCharges%ener(l,n,jsp) + dos%qal(l,n_dos,ev_list(i),ikpt,jsp)*we(i)*eig(i)
     187       32656 :             regCharges%sqal(l,n,jsp) = regCharges%sqal(l,n,jsp) + dos%qal(l,n_dos,ev_list(i),ikpt,jsp)*we(i)
     188             :           ENDDO
     189             :         ENDIF
     190             :       ENDDO
     191             :     ENDDO
     192             : 
     193             :     !---> initialize qlo
     194             : 
     195      630374 :     qlo(:,:,:,:) = 0.0
     196      370138 :     qaclo(:,:,:) = 0.0
     197      370138 :     qbclo(:,:,:) = 0.0
     198             : 
     199             :     !---> density for each local orbital and occupied state
     200             : 
     201       25290 :     DO ntyp=1,atoms%ntype
     202       42866 :        DO nn = 1,atoms%neq(ntyp)
     203       17576 :          natom = atoms%firstAtom(ntyp) - 1
     204       17576 :          natom = natom + nn
     205       52428 :           DO lo = 1,atoms%nlo(ntyp)
     206       17580 :              l = atoms%llo(lo,ntyp)
     207       17580 :              ll1 = l* (l+1)
     208       59000 :              DO m = -l,l
     209       41420 :                 lm = ll1 + m
     210      698783 :                 DO i = 1,ne
     211             :                    qbclo(i,lo,ntyp) = qbclo(i,lo,ntyp) +REAL(&
     212             :                         eigVecCoeffs%abcof(i,lm,1,natom,jsp)*CONJG(eigVecCoeffs%ccof(m,i,lo,natom,jsp))+&
     213      639783 :                         eigVecCoeffs%ccof(m,i,lo,natom,jsp)*CONJG(eigVecCoeffs%abcof(i,lm,1,natom,jsp)) )
     214             :                    qaclo(i,lo,ntyp) = qaclo(i,lo,ntyp) + REAL(&
     215             :                         eigVecCoeffs%abcof(i,lm,0,natom,jsp)*CONJG(eigVecCoeffs%ccof(m,i,lo,natom,jsp))+&
     216      681203 :                         eigVecCoeffs%ccof(m,i,lo,natom,jsp)*CONJG(eigVecCoeffs%abcof(i,lm,0,natom,jsp)) )
     217             :                 ENDDO
     218             :              ENDDO
     219       65336 :              DO lop = 1,atoms%nlo(ntyp)
     220       47760 :                 IF (atoms%llo(lop,ntyp).EQ.l) THEN
     221       59160 :                    DO m = -l,l
     222      704835 :                       DO i = 1,ne
     223             :                          qlo(i,lop,lo,ntyp) = qlo(i,lop,lo,ntyp) +  REAL(&
     224      687215 :                               CONJG(eigVecCoeffs%ccof(m,i,lop,natom,jsp))*eigVecCoeffs%ccof(m,i,lo,natom,jsp))
     225             :                       ENDDO
     226             :                    ENDDO
     227             :                 ENDIF
     228             :              ENDDO
     229             :           ENDDO
     230             :        ENDDO
     231             :     ENDDO
     232             : 
     233             :     !---> perform brillouin zone integration and sum over bands
     234             : 
     235       25290 :     DO ntyp = 1,atoms%ntype
     236       17272 :        n_dos=banddos%map_atomtype(ntyp)
     237       42624 :        DO lo = 1,atoms%nlo(ntyp)
     238       17334 :           l = atoms%llo(lo,ntyp)
     239             :           ! llo > 3 used for unoccupied states only
     240       34606 :           IF(l.LE.3) THEN
     241      283474 :              DO i = 1,ne
     242      266140 :                 IF (n_dos>0) THEN
     243             :                   dos%qal(l,n_dos,ev_list(i),ikpt,jsp)= dos%qal(l,n_dos,ev_list(i),ikpt,jsp)  + ( 1.0/atoms%neq(ntyp) ) * &
     244        5808 :                      (qaclo(i,lo,ntyp)*usdus%uulon(lo,ntyp,jsp)+qbclo(i,lo,ntyp)*usdus%dulon(lo,ntyp,jsp))
     245             :                 ENDIF
     246             :                 dos%qTot(ev_list(i),ikpt,jsp) = dos%qTot(ev_list(i),ikpt,jsp) + &
     247      283474 :                    qaclo(i,lo,ntyp)*usdus%uulon(lo,ntyp,jsp)+qbclo(i,lo,ntyp)*usdus%dulon(lo,ntyp,jsp)
     248             :              END DO
     249       47124 :              DO lop = 1,atoms%nlo(ntyp)
     250       47124 :                 IF (atoms%llo(lop,ntyp).EQ.l) THEN
     251      285478 :                    DO i = 1,ne
     252      268104 :                       regCharges%enerlo(lo,ntyp,jsp) = regCharges%enerlo(lo,ntyp,jsp) +qlo(i,lop,lo,ntyp)*we(i)*eig(i)
     253      268104 :                       regCharges%sqlo(lo,ntyp,jsp) = regCharges%sqlo(lo,ntyp,jsp) + qlo(i,lop,lo,ntyp)*we(i)
     254      268104 :                       IF (n_dos>0) THEN
     255             :                          dos%qal(l,n_dos,ev_list(i),ikpt,jsp)= dos%qal(l,n_dos,ev_list(i),ikpt,jsp)  + ( 1.0/atoms%neq(ntyp) ) *&
     256        5808 :                            qlo(i,lop,lo,ntyp)*usdus%uloulopn(lop,lo,ntyp,jsp)
     257             :                       END IF
     258      285478 :                       dos%qTot(ev_list(i),ikpt,jsp) = dos%qTot(ev_list(i),ikpt,jsp) + qlo(i,lop,lo,ntyp)*usdus%uloulopn(lop,lo,ntyp,jsp)
     259             :                    ENDDO
     260             :                 ENDIF
     261             :              ENDDO
     262             :           ELSE
     263           0 :              DO i = 1,ne
     264             :                 dos%qTot(ev_list(i),ikpt,jsp) = dos%qTot(ev_list(i),ikpt,jsp) + &
     265           0 :                    qaclo(i,lo,ntyp)*usdus%uulon(lo,ntyp,jsp)+qbclo(i,lo,ntyp)*usdus%dulon(lo,ntyp,jsp)
     266             :              END DO
     267           0 :              DO lop = 1,atoms%nlo(ntyp)
     268           0 :                 IF (atoms%llo(lop,ntyp).EQ.l) THEN
     269           0 :                    DO i = 1,ne
     270           0 :                       dos%qTot(ev_list(i),ikpt,jsp) = dos%qTot(ev_list(i),ikpt,jsp) + qlo(i,lop,lo,ntyp)*usdus%uloulopn(lop,lo,ntyp,jsp)
     271             :                    ENDDO
     272             :                 ENDIF
     273             :              ENDDO
     274             :           END IF
     275             :        END DO
     276             :     END DO
     277             : 
     278        8018 :   END SUBROUTINE eparas
     279             : END MODULE m_eparas

Generated by: LCOV version 1.14