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-11-08 02:25:56 Functions: 40.0 % 5 2
Branches: 10.3 % 1334 137

             Branch data     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