Branch data Line data Source code
1 : : !!****m* ABINIT/m_bethe_salpeter
2 : : !! NAME
3 : : !! m_bethe_salpeter
4 : : !!
5 : : !! FUNCTION
6 : : !! Main routine to calculate dielectric properties by solving the Bethe-Salpeter equation in
7 : : !! Frequency-Reciprocal space on a transition (electron-hole) basis set.
8 : : !!
9 : : !! COPYRIGHT
10 : : !! Copyright (C) 1992-2009 EXC group (L.Reining, V.Olevano, F.Sottile, S.Albrecht, G.Onida)
11 : : !! Copyright (C) 2009-2026 ABINIT group (MG, YG)
12 : : !! This file is distributed under the terms of the
13 : : !! GNU General Public License, see ~abinit/COPYING
14 : : !! or http://www.gnu.org/copyleft/gpl.txt .
15 : : !!
16 : : !! SOURCE
17 : :
18 : : #if defined HAVE_CONFIG_H
19 : : #include "config.h"
20 : : #endif
21 : :
22 : : #include "abi_common.h"
23 : :
24 : : module m_bethe_salpeter
25 : :
26 : : use defs_basis
27 : : use defs_wvltypes
28 : : use m_bs_defs
29 : : use m_abicore
30 : : use m_xmpi
31 : : use m_errors
32 : : use m_nctk
33 : : use netcdf
34 : : use m_hdr
35 : : use m_dtset
36 : : use m_dtfil
37 : : use m_crystal
38 : : use m_screen
39 : :
40 : : use defs_datatypes, only : pseudopotential_type
41 : : use defs_abitypes, only : MPI_type
42 : : use m_gwdefs, only : GW_Q0_DEFAULT
43 : : use m_time, only : timab
44 : : use m_fstrings, only : strcat, sjoin, endswith, itoa
45 : : use m_io_tools, only : file_exists, iomode_from_fname
46 : : use m_geometry, only : mkrdim, metric, normv
47 : : use m_hide_lapack, only : matrginv
48 : : use m_mpinfo, only : destroy_mpi_enreg, initmpi_seq
49 : : use m_fftcore, only : print_ngfft
50 : : use m_fft_mesh, only : rotate_FFT_mesh, get_gfft, setmesh
51 : : use m_fft, only : fourdp
52 : : use m_bz_mesh, only : kmesh_t, get_ng0sh, make_mesh
53 : : use m_double_grid, only : double_grid_t, double_grid_init, double_grid_free
54 : : use m_ebands, only : ebands_t
55 : : use m_kg, only : getph
56 : : use m_gsphere, only : gsphere_t
57 : : use m_vcoul, only : vcoul_t
58 : : use m_qparticles, only : rdqps, rdgw !, show_QP , rdgw
59 : : use m_wfd, only : wfdgw_t, test_charge
60 : : use m_wfk, only : wfk_read_eigenvalues
61 : : use m_energies, only : energies_type
62 : : use m_io_screening, only : hscr_t, get_hscr_qmesh_gsph
63 : : use m_haydock, only : exc_haydock_driver
64 : : use m_exc_diago, only : exc_diago_driver
65 : : use m_exc_analyze, only : exc_den
66 : : use m_eprenorms, only : eprenorms_t, eprenorms_free, eprenorms_from_epnc, eprenorms_bcast
67 : : use m_pawang, only : pawang_type
68 : : use m_pawrad, only : pawrad_type
69 : : use m_pawtab, only : pawtab_type, pawtab_print, pawtab_get_lsize
70 : : use m_paw_an, only : paw_an_type, paw_an_init, paw_an_free, paw_an_nullify
71 : : use m_paw_ij, only : paw_ij_type, paw_ij_init, paw_ij_free, paw_ij_nullify
72 : : use m_pawfgrtab, only : pawfgrtab_type, pawfgrtab_free, pawfgrtab_init
73 : : use m_pawrhoij, only : pawrhoij_type, pawrhoij_alloc, pawrhoij_copy, pawrhoij_free,&
74 : : pawrhoij_inquire_dim, pawrhoij_symrhoij
75 : : use m_pawdij, only : pawdij, symdij
76 : : use m_pawfgr, only : pawfgr_type, pawfgr_init, pawfgr_destroy
77 : : use m_paw_hr, only : pawhur_t, pawhur_free, pawhur_init
78 : : use m_pawpwij, only : pawpwff_t, pawpwff_init, pawpwff_free
79 : : use m_paw_sphharm, only : setsym_ylm
80 : : use m_paw_denpot, only : pawdenpot
81 : : use m_paw_init, only : pawinit,paw_gencond
82 : : use m_paw_onsite, only : pawnabla_init
83 : : use m_paw_dmft, only : paw_dmft_type
84 : : use m_paw_mkrho, only : denfgr
85 : : use m_paw_nhat, only : nhatgrid,pawmknhat
86 : : use m_paw_tools, only : chkpawovlp, pawprt
87 : : use m_paw_correlations,only : pawpuxinit
88 : : use m_exc_build, only : exc_build_ham
89 : : use m_setvtr, only : setvtr
90 : : use m_mkrho, only : prtrhomxmn
91 : : use m_pspini, only : pspini
92 : : use m_drivexc, only : mkdenpos
93 : :
94 : : implicit none
95 : :
96 : : private
97 : : !!***
98 : :
99 : : public :: bethe_salpeter
100 : : !!***
101 : :
102 : : contains
103 : : !!***
104 : :
105 : : !!****f* m_bethe_salpeter/bethe_salpeter
106 : : !! NAME
107 : : !! bethe_salpeter
108 : : !!
109 : : !! FUNCTION
110 : : !! Main routine to calculate dielectric properties by solving the Bethe-Salpeter equation in
111 : : !! Frequency-Reciprocal space on a transition (electron-hole) basis set.
112 : : !!
113 : : !! INPUTS
114 : : !! acell(3)=Length scales of primitive translations (bohr)
115 : : !! codvsn=Code version
116 : : !! Dtfil<datafiles_type>=Variables related to files.
117 : : !! Dtset<dataset_type>=All input variables for this dataset.
118 : : !! Pawang<pawang_type)>=PAW angular mesh and related data.
119 : : !! Pawrad(ntypat*usepaw)<pawrad_type>=Paw radial mesh and related data.
120 : : !! Pawtab(ntypat*usepaw)<pawtab_type>=Paw tabulated starting data.
121 : : !! Psps<pseudopotential_type>=Variables related to pseudopotentials.
122 : : !! Before entering the first time in the routine, a significant part of Psps has been initialized :
123 : : !! the integers dimekb,lmnmax,lnmax,mpssang,mpssoang,mpsso,mgrid,ntypat,n1xccc,usepaw,useylm,
124 : : !! and the arrays dimensioned to npsp. All the remaining components of Psps are to be initialized in
125 : : !! the call to pspini. The next time the code enters bethe_salpeter, Psps might be identical to the
126 : : !! one of the previous Dtset, in which case, no reinitialisation is scheduled in pspini.F90.
127 : : !! rprim(3,3)=Dimensionless real space primitive translations.
128 : : !! xred(3,natom)=Reduced atomic coordinates.
129 : : !!
130 : : !! Input files used during the calculation.
131 : : !! KSS : Kohn Sham electronic structure file.
132 : : !! SCR (SUSC) : Files containing the symmetrized epsilon^-1 or the irreducible RPA polarizability,
133 : : !! respectively. Used to construct the screening W.
134 : : !! GW file : Optional file with the GW QP corrections.
135 : : !!
136 : : !! OUTPUT
137 : : !! Output is written on the main output file and on the following external files:
138 : : !! * _RPA_NLF_MDF: macroscopic RPA dielectric function without non-local field effects.
139 : : !! * _GW_NLF_MDF: macroscopic RPA dielectric function without non-local field effects calculated
140 : : !! with GW energies or the scissors operator.
141 : : !! * _EXC_MDF: macroscopic dielectric function with excitonic effects obtained by solving the
142 : : !! Bethe-Salpeter problem at different level of sophistication.
143 : : !!
144 : : !! NOTES
145 : : !!
146 : : !! ON THE USE OF FFT GRIDS:
147 : : !! =================
148 : : !! In case of PAW:
149 : : !! ---------------
150 : : !! Two FFT grids are used:
151 : : !! - A "coarse" FFT grid (defined by ecut) for the application of the Hamiltonian on the plane waves basis.
152 : : !! It is defined by nfft, ngfft, mgfft, ...
153 : : !! Hamiltonian, wave-functions, density related to WFs (rhor here), ... are expressed on this grid.
154 : : !! - A "fine" FFT grid (defined) by ecutdg) for the computation of the density inside PAW spheres.
155 : : !! It is defined by nfftf, ngfftf, mgfftf, ... Total density, potentials, ... are expressed on this grid.
156 : : !! In case of norm-conserving:
157 : : !! ---------------------------
158 : : !! - Only the usual FFT grid (defined by ecut) is used. It is defined by nfft, ngfft, mgfft, ...
159 : : !! For compatibility reasons, (nfftf,ngfftf,mgfftf) are set equal to (nfft,ngfft,mgfft) in that case.
160 : : !!
161 : : !! SOURCE
162 : :
163 : 29 : subroutine bethe_salpeter(acell,codvsn,Dtfil,Dtset,Pawang,Pawrad,Pawtab,Psps,rprim,xred)
164 : :
165 : : !Arguments ------------------------------------
166 : : !scalars
167 : : character(len=8),intent(in) :: codvsn
168 : : type(datafiles_type),intent(inout) :: Dtfil
169 : : type(dataset_type),intent(inout) :: Dtset
170 : : type(pawang_type),intent(inout) :: Pawang
171 : : type(pseudopotential_type),intent(inout) :: Psps
172 : : !arrays
173 : : real(dp),intent(in) :: acell(3),rprim(3,3),xred(3,Dtset%natom)
174 : : type(pawrad_type),intent(inout) :: Pawrad(Psps%ntypat*Psps%usepaw)
175 : : type(pawtab_type),intent(inout) :: Pawtab(Psps%ntypat*Psps%usepaw)
176 : :
177 : : !Local variables ------------------------------
178 : : !scalars
179 : : integer,parameter :: tim_fourdp0=0,level=40,ipert0=0,idir0=0,cplex1=1,master=0,option1=1
180 : : integer :: band,cplex_rhoij,spin,ik_ibz,mqmem,iwarn
181 : : integer :: has_dijU,has_dijso,gnt_option, ik_bz,mband, choice, ider
182 : : integer :: usexcnhat,nfft_osc,mgfft_osc, isym,izero
183 : : integer :: optcut,optgr0,optgr1,optgr2,option,optrad,optrhoij,psp_gencond
184 : : integer :: ngrvdw,nhatgrdim,nkxc1,nprocs,nspden_rhoij,nzlmopt,ifft
185 : : integer :: my_rank,rhoxsp_method,comm, mgfftf,spin_opt,which_fixed
186 : : integer :: nscf,nbsc,nkxc,n3xccc, nfftf,nfftf_tot,nfftot_osc,my_minb,my_maxb
187 : : integer :: optene,moved_atm_inside,moved_rhor,initialized,istep,ierr
188 : : real(dp) :: ucvol,drude_plsmf,ecore,ecut_eff,ecutdg_eff,norm
189 : : real(dp) :: gsqcutc_eff,gsqcutf_eff,gsqcut_shp
190 : : real(dp) :: compch_fft,compch_sph,gsq_osc, vxcavg,el_temp
191 : : logical :: iscompatibleFFT,is_dfpt=.false.,paw_add_onsite,call_pawinit
192 : : character(len=500) :: msg
193 : : character(len=fnlen) :: wfk_fname,w_fname
194 : : type(Pawfgr_type) :: Pawfgr
195 : : type(excfiles) :: BS_files
196 : 29 : type(excparam) :: BSp
197 : 29 : type(paw_dmft_type) :: Paw_dmft
198 : 29 : type(MPI_type) :: MPI_enreg_seq
199 [ + + + + : 1827 : type(crystal_t) :: Cryst
+ + + + +
+ + + + +
+ + + + +
+ ]
200 [ + + + + : 754 : type(kmesh_t) :: Kmesh,Qmesh
+ + + + ]
201 : 29 : type(gsphere_t) :: Gsph_x,Gsph_c,Gsph_x_dense,Gsph_c_dense
202 : 29 : type(Hdr_type) :: Hdr_wfk,Hdr_bse
203 : 58 : type(ebands_t) :: ks_ebands, qp_ebands, ks_ebands_dense, qp_ebands_dense
204 : : type(Energies_type) :: KS_energies
205 [ + + + + : 1247 : type(vcoul_t) :: Vcp, Vcp_dense
+ + + + +
+ + + + +
+ + + + +
+ ]
206 : 29 : type(wfdgw_t) :: Wfd, Wfd_dense
207 : 29 : type(screen_t) :: screen
208 : : type(screen_info_t) :: W_info
209 : 29 : type(wvl_data) :: wvl
210 [ + + + + : 754 : type(kmesh_t) :: Kmesh_dense,Qmesh_dense
+ + + + ]
211 : 29 : type(Hdr_type) :: Hdr_wfk_dense
212 : 29 : type(double_grid_t) :: grid
213 : 29 : type(eprenorms_t) :: Epren
214 : : !arrays
215 : : integer :: ngfft_osc(18),ngfftc(18),ngfftf(18),nrcell(3)
216 : 29 : integer,allocatable :: ktabr(:,:),l_size_atm(:)
217 : 87 : integer,allocatable :: nband(:,:),nq_spl(:),irottb(:,:), qp_vbik(:,:), gfft_osc(:,:)
218 : : real(dp),parameter :: k0(3)=zero
219 : : real(dp) :: tsec(2),gmet(3,3),gprimd(3,3),qphon(3),rmet(3,3),rprimd(3,3),eh_rcoord(3),strsxc(6)
220 : 29 : real(dp),allocatable :: ph1df(:,:),prev_rhor(:,:),ph1d(:,:)
221 : 58 : real(dp),allocatable :: ks_nhat(:,:),ks_nhatgr(:,:,:),ks_rhog(:,:),ks_rhor(:,:),qp_aerhor(:,:)
222 : 29 : real(dp),allocatable :: qp_rhor(:,:),qp_rhog(:,:) !,qp_vhartr(:),qp_vtrial(:,:),qp_vxc(:,:)
223 : 29 : real(dp),allocatable :: qp_rhor_paw(:,:),qp_rhor_n_one(:,:),qp_rhor_nt_one(:,:),qp_nhat(:,:)
224 : 58 : real(dp),allocatable :: grchempottn(:,:),grewtn(:,:),grvdw(:,:),qmax(:)
225 : 58 : real(dp),allocatable :: vpsp(:),xccc3d(:), ks_vhartr(:),ks_vtrial(:,:),ks_vxc(:,:), kxc(:,:) !,qp_kxc(:,:)
226 : 29 : complex(dp),allocatable :: m_ks_to_qp(:,:,:,:)
227 : 58 : logical,allocatable :: bks_mask(:,:,:),keep_ur(:,:,:)
228 : 29 : type(Pawrhoij_type),allocatable :: KS_Pawrhoij(:)
229 : 29 : type(Pawrhoij_type),allocatable :: prev_Pawrhoij(:) !QP_pawrhoij(:),
230 : 29 : type(pawpwff_t),allocatable :: Paw_pwff(:)
231 : 29 : type(Pawfgrtab_type),allocatable :: Pawfgrtab(:)
232 : 29 : type(pawhur_t),allocatable :: Hur(:)
233 : 29 : type(Paw_ij_type),allocatable :: KS_paw_ij(:)
234 : 29 : type(Paw_an_type),allocatable :: KS_paw_an(:)
235 : : !************************************************************************
236 : :
237 : : DBG_ENTER('COLL')
238 : :
239 : 29 : call timab(650,1,tsec) ! bse(Total)
240 : 29 : call timab(651,1,tsec) ! bse(Init1)
241 : :
242 : 29 : comm = xmpi_world; nprocs = xmpi_comm_size(comm); my_rank = xmpi_comm_rank(comm)
243 : :
244 : 29 : wfk_fname = dtfil%fnamewffk
245 : :
246 [ - + ]: 29 : if (nctk_try_fort_or_ncfile(wfk_fname, msg) /= 0) then
247 : 0 : ABI_ERROR(msg)
248 : : end if
249 : 29 : call xmpi_bcast(wfk_fname, master, comm, ierr)
250 : :
251 : : write(msg,'(8a)')&
252 : 29 : ' Exciton: Calculation of dielectric properties by solving the Bethe-Salpeter equation ',ch10,&
253 : 29 : ' in frequency domain and reciprocal space on a transitions basis set. ',ch10,&
254 : 29 : ' Based on a program developed by L. Reining, V. Olevano, F. Sottile, ',ch10,&
255 : 58 : ' S. Albrecht, and G. Onida. Incorporated in ABINIT by M. Giantomassi. ',ch10
256 [ + + ]: 87 : call wrtout([std_out, ab_out], msg)
257 : :
258 : : #ifdef HAVE_GW_DPC
259 : : if (gwp/=8) then
260 : : write(msg,'(6a)')ch10,&
261 : : ' Number of bytes for double precision complex /=8 ',ch10,&
262 : : ' Cannot continue due to kind mismatch in BLAS library ',ch10,&
263 : : ' Some BLAS interfaces are not generated by abilint '
264 : : ABI_ERROR(msg)
265 : : end if
266 : 29 : write(msg,'(a,i2,a)')'.Using double precision arithmetic ; gwpc = ',gwp,ch10
267 : : #else
268 : : write(msg,'(a,i2,a)')'.Using single precision arithmetic ; gwpc = ',gwp,ch10
269 : : #endif
270 [ + + ]: 87 : call wrtout([std_out, ab_out], msg)
271 : :
272 : : !=== Some variables need to be initialized/nullify at start ===
273 : 29 : call KS_energies%init()
274 : 29 : usexcnhat=0
275 : 29 : call mkrdim(acell,rprim,rprimd)
276 : 29 : call metric(gmet,gprimd,ab_out,rmet,rprimd,ucvol)
277 : : !
278 : : !=== Define FFT grid(s) sizes ===
279 : : !* Be careful! This mesh is only used for densities, potentials and the matrix elements of v_Hxc. It is NOT the
280 : : !(usually coarser) GW FFT mesh employed for the oscillator matrix elements that is defined in setmesh.F90.
281 : : !See also NOTES in the comments at the beginning of this file.
282 : : !NOTE: This mesh is defined in invars2m using ecutwfn, in GW Dtset%ecut is forced to be equal to Dtset%ecutwfn.
283 : :
284 : : !TODO Recheck getng, should use same trick as that used in screening and sigma.
285 : : call pawfgr_init(Pawfgr,Dtset,mgfftf,nfftf,ecut_eff,ecutdg_eff,ngfftc,ngfftf,&
286 : 29 : gsqcutc_eff=gsqcutc_eff,gsqcutf_eff=gsqcutf_eff,gmet=gmet,k0=k0)
287 : :
288 [ + + ]: 58 : call print_ngfft([std_out], ngfftf, header='Dense FFT mesh used for densities and potentials')
289 [ + + ]: 116 : nfftf_tot=PRODUCT(ngfftf(1:3))
290 : :
291 : : ! Fake MPI_type for the sequential part.
292 : 29 : call initmpi_seq(MPI_enreg_seq)
293 : 29 : call MPI_enreg_seq%distribfft%init_seq('c',ngfftc(2),ngfftc(3),'all')
294 : 29 : call MPI_enreg_seq%distribfft%init_seq('f',ngfftf(2),ngfftf(3),'all')
295 : :
296 : : ! ===========================================
297 : : ! === Open and read pseudopotential files ===
298 : : ! ===========================================
299 : 29 : call pspini(Dtset,Dtfil,ecore,psp_gencond,gsqcutc_eff,gsqcutf_eff,Pawrad,Pawtab,Psps,rprimd,comm_mpi=comm)
300 : :
301 : : ! === Initialization of basic objects including the BSp structure that defines the parameters of the run ===
302 : : call setup_bse(codvsn,acell,rprim,ngfft_osc,Dtset,Dtfil,BS_files,Psps,Pawtab,BSp,&
303 : 29 : Cryst,Kmesh,Qmesh,ks_ebands,qp_ebands,Hdr_wfk,Gsph_x,Gsph_c,Vcp,Hdr_bse,w_fname,Epren,comm,wvl%descr)
304 : :
305 [ + + ]: 29 : if (BSp%use_interp) then
306 : : call setup_bse_interp(Dtset,Dtfil,BSp,Cryst,Kmesh,Kmesh_dense,&
307 : : Qmesh_dense,ks_ebands_dense,qp_ebands_dense,Gsph_x_dense,Gsph_c_dense,&
308 : 4 : Vcp_dense,Hdr_wfk_dense,grid,comm)
309 : : end if
310 : :
311 : : !call timab(652,2,tsec) ! setup_bse
312 : :
313 [ + + ]: 116 : nfftot_osc=PRODUCT(ngfft_osc(1:3))
314 : 29 : nfft_osc =nfftot_osc !no FFT //
315 : : mgfft_osc =MAXVAL(ngfft_osc(1:3))
316 : :
317 [ + + ]: 58 : call print_ngfft([std_out], ngfft_osc, header='FFT mesh used for oscillator strengths')
318 : :
319 : : !TRYING TO RECREATE AN "ABINIT ENVIRONMENT"
320 : 29 : KS_energies%e_corepsp=ecore/Cryst%ucvol
321 : :
322 : : !
323 : : !============================
324 : : !==== PAW initialization ====
325 : : !============================
326 [ + + ]: 29 : if (Dtset%usepaw==1) then
327 : 2 : call chkpawovlp(Cryst%natom,Cryst%ntypat,Dtset%pawovlp,Pawtab,Cryst%rmet,Cryst%typat,xred)
328 : :
329 [ - + + - : 10 : ABI_MALLOC(KS_Pawrhoij,(Cryst%natom))
+ - + - -
+ - + - +
+ + ]
330 : : call pawrhoij_inquire_dim(cplex_rhoij=cplex_rhoij,nspden_rhoij=nspden_rhoij,&
331 : 2 : nspden=Dtset%nspden,spnorb=Dtset%pawspnorb,cpxocc=Dtset%pawcpxocc)
332 : 2 : call pawrhoij_alloc(KS_Pawrhoij,cplex_rhoij,nspden_rhoij,Dtset%nspinor,Dtset%nsppol,Cryst%typat,pawtab=Pawtab)
333 : :
334 : : ! Initialize values for several basic arrays ===
335 [ + - + - : 2 : gnt_option=1;if (dtset%pawxcdev==2.or.(dtset%pawxcdev==1.and.dtset%positron/=0)) gnt_option=2
- + ]
336 : :
337 : : ! Test if we have to call pawinit
338 : 2 : call paw_gencond(Dtset,gnt_option,"test",call_pawinit)
339 : :
340 [ + - - + ]: 2 : if (psp_gencond==1.or.call_pawinit) then
341 : 0 : gsqcut_shp=two*abs(dtset%diecut)*dtset%dilatmx**2/pi**2
342 : : call pawinit(Dtset%effmass_free,gnt_option,gsqcut_shp,zero,Dtset%pawlcutd,Dtset%pawlmix,&
343 : : Psps%mpsang,Dtset%pawnphi,Cryst%nsym,Dtset%pawntheta,Pawang,Pawrad,&
344 : 0 : Dtset%pawspnorb,Pawtab,Dtset%pawxcdev,Dtset%ixc,Dtset%usepotzero)
345 : :
346 : : ! Update internal values
347 : 0 : call paw_gencond(Dtset,gnt_option,"save",call_pawinit)
348 : : else
349 [ - + - - ]: 2 : if (Pawtab(1)%has_kij ==1) Pawtab(1:Cryst%ntypat)%has_kij =2
350 [ - + - - ]: 2 : if (Pawtab(1)%has_nabla==1) Pawtab(1:Cryst%ntypat)%has_nabla=2
351 : : end if
352 [ + + ]: 5 : Psps%n1xccc=MAXVAL(Pawtab(1:Cryst%ntypat)%usetcore)
353 : :
354 : : ! Initialize optional flags in Pawtab to zero
355 : : ! (Cannot be done in Pawinit since the routine is called only if some parameters are changed)
356 [ + + ]: 5 : Pawtab(:)%has_nabla = 0
357 [ + + ]: 5 : Pawtab(:)%usepawu = 0
358 [ + + ]: 5 : Pawtab(:)%useexexch = 0
359 [ + + ]: 5 : Pawtab(:)%exchmix =zero
360 [ + + ]: 5 : Pawtab(:)%lamb_shielding = zero
361 : :
362 : : ! * Evaluate <phi_i|nabla|phi_j>-<tphi_i|nabla|tphi_j> for the long wavelength limit.
363 : : ! TODO solve problem with memory leak and clean this part as well as the associated flag
364 : 2 : call pawnabla_init(Psps%mpsang,Cryst%ntypat,Pawrad,Pawtab)
365 : :
366 : 2 : call setsym_ylm(gprimd,Pawang%l_max-1,Cryst%nsym,Dtset%pawprtvol,Cryst%rprimd,Cryst%symrec,Pawang%zarot)
367 : :
368 : : ! Initialize and compute data for DFT+U
369 : 2 : Paw_dmft%use_dmft=Dtset%usedmft
370 : : call pawpuxinit(Dtset%dmatpuopt,Dtset%exchmix,Dtset%f4of2_sla,Dtset%f6of2_sla,&
371 : : is_dfpt,Dtset%jpawu,Dtset%lexexch,Dtset%lpawu,Dtset%nspinor,Cryst%ntypat,Dtset%optdcmagpawu,Pawang,Dtset%pawprtvol,&
372 : 2 : Pawrad,Pawtab,Dtset%upawu,Dtset%usedmft,Dtset%useexexch,Dtset%usepawu)
373 [ + - - + ]: 2 : if (Dtset%usepawu>0.or.Dtset%useexexch>0) then
374 : 0 : ABI_ERROR('BS equation with DFT+U not completely coded!')
375 : : end if
376 [ + - ]: 2 : if (my_rank == master) call pawtab_print(Pawtab)
377 : :
378 : : ! Get Pawrhoij from the header of the WFK file.
379 : 2 : call pawrhoij_copy(Hdr_wfk%pawrhoij,KS_Pawrhoij)
380 : :
381 : : ! Re-symmetrize rhoij ===
382 : : ! this call leads to a SIGFAULT, likely some pointer is not initialized correctly
383 : 2 : choice=1; optrhoij=1
384 : : ! call pawrhoij_symrhoij(KS_Pawrhoij,KS_Pawrhoij,choice,Cryst%gprimd,Cryst%indsym,ipert0,&
385 : : ! & Cryst%natom,Cryst%nsym,Cryst%ntypat,optrhoij,Pawang,Dtset%pawprtvol,Pawtab,&
386 : : ! & Cryst%rprimd,Cryst%symafm,Cryst%symrec,Cryst%typat)
387 : :
388 : : ! Evaluate form factor of radial part of phi.phj-tphi.tphj ===
389 : 2 : rhoxsp_method=1 ! Arnaud-Alouani
390 [ + + ]: 2 : if (Dtset%pawoptosc /= 0) rhoxsp_method = Dtset%pawoptosc
391 : :
392 [ - + + - : 6 : ABI_MALLOC(gfft_osc,(3,nfftot_osc))
+ - + - -
+ - + ]
393 : 2 : call get_gfft(ngfft_osc,k0,gmet,gsq_osc,gfft_osc)
394 [ - + ]: 2 : ABI_FREE(gfft_osc)
395 : :
396 : : ! Set up q grids, make qmax 20% larger than largest expected:
397 [ - + + - : 6 : ABI_MALLOC(nq_spl,(Psps%ntypat))
+ - + - -
+ - + ]
398 [ - + + - : 6 : ABI_MALLOC(qmax,(Psps%ntypat))
+ - + - -
+ - + ]
399 [ + + ]: 5 : nq_spl = Psps%mqgrid_ff
400 [ + + ]: 5 : qmax = SQRT(gsq_osc)*1.2d0 ! qmax=Psps%qgrid_ff(Psps%mqgrid_ff)
401 [ - + + - : 33 : ABI_MALLOC(Paw_pwff,(Psps%ntypat))
+ - + - -
+ - + + +
+ + + + ]
402 : :
403 : 2 : call pawpwff_init(Paw_pwff,rhoxsp_method,nq_spl,qmax,gmet,Pawrad,Pawtab,Psps)
404 : :
405 [ - + ]: 2 : ABI_FREE(nq_spl)
406 [ - + ]: 2 : ABI_FREE(qmax)
407 : : !
408 : : ! Variables/arrays related to the fine FFT grid ===
409 [ - + + - : 8 : ABI_MALLOC(ks_nhat,(nfftf,Dtset%nspden))
- + + - +
- + - - +
- + ]
410 [ + + + + ]: 92541 : ks_nhat=zero
411 [ - + + - : 10 : ABI_MALLOC(Pawfgrtab,(Cryst%natom))
+ - + - -
+ - + +
+ ]
412 : 2 : call pawtab_get_lsize(Pawtab,l_size_atm,Cryst%natom,Cryst%typat)
413 : 2 : call pawfgrtab_init(Pawfgrtab,cplex1,l_size_atm,Dtset%nspden,Dtset%typat)
414 [ - + ]: 2 : ABI_FREE(l_size_atm)
415 : 2 : compch_fft=greatest_real
416 [ + + ]: 5 : usexcnhat=MAXVAL(Pawtab(:)%usexcnhat)
417 : : ! * 0 if Vloc in atomic data is Vbare (Blochl s formulation)
418 : : ! * 1 if Vloc in atomic data is VH(tnzc) (Kresse s formulation)
419 : 2 : write(msg,'(a,i0)')' bethe_salpeter : using usexcnhat = ',usexcnhat
420 : 2 : call wrtout(std_out,msg)
421 : : !
422 : : ! Identify parts of the rectangular grid where the density has to be calculated ===
423 : 2 : optcut=0; optgr0=Dtset%pawstgylm; optgr1=0; optgr2=0; optrad=1-Dtset%pawstgylm
424 [ + - + - ]: 2 : if (Dtset%xclevel==2.and.usexcnhat>0) optgr1=Dtset%pawstgylm
425 : :
426 : : call nhatgrid(Cryst%atindx1,gmet,Cryst%natom,Cryst%natom,Cryst%nattyp,ngfftf,Cryst%ntypat,&
427 : 8 : optcut,optgr0,optgr1,optgr2,optrad,Pawfgrtab,Pawtab,Cryst%rprimd,Cryst%typat,Cryst%ucvol,Cryst%xred)
428 : : else
429 [ - + ]: 27 : ABI_MALLOC(Paw_pwff,(0))
430 : : end if !End of PAW Initialization
431 : :
432 : : ! Consistency check and additional stuff done only for GW with PAW.
433 [ + + ]: 29 : if (Dtset%usepaw==1) then
434 [ - + ]: 2 : if (Dtset%ecutwfn < Dtset%ecut) then
435 : : write(msg,"(5a)")&
436 : 0 : "WARNING - ",ch10,&
437 : 0 : " It is highly recommended to use ecutwfn = ecut for GW calculations with PAW since ",ch10,&
438 : 0 : " an excessive truncation of the planewave basis set can lead to unphysical results."
439 : 0 : call wrtout(ab_out,msg,'COLL')
440 : : end if
441 : :
442 [ - + ]: 2 : ABI_CHECK(Dtset%usedmft==0,"DMFT + BSE not allowed")
443 [ - + ]: 2 : ABI_CHECK(Dtset%useexexch==0,"LEXX + BSE not allowed")
444 : : end if
445 : :
446 : : ! Allocate these arrays anyway, since they are passed to subroutines.
447 [ + + ]: 29 : if (.not.allocated(ks_nhat)) then
448 [ - + + - : 54 : ABI_MALLOC(ks_nhat,(nfftf,0))
- + - + -
+ ]
449 : : end if
450 : :
451 : : !Get electronic temperature from dtset
452 [ - + - - : 29 : el_temp=merge(dtset%tphysel,dtset%tsmear,dtset%tphysel>tol8.and.dtset%occopt/=3.and.dtset%occopt/=9)
- - ]
453 : :
454 : : !==================================================
455 : : !==== Read KS band structure from the KSS file ====
456 : : !==================================================
457 : :
458 : : ! Initialize wave function handler, allocate wavefunctions.
459 : 29 : my_minb=1; my_maxb=BSp%nbnds; mband=BSp%nbnds
460 [ - + + - : 116 : ABI_MALLOC(nband,(Kmesh%nibz,Dtset%nsppol))
- + + - +
- + - - +
- + ]
461 [ + + + + ]: 958 : nband=mband
462 : :
463 : : !At present, no memory distribution, each node has the full set of states.
464 [ - + + - : 145 : ABI_MALLOC(bks_mask,(mband,Kmesh%nibz,Dtset%nsppol))
- + + - -
+ + - + -
+ - - + -
+ ]
465 [ + + + + : 6931 : bks_mask=.TRUE.
+ + ]
466 : :
467 [ - + + - : 116 : ABI_MALLOC(keep_ur,(mband,Kmesh%nibz,Dtset%nsppol))
- + + - -
+ + - - +
- + ]
468 [ + + + + : 13833 : keep_ur=.FALSE.; if (MODULO(Dtset%gwmem,10)==1) keep_ur = .TRUE.
+ + + - +
+ + + +
+ ]
469 : :
470 : : call wfd%init(Cryst,Pawtab,Psps,keep_ur,mband,nband,Kmesh%nibz,Dtset%nsppol,bks_mask,&
471 : : Dtset%nspden,Dtset%nspinor,Dtset%ecutwfn,Dtset%ecutsm,Dtset%dilatmx,Hdr_wfk%istwfk,Kmesh%ibz,ngfft_osc,&
472 : 29 : Dtset%nloalg,Dtset%prtvol,Dtset%pawprtvol,comm)
473 : :
474 [ - + ]: 29 : ABI_FREE(bks_mask)
475 [ - + ]: 29 : ABI_FREE(nband)
476 [ - + ]: 29 : ABI_FREE(keep_ur)
477 : :
478 [ + + ]: 58 : call wfd%print([std_out], header="Wavefunctions used to construct the e-h basis set")
479 : :
480 : 29 : call timab(651,2,tsec) ! bse(Init1)
481 : 29 : call timab(653,1,tsec) ! bse(rdkss)
482 : :
483 : 29 : call wfd%read_wfk(wfk_fname, iomode_from_fname(wfk_fname))
484 : :
485 : : ! This test has been disabled (too expensive!)
486 : : if (.False.) call wfd%test_ortho(Cryst,Pawtab,unit=ab_out,mode_paral="COLL")
487 : :
488 : 29 : call timab(653,2,tsec) ! bse(rdkss)
489 : 29 : call timab(655,1,tsec) ! bse(mkrho)
490 : :
491 : : !TODO: check the consistency of Wfd with Wfd_dense !!!
492 [ + + ]: 29 : if (BSp%use_interp) then
493 : : ! Initialize wave function handler, allocate wavefunctions.
494 : 4 : my_minb=1; my_maxb=BSp%nbnds; mband=BSp%nbnds
495 [ - + + - : 16 : ABI_MALLOC(nband,(Kmesh_dense%nibz,Dtset%nsppol))
- + + - +
- + - - +
- + ]
496 [ + + + + ]: 264 : nband=mband
497 : :
498 : : ! At present, no memory distribution, each node has the full set of states.
499 : : ! albeit we allocate only the states that are used.
500 [ - + + - : 20 : ABI_MALLOC(bks_mask,(mband,Kmesh_dense%nibz,Dtset%nsppol))
- + + - -
+ + - + -
+ - - + -
+ ]
501 [ + + + + : 2312 : bks_mask=.False.
+ + ]
502 [ + + ]: 8 : do spin=1,Bsp%nsppol
503 [ + + + + ]: 2056 : bks_mask(Bsp%lomo_spin(spin):Bsp%humo_spin(spin),:,spin) = .True.
504 : : end do
505 : : !bks_mask=.TRUE.
506 : :
507 [ - + + - : 16 : ABI_MALLOC(keep_ur,(mband,Kmesh_dense%nibz,Dtset%nsppol))
- + + - -
+ + - - +
- + ]
508 [ + + + + : 4620 : keep_ur=.FALSE.; if (MODULO(Dtset%gwmem,10)==1) keep_ur = .TRUE.
+ + + - +
+ + + +
+ ]
509 : :
510 : : call Wfd_dense%init(Cryst,Pawtab,Psps,keep_ur,mband,nband,Kmesh_dense%nibz,Dtset%nsppol,&
511 : : bks_mask,Dtset%nspden,Dtset%nspinor,Dtset%ecutwfn,Dtset%ecutsm,Dtset%dilatmx,Hdr_wfk_dense%istwfk,Kmesh_dense%ibz,ngfft_osc,&
512 : 4 : Dtset%nloalg,Dtset%prtvol,Dtset%pawprtvol,comm)
513 : :
514 [ - + ]: 4 : ABI_FREE(bks_mask)
515 [ - + ]: 4 : ABI_FREE(nband)
516 [ - + ]: 4 : ABI_FREE(keep_ur)
517 : :
518 [ + + ]: 8 : call wfd_dense%print([std_out], header="Wavefunctions on the dense K-mesh used for interpolation")
519 : 4 : call wfd_dense%read_wfk(Dtfil%fnameabi_wfkfine, iomode_from_fname(dtfil%fnameabi_wfkfine))
520 : : !call wfd_dense%update_bkstab()
521 : :
522 : : ! This test has been disabled (too expensive!)
523 : : if (.False.) call wfd_dense%test_ortho(Cryst,Pawtab,unit=std_out,mode_paral="COLL")
524 : : end if
525 : :
526 : : !=== Calculate the FFT index of $(R^{-1}(r-\tau))$ ===
527 : : !* S=\transpose R^{-1} and k_BZ = S k_IBZ
528 : : !* irottb is the FFT index of $R^{-1} (r-\tau)$ used to symmetrize u_Sk.
529 [ - + + - : 116 : ABI_MALLOC(irottb,(nfftot_osc,Cryst%nsym))
- + + - +
- + - - +
- + ]
530 : 29 : call rotate_FFT_mesh(Cryst%nsym,Cryst%symrel,Cryst%tnons,ngfft_osc,irottb,iscompatibleFFT)
531 : :
532 [ - + + - : 116 : ABI_MALLOC(ktabr,(nfftot_osc,Kmesh%nbz))
- + + - +
- + - - +
- + ]
533 [ + + ]: 1181 : do ik_bz=1,Kmesh%nbz
534 : 1152 : isym=Kmesh%tabo(ik_bz)
535 [ + + ]: 8440181 : do ifft=1,nfftot_osc
536 : 8440152 : ktabr(ifft,ik_bz)=irottb(ifft,isym)
537 : : end do
538 : : end do
539 [ - + ]: 29 : ABI_FREE(irottb)
540 : : !
541 : : !===========================
542 : : !=== COMPUTE THE DENSITY ===
543 : : !===========================
544 : : !* Evaluate Planewave part (complete charge in case of NC pseudos).
545 : : !
546 [ - + + - : 116 : ABI_MALLOC(ks_rhor, (nfftf, Wfd%nspden))
- + + - +
- + - - +
- + ]
547 : 29 : call wfd%mkrho(cryst, psps, ks_ebands, ngfftf, nfftf, ks_rhor)
548 : : !
549 : : !=== Additional computation for PAW ===
550 : 29 : nhatgrdim=0
551 [ + + ]: 29 : if (Dtset%usepaw==1) then
552 : : !
553 : : ! Calculate the compensation charge nhat.
554 [ + - ]: 2 : if (Dtset%xclevel==2) nhatgrdim=usexcnhat*Dtset%pawnhatxc
555 : 2 : ider=2*nhatgrdim; izero=0; qphon(:)=zero
556 [ + - ]: 2 : if (nhatgrdim>0) then
557 [ - + + - : 10 : ABI_MALLOC(ks_nhatgr,(nfftf,Dtset%nspden,3))
- + + - +
- + - + -
- + - + -
+ ]
558 : : end if
559 : :
560 : : call pawmknhat(compch_fft,cplex1,ider,idir0,ipert0,izero,Cryst%gprimd,&
561 : : Cryst%natom,Cryst%natom,nfftf,ngfftf,nhatgrdim,Dtset%nspden,Cryst%ntypat,Pawang,&
562 : : Pawfgrtab,ks_nhatgr,ks_nhat,KS_Pawrhoij,KS_Pawrhoij,Pawtab,qphon,Cryst%rprimd,&
563 : 2 : Cryst%ucvol,Dtset%usewvl,Cryst%xred)
564 : :
565 : : ! Evaluate onsite energies, potentials, densities ===
566 : : ! * Initialize variables/arrays related to the PAW spheres.
567 : : ! * Initialize also lmselect (index of non-zero LM-moments of densities).
568 [ - + + - : 10 : ABI_MALLOC(KS_paw_ij,(Cryst%natom))
+ - + - -
+ - + - +
+ + + - ]
569 : 2 : call paw_ij_nullify(KS_paw_ij)
570 : :
571 : 2 : has_dijso=Dtset%pawspnorb
572 [ - + ]: 2 : has_dijU=merge(0,1,Dtset%usepawu==0)
573 : :
574 : : call paw_ij_init(KS_paw_ij,cplex1,Dtset%nspinor,Dtset%nsppol,&
575 : : Dtset%nspden,Dtset%pawspnorb,Cryst%natom,Cryst%ntypat,Cryst%typat,Pawtab,&
576 : : has_dij=1,has_dijhartree=1,has_dijhat=1,has_dijxc=0,has_dijxc_hat=0,has_dijxc_val=0,&
577 : 2 : has_dijso=has_dijso,has_dijU=has_dijU,has_exexch_pot=1,has_pawu_occ=1)
578 : :
579 [ - + + - : 10 : ABI_MALLOC(KS_paw_an,(Cryst%natom))
+ - + - -
+ - + - +
+ + + - ]
580 : 2 : call paw_an_nullify(KS_paw_an)
581 : :
582 : 2 : nkxc1=0
583 : : call paw_an_init(KS_paw_an,Cryst%natom,Cryst%ntypat,nkxc1,0,Dtset%nspden,&
584 : 2 : cplex1,Dtset%pawxcdev,Cryst%typat,Pawang,Pawtab,has_vxc=1,has_vxcval=0)
585 : :
586 : : ! Calculate onsite vxc with and without core charge ===
587 : 2 : nzlmopt=-1; option=0; compch_sph=greatest_real
588 : :
589 : : call pawdenpot(compch_sph,el_temp,Cryst%gprimd,ipert0,Dtset%ixc,Cryst%natom,Cryst%natom,Dtset%nspden,&
590 : : Cryst%ntypat,Dtset%nucdipmom,nzlmopt,option,KS_Paw_an,KS_Paw_an,KS_energies%paw,KS_paw_ij,&
591 : : Pawang,Dtset%pawprtvol,Pawrad,KS_Pawrhoij,Dtset%pawspnorb,Pawtab,Dtset%pawxcdev,&
592 : 2 : Dtset%spnorbscl,Dtset%xclevel,Dtset%xc_denpos,Dtset%xc_taupos,Cryst%xred,Cryst%ucvol,Psps%znuclpsp,Dtset%spinaxis)
593 : : end if !PAW
594 : :
595 [ + + ]: 29 : if (.not.allocated(ks_nhatgr)) then
596 [ - + + - : 81 : ABI_MALLOC(ks_nhatgr,(nfftf,Dtset%nspden,0))
- + + - -
+ - + -
+ ]
597 : : end if
598 : :
599 : : call test_charge(nfftf,ks_ebands%nelect,Dtset%nspden,ks_rhor,Cryst%ucvol,&
600 : 29 : Dtset%usepaw,usexcnhat,Pawfgr%usefinegrid,compch_sph,compch_fft,drude_plsmf)
601 : :
602 : : ! === For PAW, add the compensation charge on the FFT mesh, then get rho(G) ===
603 [ + + + + : 92568 : if (Dtset%usepaw==1) ks_rhor(:,:)=ks_rhor(:,:)+ks_nhat(:,:)
+ + ]
604 : 29 : call prtrhomxmn(std_out,MPI_enreg_seq,nfftf,ngfftf,Dtset%nspden,1,ks_rhor,ucvol=ucvol)
605 : :
606 [ - + + - : 87 : ABI_MALLOC(ks_rhog,(2,nfftf))
+ - + - -
+ - + ]
607 : :
608 : 29 : call fourdp(1,ks_rhog,ks_rhor(:,1),-1,MPI_enreg_seq,nfftf,1,ngfftf,tim_fourdp0)
609 : 29 : call timab(655,2,tsec) ! bse(mkrho)
610 : :
611 : : !
612 : : ! The following steps have been gathered in the setvtr routine:
613 : : ! - get Ewald energy and Ewald forces
614 : : ! - compute local ionic pseudopotential vpsp
615 : : ! - eventually compute 3D core electron density xccc3d
616 : : ! - eventually compute vxc and vhartr
617 : : ! - set up ks_vtrial
618 : : !
619 : : ! *******************************************************************
620 : : ! **** NOTE THAT HERE Vxc CONTAINS THE CORE-DENSITY CONTRIBUTION ****
621 : : ! *******************************************************************
622 : 29 : ngrvdw=0
623 [ - + ]: 29 : ABI_MALLOC(grvdw,(3,ngrvdw))
624 [ - + + - : 87 : ABI_MALLOC(grchempottn,(3,Cryst%natom))
+ - + - -
+ - + ]
625 [ - + + - : 58 : ABI_MALLOC(grewtn,(3,Cryst%natom))
- + - + ]
626 : 29 : nkxc=0
627 : : !if (Wfd%nspden==1) nkxc=2
628 : : !if (Wfd%nspden>=2) nkxc=3 ! check GGA and spinor, quite a messy part!!!
629 [ - + + - : 58 : ABI_MALLOC(kxc,(nfftf,nkxc))
- + - + ]
630 : :
631 [ + - ]: 29 : n3xccc=0; if (Psps%n1xccc/=0) n3xccc=nfftf
632 [ - + + - : 87 : ABI_MALLOC(xccc3d,(n3xccc))
+ - + - -
+ - + ]
633 [ - + + - : 87 : ABI_MALLOC(ks_vhartr,(nfftf))
+ - + - -
+ - + ]
634 [ - + + - : 116 : ABI_MALLOC(ks_vtrial,(nfftf,Wfd%nspden))
- + + - +
- + - - +
- + ]
635 [ - + + - : 58 : ABI_MALLOC(vpsp,(nfftf))
- + - + ]
636 [ - + + - : 87 : ABI_MALLOC(ks_vxc,(nfftf,Wfd%nspden))
- + + - -
+ - + -
+ ]
637 : :
638 : 29 : optene=4; moved_atm_inside=0; moved_rhor=0; initialized=1; istep=1
639 : : !
640 : : !=== Compute structure factor phases and large sphere cut-off ===
641 [ + - - + : 87 : ABI_MALLOC(ph1d,(2,3*(2*Dtset%mgfft+1)*Cryst%natom))
+ - + - +
- - + - +
- + ]
642 [ + - - + : 87 : ABI_MALLOC(ph1df,(2,3*(2*mgfftf+1)*Cryst%natom))
+ - + - +
- - + - +
- + ]
643 : :
644 : 29 : call getph(Cryst%atindx,Cryst%natom,ngfftc(1),ngfftc(2),ngfftc(3),ph1d,Cryst%xred)
645 : :
646 [ + + + - ]: 29 : if (Psps%usepaw==1.and.Pawfgr%usefinegrid==1) then
647 : 2 : call getph(Cryst%atindx,Cryst%natom,ngfftf(1),ngfftf(2),ngfftf(3),ph1df,Cryst%xred)
648 : : else
649 [ + + + + ]: 18801 : ph1df(:,:)=ph1d(:,:)
650 : : end if
651 : :
652 [ - + ]: 29 : ABI_FREE(ph1d)
653 : :
654 : : call setvtr(Cryst%atindx1,Dtset,KS_energies,Cryst%gmet,Cryst%gprimd,grchempottn,grewtn,grvdw,gsqcutf_eff,&
655 : : istep,kxc,mgfftf,moved_atm_inside,moved_rhor,MPI_enreg_seq,&
656 : : Cryst%nattyp,nfftf,ngfftf,ngrvdw,ks_nhat,ks_nhatgr,nhatgrdim,nkxc,Cryst%ntypat,Psps%n1xccc,n3xccc,&
657 : : optene,Pawang,Pawrad,KS_Pawrhoij,Pawtab,ph1df,Psps,ks_rhog,ks_rhor,Cryst%rmet,&
658 : 29 : Cryst%rprimd,strsxc,Cryst%ucvol,usexcnhat,ks_vhartr,vpsp,ks_vtrial,ks_vxc,vxcavg,wvl,xccc3d,Cryst%xred)
659 : :
660 [ - + ]: 29 : ABI_FREE(ph1df)
661 [ - + ]: 29 : ABI_FREE(vpsp)
662 : :
663 : : ! ============================
664 : : ! ==== Compute KS PAW Dij ====
665 : : ! ============================
666 [ + + ]: 29 : if (Wfd%usepaw==1) then
667 : 2 : call timab(561,1,tsec)
668 : : !
669 : : ! Calculate the unsymmetrized Dij.
670 : : call pawdij(cplex1,Dtset%enunit,Cryst%gprimd,ipert0,&
671 : : Cryst%natom,Cryst%natom,nfftf,ngfftf(1)*ngfftf(2)*ngfftf(3),&
672 : : Dtset%nspden,Cryst%ntypat,KS_paw_an,KS_paw_ij,Pawang,Pawfgrtab,&
673 : : Dtset%pawprtvol,Pawrad,KS_Pawrhoij,Dtset%pawspnorb,Pawtab,Dtset%pawxcdev,&
674 : : k0,Dtset%spnorbscl,Cryst%ucvol,dtset%cellcharge(1),ks_vtrial,ks_vxc,Cryst%xred,&
675 : 2 : Dtset%znucl,nucdipmom=Dtset%nucdipmom,spinaxis=Dtset%spinaxis)
676 : :
677 : : ! Symmetrize KS Dij
678 : : call symdij(Cryst%gprimd,Cryst%indsym,ipert0,&
679 : : Cryst%natom,Cryst%natom,Cryst%nsym,Cryst%ntypat,0,KS_paw_ij,Pawang,&
680 : 2 : Dtset%pawprtvol,Pawtab,Cryst%rprimd,Cryst%symafm,Cryst%symrec)
681 : :
682 : : ! Output the pseudopotential strengths Dij and the augmentation occupancies Rhoij.
683 : 2 : call pawprt(Dtset,Cryst%natom,KS_paw_ij,KS_Pawrhoij,Pawtab)
684 : 2 : call timab(561,2,tsec)
685 : : end if
686 : :
687 [ - + ]: 29 : ABI_FREE(kxc)
688 [ - + ]: 29 : ABI_FREE(xccc3d)
689 [ - + ]: 29 : ABI_FREE(grchempottn)
690 [ - + ]: 29 : ABI_FREE(grewtn)
691 [ - + ]: 29 : ABI_FREE(grvdw)
692 : :
693 : : !=== qp_ebands stores energies and occ. used for the calculation ===
694 : : !* Initialize qp_ebands with KS values.
695 : : !* In case of SC update qp_ebands using the QPS file.
696 [ - + + - : 116 : ABI_MALLOC(qp_rhor,(nfftf,Dtset%nspden))
- + + - +
- + - - +
- + ]
697 [ + - + - : 286992 : qp_rhor = ks_rhor
- + - - +
+ + + ]
698 : :
699 : : ! AE density used for the model dielectric function.
700 [ - + + - : 87 : ABI_MALLOC(qp_aerhor, (nfftf,Dtset%nspden))
- + + - -
+ - + ]
701 [ + - + - : 286992 : qp_aerhor = ks_rhor
- + - - +
+ + + ]
702 : :
703 : : ! PAW: Compute AE rhor. Under testing
704 [ + + + + ]: 29 : if (Wfd%usepaw==1 .and. BSp%mdlf_type/=0) then
705 : 1 : ABI_WARNING("Entering qp_aerhor with PAW")
706 : :
707 [ - + + - : 4 : ABI_MALLOC(qp_rhor_paw ,(nfftf,Wfd%nspden))
- + + - +
- + - - +
- + ]
708 [ - + + - : 3 : ABI_MALLOC(qp_rhor_n_one ,(nfftf,Wfd%nspden))
- + + - -
+ - + ]
709 [ - + + - : 4 : ABI_MALLOC(qp_rhor_nt_one,(nfftf,Wfd%nspden))
- + + - +
- + - - +
- + ]
710 : :
711 [ - + + - : 3 : ABI_MALLOC(qp_nhat,(nfftf,Wfd%nspden))
- + + - -
+ - + ]
712 [ + - + - : 65540 : qp_nhat = ks_nhat
- + - - +
+ + + ]
713 : : ! TODO: I pass KS_pawrhoij instead of QP_pawrhoij but in the present version there's no difference.
714 : :
715 : : call denfgr(Cryst%atindx1,Cryst%gmet,Wfd%comm,Cryst%natom,Cryst%natom,Cryst%nattyp,ngfftf,qp_nhat,&
716 : : Wfd%nspinor,Wfd%nsppol,Wfd%nspden,Cryst%ntypat,Pawfgr,Pawrad,KS_pawrhoij,Pawtab,Dtset%prtvol,&
717 : 1 : qp_rhor,qp_rhor_paw,qp_rhor_n_one,qp_rhor_nt_one,Cryst%rprimd,Cryst%typat,Cryst%ucvol,Cryst%xred)
718 : :
719 [ + + + + ]: 32772 : norm = SUM(qp_rhor_paw(:,1))*Cryst%ucvol/PRODUCT(Pawfgr%ngfft(1:3))
720 : 1 : write(msg,'(a,F8.4)') ' QUASIPARTICLE DENSITY CALCULATED - NORM OF DENSITY: ',norm
721 : 1 : call wrtout(std_out,msg)
722 [ + - - + : 32770 : write(std_out,*)"MAX", MAXVAL(qp_rhor_paw(:,1))
- - + + ]
723 [ + - - + : 32770 : write(std_out,*)"MIN", MINVAL(qp_rhor_paw(:,1))
- - + + ]
724 : :
725 [ - + ]: 1 : ABI_FREE(qp_nhat)
726 [ - + ]: 1 : ABI_FREE(qp_rhor_n_one)
727 [ - + ]: 1 : ABI_FREE(qp_rhor_nt_one)
728 : :
729 : : ! Use ae density for the model dielectric function.
730 : 1 : iwarn=0
731 : 1 : call mkdenpos(iwarn,nfftf,Wfd%nspden,option1,qp_rhor_paw,dtset%xc_denpos)
732 [ + - + - : 65540 : qp_aerhor = qp_rhor_paw
- + - - +
+ + + ]
733 [ - + ]: 1 : ABI_FREE(qp_rhor_paw)
734 : : end if
735 : :
736 : : !call copy_bandstructure(ks_ebands,qp_ebands)
737 : :
738 : : if (.FALSE.) then
739 : : ! $ m_ks_to_qp(ib,jb,k,s) := <\psi_{ib,k,s}^{KS}|\psi_{jb,k,s}^{QP}> $
740 : : ABI_MALLOC(m_ks_to_qp,(Wfd%mband,Wfd%mband,Wfd%nkibz,Wfd%nsppol))
741 : : m_ks_to_qp=czero
742 : : do spin=1,Wfd%nsppol
743 : : do ik_ibz=1,Wfd%nkibz
744 : : do band=1,Wfd%nband(ik_ibz,spin)
745 : : m_ks_to_qp(band,band,ik_ibz,spin)=cone ! Initialize the QP amplitudes with KS wavefunctions.
746 : : end do
747 : : end do
748 : : end do
749 : : !
750 : : ! Now read m_ks_to_qp and update the energies in qp_ebands.
751 : : ! TODO switch on the renormalization of n in sigma.
752 : : ABI_MALLOC(prev_rhor,(nfftf,Wfd%nspden))
753 : : ABI_MALLOC(prev_Pawrhoij,(Cryst%natom*Wfd%usepaw))
754 : :
755 : : call rdqps(qp_ebands,Dtfil%fnameabi_qps,Wfd%usepaw,Wfd%nspden,1,nscf,&
756 : : nfftf,ngfftf,Cryst%ucvol,Cryst,Pawtab,MPI_enreg_seq,nbsc,m_ks_to_qp,prev_rhor,prev_Pawrhoij)
757 : :
758 : : ABI_FREE(prev_rhor)
759 : : if (Psps%usepaw==1.and.nscf>0) then
760 : : call pawrhoij_free(prev_pawrhoij)
761 : : end if
762 : : ABI_FREE(prev_pawrhoij)
763 : : !
764 : : !if (nscf>0.and.wfd_iam_master(Wfd)) then ! Print the unitary transformation on std_out.
765 : : !call show_QP(qp_ebands,m_ks_to_qp,fromb=Sigp%minbdgw,tob=Sigp%maxbdgw,unit=std_out,tolmat=0.001_dp)
766 : : !end if
767 : : !
768 : : !=== Compute QP wfg as linear combination of KS states ===
769 : : !* Wfd%ug is modified inside calc_wf_qp
770 : : !* For PAW, update also the on-site projections.
771 : : !* WARNING the first dimension of MPI_enreg MUST be Kmesh%nibz
772 : : !TODO here we should use nbsc instead of nbnds
773 : :
774 : : call wfd%rotate(Cryst,m_ks_to_qp)
775 : : ABI_FREE(m_ks_to_qp)
776 : : !
777 : : ! === Reinit the storage mode of Wfd as ug have been changed ===
778 : : ! * Update also the wavefunctions for GW corrections on each processor
779 : : call wfd%reset_ur_cprj()
780 : :
781 : : !call wfd%test_ortho(Cryst,Pawtab,unit=ab_out,mode_paral="COLL")
782 : :
783 : : ! Compute QP occupation numbers.
784 : : call wrtout(std_out, 'bethe_salpeter: calculating QP occupation numbers')
785 : :
786 : : call qp_ebands%update_occ(Dtset%spinmagntarget,prtvol=0)
787 : : ABI_MALLOC(qp_vbik,(qp_ebands%nkpt,qp_ebands%nsppol))
788 : : qp_vbik(:,:) = qp_ebands%get_valence_idx()
789 : : ABI_FREE(qp_vbik)
790 : :
791 : : call wfd%mkrho(cryst, psps, qp_ebands, ngfftf, nfftf, qp_rhor)
792 : : end if
793 : :
794 [ - + + - : 87 : ABI_MALLOC(qp_rhog,(2,nfftf))
+ - + - -
+ - + ]
795 : 29 : call fourdp(1,qp_rhog,qp_rhor(:,1),-1,MPI_enreg_seq,nfftf,1,ngfftf,0)
796 : :
797 : : ! States up to lomo-1 are useless now since only the states close to the gap are
798 : : ! needed to construct the EXC Hamiltonian. Here we deallocate the wavefunctions
799 : : ! to make room for the excitonic Hamiltonian that is allocated in exc_build_ham.
800 : : ! and for the screening that is allocated below.
801 : : ! Hereafter bands from 1 up to lomo-1 and all bands above humo+1 should not be accessed!
802 [ - + + - : 145 : ABI_MALLOC(bks_mask,(Wfd%mband,Wfd%nkibz,Wfd%nsppol))
- + + - -
+ + - + -
+ - - + -
+ ]
803 : :
804 [ + + + + : 6931 : bks_mask=.FALSE.
+ + ]
805 [ + + ]: 59 : do spin=1,Bsp%nsppol
806 [ + - + + : 1892 : if (Bsp%lomo_spin(spin)>1) bks_mask(1:Bsp%lomo_spin(spin)-1,:,spin)=.TRUE.
+ + ]
807 [ - + - - : 59 : if (Bsp%humo_spin(spin)+1<=Wfd%mband) bks_mask(Bsp%humo_spin(spin)+1:,:,spin)=.TRUE.
- - ]
808 : : end do
809 : 29 : call wfd%wave_free(what="All", bks_mask=bks_mask)
810 [ - + ]: 29 : ABI_FREE(bks_mask)
811 : : !
812 : : ! ================================================================
813 : : ! Build the screened interaction W in the irreducible q-wedge.
814 : : ! * W(q,G1,G2) = vc^{1/2} (q,G1) e^{-1}(q,G1,G2) vc^{1/2) (q,G2)
815 : : ! * Use Coulomb term for q-->0,
816 : : ! * Only the first small Q is used, shall we average if nqlwl>1?
817 : : ! ================================================================
818 : : ! TODO clean this part and add an option to retrieve a single frequency to save memory.
819 : 29 : call timab(654,1,tsec) ! bse(rdmkeps^-1)
820 : :
821 : 29 : call screen%nullify()
822 [ + - ]: 29 : if (BSp%use_coulomb_term) then
823 : : ! Init W.
824 : : ! Incore or out-of-core solution?
825 [ + + ]: 29 : mqmem = 0; if (Dtset%gwmem /10 == 1) mqmem = Qmesh%nibz
826 : :
827 : 29 : W_info%invalid_freq = Dtset%gw_invalid_freq
828 : 29 : W_info%mat_type = MAT_INV_EPSILON
829 : 29 : W_info%use_mdf = BSp%mdlf_type
830 : 29 : W_info%eps_inf = BSp%eps_inf
831 : :
832 : : call screen%init(W_Info, Cryst, Qmesh, Gsph_c, Vcp, w_fname, mqmem, Dtset%npweps, &
833 : 29 : Dtset%iomode, ngfftf, nfftf_tot, Wfd%nsppol, Wfd%nspden, qp_aerhor, Wfd%prtvol, Wfd%comm)
834 : : end if
835 : 29 : call timab(654,2,tsec) ! bse(rdmkeps^-1)
836 : :
837 : : ! =============================================
838 : : ! ==== Build of the excitonic Hamiltonian =====
839 : : ! =============================================
840 : 29 : call timab(656,1,tsec) ! bse(mkexcham)
841 : :
842 : : call exc_build_ham(BSp,BS_files,Cryst,Kmesh,Qmesh,ktabr,Gsph_x,Gsph_c,Vcp,&
843 : 29 : Wfd,screen,Hdr_bse,nfftot_osc,ngfft_osc,Psps,Pawtab,Pawang,Paw_pwff)
844 : :
845 : : ! Free W to make room for the full excitonic Hamiltonian.
846 : 29 : call screen%free()
847 : :
848 : 29 : call timab(656,2,tsec) ! bse(mkexcham)
849 : : !
850 : : ! =========================================
851 : : ! ==== Macroscopic dielectric function ====
852 : : ! =========================================
853 : 29 : call timab(657,1,tsec) ! bse(mkexceps)
854 : : !
855 : : ! First deallocate the internal %ur buffers to make room for the excitonic Hamiltonian.
856 : 29 : call timab(658,1,tsec) ! bse(wfd_wave_free)
857 [ - + + - : 145 : ABI_MALLOC(bks_mask,(Wfd%mband,Wfd%nkibz,Wfd%nsppol))
- + + - -
+ + - + -
+ - - + -
+ ]
858 [ + + + + : 6931 : bks_mask=.TRUE.
+ + ]
859 : 29 : call wfd%wave_free(what="Real_space", bks_mask=bks_mask)
860 [ - + ]: 29 : ABI_FREE(bks_mask)
861 : 29 : call timab(658,2,tsec) ! bse(wfd_wave_free)
862 : :
863 : : ! Compute the commutator [r,Vu] (PAW only).
864 [ + + + - : 91 : ABI_MALLOC(HUr,(Cryst%natom*Wfd%usepaw))
+ - + + -
+ - + - +
+ + ]
865 : :
866 : 29 : call timab(659,1,tsec) ! bse(make_pawhur_t)
867 [ + - + + : 29 : if (Bsp%inclvkb/=0 .and. Wfd%usepaw==1 .and. Dtset%usepawu/=0) then !TODO here I need KS_Paw_ij
- + ]
868 : 0 : ABI_WARNING("Commutator for DFT+U not tested")
869 : 0 : call pawhur_init(hur,Wfd%nsppol,Wfd%pawprtvol,Cryst,Pawtab,Pawang,Pawrad,KS_Paw_ij)
870 : : end if
871 : 29 : call timab(659,2,tsec) ! bse(make_pawhur_t)
872 : :
873 : 29 : select case (BSp%algorithm)
874 : : case (BSE_ALGO_NONE)
875 : 0 : ABI_COMMENT("Skipping solution of the BSE equation")
876 : :
877 : : case (BSE_ALGO_DDIAGO, BSE_ALGO_CG)
878 : 6 : call timab(660,1,tsec) ! bse(exc_diago_driver)
879 : 6 : call exc_diago_driver(Wfd,Bsp,BS_files,ks_ebands,qp_ebands,Cryst,Kmesh,Psps, Pawtab,Hur,Hdr_bse,drude_plsmf,Epren)
880 : 6 : call timab(660,2,tsec) ! bse(exc_diago_driver)
881 : :
882 : : if (.FALSE.) then ! Calculate electron-hole excited state density. Not tested at all.
883 : : call exc_den(BSp,BS_files,ngfftf,nfftf,Kmesh,ktabr,Wfd)
884 : : end if
885 : :
886 : : if (.FALSE.) then
887 : : paw_add_onsite=.FALSE.; spin_opt=1; which_fixed=1; eh_rcoord=(/zero,zero,zero/); nrcell=(/2,2,2/)
888 : : !call exc_plot(Bsp,Bs_files,Wfd,Kmesh,Cryst,Psps,Pawtab,Pawrad,paw_add_onsite,spin_opt,which_fixed,eh_rcoord,nrcell,ngfftf)
889 : : end if
890 : :
891 [ - + ]: 6 : if (BSp%use_interp) then
892 : 0 : ABI_ERROR("Interpolation technique not coded for diagonalization and CG")
893 : : end if
894 : :
895 : : case (BSE_ALGO_Haydock)
896 : 23 : call timab(661,1,tsec) ! bse(exc_haydock_driver)
897 : :
898 [ + + ]: 23 : if (BSp%use_interp) then
899 : : call exc_haydock_driver(BSp,BS_files,Cryst,Kmesh,Hdr_bse,ks_ebands,qp_ebands,Wfd,Psps,Pawtab,Hur,Epren, &
900 : : kmesh_dense=Kmesh_dense, ks_bst_dense=ks_ebands_dense, qp_bst_dense=qp_ebands_dense,wfd_dense=Wfd_dense, &
901 : 4 : vcp_dense=Vcp_dense, grid=grid)
902 : : else
903 : 19 : call exc_haydock_driver(BSp,BS_files,Cryst,Kmesh,Hdr_bse,ks_ebands,qp_ebands,Wfd,Psps,Pawtab,Hur,Epren)
904 : : end if
905 : :
906 : 23 : call timab(661,2,tsec) ! bse(exc_haydock_driver)
907 : :
908 : : case default
909 [ - + + - ]: 29 : ABI_ERROR(sjoin("Wrong BSE algorithm: ",itoa(BSp%algorithm)))
910 : : end select
911 : :
912 : 29 : call timab(657,2,tsec) ! bse(mkexceps)
913 : :
914 : : !=====================
915 : : !==== Free memory ====
916 : : !=====================
917 [ - + ]: 29 : ABI_FREE(ktabr)
918 [ - + ]: 29 : ABI_FREE(ks_vhartr)
919 [ - + ]: 29 : ABI_FREE(ks_vtrial)
920 [ - + ]: 29 : ABI_FREE(ks_vxc)
921 [ - + ]: 29 : ABI_FREE(ks_nhat)
922 [ - + ]: 29 : ABI_FREE(ks_nhatgr)
923 [ - + ]: 29 : ABI_FREE(ks_rhog)
924 [ - + ]: 29 : ABI_FREE(ks_rhor)
925 [ - + ]: 29 : ABI_FREE(qp_rhog)
926 [ - + ]: 29 : ABI_FREE(qp_rhor)
927 [ - + ]: 29 : ABI_FREE(qp_aerhor)
928 : : !
929 : : ! Free local data structures.
930 : 29 : call destroy_mpi_enreg(MPI_enreg_seq)
931 : 29 : call cryst%free()
932 : 29 : call Gsph_x%free()
933 : 29 : call Gsph_c%free()
934 : 29 : call Kmesh%free()
935 : 29 : call Qmesh%free()
936 : 29 : call Hdr_wfk%free()
937 : 29 : call Hdr_bse%free()
938 : 29 : call ks_ebands%free()
939 : 29 : call qp_ebands%free()
940 : 29 : call Vcp%free()
941 : 29 : call BSp%free()
942 : 29 : call wfd%free()
943 : 29 : call pawfgr_destroy(Pawfgr)
944 : 29 : call eprenorms_free(Epren)
945 : 29 : call pawhur_free(Hur)
946 [ + - + + : 33 : ABI_FREE(Hur)
- + - + -
+ ]
947 : :
948 : : ! Free memory used for interpolation.
949 [ + + ]: 29 : if (BSp%use_interp) then
950 : 4 : call double_grid_free(grid)
951 : 4 : call wfd_dense%free()
952 : 4 : call Gsph_x_dense%free()
953 : 4 : call Gsph_c_dense%free()
954 : 4 : call Kmesh_dense%free()
955 : 4 : call Qmesh_dense%free()
956 : 4 : call ks_ebands_dense%free()
957 : 4 : call qp_ebands_dense%free()
958 : 4 : call Vcp_dense%free()
959 : 4 : call Hdr_wfk_dense%free()
960 : : end if
961 : :
962 : : ! Optional deallocation for PAW.
963 [ + + ]: 29 : if (Dtset%usepaw==1) then
964 : 2 : call pawrhoij_free(KS_Pawrhoij)
965 [ + - + + : 6 : ABI_FREE(KS_Pawrhoij)
- + - + -
+ - + - +
- + - + ]
966 : 2 : call pawfgrtab_free(Pawfgrtab)
967 [ + - + + : 6 : ABI_FREE(Pawfgrtab)
- + - + -
+ - + - +
- + - + -
+ - + ]
968 : 2 : call paw_ij_free(KS_paw_ij)
969 [ + - + + : 6 : ABI_FREE(KS_paw_ij)
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + ]
970 : 2 : call paw_an_free(KS_paw_an)
971 [ + - + + : 6 : ABI_FREE(KS_paw_an)
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + -
+ ]
972 : 2 : call pawpwff_free(Paw_pwff)
973 : : end if
974 [ + - + + : 32 : ABI_FREE(Paw_pwff)
- + - + -
+ ]
975 : :
976 : 29 : call timab(650,2,tsec) ! bse(Total)
977 : :
978 : : DBG_EXIT('COLL')
979 : :
980 [ - + - + : 203 : end subroutine bethe_salpeter
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - -
- - - - -
- - - - -
- - - + -
- - - - -
- - - - -
- - - - -
- - - - -
- - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- - - - -
- - - - -
- - - - -
+ - - - -
- - - - -
- - - - -
- - - - -
- - - - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - - - -
- + - - -
- - + - -
- - - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
- - - - -
- - - - -
- - - - -
- - - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - -
- - - - -
- - - - -
- - - + -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - +
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- - - - -
- - - - -
- - - - -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - - - -
- - - - -
- - - - -
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - - -
- - - - -
- - - - -
- - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + ]
981 : : !!***
982 : :
983 : : !!****f* m_bethe_salpeter/setup_bse
984 : : !! NAME
985 : : !! setup_bse
986 : : !!
987 : : !! FUNCTION
988 : : !! This routine performs the initialization of basic objects and quantities used for Bethe-Salpeter calculations.
989 : : !! In particular the excparam data type that defines the parameters of the calculation is completely
990 : : !! initialized starting from the content of Dtset and the parameters read from the external WFK and SCR (SUSC) file.
991 : : !!
992 : : !! INPUTS
993 : : !! codvsn=Code version
994 : : !! ngfft_gw(18)=Information about 3D FFT for density and potentials, see ~abinit/doc/variables/vargs.htm#ngfft
995 : : !! acell(3)=Length scales of primitive translations (bohr)
996 : : !! rprim(3,3)=Dimensionless real space primitive translations.
997 : : !! Dtset<dataset_type>=All input variables for this dataset.
998 : : !! Some of them might be redefined here TODO
999 : : !! Dtfil=filenames and unit numbers used in abinit.
1000 : : !! Psps <pseudopotential_type>=variables related to pseudopotentials
1001 : : !! Pawtab(Psps%ntypat*Dtset%usepaw)<pawtab_type>=PAW tabulated starting data
1002 : : !!
1003 : : !! OUTPUT
1004 : : !! Cryst<crystal_t>=Info on the crystalline Structure.
1005 : : !! Kmesh<kmesh_t>=Structure defining the k-sampling for the wavefunctions.
1006 : : !! Qmesh<kmesh_t>=Structure defining the q-sampling for the symmetrized inverse dielectric matrix.
1007 : : !! Gsph_x<gsphere_t=Data type gathering info on the G-sphere for wave functions and e^{-1},
1008 : : !! ks_ebands<ebands_t>=The KS band structure (energies, occupancies, k-weights...)
1009 : : !! Vcp<vcoul_t>=Structure gathering information on the Coulomb interaction in reciprocal space,
1010 : : !! including a possible cutoff in real space.
1011 : : !! ngfft_osc(18)=Contain all needed information about the 3D FFT for the oscillator matrix elements.
1012 : : !! See ~abinit/doc/variables/vargs.htm#ngfft
1013 : : !! Bsp<excparam>=Basic parameters defining the Bethe-Salpeter run. Completely initialed in output.
1014 : : !! Hdr_wfk<Hdr_type>=The header of the WFK file.
1015 : : !! Hdr_bse<Hdr_type>=Local header initialized from the parameters used for the Bethe-Salpeter calculation.
1016 : : !! BS_files<excfiles>=Files used in the calculation.
1017 : : !! w_file=File name used to construct W. Set to ABI_NOFILE if no external file is used.
1018 : : !!
1019 : : !! SOURCE
1020 : :
1021 [ - + - + : 3248 : subroutine setup_bse(codvsn,acell,rprim,ngfft_osc,Dtset,Dtfil,BS_files,Psps,Pawtab,BSp,&
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + + + +
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + + +
+ + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - -
- - - - -
- - - - -
- - - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + + +
+ + + + +
+ + + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- - - - -
- - - - -
- - - - -
+ - + - +
- + - + -
+ ]
1022 : : Cryst,Kmesh,Qmesh,ks_ebands,qp_ebands,Hdr_wfk,Gsph_x,Gsph_c,Vcp,Hdr_bse,w_fname,Epren,comm,Wvl)
1023 : :
1024 : : !Arguments ------------------------------------
1025 : : !scalars
1026 : : integer,intent(in) :: comm
1027 : : character(len=8),intent(in) :: codvsn
1028 : : character(len=fnlen),intent(out) :: w_fname
1029 : : type(dataset_type),intent(inout) :: Dtset
1030 : : type(datafiles_type),intent(in) :: Dtfil
1031 : : type(pseudopotential_type),intent(in) :: Psps
1032 : : type(excparam),intent(inout) :: Bsp
1033 : : type(hdr_type),intent(out) :: Hdr_wfk,Hdr_bse
1034 : : type(crystal_t),intent(out) :: Cryst
1035 : : type(kmesh_t),intent(out) :: Kmesh,Qmesh
1036 : : type(gsphere_t),intent(out) :: Gsph_x,Gsph_c
1037 : : type(ebands_t),intent(out) :: ks_ebands,qp_ebands
1038 : : type(Pawtab_type),intent(in) :: Pawtab(Psps%ntypat*Dtset%usepaw)
1039 : : type(vcoul_t),intent(out) :: Vcp
1040 : : type(excfiles),intent(out) :: BS_files
1041 : : type(wvl_internal_type), intent(in) :: Wvl
1042 : : type(eprenorms_t),intent(out) :: Epren
1043 : : !arrays
1044 : : integer,intent(out) :: ngfft_osc(18)
1045 : : real(dp),intent(in) :: acell(3),rprim(3,3)
1046 : :
1047 : : !Local variables ------------------------------
1048 : : !scalars
1049 : : integer,parameter :: pertcase0=0, master=0
1050 : : integer(i8b) :: work_size,tot_nreh,neh_per_proc,il
1051 : : integer :: bantot,enforce_sym,ib,ibtot,ik_ibz,isppol,jj,method,iat,ount !ii,
1052 : : integer :: mband,io,nfftot_osc,spin,hexc_size,nqlwl,iq, timrev,iq_bz,isym,iq_ibz,itim
1053 : : integer :: my_rank,nprocs,ierr,my_k1, my_k2,my_nbks, first_dig,second_dig,it
1054 : : real(dp) :: ucvol,qnorm, eff,mempercpu_mb,wfsmem_mb,nonscal_mem,ug_mem,ur_mem,cprj_mem
1055 : : logical,parameter :: remove_inv=.FALSE.
1056 : : logical :: ltest,occ_from_dtset
1057 : : character(len=500) :: msg
1058 : : character(len=fnlen) :: gw_fname,test_file,wfk_fname
1059 : : character(len=fnlen) :: ep_nc_fname
1060 [ + + ]: 116 : type(hscr_t) :: Hscr
1061 : : !arrays
1062 : 58 : integer :: ng0sh_opt(3),val_idx(Dtset%nsppol), units(2)
1063 : 29 : integer,allocatable :: npwarr(:),val_indices(:,:),nlmn_atm(:)
1064 : : real(dp) :: qpt_bz(3),minmax_tene(2), gmet(3,3),gprimd(3,3),rmet(3,3),rprimd(3,3),sq(3)
1065 : 58 : real(dp),allocatable :: doccde(:),eigen(:),occfact(:),qlwl(:,:), igwene(:,:,:)
1066 : 29 : real(dp),pointer :: energies_p(:,:,:)
1067 : 29 : complex(dp),allocatable :: gw_energy(:,:,:)
1068 [ - + ]: 29 : type(Pawrhoij_type),allocatable :: Pawrhoij(:)
1069 : : !************************************************************************
1070 : :
1071 : : DBG_ENTER("COLL")
1072 : :
1073 : 29 : my_rank = xmpi_comm_rank(comm); nprocs = xmpi_comm_size(comm)
1074 [ + + ]: 87 : units = [std_out, ab_out]
1075 : :
1076 : : ! === Check for calculations that are not implemented ===
1077 [ + + + - ]: 928 : ltest=ALL(Dtset%nband(1:Dtset%nkpt*Dtset%nsppol)==Dtset%nband(1))
1078 [ - + ]: 29 : ABI_CHECK(ltest,'Dtset%nband must be constant')
1079 [ - + ]: 29 : ABI_CHECK(Dtset%nspinor==1,"nspinor==2 not coded")
1080 : :
1081 : : ! === Dimensional primitive translations rprimd (from input), gprimd, metrics and unit cell volume ===
1082 : 29 : call mkrdim(acell,rprim,rprimd)
1083 : 29 : call metric(gmet,gprimd,-1,rmet,rprimd,ucvol)
1084 : :
1085 : : ! Read energies and header from the WFK file.
1086 : 29 : wfk_fname = dtfil%fnamewffk
1087 [ + - ]: 29 : if (.not. file_exists(wfk_fname)) then
1088 : 29 : wfk_fname = nctk_ncify(wfk_fname)
1089 : 29 : ABI_COMMENT(sjoin("File not found. Will try netcdf file: ", wfk_fname))
1090 : : end if
1091 : :
1092 : 29 : call wfk_read_eigenvalues(wfk_fname,energies_p,Hdr_wfk,comm)
1093 [ + + ]: 928 : mband = MAXVAL(Hdr_wfk%nband)
1094 : :
1095 : 29 : call hdr_wfk%vs_dtset(dtset)
1096 : :
1097 : : ! === Create crystal_t data type ===
1098 : : !remove_inv= .FALSE. !(nsym_kss/=Hdr_wfk%nsym)
1099 : 29 : timrev= 2 ! This information is not reported in the header
1100 : : ! 1 => do not use time-reversal symmetry
1101 : : ! 2 => take advantage of time-reversal symmetry
1102 : :
1103 [ - + - + : 29 : cryst = Hdr_wfk%get_crystal(gw_timrev=timrev, remove_inv=remove_inv)
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + ]
1104 : 29 : call cryst%print()
1105 : :
1106 : : ! Setup of the k-point list and symmetry tables in the BZ
1107 [ + + ]: 29 : if (Dtset%chksymbreak == 0) then
1108 : 18 : call make_mesh(Kmesh, Cryst, Dtset%kptopt, Dtset%kptrlatt, Dtset%nshiftk, Dtset%shiftk, break_symmetry=.TRUE.)
1109 : : else
1110 : 11 : call Kmesh%init(Cryst, Hdr_wfk%nkpt, Hdr_wfk%kptns, Dtset%kptopt)
1111 : : end if
1112 : 29 : BSp%nkibz = Kmesh%nibz !We might allow for a smaller number of points....
1113 : :
1114 : 29 : call Kmesh%print(units, header="K-mesh for the wavefunctions", prtvol=Dtset%prtvol)
1115 : :
1116 : 29 : nqlwl = 0; w_fname = ABI_NOFILE
1117 [ + + + + : 29 : if (dtset%getscr /= 0 .or. dtset%irdscr /= 0 .or. dtset%getscr_filepath /= ABI_NOFILE) then
+ + ]
1118 : 11 : w_fname = dtfil%fnameabi_scr
1119 [ + - - + ]: 18 : else if (dtset%getsuscep /= 0 .or. dtset%irdsuscep /= 0) then
1120 : 0 : w_fname = dtfil%fnameabi_sus
1121 : 0 : ABI_ERROR("(get|ird)suscep not implemented")
1122 : : end if
1123 : :
1124 [ + + ]: 29 : if (w_fname /= ABI_NOFILE) then
1125 [ - + ]: 11 : call get_hscr_qmesh_gsph(w_fname, dtset, cryst, hscr, qmesh, gsph_c, qlwl, comm)
1126 : 11 : call hscr%free()
1127 : 11 : nqlwl = size(qlwl, dim=2)
1128 : :
1129 : : else
1130 : : ! Init Qmesh from the K-mesh reported in the WFK file.
1131 : 18 : call Qmesh%find_qmesh(Cryst, Kmesh)
1132 : : ! The G-sphere for W and Sigma_c is initialized from ecuteps.
1133 : 18 : call Gsph_c%init(Cryst, 0, ecut=Dtset%ecuteps)
1134 : 18 : Dtset%npweps = Gsph_c%ng
1135 : : end if
1136 : :
1137 : 29 : BSp%npweps = Dtset%npweps
1138 : 29 : BSp%ecuteps = Dtset%ecuteps
1139 : :
1140 [ + + ]: 29 : if (nqlwl == 0) then
1141 : 18 : nqlwl=1
1142 [ - + - + ]: 18 : ABI_MALLOC(qlwl,(3,nqlwl))
1143 [ + + ]: 72 : qlwl(:,nqlwl)= GW_Q0_DEFAULT
1144 : : write(msg,'(3a,i0,a,3f9.6)')&
1145 : 18 : "The Header of the screening file does not contain the list of q-point for the optical limit ",ch10,&
1146 : 36 : "Using nqlwl= ",nqlwl," and qlwl = ",qlwl(:,1)
1147 : 18 : ABI_COMMENT(msg)
1148 : : end if
1149 : 29 : write(std_out,*)"nqlwl and qlwl for Coulomb singularity and e^-1",nqlwl,qlwl
1150 : :
1151 : : ! === Setup of q-mesh in the whole BZ ===
1152 : : ! * Stop if a nonzero umklapp is needed to reconstruct the BZ. In this case, indeed,
1153 : : ! epsilon^-1(Sq) should be symmetrized in csigme using a different expression (G-G_o is needed)
1154 : : !
1155 : 29 : call Qmesh%print(units, "Q-mesh for the screening function", prtvol=Dtset%prtvol)
1156 : :
1157 [ + + ]: 1181 : do iq_bz=1,Qmesh%nbz
1158 : 1152 : call qmesh%get_BZ_item(iq_bz,qpt_bz,iq_ibz,isym,itim)
1159 [ + + + + : 32256 : sq = (3-2*itim)*MATMUL(Cryst%symrec(:,:,isym),Qmesh%ibz(:,iq_ibz))
+ + + + +
- + - +
+ ]
1160 [ + + + - : 4637 : if (ANY(ABS(Qmesh%bz(:,iq_bz)-sq )>1.0d-4)) then
- + ]
1161 : 0 : write(std_out,*) sq,Qmesh%bz(:,iq_bz)
1162 : : write(msg,'(a,3f6.3,a,3f6.3,2a,9i3,a,i2,2a)')&
1163 : 0 : 'qpoint ',Qmesh%bz(:,iq_bz),' is the symmetric of ',Qmesh%ibz(:,iq_ibz),ch10,&
1164 : 0 : 'through operation ',Cryst%symrec(:,:,isym),' and itim ',itim,ch10,&
1165 : 0 : 'however a non zero umklapp G_o vector is required and this is not yet allowed'
1166 : 0 : ABI_ERROR(msg)
1167 : : end if
1168 : : end do
1169 : :
1170 : 29 : BSp%algorithm = Dtset%bs_algorithm
1171 : 29 : BSp%nstates = Dtset%bs_nstates
1172 : 29 : Bsp%nsppol = Dtset%nsppol
1173 : 29 : Bsp%hayd_term = Dtset%bs_hayd_term
1174 : :
1175 : : ! Define the algorithm for solving the BSE.
1176 [ + + ]: 29 : if (BSp%algorithm == BSE_ALGO_HAYDOCK) then
1177 : 23 : BSp%niter = Dtset%bs_haydock_niter
1178 [ + + ]: 69 : BSp%haydock_tol = Dtset%bs_haydock_tol
1179 : :
1180 [ + + ]: 6 : else if (BSp%algorithm == BSE_ALGO_CG) then
1181 : : ! FIXME For the time being use an hardcoded value.
1182 : : ! TODO change name in Dtset%
1183 : 1 : BSp%niter = Dtset%nstep !100
1184 : 1 : BSp%cg_tolwfr = Dtset%tolwfr
1185 : 1 : BSp%nline = Dtset%nline
1186 : 1 : BSp%nbdbuf = Dtset%nbdbuf
1187 : : BSp%nstates = Dtset%bs_nstates
1188 : 1 : ABI_WARNING("Check CG setup")
1189 : : else
1190 : : !BSp%niter = 0
1191 : : !BSp%tol_iter = HUGE(one)
1192 : : end if
1193 : : !
1194 : : ! Shall we include Local field effects?
1195 : 58 : SELECT CASE (Dtset%bs_exchange_term)
1196 : : CASE (0,1)
1197 : 29 : BSp%exchange_term = Dtset%bs_exchange_term
1198 : : CASE DEFAULT
1199 : 0 : write(msg,'(a,i0)')" Wrong bs_exchange_term: ",Dtset%bs_exchange_term
1200 [ + - ]: 29 : ABI_ERROR(msg)
1201 : : END SELECT
1202 : : !
1203 : : ! Treatment of the off-diagonal coupling block.
1204 : 57 : SELECT CASE (Dtset%bs_coupling)
1205 : : CASE (0)
1206 : 28 : BSp%use_coupling = 0
1207 : 28 : msg = 'RESONANT ONLY CALCULATION'
1208 : : CASE (1)
1209 : 1 : BSp%use_coupling = 1
1210 : 1 : msg = ' RESONANT+COUPLING CALCULATION '
1211 : : CASE DEFAULT
1212 : 0 : write(msg,'(a,i0)')" Wrong bs_coupling: ",Dtset%bs_coupling
1213 [ + + - ]: 29 : ABI_ERROR(msg)
1214 : : END SELECT
1215 : 29 : call wrtout(std_out,msg)
1216 : :
1217 : 29 : BSp%use_diagonal_Wgg = .FALSE.
1218 : 29 : Bsp%use_coulomb_term = .TRUE.
1219 : 29 : BSp%eps_inf=zero
1220 : 29 : Bsp%mdlf_type=0
1221 : :
1222 : 29 : first_dig =MOD(Dtset%bs_coulomb_term,10)
1223 : 29 : second_dig=Dtset%bs_coulomb_term/10
1224 : :
1225 : 29 : Bsp%wtype = second_dig
1226 : 0 : SELECT CASE (second_dig)
1227 : : CASE (BSE_WTYPE_NONE)
1228 : 0 : call wrtout(std_out,"Coulomb term won't be calculated")
1229 : 0 : Bsp%use_coulomb_term = .FALSE.
1230 : :
1231 : : CASE (BSE_WTYPE_FROM_SCR)
1232 : 11 : call wrtout(std_out,"W is read from an external SCR file")
1233 : 11 : Bsp%use_coulomb_term = .TRUE.
1234 : :
1235 : : CASE (BSE_WTYPE_FROM_MDL)
1236 : 18 : call wrtout(std_out,"W is approximated with the model dielectric function")
1237 : 18 : Bsp%use_coulomb_term = .TRUE.
1238 : 18 : BSp%mdlf_type = MDL_BECHSTEDT
1239 : 18 : BSp%eps_inf = Dtset%mdf_epsinf
1240 [ - + ]: 18 : ABI_CHECK(Bsp%eps_inf > zero, "mdf_epsinf <= 0")
1241 : :
1242 : : CASE DEFAULT
1243 : 0 : write(msg,'(a,i0)')" Wrong second digit in bs_coulomb_term: ",Dtset%bs_coulomb_term
1244 [ - + + - ]: 29 : ABI_ERROR(msg)
1245 : : END SELECT
1246 : : !
1247 : : ! Diagonal approximation or full matrix?
1248 : 29 : BSp%use_diagonal_Wgg = .TRUE.
1249 [ + - ]: 29 : if (Bsp%wtype /= BSE_WTYPE_NONE) then
1250 : 2 : SELECT CASE (first_dig)
1251 : : CASE (0)
1252 : 2 : call wrtout(std_out,"Using diagonal approximation W_GG")
1253 : 2 : BSp%use_diagonal_Wgg = .TRUE.
1254 : : CASE (1)
1255 : 27 : call wrtout(std_out,"Using full W_GG' matrix ")
1256 : 27 : BSp%use_diagonal_Wgg = .FALSE.
1257 : : CASE DEFAULT
1258 : 0 : write(msg,'(a,i0)')" Wrong first digit in bs_coulomb_term: ",Dtset%bs_coulomb_term
1259 [ + + - ]: 29 : ABI_ERROR(msg)
1260 : : END SELECT
1261 : : end if
1262 : :
1263 : : !TODO move the initialization of the parameters for the interpolation in setup_bse_interp
1264 : :
1265 : : BSp%use_interp = .FALSE.
1266 : 29 : BSp%interp_mode = BSE_INTERP_YG
1267 [ + + ]: 116 : BSp%interp_kmult(1:3) = 0
1268 : : BSp%prep_interp = .FALSE.
1269 : 29 : BSp%sum_overlaps = .TRUE. ! Sum over the overlaps
1270 : :
1271 : : ! Printing ncham
1272 : 29 : BSp%prt_ncham = .FALSE.
1273 : :
1274 : : ! Deactivate Interpolation Technique by default
1275 : : ! if (.FALSE.) then
1276 : :
1277 : : ! Reading parameters from the input file
1278 : 29 : BSp%use_interp = (dtset%bs_interp_mode /= 0)
1279 : 29 : BSp%prep_interp = (dtset%bs_interp_prep == 1)
1280 : :
1281 : 2 : SELECT CASE (dtset%bs_interp_mode)
1282 : : CASE (0)
1283 : : ! No interpolation, do not print anything !
1284 : : CASE (1)
1285 : 2 : call wrtout(std_out,"Using interpolation technique with energies and wavefunctions from dense WFK")
1286 : : CASE (2)
1287 : 1 : call wrtout(std_out,"Interpolation technique with energies and wfn on dense WFK + treatment ABC of divergence")
1288 : : CASE (3)
1289 : 1 : call wrtout(std_out,"Interpolation technique + divergence ABC along diagonal")
1290 : : CASE (4)
1291 : 0 : call wrtout(std_out,"Using interpolation technique mode 1 with full computation of hamiltonian")
1292 : : CASE DEFAULT
1293 [ + + + - : 29 : ABI_ERROR(sjoin("Wrong interpolation mode for bs_interp_mode:", itoa(dtset%bs_interp_mode)))
- + ]
1294 : : END SELECT
1295 : :
1296 : : ! Read from dtset
1297 [ + + ]: 29 : if(BSp%use_interp) then
1298 : 4 : BSp%interp_method = dtset%bs_interp_method
1299 : 4 : BSp%rl_nb = dtset%bs_interp_rl_nb
1300 : 4 : BSp%interp_m3_width = dtset%bs_interp_m3_width
1301 [ + + ]: 16 : BSp%interp_kmult(1:3) = dtset%bs_interp_kmult(1:3)
1302 : 4 : BSp%interp_mode = dtset%bs_interp_mode
1303 : : end if
1304 : :
1305 : : ! Dimensions and parameters of the calculation.
1306 : : ! TODO one should add npwx as well
1307 : : !BSp%npweps=Dtset%npweps
1308 : : !BSp%npwwfn=Dtset%npwwfn
1309 : :
1310 [ - + + - : 87 : ABI_MALLOC(Bsp%lomo_spin, (Bsp%nsppol))
+ - + - -
+ - + -
+ ]
1311 [ - + + - : 58 : ABI_MALLOC(Bsp%homo_spin, (Bsp%nsppol))
- + - + -
+ ]
1312 [ - + + - : 58 : ABI_MALLOC(Bsp%lumo_spin, (Bsp%nsppol))
- + - + -
+ ]
1313 [ - + + - : 58 : ABI_MALLOC(Bsp%humo_spin, (Bsp%nsppol))
- + - + -
+ ]
1314 [ - + + - : 58 : ABI_MALLOC(Bsp%nbndv_spin, (Bsp%nsppol))
- + - + -
+ ]
1315 [ - + + - : 58 : ABI_MALLOC(Bsp%nbndc_spin, (Bsp%nsppol))
- + - + -
+ ]
1316 : :
1317 : : ! FIXME use bs_loband(nsppol)
1318 [ + - - + : 88 : Bsp%lomo_spin = Dtset%bs_loband
- - - - +
+ ]
1319 : : !write(std_out,*)"bs_loband",Dtset%bs_loband
1320 : : !if (Bsp%nsppol == 2) Bsp%lomo_spin(2) = Dtset%bs_loband
1321 : :
1322 : : ! Check lomo correct only for unpolarized semiconductors
1323 : : !if (Dtset%nsppol == 1 .and. Bsp%lomo > Dtset%nelect/2) then
1324 : : ! write(msg,'(a,i0,a,f8.3)') " Bsp%lomo = ",Bsp%lomo," cannot be greater than nelect/2 = ",Dtset%nelect/2
1325 : : ! ABI_ERROR(msg)
1326 : : !end if
1327 : : !
1328 : : ! ==============================================
1329 : : ! ==== Setup of the q for the optical limit ====
1330 : : ! ==============================================
1331 : 29 : Bsp%inclvkb = Dtset%inclvkb
1332 : :
1333 [ + - ]: 29 : if (Dtset%gw_nqlwl == 0) then
1334 : : ! Predefined list of 6 q-versors (b vectors and Cart axis)
1335 [ - + ]: 29 : call cryst%get_redcart_qdirs(Bsp%nq, Bsp%q)
1336 : : else
1337 : 0 : BSp%nq = Dtset%gw_nqlwl
1338 [ # # # # : 0 : ABI_MALLOC(BSp%q, (3,BSp%nq))
# # # # #
# # # #
# ]
1339 [ # # # # : 0 : BSp%q = Dtset%gw_qlwl
# # # # #
# # # # #
# # ]
1340 [ # # ]: 0 : do iq=1,BSp%nq ! normalization
1341 : 0 : qnorm = normv(BSp%q(:,iq), Cryst%gmet,"G")
1342 [ # # ]: 0 : BSp%q(:,iq) = BSp%q(:,iq) / qnorm
1343 : : end do
1344 : : end if
1345 : :
1346 : : ! ======================================================
1347 : : ! === Define the flags defining the calculation type ===
1348 : : ! ======================================================
1349 : 29 : Bsp%calc_type = Dtset%bs_calctype
1350 : :
1351 : 29 : BSp%mbpt_sciss = zero ! Shall we use the scissors operator to open the gap?
1352 [ + - ]: 29 : if (ABS(Dtset%mbpt_sciss)>tol6) BSp%mbpt_sciss = Dtset%mbpt_sciss
1353 : :
1354 : : ! Now test input parameters from input and WFK file and assume some defaults
1355 : : !
1356 : : ! TODO Add the possibility of using a randomly shifted k-mesh with nsym>1.
1357 : : ! so that densities and potentials are correctly symmetrized but
1358 : : ! the list of the k-point in the IBZ is not expanded.
1359 : :
1360 [ - + ]: 29 : if (mband < Dtset%nband(1)) then
1361 : : write(msg,'(2(a,i0),3a,i0)')&
1362 : 0 : 'WFK file contains only ', mband,' levels instead of ',Dtset%nband(1),' required;',ch10,&
1363 : 0 : 'The calculation will be done with nbands= ',mband
1364 : 0 : ABI_WARNING(msg)
1365 [ # # ]: 0 : Dtset%nband(:) = mband
1366 : : end if
1367 : :
1368 : 29 : BSp%nbnds = Dtset%nband(1) ! TODO Note the change in the meaning of input variables
1369 : :
1370 [ - + ]: 29 : if (BSp%nbnds<=Dtset%nelect/2) then
1371 : : write(msg,'(2a,a,i0,a,f8.2)')&
1372 : 0 : 'BSp%nbnds cannot be smaller than homo ',ch10,&
1373 : 0 : 'while BSp%nbnds = ',BSp%nbnds,' and Dtset%nelect = ',Dtset%nelect
1374 : 0 : ABI_ERROR(msg)
1375 : : end if
1376 : :
1377 : : !TODO add new dim for exchange part and consider the possibility of having npwsigx > npwwfn (see setup_sigma).
1378 : :
1379 : : ! === Build enlarged G-sphere for the exchange part ===
1380 : 29 : call Gsph_c%extend(Cryst, Dtset%ecutwfn, Gsph_x)
1381 [ + + ]: 58 : call Gsph_x%print([std_out], prtvol=Dtset%prtvol)
1382 : :
1383 : : ! NPWVEC as the biggest between npweps and npwwfn. MG RECHECK this part.
1384 : : !BSp%npwwfn = Dtset%npwwfn
1385 : 29 : Bsp%npwwfn = Gsph_x%ng ! FIXME temporary hack
1386 : 29 : BSp%npwvec=MAX(BSp%npwwfn,BSp%npweps)
1387 : 29 : Bsp%ecutwfn = Dtset%ecutwfn
1388 : :
1389 : : ! Compute Coulomb term on the largest G-sphere.
1390 [ + - ]: 29 : if (Gsph_x%ng > Gsph_c%ng ) then
1391 : : call Vcp%init(Gsph_x,Cryst,Qmesh,Kmesh,Dtset%gw_rcut,Dtset%gw_icutcoul,Dtset%vcutgeo,Dtset%ecutsigx,Gsph_x%ng,&
1392 : 29 : nqlwl,qlwl,comm)
1393 : : else
1394 : : call Vcp%init(Gsph_c,Cryst,Qmesh,Kmesh,Dtset%gw_rcut,Dtset%gw_icutcoul,Dtset%vcutgeo,Dtset%ecutsigx,Gsph_c%ng,&
1395 : 0 : nqlwl,qlwl,comm)
1396 : : end if
1397 : :
1398 [ - + ]: 29 : ABI_FREE(qlwl)
1399 : :
1400 [ + + ]: 928 : bantot=SUM(Dtset%nband(1:Dtset%nkpt*Dtset%nsppol))
1401 [ - + + - : 6060 : ABI_CALLOC(doccde,(bantot))
+ - + - -
+ - + +
+ ]
1402 [ - + + - : 6031 : ABI_CALLOC(eigen,(bantot))
- + - + +
+ ]
1403 [ - + + - : 6031 : ABI_CALLOC(occfact,(bantot))
- + - + +
+ ]
1404 : :
1405 : : ! Get occupation from input if occopt == 2
1406 : 29 : occ_from_dtset = (Dtset%occopt == 2)
1407 : :
1408 : 29 : jj=0; ibtot=0
1409 [ + + ]: 59 : do isppol=1,Dtset%nsppol
1410 [ + + ]: 958 : do ik_ibz=1,Dtset%nkpt
1411 [ + + ]: 15425 : do ib=1,Hdr_wfk%nband(ik_ibz+(isppol-1)*Dtset%nkpt)
1412 : 14496 : ibtot=ibtot+1
1413 [ + + ]: 15395 : if (ib<=BSP%nbnds) then
1414 : 5973 : jj=jj+1
1415 : 5973 : eigen (jj)=energies_p(ib,ik_ibz,isppol)
1416 [ - + ]: 5973 : if (occ_from_dtset) then
1417 : : !Not occupations must be the same for different images
1418 : 0 : occfact(jj)=Dtset%occ_orig(ibtot,1)
1419 : : else
1420 : 5973 : occfact(jj)=Hdr_wfk%occ(ibtot)
1421 : : end if
1422 : : end if
1423 : : end do
1424 : : end do
1425 : : end do
1426 : :
1427 [ - + ]: 29 : ABI_FREE(energies_p)
1428 : : !
1429 : : ! Make sure that Dtset%wtk==Kmesh%wt due to the dirty treatment of
1430 : : ! symmetry operations in the old GW code (symmorphy and inversion)
1431 [ + + + - ]: 926 : ltest=(ALL(ABS(Dtset%wtk(1:Kmesh%nibz)-Kmesh%wt(1:Kmesh%nibz))<tol6))
1432 [ - + ]: 29 : ABI_CHECK(ltest,'Mismatch between Dtset%wtk and Kmesh%wt')
1433 : :
1434 [ - + + - : 87 : ABI_MALLOC(npwarr,(Dtset%nkpt))
+ - + - -
+ - + ]
1435 [ + + ]: 926 : npwarr=BSP%npwwfn
1436 : :
1437 : : call ks_ebands%init(bantot, Dtset%nelect,Dtset%ne_qFD,Dtset%nh_qFD,Dtset%ivalence,&
1438 : : doccde,eigen,Dtset%istwfk,Kmesh%ibz,Dtset%nband,&
1439 : : Kmesh%nibz,npwarr,Dtset%nsppol,Dtset%nspinor,Dtset%tphysel,Dtset%tsmear,Dtset%occopt,occfact,Kmesh%wt,&
1440 : : dtset%cellcharge(1), dtset%kptopt, dtset%kptrlatt_orig, dtset%nshiftk_orig, dtset%shiftk_orig, &
1441 : 29 : dtset%kptrlatt, dtset%nshiftk, dtset%shiftk)
1442 : :
1443 [ - + ]: 29 : ABI_FREE(doccde)
1444 [ - + ]: 29 : ABI_FREE(eigen)
1445 [ - + ]: 29 : ABI_FREE(npwarr)
1446 : :
1447 : : !TODO Occupancies are zero if NSCF. One should calculate the occupancies from the energies when
1448 : : ! the occupation scheme for semiconductors is used.
1449 : 29 : call ks_ebands%update_occ(Dtset%spinmagntarget,prtvol=Dtset%prtvol)
1450 [ + + ]: 58 : call ks_ebands%print([std_out], "Band structure read from the WFK file", prtvol=Dtset%prtvol)
1451 : 29 : call ks_ebands%report_gap(header=" KS band structure",unit=std_out,mode_paral="COLL")
1452 : :
1453 [ - + + - : 116 : ABI_MALLOC(val_indices,(ks_ebands%nkpt,ks_ebands%nsppol))
- + + - +
- + - - +
- + - + ]
1454 [ - + ]: 29 : val_indices = ks_ebands%get_valence_idx()
1455 : :
1456 [ + + ]: 59 : do spin=1,ks_ebands%nsppol
1457 : 30 : val_idx(spin) = val_indices(1,spin)
1458 : 30 : write(msg,'(a,i2,a,i0)')" For spin : ",spin," val_idx ",val_idx(spin)
1459 : 30 : call wrtout(std_out,msg)
1460 [ + + + - : 958 : if (any(val_indices(1,spin) /= val_indices(:,spin)) ) then
- + ]
1461 : 0 : ABI_ERROR("BSE code does not support metals")
1462 : : end if
1463 : : end do
1464 : :
1465 [ - + ]: 29 : ABI_FREE(val_indices)
1466 : : !
1467 : : ! === Create the BSE header ===
1468 : 29 : call hdr_bse%init(ks_ebands,codvsn,Dtset,Pawtab,pertcase0,Psps,wvl)
1469 : :
1470 : : ! === Get Pawrhoij from the header of the WFK file ===
1471 [ + + + - : 91 : ABI_MALLOC(Pawrhoij,(Cryst%natom*Dtset%usepaw))
+ - + + -
+ - + - +
+ + + - -
+ - + - +
- + - + -
+ ]
1472 [ + + ]: 29 : if (Dtset%usepaw==1) then
1473 : 2 : call pawrhoij_alloc(Pawrhoij,1,Dtset%nspden,Dtset%nspinor,Dtset%nsppol,Cryst%typat,pawtab=Pawtab)
1474 : 2 : call pawrhoij_copy(Hdr_wfk%Pawrhoij,Pawrhoij)
1475 : : end if
1476 : :
1477 : 29 : call hdr_bse%update(bantot,1.0d20,1.0d20,1.0d20,1.0d20,Cryst%rprimd,occfact,Pawrhoij,Cryst%xred,dtset%amu_orig(:,1))
1478 : :
1479 [ - + ]: 29 : ABI_FREE(occfact)
1480 : :
1481 [ + + ]: 29 : if (Dtset%usepaw==1) call pawrhoij_free(Pawrhoij)
1482 [ + - + + : 33 : ABI_FREE(Pawrhoij)
- + - + -
+ - + - +
- + - + ]
1483 : :
1484 : : ! Find optimal value for G-sphere enlargement due to oscillator matrix elements
1485 : : ! We will split k-points over processors
1486 : 29 : call xmpi_split_work(Kmesh%nbz, comm, my_k1, my_k2)
1487 : :
1488 : : ! If there is no work to do, just skip the computation
1489 [ - + ]: 29 : if (my_k2-my_k1+1 <= 0) then
1490 : 0 : ng0sh_opt(:)=(/zero,zero,zero/)
1491 : : else
1492 : : ! * Here I have to be sure that Qmesh%bz is always inside the BZ, not always true since bz is buggy
1493 : : ! * -one is used because we loop over all the possible differences, unlike screening
1494 : 29 : call get_ng0sh(my_k2-my_k1+1,Kmesh%bz(:,my_k1:my_k2),Kmesh%nbz,Kmesh%bz,Qmesh%nbz,Qmesh%bz,-one,ng0sh_opt)
1495 : : end if
1496 : :
1497 : 29 : call xmpi_max(ng0sh_opt,BSp%mg0,comm,ierr)
1498 : :
1499 : 29 : write(msg,'(a,3(i0,1x))') ' optimal value for ng0sh = ',BSp%mg0
1500 : 29 : call wrtout(std_out,msg)
1501 : :
1502 : : ! === Setup of the FFT mesh for the oscillator strengths ===
1503 : : ! * ngfft_osc(7:18)==Dtset%ngfft(7:18) which is initialized before entering screening.
1504 : : ! * Here we redefine ngfft_osc(1:6) according to the following options :
1505 : : !
1506 : : ! method==0 --> FFT grid read from fft.in (debugging purpose)
1507 : : ! method==1 --> Normal FFT mesh
1508 : : ! method==2 --> Slightly augmented FFT grid to calculate exactly rho_tw_g (see setmesh.F90)
1509 : : ! method==3 --> Doubled FFT grid, same as the the FFT for the density,
1510 : : !
1511 : : ! enforce_sym==1 ==> Enforce a FFT mesh compatible with all the symmetry operation and FFT library
1512 : : ! enforce_sym==0 ==> Find the smallest FFT grid compatible with the library, do not care about symmetries
1513 : : !
1514 [ + + ]: 551 : ngfft_osc(1:18)=Dtset%ngfft(1:18); method=2
1515 [ - + ]: 29 : if (Dtset%fftgw==00 .or. Dtset%fftgw==01) method=0
1516 [ - + ]: 29 : if (Dtset%fftgw==10 .or. Dtset%fftgw==11) method=1
1517 [ + - ]: 29 : if (Dtset%fftgw==20 .or. Dtset%fftgw==21) method=2
1518 [ - + ]: 29 : if (Dtset%fftgw==30 .or. Dtset%fftgw==31) method=3
1519 : 29 : enforce_sym=MOD(Dtset%fftgw,10)
1520 : :
1521 : 29 : call setmesh(gmet,Gsph_x%gvec,ngfft_osc,BSp%npwvec,BSp%npweps,BSp%npwwfn,nfftot_osc,method,BSp%mg0,Cryst,enforce_sym)
1522 [ + + ]: 116 : nfftot_osc=PRODUCT(ngfft_osc(1:3))
1523 : :
1524 [ + + ]: 58 : call print_ngfft([std_out], ngfft_osc, header="FFT mesh for oscillator matrix elements", prtvol=Dtset%prtvol)
1525 : : !
1526 : : ! BSp%homo gives the
1527 : : !BSp%homo = val_idx(1)
1528 : : ! highest occupied band for each spin
1529 [ + - - + : 88 : BSp%homo_spin = val_idx
- - + + ]
1530 : :
1531 : : ! TODO generalize the code to account for this unlikely case.
1532 : : !if (Dtset%nsppol==2) then
1533 : : ! ABI_CHECK(BSp%homo == val_idx(2),"Different valence indices for spin up and down")
1534 : : !end if
1535 : :
1536 : : !BSp%lumo = BSp%homo + 1
1537 : : !BSp%humo = BSp%nbnds
1538 : : !BSp%nbndv = BSp%homo - BSp%lomo + 1
1539 : : !BSp%nbndc = BSp%nbnds - BSp%homo
1540 : :
1541 [ + - - + : 88 : BSp%lumo_spin = BSp%homo_spin + 1
- - + + ]
1542 [ + + ]: 59 : BSp%humo_spin = BSp%nbnds
1543 [ + - - + : 88 : BSp%nbndv_spin = BSp%homo_spin - BSp%lomo_spin + 1
- - + + ]
1544 [ + - - + : 88 : BSp%nbndc_spin = BSp%nbnds - BSp%homo_spin
- - + + ]
1545 [ + + ]: 59 : BSp%maxnbndv = MAXVAL(BSp%nbndv_spin(:))
1546 [ + + ]: 59 : BSp%maxnbndc = MAXVAL(BSp%nbndc_spin(:))
1547 : :
1548 : 29 : BSp%nkbz = Kmesh%nbz
1549 : :
1550 : 29 : call ks_ebands%copy(qp_ebands)
1551 [ - + + - : 145 : ABI_MALLOC(igwene,(qp_ebands%mband,qp_ebands%nkpt,qp_ebands%nsppol))
- + + - -
+ + - + -
+ - - + -
+ ]
1552 [ + + + + : 6931 : igwene=zero
+ + ]
1553 : :
1554 : 29 : call Bsp%calctype2str(msg)
1555 [ + - ]: 29 : call wrtout(std_out,"Calculation type: "//TRIM(msg))
1556 : :
1557 : 58 : SELECT CASE (Bsp%calc_type)
1558 : : CASE (BSE_HTYPE_RPA_KS)
1559 [ + - ]: 29 : if (ABS(BSp%mbpt_sciss)>tol6) then
1560 : 29 : write(msg,'(a,f8.2,a)')' Applying a scissors operator energy= ',BSp%mbpt_sciss*Ha_eV," [eV] on top of the KS energies."
1561 : 29 : call wrtout(std_out,msg)
1562 : 29 : call qp_ebands%apply_scissors(BSp%mbpt_sciss)
1563 : : else
1564 : 0 : write(msg,'(a,f8.2,a)')' Using KS energies since mbpt_sciss= ',BSp%mbpt_sciss*Ha_eV," [eV]."
1565 : 0 : call wrtout(std_out,msg)
1566 : : end if
1567 : :
1568 : : CASE (BSE_HTYPE_RPA_QPENE) ! Read _GW files with the corrections TODO here I should introduce variable getgw
1569 [ # # # # ]: 0 : gw_fname=TRIM(Dtfil%filnam_ds(4))//'_GW'
1570 : 0 : gw_fname="__in.gw__"
1571 [ # # ]: 0 : if (.not.file_exists(gw_fname)) then
1572 [ # # ]: 0 : msg = " File "//TRIM(gw_fname)//" not found. Aborting now"
1573 : 0 : ABI_ERROR(msg)
1574 : : end if
1575 : :
1576 : 0 : call rdgw(qp_ebands,gw_fname,igwene,extrapolate=.FALSE.) ! here gwenergy is real
1577 : :
1578 [ # # ]: 0 : do isppol=1,Dtset%nsppol
1579 : 0 : write(std_out,*) ' k GW energies [eV]'
1580 [ # # ]: 0 : do ik_ibz=1,Kmesh%nibz
1581 [ # # # # ]: 0 : write(std_out,'(i3,7x,10f7.2/50(10x,10f7.2/))')ik_ibz,(qp_ebands%eig(ib,ik_ibz,isppol)*Ha_eV,ib=1,BSp%nbnds)
1582 : : end do
1583 : 0 : write(std_out,*) ' k Im GW energies [eV]'
1584 [ # # ]: 0 : do ik_ibz=1,Kmesh%nibz
1585 [ # # # # ]: 0 : write(std_out,'(i3,7x,10f7.2/50(10x,10f7.2/))')ik_ibz,(igwene(ib,ik_ibz,isppol)*Ha_eV,ib=1,BSp%nbnds)
1586 : : end do
1587 : : end do
1588 : : !
1589 : : ! If required apply the scissors operator on top of the QP bands structure (!)
1590 [ # # ]: 0 : if (ABS(BSp%mbpt_sciss)>tol6) then
1591 : 0 : write(msg,'(a,f8.2,a)')' Applying a scissors operator ',BSp%mbpt_sciss*Ha_eV," [eV] on top of the QP energies!"
1592 : 0 : ABI_COMMENT(msg)
1593 : 0 : call qp_ebands%apply_scissors(BSp%mbpt_sciss)
1594 : : end if
1595 : :
1596 : : CASE (BSE_HTYPE_RPA_QP)
1597 : 0 : ABI_ERROR("Not implemented error!")
1598 : :
1599 : : CASE DEFAULT
1600 [ + - - - ]: 29 : ABI_ERROR(sjoin("Unknown value for Bsp%calc_type: ", itoa(Bsp%calc_type)))
1601 : : END SELECT
1602 : :
1603 : 29 : call qp_ebands%report_gap(header=" QP band structure",unit=std_out,mode_paral="COLL")
1604 : :
1605 : : ! Transitions are ALWAYS ordered in c-v-k mode with k being the slowest index.
1606 : : ! FIXME: linewidths not coded.
1607 [ - + + - : 145 : ABI_MALLOC(gw_energy,(BSp%nbnds,Kmesh%nibz,Dtset%nsppol))
- + + - -
+ + - + -
+ - - + -
+ ]
1608 [ + - + - : 6960 : gw_energy = qp_ebands%eig
+ - - + -
- - - - -
- - + + +
+ + + ]
1609 : :
1610 [ + + + + : 6931 : BSp%have_complex_ene = ANY(igwene > tol16)
+ + + - ]
1611 : :
1612 : : ! Compute the number of resonant transitions, nreh, for the two spin channels and initialize BSp%Trans.
1613 [ - + + - : 87 : ABI_MALLOC(Bsp%nreh,(Bsp%nsppol))
+ - + - -
+ - + -
+ ]
1614 : :
1615 : : ! Possible cutoff on the transitions.
1616 : 29 : BSp%ircut = Dtset%bs_eh_cutoff(1)
1617 : 29 : BSp%uvcut = Dtset%bs_eh_cutoff(2)
1618 : :
1619 : : call init_transitions(BSp%Trans,BSp%lomo_spin,BSp%humo_spin,BSp%ircut,Bsp%uvcut,BSp%nkbz,Bsp%nbnds,Bsp%nkibz,&
1620 [ - + ]: 29 : BSp%nsppol,Dtset%nspinor,gw_energy,qp_ebands%occ,Kmesh%tab,minmax_tene,Bsp%nreh)
1621 : :
1622 : : ! Setup of the frequency mesh for the absorption spectrum.
1623 : : ! If not specified, use the min-max resonant transition energy and make it 10% smaller|larger.
1624 : :
1625 : : !if (ABS(Dtset%bs_freq_mesh(1)) < tol6) then
1626 : : ! Dtset%bs_freq_mesh(1) = MAX(minmax_tene(1) - minmax_tene(1) * 0.1, zero)
1627 : : !end if
1628 : :
1629 [ + + ]: 29 : if (ABS(Dtset%bs_freq_mesh(2)) < tol6) then
1630 : 2 : Dtset%bs_freq_mesh(2) = minmax_tene(2) + minmax_tene(2) * 0.1
1631 : : end if
1632 : :
1633 : 29 : Bsp%omegai = Dtset%bs_freq_mesh(1)
1634 : 29 : Bsp%omegae = Dtset%bs_freq_mesh(2)
1635 : 29 : Bsp%domega = Dtset%bs_freq_mesh(3)
1636 : 29 : BSp%broad = Dtset%zcut
1637 : :
1638 : : ! The frequency mesh (including the complex imaginary shift)
1639 : 29 : BSp%nomega = (BSp%omegae - BSp%omegai)/BSp%domega + 1
1640 [ - + + - : 87 : ABI_MALLOC(BSp%omega,(BSp%nomega))
+ - + - -
+ - + -
+ ]
1641 [ + + ]: 9759 : do io=1,BSp%nomega
1642 : 9759 : BSp%omega(io) = (BSp%omegai + (io-1)*BSp%domega) + j_dpc*BSp%broad
1643 : : end do
1644 : :
1645 [ - + ]: 29 : ABI_FREE(gw_energy)
1646 [ - + ]: 29 : ABI_FREE(igwene)
1647 : :
1648 [ + + ]: 59 : do spin=1,Bsp%nsppol
1649 : 30 : write(msg,'(a,i2,a,i0)')" For spin: ",spin,' the number of resonant e-h transitions is: ',BSp%nreh(spin)
1650 : 59 : call wrtout(std_out,msg)
1651 : : end do
1652 : :
1653 [ + + + - : 59 : if (ANY(Bsp%nreh/=Bsp%nreh(1))) then
- + ]
1654 : 0 : write(msg,'(a,2(i0,1x))')" BSE code with different number of transitions for the two spin channels: ",Bsp%nreh
1655 : 0 : ABI_WARNING(msg)
1656 : : end if
1657 : : !
1658 : : ! Create transition table vcks2t
1659 [ + + ]: 59 : Bsp%lomo_min = MINVAL(BSp%lomo_spin)
1660 [ + + ]: 59 : Bsp%homo_max = MAXVAL(BSp%homo_spin)
1661 [ + + ]: 59 : Bsp%lumo_min = MINVAL(BSp%lumo_spin)
1662 [ + + ]: 59 : Bsp%humo_max = MAXVAL(BSp%humo_spin)
1663 : :
1664 [ - + + - : 174 : ABI_MALLOC(Bsp%vcks2t,(BSp%lomo_min:BSp%homo_max,BSp%lumo_min:BSp%humo_max,BSp%nkbz,Dtset%nsppol))
- + + - -
+ + - - +
+ - + - +
- - + - +
- + ]
1665 [ + + + + : 15147 : Bsp%vcks2t = 0
+ + + + ]
1666 : :
1667 [ + + ]: 59 : do spin=1,BSp%nsppol
1668 [ + + ]: 10459 : do it=1,BSp%nreh(spin)
1669 : 10430 : BSp%vcks2t(BSp%Trans(it,spin)%v,BSp%Trans(it,spin)%c,BSp%Trans(it,spin)%k,spin) = it
1670 : : end do
1671 : : end do
1672 : :
1673 [ + + + + ]: 59 : hexc_size = SUM(Bsp%nreh); if (Bsp%use_coupling>0) hexc_size=2*hexc_size
1674 [ + + ]: 29 : if (Bsp%nstates<=0) then
1675 : 27 : Bsp%nstates=hexc_size
1676 : : else
1677 [ - + ]: 2 : if (Bsp%nstates>hexc_size) then
1678 : 0 : Bsp%nstates=hexc_size
1679 : : write(msg,'(2(a,i0),2a)')&
1680 : 0 : "Since the total size of excitonic Hamiltonian ",hexc_size," is smaller than Bsp%nstates ",Bsp%nstates,ch10,&
1681 : 0 : "the number of excitonic states nstates has been modified"
1682 : 0 : ABI_WARNING(msg)
1683 : : end if
1684 : : end if
1685 : :
1686 : 29 : msg=' Fundamental parameters for the solution of the Bethe-Salpeter equation:'
1687 : 29 : call BSp%print(unit=std_out,header=msg,mode_paral="COLL",prtvol=Dtset%prtvol)
1688 : 29 : call BSp%print(unit=ab_out, header=msg,mode_paral="COLL")
1689 : :
1690 [ + + + + : 464 : if (ANY(Cryst%symrec(:,:,1) /= RESHAPE ( (/1,0,0,0,1,0,0,0,1/),(/3,3/) )) .or. ANY( ABS(Cryst%tnons(:,1)) > tol6) ) then
+ - + + +
- - + ]
1691 : : write(msg,'(3a,9i2,2a,3f6.3,2a)')&
1692 : 0 : "The first symmetry operation should be the Identity with zero tnons while ",ch10,&
1693 : 0 : "symrec(:,:,1) = ",Cryst%symrec(:,:,1),ch10,&
1694 : 0 : "tnons(:,1) = ",Cryst%tnons(:,1),ch10,&
1695 : 0 : "This is not allowed, sym_rhotwgq0 should be changed."
1696 : 0 : ABI_ERROR(msg)
1697 : : end if
1698 : : !
1699 : : ! Prefix for generic output files.
1700 : 29 : BS_files%out_basename = TRIM(Dtfil%filnam_ds(4))
1701 : : !
1702 : : ! Search for files to restart from.
1703 [ + - - + ]: 29 : if (Dtset%gethaydock/=0 .or. Dtset%irdhaydock/=0) then
1704 : 0 : BS_files%in_haydock_basename = TRIM(Dtfil%fnameabi_haydock)
1705 : : end if
1706 : :
1707 : 29 : test_file = Dtfil%fnameabi_bsham_reso
1708 [ + + ]: 29 : if (file_exists(test_file)) then
1709 : 7 : BS_files%in_hreso = test_file
1710 : : else
1711 [ + - + - ]: 22 : BS_files%out_hreso = TRIM(Dtfil%filnam_ds(4))//'_BSR'
1712 : : end if
1713 : :
1714 : 29 : test_file = Dtfil%fnameabi_bsham_coup
1715 [ - + ]: 29 : if (file_exists(test_file) ) then
1716 : 0 : BS_files%in_hcoup = test_file
1717 : : else
1718 [ + - + - ]: 29 : BS_files%out_hcoup = TRIM(Dtfil%filnam_ds(4))//'_BSC'
1719 : : end if
1720 : : !
1721 : : ! in_eig is the name of the input file with eigenvalues and eigenvectors
1722 : : ! constructed from getbseig or irdbseig. out_eig is the name of the output file
1723 : : ! produced by this dataset. in_eig_exists checks for the presence of the input file.
1724 : : !
1725 [ - + ]: 29 : if (file_exists(Dtfil%fnameabi_bseig)) then
1726 : 0 : BS_files%in_eig = Dtfil%fnameabi_bseig
1727 : : else
1728 [ + - ]: 29 : BS_files%out_eig = TRIM(BS_files%out_basename)//"_BSEIG"
1729 : : end if
1730 : :
1731 : 29 : call BS_files%print(unit=std_out)
1732 : : !
1733 : : ! ==========================================================
1734 : : ! ==== Temperature dependence of the spectrum ==============
1735 : : ! ==========================================================
1736 : 29 : BSp%do_ep_renorm = .FALSE.
1737 : 29 : BSp%do_lifetime = .FALSE. ! Not yet implemented
1738 : :
1739 : 29 : ep_nc_fname = 'test_EP.nc'
1740 [ + + ]: 29 : if(file_exists(ep_nc_fname)) then
1741 : 2 : BSp%do_ep_renorm = .TRUE.
1742 [ + - ]: 2 : if(my_rank == master) call eprenorms_from_epnc(Epren,ep_nc_fname)
1743 : 2 : call eprenorms_bcast(Epren,master,comm)
1744 : : end if
1745 : : !
1746 : : ! ==========================================================
1747 : : ! ==== Final check on the parameters of the calculation ====
1748 : : ! ==========================================================
1749 [ + + - + ]: 29 : if ( Bsp%use_coupling>0 .and. ALL(Bsp%algorithm /= [BSE_ALGO_DDIAGO, BSE_ALGO_HAYDOCK]) ) then
1750 : 0 : ABI_ERROR("Resonant+Coupling is only available with the direct diagonalization or the haydock method.")
1751 : : end if
1752 : :
1753 : : ! autoparal section
1754 [ - + - - ]: 29 : if (dtset%max_ncpus /=0 .and. dtset%autoparal /=0 ) then
1755 : 0 : ount = ab_out
1756 : : ! TODO:
1757 : : ! nsppol and calculation with coupling!
1758 : :
1759 : : ! Temporary table needed to estimate memory
1760 [ # # # # : 0 : ABI_MALLOC(nlmn_atm,(Cryst%natom))
# # # # #
# # # ]
1761 [ # # ]: 0 : if (Dtset%usepaw==1) then
1762 [ # # ]: 0 : do iat=1,Cryst%natom
1763 : 0 : nlmn_atm(iat)=Pawtab(Cryst%typat(iat))%lmn_size
1764 : : end do
1765 : : end if
1766 : :
1767 [ # # ]: 0 : tot_nreh = SUM(BSp%nreh)
1768 : 0 : work_size = tot_nreh * (tot_nreh + 1) / 2
1769 : :
1770 : 0 : write(ount,'(a)')"--- !Autoparal"
1771 : 0 : write(ount,"(a)")'#Autoparal section for Bethe-Salpeter runs.'
1772 : :
1773 : 0 : write(ount,"(a)") "info:"
1774 : 0 : write(ount,"(a,i0)")" autoparal: ",dtset%autoparal
1775 : 0 : write(ount,"(a,i0)")" max_ncpus: ",dtset%max_ncpus
1776 : 0 : write(ount,"(a,i0)")" nkibz: ",Bsp%nkibz
1777 : 0 : write(ount,"(a,i0)")" nkbz: ",Bsp%nkbz
1778 : 0 : write(ount,"(a,i0)")" nsppol: ",dtset%nsppol
1779 : 0 : write(ount,"(a,i0)")" nspinor: ",dtset%nspinor
1780 : 0 : write(ount,"(a,i0)")" lomo_min: ",Bsp%lomo_min
1781 : 0 : write(ount,"(a,i0)")" humo_max: ",Bsp%humo_max
1782 : 0 : write(ount,"(a,i0)")" tot_nreh: ",tot_nreh
1783 : : !write(ount,"(a,i0)")" nbnds: ",Ep%nbnds
1784 : :
1785 : : ! Wavefunctions are not distributed. We read all the bands
1786 : : ! from 1 up to Bsp%nbnds because we have to recompute rhor
1787 : : ! but then we deallocate all the states that are not used for the construction of the e-h
1788 : : ! before allocating the EXC hamiltonian. Hence we can safely use (humo - lomo + 1) instead of Bsp%nbnds.
1789 : : !my_nbks = (Bsp%humo - Bsp%lomo +1) * Bsp%nkibz * Dtset%nsppol
1790 : :
1791 : : ! This one overestimates the memory but it seems to be safer.
1792 : 0 : my_nbks = Bsp%nbnds * Dtset%nkpt * Dtset%nsppol
1793 : :
1794 : : ! Memory needed for Fourier components ug.
1795 : 0 : ug_mem = two*gwp*Dtset%nspinor*Bsp%npwwfn*my_nbks*b2Mb
1796 : :
1797 : : ! Memory needed for real space ur.
1798 : 0 : ur_mem = zero
1799 [ # # ]: 0 : if (MODULO(Dtset%gwmem,10)==1) then
1800 : 0 : ur_mem = two*gwp*Dtset%nspinor*nfftot_osc*my_nbks*b2Mb
1801 : : end if
1802 : :
1803 : : ! Memory needed for PAW projections Cprj
1804 : 0 : cprj_mem = zero
1805 [ # # # # ]: 0 : if (Dtset%usepaw==1) cprj_mem = dp*Dtset%nspinor*SUM(nlmn_atm)*my_nbks*b2Mb
1806 : :
1807 : 0 : wfsmem_mb = ug_mem + ur_mem + cprj_mem
1808 : :
1809 : : ! Non-scalable memory in Mb i.e. memory that is not distributed with MPI: wavefunctions + W
1810 : 0 : nonscal_mem = (wfsmem_mb + two*gwp*BSp%npweps**2*b2Mb) * 1.1_dp
1811 : :
1812 : : ! List of configurations.
1813 : 0 : write(ount,"(a)")"configurations:"
1814 [ # # ]: 0 : do il=1,dtset%max_ncpus
1815 [ # # ]: 0 : if (il > work_size) cycle
1816 : 0 : neh_per_proc = work_size / il
1817 : 0 : neh_per_proc = neh_per_proc + MOD(work_size, il)
1818 : 0 : eff = (one * work_size) / (il * neh_per_proc)
1819 : :
1820 : : ! EXC matrix is distributed.
1821 : 0 : mempercpu_mb = nonscal_mem + two * dp * neh_per_proc * b2Mb
1822 : :
1823 : 0 : write(ount,"(a,i0)")" - tot_ncpus: ",il
1824 : 0 : write(ount,"(a,i0)")" mpi_ncpus: ",il
1825 : : !write(ount,"(a,i0)")" omp_ncpus: ",omp_ncpus
1826 : 0 : write(ount,"(a,f12.9)")" efficiency: ",eff
1827 : 0 : write(ount,"(a,f12.2)")" mem_per_cpu: ",mempercpu_mb
1828 : : end do
1829 : :
1830 : 0 : write(ount,'(a)')"..."
1831 : :
1832 [ # # ]: 0 : ABI_FREE(nlmn_atm)
1833 : 0 : ABI_ERROR_NODUMP("aborting now")
1834 : : end if
1835 : :
1836 : : DBG_EXIT("COLL")
1837 : :
1838 [ - + - + : 87 : end subroutine setup_bse
- + - - -
- - - - -
- - - - -
- - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - -
- - - - -
- - - - -
- - ]
1839 : : !!***
1840 : :
1841 : : !!****f* m_bethe_salpeter/setup_bse_interp
1842 : : !! NAME
1843 : : !! setup_bse_interp
1844 : : !!
1845 : : !! FUNCTION
1846 : : !!
1847 : : !! INPUTS
1848 : : !! ngfft_gw(18)=Information about 3D FFT for density and potentials, see ~abinit/doc/variables/vargs.htm#ngfft
1849 : : !! acell(3)=Length scales of primitive translations (bohr)
1850 : : !! rprim(3,3)=Dimensionless real space primitive translations.
1851 : : !! Dtset<dataset_type>=All input variables for this dataset.
1852 : : !! Some of them might be redefined here TODO
1853 : : !! Dtfil=filenames and unit numbers used in abinit. fnameabi_wfkfile is changed is Fortran file is not
1854 : : !! found but a netcdf version with similar name is available.
1855 : : !!
1856 : : !! OUTPUT
1857 : : !! Cryst<crystal_structure>=Info on the crystalline Structure.
1858 : : !! Kmesh<BZ_mesh_type>=Structure defining the k-sampling for the wavefunctions.
1859 : : !! Qmesh<BZ_mesh_type>=Structure defining the q-sampling for the symmetrized inverse dielectric matrix.
1860 : : !! Gsph_x<gsphere_t=Data type gathering info on the G-sphere for wave functions and e^{-1},
1861 : : !! ks_ebands<Bandstructure_type>=The KS band structure (energies, occupancies, k-weights...)
1862 : : !! Vcp<vcoul_t>=Structure gathering information on the Coulomb interaction in reciprocal space,
1863 : : !! including a possible cutoff in real space.
1864 : : !! ngfft_osc(18)=Contain all needed information about the 3D FFT for the oscillator matrix elements.
1865 : : !! See ~abinit/doc/variables/vargs.htm#ngfft
1866 : : !! Bsp<excparam>=Basic parameters defining the Bethe-Salpeter run. Completely initialed in output.
1867 : : !! Hdr_wfk<Hdr_type>=The header of the WFK file.
1868 : : !! Hdr_bse<Hdr_type>=Local header initialized from the parameters used for the Bethe-Salpeter calculation.
1869 : : !! w_file=File name used to construct W. Set to ABI_NOFILE if no external file is used.
1870 : : !!
1871 : : !! SOURCE
1872 : :
1873 [ - + - + : 196 : subroutine setup_bse_interp(Dtset,Dtfil,BSp,Cryst,Kmesh, &
- + - + -
+ - + - +
- + - + -
+ + + + +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + + + +
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ + + + +
+ + + + +
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - -
- - - - -
- - - - -
- - - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ ]
1874 : : Kmesh_dense,Qmesh_dense,ks_ebands_dense,qp_ebands_dense,Gsph_x,Gsph_c,Vcp_dense,Hdr_wfk_dense,grid,comm)
1875 : :
1876 : : !Arguments ------------------------------------
1877 : : !scalars
1878 : : integer,intent(in) :: comm
1879 : : type(dataset_type),intent(in) :: Dtset
1880 : : type(datafiles_type),intent(inout) :: Dtfil
1881 : : type(excparam),intent(inout) :: Bsp
1882 : : type(hdr_type),intent(out) :: Hdr_wfk_dense
1883 : : type(crystal_t),intent(in) :: Cryst
1884 : : type(kmesh_t),intent(in) :: Kmesh
1885 : : type(kmesh_t),intent(out) :: Kmesh_dense,Qmesh_dense
1886 : : type(ebands_t),intent(out) :: ks_ebands_dense,qp_ebands_dense
1887 : : type(double_grid_t),intent(out) :: grid
1888 : : type(vcoul_t),intent(out) :: Vcp_dense
1889 : : type(gsphere_t),intent(out) :: Gsph_x,Gsph_c
1890 : : !arrays
1891 : :
1892 : : !Local variables ------------------------------
1893 : : !scalars
1894 : : integer,parameter :: pertcase0=0,master=0
1895 : : integer :: bantot_dense,ib,ibtot,ik_ibz,isppol,jj, nqlwl
1896 : : integer :: nbnds_kss_dense, spin,hexc_size, my_rank, it, nprocs, is1,is2,is3,is4
1897 : : real(dp) :: nelect_hdr_dense
1898 : : logical,parameter :: remove_inv=.FALSE.
1899 : : character(len=500) :: msg
1900 : : character(len=fnlen) :: wfk_fname_dense
1901 : : !arrays
1902 : : integer :: kptrlatt_dense(3,3), units(2)
1903 : 4 : integer,allocatable :: npwarr(:), nbands_temp(:)
1904 : : real(dp) :: minmax_tene(2)
1905 : 4 : real(dp),allocatable :: shiftk(:,:), doccde(:),eigen(:),occfact(:)
1906 : 4 : real(dp),pointer :: energies_p_dense(:,:,:)
1907 : 4 : real(dp),allocatable :: qlwl(:,:)
1908 : 4 : complex(dp),allocatable :: gw_energy(:,:,:)
1909 : : !************************************************************************
1910 : :
1911 : : DBG_ENTER("COLL")
1912 : :
1913 : 4 : kptrlatt_dense = zero
1914 [ + + ]: 12 : units = [std_out, ab_out]
1915 : :
1916 : 4 : my_rank = xmpi_comm_rank(comm); nprocs = xmpi_comm_size(comm)
1917 : :
1918 : 8 : SELECT CASE(BSp%interp_mode)
1919 : : CASE (1,2,3,4)
1920 : : nbnds_kss_dense = -1
1921 : 4 : wfk_fname_dense = Dtfil%fnameabi_wfkfine
1922 [ + - ]: 4 : call wrtout(std_out," BSE Interpolation: will read energies from: "//trim(wfk_fname_dense),"COLL")
1923 : :
1924 [ - + ]: 4 : if (nctk_try_fort_or_ncfile(wfk_fname_dense, msg) /= 0) then
1925 : 0 : ABI_ERROR(msg)
1926 : : end if
1927 : :
1928 : 4 : Dtfil%fnameabi_wfkfine = wfk_fname_dense
1929 : :
1930 : 4 : call wfk_read_eigenvalues(wfk_fname_dense,energies_p_dense,Hdr_wfk_dense,comm)
1931 [ + + ]: 260 : nbnds_kss_dense = MAXVAL(Hdr_wfk_dense%nband)
1932 : : CASE DEFAULT
1933 [ + - ]: 4 : ABI_ERROR("Not yet implemented")
1934 : : END SELECT
1935 : :
1936 : 4 : nelect_hdr_dense = Hdr_wfk_dense%nelect
1937 : :
1938 [ - + ]: 4 : if (ABS(Dtset%nelect-nelect_hdr_dense)>tol6) then
1939 : 0 : write(msg,'(2(a,f8.2))') "File contains ", nelect_hdr_dense," electrons but nelect initialized from input is ",Dtset%nelect
1940 : 0 : ABI_ERROR(msg)
1941 : : end if
1942 : :
1943 : : ! Setup of the k-point list and symmetry tables in the BZ
1944 : 8 : SELECT CASE(BSp%interp_mode)
1945 : : CASE (1,2,3,4)
1946 [ + - ]: 4 : if(Dtset%chksymbreak == 0) then
1947 [ - + + - : 12 : ABI_MALLOC(shiftk,(3,Dtset%nshiftk))
+ - + - -
+ - + ]
1948 [ + + ]: 16 : kptrlatt_dense(:,1) = BSp%interp_kmult(1)*Dtset%kptrlatt(:,1)
1949 [ + + ]: 16 : kptrlatt_dense(:,2) = BSp%interp_kmult(2)*Dtset%kptrlatt(:,2)
1950 [ + + ]: 16 : kptrlatt_dense(:,3) = BSp%interp_kmult(3)*Dtset%kptrlatt(:,3)
1951 [ + + ]: 8 : do jj = 1,Dtset%nshiftk
1952 [ + + ]: 20 : shiftk(:,jj) = Bsp%interp_kmult(:)*Dtset%shiftk(:,jj)
1953 : : end do
1954 : 4 : call make_mesh(Kmesh_dense,Cryst,Dtset%kptopt,kptrlatt_dense,Dtset%nshiftk,shiftk,break_symmetry=.TRUE.)
1955 [ - + ]: 4 : ABI_FREE(shiftk)
1956 : : else
1957 : : !Initialize Kmesh with no wrapping inside ]-0.5;0.5]
1958 : 0 : call Kmesh_dense%init(Cryst,Hdr_wfk_dense%nkpt,Hdr_wfk_dense%kptns,Dtset%kptopt)
1959 : : end if
1960 : : CASE DEFAULT
1961 [ + - ]: 4 : ABI_ERROR("Not yet implemented")
1962 : : END SELECT
1963 : :
1964 : : ! Init Qmesh
1965 : 4 : call Qmesh_dense%find_qmesh(Cryst,Kmesh_dense)
1966 : 4 : call Gsph_c%init(Cryst, 0, ecut=Dtset%ecuteps)
1967 : 4 : call double_grid_init(Kmesh,Kmesh_dense,Dtset%kptrlatt,BSp%interp_kmult,grid)
1968 : :
1969 : 4 : BSp%nkibz_interp = Kmesh_dense%nibz !We might allow for a smaller number of points....
1970 : :
1971 : 4 : call Kmesh_dense%print(units, header="Interpolated K-mesh for the wavefunctions", prtvol=Dtset%prtvol)
1972 : :
1973 [ - + ]: 4 : if (nbnds_kss_dense < Dtset%nband(1)) then
1974 : : write(msg,'(2(a,i0),3a,i0)')&
1975 : 0 : 'Interpolated WFK file contains only ', nbnds_kss_dense,' levels instead of ',Dtset%nband(1),' required;',ch10,&
1976 : 0 : 'The calculation will be done with nbands= ',nbnds_kss_dense
1977 : 0 : ABI_WARNING(msg)
1978 : 0 : ABI_ERROR("Not supported yet !")
1979 : : end if
1980 : :
1981 [ - + + - : 12 : ABI_MALLOC(nbands_temp,(Hdr_wfk_dense%nkpt*Hdr_wfk_dense%nsppol))
+ - + - -
+ - + ]
1982 [ + + ]: 8 : do isppol=1,Hdr_wfk_dense%nsppol
1983 [ + + ]: 264 : do ik_ibz=1,Hdr_wfk_dense%nkpt
1984 : 260 : nbands_temp(ik_ibz+(isppol-1)*Hdr_wfk_dense%nkpt) = Dtset%nband(1)
1985 : : end do
1986 : : end do
1987 : :
1988 : 4 : call Gsph_c%extend(Cryst, Dtset%ecutwfn, Gsph_x)
1989 [ + + ]: 8 : call Gsph_x%print([std_out], prtvol=Dtset%prtvol)
1990 : :
1991 : 4 : nqlwl=1
1992 [ - + ]: 4 : ABI_MALLOC(qlwl,(3,nqlwl))
1993 [ + + ]: 16 : qlwl(:,nqlwl)= GW_Q0_DEFAULT
1994 : :
1995 : : ! Compute Coulomb term on the largest G-sphere.
1996 [ + - ]: 4 : if (Gsph_x%ng > Gsph_c%ng ) then
1997 : : call Vcp_dense%init(Gsph_x,Cryst,Qmesh_dense,Kmesh_dense,Dtset%gw_rcut,Dtset%gw_icutcoul,&
1998 : 4 : Dtset%vcutgeo,Dtset%ecutsigx,Gsph_x%ng,nqlwl,qlwl,comm)
1999 : : else
2000 : : call Vcp_dense%init(Gsph_c,Cryst,Qmesh_dense,Kmesh_dense,Dtset%gw_rcut,Dtset%gw_icutcoul,&
2001 : 0 : Dtset%vcutgeo,Dtset%ecutsigx,Gsph_c%ng,nqlwl,qlwl,comm)
2002 : : end if
2003 : :
2004 [ - + ]: 4 : ABI_FREE(qlwl)
2005 : :
2006 [ + + ]: 260 : bantot_dense=SUM(Hdr_wfk_dense%nband(1:Hdr_wfk_dense%nkpt*Hdr_wfk_dense%nsppol))
2007 [ - + + - : 12 : ABI_MALLOC(doccde,(bantot_dense))
+ - + - -
+ - + ]
2008 [ - + + - : 8 : ABI_MALLOC(eigen,(bantot_dense))
- + - + ]
2009 [ - + + - : 8 : ABI_MALLOC(occfact,(bantot_dense))
- + - + ]
2010 [ + + + + : 26884 : doccde=zero; eigen=zero; occfact=zero
+ + ]
2011 : :
2012 : : jj=0; ibtot=0
2013 [ + + ]: 8 : do isppol=1,Hdr_wfk_dense%nsppol
2014 [ + + ]: 264 : do ik_ibz=1,Hdr_wfk_dense%nkpt
2015 [ + + ]: 9220 : do ib=1,Hdr_wfk_dense%nband(ik_ibz+(isppol-1)*Hdr_wfk_dense%nkpt)
2016 : 8960 : ibtot=ibtot+1
2017 [ + + ]: 9216 : if (ib<=BSP%nbnds) then
2018 : 2048 : jj=jj+1
2019 : 2048 : occfact(jj)=Hdr_wfk_dense%occ(ibtot)
2020 : 2048 : eigen (jj)=energies_p_dense(ib,ik_ibz,isppol)
2021 : : end if
2022 : : end do
2023 : : end do
2024 : : end do
2025 : :
2026 [ - + ]: 4 : ABI_FREE(energies_p_dense)
2027 : :
2028 [ - + + - : 12 : ABI_MALLOC(npwarr,(kmesh_dense%nibz))
+ - + - -
+ - + ]
2029 [ + + ]: 260 : npwarr=BSP%npwwfn
2030 : :
2031 : : call ks_ebands_dense%init(bantot_dense, Dtset%nelect,Dtset%ne_qFD,Dtset%nh_qFD,Dtset%ivalence,&
2032 : : doccde,eigen,Hdr_wfk_dense%istwfk,Kmesh_dense%ibz,nbands_temp,&
2033 : : Kmesh_dense%nibz,npwarr,Hdr_wfk_dense%nsppol,Hdr_wfk_dense%nspinor,Hdr_wfk_dense%tphysel,Hdr_wfk_dense%tsmear,&
2034 : : Hdr_wfk_dense%occopt,occfact,Kmesh_dense%wt,&
2035 : : hdr_wfk_dense%cellcharge, hdr_wfk_dense%kptopt, hdr_wfk_dense%kptrlatt_orig, hdr_wfk_dense%nshiftk_orig, &
2036 : 4 : hdr_wfk_dense%shiftk_orig, hdr_wfk_dense%kptrlatt, hdr_wfk_dense%nshiftk, hdr_wfk_dense%shiftk)
2037 : :
2038 [ - + ]: 4 : ABI_FREE(doccde)
2039 [ - + ]: 4 : ABI_FREE(eigen)
2040 [ - + ]: 4 : ABI_FREE(npwarr)
2041 [ - + ]: 4 : ABI_FREE(nbands_temp)
2042 [ - + ]: 4 : ABI_FREE(occfact)
2043 : :
2044 : : !TODO Occupancies are zero if NSCF. One should calculate the occupancies from the energies when
2045 : : ! the occupation scheme for semiconductors is used.
2046 : 4 : call ks_ebands_dense%update_occ(Dtset%spinmagntarget,prtvol=Dtset%prtvol)
2047 [ + + ]: 8 : call ks_ebands_dense%print([std_out], "Interpolated band structure read from the WFK file", prtvol=Dtset%prtvol)
2048 : 4 : call ks_ebands_dense%report_gap(header="Interpolated KS band structure",unit=std_out,mode_paral="COLL")
2049 : :
2050 : 4 : BSp%nkbz_interp = Kmesh_dense%nbz
2051 : :
2052 : 4 : call ks_ebands_dense%copy(qp_ebands_dense)
2053 : :
2054 : 8 : SELECT CASE (Bsp%calc_type)
2055 : : CASE (BSE_HTYPE_RPA_KS)
2056 [ + - ]: 4 : if (ABS(BSp%mbpt_sciss)>tol6) then
2057 : 4 : write(msg,'(a,f8.2,a)')' Applying a scissors operator energy= ',BSp%mbpt_sciss*Ha_eV," [eV] on top of the KS energies."
2058 : 4 : call wrtout(std_out,msg)
2059 : 4 : call qp_ebands_dense%apply_scissors(BSp%mbpt_sciss)
2060 : : else
2061 : 0 : write(msg,'(a,f8.2,a)')' Using KS energies since mbpt_sciss= ',BSp%mbpt_sciss*Ha_eV," [eV]."
2062 : 0 : call wrtout(std_out,msg)
2063 : : end if
2064 : : !
2065 : : CASE (BSE_HTYPE_RPA_QPENE) ! Read _GW files with the corrections TODO here I should introduce variable getgw
2066 : 0 : ABI_ERROR("Not yet implemented with interpolation !")
2067 : : CASE (BSE_HTYPE_RPA_QP)
2068 : 0 : ABI_ERROR("Not implemented error!")
2069 : : CASE DEFAULT
2070 [ + - - - ]: 4 : ABI_ERROR(sjoin("Unknown value for Bsp%calc_type: ", itoa(Bsp%calc_type)))
2071 : : END SELECT
2072 : :
2073 : 4 : call qp_ebands_dense%report_gap(header=" Interpolated QP band structure",unit=std_out,mode_paral="COLL")
2074 : :
2075 : : ! Transitions are ALWAYS ordered in c-v-k mode with k being the slowest index.
2076 : : ! FIXME: linewidths not coded.
2077 [ - + + - : 20 : ABI_MALLOC(gw_energy, (BSp%nbnds,Kmesh_dense%nibz,Dtset%nsppol))
- + + - -
+ + - + -
+ - - + -
+ ]
2078 [ + - + - : 2316 : gw_energy = qp_ebands_dense%eig
+ - - + -
- - - - -
- - + + +
+ + + ]
2079 : :
2080 [ - + + - : 12 : ABI_MALLOC(Bsp%nreh_interp,(Hdr_wfk_dense%nsppol))
+ - + - -
+ - + -
+ ]
2081 [ + + ]: 8 : Bsp%nreh_interp=zero
2082 : :
2083 : : call init_transitions(BSp%Trans_interp,BSp%lomo_spin,BSp%humo_spin,BSp%ircut,Bsp%uvcut,BSp%nkbz_interp,Bsp%nbnds, &
2084 : : Bsp%nkibz_interp,Hdr_wfk_dense%nsppol,Hdr_wfk_dense%nspinor,gw_energy,qp_ebands_dense%occ, &
2085 [ - + ]: 4 : Kmesh_dense%tab,minmax_tene, Bsp%nreh_interp)
2086 : :
2087 [ - + ]: 4 : ABI_FREE(gw_energy)
2088 : :
2089 [ + + ]: 8 : do spin=1,Dtset%nsppol
2090 : 4 : write(msg,'(a,i2,a,i0)')" For spin: ",spin,' the number of resonant e-h transitions is: ',BSp%nreh_interp(spin)
2091 : 8 : call wrtout(std_out,msg)
2092 : : end do
2093 : :
2094 [ + + + - : 8 : if (ANY(Bsp%nreh_interp/=Bsp%nreh_interp(1))) then
- + ]
2095 : 0 : write(msg,'(a,(i0))')" BSE code does not support different number of transitions for the two spin channels",Bsp%nreh
2096 : 0 : ABI_ERROR(msg)
2097 : : end if
2098 : : !
2099 : : ! Create transition table vcks2t
2100 : 4 : is1=BSp%lomo_min;is2=BSp%homo_max;is3=BSp%lumo_min;is4=BSp%humo_max
2101 [ - + + - : 24 : ABI_MALLOC(Bsp%vcks2t_interp, (is1:is2,is3:is4,BSp%nkbz_interp,Dtset%nsppol))
- + + - -
+ + - - +
+ - + - +
- - + - +
- + ]
2102 [ + + + + : 4360 : Bsp%vcks2t_interp = 0
+ + + + ]
2103 : :
2104 [ + + ]: 8 : do spin=1,Dtset%nsppol
2105 [ + + ]: 3080 : do it=1,BSp%nreh_interp(spin)
2106 : 3076 : BSp%vcks2t_interp(BSp%Trans_interp(it,spin)%v,BSp%Trans_interp(it,spin)%c, BSp%Trans_interp(it,spin)%k,spin) = it
2107 : : end do
2108 : : end do
2109 : :
2110 [ + + - + ]: 8 : hexc_size = SUM(Bsp%nreh_interp); if (Bsp%use_coupling>0) hexc_size=2*hexc_size
2111 [ - + ]: 4 : if (Bsp%nstates_interp<=0) then
2112 : 0 : Bsp%nstates_interp=hexc_size
2113 : : else
2114 [ + - ]: 4 : if (Bsp%nstates_interp>hexc_size) then
2115 : 4 : Bsp%nstates_interp=hexc_size
2116 : : write(msg,'(2(a,i0),2a)')&
2117 : 4 : "Since the total size of excitonic Hamiltonian ",hexc_size," is smaller than Bsp%nstates ",Bsp%nstates_interp,ch10,&
2118 : 8 : "the number of excitonic states nstates has been modified"
2119 : 4 : ABI_WARNING(msg)
2120 : : end if
2121 : : end if
2122 : :
2123 : : DBG_EXIT("COLL")
2124 : :
2125 [ - + ]: 4 : end subroutine setup_bse_interp
2126 : : !!***
2127 : :
2128 : 1152 : end module m_bethe_salpeter
2129 : : !!***
|