Branch data Line data Source code
1 : : !!****m* ABINIT/m_dfpt_vtowfk
2 : : !! NAME
3 : : !! m_dfpt_vtowfk
4 : : !!
5 : : !! FUNCTION
6 : : !!
7 : : !! COPYRIGHT
8 : : !! Copyright (C) 1999-2026 ABINIT group (XG, AR, DRH, MB, MVer,XW, MT, GKA)
9 : : !! This file is distributed under the terms of the
10 : : !! GNU General Public License, see ~abinit/COPYING
11 : : !! or http://www.gnu.org/copyleft/gpl.txt .
12 : : !!
13 : : !! SOURCE
14 : :
15 : : #if defined HAVE_CONFIG_H
16 : : #include "config.h"
17 : : #endif
18 : :
19 : : #include "abi_common.h"
20 : :
21 : : ! nvtx related macro definition
22 : : #include "nvtx_macros.h"
23 : :
24 : : module m_dfpt_vtowfk
25 : :
26 : : use defs_basis
27 : : use m_abicore
28 : : use m_errors
29 : : use m_xmpi
30 : : use m_mpinfo
31 : : use m_cgtools
32 : : use m_wfk
33 : : use m_rf2
34 : : use m_dtset
35 : : use m_dtfil
36 : : use m_pawcprj
37 : :
38 : : use defs_datatypes, only : pseudopotential_type
39 : : use defs_abitypes, only : MPI_type
40 : : use m_rf2_init, only : rf2_init
41 : : use m_time, only : timab
42 : : use m_pawrhoij, only : pawrhoij_type
43 : : use m_hamiltonian, only : gs_hamiltonian_type, rf_hamiltonian_type, KPRIME_H_KPRIME
44 : : use m_spacepar, only : meanvalue_g
45 : : use m_dfpt_mkrho, only : dfpt_accrho
46 : : use m_dfpt_cgwf, only : dfpt_cgwf, full_active_wf1
47 : : use m_getghc, only : getgsc, getghc_nucdip, getghc_mGGA
48 : : use m_getgh1c, only : getgh1ndc, getgh1c_mGGA
49 : :
50 : : #if defined(HAVE_GPU_MARKERS)
51 : : use m_nvtx_data
52 : : #endif
53 : :
54 : : implicit none
55 : :
56 : : private
57 : : !!***
58 : :
59 : : public :: dfpt_vtowfk
60 : : !!***
61 : :
62 : : contains
63 : : !!***
64 : :
65 : : !!****f* ABINIT/dfpt_vtowfk
66 : : !! NAME
67 : : !! dfpt_vtowfk
68 : : !!
69 : : !! FUNCTION
70 : : !! This routine compute the partial density at a given k-point,
71 : : !! for a given spin-polarization, from a fixed potential (vlocal1).
72 : : !!
73 : : !! INPUTS
74 : : !! cg(2,mpw*nspinor*mband_mem*mkmem*nsppol)=planewave coefficients of wavefunctions
75 : : !! cgq(2,mcgq)=array for planewave coefficients of wavefunctions.
76 : : !! cg1(2,mpw1*nspinor*mband_mem*mk1mem*nsppol)=pw coefficients of RF wavefunctions at k,q.
77 : : !! cplex=1 if rhoaug1 is real, 2 if rhoaug1 is complex
78 : : !TODO MJV: PAW mband_mem
79 : : !! cprj(natom,nspinor*mband*mkmem*nsppol*usecprj)= wave functions at k
80 : : !! projected with non-local projectors: cprj=<p_i|Cnk>
81 : : !! cprjq(natom,mcprjq)= wave functions at k+q projected with non-local projectors: cprjq=<p_i|Cnk+q>
82 : : !! dim_eig2rf = dimension for the second order eigenvalues
83 : : !! dtfil <type(datafiles_type)>=variables related to files
84 : : !! dtset <type(dataset_type)>=all input variables for this dataset
85 : : !! eig0_k(nband_k)=GS eigenvalues at k (hartree)
86 : : !! eig0_kq(nband_k)=GS eigenvalues at k+Q (hartree)
87 : : !! fermie1=derivative of fermi energy wrt (strain) perturbation
88 : : !! grad_berry(2,mpw1,dtefield%mband_occ) = the gradient of the Berry phase term
89 : : !! gs_hamkq <type(gs_hamiltonian_type)>=all data for the Hamiltonian at k+q
90 : : !! ibg=shift to be applied on the location of data in the array cprj
91 : : !! ibgq=shift to be applied on the location of data in the array cprjq
92 : : !! ibg1=shift to be applied on the location of data in the array cprj1
93 : : !! icg=shift to be applied on the location of data in the array cg
94 : : !! icgq=shift to be applied on the location of data in the array cgq
95 : : !! icg1=shift to be applied on the location of data in the array cg1
96 : : !! idir=direction of the current perturbation
97 : : !! ikpt=k-point index number
98 : : !! ipert=type of the perturbation
99 : : !! isppol=1 index of current spin component
100 : : !! mband=maximum number of bands
101 : : !! mband_mem=maximum number of bands on this cpu
102 : : !! mcgq=second dimension of the cgq array
103 : : !! mcprjq=second dimension of the cprjq array
104 : : !! mkmem =number of k points trated by this node (GS data).
105 : : !! mk1mem =number of k points treated by this node (RF data)
106 : : !! mpi_enreg=information about MPI parallelization
107 : : !! mpw=maximum dimensioned size of npw or wfs at k
108 : : !! mpw1=maximum dimensioned size of npw for wfs at k+q (also for 1-order wfs).
109 : : !! natom=number of atoms in cell.
110 : : !! nband_k=number of bands at this k point for that spin polarization
111 : : !! ncpgr=number of gradients stored in cprj array (cprj=<p_i|Cnk>)
112 : : !! nnsclo_now=number of non-self-consistent loops for the current vtrial
113 : : !! (often 1 for SCF calculation, =nstep for non-SCF calculations)
114 : : !! npw_k=number of plane waves at this k point
115 : : !! npw1_k=number of plane waves at this k+q point
116 : : !! nspinor=number of spinorial components of the wavefunctions
117 : : !! nsppol=1 for unpolarized, 2 for spin-polarized
118 : : !! n4,n5,n6 used for dimensioning real space arrays
119 : : !! omega= frequency of the perturbation
120 : : !! occ_k(nband_k)=occupation number for each band (usually 2) for each k.
121 : : !! prtvol=control print volume and debugging output
122 : : !! psps <type(pseudopotential_type)>=variables related to pseudopotentials
123 : : !! rf_hamkq <type(rf_hamiltonian_type)>=all data for the 1st-order Hamiltonian at k,q
124 : : !! rf_hamk_dir2 <type(rf_hamiltonian_type)>= (used only when ipert=natom+11, so q=0)
125 : : !! same as rf_hamkq, but the direction of the perturbation is different
126 : : !! rhoaug1(cplex*n4,n5,n6,nspden)= density in electrons/bohr**3,
127 : : !! on the augmented fft grid. (cumulative, so input as well as output)
128 : : !! rocceig(nband_k,nband_k)= (occ_kq(m)-occ_k(n))/(eig0_kq(m)-eig0_k(n)),
129 : : !! if this ratio has been attributed to the band n (second argument), zero otherwise
130 : : !! ddk<wfk_t>=struct info for DDK file.
131 : : !! wtk_k=weight assigned to the k point.
132 : : !!
133 : : !! OUTPUT
134 : : !! cg1(2,mpw1*nspinor*mband_mem*mk1mem*nsppol)=pw coefficients of RF
135 : : !! wavefunctions at k,q. They are orthogonalized to the occupied states.
136 : : !! cg1_active(2,mpw1*nspinor*mband_mem*mk1mem*nsppol*dim_eig2rf)=pw coefficients of RF
137 : : !! wavefunctions at k,q. They are orthogonalized to the active. Only needed for ieigrf/=0
138 : : !! edocc_k(nband_k)=correction to 2nd-order total energy coming
139 : : !! from changes of occupation
140 : : !! eeig0_k(nband_k)=zero-order eigenvalues contribution to 2nd-order total
141 : : !! energy from all bands at this k point.
142 : : !! eig1_k(2*nband_k**2)=first-order eigenvalues (hartree)
143 : : !! ek0_k(nband_k)=0-order kinetic energy contribution to 2nd-order total
144 : : !! energy from all bands at this k point.
145 : : !! ek1_k(nband_k)=1st-order kinetic energy contribution to 2nd-order total
146 : : !! energy from all bands at this k point.
147 : : !! eloc0_k(nband_k)=zero-order local contribution to 2nd-order total energy
148 : : !! from all bands at this k point.
149 : : !! end0_k(nband_k)=0-order nuclear dipole energy contribution to 2nd-order total
150 : : !! energy from all bands at this k point.
151 : : !! end1_k(nband_k)=1st-order nuclear dipole energy contribution to 2nd-order total
152 : : !! energy from all bands at this k point.
153 : : !! enl0_k(nband_k)=zero-order non-local contribution to 2nd-order total energy
154 : : !! from all bands at this k point.
155 : : !! enl1_k(nband_k)=first-order non-local contribution to 2nd-order total energy
156 : : !! from all bands at this k point.
157 : : !! evxctau0_k(nband_k)=0-order vxctau energy contribution to 2nd-order total
158 : : !! energy from all bands at this k point.
159 : : !! evxctau1_k(nband_k)=1-order vxctau energy contribution to 2nd-order total
160 : : !! energy from all bands at this k point.
161 : : !! gh1c_set(2,mpw1*nspinor*mband_mem*mk1mem*nsppol*dim_eig2rf)= set of <G|H^{(1)}|nK>
162 : : !! gh0c1_set(2,mpw1*nspinor*mband_mem*mk1mem*nsppol*dim_eig2rf)= set of <G|H^{(0)}k+q-eig^{(0)}nk|\Psi^{(1)}kq>
163 : : !! The wavefunction is orthogonal to the active space (for metals). It is not coherent with cg1.
164 : : !! resid_k(nband_k)=residuals for each band over all k points,
165 : : !! rhoaug1(cplex*n4,n5,n6,nspden)= density in electrons/bohr**3,
166 : : !! on the augmented fft grid. (cumulative, so input as well as output).
167 : : !! ==== if (gs_hamkq%usepaw==1) ====
168 : : !TODO MJV: PAW mband_mem
169 : : !! cprj1(natom,nspinor*mband*mk1mem*nsppol*usecprj)=
170 : : !! 1st-order wave functions at k,q projected with non-local projectors:
171 : : !! cprj1=<p_i|C1nk,q> where p_i is a non-local projector
172 : : !! pawrhoij1(natom) <type(pawrhoij_type)>= 1st-order paw rhoij occupancies and related data
173 : : !! (cumulative, so input as well as output)
174 : : !!
175 : : !! SOURCE
176 : :
177 : 1690778 : subroutine dfpt_vtowfk(cg,cgq,cg1,cg1_active,cplex,cprj,cprjq,cprj1,&
178 : : & dim_eig2rf,dtfil,dtset,&
179 : 1690778 : & edocc_k,eeig0_k,eig0_k,eig0_kq,eig1_k,&
180 : 845389 : & ek0_k,ek1_k,eloc0_k,end0_k,end1_k,enl0_k,enl1_k,evxctau0_k,evxctau1_k,&
181 [ - + + + ]: 845389 : & fermie1,ffnl1,ffnl1_test,gh0c1_set,gh1c_set,grad_berry,gs_hamkq,&
182 : : & ibg,ibgq,ibg1,icg,icgq,icg1,idir,ikpt,ipert,&
183 : : & isppol,mband,mband_mem,mcgq,mcprjq,mkmem,mk1mem,&
184 : : & mpi_enreg,mpw,mpw1,natom,nband_k,ncpgr,&
185 : : & nnsclo_now,npw_k,npw1_k,nspinor,nsppol,&
186 : 845389 : & n4,n5,n6,occ_k,pawrhoij1,prtvol,psps,resid_k,rf_hamkq,rf_hamk_dir2,rhoaug1,rocceig,&
187 : : & ddk_f,wtk_k,nlines_done,cg1_out,eta,omega)
188 : :
189 : : !Arguments ------------------------------------
190 : : !scalars
191 : : integer,intent(in) :: cplex,dim_eig2rf,ibg
192 : : integer,intent(in) :: ibg1,ibgq,icg,icg1,icgq,idir,ikpt,ipert,isppol
193 : : integer,intent(in) :: mband,mcgq,mcprjq,mk1mem,mkmem
194 : : integer,intent(in) :: mband_mem
195 : : integer,intent(in) :: mpw,mpw1,n4,n5,n6,natom,ncpgr
196 : : integer,intent(in) :: nnsclo_now,nspinor,nsppol,prtvol
197 : : integer,optional,intent(in) :: cg1_out
198 : : integer,intent(in) :: nband_k,npw1_k,npw_k
199 : : integer,intent(inout) :: nlines_done
200 : : real(dp),intent(in) :: fermie1,wtk_k
201 : : real(dp),optional,intent(in) :: eta,omega
202 : : type(MPI_type),intent(in) :: mpi_enreg
203 : : type(datafiles_type),intent(in) :: dtfil
204 : : type(dataset_type),intent(in) :: dtset
205 : : type(gs_hamiltonian_type),intent(inout) :: gs_hamkq
206 : : type(rf_hamiltonian_type),intent(inout) :: rf_hamkq,rf_hamk_dir2
207 : : type(pseudopotential_type),intent(in) :: psps
208 : : !arrays
209 : : real(dp),intent(in) :: cg(2,mpw*nspinor*mband_mem*mkmem*nsppol),cgq(2,mcgq)
210 : : real(dp),intent(in) :: eig0_k(nband_k),eig0_kq(nband_k)
211 : : real(dp),intent(in) :: ffnl1(:,:,:,:),ffnl1_test(:,:,:,:)
212 : : real(dp),intent(in) :: grad_berry(2,mpw1*nspinor,nband_k)
213 : : real(dp),intent(in) :: occ_k(nband_k),rocceig(nband_k,nband_k)
214 : : real(dp),intent(inout) :: cg1(2,mpw1*nspinor*mband_mem*mk1mem*nsppol)
215 : : real(dp),intent(inout) :: rhoaug1(cplex*n4,n5,n6,gs_hamkq%nvloc)
216 : : real(dp),intent(inout) :: cg1_active(2,mpw1*nspinor*mband_mem*mk1mem*nsppol*dim_eig2rf)
217 : : real(dp),intent(inout) :: gh1c_set(2,mpw1*nspinor*mband_mem*mk1mem*nsppol*dim_eig2rf)
218 : : real(dp),intent(inout) :: gh0c1_set(2,mpw1*nspinor*mband_mem*mk1mem*nsppol*dim_eig2rf)
219 : : real(dp),intent(inout) :: edocc_k(nband_k),eeig0_k(nband_k),eig1_k(2*nband_k**2)
220 : : real(dp),intent(out) :: ek0_k(nband_k),eloc0_k(nband_k)
221 : : real(dp),intent(inout) :: ek1_k(nband_k)
222 : : real(dp),intent(out) :: end0_k(nband_k),end1_k(nband_k),enl0_k(nband_k),enl1_k(nband_k)
223 : : real(dp),intent(out) :: evxctau0_k(nband_k),evxctau1_k(nband_k)
224 : : real(dp),intent(out) :: resid_k(nband_k)
225 : : !TODO: PAW distrib bands mband_mem
226 : : type(pawcprj_type),intent(in) :: cprj(natom,nspinor*mband_mem*mkmem*nsppol*gs_hamkq%usecprj)
227 : : type(pawcprj_type),intent(in) :: cprjq(natom,mcprjq)
228 : : type(pawcprj_type),intent(inout) :: cprj1(natom,nspinor*mband_mem*mk1mem*nsppol*gs_hamkq%usecprj)
229 : : type(pawrhoij_type),intent(inout) :: pawrhoij1(natom*gs_hamkq%usepaw)
230 : : type(wfk_t),intent(inout) :: ddk_f(4)
231 : :
232 : : !Local variables-------------------------------
233 : : !scalars
234 : : integer,parameter :: level=14,tim_fourwf=5
235 : : integer,save :: nskip=0
236 : : integer :: iband,idir0,ierr,igs,igscq,ii,dim_dcwf,inonsc
237 : : integer :: iband_me,nband_me !, unit_me
238 : : integer :: iorder_cprj,iorder_cprj1,ipw,iscf_mod,ispinor,me,mgscq,nkpt_max
239 : : integer :: option,opt_gvnlx1,quit,test_ddk,ndat
240 : : integer :: tocceig,usedcwavef,ptr,shift_band
241 : : real(dp) :: aa,ai,ar,eig0nk,eta_,omega_,resid,residk,scprod,energy_factor
242 : : character(len=500) :: msg
243 : 845389 : type(rf2_t) :: rf2
244 : : !arrays
245 : 845389 : logical,allocatable :: cycle_bands(:)
246 : 2536167 : integer :: rank_band(nband_k), bands_treated_now(nband_k)
247 : : real(dp) :: tsec(2)
248 : 845389 : real(dp),allocatable :: cwave0(:,:),cwave1(:,:),cwavef(:,:)
249 : 845389 : real(dp),allocatable :: dcwavef(:,:),gh1c_n(:,:),gh0c1(:,:),ghc_vectornd(:,:)
250 : 845389 : real(dp),allocatable :: ghc_vxctau(:,:)
251 : 845389 : real(dp),allocatable :: gsc(:,:),gscq(:,:),gvnlx1(:,:),gvnlxc(:,:)
252 : 845389 : real(dp),pointer :: kinpw1(:)
253 : 845389 : type(pawcprj_type),allocatable :: cwaveprj(:,:),cwaveprj0(:,:),cwaveprj1(:,:)
254 : : ! *********************************************************************
255 : :
256 : : DBG_ENTER('COLL')
257 : :
258 : : ABI_NVTX_START_RANGE(NVTX_DFPT_VTOWFK)
259 : :
260 : : !Keep track of total time spent in dfpt_vtowfk
261 : 845389 : call timab(128,1,tsec)
262 : :
263 : 845389 : nkpt_max=50; if (xmpi_paral==1) nkpt_max=-1
264 : :
265 [ + + - + ]: 845389 : if(prtvol>2 .or. ikpt<=nkpt_max)then
266 : 51182 : write(msg,'(2a,i5,2x,a,3f9.5,2x,a)')ch10,' Non-SCF iterations; k pt #',ikpt,'k=',gs_hamkq%kpt_k(:),'band residuals:'
267 : 51182 : call wrtout(std_out,msg)
268 : : end if
269 : :
270 : : !Initializations and allocations
271 : 845389 : me=mpi_enreg%me_kpt
272 : 845389 : quit=0
273 : :
274 : : !The value of iscf must be modified if ddk perturbation
275 [ + + + + : 845389 : iscf_mod=dtset%iscf;if(ipert==natom+1.or.ipert==natom+10.or.ipert==natom+11) iscf_mod=-3
+ + ]
276 : :
277 : 845389 : kinpw1 => gs_hamkq%kinpw_kp
278 [ - + + - : 2536167 : ABI_MALLOC(gh0c1,(2,npw1_k*nspinor))
+ - + - -
+ - + ]
279 [ - + + - : 1690778 : ABI_MALLOC(gvnlxc,(2,npw1_k*nspinor))
- + - + ]
280 [ - + + - : 1690778 : ABI_MALLOC(gvnlx1,(2,npw1_k*nspinor))
- + - + ]
281 [ - + + - : 2536167 : ABI_MALLOC(cwave0,(2,npw_k*nspinor))
+ - + - -
+ - + ]
282 [ - + + - : 1690778 : ABI_MALLOC(cwavef,(2,npw1_k*nspinor))
- + - + ]
283 [ - + + - : 1690778 : ABI_MALLOC(cwave1,(2,npw1_k*nspinor))
- + - + ]
284 [ - + + - : 1690778 : ABI_MALLOC(gh1c_n,(2,npw1_k*nspinor))
- + - + ]
285 [ + + ]: 845389 : if (gs_hamkq%usepaw==1) then
286 [ - + + - : 226634 : ABI_MALLOC(gsc,(2,npw1_k*nspinor))
- + - + ]
287 : : else
288 [ - + ]: 732072 : ABI_MALLOC(gsc,(0,0))
289 : : end if
290 : :
291 [ + - ]: 845389 : omega_=zero; if(present(omega))omega_=omega
292 [ + - ]: 845389 : eta_=zero; if(present(eta))eta_=eta
293 : :
294 : : !Read the npw and kg records of wf files
295 : 845389 : test_ddk=0
296 : : if ((ipert==natom+2.and.sum((dtset%qptn(1:3))**2)<1.0d-7.and.&
297 : : & (dtset%berryopt/= 4.and.dtset%berryopt/= 6.and.dtset%berryopt/= 7.and.&
298 : : & dtset%berryopt/=14.and.dtset%berryopt/=16.and.dtset%berryopt/=17)).or.&
299 [ + + + + : 3381556 : & ipert==natom+10.or.ipert==natom+11) then
+ - + + +
+ + + ]
300 : 104202 : test_ddk=1
301 [ + + + + ]: 845389 : if(ipert==natom+10.or.ipert==natom+11) test_ddk=0
302 : : end if
303 : :
304 : : !Additional stuff for PAW
305 [ - + ]: 845389 : ABI_MALLOC(cwaveprj0,(0,0))
306 [ + + ]: 845389 : if (gs_hamkq%usepaw==1) then
307 : : ! 1-Compute all <g|S|Cnk+q>
308 : 113317 : igscq=0
309 : : !TODO MJV: PAW mband_mem
310 : 113317 : mgscq=mpw1*nspinor*mband_mem
311 [ - + + - : 339951 : ABI_MALLOC_OR_DIE(gscq,(2,mgscq), ierr)
+ - + - +
- - + -
+ ]
312 : : #ifdef HAVE_OPENMP_OFFLOAD
313 : : !$OMP TARGET ENTER DATA MAP(alloc:gscq) IF(gs_hamkq%gpu_option==ABI_GPU_OPENMP)
314 : : #endif
315 : :
316 : : ABI_NVTX_START_RANGE(NVTX_GETGSC)
317 : : call getgsc(cgq,cprjq,gs_hamkq,gscq,ibgq,icgq,igscq,ikpt,isppol,mcgq,mcprjq,&
318 : 113317 : & mgscq,mpi_enreg,dtset%bandpp,natom,nband_k,npw1_k,dtset%nspinor,select_k=KPRIME_H_KPRIME)
319 : : ABI_NVTX_END_RANGE()
320 : : ! 2-Initialize additional scalars/arrays
321 : 113317 : iorder_cprj=0;iorder_cprj1=0
322 [ + + + + : 113317 : dim_dcwf=npw1_k*nspinor;if (ipert==natom+2.or.ipert==natom+10.or.ipert==natom+11) dim_dcwf=0
+ + ]
323 [ + + + - : 339951 : ABI_MALLOC(dcwavef,(2,dim_dcwf))
+ - + + -
+ - + ]
324 [ + - ]: 113317 : if (gs_hamkq%usecprj==1) then
325 [ - + ]: 113317 : ABI_FREE(cwaveprj0)
326 [ - + + - : 808762 : ABI_MALLOC(cwaveprj0,(natom,nspinor))
- + + - +
- + - - +
- + + + +
+ ]
327 : 113317 : call pawcprj_alloc(cwaveprj0,1,gs_hamkq%dimcprj)
328 : : end if
329 [ - + + - : 808762 : ABI_MALLOC(cwaveprj,(natom,nspinor))
- + + - +
- + - - +
- + + + +
+ ]
330 [ - + + - : 695445 : ABI_MALLOC(cwaveprj1,(natom,nspinor))
- + + - -
+ - + + +
+ + ]
331 : 113317 : call pawcprj_alloc(cwaveprj ,0,gs_hamkq%dimcprj)
332 : 113317 : call pawcprj_alloc(cwaveprj1,0,gs_hamkq%dimcprj)
333 : : else
334 : 732072 : igscq=0;mgscq=0;dim_dcwf=0
335 [ - + ]: 732072 : ABI_MALLOC(gscq,(0,0))
336 [ - + ]: 732072 : ABI_MALLOC(dcwavef,(0,0))
337 [ - + ]: 732072 : ABI_MALLOC(cwaveprj,(0,0))
338 [ - + ]: 732072 : ABI_MALLOC(cwaveprj1,(0,0))
339 : : end if
340 : :
341 : 845389 : energy_factor=two
342 [ + + + + ]: 845389 : if(ipert==natom+10.or.ipert==natom+11) energy_factor=six
343 : :
344 : : !For rf2 perturbation :
345 [ + + + + ]: 845389 : if(ipert==natom+10.or.ipert==natom+11) then
346 : : call rf2_init(cg,cprj,rf2,dtset,dtfil,eig0_k,eig1_k,ffnl1,ffnl1_test,gs_hamkq,ibg,icg,idir,ikpt,ipert,isppol,mkmem,&
347 : 14616 : mpi_enreg,mpw,nband_k,nsppol,rf_hamkq,rf_hamk_dir2,occ_k,rocceig,ddk_f)
348 : : end if
349 : :
350 : 845389 : call timab(139,1,tsec)
351 : :
352 : : !======================================================================
353 : : !================== LOOP OVER BANDS ==================================
354 : : !======================================================================
355 : :
356 : 845389 : ndat=1;if (mpi_enreg%paral_kgb==1) ndat=mpi_enreg%bandpp
357 : : call proc_distrb_band(rank_band,mpi_enreg%proc_distrb,ikpt,isppol,mband,&
358 : 845389 : & mpi_enreg%me_band,mpi_enreg%me_kpt,mpi_enreg%comm_band)
359 : :
360 : 845389 : iband_me = 0
361 [ + + ]: 5296089 : do iband=1,nband_k
362 : :
363 : : ! Skip bands not treated by current proc
364 [ + + ]: 4450700 : if( (mpi_enreg%proc_distrb(ikpt, iband,isppol)/=me)) cycle
365 : 4444436 : iband_me = iband_me + 1
366 : :
367 : : !unit_me = 300+iband
368 : : !Get ground-state wavefunctions
369 : 4444436 : ptr = 1+(iband_me-1)*npw_k*nspinor+icg
370 : 4444436 : call cg_zcopy(npw_k*nspinor,cg(1,ptr),cwave0)
371 : :
372 : : ! Get PAW ground state projected WF (cprj)
373 [ + + + + : 4444436 : if (gs_hamkq%usepaw==1.and.gs_hamkq%usecprj==1.and.ipert/=natom+10.and.ipert/=natom+11) then
+ + ]
374 : 604076 : idir0 = idir
375 [ + + + + ]: 604076 : if(ipert==natom+3.or.ipert==natom+4) idir0 =1
376 : : ! PAW distributes cprj by band and k
377 : : call pawcprj_get(gs_hamkq%atindx1,cwaveprj0,cprj,natom,iband_me,ibg,ikpt,iorder_cprj,&
378 : : & isppol,mband_mem,mkmem,natom,1,nband_me,nspinor,nsppol,dtfil%unpaw,&
379 : : !& mpicomm=mpi_enreg%comm_kpt,proc_distrb=mpi_enreg%proc_distrb,&
380 : 604076 : & icpgr=idir0,ncpgr=ncpgr)
381 : : end if
382 : :
383 : : ! Get first-order wavefunctions
384 : 4444436 : ptr = 1+(iband_me-1)*npw1_k*nspinor+icg1
385 : 4444436 : call cg_zcopy(npw1_k*nspinor,cg1(1,ptr),cwavef)
386 : :
387 : : ! Read PAW projected 1st-order WF (cprj)
388 : : ! Unuseful for the time being (will be recomputed in dfpt_cgwf)
389 : : ! if (gs_hamkq%usepaw==1.and.gs_hamkq%usecprj==1) then
390 : : !TODO MJV: PAW
391 : : ! call pawcprj_get(gs_hamkq%atindx1,cwaveprj,cprj1,natom,iband,ibg1,ikpt,iorder_cprj1,&
392 : : ! & isppol,mband,mk1mem,natom,1,nband_k,nspinor,nsppol,dtfil%unpaw1,
393 : : ! & mpicomm=mpi_enreg%comm_kpt,proc_distrb=mpi_enreg%proc_distrb)
394 : : ! end if
395 : :
396 : : ! Filter the wavefunctions for large modified kinetic energy
397 : : ! The GS wavefunctions should already be non-zero
398 [ + + ]: 9032310 : do ispinor=1,nspinor
399 : 4587874 : igs=(ispinor-1)*npw1_k
400 [ + + ]: 857902296 : do ipw=1+igs,npw1_k+igs
401 [ - + ]: 853457860 : if(kinpw1(ipw-igs)>huge(zero)*1.d-20)then
402 : 0 : cwavef(1,ipw)=zero
403 : 0 : cwavef(2,ipw)=zero
404 : : end if
405 : : end do
406 : : end do
407 : :
408 : :
409 : : ! If electric field, the derivative of the wf should be read, and multiplied by i.
410 [ + + ]: 4444436 : if(test_ddk==1) then
411 : 414611 : ii = ddk_f(1)%findk(gs_hamkq%kpt_k)
412 [ - + ]: 414611 : ABI_CHECK(ii == ikpt, "ii != ikpt, something is wrong with k-point, check kptopt/ngkpt, etc")
413 : : !TODO MJV: check if this iband should be _me
414 : 414611 : call ddk_f(1)%read_bks(iband, ikpt, isppol, xmpio_single, cg_bks=gvnlx1)
415 : :
416 : : ! Multiplication by -i
417 : : ! MVeithen 021212 : use + i instead,
418 : : ! See X. Gonze, Phys. Rev. B 55, 10337 (1997) [[cite:Gonze1997]] Eq. (79)
419 : : ! the operator used to compute the first-order derivative
420 : : ! of the wavefunctions with respect to an electric field
421 : : ! is $+i \frac{d}{dk}$
422 : : ! This change will affect the computation of the 2dtes from non
423 : : ! stationary expressions, see dfpt_nstdy.f and dfpt_nstwf.f
424 [ + + ]: 57915906 : do ipw=1,npw1_k*nspinor
425 : : ! aa=gvnlx1(1,ipw)
426 : : ! gvnlx1(1,ipw)=gvnlx1(2,ipw)
427 : : ! gvnlx1(2,ipw)=-aa
428 : 57501295 : aa=gvnlx1(1,ipw)
429 : 57501295 : gvnlx1(1,ipw)=-gvnlx1(2,ipw)
430 : 57915906 : gvnlx1(2,ipw)=aa
431 : : end do
432 : : end if
433 : :
434 : : ! Unlike in GS calculations, the inonsc loop is inside the band loop
435 : : ! nnsclo_now=number of non-self-consistent loops for the current vtrial
436 : : ! (often 1 for SCF calculation, =nstep for non-SCF calculations)
437 [ + + ]: 8435951 : do inonsc=1,nnsclo_now
438 : :
439 : : ! Note that the following translation occurs in the called routine :
440 : : ! iband->band, nband_k->nband, npw_k->npw, npw1_k->npw1
441 : 4545799 : eig0nk=eig0_k(iband)
442 [ + + ]: 4545799 : usedcwavef=gs_hamkq%usepaw;if (dim_dcwf==0) usedcwavef=0
443 [ + + ]: 4545799 : if (inonsc==1) usedcwavef=2*usedcwavef
444 [ + + ]: 4545799 : opt_gvnlx1=0;if (ipert==natom+2) opt_gvnlx1=1
445 [ + + + + : 4545799 : if (ipert==natom+2.and.gs_hamkq%usepaw==1.and.inonsc==1) opt_gvnlx1=2
+ - ]
446 : :
447 [ + + + + : 4545799 : if ( (ipert/=natom+10 .and. ipert/=natom+11) .or. abs(occ_k(iband))>tol8 ) then
+ + ]
448 : 4539399 : nband_me = proc_distrb_nband(mpi_enreg%proc_distrb,ikpt,nband_k,isppol,me)
449 : :
450 [ + + ]: 40326625 : bands_treated_now = 0
451 : 4539399 : bands_treated_now(iband) = 1
452 : 4539399 : call xmpi_sum(bands_treated_now,mpi_enreg%comm_band,ierr)
453 : :
454 [ + + + + ]: 4539399 : if (dtset%rf2_dkdk==2 .and. (idir==1 .or. idir==2 .or. idir==3)) then
455 [ + + ]: 1584 : eig1_k = zero
456 : 48 : resid = zero
457 : : else
458 : : call dfpt_cgwf(iband,iband_me,rank_band,bands_treated_now,dtset%berryopt,cgq,cwavef,cwave0,cwaveprj,cwaveprj0,&
459 : : & rf2,dcwavef,&
460 : : & eig0_k,eig0_kq,eig1_k,gh0c1,gh1c_n,grad_berry,gsc,gscq,gs_hamkq,gvnlxc,gvnlx1,icgq,&
461 : : & idir,ipert,igscq,mcgq,mgscq,mpi_enreg,mpw1,natom,nband_k,nband_me,dtset%nbdbuf,dtset%nline,&
462 : : & npw_k,npw1_k,nspinor,opt_gvnlx1,prtvol,quit,resid,rf_hamkq,dtset%dfpt_sciss,dtset%tolrde,&
463 : 4539351 : & dtset%tolwfr,usedcwavef,dtset%wfoptalg,nlines_done,eta=eta_,omega=omega)
464 : : end if
465 : 4539399 : resid_k(iband)=resid
466 : :
467 : : else
468 : 6400 : resid_k(iband)=zero
469 : : end if
470 : :
471 [ + + + + ]: 4545799 : if (ipert/=natom+10 .and. ipert/= natom+11) then
472 : : ! At this stage, the 1st order function cwavef is orthogonal to cgq (unlike
473 : : ! when it is input to dfpt_cgwf). Here, restore the "active space" content
474 : : ! of the first-order wavefunction, to give cwave1.
475 : : ! PAW: note that dcwavef (1st-order change of WF due to overlap change)
476 : : ! remains in the subspace orthogonal to cgq
477 [ - + ]: 4479639 : call proc_distrb_cycle_bands(cycle_bands, mpi_enreg%proc_distrb,ikpt,isppol,me)
478 [ + + ]: 4479639 : if (dtset%prtfull1wf > 0) then
479 : : call full_active_wf1(cgq,cprjq,cwavef,cwave1,cwaveprj,cwaveprj1,cycle_bands,eig1_k,fermie1,&
480 : : eig0nk,eig0_kq,dtset%elph2_imagden,iband,ibgq,icgq,mcgq,mcprjq,mpi_enreg,natom,nband_k,npw1_k,nspinor,&
481 : 573 : 0,gs_hamkq%usepaw)
482 [ + + ]: 14325 : edocc_k=zero
483 : 573 : tocceig=1
484 : : else
485 : : call corrmetalwf1(cgq,cprjq,cwavef,cwave1,cwaveprj,cwaveprj1,cycle_bands,edocc_k,eig1_k,fermie1,gh0c1,&
486 : : iband,ibgq,icgq,gs_hamkq%istwf_k,mcgq,mcprjq,mpi_enreg,natom,nband_k,npw1_k,nspinor,&
487 : 4479066 : occ_k,rocceig,0,gs_hamkq%usepaw,tocceig)
488 : : end if
489 [ - + ]: 4479639 : ABI_FREE (cycle_bands)
490 : : else
491 : 66160 : tocceig=0
492 : 66160 : call cg_zcopy(npw1_k*nspinor,cwavef,cwave1)
493 [ + + ]: 66160 : if (gs_hamkq%usepaw==1) then
494 : 8960 : call pawcprj_copy(cwaveprj,cwaveprj1)
495 : : end if
496 : : end if
497 : :
498 [ + + ]: 4545799 : if (abs(occ_k(iband))<= tol8) then
499 : 1167962 : ek0_k(iband)=zero
500 : 1167962 : ek1_k(iband)=zero
501 : 1167962 : eeig0_k(iband)=zero
502 : 1167962 : end0_k(iband)=zero
503 : 1167962 : end1_k(iband)=zero
504 : 1167962 : enl0_k(iband)=zero
505 : 1167962 : enl1_k(iband)=zero
506 : 1167962 : eloc0_k(iband)=zero
507 : 1167962 : evxctau0_k(iband)=zero
508 : 1167962 : evxctau1_k(iband)=zero
509 : 1167962 : nskip=nskip+1
510 : : else
511 : : ! Compute the 0-order kinetic operator contribution (with cwavef)
512 : : call meanvalue_g(ar,kinpw1,0,gs_hamkq%istwf_k,mpi_enreg,npw1_k,nspinor,cwavef,cwavef,0,&
513 [ - + ]: 3377837 : & gpu_thread_limit=dtset%gpu_thread_limit)
514 : : ! There is an additional factor of 2 with respect to the bare matrix element
515 : 3377837 : ek0_k(iband)=energy_factor*ar
516 : : ! Compute the 1-order kinetic operator contribution (with cwave1 and cwave0), if needed.
517 : : ! Note that this is called only for ddk or strain, so that npw1_k=npw_k
518 [ + + + + : 3377837 : if(ipert==natom+1 .or. ipert==natom+3 .or. ipert==natom+4)then
+ + ]
519 : : call matrixelmt_g(ai,ar,rf_hamkq%dkinpw_k,gs_hamkq%istwf_k,0,npw_k,nspinor,cwave1,cwave0,&
520 : 961968 : & mpi_enreg%me_g0, mpi_enreg%comm_fft)
521 : : ! There is an additional factor of 4 with respect to the bare matrix element
522 : 961968 : ek1_k(iband)=two*energy_factor*ar
523 : : end if
524 : :
525 : : ! Compute the 0-order nuclear dipole contribution (with cwavef)
526 : : ! only relevant for DDK
527 [ + + + + ]: 3377837 : if( (ipert .EQ. natom+1) .AND. (ASSOCIATED(gs_hamkq%vectornd)) ) then
528 [ - + + - : 223020 : ABI_MALLOC(ghc_vectornd,(2,npw_k*nspinor))
+ - + - -
+ - + ]
529 : : ! ndat hard-coded as 1
530 : : call getghc_nucdip(cwavef,ghc_vectornd,gs_hamkq%gbound_k,gs_hamkq%istwf_k,gs_hamkq%kg_k,gs_hamkq%kpt_k,&
531 : : & gs_hamkq%mgfft,mpi_enreg,1,gs_hamkq%ngfft,npw_k,gs_hamkq%nvloc,&
532 [ + - - - : 74340 : & gs_hamkq%n4,gs_hamkq%n5,gs_hamkq%n6,nspinor,gs_hamkq%vectornd,gs_hamkq%vlocal,gs_hamkq%zora,gs_hamkq%gpu_option)
- - - - -
+ - - - -
- - - - -
- - - + -
- - - - -
- - - - -
- + - + -
- - - - -
- - - - -
+ - - - -
- - - - ]
533 : : ! There is an additional factor of 2 with respect to the bare matrix element
534 : : end0_k(iband)=energy_factor*(DOT_PRODUCT(cwavef(1,1:npw_k*nspinor),ghc_vectornd(1,1:npw_k*nspinor))+&
535 [ + + + + ]: 36419100 : & DOT_PRODUCT(cwavef(2,1:npw_k*nspinor),ghc_vectornd(2,1:npw_k*nspinor)))
536 [ - + ]: 74340 : ABI_FREE(ghc_vectornd)
537 : : end if
538 : :
539 : : ! Compute the 0-order vxctau contribution (with cwavef)
540 : : ! only relevant for DDK
541 [ + + + + ]: 3377837 : if( (ipert .EQ. natom+1) .AND. (ASSOCIATED(gs_hamkq%vxctaulocal)) ) then
542 [ - + + - : 24192 : ABI_MALLOC(ghc_vxctau,(2,npw_k*nspinor))
+ - + - -
+ - + ]
543 : : ! ndat hard-coded as 1
544 : : call getghc_mGGA(cwavef,ghc_vxctau,gs_hamkq%gbound_k,gs_hamkq%gprimd,gs_hamkq%istwf_k,&
545 : : & gs_hamkq%kg_k,gs_hamkq%kpt_k,gs_hamkq%mgfft,mpi_enreg,1,gs_hamkq%ngfft,npw_k,&
546 : : & gs_hamkq%nvloc,gs_hamkq%n4,gs_hamkq%n5,gs_hamkq%n6,nspinor,gs_hamkq%vxctaulocal,&
547 [ + - - - : 8064 : & gs_hamkq%gpu_option)
- - - - -
+ - - - -
- - - - -
- - - - +
- + - - -
- - - - -
- - ]
548 : : ! There is an additional factor of 2 with respect to the bare matrix element
549 : : evxctau0_k(iband)=energy_factor*(DOT_PRODUCT(cwavef(1,1:npw_k*nspinor),ghc_vxctau(1,1:npw_k*nspinor))+&
550 [ + + + + ]: 3939264 : & DOT_PRODUCT(cwavef(2,1:npw_k*nspinor),ghc_vxctau(2,1:npw_k*nspinor)))
551 [ - + ]: 8064 : ABI_FREE(ghc_vxctau)
552 : : end if
553 : :
554 : : ! Compute the 1-order nuclear dipole contribution (with cwave1 and cwave0), if needed.
555 : : ! only relevant for DDK
556 [ + + + + ]: 3377837 : if( (ipert .EQ. natom+1) .AND. (ASSOCIATED(rf_hamkq%vectornd)) ) then
557 [ - + + - : 223020 : ABI_MALLOC(ghc_vectornd,(2,npw1_k*nspinor))
+ - + - -
+ - + ]
558 : : ! ndat hard-coded as 1
559 : : call getgh1ndc(cwave1,ghc_vectornd,gs_hamkq%gbound_k,gs_hamkq%istwf_k,gs_hamkq%kg_k,&
560 : : & gs_hamkq%mgfft,mpi_enreg,1,gs_hamkq%ngfft,npw1_k,gs_hamkq%nvloc,&
561 : : & gs_hamkq%n4,gs_hamkq%n5,gs_hamkq%n6,nspinor,rf_hamkq%vectornd,&
562 [ + - - - : 74340 : & gs_hamkq%vlocal,rf_hamkq%zora,gs_hamkq%gpu_option)
- - - - -
+ - - - -
- - - - -
- + - - -
- - - - -
- - - - +
- + - - -
- - - - -
- + - - -
- - - -
- ]
563 : : ! There is an additional factor of 4 with respect to the bare matrix element
564 : : end1_k(iband)=two*energy_factor*(DOT_PRODUCT(cwave0(1,1:npw_k*nspinor),ghc_vectornd(1,1:npw_k*nspinor))+&
565 [ + + + + ]: 36419100 : & DOT_PRODUCT(cwave0(2,1:npw_k*nspinor),ghc_vectornd(2,1:npw_k*nspinor)))
566 [ - + ]: 74340 : ABI_FREE(ghc_vectornd)
567 : : end if
568 : :
569 : : ! Compute the 1-order vxctau contribution (with cwave1 and cwave0), if needed.
570 : : ! only relevant for DDK
571 [ + + + + ]: 3377837 : if( (ipert .EQ. natom+1) .AND. (ASSOCIATED(rf_hamkq%vxctaulocal)) ) then
572 [ - + + - : 24192 : ABI_MALLOC(ghc_vxctau,(2,npw1_k*nspinor))
+ - + - -
+ - + ]
573 : : ! ndat hard-coded as 1
574 : : call getgh1c_mGGA(cwave1,gs_hamkq%gbound_k,ghc_vxctau,gs_hamkq%gmet,gs_hamkq%gprimd,idir,gs_hamkq%istwf_k,&
575 : : & gs_hamkq%kg_k,gs_hamkq%kpt_k,gs_hamkq%mgfft,mpi_enreg,nspinor,gs_hamkq%n4,gs_hamkq%n5,&
576 [ + - - - : 8064 : & gs_hamkq%n6,1,gs_hamkq%ngfft,npw_k,gs_hamkq%nvloc,rf_hamkq%vxctaulocal,gs_hamkq%gpu_option)
- - - - -
+ - - - -
- - - - -
- - - - +
- + - - -
- - - - -
- - ]
577 : : ! There is an additional factor of 4 with respect to the bare matrix element
578 : : evxctau1_k(iband)=two*energy_factor*(DOT_PRODUCT(cwave0(1,1:npw_k*nspinor),ghc_vxctau(1,1:npw_k*nspinor))+&
579 [ + + + + ]: 3939264 : & DOT_PRODUCT(cwave0(2,1:npw_k*nspinor),ghc_vxctau(2,1:npw_k*nspinor)))
580 [ - + ]: 8064 : ABI_FREE(ghc_vxctau)
581 : : end if
582 : : !
583 : : ! Compute eigenvalue part of total energy (with cwavef)
584 [ + + ]: 3377837 : if (gs_hamkq%usepaw==1) then
585 : : call dotprod_g(scprod,ai,gs_hamkq%istwf_k,npw1_k*nspinor,1,cwavef,gsc,mpi_enreg%me_g0,&
586 : 512911 : & mpi_enreg%comm_spinorfft)
587 : : else
588 : : call sqnorm_g(scprod,gs_hamkq%istwf_k,npw1_k*nspinor,cwavef,mpi_enreg%me_g0,&
589 : 2864926 : & mpi_enreg%comm_fft)
590 : : end if
591 : 3377837 : eeig0_k(iband)=-energy_factor*(eig0_k(iband)- (dtset%dfpt_sciss) +omega_)*scprod
592 : :
593 : : ! Compute nonlocal psp contributions to nonlocal energy:
594 : : ! <G|Vnl+VFockACE|C1nk(perp)> is contained in gvnlxc (with cwavef)
595 : : call dotprod_g(scprod,ai,gs_hamkq%istwf_k,npw1_k*nspinor,1,cwavef,gvnlxc,mpi_enreg%me_g0,&
596 : 3377837 : & mpi_enreg%comm_spinorfft)
597 : 3377837 : enl0_k(iband)=energy_factor*scprod
598 : :
599 [ + + + + ]: 3377837 : if(ipert/=natom+10.and.ipert/=natom+11) then
600 : : ! <G|Vnl1|Cnk> is contained in gvnlx1 (with cwave1)
601 : : ! gvnlx1 contains at this stage first order kinetic energy, first order nuclear dipole,
602 : : ! first order vxctau1
603 : : call dotprod_g(scprod,ai,gs_hamkq%istwf_k,npw1_k*nspinor,1,cwave1,gvnlx1,mpi_enreg%me_g0,&
604 : 3318077 : & mpi_enreg%comm_spinorfft)
605 : 3318077 : enl1_k(iband)=two*energy_factor*scprod
606 : : end if
607 : :
608 : : ! Removal of the 1st-order kinetic energy, dipole, and vxctau1 from the 1st-order non-local part.
609 : : ! note that in getgh1c, the "nonlocal" piece, gvnlx1, contains also first order
610 : : ! kinetic, nuclear dipole, and vxctau1
611 [ + + + + : 3377837 : if(ipert==natom+1 .or. ipert==natom+3 .or. ipert==natom+4) then
+ + ]
612 : 961968 : enl1_k(iband)=enl1_k(iband)-ek1_k(iband)-end1_k(iband)-evxctau1_k(iband)
613 : : end if
614 : :
615 : : ! Accumulate 1st-order density (only at the last inonsc)
616 : : ! Accumulate zero-order potential part of the 2nd-order total energy
617 : : ! BUGFIX from Max Stengel: need to initialize eloc at each inonsc iteration, in case nnonsc > 1
618 : 3377837 : eloc0_k(iband) = zero
619 [ + + + - ]: 3377837 : option=2;if (iscf_mod>0.and.inonsc==nnsclo_now) option=3
620 : : call dfpt_accrho(cplex,cwave0,cwave1,cwavef,cwaveprj0,cwaveprj1,eloc0_k(iband),&
621 : : & gs_hamkq,iband,idir,ipert,isppol,dtset%kptopt,mpi_enreg,1,natom,nband_k,ncpgr,&
622 : 3377837 : & npw_k,npw1_k,nspinor,occ_k,option,pawrhoij1,rhoaug1,tim_fourwf,tocceig,wtk_k)
623 [ + + + + ]: 3377837 : if(ipert==natom+10.or.ipert==natom+11) eloc0_k(iband)=energy_factor*eloc0_k(iband)/two
624 : :
625 [ + + + + ]: 3377837 : if(ipert==natom+10.or.ipert==natom+11) then
626 : 59760 : shift_band=(iband-1)*npw1_k*nspinor
627 : : call dotprod_g(scprod,ai,gs_hamkq%istwf_k,npw1_k*nspinor,1,cwave1,&
628 [ - + - - : 59760 : & rf2%RHS_Stern(:,1+shift_band:npw1_k*nspinor+shift_band),mpi_enreg%me_g0, mpi_enreg%comm_spinorfft)
- - - - -
+ ]
629 : 59760 : ek1_k(iband)=two*energy_factor*scprod
630 : : end if
631 : :
632 : : end if ! End of non-zero occupation
633 : :
634 : : ! Exit loop over inonsc if converged and non-self-consistent
635 [ + + + + ]: 8435951 : if (iscf_mod<0 .and. resid<dtset%tolwfr) exit
636 : :
637 : : end do ! End loop over inonsc
638 : :
639 : : ! Get first-order eigenvalues and wavefunctions
640 : 4444436 : ptr = 1+(iband_me-1)*npw1_k*nspinor+icg1
641 [ + + ]: 4444436 : if (.not. present(cg1_out)) then
642 : 4443284 : call cg_zcopy(npw1_k*nspinor,cwave1,cg1(1,ptr))
643 : : end if
644 [ + + ]: 4444436 : if(dim_eig2rf > 0) then
645 [ + + ]: 319143 : if (.not. present(cg1_out)) then
646 [ + + + + ]: 407758863 : cg1_active(:,1+(iband_me-1)*npw1_k*nspinor+icg1:iband_me*npw1_k*nspinor+icg1)=cwavef(:,:)
647 : : end if
648 [ + + + + ]: 408145791 : gh1c_set(:,1+(iband_me-1)*npw1_k*nspinor+icg1:iband_me*npw1_k*nspinor+icg1)=gh1c_n(:,:)
649 [ + + + + ]: 408145791 : gh0c1_set(:,1+(iband_me-1)*npw1_k*nspinor+icg1:iband_me*npw1_k*nspinor+icg1)=gh0c1(:,:)
650 : : end if
651 : :
652 : : ! PAW: write first-order projected wavefunctions
653 [ + + - + ]: 5289825 : if (psps%usepaw==1.and.gs_hamkq%usecprj==1) then
654 : : call pawcprj_put(gs_hamkq%atindx,cwaveprj,cprj1,natom,iband_me,ibg1,ikpt,iorder_cprj1,isppol,&
655 : 613036 : & mband_mem,mk1mem,natom,1,nband_me,gs_hamkq%dimcprj,nspinor,nsppol,dtfil%unpaw1)
656 : : !& mpicomm=mpi_enreg%comm_kpt,proc_distrb=mpi_enreg%proc_distrb,to_be_gathered=.true.)
657 : : end if
658 : :
659 : : end do
660 : :
661 : : !======================================================================
662 : : !================== END LOOP OVER BANDS ==============================
663 : : !======================================================================
664 : :
665 : : ! select eig1 matrix for only my slice of bands at present k-point
666 : : ! this enables global xmpi_sum in dfpt_vtorho without double counting
667 : 845389 : ii = 0
668 [ + + ]: 5296089 : do iband=1, nband_k
669 [ + + ]: 4450700 : if(mpi_enreg%proc_distrb(ikpt,iband,isppol)/=me) then
670 [ + + ]: 298296 : eig1_k(ii+1:ii+2*nband_k) = zero
671 : : end if
672 : 5296089 : ii = ii + 2*nband_k
673 : : end do
674 : :
675 : : ! call xmpi_sum(eig1_k,mpi_enreg%comm_band,ierr)
676 : :
677 : : ! NB: no need to sum eXX_k over band communicator here, as it is a sub-comm of kpt,
678 : : ! and full mpi_sum will be done higher up.
679 : :
680 : : !For rf2 perturbation
681 [ + + + + ]: 845389 : if(ipert==natom+10.or.ipert==natom+11) call rf2_destroy(rf2)
682 : :
683 : : !Find largest resid over bands at this k point
684 [ + - - + : 6141478 : residk=maxval(resid_k(:))
- - + + ]
685 [ + + - + ]: 845389 : if (prtvol>2 .or. ikpt<=nkpt_max) then
686 [ + + ]: 108110 : do ii=0,(nband_k-1)/8
687 : 56928 : write(msg,'(1p,8e10.2)')(resid_k(iband),iband=1+ii*8,min(nband_k,8+ii*8))
688 : 902317 : call wrtout(std_out,msg)
689 : : end do
690 : : end if
691 : :
692 : 845389 : call timab(139,2,tsec)
693 : 845389 : call timab(130,1,tsec)
694 : :
695 [ - + ]: 845389 : ABI_FREE(cwave0)
696 [ - + ]: 845389 : ABI_FREE(cwavef)
697 [ - + ]: 845389 : ABI_FREE(cwave1)
698 [ - + ]: 845389 : ABI_FREE(gh0c1)
699 [ - + ]: 845389 : ABI_FREE(gvnlxc)
700 [ - + ]: 845389 : ABI_FREE(gvnlx1)
701 [ - + ]: 845389 : ABI_FREE(gh1c_n)
702 : :
703 [ + + ]: 845389 : if (gs_hamkq%usepaw==1) then
704 : 113317 : call pawcprj_free(cwaveprj)
705 : 113317 : call pawcprj_free(cwaveprj1)
706 [ + - ]: 113317 : if (gs_hamkq%usecprj==1) then
707 : 113317 : call pawcprj_free(cwaveprj0)
708 : : end if
709 : : end if
710 [ - + ]: 845389 : ABI_FREE(dcwavef)
711 : : #ifdef HAVE_OPENMP_OFFLOAD
712 : : !$OMP TARGET EXIT DATA MAP(delete:gscq) IF(gs_hamkq%usepaw==1 .and. gs_hamkq%gpu_option==ABI_GPU_OPENMP)
713 : : #endif
714 [ - + ]: 845389 : ABI_FREE(gscq)
715 [ - + ]: 845389 : ABI_FREE(gsc)
716 [ + - + + : 1084452 : ABI_FREE(cwaveprj0)
- + - + -
+ ]
717 [ + - + + : 1084452 : ABI_FREE(cwaveprj)
- + - + -
+ ]
718 [ + - + + : 1084452 : ABI_FREE(cwaveprj1)
- + - + -
+ ]
719 : :
720 : :
721 : : !###################################################################
722 : :
723 : : ! Write the number of one-way 3D ffts skipped until now (in case of fixed occupation numbers)
724 : 845389 : call xmpi_sum(nskip,mpi_enreg%comm_band,ierr)
725 [ + + + + : 845389 : if (iscf_mod>0 .and. (prtvol>2 .or. ikpt<=nkpt_max)) then
- + ]
726 : 49882 : write(msg,'(a,i0)')' dfpt_vtowfk : number of one-way 3D ffts skipped in vtowfk3 until now =',nskip
727 : 49882 : call wrtout(std_out,msg)
728 : : end if
729 : :
730 [ + + - + ]: 845389 : if (prtvol<=2 .and. ikpt==nkpt_max+1) then
731 : 0 : write(msg,'(3a)') ch10,' dfpt_vtowfk : prtvol=0, 1 or 2, do not print more k-points.',ch10
732 : 0 : call wrtout(std_out,msg)
733 : : end if
734 : :
735 [ + + + + ]: 845389 : if (residk>dtset%tolwfr .and. iscf_mod<=0 .and. iscf_mod/=-3) then
736 : 5016 : write(msg,'(a,2i0,a,es13.5)')'Wavefunctions not converged for nnsclo,ikpt=',nnsclo_now,ikpt,' max resid=',residk
737 : 5016 : ABI_WARNING(msg)
738 : : end if
739 : :
740 : 845389 : call timab(130,2,tsec)
741 : 845389 : call timab(128,2,tsec)
742 : :
743 : : ABI_NVTX_END_RANGE()
744 : :
745 : : DBG_EXIT('COLL')
746 : :
747 [ - + - + : 2536167 : end subroutine dfpt_vtowfk
- + - + ]
748 : : !!***
749 : :
750 : : !!****f* ABINIT/corrmetalwf1
751 : : !!
752 : : !! NAME
753 : : !! corrmetalwf1
754 : : !!
755 : : !! FUNCTION
756 : : !! Response function calculation only:
757 : : !! Correct 1st-order wave-function, taking into account "metallic" occupations.
758 : : !! 1st-order WF orthogonal to C_n,k+q, restore the "active space" content of the first-order WF.
759 : : !! receives a single band at k as input, and works on all bands at k+q
760 : : !!
761 : : !! INPUTS
762 : : !! cgq(2,mcgq)=planewave coefficients of wavefunctions at k+q
763 : : !! cprjq(natom,mcprjq)= wave functions at k+q projected with non-local projectors
764 : : !! cwavef(2,npw1*nspinor)= 1st-order wave-function before correction
765 : : !! cwaveprj(natom,nspinor)= 1st-order wave-function before correction
766 : : !! projected on NL projectors (PAW)
767 : : !! cycle_bands(nband)=array of logicals for bands we have on this cpu
768 : : !! eig1(2*nband**2)=first-order eigenvalues (hartree)
769 : : !! fermie1=derivative of fermi energy wrt (strain) perturbation
770 : : !! ghc(2,npw1*nspinor)=<G|H0-eig0_k.I|C1 band,k> (NCPP) or <G|H0-eig0_k.S0|C1 band,k> (PAW)
771 : : !! (C1 before correction)
772 : : !! iband=index of current band
773 : : !! ibgq=shift to be applied on the location of data in the array cprjq
774 : : !! icgq=shift to be applied on the location of data in the array cgq
775 : : !! istwf_k=option parameter that describes the storage of wfs
776 : : !! mcgq=second dimension of the cgq array
777 : : !! mcprjq=second dimension of the cprjq array
778 : : !! mpi_enreg=information about MPI parallelization
779 : : !! natom=number of atoms in cell
780 : : !! nband=number of bands
781 : : !! npw1=number of plane waves at this k+q point
782 : : !! nspinor=number of spinorial components of the wavefunctions
783 : : !! occ(nband)=occupation number for each band for each k.
784 : : !! rocceig(nband,nband)= (occ_kq(m)-occ_k(n))/(eig0_kq(m)-eig0_k(n)),
785 : : !! if this ratio has been attributed to the band n (second argument), zero otherwise
786 : : !! timcount=index used to accumulate timing (0 from dfpt_vtowfk, 1 from dfpt_nstwf)
787 : : !! usepaw=flag for PAW
788 : : !!
789 : : !! OUTPUT
790 : : !! cwave1(2,npw1*nspinor)= 1st-order wave-function after correction
791 : : !! cwaveprj1(natom,nspinor)= 1st-order wave-function after correction
792 : : !! projected on NL projectors (PAW)
793 : : !! edocc(nband)=correction to 2nd-order total energy coming from changes of occupations
794 : : !! wf_corrected=flag put to 1 if input cwave1 is effectively different from output cwavef
795 : : !!
796 : : !! NOTES
797 : : !! Was part of dfpt_vtowfk before.
798 : : !!
799 : : !! SOURCE
800 : :
801 : 4479066 : subroutine corrmetalwf1(cgq,cprjq,cwavef,cwave1,cwaveprj,cwaveprj1,cycle_bands,edocc,eig1,fermie1,ghc,iband, &
802 : 4479066 : & ibgq,icgq,istwf_k,mcgq,mcprjq,mpi_enreg,natom,nband,npw1,nspinor,occ,rocceig,timcount,&
803 : : & usepaw,wf_corrected)
804 : :
805 : : !Arguments ------------------------------------
806 : : !scalars
807 : : integer,intent(in) :: iband,ibgq,icgq,istwf_k,mcgq,mcprjq,natom,nband,npw1,nspinor,timcount,usepaw
808 : : integer,intent(out) :: wf_corrected
809 : : real(dp),intent(in) :: fermie1
810 : : type(MPI_type),intent(in) :: mpi_enreg
811 : : !arrays
812 : : logical,intent(in) :: cycle_bands(nband)
813 : : real(dp),intent(in) :: cgq(2,mcgq),cwavef(2,npw1*nspinor)
814 : : real(dp),intent(in) :: eig1(2*nband**2),ghc(2,npw1*nspinor),occ(nband),rocceig(nband,nband)
815 : : real(dp),intent(out) :: cwave1(2,npw1*nspinor),edocc(nband)
816 : : type(pawcprj_type),intent(in) :: cprjq(natom,mcprjq),cwaveprj(natom,nspinor*usepaw)
817 : : type(pawcprj_type),intent(inout) :: cwaveprj1(natom,nspinor*usepaw) !vz_i
818 : :
819 : : !Local variables-------------------------------
820 : : !scalars
821 : : integer :: ibandkq,index_cgq,index_cprjq,index_eig1,ii
822 : : integer :: ibandkq_me, ierr, iband_
823 : : integer :: wf_corrected_
824 : : real(dp) :: facti,factr,invocc
825 : : real(dp) :: edocc_tmp
826 : : !arrays
827 : 8958132 : integer :: bands_treated_now(nband)
828 : 4479066 : integer, allocatable :: nlmn(:)
829 : : real(dp) :: tsec(2)
830 : 4479066 : real(dp),allocatable :: cwcorr(:,:)
831 [ + + + + : 16308092 : type(pawcprj_type) :: cwaveprj1_corr(natom,nspinor*usepaw)
+ + + + +
- + - ]
832 : : ! *********************************************************************
833 : :
834 : : DBG_ENTER("COLL")
835 : :
836 : 4479066 : call timab(214+timcount,1,tsec)
837 : :
838 [ + + ]: 39959100 : bands_treated_now = 0
839 : 4479066 : bands_treated_now(iband) = 1
840 : 4479066 : call xmpi_sum(bands_treated_now,mpi_enreg%comm_band,ierr)
841 : :
842 : : !At this stage, the 1st order function cwavef is orthogonal to cgq (unlike when it is input to dfpt_cgwf).
843 : : !Here, restore the "active space" content of the 1st-order wavefunction, to give cwave1 .
844 : :
845 [ - + + - : 13437198 : ABI_MALLOC(cwcorr,(2,npw1*nspinor))
+ - + - -
+ - + ]
846 : :
847 : 4479066 : wf_corrected=0
848 : :
849 [ + + ]: 4479066 : if(usepaw==1) then
850 [ - + + - : 1812228 : ABI_MALLOC(nlmn,(natom))
+ - + - -
+ - + ]
851 [ + + ]: 1894196 : nlmn(:)=cwaveprj1(:,1)%nlmn
852 : 604076 : call pawcprj_alloc(cwaveprj1_corr, cwaveprj1(1,1)%ncpgr, nlmn)
853 [ - + ]: 604076 : ABI_FREE(nlmn)
854 : : end if
855 : :
856 : : ! loop iband_ over all bands being treated for the moment
857 : : ! all procs in pool of bands should be working on the same iband_ at a given time
858 : : ! I will save in _my_ array cwave1, if iband==iband_
859 [ + + ]: 39959100 : do iband_ = 1, nband
860 [ + + ]: 35480034 : if (bands_treated_now(iband_) == 0) cycle
861 : :
862 [ + + + + ]: 2836895445 : cwcorr = zero
863 [ + + ]: 4485330 : if (usepaw==1) then
864 : 607460 : call pawcprj_set_zero(cwaveprj1_corr)
865 : : end if
866 : 4485330 : edocc_tmp = zero
867 : 4485330 : wf_corrected_=0
868 : :
869 : : !Correct WF only for occupied states
870 [ + + ]: 4485330 : if (abs(occ(iband_)) > tol8) then
871 : 3324245 : invocc=one/occ(iband_)
872 : :
873 : :
874 : : ! Loop over WF at k+q subspace
875 : 3324245 : ibandkq_me = 0
876 [ + + ]: 25287478 : do ibandkq=1,nband
877 [ + + ]: 21963233 : if(cycle_bands(ibandkq)) cycle
878 : 21817217 : ibandkq_me = ibandkq_me + 1
879 : :
880 : : ! Select bands with variable occupation
881 [ + + ]: 25141462 : if (abs(rocceig(ibandkq,iband_))>tol8) then
882 : :
883 : 4295133 : wf_corrected_=1
884 : :
885 : 4295133 : index_eig1=2*ibandkq-1+(iband_-1)*2*nband
886 : 4295133 : index_cgq=npw1*nspinor*(ibandkq_me-1)+icgq
887 : :
888 [ + + ]: 4295133 : if(ibandkq==iband_) then
889 : 160043 : factr=rocceig(ibandkq,iband_)*invocc*(eig1(index_eig1)-fermie1)
890 : : else
891 : 4135090 : factr=rocceig(ibandkq,iband_)*invocc*eig1(index_eig1)
892 : : end if
893 : 4295133 : facti = rocceig(ibandkq,iband_)*invocc*eig1(index_eig1+1)
894 : :
895 : : ! Apply correction to 1st-order WF
896 : : !$OMP PARALLEL DO PRIVATE(ii) SHARED(cgq,cwcorr,facti,factr,index_cgq,npw1,nspinor)
897 [ + + ]: 1643085547 : do ii=1,npw1*nspinor
898 : 1638790414 : cwcorr(1,ii)=cwcorr(1,ii)+(factr*cgq(1,ii+index_cgq)-facti*cgq(2,ii+index_cgq))
899 : 1643085547 : cwcorr(2,ii)=cwcorr(2,ii)+(facti*cgq(1,ii+index_cgq)+factr*cgq(2,ii+index_cgq))
900 : : end do
901 : :
902 : : ! In the PAW case, also apply correction to projected WF
903 [ + + ]: 4295133 : if (usepaw==1) then
904 : 586893 : index_cprjq=nspinor*(ibandkq_me-1)+ibgq
905 [ + + ]: 1760679 : call pawcprj_zaxpby((/factr,facti/),(/one,zero/),cprjq(:,index_cprjq+1:index_cprjq+nspinor),cwaveprj1_corr)
906 : : end if
907 : :
908 : : ! The factor of two is needed because we compute the 2DTE, and not E(2)
909 : 4295133 : edocc_tmp = edocc_tmp-two*(factr*eig1(index_eig1)+facti*eig1(index_eig1+1))
910 : :
911 : : end if ! Variable occupations
912 : : end do ! Loop over k+q subspace
913 : : end if ! if occupied states
914 : :
915 : : ! 3) reduce over bands to get all contributions to correction
916 : : ! need MPI reduce over band communicator only
917 : 4485330 : call xmpi_sum(cwcorr, mpi_enreg%comm_band, ierr)
918 [ + + ]: 4485330 : if (usepaw==1) then
919 : 607460 : call pawcprj_mpi_sum(cwaveprj1_corr, mpi_enreg%comm_band, ierr)
920 : : end if
921 : :
922 : : ! this sums over the k+q contributions to the present iband_
923 : 4485330 : call xmpi_sum(edocc_tmp, mpi_enreg%comm_band, ierr)
924 : 4485330 : call xmpi_sum(wf_corrected_, mpi_enreg%comm_band, ierr)
925 : :
926 : :
927 : : ! 4) add correction to the cwave1
928 : : ! if I have iband_, correct my cwave1
929 [ + + ]: 13449726 : if (iband_==iband) then
930 [ + + ]: 4479066 : if (wf_corrected_ > 0) wf_corrected = 1
931 : 4479066 : edocc(iband) = edocc_tmp
932 [ + + + + ]: 2768835141 : cwave1 = cwcorr
933 : 4479066 : call cg_zaxpy(npw1*nspinor,(/one,zero/),cwavef,cwave1)
934 : : !Idem for cprj
935 [ + + ]: 4479066 : if (usepaw==1) then
936 : 604076 : call pawcprj_copy(cwaveprj,cwaveprj1)
937 : 604076 : call pawcprj_zaxpby((/one,zero/),(/one,zero/),cwaveprj1_corr,cwaveprj1)
938 : : end if
939 : : end if
940 : : end do ! loop over all bands presently running in parallel
941 : :
942 : :
943 : : !In the PAW case, compute <Psi^(1)_ortho|H-Eig0_k.S|Psi^(1)_parallel> contribution to 2DTE
944 [ + + + + ]: 4479066 : if (usepaw==1.and.wf_corrected==1) then
945 : : !$OMP WORKSHARE
946 [ + + + + ]: 96121157 : cwcorr(:,:)=cwave1(:,:)-cwavef(:,:)
947 : : !$OMP END WORKSHARE
948 : 125675 : call dotprod_g(factr,facti,istwf_k,npw1*nspinor,1,cwcorr,ghc,mpi_enreg%me_g0,mpi_enreg%comm_spinorfft)
949 : 125675 : edocc(iband)=edocc(iband)+four*factr
950 : : end if
951 : :
952 : :
953 [ - + ]: 4479066 : ABI_FREE(cwcorr)
954 [ + + ]: 4479066 : if (usepaw==1) then
955 : 604076 : call pawcprj_free(cwaveprj1_corr)
956 : : end if
957 : :
958 : 4479066 : call timab(214+timcount,2,tsec)
959 : :
960 : : DBG_EXIT("COLL")
961 : :
962 [ - + ]: 4479066 : end subroutine corrmetalwf1
963 : : !!***
964 : :
965 : : end module m_dfpt_vtowfk
966 : : !!***
|