LCOV - code coverage report
Current view: top level - eigen - hsvac.F90 (source / functions) Hit Total Coverage
Test: FLEUR test coverage Lines: 65 69 94.2 %
Date: 2024-04-25 04:21:55 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             : MODULE m_hsvac
       7             :    USE m_juDFT
       8             : CONTAINS
       9             :    !-----------------------------------------------------------------------------
      10             :    ! Calculate the vacuum contribution to the Hamiltonian and Overlap matrix
      11             :    !-----------------------------------------------------------------------------
      12         288 :    SUBROUTINE hsvac(vacuum, stars, fmpi, jsp, input, v, evac, cell, &
      13         144 :                   & lapw, noco, nococonv, hmat, smat)
      14             : 
      15             :       USE m_vacfun
      16             :       USE m_types
      17             : 
      18             :       IMPLICIT NONE
      19             : 
      20             :       TYPE(t_input),INTENT(IN)      :: input
      21             :       TYPE(t_vacuum),INTENT(IN)     :: vacuum
      22             :       TYPE(t_noco),INTENT(IN)       :: noco
      23             :       TYPE(t_nococonv),INTENT(IN)       :: nococonv
      24             :       TYPE(t_stars),INTENT(IN)      :: stars
      25             :       TYPE(t_cell),INTENT(IN)       :: cell
      26             :       TYPE(t_lapw),INTENT(IN)       :: lapw
      27             :       TYPE(t_mpi),INTENT(IN)        :: fmpi
      28             :       TYPE(t_potden),INTENT(IN)     :: v
      29             :       CLASS(t_mat),INTENT(INOUT)    :: hmat(:,:),smat(:,:)
      30             :       !     ..
      31             :       !     .. Scalar Arguments ..
      32             :       INTEGER, INTENT (IN) :: jsp
      33             :       !     ..
      34             :       !     .. Array Arguments ..
      35             :       REAL,    INTENT (IN) :: evac(2,input%jspins)
      36             :       !     ..
      37             :       !     .. Local Scalars ..
      38             :       COMPLEX :: hij,sij,apw_lo,c_1
      39             :       REAL    :: d2,gz,sign,th,wronk
      40             :       INTEGER :: ikG,ikG2,ikGPr,ikGPr2,jspin,ikG0
      41             :       INTEGER :: ivac,igSpin,igSpinPr
      42             :       INTEGER :: iSpin,iSpinPr
      43             :       INTEGER :: nc
      44             :       !     ..
      45             :       !     .. Local Arrays ..
      46         144 :       INTEGER :: nv2(input%jspins)
      47         144 :       INTEGER :: kvac(2,lapw%dim_nv2d(),input%jspins)
      48         144 :       INTEGER :: map2(lapw%dim_nvd(),input%jspins)
      49         144 :       COMPLEX :: tddv(lapw%dim_nv2d(),lapw%dim_nv2d()),tduv(lapw%dim_nv2d(),lapw%dim_nv2d())
      50         144 :       COMPLEX :: tudv(lapw%dim_nv2d(),lapw%dim_nv2d()),tuuv(lapw%dim_nv2d(),lapw%dim_nv2d())
      51         144 :       COMPLEX :: a(lapw%dim_nvd(),input%jspins),b(lapw%dim_nvd(),input%jspins)
      52         144 :       REAL    :: ddnv(lapw%dim_nv2d(),input%jspins),dudz(lapw%dim_nv2d(),input%jspins)
      53         144 :       REAL    :: duz(lapw%dim_nv2d(),input%jspins), udz(lapw%dim_nv2d(),input%jspins)
      54         144 :       REAL    :: uz(lapw%dim_nv2d(),input%jspins)
      55             : 
      56         144 :       d2 = SQRT(cell%omtil/cell%area)
      57             : 
      58             :       !---> set up mapping function from 3d-->2d lapws
      59         360 :       DO jspin = 1,input%jspins
      60         216 :          nv2(jspin) = 0
      61       86032 :          k_loop:DO ikG = 1, lapw%nv(jspin)
      62     2005460 :             DO ikG2 = 1, nv2(jspin)
      63     2394578 :                IF (all(lapw%gvec(1:2,ikG,jspin)==kvac(1:2,ikG2,jspin))) THEN
      64       73368 :                   map2(ikG,jspin) = ikG2
      65       73368 :                   CYCLE k_loop
      66             :                END IF
      67             :             END DO
      68       12304 :             nv2(jspin) = nv2(jspin) + 1
      69       12304 :             IF (nv2(jspin)>lapw%dim_nv2d())  CALL juDFT_error("hsvac:lapw%dim_nv2d()",calledby ="hsvac")
      70       36912 :             kvac(1:2,nv2(jspin),jspin) = lapw%gvec(1:2,ikG,jspin)
      71       12520 :             map2(ikG,jspin) = nv2(jspin)
      72             :          END DO k_loop
      73             :       END DO
      74             : 
      75             :       !---> loop over the two vacuua (1: upper; 2: lower)
      76         432 :       DO ivac = 1,2
      77         288 :          sign = 3. - 2.*ivac !+/- 1
      78         720 :          DO iSpin=MERGE(1,jsp,noco%l_noco),MERGE(2,jsp,noco%l_noco) !loop over global spin
      79         288 :             igSpin=MIN(SIZE(hmat,1),iSpin) !in colinear case igSpin=1
      80         864 :             DO iSpinPr=MERGE(1,jsp,noco%l_noco),MERGE(2,jsp,noco%l_noco) !loop over global spin
      81         288 :                igSpinPr=MIN(SIZE(hmat,1),iSpinPr) !in colinear case igSpinPr=1
      82             :                !---> get the wavefunctions and set up the tuuv, etc matrices
      83         288 :                CALL timestart("vacfun")
      84             :                CALL vacfun(fmpi, vacuum, stars, input, nococonv, iSpin, iSpinPr, &
      85             :                          &  cell, ivac, evac, lapw%bkpt, v%vac(:vacuum%nmzxyd,2:,:,:), v%vac(:,1,:,:), kvac, nv2, &
      86         288 :                          & tuuv, tddv, tudv, tduv, uz, duz, udz, dudz, ddnv, wronk)
      87         288 :                CALL timestop("vacfun")
      88             : 
      89             :                !---> generate a and b coeffficients
      90         576 :                DO jspin = MIN(iSpin,iSpinPr),MAX(iSpin,iSpinPr)
      91      118920 :                   DO ikG = 1,lapw%nv(jspin)
      92      118344 :                      gz = sign*cell%bmat(3,3)*lapw%k3(ikG,jspin)
      93      118344 :                      ikG2 = map2(ikG,jspin)
      94      118344 :                      th = gz*cell%z1
      95      118344 :                      c_1 = CMPLX( COS(th), SIN(th) )/ (d2*wronk)
      96      118344 :                      a(ikG,jspin) = - c_1 * CMPLX(dudz(ikG2,jspin), gz*udz(ikG2,jspin) )
      97      118632 :                      b(ikG,jspin) =   c_1 * CMPLX(duz(ikG2,jspin), gz* uz(ikG2,jspin) )
      98             :                   END DO
      99             :                END DO
     100             : 
     101             :                !---> update hamiltonian and overlap matrices
     102         288 :                IF (iSpinPr==iSpin) THEN
     103       85960 :                   DO ikG = fmpi%n_rank + 1, lapw%nv(iSpin), fmpi%n_size
     104       85672 :                      ikG0 = (ikG-1)/fmpi%n_size + 1 !local column index
     105       85672 :                      ikG2 = map2(ikG,iSpin)
     106    19492776 :                      DO ikGPr = 1, ikG - 1 !TODO check noco case
     107             :                         !---> overlap: only  (g-g') parallel=0       '
     108    19492776 :                         IF (map2(ikGPr, iSpin).EQ.ikG2) THEN
     109             :                            sij = CONJG(a(ikGPr,iSpin))*a(ikG,iSpin) + &
     110      376356 :                                  CONJG(b(ikGPr,iSpin))*b(ikG,iSpin)*ddnv(ikG2,iSpin)
     111             :                            !+APW_LO
     112      376356 :                            IF (input%l_useapw) THEN
     113             :                               apw_lo =      (a(ikG,iSpin)   *  uz(ikG2,iSpin) + b(ikG,iSpin)   *  udz(ikG2,iSpin)) &
     114             :                                      * CONJG(a(ikGPr,iSpin) * duz(ikG2,iSpin) + b(ikGPr,iSpin) * dudz(ikG2,iSpin)) &
     115             :                                      + CONJG(a(ikGPr,iSpin) *  uz(ikG2,iSpin) + b(ikGPr,iSpin) *  udz(ikG2,iSpin)) &
     116           0 :                                      *      (a(ikG,iSpin)   * duz(ikG2,iSpin) + b(ikG,iSpin)   * dudz(ikG2,iSpin))
     117             :                               ! IF (i.lt.10) write (3,'(2i4,2f20.10)') i,j,apw_lo
     118           0 :                               IF (hmat(1,1)%l_real) THEN
     119           0 :                                  hmat(igSpin,igSpin)%data_r(ikGPr,ikG0) = hmat(igSpin,igSpin)%data_r(ikGPr,ikG0) + 0.25 * REAL(apw_lo)
     120             :                               ELSE
     121           0 :                                  hmat(igSpin,igSpin)%data_c(ikGPr,ikG0) = hmat(igSpin,igSpin)%data_c(ikGPr,ikG0) + 0.25 * apw_lo
     122             :                               END IF
     123             :                            END IF
     124             : 
     125             :                            !Overlap matrix
     126      376356 :                            IF (hmat(1,1)%l_real) THEN
     127      168336 :                               smat(igSpin,igSpin)%data_r(ikGPr,ikG0) = smat(igSpin,igSpin)%data_r(ikGPr,ikG0) + REAL(sij)
     128             :                            ELSE
     129      208020 :                               smat(igSpin,igSpin)%data_c(ikGPr,ikG0) = smat(igSpin,igSpin)%data_c(ikGPr,ikG0) + sij
     130             :                            END IF
     131             :                         END IF
     132             :                      END DO
     133             : 
     134             :                      !Diagonal term of Overlap matrix, Hamiltonian later
     135       85672 :                      sij = CONJG(a(ikG,iSpin))*a(ikG,iSpin) + CONJG(b(ikG,iSpin))*b(ikG,iSpin)*ddnv(ikG2,iSpin)
     136       85960 :                      IF (hmat(1,1)%l_real) THEN
     137       29924 :                         smat(igSpin,igSpin)%data_r(ikGPr,ikG0) = smat(igSpin,igSpin)%data_r(ikGPr,ikG0) + REAL(sij)
     138             :                      ELSE
     139       55748 :                         smat(igSpin,igSpin)%data_c(ikGPr,ikG0) = smat(igSpin,igSpin)%data_c(ikGPr,ikG0) + sij
     140             :                      END IF
     141             :                   END DO
     142             :                END IF
     143             : 
     144             :                !--->    hamiltonian update
     145       86248 :                DO ikG = fmpi%n_rank+1,lapw%nv(iSpin),fmpi%n_size
     146       85672 :                   ikG0 = (ikG-1)/fmpi%n_size + 1 !local column index
     147       85672 :                   ikG2 = map2(ikG,iSpin)
     148    19578736 :                   DO ikGPr = 1, MERGE(ikG, lapw%nv(iSpinPr), iSpin==iSpinPr)
     149    19492776 :                      ikGPr2 = map2(ikGPr, iSpinPr)
     150             :                      !hij = CONJG(a(ikGPr, iSpinPr) * tuuv(ikG2, ikGPr2) + b(ikGPr,iSpinPr) * tudv(ikG2,ikGPr2)) * a(ikG,iSpin) &
     151             :                      !    + CONJG(b(ikGPr, iSpinPr) * tddv(ikG2, ikGPr2) + a(ikGPr,iSpinPr) * tduv(ikG2,ikGPr2)) * b(ikG,iSpin)
     152             :                      hij = CONJG(a(ikGPr, iSpinPr)) * tuuv(ikGPr2, ikG2) * a(ikG,iSpin) &
     153             :                          + CONJG(b(ikGPr, iSpinPr)) * tddv(ikGPr2, ikG2) * b(ikG,iSpin) &
     154             :                          + CONJG(a(ikGPr, iSpinPr)) * tudv(ikGPr2, ikG2) * b(ikG,iSpin) &
     155    19492776 :                          + CONJG(b(ikGPr, iSpinPr)) * tduv(ikGPr2, ikG2) * a(ikG,iSpin)
     156    19578448 :                      IF (hmat(1,1)%l_real) THEN
     157     7462076 :                         hmat(igSpinPr,igSpin)%data_r(ikGPr,ikG0) = hmat(igSpinPr,igSpin)%data_r(ikGPr,ikG0) + REAL(hij)
     158             :                      ELSE
     159    12030700 :                         hmat(igSpinPr,igSpin)%data_c(ikGPr,ikG0) = hmat(igSpinPr,igSpin)%data_c(ikGPr,ikG0) + hij
     160             :                      END IF
     161             :                   END DO
     162             :                END DO
     163             :                !--->    end of loop over different parts of the potential matrix
     164             :             END DO
     165             :             !---> end of loop over vacua
     166             :          END DO
     167             :       END DO
     168         144 :    END SUBROUTINE hsvac
     169             : END MODULE m_hsvac

Generated by: LCOV version 1.14