TABLE OF CONTENTS


ABINIT/d2c_weights [ Functions ]

[ Top ] [ Functions ]

NAME

  d2c_weights

FUNCTION

  This routine calculates the integration weights on a coarse k-grid
  using the integration weights from a denser k-gird. The weights of
  the extra k points that being shared are evenly distributed. It also
  condenses the velocity*wtk and velcity^2*wtk.

INPUTS

  elph_ds%k_fine%nkpt = number of fine FS k-points
  elph_ds%k_fine%wtk = integration weights of the fine FS k-grid
  elph_ds%k_phon%nkpt = number of coarse FS k-points
  elph_tr_ds%el_veloc = electronic velocities from the fine k-grid

OUTPUT

  elph_ds%k_phon%wtk = integration weights of the coarse FS k-grid
  elph_ds%k_phon%velocwtk = velocity time integration weights of the coarse FS k-grid
  elph_ds%k_phon%vvelocwtk = velocity^2 time integration weights of the coarse FS k-grid

SOURCE

 72 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  nkpt_phon1 = elph_ds%kptrlatt(1,1)
 92  nkpt_phon2 = elph_ds%kptrlatt(2,2)
 93  nkpt_phon3 = elph_ds%kptrlatt(3,3)
 94  nkpt_fine1 = elph_ds%kptrlatt_fine(1,1)
 95  nkpt_fine2 = elph_ds%kptrlatt_fine(2,2)
 96  nkpt_fine3 = elph_ds%kptrlatt_fine(3,3)
 97  nscale1 = dble(nkpt_fine1/nkpt_phon1)
 98  nscale2 = dble(nkpt_fine2/nkpt_phon2)
 99  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  nscale1 = INT(nscale1)
