Branch data Line data Source code
1 : : !!****m* ABINIT/m_qparticles
2 : : !! NAME
3 : : !! m_qparticles
4 : : !!
5 : : !! FUNCTION
6 : : !! This module contains tools for the IO of the QP file and other procedures
7 : : !! related to the calculation of the quasiparticle amplitudes represented in terms
8 : : !! of KS states.
9 : : !!
10 : : !! COPYRIGHT
11 : : !! Copyright (C) 2008-2026 ABINIT group (FB, MG)
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_qparticles
25 : :
26 : : use defs_basis
27 : : use m_abicore
28 : : use m_hdr
29 : : use m_errors
30 : : use m_nctk
31 : :
32 : : use defs_datatypes, only : pseudopotential_type
33 : : use defs_abitypes, only : MPI_type
34 : : use m_io_tools, only : open_file, file_exists, isncfile
35 : : use m_fstrings, only : int2char10, itoa, sjoin
36 : : use m_numeric_tools, only : linfit, c2r, set2unit, interpol3d_0d, rhophi
37 : : use m_gwdefs, only : sigparams_t
38 : : use m_crystal, only : crystal_t
39 : : use m_bz_mesh, only : kmesh_t
40 : : use m_ebands, only : ebands_t
41 : : use m_sigma, only : sigma_t
42 : : use m_pawtab, only : pawtab_type
43 : : use m_pawrhoij, only : pawrhoij_type, pawrhoij_alloc, pawrhoij_io, pawrhoij_inquire_dim
44 : : use m_fourier_interpol,only : fourier_interpol
45 : :
46 : : implicit none
47 : :
48 : : private
49 : :
50 : : public :: wrqps ! Write a QPS file.
51 : : public :: rdqps ! Read a QPS file.
52 : : public :: show_QP ! Report the components of a QP amplitude in terms of KS eigenstates.
53 : : public :: rdgw ! Read GW corrections from an external file.
54 : : public :: updt_m_ks_to_qp ! Update the matrix of unitary transformation from lda to qp states.
55 : :
56 : : CONTAINS !=======================================================================================
57 : : !!***
58 : :
59 : : !!****f* m_qparticles/wrqps
60 : : !! NAME
61 : : !! wrqps
62 : : !!
63 : : !! FUNCTION
64 : : !! Write the _QPS file containing information on the quasi-particles energies and wavefunctions.
65 : : !!
66 : : !! INPUTS
67 : : !! fname=The name of the file
68 : : !! Sigp<sigparams_t>=Parameters characterizing the self-energy calculation.
69 : : !! %nsppol=1 for unpolarized, 2 for spin-polarized
70 : : !! %nbnds=number of bands used for sigma
71 : : !! Sr<sigma_t>=Structure containing the results of the sigma run.
72 : : !! %en_qp_diago(nbnds,nibz,nsppol)= NEW quasi-particle energies
73 : : !! %eigvec_qp(nbnds,nbnds,nibz,nsppol)= NEW QP amplitudes in the KS basis set
74 : : !! obtained by diagonalizing H0 + Herm(Sigma).
75 : : !! m_ks_to_qp(nbnds,nbnds,nibz,nsppol)= expansion of the OLD QP amplitudes in terms of KS wavefunctions
76 : : !! Kmesh<kmesh_t>=information on the k-point sampling.
77 : : !! %nibz=number of irreducible k-points
78 : : !! %ibz(3,kibz)=reduced coordinates of the irreducible k-points
79 : : !! nfftot=Total number of FFT points for density
80 : : !! ngfftf(18)=Info on the FFT mesh for the density.
81 : : !! nscf=Number of self consistent cycles performed
82 : : !! nspden=number of spin-density components
83 : : !! Cryst<crystal_t>=Structure defining the crystal structure.
84 : : !! Psps<type(pseudopotential_type)>=variables related to pseudopotentials.
85 : : !! Pawrhoij(Cryst%natom*Psps%usepaw)<type(pawrhoij_type)>= rhoij datastructure.
86 : : !! BSt<ebands_t>=Structure containing the band structure energies (only used is nscf==-1)
87 : : !!
88 : : !! OUTPUT
89 : : !! Only writing
90 : : !!
91 : : !! NOTES
92 : : !! Old QPS fileformat:
93 : : !! |
94 : : !! | No. of QPSCF cycles already performed.
95 : : !! | No. of k-points in the IBZ.
96 : : !! | Total number of bands used to construct the Green's function (nbnds)
97 : : !! | nsppol
98 : : !! | For each spin and k-point in the IBZ:
99 : : !! | Reduced coordinates of the k-point.
100 : : !! | for each band:
101 : : !! | QP energies obtained by diagonalizing the QPSCGW Hamiltonian.
102 : : !! | <\psi_{ib,k,s}^{KS}|\psi_{jb,k,s}^{QP}>$, ib=1,nbnds
103 : : !! | FFT dimensions of the fine grid
104 : : !! | QP density in real space.
105 : : !!
106 : : !! SOURCE
107 : :
108 : 55 : subroutine wrqps(fname,Sigp,Cryst,Kmesh,Psps,Pawtab,Pawrhoij,nspden,nscf,nfftot,ngfftf,Sr,Bst,m_ks_to_qp,rho_qp)
109 : :
110 : : !Arguments ------------------------------------
111 : : !scalars
112 : : integer,intent(in) :: nfftot,nscf,nspden
113 : : character(len=*),intent(in) :: fname
114 : : type(kmesh_t),intent(in) :: Kmesh
115 : : type(ebands_t),intent(in) :: BSt
116 : : type(sigparams_t),intent(in) :: Sigp
117 : : type(sigma_t),intent(in) :: Sr
118 : : type(crystal_t),intent(in) :: Cryst
119 : : type(Pseudopotential_type),intent(in) :: Psps
120 : : !arrays
121 : : integer,intent(in) :: ngfftf(18)
122 : : real(dp),intent(in) :: rho_qp(nfftot,nspden)
123 : : complex(dp),intent(in) :: m_ks_to_qp(Sigp%nbnds,Sigp%nbnds,Kmesh%nibz,Sigp%nsppol)
124 : : type(Pawrhoij_type),intent(inout) :: Pawrhoij(Cryst%natom*Psps%usepaw)
125 : : type(Pawtab_type),intent(in) :: Pawtab(Psps%ntypat*Psps%usepaw)
126 : :
127 : : !Local variables-------------------------------
128 : : !scalars
129 : : integer :: ib,ik,is,unqps,iatom,itypat
130 : : character(len=500) :: msg
131 : : !arrays
132 : 55 : integer,allocatable :: nlmn_type(:)
133 : 55 : complex(dp),allocatable :: mtmp(:,:)
134 : : ! *************************************************************************
135 : :
136 : : DBG_ENTER("COLL")
137 : :
138 [ + - ]: 55 : if (nscf >= 0) then
139 : 55 : write(msg,'(3a)')ch10,' writing QP data on file : ',TRIM(fname)
140 [ + + ]: 165 : call wrtout([std_out, ab_out], msg)
141 : : end if
142 : :
143 [ - + ]: 55 : if (open_file(fname,msg,newunit=unqps,form='formatted',status='unknown') /= 0) then
144 : 0 : ABI_ERROR(msg)
145 : : end if
146 : :
147 : 55 : write(unqps,*)nscf+1
148 : 55 : write(unqps,*)Kmesh%nibz
149 : 55 : write(unqps,*)Sigp%nbnds
150 : 55 : write(unqps,*)Sigp%nsppol
151 : :
152 [ - + + - : 220 : ABI_MALLOC(mtmp,(Sigp%nbnds,Sigp%nbnds))
- + + - +
- + - - +
- + ]
153 : :
154 [ + - ]: 55 : if (nscf>=0) then
155 : : ! Write the new m_ks_to_qp on file.
156 [ + + ]: 112 : do is=1,Sigp%nsppol
157 [ + + ]: 463 : do ik=1,Kmesh%nibz
158 : 351 : write(unqps,*)Kmesh%ibz(:,ik)
159 [ + + ]: 4688 : do ib=1,Sigp%nbnds
160 : 4280 : write(unqps,*)Sr%en_qp_diago(ib,ik,is)
161 : 4631 : write(unqps,*)m_ks_to_qp(:,ib,ik,is)
162 : : end do
163 : : end do
164 : : end do
165 [ # # ]: 0 : else if (nscf==-1) then
166 : : ! Write fake QPS file with KS band structure (Mainly used for G0W)
167 : 0 : call set2unit(mtmp)
168 [ # # ]: 0 : do is=1,Sigp%nsppol
169 [ # # ]: 0 : do ik=1,Kmesh%nibz
170 : 0 : write(unqps,*)Kmesh%ibz(:,ik)
171 [ # # ]: 0 : do ib=1,Sigp%nbnds
172 : 0 : write(unqps,*)BSt%eig(ib,ik,is)
173 : 0 : write(unqps,*)mtmp(:,ib)
174 : : end do
175 : : end do
176 : : end do
177 : : else
178 : 0 : ABI_ERROR(sjoin("Wrong nscf ",itoa(nscf)))
179 : : end if
180 : :
181 [ - + ]: 55 : ABI_FREE(mtmp)
182 : :
183 [ + + ]: 1017104 : write(msg,'(a,f9.4)')' (wrqps) planewave contribution to nelect: ',SUM(rho_qp(:,1))*Cryst%ucvol/nfftot
184 : 55 : call wrtout(std_out,msg)
185 [ - + ]: 55 : if (nspden == 4) then
186 : 0 : write(msg,'(a,3f9.4)')' mx, my, mz: ',&
187 [ # # # # : 0 : SUM(rho_qp(:,2))*Cryst%ucvol/nfftot,SUM(rho_qp(:,3))*Cryst%ucvol/nfftot,SUM(rho_qp(:,4))*Cryst%ucvol/nfftot
# # ]
188 : 0 : call wrtout(std_out,msg)
189 : : end if
190 : :
191 : : ! Write FFT dimensions and QP density
192 : 55 : write(unqps,*)ngfftf(1:3)
193 : 55 : write(unqps,*)rho_qp(:,:)
194 : :
195 [ - + ]: 55 : if (Psps%usepaw==1) then
196 : : ! Write QP rhoij to be used for on-site density mixing.
197 [ # # # # : 0 : ABI_MALLOC(nlmn_type,(Cryst%ntypat))
# # # # #
# # # ]
198 [ # # ]: 0 : do itypat=1,Cryst%ntypat
199 : 0 : nlmn_type(itypat)=Pawtab(itypat)%lmn_size
200 : : end do
201 : :
202 : 0 : write(unqps,*) Cryst%natom, Cryst%ntypat
203 [ # # # # ]: 0 : write(unqps,*) (Cryst%typat(iatom), iatom=1,Cryst%natom)
204 : 0 : write(unqps,*) (nlmn_type(itypat), itypat=1,Cryst%ntypat)
205 : 0 : write(unqps,*) Pawrhoij(1)%nsppol, Pawrhoij(1)%nspden
206 : :
207 : : call pawrhoij_io(pawrhoij,unqps,Sigp%nsppol,Sigp%nspinor,nspden,nlmn_type,Cryst%typat,&
208 : 0 : & HDR_LATEST_HEADFORM,"Write",form="formatted")
209 [ # # ]: 0 : ABI_FREE(nlmn_type)
210 : : end if
211 : :
212 : 55 : close(unqps)
213 : :
214 : : DBG_EXIT("COLL")
215 : :
216 [ - + ]: 55 : end subroutine wrqps
217 : : !!***
218 : :
219 : : !----------------------------------------------------------------------
220 : :
221 : : !!****f* m_qparticles/rdqps
222 : : !! NAME
223 : : !! rdqps
224 : : !!
225 : : !! FUNCTION
226 : : !! Read a _QPS file containing the QP energies of the previous iteration, the coefficients
227 : : !! defining the QP amplitudes in terms of the KS basis set and the QP density for mixing.
228 : : !!
229 : : !! INPUTS
230 : : !! nfftot=Total number of FFT points for density
231 : : !! ngfftf(18)=Info on the FFT mesh for the density.
232 : : !! nspden=Number of SPin-DENsity components.
233 : : !! usepaw=1 if we are using PAW.
234 : : !! fname=Name of the file
235 : : !! dimrho=1 if density has to be read, 0 otherwise
236 : : !! BSt<ebands_t>=Structure containing the initial band structure.
237 : : !! ucvol=Volume of the unit cell
238 : : !!
239 : : !! OUTPUT
240 : : !! nbsc=number of bands used to describe the QP amplitudes
241 : : !! nscf=number of iterations that have been performed (==0 if we start from a KS calculation)
242 : : !! m_ks_to_qp(mband,mband,nibz,nsppol)=matrix giving the decomposition of the QP
243 : : !! wavefunction in the mainfold generated by the KS wavefunctions
244 : : !! (i.e. $ m_ks_to_qp(ib,jb,k,s) := <\psi_{ib,k,s}^{KS}|\psi_{jb,k,s}^{QP}>$
245 : : !! rhor_out(nfftot,nspden)=quasiparticle density
246 : : !!
247 : : !! SIDE EFFECTS
248 : : !! BSt<ebands_t>=Structure containing the initial band structure.
249 : : !! %en_qp(mband,nkpt,nsppol)=QP energies at iteration nscf
250 : : !!
251 : : !! TODO
252 : : !! The value of nspden is not reported in the QPS file thus we have a possible undetected error.
253 : : !!
254 : : !! SOURCE
255 : :
256 : 126 : subroutine rdqps(BSt,fname,usepaw,nspden,dimrho,nscf,&
257 : 126 : & nfftot,ngfftf,ucvol,Cryst,Pawtab,MPI_enreg,nbsc,m_ks_to_qp,rhor_out,Pawrhoij)
258 : :
259 : : !Arguments ------------------------------------
260 : : !scalars
261 : : integer,intent(in) :: nfftot,nspden,usepaw,dimrho
262 : : integer,intent(out) :: nbsc,nscf
263 : : real(dp),intent(in) :: ucvol
264 : : character(len=*),intent(in) :: fname
265 : : type(crystal_t),intent(in) :: Cryst
266 : : type(ebands_t),intent(inout) :: BSt
267 : : type(MPI_type),intent(inout) :: MPI_enreg
268 : : !arrays
269 : : integer,intent(in) :: ngfftf(18)
270 : : real(dp),intent(out) :: rhor_out(nfftot,nspden*dimrho)
271 : : complex(dp),intent(out) :: m_ks_to_qp(BSt%mband,BSt%mband,BSt%nkpt,BSt%nsppol)
272 : : type(Pawtab_type),intent(in) :: Pawtab(Cryst%ntypat*usepaw)
273 : : type(Pawrhoij_type),intent(inout) :: Pawrhoij(Cryst%natom*usepaw)
274 : :
275 : : !Local variables-------------------------------
276 : : !scalars
277 : : integer,parameter :: master=0
278 : : integer :: ib,ii,ik,isppol,nbandR,nkibzR,nsppolR,unqps,my_rank,ispden
279 : : integer :: ifft,n1,n2,n3,ir1,ir2,ir3,ios
280 : : integer :: cplex_fft,optin,optout,nfft_found
281 : : integer :: iatom,natomR,nspdenR,ntypatR,itypat
282 : : real(dp) :: uerr,nelect_qps,ratio
283 : : logical,parameter :: use_FFT_interpolation=.TRUE.
284 : : logical :: ltest
285 : : character(len=500) :: msg
286 : : !arrays
287 : : integer :: ngfft_found(18)
288 : 126 : integer,allocatable :: nlmn_type(:),typatR(:)
289 : : real(dp) :: kibz(3),rr(3),rhogdum(1,1)
290 : 126 : real(dp),allocatable :: en_tmp(:), rhor_tmp(:,:)
291 : 126 : complex(dp),allocatable :: mtmp(:,:),utest(:,:)
292 : : ! *************************************************************************
293 : :
294 : : DBG_ENTER("COLL")
295 : :
296 [ + + + - : 837 : ABI_CHECK(ALL(BSt%nband==BSt%nband(1)), "No. of bands must be constant")
- + ]
297 [ - + ]: 126 : ABI_CHECK(dimrho==0.or.dimrho==1, 'dimrho must be 0 or 1')
298 : :
299 : : ! This does not work in parallel !!?
300 : : !% my_rank = xmpi_comm_rank(MPI_enreg%spaceComm)
301 : 126 : my_rank = MPI_enreg%me_kpt
302 : :
303 : : ! Check whether file exists or not.
304 : 126 : write(msg,'(5a)')ch10,&
305 : 126 : ' rdqps: reading QP wavefunctions of the previous step ',ch10,&
306 : 252 : ' looking for file ',TRIM(fname)
307 [ + + ]: 378 : call wrtout([std_out, ab_out], msg)
308 : :
309 [ + + ]: 126 : if (.not.file_exists(fname)) then
310 : 64 : write(msg,'(2a)')' file not found, 1st iteration initialized with KS eigenelements ',ch10
311 [ + + ]: 192 : call wrtout([std_out, ab_out], msg)
312 : 128 : nscf=0; RETURN
313 : : end if
314 : :
315 [ + - ]: 62 : if (.not.isncfile(fname)) then
316 [ - + ]: 62 : if (open_file(fname,msg,newunit=unqps,form='formatted',status='unknown') /= 0) then
317 : 0 : ABI_ERROR(msg)
318 : : end if
319 : :
320 : : ! TODO the _QPS file should contain additional information
321 : 62 : read(unqps,*)nscf
322 : 62 : write(msg,'(a,i4,a)')' Number of iteration(s) already performed: ',nscf,ch10
323 [ + + ]: 186 : call wrtout([std_out, ab_out], msg)
324 : :
325 : 62 : read(unqps,*)nkibzR
326 [ - + ]: 62 : if (nkibzR/=BSt%nkpt) then
327 : 0 : write(msg,'(2(a,i0))')'Wrong number of k-points; Expected: ',BSt%nkpt,', Found: ',nkibzR
328 : 0 : ABI_ERROR(msg)
329 : : end if
330 : :
331 : 62 : read(unqps,*)nbandR
332 : 62 : nbsc=MIN(nbandR,BSt%mband)
333 : :
334 [ - + ]: 62 : if (nbsc/=BSt%mband) then
335 : : write(msg,'(3a,i4,a,i4)')&
336 : 0 : 'QPS file contains less bands than that used in the present calculation ',ch10,&
337 : 0 : 'Required: ',BSt%mband,', Found: ',nbandR
338 : 0 : ABI_WARNING(msg)
339 : : end if
340 : :
341 [ - + ]: 62 : if (nbsc/=nbandR) then
342 : : write(msg,'(3a,i0,a)')&
343 : 0 : 'The QPS file contains more bands than that used in the present calculation ',ch10,&
344 : 0 : 'only the first ',nbandR,' bands will be read'
345 : 0 : ABI_COMMENT(msg)
346 : : end if
347 : :
348 [ - + + - : 248 : ABI_MALLOC(mtmp,(nbandR,nbandR))
- + + - +
- + - - +
- + ]
349 [ - + + - : 186 : ABI_MALLOC(en_tmp,(nbandR))
+ - + - -
+ - + ]
350 : 62 : read(unqps,*)nsppolR
351 : :
352 [ - + ]: 62 : ABI_CHECK_IEQ(nsppolR, BSt%nsppol, "QPS generated with different nsppol")
353 : :
354 : : ! Read energies and transformation for each k-point and spin.
355 : : ! TODO: The format of the QPS file must be standardized !
356 : : ! For example we might add the occupation numbers.
357 [ + + ]: 124 : do isppol=1,BSt%nsppol
358 [ + + ]: 456 : do ik=1,BSt%nkpt
359 : 332 : read(unqps,*)kibz(:)
360 : 332 : write(msg,'(a,i5,a,3(f6.3,1x),4x,a,i2)')' Reading ik ',ik,') k = ',kibz(:),' is = ',isppol
361 : 332 : call wrtout(std_out,msg)
362 [ + + + - ]: 1328 : ltest=(ALL(ABS(kibz(:)-BSt%kptns(:,ik))<0.001))
363 [ - + ]: 332 : ABI_CHECK(ltest,'Wrong k-point read')
364 [ + + ]: 4396 : do ib=1,nbandR
365 : 4064 : read(unqps,*)en_tmp(ib)
366 : 4396 : read(unqps,*)mtmp(:,ib)
367 : : end do
368 : :
369 : : ! Store transformation and update energies.
370 [ + + + + ]: 55980 : m_ks_to_qp(1:nbsc,1:nbsc,ik,isppol)=mtmp(1:nbsc,1:nbsc)
371 [ + + ]: 4396 : BSt%eig(1:nbsc,ik,isppol)=en_tmp(1:nbsc)
372 : :
373 : : ! Check if matrix is unitary.
374 [ - + + - : 1328 : ABI_MALLOC(utest,(nbsc,nbsc))
- + + - +
- + - - +
- + ]
375 [ + + + + ]: 55980 : utest(:,:) = TRANSPOSE(mtmp(1:nbsc,1:nbsc)) !this is just for the buggy gfortran
376 [ + + + + : 846700 : utest(:,:) = MATMUL(CONJG(utest),mtmp(1:nbsc,1:nbsc))
+ - + + +
+ + + + +
+ + + - ]
377 [ + + ]: 4396 : do ii=1,nbsc
378 : 4396 : utest(ii,ii)=utest(ii,ii)-one
379 : : end do
380 [ + + + + : 55980 : uerr=MAXVAL(ABS(utest))
+ + + - -
+ - - ]
381 [ - + ]: 332 : if (uerr>tol6) then
382 : 0 : write(msg,'(a,es16.8)')' KS -> QP matrix is not unitary, MAX error = ',uerr
383 : 0 : ABI_WARNING(msg)
384 : : end if
385 [ - + ]: 394 : ABI_FREE(utest)
386 : : end do !ik
387 : : end do !isppol
388 : :
389 [ - + ]: 62 : ABI_FREE(mtmp)
390 [ - + ]: 62 : ABI_FREE(en_tmp)
391 : :
392 : : ! Read the QP density.
393 : : ! The two FFT grids might differ. In case perform an FFT interpolation to have rhor on the input mesh.
394 [ + + ]: 62 : if (dimrho==1) then
395 : 61 : read(unqps,*)n1,n2,n3
396 : :
397 [ + + + - : 244 : if (all(ngfftf(1:3)== [n1, n2, n3]) ) then
+ - ]
398 : 61 : read(unqps,*)rhor_out(:,:)
399 : : else
400 : : write(msg,'(2a,a,5(i3,a),i3)')&
401 : 0 : 'FFT meshes differ. Performing Fourier interpolation. ',ch10,&
402 : 0 : 'Found: ',n1,' x',n2,' x',n3,'; Expected: ',ngfftf(1),' x',ngfftf(2),' x',ngfftf(3)
403 : 0 : ABI_COMMENT(msg)
404 : :
405 [ # # # # : 0 : ABI_MALLOC(rhor_tmp,(n1*n2*n3,nspden))
# # # # #
# # # # #
# # ]
406 : 0 : read(unqps,*)rhor_tmp(:,:)
407 : :
408 : : if (use_FFT_interpolation) then
409 [ # # ]: 0 : ngfft_found(1:3)=(/n1,n2,n3/)
410 : 0 : ngfft_found(4)=2*(ngfft_found(1)/2)+1 ! 4:18 are not used, anyway!
411 : 0 : ngfft_found(5)=2*(ngfft_found(2)/2)+1
412 : 0 : ngfft_found(6)=ngfft_found(3)
413 [ # # ]: 0 : ngfft_found(7:18)=ngfftf(7:18)
414 [ # # ]: 0 : nfft_found=PRODUCT(ngfft_found(1:3)) !no FFT para
415 : :
416 : 0 : cplex_fft =1 ! Real quantities.
417 : 0 : optin =0 ! Input is taken from rhor.
418 : 0 : optout =0 ! Output is only in real space.
419 : 0 : call MPI_enreg%distribfft%free()
420 : 0 : call MPI_enreg%distribfft%init('c',MPI_enreg%nproc_fft,ngfftf(2),ngfftf(3))
421 : 0 : call MPI_enreg%distribfft%init('f',MPI_enreg%nproc_fft,ngfft_found(2),ngfft_found(3))
422 : :
423 : : call fourier_interpol(cplex_fft,nspden,optin,optout,nfft_found,ngfft_found,nfftot,ngfftf,&
424 : 0 : MPI_enreg,rhor_tmp,rhor_out,rhogdum,rhogdum)
425 : :
426 : : else
427 : : ! Linear interpolation.
428 : : do ispden=1,nspden
429 : : do ir3=0,ngfftf(3)-1
430 : : rr(3)=DBLE(ir3)/n3
431 : : do ir2=0,ngfftf(2)-1
432 : : rr(2)=DBLE(ir2)/n2
433 : : do ir1=0,ngfftf(1)-1
434 : : rr(1)=DBLE(ir1)/n1
435 : : ifft = 1 +ir1 +ir2*ngfftf(1) +ir3*ngfftf(1)*ngfftf(2)
436 : : rhor_out(ifft,ispden) = interpol3d_0d(rr,n1,n2,n3,rhor_tmp(:,ispden))
437 : : end do
438 : : end do
439 : : end do
440 : : end do
441 : : end if
442 : :
443 [ # # ]: 0 : ABI_FREE(rhor_tmp)
444 : : end if
445 : :
446 : : ! Test the normalization of the QPS density.
447 : : ! There might be errors due to the interpolation or the truncation of the G basis set
448 : : ! Density will be renormalized in the caller since for PAW we still have to add the onsite contribution.
449 [ + - ]: 61 : if (usepaw==0) then
450 [ + + ]: 1806896 : nelect_qps=SUM(rhor_out(:,1))*ucvol/nfftot; ratio=BSt%nelect/nelect_qps
451 : : write(msg,'(3(a,f9.4))')&
452 : 61 : ' Number of electrons calculated using the QPS density = ',nelect_qps,' Expected = ',BSt%nelect,' ratio = ',ratio
453 : 61 : call wrtout(std_out, msg)
454 : : !!rhor_out(:,:)=ratio*rhor_out(:,:)
455 : : end if
456 : :
457 [ - + ]: 61 : if (usepaw==1) then
458 : : ! Write QP_rhoij for on-site density mixing.
459 : 0 : read(unqps,*,iostat=ios)natomR,ntypatR
460 [ # # ]: 0 : if (ios/=0) then
461 : 0 : msg="Old version of QPS file found. DO NOT USE rhoqpmix for this run."
462 : 0 : ABI_WARNING(msg)
463 : 0 : call wrtout(ab_out,msg)
464 : : ! Init dummy rhoij just to avoid problems in sigma when rhoij is freed.
465 : 0 : call pawrhoij_inquire_dim(nspden_rhoij=nspdenR, nspden=nspden)
466 : 0 : call pawrhoij_alloc(Pawrhoij,1,nspdenR,BSt%nspinor,BSt%nsppol,Cryst%typat,pawtab=Pawtab)
467 : 0 : close(unqps)
468 : 0 : RETURN
469 : : end if
470 : :
471 [ # # ]: 0 : ABI_CHECK(natomR == Cryst%natom, "mismatch in natom")
472 [ # # ]: 0 : ABI_CHECK(ntypatR == Cryst%ntypat,"mismatch in ntypat")
473 [ # # # # : 0 : ABI_MALLOC(nlmn_type, (ntypatR))
# # # # #
# # # ]
474 [ # # # # : 0 : ABI_MALLOC(typatR, (ntypatR))
# # # # ]
475 : :
476 : 0 : read(unqps,*)(typatR(iatom), iatom=1,natomR)
477 [ # # # # : 0 : ABI_CHECK(ALL(Cryst%typat==typatR), "mismatch in typat")
# # ]
478 : :
479 : 0 : read(unqps,*)(nlmn_type(itypat), itypat=1,ntypatR)
480 [ # # ]: 0 : do itypat =1,Cryst%ntypat
481 [ # # ]: 0 : if (nlmn_type(itypat)/=Pawtab(itypat)%lmn_size) then
482 : 0 : ABI_ERROR("mismatch in nlmn_type, check QPS file")
483 : : end if
484 : : end do
485 : :
486 : 0 : read(unqps,*) nsppolR,nspdenR
487 [ # # ]: 0 : ABI_CHECK(nsppolR==BSt%nsppol,"mismatch in nsppol")
488 [ # # ]: 0 : ABI_CHECK(nspdenR==nspden ,"mismatch in nspden")
489 : :
490 : : call pawrhoij_io(pawrhoij,unqps,BSt%nsppol,BSt%nspinor,nspden,nlmn_type,Cryst%typat,&
491 : 0 : HDR_LATEST_HEADFORM,"Read",form="formatted")
492 : : !% call pawrhoij_io(pawrhoij,std_out,BSt%nsppol,BSt%nspinor,nspden,nlmn_type,Cryst%typat,HDR_LATEST_HEADFORM,"Echo")
493 : :
494 [ # # ]: 0 : ABI_FREE(nlmn_type)
495 [ # # ]: 0 : ABI_FREE(typatR)
496 : : end if ! usepaw
497 : :
498 : : end if !dimrho=1
499 : :
500 : 62 : close(unqps)
501 : :
502 : : else
503 : 0 : ABI_ERROR("netdf format not implemented")
504 : : end if
505 : :
506 : : DBG_EXIT("COLL")
507 : :
508 [ - + - + : 126 : end subroutine rdqps
+ - ]
509 : : !!***
510 : :
511 : : !----------------------------------------------------------------------
512 : :
513 : : !!****f* m_qparticles/show_QP
514 : : !! NAME
515 : : !! show_QP
516 : : !!
517 : : !! FUNCTION
518 : : !! Print in a nice format (?) the expansion coefficients of the quasiparticle
519 : : !! amplitudes in terms of the KS eigenvectors
520 : : !!
521 : : !! INPUTS
522 : : !! Bst<ebands_t>=Description of the band structure.
523 : : !! %nsppol=1 for unpolarized, 2 for spin-polarized.
524 : : !! %mband=Max number of bands (in GW doesn"t depend on k an spin)
525 : : !! %nkpt=number of irreducible k-points.
526 : : !! %eig(mband,nkpt,nsppol)= QP energies for each k-point, band and spin.
527 : : !! m_ks_to_qp(nbnds,nbnds,nkibz,nsppol)=matrix giving the decomposition of the QP
528 : : !! amplitued in the mainfold generated by the KS wavefunctions
529 : : !! (i.e $ m_ks_to_qp(ib,jb,k,s) := \langle \psi_{ib,k,s}^{KS}| \psi_{jb,k,s}^{QP}\rangle $
530 : : !! fromb,tob=initial and final band index for QP, only states in this range are printed
531 : : !! prtvol=Verbosity level (not used)
532 : : !! unit=Unit number of the output file
533 : : !! tolmat[Optional]=Only components whose coefficient has modulus larger than tolmat are shown (default is 0.01)
534 : : !!
535 : : !! OUTPUT
536 : : !! Only printing
537 : : !!
538 : : !! NOTES
539 : : !! Only master node should call this routine.
540 : : !!
541 : : !! SOURCE
542 : :
543 : 0 : subroutine show_QP(Bst,m_ks_to_qp,fromb,tob,unit,prtvol,tolmat,kmask)
544 : :
545 : : !Arguments ------------------------------------
546 : : !scalars
547 : : integer,optional,intent(in) :: fromb,tob
548 : : integer,optional,intent(in) :: prtvol,unit
549 : : real(dp),optional,intent(in) :: tolmat
550 : : type(ebands_t),intent(in) :: Bst
551 : : !arrays
552 : : logical,optional,intent(in) :: kmask(Bst%nkpt)
553 : : complex(dp),intent(in) :: m_ks_to_qp(Bst%mband,Bst%mband,Bst%nkpt,Bst%nsppol)
554 : :
555 : : !Local variables-------------------------------
556 : : !scalars
557 : : integer,parameter :: NBRA=5
558 : : logical,parameter :: use_rhophi=.True.
559 : : integer :: ib_start,ib_stop,my_prtvol,counter,ib_KS,ib_QP,ikibz,isp,nspace,my_unt,nband_k
560 : : real(dp) :: my_tolmat,rho,phi
561 : : character(len=10) :: bks,bqp,k_tag,spin_tag
562 : : character(len=500) :: KS_row,KS_ket,tmpstr,QP_ket
563 : : !arrays
564 : : real(dp) :: cx(2)
565 : : ! *********************************************************************
566 : :
567 [ + - ]: 28 : my_unt =std_out ; if (PRESENT(unit )) my_unt =unit
568 : 28 : my_prtvol=0 ; if (PRESENT(prtvol)) my_prtvol=prtvol
569 [ + - ]: 28 : ib_start =1 ; if (PRESENT(fromb )) ib_start =fromb
570 [ + - ]: 28 : ib_stop =Bst%mband; if (PRESENT(tob )) ib_stop =tob
571 [ + - ]: 28 : my_tolmat=0.001 ; if (PRESENT(tolmat)) my_tolmat=ABS(tolmat)
572 : :
573 : : ! I suppose nband_k is constant thus the check is done here.
574 : 28 : if (ib_start<=0 ) ib_start=1
575 : 28 : if (ib_start>Bst%mband) ib_start=Bst%mband
576 : 28 : if (ib_stop<=0 ) ib_stop=1
577 : 28 : if (ib_stop>Bst%mband ) ib_stop=Bst%mband
578 : :
579 : : ! Have to follow rules 7.f.
580 : : write(my_unt,'(/,a,/,a,/,a,f6.3,a,/,a)')&
581 : 28 : ' '//REPEAT('*',76),&
582 : 28 : & ' ***** QP amplitudes expressed as linear combination of KS eigenstates. *****',&
583 : 28 : & ' ***** Only KS components whose modulus is larger than ',my_tolmat,' are shown ***** ',&
584 : 56 : & ' '//REPEAT('*',76)
585 : : if (use_rhophi) then
586 : 28 : write(my_unt,"(a)")"Complex coefficients given in (rho, phi) polar representation."
587 : : else
588 : : write(my_unt,"(a)")"Complex coefficients given in (Re, Im) representation."
589 : : end if
590 : :
591 [ - + ]: 28 : if (PRESENT(kmask)) then
592 [ # # # # : 0 : if (.not.ALL(kmask)) write(my_unt,'(/,a,i3,a)')' Only ',COUNT(kmask),' k-points are reported '
# # # # #
# ]
593 : : end if
594 : :
595 [ + + ]: 56 : do isp=1,Bst%nsppol
596 : 28 : call int2char10(isp,spin_tag)
597 : 28 : write(my_unt,'(/,a,i2,a,/)')' >>>>> Begin block for spin ',isp,' <<<<< '
598 : :
599 [ + + ]: 232 : do ikibz=1,Bst%nkpt
600 [ - + ]: 176 : if (PRESENT(kmask)) then
601 [ # # ]: 0 : if (.not.kmask(ikibz)) CYCLE
602 : : end if
603 : 176 : call int2char10(ikibz,k_tag)
604 : 176 : nband_k=Bst%nband(ikibz+(isp-1)*Bst%nkpt)
605 : 176 : write(my_unt,'(a,i4,a,3es16.8,a,f6.3,/)')' k-point: ',ikibz,') ',Bst%kptns(:,ikibz),'; wtk= ',Bst%wtk(ikibz)
606 : :
607 [ + + ]: 2288 : do ib_QP=ib_start,ib_stop
608 : 2084 : call int2char10(ib_QP,bqp)
609 [ + - ]: 2084 : QP_ket=' |QP: b='//TRIM(bqp)//'; s='//TRIM(spin_tag)//'> = '
610 : 2084 : write(my_unt,'(a)')TRIM(QP_ket)
611 : 2084 : nspace=LEN(TRIM(QP_ket))
612 : :
613 [ - + ]: 2084 : counter=0 ; KS_row=REPEAT('',nspace+2)
614 [ + + ]: 30076 : do ib_KS=1,Bst%mband
615 [ + + ]: 27992 : if (ABS(m_ks_to_qp(ib_KS,ib_QP,ikibz,isp))<my_tolmat) CYCLE
616 : 8743 : counter=counter+1
617 : 8743 : call int2char10(ib_KS,bks)
618 : 8743 : write(tmpstr,'(3a)')' |',TRIM(bks),'>'
619 : :
620 : : if (use_rhophi) then
621 : : ! coefficient as (rho, phi)
622 : 8743 : cx(1) = real(m_ks_to_qp(ib_KS,ib_QP,ikibz,isp))
623 : 8743 : cx(2) = aimag(m_ks_to_qp(ib_KS,ib_QP,ikibz,isp))
624 : 8743 : call rhophi(cx, phi, rho)
625 : 8743 : write(KS_ket,'(1x,2f7.3,a,1x)')rho, phi, TRIM(tmpstr)
626 : : else
627 : : ! coefficient as (Re, Im)
628 : : write(KS_ket,'(1x,2f7.3,a,1x)')m_ks_to_qp(ib_KS,ib_QP,ikibz,isp),TRIM(tmpstr)
629 : : end if
630 : 8743 : KS_row=TRIM(KS_row)//TRIM(KS_ket)
631 [ + + ]: 19570 : if (MOD(counter,NBRA)==0) then ! nbra KS kets per row
632 : 821 : write(my_unt,'(a)')TRIM(KS_row)
633 : 821 : KS_row=REPEAT('',nspace+2)
634 : : end if
635 : : end do
636 : :
637 [ + + ]: 2084 : if (MOD(counter,NBRA)/=0) write(my_unt,'(a)')TRIM(KS_row) ! Last row, if any
638 : 2260 : write(my_unt,'(a)')''
639 : : end do !ib_QP
640 : :
641 : : end do !ikibz
642 : : end do !isp
643 : :
644 : 28 : write(my_unt,'(a,/)')' '//REPEAT('*',76)
645 : :
646 [ - + ]: 28 : end subroutine show_QP
647 : : !!***
648 : :
649 : : !----------------------------------------------------------------------
650 : :
651 : : !!****f* m_qparticles/rdgw
652 : : !! NAME
653 : : !! rdgw
654 : : !!
655 : : !! FUNCTION
656 : : !! This subroutine reads the GW corrections from a _GW file.
657 : : !!
658 : : !! INPUTS
659 : : !! [extrapolate]= if .TRUE., the routine extrapolates the
660 : : !! GW corrections for the states that have not been explicitly evaluated (default).
661 : : !! If .FALSE., only the GW states that have been calculated will be used to replace
662 : : !! the input eigenvalues stored in Bst%eig
663 : : !! Bst<ebands_t>=type describing the Band structure.
664 : : !! %nbnds=number of bands.
665 : : !! %nkpt=number of irred k-points.
666 : : !! %nsppol=number of spin
667 : : !! %kptns(3,nkpt)=irreducible k-points
668 : : !!
669 : : !! SIDE EFFECTS
670 : : !! Bst%eig(%mband,%nkpt,%nsppol)=Overwritten with GW energies according to extrapolate flag.
671 : : !!
672 : : !! OUTPUT
673 : : !! igwene(Bst%mband,Bst%nkpt,Bst%nsppol)= The imaginary part of the QP energies.
674 : : !!
675 : : !! SOURCE
676 : :
677 : 0 : subroutine rdgw(Bst,fname,igwene,extrapolate)
678 : :
679 : : !Arguments ------------------------------------
680 : : !scalars
681 : : character(len=*),intent(in) :: fname
682 : : logical,optional,intent(in) :: extrapolate
683 : : type(ebands_t),intent(inout) :: Bst
684 : : !arrays
685 : : real(dp),intent(out) :: igwene(Bst%mband,Bst%nkpt,Bst%nsppol)
686 : :
687 : : !Local variables ------------------------------
688 : : !scalars
689 : : integer :: ib,ibr,ik,ikibz,ikr,is,nn,nbandR,nkibzR,nsppolR,unt,nbv
690 : : real(dp) :: alpha,beta,degw,egw_r,egw_i,smrt
691 : : logical :: do_extrapolate
692 : : character(len=500) :: msg
693 : : !arrays
694 : 0 : integer,allocatable :: vbik(:,:),seen(:)
695 : : real(dp) :: kread(3)
696 : 0 : real(dp),allocatable :: gwcorr(:,:,:)
697 : : !************************************************************************
698 : :
699 [ # # ]: 0 : call wrtout(std_out,'Reading GW corrections from file: '//TRIM(fname))
700 [ # # # # : 0 : ABI_CHECK(ALL(Bst%nband==Bst%mband),"nband must be constant")
# # ]
701 : :
702 [ # # ]: 0 : if (open_file(fname,msg,newunit=unt,status='old') /=0) then
703 : 0 : ABI_ERROR(msg)
704 : : end if
705 : :
706 : 0 : read(unt,*)nkibzR,nsppolR
707 : :
708 [ # # ]: 0 : ABI_CHECK(nsppolR==Bst%nsppol,"mismatch in nsppol")
709 [ # # ]: 0 : if (nkibzR/=Bst%nkpt) then
710 : : write(msg,'(a,i4,a,i4,2a)')&
711 : 0 : 'Found less k-points than that required ',nkibzR,'/',Bst%nkpt,ch10,&
712 : 0 : 'Some k-points will be skipped. Continuing anyway '
713 : 0 : ABI_WARNING(msg)
714 : : end if
715 : :
716 [ # # # # : 0 : ABI_MALLOC(gwcorr,(Bst%mband,Bst%nkpt,Bst%nsppol))
# # # # #
# # # # #
# # # # #
# ]
717 [ # # # # : 0 : ABI_MALLOC(seen,(Bst%nkpt))
# # # # #
# # # ]
718 [ # # # # : 0 : gwcorr=zero
# # ]
719 [ # # # # : 0 : igwene=zero
# # ]
720 : :
721 [ # # ]: 0 : do is=1,Bst%nsppol
722 [ # # ]: 0 : seen=0
723 : :
724 [ # # ]: 0 : do ikr=1,nkibzR
725 : 0 : read(unt,*)kread(:)
726 : 0 : read(unt,*)nbandR
727 : 0 : ikibz=0
728 [ # # ]: 0 : do ik=1,Bst%nkpt
729 [ # # # # : 0 : if (ALL(ABS(kread(:)-Bst%kptns(:,ik))<0.0001)) then
# # ]
730 : 0 : ikibz=ik
731 : 0 : seen(ik) = seen(ik) + 1
732 : : end if
733 : : end do
734 [ # # ]: 0 : do ib=1,nbandR
735 : 0 : read(unt,*)ibr,egw_r,degw,egw_i
736 [ # # # # ]: 0 : if (ibr<=Bst%mband .and. ikibz/=0) then
737 : 0 : gwcorr(ibr,ikibz,is)=degw/Ha_eV
738 : 0 : igwene(ibr,ikibz,is)=egw_i/Ha_eV
739 : : end if
740 : : end do
741 : : end do
742 : :
743 [ # # # # : 0 : if (ANY(seen/=1)) then
# # ]
744 [ # # ]: 0 : do ik=1,Bst%nkpt
745 [ # # ]: 0 : if (seen(ik)/=1) then
746 : 0 : write(msg,'(a,3f8.3,a)')" k-point: ",Bst%kptns(:,ik)," not found in the GW file!"
747 : 0 : ABI_WARNING(msg)
748 : : end if
749 : : end do
750 : : end if
751 : :
752 : : end do
753 : :
754 [ # # ]: 0 : ABI_FREE(seen)
755 : 0 : close(unt)
756 : :
757 [ # # ]: 0 : do_extrapolate=.TRUE.; if (PRESENT(extrapolate)) do_extrapolate=extrapolate
758 : :
759 [ # # ]: 0 : if (.not. do_extrapolate) then ! Only the bands calculated are updated.
760 [ # # # # : 0 : Bst%eig = Bst%eig + gwcorr
# # # # ]
761 : :
762 : : else
763 : :
764 [ # # # # : 0 : if (ANY(ABS(igwene)>tol6)) then
# # # # #
# ]
765 : 0 : write(msg,'(4a)')ch10,&
766 : 0 : "The GW file contains QP energies with non-zero imaginary part",ch10,&
767 : 0 : "Extrapolation not coded, change the source! "
768 : 0 : ABI_ERROR(msg)
769 : : end if
770 : :
771 [ # # # # : 0 : ABI_MALLOC(vbik,(BSt%nkpt,BSt%nsppol))
# # # # #
# # # # #
# # ]
772 : 0 : vbik(:,:) = BSt%get_valence_idx()
773 : :
774 [ # # ]: 0 : do is=1,Bst%nsppol
775 [ # # ]: 0 : do ik=1,Bst%nkpt
776 : :
777 : 0 : nbv=vbik(ik,is) ! Index of the (valence band| Fermi band) for each spin
778 : 0 : nn=Bst%mband-nbv
779 : :
780 [ # # ]: 0 : do ib=nbv+1,Bst%mband
781 [ # # ]: 0 : if ( ABS(gwcorr(ib,ik,is)) < tol16) then
782 : 0 : nn=ib-1-nbv
783 [ # # ]: 0 : if (nn>1) then
784 : 0 : call wrtout(std_out,"Linear extrapolating (conduction) GW corrections beyond the read values")
785 : 0 : smrt=linfit(nn,Bst%eig(nbv+1:nbv+nn,ik,is),gwcorr(nbv+1:nbv+nn,ik,is),alpha,beta)
786 : : else
787 : 0 : call wrtout(std_out,"Assuming constant (conduction) GW corrections beyond the read values")
788 : 0 : alpha=zero
789 : 0 : beta =gwcorr(nbv+nn,ik,is)
790 : : end if
791 : : EXIT !ib loop
792 : : end if
793 : : end do !ib
794 : :
795 [ # # ]: 0 : do ib=nbv+nn+1,Bst%mband
796 : 0 : gwcorr(ib,ik,is)= alpha*Bst%eig(ib,ik,is) + beta
797 : : end do
798 : :
799 : 0 : nn=nbv
800 [ # # ]: 0 : do ib=nbv,1,-1
801 [ # # ]: 0 : if ( ABS(gwcorr(ib,ik,is)) < tol16) then
802 : 0 : nn=nbv-ib
803 [ # # ]: 0 : if (nn>1) then
804 : 0 : call wrtout(std_out,"Linear extrapolating (valence) GW corrections beyond the read values")
805 : 0 : smrt=linfit(nn,Bst%eig(nbv-nn+1:nbv,ik,is),gwcorr(nbv-nn+1:nbv,ik,is),alpha,beta)
806 : : else
807 : 0 : call wrtout(std_out,"Assuming constant (valence) GW corrections beyond the read values")
808 : 0 : alpha=zero
809 : 0 : beta =gwcorr(nbv,ik,is)
810 : : end if
811 : : EXIT !ib
812 : : end if
813 : : end do !ib
814 : :
815 [ # # ]: 0 : do ib=1,nbv-nn
816 : 0 : gwcorr(ib,ik,is)=alpha*Bst%eig(ib,ik,is) + beta
817 : : end do
818 : :
819 : : end do !ik
820 : : end do !is
821 : :
822 : 0 : call wrtout(std_out,' k s GW corrections [eV] ')
823 [ # # ]: 0 : do is=1,Bst%nsppol
824 [ # # ]: 0 : do ik=1,Bst%nkpt
825 [ # # # # ]: 0 : write(msg,'(i3,1x,i3,10f7.2/50(10x,10f7.2/))')ik,is,(Ha_eV*gwcorr(ib,ik,is),ib=1,Bst%mband)
826 : 0 : call wrtout(std_out,msg)
827 : : end do
828 : : end do
829 [ # # # # : 0 : Bst%eig = Bst%eig + gwcorr
# # # # ]
830 [ # # ]: 0 : ABI_FREE(vbik)
831 : : end if
832 : :
833 : 0 : call wrtout(std_out,' k s GW eigenvalues [eV]')
834 [ # # ]: 0 : do is=1,Bst%nsppol
835 [ # # ]: 0 : do ik=1,Bst%nkpt
836 [ # # # # ]: 0 : write(std_out,'(2(i3,1x),7x,10f7.2/50(15x,10f7.2/))')ik,is,(Ha_eV*Bst%eig(ib,ik,is),ib=1,Bst%mband)
837 : : end do
838 : : end do
839 : :
840 [ # # ]: 0 : ABI_FREE(gwcorr)
841 : :
842 : 0 : end subroutine rdgw
843 : : !!***
844 : :
845 : : !----------------------------------------------------------------------
846 : :
847 : : !!****f* m_qparticles/updt_m_ks_to_qp
848 : : !! NAME
849 : : !! updt_m_ks_to_qp
850 : : !!
851 : : !! FUNCTION
852 : : !! Updates the matrix containing the unitary transformation from the lda states
853 : : !! to the quasiparticle states.
854 : : !!
855 : : !! INPUTS
856 : : !! Sigp<sigparams_t>=Parameters characterizing the self-energy calculation.
857 : : !! %nsppol=1 for unpolarized, 2 for spin-polarized
858 : : !! %nbnds=number of bands used for sigma
859 : : !! Sr<sigma_t>=Structure containing the results of the sigma run.
860 : : !! %en_qp_diago(nbnds,nibz,nsppol)= NEW quasi-particle energies
861 : : !! %eigvec_qp(nbnds,nbnds,nibz,nsppol)= NEW QP amplitudes in the KS basis set
862 : : !! obtained by diagonalizing H0 + Herm(Sigma).
863 : : !! Kmesh<kmesh_t>=information on the k-point sampling.
864 : : !! %nibz=number of irreducible k-points
865 : : !! %ibz(3,kibz)=reduced coordinates of the irreducible k-points
866 : : !! nscf=Number of self consistent cycles performed
867 : : !!
868 : : !! OUTPUT
869 : : !! (see side effects)
870 : : !!
871 : : !! SIDE EFFECTS
872 : : !! m_ks_to_qp(nbnds,nbnds,nibz,nsppol)= overwritten with the new QP amplitudes
873 : : !! in terms of KS wavefunctions
874 : : !!
875 : : !! NOTES
876 : : !! Only master node should call this routine.
877 : : !!
878 : : !! SOURCE
879 : :
880 : 71 : subroutine updt_m_ks_to_qp(Sigp,Kmesh,nscf,Sr,m_ks_to_qp)
881 : :
882 : : !Arguments ------------------------------------
883 : : !scalars
884 : : integer,intent(in) :: nscf
885 : : type(kmesh_t),intent(in) :: Kmesh
886 : : type(sigparams_t),intent(in) :: Sigp
887 : : type(sigma_t),intent(in) :: Sr
888 : : !arrays
889 : : complex(dp),intent(inout) :: m_ks_to_qp(Sigp%nbnds,Sigp%nbnds,Kmesh%nibz,Sigp%nsppol)
890 : :
891 : : !Local variables-------------------------------
892 : : !scalars
893 : : integer :: ik,is
894 : : !arrays
895 : 71 : complex(dp),allocatable :: mtmp(:,:)
896 : : ! *************************************************************************
897 : :
898 [ + - ]: 71 : if (nscf >= 0) then
899 : : ! Calculate the new m_ks_to_qp
900 [ - + ]: 71 : ABI_CHECK(Sr%needs_eigvec_qp, "needs_eigvec should be true")
901 [ - + + - : 284 : ABI_MALLOC(mtmp, (Sigp%nbnds,Sigp%nbnds))
- + + - +
- + - - +
+ - ]
902 [ + + ]: 144 : do is=1,Sigp%nsppol
903 [ + + ]: 567 : do ik=1,Kmesh%nibz
904 [ + + + + ]: 71003 : mtmp(:,:)=m_ks_to_qp(:,:,ik,is)
905 [ + - + + : 2086190 : m_ks_to_qp(:,:,ik,is)=MATMUL(mtmp(:,:),Sr%eigvec_qp(:,:,ik,is))
+ + + + +
+ + + + -
+ - ]
906 : : end do
907 : : end do
908 [ - + ]: 71 : ABI_FREE(mtmp)
909 : : end if
910 : :
911 : 71 : end subroutine updt_m_ks_to_qp
912 : :
913 : : !----------------------------------------------------------------------
914 : :
915 : : END MODULE m_qparticles
916 : : !!***
|