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