110  nscale2 = INT(nscale2)
111  nscale3 = INT(nscale3)
112 
113 !bxu, get wtk of coarse grid from fine grid
114  elph_ds%k_phon%wtk = zero
115  if (present(elph_tr_ds)) then
116    elph_ds%k_phon%velocwtk = zero
117    elph_ds%k_phon%vvelocwtk = zero
118  end if
119 
120  do ikpt = 1, nkpt_phon1
121    do jkpt = 1, nkpt_phon2
122      do kkpt = 1, nkpt_phon3
123        ikpt_phon = kkpt + (jkpt-1)*nkpt_phon3 + (ikpt-1)*nkpt_phon2*nkpt_phon3
124 !      inside the paralellepipe
125        do ii = -((nscale1+1)/2-1), ((nscale1+1)/2-1)
126          do jj = -((nscale2+1)/2-1), ((nscale2+1)/2-1)
127            do kk = -((nscale3+1)/2-1), ((nscale3+1)/2-1)
128              iikpt = 1 + (ikpt-1)*nscale1 + ii
129              jjkpt = 1 + (jkpt-1)*nscale2 + jj
130              kkkpt = 1 + (kkpt-1)*nscale3 + kk
131              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
132              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
133              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
134              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
135              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
136              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
137              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 &             elph_ds%k_fine%wtk(:,ikpt_fine,:)
140              if (present(elph_tr_ds)) then
141                do iFSband=1,elph_ds%ngkkband !FS bands
142                  iband=iFSband+elph_ds%minFSband-1 ! full bands
143                  do icomp = 1, 3
144                    elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)=elph_ds%k_phon%velocwtk(iFSband,ikpt_phon,icomp,:)+&
145 &                   elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
146                    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 &                     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        if (MOD(nscale3,2) == 0) then ! when nscale3 is an even number
160          do ii = -((nscale1+1)/2-1), ((nscale1+1)/2-1)
161            do jj = -((nscale2+1)/2-1), ((nscale2+1)/2-1)
162              iikpt = 1 + (ikpt-1)*nscale1 + ii
163              jjkpt = 1 + (jkpt-1)*nscale2 + jj
164              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
165              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
166              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
167              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
168 
169              kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
170              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
171              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
172              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.5_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
175              if (present(elph_tr_ds)) then
176                do iFSband=1,elph_ds%ngkkband !FS bands
177                  iband=iFSband+elph_ds%minFSband-1 ! full bands
178                  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.5_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
181                    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 &                     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              kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
192              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
193              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
194              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.5_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
197              if (present(elph_tr_ds)) then
198                do iFSband=1,elph_ds%ngkkband !FS bands
199                  iband=iFSband+elph_ds%minFSband-1 ! full bands
200                  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.5_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
203                    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 &                     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        if (MOD(nscale2,2) == 0) then ! when nscale2 is an even number
216          do ii = -((nscale1+1)/2-1), ((nscale1+1)/2-1)
217            do kk = -((nscale3+1)/2-1), ((nscale3+1)/2-1)
218              iikpt = 1 + (ikpt-1)*nscale1 + ii
219              kkkpt = 1 + (kkpt-1)*nscale3 + kk
220              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
221              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
222              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
223              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
224 
225              jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
226              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
227              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
228              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.5_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
231              if (present(elph_tr_ds)) then
232                do iFSband=1,elph_ds%ngkkband !FS bands
233                  iband=iFSband+elph_ds%minFSband-1 ! full bands
234                  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.5_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
237                    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 &                     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              jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
248              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
249              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
250              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.5_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
253              if (present(elph_tr_ds)) then
254                do iFSband=1,elph_ds%ngkkband !FS bands
255                  iband=iFSband+elph_ds%minFSband-1 ! full bands
256                  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.5_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
259                    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 &                     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        if (MOD(nscale1,2) == 0) then ! when nscale1 is an even number
272          do kk = -((nscale3+1)/2-1), ((nscale3+1)/2-1)
273            do jj = -((nscale2+1)/2-1), ((nscale2+1)/2-1)
274              kkkpt = 1 + (kkpt-1)*nscale3 + kk
275              jjkpt = 1 + (jkpt-1)*nscale2 + jj
276              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
277              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
278              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
279              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
280 
281              iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
282              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
283              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
284              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.5_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
287              if (present(elph_tr_ds)) then
288                do iFSband=1,elph_ds%ngkkband !FS bands
289                  iband=iFSband+elph_ds%minFSband-1 ! full bands
290                  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.5_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
293                    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 &                     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              iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
304              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
305              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
306              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.5_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
309              if (present(elph_tr_ds)) then
310                do iFSband=1,elph_ds%ngkkband !FS bands
311                  iband=iFSband+elph_ds%minFSband-1 ! full bands
312                  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.5_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
315                    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 &                     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        if (MOD(nscale2,2) == 0 .and. MOD(nscale3,2) == 0) then
329          do ii = -((nscale1+1)/2-1), ((nscale1+1)/2-1)
330            iikpt = 1 + (ikpt-1)*nscale1 + ii
331            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
332            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
333 
334            jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
335            kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
336            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
337            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
338            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
339            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
340            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.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
343            if (present(elph_tr_ds)) then
344              do iFSband=1,elph_ds%ngkkband !FS bands
345                iband=iFSband+elph_ds%minFSband-1 ! full bands
346                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.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
349                  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 &                   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            jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
360            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            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
364            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
365            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.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
368            if (present(elph_tr_ds)) then
369              do iFSband=1,elph_ds%ngkkband !FS bands
370                iband=iFSband+elph_ds%minFSband-1 ! full bands
371                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.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
374                  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 &                   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            jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
385            kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
386            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
387            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            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.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
393            if (present(elph_tr_ds)) then
394              do iFSband=1,elph_ds%ngkkband !FS bands
395                iband=iFSband+elph_ds%minFSband-1 ! full bands
396                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.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
399                  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 &                   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            jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
410            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            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.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
418            if (present(elph_tr_ds)) then
419              do iFSband=1,elph_ds%ngkkband !FS bands
420                iband=iFSband+elph_ds%minFSband-1 ! full bands
421                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.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
424                  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 &                   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        if (MOD(nscale1,2) == 0 .and. MOD(nscale3,2) == 0) then
436          do jj = -((nscale2+1)/2-1), ((nscale2+1)/2-1)
437            jjkpt = 1 + (jkpt-1)*nscale2 + jj
438            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
439            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
440 
441            iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
442            kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
443            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
444            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
445            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
446            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
447            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.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
450            if (present(elph_tr_ds)) then
451              do iFSband=1,elph_ds%ngkkband !FS bands
452                iband=iFSband+elph_ds%minFSband-1 ! full bands
453                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.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
456                  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 &                   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            iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
467            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            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
471            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
472            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.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
475            if (present(elph_tr_ds)) then
476              do iFSband=1,elph_ds%ngkkband !FS bands
477                iband=iFSband+elph_ds%minFSband-1 ! full bands
478                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.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
481                  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 &                   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            iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
492            kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
493            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
494            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            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.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
500            if (present(elph_tr_ds)) then
501              do iFSband=1,elph_ds%ngkkband !FS bands
502                iband=iFSband+elph_ds%minFSband-1 ! full bands
503                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.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
506                  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 &                   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            iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
517            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            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.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
525            if (present(elph_tr_ds)) then
526              do iFSband=1,elph_ds%ngkkband !FS bands
527                iband=iFSband+elph_ds%minFSband-1 ! full bands
528                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.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
531                  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 &                   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        if (MOD(nscale2,2) == 0 .and. MOD(nscale1,2) == 0) then
543          do kk = -((nscale3+1)/2-1), ((nscale3+1)/2-1)
544            kkkpt = 1 + (kkpt-1)*nscale3 + kk
545            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
546            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
547 
548            jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
549            iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
550            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
551            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
552            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
553            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
554            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.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
557            if (present(elph_tr_ds)) then
558              do iFSband=1,elph_ds%ngkkband !FS bands
559                iband=iFSband+elph_ds%minFSband-1 ! full bands
560                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.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
563                  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 &                   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            jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
574            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            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
578            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
579            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.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
582            if (present(elph_tr_ds)) then
583              do iFSband=1,elph_ds%ngkkband !FS bands
584                iband=iFSband+elph_ds%minFSband-1 ! full bands
585                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.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
588                  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 &                   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            jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
599            iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
600            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
601            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            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.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
607            if (present(elph_tr_ds)) then
608              do iFSband=1,elph_ds%ngkkband !FS bands
609                iband=iFSband+elph_ds%minFSband-1 ! full bands
610                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.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
613                  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 &                   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            jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
624            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            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.25_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
632            if (present(elph_tr_ds)) then
633              do iFSband=1,elph_ds%ngkkband !FS bands
634                iband=iFSband+elph_ds%minFSband-1 ! full bands
635                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.25_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
638                  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 &                   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        if (MOD(nscale1,2) == 0 .and. MOD(nscale2,2) == 0 .and. MOD(nscale3,2) == 0) then
651          iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
652          jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
653          kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
654          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
655          if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
656          if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
657          if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
658          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
659          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
660          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.125_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
663          if (present(elph_tr_ds)) then
664            do iFSband=1,elph_ds%ngkkband !FS bands
665              iband=iFSband+elph_ds%minFSband-1 ! full bands
666              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.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
669                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 &                 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          iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
680          jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
681          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          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          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
688          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.125_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
691          if (present(elph_tr_ds)) then
692            do iFSband=1,elph_ds%ngkkband !FS bands
693              iband=iFSband+elph_ds%minFSband-1 ! full bands
694              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.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
697                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 &                 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          iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
708          jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
709          kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
710          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
711          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          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
715          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
716          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.125_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
719          if (present(elph_tr_ds)) then
720            do iFSband=1,elph_ds%ngkkband !FS bands
721              iband=iFSband+elph_ds%minFSband-1 ! full bands
722              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.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
725                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 &                 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          iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
736          jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
737          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          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.125_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
747          if (present(elph_tr_ds)) then
748            do iFSband=1,elph_ds%ngkkband !FS bands
749              iband=iFSband+elph_ds%minFSband-1 ! full bands
750              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.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
753                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 &                 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          iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
764          jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
765          kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
766          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          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          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.125_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
775          if (present(elph_tr_ds)) then
776            do iFSband=1,elph_ds%ngkkband !FS bands
777              iband=iFSband+elph_ds%minFSband-1 ! full bands
778              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.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
781                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 &                 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          iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
792          jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
793          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          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.125_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
803          if (present(elph_tr_ds)) then
804            do iFSband=1,elph_ds%ngkkband !FS bands
805              iband=iFSband+elph_ds%minFSband-1 ! full bands
806              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.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
809                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 &                 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          iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
820          jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
821          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          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.125_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
831          if (present(elph_tr_ds)) then
832            do iFSband=1,elph_ds%ngkkband !FS bands
833              iband=iFSband+elph_ds%minFSband-1 ! full bands
834              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.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
837                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 &                 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          iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
848          jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
849          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          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.125_dp*elph_ds%k_fine%wtk(:,ikpt_fine,:)
859          if (present(elph_tr_ds)) then
860            do iFSband=1,elph_ds%ngkkband !FS bands
861              iband=iFSband+elph_ds%minFSband-1 ! full bands
862              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.125_dp*elph_ds%k_fine%wtk(iFSband,ikpt_fine,:)*elph_tr_ds%el_veloc(ikpt_fine,iband,icomp,:)
865                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 &                 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  elph_ds%k_phon%wtk = elph_ds%k_phon%wtk/nscale1/nscale2/nscale3
881  if (present(elph_tr_ds)) then
882    elph_ds%k_phon%velocwtk = elph_ds%k_phon%velocwtk/nscale1/nscale2/nscale3
883    elph_ds%k_phon%vvelocwtk = elph_ds%k_phon%vvelocwtk/nscale1/nscale2/nscale3
884  end if
885 
886 end subroutine d2c_weights

