Branch data Line data Source code
1 : : !!****m* ABINIT/m_positron
2 : : !! NAME
3 : : !! m_positron
4 : : !!
5 : : !! FUNCTION
6 : : !!
7 : : !!
8 : : !! COPYRIGHT
9 : : !! Copyright (C) 1998-2026 ABINIT group (GJ, MT, JW)
10 : : !! This file is distributed under the terms of the
11 : : !! GNU General Public License, see ~abinit/COPYING
12 : : !! or http://www.gnu.org/copyleft/gpl.txt .
13 : : !!
14 : : !! SOURCE
15 : :
16 : : #if defined HAVE_CONFIG_H
17 : : #include "config.h"
18 : : #endif
19 : :
20 : : #include "abi_common.h"
21 : :
22 : : module m_positron
23 : :
24 : : use defs_basis
25 : : use m_efield
26 : : use m_errors
27 : : use m_abicore
28 : : use m_energies
29 : : use m_wffile
30 : : use m_electronpositron
31 : : use m_hdr
32 : : use m_xmpi
33 : : use m_bandfft_kpt
34 : : use m_dtset
35 : : use m_dtfil
36 : : use m_extfpmd
37 : :
38 : : use defs_datatypes, only : pseudopotential_type
39 : : use defs_abitypes, only : MPI_type
40 : : use m_special_funcs, only : sbf8
41 : : use m_ioarr, only : ioarr, read_rhor
42 : : use m_paw_atomorb, only : atomorb_type,destroy_atomorb
43 : : use m_pawang, only : pawang_type
44 : : use m_paw_sphharm, only : realgaunt
45 : : use m_pawrad, only : pawrad_type, simp_gen, nderiv_gen
46 : : use m_pawtab, only : pawtab_type
47 : : use m_paw_ij, only : paw_ij_type
48 : : use m_pawfgrtab,only : pawfgrtab_type
49 : : use m_pawrhoij, only : pawrhoij_type, pawrhoij_copy, pawrhoij_alloc, pawrhoij_free,&
50 : : pawrhoij_nullify, pawrhoij_gather, pawrhoij_inquire_dim, pawrhoij_symrhoij
51 : : use m_pawcprj, only : pawcprj_type, pawcprj_alloc, pawcprj_get, pawcprj_mpi_send, &
52 : : pawcprj_mpi_recv, pawcprj_free, pawcprj_copy, pawcprj_bcast
53 : : use m_pawfgr, only : pawfgr_type
54 : : use m_paw_nhat, only : pawmknhat
55 : : use m_fock, only : fock_type
56 : : use m_kg, only : getcut
57 : : use defs_wvltypes, only : wvl_data
58 : : use m_spacepar, only : hartre
59 : : use m_mkrho, only : initro
60 : : use m_paw_occupancies, only : initrhoij, pawaccrhoij
61 : : use m_gammapositron, only : gammapositron, gammapositron_fft
62 : : use m_forstr, only : forstr
63 : : use m_pawxc, only : pawxcsum
64 : : use m_paw_denpot, only : pawdensities
65 : : use m_drivexc, only : mkdenpos
66 : :
67 : : use m_paw_sphharm, only : initylmr
68 : : use m_pawpsp, only : pawpsp_init_core
69 : : use m_crystal, only : crystal_t
70 : : use m_mpinfo, only : ptabs_fourdp,set_mpi_enreg_fft,unset_mpi_enreg_fft,destroy_mpi_enreg, initmpi_seq, proc_distrb_cycle
71 : : use m_io_tools, only : open_file,close_unit,get_unit
72 : : use m_fftcore, only : sphereboundary
73 : : use m_prep_kgb, only : prep_fourwf
74 : : use m_fft, only : fourwf, fourdp
75 : : use m_cgprj, only : ctocprj
76 : : use m_xg_nonlop, only : xg_nonlop_t
77 : :
78 : : implicit none
79 : :
80 : : private
81 : : !!***
82 : :
83 : : public :: setup_positron
84 : : public :: poslifetime
85 : : public :: posdoppler
86 : : !!***
87 : :
88 : : contains
89 : : !!***
90 : :
91 : : !!****f* ABINIT/setup_positron
92 : : !! NAME
93 : : !! setup_positron
94 : : !!
95 : : !! FUNCTION
96 : : !! Do various initializations for the positron lifetime calculation
97 : : !!
98 : : !! INPUTS
99 : : !! atindx(natom)=index table for atoms (see gstate.f)
100 : : !! atindx1(natom)=index table for atoms, inverse of atindx
101 : : !! dtefield <type(efield_type)> = variables related to Berry phase
102 : : !! dtfil <type(datafiles_type)>=variables related to files
103 : : !! dtset <type(dataset_type)>=all input variables for this dataset
104 : : !! ecore=core psp energy (part of total energy) (hartree)
105 : : !! etotal=current value of total energy
106 : : !! extfpmd <type(extfpmd_type)>=extended first-principles molecular dynamics type
107 : : !! fock <type(fock_type)>= quantities to calculate Fock exact exchange
108 : : !! forces_needed=if >0 forces are needed
109 : : !! gred(3,natom)=gradients wrt nuclear positions in reduced coordinates
110 : : !! gprimd(3,3)=dimensional primitive translations for reciprocal space
111 : : !! gmet(3,3)=reciprocal space metric
112 : : !! grchempottn(3,natom)=d(E_chemical_potential)/d(xred) (hartree)
113 : : !! grcondft(3,natom)=d(E_constrainedDFT)/d(xred) (hartree)
114 : : !! grewtn(3,natom)=d(Ewald)/d(xred) (hartree)
115 : : !! grvdw(3,ngrvdw)=gradients of energy due to Van der Waals DFT-D dispersion (hartree)
116 : : !! gsqcut=cutoff value on G**2 for sphere inside fft box
117 : : !! hdr <type(hdr_type)>=the header of wf, den and pot files
118 : : !! ifirst_gs= 0 if we are in a single ground-state calculation
119 : : !! or in the first ground-state calculation of a structural minimization/dynamics
120 : : !! indsym(4,nsym,natom)=index showing transformation of atom labels
121 : : !! under symmetry operations (computed in symatm)
122 : : !! istep=index of the number of steps in the routine scfcv
123 : : !! istep_mix=index of the number of steps for the SCF mixing (can be <istep)
124 : : !! kg(3,mpw*mkmem)=reduced (integer) coordinates of G vecs in basis sphere
125 : : !! kxc(nfft,nkxc)=exchange-correlation kernel, needed only if nkxc>0
126 : : !! maxfor=maximum absolute value of fcart (forces)
127 : : !! mcg=size of wave-functions array (cg) =mpw*nspinor*mband*mkmem*nsppol
128 : : !! mcprj=size of projected wave-functions array (cprj) =nspinor*mband*mkmem*nsppol
129 : : !! mgfft=maximum size of 1D FFTs
130 : : !! mpi_enreg=information about MPI parallelization
131 : : !! my_natom=number of atoms treated by current processor
132 : : !! n3xccc=dimension of the xccc3d array (0 or nfftf).
133 : : !! nattyp(ntypat)= # atoms of each type.
134 : : !! nfft=(effective) number of FFT grid points (for this processor)
135 : : !! ngfft(18)=contain all needed information about 3D FFT
136 : : !! ngrvdw=size of grvdw(:,:); can be 0 or natom according to dtset%vdw_xc
137 : : !! nhat(nfftf,nspden*usepaw)= -PAW only- compensation density
138 : : !! nkxc=second dimension of the array kxc, see rhotoxc.f for a description
139 : : !! npwarr(nkpt)=number of planewaves in basis and on boundary for each k
140 : : !! nvresid(nfftf,nspden)=array for the residual of the density/potential
141 : : !! optres=0 if the potential residual has to be used for forces corrections
142 : : !! =1 if the density residual has to be used for forces corrections
143 : : !! paw_ij(my_natom*usepaw) <type(paw_ij_type)>=paw arrays given on (i,j) channels
144 : : !! pawang <type(pawang_type)>=paw angular mesh and related data
145 : : !! pawfgr(my_natom*usepaw) <type(pawfgr_type)>=fine grid parameters and related data
146 : : !! pawfgrtab(my_natom*usepaw) <type(pawfgrtab_type)>=atomic data given on fine rectangular grid
147 : : !! pawrad(ntypat*usepaw) <type(pawrad_type)>=paw radial mesh and related data
148 : : !! pawtab(ntypat*usepaw) <type(pawtab_type)>=paw tabulated starting data
149 : : !! ph1d(2,3*(2*mgfftf+1)*natom)=one-dimensional structure factor information (fine FFT grid)
150 : : !! ph1dc(2,3*(2*mgfft+1)*natom)=1-dim structure factor phases (coarse FFT grid)
151 : : !! psps <type(pseudopotential_type)>=variables related to pseudopotentials
152 : : !! rprimd(3,3)=dimensional primitive translations in real space (bohr)
153 : : !! stress_needed=if >0 stresses are needed
154 : : !! strscondft(6)=cDFT correction to stress
155 : : !! strsxc(6)=xc correction to stress
156 : : !! symrec(3,3,nsym)=symmetries in reciprocal space, reduced coordinates
157 : : !! ucvol=unit cell volume in bohr**3.
158 : : !! usecprj= 1 if cprj array is stored in memory
159 : : !! usevxctau=1 if kinetic energy density contribution has to be included (mGGA)
160 : : !! vhartr(nfftf)=array for holding Hartree potential
161 : : !! vpsp(nfftf)=array for holding local psp
162 : : !! vxc(nfftf,nspden)=exchange-correlation potential (hartree) in real space
163 : : !! vxctau(nfft,nspden,4*usevxctau)=(only for meta-GGA) derivative of XC energy density
164 : : !! wrt kinetic energy density (depsxcdtau)
165 : : !! xccc3d(n3xccc)=3D core electron density for XC core correction, bohr^-3
166 : : !! xcctau3d(n3xccc*usekden)=(only for meta-GGA): 3D core electron kinetic energy density for XC core correction
167 : : !! xred(3,natom)=reduced dimensionless atomic coordinates
168 : : !! ylm(mpw*mkmem,mpsang*mpsang*useylm)= real spherical harmonics for each G and k point
169 : : !! ylmgr(mpw*mkmem,3,mpsang*mpsang*useylm)= gradients of real spherical harmonics
170 : : !!
171 : : !! SIDE EFFECTS
172 : : !! electronpositron <type(electronpositron_type)>=quantities for the electron-positron annihilation
173 : : !! energies <type(energies_type)>=all part of total energy.
174 : : !! cg(2,mcg)=wavefunctions
175 : : !! cprj(natom,mcprj*usecprj)= wave functions projected with non-local projectors:
176 : : !! cprj(n,k,i)=<p_i|Cnk> where p_i is a non-local projector.
177 : : !! eigen(mband*nkpt*nsppol)=array for holding eigenvalues (hartree)
178 : : !! occ(mband*nkpt*nsppol)=occupation number for each band at each k point
179 : : !! pawrhoij(my_natom) <type(pawrhoij_type)>= paw rhoij occupancies and related data
180 : : !! rhog(2,nfft)=Fourier transform of total electron/positron density
181 : : !! rhor(nfft,nspden)=total electron/positron density (el/bohr**3)
182 : : !!
183 : : !! SOURCE
184 : :
185 : 525 : subroutine setup_positron(atindx,atindx1,cg,cprj,dtefield,dtfil,dtset,ecore,eigen,etotal,electronpositron,&
186 : 525 : & energies,fock,forces_needed,gred,gmet,gprimd,grchempottn,&
187 : 525 : & grcondft,grewtn,grvdw,gsqcut,hdr,extfpmd,ifirst_gs,indsym,istep,istep_mix,kg,&
188 : 525 : & kxc,maxfor,mcg,mcprj,mgfft,mpi_enreg,my_natom,n3xccc,nattyp,nfft,ngfft,ngrvdw,nhat,nkxc,npwarr,nvresid,occ,optres,&
189 : 525 : & paw_ij,pawang,pawfgr,pawfgrtab,pawrad,pawrhoij,pawtab,ph1d,ph1dc,psps,rhog,rhor,&
190 : 525 : & rmet,rprimd,stress_needed,strscondft,strsxc,symrec,ucvol,usecprj,usevxctau,vhartr,vpsp,vxc,vxctau,&
191 : 525 : & xccc3d,xcctau3d,xred,ylm,ylmgr,xg_nonlop)
192 : :
193 : : !Arguments ------------------------------------
194 : : !scalars
195 : : integer,intent(in) :: forces_needed,ifirst_gs,istep,mcg,mcprj,mgfft,my_natom,n3xccc,nfft
196 : : integer,intent(in) :: ngrvdw,nkxc,optres,stress_needed,usecprj,usevxctau
197 : : integer,intent(inout) :: istep_mix
198 : : real(dp),intent(in) :: ecore,etotal,gsqcut,maxfor,ucvol
199 : : type(efield_type),intent(in) :: dtefield
200 : : type(datafiles_type),intent(in) :: dtfil
201 : : type(dataset_type),intent(in) :: dtset
202 : : type(electronpositron_type),pointer :: electronpositron
203 : : type(energies_type),intent(inout) :: energies
204 : : type(hdr_type),intent(inout) :: hdr
205 : : type(extfpmd_type),pointer,intent(inout) :: extfpmd
206 : : type(MPI_type),intent(inout) :: mpi_enreg
207 : : type(pawang_type),intent(in) :: pawang
208 : : type(pawfgr_type),intent(in) :: pawfgr
209 : : type(pseudopotential_type), intent(in) :: psps
210 : : type(fock_type),pointer, intent(inout) :: fock
211 : : type(xg_nonlop_t), intent(inout) :: xg_nonlop
212 : : !arrays
213 : : integer,intent(in) :: atindx(dtset%natom),atindx1(dtset%natom),indsym(4,dtset%nsym,dtset%natom)
214 : : integer,intent(in) :: kg(3,dtset%mpw*dtset%mkmem),nattyp(dtset%natom),ngfft(18)
215 : : integer,intent(in) :: npwarr(dtset%nkpt),symrec(3,3,dtset%nsym)
216 : : real(dp),intent(in) :: gmet(3,3),gprimd(3,3),grchempottn(3,dtset%natom),grcondft(3,dtset%natom)
217 : : real(dp),intent(in) :: grewtn(3,dtset%natom),grvdw(3,ngrvdw),kxc(nfft,nkxc)
218 : : real(dp),intent(in) :: ph1d(2,3*(2*mgfft+1)*dtset%natom),ph1dc(2,(3*(2*dtset%mgfft+1)*dtset%natom)*dtset%usepaw)
219 : : real(dp),intent(in) :: rmet(3,3),strscondft(6),strsxc(6),vhartr(nfft),vpsp(nfft),vxc(nfft,dtset%nspden)
220 : : real(dp),intent(in) :: vxctau(nfft,dtset%nspden,4*usevxctau)
221 : : real(dp),intent(in) :: ylm(dtset%mpw*dtset%mkmem,psps%mpsang*psps%mpsang*psps%useylm)
222 : : real(dp),intent(in) :: ylmgr(dtset%mpw*dtset%mkmem,3,psps%mpsang*psps%mpsang*psps%useylm)
223 : : real(dp),intent(inout) :: cg(2,mcg)
224 : : real(dp),intent(inout) :: nhat(nfft,dtset%nspden*dtset%usepaw)
225 : : real(dp),intent(inout) :: nvresid(nfft,dtset%nspden)
226 : : real(dp),intent(inout) :: eigen(dtset%mband*dtset%nkpt*dtset%nsppol),gred(3,dtset%natom)
227 : : real(dp),intent(inout) :: occ(dtset%mband*dtset%nkpt*dtset%nsppol)
228 : : real(dp),intent(inout) :: rhog(2,nfft),rhor(nfft,dtset%nspden),rprimd(3,3)
229 : : real(dp),intent(inout) :: xccc3d(n3xccc),xcctau3d(n3xccc*dtset%usekden),xred(3,dtset%natom)
230 : : type(pawcprj_type),intent(inout) :: cprj(dtset%natom,mcprj*usecprj)
231 : : type(paw_ij_type),intent(in) :: paw_ij(my_natom*dtset%usepaw)
232 : : type(pawfgrtab_type),intent(inout) :: pawfgrtab(my_natom*dtset%usepaw)
233 : : type(pawrad_type),intent(in) :: pawrad(dtset%ntypat*dtset%usepaw)
234 : : type(pawtab_type),intent(in) :: pawtab(dtset%ntypat*dtset%usepaw)
235 : : type(pawrhoij_type),intent(inout) :: pawrhoij(my_natom*dtset%usepaw)
236 : :
237 : : !Local variables-------------------------------
238 : : !scalars
239 : : integer,parameter :: cplex1=1
240 : : integer :: history_level,iatom,iband,icalctype,icalctype0,icg,ifft,ikpt
241 : : integer :: iocc,ireadwf,ispden,isppol,n3xccc0,nocc,optfor,optstr,rdwrpaw,comm_cell
242 : : logical,parameter :: always_restart=.false. ! Set to true to restart by a pure electronic step at each new atomic structure
243 : : logical :: need_scocc,new_calctype
244 : : real(dp) :: boxcut_dum,diffor_dum,ecut_eff,eigtmp,etotal_read,gsqcut_eff,maxfor_dum
245 : : real(dp) :: maxocc,nelect,occlast,occtmp,rhotmp
246 : : character(len=69) :: TypeCalcStrg
247 : : character(len=500) :: message
248 : : character(len=fnlen) :: fname
249 : : type(energies_type) :: energies_tmp
250 : 525 : type(wvl_data) :: wvl
251 : 525 : type(hdr_type) :: hdr_den
252 : : !arrays
253 : 525 : integer,allocatable :: nlmn(:)
254 : : real(dp) :: cgtmp(2)
255 : : real(dp),parameter :: qphon(3)=(/zero,zero,zero/)
256 : 525 : real(dp),allocatable :: favg_dum(:),fcart_dum(:,:),forold_dum(:,:),gred_tmp(:,:)
257 : 525 : real(dp),allocatable :: gresid_dum(:,:),grhf_dum(:,:),grxc_dum(:,:)
258 : 525 : real(dp),allocatable :: rhog_ep(:,:),scocc(:),str_tmp(:),synlgr_dum(:,:)
259 : : real(dp) :: nhatgr(0,0,0)
260 : 525 : type(pawcprj_type),allocatable :: cprj_tmp(:,:)
261 : 525 : type(pawrhoij_type),allocatable :: pawrhoij_tmp(:)
262 : :
263 : : ! *************************************************************************
264 : :
265 : : !Compatibility tests
266 : 525 : if (dtset%positron==0) then
267 : 0 : ABI_BUG('Not valid for dtset%positron=0!')
268 : : end if
269 : :
270 [ + + - + ]: 525 : if (istep>1.and.nfft/=electronpositron%nfft) then
271 : 0 : ABI_BUG('Invalid value for nfft!')
272 : : end if
273 : :
274 [ - + ]: 525 : if (dtset%usewvl==1) then
275 : 0 : ABI_BUG('Not valid for wavelets!')
276 : : end if
277 : :
278 [ + + ]: 525 : if (dtset%positron==1) then
279 [ + + ]: 10 : do isppol=1,dtset%nsppol
280 [ + + ]: 15 : do ikpt=1,dtset%nkpt
281 [ - + ]: 10 : if (dtset%nband(ikpt+dtset%nkpt*(isppol-1))/=dtset%nband(1)) then
282 : 0 : message = "dtset%positron needs nband to be the same at each k-point !"
283 : 0 : ABI_ERROR(message)
284 : : end if
285 : : end do
286 : : end do
287 : : end if
288 : :
289 : 525 : comm_cell = mpi_enreg%comm_cell
290 : :
291 : : !-----------------------------------------------------------------------
292 : : !Compute new value for calctype (type of electron-positron calculation)
293 : : !-----------------------------------------------------------------------
294 : 525 : icalctype0=electronpositron%calctype
295 : :
296 : 525 : new_calctype=.false.
297 [ + + ]: 525 : if (dtset%positron==1.or.dtset%positron==2) then
298 [ + - ]: 6 : if (istep==1) new_calctype=.true.
299 [ + - ]: 519 : else if (dtset%positron<0) then
300 [ + + + + ]: 519 : if (ifirst_gs/=0.and.istep==1.and.(.not.always_restart)) new_calctype=.true.
301 [ + + ]: 525 : if (electronpositron%scf_converged) new_calctype=.true.
302 : : end if
303 : :
304 : : !Comment:
305 : : !history_level=-1: not used
306 : : !history_level= 0: rhor from scratch, rhor_ep from scratch or read
307 : : !history_level= 1: rhor in memory, rhor_ep from scratch or read
308 : : !history_level= 2: rhor_ep <-rhor, rhor from scratch
309 : : !history_level= 3: rhor_ep <-> rhor
310 : : !history_level= 4: rhor in memory, rhor_ep in memory
311 : 525 : history_level=-1
312 [ + + ]: 525 : if (dtset%positron==1.or.dtset%positron==2) then
313 [ - + - + ]: 6 : if (ifirst_gs==0.and.istep==1) history_level=0
314 [ - + - - ]: 6 : if (ifirst_gs/=0.and.istep==1) history_level=4
315 [ - + ]: 519 : else if (dtset%positron<0) then
316 [ + + ]: 519 : if (.not.electronpositron%scf_converged) then
317 [ + + + + ]: 449 : if (ifirst_gs/=0.and.istep==1.and.(.not.always_restart)) history_level=4
318 : : else if (electronpositron%scf_converged) then
319 [ + + ]: 70 : if (icalctype0==0) history_level=2
320 [ - + ]: 62 : if (icalctype0> 0) history_level=3
321 : : end if
322 : : end if
323 : :
324 : : electronpositron%calctype=icalctype0
325 [ + + ]: 525 : if (dtset%positron==1.or.dtset%positron==2) then
326 : 6 : electronpositron%calctype=dtset%positron
327 [ + - ]: 519 : else if (dtset%positron<0) then
328 [ + + ]: 519 : if (electronpositron%scf_converged) then
329 [ + + ]: 70 : if (icalctype0==0) electronpositron%calctype=1
330 [ + + ]: 70 : if (icalctype0>0 ) electronpositron%calctype=3-electronpositron%calctype
331 [ + + + + ]: 449 : else if (ifirst_gs/=0.and.istep==1) then
332 : 3 : if (always_restart) then
333 : : electronpositron%calctype=0
334 : : else
335 : : electronpositron%calctype=2
336 : : ! if (electronpositron%particle==EP_POSITRON) electronpositron%calctype=1
337 : : end if
338 : : end if
339 : : end if
340 : :
341 : 525 : electronpositron%scf_converged=.false.
342 [ + + ]: 525 : if (new_calctype) electronpositron%istep=electronpositron%istep+1
343 [ + + ]: 525 : if (istep==1) electronpositron%istep=1
344 [ + + ]: 525 : ireadwf=dtfil%ireadwf;if (electronpositron%istep>1) ireadwf=0
345 : :
346 : : !============================================
347 : : !The following lines occur only when the type
348 : : !of electron-positron calculation changes
349 : : !============================================
350 [ + + ]: 525 : if (new_calctype) then
351 : :
352 : : ! Reset some indexes
353 [ - + ]: 79 : if (electronpositron%calctype==0) then
354 : 0 : electronpositron%particle=EP_NOTHING
355 [ + + ]: 79 : else if (electronpositron%calctype==1) then
356 : 43 : electronpositron%particle=EP_ELECTRON
357 [ + - ]: 36 : else if (electronpositron%calctype==2) then
358 : 36 : electronpositron%particle=EP_POSITRON
359 : : end if
360 : 79 : electronpositron%has_pos_ham=mod(electronpositron%calctype,2)
361 : 79 : electronpositron%istep_scf=1
362 : 79 : istep_mix=1
363 : :
364 : : ! -----------------------------------------------------------------------------------------
365 : : ! Update forces and stresses
366 : : ! If electronpositron%calctype==1: gred_ep/stress_ep are the electronic gred/stress
367 : : ! If electronpositron%calctype==2: gred_ep/stress_ep are the positronic gred/stress
368 : : ! -----------------------------------------------------------------------------------------
369 [ + + ]: 79 : if (history_level==2.or.history_level==3) then
370 : 70 : optstr=0;optfor=0
371 [ - + ]: 70 : if (allocated(electronpositron%stress_ep)) optstr=stress_needed
372 [ + + - + ]: 70 : if (allocated(electronpositron%gred_ep).and.forces_needed==2) optfor=1
373 [ - + ]: 70 : if (optfor>0.or.optstr>0) then
374 [ # # ]: 0 : ABI_MALLOC(favg_dum,(3))
375 [ # # # # : 0 : ABI_MALLOC(fcart_dum,(3,dtset%natom))
# # # # #
# # # ]
376 [ # # # # : 0 : ABI_MALLOC(forold_dum,(3,dtset%natom))
# # # # ]
377 [ # # # # : 0 : ABI_MALLOC(gresid_dum,(3,dtset%natom))
# # # # ]
378 [ # # # # : 0 : ABI_MALLOC(grhf_dum,(3,dtset%natom))
# # # # ]
379 [ # # # # : 0 : ABI_MALLOC(grxc_dum,(3,dtset%natom))
# # # # ]
380 [ # # # # : 0 : ABI_MALLOC(synlgr_dum,(3,dtset%natom))
# # # # ]
381 [ # # # # : 0 : ABI_MALLOC(gred_tmp,(3,dtset%natom))
# # # # ]
382 [ # # ]: 0 : ABI_MALLOC(str_tmp,(6))
383 [ # # # # ]: 0 : forold_dum=zero;n3xccc0=n3xccc
384 : 0 : icalctype=electronpositron%calctype;electronpositron%calctype=-icalctype0
385 [ # # ]: 0 : if (electronpositron%calctype==0) electronpositron%calctype=-100
386 [ # # ]: 0 : if (electronpositron%calctype==-1) n3xccc0=0 ! Note: if calctype=-1, previous calculation was positron
387 : : call forstr(atindx1,cg,cprj,diffor_dum,dtefield,dtset,eigen,electronpositron,energies,&
388 : : & favg_dum,fcart_dum,fock,forold_dum,gred_tmp,grchempottn,grcondft,gresid_dum,grewtn,grhf_dum,grvdw,grxc_dum,gsqcut,&
389 : : & extfpmd,indsym,kg,kxc,maxfor_dum,mcg,mcprj,mgfft,mpi_enreg,my_natom,n3xccc0,nattyp,nfft,ngfft,&
390 : : & ngrvdw,nhat,nkxc,npwarr,dtset%ntypat,nvresid,occ,optfor,optres,paw_ij,pawang,pawfgr,&
391 : : & pawfgrtab,pawrad,pawrhoij,pawtab,ph1dc,ph1d,psps,rhog,rhor,rprimd,optstr,strscondft,strsxc,str_tmp,symrec,&
392 : 0 : & synlgr_dum,ucvol,usecprj,usevxctau,vhartr,vpsp,vxc,vxctau,wvl,xccc3d,xcctau3d,xred,ylm,ylmgr,0.0_dp,xg_nonlop)
393 : 0 : electronpositron%calctype=icalctype
394 [ # # # # : 0 : if (optfor>0) electronpositron%gred_ep(:,:)=gred_tmp(:,:)
# # ]
395 [ # # # # ]: 0 : if (optstr>0) electronpositron%stress_ep(:)=str_tmp(:)
396 [ # # ]: 0 : ABI_FREE(favg_dum)
397 [ # # ]: 0 : ABI_FREE(fcart_dum)
398 [ # # ]: 0 : ABI_FREE(forold_dum)
399 [ # # ]: 0 : ABI_FREE(gresid_dum)
400 [ # # ]: 0 : ABI_FREE(grhf_dum)
401 [ # # ]: 0 : ABI_FREE(grxc_dum)
402 [ # # ]: 0 : ABI_FREE(synlgr_dum)
403 [ # # ]: 0 : ABI_FREE(gred_tmp)
404 [ # # ]: 0 : ABI_FREE(str_tmp)
405 : : end if
406 [ + - + + : 70 : if (optfor==0.and.forces_needed>0.and.allocated(electronpositron%gred_ep)) then
+ - ]
407 [ + + + + ]: 2369 : electronpositron%gred_ep(:,:)=gred(:,:)-electronpositron%gred_ep(:,:)
408 : : end if
409 : : end if
410 : :
411 : : ! ----------------------------------------------------------------------------------------------------
412 : : ! Initialize/Update densities
413 : : ! If electronpositron%calctype==1: rhor is the positronic density, rhor_ep is the electronic density
414 : : ! If electronpositron%calctype==2: rhor is the electronic density, rhor_ep is the positronic density
415 : : ! ---------------------------------------------------------------------------------------------------
416 [ - + + - : 237 : ABI_MALLOC(rhog_ep,(2,nfft))
+ - + - -
+ - + ]
417 : :
418 : : ! ===== PREVIOUS DENSITY RHOR_EP:
419 [ + + ]: 79 : if (history_level==0.or.history_level==1) then
420 : : ! ----- Read from disk
421 [ + - ]: 6 : if (dtset%positron>0) then
422 : 6 : rdwrpaw=dtset%usepaw
423 [ + + + - ]: 6 : fname=trim(dtfil%fildensin);if (dtset%positron==2) fname=trim(dtfil%fildensin)//'_POSITRON'
424 : : call read_rhor(trim(fname), cplex1, dtset%nspden, nfft, ngfft, rdwrpaw, mpi_enreg, electronpositron%rhor_ep, &
425 [ + - ]: 6 : hdr_den, electronpositron%pawrhoij_ep, comm_cell, check_hdr=hdr)
426 : 6 : etotal_read = hdr_den%etot; call hdr_den%free()
427 : 6 : call fourdp(1,rhog_ep,electronpositron%rhor_ep,-1,mpi_enreg,nfft,1,ngfft,0)
428 [ + + - + ]: 6 : if (dtset%usepaw==1.and.allocated(electronpositron%nhat_ep)) then
429 : : call pawmknhat(occtmp,1,0,0,0,0,gprimd,my_natom,dtset%natom,nfft,ngfft,0,&
430 : : & dtset%nspden,dtset%ntypat,pawang,pawfgrtab,nhatgr,electronpositron%nhat_ep,&
431 : : & electronpositron%pawrhoij_ep,electronpositron%pawrhoij_ep,pawtab,&
432 : : & qphon,rprimd,ucvol,dtset%usewvl,xred,distribfft=mpi_enreg%distribfft,&
433 : : & comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab,&
434 : 5 : & comm_fft=mpi_enreg%comm_fft,paral_kgb=dtset%paral_kgb,me_g0=mpi_enreg%me_g0)
435 : : end if
436 : : end if
437 : : ! ----- Electronic from scratch
438 [ - + - - ]: 6 : if (dtset%positron<0.and.electronpositron%calctype==1) then
439 : 0 : ecut_eff=dtset%pawecutdg*(dtset%dilatmx)**2
440 : 0 : call getcut(boxcut_dum,ecut_eff,gmet,gsqcut_eff,dtset%iboxcut,std_out,qphon,ngfft)
441 : : call initro(atindx,dtset%densty,gmet,gsqcut_eff,dtset%usepaw,mgfft,mpi_enreg,&
442 : : & psps%mqgrid_vl,dtset%natom,nattyp,nfft,ngfft,dtset%nspden,dtset%ntypat,&
443 : : & psps,pawtab,ph1d,psps%qgrid_vl,rhog_ep,electronpositron%rhor_ep,&
444 : 0 : & dtset%spinat,ucvol,dtset%usepaw,dtset%ziontypat,dtset%znucl)
445 [ # # ]: 0 : if (dtset%usepaw==1) then
446 [ # # ]: 0 : if (size(electronpositron%pawrhoij_ep)>0) then
447 [ # # # # : 0 : ABI_MALLOC(pawrhoij_tmp,(my_natom))
# # # # #
# # # # #
# # # # ]
448 : : call initrhoij(electronpositron%pawrhoij_ep(1)%cplex_rhoij,dtset%lexexch,&
449 : : & dtset%lpawu,my_natom,dtset%natom,dtset%nspden,&
450 : : & electronpositron%pawrhoij_ep(1)%nspinor,dtset%nsppol,&
451 : : & dtset%ntypat,pawrhoij_tmp,dtset%pawspnorb,pawtab,cplex1,dtset%spinat,dtset%typat,&
452 : : & ngrhoij=electronpositron%pawrhoij_ep(1)%ngrhoij,&
453 : : & nlmnmix=electronpositron%pawrhoij_ep(1)%lmnmix_sz,&
454 : : & use_rhoij_=electronpositron%pawrhoij_ep(1)%use_rhoij_,&
455 : : & use_rhoijres=electronpositron%pawrhoij_ep(1)%use_rhoijres,&
456 : 0 : & comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
457 [ # # ]: 0 : if (electronpositron%pawrhoij_ep(1)%lmnmix_sz>0) then
458 [ # # ]: 0 : do iatom=1,my_natom
459 [ # # ]: 0 : pawrhoij_tmp(iatom)%kpawmix(:)=electronpositron%pawrhoij_ep(iatom)%kpawmix(:)
460 : : end do
461 : : end if
462 : 0 : call pawrhoij_copy(pawrhoij_tmp,electronpositron%pawrhoij_ep)
463 : 0 : call pawrhoij_free(pawrhoij_tmp)
464 [ # # # # : 0 : ABI_FREE(pawrhoij_tmp)
# # # # #
# # # # #
# # # # ]
465 : : end if
466 [ # # ]: 0 : if (allocated(electronpositron%nhat_ep)) then
467 : : call pawmknhat(occtmp,1,0,0,0,0,gprimd,my_natom,dtset%natom,nfft,ngfft,0,&
468 : : & dtset%nspden,dtset%ntypat,pawang,pawfgrtab,nhatgr,electronpositron%nhat_ep,&
469 : : & electronpositron%pawrhoij_ep,electronpositron%pawrhoij_ep,pawtab,qphon,rprimd,&
470 : : & ucvol,dtset%usewvl,xred,distribfft=mpi_enreg%distribfft,&
471 : : & comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab,&
472 : 0 : & comm_fft=mpi_enreg%comm_fft,paral_kgb=dtset%paral_kgb,me_g0=mpi_enreg%me_g0)
473 : : end if
474 : : end if
475 : : end if
476 : : ! ----- Positronic from scratch
477 [ - + - - ]: 6 : if (dtset%positron<0.and.electronpositron%calctype==2) then
478 [ # # ]: 0 : electronpositron%rhor_ep(:,1)=one/ucvol
479 [ # # # # ]: 0 : if (dtset%nspden>=2) electronpositron%rhor_ep(:,2)=half/ucvol
480 [ # # # # : 0 : if (dtset%nspden==4) electronpositron%rhor_ep(:,3:4)=zero
# # ]
481 [ # # # # ]: 0 : rhog_ep=zero;rhog_ep(1,1)=one/ucvol
482 [ # # ]: 0 : if (dtset%usepaw==1) then
483 [ # # ]: 0 : do iatom=1,dtset%natom
484 [ # # # # ]: 0 : electronpositron%pawrhoij_ep(iatom)%rhoijp(:,:)=zero
485 : 0 : electronpositron%pawrhoij_ep(iatom)%nrhoijsel=0
486 : : end do
487 [ # # # # : 0 : if (allocated(electronpositron%nhat_ep)) electronpositron%nhat_ep=zero
# # ]
488 : : end if
489 : : end if
490 : : end if
491 : : ! ----- Deduced from rhor in memory
492 [ + + ]: 79 : if (history_level==2) then
493 [ + + + + ]: 462310 : electronpositron%rhor_ep(:,:)=rhor(:,:)
494 [ + + + + ]: 1386890 : rhog_ep(:,:)=rhog(:,:)
495 [ + - ]: 8 : if (dtset%usepaw==1) then
496 : 8 : call pawrhoij_copy(pawrhoij,electronpositron%pawrhoij_ep)
497 [ + - + + : 462310 : if (allocated(electronpositron%nhat_ep)) electronpositron%nhat_ep(:,:)=nhat(:,:)
+ + ]
498 : : end if
499 : : end if
500 : :
501 : : ! ===== CURRENT DENSITY RHOR:
502 [ + + ]: 79 : if (history_level==0.or.history_level==2) then
503 [ + - ]: 14 : if (ireadwf==0) then
504 : : ! ----- Positronic from scratch
505 [ + + ]: 14 : if (electronpositron%calctype==1) then
506 [ + + ]: 705820 : rhor(:,1)=one/ucvol
507 [ - + - - ]: 13 : if (dtset%nspden>=2) rhor(:,2)=half/ucvol
508 [ - + - - : 13 : if (dtset%nspden==4) rhor(:,3:4)=zero
- - ]
509 [ + + + + ]: 2117434 : rhog=zero;rhog(1,1)=one/ucvol
510 [ + + ]: 13 : if (dtset%usepaw==1) then
511 [ + + ]: 85 : do iatom=1,my_natom
512 [ + + + + ]: 2942 : pawrhoij(iatom)%rhoijp(:,:)=zero
513 : 85 : pawrhoij(iatom)%nrhoijsel=0
514 : : end do
515 [ + + + + ]: 686148 : nhat(:,:)=zero
516 : : end if
517 : : end if
518 : : ! ----- Electronic from scratch
519 [ + + ]: 14 : if (electronpositron%calctype==2) then
520 : 1 : ecut_eff=dtset%pawecutdg*(dtset%dilatmx)**2
521 : 1 : call getcut(boxcut_dum,ecut_eff,gmet,gsqcut_eff,dtset%iboxcut,std_out,qphon,ngfft)
522 : : call initro(atindx,dtset%densty,gmet,gsqcut_eff,dtset%usepaw,mgfft,mpi_enreg,&
523 : : & psps%mqgrid_vl,dtset%natom,nattyp,nfft,ngfft,dtset%nspden,dtset%ntypat,&
524 : : & psps,pawtab,ph1d,psps%qgrid_vl,rhog,rhor,dtset%spinat,ucvol,&
525 : 1 : & dtset%usepaw,dtset%ziontypat,dtset%znucl)
526 : :
527 [ + - ]: 1 : if (dtset%usepaw==1) then
528 [ + - ]: 1 : if (size(pawrhoij)>0) then
529 [ - + + - : 7 : ABI_MALLOC(pawrhoij_tmp,(my_natom))
+ - + - -
+ - + - +
+ + + - ]
530 : : call initrhoij(pawrhoij(1)%cplex_rhoij,dtset%lexexch,dtset%lpawu,&
531 : : & my_natom,dtset%natom,dtset%nspden,pawrhoij(1)%nspinor,dtset%nsppol,&
532 : : & dtset%ntypat,pawrhoij_tmp,dtset%pawspnorb,pawtab,pawrhoij(1)%qphase,dtset%spinat,&
533 : : & dtset%typat,ngrhoij=pawrhoij(1)%ngrhoij,nlmnmix=pawrhoij(1)%lmnmix_sz,&
534 : : & use_rhoij_=pawrhoij(1)%use_rhoij_,use_rhoijres=pawrhoij(1)%use_rhoijres,&
535 : 1 : & comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
536 [ + + ]: 5 : do iatom=1,my_natom
537 [ + + ]: 149 : pawrhoij_tmp(iatom)%kpawmix(:)=pawrhoij(iatom)%kpawmix(:)
538 : : end do
539 : 1 : call pawrhoij_copy(pawrhoij_tmp,pawrhoij)
540 : 1 : call pawrhoij_free(pawrhoij_tmp)
541 [ + - + + : 5 : ABI_FREE(pawrhoij_tmp)
- + - + -
+ - + - +
- + - + ]
542 : : end if
543 : : call pawmknhat(occtmp,1,0,0,0,0,gprimd,my_natom,dtset%natom,nfft,ngfft,0,&
544 : : & dtset%nspden,dtset%ntypat,pawang,pawfgrtab,nhatgr,nhat,&
545 : : & pawrhoij,pawrhoij,pawtab,qphon,rprimd,ucvol,dtset%usewvl,xred, &
546 : : & comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab,&
547 : : & comm_fft=mpi_enreg%comm_fft,paral_kgb=dtset%paral_kgb,&
548 : 1 : & me_g0=mpi_enreg%me_g0,distribfft=mpi_enreg%distribfft)
549 : : end if
550 : :
551 : : end if
552 : : end if
553 : : end if
554 : :
555 : : ! ===== EXCHANGE POSITRONIC AND ELECTRONIC DENSITY (CURRENT AND PREVIOUS)
556 [ + + ]: 79 : if (history_level==3) then
557 [ + + ]: 124 : do ispden=1,dtset%nspden
558 [ + + ]: 8719180 : do ifft=1,nfft
559 : 8719056 : rhotmp=rhor(ifft,ispden)
560 : 8719056 : rhor(ifft,ispden)=electronpositron%rhor_ep(ifft,ispden)
561 : 8719118 : electronpositron%rhor_ep(ifft,ispden)=rhotmp
562 : : end do
563 : : end do
564 [ + + + + ]: 26157230 : rhog_ep(:,:)=rhog
565 : 62 : call fourdp(1,rhog,rhor,-1,mpi_enreg,nfft,1,ngfft,0)
566 : : ! If PAW, exchange "positronic" and "electronic" rhoij
567 [ + - ]: 62 : if (dtset%usepaw==1) then
568 [ + - + - ]: 62 : if (size(pawrhoij)>0.and.size(electronpositron%pawrhoij_ep)>0) then
569 [ - + + - : 1028 : ABI_MALLOC(pawrhoij_tmp,(my_natom))
+ - + - -
+ - + - +
+ + + - ]
570 : : call pawrhoij_alloc(pawrhoij_tmp,pawrhoij(1)%cplex_rhoij,pawrhoij(1)%nspden,&
571 : : & pawrhoij(1)%nspinor,pawrhoij(1)%nsppol,dtset%typat,&
572 : : & pawtab=pawtab,ngrhoij=pawrhoij(1)%ngrhoij,nlmnmix=pawrhoij(1)%lmnmix_sz,&
573 : : & use_rhoij_=pawrhoij(1)%use_rhoij_,use_rhoijres=pawrhoij(1)%use_rhoijres, &
574 : 62 : & comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
575 : 62 : call pawrhoij_copy(pawrhoij,pawrhoij_tmp)
576 : 62 : call pawrhoij_copy(electronpositron%pawrhoij_ep,pawrhoij)
577 : 62 : call pawrhoij_copy(pawrhoij_tmp,electronpositron%pawrhoij_ep)
578 : 62 : call pawrhoij_free(pawrhoij_tmp)
579 [ + - + + : 904 : ABI_FREE(pawrhoij_tmp)
- + - + -
+ - + - +
- + - + ]
580 : : end if
581 [ + - ]: 62 : if (allocated(electronpositron%nhat_ep)) then
582 [ + + ]: 124 : do ispden=1,dtset%nspden
583 [ + + ]: 8719180 : do ifft=1,nfft
584 : 8719056 : rhotmp=nhat(ifft,ispden)
585 : 8719056 : nhat(ifft,ispden)=electronpositron%nhat_ep(ifft,ispden)
586 : 8719118 : electronpositron%nhat_ep(ifft,ispden)=rhotmp
587 : : end do
588 : : end do
589 : : end if
590 : : end if
591 : : end if
592 : :
593 : : ! ===== COMPUTE HARTREE POTENTIAL ASSOCIATED TO RHOR_EP
594 [ + + ]: 79 : if (history_level==4) then
595 : 3 : call fourdp(1,rhog_ep,electronpositron%rhor_ep,-1,mpi_enreg,nfft,1,ngfft,0)
596 : : end if
597 [ + - ]: 79 : if (history_level/=-1) then
598 : : call hartre(1,gsqcut,dtset%icutcoul,dtset%usepaw,mpi_enreg,nfft,ngfft,&
599 : 79 : & dtset%nkpt,dtset%rcut,rhog_ep,rprimd,dtset%vcutgeo,electronpositron%vha_ep)
600 [ + + ]: 9924334 : electronpositron%vha_ep=-electronpositron%vha_ep
601 : : else
602 [ # # ]: 0 : electronpositron%vha_ep=zero
603 : : end if
604 [ - + ]: 79 : ABI_FREE(rhog_ep)
605 : :
606 : : ! ----------------------------------------------------------------------
607 : : ! Initialize/Update energies
608 : : ! ----------------------------------------------------------------------
609 : 79 : electronpositron%etotal_prev=etotal
610 : 79 : electronpositron%maxfor_prev=maxfor
611 : :
612 : : ! Inits/exchange news energies
613 : : ! Retrieve energy of non-evolving particle(s)
614 [ + + ]: 79 : if (history_level== 0) then
615 : 6 : call energies%init()
616 : 6 : call electronpositron%energies_ep%init()
617 [ + - ]: 6 : if (dtset%positron>0) energies%e0_electronpositron=etotal_read
618 [ - + ]: 6 : if (dtset%positron<0) energies%e0_electronpositron=zero
619 : : else if (history_level== 1) then
620 : : call electronpositron%energies_ep%init()
621 : : if (dtset%positron>0) energies%e0_electronpositron=etotal_read
622 [ + + ]: 73 : else if (history_level== 2) then
623 : 8 : call energies%copy(electronpositron%energies_ep)
624 : 8 : call energies%init()
625 : 8 : energies%e0_electronpositron=electronpositron%e0
626 [ + + ]: 65 : else if (history_level== 3) then
627 : 62 : call electronpositron%energies_ep%copy(energies_tmp)
628 : 62 : call energies%copy(electronpositron%energies_ep)
629 : 62 : call energies_tmp%copy(energies)
630 : 62 : energies%e0_electronpositron=electronpositron%e0
631 : : ! else if (history_level== 4) then
632 : : end if
633 : :
634 : : ! Adjust core psps energy
635 [ + + ]: 79 : if (electronpositron%calctype/=1) energies%e_corepsp=ecore/ucvol
636 : :
637 : : ! -----------------------------------------------------------------------------------------
638 : : ! Update wavefunctions
639 : : ! If electronpositron%calctype==1: cg are the positronic WFs, cg_ep are the electronic WFs
640 : : ! If electronpositron%calctype==2: cg are the electronic WFs, cg_ep are the positronic WFs
641 : : ! -----------------------------------------------------------------------------------------
642 [ + + - + ]: 79 : if (electronpositron%dimcg>0.or.electronpositron%dimcprj>0) then
643 : :
644 [ - + ]: 70 : if (history_level==0.or.history_level==1) then
645 [ # # # # ]: 0 : electronpositron%cg_ep=zero
646 : : end if
647 : :
648 [ + + ]: 70 : if (history_level==2) then
649 [ + - ]: 7 : if (electronpositron%dimcg>0) then
650 [ + + ]: 439563 : do icg=1,electronpositron%dimcg
651 [ + + ]: 1318675 : electronpositron%cg_ep(1:2,icg)=cg(1:2,icg)
652 : : end do
653 : : end if
654 [ + - + + ]: 7 : if (dtset%usepaw==1.and.electronpositron%dimcprj>0) then
655 : 3 : call pawcprj_copy(cprj,electronpositron%cprj_ep)
656 : : end if
657 : : end if
658 : :
659 [ + + ]: 70 : if (history_level==3) then
660 [ + - ]: 60 : if (electronpositron%dimcg>0) then
661 [ + + ]: 7045116 : do icg=1,electronpositron%dimcg
662 [ + + ]: 21135168 : cgtmp(1:2)=electronpositron%cg_ep(1:2,icg)
663 [ + + ]: 21135168 : electronpositron%cg_ep(1:2,icg)=cg(1:2,icg)
664 [ + + ]: 21135228 : cg(1:2,icg)=cgtmp(1:2)
665 : : end do
666 : : end if
667 [ + - + + ]: 60 : if (dtset%usepaw==1.and.electronpositron%dimcprj>0) then
668 [ - + + - : 6 : ABI_MALLOC(nlmn,(dtset%natom))
+ - + - -
+ - + ]
669 [ - + + - : 608 : ABI_MALLOC(cprj_tmp,(dtset%natom,electronpositron%dimcprj))
- + + - +
- + - - +
- + + + +
+ + - ]
670 [ + + ]: 10 : do iatom=1,dtset%natom
671 : 10 : nlmn(iatom)=cprj(iatom,1)%nlmn
672 : : end do
673 : 2 : call pawcprj_alloc(cprj_tmp,cprj(1,1)%ncpgr,nlmn)
674 [ - + ]: 2 : ABI_FREE(nlmn)
675 : 2 : call pawcprj_copy(electronpositron%cprj_ep,cprj_tmp)
676 : 2 : call pawcprj_copy(cprj,electronpositron%cprj_ep)
677 : 2 : call pawcprj_copy(cprj_tmp,cprj)
678 : 2 : call pawcprj_free(cprj_tmp)
679 [ + - + + : 482 : ABI_FREE(cprj_tmp)
- + - + -
+ ]
680 : : end if
681 : : end if
682 : :
683 : : end if ! dimcg>0 or dimcprj>0
684 : :
685 : : ! -----------------------------------------------------------------------------------------------------------
686 : : ! Initialize/Update occupations
687 : : ! If electronpositron%calctype==1: occ are the positronic occupations, occ_ep are the electronic occupations
688 : : ! If electronpositron%calctype==2: occ are the electronic occupations, occ_ep are the positronic occupations
689 : : ! -----------------------------------------------------------------------------------------------------------
690 : : ! When needed, precompute electronic occupations with semiconductor occupancies
691 : 79 : need_scocc=.false.
692 [ + + + + : 79 : if (electronpositron%dimocc>0.and.electronpositron%calctype==1.and. &
+ - ]
693 : 79 : & (history_level==0.or.history_level==1)) need_scocc=.true.
694 [ + + + - : 79 : if (electronpositron%calctype==2.and.ireadwf==0.and. &
+ + + + +
+ ]
695 : : & (history_level==0.or.history_level==2.or. &
696 : : & (history_level==3.and.electronpositron%dimocc==0))) need_scocc=.true.
697 [ - + ]: 77 : if (need_scocc) then
698 : 2 : nelect=-dtset%cellcharge(1)
699 [ + + ]: 10 : do iatom=1,dtset%natom
700 : 10 : nelect=nelect+dtset%ziontypat(dtset%typat(iatom))
701 : : end do
702 : 2 : maxocc=two/real(dtset%nsppol*dtset%nspinor,dp)
703 : 2 : nocc=int((nelect-tol8)/maxocc) + 1
704 : 2 : nocc=min(nocc,dtset%nband(1)*dtset%nsppol)
705 : 2 : occlast=nelect-maxocc*(nocc-1)
706 [ - + + - : 6 : ABI_MALLOC(scocc,(dtset%nband(1)*dtset%nsppol))
+ - + - -
+ - + ]
707 [ + + ]: 32 : scocc=zero
708 [ + - + + ]: 12 : if (1<nocc) scocc(1:nocc-1)=maxocc
709 [ + - ]: 2 : if (1<=nocc) scocc(nocc)=occlast
710 : : end if
711 : :
712 : : ! ===== PREVIOUS OCCUPATIONS OCC_EP:
713 [ + + ]: 79 : if (electronpositron%dimocc>0) then
714 [ - + ]: 70 : if (history_level==0.or.history_level==1) then
715 : : ! ----- Electronic from scratch
716 [ # # ]: 0 : if (electronpositron%calctype==1) then
717 : : ! Initialize electronic occupations with semiconductor occupancies
718 [ # # ]: 0 : do ikpt=1,dtset%nkpt
719 [ # # ]: 0 : do iband=1,dtset%nband(1)
720 [ # # ]: 0 : do isppol=1,dtset%nsppol
721 : : electronpositron%occ_ep(iband+dtset%nband(1)*(ikpt-1+dtset%nkpt*(isppol-1)))=&
722 : 0 : & scocc(isppol+dtset%nsppol*(iband-1))
723 : : end do
724 : : end do
725 : : end do
726 : : end if
727 : : ! ----- Positronic from scratch
728 [ # # ]: 0 : if (electronpositron%calctype==1) then
729 : : ! Initialize positronic occupations with only one positron (or less)
730 [ # # ]: 0 : electronpositron%occ_ep(:)=zero
731 : 0 : isppol=1;iocc=1
732 [ # # ]: 0 : do ikpt=1,dtset%nkpt
733 : 0 : electronpositron%occ_ep(iocc)=electronpositron%posocc
734 : 0 : iocc=iocc+dtset%nband(ikpt+dtset%nkpt*(isppol-1))
735 : : end do
736 : : end if
737 : : end if
738 : : ! ----- Deduced from occ in memory
739 [ + + ]: 70 : if (history_level==2) then
740 [ + + ]: 609 : electronpositron%occ_ep(:)=occ(:)
741 : : end if
742 : : end if ! dimocc>0
743 : :
744 : : ! ===== CURRENT OCCUPATIONS OCC:
745 [ + + + + : 79 : if (history_level==0.or.history_level==2.or.(history_level==3.and.electronpositron%dimocc==0)) then
+ + ]
746 [ + - ]: 16 : if (ireadwf==0) then
747 : : ! ----- Positronic from scratch
748 [ + + ]: 16 : if (electronpositron%calctype==1) then
749 : : ! Initialize positronic occupations with only one positron (or less)
750 [ + + ]: 808 : occ(:)=zero
751 : 14 : isppol=1;iocc=1
752 [ + + ]: 63 : do ikpt=1,dtset%nkpt
753 : 49 : occ(iocc)=electronpositron%posocc
754 : 63 : iocc=iocc+dtset%nband(ikpt+dtset%nkpt*(isppol-1))
755 : : end do
756 : : end if
757 : : ! ----- Electronic from scratch
758 [ + + ]: 16 : if (electronpositron%calctype==2) then
759 : : ! Initialize electronic occupations with semiconductor occupancies
760 [ + + ]: 10 : do ikpt=1,dtset%nkpt
761 [ + + ]: 130 : do iband=1,dtset%nband(1)
762 [ + + ]: 248 : do isppol=1,dtset%nsppol
763 : : occ(iband+dtset%nband(1)*(ikpt-1+dtset%nkpt*(isppol-1)))=&
764 : 240 : & scocc(isppol+dtset%nsppol*(iband-1))
765 : : end do
766 : : end do
767 : : end do
768 : : end if
769 : : end if
770 : : end if
771 : :
772 : : ! ===== EXCHANGE POSITRONIC AND ELECTRONIC OCCUPATIONS (CURRENT AND PREVIOUS)
773 [ + + + + ]: 76 : if (history_level==3.and.electronpositron%dimocc>0) then
774 [ + + ]: 6312 : do iocc=1,electronpositron%dimocc
775 : 6252 : occtmp=occ(iocc)
776 : 6252 : occ(iocc)=electronpositron%occ_ep(iocc)
777 : 6312 : electronpositron%occ_ep(iocc)=occtmp
778 : : end do
779 : : end if
780 : :
781 [ + + ]: 79 : if (need_scocc) then
782 [ - + ]: 2 : ABI_FREE(scocc)
783 : : end if
784 : :
785 : : ! -----------------------------------------------------------------------------------------------------------
786 : : ! Initialize/Update eigen energies
787 : : ! If electronpositron%calctype==1: eigen are the positronic eigen E, eigen_ep are the electronic eigen E
788 : : ! If electronpositron%calctype==2: eigen are the electronic eigen E, eigen_ep are the positronic eigen E
789 : : ! -----------------------------------------------------------------------------------------------------------
790 : :
791 : : ! ===== PREVIOUS EIGEN ENERGIES EIGEN_EP:
792 [ + + ]: 79 : if (electronpositron%dimeigen>0) then
793 [ - + ]: 70 : if (history_level==0.or.history_level==1) then
794 : : ! ----- Electronic or positronic from scratch
795 [ # # ]: 0 : electronpositron%eigen_ep(:)=zero
796 : : end if
797 : : ! ----- Deduced from eigen in memory
798 [ + + ]: 70 : if (history_level==2) then
799 [ + + ]: 609 : electronpositron%eigen_ep(:)=eigen(:)
800 : : end if
801 : : end if ! dimeigen>0
802 : :
803 : : ! ===== CURRENT EIGEN ENERGIES EIGEN:
804 [ + + + + : 79 : if (history_level==0.or.history_level==2.or.(history_level==3.and.electronpositron%dimeigen==0)) then
+ + ]
805 [ + - ]: 16 : if (ireadwf==0) then
806 : : ! ----- Electronic or positronic from scratch
807 [ + + ]: 930 : eigen(:)=zero
808 : : end if
809 : : end if
810 : :
811 : : ! ===== EXCHANGE POSITRONIC AND ELECTRONIC EIGEN ENERGIES (CURRENT AND PREVIOUS)
812 [ + + + + ]: 76 : if (history_level==3.and.electronpositron%dimeigen>0) then
813 [ + + ]: 6312 : do iocc=1,electronpositron%dimeigen
814 : 6252 : eigtmp=eigen(iocc)
815 : 6252 : eigen(iocc)=electronpositron%eigen_ep(iocc)
816 : 6312 : electronpositron%eigen_ep(iocc)=eigtmp
817 : : end do
818 : : end if
819 : :
820 : : ! In some cases cprj are kept in memory, so we have to update them before the call of vtorho
821 [ - + ]: 79 : if (dtset%cprj_in_memory==2) then
822 : 0 : iatom=0
823 : 0 : call wrtout(std_out,' Computing cprj from wavefunctions (positron)')
824 : : call ctocprj(atindx,cg,1,cprj,gmet,gprimd,iatom,0,&
825 : : & 0,dtset%istwfk,kg,dtset%kptns,mcg,mcprj,dtset%mgfft,dtset%mkmem,mpi_enreg,psps%mpsang,&
826 : : & dtset%mpw,dtset%natom,nattyp,dtset%nband,dtset%natom,ngfft,dtset%nkpt,dtset%nloalg,npwarr,dtset%nspinor,&
827 : : & dtset%nsppol,dtset%nsppol,dtset%ntypat,dtset%paral_kgb,ph1d,psps,rmet,dtset%typat,ucvol,dtfil%unpaw,&
828 : 0 : & xred,ylm,ylmgr)
829 : 0 : call wrtout(std_out,' cprj is computed')
830 : : end if
831 : :
832 : : ! =============================================
833 : : end if ! the type of e-p calculation changes
834 : : !=============================================
835 : :
836 : : !------------------------------------------------------------------
837 : : !Write messages
838 : : !------------------------------------------------------------------
839 [ + + + - ]: 525 : if (istep_mix==1.and.dtset%positron/=0) then
840 : : ! Log message
841 [ + + ]: 87 : if (electronpositron%calctype==0) then
842 : 8 : message = 'Were are now performing an electronic ground-state calculation...'
843 [ + + ]: 79 : else if (electronpositron%calctype==1) then
844 : 43 : message = 'Were are now performing a positronic ground-state calculation...'
845 [ + - ]: 36 : else if (electronpositron%calctype==2) then
846 : 36 : message = 'Were are now performing an electronic ground-state calculation in presence of a positron...'
847 : : end if
848 : 87 : ABI_COMMENT(message)
849 : : ! Output message
850 [ + + ]: 87 : if (dtset%positron<0) then
851 [ + + ]: 81 : if (electronpositron%calctype==0) then
852 : 8 : TypeCalcStrg='ELECTRONIC GROUND-STATE CALCULATION'
853 [ + + ]: 73 : else if (electronpositron%calctype==1) then
854 : 38 : TypeCalcStrg='POSITRONIC GROUND-STATE CALCULATION IN PRESENCE OF ELECTRONS AND IONS'
855 [ + - ]: 35 : else if (electronpositron%calctype==2) then
856 : 35 : TypeCalcStrg='ELECTRONIC GROUND-STATE CALCULATION IN PRESENCE OF A POSITRON'
857 : : end if
858 [ + + ]: 81 : if (istep>1) then
859 : 70 : write(message,'(2a,i3,2a)') ch10,'TC-DFT STEP ',electronpositron%istep,' - ',trim(TypeCalcStrg)
860 : : else
861 : 11 : write(message,'(a,i3,2a)') 'TC-DFT STEP ',electronpositron%istep,' - ',trim(TypeCalcStrg)
862 : : end if
863 : 81 : call wrtout(ab_out,message,'COLL')
864 : : end if
865 : : end if
866 : :
867 [ - + - + : 1050 : end subroutine setup_positron
- + - + -
- - - - -
- - - - -
- - - - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - - -
- - - - -
- - - - -
- - + - -
- - - - ]
868 : : !!***
869 : :
870 : : !!****f* ABINIT/poslifetime
871 : : !! NAME
872 : : !! poslifetime
873 : : !!
874 : : !! FUNCTION
875 : : !! Calculate the positron lifetime
876 : : !!
877 : : !! INPUTS
878 : : !! dtset <type(dataset_type)>=all input variables for this dataset
879 : : !! | nspden=number of spin-density components
880 : : !! | ntypat=number of atom types
881 : : !! | paral_kgb=flag controlling (k,g,bands) parallelization
882 : : !! | pawxcdev=Choice of XC development (0=no dev. (use of angular mesh) ; 1 or 2=dev. on moments)
883 : : !! | usepaw=flag for PAW
884 : : !! gprimd(3,3)= dimensional reciprocal space primitive translations
885 : : !! mpi_enreg= information about MPI parallelization
886 : : !! my_natom=number of atoms treated by current processor
887 : : !! n3xccc= dimension of the xccc3d array (0 or nfft).
888 : : !! nfft= number of FFT grid points
889 : : !! ngfft(18)= contain all needed information about 3D FFT
890 : : !! nhat(nfft,nspden)=charge compensation density (content depends on electronpositron%particle)
891 : : !! option= if 1, calculate positron lifetime for whole density
892 : : !! if 2, calculate positron lifetime for given state
893 : : !! if 3, calculate positron lifetime for given state with IPM
894 : : !! pawang <type(pawang)>=paw angular mesh and related data
895 : : !! pawrad(ntypat*usepaw) <type(pawrad_type)>=paw radial mesh and related data
896 : : !! pawrhoij(my_natom*usepaw) <type(pawrhoij_type)>= -PAW only- atomic occupancies
897 : : !! pawtab(ntypat*usepaw) <type(pawtab_type)>=paw tabulated starting data
898 : : !! rhor(nfft,nspden)=total electron/positron density (content depends on electronpositron%particle)
899 : : !! ucvol=unit cell volume in bohr**3.
900 : : !! xccc3d(n3xccc)=3D core electron density for XC core correction, bohr^-3
901 : : !! ===== Optional arguments, used only if option>1 =====
902 : : !! pawrhoij_dop_el(my_natom*usepaw) <type(pawrhoij_type)>= -PAW only- atomic occupancies of one state
903 : : !! rhor_dop_el(nfft)=electron density of given state for the state dependent scheme
904 : : !! ===== Optional argument =====
905 : : !! pawrhoij_ep(my_natom*usepaw) <type(pawrhoij_type)>= atomic occupancies to be used in place of
906 : : !! electronpositron%pawrhoij_ep
907 : : !!
908 : : !! OUTPUT
909 : : !! rate= annihilation rate of a given state needed for state dependent scheme for doppler broadening
910 : : !!
911 : : !! SIDE EFFECTS
912 : : !! electronpositron <type(electronpositron_type)>=quantities for the electron-positron annihilation
913 : : !!
914 : : !! SOURCE
915 : :
916 : 658 : subroutine poslifetime(dtset,electronpositron,gprimd,my_natom,mpi_enreg,n3xccc,nfft,ngfft,nhat,&
917 : 329 : & option,pawang,pawrad,pawrhoij,pawtab,rate,rate_paw,rhor,ucvol,xccc3d,&
918 : 312 : & rhor_dop_el,pawrhoij_dop_el,pawrhoij_ep) ! optional arguments
919 : :
920 : : !Arguments ------------------------------------
921 : : !scalars
922 : : integer,intent(in) :: my_natom,n3xccc,nfft,option
923 : : real(dp),intent(in) :: ucvol
924 : : real(dp),intent(out) :: rate,rate_paw
925 : : type(dataset_type), intent(in) :: dtset
926 : : type(electronpositron_type),pointer :: electronpositron
927 : : type(MPI_type),intent(in) :: mpi_enreg
928 : : type(pawang_type), intent(in) :: pawang
929 : : !arrays
930 : : integer,intent(in) :: ngfft(18)
931 : : real(dp),intent(in) :: gprimd(3,3),nhat(nfft,dtset%nspden*dtset%usepaw),xccc3d(n3xccc)
932 : : real(dp),intent(in),target :: rhor(nfft,dtset%nspden)
933 : : real(dp),optional,intent(in) :: rhor_dop_el(nfft)
934 : : type(pawrad_type),intent(in) :: pawrad(dtset%ntypat*dtset%usepaw)
935 : : type(pawrhoij_type),intent(in) :: pawrhoij(my_natom*dtset%usepaw)
936 : : type(pawrhoij_type),optional,intent(in) :: pawrhoij_dop_el(my_natom*dtset%usepaw)
937 : : type(pawrhoij_type),optional,target,intent(in) :: pawrhoij_ep(my_natom*dtset%usepaw)
938 : : type(pawtab_type),intent(in) :: pawtab(dtset%ntypat*dtset%usepaw)
939 : :
940 : : !Local variables-------------------------------
941 : : !scalars
942 : : integer :: cplex,iatom,ierr,ifft,igam,ii,ilm,ilm1,ilm2,iloop,ipt,ir,isel
943 : : integer :: itypat,iwarn,iwarnj,iwarnp,lm_size,lmn2_size,mesh_size
944 : : integer :: nfftot,ngamma,ngr,ngrad,nspden_ep,opt_dens,usecore
945 : : logical,parameter :: include_nhat_in_gamma=.false.
946 : : real(dp),parameter :: delta=1.d-4
947 : : real(dp) :: fact,fact2,intg
948 : : real(dp) :: lambda_core ,lambda_core_ipm ,lambda ,lambda_ipm
949 : : real(dp) :: lambda_core_paw,lambda_core_paw_ipm,lambda_paw,lambda_paw_ipm
950 : : real(dp) :: lifetime,lifetime_ipm,nbec,nbev,nbp,rdum,sqfpi,units
951 : : character(len=500) :: msg
952 : : !arrays
953 : 329 : integer,allocatable :: igamma(:)
954 : 329 : logical,allocatable :: lmselect(:),lmselect_ep(:),lmselect_dum(:)
955 : : real(dp) :: mpibuf(4)
956 : : real(dp),parameter :: qphon(3)=(/zero,zero,zero/),lsign(2)=(/one,-one/)
957 : 329 : real(dp),allocatable :: d1gam(:,:,:),d2gam(:,:,:),ff(:),gam_(:,:,:),gamma(:,:),gammam(:,:,:),gg(:,:)
958 : 329 : real(dp),allocatable :: grhocore2(:),grhocor2_(:),grhoe2(:),grho2_(:)
959 : 329 : real(dp),allocatable :: nhat1(:,:,:),nhat1_ep(:,:,:),nhat1_j(:,:,:)
960 : 329 : real(dp),allocatable :: rho_(:),rho_ep_(:),rho1(:,:,:),rho1_ep(:,:,:),rho1_j(:,:,:)
961 : 329 : real(dp),allocatable :: rhoarr1(:),rhoarr1_ep(:),rhoarr1_j(:),rhoarr2(:)
962 : 329 : real(dp),allocatable :: rhocore(:),rhocor_(:),rhoe(:,:),rhop(:,:),rhor_dop_el_(:)
963 : 329 : real(dp),allocatable :: rhosph(:),rhosph_ep(:),rhosph_j(:),rhotot(:,:),rhotot_ep(:,:)
964 : 329 : real(dp),allocatable :: rhotot_j(:,:),trho1(:,:,:),trho1_ep(:,:,:),trho1_j(:,:,:)
965 : 329 : real(dp),allocatable :: v1sum(:,:),v2sum(:,:,:)
966 : 329 : real(dp),pointer :: rhor_(:,:),rhor_ep_(:,:)
967 : 329 : type(pawrhoij_type),pointer :: pawrhoij_ep_(:)
968 : :
969 : : ! *************************************************************************
970 : :
971 : : DBG_ENTER("COLL")
972 : :
973 : : !Tests for developers
974 : 329 : if (.not.associated(electronpositron)) then
975 : 0 : msg='electronpositron variable must be associated!'
976 : 0 : ABI_BUG(msg)
977 : : end if
978 [ + + ]: 329 : if (option/=1) then
979 [ - + ]: 312 : if ((.not.present(rhor_dop_el)).or.(.not.present(pawrhoij_dop_el))) then
980 : 0 : msg='when option/=1, rhor_dop_el and pawrhoij_dop_el must be present!'
981 : 0 : ABI_BUG(msg)
982 : : end if
983 : : end if
984 : :
985 : : ! This to avoid using uninitialized variables.
986 : 329 : lambda_core = zero; lambda_paw = zero; lambda_core_paw = zero
987 : :
988 : : !Constants
989 : 329 : fact=0.0
990 : 329 : cplex=1;nspden_ep=1
991 : 329 : usecore=n3xccc/nfft
992 : 329 : nfftot=ngfft(1)*ngfft(2)*ngfft(3)
993 [ - + ]: 329 : ngrad=1;if (electronpositron%ixcpositron==3.or.electronpositron%ixcpositron==31) ngrad=2
994 : 329 : iwarn=0;iwarnj=0;iwarnp=1
995 : 329 : sqfpi=sqrt(four_pi)
996 : :
997 : : !Compatibility tests
998 [ - + ]: 329 : if (electronpositron%particle==EP_NOTHING) then
999 : 0 : msg='Not valid for electronpositron%particle=NOTHING!'
1000 : 0 : ABI_BUG(msg)
1001 : : end if
1002 [ - + ]: 329 : if (electronpositron%nfft/=nfft) then
1003 : 0 : msg='nfft/=electronpositron%nfft!'
1004 : 0 : ABI_BUG(msg)
1005 : : end if
1006 [ + + ]: 329 : if (dtset%usepaw==1) then
1007 [ - + - - ]: 328 : if(dtset%pawxcdev==0.and.ngrad==2) then
1008 : 0 : msg='GGA is not implemented for pawxcdev=0 (use dtset%pawxcdev/=0)!'
1009 : 0 : ABI_BUG(msg)
1010 : : end if
1011 : : end if
1012 : :
1013 : : !Select type(s) of enhancement factor
1014 [ + + + + ]: 329 : if ((electronpositron%ixcpositron==1.or.electronpositron%ixcpositron==3).and.option==1) then
1015 : 11 : ngamma=2
1016 [ - + ]: 11 : ABI_MALLOC(igamma,(ngamma))
1017 : 11 : igamma(1)=1;igamma(2)=2
1018 : : else
1019 : 318 : ngamma=1
1020 [ - + ]: 318 : ABI_MALLOC(igamma,(ngamma))
1021 [ - + ]: 318 : if (electronpositron%ixcpositron==-1) igamma(1)=0
1022 [ + + ]: 318 : if (electronpositron%ixcpositron== 2) igamma(1)=4
1023 [ + + ]: 318 : if (electronpositron%ixcpositron==11.or.electronpositron%ixcpositron==31) igamma(1)=3
1024 [ + + ]: 318 : if (electronpositron%ixcpositron==1.or.electronpositron%ixcpositron==3) igamma(1)=2
1025 : : end if
1026 : :
1027 : : !Select density according to nhat choice
1028 [ + + ]: 329 : if (dtset%usepaw==0.or.include_nhat_in_gamma) then
1029 : 1 : rhor_ => rhor
1030 : 1 : rhor_ep_ => electronpositron%rhor_ep
1031 : : else
1032 [ - + + - : 1312 : ABI_MALLOC(rhor_,(nfft,dtset%nspden))
- + + - +
- + - - +
- + ]
1033 [ - + + - : 984 : ABI_MALLOC(rhor_ep_,(nfft,dtset%nspden))
- + + - -
+ - + ]
1034 [ + - + + : 15474040 : rhor_=rhor-nhat
+ + + + +
+ ]
1035 [ + - + + : 15474040 : rhor_ep_=electronpositron%rhor_ep-electronpositron%nhat_ep
+ + + + +
+ ]
1036 : : end if
1037 : :
1038 : : !Eventually overwrite electronpositron%pawrhoij_ep
1039 [ + + ]: 329 : if (present(pawrhoij_ep)) then
1040 : 312 : pawrhoij_ep_ => pawrhoij_ep
1041 : : else
1042 : 17 : pawrhoij_ep_ => electronpositron%pawrhoij_ep
1043 : : end if
1044 : :
1045 : : !Loop on different enhancement factors
1046 [ + + ]: 669 : do igam=1,ngamma
1047 : :
1048 : : ! Compute electron-positron annihilation rate using pseudo densities (plane waves)
1049 : : ! ----------------------------------------------------------------------------------------
1050 : :
1051 : : ! Select the densities and make them positive
1052 [ - + + - : 1360 : ABI_MALLOC(rhoe,(nfft,nspden_ep))
- + + - +
- + - - +
- + ]
1053 [ - + + - : 1020 : ABI_MALLOC(rhop,(nfft,nspden_ep))
- + + - -
+ - + ]
1054 [ + + ]: 340 : if (electronpositron%particle==EP_ELECTRON) then
1055 [ + + + + ]: 920061 : rhoe(:,1)=rhor_ep_(:,1);rhop(:,1)=rhor_(:,1)
1056 [ + - ]: 331 : else if (electronpositron%particle==EP_POSITRON) then
1057 [ + + + + ]: 16678771 : rhoe(:,1)=rhor_(:,1);rhop(:,1)=rhor_ep_(:,1)
1058 : : end if
1059 : 340 : call mkdenpos(iwarn ,nfft,nspden_ep,1,rhoe,dtset%xc_denpos)
1060 : 340 : call mkdenpos(iwarnp,nfft,nspden_ep,1,rhop,dtset%xc_denpos)
1061 [ + + ]: 340 : if (option/=1) then
1062 [ - + + - : 936 : ABI_MALLOC(rhor_dop_el_,(nfft))
+ - + - -
+ - + +
- ]
1063 [ + + ]: 6551160 : rhor_dop_el_(:)=rhor_dop_el(:)
1064 : 312 : call mkdenpos(iwarnp,nfft,1,1,rhor_dop_el_,dtset%xc_denpos)
1065 : : end if
1066 : :
1067 : : ! Compute enhancement factor at each FFT grid point
1068 : : ! gamma(:,1): using total electronic density
1069 : : ! gamma(:,2): using valence electronic density
1070 [ - + + - : 1020 : ABI_MALLOC(gamma,(nfft,2))
+ - + - -
+ - + ]
1071 [ + + ]: 340 : if (option==1.or.option==2) then
1072 : : call gammapositron_fft(electronpositron,gamma,gprimd,igamma(igam),mpi_enreg,&
1073 : 184 : & n3xccc,nfft,ngfft,rhoe,rhop,xccc3d)
1074 : : else
1075 [ + + + + ]: 6551316 : gamma=one
1076 : : end if
1077 : :
1078 : : ! Compute positron annihilation rates
1079 : 340 : lambda =zero;lambda_ipm =zero
1080 : 340 : lambda_core=zero;lambda_core_ipm=zero
1081 [ + + ]: 340 : if (option==1) then
1082 [ + + ]: 2248426 : do ifft=1,nfft
1083 : 2248398 : lambda =lambda +rhop(ifft,1)*rhoe(ifft,1)*gamma(ifft,1)
1084 : 2248426 : lambda_ipm=lambda_ipm+rhop(ifft,1)*rhoe(ifft,1)*gamma(ifft,2)
1085 : : end do
1086 : : else
1087 [ + + ]: 6551160 : do ifft=1,nfft
1088 : 6550848 : lambda =lambda +rhop(ifft,1)*rhor_dop_el_(ifft)*gamma(ifft,1)
1089 : 6551160 : lambda_ipm=lambda_ipm+rhop(ifft,1)*rhor_dop_el_(ifft)*gamma(ifft,2)
1090 : : end do
1091 : : end if
1092 [ + + ]: 340 : if (usecore==1) then
1093 [ + + ]: 4941522 : do ifft=1,nfft
1094 : 4941378 : lambda_core =lambda_core +rhop(ifft,1)*xccc3d(ifft)*gamma(ifft,1)
1095 : 4941522 : lambda_core_ipm=lambda_core_ipm+rhop(ifft,1)*xccc3d(ifft)
1096 : : end do
1097 : : end if
1098 : 340 : lambda =lambda *ucvol/dble(nfftot)
1099 : 340 : lambda_ipm =lambda_ipm *ucvol/dble(nfftot)
1100 : 340 : lambda_core =lambda_core *ucvol/dble(nfftot)
1101 : 340 : lambda_core_ipm=lambda_core_ipm*ucvol/dble(nfftot)
1102 [ - + ]: 340 : ABI_FREE(gamma)
1103 [ - + ]: 340 : ABI_FREE(rhoe)
1104 [ - + ]: 340 : ABI_FREE(rhop)
1105 [ + + ]: 340 : if (option/=1) then
1106 [ - + ]: 312 : ABI_FREE(rhor_dop_el_)
1107 : : end if
1108 : : ! NC pseudopotential: check electrons/positron number
1109 [ + + + + ]: 340 : if (dtset%usepaw==0.and.igam==ngamma) then
1110 : 1 : nbec=zero;nbev=zero;nbp=zero
1111 [ - + ]: 1 : if (electronpositron%particle==EP_ELECTRON) then
1112 [ + + ]: 19684 : do ifft=1,nfft
1113 : 19683 : nbec=nbec+xccc3d(ifft)
1114 : 19683 : nbev=nbev+electronpositron%rhor_ep(ifft,1)
1115 : 19684 : nbp =nbp +rhor(ifft,1)
1116 : : end do
1117 : : else
1118 [ # # ]: 0 : do ifft=1,nfft
1119 : 0 : nbec=nbec+xccc3d(ifft)
1120 : 0 : nbev=nbev+rhor(ifft,1)
1121 : 0 : nbp =nbp +electronpositron%rhor_ep(ifft,1)
1122 : : end do
1123 : : end if
1124 : 1 : nbec=nbec*ucvol/dble(nfftot)
1125 : 1 : nbev=nbev*ucvol/dble(nfftot)
1126 : 1 : nbp =nbp *ucvol/dble(nfftot)
1127 : : end if
1128 : :
1129 : : ! MPI parallelization
1130 [ - + ]: 340 : if(mpi_enreg%nproc_fft>1)then
1131 : 0 : call xmpi_sum(lambda ,mpi_enreg%comm_fft,ierr)
1132 : 0 : call xmpi_sum(lambda_ipm,mpi_enreg%comm_fft,ierr)
1133 : 0 : call xmpi_sum(lambda_core ,mpi_enreg%comm_fft,ierr)
1134 : 0 : call xmpi_sum(lambda_core_ipm,mpi_enreg%comm_fft,ierr)
1135 [ # # # # ]: 0 : if (dtset%usepaw==0.and.igam==ngamma) then
1136 : 0 : call xmpi_sum(nbec,mpi_enreg%comm_fft,ierr)
1137 : 0 : call xmpi_sum(nbev,mpi_enreg%comm_fft,ierr)
1138 : 0 : call xmpi_sum(nbp ,mpi_enreg%comm_fft,ierr)
1139 : : end if
1140 : : end if
1141 : :
1142 : :
1143 : : ! PAW: add on-site contributions to electron-positron annihilation rate
1144 : : ! ----------------------------------------------------------------------------------------
1145 [ + + ]: 340 : if (dtset%usepaw==1) then
1146 : :
1147 : 338 : lambda_paw =zero;lambda_paw_ipm =zero
1148 : 338 : lambda_core_paw=zero;lambda_core_paw_ipm=zero
1149 : :
1150 : : ! Loop on atoms
1151 [ + + ]: 1294 : do iatom=1,my_natom
1152 : :
1153 : 956 : itypat=pawrhoij(iatom)%itypat
1154 : 956 : lmn2_size=pawtab(itypat)%lmn2_size
1155 : 956 : mesh_size=pawtab(itypat)%mesh_size
1156 : 956 : lm_size=pawtab(itypat)%lcut_size**2
1157 : 956 : cplex=1
1158 [ - + ]: 956 : ngr=0;if (ngrad==2) ngr=mesh_size
1159 : :
1160 : : ! Allocations of "on-site" densities
1161 [ - + + - : 4780 : ABI_MALLOC(rho1 ,(cplex*mesh_size,lm_size,nspden_ep))
- + + - -
+ + - + -
+ - - + -
+ ]
1162 [ - + + - : 3824 : ABI_MALLOC(trho1,(cplex*mesh_size,lm_size,nspden_ep))
- + + - -
+ + - - +
- + ]
1163 [ - + + - : 3824 : ABI_MALLOC(rho1_ep ,(cplex*mesh_size,lm_size,nspden_ep))
- + + - -
+ + - - +
- + ]
1164 [ - + + - : 3824 : ABI_MALLOC(trho1_ep,(cplex*mesh_size,lm_size,nspden_ep))
- + + - -
+ + - - +
- + ]
1165 [ + + ]: 956 : if (option/=1) then
1166 [ - + + - : 2944 : ABI_MALLOC(rho1_j ,(cplex*mesh_size,lm_size,nspden_ep))
- + + - -
+ + - - +
- + ]
1167 [ - + + - : 2944 : ABI_MALLOC(trho1_j,(cplex*mesh_size,lm_size,nspden_ep))
- + + - -
+ + - - +
- + ]
1168 : : else
1169 [ - + ]: 220 : ABI_MALLOC(rho1_j ,(0,0,0))
1170 [ - + ]: 220 : ABI_MALLOC(trho1_j,(0,0,0))
1171 : : end if
1172 : : if (include_nhat_in_gamma) then
1173 : : ABI_MALLOC(nhat1,(cplex*mesh_size,lm_size,nspden_ep))
1174 : : ABI_MALLOC(nhat1_ep,(cplex*mesh_size,lm_size,nspden_ep))
1175 : : else
1176 [ - + ]: 956 : ABI_MALLOC(nhat1,(0,0,0))
1177 [ - + ]: 956 : ABI_MALLOC(nhat1_ep,(0,0,0))
1178 : : end if
1179 : : if (include_nhat_in_gamma.and.option/=1) then
1180 : : ABI_MALLOC(nhat1_j,(cplex*mesh_size,lm_size,nspden_ep))
1181 : : else
1182 [ - + ]: 956 : ABI_MALLOC(nhat1_j,(0,0,0))
1183 : : end if
1184 [ - + + - : 2868 : ABI_MALLOC(lmselect,(lm_size))
+ - + - -
+ - + ]
1185 [ - + + - : 1912 : ABI_MALLOC(lmselect_ep,(lm_size))
- + - + ]
1186 [ - + + - : 1912 : ABI_MALLOC(lmselect_dum,(lm_size))
- + + - ]
1187 : :
1188 : : ! Compute "on-site" densities (n1, ntild1, nhat1) for electron and positron =====
1189 [ + + ]: 9560 : lmselect(:)=.true.
1190 : 956 : opt_dens=1;if (include_nhat_in_gamma) opt_dens=0
1191 : : call pawdensities(rdum,cplex,iatom,lmselect,lmselect_dum,lm_size,nhat1,nspden_ep,1,&
1192 : : & 0,opt_dens,-1,0,pawang,0,pawrad(itypat),pawrhoij(iatom),&
1193 : 956 : & pawtab(itypat),rho1,trho1)
1194 [ + + ]: 9560 : lmselect_ep(:)=.true.
1195 : : call pawdensities(rdum,cplex,iatom,lmselect_ep,lmselect_dum,lm_size,nhat1_ep,nspden_ep,1,&
1196 : : & 0,opt_dens,-1,0,pawang,0,pawrad(itypat),pawrhoij_ep_(iatom),&
1197 : 956 : & pawtab(itypat),rho1_ep,trho1_ep)
1198 : :
1199 : : ! For state dependent scheme in Doppler =====
1200 : : ! Compute "on-site" densities (n1, ntild1, nhat1) for a given electron state j=====
1201 [ + + ]: 956 : if (option/=1) then
1202 : : opt_dens=1;if (include_nhat_in_gamma) opt_dens=0
1203 : : call pawdensities(rdum,cplex,iatom,lmselect,lmselect_dum,lm_size,nhat1_j,nspden_ep,1,&
1204 : : & 0,opt_dens,-1,0,pawang,0,pawrad(itypat),pawrhoij_dop_el(iatom),&
1205 : 736 : & pawtab(itypat),rho1_j,trho1_j)
1206 : : end if
1207 : :
1208 : : ! Compute contribution to annihilation rate:
1209 : : ! Loop: first step: compute all-electron contribution (from n^1, n_c)
1210 : : ! 2nd step: compute pseudo contribution (from tild_n^1, hat_n^1, tild_n_c)
1211 [ + + ]: 2868 : do iloop=1,2
1212 [ + + ]: 1912 : if (iloop==1) usecore=1
1213 : 956 : if (iloop==2) usecore=pawtab(itypat)%usetcore
1214 [ - + + - : 5736 : ABI_MALLOC(rhocore,(mesh_size))
+ - + - -
+ - + -
+ ]
1215 : :
1216 : : ! First formalism: use densities on r,theta,phi
1217 [ - + ]: 1912 : if (dtset%pawxcdev==0) then
1218 : :
1219 [ # # # # : 0 : ABI_MALLOC(gamma,(mesh_size,2))
# # # # #
# # # ]
1220 [ # # # # : 0 : ABI_MALLOC(rhoarr1,(mesh_size))
# # # # ]
1221 [ # # # # : 0 : ABI_MALLOC(rhoarr1_ep,(mesh_size))
# # # # ]
1222 [ # # ]: 0 : if (option/=1) then
1223 [ # # # # : 0 : ABI_MALLOC(rhoarr1_j,(mesh_size))
# # # # #
# ]
1224 : : end if
1225 : : ! Loop on the angular part
1226 [ # # ]: 0 : do ipt=1,pawang%angl_size
1227 : : ! Build densities
1228 [ # # # # : 0 : rhoarr1=zero;rhoarr1_ep=zero;rhocore=zero
# # ]
1229 [ # # # # ]: 0 : if (option/=1) rhoarr1_j=zero
1230 [ # # ]: 0 : if (iloop==1) then
1231 [ # # ]: 0 : do ilm=1,lm_size
1232 [ # # # # ]: 0 : if (lmselect(ilm)) rhoarr1(:)=rhoarr1(:)+rho1(:,ilm,1)*pawang%ylmr(ilm,ipt)
1233 : : end do
1234 [ # # ]: 0 : if (option/=1) then
1235 [ # # ]: 0 : do ilm=1,lm_size
1236 [ # # # # ]: 0 : if (lmselect(ilm)) rhoarr1_j(:)=rhoarr1_j(:)+rho1_j(:,ilm,1)*pawang%ylmr(ilm,ipt)
1237 : : end do
1238 : : end if
1239 [ # # ]: 0 : do ilm=1,lm_size
1240 [ # # # # ]: 0 : if (lmselect_ep(ilm)) rhoarr1_ep(:)=rhoarr1_ep(:)+rho1_ep(:,ilm,1)*pawang%ylmr(ilm,ipt)
1241 : : end do
1242 [ # # # # ]: 0 : if (usecore==1) rhocore(:)=pawtab(itypat)%coredens(:)
1243 : : else
1244 : : if (include_nhat_in_gamma) then
1245 : : do ilm=1,lm_size
1246 : : if (lmselect(ilm)) rhoarr1(:)=rhoarr1(:)+(trho1(:,ilm,1)+nhat1(:,ilm,1))*pawang%ylmr(ilm,ipt)
1247 : : end do
1248 : : if (option/=1) then
1249 : : do ilm=1,lm_size
1250 : : if (lmselect(ilm)) rhoarr1_j(:)=rhoarr1_j(:)+(trho1_j(:,ilm,1)+nhat1_j(:,ilm,1))*pawang%ylmr(ilm,ipt)
1251 : : end do
1252 : : end if
1253 : : do ilm=1,lm_size
1254 : : if (lmselect_ep(ilm)) rhoarr1_ep(:)=rhoarr1_ep(:)+(trho1_ep(:,ilm,1)+nhat1_ep(:,ilm,1))*pawang%ylmr(ilm,ipt)
1255 : : end do
1256 : : else
1257 [ # # ]: 0 : do ilm=1,lm_size
1258 [ # # # # ]: 0 : if (lmselect(ilm)) rhoarr1(:)=rhoarr1(:)+trho1(:,ilm,1)*pawang%ylmr(ilm,ipt)
1259 : : end do
1260 [ # # ]: 0 : if (option/=1) then
1261 [ # # ]: 0 : do ilm=1,lm_size
1262 [ # # # # ]: 0 : if (lmselect(ilm)) rhoarr1_j(:)=rhoarr1(:)+trho1_j(:,ilm,1)*pawang%ylmr(ilm,ipt)
1263 : : end do
1264 : : end if
1265 [ # # ]: 0 : do ilm=1,lm_size
1266 [ # # # # ]: 0 : if (lmselect_ep(ilm)) rhoarr1_ep(:)=rhoarr1_ep(:)+trho1_ep(:,ilm,1)*pawang%ylmr(ilm,ipt)
1267 : : end do
1268 : : end if
1269 [ # # # # ]: 0 : if (usecore==1) rhocore(:)=pawtab(itypat)%tcoredens(:,1)
1270 : : end if
1271 : : ! Make the densities positive
1272 [ # # ]: 0 : if (electronpositron%particle==EP_ELECTRON) then
1273 : 0 : call mkdenpos(iwarnp,mesh_size,1,1,rhoarr1 ,dtset%xc_denpos)
1274 : 0 : call mkdenpos(iwarn ,mesh_size,1,1,rhoarr1_ep,dtset%xc_denpos)
1275 [ # # ]: 0 : else if (electronpositron%particle==EP_POSITRON) then
1276 : 0 : call mkdenpos(iwarn ,mesh_size,1,1,rhoarr1 ,dtset%xc_denpos)
1277 : 0 : call mkdenpos(iwarnp,mesh_size,1,1,rhoarr1_ep,dtset%xc_denpos)
1278 [ # # ]: 0 : if (option/=1) then
1279 : 0 : call mkdenpos(iwarnj,mesh_size,1,1,rhoarr1_j,dtset%xc_denpos)
1280 : : end if
1281 : : end if
1282 : : ! Compute Gamma
1283 [ # # # # : 0 : ABI_MALLOC(grhoe2,(ngr))
# # # # #
# # # #
# ]
1284 [ # # # # : 0 : ABI_MALLOC(grhocore2,(ngr))
# # # # #
# ]
1285 [ # # ]: 0 : if (option==1.or.option==2) then
1286 [ # # ]: 0 : if (electronpositron%particle==EP_ELECTRON) then
1287 : : call gammapositron(gamma,grhocore2,grhoe2,igamma(igam),ngr,mesh_size,&
1288 : 0 : & rhocore,rhoarr1_ep,rhoarr1,usecore)
1289 [ # # ]: 0 : else if (electronpositron%particle==EP_POSITRON) then
1290 : : call gammapositron(gamma,grhocore2,grhoe2,igamma(igam),ngr,mesh_size,&
1291 : 0 : & rhocore,rhoarr1,rhoarr1_ep,usecore)
1292 : : end if
1293 : : else
1294 [ # # # # ]: 0 : gamma(:,:)=one
1295 : : end if
1296 [ # # ]: 0 : ABI_FREE(grhoe2)
1297 [ # # ]: 0 : ABI_FREE(grhocore2)
1298 : : ! Compute contribution to annihilation rates
1299 [ # # # # : 0 : ABI_MALLOC(ff,(mesh_size))
# # # # #
# ]
1300 [ # # # # ]: 0 : if (option/=1) rhoarr1(:)=rhoarr1_j(:)
1301 [ # # ]: 0 : do ii=1,4
1302 [ # # ]: 0 : if (ii==1) ff(1:mesh_size)=rhoarr1(1:mesh_size)*rhoarr1_ep(1:mesh_size) &
1303 [ # # ]: 0 : & *gamma(1:mesh_size,1)*pawrad(itypat)%rad(1:mesh_size)**2
1304 [ # # ]: 0 : if (ii==2) ff(1:mesh_size)=rhoarr1(1:mesh_size)*rhoarr1_ep(1:mesh_size) &
1305 [ # # ]: 0 : & *gamma(1:mesh_size,2)*pawrad(itypat)%rad(1:mesh_size)**2
1306 [ # # ]: 0 : if (electronpositron%particle==EP_ELECTRON) then
1307 [ # # ]: 0 : if (ii==3) ff(1:mesh_size)=rhoarr1(1:mesh_size)*rhocore(1:mesh_size) &
1308 [ # # ]: 0 : & *gamma(1:mesh_size,1)*pawrad(itypat)%rad(1:mesh_size)**2
1309 [ # # ]: 0 : if (ii==4) ff(1:mesh_size)=rhoarr1(1:mesh_size)*rhocore(1:mesh_size) &
1310 [ # # ]: 0 : & *pawrad(itypat)%rad(1:mesh_size)**2
1311 : : else
1312 [ # # ]: 0 : if (ii==3) ff(1:mesh_size)=rhoarr1_ep(1:mesh_size)*rhocore(1:mesh_size) &
1313 [ # # ]: 0 : & *gamma(1:mesh_size,1)*pawrad(itypat)%rad(1:mesh_size)**2
1314 [ # # ]: 0 : if (ii==4) ff(1:mesh_size)=rhoarr1_ep(1:mesh_size)*rhocore(1:mesh_size) &
1315 [ # # ]: 0 : & *pawrad(itypat)%rad(1:mesh_size)**2
1316 : : end if
1317 : 0 : call simp_gen(intg,ff,pawrad(itypat))
1318 : 0 : intg=intg*pawang%angwgth(ipt)*four_pi
1319 [ # # ]: 0 : if (ii==1) lambda_paw =lambda_paw +lsign(iloop)*intg
1320 [ # # ]: 0 : if (ii==2) lambda_paw_ipm =lambda_paw_ipm +lsign(iloop)*intg
1321 [ # # ]: 0 : if (ii==3) lambda_core_paw =lambda_core_paw +lsign(iloop)*intg
1322 [ # # ]: 0 : if (ii==4) lambda_core_paw_ipm=lambda_core_paw_ipm+lsign(iloop)*intg
1323 : : end do
1324 [ # # ]: 0 : ABI_FREE(ff)
1325 : : end do ! ipt
1326 [ # # ]: 0 : ABI_FREE(gamma)
1327 [ # # ]: 0 : ABI_FREE(rhoarr1)
1328 [ # # ]: 0 : ABI_FREE(rhoarr1_ep)
1329 [ # # ]: 0 : if (option/=1) then
1330 [ # # ]: 0 : ABI_FREE(rhoarr1_j)
1331 : : end if
1332 : :
1333 : : ! Second formalism: use (l,m) moments for densities
1334 : : else if (dtset%pawxcdev/=0) then
1335 : :
1336 : : ! Build densities
1337 [ - + + - : 7648 : ABI_MALLOC(gammam,(mesh_size,2,lm_size))
- + + - +
- + - - +
- + ]
1338 [ - + + - : 7648 : ABI_MALLOC(rhotot,(mesh_size,lm_size))
- + + - +
- + - - +
- + ]
1339 [ - + + - : 5736 : ABI_MALLOC(rhotot_ep,(mesh_size,lm_size))
- + + - -
+ - + ]
1340 [ - + + - : 3824 : ABI_MALLOC(rhosph,(mesh_size))
- + - + -
+ ]
1341 [ - + + - : 3824 : ABI_MALLOC(rhosph_ep,(mesh_size))
- + - + -
+ ]
1342 [ + + ]: 1912 : if (option/=1) then
1343 [ - + + - : 4416 : ABI_MALLOC(rhotot_j,(mesh_size,lm_size))
- + + - -
+ - + -
+ ]
1344 [ - + + - : 2944 : ABI_MALLOC(rhosph_j,(mesh_size))
- + - + -
+ ]
1345 : : end if
1346 [ + + + + ]: 535816 : if (usecore==0) rhocore(:)=zero
1347 [ + + ]: 1912 : if (iloop==1) then
1348 [ + + + + ]: 10112456 : rhotot (:,:)=rho1 (:,:,1)
1349 [ + + + + ]: 10112456 : rhotot_ep(:,:)=rho1_ep(:,:,1)
1350 [ + + + + : 7530140 : if (option/=1) rhotot_j (:,:)=rho1_j (:,:,1)
+ + ]
1351 [ + - + + ]: 1123500 : if (usecore==1) rhocore(:)=pawtab(itypat)%coredens(:)
1352 : : else
1353 : : if (include_nhat_in_gamma) then
1354 : : rhotot (:,:)=trho1 (:,:,1)+nhat1 (:,:,1)
1355 : : rhotot_ep(:,:)=trho1_ep(:,:,1)+nhat1_ep(:,:,1)
1356 : : if (option/=1) rhotot_j (:,:)=trho1_j (:,:,1)+nhat1_j (:,:,1)
1357 : : else
1358 [ + + + + ]: 10112456 : rhotot (:,:)=trho1 (:,:,1)
1359 [ + + + + ]: 10112456 : rhotot_ep(:,:)=trho1_ep(:,:,1)
1360 [ + + + + : 7530140 : if (option/=1) rhotot_j (:,:)=trho1_j (:,:,1)
+ + ]
1361 : : end if
1362 [ + + + + ]: 589988 : if (usecore==1) rhocore(:)=pawtab(itypat)%tcoredens(:,1)
1363 : : end if
1364 [ + + ]: 2247000 : rhosph (:)=rhotot (:,1)/sqfpi
1365 [ + + ]: 2247000 : rhosph_ep(:)=rhotot_ep(:,1)/sqfpi
1366 [ + + + + ]: 1673592 : if (option/=1) rhosph_j (:)=rhotot_j(:,1)/sqfpi
1367 : : ! Make spherical densities positive
1368 [ + + ]: 1912 : if (electronpositron%particle==EP_ELECTRON) then
1369 : 84 : call mkdenpos(iwarnp,mesh_size,1,1,rhosph ,dtset%xc_denpos)
1370 : 84 : call mkdenpos(iwarn ,mesh_size,1,1,rhosph_ep,dtset%xc_denpos)
1371 [ + - ]: 1828 : else if (electronpositron%particle==EP_POSITRON) then
1372 : 1828 : call mkdenpos(iwarn ,mesh_size,1,1,rhosph ,dtset%xc_denpos)
1373 : 1828 : call mkdenpos(iwarnp,mesh_size,1,1,rhosph_ep,dtset%xc_denpos)
1374 [ + + ]: 1828 : if (option/=1) then
1375 : 1472 : call mkdenpos(iwarnp,mesh_size,1,1,rhosph_j,dtset%xc_denpos)
1376 : : end if
1377 : : end if
1378 : : ! Need gradients of electronic densities for GGA
1379 [ + - - - : 5736 : ABI_MALLOC(grhoe2,(ngr))
+ - - + -
+ - + -
+ ]
1380 [ + - - - : 3824 : ABI_MALLOC(grhocore2,(ngr))
- + - + -
+ ]
1381 [ - + ]: 1912 : if (ngr>0) then
1382 [ # # ]: 0 : if (electronpositron%particle==EP_ELECTRON) then
1383 : 0 : call nderiv_gen(grhoe2,rhosph_ep,pawrad(itypat))
1384 [ # # ]: 0 : else if (electronpositron%particle==EP_POSITRON) then
1385 : 0 : call nderiv_gen(grhoe2,rhosph,pawrad(itypat))
1386 : : end if
1387 [ # # ]: 0 : grhoe2(:)=grhoe2(:)**2
1388 [ # # ]: 0 : if (usecore==1) then
1389 : 0 : call nderiv_gen(grhocore2,rhocore,pawrad(itypat))
1390 [ # # ]: 0 : grhocore2(:)=grhocore2(:)**2
1391 : : end if
1392 : : end if
1393 : : ! Compute Gamma for (rho-,rho+),
1394 : : ! (rho- +drho-,rho+), (rho- -drho-,rho+),
1395 : : ! (rho-,rho+ +drho+), (rho-,rho+ -drho+),
1396 : : ! (rho- +drho-,rho+ +drho+), (rho- -drho-,rho+ -drho+)
1397 : : ! Do a seven steps loop
1398 [ - + + - : 7648 : ABI_MALLOC(gam_,(mesh_size,2,7))
+ - + - +
- - + -
+ ]
1399 [ - + + - : 3824 : ABI_MALLOC(rho_,(mesh_size))
- + - + ]
1400 [ - + + - : 3824 : ABI_MALLOC(rho_ep_,(mesh_size))
- + - + ]
1401 [ - + + - : 3824 : ABI_MALLOC(rhocor_,(mesh_size))
- + - + ]
1402 [ + - - - : 3824 : ABI_MALLOC(grho2_,(ngr))
- + - + ]
1403 [ + - - - : 3824 : ABI_MALLOC(grhocor2_,(ngr))
- + + - ]
1404 [ + + ]: 15296 : do ii=1,7
1405 : : ! Apply delta to get perturbed densities
1406 [ + + + + : 43449672 : rho_(:)=rhosph(:);rho_ep_(:)=rhosph_ep(:);if (usecore==1) rhocor_(:)=rhocore(:)
+ + + + ]
1407 [ - + - - ]: 13384 : if (ngr>0) grho2_(:)=grhoe2(:)
1408 [ - + - - ]: 13384 : if (ngr>0) grhocor2_(:)=grhocore2(:)
1409 [ + + ]: 13384 : if (ii==2.or.ii==4.or.ii==6) fact=(one+delta)
1410 [ + + ]: 13384 : if (ii==3.or.ii==5.or.ii==7) fact=(one-delta)
1411 : 13384 : fact2=fact**2
1412 [ + + ]: 13384 : if (ii==2.or.ii==3.or.ii==6.or.ii==7) then
1413 [ + + ]: 8988000 : rho_(:)=fact*rho_(:)
1414 [ + + ]: 7648 : if (electronpositron%particle==EP_POSITRON) then
1415 [ - + - - ]: 7312 : if (ngr>0) grho2_(:)=fact2*grho2_(:)
1416 [ + + + + ]: 6440192 : if (usecore==1)rhocor_(:)=fact*rhocor_(:)
1417 [ - + - - : 7312 : if (ngr>0.and.usecore==1) grhocor2_(:)=fact2*grhocor2_(:)
- - ]
1418 : : end if
1419 : : end if
1420 [ + + ]: 13384 : if (ii==4.or.ii==5.or.ii==6.or.ii==7) then
1421 [ + + ]: 8988000 : rho_ep_(:)=fact*rho_ep_(:)
1422 [ + + ]: 7648 : if (electronpositron%particle==EP_ELECTRON) then
1423 [ - + - - ]: 336 : if (ngr>0) grho2_(:)=fact2*grho2_(:)
1424 [ + + + + ]: 419840 : if (usecore==1)rhocor_(:)=fact*rhocor_(:)
1425 [ - + - - : 336 : if (ngr>0.and.usecore==1) grhocor2_(:)=fact2*grhocor2_(:)
- - ]
1426 : : end if
1427 : : end if
1428 : : ! Compute gamma for these perturbed densities
1429 [ + + ]: 15296 : if (option==1.or.option==2) then
1430 [ + + ]: 8232 : if (electronpositron%particle==EP_ELECTRON) then
1431 : 588 : call gammapositron(gam_(:,:,ii),grhocor2_,grho2_,igamma(igam),ngr,mesh_size,rhocor_,rho_ep_,rho_,usecore)
1432 [ + - ]: 7644 : else if (electronpositron%particle==EP_POSITRON) then
1433 : 7644 : call gammapositron(gam_(:,:,ii),grhocor2_,grho2_,igamma(igam),ngr,mesh_size,rhocor_,rho_,rho_ep_,usecore)
1434 : : end if
1435 : : else
1436 [ + + + + : 82025664 : gam_(:,:,:)=one
+ + ]
1437 : : end if
1438 : : end do ! end loop ii=1,7
1439 : :
1440 [ - + ]: 1912 : ABI_FREE(rhocor_)
1441 [ - + ]: 1912 : ABI_FREE(grho2_)
1442 [ - + ]: 1912 : ABI_FREE(grhocor2_)
1443 [ - + ]: 1912 : ABI_FREE(grhoe2)
1444 [ - + ]: 1912 : ABI_FREE(grhocore2)
1445 [ + + + + : 3855220 : rho_ (:)=rhosph (:);if (electronpositron%particle==EP_POSITRON.and.usecore==1) rho_ (:)=rho_ (:)+rhocore(:)
+ + + + ]
1446 [ + + + + : 2351876 : rho_ep_(:)=rhosph_ep(:);if (electronpositron%particle==EP_ELECTRON.and.usecore==1) rho_ep_(:)=rho_ep_(:)+rhocore(:)
+ + + + ]
1447 : : ! Compute numerical first and second derivatives of Gamma
1448 : : ! d1gam(1) = dgam/drho+ (particle=ELECTRON), dgam/drho- (particle=POSITRON)
1449 : : ! d1gam(2) = dgam/drho- (particle=ELECTRON), dgam/drho+ (particle=POSITRON)
1450 [ - + + - : 7648 : ABI_MALLOC(d1gam,(mesh_size,2,2))
+ - + - +
- - + +
- ]
1451 [ + + + + : 8993736 : d1gam(:,:,:)=zero
+ + ]
1452 [ + + ]: 2247000 : do ir=1,mesh_size
1453 [ + - ]: 2245088 : if (rho_ (ir)>tol14) d1gam(ir,1,1)=(gam_(ir,1,2)-gam_(ir,1,3))*half/(delta*rho_ (ir))
1454 [ + - ]: 2245088 : if (rhosph (ir)>tol14) d1gam(ir,2,1)=(gam_(ir,2,2)-gam_(ir,2,3))*half/(delta*rhosph (ir))
1455 [ + - ]: 2245088 : if (rho_ep_ (ir)>tol14) d1gam(ir,1,2)=(gam_(ir,1,4)-gam_(ir,1,5))*half/(delta*rho_ep_ (ir))
1456 [ + - ]: 2247000 : if (rhosph_ep(ir)>tol14) d1gam(ir,2,2)=(gam_(ir,2,4)-gam_(ir,2,5))*half/(delta*rhosph_ep(ir))
1457 : : end do
1458 : :
1459 : : ! d2gam(1) = d2gam/drho+_drho+ (particle=ELECTRON), dgam/drho-_drho- (particle=POSITRON)
1460 : : ! d2gam(2) = d2gam/drho-_drho+ (particle=ELECTRON), dgam/drho+_drho- (particle=POSITRON)
1461 : : ! d2gam(3) = d2gam/drho-_drho- (particle=ELECTRON), dgam/drho+_drho+ (particle=POSITRON)
1462 [ - + + - : 7648 : ABI_MALLOC(d2gam,(mesh_size,2,3))
+ - + - +
- - + +
- ]
1463 [ + + + + : 13489648 : d2gam(:,:,:)=zero
+ + ]
1464 [ + + ]: 2247000 : do ir=1,mesh_size
1465 [ + - ]: 2245088 : if (rho_ (ir)>tol14) d2gam(ir,1,1)=(gam_(ir,1,2)+gam_(ir,1,3)-two*gam_(ir,1,1))/(delta*rho_ (ir))**2
1466 [ + - ]: 2245088 : if (rhosph(ir)>tol14) d2gam(ir,2,1)=(gam_(ir,2,2)+gam_(ir,2,3)-two*gam_(ir,2,1))/(delta*rhosph(ir))**2
1467 [ + - ]: 2245088 : if (rho_ep_(ir)>tol14) then
1468 : 2245088 : d2gam(ir,1,3)=(gam_(ir,1,4)+gam_(ir,1,5)-two*gam_(ir,1,1))/(delta*rho_ep_(ir))**2
1469 [ + - ]: 2245088 : if (rho_(ir)>tol14) then
1470 : : d2gam(ir,1,2)=(gam_(ir,1,6)+gam_(ir,1,7)+two*gam_(ir,1,1) &
1471 : : & -gam_(ir,1,2)-gam_(ir,1,3)-gam_(ir,1,4)-gam_(ir,1,5)) &
1472 : 2245088 : & *half/(delta*rho_(ir))/(delta*rho_ep_(ir))
1473 : : end if
1474 : : end if
1475 [ + - ]: 2247000 : if (rhosph_ep(ir)>tol14) then
1476 : 2245088 : d2gam(ir,2,3)=(gam_(ir,2,4)+gam_(ir,2,5)-two*gam_(ir,2,1))/(delta*rhosph_ep(ir))**2
1477 [ + - ]: 2245088 : if (rhosph(ir)>tol14) then
1478 : : d2gam(ir,2,2)=(gam_(ir,2,6)+gam_(ir,2,7)+two*gam_(ir,2,1) &
1479 : : & -gam_(ir,2,2)-gam_(ir,2,3)-gam_(ir,2,4)-gam_(ir,2,5)) &
1480 : 2245088 : & *half/(delta*rhosph(ir))/(delta*rhosph_ep(ir))
1481 : : end if
1482 : : end if
1483 : : end do
1484 [ - + ]: 1912 : ABI_FREE(rho_)
1485 [ - + ]: 1912 : ABI_FREE(rho_ep_)
1486 : : ! Compute useful sums of densities
1487 [ - + + - : 5736 : ABI_MALLOC(v1sum,(mesh_size,3))
+ - + - -
+ - + ]
1488 [ - + ]: 1912 : if ( dtset%pawxcdev>=2) then
1489 [ # # # # : 0 : ABI_MALLOC(v2sum,(mesh_size,lm_size,3))
# # # # #
# # # # #
# # # # ]
1490 : : else
1491 [ - + ]: 1912 : ABI_MALLOC(v2sum,(0,0,0))
1492 : : end if
1493 [ + + + + ]: 4494000 : rhotot(:,1)=sqfpi*rhosph(:);rhotot_ep(:,1)=sqfpi*rhosph_ep(:)
1494 : : call pawxcsum(1,1,1,lmselect,lmselect_ep,lm_size,mesh_size,3,dtset%pawxcdev,&
1495 : 1912 : & pawang,rhotot,rhotot_ep,v1sum,v2sum)
1496 : : ! Compute final development of gamma moments
1497 [ + + + + : 40465120 : gammam(:,:,:)=zero
+ + ]
1498 [ + + + + ]: 4495912 : gammam(:,:,1)=gam_(:,:,1)*sqfpi
1499 : : gammam(:,1,1)=gammam(:,1,1)+(d2gam(:,1,2)*v1sum(:,2) &
1500 [ + + ]: 2247000 : & +half*(d2gam(:,1,1)*v1sum(:,1)+d2gam(:,1,3)*v1sum(:,3)))/sqfpi
1501 : : gammam(:,2,1)=gammam(:,2,1)+(d2gam(:,2,2)*v1sum(:,2) &
1502 [ + + ]: 2247000 : & +half*(d2gam(:,2,1)*v1sum(:,1)+d2gam(:,2,3)*v1sum(:,3)))/sqfpi
1503 [ + + ]: 17208 : do ilm=2,lm_size
1504 [ + - ]: 15296 : if (lmselect(ilm)) then
1505 [ + + ]: 17976000 : gammam(:,1,ilm)=gammam(:,1,ilm)+d1gam(:,1,1)*rhotot(:,ilm)
1506 [ + + ]: 17976000 : gammam(:,2,ilm)=gammam(:,2,ilm)+d1gam(:,2,1)*rhotot(:,ilm)
1507 : : end if
1508 [ + - ]: 17208 : if (lmselect_ep(ilm)) then
1509 [ + + ]: 17976000 : gammam(:,1,ilm)=gammam(:,1,ilm)+d1gam(:,1,2)*rhotot_ep(:,ilm)
1510 [ + + ]: 17976000 : gammam(:,2,ilm)=gammam(:,2,ilm)+d1gam(:,2,2)*rhotot_ep(:,ilm)
1511 : : end if
1512 : : end do
1513 [ - + ]: 1912 : if (dtset%pawxcdev>1) then
1514 [ # # ]: 0 : do ilm=2,lm_size
1515 : : gammam(:,1,ilm)=gammam(:,1,ilm)+d2gam(:,1,2)*v2sum(:,ilm,2) &
1516 [ # # ]: 0 : & +half*(d2gam(:,1,1)*v2sum(:,ilm,1)+d2gam(:,1,3)*v2sum(:,ilm,3))
1517 : : gammam(:,2,ilm)=gammam(:,2,ilm)+d2gam(:,2,2)*v2sum(:,ilm,2) &
1518 [ # # ]: 0 : & +half*(d2gam(:,2,1)*v2sum(:,ilm,1)+d2gam(:,2,3)*v2sum(:,ilm,3))
1519 : : end do
1520 : : end if
1521 [ - + ]: 1912 : ABI_FREE(gam_)
1522 [ - + ]: 1912 : ABI_FREE(d1gam)
1523 [ - + ]: 1912 : ABI_FREE(d2gam)
1524 [ - + ]: 1912 : ABI_FREE(v1sum)
1525 [ - + ]: 1912 : ABI_FREE(v2sum)
1526 : :
1527 : : ! Compute contribution to annihilation rate
1528 : :
1529 : : ! In state dependent scheme for Doppler, replace electronic density with one state
1530 [ + + ]: 1912 : if (option/=1) then
1531 [ + + + + ]: 15059840 : rhotot(:,:) = rhotot_j(:,:)
1532 [ + + ]: 1673152 : rhosph (:) = rhosph_j (:)
1533 : : end if
1534 : :
1535 [ - + + - : 3824 : ABI_MALLOC(gg,(mesh_size,4))
- + + - ]
1536 [ + + + + ]: 8989912 : gg=zero
1537 [ - + + - : 3824 : ABI_MALLOC(rhoarr1,(mesh_size))
- + - + ]
1538 [ - + + - : 3824 : ABI_MALLOC(rhoarr2,(mesh_size))
- + + - ]
1539 [ + + ]: 19120 : do ilm=1,lm_size
1540 [ + + ]: 173992 : do ilm1=1,lm_size
1541 [ + - ]: 172080 : if (lmselect(ilm1)) then
1542 [ + + + + ]: 20377872 : if (ilm1==1) rhoarr1(:)=sqfpi*rhosph(:)
1543 [ + + ]: 161784000 : if (ilm1/=1) rhoarr1(:)=rhotot(:,ilm1)
1544 [ + + ]: 1548720 : do ilm2=1,lm_size
1545 [ + - ]: 1548720 : if (lmselect_ep(ilm2)) then
1546 [ + + + + ]: 183400848 : if (ilm2==1) rhoarr2(:)=sqfpi*rhosph_ep(:)
1547 [ + + ]: 1456056000 : if (ilm2/=1) rhoarr2(:)=rhotot_ep(:,ilm2)
1548 [ + + ]: 1393848 : if (ilm1>=ilm2) then
1549 : 774360 : isel=pawang%gntselect(ilm,ilm2+ilm1*(ilm1-1)/2)
1550 : : else
1551 : 619488 : isel=pawang%gntselect(ilm,ilm1+ilm2*(ilm2-1)/2)
1552 : : end if
1553 [ + + ]: 1393848 : if (isel>0) then
1554 : 158696 : fact=pawang%realgnt(isel)
1555 [ + + ]: 186501000 : gg(:,1)=gg(:,1)+fact*rhoarr1(:)*rhoarr2(:)*gammam(:,1,ilm)
1556 [ + + ]: 186501000 : gg(:,2)=gg(:,2)+fact*rhoarr1(:)*rhoarr2(:)*gammam(:,2,ilm)
1557 : : end if
1558 : : end if
1559 : : end do
1560 : : end if
1561 : : end do
1562 : : end do
1563 [ - + ]: 1912 : ABI_FREE(rhoarr1)
1564 [ - + ]: 1912 : ABI_FREE(rhoarr2)
1565 [ + + ]: 1912 : if (electronpositron%particle==EP_ELECTRON) then
1566 [ + + ]: 840 : do ilm=1,lm_size
1567 [ + - + + ]: 993000 : if (lmselect(ilm)) gg(:,3)=gg(:,3)+rhotot(:,ilm)*rhocore(:)*gammam(:,1,ilm)
1568 : : end do
1569 [ + + ]: 110324 : gg(:,4)=sqfpi*rhotot(:,1)*rhocore(:)
1570 [ + - ]: 1828 : else if (electronpositron%particle==EP_POSITRON) then
1571 [ + + ]: 18280 : do ilm=1,lm_size
1572 [ + - + + ]: 19231912 : if (lmselect_ep(ilm)) gg(:,3)=gg(:,3)+rhotot_ep(:,ilm)*rhocore(:)*gammam(:,1,ilm)
1573 : : end do
1574 [ + + ]: 2136676 : gg(:,4)=sqfpi*rhotot_ep(:,1)*rhocore(:)
1575 : : end if
1576 [ + + ]: 9560 : do ii=1,4
1577 [ + + ]: 8988000 : gg(1:mesh_size,ii)=gg(1:mesh_size,ii)*pawrad(itypat)%rad(1:mesh_size)**2
1578 : 7648 : call simp_gen(intg,gg(:,ii),pawrad(itypat))
1579 [ + + ]: 7648 : if (ii==1) lambda_paw =lambda_paw +lsign(iloop)*intg
1580 [ + + ]: 7648 : if (ii==2) lambda_paw_ipm =lambda_paw_ipm +lsign(iloop)*intg
1581 [ + + ]: 7648 : if (ii==3) lambda_core_paw =lambda_core_paw +lsign(iloop)*intg
1582 [ + + ]: 9560 : if (ii==4) lambda_core_paw_ipm=lambda_core_paw_ipm+lsign(iloop)*intg
1583 : : end do
1584 [ - + ]: 1912 : ABI_FREE(gg)
1585 [ - + ]: 1912 : ABI_FREE(gammam)
1586 [ - + ]: 1912 : ABI_FREE(rhotot)
1587 [ - + ]: 1912 : ABI_FREE(rhotot_ep)
1588 [ - + ]: 1912 : ABI_FREE(rhosph)
1589 [ - + ]: 1912 : ABI_FREE(rhosph_ep)
1590 [ + + ]: 1912 : if (option/=1) then
1591 [ - + ]: 1472 : ABI_FREE(rhotot_j)
1592 [ - + ]: 1472 : ABI_FREE(rhosph_j)
1593 : : end if
1594 : :
1595 : : end if ! dtset%pawxcdev
1596 : :
1597 [ - + ]: 2868 : ABI_FREE(rhocore)
1598 : :
1599 : : end do ! iloop
1600 : :
1601 [ - + ]: 956 : ABI_FREE(rho1)
1602 [ - + ]: 956 : ABI_FREE(trho1)
1603 [ - + ]: 956 : ABI_FREE(rho1_ep)
1604 [ - + ]: 956 : ABI_FREE(trho1_ep)
1605 [ - + ]: 956 : ABI_FREE(rho1_j)
1606 [ - + ]: 956 : ABI_FREE(trho1_j)
1607 [ - + ]: 956 : ABI_FREE(nhat1)
1608 [ - + ]: 956 : ABI_FREE(nhat1_ep)
1609 [ - + ]: 956 : ABI_FREE(nhat1_j)
1610 [ - + ]: 956 : ABI_FREE(lmselect)
1611 [ - + ]: 956 : ABI_FREE(lmselect_ep)
1612 [ - + ]: 1294 : ABI_FREE(lmselect_dum)
1613 : :
1614 : : end do ! iatom
1615 : :
1616 : : ! Reduction in case of distribution over atomic sites
1617 [ - + ]: 338 : if (mpi_enreg%nproc_atom>1) then
1618 : 0 : mpibuf(1)=lambda_paw ;mpibuf(2)=lambda_paw_ipm
1619 : 0 : mpibuf(3)=lambda_core_paw;mpibuf(4)=lambda_core_paw_ipm
1620 : 0 : call xmpi_sum(mpibuf,mpi_enreg%comm_atom,ierr)
1621 : 0 : lambda_paw=mpibuf(1) ;lambda_paw_ipm=mpibuf(2)
1622 : 0 : lambda_core_paw=mpibuf(3);lambda_core_paw_ipm=mpibuf(4)
1623 : : end if
1624 : :
1625 : : ! Add plane-wave and PAW contributions to annihilation rates
1626 : 338 : lambda =lambda +lambda_paw
1627 : 338 : lambda_ipm =lambda_ipm +lambda_paw_ipm
1628 : 338 : lambda_core =lambda_core +lambda_core_paw
1629 : 338 : lambda_core_ipm=lambda_core_ipm+lambda_core_paw_ipm
1630 : : end if ! dtset%usepaw
1631 : :
1632 : :
1633 : : ! Convert into proper units and print
1634 : : ! ---------------------------------------------------------------------------------------
1635 : :
1636 : : ! Sum valence and core contributions to annihilation rates
1637 : 340 : lambda =lambda +lambda_core
1638 : 340 : lambda_ipm =lambda_ipm +lambda_core_ipm
1639 [ + + ]: 340 : if (dtset%usepaw==1) then
1640 : 338 : lambda_paw =lambda_paw +lambda_core_paw
1641 : 338 : lambda_paw_ipm=lambda_paw_ipm+lambda_core_paw_ipm
1642 : : end if
1643 : :
1644 : : ! Set annihilation rate in proper unit (picosec.)
1645 : 340 : units=pi*(one/InvFineStruct)**3/Time_Sec/1.e12_dp/electronpositron%posocc
1646 : :
1647 : 340 : lambda =lambda *units
1648 : 340 : lambda_ipm =lambda_ipm *units
1649 : 340 : lambda_core =lambda_core *units
1650 : 340 : lambda_core_ipm=lambda_core_ipm*units
1651 : 340 : lifetime =one/lambda
1652 : 340 : lifetime_ipm=one/lambda_ipm
1653 : 340 : electronpositron%lambda=lambda
1654 : 340 : electronpositron%lifetime=lifetime
1655 [ + + ]: 340 : if (dtset%usepaw==1) then
1656 : 338 : lambda_paw =lambda_paw *units
1657 : 338 : lambda_paw_ipm =lambda_paw_ipm *units
1658 : 338 : lambda_core_paw =lambda_core_paw *units
1659 : 338 : lambda_core_paw_ipm=lambda_core_paw_ipm*units
1660 : : end if
1661 : 340 : rate=lambda-lambda_core-lambda_paw+lambda_core_paw
1662 : 340 : rate_paw=lambda_paw-lambda_core_paw
1663 : : ! Print life time and additional information
1664 [ + + ]: 669 : if (option==1) then
1665 [ + + ]: 28 : if (igam==1) then
1666 : 17 : write(msg,'(a,80("-"),2a)') ch10,ch10,' Results for electron-positron annihilation:'
1667 : 17 : call wrtout(ab_out,msg,'COLL')
1668 : 17 : call wrtout(std_out,msg,'COLL')
1669 : : end if
1670 [ + + ]: 28 : if (ngamma>1.and.igam==1) then
1671 : 11 : write(msg,'(a,i1,a)') ch10,ngamma,&
1672 : 22 : & ' computations of positron lifetime have been performed (with different enhancement factors).'
1673 : 11 : call wrtout(ab_out,msg,'COLL')
1674 : 11 : call wrtout(std_out,msg,'COLL')
1675 : : end if
1676 [ + + ]: 28 : if (ngamma>1) then
1677 : 22 : write(msg,'(2a,i1)') ch10,"########## Lifetime computation ",igam
1678 : 22 : call wrtout(ab_out,msg,'COLL')
1679 : 22 : call wrtout(std_out,msg,'COLL')
1680 : : end if
1681 [ + + ]: 28 : if (abs(electronpositron%ixcpositron)==1) then
1682 : 22 : write(msg,'(4a)') ch10,' # Zero-positron density limit of Arponen and Pajanne provided by Boronski & Nieminen',&
1683 : 44 : & ch10,' Ref.: Boronski and R.M. Nieminen, Phys. Rev. B 34, 3820 (1986)' ! [[cite:Boronski1986]]
1684 [ + + ]: 6 : else if (electronpositron%ixcpositron==11) then
1685 : 4 : write(msg,'(4a)') ch10,' # Zero-positron density limit of Arponen and Pajanne fitted by Sterne & Kaiser',&
1686 : 8 : & ch10,' Ref.: P.A. Sterne and J.H. Kaiser, Phys. Rev. B 43, 13892 (1991)' ! [[cite:Sterne1991]]
1687 [ + - ]: 2 : else if (electronpositron%ixcpositron==2) then
1688 : 2 : write(msg,'(4a)') ch10,' # Electron-positron correlation provided by Puska, Seitsonen, and Nieminen',&
1689 : 4 : & ch10,' Ref: M.J. Puska, A.P. Seitsonen and R.M. Nieminen, Phys. Rev. B 52, 10947 (1994)' ! [[cite:Puska1994]]
1690 [ # # ]: 0 : else if (electronpositron%ixcpositron==3) then
1691 : 0 : write(msg,'(8a)') ch10,' # Zero-positron density limit of Arponen and Pajanne provided by Boronski & Nieminen',&
1692 : 0 : & ch10,' + GGA corrections',&
1693 : 0 : & ch10,' Ref.: Boronski and R.M. Nieminen, Phys. Rev. B 34, 3820 (1986)',& ! [[cite:Boronski1986]]
1694 : 0 : & ch10,' B. Barbiellini, M.J. Puska, T. Torsti and R.M.Nieminen, Phys. Rev. B 51, 7341 (1995)' ! [[cite:Barbiellini1995]]
1695 [ # # ]: 0 : else if (electronpositron%ixcpositron==31) then
1696 : 0 : write(msg,'(8a)') ch10,' # Zero-positron density limit of Arponen and Pajanne fitted by Sterne & Kaiser',&
1697 : 0 : & ch10,' + GGA corrections',&
1698 : 0 : & ch10,' Ref.: P.A. Sterne and J.H. Kaiser, Phys. Rev. B 43, 13892 (1991)',& ! [[cite:Sterne1991]]
1699 : 0 : & ch10,' B. Barbiellini, M.J. Puska, T. Torsti and R.M. Nieminen, Phys. Rev. B 51, 7341 (1995)' ! [[cite:Barbiellini1995]]
1700 : : end if
1701 : 28 : call wrtout(ab_out,msg,'COLL')
1702 : 28 : call wrtout(std_out, msg,'COLL')
1703 [ - + + + : 28 : if (igamma(igam)==0) then
+ - ]
1704 : 0 : write(msg,'(a)') ' # Enhancement factor set to one (test)'
1705 : : else if (igamma(igam)==1) then
1706 : 11 : write(msg,'(3a)') ' # Enhancement factor of Boronski & Nieminen',&
1707 : 22 : & ch10,' Ref.: Boronski and R.M. Nieminen, Phys. Rev. B 34, 3820 (1986)' ! [[cite:Boronski1986]]
1708 : : else if (igamma(igam)==2) then
1709 : 11 : write(msg,'(3a)') ' # Enhancement factor of Boronski & Nieminen IN THE RPA LIMIT',&
1710 : 22 : & ch10,' Ref.: Boronski and R.M. Nieminen, Phys. Rev. B 34, 3820 (1986)' ! [[cite:Boronski1986]]
1711 : : else if (igamma(igam)==3) then
1712 : 4 : write(msg,'(3a)') ' # Enhancement factor of Sterne & Kaiser',&
1713 : 8 : & ch10,' Ref.: P.A. Sterne and J.H. Kaiser, Phys. Rev. B 43, 13892 (1991)' ! [[cite:Sterne1991]]
1714 : : else if (igamma(igam)==4) then
1715 : 2 : write(msg,'(3a)') ' # Enhancement factor of Puska, Seitsonen, and Nieminen',&
1716 : 4 : & ch10,' Ref.: M.J. Puska, A.P. Seitsonen and R.M. Nieminen, Phys. Rev. B 52, 10947 (1994)' ! [[cite:Puska1994]]
1717 : : end if
1718 : 28 : call wrtout(ab_out,msg,'COLL')
1719 : 28 : call wrtout(std_out,msg,'COLL')
1720 : 28 : write(msg, '(4(2a,es16.8))' ) ch10,&
1721 : 28 : & ' Positron lifetime (ps) =',lifetime ,ch10,&
1722 : 28 : & ' Positron lifetime with IPM for core elec. (ps) =',lifetime_ipm,ch10,&
1723 : 28 : & ' Annihilation rate (ns-1) =',lambda *1000._dp,ch10,&
1724 : 56 : & ' Annihilation rate with IPM for core elec. (ns-1) =',lambda_ipm*1000._dp
1725 : 28 : call wrtout(ab_out,msg,'COLL')
1726 : 28 : call wrtout(std_out,msg,'COLL')
1727 : 28 : write(msg,'(2a,5(2a,es16.8))' ) ch10,&
1728 : 28 : & ' Annihilation rate core/valence decomposition:',ch10,&
1729 : 28 : & ' Core contribution to ann.rate (ns-1) =', lambda_core *1000._dp,ch10,&
1730 : 28 : & ' Valence contribution to ann.rate (ns-1) =',(lambda-lambda_core) *1000._dp,ch10,&
1731 : 28 : & ' Core contribution to ann.rate with IPM (ns-1) =', lambda_core_ipm *1000._dp,ch10,&
1732 : 56 : & ' Valence contribution to ann.rate with IPM (ns-1) =',(lambda_ipm-lambda_core_ipm) *1000._dp
1733 : 28 : call wrtout(ab_out,msg,'COLL')
1734 : 28 : call wrtout(std_out,msg,'COLL')
1735 [ + + ]: 28 : if (dtset%usepaw==1) then
1736 : 26 : write(msg, '(2a,6(2a,es16.8))' ) ch10,&
1737 : 26 : & ' Annihilation rate PAW decomposition:',ch10,&
1738 : 26 : & ' Plane-wave contribution to ann.rate (ns-1) =',(lambda-lambda_paw)*1000._dp,ch10,&
1739 : 26 : & ' Plane-wave valence contribution to ann.rate (ns-1) =',(lambda-lambda_paw-lambda_core+lambda_core_paw)*1000._dp,ch10,&
1740 : 26 : & ' On-site core contribution to ann.rate (ns-1) =', lambda_core_paw*1000._dp,ch10,&
1741 : 26 : & ' On-site valence contribution to ann.rate (ns-1) =',(lambda_paw-lambda_core_paw)*1000._dp,ch10,&
1742 : 26 : & ' Plane-wave contribution to ann.rate with IPM (ns-1) =',(lambda_ipm-lambda_paw_ipm)*1000._dp,ch10,&
1743 : 52 : & ' Plane-wave core contrb. to ann.rate with IPM (ns-1) =',(lambda_core_ipm-lambda_core_paw_ipm)*1000._dp
1744 : 26 : call wrtout(ab_out,msg,'COLL')
1745 : 26 : call wrtout(std_out,msg,'COLL')
1746 : : end if
1747 [ + + + + ]: 28 : if (dtset%usepaw==0.and.igam==ngamma) then ! These tests are not relevant with PAW
1748 : 1 : write(msg, '(2a,3(2a,es16.8))' ) ch10,&
1749 : 1 : & ' ########## Some checks, for testing purpose:',ch10,&
1750 : 1 : & ' Number of core electrons =',nbec,ch10,&
1751 : 1 : & ' Number of valence electrons =',nbev,ch10,&
1752 : 2 : & ' Number of positrons =',nbp
1753 : 1 : call wrtout(ab_out,msg,'COLL')
1754 : 1 : call wrtout(std_out,msg,'COLL')
1755 : : end if
1756 : : end if !end if option
1757 : : end do ! Big loop on igam
1758 : :
1759 [ + + ]: 329 : if (option==1) then
1760 : 17 : write(msg, '(3a)' ) ch10,' (*) IPM=Independent particle Model',ch10
1761 : 17 : call wrtout(ab_out,msg,'COLL')
1762 : 17 : call wrtout(std_out,msg,'COLL')
1763 : : end if !end if option
1764 : :
1765 : : !Deallocate memory
1766 [ - + ]: 329 : ABI_FREE(igamma)
1767 [ + + ]: 329 : if (dtset%usepaw==1.and.(.not.include_nhat_in_gamma)) then
1768 [ - + ]: 328 : ABI_FREE(rhor_)
1769 [ - + ]: 328 : ABI_FREE(rhor_ep_)
1770 : : end if
1771 : :
1772 : : DBG_EXIT("COLL")
1773 : :
1774 [ + + - + : 970 : end subroutine poslifetime
- + - + -
+ - + - +
- + - + -
+ - + -
+ ]
1775 : : !!***
1776 : :
1777 : : !!****f* ABINIT/posdoppler
1778 : : !! NAME
1779 : : !! posdoppler
1780 : : !!
1781 : : !! FUNCTION
1782 : : !! Calculate the momentum distribution annihilating electrons-positron (Doppler broadening)
1783 : : !!
1784 : : !! INPUTS
1785 : : !! cg(2,mcg)=planewave coefficients of wavefunctions.
1786 : : !! cprj(natom,mcprj)= <p_lmn|Cnk> coefficients for each WF |Cnk>
1787 : : !! and each |p_lmn> non-local projector
1788 : : !! Cryst<Crystal_structure> = Info on unit cell and its symmetries
1789 : : !! dimcprj(natom)=array of dimensions of array cprj (not ordered)
1790 : : !! dtfil <type(datafiles_type)>=variables related to files
1791 : : !! | unpaw=unit number for temporary PAW files
1792 : : !! dtset <type(dataset_type)>=all input variables for this dataset
1793 : : !! | istwfk=input option=1 parameter that describes the storage of wfs
1794 : : !! | mband=maximum number of bands
1795 : : !! | mgfft=maximum size of 1D FFTs for the "coarse" grid
1796 : : !! | mkmem=number of k points treated by this node.
1797 : : !! | mpw=maximum dimensioned size of npw
1798 : : !! | natom=number of atoms
1799 : : !! | nband=number of bands at each k point
1800 : : !! | ngfft=contain all needed information about 3D FFT (coarse grid)
1801 : : !! | nkpt=number of k points
1802 : : !! | nspden=number of spin-density components
1803 : : !! | nspinor=number of spinorial components of the wavefunctions
1804 : : !! | nsppol=1 for unpolarized, 2 for spin-polarized
1805 : : !! | usepaw=flag for PAW
1806 : : !! | gpu_option=GPU implementation to use, i.e. cuda, openMP, ... (0=not using GPU)
1807 : : !! | wtk(=weights associated with various k points
1808 : : !! filpsp(ntypat)=name(s) of the pseudopotential file(s)
1809 : : !! kg(3,mpw*mkmem)=reduced planewave coordinates.
1810 : : !! mcg=size of wave-functions array (cg) =mpw*nspinor*mband*mkmem*nsppol
1811 : : !! mcprj=size of projected wave-functions array (cprj) =nspinor*mband*mkmem*nsppol
1812 : : !! mpi_enreg= information about MPI parallelization
1813 : : !! my_natom=number of atoms treated by current processor
1814 : : !! n3xccc= dimension of the xccc3d array (0 or nfft).
1815 : : !! nfft= number of FFT grid points
1816 : : !! ngfft(18)= contain all needed information about 3D FFT
1817 : : !! nhat(nfft,nspden)=charge compensation density (content depends on electronpositron%particle)
1818 : : !! npwarr(nkpt)=number of planewaves in basis at this k point
1819 : : !! occ(mband*nkpt*nsppol)=occupancies for each band and k point
1820 : : !! pawang <type(pawang)>=paw angular mesh and related data
1821 : : !! pawrad(ntypat*usepaw) <type(pawrad_type)>=paw radial mesh and related data
1822 : : !! pawrhoij(my_natom*usepaw) <type(pawrhoij_type)>= -PAW only- atomic occupancies
1823 : : !! pawtab(ntypat*usepaw) <type(pawtab_type)>=paw tabulated starting data
1824 : : !! rhor(nfft,nspden)=total electron/positron density (content depends on electronpositron%particle)
1825 : : !! xccc3d(n3xccc)=3D core electron density for XC core correction, bohr^-3
1826 : : !!
1827 : : !! OUTPUT
1828 : : !!
1829 : : !! SIDE EFFECTS
1830 : : !! electronpositron <type(electronpositron_type)>=quantities for the electron-positron annihilation
1831 : : !!
1832 : : !! TODO
1833 : : !! print a warning if the core wave function is not localized in the PAW sphere
1834 : : !! implement PAW on-site contribution for state-independent scheme
1835 : : !!
1836 : : !! SOURCE
1837 : :
1838 : : !Macro to go from row-column indexing to combined indexing
1839 : : #define RCC(glmn,hlmn) max(glmn,hlmn)*(max(glmn,hlmn)-1)/2+min(glmn,hlmn)
1840 : : !Macro to go from l,m angular momentum indexing to combined indexing
1841 : : #define LMC(lval,mval) lval*lval+lval+mval+1
1842 : :
1843 : 3 : subroutine posdoppler(cg,cprj,Crystal,dimcprj,dtfil,dtset,electronpositron,&
1844 : 3 : & filpsp,kg,mcg,mcprj,mpi_enreg,my_natom,&
1845 : 3 : & n3xccc,nfft,ngfft,nhat,npwarr,occ,pawang,pawrad,&
1846 : 3 : & pawrhoij,pawtab,rhor,xccc3d)
1847 : :
1848 : : !Arguments ------------------------------------
1849 : : !scalars
1850 : : integer,intent(in) :: mcg,mcprj,my_natom,n3xccc,nfft
1851 : : type(crystal_t) :: Crystal
1852 : : type(datafiles_type),intent(in) :: dtfil
1853 : : type(dataset_type),intent(in) :: dtset
1854 : : type(electronpositron_type),pointer :: electronpositron
1855 : : type(MPI_type),intent(inout) :: mpi_enreg
1856 : : type(pawang_type),intent(in) :: pawang
1857 : : !arrays
1858 : : integer,intent(in) :: dimcprj(dtset%natom)
1859 : : integer,intent(in) :: kg(3,dtset%mpw*dtset%mkmem),ngfft(18),npwarr(dtset%nkpt)
1860 : : real(dp),intent(in) :: nhat(nfft,dtset%nspden*dtset%usepaw),xccc3d(n3xccc)
1861 : : real(dp),intent(in),target :: occ(dtset%mband*dtset%nkpt*dtset%nsppol)
1862 : : real(dp),intent(in),target :: rhor(nfft,dtset%nspden)
1863 : : real(dp),intent(inout),target :: cg(2,mcg)
1864 : : character(len=fnlen),intent(in) :: filpsp(dtset%ntypat)
1865 : : type(pawcprj_type),target :: cprj(dtset%natom,mcprj)
1866 : : type(pawrad_type),intent(in) :: pawrad(dtset%ntypat*dtset%usepaw)
1867 : : type(pawrhoij_type),intent(in),target :: pawrhoij(my_natom*dtset%usepaw)
1868 : : type(pawtab_type),intent(in) :: pawtab(dtset%ntypat*dtset%usepaw)
1869 : :
1870 : : !Local variables-------------------------------
1871 : : !scalars
1872 : : integer :: accessfil,basis_size,bandpp,bdtot_index,bdtot_index_pos,blocksize,cplex,cplex_rhoij
1873 : : integer :: glmij,i0lmn,i1,i2,i3,iat,iatm,iatom
1874 : : integer :: ib,ib_cprj,ib_cprj_pos,ib_pos,ibg,ibg_pos
1875 : : integer :: iblock,iblock_pos,ibpp,ibpp_pos
1876 : : integer :: icg,icg_pos,id1,id2,id3,ierr,ig1,ig2,ig3,igamma,ii,ikg,ikg_pos,ikpt
1877 : : integer :: ikpt_pos,il,ilm,ilmn,iln,indx,indx0,iorder_cprj,iproc,ir,isppol,isppol_pos,istwf_k
1878 : : integer :: istwf_k_pos,itypat,iwarn,iwavef,iwavef_pos,j2,j3,jj,jkpt,jl,jlm,jlmn,jln
1879 : : integer :: klm,kln,klmn,l_size,l_size_max,ll,llmax,llmin,lm,lmn_size,lmn_size_c,lmn2_size
1880 : : integer :: mband_cprj,mband_cprj_pos,mcg_pos
1881 : : integer :: mcprj_k,mcprj_k_pos,me_band,me_fft,me_kpt,me_kptband
1882 : : integer :: mesh_size,meshsz,mm,my_ngrid,my_nspinor,my_nsppol,my_n2,n1,n2,n3,n4,n5,n6
1883 : : integer :: nband_cprj_eff_pos,nband_cprj_k,nband_cprj_k_pos
1884 : : integer :: nband_eff_pos,nband_k,nband_k_pos
1885 : : integer :: nblock_band,nblock_band_eff_pos,nkpt
1886 : : integer :: nproc_band,nproc_fft,nproc_spkpt,nproc_kptband,npw_k,npw_k_pos
1887 : : integer :: nspden_rhoij,option,tag,unit_doppler
1888 : : integer :: tim_fourdp=0,tim_fourwf=-36
1889 : : integer :: ylmr_normchoice,ylmr_npts,ylmr_option
1890 : : logical,parameter :: include_nhat_in_gamma=.false.,state_dependent=.true.
1891 : : logical,parameter :: kgamma_only_positron=.true.,wf_conjugate=.false.
1892 : : logical :: cprj_paral_band,mykpt,mykpt_pos,use_timerev,use_zeromag
1893 : : real(dp) :: arg,bessarg,cpi,cpr,cp11,cp12,cp21,cp22,gammastate,intg
1894 : : real(dp) :: lambda_v1,lambda_v2,lambda_core,lambda_pw,occ_el,occ_pos
1895 : : real(dp) :: pnorm,pr,rate,rate_ipm,ratec,ratec_ipm,rate_paw,rate_paw_ipm
1896 : : real(dp) :: scale_,units_,weight,weight_pos,wf_fact,wtk_k,wtk_k_pos,vec
1897 : : character(len=fnlen) :: filename_dop
1898 : : character(len=1000) :: msg
1899 : : type(bandfft_kpt_type),pointer :: bandfft_kpt_el,bandfft_kpt_pos
1900 : 3 : type(MPI_type) :: mpi_enreg_seq
1901 : : type(wffile_type) :: wff
1902 : : type(atomorb_type), pointer :: atm=> null()
1903 : : !arrays
1904 : 3 : integer,allocatable :: gbound(:,:),gbound_pos(:,:),kg_k(:,:),kg_k_pos(:,:)
1905 : 3 : integer,allocatable :: lmncmax(:),my_ffttab(:),my_gridtab(:),nphicor(:)
1906 : 3 : integer, contiguous, pointer :: fftn2_distrib(:),ffti2_local(:)
1907 : 3 : integer, contiguous, pointer :: fftn3_distrib(:),ffti3_local(:)
1908 : 3 : logical,allocatable :: have_intc(:,:,:),have_rad(:,:)
1909 : : real(dp) :: buf(4),contrib(2),cp(2),cp_pos(2),expipr(2),pbn(3),pcart(3)
1910 : : real(dp) :: radsumnfftc(2),ylmgr(1,1,0),ylmr_nrm(1)
1911 : 3 : real(dp),allocatable :: cwaveg(:,:),cwaveg_pos(:,:),cwaver(:),cwaver_pos(:),cwaver_pos_block(:)
1912 : 3 : real(dp),allocatable :: cg_k_pos(:,:),cwaveaug(:,:,:,:),cwaveaug_pos(:,:,:,:)
1913 : 3 : real(dp),allocatable :: denpot_dum(:,:,:),ff(:),fofgout_dum(:,:)
1914 : 3 : real(dp),allocatable :: gamma(:,:),intc(:,:,:),j_bessel(:,:),jbes(:),mpibuf(:,:)
1915 : 3 : real(dp),allocatable :: occ_k(:),occ_k_pos(:),pcart_k(:,:)
1916 : 3 : real(dp),allocatable :: radint1(:,:),radint2(:,:),radint3(:,:)
1917 : 3 : real(dp),allocatable :: radsumnfft1(:,:),radsumnfft2(:,:),radsumnfft3(:,:)
1918 : 3 : real(dp),allocatable :: rho_contrib(:),rho_contrib_g(:,:)
1919 : 3 : real(dp),allocatable :: rho_contrib_paw1(:,:),rho_contrib_paw2(:,:),rho_contrib_paw3(:,:)
1920 : 3 : real(dp),allocatable :: rho_moment_v1(:,:),rho_moment_v2(:,:)
1921 : 3 : real(dp),allocatable :: rho_moment_core(:,:),rho_moment_k(:),rho_moment_k2(:)
1922 : 3 : real(dp),allocatable :: rho_pw(:,:),rhor_dop_el(:)
1923 : 3 : real(dp),allocatable :: rhocorej(:),rhoe(:,:),rhop(:,:),ylmp(:)
1924 : 3 : real(dp),pointer :: cg_pos_ptr(:,:),cg_ptr(:,:),occ_ptr(:),occ_pos_ptr(:)
1925 : 3 : real(dp),pointer :: rhor_(:,:),rhor_ep_(:,:)
1926 : : complex(dp) :: ifac ! (-i)^L mod 4
1927 : : complex(dp),dimension(0:3) :: ilfac(0:3)=(/(1.0,0.0),(0.0,-1.0),(-1.0,0.0),(0.0,1.0)/)
1928 : 3 : type(coeff1_type),allocatable :: gammastate_c(:)
1929 : 3 : type(coeffi2_type),allocatable :: indlmncor(:)
1930 : 3 : type(coeff2_type),allocatable :: phicor(:)
1931 : 3 : type(coeff6_type),allocatable :: radsum1(:),radsum2(:),radsum3(:)
1932 : 3 : type(coeff7_type),allocatable :: radsumc(:)
1933 : 3 : type(pawcprj_type),allocatable :: cprj_k(:,:),cprj_k_pos(:,:),cprj_pos(:,:)
1934 : 3 : type(pawcprj_type),pointer :: cprj_pos_ptr(:,:),cprj_ptr(:,:)
1935 : 3 : type(pawrhoij_type),allocatable :: pawrhoij_dop_el(:)
1936 : 3 : type(pawrhoij_type),pointer :: pawrhoij_ptr(:),pawrhoij_all(:),pawrhoij_ep_all(:)
1937 : :
1938 : : ! *************************************************************************
1939 : :
1940 : : DBG_ENTER("COLL")
1941 : :
1942 : : !Compatibility tests
1943 : 3 : if (.not.associated(electronpositron)) then
1944 : 0 : ABI_BUG('electronpositron variable must be associated!')
1945 : : end if
1946 [ + - ]: 3 : if (allocated(mpi_enreg%proc_distrb)) then
1947 [ + + ]: 6 : do isppol=1,dtset%nsppol
1948 [ + + ]: 26 : do ikpt=1,dtset%nkpt
1949 : 20 : nband_k=dtset%nband(ikpt+(isppol-1)*dtset%nkpt)
1950 [ + + + - : 259 : if (any(mpi_enreg%proc_distrb(ikpt,1:nband_k,isppol)/=mpi_enreg%proc_distrb(ikpt,1,isppol))) then
- + ]
1951 : 0 : msg='proc_distrib cannot be distributed over bands!'
1952 : 0 : ABI_BUG(msg)
1953 : : end if
1954 : : end do
1955 : : end do
1956 : : end if
1957 [ - + ]: 3 : if (dtset%nspinor==2) then
1958 : 0 : msg='Doppler broadening not available for spinorial wave functions (nspinor=2)!'
1959 : 0 : ABI_BUG(msg)
1960 : : end if
1961 [ - + ]: 3 : if (mcprj==0) then
1962 : 0 : msg='<p|Psi> (cprj) datastructure must be kept in memory (see pawusecp input keyword)!'
1963 : 0 : ABI_BUG(msg)
1964 : : end if
1965 [ - + ]: 3 : if (dtset%usepaw==0) then
1966 : 0 : write(msg,'(5a)') 'Momentum distribution of annihilating electron-positron pairs',ch10,&
1967 : 0 : & 'in the Norm-conserving Pseudopotential formalism is incomplete!',ch10,&
1968 : 0 : & 'No core contribution is included.'
1969 : 0 : ABI_WARNING(msg)
1970 : : end if
1971 [ + + + - : 23 : if (any(dtset%nband(:)/=dtset%nband(1))) then
- + ]
1972 : 0 : write(msg,'(a)') 'Number of bands has to be the same for all k-points!'
1973 : 0 : ABI_BUG(msg)
1974 : : end if
1975 [ + - ]: 3 : if (dtset%usepaw==1) then
1976 [ - + ]: 3 : if (size(pawrhoij)/=mpi_enreg%my_natom) then
1977 : 0 : write(msg,'(a)') 'wrong size for pawrhoij! '
1978 : 0 : ABI_BUG(msg)
1979 : : end if
1980 : : end if
1981 : :
1982 : : !Various initializations
1983 : 3 : n1=ngfft(1) ; n2=ngfft(2) ; n3=ngfft(3)
1984 : 3 : n4=ngfft(4) ; n5=ngfft(5) ; n6=ngfft(6)
1985 : 3 : id1=n1/2+2 ; id2=n2/2+2 ; id3=n3/2+2
1986 : 3 : iorder_cprj=0 ; cplex=2 ; iwarn=1
1987 : 3 : wf_fact=one;if (wf_conjugate) wf_fact=-one
1988 : 3 : nkpt=dtset%nkpt
1989 : :
1990 : : !Manage kpt/spin parallelism
1991 [ - + + - : 9 : ABI_MALLOC(my_gridtab,(nkpt))
+ - + - -
+ - + ]
1992 [ + + ]: 23 : my_gridtab=0
1993 [ + + ]: 23 : do ii=1,nkpt
1994 [ + - - + : 23 : if (any(mpi_enreg%my_isppoltab(:)==1)) my_gridtab(ii)=mpi_enreg%my_kpttab(ii)
+ - ]
1995 : : end do
1996 [ + + + - ]: 23 : my_ngrid=count(my_gridtab(:)/=0)
1997 [ + + ]: 9 : my_nsppol=sum(mpi_enreg%my_isppoltab(:))
1998 : 3 : my_nspinor=max(1,dtset%nspinor/mpi_enreg%nproc_spinor)
1999 : :
2000 : : !Parallel settings
2001 [ - + ]: 3 : if (mpi_enreg%paral_kgb/=0) then
2002 : 0 : nproc_spkpt=mpi_enreg%nproc_spkpt
2003 : 0 : nproc_band=mpi_enreg%nproc_band
2004 : 0 : nproc_fft=mpi_enreg%nproc_fft
2005 : 0 : nproc_kptband=xmpi_comm_size(mpi_enreg%comm_kptband)
2006 : 0 : me_kpt=mpi_enreg%me_kpt
2007 : 0 : me_band=mpi_enreg%me_band
2008 : 0 : me_fft=mpi_enreg%me_fft
2009 : 0 : me_kptband=xmpi_comm_rank(mpi_enreg%comm_kptband)
2010 : 0 : bandpp=mpi_enreg%bandpp
2011 : 0 : my_n2=n2/nproc_fft
2012 [ # # ]: 0 : accessfil=IO_MODE_FORTRAN;if(nproc_fft>1)accessfil=IO_MODE_MPI
2013 : : else
2014 : 3 : nproc_spkpt=mpi_enreg%nproc_spkpt
2015 : 3 : nproc_band=1;nproc_fft=1
2016 : 3 : nproc_kptband=nproc_spkpt
2017 : 3 : me_band=0;me_fft=0
2018 : 3 : me_kpt=mpi_enreg%me_kpt
2019 : 3 : me_kptband=me_kpt
2020 : 3 : bandpp=1 ; my_n2=n2
2021 : 3 : accessfil=IO_MODE_FORTRAN
2022 : : end if
2023 : 3 : blocksize=nproc_band*bandpp
2024 : 3 : nblock_band=dtset%nband(1)/blocksize
2025 : :
2026 : : !Select density according to nhat choice0
2027 [ - + ]: 3 : if (dtset%usepaw==0.or.include_nhat_in_gamma) then
2028 : 0 : rhor_ => rhor
2029 : 0 : rhor_ep_ => electronpositron%rhor_ep
2030 : : else
2031 [ - + + - : 12 : ABI_MALLOC(rhor_,(nfft,dtset%nspden))
- + + - +
- + - - +
- + ]
2032 [ - + + - : 9 : ABI_MALLOC(rhor_ep_,(nfft,dtset%nspden))
- + + - -
+ - + ]
2033 [ + - + + : 132741 : rhor_=rhor-nhat
+ + + + +
+ ]
2034 [ + - + + : 132741 : rhor_ep_=electronpositron%rhor_ep-electronpositron%nhat_ep
+ + + + +
+ ]
2035 : : end if
2036 : :
2037 : : !Select type(s) of enhancement factor
2038 : 3 : igamma=0
2039 : 3 : if (electronpositron%ixcpositron==-1) igamma=0
2040 : : if (electronpositron%ixcpositron== 1) igamma=2
2041 : : if (electronpositron%ixcpositron== 2) igamma=4
2042 : : if (electronpositron%ixcpositron== 3) igamma=2
2043 : : if (electronpositron%ixcpositron==11) igamma=3
2044 : 3 : if (electronpositron%ixcpositron==31) igamma=3
2045 : :
2046 : : !Select electronic and positronic states
2047 [ - + ]: 3 : if (electronpositron%particle==EP_ELECTRON) then !we should not be in this case
2048 : 0 : cg_ptr => electronpositron%cg_ep
2049 : 0 : cprj_ptr => electronpositron%cprj_ep
2050 : 0 : occ_ptr => electronpositron%occ_ep
2051 : 0 : pawrhoij_ptr => electronpositron%pawrhoij_ep
2052 : 0 : cg_pos_ptr => cg
2053 : 0 : cprj_pos_ptr => cprj
2054 : 0 : occ_pos_ptr => occ
2055 : : end if
2056 [ + - ]: 3 : if (electronpositron%particle==EP_POSITRON) then
2057 : 3 : cg_ptr => cg
2058 : 3 : cprj_ptr => cprj
2059 : 3 : occ_ptr => occ
2060 : 3 : pawrhoij_ptr => pawrhoij
2061 : 3 : cg_pos_ptr => electronpositron%cg_ep
2062 : 3 : cprj_pos_ptr => electronpositron%cprj_ep
2063 : 3 : occ_pos_ptr => electronpositron%occ_ep
2064 : : end if
2065 : :
2066 : : !Determine if cprj datastructures are distributed over bands
2067 : 3 : mband_cprj=size(cprj_ptr,2)/(my_nspinor*dtset%mkmem*dtset%nsppol)
2068 : 3 : mband_cprj_pos=size(cprj_pos_ptr,2)/(my_nspinor*dtset%mkmem*dtset%nsppol)
2069 : 3 : cprj_paral_band=(mband_cprj<dtset%mband)
2070 : :
2071 : : !Get the distrib associated with the fft_grid
2072 : 3 : call ptabs_fourdp(mpi_enreg,n2,n3,fftn2_distrib,ffti2_local,fftn3_distrib,ffti3_local)
2073 : :
2074 : : !===============================================================================
2075 : : !================ Calculate the PAW on-site constants ==========================
2076 : :
2077 [ + - ]: 3 : if (dtset%usepaw==1) then
2078 : :
2079 : 3 : ylmr_normchoice = 0 ! input to initylmr are normalized
2080 : 3 : ylmr_npts = 1 ! only 1 point to compute in initylmr
2081 : 3 : ylmr_nrm(1) = one ! weight of normed point for initylmr
2082 : 3 : ylmr_option = 1 ! compute only ylm's in initylmr
2083 : :
2084 : : !Prepare radial integral for PAW correction for each atom type
2085 [ - + + - : 12 : ABI_MALLOC(radsum1,(dtset%ntypat))
+ - + - -
+ - + + +
+ - - + ]
2086 [ - + + - : 9 : ABI_MALLOC(radsum2,(dtset%ntypat))
- + - + +
+ + - -
+ ]
2087 [ - + + - : 9 : ABI_MALLOC(radsum3,(dtset%ntypat))
- + - + +
+ + - -
+ ]
2088 [ - + + - : 12 : ABI_MALLOC(radsumc,(dtset%ntypat))
+ - + - -
+ - + + +
+ - - + ]
2089 : :
2090 [ - + + - : 12 : ABI_MALLOC(indlmncor,(dtset%ntypat))
+ - + - -
+ - + - +
+ + + - -
+ ]
2091 [ - + + - : 12 : ABI_MALLOC(phicor,(dtset%ntypat))
+ - + - -
+ - + - +
+ + + - -
+ ]
2092 [ - + + - : 17 : ABI_MALLOC(gammastate_c,(dtset%natom))
+ - + - -
+ - + + +
+ - - + ]
2093 [ - + + - : 9 : ABI_MALLOC(nphicor,(dtset%ntypat))
+ - + - -
+ - + -
+ ]
2094 [ - + + - : 6 : ABI_MALLOC(lmncmax,(dtset%ntypat))
- + - + -
+ ]
2095 : :
2096 : : ! Reading of core wave functions
2097 [ + - ]: 3 : if (mpi_enreg%me_cell==0) then
2098 [ - + ]: 3 : ABI_MALLOC(atm,)
2099 [ + + ]: 6 : do itypat=1,dtset%ntypat
2100 [ + - ]: 3 : call pawpsp_init_core(atm,psp_filename=trim(filpsp(itypat)),radmesh=pawrad(itypat))
2101 [ - + + - : 12 : ABI_MALLOC(indlmncor(itypat)%value,(size(atm%indlmn(:,1)),atm%lmn_size))
- + + - +
- + - - +
- + - + ]
2102 [ - + + - : 12 : ABI_MALLOC(phicor(itypat)%value,(atm%mesh_size,atm%ln_size))
- + + - +
- + - - +
- + - + ]
2103 [ + - + - : 83 : indlmncor(itypat)%value=atm%indlmn
- + - - -
- - - - -
- - + + +
+ ]
2104 : 3 : lmncmax(itypat)=atm%lmn_size
2105 : 3 : nphicor(itypat)=atm%ln_size
2106 [ + - + - : 9829 : phicor(itypat)%value=atm%phi(:,:,1)
- + - - +
+ + + ]
2107 : 6 : call destroy_atomorb(atm)
2108 : : end do
2109 [ - + - + : 3 : ABI_FREE(atm)
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + ]
2110 : : end if
2111 [ - + ]: 3 : if (mpi_enreg%nproc_cell>1) then
2112 : 0 : call xmpi_bcast(indlmncor,0,mpi_enreg%comm_cell,ierr)
2113 : 0 : call xmpi_bcast(phicor,0,mpi_enreg%comm_cell,ierr)
2114 : 0 : call xmpi_bcast(nphicor,0,mpi_enreg%comm_cell,ierr)
2115 : 0 : call xmpi_bcast(lmncmax,0,mpi_enreg%comm_cell,ierr)
2116 : : end if
2117 : :
2118 [ + + ]: 6 : do itypat=1,dtset%ntypat
2119 : :
2120 : 3 : mesh_size = pawtab(itypat)%mesh_size
2121 : 3 : l_size = pawtab(itypat)%l_size
2122 : 3 : lmn_size = pawtab(itypat)%lmn_size
2123 : 3 : lmn2_size = pawtab(itypat)%lmn2_size
2124 : 3 : basis_size = pawtab(itypat)%basis_size
2125 : 3 : lmn_size_c=lmncmax(itypat)
2126 [ + + ]: 14 : llmax=maxval(indlmncor(itypat)%value(1,1:lmn_size_c))
2127 : 3 : l_size_max=max(l_size,2*llmax+1)
2128 : :
2129 [ - + + - : 12 : ABI_MALLOC(j_bessel,(mesh_size,l_size_max))
- + + - +
- + - - +
- + ]
2130 [ - + + - : 9 : ABI_MALLOC(ylmp,(l_size_max*l_size_max))
+ - + - -
+ - + ]
2131 [ - + + - : 15 : ABI_MALLOC(have_intc,(l_size_max,basis_size,nphicor(itypat)))
- + + - -
+ + - + -
+ - - + -
+ ]
2132 [ - + + - : 15 : ABI_MALLOC(intc,(l_size_max,basis_size,nphicor(itypat)))
- + + - -
+ + - + -
+ - - + -
+ ]
2133 [ - + + - : 12 : ABI_MALLOC(have_rad,(l_size,pawtab(itypat)%ij_size))
- + + - +
- + - - +
- + ]
2134 [ - + + - : 12 : ABI_MALLOC(radint1,(l_size,pawtab(itypat)%ij_size))
- + + - +
- + - - +
- + ]
2135 [ - + + - : 9 : ABI_MALLOC(radint2,(l_size,pawtab(itypat)%ij_size))
- + + - -
+ - + ]
2136 [ - + + - : 9 : ABI_MALLOC(radint3,(l_size,pawtab(itypat)%ij_size))
- + + - -
+ - + ]
2137 : :
2138 [ - + + - : 24 : ABI_MALLOC(radsumc(itypat)%value,(2,lmn_size,lmn_size_c,n1,my_n2,n3,my_ngrid))
- + + - -
+ + - - +
+ - - + +
- - + + -
+ - + - -
+ - + -
+ ]
2139 [ - + + - : 21 : ABI_MALLOC(radsum1(itypat)%value,(2,lmn2_size,n1,my_n2,n3,my_ngrid))
- + + - -
+ + - - +
+ - - + +
- + - + -
- + - + -
+ ]
2140 [ - + + - : 18 : ABI_MALLOC(radsum2(itypat)%value,(2,lmn2_size,n1,my_n2,n3,my_ngrid))
- + + - -
+ + - - +
+ - - + +
- - + - +
- + ]
2141 [ - + + - : 18 : ABI_MALLOC(radsum3(itypat)%value,(2,lmn2_size,n1,my_n2,n3,my_ngrid))
- + + - -
+ + - - +
+ - - + +
- - + - +
- + ]
2142 [ + + + + : 39447935 : radsumc(itypat)%value=zero
+ + + + +
+ + + +
+ ]
2143 [ + + + + : 65955455 : radsum1(itypat)%value=zero
+ + + + +
+ + + ]
2144 [ + + + + : 65955455 : radsum2(itypat)%value=zero
+ + + + +
+ + + ]
2145 [ + + + + : 65955455 : radsum3(itypat)%value=zero
+ + + + +
+ + + ]
2146 : :
2147 [ - + + - : 9 : ABI_MALLOC(jbes,(l_size_max))
+ - + - -
+ - + ]
2148 [ - + + - : 9 : ABI_MALLOC(ff,(mesh_size))
+ - + - -
+ - + -
+ ]
2149 : 3 : meshsz=pawrad(itypat)%int_meshsz
2150 [ - + - - ]: 3 : if (meshsz>mesh_size) ff(meshsz+1:mesh_size)=zero
2151 : :
2152 : 3 : indx=0;jkpt=0
2153 [ + + ]: 23 : do ikpt=1,nkpt
2154 [ + - ]: 20 : if (my_gridtab(ikpt)==0) cycle
2155 : 20 : jkpt=jkpt+1
2156 [ + + ]: 575 : do i3=1,n3
2157 : 552 : ig3=i3-(i3/id3)*n3-1
2158 [ + + ]: 15836 : do i2=1,n2
2159 [ + - ]: 15264 : if (me_fft/=fftn2_distrib(i2)) cycle
2160 : 15264 : j2=ffti2_local(i2)
2161 : 15264 : indx=n1*(my_n2*(i3-1)+(j2-1))
2162 : 15264 : ig2=i2-(i2/id2)*n2-1
2163 [ + + ]: 438744 : do i1=1,n1
2164 : 422928 : ig1=i1-(i1/id1)*n1-1
2165 [ + - ]: 422928 : indx=indx+1;if (mod(indx-1,nproc_band)/=me_band) cycle
2166 : :
2167 : : pcart(:)=Crystal%gprimd(:,1)*real(ig1+dtset%kpt(1,ikpt))+&
2168 : : & Crystal%gprimd(:,2)*real(ig2+dtset%kpt(2,ikpt))+&
2169 [ + + ]: 1691712 : & Crystal%gprimd(:,3)*real(ig3+dtset%kpt(3,ikpt))
2170 [ + + ]: 1691712 : pnorm=dsqrt(dot_product(pcart,pcart))
2171 : :
2172 [ + + ]: 422928 : if (pnorm < tol12) then
2173 : 2 : pbn(:) = zero
2174 [ + + ]: 20 : ylmp(:) = zero
2175 : 2 : ylmp(1) = 1.d0/sqrt(four_pi)
2176 : : else
2177 [ + + ]: 1691704 : pbn(:) = pcart(:)/pnorm ! unit vector
2178 : 422926 : call initylmr(l_size,ylmr_normchoice,ylmr_npts,ylmr_nrm,ylmr_option,pbn(:),ylmp(:),ylmgr)
2179 : : end if
2180 : :
2181 : 422928 : pnorm=two_pi*pnorm ! re-normed for call to bessel
2182 [ + + ]: 498838392 : do ir = 1, mesh_size
2183 : 498415464 : bessarg = pnorm*pawrad(itypat)%rad(ir)
2184 : 498415464 : call sbf8(l_size,bessarg,jbes)
2185 [ + + ]: 1994084784 : j_bessel(ir,:)=jbes(:)
2186 : : end do
2187 : :
2188 : : ! ===== Core part =====
2189 : : ! Need intc=\int phi phi_core jl (pr) dr
2190 : :
2191 [ + + + + : 35373456 : have_intc(:,:,:)=.FALSE. ; intc(:,:,:)=zero
+ + + + +
+ + + ]
2192 : :
2193 [ + + ]: 1907712 : do jlmn = 1,lmn_size_c
2194 : 1484784 : jln = indlmncor(itypat)%value(5,jlmn)
2195 : 1484784 : jlm = indlmncor(itypat)%value(4,jlmn)
2196 : 1484784 : jl = indlmncor(itypat)%value(1,jlmn)
2197 [ + + ]: 14415840 : do ilmn = 1,lmn_size
2198 : 12508128 : iln = pawtab(itypat)%indlmn(5,ilmn)
2199 : 12508128 : ilm = pawtab(itypat)%indlmn(4,ilmn)
2200 : 12508128 : il = pawtab(itypat)%indlmn(1,ilmn)
2201 : :
2202 : 12508128 : llmin = abs(il-jl)
2203 : 12508128 : llmax = il+jl
2204 : 12508128 : klm = RCC(ilm,jlm)
2205 [ - + + + ]: 31279392 : do ll=llmin,llmax,2
2206 : 17286480 : ifac=ilfac(mod(ll,4))
2207 : :
2208 : 21947760 : if (.not.have_intc(ll+1,iln,jln)) then
2209 : : ff(1:mesh_size)=(pawtab(itypat)%phi(1:mesh_size,iln)*phicor(itypat)%value(1:mesh_size,jln))&
2210 [ + + ]: 5268009744 : & *j_bessel(1:mesh_size,ll+1)
2211 : 4661280 : call simp_gen(intg,ff,pawrad(itypat))
2212 : 4661280 : intc(ll+1,iln,jln)=intg
2213 : 4661280 : have_intc(ll+1,iln,jln)=.true.
2214 : : end if
2215 : :
2216 [ + + ]: 78585552 : do mm=-ll,ll
2217 : 48790944 : lm = LMC(ll,mm)
2218 : 48790944 : glmij=pawang%gntselect(lm,klm)
2219 [ + + ]: 66077424 : if (glmij>0) then
2220 : 15162768 : arg=ylmp(lm)*pawang%realgnt(glmij)*intc(ll+1,iln,jln)
2221 : : radsumc(itypat)%value(1,ilmn,jlmn,i1,j2,i3,jkpt) = &
2222 : 32449248 : & radsumc(itypat)%value(1,ilmn,jlmn,i1,j2,i3,jkpt)+arg*real(ifac)
2223 : : radsumc(itypat)%value(2,ilmn,jlmn,i1,j2,i3,jkpt) = &
2224 [ + + ]: 32449248 : & radsumc(itypat)%value(2,ilmn,jlmn,i1,j2,i3,jkpt)+arg*aimag(ifac)
2225 : : end if
2226 : : end do !mm
2227 : : end do !ll
2228 : : end do !ilmn
2229 : : end do !jlmn
2230 : :
2231 : : ! ===== Valence part =====
2232 : : ! Need int1=\int phi_i phi_j jl (pr) dr
2233 : : ! and int2=\int tphi_i tphi_j jl (pr) dr
2234 : :
2235 [ + + + + : 95805072 : have_rad(:,:)= .FALSE.;radint1=zero;radint2=zero;radint3=zero
+ + + + +
+ + + + +
+ + ]
2236 : :
2237 [ + + ]: 22277088 : do klmn=1,pawtab(itypat)%lmn2_size
2238 : 21838896 : klm=pawtab(itypat)%indklmn(1,klmn);kln=pawtab(itypat)%indklmn(2,klmn)
2239 : 21838896 : llmin=pawtab(itypat)%indklmn(3,klmn);llmax=pawtab(itypat)%indklmn(4,klmn)
2240 : :
2241 [ - + + + ]: 56761344 : do ll=llmin,llmax,2
2242 : 34499520 : ifac=ilfac(mod(ll,4))
2243 : :
2244 : 57607200 : if (.not.have_rad(ll+1,kln)) then
2245 [ + + ]: 9487422648 : ff(1:mesh_size)=pawtab(itypat)%phiphj(1:mesh_size,kln)*j_bessel(1:mesh_size,ll+1)
2246 : 7702560 : call simp_gen(intg,ff,pawrad(itypat))
2247 : 7702560 : radint1(ll+1,kln)=intg
2248 [ + + ]: 9487422648 : ff(1:mesh_size)=pawtab(itypat)%tphitphj(1:mesh_size,kln)*j_bessel(1:mesh_size,ll+1)
2249 : 7702560 : call simp_gen(intg,ff,pawrad(itypat))
2250 : 7702560 : radint2(ll+1,kln)=intg
2251 : : ff(1:mesh_size)=(pawtab(itypat)%phiphj (1:mesh_size,kln) &
2252 : : & -pawtab(itypat)%tphitphj(1:mesh_size,kln))&
2253 [ + + ]: 9487422648 : & *j_bessel(1:mesh_size,ll+1)
2254 : 7702560 : call simp_gen(intg,ff,pawrad(itypat))
2255 : 7702560 : radint3(ll+1,kln)=intg
2256 : 7702560 : have_rad(ll+1,kln)=.true.
2257 : : end if
2258 : :
2259 [ + + ]: 156354624 : do mm=-ll,ll
2260 : 100016208 : lm = LMC(ll,mm)
2261 : 100016208 : glmij=pawang%gntselect(lm,klm)
2262 [ + + ]: 134515728 : if (glmij>0) then
2263 : 30544776 : arg=ylmp(lm)*pawang%realgnt(glmij)
2264 : : radsum1(itypat)%value(1,klmn,i1,j2,i3,jkpt) = &
2265 : 30544776 : & radsum1(itypat)%value(1,klmn,i1,j2,i3,jkpt)+real(ifac) *arg*radint1(ll+1,kln)
2266 : : radsum1(itypat)%value(2,klmn,i1,j2,i3,jkpt) = &
2267 : 30544776 : & radsum1(itypat)%value(2,klmn,i1,j2,i3,jkpt)+aimag(ifac)*arg*radint1(ll+1,kln)
2268 : : radsum2(itypat)%value(1,klmn,i1,j2,i3,jkpt) = &
2269 : 30544776 : & radsum2(itypat)%value(1,klmn,i1,j2,i3,jkpt)+real(ifac) *arg*radint2(ll+1,kln)
2270 : : radsum2(itypat)%value(2,klmn,i1,j2,i3,jkpt) = &
2271 : 30544776 : & radsum2(itypat)%value(2,klmn,i1,j2,i3,jkpt)+aimag(ifac)*arg*radint2(ll+1,kln)
2272 : : radsum3(itypat)%value(1,klmn,i1,j2,i3,jkpt) = &
2273 : 65044296 : & radsum3(itypat)%value(1,klmn,i1,j2,i3,jkpt)+real(ifac) *arg*radint3(ll+1,kln)
2274 : : radsum3(itypat)%value(2,klmn,i1,j2,i3,jkpt) = &
2275 [ + + ]: 65044296 : & radsum3(itypat)%value(2,klmn,i1,j2,i3,jkpt)+aimag(ifac)*arg*radint3(ll+1,kln)
2276 : : end if
2277 : : end do !mm
2278 : : end do !ll
2279 : : end do !klmn
2280 : :
2281 : : end do ! end loop over i1
2282 : : end do ! end loop over i2
2283 : : end do ! end loop over i3
2284 : : end do ! end loop over ikpt
2285 : :
2286 [ - + ]: 3 : ABI_FREE(ff)
2287 [ - + ]: 3 : ABI_FREE(jbes)
2288 : :
2289 [ - + ]: 3 : ABI_FREE(j_bessel)
2290 [ - + ]: 3 : ABI_FREE(ylmp)
2291 : :
2292 [ - + ]: 3 : ABI_FREE(intc)
2293 [ - + ]: 3 : ABI_FREE(have_intc)
2294 : :
2295 [ - + ]: 3 : ABI_FREE(radint1)
2296 [ - + ]: 3 : ABI_FREE(radint2)
2297 [ - + ]: 3 : ABI_FREE(radint3)
2298 [ - + ]: 3 : ABI_FREE(have_rad)
2299 : :
2300 : 3 : call xmpi_sum(radsumc(itypat)%value,mpi_enreg%comm_band,ierr)
2301 : 3 : call xmpi_sum(radsum1(itypat)%value,mpi_enreg%comm_band,ierr)
2302 : 3 : call xmpi_sum(radsum2(itypat)%value,mpi_enreg%comm_band,ierr)
2303 : 6 : call xmpi_sum(radsum3(itypat)%value,mpi_enreg%comm_band,ierr)
2304 : :
2305 : : end do ! end loop over atom types
2306 : : end if ! PAW
2307 : :
2308 : : !Allocate main memory
2309 [ - + + - : 9 : ABI_MALLOC(rho_contrib,(cplex*nfft))
+ - + - -
+ - + ]
2310 [ - + + - : 12 : ABI_MALLOC(rho_contrib_g,(cplex,nfft))
- + + - +
- + - - +
- + ]
2311 [ - + + - : 9 : ABI_MALLOC(rho_contrib_paw1,(cplex,nfft))
- + + - -
+ - + ]
2312 [ - + + - : 9 : ABI_MALLOC(rho_contrib_paw2,(cplex,nfft))
- + + - -
+ - + ]
2313 [ - + + - : 9 : ABI_MALLOC(rho_contrib_paw3,(cplex,nfft))
- + + - -
+ - + ]
2314 : :
2315 [ - + + - : 12 : ABI_MALLOC(rho_moment_v1,(nfft,my_ngrid))
- + + - +
- + - - +
- + ]
2316 [ - + + - : 9 : ABI_MALLOC(rho_moment_v2,(nfft,my_ngrid))
- + + - -
+ - + ]
2317 [ - + + - : 9 : ABI_MALLOC(rho_moment_core,(nfft,my_ngrid))
- + + - -
+ - + -
+ ]
2318 [ - + + - : 9 : ABI_MALLOC(rho_pw,(nfft,my_ngrid))
- + + - -
+ - + ]
2319 [ + + + + : 845899 : rho_moment_v1=zero;rho_moment_v2=zero
+ + + + ]
2320 [ + + + + : 845899 : rho_pw=zero;rho_moment_core=zero
+ + + + ]
2321 : :
2322 : : !Prepare gamma(r) for the state independent scheme
2323 [ - + + - : 9 : ABI_MALLOC(gamma,(nfft,2))
+ - + - -
+ - + ]
2324 : : if (.not.state_dependent) then
2325 : : ABI_MALLOC(rhoe,(nfft,1))
2326 : : ABI_MALLOC(rhop,(nfft,1))
2327 : : if (electronpositron%particle==EP_ELECTRON) then
2328 : : rhoe(:,1)=rhor_ep_(:,1);rhop(:,1)=rhor_(:,1)
2329 : : else if (electronpositron%particle==EP_POSITRON) then
2330 : : rhoe(:,1)=rhor_(:,1);rhop(:,1)=rhor_ep_(:,1)
2331 : : end if
2332 : : call mkdenpos(iwarn,nfft,1,1,rhoe(:,1),dtset%xc_denpos)
2333 : : call mkdenpos(iwarn,nfft,1,1,rhop(:,1),dtset%xc_denpos)
2334 : : call gammapositron_fft(electronpositron,gamma,Crystal%gprimd,igamma,mpi_enreg,&
2335 : : & n3xccc,nfft,ngfft,rhoe(:,1),rhop(:,1),xccc3d)
2336 : : ABI_FREE(rhoe)
2337 : : ABI_FREE(rhop)
2338 : : else
2339 [ + + + + ]: 132741 : gamma=one
2340 : : end if
2341 : :
2342 : : !Some allocations for state-dependent scheme
2343 : : if (state_dependent) then
2344 : : ! Fake MPI data to be used in poslifetime; allow only FFT parallelism
2345 : 3 : call initmpi_seq(mpi_enreg_seq)
2346 : 3 : mpi_enreg_seq%my_natom=dtset%natom
2347 : : call set_mpi_enreg_fft(mpi_enreg_seq,mpi_enreg%comm_fft,mpi_enreg%distribfft,&
2348 : 3 : & mpi_enreg%me_g0,mpi_enreg%paral_kgb)
2349 : : ! Allocate memory for state-dependent scheme
2350 [ - + + - : 9 : ABI_MALLOC(rhor_dop_el,(nfft))
+ - + - -
+ - + ]
2351 [ + - ]: 3 : if (dtset%usepaw==1) then
2352 [ - + + - : 17 : ABI_MALLOC(pawrhoij_dop_el,(dtset%natom))
+ - + - -
+ - + - +
+ + + - -
+ - + - +
- + - + -
+ ]
2353 : : call pawrhoij_inquire_dim(cplex_rhoij=cplex_rhoij,nspden_rhoij=nspden_rhoij,&
2354 : 3 : & nspden=dtset%nspden,spnorb=dtset%pawspnorb,cpxocc=dtset%pawcpxocc)
2355 : : call pawrhoij_alloc(pawrhoij_dop_el,cplex_rhoij,nspden_rhoij,&
2356 : : dtset%nspinor,dtset%nsppol,dtset%typat,&
2357 : 3 : pawtab=pawtab,use_rhoij_=1,use_rhoijp=1)
2358 : : ! Cancel distribution of PAW data over atomic sites
2359 : : ! We use here pawrhoij because polifetime routine
2360 : : ! detects by itself the particle described by pawrhoij
2361 [ - + ]: 6 : if (mpi_enreg%my_natom<dtset%natom) then
2362 [ # # # # : 0 : ABI_MALLOC(pawrhoij_all,(dtset%natom))
# # # # #
# # # # #
# # # # #
# # # #
# ]
2363 : 0 : call pawrhoij_nullify(pawrhoij_all)
2364 : : call pawrhoij_gather(pawrhoij,pawrhoij_all,-1,mpi_enreg%comm_atom, &
2365 : 0 : & with_rhoijres=.false.,with_rhoij_=.false.,with_lmnmix=.false.)
2366 [ # # # # : 0 : ABI_MALLOC(pawrhoij_ep_all,(dtset%natom))
# # # # #
# # # # #
# # # # #
# # # #
# ]
2367 : 0 : call pawrhoij_nullify(pawrhoij_ep_all)
2368 : : call pawrhoij_gather(electronpositron%pawrhoij_ep,pawrhoij_ep_all,-1,mpi_enreg%comm_atom, &
2369 : 0 : & with_rhoijres=.false.,with_rhoij_=.false.,with_lmnmix=.false.)
2370 : : else
2371 : 3 : pawrhoij_all => pawrhoij
2372 : 3 : pawrhoij_ep_all => electronpositron%pawrhoij_ep
2373 : : end if
2374 : : end if
2375 : : end if
2376 : :
2377 : : !==============================================================================
2378 : : !================ Loop over positronic states =================================
2379 : :
2380 : : !LOOP OVER k POINTS
2381 : 3 : ibg_pos=0;icg_pos=0;ikg_pos=0;bdtot_index_pos=0;isppol_pos=1
2382 [ + + ]: 6 : do ikpt_pos=1,merge(1,nkpt,kgamma_only_positron)
2383 : :
2384 : : ! Extract data for this kpt_pos
2385 : 3 : npw_k_pos=npwarr(ikpt_pos)
2386 : 3 : wtk_k_pos=dtset%wtk(ikpt_pos); if (kgamma_only_positron) wtk_k_pos=one
2387 : 3 : istwf_k_pos=dtset%istwfk(ikpt_pos)
2388 : 3 : nband_k_pos=dtset%nband(ikpt_pos+(isppol_pos-1)*nkpt)
2389 : 3 : nband_cprj_k_pos=nband_k_pos/nproc_band
2390 : : mykpt_pos=.not.(proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt_pos,1,nband_k_pos,&
2391 : 3 : & isppol_pos,mpi_enreg%me_kpt))
2392 : :
2393 : : ! Retrieve additional data for this kpt_pos
2394 [ - + + - : 9 : ABI_MALLOC(occ_k_pos,(nband_k_pos))
+ - + - -
+ - + ]
2395 [ + + ]: 40 : occ_k_pos(:)=occ_pos_ptr(1+bdtot_index_pos:nband_k_pos+bdtot_index_pos)
2396 : : nband_eff_pos=1
2397 [ + + ]: 40 : do ib_pos=1,nband_k_pos
2398 [ + + ]: 40 : if (occ_k_pos(ib_pos)>tol8) nband_eff_pos=ib_pos
2399 : : end do
2400 [ - + ]: 3 : if (mod(nband_eff_pos,blocksize)/=0) nband_eff_pos=((nband_eff_pos/blocksize)+1)*blocksize
2401 : :
2402 : 3 : nblock_band_eff_pos=nband_eff_pos/blocksize
2403 : :
2404 : 3 : mcg_pos=npw_k_pos*my_nspinor*nband_eff_pos
2405 [ - + + - : 9 : ABI_MALLOC(cg_k_pos,(2,mcg_pos))
+ - + - -
+ - + -
+ ]
2406 : :
2407 : 3 : mcprj_k_pos=0
2408 [ + - ]: 3 : if (dtset%usepaw==1) then
2409 : 3 : nband_cprj_eff_pos=nband_eff_pos/nproc_band
2410 : 3 : mcprj_k_pos=my_nspinor*nband_cprj_eff_pos
2411 [ - + + - : 23 : ABI_MALLOC(cprj_k_pos,(dtset%natom,mcprj_k_pos))
- + + - +
- + - - +
- + - + +
+ + + + -
- + - + ]
2412 : 3 : call pawcprj_alloc(cprj_k_pos,0,dimcprj)
2413 : : end if
2414 : :
2415 [ + - ]: 3 : if (mpi_enreg%paral_kgb==0) then
2416 [ + - - + : 12 : ABI_MALLOC(gbound_pos,(2*dtset%mgfft+8,2))
+ - + - +
- + - - +
- + - + ]
2417 [ - + + - : 9 : ABI_MALLOC(kg_k_pos,(3,npw_k_pos))
+ - + - -
+ - + -
+ ]
2418 [ # # ]: 0 : else if (mykpt_pos) then
2419 : : nullify(bandfft_kpt_pos)
2420 : : else
2421 [ # # ]: 0 : ABI_MALLOC(bandfft_kpt_pos,)
2422 : 0 : call bandfft_kpt_reset(bandfft_kpt_pos)
2423 : : end if
2424 : :
2425 : : ! Exchange data (WF components) between procs
2426 [ + - ]: 3 : if (mykpt_pos) then
2427 [ + + + + ]: 3882 : cg_k_pos(:,1:mcg_pos)=cg_pos_ptr(:,icg_pos+1:icg_pos+mcg_pos)
2428 [ + - + + : 5175 : if (mpi_enreg%paral_kgb==0) kg_k_pos(:,1:npw_k_pos)=kg(:,1+ikg_pos:npw_k_pos+ikg_pos)
+ + ]
2429 [ + - ]: 3 : if (dtset%usepaw==1) then
2430 : : call pawcprj_get(Crystal%atindx1,cprj_k_pos,cprj_pos_ptr,dtset%natom,1,ibg_pos,ikpt_pos,iorder_cprj,&
2431 : : & isppol_pos,mband_cprj_pos,dtset%mkmem,dtset%natom,nband_cprj_eff_pos,nband_k_pos,my_nspinor,&
2432 [ - + ]: 3 : & dtset%nsppol,dtfil%unpaw,mpicomm=mpi_enreg%comm_kpt,proc_distrb=mpi_enreg%proc_distrb)
2433 : : end if
2434 [ - + ]: 3 : if (mpi_enreg%paral_kgb/=0) then
2435 : 0 : jj=mpi_enreg%my_kpttab(ikpt_pos)
2436 : 0 : bandfft_kpt_pos => bandfft_kpt(jj)
2437 : : end if
2438 [ + + ]: 6 : do ii=0,mpi_enreg%nproc_spkpt-1
2439 [ - + ]: 6 : if (ii/=mpi_enreg%me_kpt) then
2440 : 0 : tag=ikpt_pos+(isppol_pos-1)*nkpt+2*nkpt*ii
2441 : 0 : call xmpi_send(cg_k_pos,ii,tag,mpi_enreg%comm_kpt,ierr)
2442 : 0 : tag=tag+nkpt*(1+2*mpi_enreg%nproc_spkpt)
2443 [ # # ]: 0 : if (mpi_enreg%paral_kgb==0) then
2444 : 0 : call xmpi_send(kg_k_pos,ii,tag,mpi_enreg%comm_kpt,ierr)
2445 : : else
2446 : 0 : call bandfft_kpt_mpi_send(bandfft_kpt_pos,ii,tag,mpi_enreg%comm_kpt,ierr,profile='fourwf')
2447 : : end if
2448 [ # # ]: 0 : if (dtset%usepaw==1) then
2449 : 0 : call pawcprj_mpi_send(dtset%natom,mcprj_k_pos,dimcprj,0,cprj_k_pos,ii,mpi_enreg%comm_kpt,ierr)
2450 : : end if
2451 : : end if
2452 : : end do
2453 : : else
2454 [ # # ]: 0 : ii=0;if (allocated(mpi_enreg%proc_distrb)) ii=mpi_enreg%proc_distrb(ikpt_pos,1,isppol_pos)
2455 : 0 : tag=ikpt_pos+(isppol_pos-1)*nkpt+2*nkpt*mpi_enreg%me_kpt
2456 : 0 : call xmpi_recv(cg_k_pos,ii,tag,mpi_enreg%comm_kpt,ierr)
2457 : 0 : tag=tag+nkpt*(1+2*mpi_enreg%nproc_spkpt)
2458 [ # # ]: 0 : if (mpi_enreg%paral_kgb==0) then
2459 : 0 : call xmpi_recv(kg_k_pos,ii,tag,mpi_enreg%comm_kpt,ierr)
2460 : : else
2461 : 0 : call bandfft_kpt_mpi_recv(bandfft_kpt_pos,ii,tag,mpi_enreg%comm_kpt,ierr)
2462 : : end if
2463 [ # # ]: 0 : if (dtset%usepaw==1) then
2464 : 0 : call pawcprj_mpi_recv(dtset%natom,mcprj_k_pos,dimcprj,0,cprj_k_pos,ii,mpi_enreg%comm_kpt,ierr)
2465 : : end if
2466 : : end if
2467 : :
2468 [ + - ]: 3 : if (mpi_enreg%paral_kgb==0) then
2469 : 3 : call sphereboundary(gbound_pos,istwf_k_pos,kg_k_pos,dtset%mgfft,npw_k_pos)
2470 : : end if
2471 : :
2472 [ - + + - : 9 : ABI_MALLOC(cwaver_pos,(cplex*nfft))
+ - + - -
+ - + -
+ ]
2473 [ - + + - : 9 : ABI_MALLOC(cwaver_pos_block,(cplex*nfft*bandpp))
+ - + - -
+ - + ]
2474 [ + - ]: 3 : if (dtset%usepaw==1) then
2475 [ - + + - : 23 : ABI_MALLOC(cprj_pos,(dtset%natom,my_nspinor))
- + + - +
- + - - +
- + - + +
+ + + + -
- + - + ]
2476 : 3 : call pawcprj_alloc(cprj_pos,0,dimcprj)
2477 : : end if
2478 : :
2479 : : ! ============================================================================
2480 : : ! Loops on positronic bands
2481 : :
2482 [ + + ]: 6 : do iblock_pos=1,nblock_band_eff_pos
2483 : 3 : ib_pos=1+(iblock_pos-1)*blocksize
2484 [ + - - + : 6 : if (any(abs(occ_k_pos(ib_pos:ib_pos+blocksize-1))>tol8)) then
+ - ]
2485 : :
2486 [ - + + - : 9 : ABI_MALLOC(cwaveg_pos,(2,npw_k_pos*blocksize))
+ - + - -
+ - + -
+ ]
2487 [ - + + - : 15 : ABI_MALLOC(cwaveaug_pos,(2,n4,n5,n6*bandpp))
- + + - -
+ + - + -
+ - - + -
+ - + ]
2488 [ - + + - : 15 : ABI_MALLOC(denpot_dum,(n4,n5,n6))
- + + - -
+ + - + -
+ - - + -
+ - + ]
2489 [ - + + - : 6 : ABI_MALLOC(fofgout_dum,(2,npw_k_pos*blocksize))
- + - + -
+ ]
2490 : 3 : iwavef_pos=(iblock_pos-1)*npw_k_pos*blocksize
2491 : : cwaveg_pos(:,1:npw_k_pos*blocksize)= &
2492 [ + + + + ]: 3882 : & cg_k_pos(:,iwavef_pos+1:iwavef_pos+npw_k_pos*blocksize)
2493 : :
2494 : : ! Get positronic wave function in real space
2495 : 3 : option=0
2496 [ + - ]: 3 : if (mpi_enreg%paral_kgb==0) then
2497 : 3 : weight_pos=occ_k_pos(ib_pos)*wtk_k_pos
2498 : : call fourwf(1,denpot_dum,cwaveg_pos,fofgout_dum,cwaveaug_pos,&
2499 : : & gbound_pos,gbound_pos,istwf_k_pos,kg_k_pos,kg_k_pos,&
2500 : : & dtset%mgfft,mpi_enreg,1,ngfft,npw_k_pos,npw_k_pos,&
2501 : : & n4,n5,n6,option,tim_fourwf,weight_pos,weight_pos,&
2502 : 3 : & gpu_option=dtset%gpu_option)
2503 : : else
2504 : : call prep_fourwf(denpot_dum,blocksize,cwaveg_pos,cwaveaug_pos,&
2505 : : & iblock_pos,istwf_k_pos,dtset%mgfft,mpi_enreg,nband_k_pos,&
2506 : : & bandpp,ngfft,npw_k_pos,n4,n5,n6,occ_k_pos,option,Crystal%ucvol,wtk_k_pos,1,&
2507 : 0 : & bandfft_kpt_tab=bandfft_kpt_pos,gpu_option=dtset%gpu_option)
2508 : : end if
2509 : :
2510 [ + + ]: 132735 : cwaver_pos_block=zero
2511 [ + + ]: 6 : do ii=1,bandpp
2512 : 3 : j3=(ii-1)*n3
2513 : 3 : indx0=1+(ii-1)*cplex*nfft
2514 [ + + ]: 90 : do i3=1,n3
2515 [ + - ]: 87 : if (me_fft==fftn3_distrib(i3)) then
2516 : 84 : indx=indx0+cplex*n1*n2*(ffti3_local(i3)-1)
2517 [ + + ]: 2442 : do i2=1,n2
2518 [ + + ]: 68808 : do i1=1,n1
2519 : 66366 : cwaver_pos_block(indx )=cwaveaug_pos(1,i1,i2,i3+j3)
2520 : 66366 : cwaver_pos_block(indx+1)=cwaveaug_pos(2,i1,i2,i3+j3)
2521 : 68724 : indx=indx+2
2522 : : end do
2523 : : end do
2524 : : end if
2525 : : end do
2526 : : end do
2527 [ - + ]: 3 : ABI_FREE(fofgout_dum)
2528 [ - + ]: 3 : ABI_FREE(denpot_dum)
2529 [ - + ]: 3 : ABI_FREE(cwaveaug_pos)
2530 [ - + ]: 3 : ABI_FREE(cwaveg_pos)
2531 : :
2532 : : ! At this stage, each band proc has bandpp bands in real space
2533 : : ! (distributed on FFT procs)
2534 : :
2535 : : ! ========================================================================
2536 : : ! Compute core contribution for this positronic band (PAW only)
2537 : :
2538 [ + - ]: 3 : if (dtset%usepaw==1) then
2539 [ + + ]: 6 : do ibpp_pos=1,bandpp
2540 : 3 : ib_cprj_pos=(iblock_pos-1)*bandpp+ibpp_pos
2541 : 3 : weight_pos=occ_k_pos(ib_pos+ibpp_pos-1+me_band*bandpp)*wtk_k_pos
2542 : : ! Calculate the annihilation rate for each core state for state dependent scheme
2543 : 3 : iatm=0
2544 [ + + ]: 6 : do itypat=1,dtset%ntypat
2545 : 3 : mesh_size = pawtab(itypat)%mesh_size
2546 [ + + ]: 14 : do iat=1,Crystal%nattyp(itypat)
2547 : 8 : iatm=iatm+1;iatom=Crystal%atindx1(iatm)
2548 [ - + + - : 24 : ABI_MALLOC(gammastate_c(iatom)%value,(lmncmax(itypat)))
+ - + - -
+ - + -
+ ]
2549 [ + + ]: 43 : do jlmn=1,lmncmax(itypat)
2550 : 32 : jln = indlmncor(itypat)%value(5,jlmn)
2551 : 32 : contrib(:)=zero
2552 [ - + + - : 96 : ABI_MALLOC(rhocorej,(mesh_size))
+ - + - -
+ - + -
+ ]
2553 [ + + ]: 28734 : rhocorej(1:mesh_size)=2*phicor(itypat)%value(1:mesh_size,jln)**2
2554 : : call posratecore(dtset,electronpositron,iatom,dtset%natom,mesh_size,mpi_enreg_seq,&
2555 [ - + - + ]: 32 : & 1,pawang,pawrad,pawrhoij_all,pawrhoij_ep_all,pawtab,ratec,rhocorej)
2556 : :
2557 : : call posratecore(dtset,electronpositron,iatom,dtset%natom,mesh_size,mpi_enreg_seq,&
2558 [ - + - + ]: 32 : & 2,pawang,pawrad,pawrhoij_all,pawrhoij_ep_all,pawtab,ratec_ipm,rhocorej)
2559 : :
2560 : 32 : gammastate_c(iatom)%value(jlmn)=ratec/ratec_ipm
2561 [ - + ]: 40 : ABI_FREE(rhocorej)
2562 : : end do
2563 : : end do
2564 : : end do
2565 : 3 : jkpt=0
2566 [ + + ]: 26 : do ikpt=1,nkpt
2567 [ + - ]: 20 : if (my_gridtab(ikpt)==0) cycle
2568 : 20 : jkpt=jkpt+1
2569 [ + + ]: 575 : do i3=1,n3
2570 : 552 : ig3=i3-(i3/id3)*n3-1
2571 [ + + ]: 15836 : do i2=1,n2
2572 [ + - ]: 15816 : if (me_fft==fftn2_distrib(i2)) then
2573 : 15264 : j2=ffti2_local(i2)
2574 : 15264 : ig2=i2-(i2/id2)*n2-1
2575 : 15264 : indx=n1*(my_n2*(i3-1)+(j2-1))
2576 [ + + ]: 438192 : do i1=1,n1
2577 : 422928 : ig1=i1-(i1/id1)*n1-1
2578 : 422928 : indx=indx+1
2579 : :
2580 : : ! Loop on atoms (type sorted)
2581 : 422928 : iatm=0
2582 [ + + ]: 861120 : do itypat=1,dtset%ntypat
2583 : 422928 : lmn_size = pawtab(itypat)%lmn_size
2584 : :
2585 [ + + ]: 1907712 : do iat=1,Crystal%nattyp(itypat)
2586 : 1061856 : iatm=iatm+1;iatom=Crystal%atindx1(iatm)
2587 : :
2588 : : pcart(:)=Crystal%gprimd(:,1)*real(ig1+dtset%kpt(1,ikpt))+&
2589 : : & Crystal%gprimd(:,2)*real(ig2+dtset%kpt(2,ikpt))+&
2590 [ + + ]: 4247424 : & Crystal%gprimd(:,3)*real(ig3+dtset%kpt(3,ikpt))
2591 : 1061856 : pnorm=dsqrt(dot_product(pcart,pcart))
2592 [ + + ]: 4247424 : pr=dot_product(pcart,Crystal%xcart(:,iatom))
2593 : 1061856 : expipr(1)= cos(two_pi*pr)
2594 : 1061856 : expipr(2)=-sin(two_pi*pr)
2595 : :
2596 : : ! Loop on ij states
2597 [ + + ]: 5534352 : do jlmn = 1,lmncmax(itypat)
2598 : : contrib(:)=zero
2599 [ + + ]: 37705824 : do ilmn = 1,lmn_size
2600 : : radsumnfftc(1)=expipr(1)*radsumc(itypat)%value(1,ilmn,jlmn,i1,j2,i3,jkpt)&
2601 : 33656256 : & -expipr(2)*radsumc(itypat)%value(2,ilmn,jlmn,i1,j2,i3,jkpt)
2602 : : radsumnfftc(2)=expipr(1)*radsumc(itypat)%value(2,ilmn,jlmn,i1,j2,i3,jkpt)&
2603 : 33656256 : & +expipr(2)*radsumc(itypat)%value(1,ilmn,jlmn,i1,j2,i3,jkpt)
2604 [ + + ]: 100968768 : cp_pos(:)=cprj_k_pos(iatom,ib_cprj_pos)%cp(:,ilmn)
2605 : : contrib(1)=contrib(1)+four_pi*(cp_pos(1)*radsumnfftc(1) &
2606 : 33656256 : & -cp_pos(2)*radsumnfftc(2))
2607 : : contrib(2)=contrib(2)+four_pi*(cp_pos(1)*radsumnfftc(2) &
2608 : 37705824 : & +cp_pos(2)*radsumnfftc(1))
2609 : : end do ! end loop over ilmn
2610 : : ! 2 - electron state weight for 2 spins
2611 : : rho_moment_core(indx,jkpt) = rho_moment_core(indx,jkpt) &
2612 : 5111424 : & +gammastate_c(iatom)%value(jlmn)*2*weight_pos*(contrib(1)**2+contrib(2)**2)
2613 : : end do ! end loop over jlmn
2614 : :
2615 : : end do !end loop over atoms
2616 : : end do !end loop over atom types
2617 : :
2618 : : end do ! end loop over i1
2619 : : end if ! end loop over i2
2620 : : end do
2621 : : end do ! end loop over i3
2622 : : end do ! jkpt
2623 : : end do ! ibpp_pos
2624 : : end if
2625 : :
2626 : : ! We now loop over positronic bands inside a block
2627 : : ! and select occupied ones
2628 [ + + ]: 6 : do ibpp_pos=1,blocksize
2629 : 3 : ib_pos=(iblock_pos-1)*blocksize+ibpp_pos
2630 : 3 : occ_pos=occ_k_pos(ib_pos)
2631 [ + - ]: 6 : if (abs(occ_pos)>tol8) then
2632 : :
2633 : : ! Parallelism: dirty trick (broadcast bands) but there should be few positronic bands (~1)
2634 [ - + ]: 3 : if (nproc_band>1) then
2635 : 0 : iproc=(ibpp_pos-1)/bandpp
2636 [ # # ]: 0 : if (me_band==iproc) then
2637 : 0 : indx=mod((ibpp_pos-1),bandpp)*cplex*nfft
2638 [ # # ]: 0 : cwaver_pos(1:cplex*nfft)=cwaver_pos_block(indx+1:indx+cplex*nfft)
2639 : : end if
2640 : 0 : call xmpi_bcast(cwaver_pos,iproc,mpi_enreg%comm_band,ierr)
2641 [ # # ]: 0 : if (dtset%usepaw==1) then
2642 [ # # ]: 0 : if (me_band==iproc) then
2643 : 0 : indx=mod((ibpp_pos-1),bandpp)*my_nspinor
2644 : 0 : call pawcprj_copy(cprj_k_pos(:,indx+1:indx+my_nspinor),cprj_pos)
2645 : : end if
2646 : : call pawcprj_bcast(cprj_pos,dtset%natom,my_nspinor,dimcprj,0,iproc,&
2647 : 0 : & mpi_enreg%comm_band,ierr)
2648 : : end if
2649 : : else
2650 [ + + ]: 132735 : cwaver_pos(1:cplex*nfft)=cwaver_pos_block(1:cplex*nfft)
2651 [ + - ]: 3 : if (dtset%usepaw==1) then
2652 : 3 : call pawcprj_copy(cprj_k_pos(:,(ib_pos-1)*my_nspinor+1:ib_pos*my_nspinor),cprj_pos)
2653 : : end if
2654 : : end if
2655 : :
2656 : : ! ========================================================================
2657 : : ! ================ Loop over electronic states ===========================
2658 : :
2659 : : ! Loop over spins
2660 : 3 : ibg=0;icg=0;ikg=0;bdtot_index=0
2661 [ + + ]: 6 : do isppol=1,dtset%nsppol
2662 : : ! Loop over k points
2663 : 3 : ikg=0;jkpt=0
2664 [ + + ]: 26 : do ikpt=1,nkpt
2665 : :
2666 : : ! Extract data for this kpt_pos
2667 : 20 : npw_k=npwarr(ikpt)
2668 : 20 : wtk_k=dtset%wtk(ikpt)
2669 : 20 : istwf_k=dtset%istwfk(ikpt)
2670 : 20 : nband_k=dtset%nband(ikpt+(isppol-1)*nkpt)
2671 : 20 : nband_cprj_k=nband_k/nproc_band
2672 : : mykpt=.not.(proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,nband_k,&
2673 : 20 : & isppol,mpi_enreg%me_kpt))
2674 : :
2675 : : ! Select k-points for current proc
2676 [ + - ]: 20 : if (mykpt) then
2677 : :
2678 : : ! Retrieve additional data for this kpt_pos
2679 : 20 : jkpt=jkpt+1
2680 [ - + + - : 60 : ABI_MALLOC(occ_k,(nband_k))
+ - + - -
+ - + -
+ ]
2681 [ + + ]: 256 : occ_k(:)=occ_ptr(1+bdtot_index:nband_k+bdtot_index)
2682 : :
2683 : 20 : mcprj_k=0
2684 [ + - ]: 20 : if (dtset%usepaw==1) then
2685 : 20 : mcprj_k=my_nspinor*nband_cprj_k
2686 [ - + + - : 908 : ABI_MALLOC(cprj_k,(dtset%natom,mcprj_k))
- + + - +
- + - - +
- + - + +
+ + + + -
- + - + ]
2687 : 20 : call pawcprj_alloc(cprj_k,0,dimcprj)
2688 : : call pawcprj_get(Crystal%atindx1,cprj_k,cprj_ptr,dtset%natom,1,ibg,ikpt,iorder_cprj,&
2689 : : & isppol,mband_cprj,dtset%mkmem,dtset%natom,nband_cprj_k,nband_cprj_k,my_nspinor,&
2690 [ - + ]: 20 : & dtset%nsppol,dtfil%unpaw,mpicomm=mpi_enreg%comm_kpt,proc_distrb=mpi_enreg%proc_distrb)
2691 : : end if
2692 : :
2693 [ + - ]: 20 : if (mpi_enreg%paral_kgb==0) then
2694 [ + - - + : 80 : ABI_MALLOC(gbound,(2*dtset%mgfft+8,2))
+ - + - +
- + - - +
- + - + ]
2695 [ - + + - : 60 : ABI_MALLOC(kg_k,(3,npw_k))
+ - + - -
+ - + -
+ ]
2696 [ + + + + ]: 33988 : kg_k(:,1:npw_k)=kg(:,1+ikg:npw_k+ikg)
2697 : 20 : call sphereboundary(gbound,istwf_k,kg_k,dtset%mgfft,npw_k)
2698 : : else
2699 : 0 : jj=mpi_enreg%my_kpttab(ikpt)
2700 : 0 : bandfft_kpt_el => bandfft_kpt(jj)
2701 : : end if
2702 : :
2703 [ - + + - : 60 : ABI_MALLOC(cwaver,(cplex*nfft*bandpp))
+ - + - -
+ - + -
+ ]
2704 : :
2705 : : ! ==================================================================
2706 : : ! Loops on electronic bands
2707 : :
2708 [ + + ]: 256 : do iblock=1,nblock_band
2709 : 236 : ib=1+(iblock-1)*blocksize
2710 : :
2711 [ + + + + : 336 : if (any(abs(occ_k(ib:ib+blocksize-1))>tol8)) then
+ + ]
2712 : :
2713 : : ! Retrieve electronic wave function
2714 [ - + + - : 468 : ABI_MALLOC(cwaveg,(2,npw_k*blocksize))
+ - + - -
+ - + -
+ ]
2715 [ - + + - : 780 : ABI_MALLOC(cwaveaug,(2,n4,n5,n6*bandpp))
- + + - -
+ + - + -
+ - - + -
+ - + ]
2716 [ - + + - : 780 : ABI_MALLOC(denpot_dum,(n4,n5,n6))
- + + - -
+ + - + -
+ - - + -
+ - + ]
2717 [ - + + - : 312 : ABI_MALLOC(fofgout_dum,(2,npw_k*blocksize))
- + - + -
+ ]
2718 : 156 : iwavef=(iblock-1)*npw_k*blocksize
2719 : : cwaveg(:,1:npw_k*blocksize)= &
2720 [ + + + + ]: 222273 : & cg_ptr(:,icg+iwavef+1:icg+iwavef+npw_k*blocksize)
2721 : :
2722 : : ! Get electronic wave function in real space
2723 : 156 : option=0
2724 [ + - ]: 156 : if (mpi_enreg%paral_kgb==0) then
2725 : 156 : weight=occ_k(ib)*wtk_k
2726 : : call fourwf(1,denpot_dum,cwaveg,fofgout_dum,cwaveaug,&
2727 : : & gbound,gbound,istwf_k,kg_k,kg_k,&
2728 : : & dtset%mgfft,mpi_enreg,1,ngfft,npw_k,npw_k,&
2729 : : & n4,n5,n6,option,tim_fourwf,weight,weight,&
2730 : 156 : & gpu_option=dtset%gpu_option)
2731 : : else
2732 : : call prep_fourwf(denpot_dum,blocksize,cwaveg,cwaveaug,&
2733 : : & iblock,istwf_k,dtset%mgfft,mpi_enreg,nband_k,&
2734 : : & bandpp,ngfft,npw_k,n4,n5,n6,occ_k,option,Crystal%ucvol,wtk_k,1,&
2735 : 0 : & bandfft_kpt_tab=bandfft_kpt_el,gpu_option=dtset%gpu_option)
2736 : : end if
2737 : :
2738 [ + + ]: 6551004 : cwaver=zero
2739 [ + + ]: 312 : do ii=1,bandpp
2740 : 156 : j3=(ii-1)*n3
2741 : 156 : indx0=1+(ii-1)*cplex*nfft
2742 [ + + ]: 4608 : do i3=1,n3
2743 [ + - ]: 4452 : if (me_fft==fftn3_distrib(i3)) then
2744 : 4296 : indx=indx0+cplex*n1*n2*(ffti3_local(i3)-1)
2745 [ + + ]: 122808 : do i2=1,n2
2746 [ + + ]: 3398232 : do i1=1,n1
2747 : 3275424 : cwaver(indx )=cwaveaug(1,i1,i2,i3+j3)
2748 : 3275424 : cwaver(indx+1)=cwaveaug(2,i1,i2,i3+j3)
2749 : 3393936 : indx=indx+2
2750 : : end do
2751 : : end do
2752 : : end if
2753 : : end do
2754 : : end do
2755 [ - + ]: 156 : ABI_FREE(fofgout_dum)
2756 [ - + ]: 156 : ABI_FREE(denpot_dum)
2757 [ - + ]: 156 : ABI_FREE(cwaveaug)
2758 [ - + ]: 156 : ABI_FREE(cwaveg)
2759 : : ! At this stage, each band proc has bandpp bands in real space
2760 : : ! (distributed on FFT procs)
2761 : :
2762 : : ! We now loop on the bandpp bands
2763 : : ! and select occupied ones
2764 [ + + ]: 312 : do ibpp=1,bandpp
2765 : 156 : occ_el=occ_k(ib+ibpp-1+me_band*bandpp)
2766 [ + - ]: 312 : if (abs(occ_el)>tol8) then
2767 : :
2768 : : ! ==============================================================
2769 : : ! Compute state-dependent annihilation rate
2770 : : ! Avoid parallelism over kpt/bands/atoms
2771 : 156 : gammastate=one;rate_paw=one
2772 : : if (state_dependent) then
2773 : 156 : weight=occ_el*wtk_k
2774 : 156 : ib_cprj=(iblock-1)*bandpp+ibpp
2775 : 156 : indx=1+(ibpp-1)*cplex*nfft
2776 [ + + ]: 3275580 : do ii=1,nfft
2777 : 3275424 : rhor_dop_el(ii)=weight*(cwaver(indx)*cwaver(indx)+cwaver(indx+1)*cwaver(indx+1))
2778 : 3275580 : indx=indx+2
2779 : : end do
2780 [ + - ]: 156 : if (dtset%usepaw==1) then
2781 [ + + ]: 524 : do iatom=1,dtset%natom
2782 [ + + + + ]: 22204 : pawrhoij_dop_el(iatom)%rhoij_=zero
2783 : : end do
2784 [ - + ]: 156 : cplex_rhoij=2;if (istwf_k>1) cplex_rhoij=1
2785 : 156 : use_timerev=(dtset%kptopt>0.and.dtset%kptopt<3)
2786 [ - + - - ]: 156 : use_zeromag=(pawrhoij_dop_el(1)%nspden==4.and.dtset%nspden==1)
2787 : : call pawaccrhoij(Crystal%atindx,cplex_rhoij,cprj_k(:,ib_cprj),&
2788 : : & cprj_k(:,ib_cprj),0,isppol,dtset%natom,dtset%natom,dtset%nspinor,&
2789 : 156 : & occ_el,1,pawrhoij_dop_el,use_timerev,use_zeromag,wtk_k)
2790 : : ! Is it correct to apply symetries here (on a single band)?
2791 : : ! If not, call pawrhoij_symrhoij with nsym=1
2792 : : call pawrhoij_symrhoij(pawrhoij_dop_el,pawrhoij_dop_el,1,Crystal%gprimd,&
2793 : : & Crystal%indsym,0,dtset%natom,Crystal%nsym,dtset%ntypat,1,pawang,-10001,&
2794 : 156 : & pawtab,Crystal%rprimd,Crystal%symafm,Crystal%symrec,dtset%typat)
2795 : : end if
2796 : : ! Has to call poslifetime in sequential because we are in a parallel section
2797 : : ! Only FFT parallelism is allowed
2798 : : call poslifetime(dtset,electronpositron,Crystal%gprimd,dtset%natom,mpi_enreg_seq,n3xccc,&
2799 : : & nfft,ngfft,nhat,2,pawang,pawrad,pawrhoij_all,pawtab,rate,rate_paw,rhor,Crystal%ucvol,xccc3d,&
2800 [ - + - + ]: 156 : & rhor_dop_el=rhor_dop_el,pawrhoij_dop_el=pawrhoij_dop_el,pawrhoij_ep=pawrhoij_ep_all)
2801 : : call poslifetime(dtset,electronpositron,Crystal%gprimd,dtset%natom,mpi_enreg_seq,n3xccc,&
2802 : : & nfft,ngfft,nhat,3,pawang,pawrad,pawrhoij_all,pawtab,rate_ipm,rate_paw_ipm,rhor,Crystal%ucvol,xccc3d,&
2803 [ - + - + ]: 156 : & rhor_dop_el=rhor_dop_el,pawrhoij_dop_el=pawrhoij_dop_el,pawrhoij_ep=pawrhoij_ep_all)
2804 : 156 : gammastate=rate/rate_ipm
2805 : 156 : rate_paw=rate_paw/rate_paw_ipm
2806 : : end if
2807 : :
2808 : : ! ==============================================================
2809 : : ! Compute plane-wave contribution to momentum distribution
2810 : :
2811 : : ! Compute Psi^+(r) * Psi^-(r) * gamma(r) in real space
2812 [ + + ]: 6551004 : rho_contrib(:)=zero
2813 : 156 : indx=(ibpp-1)*cplex*nfft
2814 [ + - ]: 156 : if (cplex==2) then
2815 [ + + ]: 3275580 : do jj=1,nfft
2816 : 3275424 : ii=2*jj-1
2817 : : rho_contrib(ii) =sqrt(gamma(jj,2))*(cwaver_pos(ii)*cwaver(indx+ii)&
2818 : 3275424 : & -wf_fact*cwaver_pos(ii+1)*cwaver(indx+ii+1))
2819 : : rho_contrib(ii+1)=sqrt(gamma(jj,2))*(cwaver_pos(ii)*cwaver(indx+ii+1) &
2820 : 3275580 : & +wf_fact*cwaver_pos(ii+1)*cwaver(indx+ii))
2821 : : end do
2822 : : else
2823 [ # # ]: 0 : do ii=1,nfft
2824 : 0 : rho_contrib(ii)=sqrt(gamma(ii,2))*cwaver_pos(ii)*cwaver(indx+ii)
2825 : : end do
2826 : : end if
2827 : :
2828 : : ! FFT of (Psi+.Psi-.gamma) to get Intg[(Psi+.Psi-.gamma).exp(-igr)]
2829 : : call fourdp(cplex,rho_contrib_g,rho_contrib,-1,mpi_enreg,nfft,1,ngfft,&
2830 : 156 : & tim_fourdp)
2831 : :
2832 : : rho_pw(1:nfft,jkpt)=rho_pw(1:nfft,jkpt) +gammastate*occ_el*occ_pos &
2833 [ + + ]: 3275580 : & *(rho_contrib_g(1,1:nfft)**2+rho_contrib_g(2,1:nfft)**2)
2834 : :
2835 : : ! ==============================================================
2836 : : ! Compute PAW on-site contribution to momentum distribution
2837 : :
2838 [ + - ]: 156 : if (dtset%usepaw==1) then
2839 : :
2840 [ + + + + ]: 9826428 : rho_contrib_paw1(:,:)= zero
2841 [ + + + + ]: 9826428 : rho_contrib_paw2(:,:)= zero
2842 [ + + + + ]: 9826428 : rho_contrib_paw3(:,:)= zero
2843 : :
2844 : 156 : ib_cprj=(iblock-1)*bandpp+ibpp
2845 : :
2846 : : ! Loop on moments
2847 : 156 : indx=0
2848 [ + + ]: 4452 : do i3=1,n3
2849 : 4296 : ig3=i3-(i3/id3)*n3-1
2850 [ + + ]: 122964 : do i2=1,n2
2851 [ + - ]: 122808 : if (me_fft==fftn2_distrib(i2)) then
2852 : 118512 : j2=ffti2_local(i2)
2853 : 118512 : ig2=i2-(i2/id2)*n2-1
2854 : 118512 : indx=n1*(my_n2*(i3-1)+(j2-1))
2855 [ + + ]: 3393936 : do i1=1,n1
2856 : 3275424 : ig1=i1-(i1/id1)*n1-1
2857 : 3275424 : indx=indx+1
2858 : :
2859 : : pcart(:)=Crystal%gprimd(:,1)*real(ig1+dtset%kpt(1,ikpt))+&
2860 : : & Crystal%gprimd(:,2)*real(ig2+dtset%kpt(2,ikpt))+&
2861 [ + + ]: 13101696 : & Crystal%gprimd(:,3)*real(ig3+dtset%kpt(3,ikpt))
2862 : 3275424 : pnorm=dsqrt(dot_product(pcart,pcart))
2863 : :
2864 : : ! Loop on atoms (type-sorted)
2865 : 3275424 : iatm=0
2866 [ + + ]: 6550848 : do itypat=1,dtset%ntypat
2867 : 3275424 : lmn_size=pawtab(itypat)%lmn_size
2868 : 3275424 : lmn2_size=pawtab(itypat)%lmn2_size
2869 [ - + + - : 9826272 : ABI_MALLOC(radsumnfft1,(2,lmn2_size))
+ - + - -
+ - + -
+ ]
2870 [ - + + - : 6550848 : ABI_MALLOC(radsumnfft2,(2,lmn2_size))
- + - + -
+ ]
2871 [ - + + - : 6550848 : ABI_MALLOC(radsumnfft3,(2,lmn2_size))
- + - + -
+ ]
2872 : :
2873 [ + + ]: 11338272 : do iat=1,Crystal%nattyp(itypat)
2874 : 8062848 : iatm=iatm+1;iatom=Crystal%atindx1(iatm)
2875 : :
2876 [ + + ]: 32251392 : pr=dot_product(pcart,Crystal%xcart(:,iatom))
2877 : 8062848 : expipr(1)= cos(two_pi*pr)
2878 : 8062848 : expipr(2)=-sin(two_pi*pr)
2879 : :
2880 [ + + ]: 457049088 : do klmn=1,lmn2_size
2881 : : radsumnfft1(1,klmn)=expipr(1)*radsum1(itypat)%value(1,klmn,i1,j2,i3,jkpt)&
2882 : 448986240 : & -expipr(2)*radsum1(itypat)%value(2,klmn,i1,j2,i3,jkpt)
2883 : : radsumnfft1(2,klmn)=expipr(1)*radsum1(itypat)%value(2,klmn,i1,j2,i3,jkpt)&
2884 : 448986240 : & +expipr(2)*radsum1(itypat)%value(1,klmn,i1,j2,i3,jkpt)
2885 : : radsumnfft2(1,klmn)=expipr(1)*radsum2(itypat)%value(1,klmn,i1,j2,i3,jkpt)&
2886 : 448986240 : & -expipr(2)*radsum2(itypat)%value(2,klmn,i1,j2,i3,jkpt)
2887 : : radsumnfft2(2,klmn)=expipr(1)*radsum2(itypat)%value(2,klmn,i1,j2,i3,jkpt)&
2888 : 448986240 : & +expipr(2)*radsum2(itypat)%value(1,klmn,i1,j2,i3,jkpt)
2889 : : radsumnfft3(1,klmn)=expipr(1)*radsum3(itypat)%value(1,klmn,i1,j2,i3,jkpt)&
2890 : 448986240 : & -expipr(2)*radsum3(itypat)%value(2,klmn,i1,j2,i3,jkpt)
2891 : : radsumnfft3(2,klmn)=expipr(1)*radsum3(itypat)%value(2,klmn,i1,j2,i3,jkpt)&
2892 : 457049088 : & +expipr(2)*radsum3(itypat)%value(1,klmn,i1,j2,i3,jkpt)
2893 : : end do
2894 : :
2895 : : ! Loop on ij states
2896 [ + + ]: 90957600 : do ilmn = 1, lmn_size
2897 : 79619328 : i0lmn = ilmn*(ilmn-1)/2
2898 [ + + ]: 906035328 : do jlmn = 1, lmn_size
2899 : 818353152 : klmn = i0lmn+jlmn
2900 [ + + ]: 818353152 : if (jlmn>ilmn) then
2901 : 369366912 : i0lmn=jlmn*(jlmn-1)/2; klmn=i0lmn+ilmn
2902 : : end if
2903 : : ! Transform 3-dimentional radsum to 1-dimentional radsumnfft
2904 [ + + ]: 2455059456 : cp(:)=cprj_k(iatom,ib_cprj)%cp(:,ilmn)
2905 [ + + ]: 2455059456 : cp_pos(:)=cprj_pos(iatom,1)%cp(:,jlmn)
2906 : 818353152 : cp11= cp(1)*cp_pos(1)
2907 : 818353152 : cp22= cp(2)*cp_pos(2)*wf_fact
2908 : 818353152 : cp12= cp(1)*cp_pos(2)*wf_fact
2909 : 818353152 : cp21= cp(2)*cp_pos(1)
2910 : 818353152 : cpr=cp11-cp22 ; cpi=cp12+cp21
2911 : : rho_contrib_paw1(1,indx) = rho_contrib_paw1(1,indx) &
2912 : 818353152 : & + four_pi*(cpr*radsumnfft1(1,klmn)-cpi*radsumnfft1(2,klmn))
2913 : : rho_contrib_paw1(2,indx) = rho_contrib_paw1(2,indx) &
2914 : 818353152 : & + four_pi*(cpr*radsumnfft1(2,klmn)+cpi*radsumnfft1(1,klmn))
2915 : : rho_contrib_paw2(1,indx) = rho_contrib_paw2(1,indx) &
2916 : 818353152 : & + four_pi*(cpr*radsumnfft2(1,klmn)-cpi*radsumnfft2(2,klmn))
2917 : : rho_contrib_paw2(2,indx) = rho_contrib_paw2(2,indx) &
2918 : 818353152 : & + four_pi*(cpr*radsumnfft2(2,klmn)+cpi*radsumnfft2(1,klmn))
2919 : : rho_contrib_paw3(1,indx) = rho_contrib_paw3(1,indx) &
2920 : 818353152 : & + four_pi*(cpr*radsumnfft3(1,klmn)-cpi*radsumnfft3(2,klmn))
2921 : : rho_contrib_paw3(2,indx) = rho_contrib_paw3(2,indx) &
2922 : 897972480 : & + four_pi*(cpr*radsumnfft3(2,klmn)+cpi*radsumnfft3(1,klmn))
2923 : : end do ! end loop over jlmn
2924 : : end do ! end loop over ilmn
2925 : :
2926 : : end do !end loop over atoms
2927 : :
2928 [ - + ]: 3275424 : ABI_FREE(radsumnfft1)
2929 [ - + ]: 3275424 : ABI_FREE(radsumnfft2)
2930 [ - + ]: 6550848 : ABI_FREE(radsumnfft3)
2931 : : end do !end loop over atom types
2932 : :
2933 : : rho_moment_v1(indx,jkpt) = rho_moment_v1(indx,jkpt) &
2934 : : & +occ_el*occ_pos &
2935 : : & *(gammastate*(rho_contrib_g(1,indx)**2+rho_contrib_g(2,indx)**2) &
2936 : : & +rate_paw*(rho_contrib_paw1(1,indx)**2+rho_contrib_paw1(2,indx)**2 &
2937 : 3275424 : & -rho_contrib_paw2(1,indx)**2-rho_contrib_paw2(2,indx)**2))
2938 : : rho_moment_v2(indx,jkpt) = rho_moment_v2(indx,jkpt) &
2939 : : & +occ_el*occ_pos*gammastate &
2940 : : & *((rho_contrib_g(1,indx)+rho_contrib_paw3(1,indx))**2+&
2941 : 3393936 : & (rho_contrib_g(2,indx)+rho_contrib_paw3(2,indx))**2)
2942 : :
2943 : : end do ! end loop over i1
2944 : :
2945 : : end if ! end loop over i2
2946 : : end do
2947 : : end do ! end loop over i3
2948 : :
2949 : : end if ! PAW
2950 : :
2951 : : ! ================================================================
2952 : : ! End loops on electronic bands
2953 : :
2954 : : end if ! occ>1.e-8
2955 : : end do ! ibpp
2956 : : end if ! occ_block>1.e-8
2957 : : end do ! iblock
2958 : :
2959 : : ! End loops over k points and spins (electrons)
2960 : 20 : icg = icg + npw_k*my_nspinor*nband_k
2961 : 20 : ibg = ibg + my_nspinor*nband_cprj_k
2962 : 20 : ikg = ikg + npw_k
2963 : :
2964 [ - + ]: 20 : ABI_FREE(cwaver)
2965 [ - + ]: 20 : ABI_FREE(occ_k)
2966 [ + - ]: 20 : if (mpi_enreg%paral_kgb==0) then
2967 [ - + ]: 20 : ABI_FREE(kg_k)
2968 [ - + ]: 20 : ABI_FREE(gbound)
2969 : : else
2970 : : nullify(bandfft_kpt_el)
2971 : : end if
2972 [ + - ]: 20 : if (dtset%usepaw==1) then
2973 : 20 : call pawcprj_free(cprj_k)
2974 [ + - + + : 612 : ABI_FREE(cprj_k)
- + - + -
+ ]
2975 : : end if
2976 : :
2977 : : end if ! mykpt
2978 : 23 : bdtot_index=bdtot_index+nband_k
2979 : : end do ! ikpt
2980 : : end do ! isppol
2981 : :
2982 : : ! ================================================================
2983 : : ! End loops on positronic bands
2984 : :
2985 : : end if ! occ>1.e-8
2986 : : end do ! ibpp_pos
2987 : : end if ! occ(block)>1.e-8
2988 : : end do ! iblock_pos
2989 : :
2990 : : ! End loop over k points (positron)
2991 [ + - ]: 3 : if (mykpt_pos) then
2992 : 3 : icg_pos = icg_pos + npw_k_pos*my_nspinor*nband_k_pos
2993 : 3 : ibg_pos = ibg_pos + my_nspinor*nband_cprj_k_pos
2994 : 3 : ikg_pos = ikg_pos + npw_k_pos
2995 : : end if
2996 : 3 : bdtot_index_pos=bdtot_index_pos+nband_k_pos
2997 : :
2998 [ - + ]: 3 : ABI_FREE(cwaver_pos)
2999 [ - + ]: 3 : ABI_FREE(cwaver_pos_block)
3000 [ - + ]: 3 : ABI_FREE(cg_k_pos)
3001 [ - + ]: 3 : ABI_FREE(occ_k_pos)
3002 [ + - ]: 3 : if (mpi_enreg%paral_kgb==0) then
3003 [ - + ]: 3 : ABI_FREE(kg_k_pos)
3004 [ - + ]: 3 : ABI_FREE(gbound_pos)
3005 [ # # ]: 0 : else if (mykpt_pos) then
3006 : : nullify(bandfft_kpt_pos)
3007 : : else
3008 : 0 : call bandfft_kpt_destroy(bandfft_kpt_pos)
3009 [ # # # # : 0 : ABI_FREE(bandfft_kpt_pos)
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # ]
3010 : : end if
3011 [ + - ]: 6 : if (dtset%usepaw==1) then
3012 : 3 : call pawcprj_free(cprj_pos)
3013 [ + - + + : 11 : ABI_FREE(cprj_pos)
- + - + -
+ ]
3014 : 3 : call pawcprj_free(cprj_k_pos)
3015 [ + - + + : 11 : ABI_FREE(cprj_k_pos)
- + - + -
+ ]
3016 : : end if
3017 : :
3018 : : end do ! ikpt_pos
3019 : :
3020 : : !================================================================
3021 : : !Final computations and printing
3022 : :
3023 : : !In case of parallelism, sum over the communicator(s)
3024 [ - + ]: 3 : if (nproc_band>1) then
3025 [ # # # # : 0 : ABI_MALLOC(mpibuf,(3*nfft,my_ngrid))
# # # # #
# # # # #
# # # # #
# ]
3026 [ # # ]: 0 : do jkpt=1,my_ngrid
3027 [ # # ]: 0 : mpibuf( 1: nfft,jkpt)=rho_moment_v1(1:nfft,jkpt)
3028 [ # # ]: 0 : mpibuf( nfft+1:2*nfft,jkpt)=rho_moment_v2(1:nfft,jkpt)
3029 [ # # ]: 0 : mpibuf(2*nfft+1:3*nfft,jkpt)=rho_pw (1:nfft,jkpt)
3030 : : end do
3031 : 0 : call xmpi_sum(mpibuf,mpi_enreg%comm_band,ierr)
3032 [ # # ]: 0 : do jkpt=1,my_ngrid
3033 [ # # ]: 0 : rho_moment_v1(1:nfft,jkpt)=mpibuf( 1: nfft,jkpt)
3034 [ # # ]: 0 : rho_moment_v2(1:nfft,jkpt)=mpibuf( nfft+1:2*nfft,jkpt)
3035 [ # # ]: 0 : rho_pw(1:nfft,jkpt) =mpibuf(2*nfft+1:3*nfft,jkpt)
3036 : : end do
3037 [ # # ]: 0 : ABI_FREE(mpibuf)
3038 : : end if
3039 [ + - ]: 3 : if (dtset%usepaw==1) then
3040 : 3 : call xmpi_sum(rho_moment_core,mpi_enreg%comm_band,ierr)
3041 : : end if
3042 : :
3043 : : !Add valence and core contributions
3044 [ + - ]: 3 : if (dtset%usepaw==1) then
3045 [ - + - - : 3 : if (dtset%nsppol==2.and.my_nsppol==1) rho_moment_core(:,:)=half*rho_moment_core(:,:)
- - - - ]
3046 [ + + + + ]: 422951 : rho_moment_v1(:,:)=rho_moment_v1(:,:)+rho_moment_core(:,:)
3047 [ + + + + ]: 422951 : rho_moment_v2(:,:)=rho_moment_v2(:,:)+rho_moment_core(:,:)
3048 : : end if
3049 : :
3050 : 3 : units_=pi*(one/InvFineStruct)**3/Time_Sec/1.e12_dp/electronpositron%posocc
3051 : 3 : scale_=(two_pi**2)/(Crystal%ucvol**two_thirds)
3052 : :
3053 : : !Integrate rho_moment over p
3054 [ + + + + ]: 422951 : buf(1)=sum(rho_moment_v1(1:nfft,1:my_ngrid))
3055 [ + + + + ]: 422951 : buf(2)=sum(rho_moment_v2(1:nfft,1:my_ngrid))
3056 [ + + + + ]: 422951 : buf(3)=sum(rho_moment_core(1:nfft,1:my_ngrid))
3057 [ + + + + ]: 422951 : buf(4)=sum(rho_pw(1:nfft,1:my_ngrid))
3058 : 3 : call xmpi_sum(buf,mpi_enreg%comm_kpt,ierr)
3059 : 3 : call xmpi_sum(buf,mpi_enreg%comm_fft,ierr)
3060 : 3 : lambda_v1=buf(1)*units_/Crystal%ucvol/nkpt
3061 : 3 : lambda_v2=buf(2)*units_/Crystal%ucvol/nkpt
3062 : 3 : lambda_core=buf(3)*units_/Crystal%ucvol/nkpt
3063 : 3 : lambda_pw=buf(4)*units_/Crystal%ucvol/nkpt
3064 : :
3065 : : !Write result in _DOPPLER file
3066 : : !Requires MPI-IO if nproc_fft>1
3067 [ + - ]: 3 : if (me_band==0) then
3068 [ + - ]: 3 : if (me_kpt==0) then
3069 [ + - + - ]: 3 : filename_dop=trim(dtfil%filnam_ds(4))//'_DOPPLER'
3070 : : vec=sqrt(dot_product(Crystal%gprimd(:,3),Crystal%gprimd(:,3)))
3071 [ - + + - : 9 : ABI_MALLOC(pcart_k,(3,nfft))
+ - + - -
+ - + -
+ ]
3072 [ - + + - : 9 : ABI_MALLOC(rho_moment_k,(nfft))
+ - + - -
+ - + -
+ ]
3073 [ - + ]: 3 : if (dtset%nsppol==2) then
3074 [ # # # # : 0 : ABI_MALLOC(rho_moment_k2,(nfft))
# # # # #
# ]
3075 : : end if
3076 [ + - ]: 3 : if (accessfil==IO_MODE_FORTRAN) then ! >>>>> Fortran access
3077 : : ! Open file and write first line
3078 : 3 : ierr=open_file(filename_dop,msg,newunit=unit_doppler,form='unformatted')
3079 : 3 : write(unit_doppler) nfft,nkpt,Crystal%ucvol,Crystal%rprimd(:,:)
3080 : : else ! >>>>> MPI-IO access
3081 : 0 : unit_doppler=get_unit()
3082 : : ! Open file and write first line
3083 : 0 : call WffOpen(IO_MODE_MPI,mpi_enreg%comm_fft,filename_dop,ierr,wff,0,me_fft,unit_doppler)
3084 [ # # ]: 0 : if (me_fft==0) then
3085 : 0 : call xderiveWRecInit(wff,ierr)
3086 : 0 : call xderiveWrite(wff,n1*n2*n3,ierr)
3087 : 0 : call xderiveWrite(wff,nkpt,ierr)
3088 : 0 : call xderiveWrite(wff,Crystal%ucvol,ierr)
3089 : 0 : call xderiveWrite(wff,Crystal%rprimd(:,:),ierr)
3090 : 0 : call xderiveWRecEnd(wff,ierr)
3091 : : else
3092 : 0 : call xmoveOff(wff,n_int=2,n_dp=10,n_mark=2)
3093 : : end if
3094 : : ! Store table of FFT points treated by current proc
3095 [ # # # # : 0 : ABI_MALLOC(my_ffttab,(nfft))
# # # # #
# # # #
# ]
3096 [ # # ]: 0 : my_ffttab=0
3097 [ # # ]: 0 : do i3=1,n3
3098 [ # # ]: 0 : do i2=1,n2
3099 [ # # ]: 0 : if (me_fft==fftn2_distrib(i2)) then
3100 : 0 : indx0=n1*(n2*(i3-1)+(i2-1))
3101 : 0 : indx=n1*(my_n2*(i3-1)+(ffti2_local(i2)-1))
3102 [ # # # # : 0 : my_ffttab(indx+1:indx+n1)=(/(indx0+ii,ii=1,n1)/)
# # ]
3103 : : end if
3104 : : end do
3105 : : end do
3106 [ # # # # : 0 : ABI_MALLOC(mpibuf,(1,nfft))
# # # # #
# # # #
# ]
3107 : : end if
3108 : : end if
3109 : :
3110 : 3 : jkpt=0
3111 [ + + ]: 23 : do ikpt=1,nkpt
3112 [ + - ]: 20 : if (nproc_spkpt==1) then
3113 [ + + ]: 422948 : rho_moment_k(1:nfft)=rho_moment_v2(1:nfft,ikpt)
3114 : : else
3115 [ # # ]: 0 : if (my_gridtab(ikpt)/=0) jkpt=jkpt+1
3116 [ # # ]: 0 : if (me_kpt==0) then
3117 [ # # ]: 0 : if (my_gridtab(ikpt)==0) then
3118 : 0 : tag=ikpt;iproc=mpi_enreg%proc_distrb(ikpt,1,1)
3119 : 0 : call xmpi_recv(rho_moment_k,iproc,tag,mpi_enreg%comm_kpt,ierr)
3120 [ # # ]: 0 : if (dtset%nsppol==2) then
3121 : 0 : tag=2*ikpt;iproc=mpi_enreg%proc_distrb(ikpt,1,2)
3122 : 0 : call xmpi_recv(rho_moment_k2,iproc,tag,mpi_enreg%comm_kpt,ierr)
3123 [ # # ]: 0 : rho_moment_k(1:nfft)=rho_moment_k(1:nfft)+rho_moment_k2(1:nfft)
3124 : : end if
3125 [ # # # # : 0 : else if (any(mpi_enreg%my_isppoltab(:)==1)) then
# # ]
3126 [ # # ]: 0 : rho_moment_k(1:nfft)=rho_moment_v2(1:nfft,jkpt)
3127 [ # # ]: 0 : if (dtset%nsppol==2) then
3128 [ # # ]: 0 : ii=2;if (mpi_enreg%my_isppoltab(2)==1) ii=1
3129 : 0 : tag=ii*ikpt;iproc=mpi_enreg%proc_distrb(ikpt,1,ii)
3130 : 0 : call xmpi_recv(rho_moment_k2,iproc,tag,mpi_enreg%comm_kpt,ierr)
3131 [ # # ]: 0 : rho_moment_k(1:nfft)=rho_moment_k(1:nfft)+rho_moment_k2(1:nfft)
3132 : : end if
3133 : : end if
3134 [ # # ]: 0 : else if (my_gridtab(ikpt)/=0) then
3135 [ # # ]: 0 : if (mpi_enreg%my_isppoltab(1)==1) then
3136 : 0 : tag=ikpt
3137 : 0 : call xmpi_send(rho_moment_v2(1:nfft,jkpt),0,tag,mpi_enreg%comm_kpt,ierr)
3138 : : end if
3139 [ # # # # ]: 0 : if (dtset%nsppol==2.and.mpi_enreg%my_isppoltab(2)==1) then
3140 : 0 : tag=2*ikpt
3141 : 0 : call xmpi_send(rho_moment_v2(1:nfft,jkpt),0,tag,mpi_enreg%comm_kpt,ierr)
3142 : : end if
3143 : : end if
3144 : : end if ! nproc_spkpt>1
3145 [ + - ]: 23 : if (me_kpt==0) then
3146 : 20 : indx=0
3147 [ + + ]: 572 : do i3=1,n3
3148 : 552 : ig3=i3-(i3/id3)*n3-1
3149 [ + + ]: 15836 : do i2=1,n2
3150 [ + - ]: 15264 : if (me_fft/=fftn2_distrib(i2)) cycle
3151 : 15264 : ig2=i2-(i2/id2)*n2-1
3152 [ + + ]: 438744 : do i1=1,n1
3153 : 422928 : ig1=i1-(i1/id1)*n1-1
3154 : 422928 : indx=indx+1
3155 : : pcart_k(:,indx)=Crystal%gprimd(:,1)*real(ig1+dtset%kpt(1,ikpt))+&
3156 : : & Crystal%gprimd(:,2)*real(ig2+dtset%kpt(2,ikpt))+&
3157 [ + + ]: 1706976 : & Crystal%gprimd(:,3)*real(ig3+dtset%kpt(3,ikpt))
3158 : : end do
3159 : : end do
3160 : : end do
3161 [ + - ]: 20 : if (accessfil==IO_MODE_FORTRAN) then
3162 : 20 : write(unit_doppler) pcart_k(1:3,1:nfft),rho_moment_k(1:nfft)
3163 : : else
3164 [ # # ]: 0 : mpibuf(1,1:nfft)=rho_moment_k(1:nfft)
3165 : 0 : call xderiveWRecInit(wff,ierr)
3166 : 0 : call xderiveWrite(wff,pcart_k,3,nfft,mpi_enreg%comm_fft,my_ffttab,ierr)
3167 : 0 : call xderiveWrite(wff,mpibuf ,1,nfft,mpi_enreg%comm_fft,my_ffttab,ierr)
3168 : 0 : call xderiveWRecEnd(wff,ierr)
3169 : : end if
3170 : : end if
3171 : : end do
3172 [ + - ]: 3 : if (me_kpt==0) then
3173 [ - + ]: 3 : ABI_FREE(pcart_k)
3174 [ - + ]: 3 : ABI_FREE(rho_moment_k)
3175 [ - + ]: 3 : if (dtset%nsppol==2) then
3176 [ # # ]: 0 : ABI_FREE(rho_moment_k2)
3177 : : end if
3178 [ + - ]: 3 : if (accessfil==IO_MODE_FORTRAN) then
3179 : 3 : ierr=close_unit(unit_doppler,msg)
3180 : : else
3181 : 0 : call WffClose(wff,ierr)
3182 [ # # ]: 0 : ABI_FREE(my_ffttab)
3183 [ # # ]: 0 : ABI_FREE(mpibuf)
3184 : : end if
3185 : : end if
3186 : : end if ! me_band==0
3187 : :
3188 : : !Write results
3189 : : write(msg,'(7a)') &
3190 : 3 : & ' Computation of electron-positron pairs momentum distribution completed.',ch10,&
3191 : 3 : & '-File ',trim(filename_dop),' has been created.',ch10,&
3192 : 6 : & '-Use ~abinit/scripts/post_processing/posdopspectra.F90 to process it.'
3193 : 3 : call wrtout(ab_out,msg,'COLL')
3194 : 3 : call wrtout(std_out,msg,'COLL')
3195 : 3 : msg=' Some e-p annihilation rates (ns-1) obtained by integration of e-p pairs momentum distribution:'
3196 : 3 : call wrtout(std_out,msg,'COLL')
3197 : : write(msg,'(a,es22.12,3(2a,es22.12))') &
3198 : 3 : & ' Lambda (from module of sum of PAW contrib.) = ',lambda_v2*1000._dp,ch10,&
3199 : 3 : & ' = lambda_core: ',lambda_core*1000._dp,ch10,&
3200 : 3 : & ' +lambda_pw : ',lambda_pw*1000._dp,ch10,&
3201 : 6 : & ' +lambda_paw : ',(lambda_v2-lambda_core-lambda_pw)*1000._dp
3202 : 3 : call wrtout(std_out,msg,'COLL')
3203 : : write(msg,'(4(a,es22.12,a))') &
3204 : 3 : & ' Lambda (from sum of modules of PAW contrib.) = ',lambda_v1*1000._dp,ch10,&
3205 : 3 : & ' = lambda_core: ',lambda_core*1000._dp,ch10,&
3206 : 3 : & ' +lambda_pw : ',lambda_pw*1000._dp,ch10,&
3207 : 6 : & ' +lambda_paw : ',(lambda_v1-lambda_core-lambda_pw)*1000._dp,ch10
3208 : 3 : call wrtout(std_out,msg,'COLL')
3209 : 3 : write(msg,'(4a,es22.12,2a)') ch10,&
3210 : 3 : & ' Annihilation rate obtained from integration of e-p pairs momentum distribution:',ch10,&
3211 : 6 : & ' lambda=',lambda_v2*1000._dp,' ns-1',ch10
3212 : 3 : call wrtout(ab_out,msg,'COLL')
3213 : :
3214 : : !Deallocate remaining memory
3215 [ - + ]: 3 : ABI_FREE(my_gridtab)
3216 [ - + ]: 3 : ABI_FREE(rho_pw)
3217 [ - + ]: 3 : ABI_FREE(rho_moment_v1)
3218 [ - + ]: 3 : ABI_FREE(rho_moment_v2)
3219 [ - + ]: 3 : ABI_FREE(rho_moment_core)
3220 [ - + ]: 3 : ABI_FREE(rho_contrib)
3221 [ - + ]: 3 : ABI_FREE(rho_contrib_g)
3222 [ - + ]: 3 : ABI_FREE(rho_contrib_paw1)
3223 [ - + ]: 3 : ABI_FREE(rho_contrib_paw2)
3224 [ - + ]: 3 : ABI_FREE(rho_contrib_paw3)
3225 : : if (state_dependent) then
3226 : 3 : call unset_mpi_enreg_fft(mpi_enreg_seq)
3227 : 3 : call destroy_mpi_enreg(mpi_enreg_seq)
3228 [ - + ]: 3 : ABI_FREE(rhor_dop_el)
3229 [ + - ]: 3 : if (dtset%usepaw==1) then
3230 : 3 : call pawrhoij_free(pawrhoij_dop_el)
3231 [ + - + + : 11 : ABI_FREE(pawrhoij_dop_el)
- + - + -
+ - + - +
- + - + ]
3232 [ - + ]: 3 : if (mpi_enreg%my_natom<dtset%natom) then
3233 : 0 : call pawrhoij_free(pawrhoij_all)
3234 : 0 : call pawrhoij_free(pawrhoij_ep_all)
3235 [ # # ]: 0 : ABI_FREE(pawrhoij_all)
3236 [ # # ]: 0 : ABI_FREE(pawrhoij_ep_all)
3237 : : end if
3238 : : end if
3239 : : end if
3240 : :
3241 [ - + ]: 3 : ABI_FREE(gamma)
3242 : :
3243 [ + - ]: 3 : if (dtset%usepaw==1.and.(.not.include_nhat_in_gamma)) then
3244 [ - + ]: 3 : ABI_FREE(rhor_)
3245 [ - + ]: 3 : ABI_FREE(rhor_ep_)
3246 : : end if
3247 : :
3248 [ + - ]: 3 : if (dtset%usepaw==1) then
3249 [ - + ]: 3 : ABI_FREE(nphicor)
3250 [ - + ]: 3 : ABI_FREE(lmncmax)
3251 [ + + ]: 6 : do itypat=1,dtset%ntypat
3252 [ + - ]: 3 : if (allocated(phicor(itypat)%value)) then
3253 : 3 : ABI_FREE(phicor(itypat)%value)
3254 : : end if
3255 [ + - ]: 3 : if (allocated(indlmncor(itypat)%value)) then
3256 : 3 : ABI_FREE(indlmncor(itypat)%value)
3257 : : end if
3258 [ + - ]: 3 : if (allocated(radsumc(itypat)%value)) then
3259 : 3 : ABI_FREE(radsumc(itypat)%value)
3260 : : end if
3261 [ + - ]: 3 : if (allocated(radsum1(itypat)%value)) then
3262 : 3 : ABI_FREE(radsum1(itypat)%value)
3263 : : end if
3264 [ + - ]: 3 : if (allocated(radsum2(itypat)%value)) then
3265 : 3 : ABI_FREE(radsum2(itypat)%value)
3266 : : end if
3267 [ + - ]: 6 : if (allocated(radsum3(itypat)%value)) then
3268 : 3 : ABI_FREE(radsum3(itypat)%value)
3269 : : end if
3270 : : end do
3271 [ + + ]: 11 : do iatom=1,dtset%natom
3272 [ + - ]: 11 : if (allocated(gammastate_c(iatom)%value)) then
3273 : 8 : ABI_FREE(gammastate_c(iatom)%value)
3274 : : end if
3275 : : end do
3276 [ + - + + : 6 : ABI_FREE(phicor)
- + - + ]
3277 [ + - + + : 6 : ABI_FREE(indlmncor)
- + - + ]
3278 [ + - + + : 6 : ABI_FREE(radsumc)
- + - + ]
3279 [ + - + + : 6 : ABI_FREE(radsum1)
- + - + ]
3280 [ + - + + : 6 : ABI_FREE(radsum2)
- + - + ]
3281 [ + - + + : 6 : ABI_FREE(radsum3)
- + - + ]
3282 [ + - + + : 11 : ABI_FREE(gammastate_c)
- + - + ]
3283 : : end if
3284 : :
3285 : : DBG_EXIT("COLL")
3286 : :
3287 [ - + - + : 6 : end subroutine posdoppler
- + - + -
+ - - - -
- + - - -
- - + - -
- - - + -
- - - - +
- - - - -
+ - + - -
- - - - -
- - - - -
- - - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - -
- - - + -
+ - + - -
- - - + -
+ - + - +
- + - - -
- - - - +
- - - - -
- - + - -
- - - - -
+ ]
3288 : : !!***
3289 : :
3290 : : !!****f* ABINIT/posratecore
3291 : : !! NAME
3292 : : !! posratecore
3293 : : !!
3294 : : !! FUNCTION
3295 : : !! Calculate the annihilataion rate of a given core state
3296 : : !!
3297 : : !! INPUTS
3298 : : !! dtset <type(dataset_type)>=all input variables for this dataset
3299 : : !! | nspden=number of spin-density components
3300 : : !! | ntypat=number of atom types
3301 : : !! | paral_kgb=flag controlling (k,g,bands) parallelization
3302 : : !! | pawxcdev=Choice of XC development (0=no dev. (use of angular mesh) ; 1 or 2=dev. on moments)
3303 : : !! | usepaw=flag for PAW
3304 : : !! iatom= index of the current atom in posdoppler
3305 : : !! mesh_sizej= size of the radial mesh for the current atom in posdoppler
3306 : : !! mpi_enreg= information about MPI parallelization
3307 : : !! my_natom=number of atoms treated by current processor
3308 : : !! option= if 1, use gamma
3309 : : !! if 2, use IPM (gamma=1)
3310 : : !! pawang <type(pawang)>=paw angular mesh and related data
3311 : : !! pawrad(ntypat*usepaw) <type(pawrad_type)>=paw radial mesh and related data
3312 : : !! pawrhoij(my_natom*usepaw) <type(pawrhoij_type)>= -PAW only- atomic occupancies
3313 : : !! pawtab(ntypat*usepaw) <type(pawtab_type)>=paw tabulated starting data
3314 : : !!
3315 : : !! OUTPUT
3316 : : !! rate= annihilation rate of a given core state needed for state dependent scheme for doppler broadening
3317 : : !!
3318 : : !! SIDE EFFECTS
3319 : : !!
3320 : : !! SOURCE
3321 : :
3322 : 64 : subroutine posratecore(dtset,electronpositron,iatom,my_natom,mesh_sizej,mpi_enreg,&
3323 : 64 : & option,pawang,pawrad,pawrhoij,pawrhoij_ep,&
3324 : 64 : & pawtab,rate,rhocorej)
3325 : :
3326 : : !Arguments ------------------------------------
3327 : : !scalars
3328 : : integer,intent(in) :: iatom,my_natom,option,mesh_sizej
3329 : : real(dp),intent(out) :: rate
3330 : : type(dataset_type), intent(in) :: dtset
3331 : : type(electronpositron_type),pointer :: electronpositron
3332 : : type(MPI_type),intent(in) :: mpi_enreg
3333 : : type(pawang_type), intent(in) :: pawang
3334 : : !arrays
3335 : : real(dp),intent(in) :: rhocorej(mesh_sizej)
3336 : : type(pawrad_type),intent(in) :: pawrad(dtset%ntypat*dtset%usepaw)
3337 : : type(pawrhoij_type),intent(in) :: pawrhoij(my_natom*dtset%usepaw)
3338 : : type(pawrhoij_type),intent(in),target :: pawrhoij_ep(my_natom*dtset%usepaw)
3339 : : type(pawtab_type),intent(in) :: pawtab(dtset%ntypat*dtset%usepaw)
3340 : :
3341 : : !Local variables-------------------------------
3342 : : !scalars
3343 : : integer :: cplex,ierr,igamma,ii,ilm,ipt,ir
3344 : : integer :: itypat,iwarn,iwarnj,iwarnp,lm_size,lmn2_size,mesh_size
3345 : : integer :: ngr,ngrad,nspden_ep,opt_dens
3346 : : logical,parameter :: include_nhat_in_gamma=.false.
3347 : : real(dp),parameter :: delta=1.d-4
3348 : : real(dp) :: fact,fact2,intg
3349 : : real(dp) :: mpibuf,rdum,sqfpi
3350 : : character(len=500) :: msg
3351 : : !arrays
3352 : 64 : logical,allocatable :: lmselect(:),lmselect_ep(:),lmselect_dum(:)
3353 : : real(dp),parameter :: qphon(3)=(/zero,zero,zero/),lsign(2)=(/one,-one/)
3354 : 64 : real(dp),allocatable :: d1gam(:,:),d2gam(:,:),ff(:),gam_(:,:,:),gamma(:,:),gammam(:,:),gg(:,:)
3355 : 64 : real(dp),allocatable :: grhocore2(:),grhocor2_(:),grhoe2(:),grho2_(:)
3356 : 64 : real(dp),allocatable :: nhat1(:,:,:),nhat1_ep(:,:,:)
3357 : 64 : real(dp),allocatable :: rho_(:),rho_ep_(:),rho1(:,:,:),rho1_ep(:,:,:)
3358 : 64 : real(dp),allocatable :: rhoarr1(:),rhoarr1_ep(:),rhoarr2(:)
3359 : 64 : real(dp),allocatable :: rhocore(:),rhocor_(:)
3360 : 64 : real(dp),allocatable :: rhosph(:),rhosph_ep(:),rhotot(:,:),rhotot_ep(:,:)
3361 : 64 : real(dp),allocatable :: trho1(:,:,:),trho1_ep(:,:,:)
3362 : 64 : real(dp),allocatable :: v1sum(:,:),v2sum(:,:,:)
3363 : 64 : type(pawrhoij_type),pointer :: pawrhoij_ep_(:)
3364 : :
3365 : : ! *************************************************************************
3366 : :
3367 : : DBG_ENTER("COLL")
3368 : :
3369 : : !Tests for developers
3370 : 64 : if (.not.associated(electronpositron)) then
3371 : 0 : msg='electronpositron variable must be associated!'
3372 : 0 : ABI_BUG(msg)
3373 : : end if
3374 : : !Constants
3375 : 64 : fact=0.0
3376 : 64 : cplex=1;nspden_ep=1
3377 [ - + ]: 64 : ngrad=1;if (electronpositron%ixcpositron==3.or.electronpositron%ixcpositron==31) ngrad=2
3378 : 64 : iwarn=0;iwarnj=0;iwarnp=1
3379 : 64 : sqfpi=sqrt(four_pi)
3380 : :
3381 : : !Compatibility tests
3382 [ - + ]: 64 : if (electronpositron%particle==EP_NOTHING) then
3383 : 0 : msg='Not valid for electronpositron%particle=NOTHING!'
3384 : 0 : ABI_BUG(msg)
3385 : : end if
3386 : :
3387 [ + - ]: 64 : if (dtset%usepaw==1) then
3388 [ - + - - ]: 64 : if(dtset%pawxcdev==0.and.ngrad==2) then
3389 : 0 : msg='GGA is not implemented for pawxcdev=0 (use dtset%pawxcdev/=0)!'
3390 : 0 : ABI_BUG(msg)
3391 : : end if
3392 : : end if
3393 : :
3394 : : !Select type(s) of enhancement factor
3395 [ - + ]: 64 : if (electronpositron%ixcpositron==-1) igamma=0
3396 [ - + ]: 64 : if (electronpositron%ixcpositron== 2) igamma=4
3397 [ + + ]: 64 : if (electronpositron%ixcpositron==11.or.electronpositron%ixcpositron==31) igamma=3
3398 [ + + ]: 64 : if (electronpositron%ixcpositron==1.or.electronpositron%ixcpositron==3) igamma=2
3399 [ + + ]: 64 : if (option==2) igamma=0
3400 : :
3401 : 64 : pawrhoij_ep_ => pawrhoij_ep
3402 : :
3403 : 64 : rate=zero
3404 : :
3405 : 64 : itypat=pawrhoij(iatom)%itypat
3406 : 64 : lmn2_size=pawtab(itypat)%lmn2_size
3407 : 64 : mesh_size=pawtab(itypat)%mesh_size
3408 : 64 : lm_size=pawtab(itypat)%lcut_size**2
3409 : : cplex=1
3410 [ - + ]: 64 : ngr=0;if (ngrad==2) ngr=mesh_size
3411 : :
3412 : : !Allocations of "on-site" densities
3413 [ - + + - : 256 : ABI_MALLOC(rho1 ,(cplex*mesh_size,lm_size,nspden_ep))
- + + - +
- + - - +
- + ]
3414 [ - + + - : 192 : ABI_MALLOC(trho1,(cplex*mesh_size,lm_size,nspden_ep))
- + + - -
+ - + ]
3415 [ - + + - : 192 : ABI_MALLOC(rho1_ep ,(cplex*mesh_size,lm_size,nspden_ep))
- + + - -
+ - + ]
3416 [ - + + - : 192 : ABI_MALLOC(trho1_ep,(cplex*mesh_size,lm_size,nspden_ep))
- + + - -
+ - + ]
3417 [ - + + - : 192 : ABI_MALLOC(lmselect,(lm_size))
+ - + - -
+ - + ]
3418 [ - + + - : 128 : ABI_MALLOC(lmselect_ep,(lm_size))
- + - + ]
3419 [ - + + - : 128 : ABI_MALLOC(lmselect_dum,(lm_size))
- + - + ]
3420 : : if (include_nhat_in_gamma) then
3421 : : ABI_MALLOC(nhat1,(cplex*mesh_size,lm_size,nspden_ep))
3422 : : ABI_MALLOC(nhat1_ep,(cplex*mesh_size,lm_size,nspden_ep))
3423 : : else
3424 [ - + ]: 64 : ABI_MALLOC(nhat1,(0,0,0))
3425 [ + - ]: 64 : ABI_MALLOC(nhat1_ep,(0,0,0))
3426 : : end if
3427 : :
3428 : : !Compute "on-site" densities (n1, ntild1, nhat1) for electron and positron =====
3429 [ + + ]: 640 : lmselect(:)=.true.
3430 : 64 : opt_dens=1;if (include_nhat_in_gamma) opt_dens=0
3431 : : call pawdensities(rdum,cplex,iatom,lmselect,lmselect_dum,lm_size,nhat1,nspden_ep,1,&
3432 : : & 0,opt_dens,-1,0,pawang,0,pawrad(itypat),pawrhoij(iatom),&
3433 : 64 : & pawtab(itypat),rho1,trho1)
3434 [ + + ]: 640 : lmselect_ep(:)=.true.
3435 : : call pawdensities(rdum,cplex,iatom,lmselect_ep,lmselect_dum,lm_size,nhat1_ep,nspden_ep,1,&
3436 : : & 0,opt_dens,-1,0,pawang,0,pawrad(itypat),pawrhoij_ep_(iatom),&
3437 : 64 : & pawtab(itypat),rho1_ep,trho1_ep)
3438 : : !Compute contribution to annihilation rate
3439 : :
3440 [ - + + - : 192 : ABI_MALLOC(rhocore,(mesh_size))
+ - + - -
+ - + ]
3441 : :
3442 : : !First formalism: use densities on r,theta,phi
3443 [ - + ]: 64 : if (dtset%pawxcdev==0) then
3444 : :
3445 [ # # # # : 0 : ABI_MALLOC(gamma,(mesh_size,2))
# # # # #
# # # ]
3446 [ # # # # : 0 : ABI_MALLOC(rhoarr1,(mesh_size))
# # # # ]
3447 [ # # # # : 0 : ABI_MALLOC(rhoarr1_ep,(mesh_size))
# # # # ]
3448 : :
3449 : : ! Loop on the angular part
3450 [ # # ]: 0 : do ipt=1,pawang%angl_size
3451 : : ! Build densities
3452 [ # # # # : 0 : rhoarr1=zero;rhoarr1_ep=zero;rhocore=zero
# # ]
3453 [ # # ]: 0 : do ilm=1,lm_size
3454 [ # # # # ]: 0 : if (lmselect(ilm)) rhoarr1(:)=rhoarr1(:)+rho1(:,ilm,1)*pawang%ylmr(ilm,ipt)
3455 : : end do
3456 [ # # ]: 0 : do ilm=1,lm_size
3457 [ # # # # ]: 0 : if (lmselect_ep(ilm)) rhoarr1_ep(:)=rhoarr1_ep(:)+rho1_ep(:,ilm,1)*pawang%ylmr(ilm,ipt)
3458 : : end do
3459 [ # # ]: 0 : rhocore(:)=pawtab(itypat)%coredens(:)
3460 : : ! Make the densities positive
3461 [ # # ]: 0 : if (electronpositron%particle==EP_ELECTRON) then
3462 : 0 : call mkdenpos(iwarnp,mesh_size,1,1,rhoarr1 ,dtset%xc_denpos)
3463 : 0 : call mkdenpos(iwarn ,mesh_size,1,1,rhoarr1_ep,dtset%xc_denpos)
3464 [ # # ]: 0 : else if (electronpositron%particle==EP_POSITRON) then
3465 : 0 : call mkdenpos(iwarn ,mesh_size,1,1,rhoarr1 ,dtset%xc_denpos)
3466 : 0 : call mkdenpos(iwarnp,mesh_size,1,1,rhoarr1_ep,dtset%xc_denpos)
3467 : : end if
3468 : : ! Compute Gamma
3469 [ # # # # : 0 : ABI_MALLOC(grhoe2,(ngr))
# # # # #
# # # #
# ]
3470 [ # # # # : 0 : ABI_MALLOC(grhocore2,(ngr))
# # # # #
# ]
3471 [ # # ]: 0 : if (electronpositron%particle==EP_ELECTRON) then
3472 : : call gammapositron(gamma,grhocore2,grhoe2,igamma,ngr,mesh_size,&
3473 : 0 : & rhocore,rhoarr1_ep,rhoarr1,1)
3474 [ # # ]: 0 : else if (electronpositron%particle==EP_POSITRON) then
3475 : : call gammapositron(gamma,grhocore2,grhoe2,igamma,ngr,mesh_size,&
3476 : 0 : & rhocore,rhoarr1,rhoarr1_ep,1)
3477 : : end if
3478 [ # # ]: 0 : ABI_FREE(grhoe2)
3479 [ # # ]: 0 : ABI_FREE(grhocore2)
3480 : : ! Compute contribution to annihilation rates
3481 : :
3482 [ # # # # : 0 : ABI_MALLOC(ff,(mesh_size))
# # # # #
# ]
3483 : : ff(1:mesh_size)=rhoarr1_ep(1:mesh_size)*rhocorej(1:mesh_size) &
3484 [ # # ]: 0 : & *gamma(1:mesh_size,1)*pawrad(itypat)%rad(1:mesh_size)**2
3485 : 0 : call simp_gen(intg,ff,pawrad(itypat))
3486 : 0 : intg=intg*pawang%angwgth(ipt)*four_pi
3487 : 0 : rate =rate +intg
3488 [ # # ]: 0 : ABI_FREE(ff)
3489 : : end do ! ipt
3490 [ # # ]: 0 : ABI_FREE(gamma)
3491 [ # # ]: 0 : ABI_FREE(rhoarr1)
3492 [ # # ]: 0 : ABI_FREE(rhoarr1_ep)
3493 : :
3494 : : !Second formalism: use (l,m) moments for densities
3495 : : else if (dtset%pawxcdev/=0) then
3496 : :
3497 : : ! Build densities
3498 [ - + + - : 192 : ABI_MALLOC(gammam,(mesh_size,lm_size))
- + + - -
+ - + ]
3499 [ - + + - : 192 : ABI_MALLOC(rhotot,(mesh_size,lm_size))
- + + - -
+ - + ]
3500 [ - + + - : 192 : ABI_MALLOC(rhotot_ep,(mesh_size,lm_size))
- + + - -
+ - + ]
3501 [ - + + - : 128 : ABI_MALLOC(rhosph,(mesh_size))
- + - + ]
3502 [ - + + - : 128 : ABI_MALLOC(rhosph_ep,(mesh_size))
- + - + ]
3503 : :
3504 [ + + + + ]: 517276 : rhotot (:,:)=rho1 (:,:,1)
3505 [ + + + + ]: 517276 : rhotot_ep(:,:)=rho1_ep(:,:,1)
3506 [ + + ]: 57468 : rhocore(:)=pawtab(itypat)%coredens(:)
3507 [ + + ]: 57468 : rhosph (:)=rhotot (:,1)/sqfpi
3508 [ + + ]: 57468 : rhosph_ep(:)=rhotot_ep(:,1)/sqfpi
3509 : : ! Make spherical densities positive
3510 [ - + ]: 64 : if (electronpositron%particle==EP_ELECTRON) then
3511 : 0 : call mkdenpos(iwarnp,mesh_size,1,1,rhosph ,dtset%xc_denpos)
3512 : 0 : call mkdenpos(iwarn ,mesh_size,1,1,rhosph_ep,dtset%xc_denpos)
3513 [ + - ]: 64 : else if (electronpositron%particle==EP_POSITRON) then
3514 : 64 : call mkdenpos(iwarn ,mesh_size,1,1,rhosph ,dtset%xc_denpos)
3515 : 64 : call mkdenpos(iwarnp,mesh_size,1,1,rhosph_ep,dtset%xc_denpos)
3516 : : end if
3517 : :
3518 : : ! Need gradients of electronic densities for GGA
3519 [ + - - - : 192 : ABI_MALLOC(grhoe2,(ngr))
+ - - + -
+ - + ]
3520 [ + - - - : 128 : ABI_MALLOC(grhocore2,(ngr))
- + - + ]
3521 [ - + ]: 64 : if (ngr>0) then
3522 [ # # ]: 0 : if (electronpositron%particle==EP_ELECTRON) then
3523 : 0 : call nderiv_gen(grhoe2,rhosph_ep,pawrad(itypat))
3524 [ # # ]: 0 : else if (electronpositron%particle==EP_POSITRON) then
3525 : 0 : call nderiv_gen(grhoe2,rhosph,pawrad(itypat))
3526 : : end if
3527 [ # # ]: 0 : grhoe2(:)=grhoe2(:)**2
3528 : 0 : call nderiv_gen(grhocore2,rhocore,pawrad(itypat))
3529 [ # # ]: 0 : grhocore2(:)=grhocore2(:)**2
3530 : : end if
3531 : : ! Compute Gamma for (rho-,rho+),
3532 : : ! (rho- +drho-,rho+), (rho- -drho-,rho+),
3533 : : ! (rho-,rho+ +drho+), (rho-,rho+ -drho+),
3534 : : ! (rho- +drho-,rho+ +drho+), (rho- -drho-,rho+ -drho+)
3535 : : ! Do a seven steps loop
3536 [ - + + - : 256 : ABI_MALLOC(gam_,(mesh_size,2,7))
+ - + - +
- - + -
+ ]
3537 [ - + + - : 128 : ABI_MALLOC(rho_,(mesh_size))
- + - + ]
3538 [ - + + - : 128 : ABI_MALLOC(rho_ep_,(mesh_size))
- + - + ]
3539 [ - + + - : 128 : ABI_MALLOC(rhocor_,(mesh_size))
- + - + ]
3540 [ + - - - : 128 : ABI_MALLOC(grho2_,(ngr))
- + - + ]
3541 [ + - - - : 128 : ABI_MALLOC(grhocor2_,(ngr))
- + + - ]
3542 : :
3543 [ + + ]: 512 : do ii=1,7
3544 : : ! Apply delta to get perturbed densities
3545 [ + + + + : 1206828 : rho_(:)=rhosph(:);rho_ep_(:)=rhosph_ep(:);rhocor_(:)=rhocore(:)
+ + ]
3546 [ - + - - ]: 448 : if (ngr>0) grho2_(:)=grhoe2(:)
3547 [ - + - - ]: 448 : if (ngr>0) grhocor2_(:)=grhocore2(:)
3548 [ + + ]: 448 : if (ii==2.or.ii==4.or.ii==6) fact=(one+delta)
3549 [ + + ]: 448 : if (ii==3.or.ii==5.or.ii==7) fact=(one-delta)
3550 : 448 : fact2=fact**2
3551 [ + + ]: 448 : if (ii==2.or.ii==3.or.ii==6.or.ii==7) then
3552 [ + + ]: 229872 : rho_(:)=fact*rho_(:)
3553 [ + - ]: 256 : if (electronpositron%particle==EP_POSITRON) then
3554 [ - + - - ]: 256 : if (ngr>0) grho2_(:)=fact2*grho2_(:)
3555 [ + + ]: 229872 : rhocor_(:)=fact*rhocor_(:)
3556 [ - + - - ]: 256 : if (ngr>0) grhocor2_(:)=fact2*grhocor2_(:)
3557 : : end if
3558 : : end if
3559 : :
3560 [ + + ]: 448 : if (ii==4.or.ii==5.or.ii==6.or.ii==7) then
3561 [ + + ]: 229872 : rho_ep_(:)=fact*rho_ep_(:)
3562 [ - + ]: 256 : if (electronpositron%particle==EP_ELECTRON) then
3563 [ # # # # ]: 0 : if (ngr>0) grho2_(:)=fact2*grho2_(:)
3564 [ # # ]: 0 : rhocor_(:)=fact*rhocor_(:)
3565 [ # # # # ]: 0 : if (ngr>0) grhocor2_(:)=fact2*grhocor2_(:)
3566 : : end if
3567 : : end if
3568 : : ! Compute gamma for these perturbed densities
3569 [ - + ]: 512 : if (electronpositron%particle==EP_ELECTRON) then
3570 : 0 : call gammapositron(gam_(:,:,ii),grhocor2_,grho2_,igamma,ngr,mesh_size,rhocor_,rho_ep_,rho_,1)
3571 [ + - ]: 448 : else if (electronpositron%particle==EP_POSITRON) then
3572 : 448 : call gammapositron(gam_(:,:,ii),grhocor2_,grho2_,igamma,ngr,mesh_size,rhocor_,rho_,rho_ep_,1)
3573 : : end if
3574 : :
3575 : : end do ! end loop ii=1,7
3576 : :
3577 [ - + ]: 64 : ABI_FREE(rhocor_)
3578 [ - + ]: 64 : ABI_FREE(grho2_)
3579 [ - + ]: 64 : ABI_FREE(grhocor2_)
3580 [ - + ]: 64 : ABI_FREE(grhoe2)
3581 [ - + ]: 64 : ABI_FREE(grhocore2)
3582 [ + + + - : 114936 : rho_ (:)=rhosph (:);if (electronpositron%particle==EP_POSITRON) rho_ (:)=rho_ (:)+rhocore(:)
+ + ]
3583 [ + + - + : 57468 : rho_ep_(:)=rhosph_ep(:);if (electronpositron%particle==EP_ELECTRON) rho_ep_(:)=rho_ep_(:)+rhocore(:)
- - ]
3584 : : ! Compute numerical first and second derivatives of Gamma
3585 : : ! d1gam(1) = dgam/drho+ (particle=ELECTRON), dgam/drho- (particle=POSITRON)
3586 : : ! d1gam(2) = dgam/drho- (particle=ELECTRON), dgam/drho+ (particle=POSITRON)
3587 [ - + + - : 192 : ABI_MALLOC(d1gam,(mesh_size,2))
+ - + - -
+ + - ]
3588 [ + + + + ]: 115000 : d1gam(:,:)=zero
3589 [ + + ]: 57468 : do ir=1,mesh_size
3590 [ + - ]: 57404 : if (rho_ (ir)>tol14) d1gam(ir,1)=(gam_(ir,1,2)-gam_(ir,1,3))*half/(delta*rho_ (ir))
3591 [ + - ]: 57468 : if (rho_ep_ (ir)>tol14) d1gam(ir,2)=(gam_(ir,1,4)-gam_(ir,1,5))*half/(delta*rho_ep_ (ir))
3592 : : end do
3593 : :
3594 : : ! d2gam(1) = d2gam/drho+_drho+ (particle=ELECTRON), dgam/drho-_drho- (particle=POSITRON)
3595 : : ! d2gam(2) = d2gam/drho-_drho+ (particle=ELECTRON), dgam/drho+_drho- (particle=POSITRON)
3596 : : ! d2gam(3) = d2gam/drho-_drho- (particle=ELECTRON), dgam/drho+_drho+ (particle=POSITRON)
3597 [ - + + - : 192 : ABI_MALLOC(d2gam,(mesh_size,3))
+ - + - -
+ + - ]
3598 [ + + + + ]: 172468 : d2gam(:,:)=zero
3599 [ + + ]: 57468 : do ir=1,mesh_size
3600 [ + - ]: 57404 : if (rho_ (ir)>tol14) d2gam(ir,1)=(gam_(ir,1,2)+gam_(ir,1,3)-two*gam_(ir,1,1))/(delta*rho_ (ir))**2
3601 [ + - ]: 57468 : if (rho_ep_(ir)>tol14) then
3602 : 57404 : d2gam(ir,3)=(gam_(ir,1,4)+gam_(ir,1,5)-two*gam_(ir,1,1))/(delta*rho_ep_(ir))**2
3603 [ + - ]: 57404 : if (rho_(ir)>tol14) then
3604 : : d2gam(ir,2)=(gam_(ir,1,6)+gam_(ir,1,7)+two*gam_(ir,1,1) &
3605 : : & -gam_(ir,1,2)-gam_(ir,1,3)-gam_(ir,1,4)-gam_(ir,1,5)) &
3606 : 57404 : & *half/(delta*rho_(ir))/(delta*rho_ep_(ir))
3607 : : end if
3608 : : end if
3609 : : end do
3610 : :
3611 [ - + ]: 64 : ABI_FREE(rho_)
3612 [ - + ]: 64 : ABI_FREE(rho_ep_)
3613 : : ! Compute useful sums of densities
3614 [ - + + - : 128 : ABI_MALLOC(v1sum,(mesh_size,3))
- + - + ]
3615 [ - + ]: 64 : if ( dtset%pawxcdev>=2) then
3616 [ # # # # : 0 : ABI_MALLOC(v2sum,(mesh_size,lm_size,3))
# # # # #
# # # # #
# # # # ]
3617 : : else
3618 [ - + ]: 64 : ABI_MALLOC(v2sum,(0,0,0))
3619 : : end if
3620 [ + + + + ]: 114936 : rhotot(:,1)=sqfpi*rhosph(:);rhotot_ep(:,1)=sqfpi*rhosph_ep(:)
3621 : : call pawxcsum(1,1,1,lmselect,lmselect_ep,lm_size,mesh_size,3,dtset%pawxcdev,&
3622 : 64 : & pawang,rhotot,rhotot_ep,v1sum,v2sum)
3623 : : ! Compute final development of gamma moments
3624 [ + + + + ]: 517276 : gammam(:,:)=zero
3625 [ + + ]: 57468 : gammam(:,1)=gam_(:,1,1)*sqfpi
3626 : : gammam(:,1)=gammam(:,1)+(d2gam(:,2)*v1sum(:,2) &
3627 [ + + ]: 57468 : & +half*(d2gam(:,1)*v1sum(:,1)+d2gam(:,3)*v1sum(:,3)))/sqfpi
3628 [ + + ]: 576 : do ilm=2,lm_size
3629 [ + - ]: 512 : if (lmselect(ilm)) then
3630 [ + + ]: 459744 : gammam(:,ilm)=gammam(:,ilm)+d1gam(:,1)*rhotot(:,ilm)
3631 : : end if
3632 [ + - ]: 576 : if (lmselect_ep(ilm)) then
3633 [ + + ]: 459744 : gammam(:,ilm)=gammam(:,ilm)+d1gam(:,2)*rhotot_ep(:,ilm)
3634 : : end if
3635 : : end do
3636 [ - + ]: 64 : if (dtset%pawxcdev>1) then
3637 [ # # ]: 0 : do ilm=2,lm_size
3638 : : gammam(:,ilm)=gammam(:,ilm)+d2gam(:,2)*v2sum(:,ilm,2) &
3639 [ # # ]: 0 : & +half*(d2gam(:,1)*v2sum(:,ilm,1)+d2gam(:,3)*v2sum(:,ilm,3))
3640 : : end do
3641 : : end if
3642 : :
3643 [ - + ]: 64 : ABI_FREE(gam_)
3644 [ - + ]: 64 : ABI_FREE(d1gam)
3645 [ - + ]: 64 : ABI_FREE(d2gam)
3646 [ - + ]: 64 : ABI_FREE(v1sum)
3647 [ - + ]: 64 : ABI_FREE(v2sum)
3648 : : ! Compute contribution to annihilation rate
3649 [ - + + - : 192 : ABI_MALLOC(gg,(mesh_size,4))
+ - + - -
+ + - ]
3650 [ + + + + ]: 229936 : gg=zero
3651 [ - + + - : 128 : ABI_MALLOC(rhoarr2,(mesh_size))
- + + - ]
3652 [ + + ]: 640 : do ilm=1,lm_size
3653 [ + - + + ]: 517276 : if (lmselect_ep(ilm)) gg(:,1)=gg(:,1)+rhotot_ep(:,ilm)*rhocorej(:)*gammam(:,ilm)
3654 : : end do
3655 [ - + ]: 64 : ABI_FREE(rhoarr2)
3656 [ + + ]: 57468 : gg(1:mesh_size,1)=gg(1:mesh_size,1)*pawrad(itypat)%rad(1:mesh_size)**2
3657 : 64 : call simp_gen(intg,gg(:,1),pawrad(itypat))
3658 : 64 : rate =rate +intg
3659 [ - + ]: 64 : ABI_FREE(gg)
3660 [ - + ]: 64 : ABI_FREE(gammam)
3661 [ - + ]: 64 : ABI_FREE(rhotot)
3662 [ - + ]: 64 : ABI_FREE(rhotot_ep)
3663 [ - + ]: 64 : ABI_FREE(rhosph)
3664 [ - + ]: 64 : ABI_FREE(rhosph_ep)
3665 : :
3666 : : end if ! dtset%pawxcdev
3667 [ - + ]: 64 : ABI_FREE(rhocore)
3668 : :
3669 [ - + ]: 64 : ABI_FREE(rho1)
3670 [ - + ]: 64 : ABI_FREE(trho1)
3671 [ - + ]: 64 : ABI_FREE(rho1_ep)
3672 [ - + ]: 64 : ABI_FREE(trho1_ep)
3673 [ - + ]: 64 : ABI_FREE(lmselect)
3674 [ - + ]: 64 : ABI_FREE(lmselect_ep)
3675 [ - + ]: 64 : ABI_FREE(lmselect_dum)
3676 [ - + ]: 64 : ABI_FREE(nhat1)
3677 [ - + ]: 64 : ABI_FREE(nhat1_ep)
3678 : :
3679 : : !Reduction in case of distribution over atomic sites
3680 [ - + ]: 64 : if (mpi_enreg%nproc_atom>1) then
3681 : 0 : mpibuf=rate
3682 : 0 : call xmpi_sum(mpibuf,mpi_enreg%comm_atom,ierr)
3683 : 0 : rate=mpibuf
3684 : : end if
3685 : :
3686 : : DBG_EXIT("COLL")
3687 : :
3688 [ - + - + : 128 : end subroutine posratecore
- + - + -
+ - + ]
3689 : : !!***
3690 : :
3691 : : end module m_positron
3692 : : !!***
|