LCOV - code coverage report
Current view: top level - src/65_paw - m_paw_overlap.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 80.8 % 240 194
Test Date: 2026-11-10 15:53:16 Functions: 80.0 % 5 4
Branches: 57.3 % 398 228

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_paw_overlap
       2                 :             : !! NAME
       3                 :             : !!  m_paw_overlap
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !!  This module contains several routines used to compute the overlap between
       7                 :             : !!  2 wave-functions (PAW only), and associated tools.
       8                 :             : !!  Mainly used in Berry phase formalism.
       9                 :             : !!
      10                 :             : !! COPYRIGHT
      11                 :             : !! Copyright (C) 2018-2026 ABINIT group (JWZ,TRangel,BA,FJ,PHermet)
      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_paw_overlap
      25                 :             : 
      26                 :             :  use defs_basis
      27                 :             :  use m_errors
      28                 :             :  use m_abicore
      29                 :             :  use m_xmpi
      30                 :             : 
      31                 :             :  use defs_abitypes, only : MPI_type
      32                 :             :  use m_special_funcs, only : sbf8
      33                 :             :  use m_efield, only : efield_type
      34                 :             :  use m_pawang, only : pawang_type
      35                 :             :  use m_pawcprj, only : pawcprj_type
      36                 :             :  use m_pawrad, only : pawrad_type,simp_gen
      37                 :             :  use m_pawtab, only : pawtab_type
      38                 :             :  use m_paw_sphharm, only : initylmr
      39                 :             :  use m_pawcprj, only : pawcprj_type, pawcprj_alloc, pawcprj_get, pawcprj_free, pawcprj_getdim
      40                 :             : 
      41                 :             :  implicit none
      42                 :             : 
      43                 :             :  private
      44                 :             : 
      45                 :             : !public procedures.
      46                 :             :  public :: overlap_k1k2_paw
      47                 :             :  public :: smatrix_pawinit
      48                 :             :  public :: smatrix_k_paw
      49                 :             :  public :: qijb_kk
      50                 :             :  public :: expibi
      51                 :             : 
      52                 :             : CONTAINS  !========================================================================================
      53                 :             : !!***
      54                 :             : 
      55                 :             : !----------------------------------------------------------------------
      56                 :             : 
      57                 :             : !!****f* m_paw_overlap/overlap_k1k2_paw
      58                 :             : !! NAME
      59                 :             : !! overlap_k1k2_paw
      60                 :             : !!
      61                 :             : !! FUNCTION
      62                 :             : !! compute PAW overlap between two k points,
      63                 :             : !! similar to smatrix_k_paw.F90 but more generic
      64                 :             : !!
      65                 :             : !! INPUTS
      66                 :             : !!  cprj_k1 (pawcprj_type) :: cprj for occupied bands at point k1
      67                 :             : !!  cprj_k2 :: cprj for occupied bands at point k2
      68                 :             : !!  dk(3) :: vector k2 - k1
      69                 :             : !!  gprimd(3,3)=dimensioned primitive translations of reciprocal lattice
      70                 :             : !!  lmn2max :: lmnmax*(lmnmax+1)/2
      71                 :             : !!  lmnsize(ntypat) :: lmnsize for each atom type
      72                 :             : !!  mband :: number of bands
      73                 :             : !!  natom=number of atoms in unit cell
      74                 :             : !!  nspinor :: number of spinors (1 or 2)
      75                 :             : !!  ntypat=number of types of atoms in unit cell
      76                 :             : !!  pawang <type(pawang_type)>=paw angular mesh and related data
      77                 :             : !!  pawrad(ntypat) <type(pawrad_type)>=paw radial mesh and related data
      78                 :             : !!  pawtab(ntypat) <type(pawtab_type)>=paw tabulated starting data
      79                 :             : !!  typat=typat(natom) list of atom types
      80                 :             : !!  xred(natom,3) :: locations of atoms in cell
      81                 :             : !!
      82                 :             : !! OUTPUT
      83                 :             : !! k1k2_paw(2,mband,mband) :: array of the on-site PAW parts of the overlaps between Bloch states at points
      84                 :             : !!   k1 and k2, for the various pairs of bands, that is, the on-site part of
      85                 :             : !!   <u_nk1|u_mk2>
      86                 :             : !!
      87                 :             : !! SIDE EFFECTS
      88                 :             : !!
      89                 :             : !! NOTES
      90                 :             : !! This routine assumes that the cprj are not explicitly ordered by
      91                 :             : !! atom type.
      92                 :             : !!
      93                 :             : !! SOURCE
      94                 :             : 
      95                 :           0 :  subroutine overlap_k1k2_paw(cprj_k1,cprj_k2,dk,gprimd,k1k2_paw,lmn2max,lmnsize,&
      96                 :           0 : &                           natom,nband,nband_occ,nspinor,ntypat,pawang,pawrad,pawtab,typat,xred)
      97                 :             : 
      98                 :             : !Arguments---------------------------
      99                 :             : !scalars
     100                 :             :  integer,intent(in) :: lmn2max,natom,nband,nband_occ,nspinor,ntypat
     101                 :             :  type(pawang_type),intent(in) :: pawang
     102                 :             :  type(pawcprj_type),intent(in) :: cprj_k1(natom,nband),cprj_k2(natom,nband)
     103                 :             : 
     104                 :             : !arrays
     105                 :             :  integer,intent(in) :: lmnsize(ntypat),typat(natom)
     106                 :             :  real(dp),intent(in) :: dk(3),gprimd(3,3),xred(natom,3)
     107                 :             :  real(dp),intent(out) :: k1k2_paw(2,nband_occ,nband_occ)
     108                 :             :  type(pawrad_type),intent(in) :: pawrad(ntypat)
     109                 :             :  type(pawtab_type),intent(in) :: pawtab(ntypat)
     110                 :             : 
     111                 :             : !Local variables---------------------------
     112                 :             : !scalars
     113                 :             :  integer :: iatom,iband,ibs,ilmn,ispinor,itypat
     114                 :             :  integer :: jband,jbs,jlmn,klmn
     115                 :             :  complex(dp) :: cpk1,cpk2,cterm,paw_onsite
     116                 :             : 
     117                 :             :  ! arrays
     118                 :           0 :  real(dp),allocatable :: calc_expibi(:,:),calc_qijb(:,:,:)
     119                 :             : ! *************************************************************************
     120                 :             : 
     121                 :             : !initialize k1k2_paw output variable
     122   [ #  #  #  #  :           0 :  k1k2_paw(:,:,:) = zero
                   #  # ]
     123                 :             : 
     124                 :             :  ! obtain the atomic phase factors for the input k vector shift
     125   [ #  #  #  #  :           0 :  ABI_MALLOC(calc_expibi,(2,natom))
          #  #  #  #  #  
                #  #  # ]
     126                 :           0 :  call expibi(calc_expibi,dk,natom,xred)
     127                 :             : 
     128                 :             :  ! obtain the onsite PAW terms for the input k vector shift
     129   [ #  #  #  #  :           0 :  ABI_MALLOC(calc_qijb,(2,lmn2max,natom))
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     130                 :           0 :  call qijb_kk(calc_qijb,dk,calc_expibi,gprimd,lmn2max,natom,ntypat,pawang,pawrad,pawtab,typat)
     131         [ #  # ]:           0 :  ABI_FREE(calc_expibi)
     132                 :             : 
     133         [ #  # ]:           0 :  do iatom = 1, natom
     134                 :           0 :    itypat = typat(iatom)
     135                 :             : 
     136         [ #  # ]:           0 :    do ilmn=1,lmnsize(itypat)
     137         [ #  # ]:           0 :      do jlmn=1,lmnsize(itypat)
     138                 :           0 :        klmn=max(ilmn,jlmn)*(max(ilmn,jlmn)-1)/2 + min(ilmn,jlmn)
     139                 :           0 :        paw_onsite = cmplx(calc_qijb(1,klmn,iatom),calc_qijb(2,klmn,iatom))
     140         [ #  # ]:           0 :        do ispinor = 1, nspinor
     141         [ #  # ]:           0 :          do iband = 1, nband_occ
     142         [ #  # ]:           0 :            do jband = 1, nband_occ
     143                 :           0 :              ibs = nspinor*(iband-1) + ispinor
     144                 :           0 :              jbs = nspinor*(jband-1) + ispinor
     145                 :           0 :              cpk1=cmplx(cprj_k1(iatom,ibs)%cp(1,ilmn),cprj_k1(iatom,ibs)%cp(2,ilmn))
     146                 :           0 :              cpk2=cmplx(cprj_k2(iatom,jbs)%cp(1,jlmn),cprj_k2(iatom,jbs)%cp(2,jlmn))
     147                 :           0 :              cterm = conjg(cpk1)*paw_onsite*cpk2
     148                 :           0 :              k1k2_paw(1,iband,jband) = k1k2_paw(1,iband,jband)+real(cterm)
     149                 :           0 :              k1k2_paw(2,iband,jband) = k1k2_paw(2,iband,jband)+aimag(cterm)
     150                 :             :            end do ! end loop over jband
     151                 :             :          end do ! end loop over iband
     152                 :             :        end do ! end loop over ispinor
     153                 :             :      end do ! end loop over ilmn
     154                 :             :    end do ! end loop over jlmn
     155                 :             : 
     156                 :             :  end do ! end loop over atoms
     157                 :             : 
     158         [ #  # ]:           0 :  ABI_FREE(calc_qijb)
     159                 :             : 
     160                 :           0 :  end subroutine overlap_k1k2_paw
     161                 :             : !!***
     162                 :             : 
     163                 :             : !----------------------------------------------------------------------
     164                 :             : 
     165                 :             : !!****f* m_paw_overlap/smatrix_pawinit
     166                 :             : !! NAME
     167                 :             : !! smatrix_pawinit
     168                 :             : !!
     169                 :             : !! FUNCTION
     170                 :             : !! Routine which computes paw part of the overlap used to compute LMWF wannier
     171                 :             : !!  functions and berryphase
     172                 :             : !!
     173                 :             : !! INPUTS
     174                 :             : !!  atindx1(natom)=index table for atoms, inverse of atindx (see gstate.f)
     175                 :             : !!  cprj(natom,nspinor*mband*mkmem*nsppol)= <p_lmn|Cnk> coefficients for each WF |Cnk>
     176                 :             : !!                                          and each |p_lmn> non-local projector
     177                 :             : !!  dimcprj(natom)=array of dimensions of array cprj (not ordered)
     178                 :             : !!  g1(3)= reciprocal vector to put k1+b inside the BZ. bb=k2-k1=b-G1
     179                 :             : !!  ("b" is the true b, so we have to correct bb with G1).
     180                 :             : !!  gprimd(3,3)=dimensional reciprocal space primitive translations
     181                 :             : !!  ikpt1(3)=cartesian coordinates of k1
     182                 :             : !!  ikpt2(3)=cartesian coordinates of k2
     183                 :             : !!  isppol  = spin polarization
     184                 :             : !!  mband=maximum number of bands
     185                 :             : !!  mkmem =number of k points treated by this node.
     186                 :             : !!  mpi_enreg=information about MPI parallelization
     187                 :             : !!  natom=number of atoms in cell.
     188                 :             : !!  nkpt=number of k points.
     189                 :             : !!  nspinor=number of spinorial components of the wavefunctions (on current proc)
     190                 :             : !!  nsppol=1 for unpolarized, 2 for spin-polarized
     191                 :             : !!  ntypat=number of types of atoms in unit cell.
     192                 :             : !!  rprimd(3,3)=dimensional primitive translations for real space (bohr)
     193                 :             : !!  seed_name= seed_name of files containing cg for all k-points to be used with MPI
     194                 :             : !!  xred(3,natom)=reduced dimensionless atomic coordinates
     195                 :             : !!
     196                 :             : !! OUTPUT
     197                 :             : !!  cm2: Inside sphere part of the overlap needed for constructing wannier function
     198                 :             : !!
     199                 :             : !! SIDE EFFECTS
     200                 :             : !!  (only writing, printing)
     201                 :             : !!
     202                 :             : !! NOTES
     203                 :             : !!  The mpi part will work with mlwfovlp but not for berryphase_new
     204                 :             : !!
     205                 :             : !! SOURCE
     206                 :             : 
     207                 :        2944 :  subroutine smatrix_pawinit(atindx1,cm2,cprj,ikpt1,ikpt2,isppol,&
     208                 :        2944 : & g1,gprimd,kpt,mband,mbandw,mkmem,mpi_enreg,&
     209                 :        2944 : & natom,nband,nkpt,nspinor,nsppol,ntypat,pawang,pawrad,pawtab,rprimd,&
     210                 :        2944 : & seed_name,typat,xred)
     211                 :             : 
     212                 :             : !Arguments---------------------------
     213                 :             : !scalars
     214                 :             :  integer,intent(in) :: ikpt1,ikpt2,isppol,mband,mbandw,mkmem,natom,nkpt,nspinor,nsppol
     215                 :             :  integer,intent(in) :: ntypat
     216                 :             :  character(len=fnlen) ::  seed_name  !seed names of files containing cg info used in case of MPI
     217                 :             :  type(MPI_type),intent(in) :: mpi_enreg
     218                 :             :  type(pawang_type),intent(in) :: pawang
     219                 :             : 
     220                 :             : !arrays
     221                 :             :  integer,intent(in) :: atindx1(natom),g1(3),nband(nsppol*nkpt),typat(natom)
     222                 :             :  real(dp),intent(in) :: gprimd(3,3),kpt(3,nkpt),rprimd(3,3),xred(3,natom)
     223                 :             :  real(dp),intent(inout) :: cm2(2,mbandw,mbandw)
     224                 :             :  type(pawcprj_type) :: cprj(natom,nspinor*mband*mkmem*nsppol)
     225                 :             :  type(pawrad_type),intent(in) :: pawrad(ntypat)
     226                 :             :  type(pawtab_type),intent(in) :: pawtab(ntypat)
     227                 :             : 
     228                 :             : !Local variables---------------------------
     229                 :             : !scalars
     230                 :             :  integer :: dummy
     231                 :             :  integer :: iatom,iband1,iband2,icg1,icg2,idx1,idx2,ii
     232                 :             :  integer :: ilmn,ios,iunit,ir
     233                 :             :  integer :: iorder_cprj,isel,ispinor,itypat,j0lmn,jj,jlmn,klm,klmn,kln,ll,lm0,lmax
     234                 :             :  integer :: lmin,lmn_size,max_lmn,mesh_size,mm,nband_k
     235                 :             :  integer :: nprocs,spaceComm,rank !for mpi
     236                 :             :  real(dp) :: arg,bnorm,delta,intg,ppi,ppr,qijbtemp,qijtot,x1
     237                 :             :  real(dp) :: x2,xsum,xtemp,xx,yy,zz
     238                 :             :  character(len=500) :: message
     239                 :             :  character(len=fnlen) ::  cprj_file  !file containing cg info used in case of MPI
     240                 :             :  logical::lfile
     241                 :             : 
     242                 :             : !arrays
     243                 :        2944 :  integer,allocatable :: dimcprj(:),nattyp_dum(:)
     244                 :             :  real(dp),parameter :: ili(7)=(/zero,-one,zero,one,zero,-one,zero/)
     245                 :             :  real(dp),parameter :: ilr(7)=(/one,zero,-one,zero,one,zero,-one/)
     246                 :        5888 :  real(dp) :: bb(3),bb1(3),bbn(3),qijb(2),xcart(3,natom)
     247                 :        2944 :  real(dp),allocatable :: ff(:),j_bessel(:,:),ylmb(:),ylmrgr_dum(:,:,:)
     248                 :        2944 :  real(dp),allocatable :: sb_out(:)
     249                 :             :  type(pawcprj_type),allocatable :: cprj_k1(:,:)
     250                 :        2944 :  type(pawcprj_type),allocatable :: cprj_k2(:,:)
     251                 :             : 
     252                 :             : ! *************************************************************************
     253                 :             : 
     254                 :             :  DBG_ENTER("COLL")
     255                 :             : 
     256                 :             : !
     257                 :             : !Allocate cprj_k1 and cprj_k2
     258                 :             : !
     259   [ -  +  +  -  :        8832 :  ABI_MALLOC(dimcprj,(natom))
          +  -  +  -  -  
                +  -  + ]
     260                 :        2944 :  call pawcprj_getdim(dimcprj,natom,nattyp_dum,ntypat,typat,pawtab,'R')
     261                 :             : 
     262                 :        2944 :  nband_k=nband(ikpt1)
     263   [ -  +  +  -  :      149632 :  ABI_MALLOC(cprj_k1,(natom,nband_k*nspinor))
          -  +  +  -  +  
          -  +  -  -  +  
          -  +  +  +  +  
                      + ]
     264                 :        2944 :  call pawcprj_alloc(cprj_k1,0,dimcprj)
     265                 :             : 
     266                 :        2944 :  nband_k=nband(ikpt2)
     267   [ -  +  +  -  :      149632 :  ABI_MALLOC(cprj_k2,(natom,nband_k*nspinor))
          -  +  +  -  +  
          -  +  -  -  +  
          -  +  +  +  +  
                      + ]
     268                 :        2944 :  call pawcprj_alloc(cprj_k2,0,dimcprj)
     269         [ -  + ]:        2944 :  ABI_FREE(dimcprj)
     270                 :             : 
     271                 :             : !mpi initialization
     272                 :        2944 :  spaceComm=MPI_enreg%comm_cell
     273                 :        2944 :  nprocs=xmpi_comm_size(spaceComm)
     274                 :        2944 :  rank=MPI_enreg%me_kpt
     275                 :             : 
     276                 :        2944 :  lfile=.false.
     277                 :             : !
     278                 :             : !write(std_out,*) "compute PAW overlap for k-points",ikpt1,ikpt2
     279         [ +  + ]:        6528 :  do iatom=1,natom
     280                 :             :    xcart(:,iatom)=rprimd(:,1)*xred(1,iatom)+&
     281                 :             : &   rprimd(:,2)*xred(2,iatom)+&
     282         [ +  + ]:       17280 : &   rprimd(:,3)*xred(3,iatom)
     283                 :             :  end do
     284                 :             : 
     285                 :             : !
     286                 :             : !Calculate indices icg1 and icg2
     287                 :             : !
     288                 :        2944 :  icg1=0
     289         [ +  + ]:        6656 :  do ii=1,isppol
     290                 :        3712 :    ll=nkpt
     291         [ +  + ]:        3712 :    if(ii==isppol) ll=ikpt1-1
     292         [ +  + ]:      144960 :    do jj=1,ll
     293                 :             : !    MPI: cycle over kpts not treated by this node
     294         [ -  + ]:      138304 :      if ( ABS(MPI_enreg%proc_distrb(jj,1,ii)-rank)/=0) CYCLE
     295                 :             : !    write(std_out,'("kpt loop2: ikpt",i3," rank ",i3)') jj,rank
     296                 :      142016 :      icg1=icg1+nspinor*nband(jj+(ii-1)*nkpt)
     297                 :             :    end do
     298                 :             :  end do
     299                 :        2944 :  icg2=0
     300         [ +  + ]:        6656 :  do ii=1,isppol
     301                 :        3712 :    ll=nkpt
     302         [ +  + ]:        3712 :    if(isppol==ii) ll=ikpt2-1
     303         [ +  + ]:      144960 :    do jj=1,ll
     304                 :             : !    MPI: cycle over kpts not treated by this node
     305         [ -  + ]:      138304 :      if (ABS(MPI_enreg%proc_distrb(jj,1,ii)-rank)/=0) CYCLE
     306                 :             : !    write(std_out,'("kpt loop2: ikpt",i3," rank ",i3)') jj,rank
     307                 :      142016 :      icg2=icg2+nspinor*nband(jj+(ii-1)*nkpt)
     308                 :             :    end do
     309                 :             :  end do
     310                 :             : !
     311                 :             : !MPI: if ikpt2 not found in this processor then
     312                 :             : !read info from an unformatted file
     313                 :             : !
     314         [ -  + ]:        2944 :  if (nprocs>1) then
     315         [ #  # ]:           0 :    if (ABS(MPI_enreg%proc_distrb(ikpt2,1,isppol)-rank)/=0) then
     316                 :           0 :      lfile=.true.
     317                 :             : !
     318                 :             : !    get maximum of lmn_size
     319                 :             :      max_lmn=0
     320                 :             :      do itypat=1,ntypat
     321                 :             :        lmn_size=pawtab(itypat)%lmn_size
     322                 :             :        if(lmn_size>max_lmn) max_lmn=lmn_size
     323                 :             :      end do
     324                 :             : !
     325                 :             : !    get file name and open it
     326                 :             : !
     327                 :           0 :      write(cprj_file,'(a,I5.5,".",I1)') trim(seed_name),ikpt2,isppol
     328                 :           0 :      iunit=1000
     329                 :             : !    write(std_out,*)'reading file',trim(cprj_file)
     330                 :           0 :      open (unit=iunit, file=cprj_file,form='unformatted',status='old',iostat=ios)
     331         [ #  # ]:           0 :      if(ios /= 0) then
     332                 :           0 :        write(message,*) " smatrix_pawinit: file",trim(cprj_file), "not found"
     333                 :           0 :        ABI_ERROR(message)
     334                 :             :      end if
     335                 :             : !
     336                 :             : !    start reading
     337         [ #  # ]:           0 :      do ii=1,mband*nspinor
     338         [ #  # ]:           0 :        do iatom=1,natom
     339                 :           0 :          itypat=typat(iatom)
     340                 :           0 :          lmn_size=pawtab(itypat)%lmn_size
     341         [ #  # ]:           0 :          do ilmn=1,lmn_size
     342   [ #  #  #  # ]:           0 :            read(iunit)(cprj_k2(iatom,ii)%cp(jj,ilmn),jj=1,2)
     343                 :             :          end do !ilmn
     344                 :             :        end do
     345                 :             :      end do
     346                 :             : !
     347                 :             : !    close file
     348                 :             : !
     349                 :           0 :      close (unit=iunit,iostat=ios)
     350         [ #  # ]:           0 :      if(ios /= 0) then
     351                 :           0 :        write(message,*) " smatrix_pawinit: error closing file ",trim(cprj_file)
     352                 :           0 :        ABI_ERROR(message)
     353                 :             :      end if
     354                 :             : !
     355                 :             :    end if
     356                 :             :  end if !mpi
     357                 :             : 
     358                 :             : !Extract cprj_k1 and cprj_k2
     359                 :             : !these contain the projectors cprj for just one k-point (ikpt1 or ikpt2)
     360                 :             : 
     361                 :             : !Extract cprj for k-point 1
     362                 :        2944 :  iorder_cprj=0 !do not change the ordering of cprj
     363                 :        2944 :  nband_k=nband(ikpt1)
     364                 :        2944 :  dummy=1000 !index of file not implemented here, mkmem==0 not implemented
     365                 :             :  call pawcprj_get(atindx1,cprj_k1,cprj,natom,1,icg1,ikpt1,iorder_cprj,isppol,&
     366                 :             : & mband,mkmem,natom,nband_k,nband_k,nspinor,nsppol,dummy,&
     367                 :        2944 : & mpicomm=mpi_enreg%comm_kpt,proc_distrb=mpi_enreg%proc_distrb)
     368                 :             : 
     369                 :             : !Extract cprj for k-point 2
     370         [ +  - ]:        2944 :  if( lfile .eqv. .false. ) then !if it was not already read above
     371                 :             :    iorder_cprj=0 !do not change the ordering of cprj
     372                 :        2944 :    nband_k=nband(ikpt2)
     373                 :             :    dummy=1000 !index of file not implemented here, mkmem==0 not implemented
     374                 :             :    call pawcprj_get(atindx1,cprj_k2,cprj,natom,1,icg2,ikpt2,iorder_cprj,isppol,&
     375                 :             : &   mband,mkmem,natom,nband_k,nband_k,nspinor,nsppol,dummy,&
     376                 :        2944 : &   mpicomm=mpi_enreg%comm_kpt,proc_distrb=mpi_enreg%proc_distrb)
     377                 :             :  end if
     378                 :             : 
     379                 :             : !DEBUG
     380                 :             : !if(ikpt2==2) then
     381                 :             : !if(ikpt1==1) then
     382                 :             : !do iband1=1,mbandw
     383                 :             : !do iatom=1,natom
     384                 :             : !itypat=typat(atindx1(iatom))
     385                 :             : !lmn_size=pawtab(itypat)%lmn_size
     386                 :             : !do ilmn=1,1!lmn_size
     387                 :             : !!write(500,'(a,i3,a,i3,a,i3,a,2f13.7)')'iband ',iband1,' iatom ',iatom,' ilmn ',ilmn,' cprj',cprj(iatom,iband1+icg1)%cp(:,ilmn)
     388                 :             : !write(500,'(a,i3,a,i3,a,i3,a,2f13.7)')'iband ',iband1,' iatom ',atindx1(iatom),' ilmn ',ilmn,' cprj',cprj(atindx1(iatom),iband1+icg1)%cp(:,ilmn)
     389                 :             : !write(500,'(a,i3,a,i3,a,i3,a,2f13.7)')'iband ',iband1,' iatom ',iatom,' ilmn ',ilmn,' cprj_k1 ',cprj_k1(iatom,iband1)%cp(:,ilmn)
     390                 :             : !end do
     391                 :             : !end do
     392                 :             : !end do
     393                 :             : !end if
     394                 :             : !end if
     395                 :             : !NDDEBUG
     396                 :             : 
     397                 :             : !!!!!!!!!!!!!!!!!
     398                 :             : !--- Compute intermediate quantities: "b" vector=k2-k1 and its
     399                 :             : !normalized value: bbn (and its norm: bnorm)
     400                 :             : !compute also Ylm(b).
     401   [ -  +  +  -  :        8832 :  ABI_MALLOC(ylmb,(pawang%l_size_max*pawang%l_size_max))
          +  -  +  -  -  
                +  -  + ]
     402         [ -  + ]:        2944 :  ABI_MALLOC(ylmrgr_dum,(1,1,0))
     403         [ +  + ]:       11776 :  bb(:)=kpt(:,ikpt2)-kpt(:,ikpt1)+g1(:)
     404                 :             :  bb1=bb
     405                 :        2944 :  xx=gprimd(1,1)*bb(1)+gprimd(1,2)*bb(2)+gprimd(1,3)*bb(3)
     406                 :        2944 :  yy=gprimd(2,1)*bb(1)+gprimd(2,2)*bb(2)+gprimd(2,3)*bb(3)
     407                 :        2944 :  zz=gprimd(3,1)*bb(1)+gprimd(3,2)*bb(2)+gprimd(3,3)*bb(3)
     408                 :        2944 :  bnorm=two_pi*dsqrt(xx**2+yy**2+zz**2)
     409         [ -  + ]:        2944 :  if(bnorm<tol8) then
     410                 :             : !  write(std_out,*) "WARNING: bnorm=",bnorm
     411                 :           0 :    bbn(:)=zero
     412                 :             :  else
     413                 :        2944 :    xx=xx*two_pi
     414                 :        2944 :    yy=yy*two_pi
     415                 :        2944 :    zz=zz*two_pi
     416                 :             :    bb(1)=xx
     417                 :             :    bb(2)=yy
     418                 :             :    bb(3)=zz
     419                 :        2944 :    bbn(1)=xx/bnorm
     420                 :        2944 :    bbn(2)=yy/bnorm
     421                 :        2944 :    bbn(3)=zz/bnorm
     422                 :             :  end if
     423                 :             : 
     424                 :             : !debug  bbn=0
     425                 :             : !debug  bnorm=0
     426                 :             : !bbn has to ne normalized
     427                 :        2944 :  call initylmr(pawang%l_size_max,0,1,(/one/),1,bbn(:),ylmb(:),ylmrgr_dum)
     428                 :             : !write(std_out,*) "ylmb(:)",ylmb(:)
     429                 :             : !write(std_out,*) pawang%l_size_max
     430                 :             : !write(std_out,*) "bbn",bbn(:)
     431                 :             : !write(std_out,*) "xx,yy,zz",xx,yy,zz
     432                 :             : !write(std_out,*) "bnorm",bnorm
     433         [ -  + ]:        2944 :  ABI_FREE(ylmrgr_dum)
     434                 :             : 
     435                 :             : !------- First Compute Qij(b)-
     436   [ -  +  +  -  :        8832 :  ABI_MALLOC(sb_out, (pawang%l_size_max))
          +  -  +  -  -  
                +  -  + ]
     437   [ +  +  +  +  :     2473472 :  cm2=zero
                   +  + ]
     438                 :             : 
     439         [ +  + ]:        6528 :  do iatom=1,natom
     440                 :        3584 :    itypat=typat(iatom)
     441                 :        3584 :    lmn_size=pawtab(itypat)%lmn_size
     442                 :             : !  ---  en coordonnnes reelles cartesiennes (espace reel)
     443                 :             : !  ---  first radial part(see pawinit)
     444                 :        3584 :    mesh_size=pawtab(itypat)%mesh_size
     445   [ -  +  +  -  :       14336 :    ABI_MALLOC(j_bessel,(mesh_size,pawang%l_size_max))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     446                 :             : 
     447                 :             : 
     448                 :             : !  ---  compute bessel function for (br) for all angular momenta necessary
     449                 :             : !  ---  and for all value of r.
     450                 :             : !  ---  they are needed for radial part
     451                 :             : !  ---  of the integration => j_bessel(ir,:)
     452         [ +  + ]:     4153600 :    do ir=1,mesh_size
     453                 :     4150016 :      arg=bnorm*pawrad(itypat)%rad(ir)
     454                 :     4150016 :      call sbf8(pawang%l_size_max,arg,sb_out)
     455         [ +  + ]:    21701120 :      j_bessel(ir,:) = sb_out
     456                 :             :    end do
     457                 :             : 
     458                 :             : !  do jlmn=1,pawang%l_size_max
     459                 :             : !  write(665,*) "j_bessel",j_bessel(1:mesh_size,jlmn)
     460                 :             : !  enddo
     461                 :             : !  write(std_out,*) "bessel function computed"
     462                 :             : !  ---  Compute \Sum b.R=xsum for future use
     463                 :             :    xtemp=zero
     464                 :             :    do mm=1,3
     465                 :             :      xtemp=xtemp+xred(mm,iatom)*bb1(mm)
     466                 :             :    end do
     467                 :             :    xtemp=xtemp*two_pi
     468                 :             :    xsum=zero
     469         [ +  + ]:       14336 :    do mm=1,3
     470                 :       14336 :      xsum=xsum+xcart(mm,iatom)*bbn(mm)*bnorm
     471                 :             :    end do
     472                 :             : !  write(std_out,*)'xsum',xsum,xtemp,lmn_size
     473                 :             : 
     474                 :             : !  ---  Loop on jlmn and ilmn
     475                 :             :    qijtot=zero
     476         [ +  + ]:       56576 :    do jlmn=1,lmn_size
     477                 :       52992 :      j0lmn=jlmn*(jlmn-1)/2
     478         [ +  + ]:      513920 :      do ilmn=1,jlmn
     479                 :             : 
     480                 :      457344 :        klmn=j0lmn+ilmn
     481                 :      457344 :        klm=pawtab(itypat)%indklmn(1,klmn);kln=pawtab(itypat)%indklmn(2,klmn)
     482                 :      457344 :        lmin=pawtab(itypat)%indklmn(3,klmn);lmax=pawtab(itypat)%indklmn(4,klmn)
     483                 :             : !      ---  Sum over angular momenta
     484                 :             : !      ---  compute radial part integration for each angular momentum => intg
     485                 :             : !      ---  (3j) symbols follows the rule: l belongs to abs(li-lj), li+lj.
     486                 :      457344 :        qijb=zero
     487         [ -  + ]:      457344 :        do ll=lmin,lmax,2
     488                 :      946048 :          lm0=ll*ll+ll+1
     489   [ -  +  +  -  :     2838144 :          ABI_MALLOC(ff,(mesh_size))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     490                 :             :          ff(1:mesh_size)=(pawtab(itypat)%phiphj(1:mesh_size,kln)&
     491                 :             : &         -pawtab(itypat)%tphitphj(1:mesh_size,kln))&
     492         [ +  + ]:  1014861440 : &         *j_bessel(1:mesh_size,ll+1)
     493                 :      946048 :          call simp_gen(intg,ff,pawrad(itypat))
     494         [ -  + ]:      946048 :          ABI_FREE(ff)
     495                 :      946048 :          qijbtemp=zero
     496         [ +  + ]:     5246208 :          do mm=-ll,ll
     497                 :     4300160 :            isel=pawang%gntselect(lm0+mm,klm)
     498         [ +  + ]:     4300160 :            if (isel>0) qijbtemp=qijbtemp&
     499                 :     1865728 : &           +pawang%realgnt(isel)*ylmb(lm0+mm)
     500                 :             :          end do ! mm
     501                 :             : !        ---     compute angular part with a summation
     502                 :             : !        ---     qijb =\sum_{lm} intg(lm)*qijbtemp
     503                 :      946048 :          qijb(1)=qijb(1) +intg*qijbtemp*ilr(ll+1)
     504         [ +  + ]:     1892096 :          qijb(2)=qijb(2) +intg*qijbtemp*ili(ll+1)
     505                 :             : !        if(ilmn==jlmn) write(std_out,*) "intg, qij",intg,qijbtemp
     506                 :             :        end do ! ll
     507                 :             : 
     508                 :             : !      ---  Add exp(-i.b*R) for each atom.
     509                 :             :        if(ilmn==jlmn) qijtot=qijtot+qijb(1)
     510                 :             : !      if(ilmn==jlmn) write(std_out,*) "qijtot",qijtot
     511                 :      457344 :        x1=qijb(1)*dcos(-xsum)-qijb(2)*dsin(-xsum)
     512                 :      457344 :        x2=qijb(1)*dsin(-xsum)+qijb(2)*dcos(-xsum)
     513                 :             : !      x1 x2 necessary to avoid changing qijb(1) before
     514                 :             : !      computing qijb(2)
     515                 :      457344 :        qijb(1)=x1
     516                 :      457344 :        qijb(2)=x2 !
     517                 :             : !      if(ilmn==jlmn) write(std_out,*) "qij",jlmn,ilmn,qijb(1),qijb(2)
     518                 :             : 
     519         [ +  + ]:     7917696 :        do iband1=1,mbandw ! limite inferieure a preciser
     520         [ +  + ]:   143427456 :          do iband2=1,mbandw
     521                 :             :            ppr=0.d0
     522                 :             :            ppi=0.d0
     523         [ +  + ]:   346770432 :            do ispinor=1,nspinor
     524                 :   211207680 :              idx1=iband1*nspinor-(nspinor-ispinor)
     525                 :   211207680 :              idx2=iband2*nspinor-(nspinor-ispinor) !to take into account spinors
     526                 :             : !            write(std_out,*) "iband2",iband2
     527                 :             : !            product of (a1+ia2)*(b1-ib2) (minus sign because conjugated)
     528                 :             :              ppr=ppr+&
     529                 :             : !            real part a_1*b_1+a_2*b_2
     530                 :             : &             cprj_k1(iatom,idx1)%cp(1,ilmn)*cprj_k2(iatom,idx2)%cp(1,jlmn)+&
     531                 :             : &             cprj_k1(iatom,idx1)%cp(2,ilmn)*cprj_k2(iatom,idx2)%cp(2,jlmn)+&
     532                 :             : !            &     cprj(iatom,idx1+icg1)%cp(1,ilmn)*cprj(iatom,idx2+icg2)%cp(1,jlmn)+&
     533                 :             : !            &     cprj(iatom,idx1+icg1)%cp(2,ilmn)*cprj(iatom,idx2+icg2)%cp(2,jlmn)+&
     534                 :             : !            add term on the other triangle  of the matrix
     535                 :             : !            qij is the same for this part because phi are real.
     536                 :             : &             cprj_k1(iatom,idx1)%cp(1,jlmn)*cprj_k2(iatom,idx2)%cp(1,ilmn)+&
     537                 :   211207680 : &             cprj_k1(iatom,idx1)%cp(2,jlmn)*cprj_k2(iatom,idx2)%cp(2,ilmn)
     538                 :             : !            &     cprj(iatom,idx1+icg1)%cp(1,jlmn)*cprj(iatom,idx2+icg2)%cp(1,ilmn)+&
     539                 :             : !            &     cprj(iatom,idx1+icg1)%cp(2,jlmn)*cprj(iatom,idx2+icg2)%cp(2,ilmn)
     540                 :             :              ppi=ppi+&
     541                 :             : !            imaginary part a_1*b_2-a_2*b_1
     542                 :             : &             cprj_k1(iatom,idx1)%cp(1,ilmn)*cprj_k2(iatom,idx2)%cp(2,jlmn)-&
     543                 :             : &             cprj_k1(iatom,idx1)%cp(2,ilmn)*cprj_k2(iatom,idx2)%cp(1,jlmn)+&
     544                 :             : !            &     cprj(iatom,idx1+icg1)%cp(1,ilmn)*cprj(iatom,idx2+icg2)%cp(2,jlmn)-&
     545                 :             : !            &     cprj(iatom,idx1+icg1)%cp(2,ilmn)*cprj(iatom,idx2+icg2)%cp(1,jlmn)+&
     546                 :             : !            add term on the other triangle  of the matrix
     547                 :             : &             cprj_k1(iatom,idx1)%cp(1,jlmn)*cprj_k2(iatom,idx2)%cp(2,ilmn)-&
     548                 :   346770432 : &             cprj_k1(iatom,idx1)%cp(2,jlmn)*cprj_k2(iatom,idx2)%cp(1,ilmn)
     549                 :             : !            &     cprj(iatom,idx1+icg1)%cp(1,jlmn)*cprj(iatom,idx2+icg2)%cp(2,ilmn)-&
     550                 :             : !            &     cprj(iatom,idx1+icg1)%cp(2,jlmn)*cprj(iatom,idx2+icg2)%cp(1,ilmn)
     551                 :             :            end do !ispinor
     552                 :             : !
     553                 :             : !          delta: diagonal terms are counted twice ! so
     554                 :             : !          we need a 0.5 factor for diagonal elements.
     555                 :   135562752 :            delta=one
     556                 :             : !          write(std_out,*) "ppr and ppi computed",ikpt1,ikpt2,iband1,iband2
     557         [ +  + ]:   135562752 :            if(ilmn==jlmn) delta=half
     558                 :             :            cm2(1,iband1,iband2)= cm2(1,iband1,iband2)+ &
     559                 :   135562752 : &           (qijb(1)*ppr-qijb(2)*ppi)*delta
     560                 :             :            cm2(2,iband1,iband2)= cm2(2,iband1,iband2)+ &
     561                 :   142970112 : &           (qijb(2)*ppr+qijb(1)*ppi)*delta
     562                 :             :          end do ! iband2
     563                 :             :        end do ! iband1
     564                 :             : 
     565                 :             :      end do ! ilmn
     566                 :             :    end do ! jlmn
     567                 :             : !  write(std_out,*) "final qijtot",qijtot
     568         [ -  + ]:        6528 :    ABI_FREE(j_bessel)
     569                 :             :  end do ! iatom
     570                 :             : 
     571         [ -  + ]:        2944 :  ABI_FREE(sb_out)
     572         [ -  + ]:        2944 :  ABI_FREE(ylmb)
     573                 :        2944 :  call pawcprj_free(cprj_k1)
     574                 :        2944 :  call pawcprj_free(cprj_k2)
     575   [ +  -  +  +  :       76416 :  ABI_FREE(cprj_k1)
          -  +  -  +  -  
                      + ]
     576   [ +  -  +  +  :       76416 :  ABI_FREE(cprj_k2)
          -  +  -  +  -  
                      + ]
     577                 :             : 
     578                 :             :  DBG_EXIT("COLL")
     579                 :             : 
     580         [ -  + ]:        2944 :  end subroutine smatrix_pawinit
     581                 :             : !!***
     582                 :             : 
     583                 :             : !----------------------------------------------------------------------
     584                 :             : 
     585                 :             : !!****f* m_paw_overlap/smatrix_k_paw
     586                 :             : !! NAME
     587                 :             : !! smatrix_k_paw
     588                 :             : !!
     589                 :             : !! FUNCTION
     590                 :             : !!
     591                 :             : !! INPUTS
     592                 :             : !!  cprj_k (pawcprj_type) :: cprj for occupied bands at point k
     593                 :             : !!  cprj_kb :: cprj for occupied bands at point k+b
     594                 :             : !!  dtefield :: structure referring to all efield and berry's phase variables
     595                 :             : !!  kdir :: integer giving direction along which overlap is computed for ket
     596                 :             : !!  kfor :: integer indicating whether to compute forward (1) or backward (2)
     597                 :             : !!    along kpt string
     598                 :             : !!  natom :: number of atoms in cell
     599                 :             : !!  typat :: typat(natom) type of each atom
     600                 :             : !!
     601                 :             : !! OUTPUT
     602                 :             : !! smat_k_paw :: array of the on-site PAW parts of the overlaps between Bloch states at points
     603                 :             : !!   k and k+b, for the various pairs of bands, that is, the on-site part of
     604                 :             : !!   <u_nk|u_mk+b>
     605                 :             : !!
     606                 :             : !! SIDE EFFECTS
     607                 :             : !!
     608                 :             : !! NOTES
     609                 :             : !! This routine assumes that the cprj are not explicitly ordered by
     610                 :             : !! atom type.
     611                 :             : !!
     612                 :             : !! SOURCE
     613                 :             : 
     614                 :     1139688 :  subroutine smatrix_k_paw(cprj_k,cprj_kb,dtefield,kdir,kfor,mband,natom,smat_k_paw,typat)
     615                 :             : 
     616                 :             : !Arguments---------------------------
     617                 :             : !scalars
     618                 :             :  integer,intent(in) :: kdir,kfor,mband,natom
     619                 :             :  type(efield_type),intent(in) :: dtefield
     620                 :             :  type(pawcprj_type),intent(in) :: cprj_k(natom,dtefield%nspinor*mband)
     621                 :             :  type(pawcprj_type),intent(in) :: cprj_kb(natom,dtefield%nspinor*mband)
     622                 :             : 
     623                 :             : !arrays
     624                 :             :  integer,intent(in) :: typat(natom)
     625                 :             :  real(dp),intent(out) :: smat_k_paw(2,dtefield%mband_occ,dtefield%mband_occ)
     626                 :             : 
     627                 :             : !Local variables---------------------------
     628                 :             : !scalars
     629                 :             :  integer :: iatom,iband,ibs,ilmn,ispinor,itypat
     630                 :             :  integer :: jband,jbs,jlmn,klmn,nspinor
     631                 :             :  complex(dp) :: cpk,cpkb,cterm,paw_onsite
     632                 :             : ! *************************************************************************
     633                 :             : 
     634                 :             : !initialize smat_k_paw
     635   [ +  +  +  +  :    60403464 :  smat_k_paw(:,:,:) = zero
                   +  + ]
     636                 :             : 
     637                 :             :  nspinor = dtefield%nspinor
     638                 :             : 
     639         [ +  + ]:     3419064 :  do iatom = 1, natom
     640                 :     2279376 :    itypat = typat(iatom)
     641                 :             : 
     642         [ +  + ]:    21654072 :    do ilmn=1,dtefield%lmn_size(itypat)
     643         [ +  + ]:   166394448 :      do jlmn=1,dtefield%lmn_size(itypat)
     644                 :   145880064 :        klmn=max(ilmn,jlmn)*(max(ilmn,jlmn)-1)/2 + min(ilmn,jlmn)
     645                 :             :        paw_onsite = cmplx(dtefield%qijb_kk(1,klmn,iatom,kdir),&
     646                 :   145880064 : &       dtefield%qijb_kk(2,klmn,iatom,kdir))
     647         [ +  + ]:   145880064 :        if (kfor > 1) paw_onsite = conjg(paw_onsite)
     648         [ +  + ]:   309995136 :        do ispinor = 1, nspinor
     649         [ +  + ]:   875280384 :          do iband = 1, dtefield%mband_occ
     650         [ +  + ]:  3063481344 :            do jband = 1, dtefield%mband_occ
     651                 :  2334081024 :              ibs = nspinor*(iband-1) + ispinor
     652                 :  2334081024 :              jbs = nspinor*(jband-1) + ispinor
     653                 :  2334081024 :              cpk=cmplx(cprj_k(iatom,ibs)%cp(1,ilmn),cprj_k(iatom,ibs)%cp(2,ilmn))
     654                 :  2334081024 :              cpkb=cmplx(cprj_kb(iatom,jbs)%cp(1,jlmn),cprj_kb(iatom,jbs)%cp(2,jlmn))
     655                 :  2334081024 :              cterm = conjg(cpk)*paw_onsite*cpkb
     656                 :  2334081024 :              smat_k_paw(1,iband,jband) = smat_k_paw(1,iband,jband)+dreal(cterm)
     657                 :  2917601280 :              smat_k_paw(2,iband,jband) = smat_k_paw(2,iband,jband)+dimag(cterm)
     658                 :             :            end do ! end loop over jband
     659                 :             :          end do ! end loop over iband
     660                 :             :        end do ! end loop over ispinor
     661                 :             :      end do ! end loop over ilmn
     662                 :             :    end do ! end loop over jlmn
     663                 :             : 
     664                 :             :  end do ! end loop over atoms
     665                 :             : 
     666                 :     1139688 :  end subroutine smatrix_k_paw
     667                 :             : !!***
     668                 :             : 
     669                 :             : !----------------------------------------------------------------------
     670                 :             : 
     671                 :             : !!****f* m_paw_overlap/qijb_kk
     672                 :             : !! NAME
     673                 :             : !! qijb_kk
     674                 :             : !!
     675                 :             : !! FUNCTION
     676                 :             : !! Routine which computes PAW onsite part of wavefunction overlap for Bloch
     677                 :             : !! functions at two k-points k and k+b. These
     678                 :             : !! quantities are used in PAW-based computations of polarization and magnetization.
     679                 :             : !!
     680                 :             : !! INPUTS
     681                 :             : !!  dkvecs(3) :: $\Delta k$ input vector
     682                 :             : !!  expibi(2,my_natom,3) :: phase factors at each atomic site for given k offset
     683                 :             : !!  gprimd(3,3)=dimensioned primitive translations of reciprocal lattice
     684                 :             : !!  lmn2max :: lmnmax*(lmnmax+1)/2
     685                 :             : !!  natom=number of atoms in unit cell
     686                 :             : !!  ntypat=number of types of atoms in unit cell
     687                 :             : !!  pawang <type(pawang_type)>=paw angular mesh and related data
     688                 :             : !!  pawrad(ntypat) <type(pawrad_type)>=paw radial mesh and related data
     689                 :             : !!  pawtab(ntypat) <type(pawtab_type)>=paw tabulated starting data
     690                 :             : !!  typat=typat(natom) list of atom types
     691                 :             : !!
     692                 :             : !! OUTPUT
     693                 :             : !!  calc_qijb(2,lmn2max,natom) :: PAW on-site overlaps of wavefunctions at neighboring
     694                 :             : !!                                   k point
     695                 :             : !!
     696                 :             : !! SIDE EFFECTS
     697                 :             : !!
     698                 :             : !! NOTES
     699                 :             : !! this function computes the on-site data for the PAW version of
     700                 :             : !! <u_nk|u_mk+b>, that is, two Bloch vectors at two different k points.
     701                 :             : !!
     702                 :             : !! SOURCE
     703                 :             : 
     704                 :          90 :  subroutine qijb_kk(calc_qijb,dkvecs,expibi,gprimd,lmn2max,natom,ntypat,&
     705                 :          90 : &                   pawang,pawrad,pawtab,typat)
     706                 :             : 
     707                 :             : !Arguments---------------------------
     708                 :             : !scalars
     709                 :             :  integer,intent(in) :: lmn2max,natom,ntypat
     710                 :             :  type(pawang_type),intent(in) :: pawang
     711                 :             :  real(dp),intent(out) :: calc_qijb(2,lmn2max,natom)
     712                 :             : !arrays
     713                 :             :  integer,intent(in) :: typat(natom)
     714                 :             :  real(dp),intent(in) :: dkvecs(3),expibi(2,natom),gprimd(3,3)
     715                 :             :  type(pawrad_type),intent(in) :: pawrad(ntypat)
     716                 :             :  type(pawtab_type),intent(in) :: pawtab(ntypat)
     717                 :             : 
     718                 :             : !Local variables---------------------------
     719                 :             : !scalars
     720                 :             :  integer :: iatom,ir,isel,itypat
     721                 :             :  integer :: klm,kln,klmn,lbess,lbesslm,lmin,lmax,mbess,mesh_size
     722                 :             :  integer :: ylmr_normchoice,ylmr_npts,ylmr_option
     723                 :             :  real(dp) :: arg,bessg,bnorm,intg,rterm
     724                 :             :  complex(dp) :: cterm,etb,ifac
     725                 :             : !arrays
     726                 :             :  real(dp) :: bb(3),bbn(3),bcart(3),ylmgr(1,1,0),ylmr_nrm(1)
     727                 :          90 :  real(dp),allocatable :: ff(:),j_bessel(:,:),ylmb(:),sb_out(:)
     728                 :             : ! the following is (i)^L mod 4.
     729                 :             :  complex(dp),dimension(0:3) :: il(0:3)=(/cone,j_dpc,-cone,-j_dpc/)
     730                 :             : ! *************************************************************************
     731                 :             : 
     732   [ +  +  +  +  :       19710 :  calc_qijb(:,:,:) = zero
                   +  + ]
     733                 :             : 
     734                 :          90 :  ylmr_normchoice = 0 ! input to initylmr are normalized
     735                 :          90 :  ylmr_npts = 1 ! only 1 point to compute in initylmr
     736                 :          90 :  ylmr_nrm(1) = one ! weight of normed point for initylmr
     737                 :          90 :  ylmr_option = 1 ! compute only ylm's in initylmr
     738                 :             : 
     739   [ -  +  +  -  :         270 :  ABI_MALLOC(sb_out, (pawang%l_size_max))
          +  -  +  -  -  
                +  -  + ]
     740                 :             : 
     741         [ +  + ]:         270 :  do iatom = 1, natom
     742                 :             : 
     743                 :         180 :    itypat = typat(iatom)
     744                 :         180 :    mesh_size = pawtab(itypat)%mesh_size
     745                 :             : 
     746   [ -  +  +  -  :         720 :    ABI_MALLOC(j_bessel,(mesh_size,pawang%l_size_max))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     747   [ -  +  +  -  :         540 :    ABI_MALLOC(ff,(mesh_size))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     748   [ -  +  +  -  :         540 :    ABI_MALLOC(ylmb,(pawang%l_size_max*pawang%l_size_max))
          +  -  +  -  -  
                +  -  + ]
     749                 :             : 
     750                 :             :    !    here is exp(-i b.R) for current atom: recall storage in expibi
     751                 :         180 :    etb = cmplx(expibi(1,iatom),expibi(2,iatom))
     752                 :             : 
     753                 :             :    !    note the definition used for the k-dependence of the PAW basis functions:
     754                 :             :    !$|\phi_{i,k}\rangle = exp(-i k\cdot r)|\phi_i\rangle
     755                 :             :    !    see Umari, Gonze, and Pasquarello, PRB 69,235102 [[cite:Umari2004]], Eq. 23. Thus the k-vector on the
     756                 :             :    !    bra side enters as k, while on the ket side it enters as -k.
     757         [ +  + ]:         720 :    bb(:) = -dkvecs(:)
     758                 :             : 
     759                 :             :    !    reference bb to cartesian axes
     760   [ +  +  +  + ]:        2340 :    bcart(1:3)=MATMUL(gprimd(1:3,1:3),bb(1:3))
     761                 :             : 
     762                 :             :    !    bbn is b-hat (the unit vector in the b direction)
     763         [ +  + ]:         720 :    bnorm=dsqrt(dot_product(bcart,bcart))
     764         [ +  + ]:         720 :    bbn(:) = bcart(:)/bnorm
     765                 :             : 
     766                 :             :    !    as an argument to the bessel function, need 2pi*b*r = 1 so b is re-normed to two_pi
     767                 :         180 :    bnorm = two_pi*bnorm
     768         [ +  + ]:       92733 :    do ir=1,mesh_size
     769                 :       92553 :      arg=bnorm*pawrad(itypat)%rad(ir)
     770                 :       92553 :      call sbf8(pawang%l_size_max,arg,sb_out) ! spherical bessel functions at each mesh point
     771         [ +  + ]:      370392 :      j_bessel(ir,:) = sb_out
     772                 :             :    end do ! end loop over mesh
     773                 :             : 
     774                 :             :    !    compute Y_LM(b) here
     775                 :         180 :    call initylmr(pawang%l_size_max,ylmr_normchoice,ylmr_npts,ylmr_nrm,ylmr_option,bbn,ylmb(:),ylmgr)
     776                 :             : 
     777         [ +  + ]:        6660 :    do klmn = 1, pawtab(itypat)%lmn2_size
     778                 :        6480 :      klm =pawtab(itypat)%indklmn(1,klmn)
     779                 :        6480 :      kln =pawtab(itypat)%indklmn(2,klmn)
     780                 :        6480 :      lmin=pawtab(itypat)%indklmn(3,klmn)
     781                 :        6480 :      lmax=pawtab(itypat)%indklmn(4,klmn)
     782   [ -  +  +  + ]:       16920 :      do lbess = lmin, lmax, 2    ! only possible choices for L s.t. Gaunt integrals
     783                 :             :                                   !        will be non-zero
     784                 :       10260 :        ifac = il(mod(lbess,4))
     785         [ +  + ]:       46440 :        do mbess = -lbess, lbess
     786                 :       29700 :          lbesslm = lbess*lbess+lbess+mbess+1
     787                 :       29700 :          isel=pawang%gntselect(lbesslm,klm)
     788         [ +  + ]:       39960 :          if (isel > 0) then
     789                 :        9180 :            bessg = pawang%realgnt(isel)
     790                 :             :            ff(1:mesh_size)=(pawtab(itypat)%phiphj(1:mesh_size,kln)&
     791                 :             : &           -pawtab(itypat)%tphitphj(1:mesh_size,kln))&
     792         [ +  + ]:     4729383 : &           *j_bessel(1:mesh_size,lbess+1)
     793                 :        9180 :            call simp_gen(intg,ff,pawrad(itypat))
     794                 :        9180 :            rterm = four_pi*bessg*intg*ylmb(lbesslm)
     795                 :        9180 :            cterm = etb*ifac*rterm
     796                 :             :            calc_qijb(1,klmn,iatom) = &
     797                 :        9180 : &           calc_qijb(1,klmn,iatom) + dreal(cterm)
     798                 :             :            calc_qijb(2,klmn,iatom) = &
     799                 :        9180 : &           calc_qijb(2,klmn,iatom) + dimag(cterm)
     800                 :             : 
     801                 :             :          end if ! end selection on non-zero Gaunt factors
     802                 :             :        end do ! end loop on mbess = -lbess, lbess
     803                 :             :      end do ! end loop on lmin-lmax bessel l values
     804                 :             :    end do ! end loop on lmn2_size klmn basis pairs
     805                 :             : 
     806         [ -  + ]:         180 :    ABI_FREE(j_bessel)
     807         [ -  + ]:         180 :    ABI_FREE(ff)
     808         [ -  + ]:         270 :    ABI_FREE(ylmb)
     809                 :             :  end do ! end loop over atoms
     810                 :             : 
     811         [ -  + ]:          90 :  ABI_FREE(sb_out)
     812                 :             : 
     813         [ -  + ]:          90 :  end subroutine qijb_kk
     814                 :             : !!***
     815                 :             : 
     816                 :             : !----------------------------------------------------------------------
     817                 :             : 
     818                 :             : !!****f* m_paw_overlap/expibi
     819                 :             : !! NAME
     820                 :             : !! expibi
     821                 :             : !!
     822                 :             : !! FUNCTION
     823                 :             : !! Routine that computes exp(i (-b_ket).R) at each site.
     824                 :             : !!
     825                 :             : !! INPUTS
     826                 :             : !!  dkvecs(3) :: $\Delta k$ increment
     827                 :             : !!  natom :: number of atoms in unit cell
     828                 :             : !!  xred(natom,3) :: reduced coordinates of atoms in unit cell
     829                 :             : !!
     830                 :             : !! OUTPUT
     831                 :             : !!  calc_expibi(2,natom) :: phase factors at each atom for vector shift
     832                 :             : !!
     833                 :             : !! SIDE EFFECTS
     834                 :             : !!
     835                 :             : !! NOTES
     836                 :             : !!
     837                 :             : !! SOURCE
     838                 :             : 
     839                 :          90 :  subroutine expibi(calc_expibi,dkvecs,natom,xred)
     840                 :             : 
     841                 :             : !Arguments---------------------------
     842                 :             : !scalars
     843                 :             :  integer,intent(in) :: natom
     844                 :             :  real(dp),intent(out) :: calc_expibi(2,natom)
     845                 :             : !arrays
     846                 :             :  real(dp),intent(in) :: dkvecs(3),xred(3,natom)
     847                 :             : 
     848                 :             : !Local variables---------------------------
     849                 :             : !scalars
     850                 :             :  integer :: iatom
     851                 :             :  real(dp) :: bdotr
     852                 :             : 
     853                 :             : ! *************************************************************************
     854                 :             : 
     855   [ +  +  +  + ]:         630 :  calc_expibi(:,:) = zero
     856                 :             : 
     857                 :             :  !calc_expibi(2,natom)
     858                 :             :  !used for PAW field calculations (distributed over atomic sites)
     859                 :             :  !stores the on-site phase factors arising from
     860                 :             :  !$\langle\phi_{i,k}|\phi_{j,k+\sigma_k k_k}\rangle$
     861                 :             :  !where $\sigma = \pm 1$. These overlaps arise in various Berry
     862                 :             :  !phase calculations of electric and magnetic polarization. The on-site
     863                 :             :  !phase factor is $\exp[-i\sigma_k k_k)\cdot I]$ where
     864                 :             :  !$I$ is the nuclear position.
     865                 :             : 
     866         [ +  + ]:         270 :  do iatom = 1, natom
     867                 :             : 
     868                 :             :     !    note the definition used for the k-dependence of the PAW basis functions:
     869                 :             :     !$|\phi_{i,k}\rangle = exp(-i k\cdot r)|\phi_i\rangle
     870                 :             :     !    see Umari, Gonze, and Pasquarello, PRB 69,235102 [[cite:Umari2004]] Eq. 23.
     871         [ +  + ]:         720 :    bdotr = DOT_PRODUCT(xred(1:3,iatom),-dkvecs(1:3))
     872                 :             :     !    here is exp(i b.R) for the given site
     873                 :         180 :    calc_expibi(1,iatom) = cos(two_pi*bdotr)
     874                 :         270 :    calc_expibi(2,iatom) = sin(two_pi*bdotr)
     875                 :             : 
     876                 :             :  end do ! end loop on natom
     877                 :             : 
     878                 :          90 :  end subroutine expibi
     879                 :             : !!***
     880                 :             : 
     881                 :             : !----------------------------------------------------------------------
     882                 :             : 
     883                 :             : END MODULE m_paw_overlap
     884                 :             : !!***
        

Generated by: LCOV version 2.3-1