ABINIT/d2c_wtq [ Functions ]

[ Top ] [ Functions ]

NAME

  d2c_wtq

FUNCTION

  This routine calculates the integration weights on a coarse k-grid
  using the integration weights from a denser k-gird. The weights of
  the extra k points that being shared are evenly distributed.

INPUTS

  elph_ds%k_fine%nkpt = number of fine q-points
  elph_ds%k_fine%wtq = integration weights of the fine q-grid
  elph_ds%k_phon%nkpt = number of coarse q-points

OUTPUT

  elph_ds%k_phon%wtq = integration weights of the coarse k-grid

SOURCE

 908 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  nkpt_phon1 = elph_ds%kptrlatt(1,1)
 925  nkpt_phon2 = elph_ds%kptrlatt(2,2)
 926  nkpt_phon3 = elph_ds%kptrlatt(3,3)
 927  nkpt_fine1 = elph_ds%kptrlatt_fine(1,1)
 928  nkpt_fine2 = elph_ds%kptrlatt_fine(2,2)
 929  nkpt_fine3 = elph_ds%kptrlatt_fine(3,3)
 930  nscale1 = dble(nkpt_fine1/nkpt_phon1)
 931  nscale2 = dble(nkpt_fine2/nkpt_phon2)
 932  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  nscale1 = INT(nscale1)
 943  nscale2 = INT(nscale2)
 944  nscale3 = INT(nscale3)
 945 
 946 !bxu, get wtq of coarse grid from fine grid
 947  elph_ds%k_phon%wtq = zero
 948 
 949  do ikpt = 1, nkpt_phon1
 950    do jkpt = 1, nkpt_phon2
 951      do kkpt = 1, nkpt_phon3
 952        ikpt_phon = kkpt + (jkpt-1)*nkpt_phon3 + (ikpt-1)*nkpt_phon2*nkpt_phon3
 953 !      inside the paralellepipe
 954        do ii = -((nscale1+1)/2-1), ((nscale1+1)/2-1)
 955          do jj = -((nscale2+1)/2-1), ((nscale2+1)/2-1)
 956            do kk = -((nscale3+1)/2-1), ((nscale3+1)/2-1)
 957              iikpt = 1 + (ikpt-1)*nscale1 + ii
 958              jjkpt = 1 + (jkpt-1)*nscale2 + jj
 959              kkkpt = 1 + (kkpt-1)*nscale3 + kk
 960              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
 961              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
 962              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
 963              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
 964              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
 965              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
 966              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 &             elph_ds%k_fine%wtq(:,ikpt_fine,:)
 969            end do
 970          end do
 971        end do
 972 !      on the 6 faces
 973        if (MOD(nscale3,2) == 0) then ! when nscale3 is an even number
 974          do ii = -((nscale1+1)/2-1), ((nscale1+1)/2-1)
 975            do jj = -((nscale2+1)/2-1), ((nscale2+1)/2-1)
 976              iikpt = 1 + (ikpt-1)*nscale1 + ii
 977              jjkpt = 1 + (jkpt-1)*nscale2 + jj
 978              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
 979              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
 980              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
 981              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
 982 
 983              kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
 984              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
 985              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
 986              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.5_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
 989 
 990              kkkpt = 1 + (kkpt-1)*nscale3 - nscale3/2
 991              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
 992              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
 993              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.5_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
 996            end do
 997          end do
 998        end if
 999        if (MOD(nscale2,2) == 0) then ! when nscale2 is an even number
