Branch data Line data Source code
1 : : !!****m* ABINIT/m_dfpt_fef
2 : : !! NAME
3 : : !! m_dfpt_fef
4 : : !!
5 : : !! FUNCTION
6 : : !! Response calculations in finite electric field.
7 : : !!
8 : : !! COPYRIGHT
9 : : !! Copyright (C) 2004-2026 ABINIT group (XW).
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_dfpt_fef
23 : :
24 : : use defs_basis
25 : : use m_abicore
26 : : use m_errors
27 : : use m_efield
28 : : use m_dtset
29 : :
30 : : use defs_abitypes, only : MPI_type
31 : : use m_kg, only : kpgio
32 : : use m_cgtools, only : overlap_g
33 : : use m_xmpi
34 : : use m_mpinfo
35 : :
36 : : implicit none
37 : :
38 : : private
39 : : !!***
40 : :
41 : : public :: dfptff_initberry
42 : : public :: dfptff_gradberry
43 : : public :: dfptff_gbefd
44 : : public :: dfptff_edie
45 : : public :: dfptff_ebp
46 : : public :: dfptff_die
47 : : public :: dfptff_bec
48 : : public :: qmatrix
49 : : !!***
50 : :
51 : : contains
52 : : !!***
53 : :
54 : : !!****f* ABINIT/dfptff_initberry
55 : : !! NAME
56 : : !! dfptff_initberry
57 : : !!
58 : : !! FUNCTION
59 : : !! Initialization of response calculations in finite electric field.
60 : : !!
61 : : !! INPUTS
62 : : !! dtset <type(dataset_type)> = all input variables in this dataset
63 : : !! gmet(3,3) = reciprocal space metric tensor in bohr**-2
64 : : !! kg(3,mpw*mkmem_rbz) = reduced (integer) coordinates of G vecs in basis sphere
65 : : !! kg1(3,mpw1*mkmem_rbz) = reduced (integer) coordinates of G vecs for response wfs
66 : : !! mband = maximum number of bands
67 : : !! mkmem_rbz = maximum number of k-points in core memory
68 : : !! mpw = maximum number of plane waves
69 : : !! mpw1 = maximum number of plane waves for response wavefunctions
70 : : !! nkpt = number of k points
71 : : !! npwarr(nkpt) = number of planewaves in basis and boundary at this k point
72 : : !! npwar1(nkpt) = number of planewaves in basis and boundary for response wfs
73 : : !! nsppol = 1 for unpolarized, 2 for spin-polarized
74 : : !! occ(mband*nkpt*nsppol) = occup number for each band at each k point
75 : : !! rprimd(3,3) = dimensional primitive vectors
76 : : !!
77 : : !! OUTPUT
78 : : !! dtefield=variables related to response Berry-phase calculation
79 : : !! pwindall(max(mpw,mpw1)*mkmem_rbz,8,3) = array used to compute the overlap matrices
80 : : !! pwindall(:,1,:) <- <u^(0)_i|u^(0)_i+1>
81 : : !! pwindall(:,2,:) <- <u^(0)_i|u^(0)_i-1>
82 : : !! pwindall(:,3,:) <- <u^(1)_i|u^(1)_i+1>
83 : : !! pwindall(:,4,:) <- <u^(1)_i|u^(1)_i-1>
84 : : !! pwindall(:,5,:) <- <u^(1)_i|u^(0)_i+n+1>
85 : : !! pwindall(:,6,:) <- <u^(1)_i|u^(0)_i+n-1>
86 : : !! pwindall(:,7,:) <- <u^(0)_i|u^(1)_i-n+1>
87 : : !! pwindall(:,8,:) <- <u^(0)_i|u^(1)_i-n-1>
88 : : !!
89 : : !! NOTES
90 : : !! this duplicates in part initberry for the init of the dtefield - should be made
91 : : !! into a common constructor in m_dtefield or somethin
92 : : !!
93 : : !! SOURCE
94 : :
95 : 9 : subroutine dfptff_initberry(dtefield,dtset,gmet,kg,kg1,mband,mkmem_rbz,mpi_enreg,&
96 : 9 : & mpw,mpw1,nkpt,npwarr,npwar1,nsppol,occ,pwindall,rprimd)
97 : :
98 : : !Arguments ----------------------------------------
99 : : !scalars
100 : : integer,intent(in) :: mband,mkmem_rbz,mpw,mpw1,nkpt,nsppol
101 : : type(MPI_type),intent(inout) :: mpi_enreg
102 : : type(dataset_type),intent(in) :: dtset
103 : : type(efield_type),intent(inout) :: dtefield !vz_i needs efield2
104 : : !arrays
105 : : integer,intent(in) :: kg(3,mpw*mkmem_rbz),kg1(3,mpw1*mkmem_rbz),npwar1(nkpt)
106 : : integer,intent(in) :: npwarr(nkpt)
107 : : integer,intent(out) :: pwindall(max(mpw,mpw1)*mkmem_rbz,8,3)
108 : : real(dp),intent(in) :: gmet(3,3),occ(mband*nkpt*nsppol),rprimd(3,3)
109 : :
110 : : !Local variables ----------------------------------
111 : : !scalars
112 : : integer :: flag,iband,icg,idir,ifor,ikg,ikg1,ikpt,ikpt1,ikpt2,ikstr
113 : : integer :: index,ipw,isppol,istr,iunmark,jpw,nband_k,mband_occ_k,nkstr,npw_k
114 : : integer :: npw_k1,orig
115 : : real(dp) :: ecut_eff,occ_val
116 : : character(len=500) :: message
117 : : !arrays
118 : : integer :: dg(3)
119 : 9 : integer,allocatable :: kg_tmp(:,:),kpt_mark(:),npwarr_tmp(:),npwtot(:)
120 : : real(dp) :: diffk(3),dk(3)
121 : 9 : real(dp),allocatable :: kpt1(:,:)
122 : :
123 : : ! *************************************************************************
124 : :
125 : : !-----------------------------------------------------------
126 : : !---------------- initilize dtefield //---------------------
127 : : !-----------------------------------------------------------
128 : :
129 : : !Initialization of efield_type variables
130 [ + + ]: 36 : dtefield%efield_dot(:) = zero
131 [ + + + + ]: 117 : dtefield%dkvecs(:,:) = zero
132 : 9 : dtefield%maxnstr = 0 ; dtefield%maxnkstr = 0
133 [ + + + + ]: 63 : dtefield%nstr(:) = 0 ; dtefield%nkstr(:) = 0
134 [ - + + - : 36 : ABI_MALLOC(dtefield%ikpt_dk,(nkpt,9,3))
+ - + - +
- - + - +
- + ]
135 [ - + + - : 36 : ABI_MALLOC(dtefield%cgindex,(nkpt,nsppol*2))
+ - - + +
- + - + -
- + - + -
+ ]
136 [ - + + - : 27 : ABI_MALLOC(dtefield%kgindex,(nkpt))
+ - + - -
+ - + -
+ ]
137 [ + + + + : 2223 : dtefield%ikpt_dk(:,:,:) = 0
+ + ]
138 [ + + + + ]: 171 : dtefield%cgindex(:,:) = 0
139 : 9 : dtefield%mband_occ = 0
140 [ - + + - : 27 : ABI_MALLOC(dtefield%nband_occ,(nsppol))
+ - + - -
+ - + -
+ ]
141 [ + + ]: 18 : dtefield%nband_occ = 0
142 [ + + + + : 74556 : pwindall(:,:,:) = 0
+ + ]
143 : :
144 : : !Compute the number of occupied bands and check that--------
145 : : !it is the same for each k-point----------------------------
146 : :
147 : 9 : occ_val = two/(dtset%nsppol*one)
148 : :
149 : 9 : index = 0
150 [ + + ]: 18 : do isppol = 1, nsppol
151 [ + + ]: 90 : do ikpt = 1, nkpt
152 : :
153 : 72 : mband_occ_k = 0
154 : 72 : nband_k = dtset%nband(ikpt)
155 : :
156 [ + + ]: 360 : do iband = 1, nband_k
157 : 288 : index = index + 1
158 [ + - ]: 360 : if (abs(occ(index) - occ_val) < tol8) mband_occ_k = mband_occ_k + 1
159 : : end do
160 : :
161 [ + + ]: 81 : if (ikpt > 1) then
162 [ - + ]: 63 : if (dtefield%nband_occ(isppol) /= mband_occ_k) then
163 : 0 : message = ' The number of valence bands is not the same for every k-point for present spin'
164 : 0 : ABI_ERROR(message)
165 : : end if
166 : : else
167 : 9 : dtefield%mband_occ = max(dtefield%mband_occ,mband_occ_k)
168 : 9 : dtefield%nband_occ(isppol) = mband_occ_k
169 : : end if
170 : :
171 : : end do
172 : : end do
173 : :
174 : : !DEBUG
175 : : !write(std_out,*)'dfptff_initberry:nkpt',nkpt
176 : : !ENDDEBUG
177 : :
178 : : !Compute the location of zero-order wavefunction --------------
179 : : icg = 0
180 [ + + ]: 18 : do isppol = 1, nsppol
181 [ + + ]: 90 : do ikpt = 1, nkpt
182 : :
183 : 72 : dtefield%cgindex(ikpt,isppol) = icg
184 : 72 : nband_k = dtset%nband(ikpt)
185 : 72 : npw_k = npwarr(ikpt)
186 : : icg = icg + dtset%nspinor*npw_k*&
187 : 81 : & proc_distrb_nband(mpi_enreg%proc_distrb,ikpt,nband_k,1,mpi_enreg%me_band)
188 : :
189 : : end do
190 : : end do
191 : :
192 : : !Compute the location of kg --------------
193 : 9 : ikg = 0
194 [ + + ]: 81 : do ikpt = 1, nkpt
195 : :
196 : 72 : dtefield%kgindex(ikpt) = ikg
197 : 72 : npw_k = npwarr(ikpt)
198 : 81 : ikg = ikg + npw_k
199 : :
200 : : end do
201 : :
202 : : !Compute the location of first-order wavefunction -------------------
203 : : icg = 0
204 [ + + ]: 18 : do isppol = 1, nsppol
205 [ + + ]: 90 : do ikpt = 1, nkpt
206 : :
207 : 72 : dtefield%cgindex(ikpt,isppol+nsppol) = icg
208 : 72 : nband_k = dtset%nband(ikpt)
209 : 72 : npw_k = npwar1(ikpt)
210 : : icg = icg + dtset%nspinor*npw_k* &
211 : 81 : & proc_distrb_nband(mpi_enreg%proc_distrb,ikpt,nband_k,1,mpi_enreg%me_band)
212 : :
213 : : end do
214 : : end do
215 : :
216 : : !Compute the reciprocal lattice coordinates of the electric field-----
217 : :
218 [ + + ]: 36 : dtefield%efield_dot(1) = dot_product(dtset%efield(:),rprimd(:,1))
219 [ + + ]: 36 : dtefield%efield_dot(2) = dot_product(dtset%efield(:),rprimd(:,2))
220 [ + + ]: 36 : dtefield%efield_dot(3) = dot_product(dtset%efield(:),rprimd(:,3))
221 : :
222 : 9 : write(message,'(a,a,a,a,3(2x,f16.9),a)')ch10,&
223 : 9 : & ' initberry: Reciprocal lattice coordinates of the electric field',ch10,&
224 : 18 : & ' efield_dot(1:3) = ',dtefield%efield_dot(1:3),ch10
225 : 9 : call wrtout(std_out,message,'COLL')
226 : :
227 : : !find the related k points to every k point in full BZ-----------------
228 : : !TODO: import hash tables for k-points, to make lookup fast and check for missing
229 : : ! matches
230 : :
231 : : !loop over three reciprocal directions
232 [ + + ]: 36 : do idir = 1, 3
233 : :
234 [ + - ]: 27 : if (dtset%rfdir(idir) == 1) then
235 : :
236 : : ! Compute dk(:), the vector between a k-point and its nearest
237 : : ! neighbour along the direction idir
238 : :
239 : 27 : dk(:) = zero
240 : 27 : dk(idir) = 1000_dp ! initialize with a big number
241 [ + + ]: 216 : do ikpt = 2, nkpt
242 [ + + ]: 756 : diffk(:) = abs(dtset%kptns(:,ikpt) - dtset%kptns(:,1))
243 [ + + + + : 189 : if ((diffk(1) < dk(1)+tol8).and.(diffk(2) < dk(2)+tol8).and.&
+ + ]
244 : 54 : & (diffk(3) < dk(3)+tol8)) dk(:) = diffk(:)
245 : : end do
246 [ + + ]: 108 : dtefield%dkvecs(:,idir) = dk(:)
247 : :
248 : : ! For each k point, find k_prim such that k_prim= k + dk mod(G)
249 : : ! where G is a vector of the reciprocal lattice
250 : :
251 [ + + ]: 243 : do ikpt = 1, nkpt
252 : :
253 : : ! First: k + dk
254 [ - + ]: 972 : do ikpt1 = 1, nkpt
255 [ + + ]: 3888 : diffk(:) = abs(dtset%kptns(:,ikpt1) - dtset%kptns(:,ikpt) - dk(:))
256 [ + + + + ]: 3888 : if(sum(abs(diffk(:) - nint(diffk(:)))) < 3*tol8) then
257 : 216 : dtefield%ikpt_dk(ikpt,1,idir) = ikpt1
258 : 216 : exit
259 : : end if
260 : : end do
261 : :
262 : : ! Second: k - dk
263 [ - + ]: 972 : do ikpt1 = 1, nkpt
264 [ + + ]: 3888 : diffk(:) = abs(dtset%kptns(:,ikpt1) - dtset%kptns(:,ikpt) + dk(:))
265 [ + + + + ]: 3888 : if(sum(abs(diffk(:) - nint(diffk(:)))) < 3*tol8) then
266 : 216 : dtefield%ikpt_dk(ikpt,2,idir) = ikpt1
267 : 216 : exit
268 : : end if
269 : : end do
270 : :
271 : : ! new
272 : : ! 3rd: k + (n+1)dk
273 : :
274 [ - + ]: 972 : do ikpt1 = 1, nkpt
275 [ + + ]: 3888 : diffk(:) = abs(dtset%kptns(:,ikpt1) - dtset%kptns(:,ikpt) - dk(:) - dtset%qptn(:))
276 [ + + + + ]: 3888 : if(sum(abs(diffk(:) - nint(diffk(:)))) < 3*tol8) then
277 : 216 : dtefield%ikpt_dk(ikpt,3,idir) = ikpt1
278 : 216 : exit
279 : : end if
280 : : end do
281 : :
282 : : ! 6th: k - (n+1)dk
283 : :
284 [ - + ]: 972 : do ikpt1 = 1, nkpt
285 [ + + ]: 3888 : diffk(:) = abs(dtset%kptns(:,ikpt1) - dtset%kptns(:,ikpt) + dk(:) + dtset%qptn(:))
286 [ + + + + ]: 3888 : if(sum(abs(diffk(:) - nint(diffk(:)))) < 3*tol8) then
287 : 216 : dtefield%ikpt_dk(ikpt,6,idir) = ikpt1
288 : 216 : exit
289 : : end if
290 : : end do
291 : :
292 : : ! 4th: k + (n-1)dk
293 : :
294 [ - + ]: 972 : do ikpt1 = 1, nkpt
295 [ + + ]: 3888 : diffk(:) = abs(dtset%kptns(:,ikpt1) - dtset%kptns(:,ikpt) + dk(:) - dtset%qptn(:))
296 [ + + + + ]: 3888 : if(sum(abs(diffk(:) - nint(diffk(:)))) < 3*tol8) then
297 : 216 : dtefield%ikpt_dk(ikpt,4,idir) = ikpt1
298 : 216 : exit
299 : : end if
300 : : end do
301 : :
302 : : ! 5th: k - (n-1)dk
303 : :
304 [ - + ]: 972 : do ikpt1 = 1, nkpt
305 [ + + ]: 3888 : diffk(:) = abs(dtset%kptns(:,ikpt1) - dtset%kptns(:,ikpt) - dk(:) + dtset%qptn(:))
306 [ + + + + ]: 3888 : if(sum(abs(diffk(:) - nint(diffk(:)))) < 3*tol8) then
307 : 216 : dtefield%ikpt_dk(ikpt,5,idir) = ikpt1
308 : 216 : exit
309 : : end if
310 : : end do
311 : :
312 : : ! 7th: k+n dk
313 : :
314 [ - + ]: 972 : do ikpt1 = 1, nkpt
315 [ + + ]: 3888 : diffk(:) = abs(dtset%kptns(:,ikpt1) - dtset%kptns(:,ikpt) - dtset%qptn(:))
316 [ + + + + ]: 3888 : if(sum(abs(diffk(:) - nint(diffk(:)))) < 3*tol8) then
317 : 216 : dtefield%ikpt_dk(ikpt,7,idir) = ikpt1
318 : 216 : exit
319 : : end if
320 : : end do
321 : :
322 : : ! 8th: k-n dk
323 : :
324 [ - + ]: 972 : do ikpt1 = 1, nkpt
325 [ + + ]: 3888 : diffk(:) = abs(dtset%kptns(:,ikpt1) - dtset%kptns(:,ikpt) + dtset%qptn(:))
326 [ + + + + ]: 3888 : if(sum(abs(diffk(:) - nint(diffk(:)))) < 3*tol8) then
327 : 216 : dtefield%ikpt_dk(ikpt,8,idir) = ikpt1
328 : 216 : exit
329 : : end if
330 : : end do
331 : :
332 : : ! 9th: -k
333 : :
334 [ + - ]: 999 : do ikpt1 = 1, nkpt
335 [ + + ]: 3888 : diffk(:) = abs(dtset%kptns(:,ikpt1) + dtset%kptns(:,ikpt))
336 [ + + + + ]: 3888 : if(sum(diffk(:)) < 3*tol8) then
337 : 216 : dtefield%ikpt_dk(ikpt,9,idir) = ikpt1
338 : 216 : exit
339 : : end if
340 : : end do
341 : :
342 : : end do ! ikpt
343 : :
344 : :
345 : :
346 : : ! Find the string length, starting from k point 1
347 : : ! (all strings must have the same number of points)
348 : :
349 : 27 : nkstr = 1
350 : 27 : ikpt1 = 1
351 [ + - ]: 54 : do ikpt = 1, nkpt
352 : 54 : ikpt1 = dtefield%ikpt_dk(ikpt1,1,idir)
353 [ + + ]: 54 : if (ikpt1 == 1) exit
354 : 54 : nkstr = nkstr + 1
355 : : end do
356 : :
357 : : ! Check that the string length is a divisor of nkpt
358 [ - + ]: 27 : if(mod(nkpt,nkstr) /= 0) then
359 : 0 : write(message,'(a,i0,a,i0)')' The string length = ',nkstr,', is not a divisor of nkpt =',nkpt
360 : 0 : ABI_BUG(message)
361 : : end if
362 : 27 : dtefield%nkstr(idir) = nkstr
363 : 27 : dtefield%nstr(idir) = nkpt/nkstr
364 : :
365 : : end if ! dtset%rfdir(idir) == 1
366 : :
367 : : write(message,'(a,i1,a,i3,a,i3)')&
368 : 27 : & ' dfptff_initberry: for direction ',idir,', nkstr = ',dtefield%nkstr(idir),&
369 : 54 : & ', nstr = ',dtefield%nstr(idir)
370 : 36 : call wrtout(std_out,message,'COLL')
371 : :
372 : : end do ! close loop over idir
373 : :
374 [ + + ]: 36 : dtefield%maxnstr = maxval(dtefield%nstr(:))
375 [ + + ]: 36 : dtefield%maxnkstr = maxval(dtefield%nkstr(:))
376 [ - + + - : 45 : ABI_MALLOC(dtefield%idxkstr,(dtefield%maxnkstr,dtefield%maxnstr,3))
- + + - +
- + - + -
- + - + -
+ ]
377 [ + + + + : 360 : dtefield%idxkstr(:,:,:) = 0
+ + ]
378 : :
379 : :
380 : : !Build the different strings------------------------------------------
381 : :
382 [ - + + - : 18 : ABI_MALLOC(kpt_mark,(nkpt))
- + - + ]
383 [ + + ]: 36 : do idir = 1, 3
384 : :
385 [ + - ]: 36 : if (dtset%rfdir(idir) == 1) then
386 : :
387 : 243 : iunmark = 1
388 [ + + ]: 243 : kpt_mark(:) = 0
389 [ + + ]: 135 : do istr = 1, dtefield%nstr(idir)
390 : :
391 [ + + ]: 234 : do while(kpt_mark(iunmark) /= 0)
392 : 126 : iunmark = iunmark + 1
393 : : end do
394 : 108 : dtefield%idxkstr(1,istr,idir) = iunmark
395 : 108 : kpt_mark(iunmark) = 1
396 [ + + ]: 243 : do ikstr = 2, dtefield%nkstr(idir)
397 : 108 : ikpt1 = dtefield%idxkstr(ikstr-1,istr,idir)
398 : 108 : ikpt2 = dtefield%ikpt_dk(ikpt1,1,idir)
399 : 108 : dtefield%idxkstr(ikstr,istr,idir) = ikpt2
400 : 216 : kpt_mark(ikpt2) = 1
401 : : end do
402 : :
403 : : end do ! istr
404 : :
405 : : end if ! rfdir(idir) == 1
406 : :
407 : : end do ! close loop over idir
408 : :
409 [ - + ]: 9 : ABI_FREE(kpt_mark)
410 : :
411 : :
412 : : !Build the array pwindall that is needed to compute the different overlap matrices
413 : : !at k +- dk
414 : :
415 [ - + + - : 27 : ABI_MALLOC(kg_tmp,(3,max(mpw,mpw1)*mkmem_rbz))
+ - + - -
+ - + ]
416 [ - + + - : 27 : ABI_MALLOC(kpt1,(3,nkpt))
+ - + - -
+ - + ]
417 [ - + + - : 18 : ABI_MALLOC(npwarr_tmp,(nkpt))
- + - + ]
418 [ - + + - : 18 : ABI_MALLOC(npwtot,(nkpt))
- + - + ]
419 : 9 : ecut_eff = dtset%ecut*(dtset%dilatmx)**2
420 : :
421 [ + + ]: 36 : do idir = 1, 3
422 : :
423 [ + - ]: 36 : if (dtset%rfdir(idir) == 1) then
424 : :
425 [ + + ]: 108 : dk(:) = dtefield%dkvecs(:,idir)
426 : :
427 [ + + ]: 81 : do ifor = 1, 2
428 : :
429 [ + + + + ]: 135 : if (ifor == 2) dk(:) = -1_dp*dk(:)
430 : :
431 : : ! Build the array kpt1 = kptns + dk
432 : : ! all k-poins of kpt1 must be in the same BZ as those of kptns
433 [ + + + + ]: 1782 : kpt1(:,:) = zero
434 [ + + ]: 486 : do ikpt = 1, nkpt
435 : 432 : ikpt1 = dtefield%ikpt_dk(ikpt,ifor,idir)
436 [ + + ]: 1782 : kpt1(:,ikpt) = dtset%kptns(:,ikpt1)
437 : : end do ! close loop over ikpt
438 : :
439 : : ! Set up the basis sphere of plane waves at kpt1
440 [ + + + + ]: 74358 : kg_tmp(:,:) = 0
441 : : call kpgio(ecut_eff,dtset%exchn2n3d,gmet,dtset%istwfk,kg_tmp,&
442 : : & kpt1,mkmem_rbz,dtset%nband,nkpt,'PERS',mpi_enreg,mpw,&
443 : 54 : & npwarr_tmp,npwtot,dtset%nsppol)
444 : :
445 : 54 : ikg = 0 ; ikg1 = 0
446 [ + + ]: 513 : do ikpt = 1, nkpt
447 : :
448 : 432 : nband_k = dtset%nband(ikpt)
449 : 432 : ikpt1 = dtefield%ikpt_dk(ikpt,ifor,idir)
450 : :
451 : :
452 : : dg(:) = nint(dtset%kptns(:,ikpt) + dk(:) + tol10 - &
453 [ + + ]: 1728 : & dtset%kptns(:,ikpt1))
454 : :
455 : 432 : flag = 0; orig = 1
456 [ + + ]: 432 : if (dg(1)*dg(1) + dg(2)*dg(2) + dg(3)*dg(3) > 0) flag = 1
457 : :
458 : 432 : ikpt1 = dtefield%ikpt_dk(ikpt,ifor,idir)
459 : 432 : npw_k = npwarr(ikpt)
460 : 432 : npw_k1 = npwarr_tmp(ikpt)
461 : :
462 [ + + ]: 18360 : do ipw = 1, npw_k
463 [ + + ]: 275328 : do jpw = orig, npw_k1
464 : : if ((kg(1,ikg + ipw) == kg_tmp(1,ikg1 + jpw) - dg(1)).and. &
465 [ + + + + : 271440 : (kg(2,ikg + ipw) == kg_tmp(2,ikg1 + jpw) - dg(2)).and. &
+ + ]
466 : 3456 : (kg(3,ikg + ipw) == kg_tmp(3,ikg1 + jpw) - dg(3))) then
467 : 14472 : pwindall((ikpt-1)*max(mpw,mpw1) + ipw,ifor,idir) = jpw
468 [ + + ]: 25164 : if (flag == 0) orig = jpw
469 : : exit
470 : : end if
471 : : end do
472 : : end do
473 : :
474 : 432 : ikg = ikg + npw_k
475 : 486 : ikg1 = ikg1 + npw_k1
476 : :
477 : : end do ! close loop over ikpt
478 : :
479 : : end do ! close loop over ifor
480 : :
481 : : end if ! rfdir(idir) == 1
482 : :
483 : : end do ! close loop over idir
484 : :
485 : : !------------------------------------------------------------------------------
486 : : !<u_q|u_q>
487 : : !at k +- dk
488 : :
489 [ + + ]: 36 : do idir = 1, 3
490 : :
491 [ + - ]: 36 : if (dtset%rfdir(idir) == 1) then
492 : :
493 [ + + ]: 108 : dk(:) = dtefield%dkvecs(:,idir)
494 : :
495 [ + + ]: 81 : do ifor = 1, 2
496 : :
497 [ + + + + ]: 135 : if (ifor == 2) dk(:) = -1_dp*dk(:)
498 : :
499 : : ! Build the array kpt1 = kptns + qptn + dk
500 : : ! all k-poins of kpt1 must be in the same BZ as those of kptns
501 [ + + + + ]: 1782 : kpt1(:,:) = zero
502 [ + + ]: 486 : do ikpt = 1, nkpt
503 : 432 : ikpt1 = dtefield%ikpt_dk(ikpt,ifor,idir)
504 [ + + ]: 1782 : kpt1(:,ikpt) = dtset%kptns(:,ikpt1)+dtset%qptn(:)
505 : : end do ! close loop over ikpt
506 : :
507 : : ! Set UP THE BASIS SPHERE OF PLANE waves at kpt1
508 [ + + + + ]: 74358 : kg_tmp(:,:) = 0
509 : : call kpgio(ecut_eff,dtset%exchn2n3d,gmet,dtset%istwfk,kg_tmp,&
510 : : & kpt1,mkmem_rbz,dtset%nband,nkpt,'PERS',mpi_enreg,mpw1,&
511 : 54 : & npwarr_tmp,npwtot,dtset%nsppol)
512 : :
513 : :
514 : 54 : ikg = 0 ; ikg1 = 0
515 [ + + ]: 513 : do ikpt = 1, nkpt
516 : :
517 : 432 : nband_k = dtset%nband(ikpt)
518 : 432 : ikpt1 = dtefield%ikpt_dk(ikpt,ifor,idir)
519 : :
520 [ - + ]: 432 : if (proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,nband_k,1,mpi_enreg%me)) cycle
521 : :
522 : : dg(:) = nint(dtset%kptns(:,ikpt) + dk(:) + tol10 - &
523 [ + + ]: 1728 : & dtset%kptns(:,ikpt1))
524 : :
525 : 432 : flag = 0; orig = 1
526 [ + + ]: 432 : if (dg(1)*dg(1) + dg(2)*dg(2) + dg(3)*dg(3) > 0) flag = 1
527 : :
528 : 432 : ikpt1 = dtefield%ikpt_dk(ikpt,ifor,idir)
529 : 432 : npw_k = npwar1(ikpt)
530 : 432 : npw_k1 = npwarr_tmp(ikpt)
531 : :
532 [ + + ]: 18360 : do ipw = 1, npw_k
533 [ + + ]: 275328 : do jpw = orig, npw_k1
534 : : if ((kg1(1,ikg + ipw) == kg_tmp(1,ikg1 + jpw) - dg(1)).and. &
535 [ + + + + : 271440 : (kg1(2,ikg + ipw) == kg_tmp(2,ikg1 + jpw) - dg(2)).and. &
+ + ]
536 : 3456 : (kg1(3,ikg + ipw) == kg_tmp(3,ikg1 + jpw) - dg(3))) then
537 : 14472 : pwindall((ikpt-1)*max(mpw,mpw1) +ipw,ifor+2,idir) = jpw
538 [ + + ]: 25164 : if (flag == 0) orig = jpw
539 : : exit
540 : : end if
541 : : end do
542 : : end do
543 : :
544 : 432 : ikg = ikg + npw_k
545 : 486 : ikg1 = ikg1 + npw_k1
546 : :
547 : : end do ! close loop over ikpt
548 : : end do ! close loop over ifor
549 : : end if ! rfdir(idir) == 1
550 : : end do ! close loop over idir
551 : :
552 : :
553 : : !---------------------------------------------------------------------------
554 : :
555 [ + + ]: 36 : do idir = 1, 3
556 : :
557 [ + - ]: 36 : if (dtset%rfdir(idir) == 1) then
558 : :
559 [ + + ]: 108 : dk(:) = dtset%qptn(:) + dtefield%dkvecs(:,idir)
560 : :
561 [ + + ]: 81 : do ifor = 1, 2
562 : :
563 [ + + + + ]: 135 : if (ifor == 2) dk(:) = dtset%qptn(:) - dtefield%dkvecs(:,idir)
564 : :
565 : : ! Build the array kpt1 = kptns + qptn + dk
566 : : ! all k-poins of kpt1 must be in the same BZ as those of kptns
567 [ + + + + ]: 1782 : kpt1(:,:) = zero
568 [ + + ]: 486 : do ikpt = 1, nkpt
569 : 432 : ikpt1 = dtefield%ikpt_dk(ikpt,ifor+2,idir)
570 [ + + ]: 1782 : kpt1(:,ikpt) = dtset%kptns(:,ikpt1)
571 : : end do ! close loop over ikpt
572 : :
573 : : ! Set UP THE BASIS SPHERE OF PLANE waves at kpt1
574 [ + + + + ]: 74358 : kg_tmp(:,:) = 0
575 : : call kpgio(ecut_eff,dtset%exchn2n3d,gmet,dtset%istwfk,kg_tmp,&
576 : : & kpt1,mkmem_rbz,dtset%nband,nkpt,'PERS',mpi_enreg,mpw,&
577 : 54 : & npwarr_tmp,npwtot,dtset%nsppol)
578 : :
579 : 54 : ikg = 0 ; ikg1 = 0
580 [ + + ]: 513 : do ikpt = 1, nkpt
581 : :
582 : 432 : nband_k = dtset%nband(ikpt)
583 : 432 : ikpt1 = dtefield%ikpt_dk(ikpt,ifor+2,idir)
584 : :
585 [ - + ]: 432 : if (proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,nband_k,1,mpi_enreg%me)) cycle
586 : :
587 : : dg(:) = nint(dtset%kptns(:,ikpt) + dk(:) + tol10 - &
588 [ + + ]: 1728 : & dtset%kptns(:,ikpt1))
589 : :
590 : 432 : flag = 0; orig = 1
591 [ + + ]: 432 : if (dg(1)*dg(1) + dg(2)*dg(2) + dg(3)*dg(3) > 0) flag = 1
592 : :
593 : 432 : ikpt1 = dtefield%ikpt_dk(ikpt,ifor+2,idir)
594 : 432 : npw_k = npwar1(ikpt)
595 : 432 : npw_k1 = npwarr_tmp(ikpt)
596 : :
597 [ + + ]: 18360 : do ipw = 1, npw_k
598 [ + + ]: 275328 : do jpw = orig, npw_k1
599 : : if ((kg1(1,ikg + ipw) == kg_tmp(1,ikg1 + jpw) - dg(1)).and. &
600 [ + + + + : 271440 : (kg1(2,ikg + ipw) == kg_tmp(2,ikg1 + jpw) - dg(2)).and. &
+ + ]
601 : 3456 : (kg1(3,ikg + ipw) == kg_tmp(3,ikg1 + jpw) - dg(3))) then
602 : 14472 : pwindall((ikpt-1)*max(mpw,mpw1)+ipw,ifor+4,idir) = jpw
603 [ + + ]: 25164 : if (flag == 0) orig = jpw
604 : : exit
605 : : end if
606 : : end do
607 : : end do
608 : 432 : ikg = ikg + npw_k
609 : 486 : ikg1 = ikg1 + npw_k1
610 : :
611 : : end do ! close loop over ikpt
612 : : end do ! close loop over ifor
613 : : end if ! rfdir(idir) == 1
614 : : end do ! close loop over idir===============================================================
615 : :
616 : :
617 : : !Build the array pwind3 that is needed to compute the overlap matrices===============================
618 : :
619 [ + + ]: 36 : do idir = 1, 3
620 : :
621 [ + - ]: 36 : if (dtset%rfdir(idir) == 1) then
622 : :
623 [ + + ]: 108 : dk(:) = - dtset%qptn(:) + dtefield%dkvecs(:,idir)
624 : :
625 [ + + ]: 81 : do ifor = 1, 2
626 : :
627 [ + + + + ]: 135 : if (ifor == 2) dk(:) = - dtset%qptn(:) - dtefield%dkvecs(:,idir)
628 : :
629 : : ! Build the array kpt1 = kptns + qptn + dk
630 : : ! all k-poins of kpt1 must be in the same BZ as those of kptns
631 [ + + + + ]: 1782 : kpt1(:,:) = zero
632 [ + + ]: 486 : do ikpt = 1, nkpt
633 : 432 : ikpt1 = dtefield%ikpt_dk(ikpt,ifor+4,idir)
634 [ + + ]: 1782 : kpt1(:,ikpt) = dtset%kptns(:,ikpt1)+ dtset%qptn(:)
635 : : end do ! close loop over ikpt
636 : :
637 : : ! Set UP THE BASIS SPHERE OF PLANE waves at kpt1
638 [ + + + + ]: 74358 : kg_tmp(:,:) = 0
639 : : call kpgio(ecut_eff,dtset%exchn2n3d,gmet,dtset%istwfk,kg_tmp,&
640 : : & kpt1,mkmem_rbz,dtset%nband,nkpt,'PERS',mpi_enreg,mpw1,&
641 : 54 : & npwarr_tmp,npwtot,dtset%nsppol)
642 : :
643 : 54 : ikg = 0 ; ikg1 = 0
644 [ + + ]: 513 : do ikpt = 1, nkpt
645 : :
646 : 432 : nband_k = dtset%nband(ikpt)
647 : 432 : ikpt1 = dtefield%ikpt_dk(ikpt,ifor+4,idir)
648 : :
649 [ - + ]: 432 : if (proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,nband_k,1,mpi_enreg%me)) cycle
650 : :
651 : : dg(:) = nint(dtset%kptns(:,ikpt) + dk(:) + tol10 - &
652 [ + + ]: 1728 : & dtset%kptns(:,ikpt1))
653 : :
654 : 432 : flag = 0; orig = 1
655 [ + + ]: 432 : if (dg(1)*dg(1) + dg(2)*dg(2) + dg(3)*dg(3) > 0) flag = 1
656 : :
657 : 432 : ikpt1 = dtefield%ikpt_dk(ikpt,ifor+4,idir)
658 : 432 : npw_k = npwarr(ikpt)
659 : 432 : npw_k1 = npwarr_tmp(ikpt)
660 : :
661 [ + + ]: 18360 : do ipw = 1, npw_k
662 [ + + ]: 275328 : do jpw = orig, npw_k1
663 : : if ((kg(1,ikg + ipw) == kg_tmp(1,ikg1 + jpw) - dg(1)).and. &
664 [ + + + + : 271440 : (kg(2,ikg + ipw) == kg_tmp(2,ikg1 + jpw) - dg(2)).and. &
+ + ]
665 : 3456 : (kg(3,ikg + ipw) == kg_tmp(3,ikg1 + jpw) - dg(3))) then
666 : 14472 : pwindall((ikpt-1)*max(mpw,mpw1) + ipw,ifor+6,idir) = jpw
667 [ + + ]: 25164 : if (flag == 0) orig = jpw
668 : : exit
669 : : end if
670 : : end do
671 : : end do
672 : 432 : ikg = ikg + npw_k
673 : 486 : ikg1 = ikg1 + npw_k1
674 : :
675 : : end do ! close loop over ikpt
676 : : end do ! close loop over ifor
677 : : end if ! rfdir(idir) == 1
678 : : end do ! close loop over idir====================================================================
679 : :
680 [ - + ]: 9 : ABI_FREE(kg_tmp)
681 [ - + ]: 9 : ABI_FREE(kpt1)
682 [ - + ]: 9 : ABI_FREE(npwarr_tmp)
683 [ - + ]: 9 : ABI_FREE(npwtot)
684 : :
685 : 9 : end subroutine dfptff_initberry
686 : : !!***
687 : :
688 : : !!****f* ABINIT/dfptff_gradberry
689 : : !! NAME
690 : : !! dfptff_gradberry
691 : : !!
692 : : !! FUNCTION
693 : : !! Calculation of the gradient of Berry-phase term in finite electric field.
694 : : !!
695 : : !! COPYRIGHT
696 : : !! Copyright (C) 2004-2026 ABINIT group (XW).
697 : : !! This file is distributed under the terms of the
698 : : !! GNU General Public License, see ~abinit/COPYING
699 : : !! or http://www.gnu.org/copyleft/gpl.txt .
700 : : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
701 : : !!
702 : : !! INPUTS
703 : : !! cg(2,mpw*nspinor*mband*mkmem_rbz*nsppol) = planewave coefficients of wavefunctions
704 : : !! cg1(2,mpw1*nspinor*mband*mk1mem*nsppol) = pw coefficients of
705 : : !! RF wavefunctions at k,q.
706 : : !! dtefield = variables related to finite electric field calculation
707 : : !! ikpt = the index of the current k point
708 : : !! isppol=1 for unpolarized, 2 for spin-polarized
709 : : !! mband = maximum number of bands
710 : : !! mkmem_rbz = maximum number of k-points in core memory
711 : : !! mpw = maximum number of plane waves
712 : : !! mpw1 = maximum number of plane waves for response wavefunctions
713 : : !! nkpt = number of k points
714 : : !! npwarr(nkpt) = number of planewaves in basis and boundary at this k point
715 : : !! npwar1(nkpt) = number of planewaves in basis and boundary for response wfs
716 : : !! nspinor = 1 for scalar wfs, 2 for spinor wfs
717 : : !! nsppol = 1 for unpolarized, 2 for spin-polarized
718 : : !! qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3) =
719 : : !! inverse of the overlap matrix
720 : : !! pwindall(max(mpw,mpw1)*mkmem_rbz,8,3) = array used to compute the overlap matrices
721 : : !! pwindall(:,1,:) <- <u^(0)_i|u^(0)_i+1>
722 : : !! pwindall(:,2,:) <- <u^(0)_i|u^(0)_i-1>
723 : : !! pwindall(:,3,:) <- <u^(1)_i|u^(1)_i+1>
724 : : !! pwindall(:,4,:) <- <u^(1)_i|u^(1)_i-1>
725 : : !! pwindall(:,5,:) <- <u^(1)_i|u^(0)_i+n+1>
726 : : !! pwindall(:,6,:) <- <u^(1)_i|u^(0)_i+n-1>
727 : : !! pwindall(:,7,:) <- <u^(0)_i|u^(1)_i-n+1>
728 : : !! pwindall(:,8,:) <- <u^(0)_i|u^(1)_i-n-1>
729 : : !!
730 : : !! OUTPUT
731 : : !! grad_berry(2,mpw1,dtefield%mband_occ) = the gradient of the Berry phase term
732 : : !!
733 : : !! SOURCE
734 : :
735 : 488 : subroutine dfptff_gradberry(cg,cg1,dtefield,grad_berry,ikpt,isppol,&
736 : : & mband,mband_mem,mpw,mpw1,mkmem_rbz,mk1mem,&
737 : : & mpi_enreg,nkpt,&
738 : 488 : & npwarr,npwar1,nspinor,nsppol,qmat,pwindall)
739 : :
740 : : !Arguments ----------------------------------------
741 : : !scalars
742 : : integer,intent(in) :: ikpt,isppol,mband,mk1mem,mkmem_rbz,mpw,mpw1,nkpt,nspinor
743 : : integer,intent(in) :: mband_mem
744 : : integer,intent(in) :: nsppol
745 : : type(efield_type),intent(in) :: dtefield
746 : : type(MPI_type),intent(in) :: mpi_enreg
747 : : !arrays
748 : : integer,intent(in) :: npwar1(nkpt),npwarr(nkpt)
749 : : integer,intent(in) :: pwindall(max(mpw,mpw1)*mkmem_rbz,8,3)
750 : : real(dp),intent(in) :: cg(2,mpw*nspinor*mband_mem*mkmem_rbz*nsppol)
751 : : real(dp),intent(in) :: cg1(2,mpw1*nspinor*mband_mem*mk1mem*nsppol)
752 : : real(dp),intent(in) :: qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3)
753 : : !TODO MJV: grad_berry should also be dimensioned with mband_mem
754 : : real(dp),intent(out) :: grad_berry(2,mpw1,dtefield%mband_occ)
755 : :
756 : : !Local variables -------------------------
757 : : !scalars
758 : : integer :: iband,icg,icg1,idir,ikpt1
759 : : integer :: iband_me, jband_me, me_band, ierr
760 : : integer :: ikpt1m,ikptn,ikptnm,ikptnp1,ipw,jband,jpw,kband
761 : : integer :: mpw_tmp,npw_k1,npw_k2,pwmax,pwmin
762 : : real(dp) :: doti,dotr,fac,wfi,wfr
763 : : !arrays
764 : 976 : integer :: band_procs(mband)
765 : 488 : integer,allocatable :: pwind_tmp(:)
766 : : real(dp) :: z1(2),z2(2)
767 : 488 : real(dp),allocatable :: Amat(:,:,:),Bmat(:,:,:),s1mat(:,:,:),vect1(:,:)
768 : : real(dp),allocatable :: vect2(:,:)
769 : :
770 : : ! *************************************************************************
771 : :
772 : 488 : mpw_tmp=max(mpw,mpw1)
773 [ - + + - : 1464 : ABI_MALLOC(vect1,(2,0:mpw_tmp))
+ - + - -
+ - + ]
774 [ - + + - : 976 : ABI_MALLOC(vect2,(2,0:mpw_tmp))
- + - + ]
775 [ - + + - : 1952 : ABI_MALLOC(s1mat,(2,dtefield%mband_occ,dtefield%mband_occ))
- + + - +
- + - - +
- + ]
776 [ - + + - : 1464 : ABI_MALLOC(pwind_tmp,(mpw_tmp))
+ - + - -
+ - + ]
777 [ - + + - : 1464 : ABI_MALLOC(Amat,(2,dtefield%mband_occ,dtefield%mband_occ))
- + + - -
+ - + ]
778 [ - + + - : 1464 : ABI_MALLOC(Bmat,(2,dtefield%mband_occ,dtefield%mband_occ))
- + + - -
+ + - ]
779 [ + + + + ]: 2928 : vect1(:,0) = zero ; vect2(:,0) = zero
780 [ + + + + : 25864 : s1mat(:,:,:)=zero
+ + ]
781 [ + + + + : 254248 : grad_berry(:,:,:) = zero
+ + ]
782 : :
783 : 488 : me_band = mpi_enreg%me_band
784 : 488 : call proc_distrb_band(band_procs,mpi_enreg%proc_distrb,ikpt,isppol,mband,me_band,mpi_enreg%me_kpt,mpi_enreg%comm_band)
785 : :
786 [ + + ]: 1952 : do idir=1,3
787 : : fac = dtefield%efield_dot(idir)*dble(nkpt)/&
788 : 1464 : & (dble(dtefield%nstr(idir))*four_pi)
789 : :
790 : : ! prepare
791 : 1464 : ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
792 : 1464 : icg1 = dtefield%cgindex(ikpt1,isppol+nsppol)
793 : 1464 : npw_k1 = npwar1(ikpt)
794 : 1464 : npw_k2 = npwar1(ikpt1)
795 [ + + ]: 62220 : pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,3,idir)
796 : :
797 : : !TODO: this algorithm is very inefficient: the looping is in the wrong order.
798 : : ! should be possible to store a temp vector and make it into a BLAS call...
799 : : ! basically boils down to an internal sum over iband
800 : : ! grad_berry(ipw,jband) = fac * wf(ipw,:) * qmat(:,jband)
801 [ + + ]: 62220 : do ipw = 1, npw_k1
802 : 60756 : jpw = pwind_tmp(ipw)
803 : :
804 [ + + ]: 62220 : if (jpw > 0) then
805 : : iband_me = 0
806 [ + + ]: 245220 : do iband = 1, dtefield%mband_occ
807 [ + - ]: 196176 : if (band_procs(iband) /= me_band) cycle
808 : 196176 : iband_me = iband_me + 1
809 : 196176 : wfr = cg1(1,icg1 + (iband_me - 1)*npw_k2*nspinor + jpw)
810 : 196176 : wfi = cg1(2,icg1 + (iband_me - 1)*npw_k2*nspinor + jpw)
811 : :
812 [ + + ]: 1029924 : do jband = 1, dtefield%mband_occ
813 : :
814 : : grad_berry(1,ipw,jband) = &
815 : : & grad_berry(1,ipw,jband) + &
816 : 784704 : & fac*qmat(1,iband,jband,ikpt,1,idir)*wfr - fac*qmat(2,iband,jband,ikpt,1,idir)*wfi
817 : :
818 : : grad_berry(2,ipw,jband) = &
819 : : & grad_berry(2,ipw,jband) + &
820 : 980880 : & fac*qmat(1,iband,jband,ikpt,1,idir)*wfi + fac*qmat(2,iband,jband,ikpt,1,idir)*wfr
821 : :
822 : : end do
823 : : end do
824 : : end if
825 : :
826 : : end do
827 : :
828 : : ! compute <u^(0)_{k_j+n}|u^(1)_{k_j+1,q}> matrix----------------------------------------------------
829 : :
830 : : ! prepare to calculate overlap matrix
831 : 1464 : ikptn = dtefield%ikpt_dk(ikpt,7,idir)
832 : 1464 : ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
833 : 1464 : icg = dtefield%cgindex(ikptn,isppol)
834 : 1464 : icg1 = dtefield%cgindex(ikpt1,isppol+nsppol)
835 : 1464 : npw_k1 = npwarr(ikptn)
836 : : npw_k2 = npwar1(ikpt1)
837 [ + + ]: 62220 : pwind_tmp(1:npw_k1) = pwindall((ikptn-1)*mpw_tmp+1:(ikptn-1)*mpw_tmp+npw_k1,7,idir)
838 : :
839 : :
840 [ + + + + ]: 7320 : vect1(:,0) = zero ; vect2(:,0) = zero
841 [ + + ]: 7320 : do jband = 1, dtefield%mband_occ
842 : : vect2(:,1:npw_k2) = &
843 [ + + + + ]: 734928 : & cg1(:,icg1 + 1 + (jband-1)*npw_k2*nspinor:icg1 + jband*npw_k2*nspinor)
844 [ + + + + : 32208 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
845 : :
846 [ + + ]: 30744 : do iband = 1, dtefield%mband_occ
847 : :
848 : 23424 : pwmin = (iband-1)*npw_k1*nspinor
849 : 23424 : pwmax = pwmin + npw_k1*nspinor
850 : : vect1(:,1:npw_k1) = &
851 [ + + + + ]: 2939712 : & cg(:,icg + 1 + pwmin:icg + pwmax)
852 [ + + + + : 128832 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
853 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
854 : 23424 : & vect1,vect2)
855 : 23424 : s1mat(1,iband,jband) = dotr
856 : 29280 : s1mat(2,iband,jband) = doti
857 : :
858 : : end do ! iband
859 : : end do !jband
860 : :
861 : : ! compute <u^(0)_{-k_j+1}|u^(1)_{-k_j+n},q> matrix--------------------
862 : :
863 : : ! prepare to calculate overlap matrix
864 : 1464 : ikptn = dtefield%ikpt_dk(ikpt,7,idir)
865 : 1464 : ikptnm= dtefield%ikpt_dk(ikptn,9,idir)
866 : 1464 : ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
867 : 1464 : ikpt1m= dtefield%ikpt_dk(ikpt1,9,idir)
868 : :
869 : 1464 : icg = dtefield%cgindex(ikpt1m,isppol)
870 : 1464 : icg1 = dtefield%cgindex(ikptnm,isppol+nsppol)
871 : 1464 : npw_k1 = npwarr(ikpt1m)
872 : 1464 : npw_k2 = npwar1(ikptnm)
873 [ + + ]: 62220 : pwind_tmp(1:npw_k1) = pwindall((ikpt1m-1)*mpw_tmp+1:(ikpt1m-1)*mpw_tmp+npw_k1,7,idir)
874 : :
875 [ + + + + ]: 8784 : vect1(:,0) = zero ; vect2(:,0) = zero
876 [ + + ]: 7320 : do jband = 1, dtefield%mband_occ
877 : : vect2(:,1:npw_k2) = &
878 [ + + + + ]: 734928 : & cg1(:,icg1 + 1 + (jband-1)*npw_k2*nspinor:icg1 + jband*npw_k2*nspinor)
879 [ + + + + : 32208 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
880 : :
881 [ + + ]: 30744 : do iband = 1, dtefield%mband_occ
882 : :
883 : 23424 : pwmin = (iband-1)*npw_k1*nspinor
884 : 23424 : pwmax = pwmin + npw_k1*nspinor
885 : : vect1(:,1:npw_k1) = &
886 [ + + + + ]: 2939712 : & cg(:,icg + 1 + pwmin:icg + pwmax)
887 [ + + + + : 128832 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
888 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
889 : 23424 : & vect1,vect2)
890 : :
891 : 23424 : s1mat(1,jband,iband) = s1mat(1,jband,iband) + dotr
892 : 29280 : s1mat(2,jband,iband) = s1mat(2,jband,iband) + doti
893 : :
894 : : end do ! iband
895 : : end do !jband
896 : :
897 [ + + + + : 77592 : Amat(:,:,:)=zero
+ + ]
898 : :
899 : : ! calculate Amat
900 [ + + ]: 7320 : do iband=1, dtefield%mband_occ
901 [ + + ]: 30744 : do jband=1, dtefield%mband_occ
902 [ + + ]: 122976 : do kband=1, dtefield%mband_occ
903 : : Amat(1,iband,jband) = Amat(1,iband,jband) + s1mat(1,iband,kband)*&
904 : : & qmat(1,kband,jband,ikpt,1,idir)&
905 : 93696 : & - s1mat(2,iband,kband)*qmat(2,kband,jband,ikpt,1,idir)
906 : : Amat(2,iband,jband) = Amat(2,iband,jband) + s1mat(1,iband,kband)*&
907 : : & qmat(2,kband,jband,ikpt,1,idir)&
908 : 117120 : & + s1mat(2,iband,kband)*qmat(1,kband,jband,ikpt,1,idir)
909 : : end do
910 : : end do
911 : : end do
912 : :
913 [ + + + + : 77592 : Bmat(:,:,:)=zero
+ + ]
914 : :
915 : : ! calculate Bmat
916 : 1464 : ikptn = dtefield%ikpt_dk(ikpt,7,idir)
917 [ + + ]: 7320 : do iband=1, dtefield%mband_occ
918 [ + + ]: 30744 : do jband=1, dtefield%mband_occ
919 [ + + ]: 122976 : do kband=1, dtefield%mband_occ
920 : : Bmat(1,jband,kband) = Bmat(1,jband,kband) + Amat(1,iband,kband)*&
921 : : & qmat(1,jband,iband,ikptn,1,idir)&
922 : 93696 : & - Amat(2,iband,kband)*qmat(2,jband,iband,ikptn,1,idir)
923 : : Bmat(2,jband,kband) = Bmat(2,jband,kband) + Amat(1,iband,kband)*&
924 : : & qmat(2,jband,iband,ikptn,1,idir)&
925 : 117120 : & + Amat(2,iband,kband)*qmat(1,jband,iband,ikptn,1,idir)
926 : : end do
927 : : end do
928 : : end do
929 : :
930 : : ! calc. the second term of gradient------------------------------
931 : :
932 : : ! preparation
933 : :
934 : 1464 : ikptnp1 = dtefield%ikpt_dk(ikpt,3,idir)
935 : 1464 : icg = dtefield%cgindex(ikptnp1,isppol)
936 : 1464 : npw_k1 = npwar1(ikpt)
937 : 1464 : npw_k2 = npwarr(ikptnp1)
938 [ + + ]: 62220 : pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,5,idir)
939 : :
940 : : z1(:) = zero
941 : : z2(:) = zero
942 : :
943 [ + + ]: 62220 : do ipw = 1, npw_k1
944 : :
945 : 60756 : jpw = pwind_tmp(ipw)
946 : :
947 [ + + ]: 62220 : if (jpw > 0) then
948 : :
949 : : iband_me = 0
950 [ + + ]: 245220 : do iband = 1, dtefield%mband_occ
951 [ + - ]: 196176 : if (band_procs(iband) /= me_band) cycle
952 : 196176 : iband_me = iband_me + 1
953 : 196176 : wfr = cg(1,icg + (iband_me - 1)*npw_k2*nspinor + jpw)
954 : 196176 : wfi = cg(2,icg + (iband_me - 1)*npw_k2*nspinor + jpw)
955 : :
956 [ + + ]: 1029924 : do jband=1, dtefield%mband_occ
957 : :
958 : : grad_berry(1,ipw,jband) = grad_berry(1,ipw,jband) &
959 : 784704 : & - fac*(Bmat(1,iband,jband)*wfr - Bmat(2,iband,jband)*wfi)
960 : : grad_berry(2,ipw,jband) = grad_berry(2,ipw,jband) &
961 : 980880 : & - fac*(Bmat(1,iband,jband)*wfi + Bmat(2,iband,jband)*wfr)
962 : :
963 : : end do
964 : : end do
965 : : end if
966 : : end do
967 : :
968 : : ! Second part of gradient of Berry phase++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
969 : :
970 [ + + + + ]: 8784 : vect1(:,0) = zero ; vect2(:,0) = zero
971 : :
972 : : ! prepare
973 : 1464 : ikpt1 = dtefield%ikpt_dk(ikpt,2,idir)
974 : 1464 : icg1 = dtefield%cgindex(ikpt1,isppol+nsppol)
975 : : npw_k1 = npwar1(ikpt)
976 : 1464 : npw_k2 = npwar1(ikpt1)
977 [ + + ]: 62220 : pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,4,idir)
978 : :
979 : : ! write(std_out,*)'dfpt_cgwf:pwind_tmp',pwind_tmp
980 : : ! stop
981 : :
982 [ + + ]: 62220 : do ipw = 1, npw_k1
983 : :
984 : 60756 : jpw = pwind_tmp(ipw)
985 : :
986 [ + + ]: 62220 : if (jpw > 0) then
987 : : iband_me = 0
988 [ + + ]: 245220 : do iband = 1, dtefield%mband_occ
989 [ + - ]: 196176 : if (band_procs(iband) /= me_band) cycle
990 : 196176 : iband_me = iband_me + 1
991 : 196176 : wfr = cg1(1,icg1 + (iband_me - 1)*npw_k2*nspinor + jpw)
992 : 196176 : wfi = cg1(2,icg1 + (iband_me - 1)*npw_k2*nspinor + jpw)
993 : :
994 [ + + ]: 1029924 : do jband = 1, dtefield%mband_occ
995 : :
996 : : grad_berry(1,ipw,jband) = &
997 : : & grad_berry(1,ipw,jband) - &
998 : 784704 : & fac*qmat(1,iband,jband,ikpt,2,idir)*wfr + fac*qmat(2,iband,jband,ikpt,2,idir)*wfi
999 : :
1000 : : grad_berry(2,ipw,jband) = &
1001 : : & grad_berry(2,ipw,jband) - &
1002 : 980880 : & fac*qmat(1,iband,jband,ikpt,2,idir)*wfi - fac*qmat(2,iband,jband,ikpt,2,idir)*wfr
1003 : :
1004 : : end do
1005 : : end do
1006 : : end if
1007 : : end do
1008 : :
1009 : :
1010 : : ! compute <u^(0)_{k_j+n}|u^(1)_{k_j-1,q}> matrix----------------------------------------------------
1011 : :
1012 : : ! prepare to calculate overlap matrix
1013 : 1464 : ikptn = dtefield%ikpt_dk(ikpt,7,idir)
1014 : 1464 : ikpt1 = dtefield%ikpt_dk(ikpt,2,idir)
1015 : 1464 : icg = dtefield%cgindex(ikptn,isppol)
1016 : 1464 : icg1 = dtefield%cgindex(ikpt1,isppol+nsppol)
1017 : 1464 : npw_k1 = npwarr(ikptn)
1018 : : npw_k2 = npwar1(ikpt1)
1019 [ + + ]: 62220 : pwind_tmp(1:npw_k1) =pwindall((ikptn-1)*mpw_tmp+1:(ikptn-1)*mpw_tmp+npw_k1,8,idir)
1020 : :
1021 [ + + + + ]: 8784 : vect1(:,0) = zero ; vect2(:,0) = zero
1022 : : jband_me = 0
1023 [ + + ]: 7320 : do jband = 1, dtefield%mband_occ
1024 [ + - ]: 5856 : if (band_procs(jband) == me_band) then
1025 : 5856 : jband_me = jband_me + 1
1026 : : vect2(:,1:npw_k2) = &
1027 [ + + + + ]: 734928 : & cg1(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
1028 [ + + + + : 32208 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
1029 : : end if
1030 : 5856 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
1031 : :
1032 : 5856 : iband_me = 0
1033 [ + + ]: 30744 : do iband = 1, dtefield%mband_occ
1034 [ - + ]: 23424 : if (band_procs(iband) /= mpi_enreg%me_band) cycle
1035 : 23424 : iband_me = iband_me + 1
1036 : 23424 : pwmin = (iband-1)*npw_k1*nspinor
1037 : 23424 : pwmax = pwmin + npw_k1*nspinor
1038 : : vect1(:,1:npw_k1) = &
1039 [ + + + + ]: 2939712 : & cg(:,icg + 1 + pwmin:icg + pwmax)
1040 [ + + + + : 128832 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
1041 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
1042 : 23424 : & vect1,vect2)
1043 : 23424 : s1mat(1,iband,jband) = dotr
1044 : 29280 : s1mat(2,iband,jband) = doti
1045 : :
1046 : : end do ! iband
1047 : : end do !jband
1048 : :
1049 : : ! compute <u^(0)_{-k_j-1}|u^(1)_{-k_j+n,q}> matrix-----------------------------------------------------
1050 : :
1051 : : ! prepare to calculate overlap matrix
1052 : 1464 : ikptn = dtefield%ikpt_dk(ikpt,7,idir)
1053 : 1464 : ikptnm= dtefield%ikpt_dk(ikptn,9,idir)
1054 : 1464 : ikpt1 = dtefield%ikpt_dk(ikpt,2,idir)
1055 : 1464 : ikpt1m= dtefield%ikpt_dk(ikpt1,9,idir)
1056 : 1464 : icg = dtefield%cgindex(ikpt1m,isppol)
1057 : 1464 : icg1 = dtefield%cgindex(ikptnm,isppol+nsppol)
1058 : 1464 : npw_k1 = npwarr(ikpt1m)
1059 : 1464 : npw_k2 = npwar1(ikptnm)
1060 [ + + ]: 62220 : pwind_tmp(1:npw_k1) =pwindall((ikpt1m-1)*mpw_tmp+1:(ikpt1m-1)*mpw_tmp+npw_k1,8,idir)
1061 : :
1062 : :
1063 : :
1064 [ + + + + ]: 7320 : vect1(:,0) = zero ; vect2(:,0) = zero
1065 : : jband_me = 0
1066 [ + + ]: 7320 : do jband = 1, dtefield%mband_occ
1067 [ + - ]: 5856 : if (band_procs(jband) == me_band) then
1068 : 5856 : jband_me = jband_me + 1
1069 : : vect2(:,1:npw_k2) = &
1070 [ + + + + ]: 734928 : & cg1(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
1071 [ + + + + : 32208 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
1072 : : end if
1073 : 5856 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
1074 : :
1075 : 5856 : iband_me = 0
1076 [ + + ]: 30744 : do iband = 1, dtefield%mband_occ
1077 [ - + ]: 23424 : if (band_procs(iband) /= mpi_enreg%me_band) cycle
1078 : 23424 : iband_me = iband_me + 1
1079 : 23424 : pwmin = (iband_me-1)*npw_k1*nspinor
1080 : 23424 : pwmax = pwmin + npw_k1*nspinor
1081 : : vect1(:,1:npw_k1) = &
1082 [ + + + + ]: 2939712 : & cg(:,icg + 1 + pwmin:icg + pwmax)
1083 [ + + + + : 128832 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
1084 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
1085 : 23424 : & vect1,vect2)
1086 : 23424 : s1mat(1,jband,iband) = s1mat(1,jband,iband) + dotr
1087 : 29280 : s1mat(2,jband,iband) = s1mat(2,jband,iband) + doti
1088 : :
1089 : : end do ! iband
1090 : : end do !jband
1091 : : ! accumulate all iband values on each proc
1092 : 1464 : call xmpi_sum(s1mat,mpi_enreg%comm_band,ierr)
1093 : :
1094 [ + + + + : 77592 : Amat(:,:,:)=zero
+ + ]
1095 : :
1096 : : ! calculate Amat: s1mat is complete so sum over all bands here
1097 : : ! TODO: could reduce one loop over bands
1098 : : ! TODO: replace this with a BLAS call: A = s1*q in complex numbers
1099 [ + + ]: 7320 : do iband=1, dtefield%mband_occ
1100 [ + + ]: 30744 : do jband=1, dtefield%mband_occ
1101 [ + + ]: 122976 : do kband=1, dtefield%mband_occ
1102 : : Amat(1,iband,jband) = Amat(1,iband,jband) + s1mat(1,iband,kband)*&
1103 : : & qmat(1,kband,jband,ikpt,2,idir)&
1104 : 93696 : & - s1mat(2,iband,kband)*qmat(2,kband,jband,ikpt,2,idir)
1105 : : Amat(2,iband,jband) = Amat(2,iband,jband) + s1mat(1,iband,kband)*&
1106 : : & qmat(2,kband,jband,ikpt,2,idir)&
1107 : 117120 : & + s1mat(2,iband,kband)*qmat(1,kband,jband,ikpt,2,idir)
1108 : : end do
1109 : : end do
1110 : : end do
1111 : :
1112 [ + + + + : 77592 : Bmat(:,:,:)=zero
+ + ]
1113 : :
1114 : : ! calculate Bmat: as above, all matrices A B q are band-complete at this stage
1115 : : ! TODO: could reduce one loop over bands
1116 : : ! TODO: replace this with a BLAS call: B = q*A in complex numbers
1117 : 1464 : ikptn = dtefield%ikpt_dk(ikpt,7,idir)
1118 [ + + ]: 7320 : do iband=1, dtefield%mband_occ
1119 [ + + ]: 30744 : do jband=1, dtefield%mband_occ
1120 [ + + ]: 122976 : do kband=1, dtefield%mband_occ
1121 : : Bmat(1,jband,kband) = Bmat(1,jband,kband) + Amat(1,iband,kband)*&
1122 : : & qmat(1,jband,iband,ikptn,2,idir)&
1123 : 93696 : & - Amat(2,iband,kband)*qmat(2,jband,iband,ikptn,2,idir)
1124 : : Bmat(2,jband,kband) = Bmat(2,jband,kband) + Amat(1,iband,kband)*&
1125 : : & qmat(2,jband,iband,ikptn,2,idir)&
1126 : 117120 : + Amat(2,iband,kband)*qmat(1,jband,iband,ikptn,2,idir)
1127 : : end do
1128 : : end do
1129 : : end do
1130 : :
1131 : : ! calc. the second term of gradient------------------------------
1132 : :
1133 : : ! preparation
1134 : :
1135 : 1464 : ikptnp1 = dtefield%ikpt_dk(ikpt,4,idir)
1136 : 1464 : icg = dtefield%cgindex(ikptnp1,isppol)
1137 : 1464 : npw_k1 = npwar1(ikpt)
1138 : 1464 : npw_k2 = npwarr(ikptnp1)
1139 [ + + ]: 62220 : pwind_tmp(1:npw_k1) =pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,6,idir)
1140 : :
1141 : : z1(:) = zero
1142 : : z2(:) = zero
1143 [ + + ]: 64172 : do ipw = 1, npw_k1
1144 : 60756 : jpw = pwind_tmp(ipw)
1145 [ + + ]: 62220 : if (jpw > 0) then
1146 : : iband_me = 0
1147 [ + + ]: 245220 : do iband = 1, dtefield%mband_occ
1148 [ + - ]: 196176 : if (band_procs(iband) /= me_band) cycle
1149 : 196176 : iband_me = iband_me + 1
1150 : 196176 : wfr = cg(1,icg + (iband_me - 1)*npw_k2*nspinor + jpw)
1151 : 196176 : wfi = cg(2,icg + (iband_me - 1)*npw_k2*nspinor + jpw)
1152 : :
1153 [ + + ]: 1029924 : do jband=1, dtefield%mband_occ
1154 : 784704 : grad_berry(1,ipw,jband) = grad_berry(1,ipw,jband) + fac*(Bmat(1,iband,jband)*wfr - Bmat(2,iband,jband)*wfi)
1155 : 980880 : grad_berry(2,ipw,jband) = grad_berry(2,ipw,jband) + fac*(Bmat(1,iband,jband)*wfi + Bmat(2,iband,jband)*wfr)
1156 : : end do
1157 : : end do
1158 : : end if
1159 : : end do
1160 : :
1161 : : end do !idir
1162 : :
1163 : 488 : call xmpi_sum(grad_berry,mpi_enreg%comm_band,ierr) ! sum over iband for all previous loops
1164 : :
1165 [ - + ]: 488 : ABI_FREE(vect1)
1166 [ - + ]: 488 : ABI_FREE(vect2)
1167 [ - + ]: 488 : ABI_FREE(s1mat)
1168 [ - + ]: 488 : ABI_FREE(Amat)
1169 [ - + ]: 488 : ABI_FREE(Bmat)
1170 [ - + ]: 488 : ABI_FREE(pwind_tmp)
1171 : :
1172 : 488 : end subroutine dfptff_gradberry
1173 : : !!***
1174 : :
1175 : : !!****f* ABINIT/dfptff_gbefd
1176 : : !! NAME
1177 : : !! dfptff_gbefd
1178 : : !!
1179 : : !! FUNCTION
1180 : : !! calculate the gradient of the second order \Omega E \cdot P
1181 : : !! term, Eq.(23) in PRB 75, 115116(2007) [[cite:Wang2007]].
1182 : : !!
1183 : : !! INPUTS
1184 : : !! cg(2,mpw*nspinor*mband*mkmem_rbz*nsppol) = planewave coefficients of wavefunctions
1185 : : !! cg1(2,mpw1*nspinor*mband*mk1mem*nsppol) = pw coefficients of
1186 : : !! RF wavefunctions at k,q.
1187 : : !! dtefield = variables related to response Berry-phase calculation
1188 : : !! ikpt = the index of the current k point
1189 : : !! isppol = the index of the spin component
1190 : : !! mband = maximum number of bands
1191 : : !! mband_mem = maximum number of bands on this cpu
1192 : : !! mkmem_rbz = maximum number of k-points in core memory
1193 : : !! mpi_enreg = parallel distribution datastructure
1194 : : !! mpw = maximum number of plane waves
1195 : : !! mpw1 = maximum number of plane waves for response wavefunctions
1196 : : !! nkpt = number of k points
1197 : : !! npwarr(nkpt) = number of planewaves in basis and boundary at this k point
1198 : : !! npwar1(nkpt) = number of planewaves in basis and boundary for response wfs
1199 : : !! nspinor = 1 for scalar wfs, 2 for spinor wfs
1200 : : !! nsppol = 1 for unpolarized, 2 for spin-polarized
1201 : : !! qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3) =
1202 : : !! inverse of the overlap matrix
1203 : : !! pwindall(max(mpw,mpw1)*mkmem_rbz,8,3) = array used to compute the overlap matrices
1204 : : !! pwindall(:,1,:) <- <u^(0)_i|u^(0)_i+1>
1205 : : !! pwindall(:,2,:) <- <u^(0)_i|u^(0)_i-1>
1206 : : !! pwindall(:,3,:) <- <u^(1)_i|u^(1)_i+1>
1207 : : !! pwindall(:,4,:) <- <u^(1)_i|u^(1)_i-1>
1208 : : !! pwindall(:,5,:) <- <u^(1)_i|u^(0)_i+n+1>
1209 : : !! pwindall(:,6,:) <- <u^(1)_i|u^(0)_i+n-1>
1210 : : !! pwindall(:,7,:) <- <u^(0)_i|u^(1)_i-n+1>
1211 : : !! pwindall(:,8,:) <- <u^(0)_i|u^(1)_i-n-1>
1212 : : !!
1213 : : !! OUTPUT
1214 : : !! grad_berry = the gradient of the Berry phase term
1215 : : !!
1216 : : !! SOURCE
1217 : :
1218 : 288 : subroutine dfptff_gbefd(cg,cg1,dtefield,grad_berry,idir_efield,ikpt,isppol,&
1219 : : & mband,mband_mem,mpw,mpw1,mkmem_rbz,mk1mem,&
1220 : 288 : & mpi_enreg,nkpt,npwarr,npwar1,nspinor,nsppol,qmat,pwindall,rprimd)
1221 : :
1222 : : !Arguments ----------------------------------------
1223 : : !scalars
1224 : : integer,intent(in) :: idir_efield,ikpt,isppol,mband,mk1mem,mkmem_rbz,mpw,mpw1,nkpt
1225 : : integer,intent(in) :: mband_mem
1226 : : integer,intent(in) :: nspinor,nsppol
1227 : : type(efield_type),intent(in) :: dtefield
1228 : : type(MPI_type),intent(in) :: mpi_enreg
1229 : : !arrays
1230 : : integer,intent(in) :: npwar1(nkpt),npwarr(nkpt)
1231 : : integer,intent(in) :: pwindall(max(mpw,mpw1)*mkmem_rbz,8,3)
1232 : : real(dp),intent(in) :: cg(2,mpw*nspinor*mband_mem*mkmem_rbz*nsppol)
1233 : : real(dp),intent(in) :: cg1(2,mpw1*nspinor*mband_mem*mk1mem*nsppol)
1234 : : real(dp),intent(in) :: qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3)
1235 : : real(dp),intent(in) :: rprimd(3,3)
1236 : : !TODO MJV: this array is still npw*nband, and should be parallelized as well at some point...
1237 : : real(dp),intent(out) :: grad_berry(2,mpw1,dtefield%mband_occ)
1238 : :
1239 : : !Local variables -------------------------
1240 : : !scalars
1241 : : integer :: iband,icg,icg1,idir,ikpt1
1242 : : integer :: iband_me, jband_me, ierr
1243 : : integer :: ikptn,ikptnp1,ipw,jband,jpw,kband
1244 : : integer :: mpw_tmp,npw_k1,npw_k2,pwmax,pwmin
1245 : : real(dp) :: doti,dotr,fac,wfi,wfr
1246 : : !arrays
1247 : 288 : integer,allocatable :: pwind_tmp(:)
1248 : 576 : integer :: band_procs(mband)
1249 : : real(dp) :: z1(2),z2(2)
1250 : 288 : real(dp),allocatable :: Amat(:,:,:),Bmat(:,:,:),s1mat(:,:,:),vect1(:,:)
1251 : : real(dp),allocatable :: vect2(:,:)
1252 : :
1253 : : ! *************************************************************************
1254 : :
1255 : 288 : mpw_tmp=max(mpw,mpw1)
1256 [ - + + - : 864 : ABI_MALLOC(vect1,(2,0:mpw_tmp))
+ - + - -
+ - + ]
1257 [ - + + - : 576 : ABI_MALLOC(vect2,(2,0:mpw_tmp))
- + - + ]
1258 [ - + + - : 1152 : ABI_MALLOC(s1mat,(2,dtefield%mband_occ,dtefield%mband_occ))
- + + - +
- + - - +
- + ]
1259 [ - + + - : 864 : ABI_MALLOC(pwind_tmp,(mpw_tmp))
+ - + - -
+ - + ]
1260 [ - + + - : 864 : ABI_MALLOC(Amat,(2,dtefield%mband_occ,dtefield%mband_occ))
- + + - -
+ - + ]
1261 [ - + + - : 864 : ABI_MALLOC(Bmat,(2,dtefield%mband_occ,dtefield%mband_occ))
- + + - -
+ - + ]
1262 [ + + + + ]: 1440 : vect1(:,0) = zero ; vect2(:,0) = zero
1263 [ + + + + : 15264 : s1mat(:,:,:)=zero
+ + ]
1264 [ + + + + : 150048 : grad_berry(:,:,:) = zero
+ + ]
1265 : :
1266 : : call proc_distrb_band(band_procs,mpi_enreg%proc_distrb,ikpt,isppol,mband,&
1267 : 288 : & mpi_enreg%me_band,mpi_enreg%me_kpt,mpi_enreg%comm_band)
1268 : :
1269 [ + + ]: 1152 : do idir=1,3
1270 : : fac = dtefield%efield_dot(idir)*dble(nkpt)/&
1271 : 864 : & (dble(dtefield%nstr(idir))*four_pi)
1272 : :
1273 : : ! prepare
1274 : 864 : ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
1275 : 864 : icg1 = dtefield%cgindex(ikpt1,isppol+nsppol)
1276 : 864 : npw_k1 = npwar1(ikpt)
1277 : 864 : npw_k2 = npwar1(ikpt1)
1278 [ + + ]: 36720 : pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,3,idir)
1279 : :
1280 [ + + ]: 36720 : do ipw = 1, npw_k1
1281 : 35856 : jpw = pwind_tmp(ipw)
1282 [ + + ]: 36720 : if (jpw > 0) then
1283 : 28944 : iband_me = 0
1284 [ + + ]: 144720 : do iband = 1, dtefield%mband_occ
1285 [ + - ]: 115776 : if (proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,iband,iband,isppol,mpi_enreg%me_band)) cycle
1286 : 115776 : iband_me = iband_me + 1
1287 : 115776 : wfr = cg1(1,icg1 + (iband_me - 1)*npw_k2*nspinor + jpw)
1288 : 115776 : wfi = cg1(2,icg1 + (iband_me - 1)*npw_k2*nspinor + jpw)
1289 : :
1290 [ + + ]: 607824 : do jband = 1, dtefield%mband_occ
1291 : : grad_berry(1,ipw,jband) = &
1292 : : & grad_berry(1,ipw,jband) + &
1293 : 463104 : & fac*qmat(1,iband,jband,ikpt,1,idir)*wfr - fac*qmat(2,iband,jband,ikpt,1,idir)*wfi
1294 : :
1295 : : grad_berry(2,ipw,jband) = &
1296 : : & grad_berry(2,ipw,jband) + &
1297 : 578880 : & fac*qmat(1,iband,jband,ikpt,1,idir)*wfi + fac*qmat(2,iband,jband,ikpt,1,idir)*wfr
1298 : : end do
1299 : : end do
1300 : : end if
1301 : : end do
1302 : : ! accumulate full sum over iband below at the end
1303 : :
1304 : : ! compute <u^(0)_{k_j}|u^(1)_{k_j+1}> matrix----------------------------------------------------
1305 : :
1306 : : ! prepare to calculate overlap matrix
1307 : 864 : ikptn = ikpt
1308 : 864 : ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
1309 : 864 : icg = dtefield%cgindex(ikptn,isppol)
1310 : 864 : icg1 = dtefield%cgindex(ikpt1,isppol+nsppol)
1311 : 864 : npw_k1 = npwarr(ikptn)
1312 : : npw_k2 = npwar1(ikpt1)
1313 [ + + ]: 36720 : pwind_tmp(1:npw_k1) = pwindall((ikptn-1)*mpw_tmp+1:(ikptn-1)*mpw_tmp+npw_k1,7,idir)
1314 : :
1315 [ + + + + ]: 4320 : vect1(:,0) = zero ; vect2(:,0) = zero
1316 : : jband_me = 0
1317 [ + + ]: 4320 : do jband = 1, dtefield%mband_occ
1318 [ + - ]: 3456 : if (band_procs(jband) == mpi_enreg%me_band) then
1319 : 3456 : jband_me = jband_me + 1
1320 : : vect2(:,1:npw_k2) = &
1321 [ + + + + ]: 433728 : & cg1(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
1322 : : end if
1323 : 3456 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
1324 : :
1325 [ + + + + : 19008 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
1326 : 3456 : iband_me = 0
1327 [ + + ]: 21600 : do iband = 1, dtefield%mband_occ
1328 [ - + ]: 13824 : if (band_procs(iband) /= mpi_enreg%me_band) cycle
1329 : 13824 : iband_me = iband_me + 1
1330 : 13824 : pwmin = (iband_me-1)*npw_k1*nspinor
1331 : 13824 : pwmax = pwmin + npw_k1*nspinor
1332 [ + + + + ]: 1734912 : vect1(:,1:npw_k1) = cg(:,icg + 1 + pwmin:icg + pwmax)
1333 [ + + + + : 76032 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
1334 : 13824 : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,vect1,vect2)
1335 : 13824 : s1mat(1,iband,jband) = dotr
1336 : 17280 : s1mat(2,iband,jband) = doti
1337 : : end do ! iband
1338 : : end do !jband
1339 : :
1340 : : ! compute <u^(1)_{k_j}|u^(0)_{k_j+1}> matrix-----------------------------------------------------
1341 : :
1342 : : ! prepare to calculate overlap matrix
1343 : 864 : ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
1344 : 864 : icg = dtefield%cgindex(ikpt,isppol+nsppol)
1345 : 864 : icg1 = dtefield%cgindex(ikpt1,isppol)
1346 : 864 : npw_k1 = npwar1(ikpt)
1347 : 864 : npw_k2 = npwarr(ikpt1)
1348 [ + + ]: 36720 : pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,5,idir)
1349 : :
1350 [ + + + + ]: 4320 : vect1(:,0) = zero ; vect2(:,0) = zero
1351 : : jband_me = 0
1352 [ + + ]: 4320 : do jband = 1, dtefield%mband_occ
1353 [ + - ]: 3456 : if (band_procs(jband) == mpi_enreg%me_band) then
1354 : 3456 : jband_me = jband_me + 1
1355 : : vect2(:,1:npw_k2) = &
1356 [ + + + + ]: 433728 : & cg(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
1357 [ + + + + : 19008 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
1358 : : end if
1359 : 3456 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
1360 : :
1361 : 3456 : iband_me = 0
1362 [ + + ]: 18144 : do iband = 1, dtefield%mband_occ
1363 [ - + ]: 13824 : if (band_procs(iband) /= mpi_enreg%me_band) cycle
1364 : 13824 : iband_me = iband_me + 1
1365 : 13824 : pwmin = (iband_me-1)*npw_k1*nspinor
1366 : 13824 : pwmax = pwmin + npw_k1*nspinor
1367 : : vect1(:,1:npw_k1) = &
1368 [ + + + + ]: 1734912 : & cg1(:,icg + 1 + pwmin:icg + pwmax)
1369 [ + + + + : 76032 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
1370 : 13824 : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,vect1,vect2)
1371 : 13824 : s1mat(1,jband,iband) = s1mat(1,jband,iband) + dotr
1372 : 17280 : s1mat(2,jband,iband) = s1mat(2,jband,iband) + doti
1373 : : end do ! iband
1374 : : end do !jband
1375 : : ! accumulate all iband values on each proc
1376 : 864 : call xmpi_sum(s1mat,mpi_enreg%comm_band,ierr)
1377 : :
1378 [ + + + + : 45792 : Amat(:,:,:)=zero
+ + ]
1379 : :
1380 : : ! calculate Amat
1381 [ + + ]: 4320 : do iband=1, dtefield%mband_occ
1382 [ + + ]: 18144 : do jband=1, dtefield%mband_occ
1383 [ + + ]: 72576 : do kband=1, dtefield%mband_occ
1384 : : Amat(1,iband,jband) = Amat(1,iband,jband) + s1mat(1,iband,kband)*qmat(1,kband,jband,ikpt,1,idir)&
1385 : 55296 : & - s1mat(2,iband,kband)*qmat(2,kband,jband,ikpt,1,idir)
1386 : : Amat(2,iband,jband) = Amat(2,iband,jband) + s1mat(1,iband,kband)*qmat(2,kband,jband,ikpt,1,idir)&
1387 : 69120 : & + s1mat(2,iband,kband)*qmat(1,kband,jband,ikpt,1,idir)
1388 : : end do
1389 : : end do
1390 : : end do
1391 : :
1392 [ + + + + : 45792 : Bmat(:,:,:)=zero
+ + ]
1393 : :
1394 : : ! calculate Bmat
1395 : 864 : ikptn = dtefield%ikpt_dk(ikpt,7,idir)
1396 [ + + ]: 4320 : do iband=1, dtefield%mband_occ
1397 [ + + ]: 18144 : do jband=1, dtefield%mband_occ
1398 [ + + ]: 72576 : do kband=1, dtefield%mband_occ
1399 : : Bmat(1,jband,kband) = Bmat(1,jband,kband) + Amat(1,iband,kband)*qmat(1,jband,iband,ikptn,1,idir)&
1400 : 55296 : & - Amat(2,iband,kband)*qmat(2,jband,iband,ikptn,1,idir)
1401 : : Bmat(2,jband,kband) = Bmat(2,jband,kband) + Amat(1,iband,kband)*qmat(2,jband,iband,ikptn,1,idir)&
1402 : 69120 : & + Amat(2,iband,kband)*qmat(1,jband,iband,ikptn,1,idir)
1403 : : end do
1404 : : end do
1405 : : end do
1406 : :
1407 : : ! calc. the second term of gradient------------------------------
1408 : :
1409 : : ! preparation
1410 : :
1411 : 864 : ikptnp1 = dtefield%ikpt_dk(ikpt,3,idir)
1412 : 864 : icg = dtefield%cgindex(ikptnp1,isppol)
1413 : : npw_k1 = npwar1(ikpt)
1414 : 864 : npw_k2 = npwarr(ikptnp1)
1415 [ + + ]: 36720 : pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,5,idir)
1416 : :
1417 : : z1(:) = zero
1418 : : z2(:) = zero
1419 : :
1420 [ + + ]: 36720 : do ipw = 1, npw_k1
1421 : 35856 : jpw = pwind_tmp(ipw)
1422 [ + + ]: 36720 : if (jpw > 0) then
1423 : 28944 : iband_me = 0
1424 [ + + ]: 144720 : do iband = 1, dtefield%mband_occ
1425 [ + - ]: 115776 : if (band_procs(iband) /= mpi_enreg%me_band) cycle
1426 : 115776 : iband_me = iband_me + 1
1427 : 115776 : wfr = cg(1,icg + (iband_me - 1)*npw_k2*nspinor + jpw)
1428 : 115776 : wfi = cg(2,icg + (iband_me - 1)*npw_k2*nspinor + jpw)
1429 : :
1430 [ + + ]: 607824 : do jband=1, dtefield%mband_occ
1431 : 463104 : grad_berry(1,ipw,jband) = grad_berry(1,ipw,jband) - fac*(Bmat(1,iband,jband)*wfr - Bmat(2,iband,jband)*wfi)
1432 : 578880 : grad_berry(2,ipw,jband) = grad_berry(2,ipw,jband) - fac*(Bmat(1,iband,jband)*wfi + Bmat(2,iband,jband)*wfr)
1433 : : end do
1434 : : end do
1435 : : end if
1436 : : end do
1437 : :
1438 : : ! Second part of gradient of Berry phase++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1439 : :
1440 [ + + + + ]: 4320 : vect1(:,0) = zero ; vect2(:,0) = zero
1441 : :
1442 : : ! prepare
1443 : 864 : ikpt1 = dtefield%ikpt_dk(ikpt,2,idir)
1444 : 864 : icg1 = dtefield%cgindex(ikpt1,isppol+nsppol)
1445 : : npw_k1 = npwar1(ikpt)
1446 : 864 : npw_k2 = npwar1(ikpt1)
1447 [ + + ]: 36720 : pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,4,idir)
1448 : :
1449 [ + + ]: 36720 : do ipw = 1, npw_k1
1450 : 35856 : jpw = pwind_tmp(ipw)
1451 [ + + ]: 36720 : if (jpw > 0) then
1452 : 28944 : iband_me = 0
1453 [ + + ]: 144720 : do iband = 1, dtefield%mband_occ
1454 [ + - ]: 115776 : if (band_procs(iband) /= mpi_enreg%me_band) cycle
1455 : 115776 : iband_me = iband_me + 1
1456 : 115776 : wfr = cg1(1,icg1 + (iband_me - 1)*npw_k2*nspinor + jpw)
1457 : 115776 : wfi = cg1(2,icg1 + (iband_me - 1)*npw_k2*nspinor + jpw)
1458 : :
1459 [ + + ]: 607824 : do jband = 1, dtefield%mband_occ
1460 : : grad_berry(1,ipw,jband) = &
1461 : : & grad_berry(1,ipw,jband) - &
1462 : 463104 : & fac*qmat(1,iband,jband,ikpt,2,idir)*wfr + fac*qmat(2,iband,jband,ikpt,2,idir)*wfi
1463 : :
1464 : : grad_berry(2,ipw,jband) = &
1465 : : & grad_berry(2,ipw,jband) - &
1466 : 578880 : & fac*qmat(1,iband,jband,ikpt,2,idir)*wfi - fac*qmat(2,iband,jband,ikpt,2,idir)*wfr
1467 : : end do
1468 : : end do
1469 : : end if
1470 : : end do
1471 : :
1472 : : ! compute <u^(0)_{k_j}|u^(1)_{k_j-1}> matrix----------------------------------------------------
1473 : :
1474 : : ! prepare to calculate overlap matrix
1475 : 864 : ikptn = ikpt
1476 : 864 : ikpt1 = dtefield%ikpt_dk(ikpt,2,idir)
1477 : 864 : icg = dtefield%cgindex(ikptn,isppol)
1478 : 864 : icg1 = dtefield%cgindex(ikpt1,isppol+nsppol)
1479 : 864 : npw_k1 = npwarr(ikptn)
1480 : : npw_k2 = npwar1(ikpt1)
1481 [ + + ]: 36720 : pwind_tmp(1:npw_k1) =pwindall((ikptn-1)*mpw_tmp+1:(ikptn-1)*mpw_tmp+npw_k1,8,idir)
1482 : :
1483 [ + + + + ]: 4320 : vect1(:,0) = zero ; vect2(:,0) = zero
1484 : : jband_me = 0
1485 [ + + ]: 4320 : do jband = 1, dtefield%mband_occ
1486 [ + - ]: 3456 : if (band_procs(jband) == mpi_enreg%me_band) then
1487 : 3456 : jband_me = jband_me + 1
1488 : : vect2(:,1:npw_k2) = &
1489 [ + + + + ]: 433728 : & cg1(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
1490 [ + + + + : 19008 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
1491 : : end if
1492 : 3456 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
1493 : :
1494 : :
1495 : 3456 : iband_me = 0
1496 [ + + ]: 18144 : do iband = 1, dtefield%mband_occ
1497 [ - + ]: 13824 : if (band_procs(iband) /= mpi_enreg%me_band) cycle
1498 : 13824 : iband_me = iband_me + 1
1499 : 13824 : pwmin = (iband_me-1)*npw_k1*nspinor
1500 : 13824 : pwmax = pwmin + npw_k1*nspinor
1501 : : vect1(:,1:npw_k1) = &
1502 [ + + + + ]: 1734912 : & cg(:,icg + 1 + pwmin:icg + pwmax)
1503 [ + + + + : 76032 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
1504 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
1505 : 13824 : & vect1,vect2)
1506 : 13824 : s1mat(1,iband,jband) = dotr
1507 : 17280 : s1mat(2,iband,jband) = doti
1508 : : end do ! iband
1509 : : end do !jband
1510 : :
1511 : : ! compute <u^(1)_{k_j}|u^(0)_{k_j-1}> matrix-----------------------------------------------------
1512 : :
1513 : : ! prepare to calculate overlap matrix
1514 : 864 : ikpt1 = dtefield%ikpt_dk(ikpt,2,idir)
1515 : 864 : icg = dtefield%cgindex(ikpt,isppol+nsppol)
1516 : 864 : icg1 = dtefield%cgindex(ikpt1,isppol)
1517 : : npw_k1 = npwarr(ikpt)
1518 : 864 : npw_k2 = npwar1(ikpt1)
1519 [ + + ]: 36720 : pwind_tmp(1:npw_k1) =pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,6,idir)
1520 : :
1521 [ + + + + ]: 4320 : vect1(:,0) = zero ; vect2(:,0) = zero
1522 : : jband_me = 0
1523 [ + + ]: 4320 : do jband = 1, dtefield%mband_occ
1524 [ + - ]: 3456 : if (band_procs(jband) == mpi_enreg%me_band) then
1525 : 3456 : jband_me = jband_me + 1
1526 : : vect2(:,1:npw_k2) = &
1527 [ + + + + ]: 433728 : & cg(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
1528 [ + + + + : 19008 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
1529 : : end if
1530 : 3456 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
1531 : :
1532 [ + + ]: 18144 : do iband = 1, dtefield%mband_occ
1533 : 13824 : pwmin = (iband-1)*npw_k1*nspinor
1534 : 13824 : pwmax = pwmin + npw_k1*nspinor
1535 : : vect1(:,1:npw_k1) = &
1536 [ + + + + ]: 1734912 : & cg1(:,icg + 1 + pwmin:icg + pwmax)
1537 [ + + + + : 76032 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
1538 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
1539 : 13824 : & vect1,vect2)
1540 : 13824 : s1mat(1,jband,iband) = s1mat(1,jband,iband) + dotr
1541 : 17280 : s1mat(2,jband,iband) = s1mat(2,jband,iband) + doti
1542 : : end do ! iband
1543 : : end do !jband
1544 : :
1545 [ + + + + : 45792 : Amat(:,:,:)=zero
+ + ]
1546 : :
1547 : : ! calculate Amat
1548 [ + + ]: 4320 : do iband=1, dtefield%mband_occ
1549 [ + + ]: 18144 : do jband=1, dtefield%mband_occ
1550 [ + + ]: 72576 : do kband=1, dtefield%mband_occ
1551 : : Amat(1,iband,jband) = Amat(1,iband,jband) + s1mat(1,iband,kband)*qmat(1,kband,jband,ikpt,2,idir)&
1552 : 55296 : & - s1mat(2,iband,kband)*qmat(2,kband,jband,ikpt,2,idir)
1553 : : Amat(2,iband,jband) = Amat(2,iband,jband) + s1mat(1,iband,kband)*qmat(2,kband,jband,ikpt,2,idir)&
1554 : 69120 : & + s1mat(2,iband,kband)*qmat(1,kband,jband,ikpt,2,idir)
1555 : : end do
1556 : : end do
1557 : : end do
1558 : :
1559 [ + + + + : 45792 : Bmat(:,:,:)=zero
+ + ]
1560 : :
1561 : : ! calculate Bmat
1562 : 864 : ikptn = dtefield%ikpt_dk(ikpt,7,idir)
1563 [ + + ]: 4320 : do iband=1, dtefield%mband_occ
1564 [ + + ]: 18144 : do jband=1, dtefield%mband_occ
1565 [ + + ]: 72576 : do kband=1, dtefield%mband_occ
1566 : : Bmat(1,jband,kband) = Bmat(1,jband,kband) + Amat(1,iband,kband)*qmat(1,jband,iband,ikptn,2,idir)&
1567 : 55296 : & - Amat(2,iband,kband)*qmat(2,jband,iband,ikptn,2,idir)
1568 : : Bmat(2,jband,kband) = Bmat(2,jband,kband) + Amat(1,iband,kband)*qmat(2,jband,iband,ikptn,2,idir)&
1569 : 69120 : + Amat(2,iband,kband)*qmat(1,jband,iband,ikptn,2,idir)
1570 : : end do
1571 : : end do
1572 : : end do
1573 : :
1574 : : ! calc. the second term of gradient------------------------------
1575 : :
1576 : : ! preparation
1577 : :
1578 : 864 : ikptnp1 = dtefield%ikpt_dk(ikpt,4,idir)
1579 : 864 : icg = dtefield%cgindex(ikptnp1,isppol)
1580 : 864 : npw_k1 = npwar1(ikpt)
1581 : 864 : npw_k2 = npwarr(ikptnp1)
1582 [ + + ]: 36720 : pwind_tmp(1:npw_k1) =pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,6,idir)
1583 : : z1(:) = zero
1584 : : z2(:) = zero
1585 [ + + ]: 37872 : do ipw = 1, npw_k1
1586 : 35856 : jpw = pwind_tmp(ipw)
1587 [ + + ]: 36720 : if (jpw > 0) then
1588 [ + + ]: 144720 : do iband = 1, dtefield%mband_occ
1589 : 115776 : wfr = cg(1,icg + (iband - 1)*npw_k2*nspinor + jpw)
1590 : 115776 : wfi = cg(2,icg + (iband - 1)*npw_k2*nspinor + jpw)
1591 [ + + ]: 607824 : do jband=1, dtefield%mband_occ
1592 : 463104 : grad_berry(1,ipw,jband) = grad_berry(1,ipw,jband) + fac*(Bmat(1,iband,jband)*wfr - Bmat(2,iband,jband)*wfi)
1593 : 578880 : grad_berry(2,ipw,jband) = grad_berry(2,ipw,jband) + fac*(Bmat(1,iband,jband)*wfi + Bmat(2,iband,jband)*wfr)
1594 : : end do
1595 : : end do
1596 : : end if
1597 : : end do
1598 : :
1599 : : end do !idir
1600 : :
1601 : : !!----------------------------------------third part of gradient------------------------------------------------------
1602 [ + + ]: 1152 : do idir=1,3
1603 : : fac = rprimd(idir_efield,idir)*dble(nkpt)/&
1604 : 864 : & (dble(dtefield%nstr(idir))*four_pi)
1605 : :
1606 : : ! prepare
1607 : 864 : ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
1608 : 864 : icg1 = dtefield%cgindex(ikpt1,isppol)
1609 : 864 : npw_k1 = npwar1(ikpt)
1610 : 864 : npw_k2 = npwarr(ikpt1)
1611 [ + + ]: 36720 : pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,5,idir)
1612 [ + + ]: 36720 : do ipw = 1, npw_k1
1613 : 35856 : jpw = pwind_tmp(ipw)
1614 [ + + ]: 36720 : if (jpw > 0) then
1615 [ + + ]: 144720 : do iband = 1, dtefield%mband_occ
1616 : 115776 : wfr = cg(1,icg1 + (iband - 1)*npw_k2*nspinor + jpw)
1617 : 115776 : wfi = cg(2,icg1 + (iband - 1)*npw_k2*nspinor + jpw)
1618 [ + + ]: 607824 : do jband = 1, dtefield%mband_occ
1619 : : grad_berry(1,ipw,jband) = &
1620 : : & grad_berry(1,ipw,jband) + &
1621 : 463104 : & fac*qmat(1,iband,jband,ikpt,1,idir)*wfr - fac*qmat(2,iband,jband,ikpt,1,idir)*wfi
1622 : : grad_berry(2,ipw,jband) = &
1623 : : & grad_berry(2,ipw,jband) + &
1624 : 578880 : & fac*qmat(1,iband,jband,ikpt,1,idir)*wfi + fac*qmat(2,iband,jband,ikpt,1,idir)*wfr
1625 : : end do
1626 : : end do
1627 : : end if
1628 : : end do
1629 : :
1630 : : ! prepare
1631 : 864 : ikpt1 = dtefield%ikpt_dk(ikpt,2,idir)
1632 : 864 : icg1 = dtefield%cgindex(ikpt1,isppol)
1633 : : npw_k1 = npwar1(ikpt)
1634 : 864 : npw_k2 = npwarr(ikpt1)
1635 [ + + ]: 36720 : pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,6,idir)
1636 : :
1637 [ + + ]: 37008 : do ipw = 1, npw_k1
1638 : 35856 : jpw = pwind_tmp(ipw)
1639 [ + + ]: 36720 : if (jpw > 0) then
1640 [ + + ]: 144720 : do iband = 1, dtefield%mband_occ
1641 : 115776 : wfr = cg(1,icg1 + (iband - 1)*npw_k2*nspinor + jpw)
1642 : 115776 : wfi = cg(2,icg1 + (iband - 1)*npw_k2*nspinor + jpw)
1643 [ + + ]: 607824 : do jband = 1, dtefield%mband_occ
1644 : : grad_berry(1,ipw,jband) = &
1645 : : & grad_berry(1,ipw,jband) - &
1646 : 463104 : & fac*qmat(1,iband,jband,ikpt,2,idir)*wfr + fac*qmat(2,iband,jband,ikpt,2,idir)*wfi
1647 : :
1648 : : grad_berry(2,ipw,jband) = &
1649 : : & grad_berry(2,ipw,jband) - &
1650 : 578880 : & fac*qmat(1,iband,jband,ikpt,2,idir)*wfi - fac*qmat(2,iband,jband,ikpt,2,idir)*wfr
1651 : :
1652 : : end do
1653 : : end do
1654 : : end if
1655 : : end do
1656 : :
1657 : : end do !idir
1658 : :
1659 : : ! accumulate full sum over iband in each jband entry
1660 : 288 : call xmpi_sum(grad_berry,mpi_enreg%comm_band,ierr)
1661 : :
1662 [ - + ]: 288 : ABI_FREE(vect1)
1663 [ - + ]: 288 : ABI_FREE(vect2)
1664 [ - + ]: 288 : ABI_FREE(s1mat)
1665 [ - + ]: 288 : ABI_FREE(Amat)
1666 [ - + ]: 288 : ABI_FREE(Bmat)
1667 [ - + ]: 288 : ABI_FREE(pwind_tmp)
1668 : :
1669 : 288 : end subroutine dfptff_gbefd
1670 : : !!***
1671 : :
1672 : : !!****f* ABINIT/dfptff_edie
1673 : : !! NAME
1674 : : !! dfptff_edie
1675 : : !!
1676 : : !! FUNCTION
1677 : : !! calculate the second order energy from the contribution of \Omega E \cdot P
1678 : : !! term, Eq.(6) in PRB 75, 115116(2007) [[cite:Wang2007]].
1679 : : !!
1680 : : !! INPUTS
1681 : : !! cg(2,mpw*nspinor*mband*mkmem_rbz*nsppol) = planewave coefficients of wavefunctions
1682 : : !! cg1(2,mpw1*nspinor*mband*mk1mem*nsppol) = pw coefficients of
1683 : : !! RF wavefunctions at k,q.
1684 : : !! dtefield = variables related to response Berry-phase calculation
1685 : : !! ikpt = the index of the current k point
1686 : : !! isppol = the index of the spin component
1687 : : !! mband = maximum number of bands
1688 : : !! mkmem_rbz = maximum number of k-points in core memory
1689 : : !! mpw = maximum number of plane waves
1690 : : !! mpw1 = maximum number of plane waves for response wavefunctions
1691 : : !! nkpt = number of k points
1692 : : !! npwarr(nkpt) = number of planewaves in basis and boundary at this k point
1693 : : !! npwar1(nkpt) = number of planewaves in basis and boundary for response wfs
1694 : : !! nspinor = 1 for scalar wfs, 2 for spinor wfs
1695 : : !! nsppol = 1 for unpolarized, 2 for spin-polarized
1696 : : !! qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3) =
1697 : : !! inverse of the overlap matrix
1698 : : !! pwindall(max(mpw,mpw1)*mkmem_rbz,8,3) = array used to compute the overlap matrices
1699 : : !! pwindall(:,1,:) <- <u^(0)_i|u^(0)_i+1>
1700 : : !! pwindall(:,2,:) <- <u^(0)_i|u^(0)_i-1>
1701 : : !! pwindall(:,3,:) <- <u^(1)_i|u^(1)_i+1>
1702 : : !! pwindall(:,4,:) <- <u^(1)_i|u^(1)_i-1>
1703 : : !! pwindall(:,5,:) <- <u^(1)_i|u^(0)_i+n+1>
1704 : : !! pwindall(:,6,:) <- <u^(1)_i|u^(0)_i+n-1>
1705 : : !! pwindall(:,7,:) <- <u^(0)_i|u^(1)_i-n+1>
1706 : : !! pwindall(:,8,:) <- <u^(0)_i|u^(1)_i-n-1>
1707 : : !!
1708 : : !! OUTPUT
1709 : : !! eberry = the energy of the Berry phase term
1710 : : !!
1711 : : !! SOURCE
1712 : :
1713 : 36 : subroutine dfptff_edie(cg,cg1,dtefield,eberry,idir_efield,mband,mband_mem,mkmem_rbz,&
1714 : 36 : & mpi_enreg,mpw,mpw1,nkpt,npwarr,npwar1,nsppol,nspinor,pwindall,qmat,rprimd)
1715 : :
1716 : : !Arguments ----------------------------------------
1717 : : !scalars
1718 : : integer,intent(in) :: idir_efield,mband,mkmem_rbz,mpw,mpw1,nkpt,nspinor,nsppol
1719 : : integer,intent(in) :: mband_mem
1720 : : real(dp),intent(out) :: eberry
1721 : : type(efield_type),intent(in) :: dtefield
1722 : : type(MPI_type),intent(in) :: mpi_enreg
1723 : : !arrays
1724 : : integer,intent(in) :: npwar1(nkpt),npwarr(nkpt)
1725 : : integer,intent(in) :: pwindall(max(mpw,mpw1)*mkmem_rbz,8,3)
1726 : : real(dp),intent(in) :: cg(2,mpw*mband_mem*mkmem_rbz*nspinor*nsppol)
1727 : : real(dp),intent(in) :: cg1(2,mpw1*mband_mem*mkmem_rbz*nspinor*nsppol)
1728 : : real(dp),intent(in) :: qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3)
1729 : : real(dp),intent(in) :: rprimd(3,3)
1730 : :
1731 : : !Local variables ----------------------------------
1732 : : !scalars
1733 : : integer :: iband,icg,icg1,idir
1734 : : integer :: jband_me, iband_me, me_band, ierr
1735 : : integer :: ikpt,ikpt1,ikptn,ikptnm
1736 : : integer :: jband,kband,mpw_tmp,npw_k1,npw_k2,pwmax,pwmin
1737 : : real(dp) :: doti,dotr,e0,fac
1738 : : !arrays
1739 : 36 : integer,allocatable :: pwind_tmp(:)
1740 : 72 : integer :: band_procs(mband)
1741 : : real(dp) :: z1(2)
1742 : 36 : real(dp),allocatable :: Amat(:,:,:),umat(:,:,:,:),vect1(:,:),vect2(:,:)
1743 : :
1744 : : ! *************************************************************************
1745 : :
1746 : : !calculate 4 matrices -----------------------------
1747 : 36 : mpw_tmp=max(mpw,mpw1)
1748 [ - + + - : 180 : ABI_MALLOC(umat,(2,dtefield%mband_occ,dtefield%mband_occ,4))
- + + - +
- + - + -
- + - + ]
1749 [ - + + - : 108 : ABI_MALLOC(vect1,(2,0:mpw_tmp))
+ - + - -
+ - + ]
1750 [ - + + - : 72 : ABI_MALLOC(vect2,(2,0:mpw_tmp))
- + - + ]
1751 [ - + + - : 108 : ABI_MALLOC(pwind_tmp,(mpw_tmp))
+ - + - -
+ - + ]
1752 [ - + + - : 144 : ABI_MALLOC(Amat,(2,dtefield%mband_occ,dtefield%mband_occ))
- + + - +
- + - - +
+ - ]
1753 [ + + + + ]: 216 : vect1(:,0) = zero ; vect2(:,0) = zero
1754 : 36 : eberry=zero
1755 : :
1756 : 36 : me_band = mpi_enreg%me_band
1757 : :
1758 [ + + ]: 324 : do ikpt=1,nkpt
1759 : :
1760 : : call proc_distrb_band(band_procs,mpi_enreg%proc_distrb,ikpt,1,mband,&
1761 : 288 : & me_band,mpi_enreg%me_kpt,mpi_enreg%comm_band)
1762 : :
1763 [ + + ]: 1188 : do idir=1,3
1764 : : fac = dtefield%efield_dot(idir)/&
1765 : 864 : & (dble(dtefield%nstr(idir))*four_pi)
1766 : :
1767 : : ! compute <u^(1)_{k_j,q}|u^(1)_{k_j+1,q}> matrix----------------------------------------------------
1768 : :
1769 : : ! prepare to calculate overlap matrix
1770 : 864 : ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
1771 : 864 : icg = dtefield%cgindex(ikpt,1+nsppol)
1772 : 864 : icg1 = dtefield%cgindex(ikpt1,1+nsppol)
1773 : 864 : npw_k1 = npwar1(ikpt)
1774 : 864 : npw_k2 = npwar1(ikpt1)
1775 [ + + ]: 36720 : pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,3,idir)
1776 [ + + + + ]: 4320 : vect1(:,0) = zero ; vect2(:,0) = zero
1777 : : jband_me = 0
1778 [ + + ]: 4320 : do jband = 1, dtefield%mband_occ
1779 [ + - ]: 3456 : if (band_procs(jband) == me_band) then
1780 : 3456 : jband_me = jband_me + 1
1781 : : vect2(:,1:npw_k2) = &
1782 [ + + + + ]: 433728 : & cg1(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
1783 [ + + + + : 19008 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
1784 : : end if
1785 : 3456 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
1786 : :
1787 : 3456 : iband_me = 0
1788 [ + + ]: 18144 : do iband = 1, dtefield%mband_occ
1789 [ - + ]: 13824 : if (band_procs(iband) /= me_band) cycle
1790 : 13824 : iband_me = iband_me + 1
1791 : 13824 : pwmin = (iband_me-1)*npw_k1*nspinor
1792 : 13824 : pwmax = pwmin + npw_k1*nspinor
1793 : : vect1(:,1:npw_k1) = &
1794 [ + + + + ]: 1734912 : & cg1(:,icg + 1 + pwmin:icg + pwmax)
1795 [ + + + + : 76032 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
1796 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
1797 : 13824 : & vect1,vect2)
1798 : 13824 : umat(1,iband,jband,1) = dotr
1799 : 17280 : umat(2,iband,jband,1) = doti
1800 : : end do ! iband
1801 : : end do !jband
1802 : :
1803 : : ! compute <u^(0)_{k_j}|u^(1)_{k_j-n+1,q}> matrix----------------------------------------------------
1804 : :
1805 : : ! prepare to calculate overlap matrix
1806 : 864 : ikpt1 = dtefield%ikpt_dk(ikpt,5,idir)
1807 : 864 : icg = dtefield%cgindex(ikpt,1)
1808 : 864 : icg1 = dtefield%cgindex(ikpt1,1+nsppol)
1809 : 864 : npw_k1 = npwarr(ikpt)
1810 : 864 : npw_k2 = npwar1(ikpt1)
1811 [ + + ]: 36720 : pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,7,idir)
1812 : :
1813 [ + + + + ]: 4320 : vect1(:,0) = zero ; vect2(:,0) = zero
1814 : : jband_me = 0
1815 [ + + ]: 4320 : do jband = 1, dtefield%mband_occ
1816 [ + - ]: 3456 : if (band_procs(jband) == me_band) then
1817 : 3456 : jband_me = jband_me + 1
1818 : : vect2(:,1:npw_k2) = &
1819 [ + + + + ]: 433728 : & cg1(:,icg1 + 1 + (jband-1)*npw_k2*nspinor:icg1 + jband*npw_k2*nspinor)
1820 [ + + + + : 19008 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
1821 : : end if
1822 : 3456 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
1823 : :
1824 : 3456 : iband_me = 0
1825 [ + + ]: 18144 : do iband = 1, dtefield%mband_occ
1826 [ - + ]: 13824 : if (band_procs(iband) /= me_band) cycle
1827 : 13824 : iband_me = iband_me + 1
1828 : 13824 : pwmin = (iband_me-1)*npw_k1*nspinor
1829 : 13824 : pwmax = pwmin + npw_k1*nspinor
1830 : : vect1(:,1:npw_k1) = &
1831 [ + + + + ]: 1734912 : & cg(:,icg + 1 + pwmin:icg + pwmax)
1832 [ + + + + : 76032 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
1833 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
1834 : 13824 : & vect1,vect2)
1835 : 13824 : umat(1,iband,jband,2) = dotr
1836 : 17280 : umat(2,iband,jband,2) = doti
1837 : : end do ! iband
1838 : : end do !jband
1839 : :
1840 : : ! compute <u^(1)_{k_j-n,q}|u^(0)_{k_j+1}> matrix----------------------------------------------------
1841 : :
1842 : : ! prepare to calculate overlap matrix
1843 : 864 : ikptn = dtefield%ikpt_dk(ikpt,8,idir)
1844 : 864 : ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
1845 : 864 : icg = dtefield%cgindex(ikptn,1+nsppol)
1846 : 864 : icg1 = dtefield%cgindex(ikpt1,1)
1847 : 864 : npw_k1 = npwar1(ikptn)
1848 : 864 : npw_k2 = npwarr(ikpt1)
1849 [ + + ]: 36720 : pwind_tmp(1:npw_k1) = pwindall((ikptn-1)*mpw_tmp+1:(ikptn-1)*mpw_tmp+npw_k1,5,idir)
1850 : :
1851 [ + + + + ]: 4320 : vect1(:,0) = zero ; vect2(:,0) = zero
1852 : : jband_me = 0
1853 [ + + ]: 4320 : do jband = 1, dtefield%mband_occ
1854 [ + - ]: 3456 : if (band_procs(jband) == me_band) then
1855 : 3456 : jband_me = jband_me + 1
1856 : : vect2(:,1:npw_k2) = &
1857 [ + + + + ]: 433728 : & cg(:,icg1 + 1 + (jband-1)*npw_k2*nspinor:icg1 + jband*npw_k2*nspinor)
1858 [ + + + + : 19008 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
1859 : : end if
1860 : 3456 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
1861 : :
1862 : 3456 : iband_me = 0
1863 [ + + ]: 18144 : do iband = 1, dtefield%mband_occ
1864 [ - + ]: 13824 : if (band_procs(iband) /= me_band) cycle
1865 : 13824 : iband_me = iband_me + 1
1866 : 13824 : pwmin = (iband_me-1)*npw_k1*nspinor
1867 : 13824 : pwmax = pwmin + npw_k1*nspinor
1868 : : vect1(:,1:npw_k1) = &
1869 [ + + + + ]: 1734912 : & cg1(:,icg + 1 + pwmin:icg + pwmax)
1870 [ + + + + : 76032 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
1871 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
1872 : 13824 : & vect1,vect2)
1873 : 13824 : umat(1,iband,jband,3) = dotr
1874 : 17280 : umat(2,iband,jband,3) = doti
1875 : : end do ! iband
1876 : : end do !jband
1877 : :
1878 : : ! compute <u^(0)_{-k_j-n+1}|u^(1)_{-k_j,q}> matrix----------------------------------------------------
1879 : :
1880 : : ! prepare to calculate overlap matrix
1881 : 864 : ikptn = dtefield%ikpt_dk(ikpt,5,idir)
1882 : 864 : ikptnm = dtefield%ikpt_dk(ikptn,9,idir)
1883 : 864 : ikpt1 = dtefield%ikpt_dk(ikpt,9,idir)
1884 : 864 : icg = dtefield%cgindex(ikptnm,1)
1885 : 864 : icg1 = dtefield%cgindex(ikpt1,1+nsppol)
1886 : 864 : npw_k1 = npwarr(ikptnm)
1887 : 864 : npw_k2 = npwar1(ikpt1)
1888 [ + + ]: 36720 : pwind_tmp(1:npw_k1) = pwindall((ikptnm-1)*mpw_tmp+1:(ikptnm-1)*mpw_tmp+npw_k1,7,idir)
1889 [ + + + + ]: 4320 : vect1(:,0) = zero ; vect2(:,0) = zero
1890 : : jband_me = 0
1891 [ + + ]: 4320 : do jband = 1, dtefield%mband_occ
1892 [ + - ]: 3456 : if (band_procs(jband) == me_band) then
1893 : 3456 : jband_me = jband_me + 1
1894 : : vect2(:,1:npw_k2) = &
1895 [ + + + + ]: 433728 : & cg1(:,icg1 + 1 + (jband-1)*npw_k2*nspinor:icg1 + jband*npw_k2*nspinor)
1896 [ + + + + : 19008 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
1897 : : end if
1898 : 3456 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
1899 : :
1900 : 3456 : iband_me = 0
1901 [ + + ]: 18144 : do iband = 1, dtefield%mband_occ
1902 [ - + ]: 13824 : if (band_procs(iband) /= me_band) cycle
1903 : 13824 : iband_me = iband_me + 1
1904 : 13824 : pwmin = (iband_me-1)*npw_k1*nspinor
1905 : 13824 : pwmax = pwmin + npw_k1*nspinor
1906 : : vect1(:,1:npw_k1) = &
1907 [ + + + + ]: 1734912 : & cg(:,icg + 1 + pwmin:icg + pwmax)
1908 [ + + + + : 76032 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
1909 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
1910 : 13824 : & vect1,vect2)
1911 : 13824 : umat(1,iband,jband,4) = dotr
1912 : 17280 : umat(2,iband,jband,4) = doti
1913 : : end do ! iband
1914 : : end do !jband
1915 : :
1916 : : ! sum up over all iband and all procs
1917 : 864 : call xmpi_sum(umat,mpi_enreg%comm_band,ierr)
1918 : :
1919 : : ! sum over the whole------------------------------------------------------------
1920 : :
1921 : 864 : e0=zero
1922 [ + + ]: 4320 : do iband=1,dtefield%mband_occ
1923 [ + + ]: 18144 : do jband=1,dtefield%mband_occ
1924 : : e0 = e0 + 2_dp*(umat(1,iband,jband,1)*qmat(2,jband,iband,ikpt,1,idir)&
1925 : 17280 : & + umat(2,iband,jband,1)*qmat(1,jband,iband,ikpt,1,idir))
1926 : : end do
1927 : : end do
1928 : 864 : eberry = eberry - e0*fac
1929 : 864 : e0=zero
1930 : 864 : ikptn=dtefield%ikpt_dk(ikpt,8,idir)
1931 [ + + + + : 45792 : Amat(:,:,:)=zero
+ + ]
1932 : : ! calculate Amat
1933 [ + + ]: 4320 : do iband=1, dtefield%mband_occ
1934 [ + + ]: 18144 : do jband=1, dtefield%mband_occ
1935 [ + + ]: 72576 : do kband=1, dtefield%mband_occ
1936 : : Amat(1,iband,jband) = Amat(1,iband,jband) + (umat(1,iband,kband,3))*qmat(1,kband,jband,ikpt,1,idir)&
1937 : 55296 : & - (umat(2,iband,kband,3))*qmat(2,kband,jband,ikpt,1,idir)
1938 : : Amat(2,iband,jband) = Amat(2,iband,jband) + (umat(1,iband,kband,3))*qmat(2,kband,jband,ikpt,1,idir)&
1939 : 69120 : & + (umat(2,iband,kband,3))*qmat(1,kband,jband,ikpt,1,idir)
1940 : : end do
1941 : : end do
1942 : : end do
1943 : :
1944 [ + + ]: 4320 : do iband=1, dtefield%mband_occ
1945 [ + + ]: 18144 : do jband=1, dtefield%mband_occ
1946 [ + + ]: 72576 : do kband=1, dtefield%mband_occ
1947 : : z1(1) = (umat(1,jband,iband,4)+umat(1,iband,jband,2))*qmat(1,jband,kband,ikptn,1,idir)&
1948 : 55296 : & - (umat(2,jband,iband,4)+umat(2,iband,jband,2))*qmat(2,jband,kband,ikptn,1,idir)
1949 : : z1(2) = (umat(1,jband,iband,4)+umat(1,iband,jband,2))*qmat(2,jband,kband,ikptn,1,idir)&
1950 : 55296 : & + (umat(2,jband,iband,4)+umat(2,iband,jband,2))*qmat(1,jband,kband,ikptn,1,idir)
1951 : :
1952 : 69120 : e0 = e0 - 4_dp*(z1(1)*Amat(2,kband,iband)+z1(2)*Amat(1,kband,iband))
1953 : : end do
1954 : : end do
1955 : : end do
1956 : :
1957 : 864 : eberry = eberry - e0*fac
1958 : :
1959 : : ! !---------------------------------last part---------------------------------------------
1960 : :
1961 : : fac = rprimd(idir_efield,idir)/&
1962 : 864 : & (dble(dtefield%nstr(idir))*two_pi)
1963 : :
1964 : : ! compute <u^(1)_{k_j-n,q}|u^(0)_{k_j+1}> matrix----------------------------------------------------
1965 : :
1966 : : ! prepare to calculate overlap matrix
1967 : 864 : ikptn = dtefield%ikpt_dk(ikpt,8,idir)
1968 : 864 : ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
1969 : 864 : icg = dtefield%cgindex(ikptn,1+nsppol)
1970 : 864 : icg1 = dtefield%cgindex(ikpt1,1)
1971 : 864 : npw_k1 = npwar1(ikptn)
1972 : 864 : npw_k2 = npwarr(ikpt1)
1973 [ + + ]: 36720 : pwind_tmp(1:npw_k1) = pwindall((ikptn-1)*mpw_tmp+1:(ikptn-1)*mpw_tmp+npw_k1,5,idir)
1974 : :
1975 [ + + + + ]: 4320 : vect1(:,0) = zero ; vect2(:,0) = zero
1976 : : jband_me = 0
1977 [ + + ]: 4320 : do jband = 1, dtefield%mband_occ
1978 [ + - ]: 3456 : if (band_procs(jband) == me_band) then
1979 : 3456 : jband_me = jband_me + 1
1980 : : vect2(:,1:npw_k2) = &
1981 [ + + + + ]: 433728 : & cg(:,icg1 + 1 + (jband-1)*npw_k2*nspinor:icg1 + jband*npw_k2*nspinor)
1982 [ + + + + : 19008 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
1983 : : end if
1984 : 3456 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
1985 : :
1986 : 3456 : iband_me = 0
1987 [ + + ]: 18144 : do iband = 1, dtefield%mband_occ
1988 [ - + ]: 13824 : if (band_procs(iband) /= me_band) cycle
1989 : 13824 : iband_me = iband_me + 1
1990 : 13824 : pwmin = (iband_me-1)*npw_k1*nspinor
1991 : 13824 : pwmax = pwmin + npw_k1*nspinor
1992 : : vect1(:,1:npw_k1) = &
1993 [ + + + + ]: 1734912 : & cg1(:,icg + 1 + pwmin:icg + pwmax)
1994 [ + + + + : 76032 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
1995 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
1996 : 13824 : & vect1,vect2)
1997 : 13824 : umat(1,iband,jband,1) = dotr
1998 : 17280 : umat(2,iband,jband,1) = doti
1999 : : end do ! iband
2000 : : end do !jband
2001 : :
2002 : : ! compute <u^(0)_{k_j}|u^(1)_{k_j-n+1,q}> matrix----------------------------------------------------
2003 : :
2004 : : ! prepare to calculate overlap matrix
2005 : 864 : ikpt1 = dtefield%ikpt_dk(ikpt,5,idir)
2006 : 864 : icg = dtefield%cgindex(ikpt,1)
2007 : 864 : icg1 = dtefield%cgindex(ikpt1,1+nsppol)
2008 : 864 : npw_k1 = npwarr(ikpt)
2009 : 864 : npw_k2 = npwar1(ikpt1)
2010 [ + + ]: 36720 : pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,7,idir)
2011 [ + + + + ]: 4320 : vect1(:,0) = zero ; vect2(:,0) = zero
2012 : : jband_me = 0
2013 [ + + ]: 4320 : do jband = 1, dtefield%mband_occ
2014 [ + - ]: 3456 : if (band_procs(jband) == me_band) then
2015 : 3456 : jband_me = jband_me + 1
2016 : : vect2(:,1:npw_k2) = &
2017 [ + + + + ]: 433728 : & cg1(:,icg1 + 1 + (jband-1)*npw_k2*nspinor:icg1 + jband*npw_k2*nspinor)
2018 [ + + + + : 19008 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
2019 : : end if
2020 : 3456 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
2021 : :
2022 : 3456 : iband_me = 0
2023 [ + + ]: 18144 : do iband = 1, dtefield%mband_occ
2024 [ - + ]: 13824 : if (band_procs(iband) /= me_band) cycle
2025 : 13824 : iband_me = iband_me + 1
2026 : 13824 : pwmin = (iband_me-1)*npw_k1*nspinor
2027 : 13824 : pwmax = pwmin + npw_k1*nspinor
2028 : : vect1(:,1:npw_k1) = &
2029 [ + + + + ]: 1734912 : & cg(:,icg + 1 + pwmin:icg + pwmax)
2030 [ + + + + : 76032 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
2031 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
2032 : 13824 : & vect1,vect2)
2033 : 13824 : umat(1,iband,jband,1) = umat(1,iband,jband,1) + dotr
2034 : 17280 : umat(2,iband,jband,1) = umat(2,iband,jband,1) + doti
2035 : : end do ! iband
2036 : : end do !jband
2037 : :
2038 : : ! sum up over all iband and all procs
2039 : 864 : call xmpi_sum(umat,mpi_enreg%comm_band,ierr)
2040 : :
2041 : 864 : e0=zero
2042 : :
2043 [ + + ]: 4320 : do iband=1,dtefield%mband_occ
2044 [ + + ]: 18144 : do jband=1,dtefield%mband_occ
2045 : : e0 = e0 + (umat(1,iband,jband,1)*qmat(2,jband,iband,ikpt,1,idir)&
2046 : 17280 : & + umat(2,iband,jband,1)*qmat(1,jband,iband,ikpt,1,idir))
2047 : : end do
2048 : : end do
2049 : :
2050 : 2880 : eberry = eberry - e0*fac
2051 : :
2052 : : end do !end idir
2053 : : end do !end ikpt
2054 : :
2055 [ - + ]: 36 : ABI_FREE(umat)
2056 [ - + ]: 36 : ABI_FREE(vect1)
2057 [ - + ]: 36 : ABI_FREE(vect2)
2058 [ - + ]: 36 : ABI_FREE(pwind_tmp)
2059 [ - + ]: 36 : ABI_FREE(Amat)
2060 : :
2061 : 36 : end subroutine dfptff_edie
2062 : : !!***
2063 : :
2064 : : !!****f* ABINIT/dfptff_ebp
2065 : : !! NAME
2066 : : !! dfptff_ebp
2067 : : !!
2068 : : !! FUNCTION
2069 : : !! calculation of the energy from the term \Omega E \cdot P
2070 : : !!
2071 : : !! INPUTS
2072 : : !! cg(2,mpw*nspinor*mband*mkmem_rbz*nsppol) = planewave coefficients of wavefunctions
2073 : : !! cg1(2,mpw1*nspinor*mband*mk1mem*nsppol) = pw coefficients of
2074 : : !! RF wavefunctions at k,q.
2075 : : !! dtefield = variables related to response Berry-phase calculation
2076 : : !! ikpt = the index of the current k point
2077 : : !! isppol = the index of the spin component
2078 : : !! mband = maximum number of bands
2079 : : !! mkmem_rbz = maximum number of k-points in core memory
2080 : : !! mpw = maximum number of plane waves
2081 : : !! mpw1 = maximum number of plane waves for response wavefunctions
2082 : : !! nkpt = number of k points
2083 : : !! npwarr(nkpt) = number of planewaves in basis and boundary at this k point
2084 : : !! npwar1(nkpt) = number of planewaves in basis and boundary for response wfs
2085 : : !! nspinor = 1 for scalar wfs, 2 for spinor wfs
2086 : : !! nsppol = 1 for unpolarized, 2 for spin-polarized
2087 : : !! qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3) =
2088 : : !! inverse of the overlap matrix
2089 : : !! pwindall(max(mpw,mpw1)*mkmem_rbz,8,3) = array used to compute the overlap matrices
2090 : : !! pwindall(:,1,:) <- <u^(0)_i|u^(0)_i+1>
2091 : : !! pwindall(:,2,:) <- <u^(0)_i|u^(0)_i-1>
2092 : : !! pwindall(:,3,:) <- <u^(1)_i|u^(1)_i+1>
2093 : : !! pwindall(:,4,:) <- <u^(1)_i|u^(1)_i-1>
2094 : : !! pwindall(:,5,:) <- <u^(1)_i|u^(0)_i+n+1>
2095 : : !! pwindall(:,6,:) <- <u^(1)_i|u^(0)_i+n-1>
2096 : : !! pwindall(:,7,:) <- <u^(0)_i|u^(1)_i-n+1>
2097 : : !! pwindall(:,8,:) <- <u^(0)_i|u^(1)_i-n-1>
2098 : : !!
2099 : : !! OUTPUT
2100 : : !! grad_berry(2,mpw1,dtefield%mband_occ) = the gradient of the Berry phase term
2101 : : !!
2102 : : !! SOURCE
2103 : :
2104 : 61 : subroutine dfptff_ebp(cg,cg1,dtefield,eberry,mband,mband_mem,mkmem_rbz,&
2105 : 61 : & mpi_enreg,mpw,mpw1,nkpt,npwarr,npwar1,nsppol,nspinor,pwindall,qmat)
2106 : :
2107 : : !Arguments ----------------------------------------
2108 : : !scalars
2109 : : integer,intent(in) :: mband,mkmem_rbz,mpw,mpw1,nkpt,nspinor,nsppol
2110 : : integer,intent(in) :: mband_mem
2111 : : real(dp),intent(out) :: eberry
2112 : : type(efield_type),intent(in) :: dtefield
2113 : : type(MPI_type),intent(in) :: mpi_enreg
2114 : : !arrays
2115 : : integer,intent(in) :: npwar1(nkpt),npwarr(nkpt)
2116 : : integer,intent(in) :: pwindall(max(mpw,mpw1)*mkmem_rbz,8,3)
2117 : : real(dp),intent(in) :: cg(2,mpw*mband_mem*mkmem_rbz*nspinor*nsppol)
2118 : : real(dp),intent(in) :: cg1(2,mpw1*mband_mem*mkmem_rbz*nspinor*nsppol)
2119 : : real(dp),intent(in) :: qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3)
2120 : :
2121 : : !Local variables ----------------------------------
2122 : : !scalars
2123 : : integer :: iband,icg,icg1,idir
2124 : : integer :: jband_me, iband_me, me_band, ierr
2125 : : integer :: ikpt,ikpt1,ikptn,ikptnm
2126 : : integer :: jband,kband,mpw_tmp,npw_k1,npw_k2,pwmax,pwmin
2127 : : real(dp) :: doti,dotr,e0,fac
2128 : : !arrays
2129 : 122 : integer :: band_procs(mband)
2130 : 61 : integer,allocatable :: pwind_tmp(:)
2131 : : real(dp) :: z1(2)
2132 : 61 : real(dp),allocatable :: Amat(:,:,:),umat(:,:,:,:),vect1(:,:),vect2(:,:)
2133 : :
2134 : : ! *************************************************************************
2135 : :
2136 : : !calculate 4 matrices -----------------------------
2137 : 61 : mpw_tmp=max(mpw,mpw1)
2138 [ - + + - : 305 : ABI_MALLOC(umat,(2,dtefield%mband_occ,dtefield%mband_occ,4))
- + + - +
- + - + -
- + - + ]
2139 [ - + + - : 183 : ABI_MALLOC(vect1,(2,0:mpw_tmp))
+ - + - -
+ - + ]
2140 [ - + + - : 122 : ABI_MALLOC(vect2,(2,0:mpw_tmp))
- + - + ]
2141 [ - + + - : 183 : ABI_MALLOC(pwind_tmp,(mpw_tmp))
+ - + - -
+ - + ]
2142 [ - + + - : 244 : ABI_MALLOC(Amat,(2,dtefield%mband_occ,dtefield%mband_occ))
- + + - +
- + - - +
+ - ]
2143 [ + + + + ]: 366 : vect1(:,0) = zero ; vect2(:,0) = zero
2144 : 61 : eberry=zero
2145 : :
2146 : 61 : me_band = mpi_enreg%me_band
2147 : :
2148 : : !TODO no info on sppol here - I default to isppol 1
2149 [ + + ]: 549 : do ikpt=1,nkpt
2150 : : call proc_distrb_band(band_procs,mpi_enreg%proc_distrb,ikpt,1,mband,&
2151 : 488 : & me_band,mpi_enreg%me_kpt,mpi_enreg%comm_band)
2152 : :
2153 : :
2154 [ + + ]: 2013 : do idir=1,3
2155 : :
2156 : : fac = dtefield%efield_dot(idir)/&
2157 : 1464 : & (dble(dtefield%nstr(idir))*four_pi)
2158 : :
2159 : : ! compute <u^(1)_{k_j,q}|u^(1)_{k_j+1,q}> matrix---------
2160 : :
2161 : : ! prepare to calculate overlap matrix
2162 : 1464 : ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
2163 : 1464 : icg = dtefield%cgindex(ikpt,1+nsppol)
2164 : 1464 : icg1 = dtefield%cgindex(ikpt1,1+nsppol)
2165 : 1464 : npw_k1 = npwar1(ikpt)
2166 : 1464 : npw_k2 = npwar1(ikpt1)
2167 [ + + ]: 62220 : pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,3,idir)
2168 [ + + + + ]: 7320 : vect1(:,0) = zero ; vect2(:,0) = zero
2169 : : jband_me = 0
2170 [ + + ]: 7320 : do jband = 1, dtefield%mband_occ
2171 [ + - ]: 5856 : if (band_procs(jband) == me_band) then
2172 : 5856 : jband_me = jband_me + 1
2173 [ + + + + ]: 734928 : vect2(:,1:npw_k2) = cg1(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
2174 [ + + + + : 32208 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
2175 : : end if
2176 : 5856 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
2177 : :
2178 : :
2179 : 5856 : iband_me = 0
2180 [ + + ]: 30744 : do iband = 1, dtefield%mband_occ
2181 [ - + ]: 23424 : if (band_procs(iband) /= me_band) cycle
2182 : 23424 : iband_me = iband_me + 1
2183 : :
2184 : 23424 : pwmin = (iband_me-1)*npw_k1*nspinor
2185 : 23424 : pwmax = pwmin + npw_k1*nspinor
2186 : : vect1(:,1:npw_k1) = &
2187 [ + + + + ]: 2939712 : & cg1(:,icg + 1 + pwmin:icg + pwmax)
2188 [ + + + + : 128832 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
2189 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
2190 : 23424 : & vect1,vect2)
2191 : 23424 : umat(1,iband,jband,1) = dotr
2192 : 29280 : umat(2,iband,jband,1) = doti
2193 : :
2194 : : end do ! iband
2195 : : end do !jband
2196 : :
2197 : : ! compute <u^(0)_{k_j}|u^(1)_{k_j-n+1,q}> matrix----------------------------------------------------
2198 : :
2199 : : ! prepare to calculate overlap matrix
2200 : 1464 : ikpt1 = dtefield%ikpt_dk(ikpt,5,idir)
2201 : 1464 : icg = dtefield%cgindex(ikpt,1)
2202 : 1464 : icg1 = dtefield%cgindex(ikpt1,1+nsppol)
2203 : 1464 : npw_k1 = npwarr(ikpt)
2204 : 1464 : npw_k2 = npwar1(ikpt1)
2205 [ + + ]: 62220 : pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,7,idir)
2206 : :
2207 [ + + + + ]: 7320 : vect1(:,0) = zero ; vect2(:,0) = zero
2208 : : jband_me = 0
2209 [ + + ]: 7320 : do jband = 1, dtefield%mband_occ
2210 [ + - ]: 5856 : if (band_procs(jband) == me_band) then
2211 : 5856 : jband_me = jband_me + 1
2212 : : vect2(:,1:npw_k2) = &
2213 [ + + + + ]: 734928 : & cg1(:,icg1 + 1 + (jband-1)*npw_k2*nspinor:icg1 + jband*npw_k2*nspinor)
2214 [ + + + + : 32208 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
2215 : : end if
2216 : 5856 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
2217 : :
2218 : 5856 : iband_me = 0
2219 [ + + ]: 30744 : do iband = 1, dtefield%mband_occ
2220 [ - + ]: 23424 : if (band_procs(iband) /= me_band) cycle
2221 : 23424 : iband_me = iband_me + 1
2222 : :
2223 : 23424 : pwmin = (iband_me-1)*npw_k1*nspinor
2224 : 23424 : pwmax = pwmin + npw_k1*nspinor
2225 : : vect1(:,1:npw_k1) = &
2226 [ + + + + ]: 2939712 : & cg(:,icg + 1 + pwmin:icg + pwmax)
2227 [ + + + + : 128832 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
2228 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
2229 : 23424 : & vect1,vect2)
2230 : 23424 : umat(1,iband,jband,2) = dotr
2231 : 29280 : umat(2,iband,jband,2) = doti
2232 : :
2233 : : end do ! iband
2234 : : end do !jband
2235 : :
2236 : : ! compute <u^(1)_{k_j-n,q}|u^(0)_{k_j+1}> matrix----------------------------------------------------
2237 : :
2238 : : ! prepare to calculate overlap matrix
2239 : 1464 : ikptn = dtefield%ikpt_dk(ikpt,8,idir)
2240 : 1464 : ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
2241 : 1464 : icg = dtefield%cgindex(ikptn,1+nsppol)
2242 : 1464 : icg1 = dtefield%cgindex(ikpt1,1)
2243 : 1464 : npw_k1 = npwar1(ikptn)
2244 : 1464 : npw_k2 = npwarr(ikpt1)
2245 [ + + ]: 62220 : pwind_tmp(1:npw_k1) = pwindall((ikptn-1)*mpw_tmp+1:(ikptn-1)*mpw_tmp+npw_k1,5,idir)
2246 : :
2247 [ + + + + ]: 7320 : vect1(:,0) = zero ; vect2(:,0) = zero
2248 : : jband_me = 0
2249 [ + + ]: 7320 : do jband = 1, dtefield%mband_occ
2250 [ + - ]: 5856 : if (band_procs(jband) == me_band) then
2251 : 5856 : jband_me = jband_me + 1
2252 : : vect2(:,1:npw_k2) = &
2253 [ + + + + ]: 734928 : & cg(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
2254 [ + + + + : 32208 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
2255 : : end if
2256 : 5856 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
2257 : :
2258 : 5856 : iband_me = 0
2259 [ + + ]: 30744 : do iband = 1, dtefield%mband_occ
2260 [ - + ]: 23424 : if (band_procs(iband) /= me_band) cycle
2261 : 23424 : iband_me = iband_me + 1
2262 : :
2263 : 23424 : pwmin = (iband_me-1)*npw_k1*nspinor
2264 : 23424 : pwmax = pwmin + npw_k1*nspinor
2265 : : vect1(:,1:npw_k1) = &
2266 [ + + + + ]: 2939712 : & cg1(:,icg + 1 + pwmin:icg + pwmax)
2267 [ + + + + : 128832 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
2268 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
2269 : 23424 : & vect1,vect2)
2270 : 23424 : umat(1,iband,jband,3) = dotr
2271 : 29280 : umat(2,iband,jband,3) = doti
2272 : :
2273 : : end do ! iband
2274 : : end do !jband
2275 : :
2276 : : ! compute <u^(0)_{-k_j-n+1}|u^(1)_{-k_j,q}> matrix----------------------------------------------------
2277 : :
2278 : : ! prepare to calculate overlap matrix
2279 : 1464 : ikptn = dtefield%ikpt_dk(ikpt,5,idir)
2280 : 1464 : ikptnm = dtefield%ikpt_dk(ikptn,9,idir)
2281 : 1464 : ikpt1 = dtefield%ikpt_dk(ikpt,9,idir)
2282 : 1464 : icg = dtefield%cgindex(ikptnm,1)
2283 : 1464 : icg1 = dtefield%cgindex(ikpt1,1+nsppol)
2284 : 1464 : npw_k1 = npwarr(ikptnm)
2285 : 1464 : npw_k2 = npwar1(ikpt1)
2286 [ + + ]: 62220 : pwind_tmp(1:npw_k1) = pwindall((ikptnm-1)*mpw_tmp+1:(ikptnm-1)*mpw_tmp+npw_k1,7,idir)
2287 : :
2288 [ + + + + ]: 7320 : vect1(:,0) = zero ; vect2(:,0) = zero
2289 : : jband_me = 0
2290 [ + + ]: 7320 : do jband = 1, dtefield%mband_occ
2291 [ + - ]: 5856 : if (band_procs(jband) == me_band) then
2292 : 5856 : jband_me = jband_me + 1
2293 : : vect2(:,1:npw_k2) = &
2294 [ + + + + ]: 734928 : & cg1(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
2295 [ + + + + : 32208 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
2296 : : end if
2297 : 5856 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
2298 : :
2299 : 5856 : iband_me = 0
2300 [ + + ]: 30744 : do iband = 1, dtefield%mband_occ
2301 [ - + ]: 23424 : if (band_procs(iband) /= me_band) cycle
2302 : 23424 : iband_me = iband_me + 1
2303 : :
2304 : 23424 : pwmin = (iband_me-1)*npw_k1*nspinor
2305 : 23424 : pwmax = pwmin + npw_k1*nspinor
2306 : : vect1(:,1:npw_k1) = &
2307 [ + + + + ]: 2939712 : & cg(:,icg + 1 + pwmin:icg + pwmax)
2308 [ + + + + : 128832 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
2309 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
2310 : 23424 : & vect1,vect2)
2311 : 23424 : umat(1,iband,jband,4) = dotr
2312 : 29280 : umat(2,iband,jband,4) = doti
2313 : :
2314 : : end do ! iband
2315 : : end do !jband
2316 : :
2317 : : ! recompose full umat on each proc, summing over iband
2318 : 1464 : call xmpi_sum(umat,mpi_enreg%comm_band,ierr)
2319 : :
2320 : : ! sum over the whole------------------------------------------------------------
2321 : :
2322 : 1464 : e0=zero
2323 [ + + ]: 7320 : do iband=1,dtefield%mband_occ
2324 [ + + ]: 30744 : do jband=1,dtefield%mband_occ
2325 : : e0 = e0 + 4_dp*(umat(1,iband,jband,1)*qmat(2,jband,iband,ikpt,1,idir)&
2326 : 29280 : & + umat(2,iband,jband,1)*qmat(1,jband,iband,ikpt,1,idir))
2327 : :
2328 : : end do
2329 : : end do
2330 : :
2331 : 1464 : eberry = eberry - e0*fac
2332 : :
2333 : 1464 : e0=zero
2334 : :
2335 : 1464 : ikptn=dtefield%ikpt_dk(ikpt,8,idir)
2336 : :
2337 [ + + + + : 77592 : Amat(:,:,:)=zero
+ + ]
2338 : :
2339 : : ! calculate Amat
2340 [ + + ]: 7320 : do iband=1, dtefield%mband_occ
2341 [ + + ]: 30744 : do jband=1, dtefield%mband_occ
2342 [ + + ]: 122976 : do kband=1, dtefield%mband_occ
2343 : : Amat(1,iband,jband) = Amat(1,iband,jband) + (umat(1,iband,kband,3))*&
2344 : : & qmat(1,kband,jband,ikpt,1,idir)&
2345 : 93696 : & - (umat(2,iband,kband,3))*qmat(2,kband,jband,ikpt,1,idir)
2346 : : Amat(2,iband,jband) = Amat(2,iband,jband) + (umat(1,iband,kband,3))*&
2347 : : & qmat(2,kband,jband,ikpt,1,idir)&
2348 : 117120 : & + (umat(2,iband,kband,3))*qmat(1,kband,jband,ikpt,1,idir)
2349 : : end do
2350 : : end do
2351 : : end do
2352 : :
2353 [ + + ]: 7320 : do iband=1, dtefield%mband_occ
2354 [ + + ]: 30744 : do jband=1, dtefield%mband_occ
2355 [ + + ]: 122976 : do kband=1, dtefield%mband_occ
2356 : :
2357 : : z1(1) = (umat(1,jband,iband,4)+umat(1,iband,jband,2))*&
2358 : : & qmat(1,jband,kband,ikptn,1,idir)&
2359 : : & - (umat(2,jband,iband,4)+umat(2,iband,jband,2))*&
2360 : 93696 : & qmat(2,jband,kband,ikptn,1,idir)
2361 : : z1(2) = (umat(1,jband,iband,4)+umat(1,iband,jband,2))*&
2362 : : & qmat(2,jband,kband,ikptn,1,idir)&
2363 : : & + (umat(2,jband,iband,4)+umat(2,iband,jband,2))*&
2364 : 93696 : & qmat(1,jband,kband,ikptn,1,idir)
2365 : :
2366 : 117120 : e0 = e0 - 4_dp*(z1(1)*Amat(2,kband,iband)+z1(2)*Amat(1,kband,iband))
2367 : :
2368 : : end do
2369 : : end do
2370 : : end do
2371 : :
2372 : 3416 : eberry = eberry - e0*fac
2373 : :
2374 : : end do !end idir
2375 : : end do !end ikpt
2376 : :
2377 [ - + ]: 61 : ABI_FREE(umat)
2378 [ - + ]: 61 : ABI_FREE(vect1)
2379 [ - + ]: 61 : ABI_FREE(vect2)
2380 [ - + ]: 61 : ABI_FREE(pwind_tmp)
2381 [ - + ]: 61 : ABI_FREE(Amat)
2382 : :
2383 : 61 : end subroutine dfptff_ebp
2384 : : !!***
2385 : :
2386 : : !!****f* ABINIT/dfptff_die
2387 : : !! NAME
2388 : : !! dfptff_die
2389 : : !!
2390 : : !! FUNCTION
2391 : : !! calculate electric susceptibility tensor in Eq.(28) in PRB 75, 115116(2007) [[cite:Wang2007]].
2392 : : !!
2393 : : !! INPUTS
2394 : : !! cg(2,mpw*nspinor*mband*mkmem_rbz*nsppol) = planewave coefficients of wavefunctions
2395 : : !! cg1(2,mpw1*nspinor*mband*mk1mem*nsppol) = pw coefficients of
2396 : : !! RF wavefunctions at k,q.
2397 : : !! dtefield = variables related to response Berry-phase calculation
2398 : : !! idirpert = the current coloumn of the dielectric permittivity tensor
2399 : : !! mband = maximum number of bands
2400 : : !! mkmem_rbz = maximum number of k-points in core memory
2401 : : !! mpw = maximum number of plane waves
2402 : : !! mpw1 = maximum number of plane waves for response wavefunctions
2403 : : !! nkpt = number of k points
2404 : : !! npwarr(nkpt) = number of planewaves in basis and boundary at this k point
2405 : : !! npwar1(nkpt) = number of planewaves in basis and boundary for response wfs
2406 : : !! nspinor = 1 for scalar wfs, 2 for spinor wfs
2407 : : !! nsppol = 1 for unpolarized, 2 for spin-polarized
2408 : : !! qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3) =
2409 : : !! inverse of the overlap matrix
2410 : : !! pwindall(max(mpw,mpw1)*mkmem_rbz,8,3) = array used to compute the overlap matrices
2411 : : !! pwindall(:,1,:) <- <u^(0)_i|u^(0)_i+1>
2412 : : !! pwindall(:,2,:) <- <u^(0)_i|u^(0)_i-1>
2413 : : !! pwindall(:,3,:) <- <u^(1)_i|u^(1)_i+1>
2414 : : !! pwindall(:,4,:) <- <u^(1)_i|u^(1)_i-1>
2415 : : !! pwindall(:,5,:) <- <u^(1)_i|u^(0)_i+n+1>
2416 : : !! pwindall(:,6,:) <- <u^(1)_i|u^(0)_i+n-1>
2417 : : !! pwindall(:,7,:) <- <u^(0)_i|u^(1)_i-n+1>
2418 : : !! pwindall(:,8,:) <- <u^(0)_i|u^(1)_i-n-1>
2419 : : !! rprimd(3,3)=dimensional primitive translations in real space (bohr)
2420 : : !!
2421 : : !! OUTPUT
2422 : : !! diet = electric susceptibility tensor
2423 : : !!
2424 : : !! SOURCE
2425 : :
2426 : 3 : subroutine dfptff_die(cg,cg1,dtefield,d2lo,idirpert,ipert,mband,mband_mem,mkmem_rbz,&
2427 : 3 : & mpi_enreg,mpw,mpw1,mpert,nkpt,npwarr,npwar1,nsppol,nspinor,pwindall,qmat,rprimd)
2428 : :
2429 : : !Arguments ----------------------------------------
2430 : : !scalars
2431 : : integer,intent(in) :: idirpert,ipert,mband,mkmem_rbz,mpert,mpw,mpw1,nkpt,nspinor
2432 : : integer,intent(in) :: mband_mem
2433 : : integer,intent(in) :: nsppol
2434 : : type(efield_type),intent(in) :: dtefield
2435 : : type(MPI_type),intent(in) :: mpi_enreg
2436 : : !arrays
2437 : : integer,intent(in) :: npwar1(nkpt),npwarr(nkpt)
2438 : : integer,intent(in) :: pwindall(max(mpw,mpw1)*mkmem_rbz,8,3)
2439 : : real(dp),intent(in) :: cg(2,mpw*mband_mem*mkmem_rbz*nspinor*nsppol)
2440 : : real(dp),intent(in) :: cg1(2,mpw1*mband_mem*mkmem_rbz*nspinor*nsppol)
2441 : : real(dp),intent(in) :: qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3)
2442 : : real(dp),intent(in) :: rprimd(3,3)
2443 : : real(dp),intent(inout) :: d2lo(2,3,mpert,3,mpert) !vz_i
2444 : :
2445 : : !Local variables ----------------------------------
2446 : : !scalars
2447 : : integer :: ialpha,iband,icg,icg1,idir,ikpt,ikpt1,jband,mpw_tmp,npw_k1
2448 : : integer :: jband_me, iband_me, me_band, ierr
2449 : : integer :: npw_k2,pwmax,pwmin
2450 : : real(dp) :: doti,dotr,e0,fac
2451 : : !arrays
2452 : 6 : integer :: band_procs(mband)
2453 : 3 : integer,allocatable :: pwind_tmp(:)
2454 : : real(dp) :: edir(3)
2455 : 3 : real(dp),allocatable :: s1mat(:,:,:),vect1(:,:),vect2(:,:)
2456 : :
2457 : : ! *************************************************************************
2458 : :
2459 : : !calculate s1 matrices -----------------------------
2460 : 3 : mpw_tmp=max(mpw,mpw1)
2461 [ - + + - : 12 : ABI_MALLOC(s1mat,(2,dtefield%mband_occ,dtefield%mband_occ))
- + + - +
- + - - +
- + ]
2462 [ - + + - : 9 : ABI_MALLOC(vect1,(2,0:mpw_tmp))
+ - + - -
+ - + ]
2463 [ - + + - : 6 : ABI_MALLOC(vect2,(2,0:mpw_tmp))
- + - + ]
2464 [ - + + - : 9 : ABI_MALLOC(pwind_tmp,(mpw_tmp))
+ - + - -
+ + - ]
2465 [ + + + + ]: 18 : vect1(:,0) = zero ; vect2(:,0) = zero
2466 : :
2467 : 3 : edir(:)=zero
2468 : :
2469 : 3 : me_band = mpi_enreg%me_band
2470 : :
2471 : : !TODO no info on sppol here - I default to isppol 1
2472 [ + + ]: 27 : do ikpt=1,nkpt
2473 : : call proc_distrb_band(band_procs,mpi_enreg%proc_distrb,ikpt,1,mband,&
2474 : 24 : & me_band,mpi_enreg%me_kpt,mpi_enreg%comm_band)
2475 [ + + ]: 99 : do idir=1,3
2476 : : ! compute <u^(0)_{k_j}|u^(1)_{k_j+1,q}> matrix--- q=0 ----------------------------------------
2477 : :
2478 : : ! prepare to calculate overlap matrix
2479 : 72 : ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
2480 : 72 : icg = dtefield%cgindex(ikpt,1)
2481 : 72 : icg1 = dtefield%cgindex(ikpt1,1+nsppol)
2482 : 72 : npw_k1 = npwarr(ikpt)
2483 : 72 : npw_k2 = npwar1(ikpt1)
2484 [ + + ]: 3060 : pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,7,idir)
2485 : :
2486 [ + + + + ]: 360 : vect1(:,0) = zero ; vect2(:,0) = zero
2487 : : jband_me = 0
2488 [ + + ]: 360 : do jband = 1, dtefield%mband_occ
2489 [ + - ]: 288 : if (band_procs(jband) == me_band) then
2490 : 288 : jband_me = jband_me + 1
2491 : : vect2(:,1:npw_k2) = &
2492 [ + + + + ]: 36144 : & cg1(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
2493 [ + + + + : 1584 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
2494 : : end if
2495 : 288 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
2496 : :
2497 : 288 : iband_me = 0
2498 [ + + ]: 1512 : do iband = 1, dtefield%mband_occ
2499 [ - + ]: 1152 : if (band_procs(iband) /= me_band) cycle
2500 : 1152 : iband_me = iband_me + 1
2501 : 1152 : pwmin = (iband_me-1)*npw_k1*nspinor
2502 : 1152 : pwmax = pwmin + npw_k1*nspinor
2503 : : vect1(:,1:npw_k1) = &
2504 [ + + + + ]: 144576 : & cg(:,icg + 1 + pwmin:icg + pwmax)
2505 [ + + + + : 6336 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
2506 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
2507 : 1152 : & vect1,vect2)
2508 : 1152 : s1mat(1,iband,jband) = dotr
2509 : 1440 : s1mat(2,iband,jband) = doti
2510 : : end do ! iband
2511 : : end do !jband
2512 : :
2513 : : ! compute <u^(1)_{k_j,q}|u^(0)_{k_j+1}> matrix-- q=0 -------------------------------------
2514 : :
2515 : : ! prepare to calculate overlap matrix
2516 : 72 : ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
2517 : 72 : icg = dtefield%cgindex(ikpt,1+nsppol)
2518 : 72 : icg1 = dtefield%cgindex(ikpt1,1)
2519 : 72 : npw_k1 = npwar1(ikpt)
2520 : 72 : npw_k2 = npwarr(ikpt1)
2521 [ + + ]: 3060 : pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,5,idir)
2522 [ + + + + ]: 360 : vect1(:,0) = zero ; vect2(:,0) = zero
2523 : : jband_me = 0
2524 [ + + ]: 360 : do jband = 1, dtefield%mband_occ
2525 [ + - ]: 288 : if (band_procs(jband) == me_band) then
2526 : 288 : jband_me = jband_me + 1
2527 : : vect2(:,1:npw_k2) = &
2528 [ + + + + ]: 36144 : & cg(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
2529 [ + + + + : 1584 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
2530 : : end if
2531 : 288 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
2532 : :
2533 : 288 : iband_me = 0
2534 [ + + ]: 1512 : do iband = 1, dtefield%mband_occ
2535 [ - + ]: 1152 : if (band_procs(iband) /= me_band) cycle
2536 : 1152 : iband_me = iband_me + 1
2537 : 1152 : pwmin = (iband_me-1)*npw_k1*nspinor
2538 : 1152 : pwmax = pwmin + npw_k1*nspinor
2539 : : vect1(:,1:npw_k1) = &
2540 [ + + + + ]: 144576 : & cg1(:,icg + 1 + pwmin:icg + pwmax)
2541 [ + + + + : 6336 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
2542 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
2543 : 1152 : & vect1,vect2)
2544 : 1152 : s1mat(1,iband,jband) = s1mat(1,iband,jband) + dotr
2545 : 1440 : s1mat(2,iband,jband) = s1mat(2,iband,jband) + doti
2546 : : end do ! iband
2547 : : end do !jband
2548 : :
2549 : : ! recompose full s1mat on each proc, summing over iband
2550 : 72 : call xmpi_sum(s1mat,mpi_enreg%comm_band,ierr)
2551 : :
2552 : : ! sum over the whole------------------------------------------------------------
2553 : :
2554 : 72 : e0=zero
2555 : :
2556 [ + + ]: 360 : do iband=1,dtefield%mband_occ
2557 [ + + ]: 1512 : do jband=1,dtefield%mband_occ
2558 : : e0 = e0 + (s1mat(1,iband,jband)*qmat(2,jband,iband,ikpt,1,idir)&
2559 : 1440 : & + s1mat(2,iband,jband)*qmat(1,jband,iband,ikpt,1,idir))
2560 : :
2561 : : end do
2562 : : end do
2563 : :
2564 [ + + ]: 384 : do ialpha=1,3
2565 : : fac = rprimd(ialpha,idir)/&
2566 : 216 : & (dble(dtefield%nstr(idir))*pi)
2567 : 288 : edir(ialpha)=edir(ialpha)+ e0*fac
2568 : : end do
2569 : :
2570 : : end do !idir
2571 : : end do !ikpt
2572 : :
2573 [ + + ]: 12 : d2lo(1,1:3,ipert,idirpert,ipert)=edir(:)
2574 : :
2575 [ - + ]: 3 : ABI_FREE(s1mat)
2576 [ - + ]: 3 : ABI_FREE(vect1)
2577 [ - + ]: 3 : ABI_FREE(vect2)
2578 [ - + ]: 3 : ABI_FREE(pwind_tmp)
2579 : :
2580 : 3 : end subroutine dfptff_die
2581 : : !!***
2582 : :
2583 : : !!****f* ABINIT/dfptff_bec
2584 : : !! NAME
2585 : : !! dfptff_bec
2586 : : !!
2587 : : !! FUNCTION
2588 : : !! calculate Born effective charge tensor in Eq.(33) in PRB 75, 115116(2007) [[cite:Wang2007]].
2589 : : !!
2590 : : !! INPUTS
2591 : : !! cg(2,mpw*nspinor*mband_mem*mkmem_rbz*nsppol) = planewave coefficients of wavefunctions
2592 : : !! cg1(2,mpw1*nspinor*mband_mem*mk1mem*nsppol) = pw coefficients of
2593 : : !! RF wavefunctions at k,q.
2594 : : !! dtefield = variables related to response Berry-phase calculation
2595 : : !! idirpert = the current coloumn of the dielectric permittivity tensor
2596 : : !! mband = maximum number of bands
2597 : : !! mband_mem = maximum number of bands on this cpu
2598 : : !! mkmem_rbz = maximum number of k-points in core memory
2599 : : !! mpw = maximum number of plane waves
2600 : : !! mpw1 = maximum number of plane waves for response wavefunctions
2601 : : !! nkpt = number of k points
2602 : : !! npwarr(nkpt) = number of planewaves in basis and boundary at this k point
2603 : : !! npwar1(nkpt) = number of planewaves in basis and boundary for response wfs
2604 : : !! nspinor = 1 for scalar wfs, 2 for spinor wfs
2605 : : !! nsppol = 1 for unpolarized, 2 for spin-polarized
2606 : : !! qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3) =
2607 : : !! inverse of the overlap matrix
2608 : : !! pwindall(max(mpw,mpw1)*mkmem_rbz,8,3) = array used to compute the overlap matrices
2609 : : !! pwindall(:,1,:) <- <u^(0)_i|u^(0)_i+1>
2610 : : !! pwindall(:,2,:) <- <u^(0)_i|u^(0)_i-1>
2611 : : !! pwindall(:,3,:) <- <u^(1)_i|u^(1)_i+1>
2612 : : !! pwindall(:,4,:) <- <u^(1)_i|u^(1)_i-1>
2613 : : !! pwindall(:,5,:) <- <u^(1)_i|u^(0)_i+n+1>
2614 : : !! pwindall(:,6,:) <- <u^(1)_i|u^(0)_i+n-1>
2615 : : !! pwindall(:,7,:) <- <u^(0)_i|u^(1)_i-n+1>
2616 : : !! pwindall(:,8,:) <- <u^(0)_i|u^(1)_i-n-1>
2617 : : !! rprimd(3,3)=dimensional primitive translations in real space (bohr)
2618 : : !!
2619 : : !! OUTPUT
2620 : : !! d2lo(1,1:3,natom+5,1:3,1:natom) = Born effective charge tensor
2621 : : !!
2622 : : !! SOURCE
2623 : :
2624 : 6 : subroutine dfptff_bec(cg,cg1,dtefield,natom,d2lo,idirpert,ipert,mband,mband_mem,mkmem_rbz,&
2625 : 6 : & mpi_enreg,mpw,mpw1,mpert,nkpt,npwarr,npwar1,nsppol,nspinor,pwindall,qmat,rprimd)
2626 : :
2627 : : !Arguments ----------------------------------------
2628 : : !scalars
2629 : : integer,intent(in) :: idirpert,ipert,mband,mkmem_rbz,mpert,mpw,mpw1,natom,nkpt
2630 : : integer,intent(in) :: mband_mem
2631 : : integer,intent(in) :: nspinor,nsppol
2632 : : type(efield_type),intent(in) :: dtefield
2633 : : type(MPI_type),intent(in) :: mpi_enreg
2634 : : !arrays
2635 : : integer,intent(in) :: npwar1(nkpt),npwarr(nkpt)
2636 : : integer,intent(in) :: pwindall(max(mpw,mpw1)*mkmem_rbz,8,3)
2637 : : real(dp),intent(in) :: cg(2,mpw*mband_mem*mkmem_rbz*nspinor*nsppol)
2638 : : real(dp),intent(in) :: cg1(2,mpw1*mband_mem*mkmem_rbz*nspinor*nsppol)
2639 : : real(dp),intent(in) :: qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3)
2640 : : real(dp),intent(in) :: rprimd(3,3)
2641 : : real(dp),intent(inout) :: d2lo(2,3,mpert,3,mpert) !vz_i
2642 : :
2643 : : !Local variables ----------------------------------
2644 : : !scalars
2645 : : integer :: ialpha,iband,icg,icg1,idir,ikpt,ikpt1,jband,mpw_tmp,npw_k1
2646 : : integer :: npw_k2,pwmax,pwmin
2647 : : integer :: me_band,ierr, iband_me, jband_me
2648 : : real(dp) :: doti,dotr,e0,fac
2649 : : !arrays
2650 : 6 : integer,allocatable :: pwind_tmp(:)
2651 : 12 : integer :: band_procs(mband)
2652 : : real(dp) :: edir(3)
2653 : 6 : real(dp),allocatable :: s1mat(:,:,:),vect1(:,:),vect2(:,:)
2654 : :
2655 : : ! *************************************************************************
2656 : :
2657 : : !calculate s1 matrices -----------------------------
2658 : 6 : mpw_tmp=max(mpw,mpw1)
2659 [ - + + - : 24 : ABI_MALLOC(s1mat,(2,dtefield%mband_occ,dtefield%mband_occ))
- + + - +
- + - - +
- + ]
2660 [ - + + - : 18 : ABI_MALLOC(vect1,(2,0:mpw_tmp))
+ - + - -
+ - + ]
2661 [ - + + - : 12 : ABI_MALLOC(vect2,(2,0:mpw_tmp))
- + - + ]
2662 [ - + + - : 18 : ABI_MALLOC(pwind_tmp,(mpw_tmp))
+ - + - -
+ + - ]
2663 [ + + + + ]: 36 : vect1(:,0) = zero ; vect2(:,0) = zero
2664 : :
2665 : 6 : me_band = mpi_enreg%me_band
2666 : :
2667 : 6 : edir(:)=zero
2668 : :
2669 : : !TODO MJV: where is the loop over sppol? proc_distrb_band_procs chooses isppol 1 below
2670 [ + + ]: 54 : do ikpt=1,nkpt
2671 : : call proc_distrb_band(band_procs,mpi_enreg%proc_distrb,ikpt,1,mband,&
2672 : 48 : & me_band,mpi_enreg%me_kpt,mpi_enreg%comm_band)
2673 : :
2674 [ + + ]: 198 : do idir=1,3
2675 : :
2676 : : ! compute <u^(0)_{k_j}|u^(1)_{k_j+1,q}> matrix--- q=0 ----------------------------------------
2677 : :
2678 : : ! prepare to calculate overlap matrix
2679 : 144 : ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
2680 : 144 : icg = dtefield%cgindex(ikpt,1)
2681 : 144 : icg1 = dtefield%cgindex(ikpt1,1+nsppol)
2682 : 144 : npw_k1 = npwarr(ikpt)
2683 : 144 : npw_k2 = npwar1(ikpt1)
2684 [ + + ]: 6120 : pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,7,idir)
2685 [ + + + + ]: 720 : vect1(:,0) = zero ; vect2(:,0) = zero
2686 : 144 : jband_me = 0
2687 [ + + + + : 7632 : s1mat = zero
+ + ]
2688 [ + + ]: 720 : do jband = 1, dtefield%mband_occ
2689 [ + - ]: 576 : if (band_procs(jband) == me_band) then
2690 : 576 : jband_me = jband_me + 1
2691 : : vect2(:,1:npw_k2) = &
2692 [ + + + + ]: 72288 : & cg1(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
2693 : : end if
2694 : 576 : call xmpi_bcast(vect2,band_procs(jband), mpi_enreg%comm_band,ierr)
2695 : :
2696 : : ! now everyone has vect2 for present jband
2697 [ + + + + : 3168 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
2698 : :
2699 : : iband_me = 0
2700 [ + + ]: 3600 : do iband = 1, dtefield%mband_occ
2701 [ - + ]: 2304 : if (band_procs(iband) /= me_band) cycle
2702 : 2304 : iband_me = iband_me + 1
2703 : :
2704 : 2304 : pwmin = (iband_me-1)*npw_k1*nspinor
2705 : 2304 : pwmax = pwmin + npw_k1*nspinor
2706 : : vect1(:,1:npw_k1) = &
2707 [ + + + + ]: 289152 : & cg(:,icg + 1 + pwmin:icg + pwmax)
2708 [ + + + + : 12672 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
2709 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
2710 : 2304 : & vect1,vect2)
2711 : 2304 : s1mat(1,iband,jband) = dotr
2712 : 2880 : s1mat(2,iband,jband) = doti
2713 : : end do ! iband
2714 : : end do !jband
2715 : : ! for the moment s1mat is only filled for iband on current cpu
2716 : :
2717 : :
2718 : : ! compute <u^(1)_{k_j,q}|u^(0)_{k_j+1}> matrix-- q=0 -------------------------------------
2719 : :
2720 : : ! prepare to calculate overlap matrix
2721 : 144 : ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
2722 : 144 : icg = dtefield%cgindex(ikpt,1+nsppol)
2723 : 144 : icg1 = dtefield%cgindex(ikpt1,1)
2724 : 144 : npw_k1 = npwar1(ikpt)
2725 : 144 : npw_k2 = npwarr(ikpt1)
2726 [ + + ]: 6120 : pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,5,idir)
2727 [ + + + + ]: 720 : vect1(:,0) = zero ; vect2(:,0) = zero
2728 : : jband_me = 0
2729 [ + + ]: 720 : do jband = 1, dtefield%mband_occ
2730 [ + - ]: 576 : if (band_procs(jband) == me_band) then
2731 : 576 : jband_me = jband_me + 1
2732 : : vect2(:,1:npw_k2) = &
2733 [ + + + + ]: 72288 : & cg(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
2734 : : end if
2735 : 576 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
2736 : :
2737 [ + + + + : 3168 : if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
+ + ]
2738 : : iband_me = 0
2739 [ + + ]: 3600 : do iband = 1, dtefield%mband_occ
2740 [ - + ]: 2304 : if (band_procs(iband) /= me_band) cycle
2741 : 2304 : iband_me = iband_me + 1
2742 : :
2743 : 2304 : pwmin = (iband_me-1)*npw_k1*nspinor
2744 : 2304 : pwmax = pwmin + npw_k1*nspinor
2745 : : vect1(:,1:npw_k1) = &
2746 [ + + + + ]: 289152 : & cg1(:,icg + 1 + pwmin:icg + pwmax)
2747 [ + + + + : 12672 : if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
+ + ]
2748 : : call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
2749 : 2304 : & vect1,vect2)
2750 : :
2751 : 2304 : s1mat(1,iband,jband) = s1mat(1,iband,jband) + dotr
2752 : 2880 : s1mat(2,iband,jband) = s1mat(2,iband,jband) + doti
2753 : : end do ! iband
2754 : : end do !jband
2755 : :
2756 : : ! recompose full s1mat on each proc
2757 : 144 : call xmpi_sum(s1mat,mpi_enreg%comm_band,ierr)
2758 : :
2759 : : ! sum over the whole------------------------------------------------------------
2760 : :
2761 : 144 : e0=zero
2762 : :
2763 [ + + ]: 720 : do iband=1,dtefield%mband_occ
2764 [ + + ]: 3024 : do jband=1,dtefield%mband_occ
2765 : : e0 = e0 + (s1mat(1,iband,jband)*qmat(2,jband,iband,ikpt,1,idir)&
2766 : 2880 : & + s1mat(2,iband,jband)*qmat(1,jband,iband,ikpt,1,idir))
2767 : : end do
2768 : : end do
2769 : :
2770 [ + + ]: 768 : do ialpha=1,3
2771 : : fac = rprimd(ialpha,idir)/&
2772 : 432 : & (dble(dtefield%nstr(idir))*pi)
2773 : :
2774 : 576 : edir(ialpha)=edir(ialpha)+ e0*fac
2775 : : end do
2776 : :
2777 : : end do ! idir
2778 : : end do ! ikpt
2779 : :
2780 [ + + ]: 24 : d2lo(1,1:3,natom+2,idirpert,ipert)=edir(:)
2781 : :
2782 [ - + ]: 6 : ABI_FREE(s1mat)
2783 [ - + ]: 6 : ABI_FREE(vect1)
2784 [ - + ]: 6 : ABI_FREE(vect2)
2785 [ - + ]: 6 : ABI_FREE(pwind_tmp)
2786 : :
2787 : 6 : end subroutine dfptff_bec
2788 : : !!***
2789 : :
2790 : : !!****f* ABINIT/qmatrix
2791 : : !! NAME
2792 : : !! qmatrix
2793 : : !!
2794 : : !! FUNCTION
2795 : : !! calculation of the inverse of the overlap matrix
2796 : : !!
2797 : : !! INPUTS
2798 : : !! cg(2,mpw*nspinor*mband_mem*mkmem_rbz*nsppol) = planewave coefficients of wavefunctions
2799 : : !! RF wavefunctions at k,q.
2800 : : !! dtefield = variables related to response Berry-phase calculation
2801 : : !! ikpt = the index of the current k point
2802 : : !! mband = maximum number of bands
2803 : : !! mband_mem = maximum number of bands on this cpu
2804 : : !! mkmem_rbz = maximum number of k-points in core memory
2805 : : !! mpw = maximum number of plane waves
2806 : : !! mpw1 = maximum number of plane waves for response wavefunctions
2807 : : !! nkpt = number of k points
2808 : : !! npwarr(nkpt) = number of planewaves in basis and boundary at this k point
2809 : : !! npwar1(nkpt) = number of planewaves in basis and boundary for response wfs
2810 : : !! nspinor = 1 for scalar wfs, 2 for spinor wfs
2811 : : !! nsppol = 1 for unpolarized, 2 for spin-polarized
2812 : : !! pwindall(max(mpw,mpw1)*mkmem_rbz,8,3) = array used to compute the overlap matrices
2813 : : !!
2814 : : !! OUTPUT
2815 : : !! qmat(2,dtefield%nband_occ,dtefield%nband_occ,nkpt,2,3) = inverse of the overlap matrix
2816 : : !!
2817 : : !! SOURCE
2818 : :
2819 : 9 : subroutine qmatrix(cg,dtefield,qmat,mpi_enreg,mpw,mpw1,mkmem_rbz,mband,mband_mem,npwarr,nkpt,nspinor,nsppol,pwindall)
2820 : :
2821 : : use m_hide_lapack, only : dzgedi, dzgefa
2822 : :
2823 : : !Arguments ----------------------------------------
2824 : : !scalars
2825 : : integer,intent(in) :: mband,mkmem_rbz,mpw,mpw1,nkpt,nspinor,nsppol
2826 : : integer,intent(in) :: mband_mem
2827 : : type(efield_type),intent(in) :: dtefield
2828 : : type(MPI_type),intent(in) :: mpi_enreg
2829 : : !arrays
2830 : : integer,intent(in) :: npwarr(nkpt),pwindall(max(mpw,mpw1)*mkmem_rbz,8,3)
2831 : : real(dp),intent(in) :: cg(2,mpw*nspinor*mband_mem*mkmem_rbz*nsppol)
2832 : : real(dp),intent(out) :: qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3)
2833 : :
2834 : : !Local variables -------------------------
2835 : : !scalars
2836 : : integer :: iband,icg,icg1,idir,ifor,ikpt,ikpt2,info,jband,job
2837 : : integer :: iband_me, jband_me, me_band, ierr
2838 : : integer :: npw_k1,npw_k2,pwmax,pwmin
2839 : : integer :: isppol
2840 : : real(dp) :: doti,dotr
2841 : : !arrays
2842 : 9 : integer,allocatable :: ipvt(:),pwind_k(:)
2843 : : real(dp) :: det(2,2)
2844 : 18 : integer :: band_procs(mband)
2845 : 9 : real(dp),allocatable :: sinv(:,:,:),smat_k(:,:,:),vect1(:,:),vect2(:,:)
2846 : 9 : real(dp),allocatable :: zgwork(:,:)
2847 : :
2848 : : ! *************************************************************************
2849 : :
2850 [ - + + - : 27 : ABI_MALLOC(ipvt,(dtefield%mband_occ))
+ - + - -
+ - + ]
2851 [ - + + - : 36 : ABI_MALLOC(sinv,(2,dtefield%mband_occ,dtefield%mband_occ))
- + + - +
- + - - +
- + ]
2852 [ - + + - : 27 : ABI_MALLOC(zgwork,(2,dtefield%mband_occ))
+ - + - -
+ - + ]
2853 [ - + + - : 27 : ABI_MALLOC(vect1,(2,0:mpw))
+ - + - -
+ - + ]
2854 [ - + + - : 18 : ABI_MALLOC(vect2,(2,0:mpw))
- + - + ]
2855 [ - + + - : 27 : ABI_MALLOC(smat_k,(2,dtefield%mband_occ,dtefield%mband_occ))
- + + - -
+ - + ]
2856 [ - + + - : 27 : ABI_MALLOC(pwind_k,(max(mpw,mpw1)))
+ - + - -
+ + - ]
2857 [ + + + + ]: 54 : vect1(:,0) = zero ; vect2(:,0) = zero
2858 : :
2859 : 9 : job = 11
2860 : :
2861 : 9 : me_band = mpi_enreg%me_band
2862 : :
2863 : : !loop over k points
2864 [ + + ]: 18 : do isppol = 1, nsppol
2865 [ + + ]: 90 : do ikpt = 1, nkpt
2866 : 72 : call proc_distrb_band(band_procs,mpi_enreg%proc_distrb,ikpt,isppol,mband,me_band,mpi_enreg%me_kpt,mpi_enreg%comm_band)
2867 : :
2868 : 72 : npw_k1 = npwarr(ikpt)
2869 : 72 : icg = dtefield%cgindex(ikpt,1)
2870 [ + + ]: 297 : do idir = 1, 3
2871 [ + + ]: 720 : do ifor = 1, 2
2872 : :
2873 : 432 : ikpt2 = dtefield%ikpt_dk(ikpt,ifor,idir)
2874 : 432 : npw_k2 = npwarr(ikpt2)
2875 : 432 : icg1 = dtefield%cgindex(ikpt2,1)
2876 [ + + ]: 18360 : pwind_k(1:npw_k1) = pwindall((ikpt-1)*max(mpw,mpw1)+1:(ikpt-1)*max(mpw,mpw1)+npw_k1,ifor,idir)
2877 : :
2878 [ + + + + : 22896 : smat_k = zero
+ + ]
2879 : 432 : jband_me = 0
2880 [ + + ]: 2160 : do jband = 1, dtefield%nband_occ(isppol)
2881 [ + - ]: 1728 : if (band_procs(jband) == me_band) then
2882 : 1728 : jband_me = jband_me + 1
2883 [ + + + + ]: 216864 : vect2(:,1:npw_k2) = cg(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
2884 : : end if
2885 : 1728 : call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
2886 : :
2887 [ + + + + : 9504 : if (npw_k2 < mpw) vect2(:,npw_k2+1:mpw) = zero
+ + ]
2888 : :
2889 : 1728 : iband_me = 0
2890 [ + + ]: 10800 : do iband = 1, dtefield%nband_occ(isppol)
2891 [ - + ]: 6912 : if (band_procs(iband) /= me_band) cycle
2892 : 6912 : iband_me = iband_me + 1
2893 : :
2894 : 6912 : pwmin = (iband_me-1)*npw_k1*nspinor
2895 : 6912 : pwmax = pwmin + npw_k1*nspinor
2896 [ + + + + ]: 867456 : vect1(:,1:npw_k1) = cg(:,icg + 1 + pwmin:icg + pwmax)
2897 [ + + + + : 38016 : if (npw_k1 < mpw) vect1(:,npw_k1+1:mpw) = zero
+ + ]
2898 : 6912 : call overlap_g(doti,dotr,mpw,npw_k1,npw_k2,nspinor,pwind_k,vect1,vect2)
2899 : 6912 : smat_k(1,iband,jband) = dotr
2900 : 8640 : smat_k(2,iband,jband) = doti
2901 : : end do ! iband
2902 : : end do !jband
2903 : :
2904 : : ! recompose full s1mat on each proc
2905 : 432 : call xmpi_sum(smat_k,mpi_enreg%comm_band,ierr)
2906 : :
2907 [ + + + + : 22896 : sinv(:,:,:) = smat_k(:,:,:)
+ + ]
2908 : :
2909 : 432 : call dzgefa(sinv,dtefield%mband_occ,dtefield%nband_occ(isppol),ipvt,info)
2910 : 432 : call dzgedi(sinv,dtefield%mband_occ,dtefield%nband_occ(isppol),ipvt,det,zgwork,job)
2911 : :
2912 [ + + + + : 23544 : qmat(:,:,:,ikpt,ifor,idir) = sinv(:,:,:)
+ + ]
2913 : : end do
2914 : : end do
2915 : : end do !end loop over k
2916 : : end do
2917 : :
2918 [ - + ]: 9 : ABI_FREE(ipvt)
2919 [ - + ]: 9 : ABI_FREE(sinv)
2920 [ - + ]: 9 : ABI_FREE(zgwork)
2921 [ - + ]: 9 : ABI_FREE(vect1)
2922 [ - + ]: 9 : ABI_FREE(vect2)
2923 [ - + ]: 9 : ABI_FREE(smat_k)
2924 [ - + ]: 9 : ABI_FREE(pwind_k)
2925 : :
2926 : 9 : end subroutine qmatrix
2927 : : !!***
2928 : :
2929 : : end module m_dfpt_fef
2930 : : !!***
|