LCOV - code coverage report
Current view: top level - src/70_gw - m_qparticles.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 46.7 % 319 149
Test Date: 2026-11-11 18:45:25 Functions: 80.0 % 5 4
Branches: 32.7 % 562 184

             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                 :        8729 :          counter=counter+1
     617                 :        8729 :          call int2char10(ib_KS,bks)
     618                 :        8729 :          write(tmpstr,'(3a)')' |',TRIM(bks),'>'
     619                 :             : 
     620                 :             :          if (use_rhophi) then
     621                 :             :            ! coefficient as (rho, phi)
     622                 :        8729 :            cx(1) = real(m_ks_to_qp(ib_KS,ib_QP,ikibz,isp))
     623                 :        8729 :            cx(2) = aimag(m_ks_to_qp(ib_KS,ib_QP,ikibz,isp))
     624                 :        8729 :            call rhophi(cx, phi, rho)
     625                 :        8729 :            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                 :        8729 :          KS_row=TRIM(KS_row)//TRIM(KS_ket)
     631         [ +  + ]:       19542 :          if (MOD(counter,NBRA)==0) then  ! nbra KS kets per row
     632                 :         817 :            write(my_unt,'(a)')TRIM(KS_row)
     633                 :         817 :            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                 :             : !!***
        

Generated by: LCOV version 2.3-1