1000          do ii = -((nscale1+1)/2-1), ((nscale1+1)/2-1)
1001            do kk = -((nscale3+1)/2-1), ((nscale3+1)/2-1)
1002              iikpt = 1 + (ikpt-1)*nscale1 + ii
1003              kkkpt = 1 + (kkpt-1)*nscale3 + kk
1004              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
1005              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
1006              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
1007              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
1008 
1009              jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
1010              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
1011              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
1012              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.5_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1015 
1016              jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
1017              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
1018              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
1019              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.5_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1022            end do
1023          end do
1024        end if
1025        if (MOD(nscale1,2) == 0) then ! when nscale1 is an even number
1026          do kk = -((nscale3+1)/2-1), ((nscale3+1)/2-1)
1027            do jj = -((nscale2+1)/2-1), ((nscale2+1)/2-1)
1028              kkkpt = 1 + (kkpt-1)*nscale3 + kk
1029              jjkpt = 1 + (jkpt-1)*nscale2 + jj
1030              if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
1031              if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
1032              if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
1033              if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
1034 
1035              iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
1036              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
1037              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
1038              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.5_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1041 
1042              iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
1043              if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
1044              if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
1045              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.5_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1048            end do
1049          end do
1050 !        on the 12 sides
1051        end if
1052        if (MOD(nscale2,2) == 0 .and. MOD(nscale3,2) == 0) then
1053          do ii = -((nscale1+1)/2-1), ((nscale1+1)/2-1)
1054            iikpt = 1 + (ikpt-1)*nscale1 + ii
1055            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
1056            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
1057 
1058            jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
1059            kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
1060            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
1061            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
1062            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
1063            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
1064            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.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1067 
1068            jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
1069            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            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
1073            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
1074            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.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1077 
1078            jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
1079            kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
1080            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
1081            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            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.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1087 
1088            jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
1089            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            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.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1097          end do
1098        end if
1099        if (MOD(nscale1,2) == 0 .and. MOD(nscale3,2) == 0) then
1100          do jj = -((nscale2+1)/2-1), ((nscale2+1)/2-1)
1101            jjkpt = 1 + (jkpt-1)*nscale2 + jj
1102            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
1103            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
1104 
1105            iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
1106            kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
1107            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
1108            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
1109            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
1110            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
1111            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.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1114 
1115            iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
1116            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            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
1120            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
1121            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.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1124 
1125            iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
1126            kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
1127            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
1128            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            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.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1134 
1135            iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
1136            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            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.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1144          end do
1145        end if
1146        if (MOD(nscale2,2) == 0 .and. MOD(nscale1,2) == 0) then
1147          do kk = -((nscale3+1)/2-1), ((nscale3+1)/2-1)
1148            kkkpt = 1 + (kkpt-1)*nscale3 + kk
1149            if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
1150            if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
1151 
1152            jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
1153            iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
1154            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
1155            if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
1156            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
1157            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
1158            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.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1161 
1162            jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
1163            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            if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
1167            if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
1168            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.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1171 
1172            jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
1173            iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
1174            if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
1175            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            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.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1181 
1182            jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
1183            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            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.25_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1191          end do
1192 !        on the 8 corners
1193        end if
1194        if (MOD(nscale1,2) == 0 .and. MOD(nscale2,2) == 0 .and. MOD(nscale3,2) == 0) then
1195          iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
1196          jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
1197          kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
1198          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
1199          if (jjkpt .le. 0) jjkpt = jjkpt + nkpt_fine2
1200          if (kkkpt .le. 0) kkkpt = kkkpt + nkpt_fine3
1201          if (iikpt .gt. nkpt_fine1) iikpt = iikpt - nkpt_fine1
1202          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
1203          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
1204          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.125_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1207 
1208          iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
1209          jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
1210          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          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          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
1217          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.125_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1220 
1221          iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
1222          jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
1223          kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
1224          if (iikpt .le. 0) iikpt = iikpt + nkpt_fine1
1225          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          if (jjkpt .gt. nkpt_fine2) jjkpt = jjkpt - nkpt_fine2
1229          if (kkkpt .gt. nkpt_fine3) kkkpt = kkkpt - nkpt_fine3
1230          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.125_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1233 
1234          iikpt = 1 + (ikpt-1)*nscale1 + nscale1/2
1235          jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
1236          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          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.125_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1246 
1247          iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
1248          jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
1249          kkkpt = 1 + (kkpt-1)*nscale3 + nscale3/2
1250          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          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          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.125_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1259 
1260          iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
1261          jjkpt = 1 + (jkpt-1)*nscale2 + nscale2/2
1262          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          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.125_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1272 
1273          iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
1274          jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
1275          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          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.125_dp*elph_ds%k_fine%wtq(:,ikpt_fine,:)
1285 
1286          iikpt = 1 + (ikpt-1)*nscale1 - nscale1/2
1287          jjkpt = 1 + (jkpt-1)*nscale2 - nscale2/2
1288          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          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.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  elph_ds%k_phon%wtq = elph_ds%k_phon%wtq/nscale1/nscale2/nscale3
1305 
1306 end subroutine d2c_wtq

