LCOV - code coverage report
Current view: top level - src/77_ddb - m_epweights.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 10.2 % 813 83
Test Date: 2026-09-21 22:40:37 Functions: 40.0 % 5 2

            Line data    Source code
       1              : !!****m* ABINIT/m_epweights
       2              : !! NAME
       3              : !!  m_epweights
       4              : !!
       5              : !! FUNCTION
       6              : !!
       7              : !!
       8              : !! COPYRIGHT
       9              : !!  Copyright (C) 2012-2026 ABINIT group (BXU, MVer)
      10              : !!  This file is distributed under the terms of the
      11              : !!  GNU General Public License, see ~abinit/COPYING
      12              : !!  or http://www.gnu.org/copyleft/gpl.txt .
      13              : !!
      14              : !! SOURCE
      15              : 
      16              : #if defined HAVE_CONFIG_H
      17              : #include "config.h"
      18              : #endif
      19              : 
      20              : #include "abi_common.h"
      21              : 
      22              : module m_epweights
      23              : 
      24              :  use defs_basis
      25              :  use defs_elphon
      26              :  use m_abicore
      27              :  use m_errors
      28              :  use m_tetrahedron
      29              :  !use m_htetra
      30              :  use m_xmpi
      31              : 
      32              :  use m_matrix,          only : matr3inv
      33              : 
      34              :  implicit none
      35              : 
      36              :  private
      37              : !!***
      38              : 
      39              :  public :: d2c_weights
      40              :  public :: d2c_wtq!
      41              :  public :: ep_el_weights
      42              :  public :: ep_fs_weights
      43              :  public :: ep_ph_weights
      44              : !!***
      45              : 
      46              : contains
      47              : !!***
      48              : 
      49              : !!****f* ABINIT/d2c_weights
      50              : !! NAME
      51              : !!  d2c_weights
      52              : !!
      53              : !! FUNCTION
      54              : !!  This routine calculates the integration weights on a coarse k-grid
      55              : !!  using the integration weights from a denser k-gird. The weights of
      56              : !!  the extra k points that being shared are evenly distributed. It also
      57              : !!  condenses the velocity*wtk and velcity^2*wtk.
      58              : !!
      59              : !! INPUTS
      60              : !!  elph_ds%k_fine%nkpt = number of fine FS k-points
      61              : !!  elph_ds%k_fine%wtk = integration weights of the fine FS k-grid
      62              : !!  elph_ds%k_phon%nkpt = number of coarse FS k-points
      63              : !!  elph_tr_ds%el_veloc = electronic velocities from the fine k-grid
      64              : !!
      65              : !! OUTPUT
      66              : !!  elph_ds%k_phon%wtk = integration weights of the coarse FS k-grid
      67              : !!  elph_ds%k_phon%velocwtk = velocity time integration weights of the coarse FS k-grid
      68              : !!  elph_ds%k_phon%vvelocwtk = velocity^2 time integration weights of the coarse FS k-grid
      69              : !!
      70              : !! SOURCE
      71              : 
      72            0 : subroutine d2c_weights(elph_ds,elph_tr_ds)
      73              : 
      74              : !Arguments ------------------------------------
      75              :  type(elph_type),intent(inout) :: elph_ds
      76              :  type(elph_tr_type),intent(inout),optional :: elph_tr_ds
      77              : 
      78              : !Local variables-------------------------------
      79              :  integer :: ii, jj, kk
      80              :  integer :: ikpt, jkpt, kkpt
      81              :  integer :: iikpt, jjkpt, kkkpt
      82              :  integer :: icomp, jcomp
      83              :  integer :: iFSband, iband
      84              :  integer :: ikpt_fine, ikpt_phon
      85              :  integer :: nkpt_fine1, nkpt_phon1
      86              :  integer :: nkpt_fine2, nkpt_phon2
      87              :  integer :: nkpt_fine3, nkpt_phon3
      88              :  integer :: nscale1, nscale2, nscale3
      89              : 
      90              : ! *************************************************************************
      91            0 :  nkpt_phon1 = elph_ds%kptrlatt(1,1)
      92            0 :  nkpt_phon2 = elph_ds%kptrlatt(2,2)
      93            0 :  nkpt_phon3 = elph_ds%kptrlatt(3,3)
      94            0 :  nkpt_fine1 = elph_ds%kptrlatt_fine(1,1)
      95            0 :  nkpt_fine2 = elph_ds%kptrlatt_fine(2,2)
      96            0 :  nkpt_fine3 = elph_ds%kptrlatt_fine(3,3)
      97            0 :  nscale1 = dble(nkpt_fine1/nkpt_phon1)
      98            0 :  nscale2 = dble(nkpt_fine2/nkpt_phon2)
      99            0 :  nscale3 = dble(nkpt_fine3/nkpt_phon3)
     100              :  if (abs(INT(nscale1)-nscale1) > 0.01) then
     101              :    ABI_ERROR('The denser k-gird MUST be multiples of the phon k-grid')
     102              :  end if
     103              :  if (abs(INT(nscale2)-nscale2) > 0.01) then
     104              :    ABI_ERROR('The denser k-gird MUST be multiples of the phon k-grid')
     105              :  end if
     106              :  if (abs(INT(nscale3)-nscale3) > 0.01) then
     107              :    ABI_ERROR('The denser k-gird MUST be multiples of the phon k-grid')
     108              :  end if
     109            0 :  nscale1 = INT(nscale1)
     110            0 :  nscale2 = INT(nscale2)
     111            0 :  nscale3 = INT(nscale3)
     112              : 
     113              : !bxu, get wtk of coarse grid from fine grid
     114            0 :  elph_ds%k_phon%wtk = zero
     115            0 :  if (present(elph_tr_ds)) then
     116            0 :    elph_ds%k_phon%velocwtk = zero
     117            0 :    elph_ds%k_phon%vvelocwtk = zero
     118              :  end if
     119              : 
     120            0 :  do ikpt = 1, nkpt_phon1
     121            0 :    do jkpt = 1, nkpt_phon2
     122            0 :      do kkpt = 1, nkpt_phon3
     123            0 :        ikpt_phon = kkpt + (jkpt-1)*nkpt_phon3 + (ikpt-1)*nkpt_phon2*nkpt_phon3
     124              : !      inside the paralellepipe
     125            0 :        do ii = -((nscale1+1)/2-1), ((nscale1+1)/2-1)
     126            0 :          do jj = -((nscale2+1)/2-1), ((nscale2+1)/2-1)
     127            0 :            do kk = -((nscale3+1)/2-1), ((nscale3+1)/2-1)
     128            0 :              iikpt = 1 + (ikpt-1)*nscale1 + ii
     129            0 :              jjkpt = 1 + (jkpt-1)*nscale2 + jj
     130            0 :              kkkpt = 1 + (kkpt-1)*nscale3 + kk
     131            0 :              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     132            0 :              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     133            0 :              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     134            0 :              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     135            0 :              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     136            0 :              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     137            0 :              ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     138              :              elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     139            0 : &             elph_ds%k_fine%wtk(:,ikpt_fine,:)
     140            0 :              if (present(elph_tr_ds)) then
     141            0 :                do iFSband=1,elph_ds%ngkkband !FS bands
     142            0 :                  iband=iFSband+elph_ds%minFSband-1 ! full bands
     143            0 :                  do icomp = 1, 3
     144              :                    elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     145            0 : &                   elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     146            0 :                    do jcomp = 1, 3
     147              :                      elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     148              : &                     elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     149              : &                     elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     150            0 : &                     elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     151              :                    end do
     152              :                  end do
     153              :                end do
     154              :              end if
     155              :            end do
     156              :          end do
     157              :        end do
     158              : !      on the 6 faces
     159            0 :        if (MOD(nscale3,2) == 0) then ! when nscale3 is an even number
     160            0 :          do ii = -((nscale1+1)/2-1), ((nscale1+1)/2-1)
     161            0 :            do jj = -((nscale2+1)/2-1), ((nscale2+1)/2-1)
     162            0 :              iikpt = 1 + (ikpt-1)*nscale1 + ii
     163            0 :              jjkpt = 1 + (jkpt-1)*nscale2 + jj
     164            0 :              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     165            0 :              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     166            0 :              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     167            0 :              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     168              : 
     169            0 :              kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
     170            0 :              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     171            0 :              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     172            0 :              ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     173              :              elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     174            0 : &             0.5_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     175            0 :              if (present(elph_tr_ds)) then
     176            0 :                do iFSband=1,elph_ds%ngkkband !FS bands
     177            0 :                  iband=iFSband+elph_ds%minFSband-1 ! full bands
     178            0 :                  do icomp = 1, 3
     179              :                    elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     180            0 : &                   0.5_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     181            0 :                    do jcomp = 1, 3
     182              :                      elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     183              : &                     elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     184              : &                     0.5_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     185            0 : &                     elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     186              :                    end do
     187              :                  end do
     188              :                end do
     189              :              end if
     190              : 
     191            0 :              kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
     192            0 :              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     193            0 :              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     194            0 :              ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     195              :              elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     196            0 : &             0.5_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     197            0 :              if (present(elph_tr_ds)) then
     198            0 :                do iFSband=1,elph_ds%ngkkband !FS bands
     199            0 :                  iband=iFSband+elph_ds%minFSband-1 ! full bands
     200            0 :                  do icomp = 1, 3
     201              :                    elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     202            0 : &                   0.5_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     203            0 :                    do jcomp = 1, 3
     204              :                      elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     205              : &                     elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     206              : &                     0.5_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     207            0 : &                     elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     208              :                    end do
     209              :                  end do
     210              :                end do
     211              :              end if
     212              :            end do
     213              :          end do
     214              :        end if
     215            0 :        if (MOD(nscale2,2) == 0) then ! when nscale2 is an even number
     216            0 :          do ii = -((nscale1+1)/2-1), ((nscale1+1)/2-1)
     217            0 :            do kk = -((nscale3+1)/2-1), ((nscale3+1)/2-1)
     218            0 :              iikpt = 1 + (ikpt-1)*nscale1 + ii
     219            0 :              kkkpt = 1 + (kkpt-1)*nscale3 + kk
     220            0 :              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     221            0 :              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     222            0 :              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     223            0 :              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     224              : 
     225            0 :              jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
     226            0 :              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     227            0 :              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     228            0 :              ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     229              :              elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     230            0 : &             0.5_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     231            0 :              if (present(elph_tr_ds)) then
     232            0 :                do iFSband=1,elph_ds%ngkkband !FS bands
     233            0 :                  iband=iFSband+elph_ds%minFSband-1 ! full bands
     234            0 :                  do icomp = 1, 3
     235              :                    elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     236            0 : &                   0.5_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     237            0 :                    do jcomp = 1, 3
     238              :                      elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     239              : &                     elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     240              : &                     0.5_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     241            0 : &                     elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     242              :                    end do
     243              :                  end do
     244              :                end do
     245              :              end if
     246              : 
     247            0 :              jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
     248            0 :              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     249            0 :              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     250            0 :              ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     251              :              elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     252            0 : &             0.5_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     253            0 :              if (present(elph_tr_ds)) then
     254            0 :                do iFSband=1,elph_ds%ngkkband !FS bands
     255            0 :                  iband=iFSband+elph_ds%minFSband-1 ! full bands
     256            0 :                  do icomp = 1, 3
     257              :                    elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     258            0 : &                   0.5_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     259            0 :                    do jcomp = 1, 3
     260              :                      elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     261              : &                     elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     262              : &                     0.5_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     263            0 : &                     elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     264              :                    end do
     265              :                  end do
     266              :                end do
     267              :              end if
     268              :            end do
     269              :          end do
     270              :        end if
     271            0 :        if (MOD(nscale1,2) == 0) then ! when nscale1 is an even number
     272            0 :          do kk = -((nscale3+1)/2-1), ((nscale3+1)/2-1)
     273            0 :            do jj = -((nscale2+1)/2-1), ((nscale2+1)/2-1)
     274            0 :              kkkpt = 1 + (kkpt-1)*nscale3 + kk
     275            0 :              jjkpt = 1 + (jkpt-1)*nscale2 + jj
     276            0 :              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     277            0 :              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     278            0 :              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     279            0 :              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     280              : 
     281            0 :              iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
     282            0 :              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     283            0 :              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     284            0 :              ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     285              :              elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     286            0 : &             0.5_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     287            0 :              if (present(elph_tr_ds)) then
     288            0 :                do iFSband=1,elph_ds%ngkkband !FS bands
     289            0 :                  iband=iFSband+elph_ds%minFSband-1 ! full bands
     290            0 :                  do icomp = 1, 3
     291              :                    elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     292            0 : &                   0.5_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     293            0 :                    do jcomp = 1, 3
     294              :                      elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     295              : &                     elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     296              : &                     0.5_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     297            0 : &                     elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     298              :                    end do
     299              :                  end do
     300              :                end do
     301              :              end if
     302              : 
     303            0 :              iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
     304            0 :              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     305            0 :              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     306            0 :              ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     307              :              elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     308            0 : &             0.5_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     309            0 :              if (present(elph_tr_ds)) then
     310            0 :                do iFSband=1,elph_ds%ngkkband !FS bands
     311            0 :                  iband=iFSband+elph_ds%minFSband-1 ! full bands
     312            0 :                  do icomp = 1, 3
     313              :                    elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     314            0 : &                   0.5_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     315            0 :                    do jcomp = 1, 3
     316              :                      elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     317              : &                     elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     318              : &                     0.5_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     319            0 : &                     elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     320              :                    end do
     321              :                  end do
     322              :                end do
     323              :              end if
     324              :            end do
     325              :          end do
     326              : !        on the 12 sides
     327              :        end if
     328            0 :        if (MOD(nscale2,2) == 0 .and. MOD(nscale3,2) == 0) then
     329            0 :          do ii = -((nscale1+1)/2-1), ((nscale1+1)/2-1)
     330            0 :            iikpt = 1 + (ikpt-1)*nscale1 + ii
     331            0 :            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     332            0 :            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     333              : 
     334            0 :            jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
     335            0 :            kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
     336            0 :            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     337            0 :            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     338            0 :            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     339            0 :            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     340            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     341              :            elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     342            0 : &           0.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     343            0 :            if (present(elph_tr_ds)) then
     344            0 :              do iFSband=1,elph_ds%ngkkband !FS bands
     345            0 :                iband=iFSband+elph_ds%minFSband-1 ! full bands
     346            0 :                do icomp = 1, 3
     347              :                  elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     348            0 : &                 0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     349            0 :                  do jcomp = 1, 3
     350              :                    elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     351              : &                   elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     352              : &                   0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     353            0 : &                   elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     354              :                  end do
     355              :                end do
     356              :              end do
     357              :            end if
     358              : 
     359            0 :            jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
     360            0 :            kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
     361              :            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     362              :            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     363            0 :            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     364            0 :            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     365            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     366              :            elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     367            0 : &           0.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     368            0 :            if (present(elph_tr_ds)) then
     369            0 :              do iFSband=1,elph_ds%ngkkband !FS bands
     370            0 :                iband=iFSband+elph_ds%minFSband-1 ! full bands
     371            0 :                do icomp = 1, 3
     372              :                  elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     373            0 : &                 0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     374            0 :                  do jcomp = 1, 3
     375              :                    elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     376              : &                   elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     377              : &                   0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     378            0 : &                   elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     379              :                  end do
     380              :                end do
     381              :              end do
     382              :            end if
     383              : 
     384            0 :            jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
     385            0 :            kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
     386            0 :            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     387            0 :            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     388              :            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     389              :            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     390            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     391              :            elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     392            0 : &           0.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     393            0 :            if (present(elph_tr_ds)) then
     394            0 :              do iFSband=1,elph_ds%ngkkband !FS bands
     395            0 :                iband=iFSband+elph_ds%minFSband-1 ! full bands
     396            0 :                do icomp = 1, 3
     397              :                  elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     398            0 : &                 0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     399            0 :                  do jcomp = 1, 3
     400              :                    elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     401              : &                   elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     402              : &                   0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     403            0 : &                   elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     404              :                  end do
     405              :                end do
     406              :              end do
     407              :            end if
     408              : 
     409            0 :            jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
     410            0 :            kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
     411              :            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     412              :            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     413              :            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     414              :            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     415            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     416              :            elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     417            0 : &           0.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     418            0 :            if (present(elph_tr_ds)) then
     419            0 :              do iFSband=1,elph_ds%ngkkband !FS bands
     420            0 :                iband=iFSband+elph_ds%minFSband-1 ! full bands
     421            0 :                do icomp = 1, 3
     422              :                  elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     423            0 : &                 0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     424            0 :                  do jcomp = 1, 3
     425              :                    elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     426              : &                   elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     427              : &                   0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     428            0 : &                   elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     429              :                  end do
     430              :                end do
     431              :              end do
     432              :            end if
     433              :          end do
     434              :        end if
     435            0 :        if (MOD(nscale1,2) == 0 .and. MOD(nscale3,2) == 0) then
     436            0 :          do jj = -((nscale2+1)/2-1), ((nscale2+1)/2-1)
     437            0 :            jjkpt = 1 + (jkpt-1)*nscale2 + jj
     438            0 :            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     439            0 :            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     440              : 
     441            0 :            iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
     442            0 :            kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
     443            0 :            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     444            0 :            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     445            0 :            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     446            0 :            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     447            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     448              :            elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     449            0 : &           0.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     450            0 :            if (present(elph_tr_ds)) then
     451            0 :              do iFSband=1,elph_ds%ngkkband !FS bands
     452            0 :                iband=iFSband+elph_ds%minFSband-1 ! full bands
     453            0 :                do icomp = 1, 3
     454              :                  elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     455            0 : &                 0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     456            0 :                  do jcomp = 1, 3
     457              :                    elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     458              : &                   elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     459              : &                   0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     460            0 : &                   elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     461              :                  end do
     462              :                end do
     463              :              end do
     464              :            end if
     465              : 
     466            0 :            iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
     467            0 :            kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
     468              :            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     469              :            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     470            0 :            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     471            0 :            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     472            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     473              :            elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     474            0 : &           0.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     475            0 :            if (present(elph_tr_ds)) then
     476            0 :              do iFSband=1,elph_ds%ngkkband !FS bands
     477            0 :                iband=iFSband+elph_ds%minFSband-1 ! full bands
     478            0 :                do icomp = 1, 3
     479              :                  elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     480            0 : &                 0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     481            0 :                  do jcomp = 1, 3
     482              :                    elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     483              : &                   elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     484              : &                   0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     485            0 : &                   elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     486              :                  end do
     487              :                end do
     488              :              end do
     489              :            end if
     490              : 
     491            0 :            iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
     492            0 :            kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
     493            0 :            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     494            0 :            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     495              :            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     496              :            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     497            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     498              :            elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     499            0 : &           0.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     500            0 :            if (present(elph_tr_ds)) then
     501            0 :              do iFSband=1,elph_ds%ngkkband !FS bands
     502            0 :                iband=iFSband+elph_ds%minFSband-1 ! full bands
     503            0 :                do icomp = 1, 3
     504              :                  elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     505            0 : &                 0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     506            0 :                  do jcomp = 1, 3
     507              :                    elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     508              : &                   elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     509              : &                   0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     510            0 : &                   elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     511              :                  end do
     512              :                end do
     513              :              end do
     514              :            end if
     515              : 
     516            0 :            iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
     517            0 :            kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
     518              :            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     519              :            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     520              :            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     521              :            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     522            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     523              :            elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     524            0 : &           0.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     525            0 :            if (present(elph_tr_ds)) then
     526            0 :              do iFSband=1,elph_ds%ngkkband !FS bands
     527            0 :                iband=iFSband+elph_ds%minFSband-1 ! full bands
     528            0 :                do icomp = 1, 3
     529              :                  elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     530            0 : &                 0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     531            0 :                  do jcomp = 1, 3
     532              :                    elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     533              : &                   elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     534              : &                   0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     535            0 : &                   elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     536              :                  end do
     537              :                end do
     538              :              end do
     539              :            end if
     540              :          end do
     541              :        end if
     542            0 :        if (MOD(nscale2,2) == 0 .and. MOD(nscale1,2) == 0) then
     543            0 :          do kk = -((nscale3+1)/2-1), ((nscale3+1)/2-1)
     544            0 :            kkkpt = 1 + (kkpt-1)*nscale3 + kk
     545            0 :            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     546            0 :            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     547              : 
     548            0 :            jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
     549            0 :            iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
     550            0 :            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     551            0 :            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     552            0 :            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     553            0 :            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     554            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     555              :            elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     556            0 : &           0.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     557            0 :            if (present(elph_tr_ds)) then
     558            0 :              do iFSband=1,elph_ds%ngkkband !FS bands
     559            0 :                iband=iFSband+elph_ds%minFSband-1 ! full bands
     560            0 :                do icomp = 1, 3
     561              :                  elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     562            0 : &                 0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     563            0 :                  do jcomp = 1, 3
     564              :                    elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     565              : &                   elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     566              : &                   0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     567            0 : &                   elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     568              :                  end do
     569              :                end do
     570              :              end do
     571              :            end if
     572              : 
     573            0 :            jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
     574            0 :            iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
     575              :            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     576              :            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     577            0 :            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     578            0 :            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     579            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     580              :            elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     581            0 : &           0.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     582            0 :            if (present(elph_tr_ds)) then
     583            0 :              do iFSband=1,elph_ds%ngkkband !FS bands
     584            0 :                iband=iFSband+elph_ds%minFSband-1 ! full bands
     585            0 :                do icomp = 1, 3
     586              :                  elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     587            0 : &                 0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     588            0 :                  do jcomp = 1, 3
     589              :                    elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     590              : &                   elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     591              : &                   0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     592            0 : &                   elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     593              :                  end do
     594              :                end do
     595              :              end do
     596              :            end if
     597              : 
     598            0 :            jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
     599            0 :            iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
     600            0 :            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     601            0 :            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     602              :            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     603              :            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     604            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     605              :            elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     606            0 : &           0.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     607            0 :            if (present(elph_tr_ds)) then
     608            0 :              do iFSband=1,elph_ds%ngkkband !FS bands
     609            0 :                iband=iFSband+elph_ds%minFSband-1 ! full bands
     610            0 :                do icomp = 1, 3
     611              :                  elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     612            0 : &                 0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     613            0 :                  do jcomp = 1, 3
     614              :                    elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     615              : &                   elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     616              : &                   0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     617            0 : &                   elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     618              :                  end do
     619              :                end do
     620              :              end do
     621              :            end if
     622              : 
     623            0 :            jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
     624            0 :            iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
     625              :            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     626              :            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     627              :            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     628              :            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     629            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     630              :            elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     631            0 : &           0.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     632            0 :            if (present(elph_tr_ds)) then
     633            0 :              do iFSband=1,elph_ds%ngkkband !FS bands
     634            0 :                iband=iFSband+elph_ds%minFSband-1 ! full bands
     635            0 :                do icomp = 1, 3
     636              :                  elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     637            0 : &                 0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     638            0 :                  do jcomp = 1, 3
     639              :                    elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     640              : &                   elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     641              : &                   0.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     642            0 : &                   elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     643              :                  end do
     644              :                end do
     645              :              end do
     646              :            end if
     647              :          end do
     648              : !        on the 8 corners
     649              :        end if
     650            0 :        if (MOD(nscale1,2) == 0 .and. MOD(nscale2,2) == 0 .and. MOD(nscale3,2) == 0) then
     651            0 :          iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
     652            0 :          jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
     653            0 :          kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
     654            0 :          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     655            0 :          if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     656            0 :          if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     657            0 :          if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     658            0 :          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     659            0 :          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     660            0 :          ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     661              :          elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     662            0 : &         0.125_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     663            0 :          if (present(elph_tr_ds)) then
     664            0 :            do iFSband=1,elph_ds%ngkkband !FS bands
     665            0 :              iband=iFSband+elph_ds%minFSband-1 ! full bands
     666            0 :              do icomp = 1, 3
     667              :                elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     668            0 : &               0.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     669            0 :                do jcomp = 1, 3
     670              :                  elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     671              : &                 elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     672              : &                 0.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     673            0 : &                 elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     674              :                end do
     675              :              end do
     676              :            end do
     677              :          end if
     678              : 
     679            0 :          iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
     680            0 :          jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
     681            0 :          kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
     682              :          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     683              :          if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     684            0 :          if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     685              :          if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     686              :          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     687            0 :          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     688            0 :          ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     689              :          elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     690            0 : &         0.125_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     691            0 :          if (present(elph_tr_ds)) then
     692            0 :            do iFSband=1,elph_ds%ngkkband !FS bands
     693            0 :              iband=iFSband+elph_ds%minFSband-1 ! full bands
     694            0 :              do icomp = 1, 3
     695              :                elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     696            0 : &               0.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     697            0 :                do jcomp = 1, 3
     698              :                  elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     699              : &                 elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     700              : &                 0.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     701            0 : &                 elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     702              :                end do
     703              :              end do
     704              :            end do
     705              :          end if
     706              : 
     707            0 :          iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
     708            0 :          jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
     709            0 :          kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
     710              :          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     711            0 :          if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     712              :          if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     713              :          if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     714            0 :          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     715              :          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     716            0 :          ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     717              :          elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     718            0 : &         0.125_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     719            0 :          if (present(elph_tr_ds)) then
     720            0 :            do iFSband=1,elph_ds%ngkkband !FS bands
     721            0 :              iband=iFSband+elph_ds%minFSband-1 ! full bands
     722            0 :              do icomp = 1, 3
     723              :                elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     724            0 : &               0.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     725            0 :                do jcomp = 1, 3
     726              :                  elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     727              : &                 elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     728              : &                 0.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     729            0 : &                 elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     730              :                end do
     731              :              end do
     732              :            end do
     733              :          end if
     734              : 
     735            0 :          iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
     736            0 :          jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
     737            0 :          kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
     738              :          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     739              :          if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     740              :          if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     741              :          if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     742              :          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     743              :          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     744            0 :          ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     745              :          elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     746            0 : &         0.125_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     747            0 :          if (present(elph_tr_ds)) then
     748            0 :            do iFSband=1,elph_ds%ngkkband !FS bands
     749            0 :              iband=iFSband+elph_ds%minFSband-1 ! full bands
     750            0 :              do icomp = 1, 3
     751              :                elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     752            0 : &               0.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     753            0 :                do jcomp = 1, 3
     754              :                  elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     755              : &                 elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     756              : &                 0.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     757            0 : &                 elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     758              :                end do
     759              :              end do
     760              :            end do
     761              :          end if
     762              : 
     763            0 :          iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
     764            0 :          jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
     765            0 :          kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
     766            0 :          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     767              :          if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     768              :          if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     769            0 :          if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     770              :          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     771              :          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     772            0 :          ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     773              :          elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     774            0 : &         0.125_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     775            0 :          if (present(elph_tr_ds)) then
     776            0 :            do iFSband=1,elph_ds%ngkkband !FS bands
     777            0 :              iband=iFSband+elph_ds%minFSband-1 ! full bands
     778            0 :              do icomp = 1, 3
     779              :                elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     780            0 : &               0.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     781            0 :                do jcomp = 1, 3
     782              :                  elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     783              : &                 elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     784              : &                 0.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     785            0 : &                 elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     786              :                end do
     787              :              end do
     788              :            end do
     789              :          end if
     790              : 
     791            0 :          iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
     792            0 :          jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
     793            0 :          kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
     794              :          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     795              :          if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     796              :          if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     797              :          if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     798              :          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     799              :          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     800            0 :          ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     801              :          elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     802            0 : &         0.125_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     803            0 :          if (present(elph_tr_ds)) then
     804            0 :            do iFSband=1,elph_ds%ngkkband !FS bands
     805            0 :              iband=iFSband+elph_ds%minFSband-1 ! full bands
     806            0 :              do icomp = 1, 3
     807              :                elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     808            0 : &               0.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     809            0 :                do jcomp = 1, 3
     810              :                  elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     811              : &                 elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     812              : &                 0.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     813            0 : &                 elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     814              :                end do
     815              :              end do
     816              :            end do
     817              :          end if
     818              : 
     819            0 :          iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
     820            0 :          jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
     821            0 :          kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
     822              :          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     823              :          if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     824              :          if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     825              :          if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     826              :          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     827              :          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     828            0 :          ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     829              :          elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     830            0 : &         0.125_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     831            0 :          if (present(elph_tr_ds)) then
     832            0 :            do iFSband=1,elph_ds%ngkkband !FS bands
     833            0 :              iband=iFSband+elph_ds%minFSband-1 ! full bands
     834            0 :              do icomp = 1, 3
     835              :                elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     836            0 : &               0.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     837            0 :                do jcomp = 1, 3
     838              :                  elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     839              : &                 elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     840              : &                 0.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     841            0 : &                 elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     842              :                end do
     843              :              end do
     844              :            end do
     845              :          end if
     846              : 
     847            0 :          iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
     848            0 :          jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
     849            0 :          kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
     850              :          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     851              :          if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     852              :          if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     853              :          if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     854              :          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     855              :          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     856            0 :          ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     857              :          elph_ds%k_phon%wtk(:,ikpt_phon,:)=elph_ds%k_phon%wtk(:,ikpt_phon,:)+&
     858            0 : &         0.125_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
     859            0 :          if (present(elph_tr_ds)) then
     860            0 :            do iFSband=1,elph_ds%ngkkband !FS bands
     861            0 :              iband=iFSband+elph_ds%minFSband-1 ! full bands
     862            0 :              do icomp = 1, 3
     863              :                elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
     864            0 : &               0.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
     865            0 :                do jcomp = 1, 3
     866              :                  elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:) = &
     867              : &                 elph_ds%k_phon%vvelocwtk(iFSband,ikpt_phon,icomp,jcomp,:)+&
     868              : &                 0.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)* &
     869            0 : &                 elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,jcomp,:)
     870              :                end do
     871              :              end do
     872              :            end do
     873              :          end if
     874              :        end if
     875              :      end do
     876              :    end do
     877              :  end do
     878              : 
     879              : !bxu, divide by nscale^3 to be consistent with the normalization of kpt_phon
     880            0 :  elph_ds%k_phon%wtk = elph_ds%k_phon%wtk/nscale1/nscale2/nscale3
     881            0 :  if (present(elph_tr_ds)) then
     882            0 :    elph_ds%k_phon%velocwtk = elph_ds%k_phon%velocwtk/nscale1/nscale2/nscale3
     883            0 :    elph_ds%k_phon%vvelocwtk = elph_ds%k_phon%vvelocwtk/nscale1/nscale2/nscale3
     884              :  end if
     885              : 
     886            0 : end subroutine d2c_weights
     887              : !!***
     888              : 
     889              : !!****f* ABINIT/d2c_wtq
     890              : !! NAME
     891              : !!  d2c_wtq
     892              : !!
     893              : !! FUNCTION
     894              : !!  This routine calculates the integration weights on a coarse k-grid
     895              : !!  using the integration weights from a denser k-gird. The weights of
     896              : !!  the extra k points that being shared are evenly distributed.
     897              : !!
     898              : !! INPUTS
     899              : !!  elph_ds%k_fine%nkpt = number of fine q-points
     900              : !!  elph_ds%k_fine%wtq = integration weights of the fine q-grid
     901              : !!  elph_ds%k_phon%nkpt = number of coarse q-points
     902              : !!
     903              : !! OUTPUT
     904              : !!  elph_ds%k_phon%wtq = integration weights of the coarse k-grid
     905              : !!
     906              : !! SOURCE
     907              : 
     908            0 : subroutine d2c_wtq(elph_ds)
     909              : 
     910              : !Arguments ------------------------------------
     911              :  type(elph_type),intent(inout) :: elph_ds
     912              : 
     913              : !Local variables-------------------------------
     914              :  integer :: ii, jj, kk
     915              :  integer :: ikpt, jkpt, kkpt
     916              :  integer :: iikpt, jjkpt, kkkpt
     917              :  integer :: ikpt_fine, ikpt_phon
     918              :  integer :: nkpt_fine1, nkpt_phon1
     919              :  integer :: nkpt_fine2, nkpt_phon2
     920              :  integer :: nkpt_fine3, nkpt_phon3
     921              :  integer :: nscale1, nscale2, nscale3
     922              : 
     923              : ! *************************************************************************
     924            0 :  nkpt_phon1 = elph_ds%kptrlatt(1,1)
     925            0 :  nkpt_phon2 = elph_ds%kptrlatt(2,2)
     926            0 :  nkpt_phon3 = elph_ds%kptrlatt(3,3)
     927            0 :  nkpt_fine1 = elph_ds%kptrlatt_fine(1,1)
     928            0 :  nkpt_fine2 = elph_ds%kptrlatt_fine(2,2)
     929            0 :  nkpt_fine3 = elph_ds%kptrlatt_fine(3,3)
     930            0 :  nscale1 = dble(nkpt_fine1/nkpt_phon1)
     931            0 :  nscale2 = dble(nkpt_fine2/nkpt_phon2)
     932            0 :  nscale3 = dble(nkpt_fine3/nkpt_phon3)
     933              :  if (abs(INT(nscale1)-nscale1) > 0.01) then
     934              :    ABI_ERROR('The denser k-gird MUST be multiples of the phon k-grid')
     935              :  end if
     936              :  if (abs(INT(nscale2)-nscale2) > 0.01) then
     937              :    ABI_ERROR('The denser k-gird MUST be multiples of the phon k-grid')
     938              :  end if
     939              :  if (abs(INT(nscale3)-nscale3) > 0.01) then
     940              :    ABI_ERROR('The denser k-gird MUST be multiples of the phon k-grid')
     941              :  end if
     942            0 :  nscale1 = INT(nscale1)
     943            0 :  nscale2 = INT(nscale2)
     944            0 :  nscale3 = INT(nscale3)
     945              : 
     946              : !bxu, get wtq of coarse grid from fine grid
     947            0 :  elph_ds%k_phon%wtq = zero
     948              : 
     949            0 :  do ikpt = 1, nkpt_phon1
     950            0 :    do jkpt = 1, nkpt_phon2
     951            0 :      do kkpt = 1, nkpt_phon3
     952            0 :        ikpt_phon = kkpt + (jkpt-1)*nkpt_phon3 + (ikpt-1)*nkpt_phon2*nkpt_phon3
     953              : !      inside the paralellepipe
     954            0 :        do ii = -((nscale1+1)/2-1), ((nscale1+1)/2-1)
     955            0 :          do jj = -((nscale2+1)/2-1), ((nscale2+1)/2-1)
     956            0 :            do kk = -((nscale3+1)/2-1), ((nscale3+1)/2-1)
     957            0 :              iikpt = 1 + (ikpt-1)*nscale1 + ii
     958            0 :              jjkpt = 1 + (jkpt-1)*nscale2 + jj
     959            0 :              kkkpt = 1 + (kkpt-1)*nscale3 + kk
     960            0 :              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     961            0 :              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     962            0 :              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     963            0 :              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     964            0 :              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     965            0 :              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     966            0 :              ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     967              :              elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
     968            0 : &             elph_ds%k_fine%wtq(:,ikpt_fine,:)
     969              :            end do
     970              :          end do
     971              :        end do
     972              : !      on the 6 faces
     973            0 :        if (MOD(nscale3,2) == 0) then ! when nscale3 is an even number
     974            0 :          do ii = -((nscale1+1)/2-1), ((nscale1+1)/2-1)
     975            0 :            do jj = -((nscale2+1)/2-1), ((nscale2+1)/2-1)
     976            0 :              iikpt = 1 + (ikpt-1)*nscale1 + ii
     977            0 :              jjkpt = 1 + (jkpt-1)*nscale2 + jj
     978            0 :              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
     979            0 :              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
     980            0 :              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
     981            0 :              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
     982              : 
     983            0 :              kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
     984            0 :              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     985            0 :              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     986            0 :              ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     987              :              elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
     988            0 : &             0.5_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
     989              : 
     990            0 :              kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
     991            0 :              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
     992            0 :              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
     993            0 :              ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
     994              :              elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
     995            0 : &             0.5_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
     996              :            end do
     997              :          end do
     998              :        end if
     999            0 :        if (MOD(nscale2,2) == 0) then ! when nscale2 is an even number
    1000            0 :          do ii = -((nscale1+1)/2-1), ((nscale1+1)/2-1)
    1001            0 :            do kk = -((nscale3+1)/2-1), ((nscale3+1)/2-1)
    1002            0 :              iikpt = 1 + (ikpt-1)*nscale1 + ii
    1003            0 :              kkkpt = 1 + (kkpt-1)*nscale3 + kk
    1004            0 :              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1005            0 :              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1006            0 :              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1007            0 :              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1008              : 
    1009            0 :              jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
    1010            0 :              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1011            0 :              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1012            0 :              ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1013              :              elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1014            0 : &             0.5_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1015              : 
    1016            0 :              jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
    1017            0 :              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1018            0 :              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1019            0 :              ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1020              :              elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1021            0 : &             0.5_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1022              :            end do
    1023              :          end do
    1024              :        end if
    1025            0 :        if (MOD(nscale1,2) == 0) then ! when nscale1 is an even number
    1026            0 :          do kk = -((nscale3+1)/2-1), ((nscale3+1)/2-1)
    1027            0 :            do jj = -((nscale2+1)/2-1), ((nscale2+1)/2-1)
    1028            0 :              kkkpt = 1 + (kkpt-1)*nscale3 + kk
    1029            0 :              jjkpt = 1 + (jkpt-1)*nscale2 + jj
    1030            0 :              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1031            0 :              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1032            0 :              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1033            0 :              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1034              : 
    1035            0 :              iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
    1036            0 :              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1037            0 :              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1038            0 :              ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1039              :              elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1040            0 : &             0.5_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1041              : 
    1042            0 :              iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
    1043            0 :              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1044            0 :              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1045            0 :              ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1046              :              elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1047            0 : &             0.5_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1048              :            end do
    1049              :          end do
    1050              : !        on the 12 sides
    1051              :        end if
    1052            0 :        if (MOD(nscale2,2) == 0 .and. MOD(nscale3,2) == 0) then
    1053            0 :          do ii = -((nscale1+1)/2-1), ((nscale1+1)/2-1)
    1054            0 :            iikpt = 1 + (ikpt-1)*nscale1 + ii
    1055            0 :            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1056            0 :            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1057              : 
    1058            0 :            jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
    1059            0 :            kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
    1060            0 :            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1061            0 :            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1062            0 :            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1063            0 :            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1064            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1065              :            elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1066            0 : &           0.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1067              : 
    1068            0 :            jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
    1069            0 :            kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
    1070              :            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1071              :            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1072            0 :            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1073            0 :            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1074            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1075              :            elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1076            0 : &           0.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1077              : 
    1078            0 :            jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
    1079            0 :            kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
    1080            0 :            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1081            0 :            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1082              :            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1083              :            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1084            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1085              :            elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1086            0 : &           0.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1087              : 
    1088            0 :            jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
    1089            0 :            kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
    1090              :            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1091              :            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1092              :            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1093              :            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1094            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1095              :            elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1096            0 : &           0.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1097              :          end do
    1098              :        end if
    1099            0 :        if (MOD(nscale1,2) == 0 .and. MOD(nscale3,2) == 0) then
    1100            0 :          do jj = -((nscale2+1)/2-1), ((nscale2+1)/2-1)
    1101            0 :            jjkpt = 1 + (jkpt-1)*nscale2 + jj
    1102            0 :            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1103            0 :            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1104              : 
    1105            0 :            iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
    1106            0 :            kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
    1107            0 :            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1108            0 :            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1109            0 :            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1110            0 :            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1111            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1112              :            elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1113            0 : &           0.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1114              : 
    1115            0 :            iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
    1116            0 :            kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
    1117              :            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1118              :            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1119            0 :            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1120            0 :            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1121            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1122              :            elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1123            0 : &           0.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1124              : 
    1125            0 :            iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
    1126            0 :            kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
    1127            0 :            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1128            0 :            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1129              :            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1130              :            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1131            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1132              :            elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1133            0 : &           0.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1134              : 
    1135            0 :            iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
    1136            0 :            kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
    1137              :            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1138              :            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1139              :            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1140              :            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1141            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1142              :            elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1143            0 : &           0.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1144              :          end do
    1145              :        end if
    1146            0 :        if (MOD(nscale2,2) == 0 .and. MOD(nscale1,2) == 0) then
    1147            0 :          do kk = -((nscale3+1)/2-1), ((nscale3+1)/2-1)
    1148            0 :            kkkpt = 1 + (kkpt-1)*nscale3 + kk
    1149            0 :            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1150            0 :            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1151              : 
    1152            0 :            jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
    1153            0 :            iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
    1154            0 :            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1155            0 :            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1156            0 :            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1157            0 :            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1158            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1159              :            elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1160            0 : &           0.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1161              : 
    1162            0 :            jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
    1163            0 :            iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
    1164              :            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1165              :            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1166            0 :            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1167            0 :            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1168            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1169              :            elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1170            0 : &           0.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1171              : 
    1172            0 :            jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
    1173            0 :            iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
    1174            0 :            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1175            0 :            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1176              :            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1177              :            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1178            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1179              :            elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1180            0 : &           0.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1181              : 
    1182            0 :            jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
    1183            0 :            iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
    1184              :            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1185              :            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1186              :            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1187              :            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1188            0 :            ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1189              :            elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1190            0 : &           0.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1191              :          end do
    1192              : !        on the 8 corners
    1193              :        end if
    1194            0 :        if (MOD(nscale1,2) == 0 .and. MOD(nscale2,2) == 0 .and. MOD(nscale3,2) == 0) then
    1195            0 :          iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
    1196            0 :          jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
    1197            0 :          kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
    1198            0 :          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1199            0 :          if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1200            0 :          if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1201            0 :          if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1202            0 :          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1203            0 :          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1204            0 :          ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1205              :          elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1206            0 : &         0.125_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1207              : 
    1208            0 :          iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
    1209            0 :          jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
    1210            0 :          kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
    1211              :          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1212              :          if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1213            0 :          if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1214              :          if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1215              :          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1216            0 :          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1217            0 :          ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1218              :          elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1219            0 : &         0.125_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1220              : 
    1221            0 :          iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
    1222            0 :          jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
    1223            0 :          kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
    1224              :          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1225            0 :          if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1226              :          if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1227              :          if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1228            0 :          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1229              :          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1230            0 :          ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1231              :          elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1232            0 : &         0.125_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1233              : 
    1234            0 :          iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
    1235            0 :          jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
    1236            0 :          kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
    1237              :          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1238              :          if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1239              :          if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1240              :          if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1241              :          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1242              :          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1243            0 :          ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1244              :          elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1245            0 : &         0.125_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1246              : 
    1247            0 :          iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
    1248            0 :          jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
    1249            0 :          kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
    1250            0 :          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1251              :          if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1252              :          if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1253            0 :          if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1254              :          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1255              :          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1256            0 :          ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1257              :          elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1258            0 : &         0.125_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1259              : 
    1260            0 :          iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
    1261            0 :          jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
    1262            0 :          kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
    1263              :          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1264              :          if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1265              :          if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1266              :          if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1267              :          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1268              :          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1269            0 :          ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1270              :          elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1271            0 : &         0.125_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1272              : 
    1273            0 :          iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
    1274            0 :          jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
    1275            0 :          kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
    1276              :          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1277              :          if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1278              :          if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1279              :          if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1280              :          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1281              :          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1282            0 :          ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1283              :          elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1284            0 : &         0.125_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1285              : 
    1286            0 :          iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
    1287            0 :          jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
    1288            0 :          kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
    1289              :          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
    1290              :          if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
    1291              :          if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
    1292              :          if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
    1293              :          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
    1294              :          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
    1295            0 :          ikpt_fine = kkkpt + (jjkpt-1)*nkpt_fine3 + (iikpt-1)*nkpt_fine2*nkpt_fine3
    1296              :          elph_ds%k_phon%wtq(:,ikpt_phon,:)=elph_ds%k_phon%wtq(:,ikpt_phon,:)+&
    1297            0 : &         0.125_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
    1298              :        end if
    1299              :      end do
    1300              :    end do
    1301              :  end do
    1302              : 
    1303              : !bxu, divide by nscale^3 to be consistent with the normalization of kpt_phon
    1304            0 :  elph_ds%k_phon%wtq = elph_ds%k_phon%wtq/nscale1/nscale2/nscale3
    1305              : 
    1306            0 : end subroutine d2c_wtq
    1307              : !!***
    1308              : 
    1309              : !!****f* ABINIT/ep_el_weights
    1310              : !!
    1311              : !! NAME
    1312              : !! ep_el_weights
    1313              : !!
    1314              : !! FUNCTION
    1315              : !! This routine calculates the Fermi Surface integration weights
    1316              : !! for the electron phonon routines, by different methods
    1317              : !!
    1318              : !!    1) Gaussian smearing
    1319              : !!    2) Tetrahedron method
    1320              : !!    3) Window in bands for all k-points
    1321              : !!    4) Fermi Dirac smearing, follows gaussian with a different smearing function
    1322              : !!
    1323              : !! INPUTS
    1324              : !!   ep_b_min = minimal band to include in FS window integration
    1325              : !!   ep_b_max = maximal band to include in FS window integration
    1326              : !!   eigenGS = Ground State eigenvalues
    1327              : !!   elphsmear = smearing width for Gaussian method
    1328              : !!   fermie = Fermi level
    1329              : !!   gprimd = Reciprocal lattice vectors (dimensionful)
    1330              : !!   irredtoGS = mapping of elph k-points to ground state grid
    1331              : !!   kptrlatt = k-point grid vectors (if divided by determinant of present matrix)
    1332              : !!   max_occ = maximal occupancy for a band
    1333              : !!   minFSband = minimal band included for Fermi Surface integration in Gaussian and Tetrahedron cases
    1334              : !!   nFSband = number of bands in FS integration
    1335              : !!   nsppol = number of spin polarizations
    1336              : !!   telphint = option for FS integration:
    1337              : !!      0 Tetrahedron method
    1338              : !!      1 Gaussian smearing
    1339              : !!      2 Window in bands for all k-points
    1340              : !!      3 Fermi Dirac smearing
    1341              : !!   k_obj%nkpt = number of FS k-points
    1342              : !!   k_obj%kpt = FS k-points
    1343              : !!   k_obj%full2irr = mapping of FS k-points from full grid to irred points
    1344              : !!   k_obj%full2full = mapping of FS k-points in full grid under symops
    1345              : !!
    1346              : !! OUTPUT
    1347              : !!
    1348              : !! TODO
    1349              : !!   weights should be recalculated on-the-fly! The present implementation is not flexible!
    1350              : !!
    1351              : !! SOURCE
    1352              : 
    1353            0 : subroutine ep_el_weights(ep_b_min, ep_b_max, eigenGS, elphsmear, enemin, enemax, nene, gprimd, &
    1354            0 : &    irredtoGS, kptrlatt, max_occ, minFSband, nband, nFSband, nsppol, telphint, k_obj, tmp_wtk)
    1355              : 
    1356              : !Arguments ------------------------------------
    1357              : !scalars
    1358              :  type(elph_kgrid_type), intent(in) :: k_obj
    1359              :  integer, intent(in) :: ep_b_min
    1360              :  integer, intent(in) :: ep_b_max
    1361              :  integer,intent(in) :: nband,nene
    1362              :  real(dp), intent(in) :: elphsmear
    1363              :  real(dp), intent(in) :: enemin,enemax
    1364              :  real(dp), intent(in) :: gprimd(3,3)
    1365              :  integer, intent(in) :: kptrlatt(3,3)
    1366              :  real(dp), intent(in) :: max_occ
    1367              :  integer, intent(in) :: minFSband
    1368              :  integer, intent(in) :: nFSband
    1369              :  integer, intent(in) :: nsppol
    1370              :  integer, intent(in) :: telphint
    1371              : 
    1372              : ! arrays
    1373              :  real(dp), intent(in) :: eigenGS(nband,k_obj%nkptirr,nsppol)
    1374              :  real(dp), intent(out) :: tmp_wtk(nFSband,k_obj%nkpt,nsppol,nene)
    1375              :  integer, intent(in) :: irredtoGS(k_obj%nkptirr)
    1376              : 
    1377              : !Local variables-------------------------------
    1378              : !scalars
    1379              :  integer,parameter :: bcorr0=0
    1380              :  integer :: ikpt, ikptgs, ib1, iband
    1381              :  integer :: ierr, ie, isppol
    1382              :  real(dp) :: deltaene, rcvol, fermie
    1383              :  real(dp) :: smdeltaprefactor, smdeltafactor, xx
    1384              : 
    1385              : ! arrays
    1386              :  real(dp) :: rlatt(3,3), klatt(3,3)
    1387            0 :  real(dp), allocatable :: tmp_eigen(:), tweight(:,:), dtweightde(:,:)
    1388              :  character (len=500) :: message
    1389              :  character (len=80) :: errstr
    1390            0 :  type(t_tetrahedron) :: tetrahedra
    1391              :  !type(htetra_t) :: tetrahedra
    1392              : 
    1393              : ! *************************************************************************
    1394              : 
    1395              :  ! Initialize tmp_wtk with zeros
    1396            0 :  tmp_wtk = zero
    1397              : 
    1398              :  !write(std_out,*) 'ep_el : nkpt ', k_obj%nkpt
    1399              : !===================================
    1400              : !Set up integration weights for FS
    1401              : !===================================
    1402            0 :  deltaene = (enemax-enemin)/dble(nene-1)
    1403              : 
    1404            0 :  if (telphint == 0) then
    1405              : 
    1406              : !  =========================
    1407              : !  Tetrahedron integration
    1408              : !  =========================
    1409              : 
    1410            0 :    rlatt(:,:) = kptrlatt(:,:)
    1411            0 :    call matr3inv(rlatt,klatt)
    1412              : 
    1413              :    call init_tetra(k_obj%full2full(1,1,:), gprimd,klatt,k_obj%kpt, k_obj%nkpt,&
    1414            0 :      tetrahedra, ierr, errstr, xmpi_comm_self)
    1415              :    !call htetra_init(tetra, k_obj%full2full(1,1,:), gprimd, klatt, k_obj%kpt, k_obj%nkpt, &
    1416              :    !                 k_obk%nkptirr, nkpt_ibz, ierr, errstr, xmpi_comm_self)
    1417              : 
    1418            0 :    ABI_CHECK(ierr==0,errstr)
    1419              : 
    1420              :    rcvol = abs (gprimd(1,1)*(gprimd(2,2)*gprimd(3,3)-gprimd(3,2)*gprimd(2,3)) &
    1421              : &   -gprimd(2,1)*(gprimd(1,2)*gprimd(3,3)-gprimd(3,2)*gprimd(1,3)) &
    1422            0 : &   +gprimd(3,1)*(gprimd(1,2)*gprimd(2,3)-gprimd(2,2)*gprimd(1,3)))
    1423              : 
    1424              : !  fix small window around fermie for tetrahedron weight calculation
    1425            0 :    deltaene = (enemax-enemin)/dble(nene-1)
    1426              : 
    1427            0 :    ABI_MALLOC(tmp_eigen,(k_obj%nkpt))
    1428            0 :    ABI_MALLOC(tweight,(k_obj%nkpt,nene))
    1429            0 :    ABI_MALLOC(dtweightde,(k_obj%nkpt,nene))
    1430              : 
    1431            0 :    do iband = 1,nFSband
    1432              : !    for each spin pol
    1433            0 :      do isppol=1,nsppol
    1434              : !    For this band get its contribution
    1435            0 :        tmp_eigen(:) = zero
    1436            0 :        do ikpt=1,k_obj%nkpt
    1437            0 :          ikptgs = irredtoGS(k_obj%full2irr(1,ikpt))
    1438            0 :          tmp_eigen(ikpt) = eigenGS(minFSband+iband-1,ikptgs,isppol)
    1439              :        end do
    1440              : !      calculate general integration weights at each irred kpoint
    1441              : !      as in Blochl et al PRB 49 16223 [[cite:Bloechl1994a]]
    1442              :        call get_tetra_weight(tmp_eigen,enemin,enemax,&
    1443              : &       max_occ,nene,k_obj%nkpt,tetrahedra,bcorr0,&
    1444            0 : &       tweight,dtweightde,xmpi_comm_self)
    1445              : 
    1446            0 :        tmp_wtk(iband,:,isppol,:) = dtweightde(:,:)*k_obj%nkpt
    1447              :      end do
    1448              :    end do
    1449            0 :    ABI_FREE(tmp_eigen)
    1450            0 :    ABI_FREE(tweight)
    1451            0 :    ABI_FREE(dtweightde)
    1452              : 
    1453            0 :    call destroy_tetra(tetrahedra)
    1454              :    !call tetrahedra%free()
    1455              : 
    1456            0 :  else if (telphint == 1) then
    1457              : 
    1458              : !  ==============================================================
    1459              : !  Gaussian or integration:
    1460              : !  Each kpt contributes a gaussian of integrated weight 1
    1461              : !  for each band. The gaussian being centered at the Fermi level.
    1462              : !  ===============================================================
    1463              : 
    1464              : !  took out factor 1/k_obj%nkpt which intervenes only at integration time
    1465              : 
    1466              : !  MJV 18/5/2008 does smdeltaprefactor need to contain max_occ?
    1467              : 
    1468              : !  gaussian smdeltaprefactor = sqrt(piinv)/elphsmear/k_obj%nkpt
    1469            0 :    smdeltaprefactor = max_occ*sqrt(piinv)/elphsmear
    1470            0 :    smdeltafactor = one/elphsmear
    1471              : 
    1472              : !  SPPOL loop on isppol as well to get 2 sets of weights
    1473            0 :    do isppol=1,nsppol
    1474              :      fermie = enemin
    1475            0 :      do ie = 1, nene
    1476            0 :        fermie = fermie + deltaene
    1477              : !      fine grid
    1478            0 :        do ikpt=1, k_obj%nkpt
    1479            0 :          ikptgs = irredtoGS(k_obj%full2irr(1,ikpt))
    1480            0 :          do ib1=1,nFSband
    1481            0 :            xx = smdeltafactor*(eigenGS(minFSband-1+ib1,ikptgs,isppol) - fermie)
    1482            0 :            if (abs(xx) < 40._dp) then
    1483            0 :              tmp_wtk(ib1,ikpt,isppol,ie) = exp(-xx*xx)*smdeltaprefactor
    1484              :            end if
    1485              :          end do
    1486              :        end do
    1487              :      end do
    1488              :    end do
    1489              : 
    1490              : 
    1491            0 :  else if (telphint == 2) then ! range of bands occupied
    1492              : 
    1493              : !  SPPOL eventually be able to specify bands for up and down separately
    1494              :    fermie = enemin
    1495            0 :    do ie = 1, nene
    1496            0 :      fermie = fermie + deltaene
    1497            0 :      do ikpt=1,k_obj%nkpt
    1498            0 :        do ib1=ep_b_min, ep_b_max
    1499              : !        for the moment both spin channels same
    1500            0 :          tmp_wtk(ib1,ikpt,:,ie) = max_occ
    1501              :        end do
    1502              :      end do
    1503              :    end do
    1504              : 
    1505            0 :    write(std_out,*) ' ep_el_weights : DOS is calculated from states in bands ',ep_b_min,' to ',ep_b_max
    1506              : 
    1507            0 :  else if (telphint == 3) then
    1508              : 
    1509              : !  ==============================================================
    1510              : !  Fermi Dirac integration:
    1511              : !  Each kpt contributes a Fermi Dirac smearing function of integrated weight 1
    1512              : !  for each band. The function being centered at the Fermi level.
    1513              : !  ===============================================================
    1514              : 
    1515              : !  took out factor 1/k_obj%nkpt which intervenes only at integration time
    1516              : 
    1517              : !  MJV 18/5/2008 does smdeltaprefactor need to contain max_occ?
    1518              : 
    1519              : !  gaussian smdeltaprefactor = sqrt(piinv)/elphsmear/k_obj%nkpt
    1520            0 :    smdeltaprefactor = half*max_occ/elphsmear
    1521            0 :    smdeltafactor = one/elphsmear
    1522              : 
    1523              : !  SPPOL loop on isppol as well to get 2 sets of weights
    1524            0 :    do isppol=1,nsppol
    1525              :      fermie = enemin
    1526            0 :      do ie = 1, nene
    1527            0 :        fermie = fermie + deltaene
    1528              : !      fine grid
    1529            0 :        do ikpt=1, k_obj%nkpt
    1530            0 :          ikptgs = irredtoGS(k_obj%full2irr(1,ikpt))
    1531            0 :          do ib1=1,nFSband
    1532            0 :            xx = smdeltafactor*(eigenGS(minFSband-1+ib1,ikptgs,isppol) - fermie)
    1533            0 :            tmp_wtk(ib1,ikpt,isppol,ie) = smdeltaprefactor / (one + cosh(xx))
    1534              :          end do
    1535              :        end do
    1536              :      end do
    1537              :    end do
    1538              : 
    1539              : 
    1540              :  else
    1541            0 :    write (message,'(a,i0)')" telphint should be between 0 and 3, found: ",telphint
    1542            0 :    ABI_BUG(message)
    1543              :  end if ! if telphint
    1544              : 
    1545            0 : end subroutine ep_el_weights
    1546              : !!***
    1547              : 
    1548              : !!****f* ABINIT/ep_fs_weights
    1549              : !!
    1550              : !! NAME
    1551              : !! ep_fs_weights
    1552              : !!
    1553              : !! FUNCTION
    1554              : !! This routine calculates the Fermi Surface integration weights
    1555              : !!  for the electron phonon routines, by different methods
    1556              : !!    1) Gaussian smearing
    1557              : !!    2) Tetrahedron method
    1558              : !!    3) Window in bands for all k-points
    1559              : !!    4) Fermi Dirac smearing, follows gaussian with a different smearing function
    1560              : !!
    1561              : !! INPUTS
    1562              : !!   ep_b_min = minimal band to include in FS window integration
    1563              : !!   ep_b_max = maximal band to include in FS window integration
    1564              : !!   eigenGS = Ground State eigenvalues
    1565              : !!   elphsmear = smearing width for Gaussian method
    1566              : !!   fermie = Fermi level
    1567              : !!   gprimd = Reciprocal lattice vectors (dimensionful)
    1568              : !!   irredtoGS = mapping of elph k-points to ground state grid
    1569              : !!   kptrlatt = k-point grid vectors (if divided by determinant of present matrix)
    1570              : !!   max_occ = maximal occupancy for a band
    1571              : !!   minFSband = minimal band included for Fermi Surface integration in Gaussian and Tetrahedron cases
    1572              : !!   nFSband = number of bands in FS integration
    1573              : !!   nsppol = number of spin polarizations
    1574              : !!   telphint = option for FS integration:
    1575              : !!      0 Tetrahedron method
    1576              : !!      1 Gaussian smearing
    1577              : !!      2 Window in bands for all k-points
    1578              : !!      3 Fermi Dirac smearing
    1579              : !!   k_obj%nkpt = number of FS k-points
    1580              : !!   k_obj%kpt = FS k-points
    1581              : !!   k_obj%full2irr = mapping of FS k-points from full grid to irred points
    1582              : !!   k_obj%full2full = mapping of FS k-points in full grid under symops
    1583              : !!
    1584              : !! OUTPUT
    1585              : !!   k_obj%wtk = integration weights
    1586              : !!
    1587              : !! TODO
    1588              : !!   weights should be recalculated on-the-fly! The present implementation is not flexible!
    1589              : !!
    1590              : !! SOURCE
    1591              : 
    1592           15 : subroutine ep_fs_weights(ep_b_min, ep_b_max, eigenGS, elphsmear, fermie, gprimd, &
    1593           15 : &    irredtoGS, kptrlatt, max_occ, minFSband, nband, nFSband, nsppol, telphint, k_obj)
    1594              : 
    1595              : !Arguments ------------------------------------
    1596              : !scalars
    1597              :  type(elph_kgrid_type), intent(inout) :: k_obj
    1598              :  integer, intent(in) :: ep_b_min
    1599              :  integer, intent(in) :: ep_b_max
    1600              :  integer,intent(in) :: nband
    1601              :  real(dp), intent(in) :: elphsmear
    1602              :  real(dp), intent(in) :: fermie
    1603              :  real(dp), intent(in) :: gprimd(3,3)
    1604              :  integer, intent(in) :: kptrlatt(3,3)
    1605              :  real(dp), intent(in) :: max_occ
    1606              :  integer, intent(in) :: minFSband
    1607              :  integer, intent(in) :: nFSband
    1608              :  integer, intent(in) :: nsppol
    1609              :  integer, intent(in) :: telphint
    1610              : 
    1611              : ! arrays
    1612              :  real(dp), intent(in) :: eigenGS(nband,k_obj%nkptirr,nsppol)
    1613              :  integer, intent(in) :: irredtoGS(k_obj%nkptirr)
    1614              : 
    1615              : !Local variables-------------------------------
    1616              : !scalars
    1617              :  integer,parameter :: bcorr0=0
    1618              :  integer :: ikpt, ikptgs, ib1, isppol, iband
    1619              :  integer :: nene, ifermi
    1620              :  integer :: ierr
    1621              : 
    1622              :  real(dp) :: enemin, enemax, deltaene, rcvol
    1623              :  real(dp) :: smdeltaprefactor, smdeltafactor, xx
    1624              : 
    1625              : ! arrays
    1626              :  real(dp) :: rlatt(3,3), klatt(3,3)
    1627           15 :  real(dp), allocatable :: tmp_eigen(:), tweight(:,:), dtweightde(:,:)
    1628              : 
    1629              :  character (len=500) :: message
    1630              :  character (len=80) :: errstr
    1631              : 
    1632           15 :  type(t_tetrahedron) :: tetrahedra
    1633              : 
    1634              : ! *************************************************************************
    1635              : 
    1636           15 :  write(std_out,*) 'ep_fs : nkpt ', k_obj%nkpt
    1637           15 :  write(message, '(a)' ) '- ep_fs_weights  1  = '
    1638           15 :  call wrtout(std_out,message,'PERS')
    1639              : 
    1640              : !===================================
    1641              : !Set up integration weights for FS
    1642              : !===================================
    1643              : 
    1644           15 :  if (telphint == 0) then
    1645              : 
    1646              : !  =========================
    1647              : !  Tetrahedron integration
    1648              : !  =========================
    1649              : 
    1650           26 :    rlatt(:,:) = kptrlatt(:,:)
    1651            2 :    call matr3inv(rlatt,klatt)
    1652              : 
    1653              :    call init_tetra(k_obj%full2full(1,1,:), gprimd,klatt,k_obj%kpt, k_obj%nkpt,&
    1654          434 : &   tetrahedra, ierr, errstr, xmpi_comm_self)
    1655            2 :    ABI_CHECK(ierr==0,errstr)
    1656              : 
    1657              :    rcvol = abs (gprimd(1,1)*(gprimd(2,2)*gprimd(3,3)-gprimd(3,2)*gprimd(2,3)) &
    1658              : &   -gprimd(2,1)*(gprimd(1,2)*gprimd(3,3)-gprimd(3,2)*gprimd(1,3)) &
    1659            2 : &   +gprimd(3,1)*(gprimd(1,2)*gprimd(2,3)-gprimd(2,2)*gprimd(1,3)))
    1660              : 
    1661              : !  just do weights at FS
    1662            2 :    nene = 100
    1663              : 
    1664              : !  fix small window around fermie for tetrahedron weight calculation
    1665            2 :    deltaene = 2*elphsmear/dble(nene-1)
    1666            2 :    ifermi = int(nene/2)
    1667            2 :    enemin = fermie - dble(ifermi-1)*deltaene
    1668            2 :    enemax = enemin + dble(nene-1)*deltaene
    1669              : 
    1670            6 :    ABI_MALLOC(tmp_eigen,(k_obj%nkpt))
    1671            8 :    ABI_MALLOC(tweight,(k_obj%nkpt,nene))
    1672            6 :    ABI_MALLOC(dtweightde,(k_obj%nkpt,nene))
    1673              : 
    1674           14 :    do iband = 1,nFSband
    1675              : !    for each spin pol
    1676           26 :      do isppol=1,nsppol
    1677              : !      For this band get its contribution
    1678         2604 :        tmp_eigen(:) = zero
    1679         2604 :        do ikpt=1,k_obj%nkpt
    1680         2592 :          ikptgs = irredtoGS(k_obj%full2irr(1,ikpt))
    1681         2604 :          tmp_eigen(ikpt) = eigenGS(minFSband+iband-1,ikptgs,isppol)
    1682              :        end do
    1683              : !      calculate general integration weights at each irred kpoint
    1684              : !      as in Blochl et al PRB 49 16223 [[cite:Bloechl1994a]]
    1685              :        call get_tetra_weight(tmp_eigen,enemin,enemax,&
    1686              : &       max_occ,nene,k_obj%nkpt,tetrahedra,bcorr0,&
    1687           12 : &       tweight,dtweightde,xmpi_comm_self)
    1688              : 
    1689         2616 :        k_obj%wtk(iband,:,isppol) = dtweightde(:,ifermi)*k_obj%nkpt
    1690              :      end do
    1691              : 
    1692              :    end do
    1693            2 :    ABI_FREE(tmp_eigen)
    1694            2 :    ABI_FREE(tweight)
    1695            2 :    ABI_FREE(dtweightde)
    1696              : 
    1697            2 :    call destroy_tetra(tetrahedra)
    1698              : 
    1699           13 :  else if (telphint == 1) then
    1700              : 
    1701              : !  ==============================================================
    1702              : !  Gaussian or integration:
    1703              : !  Each kpt contributes a gaussian of integrated weight 1
    1704              : !  for each band. The gaussian being centered at the Fermi level.
    1705              : !  ===============================================================
    1706              : 
    1707              : !  took out factor 1/k_obj%nkpt which intervenes only at integration time
    1708              : 
    1709              : !  MJV 18/5/2008 does smdeltaprefactor need to contain max_occ?
    1710              : 
    1711              : !  gaussian smdeltaprefactor = sqrt(piinv)/elphsmear/k_obj%nkpt
    1712           12 :    smdeltaprefactor = max_occ*sqrt(piinv)/elphsmear
    1713           12 :    smdeltafactor = one/elphsmear
    1714              : 
    1715         6241 :    k_obj%wtk = zero
    1716              : !  SPPOL loop on isppol as well to get 2 sets of weights
    1717           25 :    do isppol=1,nsppol
    1718              : !    fine grid
    1719          849 :      do ikpt=1, k_obj%nkpt
    1720          824 :        ikptgs = irredtoGS(k_obj%full2irr(1,ikpt))
    1721         6229 :        do ib1=1,nFSband
    1722         5392 :          xx = smdeltafactor*(eigenGS(minFSband-1+ib1,ikptgs,isppol) - fermie)
    1723         6216 :          if (abs(xx) < 40._dp) then
    1724         3921 :            k_obj%wtk(ib1,ikpt,isppol) = exp(-xx*xx)*smdeltaprefactor
    1725              :          end if
    1726              :        end do
    1727              :      end do
    1728              :    end do
    1729              : 
    1730              : 
    1731            1 :  else if (telphint == 2) then ! range of bands occupied
    1732              : 
    1733              : !  SPPOL eventually be able to specify bands for up and down separately
    1734          450 :    k_obj%wtk = zero
    1735           65 :    do ikpt=1,k_obj%nkpt
    1736          449 :      do ib1=ep_b_min, ep_b_max
    1737              : !      for the moment both spin channels same
    1738          832 :        k_obj%wtk(ib1,ikpt,:) = max_occ
    1739              :      end do
    1740              :    end do
    1741              : 
    1742            1 :    write(std_out,*) ' ep_fs_weights : DOS is calculated from states in bands ',ep_b_min,' to ',ep_b_max
    1743              : 
    1744            0 :  else if (telphint == 3) then
    1745              : 
    1746              : !  ==============================================================
    1747              : !  Fermi Dirac integration:
    1748              : !  Each kpt contributes a Fermi Dirac smearing function of integrated weight 1
    1749              : !  for each band. The function being centered at the Fermi level.
    1750              : !  ===============================================================
    1751              : 
    1752              : !  took out factor 1/k_obj%nkpt which intervenes only at integration time
    1753              : 
    1754              : !  MJV 18/5/2008 does smdeltaprefactor need to contain max_occ?
    1755              : 
    1756              : !  gaussian smdeltaprefactor = sqrt(piinv)/elphsmear/k_obj%nkpt
    1757            0 :    smdeltaprefactor = half*max_occ/elphsmear
    1758            0 :    smdeltafactor = one/elphsmear
    1759              : 
    1760            0 :    k_obj%wtk = zero
    1761              : !  SPPOL loop on isppol as well to get 2 sets of weights
    1762            0 :    do isppol=1,nsppol
    1763              : !    fine grid
    1764            0 :      do ikpt=1, k_obj%nkpt
    1765            0 :        ikptgs = irredtoGS(k_obj%full2irr(1,ikpt))
    1766            0 :        do ib1=1,nFSband
    1767            0 :          xx = smdeltafactor*(eigenGS(minFSband-1+ib1,ikptgs,isppol) - fermie)
    1768            0 :          k_obj%wtk(ib1,ikpt,isppol) = smdeltaprefactor / (one + cosh(xx))
    1769              :        end do
    1770              :      end do
    1771              :    end do
    1772              : 
    1773              : 
    1774              :  else
    1775            0 :    write (message,'(a,i0)')" telphint should be between 0 and 3, found: ",telphint
    1776            0 :    ABI_BUG(message)
    1777              :  end if ! if telphint
    1778              : 
    1779           15 : end subroutine ep_fs_weights
    1780              : !!***
    1781              : 
    1782              : !!****f* ABINIT/ep_ph_weights
    1783              : !!
    1784              : !! NAME
    1785              : !! ep_ph_weights
    1786              : !!
    1787              : !! FUNCTION
    1788              : !! This routine calculates the phonon integration weights
    1789              : !!  for the electron phonon routines, by different methods
    1790              : !!    1) Gaussian smearing
    1791              : !!    0) Tetrahedron method
    1792              : !!
    1793              : !! INPUTS
    1794              : !!   phfrq = phonon energies
    1795              : !!   elphsmear = smearing width for Gaussian method
    1796              : !!   omega = input phonon energy
    1797              : !!   gprimd = Reciprocal lattice vectors (dimensionful)
    1798              : !!   kptrlatt = k-point grid vectors (if divided by determinant of present matrix)
    1799              : !!   telphint = option for FS integration:
    1800              : !!      0 Tetrahedron method
    1801              : !!      1 Gaussian smearing
    1802              : !!   k_obj%nkpt = number of FS k-points
    1803              : !!   k_obj%kpt = FS k-points
    1804              : !!   k_obj%full2full = mapping of FS k-points in full grid under symops
    1805              : !!
    1806              : !! OUTPUT
    1807              : !!   tmp_wtq = integration weights
    1808              : !!
    1809              : !! TODO
    1810              : !!   weights should be recalculated on-the-fly! The present implementation is not flexible!
    1811              : !!
    1812              : !! SOURCE
    1813              : 
    1814           15 : subroutine ep_ph_weights(phfrq,elphsmear,omega_min,omega_max,nomega,gprimd,kptrlatt,nbranch,telphint,k_obj,tmp_wtq)
    1815              : 
    1816              : !Arguments ------------------------------------
    1817              : !scalars
    1818              :  type(elph_kgrid_type), intent(inout) :: k_obj
    1819              :  integer,intent(in) :: nbranch
    1820              :  real(dp), intent(in) :: elphsmear
    1821              :  real(dp), intent(in) :: omega_min,omega_max
    1822              :  real(dp), intent(in) :: gprimd(3,3)
    1823              :  integer, intent(in) :: kptrlatt(3,3)
    1824              :  integer, intent(in) :: nomega
    1825              :  integer, intent(in) :: telphint
    1826              : 
    1827              : ! arrays
    1828              :  real(dp), intent(in) :: phfrq(nbranch,k_obj%nkpt)
    1829              :  real(dp), intent(out) :: tmp_wtq(nbranch,k_obj%nkpt,nomega)
    1830              : 
    1831              : !Local variables-------------------------------
    1832              : !scalars
    1833              :  integer,parameter :: bcorr0=0
    1834              :  integer :: ikpt, ib1, ibranch
    1835              :  integer :: ierr, iomega
    1836              :  real(dp) :: rcvol, max_occ
    1837              :  real(dp) :: smdeltaprefactor, smdeltafactor, xx, gaussmaxarg
    1838              :  real(dp) :: domega,omega
    1839              : 
    1840              : ! arrays
    1841              :  real(dp) :: rlatt(3,3), klatt(3,3)
    1842           15 :  real(dp), allocatable :: tweight(:,:), dtweightde(:,:)
    1843              :  character (len=80) :: errstr
    1844           15 :  type(t_tetrahedron) :: tetrahedra
    1845              : 
    1846              : ! *************************************************************************
    1847              : 
    1848              :  !write(std_out,*) 'ep_ph : nqpt ', k_obj%nkpt
    1849              : !===================================
    1850              : !Set up integration weights for FS
    1851              : !===================================
    1852           15 :  max_occ = one
    1853           15 :  gaussmaxarg = sqrt(-log(1.d-100))
    1854           15 :  domega = (omega_max - omega_min)/(nomega - 1)
    1855              : 
    1856           15 :  if (telphint == 0) then
    1857              : 
    1858              : !  =========================
    1859              : !  Tetrahedron integration
    1860              : !  =========================
    1861              : 
    1862           26 :    rlatt(:,:) = kptrlatt(:,:)
    1863            2 :    call matr3inv(rlatt,klatt)
    1864              : 
    1865              :    call init_tetra(k_obj%full2full(1,1,:), gprimd,klatt,k_obj%kpt, k_obj%nkpt,&
    1866          434 : &   tetrahedra, ierr, errstr, xmpi_comm_self)
    1867            2 :    ABI_CHECK(ierr==0,errstr)
    1868              : 
    1869              :    rcvol = abs (gprimd(1,1)*(gprimd(2,2)*gprimd(3,3)-gprimd(3,2)*gprimd(2,3)) &
    1870              : &   -gprimd(2,1)*(gprimd(1,2)*gprimd(3,3)-gprimd(3,2)*gprimd(1,3)) &
    1871            2 : &   +gprimd(3,1)*(gprimd(1,2)*gprimd(2,3)-gprimd(2,2)*gprimd(1,3)))
    1872              : 
    1873              : !  do all the omega points for tetrahedron weight calculation
    1874              : 
    1875            8 :    ABI_MALLOC(tweight,(k_obj%nkpt,nomega))
    1876            6 :    ABI_MALLOC(dtweightde,(k_obj%nkpt,nomega))
    1877              : 
    1878            8 :    do ibranch = 1,nbranch
    1879              :      call get_tetra_weight(phfrq(ibranch,:),omega_min,omega_max,&
    1880              : &     max_occ,nomega,k_obj%nkpt,tetrahedra,bcorr0,&
    1881         1302 : &     tweight,dtweightde,xmpi_comm_self)
    1882              : 
    1883       522110 :      tmp_wtq(ibranch,:,:) = dtweightde(:,:)*k_obj%nkpt
    1884              :    end do
    1885            2 :    ABI_FREE(tweight)
    1886            2 :    ABI_FREE(dtweightde)
    1887              : 
    1888            2 :    call destroy_tetra(tetrahedra)
    1889              : 
    1890           13 :  else if (telphint == 1) then
    1891              : 
    1892              : !  ==============================================================
    1893              : !  Gaussian or integration:
    1894              : !  Each kpt contributes a gaussian of integrated weight 1
    1895              : !  for each branch. The gaussian being centered at the input energy
    1896              : !  ===============================================================
    1897              : 
    1898              : !  took out factor 1/k_obj%nkpt which intervenes only at integration time
    1899              : 
    1900              : !  gaussian smdeltaprefactor = sqrt(piinv)/elphsmear/k_obj%nkpt
    1901           12 :    smdeltaprefactor = max_occ*sqrt(piinv)/elphsmear
    1902           12 :    smdeltafactor = one/elphsmear
    1903              : 
    1904      1486920 :    tmp_wtq = zero
    1905              :    omega = omega_min
    1906         4824 :    do iomega = 1, nomega
    1907         4812 :      omega = omega + domega
    1908       332040 :      do ikpt=1, k_obj%nkpt
    1909      1486908 :        do ib1=1,nbranch
    1910      1154880 :          xx = smdeltafactor*(phfrq(ib1,ikpt)-omega)
    1911      1482096 :          if (abs(xx) < gaussmaxarg) then
    1912       302668 :            tmp_wtq(ib1,ikpt,iomega) = exp(-xx*xx)*smdeltaprefactor
    1913              :          end if
    1914              :        end do
    1915              :      end do
    1916              :    end do
    1917              :  end if ! if telphint
    1918              : 
    1919           15 : end subroutine ep_ph_weights
    1920              : !!***
    1921              : 
    1922              : end module m_epweights
    1923              : !!***
        

Generated by: LCOV version 2.3-1