Branch data Line data Source code
1 : : !!****m* ABINIT/m_paw_overlap
2 : : !! NAME
3 : : !! m_paw_overlap
4 : : !!
5 : : !! FUNCTION
6 : : !! This module contains several routines used to compute the overlap between
7 : : !! 2 wave-functions (PAW only), and associated tools.
8 : : !! Mainly used in Berry phase formalism.
9 : : !!
10 : : !! COPYRIGHT
11 : : !! Copyright (C) 2018-2026 ABINIT group (JWZ,TRangel,BA,FJ,PHermet)
12 : : !! This file is distributed under the terms of the
13 : : !! GNU General Public License, see ~abinit/COPYING
14 : : !! or http://www.gnu.org/copyleft/gpl.txt .
15 : : !!
16 : : !! SOURCE
17 : :
18 : : #if defined HAVE_CONFIG_H
19 : : #include "config.h"
20 : : #endif
21 : :
22 : : #include "abi_common.h"
23 : :
24 : : MODULE m_paw_overlap
25 : :
26 : : use defs_basis
27 : : use m_errors
28 : : use m_abicore
29 : : use m_xmpi
30 : :
31 : : use defs_abitypes, only : MPI_type
32 : : use m_special_funcs, only : sbf8
33 : : use m_efield, only : efield_type
34 : : use m_pawang, only : pawang_type
35 : : use m_pawcprj, only : pawcprj_type
36 : : use m_pawrad, only : pawrad_type,simp_gen
37 : : use m_pawtab, only : pawtab_type
38 : : use m_paw_sphharm, only : initylmr
39 : : use m_pawcprj, only : pawcprj_type, pawcprj_alloc, pawcprj_get, pawcprj_free, pawcprj_getdim
40 : :
41 : : implicit none
42 : :
43 : : private
44 : :
45 : : !public procedures.
46 : : public :: overlap_k1k2_paw
47 : : public :: smatrix_pawinit
48 : : public :: smatrix_k_paw
49 : : public :: qijb_kk
50 : : public :: expibi
51 : :
52 : : CONTAINS !========================================================================================
53 : : !!***
54 : :
55 : : !----------------------------------------------------------------------
56 : :
57 : : !!****f* m_paw_overlap/overlap_k1k2_paw
58 : : !! NAME
59 : : !! overlap_k1k2_paw
60 : : !!
61 : : !! FUNCTION
62 : : !! compute PAW overlap between two k points,
63 : : !! similar to smatrix_k_paw.F90 but more generic
64 : : !!
65 : : !! INPUTS
66 : : !! cprj_k1 (pawcprj_type) :: cprj for occupied bands at point k1
67 : : !! cprj_k2 :: cprj for occupied bands at point k2
68 : : !! dk(3) :: vector k2 - k1
69 : : !! gprimd(3,3)=dimensioned primitive translations of reciprocal lattice
70 : : !! lmn2max :: lmnmax*(lmnmax+1)/2
71 : : !! lmnsize(ntypat) :: lmnsize for each atom type
72 : : !! mband :: number of bands
73 : : !! natom=number of atoms in unit cell
74 : : !! nspinor :: number of spinors (1 or 2)
75 : : !! ntypat=number of types of atoms in unit cell
76 : : !! pawang <type(pawang_type)>=paw angular mesh and related data
77 : : !! pawrad(ntypat) <type(pawrad_type)>=paw radial mesh and related data
78 : : !! pawtab(ntypat) <type(pawtab_type)>=paw tabulated starting data
79 : : !! typat=typat(natom) list of atom types
80 : : !! xred(natom,3) :: locations of atoms in cell
81 : : !!
82 : : !! OUTPUT
83 : : !! k1k2_paw(2,mband,mband) :: array of the on-site PAW parts of the overlaps between Bloch states at points
84 : : !! k1 and k2, for the various pairs of bands, that is, the on-site part of
85 : : !! <u_nk1|u_mk2>
86 : : !!
87 : : !! SIDE EFFECTS
88 : : !!
89 : : !! NOTES
90 : : !! This routine assumes that the cprj are not explicitly ordered by
91 : : !! atom type.
92 : : !!
93 : : !! SOURCE
94 : :
95 : 0 : subroutine overlap_k1k2_paw(cprj_k1,cprj_k2,dk,gprimd,k1k2_paw,lmn2max,lmnsize,&
96 : 0 : & natom,nband,nband_occ,nspinor,ntypat,pawang,pawrad,pawtab,typat,xred)
97 : :
98 : : !Arguments---------------------------
99 : : !scalars
100 : : integer,intent(in) :: lmn2max,natom,nband,nband_occ,nspinor,ntypat
101 : : type(pawang_type),intent(in) :: pawang
102 : : type(pawcprj_type),intent(in) :: cprj_k1(natom,nband),cprj_k2(natom,nband)
103 : :
104 : : !arrays
105 : : integer,intent(in) :: lmnsize(ntypat),typat(natom)
106 : : real(dp),intent(in) :: dk(3),gprimd(3,3),xred(natom,3)
107 : : real(dp),intent(out) :: k1k2_paw(2,nband_occ,nband_occ)
108 : : type(pawrad_type),intent(in) :: pawrad(ntypat)
109 : : type(pawtab_type),intent(in) :: pawtab(ntypat)
110 : :
111 : : !Local variables---------------------------
112 : : !scalars
113 : : integer :: iatom,iband,ibs,ilmn,ispinor,itypat
114 : : integer :: jband,jbs,jlmn,klmn
115 : : complex(dp) :: cpk1,cpk2,cterm,paw_onsite
116 : :
117 : : ! arrays
118 : 0 : real(dp),allocatable :: calc_expibi(:,:),calc_qijb(:,:,:)
119 : : ! *************************************************************************
120 : :
121 : : !initialize k1k2_paw output variable
122 [ # # # # : 0 : k1k2_paw(:,:,:) = zero
# # ]
123 : :
124 : : ! obtain the atomic phase factors for the input k vector shift
125 [ # # # # : 0 : ABI_MALLOC(calc_expibi,(2,natom))
# # # # #
# # # ]
126 : 0 : call expibi(calc_expibi,dk,natom,xred)
127 : :
128 : : ! obtain the onsite PAW terms for the input k vector shift
129 [ # # # # : 0 : ABI_MALLOC(calc_qijb,(2,lmn2max,natom))
# # # # #
# # # # #
# # ]
130 : 0 : call qijb_kk(calc_qijb,dk,calc_expibi,gprimd,lmn2max,natom,ntypat,pawang,pawrad,pawtab,typat)
131 [ # # ]: 0 : ABI_FREE(calc_expibi)
132 : :
133 [ # # ]: 0 : do iatom = 1, natom
134 : 0 : itypat = typat(iatom)
135 : :
136 [ # # ]: 0 : do ilmn=1,lmnsize(itypat)
137 [ # # ]: 0 : do jlmn=1,lmnsize(itypat)
138 : 0 : klmn=max(ilmn,jlmn)*(max(ilmn,jlmn)-1)/2 + min(ilmn,jlmn)
139 : 0 : paw_onsite = cmplx(calc_qijb(1,klmn,iatom),calc_qijb(2,klmn,iatom))
140 [ # # ]: 0 : do ispinor = 1, nspinor
141 [ # # ]: 0 : do iband = 1, nband_occ
142 [ # # ]: 0 : do jband = 1, nband_occ
143 : 0 : ibs = nspinor*(iband-1) + ispinor
144 : 0 : jbs = nspinor*(jband-1) + ispinor
145 : 0 : cpk1=cmplx(cprj_k1(iatom,ibs)%cp(1,ilmn),cprj_k1(iatom,ibs)%cp(2,ilmn))
146 : 0 : cpk2=cmplx(cprj_k2(iatom,jbs)%cp(1,jlmn),cprj_k2(iatom,jbs)%cp(2,jlmn))
147 : 0 : cterm = conjg(cpk1)*paw_onsite*cpk2
148 : 0 : k1k2_paw(1,iband,jband) = k1k2_paw(1,iband,jband)+real(cterm)
149 : 0 : k1k2_paw(2,iband,jband) = k1k2_paw(2,iband,jband)+aimag(cterm)
150 : : end do ! end loop over jband
151 : : end do ! end loop over iband
152 : : end do ! end loop over ispinor
153 : : end do ! end loop over ilmn
154 : : end do ! end loop over jlmn
155 : :
156 : : end do ! end loop over atoms
157 : :
158 [ # # ]: 0 : ABI_FREE(calc_qijb)
159 : :
160 : 0 : end subroutine overlap_k1k2_paw
161 : : !!***
162 : :
163 : : !----------------------------------------------------------------------
164 : :
165 : : !!****f* m_paw_overlap/smatrix_pawinit
166 : : !! NAME
167 : : !! smatrix_pawinit
168 : : !!
169 : : !! FUNCTION
170 : : !! Routine which computes paw part of the overlap used to compute LMWF wannier
171 : : !! functions and berryphase
172 : : !!
173 : : !! INPUTS
174 : : !! atindx1(natom)=index table for atoms, inverse of atindx (see gstate.f)
175 : : !! cprj(natom,nspinor*mband*mkmem*nsppol)= <p_lmn|Cnk> coefficients for each WF |Cnk>
176 : : !! and each |p_lmn> non-local projector
177 : : !! dimcprj(natom)=array of dimensions of array cprj (not ordered)
178 : : !! g1(3)= reciprocal vector to put k1+b inside the BZ. bb=k2-k1=b-G1
179 : : !! ("b" is the true b, so we have to correct bb with G1).
180 : : !! gprimd(3,3)=dimensional reciprocal space primitive translations
181 : : !! ikpt1(3)=cartesian coordinates of k1
182 : : !! ikpt2(3)=cartesian coordinates of k2
183 : : !! isppol = spin polarization
184 : : !! mband=maximum number of bands
185 : : !! mkmem =number of k points treated by this node.
186 : : !! mpi_enreg=information about MPI parallelization
187 : : !! natom=number of atoms in cell.
188 : : !! nkpt=number of k points.
189 : : !! nspinor=number of spinorial components of the wavefunctions (on current proc)
190 : : !! nsppol=1 for unpolarized, 2 for spin-polarized
191 : : !! ntypat=number of types of atoms in unit cell.
192 : : !! rprimd(3,3)=dimensional primitive translations for real space (bohr)
193 : : !! seed_name= seed_name of files containing cg for all k-points to be used with MPI
194 : : !! xred(3,natom)=reduced dimensionless atomic coordinates
195 : : !!
196 : : !! OUTPUT
197 : : !! cm2: Inside sphere part of the overlap needed for constructing wannier function
198 : : !!
199 : : !! SIDE EFFECTS
200 : : !! (only writing, printing)
201 : : !!
202 : : !! NOTES
203 : : !! The mpi part will work with mlwfovlp but not for berryphase_new
204 : : !!
205 : : !! SOURCE
206 : :
207 : 2944 : subroutine smatrix_pawinit(atindx1,cm2,cprj,ikpt1,ikpt2,isppol,&
208 : 2944 : & g1,gprimd,kpt,mband,mbandw,mkmem,mpi_enreg,&
209 : 2944 : & natom,nband,nkpt,nspinor,nsppol,ntypat,pawang,pawrad,pawtab,rprimd,&
210 : 2944 : & seed_name,typat,xred)
211 : :
212 : : !Arguments---------------------------
213 : : !scalars
214 : : integer,intent(in) :: ikpt1,ikpt2,isppol,mband,mbandw,mkmem,natom,nkpt,nspinor,nsppol
215 : : integer,intent(in) :: ntypat
216 : : character(len=fnlen) :: seed_name !seed names of files containing cg info used in case of MPI
217 : : type(MPI_type),intent(in) :: mpi_enreg
218 : : type(pawang_type),intent(in) :: pawang
219 : :
220 : : !arrays
221 : : integer,intent(in) :: atindx1(natom),g1(3),nband(nsppol*nkpt),typat(natom)
222 : : real(dp),intent(in) :: gprimd(3,3),kpt(3,nkpt),rprimd(3,3),xred(3,natom)
223 : : real(dp),intent(inout) :: cm2(2,mbandw,mbandw)
224 : : type(pawcprj_type) :: cprj(natom,nspinor*mband*mkmem*nsppol)
225 : : type(pawrad_type),intent(in) :: pawrad(ntypat)
226 : : type(pawtab_type),intent(in) :: pawtab(ntypat)
227 : :
228 : : !Local variables---------------------------
229 : : !scalars
230 : : integer :: dummy
231 : : integer :: iatom,iband1,iband2,icg1,icg2,idx1,idx2,ii
232 : : integer :: ilmn,ios,iunit,ir
233 : : integer :: iorder_cprj,isel,ispinor,itypat,j0lmn,jj,jlmn,klm,klmn,kln,ll,lm0,lmax
234 : : integer :: lmin,lmn_size,max_lmn,mesh_size,mm,nband_k
235 : : integer :: nprocs,spaceComm,rank !for mpi
236 : : real(dp) :: arg,bnorm,delta,intg,ppi,ppr,qijbtemp,qijtot,x1
237 : : real(dp) :: x2,xsum,xtemp,xx,yy,zz
238 : : character(len=500) :: message
239 : : character(len=fnlen) :: cprj_file !file containing cg info used in case of MPI
240 : : logical::lfile
241 : :
242 : : !arrays
243 : 2944 : integer,allocatable :: dimcprj(:),nattyp_dum(:)
244 : : real(dp),parameter :: ili(7)=(/zero,-one,zero,one,zero,-one,zero/)
245 : : real(dp),parameter :: ilr(7)=(/one,zero,-one,zero,one,zero,-one/)
246 : 5888 : real(dp) :: bb(3),bb1(3),bbn(3),qijb(2),xcart(3,natom)
247 : 2944 : real(dp),allocatable :: ff(:),j_bessel(:,:),ylmb(:),ylmrgr_dum(:,:,:)
248 : 2944 : real(dp),allocatable :: sb_out(:)
249 : : type(pawcprj_type),allocatable :: cprj_k1(:,:)
250 : 2944 : type(pawcprj_type),allocatable :: cprj_k2(:,:)
251 : :
252 : : ! *************************************************************************
253 : :
254 : : DBG_ENTER("COLL")
255 : :
256 : : !
257 : : !Allocate cprj_k1 and cprj_k2
258 : : !
259 [ - + + - : 8832 : ABI_MALLOC(dimcprj,(natom))
+ - + - -
+ - + ]
260 : 2944 : call pawcprj_getdim(dimcprj,natom,nattyp_dum,ntypat,typat,pawtab,'R')
261 : :
262 : 2944 : nband_k=nband(ikpt1)
263 [ - + + - : 149632 : ABI_MALLOC(cprj_k1,(natom,nband_k*nspinor))
- + + - +
- + - - +
- + + + +
+ ]
264 : 2944 : call pawcprj_alloc(cprj_k1,0,dimcprj)
265 : :
266 : 2944 : nband_k=nband(ikpt2)
267 [ - + + - : 149632 : ABI_MALLOC(cprj_k2,(natom,nband_k*nspinor))
- + + - +
- + - - +
- + + + +
+ ]
268 : 2944 : call pawcprj_alloc(cprj_k2,0,dimcprj)
269 [ - + ]: 2944 : ABI_FREE(dimcprj)
270 : :
271 : : !mpi initialization
272 : 2944 : spaceComm=MPI_enreg%comm_cell
273 : 2944 : nprocs=xmpi_comm_size(spaceComm)
274 : 2944 : rank=MPI_enreg%me_kpt
275 : :
276 : 2944 : lfile=.false.
277 : : !
278 : : !write(std_out,*) "compute PAW overlap for k-points",ikpt1,ikpt2
279 [ + + ]: 6528 : do iatom=1,natom
280 : : xcart(:,iatom)=rprimd(:,1)*xred(1,iatom)+&
281 : : & rprimd(:,2)*xred(2,iatom)+&
282 [ + + ]: 17280 : & rprimd(:,3)*xred(3,iatom)
283 : : end do
284 : :
285 : : !
286 : : !Calculate indices icg1 and icg2
287 : : !
288 : 2944 : icg1=0
289 [ + + ]: 6656 : do ii=1,isppol
290 : 3712 : ll=nkpt
291 [ + + ]: 3712 : if(ii==isppol) ll=ikpt1-1
292 [ + + ]: 144960 : do jj=1,ll
293 : : ! MPI: cycle over kpts not treated by this node
294 [ - + ]: 138304 : if ( ABS(MPI_enreg%proc_distrb(jj,1,ii)-rank)/=0) CYCLE
295 : : ! write(std_out,'("kpt loop2: ikpt",i3," rank ",i3)') jj,rank
296 : 142016 : icg1=icg1+nspinor*nband(jj+(ii-1)*nkpt)
297 : : end do
298 : : end do
299 : 2944 : icg2=0
300 [ + + ]: 6656 : do ii=1,isppol
301 : 3712 : ll=nkpt
302 [ + + ]: 3712 : if(isppol==ii) ll=ikpt2-1
303 [ + + ]: 144960 : do jj=1,ll
304 : : ! MPI: cycle over kpts not treated by this node
305 [ - + ]: 138304 : if (ABS(MPI_enreg%proc_distrb(jj,1,ii)-rank)/=0) CYCLE
306 : : ! write(std_out,'("kpt loop2: ikpt",i3," rank ",i3)') jj,rank
307 : 142016 : icg2=icg2+nspinor*nband(jj+(ii-1)*nkpt)
308 : : end do
309 : : end do
310 : : !
311 : : !MPI: if ikpt2 not found in this processor then
312 : : !read info from an unformatted file
313 : : !
314 [ - + ]: 2944 : if (nprocs>1) then
315 [ # # ]: 0 : if (ABS(MPI_enreg%proc_distrb(ikpt2,1,isppol)-rank)/=0) then
316 : 0 : lfile=.true.
317 : : !
318 : : ! get maximum of lmn_size
319 : : max_lmn=0
320 : : do itypat=1,ntypat
321 : : lmn_size=pawtab(itypat)%lmn_size
322 : : if(lmn_size>max_lmn) max_lmn=lmn_size
323 : : end do
324 : : !
325 : : ! get file name and open it
326 : : !
327 : 0 : write(cprj_file,'(a,I5.5,".",I1)') trim(seed_name),ikpt2,isppol
328 : 0 : iunit=1000
329 : : ! write(std_out,*)'reading file',trim(cprj_file)
330 : 0 : open (unit=iunit, file=cprj_file,form='unformatted',status='old',iostat=ios)
331 [ # # ]: 0 : if(ios /= 0) then
332 : 0 : write(message,*) " smatrix_pawinit: file",trim(cprj_file), "not found"
333 : 0 : ABI_ERROR(message)
334 : : end if
335 : : !
336 : : ! start reading
337 [ # # ]: 0 : do ii=1,mband*nspinor
338 [ # # ]: 0 : do iatom=1,natom
339 : 0 : itypat=typat(iatom)
340 : 0 : lmn_size=pawtab(itypat)%lmn_size
341 [ # # ]: 0 : do ilmn=1,lmn_size
342 [ # # # # ]: 0 : read(iunit)(cprj_k2(iatom,ii)%cp(jj,ilmn),jj=1,2)
343 : : end do !ilmn
344 : : end do
345 : : end do
346 : : !
347 : : ! close file
348 : : !
349 : 0 : close (unit=iunit,iostat=ios)
350 [ # # ]: 0 : if(ios /= 0) then
351 : 0 : write(message,*) " smatrix_pawinit: error closing file ",trim(cprj_file)
352 : 0 : ABI_ERROR(message)
353 : : end if
354 : : !
355 : : end if
356 : : end if !mpi
357 : :
358 : : !Extract cprj_k1 and cprj_k2
359 : : !these contain the projectors cprj for just one k-point (ikpt1 or ikpt2)
360 : :
361 : : !Extract cprj for k-point 1
362 : 2944 : iorder_cprj=0 !do not change the ordering of cprj
363 : 2944 : nband_k=nband(ikpt1)
364 : 2944 : dummy=1000 !index of file not implemented here, mkmem==0 not implemented
365 : : call pawcprj_get(atindx1,cprj_k1,cprj,natom,1,icg1,ikpt1,iorder_cprj,isppol,&
366 : : & mband,mkmem,natom,nband_k,nband_k,nspinor,nsppol,dummy,&
367 : 2944 : & mpicomm=mpi_enreg%comm_kpt,proc_distrb=mpi_enreg%proc_distrb)
368 : :
369 : : !Extract cprj for k-point 2
370 [ + - ]: 2944 : if( lfile .eqv. .false. ) then !if it was not already read above
371 : : iorder_cprj=0 !do not change the ordering of cprj
372 : 2944 : nband_k=nband(ikpt2)
373 : : dummy=1000 !index of file not implemented here, mkmem==0 not implemented
374 : : call pawcprj_get(atindx1,cprj_k2,cprj,natom,1,icg2,ikpt2,iorder_cprj,isppol,&
375 : : & mband,mkmem,natom,nband_k,nband_k,nspinor,nsppol,dummy,&
376 : 2944 : & mpicomm=mpi_enreg%comm_kpt,proc_distrb=mpi_enreg%proc_distrb)
377 : : end if
378 : :
379 : : !DEBUG
380 : : !if(ikpt2==2) then
381 : : !if(ikpt1==1) then
382 : : !do iband1=1,mbandw
383 : : !do iatom=1,natom
384 : : !itypat=typat(atindx1(iatom))
385 : : !lmn_size=pawtab(itypat)%lmn_size
386 : : !do ilmn=1,1!lmn_size
387 : : !!write(500,'(a,i3,a,i3,a,i3,a,2f13.7)')'iband ',iband1,' iatom ',iatom,' ilmn ',ilmn,' cprj',cprj(iatom,iband1+icg1)%cp(:,ilmn)
388 : : !write(500,'(a,i3,a,i3,a,i3,a,2f13.7)')'iband ',iband1,' iatom ',atindx1(iatom),' ilmn ',ilmn,' cprj',cprj(atindx1(iatom),iband1+icg1)%cp(:,ilmn)
389 : : !write(500,'(a,i3,a,i3,a,i3,a,2f13.7)')'iband ',iband1,' iatom ',iatom,' ilmn ',ilmn,' cprj_k1 ',cprj_k1(iatom,iband1)%cp(:,ilmn)
390 : : !end do
391 : : !end do
392 : : !end do
393 : : !end if
394 : : !end if
395 : : !NDDEBUG
396 : :
397 : : !!!!!!!!!!!!!!!!!
398 : : !--- Compute intermediate quantities: "b" vector=k2-k1 and its
399 : : !normalized value: bbn (and its norm: bnorm)
400 : : !compute also Ylm(b).
401 [ - + + - : 8832 : ABI_MALLOC(ylmb,(pawang%l_size_max*pawang%l_size_max))
+ - + - -
+ - + ]
402 [ - + ]: 2944 : ABI_MALLOC(ylmrgr_dum,(1,1,0))
403 [ + + ]: 11776 : bb(:)=kpt(:,ikpt2)-kpt(:,ikpt1)+g1(:)
404 : : bb1=bb
405 : 2944 : xx=gprimd(1,1)*bb(1)+gprimd(1,2)*bb(2)+gprimd(1,3)*bb(3)
406 : 2944 : yy=gprimd(2,1)*bb(1)+gprimd(2,2)*bb(2)+gprimd(2,3)*bb(3)
407 : 2944 : zz=gprimd(3,1)*bb(1)+gprimd(3,2)*bb(2)+gprimd(3,3)*bb(3)
408 : 2944 : bnorm=two_pi*dsqrt(xx**2+yy**2+zz**2)
409 [ - + ]: 2944 : if(bnorm<tol8) then
410 : : ! write(std_out,*) "WARNING: bnorm=",bnorm
411 : 0 : bbn(:)=zero
412 : : else
413 : 2944 : xx=xx*two_pi
414 : 2944 : yy=yy*two_pi
415 : 2944 : zz=zz*two_pi
416 : : bb(1)=xx
417 : : bb(2)=yy
418 : : bb(3)=zz
419 : 2944 : bbn(1)=xx/bnorm
420 : 2944 : bbn(2)=yy/bnorm
421 : 2944 : bbn(3)=zz/bnorm
422 : : end if
423 : :
424 : : !debug bbn=0
425 : : !debug bnorm=0
426 : : !bbn has to ne normalized
427 : 2944 : call initylmr(pawang%l_size_max,0,1,(/one/),1,bbn(:),ylmb(:),ylmrgr_dum)
428 : : !write(std_out,*) "ylmb(:)",ylmb(:)
429 : : !write(std_out,*) pawang%l_size_max
430 : : !write(std_out,*) "bbn",bbn(:)
431 : : !write(std_out,*) "xx,yy,zz",xx,yy,zz
432 : : !write(std_out,*) "bnorm",bnorm
433 [ - + ]: 2944 : ABI_FREE(ylmrgr_dum)
434 : :
435 : : !------- First Compute Qij(b)-
436 [ - + + - : 8832 : ABI_MALLOC(sb_out, (pawang%l_size_max))
+ - + - -
+ - + ]
437 [ + + + + : 2473472 : cm2=zero
+ + ]
438 : :
439 [ + + ]: 6528 : do iatom=1,natom
440 : 3584 : itypat=typat(iatom)
441 : 3584 : lmn_size=pawtab(itypat)%lmn_size
442 : : ! --- en coordonnnes reelles cartesiennes (espace reel)
443 : : ! --- first radial part(see pawinit)
444 : 3584 : mesh_size=pawtab(itypat)%mesh_size
445 [ - + + - : 14336 : ABI_MALLOC(j_bessel,(mesh_size,pawang%l_size_max))
- + + - +
- + - - +
- + ]
446 : :
447 : :
448 : : ! --- compute bessel function for (br) for all angular momenta necessary
449 : : ! --- and for all value of r.
450 : : ! --- they are needed for radial part
451 : : ! --- of the integration => j_bessel(ir,:)
452 [ + + ]: 4153600 : do ir=1,mesh_size
453 : 4150016 : arg=bnorm*pawrad(itypat)%rad(ir)
454 : 4150016 : call sbf8(pawang%l_size_max,arg,sb_out)
455 [ + + ]: 21701120 : j_bessel(ir,:) = sb_out
456 : : end do
457 : :
458 : : ! do jlmn=1,pawang%l_size_max
459 : : ! write(665,*) "j_bessel",j_bessel(1:mesh_size,jlmn)
460 : : ! enddo
461 : : ! write(std_out,*) "bessel function computed"
462 : : ! --- Compute \Sum b.R=xsum for future use
463 : : xtemp=zero
464 : : do mm=1,3
465 : : xtemp=xtemp+xred(mm,iatom)*bb1(mm)
466 : : end do
467 : : xtemp=xtemp*two_pi
468 : : xsum=zero
469 [ + + ]: 14336 : do mm=1,3
470 : 14336 : xsum=xsum+xcart(mm,iatom)*bbn(mm)*bnorm
471 : : end do
472 : : ! write(std_out,*)'xsum',xsum,xtemp,lmn_size
473 : :
474 : : ! --- Loop on jlmn and ilmn
475 : : qijtot=zero
476 [ + + ]: 56576 : do jlmn=1,lmn_size
477 : 52992 : j0lmn=jlmn*(jlmn-1)/2
478 [ + + ]: 513920 : do ilmn=1,jlmn
479 : :
480 : 457344 : klmn=j0lmn+ilmn
481 : 457344 : klm=pawtab(itypat)%indklmn(1,klmn);kln=pawtab(itypat)%indklmn(2,klmn)
482 : 457344 : lmin=pawtab(itypat)%indklmn(3,klmn);lmax=pawtab(itypat)%indklmn(4,klmn)
483 : : ! --- Sum over angular momenta
484 : : ! --- compute radial part integration for each angular momentum => intg
485 : : ! --- (3j) symbols follows the rule: l belongs to abs(li-lj), li+lj.
486 : 457344 : qijb=zero
487 [ - + ]: 457344 : do ll=lmin,lmax,2
488 : 946048 : lm0=ll*ll+ll+1
489 [ - + + - : 2838144 : ABI_MALLOC(ff,(mesh_size))
+ - + - -
+ - + -
+ ]
490 : : ff(1:mesh_size)=(pawtab(itypat)%phiphj(1:mesh_size,kln)&
491 : : & -pawtab(itypat)%tphitphj(1:mesh_size,kln))&
492 [ + + ]: 1014861440 : & *j_bessel(1:mesh_size,ll+1)
493 : 946048 : call simp_gen(intg,ff,pawrad(itypat))
494 [ - + ]: 946048 : ABI_FREE(ff)
495 : 946048 : qijbtemp=zero
496 [ + + ]: 5246208 : do mm=-ll,ll
497 : 4300160 : isel=pawang%gntselect(lm0+mm,klm)
498 [ + + ]: 4300160 : if (isel>0) qijbtemp=qijbtemp&
499 : 1865728 : & +pawang%realgnt(isel)*ylmb(lm0+mm)
500 : : end do ! mm
501 : : ! --- compute angular part with a summation
502 : : ! --- qijb =\sum_{lm} intg(lm)*qijbtemp
503 : 946048 : qijb(1)=qijb(1) +intg*qijbtemp*ilr(ll+1)
504 [ + + ]: 1892096 : qijb(2)=qijb(2) +intg*qijbtemp*ili(ll+1)
505 : : ! if(ilmn==jlmn) write(std_out,*) "intg, qij",intg,qijbtemp
506 : : end do ! ll
507 : :
508 : : ! --- Add exp(-i.b*R) for each atom.
509 : : if(ilmn==jlmn) qijtot=qijtot+qijb(1)
510 : : ! if(ilmn==jlmn) write(std_out,*) "qijtot",qijtot
511 : 457344 : x1=qijb(1)*dcos(-xsum)-qijb(2)*dsin(-xsum)
512 : 457344 : x2=qijb(1)*dsin(-xsum)+qijb(2)*dcos(-xsum)
513 : : ! x1 x2 necessary to avoid changing qijb(1) before
514 : : ! computing qijb(2)
515 : 457344 : qijb(1)=x1
516 : 457344 : qijb(2)=x2 !
517 : : ! if(ilmn==jlmn) write(std_out,*) "qij",jlmn,ilmn,qijb(1),qijb(2)
518 : :
519 [ + + ]: 7917696 : do iband1=1,mbandw ! limite inferieure a preciser
520 [ + + ]: 143427456 : do iband2=1,mbandw
521 : : ppr=0.d0
522 : : ppi=0.d0
523 [ + + ]: 346770432 : do ispinor=1,nspinor
524 : 211207680 : idx1=iband1*nspinor-(nspinor-ispinor)
525 : 211207680 : idx2=iband2*nspinor-(nspinor-ispinor) !to take into account spinors
526 : : ! write(std_out,*) "iband2",iband2
527 : : ! product of (a1+ia2)*(b1-ib2) (minus sign because conjugated)
528 : : ppr=ppr+&
529 : : ! real part a_1*b_1+a_2*b_2
530 : : & cprj_k1(iatom,idx1)%cp(1,ilmn)*cprj_k2(iatom,idx2)%cp(1,jlmn)+&
531 : : & cprj_k1(iatom,idx1)%cp(2,ilmn)*cprj_k2(iatom,idx2)%cp(2,jlmn)+&
532 : : ! & cprj(iatom,idx1+icg1)%cp(1,ilmn)*cprj(iatom,idx2+icg2)%cp(1,jlmn)+&
533 : : ! & cprj(iatom,idx1+icg1)%cp(2,ilmn)*cprj(iatom,idx2+icg2)%cp(2,jlmn)+&
534 : : ! add term on the other triangle of the matrix
535 : : ! qij is the same for this part because phi are real.
536 : : & cprj_k1(iatom,idx1)%cp(1,jlmn)*cprj_k2(iatom,idx2)%cp(1,ilmn)+&
537 : 211207680 : & cprj_k1(iatom,idx1)%cp(2,jlmn)*cprj_k2(iatom,idx2)%cp(2,ilmn)
538 : : ! & cprj(iatom,idx1+icg1)%cp(1,jlmn)*cprj(iatom,idx2+icg2)%cp(1,ilmn)+&
539 : : ! & cprj(iatom,idx1+icg1)%cp(2,jlmn)*cprj(iatom,idx2+icg2)%cp(2,ilmn)
540 : : ppi=ppi+&
541 : : ! imaginary part a_1*b_2-a_2*b_1
542 : : & cprj_k1(iatom,idx1)%cp(1,ilmn)*cprj_k2(iatom,idx2)%cp(2,jlmn)-&
543 : : & cprj_k1(iatom,idx1)%cp(2,ilmn)*cprj_k2(iatom,idx2)%cp(1,jlmn)+&
544 : : ! & cprj(iatom,idx1+icg1)%cp(1,ilmn)*cprj(iatom,idx2+icg2)%cp(2,jlmn)-&
545 : : ! & cprj(iatom,idx1+icg1)%cp(2,ilmn)*cprj(iatom,idx2+icg2)%cp(1,jlmn)+&
546 : : ! add term on the other triangle of the matrix
547 : : & cprj_k1(iatom,idx1)%cp(1,jlmn)*cprj_k2(iatom,idx2)%cp(2,ilmn)-&
548 : 346770432 : & cprj_k1(iatom,idx1)%cp(2,jlmn)*cprj_k2(iatom,idx2)%cp(1,ilmn)
549 : : ! & cprj(iatom,idx1+icg1)%cp(1,jlmn)*cprj(iatom,idx2+icg2)%cp(2,ilmn)-&
550 : : ! & cprj(iatom,idx1+icg1)%cp(2,jlmn)*cprj(iatom,idx2+icg2)%cp(1,ilmn)
551 : : end do !ispinor
552 : : !
553 : : ! delta: diagonal terms are counted twice ! so
554 : : ! we need a 0.5 factor for diagonal elements.
555 : 135562752 : delta=one
556 : : ! write(std_out,*) "ppr and ppi computed",ikpt1,ikpt2,iband1,iband2
557 [ + + ]: 135562752 : if(ilmn==jlmn) delta=half
558 : : cm2(1,iband1,iband2)= cm2(1,iband1,iband2)+ &
559 : 135562752 : & (qijb(1)*ppr-qijb(2)*ppi)*delta
560 : : cm2(2,iband1,iband2)= cm2(2,iband1,iband2)+ &
561 : 142970112 : & (qijb(2)*ppr+qijb(1)*ppi)*delta
562 : : end do ! iband2
563 : : end do ! iband1
564 : :
565 : : end do ! ilmn
566 : : end do ! jlmn
567 : : ! write(std_out,*) "final qijtot",qijtot
568 [ - + ]: 6528 : ABI_FREE(j_bessel)
569 : : end do ! iatom
570 : :
571 [ - + ]: 2944 : ABI_FREE(sb_out)
572 [ - + ]: 2944 : ABI_FREE(ylmb)
573 : 2944 : call pawcprj_free(cprj_k1)
574 : 2944 : call pawcprj_free(cprj_k2)
575 [ + - + + : 76416 : ABI_FREE(cprj_k1)
- + - + -
+ ]
576 [ + - + + : 76416 : ABI_FREE(cprj_k2)
- + - + -
+ ]
577 : :
578 : : DBG_EXIT("COLL")
579 : :
580 [ - + ]: 2944 : end subroutine smatrix_pawinit
581 : : !!***
582 : :
583 : : !----------------------------------------------------------------------
584 : :
585 : : !!****f* m_paw_overlap/smatrix_k_paw
586 : : !! NAME
587 : : !! smatrix_k_paw
588 : : !!
589 : : !! FUNCTION
590 : : !!
591 : : !! INPUTS
592 : : !! cprj_k (pawcprj_type) :: cprj for occupied bands at point k
593 : : !! cprj_kb :: cprj for occupied bands at point k+b
594 : : !! dtefield :: structure referring to all efield and berry's phase variables
595 : : !! kdir :: integer giving direction along which overlap is computed for ket
596 : : !! kfor :: integer indicating whether to compute forward (1) or backward (2)
597 : : !! along kpt string
598 : : !! natom :: number of atoms in cell
599 : : !! typat :: typat(natom) type of each atom
600 : : !!
601 : : !! OUTPUT
602 : : !! smat_k_paw :: array of the on-site PAW parts of the overlaps between Bloch states at points
603 : : !! k and k+b, for the various pairs of bands, that is, the on-site part of
604 : : !! <u_nk|u_mk+b>
605 : : !!
606 : : !! SIDE EFFECTS
607 : : !!
608 : : !! NOTES
609 : : !! This routine assumes that the cprj are not explicitly ordered by
610 : : !! atom type.
611 : : !!
612 : : !! SOURCE
613 : :
614 : 1139688 : subroutine smatrix_k_paw(cprj_k,cprj_kb,dtefield,kdir,kfor,mband,natom,smat_k_paw,typat)
615 : :
616 : : !Arguments---------------------------
617 : : !scalars
618 : : integer,intent(in) :: kdir,kfor,mband,natom
619 : : type(efield_type),intent(in) :: dtefield
620 : : type(pawcprj_type),intent(in) :: cprj_k(natom,dtefield%nspinor*mband)
621 : : type(pawcprj_type),intent(in) :: cprj_kb(natom,dtefield%nspinor*mband)
622 : :
623 : : !arrays
624 : : integer,intent(in) :: typat(natom)
625 : : real(dp),intent(out) :: smat_k_paw(2,dtefield%mband_occ,dtefield%mband_occ)
626 : :
627 : : !Local variables---------------------------
628 : : !scalars
629 : : integer :: iatom,iband,ibs,ilmn,ispinor,itypat
630 : : integer :: jband,jbs,jlmn,klmn,nspinor
631 : : complex(dp) :: cpk,cpkb,cterm,paw_onsite
632 : : ! *************************************************************************
633 : :
634 : : !initialize smat_k_paw
635 [ + + + + : 60403464 : smat_k_paw(:,:,:) = zero
+ + ]
636 : :
637 : : nspinor = dtefield%nspinor
638 : :
639 [ + + ]: 3419064 : do iatom = 1, natom
640 : 2279376 : itypat = typat(iatom)
641 : :
642 [ + + ]: 21654072 : do ilmn=1,dtefield%lmn_size(itypat)
643 [ + + ]: 166394448 : do jlmn=1,dtefield%lmn_size(itypat)
644 : 145880064 : klmn=max(ilmn,jlmn)*(max(ilmn,jlmn)-1)/2 + min(ilmn,jlmn)
645 : : paw_onsite = cmplx(dtefield%qijb_kk(1,klmn,iatom,kdir),&
646 : 145880064 : & dtefield%qijb_kk(2,klmn,iatom,kdir))
647 [ + + ]: 145880064 : if (kfor > 1) paw_onsite = conjg(paw_onsite)
648 [ + + ]: 309995136 : do ispinor = 1, nspinor
649 [ + + ]: 875280384 : do iband = 1, dtefield%mband_occ
650 [ + + ]: 3063481344 : do jband = 1, dtefield%mband_occ
651 : 2334081024 : ibs = nspinor*(iband-1) + ispinor
652 : 2334081024 : jbs = nspinor*(jband-1) + ispinor
653 : 2334081024 : cpk=cmplx(cprj_k(iatom,ibs)%cp(1,ilmn),cprj_k(iatom,ibs)%cp(2,ilmn))
654 : 2334081024 : cpkb=cmplx(cprj_kb(iatom,jbs)%cp(1,jlmn),cprj_kb(iatom,jbs)%cp(2,jlmn))
655 : 2334081024 : cterm = conjg(cpk)*paw_onsite*cpkb
656 : 2334081024 : smat_k_paw(1,iband,jband) = smat_k_paw(1,iband,jband)+dreal(cterm)
657 : 2917601280 : smat_k_paw(2,iband,jband) = smat_k_paw(2,iband,jband)+dimag(cterm)
658 : : end do ! end loop over jband
659 : : end do ! end loop over iband
660 : : end do ! end loop over ispinor
661 : : end do ! end loop over ilmn
662 : : end do ! end loop over jlmn
663 : :
664 : : end do ! end loop over atoms
665 : :
666 : 1139688 : end subroutine smatrix_k_paw
667 : : !!***
668 : :
669 : : !----------------------------------------------------------------------
670 : :
671 : : !!****f* m_paw_overlap/qijb_kk
672 : : !! NAME
673 : : !! qijb_kk
674 : : !!
675 : : !! FUNCTION
676 : : !! Routine which computes PAW onsite part of wavefunction overlap for Bloch
677 : : !! functions at two k-points k and k+b. These
678 : : !! quantities are used in PAW-based computations of polarization and magnetization.
679 : : !!
680 : : !! INPUTS
681 : : !! dkvecs(3) :: $\Delta k$ input vector
682 : : !! expibi(2,my_natom,3) :: phase factors at each atomic site for given k offset
683 : : !! gprimd(3,3)=dimensioned primitive translations of reciprocal lattice
684 : : !! lmn2max :: lmnmax*(lmnmax+1)/2
685 : : !! natom=number of atoms in unit cell
686 : : !! ntypat=number of types of atoms in unit cell
687 : : !! pawang <type(pawang_type)>=paw angular mesh and related data
688 : : !! pawrad(ntypat) <type(pawrad_type)>=paw radial mesh and related data
689 : : !! pawtab(ntypat) <type(pawtab_type)>=paw tabulated starting data
690 : : !! typat=typat(natom) list of atom types
691 : : !!
692 : : !! OUTPUT
693 : : !! calc_qijb(2,lmn2max,natom) :: PAW on-site overlaps of wavefunctions at neighboring
694 : : !! k point
695 : : !!
696 : : !! SIDE EFFECTS
697 : : !!
698 : : !! NOTES
699 : : !! this function computes the on-site data for the PAW version of
700 : : !! <u_nk|u_mk+b>, that is, two Bloch vectors at two different k points.
701 : : !!
702 : : !! SOURCE
703 : :
704 : 90 : subroutine qijb_kk(calc_qijb,dkvecs,expibi,gprimd,lmn2max,natom,ntypat,&
705 : 90 : & pawang,pawrad,pawtab,typat)
706 : :
707 : : !Arguments---------------------------
708 : : !scalars
709 : : integer,intent(in) :: lmn2max,natom,ntypat
710 : : type(pawang_type),intent(in) :: pawang
711 : : real(dp),intent(out) :: calc_qijb(2,lmn2max,natom)
712 : : !arrays
713 : : integer,intent(in) :: typat(natom)
714 : : real(dp),intent(in) :: dkvecs(3),expibi(2,natom),gprimd(3,3)
715 : : type(pawrad_type),intent(in) :: pawrad(ntypat)
716 : : type(pawtab_type),intent(in) :: pawtab(ntypat)
717 : :
718 : : !Local variables---------------------------
719 : : !scalars
720 : : integer :: iatom,ir,isel,itypat
721 : : integer :: klm,kln,klmn,lbess,lbesslm,lmin,lmax,mbess,mesh_size
722 : : integer :: ylmr_normchoice,ylmr_npts,ylmr_option
723 : : real(dp) :: arg,bessg,bnorm,intg,rterm
724 : : complex(dp) :: cterm,etb,ifac
725 : : !arrays
726 : : real(dp) :: bb(3),bbn(3),bcart(3),ylmgr(1,1,0),ylmr_nrm(1)
727 : 90 : real(dp),allocatable :: ff(:),j_bessel(:,:),ylmb(:),sb_out(:)
728 : : ! the following is (i)^L mod 4.
729 : : complex(dp),dimension(0:3) :: il(0:3)=(/cone,j_dpc,-cone,-j_dpc/)
730 : : ! *************************************************************************
731 : :
732 [ + + + + : 19710 : calc_qijb(:,:,:) = zero
+ + ]
733 : :
734 : 90 : ylmr_normchoice = 0 ! input to initylmr are normalized
735 : 90 : ylmr_npts = 1 ! only 1 point to compute in initylmr
736 : 90 : ylmr_nrm(1) = one ! weight of normed point for initylmr
737 : 90 : ylmr_option = 1 ! compute only ylm's in initylmr
738 : :
739 [ - + + - : 270 : ABI_MALLOC(sb_out, (pawang%l_size_max))
+ - + - -
+ - + ]
740 : :
741 [ + + ]: 270 : do iatom = 1, natom
742 : :
743 : 180 : itypat = typat(iatom)
744 : 180 : mesh_size = pawtab(itypat)%mesh_size
745 : :
746 [ - + + - : 720 : ABI_MALLOC(j_bessel,(mesh_size,pawang%l_size_max))
- + + - +
- + - - +
- + ]
747 [ - + + - : 540 : ABI_MALLOC(ff,(mesh_size))
+ - + - -
+ - + -
+ ]
748 [ - + + - : 540 : ABI_MALLOC(ylmb,(pawang%l_size_max*pawang%l_size_max))
+ - + - -
+ - + ]
749 : :
750 : : ! here is exp(-i b.R) for current atom: recall storage in expibi
751 : 180 : etb = cmplx(expibi(1,iatom),expibi(2,iatom))
752 : :
753 : : ! note the definition used for the k-dependence of the PAW basis functions:
754 : : !$|\phi_{i,k}\rangle = exp(-i k\cdot r)|\phi_i\rangle
755 : : ! see Umari, Gonze, and Pasquarello, PRB 69,235102 [[cite:Umari2004]], Eq. 23. Thus the k-vector on the
756 : : ! bra side enters as k, while on the ket side it enters as -k.
757 [ + + ]: 720 : bb(:) = -dkvecs(:)
758 : :
759 : : ! reference bb to cartesian axes
760 [ + + + + ]: 2340 : bcart(1:3)=MATMUL(gprimd(1:3,1:3),bb(1:3))
761 : :
762 : : ! bbn is b-hat (the unit vector in the b direction)
763 [ + + ]: 720 : bnorm=dsqrt(dot_product(bcart,bcart))
764 [ + + ]: 720 : bbn(:) = bcart(:)/bnorm
765 : :
766 : : ! as an argument to the bessel function, need 2pi*b*r = 1 so b is re-normed to two_pi
767 : 180 : bnorm = two_pi*bnorm
768 [ + + ]: 92733 : do ir=1,mesh_size
769 : 92553 : arg=bnorm*pawrad(itypat)%rad(ir)
770 : 92553 : call sbf8(pawang%l_size_max,arg,sb_out) ! spherical bessel functions at each mesh point
771 [ + + ]: 370392 : j_bessel(ir,:) = sb_out
772 : : end do ! end loop over mesh
773 : :
774 : : ! compute Y_LM(b) here
775 : 180 : call initylmr(pawang%l_size_max,ylmr_normchoice,ylmr_npts,ylmr_nrm,ylmr_option,bbn,ylmb(:),ylmgr)
776 : :
777 [ + + ]: 6660 : do klmn = 1, pawtab(itypat)%lmn2_size
778 : 6480 : klm =pawtab(itypat)%indklmn(1,klmn)
779 : 6480 : kln =pawtab(itypat)%indklmn(2,klmn)
780 : 6480 : lmin=pawtab(itypat)%indklmn(3,klmn)
781 : 6480 : lmax=pawtab(itypat)%indklmn(4,klmn)
782 [ - + + + ]: 16920 : do lbess = lmin, lmax, 2 ! only possible choices for L s.t. Gaunt integrals
783 : : ! will be non-zero
784 : 10260 : ifac = il(mod(lbess,4))
785 [ + + ]: 46440 : do mbess = -lbess, lbess
786 : 29700 : lbesslm = lbess*lbess+lbess+mbess+1
787 : 29700 : isel=pawang%gntselect(lbesslm,klm)
788 [ + + ]: 39960 : if (isel > 0) then
789 : 9180 : bessg = pawang%realgnt(isel)
790 : : ff(1:mesh_size)=(pawtab(itypat)%phiphj(1:mesh_size,kln)&
791 : : & -pawtab(itypat)%tphitphj(1:mesh_size,kln))&
792 [ + + ]: 4729383 : & *j_bessel(1:mesh_size,lbess+1)
793 : 9180 : call simp_gen(intg,ff,pawrad(itypat))
794 : 9180 : rterm = four_pi*bessg*intg*ylmb(lbesslm)
795 : 9180 : cterm = etb*ifac*rterm
796 : : calc_qijb(1,klmn,iatom) = &
797 : 9180 : & calc_qijb(1,klmn,iatom) + dreal(cterm)
798 : : calc_qijb(2,klmn,iatom) = &
799 : 9180 : & calc_qijb(2,klmn,iatom) + dimag(cterm)
800 : :
801 : : end if ! end selection on non-zero Gaunt factors
802 : : end do ! end loop on mbess = -lbess, lbess
803 : : end do ! end loop on lmin-lmax bessel l values
804 : : end do ! end loop on lmn2_size klmn basis pairs
805 : :
806 [ - + ]: 180 : ABI_FREE(j_bessel)
807 [ - + ]: 180 : ABI_FREE(ff)
808 [ - + ]: 270 : ABI_FREE(ylmb)
809 : : end do ! end loop over atoms
810 : :
811 [ - + ]: 90 : ABI_FREE(sb_out)
812 : :
813 [ - + ]: 90 : end subroutine qijb_kk
814 : : !!***
815 : :
816 : : !----------------------------------------------------------------------
817 : :
818 : : !!****f* m_paw_overlap/expibi
819 : : !! NAME
820 : : !! expibi
821 : : !!
822 : : !! FUNCTION
823 : : !! Routine that computes exp(i (-b_ket).R) at each site.
824 : : !!
825 : : !! INPUTS
826 : : !! dkvecs(3) :: $\Delta k$ increment
827 : : !! natom :: number of atoms in unit cell
828 : : !! xred(natom,3) :: reduced coordinates of atoms in unit cell
829 : : !!
830 : : !! OUTPUT
831 : : !! calc_expibi(2,natom) :: phase factors at each atom for vector shift
832 : : !!
833 : : !! SIDE EFFECTS
834 : : !!
835 : : !! NOTES
836 : : !!
837 : : !! SOURCE
838 : :
839 : 90 : subroutine expibi(calc_expibi,dkvecs,natom,xred)
840 : :
841 : : !Arguments---------------------------
842 : : !scalars
843 : : integer,intent(in) :: natom
844 : : real(dp),intent(out) :: calc_expibi(2,natom)
845 : : !arrays
846 : : real(dp),intent(in) :: dkvecs(3),xred(3,natom)
847 : :
848 : : !Local variables---------------------------
849 : : !scalars
850 : : integer :: iatom
851 : : real(dp) :: bdotr
852 : :
853 : : ! *************************************************************************
854 : :
855 [ + + + + ]: 630 : calc_expibi(:,:) = zero
856 : :
857 : : !calc_expibi(2,natom)
858 : : !used for PAW field calculations (distributed over atomic sites)
859 : : !stores the on-site phase factors arising from
860 : : !$\langle\phi_{i,k}|\phi_{j,k+\sigma_k k_k}\rangle$
861 : : !where $\sigma = \pm 1$. These overlaps arise in various Berry
862 : : !phase calculations of electric and magnetic polarization. The on-site
863 : : !phase factor is $\exp[-i\sigma_k k_k)\cdot I]$ where
864 : : !$I$ is the nuclear position.
865 : :
866 [ + + ]: 270 : do iatom = 1, natom
867 : :
868 : : ! note the definition used for the k-dependence of the PAW basis functions:
869 : : !$|\phi_{i,k}\rangle = exp(-i k\cdot r)|\phi_i\rangle
870 : : ! see Umari, Gonze, and Pasquarello, PRB 69,235102 [[cite:Umari2004]] Eq. 23.
871 [ + + ]: 720 : bdotr = DOT_PRODUCT(xred(1:3,iatom),-dkvecs(1:3))
872 : : ! here is exp(i b.R) for the given site
873 : 180 : calc_expibi(1,iatom) = cos(two_pi*bdotr)
874 : 270 : calc_expibi(2,iatom) = sin(two_pi*bdotr)
875 : :
876 : : end do ! end loop on natom
877 : :
878 : 90 : end subroutine expibi
879 : : !!***
880 : :
881 : : !----------------------------------------------------------------------
882 : :
883 : : END MODULE m_paw_overlap
884 : : !!***
|