ABINIT/ep_el_weights [ Functions ]

[ Top ] [ Functions ]

NAME

 ep_el_weights

FUNCTION

 This routine calculates the Fermi Surface integration weights
 for the electron phonon routines, by different methods

    1) Gaussian smearing
    2) Tetrahedron method
    3) Window in bands for all k-points
    4) Fermi Dirac smearing, follows gaussian with a different smearing function

INPUTS

   ep_b_min = minimal band to include in FS window integration
   ep_b_max = maximal band to include in FS window integration
   eigenGS = Ground State eigenvalues
   elphsmear = smearing width for Gaussian method
   fermie = Fermi level
   gprimd = Reciprocal lattice vectors (dimensionful)
   irredtoGS = mapping of elph k-points to ground state grid
   kptrlatt = k-point grid vectors (if divided by determinant of present matrix)
   max_occ = maximal occupancy for a band
   minFSband = minimal band included for Fermi Surface integration in Gaussian and Tetrahedron cases
   nFSband = number of bands in FS integration
   nsppol = number of spin polarizations
   telphint = option for FS integration:
      0 Tetrahedron method
      1 Gaussian smearing
      2 Window in bands for all k-points
      3 Fermi Dirac smearing
   k_obj%nkpt = number of FS k-points
   k_obj%kpt = FS k-points
   k_obj%full2irr = mapping of FS k-points from full grid to irred points
   k_obj%full2full = mapping of FS k-points in full grid under symops

OUTPUT

TODO

   weights should be recalculated on-the-fly! The present implementation is not flexible!

SOURCE

