LCOV - code coverage report
Current view: top level - src/65_paw - m_paw_hr.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 19.4 % 216 42
Test Date: 2026-11-10 15:53:16 Functions: 28.6 % 7 2
Branches: 16.1 % 384 62

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_paw_hr
       2                 :             : !! NAME
       3                 :             : !!  m_paw_hr
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !!  This module provides objects and methods to calculate the matrix elements
       7                 :             : !!  of the commutator PAW [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>. As PAW is a full potential method
       9                 :             : !!  the commutator reduces to the contribution given by the velocity operator.
      10                 :             : !!  However, when the all-electron Hamiltonian is non-local (e.g. DFT+U or
      11                 :             : !!  LEXX) additional on-site terms have to be considered in the calculation of the
      12                 :             : !!  matrix elements of [H.r].
      13                 :             : !!
      14                 :             : !! COPYRIGHT
      15                 :             : !! Copyright (C) 2008-2026 ABINIT group (MG)
      16                 :             : !! This file is distributed under the terms of the
      17                 :             : !! GNU General Public License, see ~abinit/COPYING
      18                 :             : !! or http://www.gnu.org/copyleft/gpl.txt .
      19                 :             : !!
      20                 :             : !! SOURCE
      21                 :             : 
      22                 :             : #if defined HAVE_CONFIG_H
      23                 :             : #include "config.h"
      24                 :             : #endif
      25                 :             : 
      26                 :             : #include "abi_common.h"
      27                 :             : 
      28                 :             : MODULE m_paw_hr
      29                 :             : 
      30                 :             :  use defs_basis
      31                 :             :  use m_abicore
      32                 :             :  use m_errors
      33                 :             : 
      34                 :             :  use m_crystal,        only : crystal_t
      35                 :             :  use m_pawang,         only : pawang_type
      36                 :             :  use m_pawrad,         only : pawrad_type, simp_gen
      37                 :             :  use m_pawtab,         only : pawtab_type
      38                 :             :  use m_paw_ij,         only : paw_ij_type
      39                 :             :  use m_pawfgrtab,      only : pawfgrtab_type
      40                 :             :  use m_pawcprj,        only : pawcprj_type
      41                 :             :  use m_pawdij,         only : pawpupot
      42                 :             :  use m_paw_pwaves_lmn, only : paw_pwaves_lmn_t
      43                 :             : 
      44                 :             :  implicit none
      45                 :             : 
      46                 :             :  private
      47                 :             : !!***
      48                 :             : 
      49                 :             : !----------------------------------------------------------------------
      50                 :             : 
      51                 :             : !!****t* m_paw_hr/pawhur_t
      52                 :             : !! NAME
      53                 :             : !!  pawhur_t
      54                 :             : !!
      55                 :             : !! FUNCTION
      56                 :             : !!  The pawhur_t data type stores basic dimensions and quantities
      57                 :             : !!  used in the GW part for the treatment of the non-analytic behavior of the
      58                 :             : !!  heads and wings of the irreducible polarizability in the long wave-length limit (i.e. q-->0).
      59                 :             : !!  Note that, within the PAW formalism, a standard KS Hamiltonian has a semi-local contribution
      60                 :             : !!  arising from the kinetic operator (if we work in the AE representation).
      61                 :             : !!  When DFT+U is used, a fully non-local term is added to the Hamiltonian whose commutator with the position operator
      62                 :             : !!  has to be considered during the calculation of the heads and wings of the polarizability in the optical limit
      63                 :             : !!
      64                 :             : !! SOURCE
      65                 :             : 
      66                 :             :  type,public :: pawhur_t
      67                 :             : 
      68                 :             :   integer :: lmn_size
      69                 :             :   integer :: lmn2_size
      70                 :             :   integer :: nsppol
      71                 :             :   !integer :: nsel
      72                 :             : 
      73                 :             :   integer,allocatable :: ij_select(:,:,:)
      74                 :             :   ! ijselect(lmn_size,lmn_size,nsppol)
      75                 :             :   ! Selection rules of ij matrix elements
      76                 :             :   ! Do not take into account selection on x-y-x for the time being.
      77                 :             : 
      78                 :             :   real(dp),allocatable :: commutator(:,:,:)
      79                 :             :   ! commutator(3,nsel,nsppol)
      80                 :             :  end type pawhur_t
      81                 :             : 
      82                 :             :  public ::  pawhur_init          ! Init object
      83                 :             :  public ::  pawhur_free          ! Deallocate memory
      84                 :             :  public ::  paw_ihr
      85                 :             :  public ::  paw_cross_ihr_comm
      86                 :             : 
      87                 :             : !!***
      88                 :             : 
      89                 :             : CONTAINS  !========================================================================================
      90                 :             : !!***
      91                 :             : 
      92                 :             : !----------------------------------------------------------------------
      93                 :             : 
      94                 :             : !!****f* m_paw_hr/pawhur_free
      95                 :             : !! NAME
      96                 :             : !! pawhur_free
      97                 :             : !!
      98                 :             : !! FUNCTION
      99                 :             : !!  Deallocate memory
     100                 :             : !!
     101                 :             : !! SOURCE
     102                 :             : 
     103         [ -  + ]:          35 : subroutine pawhur_free(Hur)
     104                 :             : 
     105                 :             : !Arguments ------------------------------------
     106                 :             :  type(pawhur_t),intent(inout) :: Hur(:)
     107                 :             : 
     108                 :             : !Local variables-------------------------------
     109                 :             :  integer :: iat
     110                 :             : ! *************************************************************************
     111                 :             : 
     112         [ +  + ]:          72 :  do iat=1,SIZE(Hur)
     113         [ -  + ]:          37 :    ABI_SFREE(Hur(iat)%ij_select)
     114         [ -  + ]:          72 :    ABI_SFREE(Hur(iat)%commutator)
     115                 :             :  end do
     116                 :             : 
     117                 :          35 : end subroutine pawhur_free
     118                 :             : !!***
     119                 :             : 
     120                 :             : !----------------------------------------------------------------------
     121                 :             : 
     122                 :             : !!****f* m_paw_hr/paw_ihr
     123                 :             : !! NAME
     124                 :             : !! paw_ihr
     125                 :             : !!
     126                 :             : !! FUNCTION
     127                 :             : !!  Calculate the PAW onsite contribution to the matrix elements of the i\nabla operator.
     128                 :             : !!  in cartesian coordinates. Take also into account the contribution arising from the U
     129                 :             : !!  part of the Hamiltonian (if any)
     130                 :             : !!
     131                 :             : !! INPUTS
     132                 :             : !!  isppol=Spin index.
     133                 :             : !!  nspinor=Number of spinori components.
     134                 :             : !!  npw=Number of planewaves for this k-point.
     135                 :             : !!  istwfk=Storage mode for the wavefunctions.
     136                 :             : !!  kpoint(3)=k-point in reduced coordinates.
     137                 :             : !!  Cryst<crystal_t>=Info on the crystal structure.
     138                 :             : !!    %natom=Number of atoms in unit cell
     139                 :             : !!    %typat(natom)
     140                 :             : !!  Pawtab(ntypat)=Only for PAW, TABulated data initialized at start
     141                 :             : !!    %lmn_size Number of (l,m,n) elements for the paw basis
     142                 :             : !!    %nabla_ij(3,lmn_size,lmn_size)) Onsite contribution
     143                 :             : !!      <phi_i|nabla|phi_j>-<tphi_i|nabla|tphi_j> for each type
     144                 :             : !!  ug1(nspinor*npwwfn)=Left wavefunction.
     145                 :             : !!  ug2(nspinor*npwwfn)=Right wavefunction
     146                 :             : !!  HUr(natom)=Commutator of the DFT+U part of the Hamiltonian with the position operator.
     147                 :             : !!  Cprj_kb1(natom,nspinor),Cprj_kb2(natom,nspinor) <type(pawcprj_type)>=
     148                 :             : !!   projected input wave functions <Proj_i|Cnk> with all NL projectors corresponding to
     149                 :             : !!   wavefunctions (k,b1,s) and (k,b2,s), respectively.
     150                 :             : !!
     151                 :             : !! OUTPUT
     152                 :             : !!  onsite(2,3)=Onsite contribution to  $i<ug1|\nabla|ug2>$
     153                 :             : !!
     154                 :             : !! SOURCE
     155                 :             : 
     156         [ -  + ]:        3758 : function paw_ihr(isppol,nspinor,npw,istwfk,kpoint,Cryst,Pawtab,ug1,ug2,gvec,Cprj_kb1,Cprj_kb2,HUr) result(ihr_comm)
     157                 :             : 
     158                 :             : !Arguments ------------------------------------
     159                 :             : !scalars
     160                 :             :  integer,intent(in) :: isppol,nspinor,npw,istwfk
     161                 :             :  complex(gwp) :: ihr_comm(3,nspinor**2)
     162                 :             :  type(crystal_t),intent(in) :: Cryst
     163                 :             : !arrays
     164                 :             :  integer,intent(in) :: gvec(3,npw)
     165                 :             :  real(dp),intent(in) :: kpoint(3)
     166                 :             :  complex(gwp),intent(in) :: ug1(nspinor*npw),ug2(nspinor*npw)
     167                 :             :  type(Pawtab_type),target,intent(in) :: Pawtab(Cryst%ntypat)
     168                 :             :  type(pawcprj_type),intent(in) :: Cprj_kb1(Cryst%natom,nspinor),Cprj_kb2(Cryst%natom,nspinor)
     169                 :             :  type(pawhur_t),intent(in) :: Hur(Cryst%natom)
     170                 :             : 
     171                 :             : !Local variables-------------------------------
     172                 :             :  integer :: iatom,itypat,lmn_size,ilmn,jlmn,isel
     173                 :             :  integer :: ig,iab,spad1,spad2
     174                 :             :  real(dp) :: re_p,im_p
     175                 :             :  complex(dp) :: ctemp
     176                 :             : !arrays
     177                 :             :  integer :: spinorwf_pad(2,4)
     178                 :             :  real(dp) :: hurc_ij(3),ons_cart(2,3) !,ons_comm_red(2,3)
     179                 :             :  real(dp) :: gspace_cart2red(3,3) !rs_cart2red(3,3),
     180                 :        3758 :  real(dp), contiguous, pointer :: nabla_ij(:,:,:)
     181                 :        7516 :  complex(gwp) :: ihr_comm_cart(3,nspinor**2)
     182                 :             : ! *************************************************************************
     183                 :             : 
     184                 :             :  ! [H, r] = -\nabla + [V_{nl}, r]
     185                 :             :  ! Note that V_nl is present only if the AE-Hamiltonian is non-local e.g. DFT+U or LEXX.
     186         [ +  + ]:       33822 :  spinorwf_pad=RESHAPE((/0,0,npw,npw,0,npw,npw,0/),(/2,4/))
     187   [ +  +  +  + ]:       18790 :  ihr_comm=zero
     188                 :             : 
     189                 :             :  ! -i <c,k|\nabla_r|v,k> = \sum_G u_{ck}^*(G) [k+G] u_{vk}(G) in reduced coordinates.
     190         [ +  + ]:        3758 :  if (istwfk==1) then
     191         [ +  + ]:        7246 :    do iab=1,nspinor**2
     192                 :        3623 :      spad1 = spinorwf_pad(1,iab)
     193                 :        3623 :      spad2 = spinorwf_pad(2,iab)
     194         [ +  + ]:     1373867 :      do ig=1,npw
     195                 :     1366621 :        ctemp = CONJG(ug1(ig+spad1)) * ug2(ig+spad2)
     196         [ +  + ]:     5470107 :        ihr_comm(:,iab) = ihr_comm(:,iab) + ctemp* ( kpoint + gvec(:,ig))
     197                 :             :      end do
     198                 :             :    end do
     199                 :             :  else
     200                 :             :    ! Symmetrized expression: \sum_G  (k+G) 2i Im [ u_a^*(G) u_b(G) ]. (k0,G0) term is null.
     201         [ +  + ]:       22410 :    do ig=1,npw
     202                 :       22275 :      ctemp = CONJG(ug1(ig)) * ug2(ig)
     203         [ +  + ]:       89235 :      ihr_comm(:,1) = ihr_comm(:,1) + two*j_dpc * AIMAG(ctemp) * (kpoint + gvec(:,ig))
     204                 :             :    end do
     205                 :             :  end if
     206                 :             :  !
     207                 :             :  ! Add on-site terms.
     208                 :        3758 :  ons_cart=zero
     209         [ -  + ]:        3758 :  ABI_CHECK(nspinor==1,"nspinor/=1 not coded")
     210                 :             : 
     211         [ +  + ]:       13290 :  do iatom=1,Cryst%natom
     212                 :        9532 :    itypat=Cryst%typat(iatom)
     213                 :        9532 :    lmn_size=Pawtab(itypat)%lmn_size
     214                 :        9532 :    nabla_ij => Pawtab(itypat)%nabla_ij(:,:,:)
     215                 :             :    !
     216                 :             :    !=== Unpacked loop over lmn channels ====
     217         [ +  + ]:       91247 :    do jlmn=1,lmn_size
     218         [ +  + ]:      771760 :      do ilmn=1,lmn_size
     219                 :             :        re_p =  Cprj_kb1(iatom,1)%cp(1,ilmn)*Cprj_kb2(iatom,1)%cp(1,jlmn) &
     220                 :      684271 : &             +Cprj_kb1(iatom,1)%cp(2,ilmn)*Cprj_kb2(iatom,1)%cp(2,jlmn)
     221                 :             : 
     222                 :             :        im_p =  Cprj_kb1(iatom,1)%cp(1,ilmn)*Cprj_kb2(iatom,1)%cp(2,jlmn) &
     223                 :      684271 : &             -Cprj_kb1(iatom,1)%cp(2,ilmn)*Cprj_kb2(iatom,1)%cp(1,jlmn)
     224                 :             : 
     225                 :             :        ! Onsite contribution given by -i\nabla.
     226                 :      684271 :        ons_cart(1,1)=ons_cart(1,1) + im_p*nabla_ij(1,ilmn,jlmn)
     227                 :      684271 :        ons_cart(1,2)=ons_cart(1,2) + im_p*nabla_ij(2,ilmn,jlmn)
     228                 :      684271 :        ons_cart(1,3)=ons_cart(1,3) + im_p*nabla_ij(3,ilmn,jlmn)
     229                 :             : 
     230                 :      684271 :        ons_cart(2,1)=ons_cart(2,1) - re_p*nabla_ij(1,ilmn,jlmn)
     231                 :      684271 :        ons_cart(2,2)=ons_cart(2,2) - re_p*nabla_ij(2,ilmn,jlmn)
     232                 :      684271 :        ons_cart(2,3)=ons_cart(2,3) - re_p*nabla_ij(3,ilmn,jlmn)
     233                 :             :        !
     234         [ -  + ]:      762228 :        if (Pawtab(itypat)%usepawu/=0) then ! Add i[V_u, r]
     235                 :           0 :          isel=Hur(iatom)%ij_select(ilmn,jlmn,isppol)
     236         [ #  # ]:           0 :          if (isel>0) then
     237         [ #  # ]:           0 :            hurc_ij(:)=Hur(iatom)%commutator(:,isel,isppol)
     238                 :             : 
     239                 :           0 :            ons_cart(1,1)=ons_cart(1,1) - im_p*hurc_ij(1)
     240                 :           0 :            ons_cart(1,2)=ons_cart(1,2) - im_p*hurc_ij(2)
     241                 :           0 :            ons_cart(1,3)=ons_cart(1,3) - im_p*hurc_ij(3)
     242                 :             : 
     243                 :           0 :            ons_cart(2,1)=ons_cart(2,1) + re_p*hurc_ij(1)
     244                 :           0 :            ons_cart(2,2)=ons_cart(2,2) + re_p*hurc_ij(2)
     245                 :           0 :            ons_cart(2,3)=ons_cart(2,3) + re_p*hurc_ij(3)
     246                 :             :          end if
     247                 :             :        end if
     248                 :             : 
     249                 :             :      end do !ilmn
     250                 :             :    end do !jlmn
     251                 :             :  end do !iatom
     252                 :             : 
     253                 :             :  ! ons_cart is in Cartesian coordinates in real space
     254                 :             :  ! while ihr_comm is in reduced coordinates in reciprocal space in terms of gprimd.
     255                 :             :  !rs_cart2red = TRANSPOSE(Cryst%gprimd) ! if <r> is in terms of real space vectors
     256   [ +  +  +  + ]:       48854 :  gspace_cart2red = TRANSPOSE(Cryst%rprimd)
     257                 :             : 
     258                 :             :  !ons_comm_red(1,:)=MATMUL(rs_cart2red,ons_comm(1,:))
     259                 :             :  !ons_comm_red(2,:)=MATMUL(rs_cart2red,ons_comm(2,:))
     260                 :             :  !ihr_comm(:,1) = ihr_comm(:,1) + CMPLX(ons_comm_red(1,:),ons_comm_red(2,:),kind=gwp)
     261                 :             : 
     262   [ +  +  +  +  :      127772 :  ihr_comm_cart(:,1) = two_pi*MATMUL(Cryst%gprimd,ihr_comm(:,1))
          +  +  +  +  +  
                +  +  + ]
     263         [ +  + ]:       15032 :  ihr_comm_cart(:,1) = ihr_comm_cart(:,1) + CMPLX(ons_cart(1,:),ons_cart(2,:),kind=gwp)
     264                 :             : 
     265                 :             :  ! Final result is in reduced coordinates, in terms of gprimd.
     266   [ +  +  +  +  :      127772 :  ihr_comm(:,1) = MATMUL(gspace_cart2red, ihr_comm_cart(:,1))/two_pi
          +  +  +  +  +  
                +  +  + ]
     267                 :             : 
     268                 :        3758 : end function paw_ihr
     269                 :             : !!***
     270                 :             : 
     271                 :             : !----------------------------------------------------------------------
     272                 :             : 
     273                 :             : !!****f* m_paw_hr/paw_cross_ihr_comm
     274                 :             : !! NAME
     275                 :             : !! paw_cross_ihr_comm
     276                 :             : !!
     277                 :             : !! FUNCTION
     278                 :             : !!  Adds the PAW cross term contribution to the matrix elements of the  i\nabla operator.
     279                 :             : !!  in cartesian coordinates. Should take also into account the contribution arising from the U
     280                 :             : !!  part of the Hamiltonian (if any)
     281                 :             : !!
     282                 :             : !! INPUTS
     283                 :             : !!  ihr_comm = the commutator [H,r] evaluated between states i and j, with only the plane-wave and
     284                 :             : !!              the onsite parts included
     285                 :             : !!  isppol=Spin index.
     286                 :             : !!  nspinor=Number of spinori components.
     287                 :             : !!  nr=Number real-space points on the fine fft grid for the ae wavefunctions
     288                 :             : !!  kpoint(3)=k-point in reduced coordinates.
     289                 :             : !!  Cryst<crystal_t>=Info on the crystal structure.
     290                 :             : !!    %natom=Number of atoms in unit cell
     291                 :             : !!    %typat(natom)
     292                 :             : !!  Pawfgrtab(ntypat)= PAW tabulated data on the fine grid
     293                 :             : !!    %lmn_size Number of (l,m,n) elements for the paw basis
     294                 :             : !!    %nfgr Number of points on the fine grid
     295                 :             : !!    %ifftsph Indexes of the fine-grid points on the fft mesh
     296                 :             : !!  Paw_onsite(ntypat)= PAW tabulated data on the fine grid points inside the sphere
     297                 :             : !!    %phi_gr(3,nfgr,lmn_size) gradient of phi in cartesian coordinates
     298                 :             : !!    %tphi_gr(3,nfgr,lmn_size) gradient of tphi in cartesian coordinates
     299                 :             : !!  ur_ae1(nr),ur_ae2(nr)=Left and right AE wavefunction.
     300                 :             : !!  ur_ae_onsite1(nr),ur_ae_onsite2(nr)=Left and right AE onsite wavefunction.
     301                 :             : !!  Cprj_kb1(natom,nspinor),Cprj_kb2(natom,nspinor) <type(pawcprj_type)>=
     302                 :             : !!   projected input wave functions <Proj_i|Cnk> with all NL projectors corresponding to
     303                 :             : !!   wavefunctions (k,b1,s) and (k,b2,s), respectively.
     304                 :             : !!
     305                 :             : !! OUTPUT
     306                 :             : !!
     307                 :             : !! SIDE EFFECTS
     308                 :             : !!  The cross-term contribution is added to the commutator
     309                 :             : !!
     310                 :             : !! SOURCE
     311                 :             : 
     312                 :           0 : subroutine paw_cross_ihr_comm(ihr_comm,nspinor,nr,Cryst,Pawfgrtab,Paw_onsite,&
     313                 :           0 : & ur_ae1,ur_ae2,ur_ae_onsite1,ur_ae_onsite2,Cprj_kb1,Cprj_kb2)
     314                 :             : 
     315                 :             : !Arguments ------------------------------------
     316                 :             : !scalars
     317                 :             :  integer,intent(in) :: nspinor,nr
     318                 :             :  type(crystal_t),intent(in) :: Cryst
     319                 :             : !arrays
     320                 :             :  complex(gwp),intent(inout) :: ihr_comm(3,nspinor**2)
     321                 :             :  complex(gwp),intent(in) :: ur_ae1(nr),ur_ae2(nr)
     322                 :             :  complex(gwp),intent(in) :: ur_ae_onsite1(nr),ur_ae_onsite2(nr)
     323                 :             :  type(pawfgrtab_type),intent(in) :: Pawfgrtab(Cryst%natom)
     324                 :             :  type(paw_pwaves_lmn_t),intent(in) :: Paw_onsite(Cryst%natom)
     325                 :             :  type(pawcprj_type),intent(in) :: Cprj_kb1(Cryst%natom,nspinor),Cprj_kb2(Cryst%natom,nspinor)
     326                 :             : 
     327                 :             : !Local variables-------------------------------
     328                 :             :  integer :: iatom,lmn_size,ilmn,ifgd,ifftsph,nfgd
     329                 :             :  complex(dp) :: cp1, cp2
     330                 :             :  complex(dp) :: cross1,cross2
     331                 :             : !arrays
     332                 :             :  real(dp) :: gspace_cart2red(3,3)
     333                 :           0 :  complex(gwp) :: ihr_comm_cart(3,nspinor**2)
     334                 :             :  complex(dp) :: dphigr(3), dphigr1(3),dphigr2(3)
     335                 :             : ! *************************************************************************
     336                 :             : 
     337         [ #  # ]:           0 :  ABI_CHECK(nspinor==1,"nspinor + pawcross not implemented")
     338                 :             : 
     339                 :             :  ! [H, r] = -\nabla + [V_{nl}, r]
     340                 :             :  ! The V_nl part, present in case of DFT+U, is omitted for the cross terms contribution
     341                 :             :  ! Recall that delta_rho_tw_ij = (psi_i - phi_i)* (phi_j - tphi_j) + (phi_i - tphi_i)* (psi_j - phi_j)
     342         [ #  # ]:           0 :  ihr_comm_cart(:,1) = czero
     343                 :             : 
     344         [ #  # ]:           0 :  do iatom=1,Cryst%natom
     345                 :           0 :    lmn_size = Paw_onsite(iatom)%lmn_size
     346                 :           0 :    nfgd = Pawfgrtab(iatom)%nfgd
     347                 :             : 
     348         [ #  # ]:           0 :    do ifgd=1,nfgd
     349                 :             : 
     350                 :           0 :      ifftsph = Pawfgrtab(iatom)%ifftsph(ifgd)
     351                 :             : 
     352                 :           0 :      cross1 = ur_ae1(ifftsph) - ur_ae_onsite1(ifftsph)
     353                 :           0 :      cross2 = ur_ae2(ifftsph) - ur_ae_onsite2(ifftsph)
     354                 :             : 
     355         [ #  # ]:           0 :      do ilmn=1,lmn_size
     356                 :             : 
     357         [ #  # ]:           0 :        dphigr(1:3) = Paw_onsite(iatom)%phi_gr(1:3,ifgd,ilmn) - Paw_onsite(iatom)%tphi_gr(1:3,ifgd,ilmn)
     358                 :             : 
     359                 :           0 :        cp1 = CMPLX(Cprj_kb1(iatom,1)%cp(1,ilmn),Cprj_kb1(iatom,1)%cp(2,ilmn)) * sqrt(Cryst%ucvol) ! that damn magic factor
     360                 :           0 :        cp2 = CMPLX(Cprj_kb2(iatom,1)%cp(1,ilmn),Cprj_kb2(iatom,1)%cp(2,ilmn)) * sqrt(Cryst%ucvol)
     361                 :             : 
     362         [ #  # ]:           0 :        dphigr1(1:3) = cp1 * dphigr(1:3)
     363         [ #  # ]:           0 :        dphigr2(1:3) = cp2 * dphigr(1:3)
     364                 :             : 
     365                 :           0 :        ihr_comm_cart(1,1) = ihr_comm_cart(1,1) - j_dpc * (CONJG(cross1) * dphigr2(1) - CONJG(dphigr1(1)) * cross2) / nr
     366                 :           0 :        ihr_comm_cart(2,1) = ihr_comm_cart(2,1) - j_dpc * (CONJG(cross1) * dphigr2(2) - CONJG(dphigr1(2)) * cross2) / nr
     367                 :           0 :        ihr_comm_cart(3,1) = ihr_comm_cart(3,1) - j_dpc * (CONJG(cross1) * dphigr2(3) - CONJG(dphigr1(3)) * cross2) / nr
     368                 :             : 
     369                 :             :      end do
     370                 :             :    end do
     371                 :             :  end do
     372                 :             : 
     373                 :             :  ! Go to reduced coordinate
     374   [ #  #  #  # ]:           0 :  gspace_cart2red = TRANSPOSE(Cryst%rprimd)
     375   [ #  #  #  #  :           0 :  ihr_comm(:,1) = ihr_comm(:,1) +  MATMUL(gspace_cart2red, ihr_comm_cart(:,1)) / two_pi
          #  #  #  #  #  
                      # ]
     376                 :             : 
     377                 :           0 : end subroutine paw_cross_ihr_comm
     378                 :             : !!***
     379                 :             : 
     380                 :             : !----------------------------------------------------------------------
     381                 :             : 
     382                 :             : !!****f* m_paw_hr/pawhur_init
     383                 :             : !! NAME
     384                 :             : !! pawhur_init
     385                 :             : !!
     386                 :             : !! FUNCTION
     387                 :             : !!  Creation method for the pawhur_t data type.
     388                 :             : !!
     389                 :             : !! INPUTS
     390                 :             : !!
     391                 :             : !! OUTPUT
     392                 :             : !!
     393                 :             : !! SOURCE
     394                 :             : 
     395                 :           0 : subroutine pawhur_init(hur,nsppol,pawprtvol,Cryst,Pawtab,Pawang,Pawrad,Paw_ij)
     396                 :             : 
     397                 :             : !Arguments ------------------------------------
     398                 :             : !scalars
     399                 :             :  integer,intent(in) :: nsppol,pawprtvol
     400                 :             :  type(crystal_t),intent(in) :: Cryst
     401                 :             :  type(Pawang_type),intent(in) :: Pawang
     402                 :             : !arrays
     403                 :             :  type(Pawtab_type),target,intent(in) :: Pawtab(Cryst%ntypat)
     404                 :             :  type(Pawrad_type),intent(in) :: Pawrad(Cryst%ntypat)
     405                 :             :  type(Paw_ij_type),intent(in) :: Paw_ij(Cryst%natom)
     406                 :             :  type(pawhur_t),intent(inout) :: Hur(Cryst%natom)
     407                 :             : 
     408                 :             : !Local variables-------------------------------
     409                 :             : !scalars
     410                 :             :  integer :: iatom,ij_idx,isel,itypat,isppol,lmn2_size_max,lmn2_size,lmn_size,lpawu
     411                 :             :  integer :: jlmn,jl,jm,jlm,jln,k0lmn,k0lm,k0ln,ilmn,il,im,ilm,iln
     412                 :             :  integer :: m2,m1,left_lmn,right_lmn,tot_lmn,nmax
     413                 :             : !arrays
     414                 :           0 :  integer :: nsel(3,nsppol)
     415                 :           0 :  integer, contiguous, pointer :: indlmn(:,:)
     416                 :             :  real(dp) :: sumr_ij(3)
     417                 :           0 :  real(dp),allocatable :: rcart_onsite(:,:,:)
     418                 :           0 :  real(dp),allocatable :: rij_tmp(:,:,:),vpawu(:,:,:,:)
     419                 :             : 
     420                 :             : ! *************************************************************************
     421                 :             : 
     422                 :             :  ! Get onsite matrix elements of the position operator.
     423         [ #  # ]:           0 :  lmn2_size_max=MAXVAL(Pawtab(:)%lmn2_size)
     424   [ #  #  #  #  :           0 :  ABI_MALLOC(rcart_onsite,(3,lmn2_size_max,Cryst%natom))
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     425                 :             : 
     426                 :           0 :  call pawr(Pawtab,Pawrad,Pawang,Cryst%natom,Cryst%ntypat,Cryst%typat,Cryst%xcart,lmn2_size_max,rcart_onsite)
     427                 :             : 
     428         [ #  # ]:           0 :  do iatom=1,Cryst%natom
     429                 :           0 :    itypat=Cryst%typat(iatom)
     430         [ #  # ]:           0 :    if (Pawtab(itypat)%usepawu==0) CYCLE
     431                 :           0 :    lmn2_size=Pawtab(itypat)%lmn2_size
     432                 :           0 :    lmn_size =Pawtab(itypat)%lmn_size
     433                 :           0 :    lpawu=Pawtab(itypat)%lpawu
     434                 :           0 :    Hur(iatom)%lmn2_size=lmn2_size
     435                 :           0 :    Hur(iatom)%lmn_size =lmn_size
     436                 :           0 :    Hur(iatom)%nsppol   =nsppol
     437                 :           0 :    indlmn => Pawtab(itypat)%indlmn
     438                 :             : 
     439   [ #  #  #  #  :           0 :    ABI_MALLOC(rij_tmp,(3,lmn_size**2,nsppol))
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     440   [ #  #  #  #  :           0 :    rij_tmp=zero
                   #  # ]
     441                 :             : 
     442                 :             :    ! Get Vpawu^{\sigma}_{m1,m2}
     443   [ #  #  #  #  :           0 :    ABI_MALLOC(vpawu,(Paw_ij(iatom)%cplex_dij,2*lpawu+1,2*lpawu+1,Paw_ij(iatom)%ndij))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
     444                 :             :    call pawpupot(Paw_ij(iatom)%cplex_dij,Paw_ij(iatom)%ndij,&
     445                 :             : &                Paw_ij(iatom)%noccmmp,Paw_ij(iatom)%nocctot,&
     446                 :           0 : &                pawprtvol,Pawtab(itypat),vpawu)
     447                 :             : 
     448         [ #  # ]:           0 :    do isppol=1,nsppol ! spinor not implemented
     449                 :             : 
     450                 :             :      ! === Loop on (jl,jm,jn) channels ===
     451                 :             :      ij_idx=0
     452         [ #  # ]:           0 :      do jlmn=1,lmn_size
     453                 :           0 :        jl =indlmn(1,jlmn)
     454                 :           0 :        jm =indlmn(2,jlmn)
     455                 :           0 :        jlm=indlmn(4,jlmn)
     456                 :           0 :        jln=indlmn(5,jlmn)
     457                 :             : 
     458                 :           0 :        k0lmn=jlmn*(jlmn-1)/2
     459                 :           0 :        k0lm =jlm *(jlm -1)/2
     460                 :           0 :        k0ln =jln *(jln -1)/2
     461                 :             :        !
     462                 :             :        ! === Loop on (il,im,in) channels ===
     463                 :             :        ! * Looping over all ij components. Elements are not symmetric.
     464         [ #  # ]:           0 :        do ilmn=1,lmn_size
     465                 :           0 :          il =indlmn(1,ilmn)
     466                 :           0 :          im =indlmn(2,ilmn)
     467                 :           0 :          ilm=indlmn(4,ilmn)
     468                 :           0 :          iln=indlmn(5,ilmn)
     469                 :             : 
     470                 :           0 :          ij_idx=ij_idx+1
     471                 :             : 
     472                 :             :          ! === Selection rules ===
     473         [ #  # ]:           0 :          if (il/=lpawu.and.jl/=lpawu) CYCLE
     474                 :             : 
     475                 :           0 :          sumr_ij(:)=zero
     476         [ #  # ]:           0 :          do m2=1,2*lpawu+1
     477         [ #  # ]:           0 :            do m1=1,2*lpawu+1
     478   [ #  #  #  # ]:           0 :              if (m1==(im-lpawu-1).and.il==lpawu) then
     479                 :           0 :                left_lmn =ilmn-(il+im+1)+m2
     480                 :           0 :                right_lmn=jlmn
     481         [ #  # ]:           0 :                if (right_lmn>=left_lmn) then
     482                 :           0 :                  tot_lmn=right_lmn*(right_lmn-1)/2 + left_lmn
     483                 :             :                else
     484                 :           0 :                  tot_lmn=left_lmn*(left_lmn-1)/2 + right_lmn
     485                 :             :                end if
     486         [ #  # ]:           0 :                sumr_ij=sumr_ij+vpawu(1,m1,m2,isppol)*rcart_onsite(:,tot_lmn,iatom)
     487                 :             :              end if
     488                 :             : 
     489   [ #  #  #  # ]:           0 :              if (m2==(jm-lpawu-1).and.jl==lpawu) then
     490                 :           0 :                left_lmn =ilmn
     491                 :           0 :                right_lmn=jlmn-(jl+jm+1)+m1
     492         [ #  # ]:           0 :                if (right_lmn>=left_lmn) then
     493                 :           0 :                  tot_lmn=right_lmn*(right_lmn-1)/2 + left_lmn
     494                 :             :                else
     495                 :           0 :                  tot_lmn=left_lmn*(left_lmn-1)/2 + right_lmn
     496                 :             :                end if
     497         [ #  # ]:           0 :                sumr_ij=sumr_ij+vpawu(1,m1,m2,isppol)*rcart_onsite(:,tot_lmn,iatom)
     498                 :             :              end if
     499                 :             :            end do !m1
     500                 :             :          end do !m2
     501                 :             : 
     502         [ #  # ]:           0 :          rij_tmp(:,ij_idx,isppol)=sumr_ij(:)
     503                 :             : 
     504                 :             :        end do !ilmn
     505                 :             :      end do !jlmn
     506                 :             :    end do !isppol
     507                 :             : 
     508         [ #  # ]:           0 :    ABI_FREE(vpawu)
     509                 :             : 
     510                 :             :    ! === Save values in packed form ===
     511   [ #  #  #  #  :           0 :    ABI_MALLOC(Hur(iatom)%ij_select,(lmn_size,lmn_size,nsppol))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
     512   [ #  #  #  #  :           0 :    Hur(iatom)%ij_select=0
                   #  # ]
     513   [ #  #  #  #  :           0 :    nsel(:,:)=COUNT(ABS(rij_tmp)>tol6,DIM=2)
             #  #  #  # ]
     514   [ #  #  #  # ]:           0 :    nmax=MAXVAL(nsel)
     515   [ #  #  #  #  :           0 :    ABI_MALLOC(Hur(iatom)%commutator,(3,nmax,nsppol))
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
     516         [ #  # ]:           0 :    do isppol=1,nsppol
     517                 :             :      ij_idx=0
     518                 :             :      isel  =0
     519         [ #  # ]:           0 :      do jlmn=1,lmn_size
     520         [ #  # ]:           0 :        do ilmn=1,lmn_size
     521                 :           0 :          ij_idx=ij_idx+1
     522   [ #  #  #  #  :           0 :          if (ANY (ABS(rij_tmp(:,ij_idx,isppol))>tol6) ) then
                   #  # ]
     523                 :           0 :            isel=isel+1
     524                 :           0 :            Hur(iatom)%ij_select(ilmn,jlmn,isppol)=isel
     525         [ #  # ]:           0 :            Hur(iatom)%commutator(:,isel,isppol)=rij_tmp(:,ij_idx,isppol)
     526                 :             :          end if
     527                 :             :        end do
     528                 :             :      end do
     529                 :             :    end do
     530                 :             : 
     531         [ #  # ]:           0 :    ABI_FREE(rij_tmp)
     532                 :             :  end do !iatom
     533                 :             : 
     534         [ #  # ]:           0 :  ABI_FREE(rcart_onsite)
     535                 :             : 
     536         [ #  # ]:           0 : end subroutine pawhur_init
     537                 :             : !!***
     538                 :             : 
     539                 :             : !----------------------------------------------------------------------
     540                 :             : 
     541                 :             : !!****f* m_paw_hr/pawr
     542                 :             : !! NAME
     543                 :             : !! pawr
     544                 :             : !!
     545                 :             : !! FUNCTION
     546                 :             : !! Evaluate matrix elements of the position operator between PAW AE partial waves.
     547                 :             : !!
     548                 :             : !! INPUTS
     549                 :             : !!  Pawtab(ntypat) <type(pawtab_type)>=paw tabulated data read at start:
     550                 :             : !!     %lmn_size
     551                 :             : !!     %lmn2_size
     552                 :             : !!     %indklmn
     553                 :             : !!     %phiphj
     554                 :             : !!  Pawrad(ntypat) <type(pawrad_type)>=paw radial mesh and related data:
     555                 :             : !!     %mesh_size=Dimension of radial mesh
     556                 :             : !!     %rad(mesh_size)=The coordinates of all the points of the radial mesh
     557                 :             : !!  Pawang <type(pawang_type)>=paw angular mesh and related data
     558                 :             : !!     %lmax=Maximum value of angular momentum l+1
     559                 :             : !!     %gntselect((2*l_max-1)**2,l_max**2,l_max**2)= selection rules for Gaunt coefficients
     560                 :             : !!     %realgnt
     561                 :             : !!  natom=number of atoms in unit cell
     562                 :             : !!  ntypat=number of types of atom
     563                 :             : !!  typat(natom)=type of each atom
     564                 :             : !!  xcart(3,natom)=cartesian coordinates
     565                 :             : !!
     566                 :             : !! OUTPUT
     567                 :             : !!  rcart_onsite(3,lmn2_size_max,natom)
     568                 :             : !!
     569                 :             : !! SOURCE
     570                 :             : 
     571                 :           0 : subroutine pawr(Pawtab,Pawrad,Pawang,natom,ntypat,typat,xcart,lmn2_size_max,rcart_onsite)
     572                 :             : 
     573                 :             : !Arguments ------------------------------------
     574                 :             : !scalars
     575                 :             :  integer,intent(in) :: lmn2_size_max,natom,ntypat
     576                 :             :  type(Pawang_type),intent(in) :: Pawang
     577                 :             : 
     578                 :             : !arrays
     579                 :             :  integer,intent(in) :: typat(natom)
     580                 :             :  real(dp),intent(in) :: xcart(3,natom)
     581                 :             :  real(dp),intent(inout) :: rcart_onsite(3,lmn2_size_max,natom)
     582                 :             :  type(Pawrad_type),intent(in) :: Pawrad(ntypat)
     583                 :             :  type(Pawtab_type),target,intent(in) :: Pawtab(ntypat)
     584                 :             : 
     585                 :             : !Local variables-------------------------------
     586                 :             : !scalars
     587                 :             :  integer,parameter :: ll1=1
     588                 :             :  integer :: iatom,idir,ignt,il,ilm,ilm_G,ilmn,iln,im,itypat,jl,jlm,jlmn,jln,jm,k0lm
     589                 :             :  integer :: k0lmn,k0ln,klm,klmn,kln,lmn_size,mesh_size,mm_G,lmn2_size
     590                 :             :  real(dp) :: fact,intff,rgnt
     591                 :             : !arrays
     592                 :           0 :  integer,contiguous, pointer :: indlmn(:,:)
     593                 :           0 :  real(dp),allocatable :: ff(:),rad(:),rc_tmp(:,:)
     594                 :             : 
     595                 :             : ! *************************************************************************
     596                 :             : 
     597                 :             :  DBG_ENTER("COLL")
     598                 :             : 
     599                 :           0 :  fact=two*SQRT(pi/three)
     600   [ #  #  #  #  :           0 :  rcart_onsite(:,:,:)=zero
                   #  # ]
     601                 :             : 
     602         [ #  # ]:           0 :  do itypat=1,ntypat
     603                 :           0 :    lmn_size  =Pawtab(itypat)%lmn_size
     604                 :           0 :    lmn2_size =Pawtab(itypat)%lmn2_size
     605                 :           0 :    mesh_size =Pawtab(itypat)%mesh_size
     606                 :           0 :    indlmn =>  Pawtab(itypat)%indlmn
     607                 :             : 
     608   [ #  #  #  #  :           0 :    ABI_MALLOC(ff,(mesh_size))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     609   [ #  #  #  #  :           0 :    ABI_MALLOC(rad,(mesh_size))
             #  #  #  # ]
     610         [ #  # ]:           0 :    rad(1:mesh_size)=Pawrad(itypat)%rad(1:mesh_size)
     611                 :             : 
     612   [ #  #  #  #  :           0 :    ABI_MALLOC(rc_tmp,(3,lmn2_size))
          #  #  #  #  #  
                #  #  # ]
     613   [ #  #  #  # ]:           0 :    rc_tmp=zero
     614                 :             :    !
     615                 :             :    ! === Loop on (jl,jm,jn) channels
     616         [ #  # ]:           0 :    do jlmn=1,lmn_size
     617                 :           0 :      jl =indlmn(1,jlmn)
     618                 :           0 :      jm =indlmn(2,jlmn)
     619                 :           0 :      jlm=indlmn(4,jlmn)
     620                 :           0 :      jln=indlmn(5,jlmn)
     621                 :             : 
     622                 :           0 :      k0lmn=jlmn*(jlmn-1)/2
     623                 :           0 :      k0lm =jlm *(jlm -1)/2
     624                 :           0 :      k0ln =jln *(jln -1)/2
     625                 :             :      !
     626                 :             :      ! === Loop on (il,im,in) channels; klmn is the index for packed form ===
     627         [ #  # ]:           0 :      do ilmn=1,jlmn
     628                 :           0 :        il =indlmn(1,ilmn)
     629                 :           0 :        im =indlmn(2,ilmn)
     630                 :           0 :        ilm=indlmn(4,ilmn)
     631                 :           0 :        iln=indlmn(5,ilmn)
     632                 :             : 
     633                 :           0 :        klmn=k0lmn+ilmn
     634                 :           0 :        klm =k0lm +ilm
     635                 :           0 :        kln =k0ln +iln
     636                 :             :        !
     637                 :             :        ! === For each cartesian direction, use expansion in terms of RSH ===
     638                 :             :        ! TODO Add a check if l=1 is in the set
     639         [ #  # ]:           0 :        do idir=1,3
     640                 :           0 :          mm_G=0
     641         [ #  # ]:           0 :          if (idir==1) mm_G= 1
     642         [ #  # ]:           0 :          if (idir==2) mm_G=-1
     643         [ #  # ]:           0 :          if (idir==3) mm_G= 0
     644                 :           0 :          ilm_G=1+ll1**2+ll1+mm_G
     645                 :           0 :          ignt=Pawang%gntselect(ilm_G,klm)
     646         [ #  # ]:           0 :          if (ignt/=0) then
     647                 :           0 :            rgnt=Pawang%realgnt(ignt)
     648                 :           0 :            ff(1)=zero
     649                 :             :            !ff(2:mesh_size)=(Pawtab(itypat)%phiphj(2:mesh_size,kln)-Pawtab(itypat)%tphitphj(2:mesh_size,kln))*rad(2:mesh_size)
     650         [ #  # ]:           0 :            ff(2:mesh_size)=Pawtab(itypat)%phiphj(2:mesh_size,kln)*rad(2:mesh_size)
     651                 :           0 :            call simp_gen(intff,ff,Pawrad(itypat))
     652                 :           0 :            rc_tmp(idir,klmn)=fact*intff*rgnt
     653                 :             :          end if
     654                 :             :        end do !idir
     655                 :             : 
     656                 :             :      end do !ilmn
     657                 :             :    end do !jllmn
     658                 :             : 
     659                 :             :    ! === Make matrix elements for each atom of this type ===
     660         [ #  # ]:           0 :    do jlmn=1,lmn_size
     661                 :           0 :      jl =indlmn(1,jlmn)
     662                 :           0 :      jm =indlmn(2,jlmn)
     663                 :           0 :      jln=indlmn(5,jlmn)
     664                 :             : 
     665                 :           0 :      k0lmn=jlmn*(jlmn-1)/2
     666                 :           0 :      k0ln =jln *(jln -1)/2
     667         [ #  # ]:           0 :      do ilmn=1,jlmn
     668                 :           0 :        il =indlmn(1,ilmn)
     669                 :           0 :        im =indlmn(2,ilmn)
     670                 :           0 :        iln=indlmn(5,ilmn)
     671                 :             : 
     672                 :           0 :        klmn=k0lmn+ilmn
     673                 :           0 :        kln =k0ln +iln
     674                 :             : 
     675                 :           0 :        intff=zero
     676         [ #  # ]:           0 :        if (il==jl.and.jm==im) then
     677         [ #  # ]:           0 :          ff(1:mesh_size)=Pawtab(itypat)%phiphj(1:mesh_size,kln)
     678                 :           0 :          call simp_gen(intff,ff,Pawrad(itypat))
     679                 :             :        end if
     680         [ #  # ]:           0 :        do iatom=1,natom
     681         [ #  # ]:           0 :          if (typat(iatom)/=itypat) CYCLE
     682         [ #  # ]:           0 :          rcart_onsite(:,klmn,iatom)=rc_tmp(:,klmn) + xcart(:,iatom)*intff
     683                 :             :        end do
     684                 :             : 
     685                 :             :      end do ! ilmn
     686                 :             :    end do !jlmn
     687                 :             : 
     688         [ #  # ]:           0 :    ABI_FREE(ff)
     689         [ #  # ]:           0 :    ABI_FREE(rad)
     690         [ #  # ]:           0 :    ABI_FREE(rc_tmp)
     691                 :             :  end do !itypat
     692                 :             : 
     693                 :             :  DBG_EXIT("COLL")
     694                 :             : 
     695         [ #  # ]:           0 : end subroutine pawr
     696                 :             : !!***
     697                 :             : 
     698                 :             : !----------------------------------------------------------------------
     699                 :             : 
     700   [ #  #  #  #  :           0 : END MODULE m_paw_hr
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     701                 :             : !!***
        

Generated by: LCOV version 2.3-1