LCOV - code coverage report
Current view: top level - juphon - dfpt_hsvac.F90 (source / functions) Hit Total Coverage
Test: FLEUR test coverage Lines: 0 72 0.0 %
Date: 2024-05-15 04:28:08 Functions: 0 1 0.0 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------
       2             : ! Copyright (c) 2023 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_dfpt_hsvac
       7             :    USE m_juDFT
       8             : CONTAINS
       9             :    !-----------------------------------------------------------------------------
      10             :    ! Calculate the vacuum contribution to the Hamiltonian perturbation
      11             :    !-----------------------------------------------------------------------------
      12           0 :    SUBROUTINE dfpt_hsvac(vacuum, stars, fmpi, jsp, input, v, v1, evac, cell, &
      13           0 :                   & lapwq, lapw, noco, nococonv, hmat)
      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, lapwq
      27             :       TYPE(t_mpi),INTENT(IN)        :: fmpi
      28             :       TYPE(t_potden),INTENT(IN)     :: v, v1
      29             :       CLASS(t_mat),INTENT(INOUT)    :: hmat(:,:)
      30             : 
      31             :       INTEGER, INTENT (IN) :: jsp
      32             :       REAL,    INTENT (IN) :: evac(2,input%jspins)
      33             : 
      34             :       COMPLEX :: hij,c_1
      35             :       REAL    :: d2,gz,sign,th,wronk
      36             :       INTEGER :: ikG,ikG2,ikGPr,ikGPr2,jspin,ikG0
      37             :       INTEGER :: ivac,igSpin,igSpinPr
      38             :       INTEGER :: iSpin,iSpinPr
      39             : 
      40           0 :       INTEGER :: nv2(input%jspins)
      41           0 :       INTEGER :: kvac(2,lapw%dim_nv2d(),input%jspins)
      42           0 :       INTEGER :: map2(lapw%dim_nvd(),input%jspins)
      43           0 :       COMPLEX :: tddv(lapw%dim_nv2d(),lapw%dim_nv2d()),tduv(lapw%dim_nv2d(),lapw%dim_nv2d())
      44           0 :       COMPLEX :: tudv(lapw%dim_nv2d(),lapw%dim_nv2d()),tuuv(lapw%dim_nv2d(),lapw%dim_nv2d())
      45           0 :       COMPLEX :: a(lapw%dim_nvd(),input%jspins),b(lapw%dim_nvd(),input%jspins)
      46           0 :       REAL    :: ddnv(lapw%dim_nv2d(),input%jspins),dudz(lapw%dim_nv2d(),input%jspins)
      47           0 :       REAL    :: duz(lapw%dim_nv2d(),input%jspins), udz(lapw%dim_nv2d(),input%jspins)
      48           0 :       REAL    :: uz(lapw%dim_nv2d(),input%jspins), dudzq(lapw%dim_nv2d(),input%jspins)
      49           0 :       REAL    :: duzq(lapw%dim_nv2d(),input%jspins), udzq(lapw%dim_nv2d(),input%jspins)
      50           0 :       REAL    :: uzq(lapw%dim_nv2d(),input%jspins)
      51           0 :       COMPLEX :: aq(lapw%dim_nvd(),input%jspins),bq(lapw%dim_nvd(),input%jspins)
      52           0 :       INTEGER :: map2q(lapw%dim_nvd(),input%jspins)
      53           0 :       INTEGER :: nv2q(input%jspins)
      54           0 :       INTEGER :: kvacq(2,lapw%dim_nv2d(),input%jspins)
      55             : 
      56           0 :       d2 = SQRT(cell%omtil/cell%area)
      57             : 
      58             :       !---> set up mapping function from 3d-->2d lapws
      59           0 :       DO jspin = 1,input%jspins
      60           0 :          nv2(jspin) = 0
      61           0 :          k_loop:DO ikG = 1, lapw%nv(jspin)
      62           0 :             DO ikG2 = 1, nv2(jspin)
      63           0 :                IF (all(lapw%gvec(1:2,ikG,jspin)==kvac(1:2,ikG2,jspin))) THEN
      64           0 :                   map2(ikG,jspin) = ikG2
      65           0 :                   CYCLE k_loop
      66             :                END IF
      67             :             END DO
      68           0 :             nv2(jspin) = nv2(jspin) + 1
      69           0 :             IF (nv2(jspin)>lapw%dim_nv2d())  CALL juDFT_error("hsvac:lapw%dim_nv2d()",calledby ="hsvac")
      70           0 :             kvac(1:2,nv2(jspin),jspin) = lapw%gvec(1:2,ikG,jspin)
      71           0 :             map2(ikG,jspin) = nv2(jspin)
      72             :          END DO k_loop
      73             :       END DO
      74             : 
      75           0 :       DO jspin = 1,input%jspins
      76           0 :          nv2q(jspin) = 0
      77           0 :          k_loopq:DO ikG = 1, lapwq%nv(jspin)
      78           0 :             DO ikG2 = 1, nv2q(jspin)
      79           0 :                IF (all(lapwq%gvec(1:2,ikG,jspin)==kvacq(1:2,ikG2,jspin))) THEN
      80           0 :                   map2q(ikG,jspin) = ikG2
      81           0 :                   CYCLE k_loopq
      82             :                END IF
      83             :             END DO
      84           0 :             nv2q(jspin) = nv2q(jspin) + 1
      85           0 :             IF (nv2q(jspin)>lapw%dim_nv2d()) CALL juDFT_error("hsvac:lapw%dim_nv2d()",calledby ="hsvac")
      86           0 :             kvacq(1:2,nv2q(jspin),jspin) = lapwq%gvec(1:2,ikG,jspin)
      87           0 :             map2q(ikG,jspin) = nv2q(jspin)
      88             :          END DO k_loopq
      89             :       END DO
      90             : 
      91             :       !---> loop over the two vacuua (1: upper; 2: lower)
      92           0 :       DO ivac = 1,2
      93           0 :          sign = 3. - 2.*ivac !+/- 1
      94           0 :          DO iSpin=MERGE(1,jsp,noco%l_noco),MERGE(2,jsp,noco%l_noco) !loop over global spin
      95           0 :             igSpin=MIN(SIZE(hmat,1),iSpin) !in colinear case igSpin=1
      96           0 :             DO iSpinPr=MERGE(1,jsp,noco%l_noco),MERGE(2,jsp,noco%l_noco) !loop over global spin
      97           0 :                igSpinPr=MIN(SIZE(hmat,1),iSpinPr) !in colinear case igSpinPr=1
      98             :                !---> get the wavefunctions and set up the tuuv, etc matrices
      99           0 :                CALL timestart("vacfun")
     100             :                CALL vacfun(fmpi, vacuum, stars, input, nococonv, iSpin, iSpinPr, &
     101             :                          & cell, ivac, evac, lapw%bkpt, v%vac(:vacuum%nmzxyd,2:,:,:), v%vac(:,1,:,:), kvac, nv2, &
     102             :                          & tuuv, tddv, tudv, tduv, uz, duz, udz, dudz, ddnv, wronk,&
     103           0 :                          & lapwq%bkpt+lapwq%qphon, v1%vac, kvacq, nv2q, uzq, duzq, udzq, dudzq)
     104           0 :                CALL timestop("vacfun")
     105             : 
     106             :                !---> generate a and b coeffficients
     107           0 :                DO jspin = MIN(iSpin,iSpinPr),MAX(iSpin,iSpinPr)
     108           0 :                   DO ikG = 1,lapw%nv(jspin)
     109           0 :                      gz = sign*cell%bmat(3,3)*lapw%k3(ikG,jspin)
     110           0 :                      ikG2 = map2(ikG,jspin)
     111           0 :                      th = gz*cell%z1
     112           0 :                      c_1 = CMPLX( COS(th), SIN(th) )/ (d2*wronk)
     113           0 :                      a(ikG,jspin) = - c_1 * CMPLX(dudz(ikG2,jspin), gz*udz(ikG2,jspin) )
     114           0 :                      b(ikG,jspin) =   c_1 * CMPLX(duz(ikG2,jspin), gz* uz(ikG2,jspin) )
     115             :                   END DO
     116             : 
     117           0 :                   DO ikG = 1,lapwq%nv(jspin)
     118           0 :                      gz = sign*cell%bmat(3,3)*lapwq%k3(ikG,jspin)
     119           0 :                      ikG2 = map2q(ikG,jspin)
     120           0 :                      th = gz*cell%z1
     121           0 :                      c_1 = CMPLX( COS(th), SIN(th) )/ (d2*wronk)
     122           0 :                      aq(ikG,jspin) = - c_1 * CMPLX(dudzq(ikG2,jspin), gz*udzq(ikG2,jspin) )
     123           0 :                      bq(ikG,jspin) =   c_1 * CMPLX(duzq(ikG2,jspin), gz* uzq(ikG2,jspin) )
     124             :                   END DO
     125             :                END DO
     126             : 
     127             :                !--->    hamiltonian update
     128           0 :                DO ikG = fmpi%n_rank+1,lapw%nv(iSpin),fmpi%n_size
     129           0 :                   ikG0 = (ikG-1)/fmpi%n_size + 1 !local column index
     130           0 :                   ikG2 = map2(ikG,iSpin)
     131           0 :                   DO ikGPr = 1, lapwq%nv(iSpinPr)
     132           0 :                      ikGPr2 = map2q(ikGPr, iSpinPr)
     133             :                      hij = CONJG(aq(ikGPr, iSpinPr)) * tuuv(ikGPr2, ikG2) * a(ikG,iSpin) &
     134             :                          + CONJG(bq(ikGPr, iSpinPr)) * tddv(ikGPr2, ikG2) * b(ikG,iSpin) &
     135             :                          + CONJG(aq(ikGPr, iSpinPr)) * tudv(ikGPr2, ikG2) * b(ikG,iSpin) &
     136           0 :                          + CONJG(bq(ikGPr, iSpinPr)) * tduv(ikGPr2, ikG2) * a(ikG,iSpin)
     137           0 :                      hmat(igSpinPr,igSpin)%data_c(ikGPr,ikG0) = hmat(igSpinPr,igSpin)%data_c(ikGPr,ikG0) + hij
     138             :                   END DO
     139             :                END DO
     140             :                !--->    end of loop over different parts of the potential matrix
     141             :             END DO
     142             :             !---> end of loop over vacua
     143             :          END DO
     144             :       END DO
     145           0 :    END SUBROUTINE dfpt_hsvac
     146             : END MODULE m_dfpt_hsvac

Generated by: LCOV version 1.14