1353 subroutine ep_el_weights(ep_b_min, ep_b_max, eigenGS, elphsmear, enemin, enemax, nene, gprimd, &
1354 &    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  real(dp), allocatable :: tmp_eigen(:), tweight(:,:), dtweightde(:,:)
1388  character (len=500) :: message
1389  character (len=80) :: errstr
1390  type(t_tetrahedron) :: tetrahedra
1391  !type(htetra_t) :: tetrahedra
1392 
1393 ! *************************************************************************
1394 
1395  ! Initialize tmp_wtk with zeros
1396  tmp_wtk = zero
1397 
1398  !write(std_out,*) 'ep_el : nkpt ', k_obj%nkpt
1399 !===================================
1400 !Set up integration weights for FS
1401 !===================================
1402  deltaene = (enemax-enemin)/dble(nene-1)
1403 
1404  if (telphint == 0) then
1405 
1406 !  =========================
1407 !  Tetrahedron integration
1408 !  =========================
1409 
1410    rlatt(:,:) = kptrlatt(:,:)
1411    call matr3inv(rlatt,klatt)
1412 
1413    call init_tetra(k_obj%full2full(1,1,:), gprimd,klatt,k_obj%kpt, k_obj%nkpt,&
1414      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    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 &   +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    deltaene = (enemax-enemin)/dble(nene-1)
1426 
1427    ABI_MALLOC(tmp_eigen,(k_obj%nkpt))
1428    ABI_MALLOC(tweight,(k_obj%nkpt,nene))
1429    ABI_MALLOC(dtweightde,(k_obj%nkpt,nene))
1430 
1431    do iband = 1,nFSband
1432 !    for each spin pol
1433      do isppol=1,nsppol
1434 !    For this band get its contribution
1435        tmp_eigen(:) = zero
1436        do ikpt=1,k_obj%nkpt
1437          ikptgs = irredtoGS(k_obj%full2irr(1,ikpt))
1438          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 &       tweight,dtweightde,xmpi_comm_self)
1445 
1446        tmp_wtk(iband,:,isppol,:) = dtweightde(:,:)*k_obj%nkpt
1447      end do
1448    end do
1449    ABI_FREE(tmp_eigen)
1450    ABI_FREE(tweight)
1451    ABI_FREE(dtweightde)
1452 
1453    call destroy_tetra(tetrahedra)
1454    !call tetrahedra%free()
1455 
1456  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    smdeltaprefactor = max_occ*sqrt(piinv)/elphsmear
1470    smdeltafactor = one/elphsmear
1471 
1472 !  SPPOL loop on isppol as well to get 2 sets of weights
1473    do isppol=1,nsppol
1474      fermie = enemin
1475      do ie = 1, nene
1476        fermie = fermie + deltaene
1477 !      fine grid
1478        do ikpt=1, k_obj%nkpt
1479          ikptgs = irredtoGS(k_obj%full2irr(1,ikpt))
1480          do ib1=1,nFSband
1481            xx = smdeltafactor*(eigenGS(minFSband-1+ib1,ikptgs,isppol) - fermie)
1482            if (abs(xx) < 40._dp) then
1483              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  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    do ie = 1, nene
1496      fermie = fermie + deltaene
1497      do ikpt=1,k_obj%nkpt
1498        do ib1=ep_b_min, ep_b_max
1499 !        for the moment both spin channels same
1500          tmp_wtk(ib1,ikpt,:,ie) = max_occ
1501        end do
1502      end do
1503    end do
1504 
1505    write(std_out,*) ' ep_el_weights : DOS is calculated from states in bands ',ep_b_min,' to ',ep_b_max
1506 
1507  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    smdeltaprefactor = half*max_occ/elphsmear
1521    smdeltafactor = one/elphsmear
1522 
1523 !  SPPOL loop on isppol as well to get 2 sets of weights
1524    do isppol=1,nsppol
1525      fermie = enemin
1526      do ie = 1, nene
1527        fermie = fermie + deltaene
1528 !      fine grid
1529        do ikpt=1, k_obj%nkpt
1530          ikptgs = irredtoGS(k_obj%full2irr(1,ikpt))
1531          do ib1=1,nFSband
1532            xx = smdeltafactor*(eigenGS(minFSband-1+ib1,ikptgs,isppol) - fermie)
1533            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    write (message,'(a,i0)')" telphint should be between 0 and 3, found: ",telphint
1542    ABI_BUG(message)
1543  end if ! if telphint
1544 
1545 end subroutine ep_el_weights

ABINIT/ep_fs_weights [ Functions ]

[ Top ] [ Functions ]

NAME

 ep_fs_weights

FUNCTION

 This routine calculates the Fermi Surface integration weights
  for the electron phonon routines, by different methods
    1) Gaussian smearing
    2) Tetrahedron method
    3) Window in bands for all k-points
    4) Fermi Dirac smearing, follows gaussian with a different smearing function

