LCOV - code coverage report
Current view: top level - src/66_nonlocal - m_vkbr.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 97.9 % 190 186
Test Date: 2026-09-19 15:24:51 Functions: 77.8 % 9 7

            Line data    Source code
       1              : !!****m* ABINIT/m_vkbr
       2              : !! NAME
       3              : !!  m_vkbr
       4              : !!
       5              : !! FUNCTION
       6              : !!  This module provides objects and methods used to calculate the matrix elements
       7              : !!  of the commutator [H,r] needed for the correct treatment of the optical limit q-->0
       8              : !!  in the matrix elements <k-q,b1|e^{-iqr}|k,b2> when non-local pseudopotentials are used.
       9              : !!
      10              : !! NOTES
      11              : !!  This module is deprecated. Use ddkop_t in m_ddk.F90
      12              : !!
      13              : !! COPYRIGHT
      14              : !! Copyright (C) 2008-2026 ABINIT group (MG, FB)
      15              : !! This file is distributed under the terms of the
      16              : !! GNU General Public License, see ~abinit/COPYING
      17              : !! or http://www.gnu.org/copyleft/gpl.txt .
      18              : !!
      19              : !! SOURCE
      20              : 
      21              : #if defined HAVE_CONFIG_H
      22              : #include "config.h"
      23              : #endif
      24              : 
      25              : #include "abi_common.h"
      26              : 
      27              : MODULE m_vkbr
      28              : 
      29              :  use defs_basis
      30              :  use m_hide_blas
      31              :  use m_errors
      32              :  use m_abicore
      33              : 
      34              :  use defs_datatypes,  only : pseudopotential_type
      35              :  use m_gwdefs,        only : czero_gw
      36              :  use m_fstrings,      only : sjoin, itoa
      37              :  use m_paw_sphharm,   only : ylmc, ylmcd
      38              :  use m_geometry,      only : normv
      39              :  use m_crystal,       only : crystal_t
      40              :  use m_kg,            only : mkkin
      41              :  use m_mkffnl,        only : mkffnl
      42              : 
      43              :  implicit none
      44              : 
      45              :  private
      46              : !!***
      47              : 
      48              : !----------------------------------------------------------------------
      49              : 
      50              : !!****t* m_vkbr/vkbr_t
      51              : !! NAME
      52              : !!
      53              : !! FUNCTION
      54              : !!  Matrix elements in |k+G> space needed for the
      55              : !!  evaluation of the matrix elements of the commutator [Vnl,r] for the
      56              : !!  optical limit in <kb1|e^{-iqr}|kb2>.
      57              : !!
      58              : !! SOURCE
      59              : 
      60              :  type,public :: vkbr_t
      61              : 
      62              :   integer :: istwfk
      63              :   ! Storage mode of the G vectors for this k-point.
      64              : 
      65              :   integer :: ntypat
      66              :   ! Number of type of atoms
      67              : 
      68              :   integer :: natom
      69              :   ! Number of atoms
      70              : 
      71              :   integer :: mpsang
      72              :   ! Max l+1 over atoms
      73              : 
      74              :   integer :: npw
      75              :   ! Number of G-vectors.
      76              : 
      77              :   integer :: inclvkb
      78              :   ! Option for calculating the matrix elements of [Vnl,r].
      79              :   ! 0 to exclude commutator, 2 to include it
      80              : 
      81              :   real(dp) :: kpoint(3)
      82              :   ! The k-point in reduced coordinates.
      83              : 
      84              :   complex(gwp),allocatable :: fnl(:,:,:,:)
      85              :   ! fnl(npw,mpsang**2,mproj,natom)
      86              : 
      87              :   complex(gwp),allocatable :: fnld(:,:,:,:,:)
      88              :   ! fnld(3,npw,mpsang**2,mproj,natom)
      89              : 
      90              :  end type vkbr_t
      91              : 
      92              :  public :: vkbr_init       ! vkbr_t Constructor
      93              :  public :: vkbr_free       ! Free memory
      94              :  public :: nc_ihr_comm     ! Compute matrix elements of the commutator i[H,r] for NC pseudos
      95              :  public :: calc_vkb        ! Kleynman-Bylander form factors and derivatives.
      96              : !!***
      97              : 
      98              :  interface vkbr_free
      99              :    module procedure vkbr_free_0D
     100              :    module procedure vkbr_free_1D
     101              :  end interface vkbr_free
     102              : 
     103              : CONTAINS  !========================================================================================
     104              : 
     105              : !----------------------------------------------------------------------
     106              : 
     107              : !!****f* m_vkbr/vkbr_init
     108              : !! NAME
     109              : !!  vkbr_init
     110              : !!
     111              : !! FUNCTION
     112              : !!  Creation method the the vkbr_t structures datatype.
     113              : !!
     114              : !! INPUTS
     115              : !!  cryst<crystal_t>=Datatype gathering info on the crystal structure.
     116              : !!  psps<pseudopotential_type>Structure gathering info on the pseudopotentials.
     117              : !!  inclvkb=Option defining the algorithm used for the application of [Vnl,r].
     118              : !!    2 for Spherical harmonics
     119              : !!  istwfk=Storage mode for the wavefunctions at this k-point.
     120              : !!  npw=Number of planewaves in <k+G1|[Vnl,r]|k+G2>
     121              : !!  kpoint(3)=K-point of interest in reduced coordinates.
     122              : !!  gvec(3,npw)=Reduced coordinates of the G-vectors.
     123              : !!
     124              : !! OUTPUT
     125              : !!  vkbr<vkbr_t>=Structure containing arrays needed for calculating <\psi_1|[Vnl,r]\psi_2>.
     126              : !!    Completely initialized in output.
     127              : !!
     128              : !! SOURCE
     129              : 
     130         7208 : subroutine vkbr_init(vkbr,cryst,psps,inclvkb,istwfk,npw,kpoint,gvec)
     131              : 
     132              : !Arguments ------------------------------------
     133              : !scalars
     134              :  integer,intent(in) :: npw,inclvkb,istwfk
     135              :  type(crystal_t),intent(in) :: cryst
     136              :  type(vkbr_t),intent(inout) :: vkbr
     137              :  type(pseudopotential_type),intent(in) :: psps
     138              : !arrays
     139              :  integer,intent(in) :: gvec(3,npw)
     140              :  real(dp),intent(in) :: kpoint(3)
     141              : 
     142              : !Local variables-------------------------------
     143              : !scalars
     144              :  integer :: ierr
     145              :  character(len=500) :: msg
     146              : !arrays
     147         7208 :  real(dp),allocatable :: vkb(:,:,:),vkbd(:,:,:),vkbsign(:,:)
     148              : !************************************************************************
     149              : 
     150              :  !@vkbr_t
     151         7208 :  vkbr%istwfk = istwfk
     152         7208 :  vkbr%ntypat = cryst%ntypat
     153         7208 :  vkbr%natom = cryst%natom
     154         7208 :  vkbr%mpsang  = psps%mpsang
     155         7208 :  vkbr%npw = npw
     156         7208 :  vkbr%inclvkb = inclvkb
     157        28832 :  vkbr%kpoint = kpoint
     158              : 
     159              :  ! Calculate KB form factors and derivatives.
     160              :  ! The arrays are allocated with lnmax to support pseudos with more than projector.
     161              :  ! Note that lnmax takes into account lloc hence arrays are in packed form and one should be
     162              :  ! accessed with the indices provided by indlmn.
     163              :  ! TODO: they should be calculated on-the-fly using calc_vkb
     164              :  !       For the moment, we opt for a quick an dirty implementation.
     165              : 
     166        28832 :  ABI_MALLOC(vkbsign, (psps%lnmax, cryst%ntypat))
     167        36040 :  ABI_MALLOC(vkb, (npw, psps%lnmax, cryst%ntypat))
     168        28832 :  ABI_MALLOC(vkbd, (npw, psps%lnmax, cryst%ntypat))
     169         7208 :  call calc_vkb(cryst,psps,kpoint,npw,npw,gvec,vkbsign,vkb,vkbd)
     170              : 
     171         7208 :  select case (inclvkb)
     172              :  case (2)
     173              :    ! Complex spherical harmonics (CPU and mem \propto npw).
     174         7208 :    write(msg,'(a,f12.1)')'out-of-memory in fnl; Mb= ',one*npw*psps%mpsang**2*psps%mproj*cryst%natom*2*gwp*b2Mb
     175        43248 :    ABI_STAT_MALLOC(vkbr%fnl,(npw,psps%mpsang**2,psps%mproj,cryst%natom), ierr)
     176         7208 :    ABI_CHECK(ierr==0, msg)
     177              : 
     178         7208 :    write(msg,'(a,f12.1)')'out-of-memory in fnld; Mb= ',three*npw*psps%mpsang**2*psps%mproj*cryst%natom*2*gwp*b2Mb
     179        43248 :    ABI_STAT_MALLOC(vkbr%fnld,(3,npw,psps%mpsang**2,psps%mproj,cryst%natom), ierr)
     180         7208 :    ABI_CHECK(ierr==0, msg)
     181              : 
     182         7208 :    call ccgradvnl_ylm(cryst,psps,npw,gvec,kpoint,vkbsign,vkb,vkbd,vkbr%fnl,vkbr%fnld)
     183              : 
     184              :  case default
     185         7208 :    ABI_ERROR(sjoin("Wrong inclvkb= ",itoa(inclvkb)))
     186              :  end select
     187              : 
     188         7208 :  ABI_FREE(vkbsign)
     189         7208 :  ABI_FREE(vkb)
     190         7208 :  ABI_FREE(vkbd)
     191              : 
     192         7208 : end subroutine vkbr_init
     193              : !!***
     194              : 
     195              : !----------------------------------------------------------------------
     196              : 
     197              : !!****f* m_vkbr/vkbr_free_0D
     198              : !! NAME
     199              : !!  vkbr_free_0D
     200              : !!
     201              : !! FUNCTION
     202              : !!  Free all memory allocated in a structure of type vkbr_t
     203              : !!
     204              : !! SOURCE
     205              : 
     206         8085 : subroutine vkbr_free_0D(vkbr)
     207              : 
     208              : !Arguments ------------------------------------
     209              :  type(vkbr_t),intent(inout) :: vkbr
     210              : !************************************************************************
     211              : 
     212              : !complex
     213         8085 :  ABI_SFREE(vkbr%fnl)
     214         8085 :  ABI_SFREE(vkbr%fnld)
     215              : 
     216         8085 : end subroutine vkbr_free_0D
     217              : !!***
     218              : 
     219              : !----------------------------------------------------------------------
     220              : 
     221              : !!****f* m_vkbr/vkbr_free_1D
     222              : !! NAME
     223              : !!  vkbr_free_1D
     224              : !!
     225              : !! FUNCTION
     226              : !!  Free all memory allocated in a structure of type vkbr_t
     227              : !!
     228              : !! SOURCE
     229              : 
     230          146 : subroutine vkbr_free_1D(vkbr)
     231              : 
     232              : !Arguments ------------------------------------
     233              : !arrays
     234              :  type(vkbr_t),intent(inout) :: vkbr(:)
     235              : 
     236              : !Local variables ------------------------------
     237              : !scalars
     238              :  integer :: ii
     239              : !************************************************************************
     240              : 
     241          995 :  do ii=1,SIZE(vkbr)
     242          995 :    call vkbr_free_0D(vkbr(ii))
     243              :  end do
     244              : 
     245          146 : end subroutine vkbr_free_1D
     246              : !!***
     247              : 
     248              : !----------------------------------------------------------------------
     249              : 
     250              : !!****f* m_vkbr/add_vnlr_commutator
     251              : !! NAME
     252              : !!  add_vnlr_commutator
     253              : !!
     254              : !! FUNCTION
     255              : !!  Calculate the matrix elements of the dipole operator <phi1|r|phi2>.
     256              : !!  For norm conserving potentials the commutator [Vnl,r] is included according to inclvkb.
     257              : !!
     258              : !! INPUTS
     259              : !!  vkbr<vkbr_t>
     260              : !!  cryst<crystal_t>=Datatype gathering info on the crystal structure.
     261              : !!  psps<pseudopotential_type>Structure gathering info on the pseudopotentials.
     262              : !!  npw=Number of G for wavefunctions.
     263              : !!  nspinor=Number of spinorial components.
     264              : !!  ug1(npw*nspinor)=Left wavefunction.
     265              : !!  ug2(npw*nspinor)=Right wavefunction
     266              : !!
     267              : !! SIDE EFFECTS
     268              : !!  rhotwx(3,nspinor**2)= Updated. Matrix elements in reduced coordinates, see NOTES below.
     269              : !!
     270              : !! NOTES
     271              : !!   1) <k b1|e^{-iq.r}|k b2> = \delta_{b1 b2} -iq <k b1|r|k b2> =  \delta_{b1 b2} -iq ( <k b1| [H,r] |k b2> / (e1-e2) ).
     272              : !!
     273              : !!      This routine calculates the matrix elements of ir*(e1-e2)
     274              : !!      Remember that [H,r] = -\nabla + [V_nl,r]
     275              : !!
     276              : !!  2) The Fourier transform of a two-point real function f(r1,r2) satisfies:
     277              : !!      a) f_{\Gamma}(G1,G2) = f_{\Gamma}(-G1,-G2)^*
     278              : !!      b) f_{G0/2}  (G1,G2) = f_{G0/2}(-G1-G0,-G2-G0)^*
     279              : !!
     280              : !! TODO
     281              : !!  *) Spinorial case is not implemented.
     282              : !!
     283              : !! SOURCE
     284              : 
     285       262099 : subroutine add_vnlr_commutator(vkbr,cryst,psps,npw,nspinor,ug1,ug2,rhotwx)
     286              : 
     287              : !Arguments ------------------------------------
     288              : !scalars
     289              :  integer,intent(in) :: npw,nspinor
     290              :  type(vkbr_t),intent(in) :: vkbr
     291              :  type(crystal_t),intent(in) :: cryst
     292              :  type(pseudopotential_type),intent(in) :: psps
     293              : !arrays
     294              :  complex(gwp),target,intent(in) :: ug1(npw*nspinor),ug2(npw*nspinor)
     295              :  complex(gwp),intent(inout) :: rhotwx(3,nspinor**2)
     296              : 
     297              : !Local variables ------------------------------
     298              : !scalars
     299              :  integer :: iat,ig,ilm,itypat,nlmn,ilmn,iln0,iln,il,in,im
     300              :  complex(gwp) :: cta1,cta4
     301              : !arrays
     302              :  complex(gwp) :: dum(3),cta2(3),cta3(3),gamma_term(3)
     303              : !************************************************************************
     304              : 
     305       262099 :  ABI_CHECK(nspinor == 1, "inclvkb > 0 with nspinor == 2 is not coded")
     306              : 
     307              :  ! Adding term i <c,k|[Vnl,r]|v,k> ===
     308       524198 :  select case (vkbr%inclvkb)
     309              :  case (2)
     310              :   ! Complex spherical harmonics (much faster!).
     311       262099 :   dum=czero_gw; gamma_term=czero
     312              : 
     313       796803 :   do iat=1,vkbr%natom
     314       534704 :     itypat = cryst%typat(iat)
     315      2402146 :     nlmn = count(psps%indlmn(3,:,itypat) > 0)
     316              :     iln0 = 0
     317      2639399 :     do ilmn=1,nlmn
     318      1842596 :       il = 1 + psps%indlmn(1,ilmn,itypat)
     319      1842596 :       in = psps%indlmn(3,ilmn,itypat)
     320      1842596 :       iln = psps%indlmn(5,ilmn,itypat)
     321      1842596 :       if (iln <= iln0) cycle
     322      1842596 :       iln0 = iln
     323              :       !if (indlmn(6,ilmn,itypat) /= 1 .or. vkbsign(iln,itypat) == zero) cycle
     324              :       !in = 1
     325      7183444 :       do im=1,2*(il-1)+1
     326              :         ! Index of im and il
     327      4806144 :         ilm = im + (il-1)*(il-1)
     328      4806144 :         cta1 = czero_gw; cta2(:) = czero_gw
     329      4806144 :         cta4 = czero_gw; cta3(:) = czero_gw
     330   2081840840 :         do ig=1,npw
     331              :           ! Here we take advantage of the property Y_(l-m)= (-i)^m Y_lm^*.
     332   2077034696 :           cta1   = cta1    + ug1(ig) * vkbr%fnl (ig,ilm,in,iat)
     333   8308138784 :           cta2(:)= cta2(:) + ug2(ig) * vkbr%fnld(:,ig,ilm,in,iat)
     334   8308138784 :           cta3(:)= cta3(:) + ug1(ig) * vkbr%fnld(:,ig,ilm,in,iat)
     335   2077034696 :           cta4   = cta4    + ug2(ig) * vkbr%fnl (ig,ilm,in,iat)
     336   2096259272 :           if (ig==1) gamma_term = gamma_term + CONJG(cta1)*cta2(:) +CONJG(cta3(:))*cta4
     337              :         end do
     338     21067172 :         dum(:)= dum(:) + CONJG(cta1)*cta2(:) + CONJG(cta3(:))*cta4
     339              :       end do
     340              : 
     341              :     end do
     342              :   end do
     343              : 
     344       262099 :   if (vkbr%istwfk>1) then
     345        16896 :     dum = two * j_dpc * AIMAG(dum); if (vkbr%istwfk==2) dum = dum - j_dpc * AIMAG(gamma_term)
     346              :   end if
     347      1048396 :   rhotwx(:,1) = rhotwx(:,1) + dum(:)
     348              : 
     349              :  case default
     350       262099 :    ABI_ERROR(sjoin("Wrong inclvkb:", itoa(vkbr%inclvkb)))
     351              :  end select
     352              : 
     353       262099 : end subroutine add_vnlr_commutator
     354              : !!***
     355              : 
     356              : !----------------------------------------------------------------------
     357              : 
     358              : !!****f* m_vkbr/calc_vkb
     359              : !! NAME
     360              : !!  calc_vkb
     361              : !!
     362              : !! FUNCTION
     363              : !!  This routine calculates the Kleynman-Bylander form factors and its derivatives
     364              : !!  needed for the evaluation of the matrix elements of the dipole operator <phi1|r|phi2>.
     365              : !!
     366              : !! INPUTS
     367              : !!  cryst<crystal_t>=Crystalline structure
     368              : !!  psps<pseudopotential_type>=Structured datatype gathering information on the pseudopotentials.
     369              : !!  kpoint(3)=The k-point in reduced coordinates.
     370              : !!  npw_k=Number of plane waves for this k-point.
     371              : !!  kg_k(3,npw_k)=Reduced coordinates of the G-vectors.
     372              : !!  rprimd(3,3)=dimensional primitive translations for real space (bohr)
     373              : !!
     374              : !! OUTPUT
     375              : !!  vkb (npw_k, %lnmax, %ntypat)=KB form factors.
     376              : !!  vkbd(npw_k, %lnmax, %ntypat)=KB form factor derivatives.
     377              : !!  vkbsign(%lnmax, %ntypat)   =KS dyadic sign.
     378              : !!
     379              : !! TODO
     380              : !!  SOC not implemented.
     381              : !!
     382              : !! SOURCE
     383              : 
     384         7474 : subroutine calc_vkb(cryst,psps,kpoint,npw_k,mpw,kg_k,vkbsign,vkb,vkbd)
     385              : 
     386              : !Arguments ------------------------------------
     387              : !scalars
     388              :  integer,intent(in) :: npw_k, mpw
     389              :  type(crystal_t),intent(in) :: cryst
     390              :  type(pseudopotential_type),intent(in) :: psps
     391              : !arrays
     392              :  integer,intent(in) :: kg_k(3,npw_k)
     393              :  real(dp),intent(in) :: kpoint(3)
     394              :  real(dp),intent(out) :: vkb (mpw,psps%lnmax,psps%ntypat)
     395              :  real(dp),intent(out) :: vkbd(mpw,psps%lnmax,psps%ntypat)
     396              :  real(dp),intent(out) :: vkbsign(psps%lnmax,psps%ntypat)
     397              : 
     398              : !Local variables ------------------------------
     399              : !scalars
     400              :  integer :: dimffnl,ider,idir,itypat,nkpg,in,il,ilmn,ig,iln,iln0,nlmn
     401              :  real(dp) :: effmass_free,ecutsm,ecut
     402              : !arrays
     403         7474 :  real(dp),allocatable :: ffnl(:,:,:,:),kpg_dum(:,:),modkplusg(:),ylm_gr(:,:,:),ylm_k(:,:)
     404              : ! *************************************************************************
     405              : 
     406              :  DBG_ENTER("COLL")
     407         7474 :  ABI_CHECK(psps%usepaw==0, "You should not be here!")
     408         7474 :  ABI_CHECK(psps%useylm==0, "useylm/=0 not considered!")
     409              : 
     410              :  ! Compute KB dyadic sign.
     411        43567 :  vkbsign=zero
     412        15026 :  do itypat=1,psps%ntypat
     413         7552 :    iln0 = 0
     414        36093 :    nlmn = count(psps%indlmn(3,:,itypat) > 0)
     415        43474 :    do ilmn=1,nlmn
     416        28448 :      iln = psps%indlmn(5,ilmn,itypat)
     417        28448 :      if (iln <= iln0) cycle
     418        28448 :      iln0 = iln
     419        36000 :      if (abs(psps%ekb(iln,itypat)) > 1.0d-10) vkbsign(iln,itypat) = dsign(one, psps%ekb(iln,itypat))
     420              :    end do
     421              :  end do
     422              : 
     423              :  ! Allocate KB form factor and derivative wrt k+G
     424              :  ! Here we do not use correct ordering for dimensions
     425         7474 :  idir=0; nkpg=0; ider=1; dimffnl=2 ! To retrieve the first derivative.
     426              : 
     427              :  ! Quantities used only if useylm==1
     428        29896 :  ABI_MALLOC(ylm_k, (npw_k, psps%mpsang**2*Psps%useylm))
     429        37370 :  ABI_MALLOC(ylm_gr, (npw_k, 3+6*(ider/2),psps%mpsang**2*Psps%useylm))
     430        14948 :  ABI_MALLOC(kpg_dum, (npw_k, nkpg))
     431        44844 :  ABI_MALLOC(ffnl, (npw_k,dimffnl, psps%lmnmax, psps%ntypat))
     432              : 
     433              :  call mkffnl(psps%dimekb,dimffnl,Psps%ekb,ffnl,Psps%ffspl,cryst%gmet,cryst%gprimd,ider,idir,Psps%indlmn,&
     434              :    kg_k,kpg_dum,kpoint,psps%lmnmax,Psps%lnmax,Psps%mpsang,Psps%mqgrid_ff,nkpg,npw_k,&
     435         7474 :    psps%ntypat,Psps%pspso,Psps%qgrid_ff,cryst%rmet,Psps%usepaw,Psps%useylm,ylm_k,ylm_gr)
     436              : 
     437         7474 :  ABI_FREE(ylm_k)
     438         7474 :  ABI_FREE(ylm_gr)
     439         7474 :  ABI_FREE(kpg_dum)
     440              : 
     441        22422 :  ABI_MALLOC(modkplusg, (npw_k))
     442         7474 :  effmass_free = one; ecutsm = zero; ecut = huge(one)
     443         7474 :  call mkkin(ecut,ecutsm,effmass_free,cryst%gmet,kg_k,modkplusg,kpoint,npw_k,0,0)
     444      2389982 :  modkplusg(:) = SQRT(half/pi**2*modkplusg(:))
     445      2389982 :  modkplusg(:) = MAX(modkplusg(:),tol10)
     446              : 
     447              :  ! Calculate matrix elements.
     448     21326540 :  vkb=zero; vkbd=zero
     449              : 
     450        15026 :  do itypat=1,psps%ntypat
     451         7552 :    iln0 = 0
     452        36093 :    nlmn = count(psps%indlmn(3,:,itypat) > 0)
     453        43474 :    do ilmn=1,nlmn
     454        28448 :      il = 1 + psps%indlmn(1,ilmn,itypat)
     455        28448 :      in = psps%indlmn(3,ilmn,itypat)
     456        28448 :      iln = psps%indlmn(5,ilmn,itypat)
     457              :      !write(*,*)ilmn, iln, il, in
     458        28448 :      if (iln <= iln0) cycle
     459        28448 :      iln0 = iln
     460              :      !if (vkbsign(iln,itypat) == zero) cycle
     461        36000 :      if (ABS(psps%ekb(iln,itypat)) > 1.0d-10) then
     462        28448 :        ABI_CHECK(iln == ilmn, "iln != ilmn")
     463              :        !ABI_CHECK(il == iln, "il != iln")
     464        28448 :        if (il==1) then
     465      3568535 :          vkb (1:npw_k,iln,itypat) = ffnl(:,1,iln,itypat)
     466      3568535 :          vkbd(1:npw_k,iln,itypat) = ffnl(:,2,iln,itypat)*modkplusg(:)/two_pi
     467        18589 :        else if (il==2) then
     468      3945843 :          vkb(1:npw_k,iln,itypat)  = ffnl(:,1,iln,itypat)*modkplusg(:)
     469      3945843 :          do ig=1,npw_k
     470              :            vkbd(ig,iln,itypat) = ((ffnl(ig,2,iln,itypat)*modkplusg(ig)*modkplusg(ig))+&
     471      3945843 :             ffnl(ig,1,iln,itypat) )/two_pi
     472              :          end do
     473         7328 :        else if (il==3) then
     474      2606737 :          vkb (1:npw_k,iln,itypat) =  ffnl(:,1,iln,itypat)*modkplusg(:)**2
     475              :          vkbd(1:npw_k,iln,itypat) = (ffnl(:,2,iln,itypat)*modkplusg(:)**3+&
     476      2606737 :           2*ffnl(:,1,iln,itypat)*modkplusg(:) )/two_pi
     477         1536 :        else if (il==4) then
     478       435120 :          vkb (1:npw_k,iln,itypat) =  ffnl(:,1,iln,itypat)*modkplusg(:)**3
     479              :          vkbd(1:npw_k,iln,itypat) = (ffnl(:,2,iln,itypat)*modkplusg(:)**4+&
     480       435120 :           3*ffnl(:,1,iln,itypat)*modkplusg(:)**2 )/two_pi
     481              :        end if
     482     10619543 :        vkb (:,iln,itypat) = SQRT(4*pi/cryst%ucvol*(2*il-1)*ABS(psps%ekb(iln,itypat)))*vkb (:,iln,itypat)
     483     10619543 :        vkbd(:,iln,itypat) = SQRT(4*pi/cryst%ucvol*(2*il-1)*ABS(psps%ekb(iln,itypat)))*vkbd(:,iln,itypat)
     484              :      end if
     485              :    end do
     486              :  end do
     487              : 
     488         7474 :  ABI_FREE(ffnl)
     489         7474 :  ABI_FREE(modkplusg)
     490              : 
     491              :  DBG_EXIT("COLL")
     492              : 
     493         7474 : end subroutine calc_vkb
     494              : !!***
     495              : 
     496              : !----------------------------------------------------------------------
     497              : 
     498              : !!****f* m_vkbr/nc_ihr_comm
     499              : !! NAME
     500              : !!  nc_ihr_comm
     501              : !!
     502              : !! FUNCTION
     503              : !!  Calculate the matrix elements of the commutator i[H,r]
     504              : !!  For NC pseudppotentials, the commutator i[Vnl,r] is included depending on inclvkb.
     505              : !!
     506              : !! INPUTS
     507              : !!  vkbr<vkbr_t>
     508              : !!  cryst<crystal_t>=Unit cell and symmetries
     509              : !!  psps<pseudopotential_type>Structure gathering info on the pseudopotentials.
     510              : !!  nspinor=Number of spinorial components.
     511              : !!  npw=Number of G for wavefunctions.
     512              : !!  istwfk=Storage mode for wavefunctions.
     513              : !!  inclvkb=Option defining whether [Vnl,r] is added or not.
     514              : !!  kpoint(3)=k-point in reduced coordinates.
     515              : !!  ug1(npw*nspinor)=Left wavefunction.
     516              : !!  ug2(npw*nspinor)=Right wavefunction
     517              : !!  gvec(3,npw)=Planes waves for wavefunctions.
     518              : !!
     519              : !! OUTPUT
     520              : !!  ihr_comm(3,nspinor**2)= Matrix elements of the commutator i[H,r] between the input states.
     521              : !!   Result is in reduced coordinates. ug1 and ug2 are supposed to be orthogonal.
     522              : !!
     523              : !! NOTES
     524              : !!  <k b1|e^{-iq.r}|k b2> = \delta_{b1 b2} -iq <k b1|r|k b2> =  \delta_{b1 b2} -iq ( <k b1| [H,r] |k b2> / (e1-e2) ).
     525              : !!  Remember that [H,r] = -\nabla + [V_nl,r]
     526              : !!
     527              : !! TODO
     528              : !!  *) Spinorial case is not implemented.
     529              : !!
     530              : !! SOURCE
     531              : 
     532       306205 : function nc_ihr_comm(vkbr, cryst, psps, npw, nspinor, istwfk, inclvkb, kpoint, ug1, ug2, gvec) result(ihr_comm)
     533              : 
     534              : !Arguments ------------------------------------
     535              : !scalars
     536              :  integer,intent(in) :: npw,nspinor,inclvkb,istwfk
     537              :  type(vkbr_t),intent(in) :: vkbr
     538              :  type(crystal_t),intent(in) :: cryst
     539              :  type(Pseudopotential_type),intent(in) :: psps
     540              : !arrays
     541              :  integer,intent(in) :: gvec(3,npw)
     542              :  real(dp),intent(in) :: kpoint(3)
     543              :  complex(gwp),intent(in) :: ug1(npw*nspinor),ug2(npw*nspinor)
     544              :  complex(gwp) :: ihr_comm(3,nspinor**2)
     545              : 
     546              : !Local variables ------------------------------
     547              : !scalars
     548              :  integer :: ig,iab,spad1,spad2
     549              :  complex(dp) :: c_tmp
     550              : !arrays
     551              :  integer :: spinorwf_pad(2,4)
     552              : !************************************************************************
     553              : 
     554              :  ! [H, r] = -\nabla + [V_{nl}, r]
     555              :  ! V_nl is present only in the case of NC pseudos but
     556              :  ! not in PAW unless even the AE Hamiltonian in non-local e.g. DFT+U or LEXX.
     557              : 
     558              :  ! -i <c,k|\nabla_r|v,k> in reduced coordinates is always included.
     559              :  ! -i <c,k|\nabla_r|v,k> = \sum_G u_{ck}^*(G) [k+G] u_{vk}(G)
     560              :  ! Note that here we assume c/=v, moreover the ug are supposed to be orthonormal and
     561              :  ! hence k+G can be replaced by G.
     562              :  ! HM 03/08/2018: we need band velocities so we don't assume c/=v anymore and we use k+G.
     563              : 
     564      2755845 :  spinorwf_pad = reshape([0, 0, npw, npw, 0, npw, npw, 0], [2, 4])
     565      1551761 :  ihr_comm = czero
     566              : 
     567              :  ! -i <c,k|\nabla_r|v,k> in reduced coordinates.
     568              :  ! This term is spin diagonal if nspinor == 2
     569       306205 :  if (istwfk == 1) then
     570       598650 :    do iab=1,nspinor
     571       300189 :      spad1 = spinorwf_pad(1,iab); spad2 = spinorwf_pad(2,iab)
     572     95543042 :      do ig=1,npw
     573     94944392 :        c_tmp = GWPC_CONJG(ug1(ig+spad1)) * ug2(ig+spad2)
     574    380077757 :        ihr_comm(:,iab) = ihr_comm(:,iab) + c_tmp * (kpoint + gvec(:,ig))
     575              :      end do
     576              :    end do
     577              :  else
     578              :    ! Symmetrized expression: \sum_G  (k+G) 2i Im [ u_a^*(G) u_b(G) ]. (k0, G0) term is null.
     579         7744 :    ABI_CHECK(nspinor == 1, "nspinor != 1")
     580      4078928 :    do ig=1,npw
     581      4071184 :      c_tmp = GWPC_CONJG(ug1(ig)) * ug2(ig)
     582     16292480 :      ihr_comm(:,1) = ihr_comm(:,1) + two*j_dpc * AIMAG(c_tmp) * (kpoint + gvec(:,ig))
     583              :    end do
     584              :  end if
     585              : 
     586              :  ! Add second term $i <c,k|[Vnl,r]|v,k> $ in reduced cordinates.
     587       306205 :  if (inclvkb /= 0) then
     588       262099 :    ABI_CHECK(istwfk == vkbr%istwfk, "input istwfk /= vkbr%istwfk")
     589       262099 :    call add_vnlr_commutator(vkbr,cryst,psps,npw,nspinor,ug1,ug2,ihr_comm)
     590              :  end if
     591              : 
     592       306205 : end function nc_ihr_comm
     593              : !!***
     594              : 
     595              : !----------------------------------------------------------------------
     596              : 
     597              : !!****f* m_vkbr/ccgradvnl_ylm
     598              : !! NAME
     599              : !! ccgradvnl_ylm
     600              : !!
     601              : !! FUNCTION
     602              : !!  Compute Vnl(K) and grad_K Vnl(K) three reciprocal lattice units components
     603              : !!  using spherical harmonics instead of Legendre polynomials
     604              : !!  Needed for chi0(q=0)
     605              : !!
     606              : !! INPUTS
     607              : !!  cryst<crystal_t>=Unit cell and symmetries
     608              : !!  psps<pseudopotential_type>Structure gathering info on the pseudopotentials.
     609              : !!  npw=number of planewaves for wavefunctions
     610              : !!  gvec(3,npw)=integer coordinates of each plane wave in reciprocal space
     611              : !!  kpoint(3)=K-point in reduced coordinates.
     612              : !!  vkbsign(lnmax,ntypat)=sign of each KB dyadic product
     613              : !!  vkb(npw,lnmax,ntypat)=KB projector function
     614              : !!  vkbd(npw,lnmax,ntypat)=derivative of the KB projector function in reciprocal space
     615              : !!
     616              : !! OUTPUT
     617              : !!  fnl(npw,mpsang*2,natom),
     618              : !!  fnld(3,npw,mpsang*2,natom)
     619              : !!
     620              : !! NOTES
     621              : !!  Subroutine taken from the EXC code
     622              : !!  All the calculations are done in double precision, but the output arrays fnl and fnld
     623              : !!  are in single precision, should use double precision after modification of the other subroutines
     624              : !!
     625              : !! SOURCE
     626              : 
     627         7208 : subroutine ccgradvnl_ylm(cryst,psps,npw,gvec,kpoint,vkbsign,vkb,vkbd,fnl,fnld)
     628              : 
     629              : !Arguments ------------------------------------
     630              : !scalars
     631              :  integer,intent(in) :: npw
     632              :  type(crystal_t),intent(in) :: cryst
     633              :  type(pseudopotential_type),intent(in) :: psps
     634              : !arrays
     635              :  integer,intent(in) :: gvec(3,npw)
     636              :  real(dp),intent(in) :: kpoint(3)
     637              :  real(dp),intent(in) :: vkb(npw,psps%lnmax,cryst%ntypat)
     638              :  real(dp),intent(in) :: vkbd(npw,psps%lnmax,cryst%ntypat)
     639              :  real(dp),intent(in) :: vkbsign(psps%lnmax,cryst%ntypat)
     640              :  complex(gwp),intent(out) :: fnl(npw,psps%mpsang**2,psps%mproj,cryst%natom)
     641              :  complex(gwp),intent(out) :: fnld(3,npw,psps%mpsang**2,psps%mproj,cryst%natom)
     642              : 
     643              : !Local variables-------------------------------
     644              : !scalars
     645              :  integer :: ii,iat,ig,il,im,ilm,itypat,nlmn,iln0,iln,ilmn,in
     646              :  real(dp),parameter :: ppad=tol6
     647              :  real(dp) :: cosphi,costh,factor,mkg,mkg2,sinphi,sinth,sq,xdotg
     648              :  complex(dp) :: dphi,dth,sfac
     649              :  character(len=500) :: msg
     650              : !arrays
     651              :  real(dp) :: gcart(3),kcart(3),kg(3)
     652              :  real(dp) :: b1(3),b2(3),b3(3),a1(3),a2(3),a3(3)
     653              :  complex(dp) :: dylmcart(3),dylmcrys(3),gradphi(3),gradth(3)
     654              : !************************************************************************
     655              : 
     656              :  DBG_ENTER("COLL")
     657              : 
     658         7208 :  if (psps%mpsang > 4) then
     659              :    write(msg,'(3a)')&
     660            0 :     'Number of angular momentum components bigger than programmed.',ch10,&
     661            0 :     'Taking into account only s p d f '
     662            0 :    ABI_ERROR(msg)
     663              :  end if
     664              : 
     665        50456 :  a1=cryst%rprimd(:,1); b1=two_pi*Cryst%gprimd(:,1)
     666        50456 :  a2=cryst%rprimd(:,2); b2=two_pi*Cryst%gprimd(:,2)
     667        50456 :  a3=cryst%rprimd(:,3); b3=two_pi*Cryst%gprimd(:,3)
     668              : 
     669              :  ! Calculate Kleiman-Bylander factor and first derivative.
     670    302556980 :  fnl=czero_gw; fnld=czero_gw
     671              : 
     672      2303630 :  do ig=1,npw
     673              :    ! Get kcart = k+G in Cartesian coordinates.
     674      9185688 :    kg(:)= kpoint(:) + REAL(gvec(:,ig))
     675      9185688 :    kcart(:) = kg(1)*b1(:) + kg(2)*b2(:) + kg(3)*b3(:)
     676              :    ! Solve the problem with sinth=0. or sinphi=0
     677      2296422 :    if (ABS(kcart(2))<ppad) kcart(2) = kcart(2) + ppad
     678              : 
     679      2296422 :    mkg2 = kcart(1)**2+kcart(2)**2+kcart(3)**2
     680      2296422 :    mkg = SQRT(mkg2)
     681              :    ! The next to solve the problem with k=Gamma.
     682              :    !if (mkg < 0.0001) cycle
     683              : 
     684      2296422 :    sq=SQRT(kcart(1)**2+kcart(2)**2)
     685              : 
     686              :    gcart(:)=  REAL(gvec(1,ig))*b1(:)&
     687              : &            +REAL(gvec(2,ig))*b2(:)&
     688      9185688 : &            +REAL(gvec(3,ig))*b3(:)
     689              : 
     690              :    ! Calculate spherical coordinates (th, phi).
     691      2296422 :    costh = kcart(3)/mkg
     692      2296422 :    sinth = sq/mkg
     693      2296422 :    cosphi= kcart(1)/sq
     694      2296422 :    sinphi= kcart(2)/sq
     695              : 
     696      2296422 :    gradth(1)  = kcart(1)*kcart(3)/mkg**3/sinth
     697      2296422 :    gradth(2)  = kcart(2)*kcart(3)/mkg**3/sinth
     698      2296422 :    gradth(3)  = -(one/mkg-kcart(3)**2/mkg**3)/sinth
     699      2296422 :    gradphi(1) = -(one/sq - kcart(1)**2/sq**3)/sinphi
     700      2296422 :    gradphi(2) = kcart(2)*kcart(1)/sq**3/sinphi
     701      2296422 :    gradphi(3) = czero
     702              : 
     703      6915877 :    do iat=1,cryst%natom
     704      4612247 :      itypat = cryst%typat(iat)
     705      4612247 :      xdotg = gcart(1)*cryst%xcart(1,iat)+gcart(2)*Cryst%xcart(2,iat)+gcart(3)*Cryst%xcart(3,iat)
     706              :      ! Remember that in the GW code the reciprocal vectors
     707              :      ! are defined such as a_i*b_j = 2pi delta_ij, no need to introduce 2pi
     708      4612247 :      sfac=CMPLX(COS(xdotg), SIN(xdotg), kind=dp)
     709              : 
     710      4612247 :      iln0 = 0
     711     22304549 :      nlmn = count(psps%indlmn(3,:,itypat) > 0)
     712     24542383 :      do ilmn=1,nlmn
     713     17633714 :        il = 1 + psps%indlmn(1,ilmn,itypat)
     714     17633714 :        in = psps%indlmn(3,ilmn,itypat)
     715     17633714 :        iln = psps%indlmn(5,ilmn,itypat)
     716              :        ! spin = 1 if scalar term (spin diagonal), 2 if SOC term.
     717              :        !spin = psps%indlmn(6, ilmn, itypat)
     718     17633714 :        if (iln <= iln0) cycle
     719     17633714 :        iln0 = iln
     720     17633714 :        if (vkbsign(iln,itypat) == zero) cycle
     721              :        !if (spin /= 1 .or. vkbsign(iln,itypat) == zero) cycle
     722     17633714 :        factor = SQRT(four_pi/REAL(2*(il-1)+1))
     723     70067907 :        do im=1,2*(il-1)+1
     724              :          ! Index of im and il
     725     47821946 :          ilm = im + (il-1)*(il-1)
     726              : 
     727              :          ! Calculate the first KB factor, note that fnl is simple precision complex
     728     47821946 :          fnl(ig,ilm,in,iat) = factor*sfac*ylmc(il-1,im-il,kcart) * vkb(ig,iln,itypat) * vkbsign(iln,itypat)
     729              : 
     730              :          ! Calculate the second KB factor (involving first derivatives)
     731              :          ! dYlm/dK = dYlm/dth * grad_K th + dYlm/dphi + grad_K phi
     732     47821946 :          call ylmcd(il-1,im-il,kcart,dth,dphi)
     733    191287784 :          dylmcart(:) = dth*gradth(:) + dphi*gradphi(:)
     734              : 
     735              :          ! Cartesian to crystallographic axis
     736              :          ! Notice: a bug was discovered by Marco Cazzaniga, december 2009
     737              :          ! the transformation matrix A=(a1,a2,a3) must act *on its left* on the
     738              :          ! covariant vector dylmcart (a *row* vector). The previous implementation assumed A
     739              :          ! acting on its right on a column vector, yielding wrong results for the (small)
     740              :          ! non local contributions to the spectra, such as a spurious anisotropy in isotropic systems.
     741              :          ! This is the correct version:
     742     47821946 :          dylmcrys(1) = (a1(1)*dylmcart(1)+a1(2)*dylmcart(2)+a1(3)*dylmcart(3))/(two_pi)
     743     47821946 :          dylmcrys(2) = (a2(1)*dylmcart(1)+a2(2)*dylmcart(2)+a2(3)*dylmcart(3))/(two_pi)
     744     47821946 :          dylmcrys(3) = (a3(1)*dylmcart(1)+a3(2)*dylmcart(2)+a3(3)*dylmcart(3))/(two_pi)
     745              : 
     746              :          ! Note that fnld is simple precision complex, it could be possible to use double precision
     747    208921498 :          do ii=1,3
     748              :            fnld(ii,ig,ilm,in,iat) = factor*sfac* &
     749    191287784 :             ( kg(ii)/mkg*ylmc(il-1,im-il,kcart)*vkbd(ig,iln,itypat) + dylmcrys(ii)*vkb(ig,iln,itypat) )
     750              :          end do
     751              : 
     752              :        end do !im
     753              :      end do !il
     754              :    end do !iat
     755              :  end do !ig
     756              : 
     757              :  DBG_EXIT("COLL")
     758              : 
     759         7208 : end subroutine ccgradvnl_ylm
     760              : !!***
     761              : 
     762              : !----------------------------------------------------------------------
     763              : 
     764            0 : END MODULE m_vkbr
     765              : !!***
        

Generated by: LCOV version 2.3-1