Line data Source code
1 : !!****m* ABINIT/m_prep_calc_ucrpa
2 : !! NAME
3 : !! m_prep_calc_ucrpa
4 : !!
5 : !! FUNCTION
6 : !! Prepare data for the calculation of U with the CRPA method: oscillators strenghs and k-points.
7 : !!
8 : !! COPYRIGHT
9 : !! Copyright (C) 2006-2026 ABINIT group (BAmadon)
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 : !! INPUTS
15 : !!
16 : !! OUTPUT
17 : !!
18 : !! SOURCE
19 :
20 : #if defined HAVE_CONFIG_H
21 : #include "config.h"
22 : #endif
23 :
24 :
25 : #include "abi_common.h"
26 :
27 : MODULE m_prep_calc_ucrpa
28 :
29 : use defs_basis
30 : use m_abicore
31 : use m_gwdefs!, only : czero_gw, cone_gw, j_gw, sigparams_t
32 : use m_xmpi
33 : use m_defs_ptgroups
34 : use m_errors
35 :
36 : use defs_datatypes, only : pseudopotential_type
37 : use m_time, only : timab
38 : use m_hide_blas, only : xdotc
39 : use m_geometry, only : normv
40 : use m_crystal, only : crystal_t
41 : use m_fft_mesh, only : rotate_FFT_mesh
42 : use m_bz_mesh, only : kmesh_t, findqg0
43 : use m_gsphere, only : gsphere_t
44 : use m_io_tools, only : flush_unit, open_file
45 : use m_vcoul, only : vcoul_t
46 : use m_pawpwij, only : pawpwff_t, pawpwij_t, pawpwij_init, pawpwij_free, paw_rho_tw_g, paw_cross_rho_tw_g
47 : use m_paw_pwaves_lmn,only : paw_pwaves_lmn_t
48 : use m_pawang, only : pawang_type
49 : use m_pawtab, only : pawtab_type
50 : use m_pawfgrtab, only : pawfgrtab_type
51 : use m_pawcprj, only : pawcprj_type, pawcprj_alloc, pawcprj_free, pawcprj_copy, paw_overlap
52 : use m_paw_nhat, only : pawmknhat_psipsi
53 : use m_paw_sym, only : paw_symcprj
54 : use m_wfd, only : wfd_t, wave_t
55 : use m_oscillators, only : rho_tw_g
56 : use m_esymm, only : esymm_t
57 : use m_read_plowannier, only : read_plowannier
58 : use m_plowannier, only : plowannier_type,operwan_realspace_type
59 : use m_ebands, only : ebands_t
60 :
61 : implicit none
62 :
63 : private
64 :
65 : public :: prep_calc_ucrpa
66 : !!***
67 :
68 : contains
69 :
70 : !!****f* ABINIT/prep_calc_ucrpa
71 : !! NAME
72 : !! prep_calc_ucrpa
73 : !!
74 : !! FUNCTION
75 : !! Prepare data for the calculation of U with the CRPA method: oscillators strenghs and k-points.
76 : !!
77 : !! COPYRIGHT
78 : !! Copyright (C) 1999-2026 ABINIT group (FB, GMR, VO, LR, RWG, MG, RShaltaf,TApplencourt,BAmadon)
79 : !! This file is distributed under the terms of the
80 : !! GNU General Public License, see ~abinit/COPYING
81 : !! or http://www.gnu.org/copyleft/gpl.txt .
82 : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
83 : !!
84 : !! INPUTS
85 : !! sigmak_ibz=Index of the k-point in the IBZ.
86 : !! minbnd, maxbnd= min and Max band index for GW correction (for this k-point)
87 : !! Gsph_x<gsphere_t>= Info on the G-sphere used for Sigma_x
88 : !! %nsym=number of symmetry operations
89 : !! %rottb(ng,timrev,nsym)=index of (IS) G where I is the identity or the inversion
90 : !! operation and G is one of the ng vectors in reciprocal space
91 : !! %timrev=2 if time-reversal symmetry is used, 1 otherwise
92 : !! %gvec(3,ng)=integer coordinates of each plane wave in reciprocal space
93 : !! ikcalc=index in the array Sigp%kptgw2bz of the k-point where GW corrections are calculated
94 : !! Kmesh <kmesh_t>
95 : !! %nbz=Number of points in the BZ
96 : !! %nibz=Number of points in IBZ
97 : !! %kibz(3,nibz)=k-point coordinates, irreducible Brillouin zone
98 : !! %kbz(3,nbz)=k-point coordinates, full Brillouin zone
99 : !! %ktab(nbz)= table giving for each k-point in the BZ (kBZ), the corresponding
100 : !! %ktabi(nbz)= for each k-point in the BZ defines whether inversion has to be considered
101 : !! %ktabp(nbz)= phase factor associated to tnons
102 : !! gwx_ngfft(18)=Information about 3D FFT for the oscillator strengths, see ~abinit/doc/variables/vargs.htm#ngfft
103 : !! gwx_nfftot=number of points of the FFT grid for GW wavefunctions
104 : !! Vcp <vcoul_t datatype> containing information on the cutoff technique
105 : !! %vc_sqrt(npwx,nqibz)= square-root of the coulombian potential for q-points in the IBZ
106 : !! Pawtab(Psps%ntypat) <type(pawtab_type)>=paw tabulated starting data
107 : !! Pawang <type(pawang_type)>=paw angular mesh and related data
108 : !! Psps <type(pseudopotential_type)>=variables related to pseudopotentials
109 : !! %usepaw=1 for PAW, 0 for NC pseudopotentials.
110 : !! Qmesh <kmesh_t> : datatype gathering information of the q-mesh used
111 : !! %ibz=q points where $\tilde\epsilon^{-1}$ has been computed
112 : !! %bz(3,nqbz)=coordinates of all q-points in BZ
113 : !! Sigp <sigparams_t> (see the definition of this structured datatype)
114 : !! Cryst<crystal_t>=Info on unit cell and symmetries
115 : !! %natom=number of atoms in unit cell
116 : !! %ucvol=unit cell volume
117 : !! %nsym=number of symmetry operations
118 : !! %typat(natom)=type of each atom
119 : !! much slower but it requires less memory
120 : !! QP_BSt<ebands_t>=Datatype gathering info on the QP energies (KS if one shot)
121 : !! eig(Sigp%nbnds,Kmesh%nibz,%nsppol)=KS or QP energies for k-points, bands and spin
122 : !! occ(Sigp%nbnds,Kmesh%nibz,nsppol)=occupation numbers, for each k point in IBZ, each band and spin
123 : !! Paw_pwff<pawpwff_t>=Form factor used to calculate the onsite mat. elements of a plane wave.
124 : !! allQP_sym(%nkibz,%nsppol)<esymm_t>=Datatype collecting data on the irreducible representaions of the
125 : !! little group of kcalc in the KS representation as well as the symmetry of the bdgw_k states.
126 : !! prtvol=Flags governing verbosity level.
127 : !!
128 : !! OUTPUT
129 : !!
130 : !! NOTES
131 : !! 1) The treatment of the divergence of Gygi+Baldereschi (PRB 1986) [[cite:Gigy1986]] is included.
132 : !!
133 : !! 2) On the symmetrization of Sigma matrix elements
134 : !! If Sk = k+G0 then M_G(k, Sq)= e^{-i( Sq+G).t} M_{ S^-1(G} (k,q)
135 : !! If -Sk = k+G0 then M_G(k,-Sq)= e^{-i(-Sq+G).t} M_{-S^-1(G)}^*(k,q)
136 : !!
137 : !! Notice the absence of G0 in the expression. Moreover, when we sum over the little group, it turns out
138 : !! that there is a cancellation of the phase factor associated to the non-symmorphic operations due to a
139 : !! similar term coming from the symmetrization of \epsilon^{-1}. Mind however that the nonsymmorphic phase
140 : !! has to be considered when epsilon^-1 is reconstructed starting from the q-points in the IBZ.
141 : !!
142 : !! 3) the unitary transformation relating wavefunctions
143 : !! at symmetric k-points should be taken into account during the symmetrization
144 : !! of the oscillator matrix elements. In case of G_oW_o and GW_o calculations, however,
145 : !! it is possible to make an invariant by just including all the degenerate states and
146 : !! averaging the final results over the degenerate subset. Here we divide the states
147 : !! where the QP energies are required into complexes. Note however that this approach is not
148 : !! based on group theory, and it might lead to spurious results in case of accidental degeneracies.
149 : !!
150 : !! SOURCE
151 :
152 0 : subroutine prep_calc_ucrpa(sigmak_ibz,ikcalc,itypatcor,minbnd,maxbnd,Cryst,QP_BSt,Sigp,Gsph_x,Vcp,Kmesh,Qmesh,lpawu,&
153 0 : & M1_q_m,Pawtab,Pawang,Paw_pwff,Pawfgrtab,Paw_onsite,&
154 0 : & Psps,Wfd,Wfdf,allQP_sym,gwx_ngfft,ngfftf,&
155 0 : & prtvol,pawcross,plowan_compute,rhot1_q_m,wanbz,rhot1)
156 :
157 : #ifndef HAVE_CRPA_OPTIM
158 : #ifdef FC_INTEL
159 : #warning "optimization of m_prec_calc_ucrpa is deactivated on intel fortran"
160 : !DEC$ NOOPTIMIZE
161 : #endif
162 : #endif
163 :
164 : !Arguments ------------------------------------
165 : !scalars
166 : integer,intent(in) :: sigmak_ibz,ikcalc,itypatcor,prtvol,lpawu,minbnd,maxbnd,pawcross,plowan_compute
167 : type(crystal_t),intent(in) :: Cryst
168 : type(ebands_t),target,intent(in) :: QP_BSt
169 : type(kmesh_t),intent(in) :: Kmesh,Qmesh
170 : type(vcoul_t),intent(in) :: Vcp
171 : type(gsphere_t),intent(in) :: Gsph_x
172 : ! type(littlegroup_t),intent(in) :: Ltg_k
173 : type(Pseudopotential_type),intent(in) :: Psps
174 : type(sigparams_t),target,intent(in) :: Sigp
175 : type(pawang_type),intent(in) :: Pawang
176 : class(wfd_t),target,intent(inout) :: Wfd,Wfdf
177 : !arrays
178 : complex(dp), intent(out) :: rhot1_q_m(cryst%nattyp(itypatcor),Wfd%nspinor,Wfd%nspinor,2*lpawu+1,2*lpawu+1,sigp%npwx,Qmesh%nibz)
179 : complex(dp), intent(out) :: M1_q_m(cryst%nattyp(itypatcor),Wfd%nspinor,Wfd%nspinor,2*lpawu+1,2*lpawu+1,sigp%npwx,Qmesh%nibz)
180 : integer,intent(in) :: gwx_ngfft(18),ngfftf(18)
181 : type(Pawtab_type),intent(in) :: Pawtab(Psps%ntypat)
182 : type(pawpwff_t),intent(in) :: Paw_pwff(Psps%ntypat*Psps%usepaw)
183 : type(esymm_t),target,intent(in) :: allQP_sym(Wfd%nkibz,Wfd%nsppol)
184 : type(pawfgrtab_type),intent(inout) :: Pawfgrtab(Cryst%natom*Psps%usepaw)
185 : type(paw_pwaves_lmn_t),intent(in) :: Paw_onsite(Cryst%natom)
186 : type(plowannier_type),intent(in) :: wanbz
187 : type(operwan_realspace_type),target,intent(inout) :: rhot1(Sigp%npwx,Qmesh%nibz)
188 :
189 : !Local variables ------------------------------
190 : !scalars
191 : integer,parameter :: use_pawnhat=0,ider0=0,ndat1=1
192 : integer :: bandinf,bandsup
193 : integer :: gwcalctyp,izero,ib_sum,ib,ib1,ib2,ig,ig_rot,ii,iik,itim_q,i2
194 : integer :: ik_bz,ik_ibz,isym_q,iq_bz,iq_ibz,spin,isym,itypatcor_read,jb,iat
195 : integer :: jik,jk_bz,jk_ibz,lcor,m1,m3,nspinor,nsppol,ifft
196 : integer :: ibsp,dimcprj_gw
197 : integer :: spad
198 : integer :: comm
199 : integer :: ispinor1,ispinor3,isym_kgw,isym_ki,gwx_mgfft,use_padfft,use_padfftf,gwx_fftalga,gwx_fftalgb
200 : integer :: gwx_nfftot,nfftf,mgfftf,ierr
201 : integer :: nhat12_grdim
202 : integer :: iatom1,iatom2,il1,il2,im1,im2,ispinor2,pos1,pos2,wan_jb,wan_ib_sum,pwx
203 : real(dp) :: fact_sp,theta_mu_minus_esum,tol_empty,norm,weight
204 : complex(dp) :: ctmp,scprod,ph_mkgwt,ph_mkt,eikr
205 : logical :: iscompatibleFFT,q_is_gamma
206 : character(len=500) :: msg
207 : type(wave_t),pointer :: wave_sum, wave_jb
208 : !arrays
209 : integer :: g0(3),spinor_padx(2,4)
210 0 : integer,pointer :: igfftxg0(:),igfftfxg0(:)
211 0 : integer,allocatable :: gwx_gfft(:,:),gwx_gbound(:,:),gboundf(:,:)
212 0 : integer,allocatable :: ktabr(:,:),irottb(:,:),ktabrf(:,:)
213 : real(dp) :: ksum(3),kgw(3),kgw_m_ksum(3),qbz(3),q0(3),tsec(2)
214 : real(dp) :: spinrot_kbz(4),spinrot_kgw(4)
215 0 : real(dp),pointer :: qp_ene(:,:,:),qp_occ(:,:,:)
216 0 : real(dp),allocatable :: nhat12(:,:,:),grnhat12(:,:,:,:)
217 0 : complex(gwp),allocatable :: vc_sqrt_qbz(:)
218 0 : complex(gwp),allocatable :: rhotwg_ki(:,:)
219 0 : complex(gwp),allocatable :: wfr_bdgw(:,:),wfr_sum(:)
220 0 : complex(gwp),allocatable :: ur_ae_sum(:),ur_ae_onsite_sum(:),ur_ps_onsite_sum(:)
221 0 : complex(gwp),allocatable :: ur_ae_bdgw(:,:),ur_ae_onsite_bdgw(:,:),ur_ps_onsite_bdgw(:,:)
222 0 : complex(gwp),pointer :: cg_jb(:),cg_sum(:)
223 : complex(dp) :: ovlp(2)
224 0 : complex(dp),allocatable :: coeffW_BZ(:,:,:,:,:,:)
225 0 : complex(dp),pointer :: ptr_rhot(:,:,:,:,:)
226 0 : logical :: can_symmetrize(Wfd%nsppol)
227 0 : logical,allocatable :: bks_mask(:,:,:)
228 0 : type(pawcprj_type),allocatable :: Cprj_kgw(:,:),Cprj_ksum(:,:)
229 0 : type(pawpwij_t),allocatable :: Pwij_qg(:),Pwij_fft(:)
230 0 : type(esymm_t),pointer :: QP_sym(:)
231 : !type(plowannier_type) :: wan
232 : logical :: ecriture=.FALSE.
233 : logical :: l_ucrpa,luwindow
234 : integer :: g0_dump(3),iq_ibz_dump,dumint(2)
235 :
236 : !************************************************************************
237 :
238 0 : l_ucrpa=.true.
239 :
240 : DBG_ENTER("COLL")
241 :
242 : !
243 : ! === Initial check ===
244 0 : ABI_CHECK(Sigp%npwx==Gsph_x%ng,'')
245 :
246 0 : call timab(430,1,tsec) ! csigme (SigX)
247 :
248 0 : gwcalctyp=Sigp%gwcalctyp
249 : !
250 : ! === Initialize MPI variables ===
251 0 : comm = Wfd%comm
252 :
253 : !
254 : ! === Initialize some values ===
255 0 : nspinor = Wfd%nspinor
256 0 : nsppol = Wfd%nsppol
257 0 : spinor_padx(:,:)=RESHAPE((/0,0,Sigp%npwx,Sigp%npwx,0,Sigp%npwx,Sigp%npwx,0/),(/2,4/))
258 :
259 0 : qp_ene => QP_BSt%eig(:,:,:)
260 0 : qp_occ => QP_BSt%occ(:,:,:)
261 :
262 : ! Exctract the symmetries of the bands for this k-point
263 0 : QP_sym => allQP_sym(sigmak_ibz,1:nsppol)
264 :
265 0 : ib1=minbnd
266 0 : ib2=maxbnd
267 :
268 : ! === Read Wannier function coefficients for Ucrpa
269 : ! === for future computation of rhot_m_q directly in this routine.
270 :
271 0 : dumint=0
272 0 : luwindow=.true.
273 : ! write(6,*) "cc",allocated(coeffW_BZ)
274 0 : if (plowan_compute <10)then
275 : call read_plowannier(Cryst,bandinf,bandsup,coeffW_BZ,itypatcor_read,Kmesh,lcor,luwindow,&
276 0 : & nspinor,nsppol,pawang,prtvol,dumint)
277 0 : if(lcor/=lpawu) then
278 0 : msg = "lcor and lpawu differ in prep_calc_ucrpa"
279 0 : ABI_ERROR(msg)
280 : endif
281 : endif
282 :
283 : ! === End of read Wannier function coefficients for Ucrpa
284 :
285 :
286 : !
287 : ! === Index of the GW point in the BZ array, its image in IBZ and time-reversal ===
288 0 : jk_bz=Sigp%kptgw2bz(ikcalc)
289 : !write(6,*) "ikcalc,jk_bz",ikcalc,jk_bz
290 : !write(6,*) "ikcalc",Kmesh%bz(:,ikcalc)
291 : !write(6,*) "jk_bz",Kmesh%bz(:,jk_bz)
292 : ! jk_bz=ikcalc
293 0 : call kmesh%get_BZ_item(jk_bz,kgw,jk_ibz,isym_kgw,jik,ph_mkgwt)
294 : ! write(6,*) "jk_ibz",Kmesh%ibz(:,jk_ibz)
295 : ! write(6,*) "jk_bz,jk_ibz",jk_bz,jk_ibz,isym_kgw,itim
296 : !%call get_IBZ_item(Kmesh,jk_ibz,kibz,wtk)
297 0 : spinrot_kgw(:)=Cryst%spinrot(:,isym_kgw)
298 : !
299 0 : write(msg,'(2a,3f8.3,a,i4,a,2(i3,a))')ch10,&
300 0 : & ' Calculating Oscillator element at k= ',kgw, "k-point number",ikcalc,&
301 0 : & ' bands n = from ',ib1,' to ',ib2,ch10
302 0 : call wrtout(std_out,msg,'COLL')
303 :
304 :
305 0 : if (ANY(gwx_ngfft(1:3) /= Wfd%ngfft(1:3)) ) then
306 0 : call wfd%change_ngfft(Cryst,Psps,gwx_ngfft)
307 : end if
308 0 : gwx_mgfft = MAXVAL(gwx_ngfft(1:3))
309 0 : gwx_fftalga = gwx_ngfft(7)/100
310 0 : gwx_fftalgb = MOD(gwx_ngfft(7),100)/10
311 :
312 0 : if (pawcross==1) then
313 0 : mgfftf = MAXVAL(ngfftf(1:3))
314 : end if
315 :
316 0 : can_symmetrize = .FALSE.
317 0 : if (Sigp%symsigma>0) then
318 0 : can_symmetrize = .TRUE.
319 0 : if (gwcalctyp >= 20) then
320 0 : do spin=1,Wfd%nsppol
321 0 : can_symmetrize(spin) = .not. QP_sym(spin)%failed()
322 0 : if (.not.can_symmetrize(spin)) then
323 : write(msg,'(a,i0,4a)')&
324 0 : " Symmetrization cannot be performed for spin: ",spin,ch10,&
325 0 : " band classification encountered the following problem: ",ch10,TRIM(QP_sym(spin)%err_msg)
326 0 : ABI_WARNING(msg)
327 : end if
328 : end do
329 : end if
330 0 : ABI_CHECK(nspinor==1,'Symmetrization with nspinor=2 not implemented')
331 : end if
332 :
333 0 : ABI_MALLOC(rhotwg_ki,(Sigp%npwx*nspinor,minbnd:maxbnd))
334 0 : rhotwg_ki=czero_gw
335 0 : ABI_MALLOC(vc_sqrt_qbz,(Sigp%npwx))
336 : !
337 : ! === Normalization of theta_mu_minus_esum ===
338 : ! * If nsppol==2, qp_occ $\in [0,1]$
339 0 : SELECT CASE (nsppol)
340 : CASE (1)
341 0 : fact_sp=half; tol_empty=0.01 ! below this value the state is assumed empty
342 0 : if (Sigp%nspinor==2) then
343 0 : fact_sp=one; tol_empty=0.005 ! below this value the state is assumed empty
344 : end if
345 : CASE (2)
346 0 : fact_sp=one; tol_empty=0.005 ! to be consistent and obtain similar results if a metallic
347 : CASE DEFAULT ! spin unpolarized system is treated using nsppol==2
348 0 : ABI_BUG('Wrong nsppol')
349 : END SELECT
350 :
351 : ! Remove empty states from the list of states that will be distributed.
352 0 : ABI_MALLOC(bks_mask,(Wfd%mband,Kmesh%nbz,nsppol))
353 0 : bks_mask=.FALSE.
354 0 : do spin=1,nsppol
355 0 : do ik_bz=1,Kmesh%nbz
356 0 : ik_ibz = Kmesh%tab(ik_bz)
357 0 : do ib_sum=1,Sigp%nbnds
358 0 : bks_mask(ib_sum,ik_bz,spin) = (qp_occ(ib_sum,ik_ibz,spin)>=tol_empty)
359 : end do
360 : end do
361 : end do
362 :
363 : ! ABI_MALLOC(proc_distrb,(Wfd%mband,Kmesh%nbz,nsppol))
364 : ! call sigma_distribution(Wfd,Kmesh,Ltg_k,Qmesh,nsppol,can_symmetrize,kgw,Sigp%mg0,my_nbks,proc_distrb,bks_mask=bks_mask)
365 : ! call sigma_distribute_bks(Wfd,Kmesh,Ltg_k,Qmesh,nsppol,can_symmetrize,kgw,Sigp%mg0,my_nbks,proc_distrb,bks_mask=bks_mask)
366 : ! write(6,*)"lim", ib1,ib2
367 : ! do ib_sum= ib1,ib2
368 : ! do ik_bz=1, Kmesh%nbz
369 : ! write(6,*) ib_sum,ik_bz, proc_distrb(ib_sum,ik_bz,1),Wfd%my_rank
370 : ! enddo
371 : ! enddo
372 :
373 0 : ABI_FREE(bks_mask)
374 :
375 0 : write(msg,'(a,i8)')" Will sum all (b,k,s) occupied states in Sigma_x for k-point",ikcalc
376 0 : call wrtout(std_out,msg,'PERS')
377 : !
378 : ! The index of G-G0 in the FFT mesh the oscillators ===
379 : ! * Sigp%mG0 gives the MAX G0 component to account for umklapp.
380 : ! * Note the size MAX(Sigp%npwx,Sigp%npwc).
381 0 : ABI_MALLOC(igfftxg0,(Gsph_x%ng))
382 : !
383 : ! === Precalculate the FFT index of $ R^{-1}(r-\tau) $ ===
384 : ! * S=\transpose R^{-1} and k_BZ = S k_IBZ
385 : ! * irottb is the FFT index of $R^{-1} (r-\tau)$ used to symmetrize u_Sk.
386 0 : gwx_nfftot = PRODUCT(gwx_ngfft(1:3))
387 0 : ABI_MALLOC(irottb,(gwx_nfftot,Cryst%nsym))
388 0 : call rotate_FFT_mesh(Cryst%nsym,Cryst%symrel,Cryst%tnons,gwx_ngfft,irottb,iscompatibleFFT)
389 0 : if (.not.iscompatibleFFT) then
390 0 : msg = "FFT mesh is not compatible with symmetries. Results might be affected by large errors!"
391 0 : ABI_WARNING(msg)
392 : end if
393 :
394 0 : ABI_MALLOC(ktabr,(gwx_nfftot,Kmesh%nbz))
395 0 : do ik_bz=1,Kmesh%nbz
396 0 : isym=Kmesh%tabo(ik_bz)
397 0 : do ifft=1,gwx_nfftot
398 0 : ktabr(ifft,ik_bz)=irottb(ifft,isym)
399 : end do
400 : end do
401 0 : ABI_FREE(irottb)
402 :
403 0 : if (Psps%usepaw==1 .and. pawcross==1) then
404 0 : nfftf = PRODUCT(ngfftf(1:3))
405 0 : ABI_MALLOC(irottb,(nfftf,Cryst%nsym))
406 0 : call rotate_FFT_mesh(Cryst%nsym,Cryst%symrel,Cryst%tnons,ngfftf,irottb,iscompatibleFFT)
407 :
408 0 : ABI_MALLOC(ktabrf,(nfftf,Kmesh%nbz))
409 0 : do ik_bz=1,Kmesh%nbz
410 0 : isym=Kmesh%tabo(ik_bz)
411 0 : do ifft=1,nfftf
412 0 : ktabrf(ifft,ik_bz)=irottb(ifft,isym)
413 : end do
414 : end do
415 0 : ABI_FREE(irottb)
416 : end if
417 : !
418 : ! === Additional allocations for PAW ===
419 0 : if (Psps%usepaw==1) then
420 0 : ABI_MALLOC(Cprj_ksum,(Cryst%natom,nspinor))
421 0 : call pawcprj_alloc(Cprj_ksum,0,Wfd%nlmn_atm)
422 :
423 0 : nhat12_grdim=0
424 : if (use_pawnhat==1) then ! Compensation charge for \phi_a^*\phi_b
425 : call wrtout(std_out,"Using nhat12","COLL")
426 : ABI_MALLOC(nhat12 ,(2,gwx_nfftot,nspinor**2))
427 : ABI_MALLOC(grnhat12,(2,gwx_nfftot,nspinor**2,3*nhat12_grdim))
428 : end if
429 : end if ! usepaw==1
430 : !
431 :
432 : if (Sigp%symsigma>0) then
433 : !call littlegroup_print(Ltg_k,std_out,prtvol,'COLL')
434 : !
435 : ! === Find number of complexes and number of bands in each complex ===
436 : ! The tolerance is a little bit arbitrary (0.001 eV)
437 : ! It could be reduced, in particular in case of nearly accidental degeneracies
438 : ! if (ANY(degtab/=0)) then ! If two states do not belong to the same complex => matrix elements of v_xc differ
439 : ! write(msg,'(a,3f8.3,a)')' Degenerate states at k-point = ( ',kgw(:),' ).'
440 : ! call wrtout(std_out,msg,'COLL')
441 : ! do spin=1,nsppol
442 : ! do ib=ib1,ib2
443 : ! do jb=ib+1,ib2
444 : ! if (degtab(ib,jb,spin)==1) then
445 : ! write(msg,'(a,i2,a,i4,a,i4)')' (spin ',spin,')',ib,' <====> ',jb
446 : ! call wrtout(std_out,msg,'COLL')
447 : ! if (ABS(Sr%vxcme(ib,jk_ibz,spin)-Sr%vxcme(jb,jk_ibz,spin))>ABS(tol6*Sr%vxcme(jb,jk_ibz,spin))) then
448 : ! write(msg,'(7a)')&
449 : !& ' It seems that an accidental degeneracy is occurring at this k-point ',ch10,&
450 : !& ' In this case, using symsigma=1 might lead to spurious results as the algorithm ',ch10,&
451 : !& ' will treat these states as degenerate, and it won''t be able to remove the degeneracy. ',ch10,&
452 : !& ' In order to avoid this deficiency, run the calculation using symsigma=0'
453 : ! ABI_WARNING(msg)
454 : ! end if
455 : ! end if
456 : ! end do
457 : ! end do
458 : ! end do
459 : ! end if
460 : end if !symsigma
461 :
462 0 : ABI_MALLOC(wfr_sum,(gwx_nfftot*nspinor))
463 0 : if (pawcross==1) then
464 0 : ABI_MALLOC(ur_ae_sum,(nfftf*nspinor))
465 0 : ABI_MALLOC(ur_ae_onsite_sum,(nfftf*nspinor))
466 0 : ABI_MALLOC(ur_ps_onsite_sum,(nfftf*nspinor))
467 : end if
468 :
469 : !!*******************************************
470 : !! Save ik_bz and Norm of G vectors.
471 : !! FOR THE UCRPA calculation
472 : !!*******************************************
473 0 : if (ikcalc==1) then
474 0 : ecriture=.TRUE.
475 : ! open(unit=2011,file='ikbz_COORD',form='formatted',status='unknown')
476 : ! do ik_bz=1,Kmesh%nbz
477 : ! call get_BZ_item(Kmesh,ik_bz,&
478 : ! kbz_coord,ik_ibz,isym_kgw,iik,ph_mkt)
479 : ! write(2011,*) ik_bz,kbz_coord(:)
480 : ! end do
481 : ! close(2011)
482 :
483 : ! if (prtvol>10.and.jk_bz==1) then ! probably just to print one time.
484 : ! !!q=0 Forcement donc divergence pour G=0
485 : ! if (open_file("normeG", msg, unit=2022, form="formatted", status="unknown") /= 0) then
486 : ! ABI_ERROR(msg)
487 : ! end if
488 : ! write(2022,*) 1,real(CMPLX(SQRT(Vcp%i_sz),0.0_gwp)),real((4*3.14159265)**(0.5)/CMPLX(SQRT(Vcp%i_sz),0.0_gwp))
489 : ! write G=0 term for the potential computed elsewhere.
490 : !
491 : ! do ig=2,Sigp%npwx
492 : ! write(2022,*) ig,real(Vcp%vc_sqrt(ig,1)),real((4*3.14159265)**(0.5)/Vcp%vc_sqrt(ig,1))
493 : ! end do
494 : ! write potential for ig, q=0
495 : ! close(2022)
496 : ! end if
497 :
498 : ! write header for q point written later.
499 : ! if (Wfd%my_rank==0) then
500 : ! open(unit=2015,file='iqbz_COORD',form='formatted',status='unknown')
501 : ! write (2015,*) "q pour le k", jk_bz, ikcalc
502 : ! close(2015)
503 : ! endif
504 :
505 : else
506 0 : ecriture=.FALSE.
507 : end if
508 :
509 : !!*******************************************
510 : !! End of print if ik_bz for UCRPA calc
511 : !!*******************************************
512 :
513 : !
514 : ! =======================================
515 : ! ==== Begin loop over k_i in the BZ ====
516 : ! =======================================
517 :
518 0 : do spin=1,nsppol
519 :
520 : ! if (ALL(proc_distrb(:,:,spin)/=Wfd%my_rank)) CYCLE
521 : ! write(6,*) "AA",Wfd%my_rank,spin
522 : !
523 : ! * Load wavefunctions for GW corrections.
524 0 : ABI_STAT_MALLOC(wfr_bdgw,(gwx_nfftot*nspinor,ib1:ib2), ierr)
525 0 : ABI_CHECK(ierr==0, "out of memory in wfr_bdgw")
526 0 : do jb=ib1,ib2
527 0 : call wfd%get_ur(jb,jk_ibz,spin,wfr_bdgw(:,jb))
528 : ! write(6,'(a,6i4)')"indforwfd" ,jb,jk_ibz,spin
529 : end do
530 :
531 0 : if (Wfd%usepaw==1) then ! * Load cprj for GW states, note the indexing.
532 0 : dimcprj_gw=nspinor*(ib2-ib1+1)
533 0 : ABI_MALLOC(Cprj_kgw,(Cryst%natom,ib1:ib1+dimcprj_gw-1))
534 0 : call pawcprj_alloc(Cprj_kgw,0,Wfd%nlmn_atm)
535 0 : ibsp=ib1
536 0 : do jb=ib1,ib2
537 0 : call wfd%get_cprj(jb,jk_ibz,spin,Cryst,Cprj_ksum,sorted=.FALSE.)
538 0 : call paw_symcprj(jk_bz,nspinor,1,Cryst,Kmesh,Pawtab,Pawang,Cprj_ksum)
539 0 : call pawcprj_copy(Cprj_ksum,Cprj_kgw(:,ibsp:ibsp+(nspinor-1)))
540 0 : ibsp=ibsp+nspinor
541 : end do
542 0 : if (pawcross==1) then
543 0 : ABI_MALLOC(ur_ae_bdgw,(nfftf*nspinor,ib1:ib2))
544 0 : ABI_MALLOC(ur_ae_onsite_bdgw,(nfftf*nspinor,ib1:ib2))
545 0 : ABI_MALLOC(ur_ps_onsite_bdgw,(nfftf*nspinor,ib1:ib2))
546 0 : do jb=ib1,ib2
547 : call wfdf%paw_get_aeur(jb,jk_ibz,spin,Cryst,Paw_onsite,Psps,Pawtab,Pawfgrtab,&
548 0 : & ur_ae_sum,ur_ae_onsite_sum,ur_ps_onsite_sum)
549 0 : ur_ae_bdgw(:,jb)=ur_ae_sum
550 0 : ur_ae_onsite_bdgw(:,jb)=ur_ae_onsite_sum
551 0 : ur_ps_onsite_bdgw(:,jb)=ur_ps_onsite_sum
552 : end do
553 : end if
554 : end if
555 :
556 0 : do ik_bz=1,Kmesh%nbz
557 : !
558 : ! === Parallelization over k-points and spin ===
559 : ! * For the spin there is another check in the inner loop
560 : ! if (ALL(proc_distrb(:,ik_bz,spin)/=Wfd%my_rank)) CYCLE
561 : ! write(6,*) "BB",Wfd%my_rank,spin,ik_bz
562 : !
563 : ! * Find the corresponding irreducible k-point
564 0 : call kmesh%get_BZ_item(ik_bz,ksum,ik_ibz,isym_ki,iik,ph_mkt)
565 0 : spinrot_kbz(:)=Cryst%spinrot(:,isym_ki)
566 : ! write(6,'(a,6i4)')"indices" ,jk_bz,jk_ibz,ik_bz,ik_ibz,spin
567 :
568 : ! * Identify q and G0 where q+G0=k_GW-k_i
569 0 : kgw_m_ksum=kgw-ksum
570 : ! write(6,*) "kgw ",kgw
571 : ! write(6,*) "ksum ",ksum
572 0 : call findqg0(iq_bz,g0,kgw_m_ksum,Qmesh%nbz,Qmesh%bz,Sigp%mG0)
573 :
574 : ! if(iq_bz/=1.or.ik_bz/=1) cycle
575 : ! write(6,*) "g0",g0
576 : ! write(6,*) " ik_bz=",ik_bz
577 : ! write(6,*) " iq_bz=",iq_bz
578 :
579 : ! === Symmetrize the matrix elements ===
580 : ! * Sum only q"s in IBZ_k. In this case elements are weighted
581 : ! according to wtqp and wtqm. wtqm is for time-reversal.
582 : ! wtqp=1; wtqm=0
583 : ! if (can_symmetrize(spin)) then
584 : ! ! if (Ltg_k%ibzq(iq_bz)/=1) CYCLE
585 : ! wtqp=0; wtqm=0
586 : ! do isym=1,Ltg_k%nsym_sg
587 : ! wtqp=wtqp+Ltg_k%wtksym(1,isym,iq_bz)
588 : ! wtqm=wtqm+Ltg_k%wtksym(2,isym,iq_bz)
589 : ! end do
590 : ! end if
591 :
592 :
593 : !
594 : ! * Find the corresponding irreducible q-point.
595 0 : call qmesh%get_BZ_item(iq_bz,qbz,iq_ibz,isym_q,itim_q)
596 0 : q_is_gamma = (normv(qbz,Cryst%gmet,"G") < GW_TOLQ0)
597 :
598 : !!*******************************************
599 : !! Check if qbz belongs to IBZ.
600 : !! because dielectric matrix is computed in the IBZ.
601 : !! then output the q point.
602 : !!*******************************************
603 : ! write(6,*) "kkk1",ik_bz,jk_bz,iq_ibz
604 :
605 0 : if (.NOT. qmesh%has_IBZ_item(qbz,iq_ibz_dump,g0_dump)) then
606 : cycle
607 : end if
608 :
609 0 : write(msg,'(2(a,i4),a,i3)')' prep_calc_ucrpa : ik_bz ',ik_bz,'/',Kmesh%nbz,' done'
610 0 : call wrtout(std_out,msg,'PERS')
611 : ! write(6,*) "kkk1p",ik_bz,jk_bz,iq_ibz
612 :
613 : ! write(std_out,*)'prep_calc_ucrpa:ik_bz ',ik_bz,'/',Kmesh%nbz,' done by processor ',Wfd%my_rank,"iq_BZ",iq_bz,"iQ_iBZ",iq_ibz
614 : ! write(123,*)'prep_calc_ucrpa:jk_bz ',jk_bz,'ikmq_bz',ik_bz,'iq_ibz',iq_ibz
615 :
616 : !Ecriture du iq_ibz
617 : ! if (ecriture.and.Wfd%my_rank==0) then
618 : ! open(unit=2016,file='iqbz_COORD',form='formatted',status='unknown',position='append')
619 : ! write(2016,*) iq_ibz,qbz(:),Qmesh%wt(iq_ibz)
620 : ! ! write(2011,*) iq_bz,qbz(:)
621 : ! close(2016)
622 : ! end if
623 : !!*******************************************
624 : !! End of modif for UCRPA.
625 : !!*******************************************
626 :
627 : !
628 : ! Tables for the FFT of the oscillators.
629 : ! a) FFT index of the G-G0.
630 0 : ABI_MALLOC(gwx_gbound,(2*gwx_mgfft+8,2))
631 0 : call Gsph_x%fft_tabs(g0,gwx_mgfft,gwx_ngfft,use_padfft,gwx_gbound,igfftxg0)
632 :
633 0 : if ( ANY(gwx_fftalga == (/2,4/)) ) use_padfft=0 ! Pad-FFT is not coded in rho_tw_g
634 : #ifdef FC_IBM
635 : ! XLF does not deserve this optimization (problem with [v67mbpt][t03])
636 : use_padfft = 0
637 : #endif
638 0 : if (use_padfft==0) then
639 0 : ABI_FREE(gwx_gbound)
640 0 : ABI_MALLOC(gwx_gbound,(2*gwx_mgfft+8,2*use_padfft))
641 : end if
642 :
643 0 : if (pawcross==1) then
644 0 : ABI_MALLOC(gboundf,(2*mgfftf+8,2))
645 0 : ABI_MALLOC(igfftfxg0,(Gsph_x%ng))
646 0 : call Gsph_x%fft_tabs(g0,mgfftf,ngfftf,use_padfftf,gboundf,igfftfxg0)
647 0 : if ( ANY(gwx_fftalga == (/2,4/)) ) use_padfftf=0
648 0 : if (use_padfftf==0) then
649 0 : ABI_FREE(gboundf)
650 0 : ABI_MALLOC(gboundf,(2*mgfftf+8,2*use_padfftf))
651 : end if
652 : end if
653 : !
654 : ! === Evaluate oscillator matrix elements ===
655 : ! * $ <phj/r|e^{-i(q+G)}|phi/r> - <tphj/r|e^{-i(q+G)}|tphi/r> $ in packed form.
656 0 : if (Psps%usepaw==1.and.use_pawnhat==0) then
657 0 : q0 = qbz !;if (q_is_gamma) q0 = (/0.00001_dp,0.00001_dp,0.00001_dp/) ! GW_Q0_DEFAULT
658 0 : ABI_MALLOC(Pwij_qg,(Psps%ntypat))
659 0 : call pawpwij_init(Pwij_qg,Sigp%npwx,q0,Gsph_x%gvec,Cryst%rprimd,Psps,Pawtab,Paw_pwff)
660 : end if
661 : !
662 : ! === Get Fourier components of the Coulomb interaction in the BZ ===
663 : ! * In 3D systems, neglecting umklapp, vc(Sq,sG)=vc(q,G)=4pi/|q+G|
664 : ! * The same relation holds for 0-D systems, but not in 1-D or 2D systems. It depends on S.
665 0 : do ig=1,Sigp%npwx
666 0 : ig_rot = Gsph_x%rottb(ig,itim_q,isym_q)
667 0 : vc_sqrt_qbz(ig_rot)=Vcp%vc_sqrt(ig,iq_ibz)
668 : end do
669 : !
670 : ! write(6,*) "kkk2",ik_bz,jk_bz,iq_ibz
671 : ! === Sum over bands ===
672 : !do ib_sum=1,Sigp%nbnds
673 0 : do ib_sum=ib1,ib2
674 : !write(6,*) "ib_sum",ib_sum
675 : !
676 : ! === Parallelism over spin ===
677 : ! * This processor has this k-point but what about spin?
678 : ! if (proc_distrb(ib_sum,ik_bz,spin)/=Wfd%my_rank) CYCLE
679 : ! write(6,*) "CC",Wfd%my_rank,spin,ik_bz,ib_sum
680 : !
681 : ! * Skip empty states.
682 : !if (qp_occ(ib_sum,ik_ibz,spin)<tol_empty) CYCLE
683 :
684 0 : call wfd%get_ur(ib_sum,ik_ibz,spin,wfr_sum)
685 : ! write(6,'(a,3i4)')"indforwfd2" ,ib_sum,ik_ibz,spin
686 : ! write(6,*) wfd_ihave_ug(Wfd,ib_sum,ik_ibz,spin,"Stored")
687 : ! write(6,*) wfd_ihave_ur(Wfd,ib_sum,ik_ibz,spin,"Stored")
688 :
689 0 : if (Psps%usepaw==1) then ! Load cprj for point ksum, this spin or spinor and *THIS* band.
690 : ! TODO MG I could avoid doing this but I have to exchange spin and bands ???
691 : ! For sure there is a better way to do this!
692 0 : call wfd%get_cprj(ib_sum,ik_ibz,spin,Cryst,Cprj_ksum,sorted=.FALSE.)
693 0 : call paw_symcprj(ik_bz,nspinor,1,Cryst,Kmesh,Pawtab,Pawang,Cprj_ksum)
694 0 : if (pawcross==1) then
695 : call wfdf%paw_get_aeur(ib_sum,ik_ibz,spin,Cryst,Paw_onsite,Psps,Pawtab,Pawfgrtab,&
696 0 : & ur_ae_sum,ur_ae_onsite_sum,ur_ps_onsite_sum)
697 : end if
698 : end if
699 :
700 0 : do jb=ib1,ib2 ! Get all <k-q,ib_sum,s|e^{-i(q+G).r}|s,jb,k>
701 : ! if(ib_sum.ne.jb) cycle
702 : ! if(ib_sum.ne.1.and.ib_sum.ne.10) cycle
703 : ! write(6,*) "jb",jb
704 :
705 : if (Psps%usepaw==1.and.use_pawnhat==1) then
706 : i2=jb; if (nspinor==2) i2=(2*jb-1)
707 : spad=(nspinor-1)
708 :
709 : izero=0
710 : call pawmknhat_psipsi(Cprj_ksum,Cprj_kgw(:,i2:i2+spad),ider0,izero,Cryst%natom,&
711 : & Cryst%natom,gwx_nfftot,gwx_ngfft,nhat12_grdim,nspinor,Cryst%ntypat,1,1,Pawang,Pawfgrtab,&
712 : & grnhat12,nhat12,pawtab)
713 :
714 : #if 1
715 : msg = "reinstate optional Argument in rho_tw_g but mind inca slave!"
716 : ABI_ERROR(msg)
717 : #else
718 : call rho_tw_g(nspinor,Sigp%npwx,gwx_nfftot,ndat1,gwx_ngfft,1,use_padfft,igfftxg0,gwx_gbound,&
719 : & wfr_sum ,iik,ktabr(:,ik_bz),ph_mkt ,spinrot_kbz,&
720 : & wfr_bdgw(:,jb),jik,ktabr(:,jk_bz),ph_mkgwt,spinrot_kgw,&
721 : & nspinor,rhotwg_ki(:,jb),nhat12=nhat12)
722 : #endif
723 :
724 : else
725 : call rho_tw_g(nspinor,Sigp%npwx,gwx_nfftot,ndat1,gwx_ngfft,1,use_padfft,igfftxg0,gwx_gbound,&
726 : & wfr_sum ,iik,ktabr(:,ik_bz),ph_mkt ,spinrot_kbz,&
727 : & wfr_bdgw(:,jb),jik,ktabr(:,jk_bz),ph_mkgwt,spinrot_kgw,&
728 0 : & nspinor,rhotwg_ki(:,jb))
729 :
730 0 : if (Psps%usepaw==1.and.use_pawnhat==0) then ! Add on-site contribution, projectors are already in BZ.
731 0 : i2=jb; if (nspinor==2) i2=(2*jb-1)
732 0 : spad=(nspinor-1)
733 : call paw_rho_tw_g(cryst, Pwij_qg,Sigp%npwx,nspinor,nspinor,Gsph_x%gvec,&
734 0 : Cprj_ksum(:,:),Cprj_kgw(:,i2:i2+spad),rhotwg_ki(:,jb))
735 : end if
736 0 : if(iq_bz==1) then
737 0 : if((ib_sum/=jb).and.(abs(rhotwg_ki(1,jb))>tol8)) then
738 0 : if((ib_sum/=jb).and.(abs(rhotwg_ki(1,jb))>0.01_dp)) then
739 0 : write(std_out,*) "Warning: precision is low, oscillator strengh should be zero and is :",rhotwg_ki(1,jb)
740 : !else
741 : ! write(std_out,*) "Warning1: oscillator strengh",rhotwg_ki(1,jb)
742 : endif
743 : endif
744 0 : if((ib_sum==jb).and.(abs(rhotwg_ki(1,jb)-1_dp)>tol8)) then
745 0 : if((ib_sum==jb).and.(abs(rhotwg_ki(1,jb)-1_dp)>0.01_dp)) then
746 0 : write(std_out,*) "Warning: precision is low, oscillator strengh should be one and is :",rhotwg_ki(1,jb)
747 : !else
748 : ! write(std_out,*) "Warning1: oscillator strengh",rhotwg_ki(1,jb)
749 : endif
750 : endif
751 : endif
752 0 : if (Psps%usepaw==1.and.pawcross==1) then ! Add paw cross term
753 : call paw_cross_rho_tw_g(nspinor,Sigp%npwx,nfftf,ngfftf,1,use_padfftf,igfftfxg0,gboundf,&
754 : & ur_ae_sum,ur_ae_onsite_sum,ur_ps_onsite_sum,iik,ktabrf(:,ik_bz),ph_mkt,spinrot_kbz,&
755 : & ur_ae_bdgw(:,jb),ur_ae_onsite_bdgw(:,jb),ur_ps_onsite_bdgw(:,jb),jik,ktabrf(:,jk_bz),ph_mkgwt,spinrot_kgw,&
756 0 : & nspinor,rhotwg_ki(:,jb))
757 : end if
758 : end if
759 :
760 : ! ************************************8
761 : ! Compute M Matrix in Wannier basis
762 : ! ************************************8
763 :
764 0 : if (ib_sum.GE.ib1.AND.ib_sum.LE.ib2) then
765 0 : call flush_unit(std_out)
766 0 : call flush_unit(ab_out)
767 0 : if (plowan_compute <10)then
768 0 : do iat=1, cryst%nattyp(itypatcor)
769 0 : do ispinor1=1,nspinor
770 0 : do ispinor3=1,nspinor
771 0 : do m1=1,2*lcor+1
772 0 : do m3=1,2*lcor+1
773 : M1_q_m(iat,ispinor1,ispinor3,m1,m3,:,iq_ibz)=M1_q_m(iat,ispinor1,ispinor3,m1,m3,:,iq_ibz)+&
774 0 : & rhotwg_ki(:,jb)*coeffW_BZ(iat,spin,jb,jk_bz,ispinor3,m3)*conjg(coeffW_BZ(iat,spin,ib_sum,ik_bz,ispinor1,m1))
775 : enddo
776 : enddo
777 : enddo
778 : enddo
779 : enddo
780 : end if
781 : endif
782 : ! ************************************8
783 : ! ************************************8
784 : !
785 : ! === Multiply by the square root of the Coulomb term ===
786 : ! * In 3-D systems, the factor sqrt(4pi) is included)
787 0 : do ii=1,nspinor
788 0 : spad=(ii-1)*Sigp%npwx
789 : !!$omp parallel workshare
790 0 : rhotwg_ki(spad+1:spad+Sigp%npwx,jb)=rhotwg_ki(spad+1:spad+Sigp%npwx,jb)*vc_sqrt_qbz(1:Sigp%npwx)
791 : !!$omp end parallel workshare
792 : end do
793 : !
794 : ! === Treat analytically the case q --> 0 ===
795 : ! * The oscillator is evaluated at q=O as it is considered constant in the small cube around Gamma
796 : ! while the Colulomb term is integrated out.
797 : ! * In the scalar case we have nonzero contribution only if ib_sum==jb
798 : ! * For nspinor==2 evalute <ib_sum,up|jb,up> and <ib_sum,dwn|jb,dwn>,
799 : ! impose orthonormalization since npwwfn might be < npwvec.
800 0 : if (ik_bz==jk_bz) then
801 0 : if (nspinor==1) then
802 0 : rhotwg_ki(1,jb)=czero_gw
803 0 : if (ib_sum==jb) rhotwg_ki(1,jb)=CMPLX(SQRT(Vcp%i_sz),0.0_gwp)
804 : else
805 : ! TODO Recheck this!
806 0 : ABI_CHECK(wfd%get_wave_ptr(ib, ik_ibz, spin, wave_sum, msg) == 0, msg)
807 0 : cg_sum => wave_sum%ug
808 0 : ABI_CHECK(wfd%get_wave_ptr(jb, jk_ibz, spin, wave_jb, msg) == 0, msg)
809 0 : cg_jb => wave_jb%ug
810 :
811 0 : ctmp = xdotc(Wfd%npwarr(ik_ibz)*Wfd%nspinor,cg_sum,1,cg_jb,1)
812 0 : ovlp(1) = REAL(ctmp)
813 0 : ovlp(2) = AIMAG(ctmp)
814 :
815 0 : if (Psps%usepaw==1) then
816 0 : i2=(2*jb-1)
817 0 : ovlp = ovlp + paw_overlap(Cprj_ksum,Cprj_kgw(:,i2:i2+1),Cryst%typat,Pawtab)
818 : end if
819 : !ovlp(2) = -ovlp(1)
820 : !if (ib_sum==jb) ovlp(2)=cone_gw-ovlp(1)
821 0 : if (ib_sum==jb) then
822 0 : norm=DBLE(ovlp(1)+ovlp(2))
823 0 : ovlp(1)=DBLE(ovlp(1)/norm)
824 0 : ovlp(2)=DBLE(ovlp(2)/norm)
825 : else
826 0 : scprod=ovlp(1)+ovlp(2)
827 0 : ovlp(1)=ovlp(1)-scprod*half
828 0 : ovlp(2)=ovlp(2)-scprod*half
829 : end if
830 0 : rhotwg_ki(1 ,jb)=CMPLX(SQRT(Vcp%i_sz),0.0_gwp)*ovlp(1)
831 0 : rhotwg_ki(Sigp%npwx+1,jb)=CMPLX(SQRT(Vcp%i_sz),0.0_gwp)*ovlp(2)
832 : end if
833 : end if
834 :
835 : ! ************************************8
836 : ! compute rhotwidle in Wannier basis for UcRPA (summed over k)
837 : ! ************************************8
838 : ! if (cryst%nsym==1) then
839 0 : weight=one
840 : ! else
841 : ! weight=Kmesh%wt(jk_bz)
842 : ! endif
843 0 : if (ib_sum.GE.ib1.AND.ib_sum.LE.ib2) then
844 0 : call flush_unit(std_out)
845 0 : call flush_unit(ab_out)
846 0 : if (plowan_compute<10)then
847 0 : do iat=1, cryst%nattyp(itypatcor)
848 0 : do ispinor1=1,nspinor
849 0 : do ispinor3=1,nspinor
850 0 : do m1=1,2*lcor+1
851 0 : do m3=1,2*lcor+1
852 : if(m1==2.and.m3==2) then
853 : endif
854 : rhot1_q_m(iat,ispinor1,ispinor3,m1,m3,:,iq_ibz)=&
855 : &rhot1_q_m(iat,ispinor1,ispinor3,m1,m3,:,iq_ibz)+&
856 : &rhotwg_ki(:,jb)*coeffW_BZ(iat,spin,jb,jk_bz,ispinor3,m3)&
857 0 : &*conjg(coeffW_BZ(iat,spin,ib_sum,ik_bz,ispinor1,m1))*weight
858 : enddo
859 : enddo
860 : enddo
861 : enddo
862 : enddo
863 : else
864 0 : wan_jb=jb-wanbz%bandi_wan+1
865 0 : wan_ib_sum=ib_sum-wanbz%bandi_wan+1
866 0 : do pwx=1,sigp%npwx
867 0 : do iatom1=1,wanbz%natom_wan
868 0 : do iatom2=1,wanbz%natom_wan
869 : !Loig Vaugier PhD eq. 5.11
870 : eikr=exp(- cmplx(0.0,1.0) * two_pi * ( &
871 : kmesh%bz(1,ik_bz)* ( cryst%xred(1,wanbz%iatom_wan(iatom1)) - cryst%xred(1,wanbz%iatom_wan(iatom2)) )+&
872 : kmesh%bz(2,ik_bz)* ( cryst%xred(2,wanbz%iatom_wan(iatom1)) - cryst%xred(2,wanbz%iatom_wan(iatom2)) )+&
873 0 : kmesh%bz(3,ik_bz)* ( cryst%xred(3,wanbz%iatom_wan(iatom1)) - cryst%xred(3,wanbz%iatom_wan(iatom2)) )))
874 0 : do pos1=1,size(wanbz%nposition(iatom1)%pos,1)
875 0 : do pos2=1,size(wanbz%nposition(iatom2)%pos,1)
876 0 : do il1=1,wanbz%nbl_atom_wan(iatom1)
877 0 : do il2=1,wanbz%nbl_atom_wan(iatom2)
878 0 : ptr_rhot=>rhot1(pwx,iq_ibz)%atom_index(iatom1,iatom2)%position(pos1,pos2)%atom(il1,il2)%matl
879 0 : do im1=1,2*wanbz%latom_wan(iatom1)%lcalc(il1)+1
880 0 : do im2=1,2*wanbz%latom_wan(iatom2)%lcalc(il2)+1
881 0 : do ispinor1=1,wanbz%nspinor
882 0 : do ispinor2=1,wanbz%nspinor
883 : ptr_rhot(im1,im2,spin,ispinor1,ispinor2)=&
884 : &ptr_rhot(im1,im2,spin,ispinor1,ispinor2)+&
885 : &rhotwg_ki(pwx,jb)*wanbz%psichi(jk_bz,wan_jb,iatom1)%atom(il1)%matl(im1,spin,ispinor1)*&
886 : &conjg(wanbz%psichi(ik_bz,wan_ib_sum,iatom2)%atom(il2)%matl(im2,spin,ispinor2))*weight&
887 0 : *eikr
888 : enddo!im2
889 : enddo!im1
890 : enddo!il2
891 : enddo!il1
892 : enddo!pos2
893 : enddo!pos1
894 : enddo!iatom2
895 : enddo!iatom1
896 : enddo!ispinor2
897 : enddo!ispinor1
898 : enddo!pwx
899 : endif!plowan_compute<10
900 : end if
901 : ! ************************************8
902 : ! ************************************8
903 :
904 : end do !jb Got all matrix elements from minbnd up to maxbnd.
905 :
906 0 : theta_mu_minus_esum=fact_sp*qp_occ(ib_sum,ik_ibz,spin)
907 :
908 : end do !ib_sum
909 : !
910 : ! Deallocate k-dependent quantities.
911 0 : ABI_FREE(gwx_gbound)
912 0 : if (pawcross==1) then
913 0 : ABI_FREE(gboundf)
914 : end if
915 :
916 0 : if (Psps%usepaw==1.and.use_pawnhat==0) then
917 0 : call pawpwij_free(Pwij_qg)
918 0 : ABI_FREE(Pwij_qg)
919 : end if
920 :
921 : end do !ik_bz Got all diagonal (off-diagonal) matrix elements.
922 :
923 0 : ABI_FREE(wfr_bdgw)
924 0 : if (Wfd%usepaw==1) then
925 0 : call pawcprj_free(Cprj_kgw )
926 0 : ABI_FREE(Cprj_kgw)
927 0 : if (pawcross==1) then
928 0 : ABI_FREE(ur_ae_bdgw)
929 0 : ABI_FREE(ur_ae_onsite_bdgw)
930 0 : ABI_FREE(ur_ps_onsite_bdgw)
931 : end if
932 : end if
933 : end do !spin
934 :
935 0 : ABI_FREE(igfftxg0)
936 0 : if (pawcross==1) then
937 0 : ABI_FREE(igfftfxg0)
938 : end if
939 : !
940 : ! Gather contributions from all the CPUs.
941 : !
942 : ! ===========================
943 : ! ==== Deallocate memory ====
944 : ! ===========================
945 0 : if (Psps%usepaw==1) then
946 : if (allocated(gwx_gfft)) then
947 : ABI_FREE(gwx_gfft)
948 : end if
949 0 : call pawcprj_free(Cprj_ksum)
950 0 : ABI_FREE(Cprj_ksum)
951 0 : if (allocated(Pwij_fft)) then
952 0 : call pawpwij_free(Pwij_fft)
953 0 : ABI_FREE(Pwij_fft)
954 : end if
955 : if (use_pawnhat==1) then
956 : ABI_FREE(nhat12)
957 : ABI_FREE(grnhat12)
958 : end if
959 0 : if (pawcross==1) then
960 0 : ABI_FREE(ur_ae_sum)
961 0 : ABI_FREE(ur_ae_onsite_sum)
962 0 : ABI_FREE(ur_ps_onsite_sum)
963 0 : ABI_FREE(ktabrf)
964 : end if
965 : end if
966 :
967 0 : ABI_FREE(wfr_sum)
968 0 : ABI_FREE(rhotwg_ki)
969 0 : ABI_FREE(vc_sqrt_qbz)
970 0 : ABI_FREE(ktabr)
971 : ! ABI_FREE(proc_distrb)
972 0 : if (plowan_compute<10) then
973 0 : ABI_FREE(coeffW_BZ)
974 : endif
975 :
976 :
977 0 : call timab(430,2,tsec) ! csigme (SigX)
978 :
979 : DBG_EXIT("COLL")
980 :
981 0 : end subroutine prep_calc_ucrpa
982 : !!***
983 :
984 : END MODULE m_prep_calc_ucrpa
985 : !!***
|