INPUTS

   ep_b_min = minimal band to include in FS window integration
   ep_b_max = maximal band to include in FS window integration
   eigenGS = Ground State eigenvalues
   elphsmear = smearing width for Gaussian method
   fermie = Fermi level
   gprimd = Reciprocal lattice vectors (dimensionful)
   irredtoGS = mapping of elph k-points to ground state grid
   kptrlatt = k-point grid vectors (if divided by determinant of present matrix)
   max_occ = maximal occupancy for a band
   minFSband = minimal band included for Fermi Surface integration in Gaussian and Tetrahedron cases
   nFSband = number of bands in FS integration
   nsppol = number of spin polarizations
   telphint = option for FS integration:
      0 Tetrahedron method
      1 Gaussian smearing
      2 Window in bands for all k-points
      3 Fermi Dirac smearing
   k_obj%nkpt = number of FS k-points
   k_obj%kpt = FS k-points
   k_obj%full2irr = mapping of FS k-points from full grid to irred points
   k_obj%full2full = mapping of FS k-points in full grid under symops

OUTPUT

   k_obj%wtk = integration weights

TODO

   weights should be recalculated on-the-fly! The present implementation is not flexible!

SOURCE

1592 subroutine ep_fs_weights(ep_b_min, ep_b_max, eigenGS, elphsmear, fermie, gprimd, &
1593 &    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  real(dp), allocatable :: tmp_eigen(:), tweight(:,:), dtweightde(:,:)
1628 
1629  character (len=500) :: message
1630  character (len=80) :: errstr
1631 
1632  type(t_tetrahedron) :: tetrahedra
1633 
1634 ! *************************************************************************
1635 
1636  write(std_out,*) 'ep_fs : nkpt ', k_obj%nkpt
1637  write(message, '(a)' ) '- ep_fs_weights  1  = '
1638  call wrtout(std_out,message,'PERS')
1639 
1640 !===================================
1641 !Set up integration weights for FS
1642 !===================================
1643 
1644  if (telphint == 0) then
1645 
1646 !  =========================
1647 !  Tetrahedron integration
1648 !  =========================
1649 
1650    rlatt(:,:) = kptrlatt(:,:)
1651    call matr3inv(rlatt,klatt)
1652 
1653    call init_tetra(k_obj%full2full(1,1,:), gprimd,klatt,k_obj%kpt, k_obj%nkpt,&
1654 &   tetrahedra, ierr, errstr, xmpi_comm_self)
1655    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 &   +gprimd(3,1)*(gprimd(1,2)*gprimd(2,3)-gprimd(2,2)*gprimd(1,3)))
1660 
1661 !  just do weights at FS
1662    nene = 100
1663 
1664 !  fix small window around fermie for tetrahedron weight calculation
1665    deltaene = 2*elphsmear/dble(nene-1)
1666    ifermi = int(nene/2)
1667    enemin = fermie - dble(ifermi-1)*deltaene
1668    enemax = enemin + dble(nene-1)*deltaene
1669 
1670    ABI_MALLOC(tmp_eigen,(k_obj%nkpt))
1671    ABI_MALLOC(tweight,(k_obj%nkpt,nene))
1672    ABI_MALLOC(dtweightde,(k_obj%nkpt,nene))
1673 
1674    do iband = 1,nFSband
1675 !    for each spin pol
1676      do isppol=1,nsppol
1677 !      For this band get its contribution
1678        tmp_eigen(:) = zero
1679        do ikpt=1,k_obj%nkpt
1680          ikptgs = irredtoGS(k_obj%full2irr(1,ikpt))
1681          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 &       tweight,dtweightde,xmpi_comm_self)
1688 
1689        k_obj%wtk(iband,:,isppol) = dtweightde(:,ifermi)*k_obj%nkpt
1690      end do
1691 
1692    end do
1693    ABI_FREE(tmp_eigen)
1694    ABI_FREE(tweight)
1695    ABI_FREE(dtweightde)
1696 
1697    call destroy_tetra(tetrahedra)
1698 
1699  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    smdeltaprefactor = max_occ*sqrt(piinv)/elphsmear
1713    smdeltafactor = one/elphsmear
1714 
1715    k_obj%wtk = zero
1716 !  SPPOL loop on isppol as well to get 2 sets of weights
1717    do isppol=1,nsppol
1718 !    fine grid
1719      do ikpt=1, k_obj%nkpt
1720        ikptgs = irredtoGS(k_obj%full2irr(1,ikpt))
1721        do ib1=1,nFSband
1722          xx = smdeltafactor*(eigenGS(minFSband-1+ib1,ikptgs,isppol) - fermie)
1723          if (abs(xx) < 40._dp) then
1724            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  else if (telphint == 2) then ! range of bands occupied
1732 
1733 !  SPPOL eventually be able to specify bands for up and down separately
1734    k_obj%wtk = zero
1735    do ikpt=1,k_obj%nkpt
1736      do ib1=ep_b_min, ep_b_max
1737 !      for the moment both spin channels same
1738        k_obj%wtk(ib1,ikpt,:) = max_occ
1739      end do
1740    end do
1741 
1742    write(std_out,*) ' ep_fs_weights : DOS is calculated from states in bands ',ep_b_min,' to ',ep_b_max
1743 
1744  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    smdeltaprefactor = half*max_occ/elphsmear
1758    smdeltafactor = one/elphsmear
1759 
1760    k_obj%wtk = zero
1761 !  SPPOL loop on isppol as well to get 2 sets of weights
1762    do isppol=1,nsppol
1763 !    fine grid
1764      do ikpt=1, k_obj%nkpt
1765        ikptgs = irredtoGS(k_obj%full2irr(1,ikpt))
1766        do ib1=1,nFSband
1767          xx = smdeltafactor*(eigenGS(minFSband-1+ib1,ikptgs,isppol) - fermie)
1768          k_obj%wtk(ib1,ikpt,isppol) = smdeltaprefactor / (one + cosh(xx))
1769        end do
1770      end do
1771    end do
1772 
1773 
1774  else
1775    write (message,'(a,i0)')" telphint should be between 0 and 3, found: ",telphint
1776    ABI_BUG(message)
1777  end if ! if telphint
1778 
1779 end subroutine ep_fs_weights

ABINIT/ep_ph_weights [ Functions ]

[ Top ] [ Functions ]

NAME

 ep_ph_weights

FUNCTION

 This routine calculates the phonon integration weights
  for the electron phonon routines, by different methods
    1) Gaussian smearing
    0) Tetrahedron method

INPUTS

   phfrq = phonon energies
   elphsmear = smearing width for Gaussian method
   omega = input phonon energy
   gprimd = Reciprocal lattice vectors (dimensionful)
   kptrlatt = k-point grid vectors (if divided by determinant of present matrix)
   telphint = option for FS integration:
      0 Tetrahedron method
      1 Gaussian smearing
   k_obj%nkpt = number of FS k-points
   k_obj%kpt = FS k-points
   k_obj%full2full = mapping of FS k-points in full grid under symops

OUTPUT

   tmp_wtq = integration weights

TODO

   weights should be recalculated on-the-fly! The present implementation is not flexible!

SOURCE

1814 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  real(dp), allocatable :: tweight(:,:), dtweightde(:,:)
1843  character (len=80) :: errstr
1844  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  max_occ = one
1853  gaussmaxarg = sqrt(-log(1.d-100))
1854  domega = (omega_max - omega_min)/(nomega - 1)
1855 
1856  if (telphint == 0) then
1857 
1858 !  =========================
1859 !  Tetrahedron integration
1860 !  =========================
1861 
1862    rlatt(:,:) = kptrlatt(:,:)
1863    call matr3inv(rlatt,klatt)
1864 
1865    call init_tetra(k_obj%full2full(1,1,:), gprimd,klatt,k_obj%kpt, k_obj%nkpt,&
1866 &   tetrahedra, ierr, errstr, xmpi_comm_self)
1867    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 &   +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    ABI_MALLOC(tweight,(k_obj%nkpt,nomega))
1876    ABI_MALLOC(dtweightde,(k_obj%nkpt,nomega))
1877 
1878    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 &     tweight,dtweightde,xmpi_comm_self)
1882 
1883      tmp_wtq(ibranch,:,:) = dtweightde(:,:)*k_obj%nkpt
1884    end do
1885    ABI_FREE(tweight)
1886    ABI_FREE(dtweightde)
1887 
1888    call destroy_tetra(tetrahedra)
1889 
1890  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    smdeltaprefactor = max_occ*sqrt(piinv)/elphsmear
1902    smdeltafactor = one/elphsmear
1903 
1904    tmp_wtq = zero
1905    omega = omega_min
1906    do iomega = 1, nomega
1907      omega = omega + domega
1908      do ikpt=1, k_obj%nkpt
1909        do ib1=1,nbranch
1910          xx = smdeltafactor*(phfrq(ib1,ikpt)-omega)
1911          if (abs(xx) < gaussmaxarg) then
1912            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 end subroutine ep_ph_weights

ABINIT/m_epweights [ Modules ]

[ Top ] [ Modules ]

NAME

  m_epweights

FUNCTION

COPYRIGHT

  Copyright (C) 2012-2024 ABINIT group (BXU, MVer)
  This file is distributed under the terms of the
  GNU General Public License, see ~abinit/COPYING
  or http://www.gnu.org/copyleft/gpl.txt .

SOURCE

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_symtk,           only : matr3inv
33 
34  implicit none
35 
36  private