LCOV - code coverage report
Current view: top level - shared/libpaw/src - m_paw_finegrid.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 70.9 % 623 442
Test Date: 2026-11-10 14:34:30 Functions: 64.0 % 25 16
Branches: 51.8 % 1124 582

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_paw_finegrid
       2                 :             : !! NAME
       3                 :             : !!  m_paw_finegrid
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !!  This module contains a set of routines to compute various quantities
       7                 :             : !!  on the fine grid around a given atom.
       8                 :             : !!
       9                 :             : !! COPYRIGHT
      10                 :             : !! Copyright (C) 2013-2026 ABINIT group (MT,FJ)
      11                 :             : !! This file is distributed under the terms of the
      12                 :             : !! GNU General Public License, see ~abinit/COPYING
      13                 :             : !! or http://www.gnu.org/copyleft/gpl.txt .
      14                 :             : !!
      15                 :             : !! NOTES
      16                 :             : !!  FOR DEVELOPPERS: in order to preserve the portability of libPAW library,
      17                 :             : !!  please consult ~abinit/src/??_libpaw/libpaw-coding-rules.txt
      18                 :             : !!
      19                 :             : !! SOURCE
      20                 :             : 
      21                 :             : #include "libpaw.h"
      22                 :             : 
      23                 :             : MODULE m_paw_finegrid
      24                 :             : 
      25                 :             :  USE_DEFS
      26                 :             :  USE_MSG_HANDLING
      27                 :             :  USE_MEMORY_PROFILING
      28                 :             : 
      29                 :             :  use m_pawtab,      only : pawtab_type
      30                 :             :  use m_paw_sphharm, only : initylmr
      31                 :             :  use m_paw_numeric, only : paw_jbessel,paw_splint,paw_uniform_splfit,paw_sort_dp
      32                 :             : 
      33                 :             :  implicit none
      34                 :             : 
      35                 :             :  private
      36                 :             : 
      37                 :             : !public procedures.
      38                 :             :  public :: pawgylm      ! g_l(r-R)*Y_lm(r-R) (and derivatives)
      39                 :             :  public :: pawgylmg     ! Fourier transform of g_l(r-R)*Y_lm(r-R), plane-waves case
      40                 :             :  public :: pawrfgd_fft  ! r-R, plane-waves case
      41                 :             :  public :: pawrfgd_wvl  ! r-R, wavelets case
      42                 :             :  public :: pawexpiqr    ! exp(i.q.(r-R))
      43                 :             : 
      44                 :             : !declarations for the whole module (were needed to replace the statement functions)
      45                 :             : !MG: Why this? Global variables are powerful but extremely DANGEROUS
      46                 :             : integer,private,save :: lambda
      47                 :             : real(dp),private,save :: pi_over_rshp,sigma
      48                 :             : real(dp),private,save,allocatable :: alpha(:,:),qq(:,:)
      49                 :             : !!***
      50                 :             : 
      51                 :             : CONTAINS
      52                 :             : 
      53                 :             : !===========================================================
      54                 :             : !!***
      55                 :             : 
      56                 :             : !----------------------------------------------------------------------
      57                 :             : 
      58                 :             : !!****f* m_paw_finegrid/pawgylm
      59                 :             : !! NAME
      60                 :             : !! pawgylm
      61                 :             : !!
      62                 :             : !! FUNCTION
      63                 :             : !! Compute g_l(r-R)*Y_lm(r-R) (and derivatives) on the fine (rectangular) grid
      64                 :             : !! around one atom (g_l=radial shape function).
      65                 :             : !! R is the position of the atom
      66                 :             : !!
      67                 :             : !! INPUTS
      68                 :             : !!  lm_size=number of lm components to be calculated
      69                 :             : !!  nfgd= number of (fine grid) FFT points in the paw sphere around current atom
      70                 :             : !!  optgr0= 1 if g_l(r-R)*Y_lm(r-R) are computed
      71                 :             : !!  optgr1= 1 if first derivatives of g_l(r-R)*Y_lm(r-R) are computed
      72                 :             : !!  optgr2= 1 if second derivatives of g_l(r-R)*Y_lm(r-R) are computed
      73                 :             : !!  pawtab <type(pawtab_type)>=paw tabulated starting data for current atom
      74                 :             : !!  rfgd(3,nfgd)= coordinates of r-R on the fine rect. grid around current atom
      75                 :             : !!
      76                 :             : !! OUTPUT
      77                 :             : !!  if (optgr0==1)
      78                 :             : !!    gylm(nfgd,lm_size)= g_l(r-R)*Y_lm(r-R) around current atom
      79                 :             : !!  if (optgr1==1)
      80                 :             : !!    gylmgr(3,nfgd,lm_size)= derivatives of g_l(r-R)*Y_lm(r-R) wrt cart. coordinates
      81                 :             : !!  if (optgr2==1)
      82                 :             : !!    gylmgr2(6,nfgd,lm_size)= second derivatives of g_l(r-R)*Y_lm(r-R) wrt cart. coordinates
      83                 :             : !!
      84                 :             : !! SOURCE
      85                 :             : 
      86         [ -  + ]:       43677 : subroutine pawgylm(gylm,gylmgr,gylmgr2,lm_size,nfgd,optgr0,optgr1,optgr2,pawtab,rfgd)
      87                 :             : 
      88                 :             : !Arguments ---------------------------------------------
      89                 :             : !scalars
      90                 :             :  integer,intent(in) :: lm_size,nfgd,optgr0,optgr1,optgr2
      91                 :             :  type(pawtab_type),intent(in) :: pawtab
      92                 :             : !arrays
      93                 :             :  real(dp),intent(in) :: rfgd(:,:)
      94                 :             :  real(dp),intent(out) :: gylm(nfgd,optgr0*lm_size)
      95                 :             :  real(dp),intent(out) :: gylmgr(3,nfgd,optgr1*lm_size)
      96                 :             :  real(dp),intent(out) :: gylmgr2(6,nfgd,optgr2*lm_size)
      97                 :             : 
      98                 :             : !Local variables ------------------------------
      99                 :             : !scalars
     100                 :             :  integer :: ic,ilm,izero,l_size,ll,normchoice,option,shape_type
     101                 :             :  real(dp) :: arg
     102                 :             :  real(dp) :: jbes1,jbes2,jbesp1,jbesp2,jbespp1,jbespp2,rcut
     103                 :             :  real(dp) :: splfact
     104                 :             :  logical :: compute_gr0,compute_gr1,compute_gr2
     105                 :             :  character(len=500) :: msg
     106                 :             : !arrays
     107                 :       43677 :  integer,allocatable :: isort(:)
     108                 :             :  real(dp),parameter :: ffact(1:9)=(/1._dp,3._dp,15._dp,105._dp,945._dp,10395._dp,&
     109                 :             : &                                   135135._dp,2027025._dp,34459425._dp/)
     110                 :             :  real(dp),parameter :: toldev=tol3
     111                 :             :  real(dp) :: ss(3)
     112                 :       43677 :  real(dp),allocatable :: cc(:,:),d2gfact(:,:),d2shpfuncnum(:,:),dgfact(:,:)
     113                 :       43677 :  real(dp),allocatable :: dshpfuncnum(:,:),gfact(:,:)
     114                 :       43677 :  real(dp),allocatable :: rnrm(:),rnrm_inv(:),rnrm_sort(:)
     115                 :       43677 :  real(dp),allocatable :: shpfuncnum(:,:),work(:),ylmr(:,:),ylmrgr(:,:,:)
     116                 :             : 
     117                 :             : ! *************************************************************************
     118                 :             : 
     119   [ +  +  -  +  :       43677 :  if (optgr0==0.and.optgr1==0.and.optgr2==0) return
                   -  - ]
     120         [ +  + ]:       43677 :  if (nfgd==0) return
     121                 :             : 
     122                 :             : !Compatibility test
     123                 :             : !==========================================================
     124   [ +  +  -  + ]:      130983 :  if (size(rfgd)/=3*nfgd) then
     125                 :           0 :    msg='rfgd array must be allocated at rfgd(3,nfgd)!'
     126                 :           0 :    LIBPAW_BUG(msg)
     127                 :             :  end if
     128                 :             :  !if (pawtab%lcut_size>9) then
     129                 :             :  !  msg='l_size>10 forbidden!'
     130                 :             :  !  LIBPAW_BUG(msg)
     131                 :             :  !end if
     132   [ +  +  -  + ]:       43661 :  if (pawtab%shape_type==1.and.pawtab%shape_lambda<2) then
     133                 :           0 :    msg='Exponent lambda of gaussian shape function must be > 1!'
     134                 :           0 :    LIBPAW_ERROR(msg)
     135                 :             :  end if
     136                 :             : 
     137                 :             : !Initializations
     138                 :             : !==========================================================
     139                 :             : !Options for computation
     140   [ +  +  +  -  :       43661 :  compute_gr0=(optgr0==1.or.optgr1==1.or.optgr2==1)
                   -  - ]
     141   [ +  +  -  + ]:       43661 :  compute_gr1=(optgr1==1.or.optgr2==1)
     142                 :       43661 :  compute_gr2=(optgr2==1)
     143                 :       43661 :  l_size=pawtab%lcut_size
     144                 :             : 
     145                 :             : !Norms of vectors around the atom
     146   [ -  +  +  -  :      130983 :  LIBPAW_ALLOCATE(rnrm,(nfgd))
          +  -  +  -  -  
                +  -  + ]
     147                 :    41169626 :  izero=-1
     148         [ +  + ]:    41169626 :  do ic=1,nfgd
     149                 :    41125965 :    rnrm(ic)=sqrt(rfgd(1,ic)**2+rfgd(2,ic)**2+rfgd(3,ic)**2)
     150         [ +  + ]:    41169626 :    if (rnrm(ic)<=tol10) izero=ic  ! Has to be consistent with initylmr !!
     151                 :             :  end do
     152                 :             : 
     153                 :             : !Initializations
     154   [ +  +  +  +  :   399368911 :  if (optgr0==1) gylm=zero
                   +  + ]
     155   [ +  +  +  +  :   633220447 :  if (optgr1==1) gylmgr=zero
             +  +  +  + ]
     156   [ +  +  +  +  :    23256244 :  if (optgr2==1) gylmgr2=zero
             +  +  +  + ]
     157                 :             : 
     158                 :             : !Some definitions concerning shape function g_l(r)
     159                 :       43661 :  shape_type=pawtab%shape_type
     160                 :       43661 :  sigma=pawtab%shape_sigma;lambda=pawtab%shape_lambda
     161                 :       43661 :  pi_over_rshp=pi/pawtab%rshp
     162                 :       43661 :  rcut=tol12+pawtab%rshp
     163         [ +  + ]:       43661 :  if (shape_type==3) then
     164   [ -  +  +  -  :      107370 :    LIBPAW_ALLOCATE(alpha,(2,l_size))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     165   [ -  +  +  -  :       71580 :    LIBPAW_ALLOCATE(qq,(2,l_size))
          -  +  -  +  -  
                      + ]
     166         [ +  + ]:      143300 :    do ll=1,l_size
     167         [ +  + ]:      322530 :      alpha(1:2,ll)=pawtab%shape_alpha(1:2,ll)
     168         [ +  + ]:      358320 :      qq(1:2,ll)=pawtab%shape_q(1:2,ll)
     169                 :             :    end do
     170                 :             :  end if
     171                 :             : 
     172                 :             : !If needed, sort selected radii by increasing norm
     173         [ +  + ]:       43661 :  if (shape_type==-1) then
     174   [ -  +  +  -  :           9 :    LIBPAW_ALLOCATE(isort,(nfgd))
          +  -  +  -  -  
                +  -  + ]
     175   [ -  +  +  -  :           6 :    LIBPAW_ALLOCATE(rnrm_sort,(nfgd))
             -  +  -  + ]
     176         [ +  + ]:        4380 :    do ic=1,nfgd
     177                 :        4380 :      isort(ic)=ic
     178                 :             :    end do
     179         [ +  + ]:        4380 :    rnrm_sort(1:nfgd)=rnrm(1:nfgd)
     180                 :           3 :    call paw_sort_dp(nfgd,rnrm_sort,isort,tol16)
     181                 :             :  end if
     182                 :             : 
     183                 :             : !If shape function is "numeric", spline it onto selected radii
     184                 :             :  if (shape_type==-1) then
     185   [ -  +  +  -  :           6 :    LIBPAW_ALLOCATE(work,(nfgd))
             -  +  -  + ]
     186         [ +  - ]:           3 :    if (compute_gr0) then
     187   [ -  +  +  -  :          12 :      LIBPAW_ALLOCATE(shpfuncnum,(nfgd,l_size))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     188         [ +  + ]:          18 :      do ll=1,l_size
     189                 :             :        call paw_splint(pawtab%mesh_size,pawtab%rad_for_spline,pawtab%shapefunc(:,ll),&
     190                 :          15 : &       pawtab%dshpfunc(:,ll,2),nfgd,rnrm_sort,work)
     191         [ +  + ]:       21903 :        do ic=1,nfgd
     192                 :       21900 :          shpfuncnum(isort(ic),ll)=work(ic)
     193                 :             :        end do
     194                 :             :      end do
     195                 :             :    end if
     196         [ +  - ]:           3 :    if(compute_gr1) then
     197   [ -  +  +  -  :          12 :      LIBPAW_ALLOCATE(dshpfuncnum,(nfgd,l_size))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     198         [ +  + ]:          18 :      do ll=1,l_size
     199                 :             :        call paw_splint(pawtab%mesh_size,pawtab%rad_for_spline,pawtab%dshpfunc(:,ll,1),&
     200                 :          15 : &       pawtab%dshpfunc(:,ll,3),nfgd,rnrm_sort,work)
     201         [ +  + ]:       21903 :        do ic=1,nfgd
     202                 :       21900 :          dshpfuncnum(isort(ic),ll)=work(ic)
     203                 :             :        end do
     204                 :             :      end do
     205                 :             :    end if
     206         [ -  + ]:           3 :    if(compute_gr2) then
     207   [ #  #  #  #  :           0 :      LIBPAW_ALLOCATE(d2shpfuncnum,(nfgd,l_size))
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     208         [ #  # ]:           0 :      do ll=1,l_size
     209                 :             :        call paw_splint(pawtab%mesh_size,pawtab%rad_for_spline,pawtab%dshpfunc(:,ll,2),&
     210                 :           0 : &       pawtab%dshpfunc(:,ll,4),nfgd,rnrm_sort,work)
     211         [ #  # ]:           0 :        do ic=1,nfgd
     212                 :           0 :          d2shpfuncnum(isort(ic),ll)=work(ic)
     213                 :             :        end do
     214                 :             :      end do
     215                 :             :    end if
     216         [ -  + ]:           3 :    LIBPAW_DEALLOCATE(work)
     217                 :             :  end if
     218                 :             : 
     219         [ +  + ]:       43661 :  if (shape_type==-1)  then
     220         [ -  + ]:           3 :    LIBPAW_DEALLOCATE(isort)
     221         [ -  + ]:           3 :    LIBPAW_DEALLOCATE(rnrm_sort)
     222                 :             :  end if
     223                 :             : 
     224                 :             : !If needed, compute limits at r=0 of shape function and derivatives
     225         [ +  + ]:       43661 :  if (izero>0) then
     226   [ -  +  +  -  :      111030 :    LIBPAW_ALLOCATE(cc,(3,l_size))
          +  -  +  -  -  
                +  -  + ]
     227   [ +  +  +  + ]:      488554 :    cc=zero
     228         [ +  + ]:       37010 :    if (shape_type==-1) then
     229                 :             :      splfact=(pawtab%rad_for_spline(4)-pawtab%rad_for_spline(1))&
     230                 :           3 : &     /(pawtab%rad_for_spline(3)-pawtab%rad_for_spline(2))
     231                 :             :    end if
     232         [ +  + ]:      149896 :    do ll=1,l_size
     233                 :             : !    cc(2,l) is g_prime(0)
     234   [ +  +  -  +  :      112886 :      if (optgr0==1.or.optgr1==1.or.optgr2==1) then
                   -  - ]
     235         [ +  + ]:      112886 :        if (shape_type==-1) then
     236         [ +  + ]:          60 :          ss(1:3)=pawtab%shapefunc(2:4,ll)/pawtab%rad_for_spline(2:4)**(ll-1)
     237                 :          15 :          cc(1,ll)=ss(3)+(ss(1)-ss(2))*splfact
     238         [ +  + ]:      112871 :        else if (shape_type==1.or.shape_type==2) then
     239                 :        6682 :          cc(1,ll)=one
     240         [ +  - ]:      106189 :        else if (shape_type==3) then
     241                 :             :          cc(1,ll)=(alpha(1,ll)*qq(1,ll)**(ll-1) &
     242                 :      106189 : &         +alpha(2,ll)*qq(2,ll)**(ll-1))/ffact(ll)
     243                 :             :        end if
     244                 :      112886 :        cc(1,ll)=cc(1,ll)*pawtab%gnorm(ll)
     245                 :             :      end if
     246                 :             : !    cc(2,l) is g_prime(0)
     247   [ +  +  -  + ]:      112886 :      if (optgr1==1.or.optgr2==1) then
     248         [ +  + ]:       15986 :        if (shape_type==-1) then
     249         [ +  + ]:          60 :          ss(1:3)=(ss(1:3)-cc(1,ll))/pawtab%rad_for_spline(2:4)
     250                 :          15 :          cc(2,ll)=ss(3)+(ss(1)-ss(2))*splfact
     251   [ +  +  -  + ]:       15971 :        else if (shape_type==1.and.lambda==1) then
     252                 :           0 :          cc(2,ll)=-one/sigma
     253                 :             :        else
     254                 :       15971 :          cc(2,ll)=zero
     255                 :             :        end if
     256                 :       15986 :        cc(2,ll)=cc(2,ll)*pawtab%gnorm(ll)
     257                 :             :      end if
     258                 :             : !    cc(3,l) is g_prime_prime(0)
     259         [ +  + ]:      149896 :      if (optgr2==1) then
     260         [ -  + ]:         219 :        if (shape_type==-1) then
     261         [ #  # ]:           0 :          ss(1:3)=(ss(1:3)-cc(2,ll))/pawtab%rad_for_spline(2:4)
     262                 :           0 :          cc(3,ll)=two*(ss(3)+(ss(1)-ss(2))*splfact)
     263         [ -  + ]:         219 :        else if (shape_type==1) then
     264         [ #  # ]:           0 :          if (lambda==1) cc(3,ll)=one/sigma**2
     265         [ #  # ]:           0 :          if (lambda==2) cc(3,ll)=-two/sigma**2
     266         [ #  # ]:           0 :          if (lambda >2) cc(3,ll)=zero
     267         [ +  + ]:         219 :        else if (shape_type==2) then
     268                 :         202 :          cc(3,ll)=-(two/three)*pi_over_rshp**2
     269         [ +  - ]:          17 :        else if (shape_type==3) then
     270                 :             :          cc(3,ll)=-(alpha(1,ll)*qq(1,ll)**(ll+1) &
     271                 :          17 : &         +alpha(2,ll)*qq(2,ll)**(ll+1))/ffact(ll+1)
     272                 :             :        end if
     273                 :         219 :        cc(3,ll)=cc(3,ll)*pawtab%gnorm(ll)
     274                 :             :      end if
     275                 :             :    end do
     276                 :             :  end if
     277                 :             : 
     278                 :             : !Y_lm(r-R) calculation
     279                 :             : !==========================================================
     280                 :       43661 :  normchoice=1 ; option=max(optgr0,2*optgr1,3*optgr2)
     281         [ +  - ]:       43661 :  if(compute_gr0)  then
     282   [ -  +  +  -  :      174644 :    LIBPAW_ALLOCATE(ylmr,(l_size**2,nfgd))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     283                 :             :  end if
     284         [ +  + ]:       43661 :  if(compute_gr1.and.(.not.compute_gr2))  then
     285   [ -  +  +  -  :       35480 :    LIBPAW_ALLOCATE(ylmrgr,(3,l_size**2,nfgd))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     286                 :             :  end if
     287         [ +  + ]:       43661 :  if(compute_gr2)  then
     288   [ -  +  +  -  :         404 :    LIBPAW_ALLOCATE(ylmrgr,(9,l_size**2,nfgd))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     289                 :             :  end if
     290   [ +  +  +  - ]:       43661 :  if (compute_gr0.and.(.not.compute_gr1).and.(.not.compute_gr2)) then
     291   [ -  +  -  -  :       34690 :    call initylmr(l_size,normchoice,nfgd,rnrm,option,rfgd,ylmr)
          -  -  -  -  -  
                      + ]
     292                 :             :  else
     293   [ -  +  -  -  :        8971 :    call initylmr(l_size,normchoice,nfgd,rnrm,option,rfgd,ylmr,ylmrgr)
          -  -  -  -  -  
                      + ]
     294                 :             :  end if
     295                 :             : 
     296                 :             : !gl(r) and derivatives calculation for l>=0
     297                 :             : !==========================================================
     298                 :             : !Compute gl(r), gl_prime(r)/r and (gl_prime_prime(r)-gl_prime(r)/r)/r**2
     299         [ +  - ]:       43661 :  if (compute_gr0)  then
     300   [ -  +  +  -  :      174644 :    LIBPAW_BOUND2_ALLOCATE(gfact,BOUNDS(1,nfgd),BOUNDS(0,l_size-1))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     301   [ +  +  +  + ]:   135384007 :    gfact(:,:)=zero
     302                 :             :  end if
     303         [ +  + ]:       43661 :  if (compute_gr1)  then
     304   [ -  +  +  -  :       35884 :    LIBPAW_BOUND2_ALLOCATE(dgfact,BOUNDS(1,nfgd),BOUNDS(0,l_size-1))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     305   [ +  +  +  + ]:    39284895 :    dgfact(:,:)=zero
     306                 :             :  end if
     307         [ +  + ]:       43661 :  if (compute_gr2)  then
     308   [ -  +  +  -  :         404 :    LIBPAW_BOUND2_ALLOCATE(d2gfact,BOUNDS(1,nfgd),BOUNDS(0,l_size-1))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     309   [ +  +  +  + ]:      784050 :    d2gfact(:,:)=zero
     310                 :             :  end if
     311         [ +  + ]:       43661 :  if(compute_gr1) then
     312   [ -  +  +  -  :       17942 :    LIBPAW_ALLOCATE(rnrm_inv,(nfgd))
             -  +  -  + ]
     313         [ +  + ]:    10972638 :    do ic=1,nfgd
     314         [ +  + ]:    10972638 :      if (ic/=izero) rnrm_inv(ic)=one/rnrm(ic)
     315                 :             :    end do
     316         [ +  + ]:        8971 :    if (izero>0) rnrm_inv(izero)=zero
     317                 :             :  end if
     318                 :             : 
     319                 :             : !----- type -1 -----
     320         [ +  + ]:       43661 :  if (shape_type==-1) then
     321         [ +  - ]:           3 :    if (compute_gr0) then
     322         [ +  + ]:          18 :      do ll=0,l_size-1
     323         [ +  + ]:       21903 :        do ic=1,nfgd
     324         [ +  - ]:       21900 :          if (rnrm(ic)<=rcut) then
     325                 :       21885 :            gfact(ic,ll)=shpfuncnum(ic,ll+1)
     326                 :             :          end if
     327                 :             :        end do
     328                 :             :      end do
     329                 :             :    end if
     330         [ +  - ]:           3 :    if (compute_gr1) then
     331         [ +  + ]:          18 :      do ll=0,l_size-1
     332         [ +  + ]:       21903 :        do ic=1,nfgd
     333         [ +  - ]:       21900 :          if (rnrm(ic)<=rcut) then
     334                 :       21885 :            dgfact(ic,ll)=dshpfuncnum(ic,ll+1)*rnrm_inv(ic)
     335                 :             :          end if
     336                 :             :        end do
     337                 :             :      end do
     338                 :             :    end if
     339         [ -  + ]:           3 :    if(compute_gr2) then
     340         [ #  # ]:           0 :      do ll=0,l_size-1
     341         [ #  # ]:           0 :        do ic=1,nfgd
     342         [ #  # ]:           0 :          if (rnrm(ic)<=rcut) then
     343                 :           0 :            d2gfact(ic,ll)=(d2shpfuncnum(ic,ll+1)-dgfact(ic,ll))*rnrm_inv(ic)**2
     344                 :             :          end if
     345                 :             :        end do
     346                 :             :     end do
     347                 :             :    end if
     348                 :             : 
     349                 :             : !  ----- type 1 or 2 -----
     350         [ +  + ]:       43658 :  else if (shape_type==1.or.shape_type==2) then
     351                 :             : !  FIRST COMPUTE FACTORS FOR l=0
     352   [ +  +  +  +  :        7868 :    if (optgr0==1.and.optgr1==0.and.optgr2==0) then
                   +  - ]
     353         [ +  + ]:        3389 :      if (shape_type==1) then
     354         [ +  + ]:        5320 :        do ic=1,nfgd
     355                 :        5318 :          arg=rnrm(ic)
     356         [ +  + ]:        5320 :          if (arg<toldev) then
     357                 :           2 :            gfact(ic,0)=shapefunc1_0(arg)
     358         [ +  - ]:        5316 :          else if (arg<=rcut) then
     359                 :        5316 :            gfact(ic,0)=shapefunc1(arg)
     360                 :             :          end if
     361                 :             :        end do
     362                 :             :      else ! shape_type==2
     363         [ +  + ]:     5478107 :        do ic=1,nfgd
     364                 :     5474720 :          arg=rnrm(ic)
     365         [ +  + ]:     5478107 :          if (arg<toldev) then
     366                 :         820 :            gfact(ic,0)=shapefunc2_0(arg)
     367         [ +  - ]:     5473900 :          else if (arg<=rcut) then
     368                 :     5473900 :            gfact(ic,0)=shapefunc2(arg)
     369                 :             :          end if
     370                 :             :        end do
     371                 :             :      end if
     372   [ +  -  +  + ]:        4479 :    else if (optgr1==1.and.optgr2==0) then
     373         [ +  + ]:        4401 :      if (shape_type==1) then
     374         [ +  + ]:        5320 :        do ic=1,nfgd
     375                 :        5318 :          arg=rnrm(ic)
     376         [ +  + ]:        5320 :          if (arg<toldev) then
     377                 :           2 :            gfact(ic,0)=shapefunc1_0(arg)
     378         [ +  - ]:           2 :            if (lambda==2) then
     379                 :           2 :              dgfact(ic,0)=dshpfunc1_ovr_0_2(arg)
     380                 :             :            else ! lambda>2
     381                 :           0 :              dgfact(ic,0)=dshpfunc1_ovr_0(arg)
     382                 :             :            end if
     383         [ +  - ]:        5316 :          else if (arg<=rcut) then
     384                 :        5316 :            gfact(ic,0)=shapefunc1(arg)
     385                 :        5316 :            dgfact(ic,0)=dshpfunc1(arg)*rnrm_inv(ic)
     386                 :             :          end if
     387                 :             :        end do
     388                 :             :      else ! shape_type==2
     389         [ +  + ]:     6537725 :        do ic=1,nfgd
     390                 :     6533326 :          arg=rnrm(ic)
     391         [ +  + ]:     6537725 :          if (arg<toldev) then
     392                 :         918 :            gfact(ic,0)=shapefunc2_0(arg)
     393                 :         918 :            dgfact(ic,0)=dshpfunc2_ovr_0(arg)
     394         [ +  - ]:     6532408 :          else if (arg<=rcut) then
     395                 :     6532408 :            gfact(ic,0)=shapefunc2(arg)
     396                 :     6532408 :            dgfact(ic,0)=dshpfunc2(arg)*rnrm_inv(ic)
     397                 :             :          end if
     398                 :             :        end do
     399                 :             :      end if
     400         [ +  - ]:          78 :    else if (optgr2==1) then
     401         [ -  + ]:          78 :      if (shape_type==1) then
     402         [ #  # ]:           0 :        do ic=1,nfgd
     403                 :           0 :          arg=rnrm(ic)
     404         [ #  # ]:           0 :          if (arg<toldev) then
     405                 :           0 :            gfact(ic,0)=shapefunc1_0(arg)
     406         [ #  # ]:           0 :            if (lambda==2) then
     407                 :           0 :              dgfact(ic,0)=dshpfunc1_ovr_0_2(arg)
     408                 :           0 :              d2gfact(ic,0)=d2shpfunc1_ovr2_0_2(arg)
     409         [ #  # ]:           0 :            else if (lambda==3) then
     410                 :           0 :              dgfact(ic,0)=dshpfunc1_ovr_0(arg)
     411         [ #  # ]:           0 :              if (ic/=izero) then
     412                 :           0 :                d2gfact(ic,0)=d2shpfunc1_ovr2_0_3(arg)
     413                 :             :              else
     414                 :           0 :                d2gfact(ic,0)=zero ! Diverging case
     415                 :             :              end if
     416         [ #  # ]:           0 :            else if (lambda==4) then
     417                 :           0 :              dgfact(ic,0)=dshpfunc1_ovr_0(arg)
     418                 :           0 :              d2gfact(ic,0)=d2shpfunc1_ovr2_0_4(arg)
     419                 :             :            else ! lambda>4
     420                 :           0 :              dgfact(ic,0)=dshpfunc1_ovr_0(arg)
     421                 :           0 :              d2gfact(ic,0)=d2shpfunc1_ovr2_0(arg)
     422                 :             :            end if
     423         [ #  # ]:           0 :          else if (arg<=rcut) then
     424                 :           0 :            gfact(ic,0)=shapefunc1(arg)
     425                 :           0 :            dgfact(ic,0)=dshpfunc1(arg)*rnrm_inv(ic)
     426                 :           0 :            d2gfact(ic,0)=(d2shpfunc1(arg)-dgfact(ic,0))*rnrm_inv(ic)**2
     427                 :             :          end if
     428                 :             :        end do
     429                 :             :      else ! shape_type==2
     430         [ +  + ]:      172904 :        do ic=1,nfgd
     431                 :      172826 :          arg=rnrm(ic)
     432         [ +  + ]:      172904 :          if (arg<toldev) then
     433                 :          60 :            gfact(ic,0)=shapefunc2_0(arg)
     434                 :          60 :            dgfact(ic,0)=dshpfunc2_ovr_0(arg)
     435                 :          60 :            d2gfact(ic,0)=d2shpfunc2_ovr2_0(arg)
     436         [ +  - ]:      172766 :          else if (arg<=rcut) then
     437                 :      172766 :            gfact(ic,0)=shapefunc2(arg)
     438                 :      172766 :            dgfact(ic,0)=dshpfunc2(arg)*rnrm_inv(ic)
     439                 :      172766 :            d2gfact(ic,0)=(d2shpfunc2(arg)-dgfact(ic,0))*rnrm_inv(ic)**2
     440                 :             :          end if
     441                 :             :        end do
     442                 :             :      end if
     443                 :             :    end if
     444                 :             : 
     445                 :             : !  THEN COMPUTE FACTORS FOR l>0 (from l=0)
     446         [ +  - ]:        7868 :    if (compute_gr0) then
     447         [ +  + ]:        7868 :      if (l_size>1) then
     448         [ +  + ]:       19484 :        do ll=1,l_size-1
     449         [ +  + ]:    33801052 :          do ic=1,nfgd
     450                 :    33795272 :            gfact(ic,ll)=pawtab%gnorm(ll+1)*gfact(ic,0)*rnrm(ic)**ll
     451                 :             :          end do
     452                 :             :        end do
     453                 :             :      end if
     454                 :             :    end if
     455         [ +  + ]:        7868 :    if (compute_gr1) then
     456         [ +  + ]:        4479 :      if (l_size>1) then
     457         [ +  + ]:     6311725 :        do ic=1,nfgd
     458                 :     6311725 :          dgfact(ic,1)=pawtab%gnorm(2)*(gfact(ic,0)*rnrm_inv(ic)+dgfact(ic,0)*rnrm(ic))
     459                 :             :        end do
     460                 :             :      end if
     461         [ +  + ]:        4479 :      if (l_size>2) then
     462         [ +  + ]:     6311725 :        do ic=1,nfgd
     463                 :     6311725 :          dgfact(ic,2)=pawtab%gnorm(3)*(two*gfact(ic,0)+dgfact(ic,0)*rnrm(ic)**2)
     464                 :             :        end do
     465                 :             :      end if
     466         [ +  + ]:        4479 :      if (l_size>3) then
     467         [ +  + ]:        1710 :        do ll=3,l_size-1
     468         [ +  + ]:     5864120 :          do ic=1,nfgd
     469                 :             :            dgfact(ic,ll)=pawtab%gnorm(ll+1) &
     470                 :     5863570 : &           *(dble(ll)*gfact(ic,0)*rnrm(ic)**(ll-2)+dgfact(ic,0)*rnrm(ic)**ll)
     471                 :             :          end do
     472                 :             :        end do
     473                 :             :      end if
     474                 :             :    end if
     475         [ +  + ]:        7868 :    if (compute_gr2) then
     476         [ +  - ]:          78 :      if (l_size>1) then
     477         [ +  + ]:      172904 :        do ic=1,nfgd
     478                 :             :          d2gfact(ic,1)=pawtab%gnorm(2) &
     479                 :      172904 : &         *(-gfact(ic,0)*rnrm_inv(ic)**3+two*dgfact(ic,0)*rnrm_inv(ic)+d2gfact(ic,0)*rnrm(ic))
     480                 :             :        end do
     481                 :             :      end if
     482         [ +  - ]:          78 :      if (l_size>2) then
     483         [ +  + ]:      172904 :        do ic=1,nfgd
     484                 :      172904 :          d2gfact(ic,2)=pawtab%gnorm(3)*(four*dgfact(ic,0)+d2gfact(ic,0)*rnrm(ic)**2)
     485                 :             :        end do
     486                 :             :      end if
     487         [ +  + ]:          78 :      if (l_size>3) then
     488         [ +  + ]:       92822 :        do ic=1,nfgd
     489                 :             :          d2gfact(ic,3)=pawtab%gnorm(4) &
     490                 :       92822 : &         *(three*gfact(ic,0)*rnrm_inv(ic)+6._dp*dgfact(ic,0)*rnrm(ic)+ d2gfact(ic,0)*rnrm(ic)**3)
     491                 :             :        end do
     492                 :             :      end if
     493         [ +  + ]:          78 :      if (l_size>4) then
     494         [ +  + ]:       92822 :        do ic=1,nfgd
     495                 :             :          d2gfact(ic,4)=pawtab%gnorm(5) &
     496                 :       92822 : &         *(8._dp*gfact(ic,0)+8._dp*dgfact(ic,0)*rnrm(ic)**2+d2gfact(ic,0)*rnrm(ic)**4)
     497                 :             :        end do
     498                 :             :      end if
     499         [ -  + ]:          78 :      if (l_size>5) then
     500         [ #  # ]:           0 :        do ll=5,l_size-1
     501         [ #  # ]:           0 :          do ic=1,nfgd
     502                 :             :            d2gfact(ic,ll)=pawtab%gnorm(ll+1) &
     503                 :             : &           *(dble(ll*(ll-2))*gfact(ic,0)*rnrm(ic)**(ll-4) &
     504                 :             : &            +dble(2*ll)*dgfact(ic,0)*rnrm(ic)**(ll-2) &
     505                 :           0 : &            +d2gfact(ic,0)*rnrm(ic)**ll)
     506                 :             :          end do
     507                 :             :        end do
     508                 :             :      end if
     509                 :             :    end if
     510   [ +  -  +  + ]:    12199376 :    if (compute_gr0) gfact(:,0)=gfact(:,0)*pawtab%gnorm(1)
     511   [ +  +  +  + ]:     6719338 :    if (compute_gr1) dgfact(:,0)=dgfact(:,0)*pawtab%gnorm(1)
     512   [ +  +  +  + ]:      180694 :    if (compute_gr2) d2gfact(:,0)=d2gfact(:,0)*pawtab%gnorm(1)
     513                 :             : 
     514                 :             : !  ----- type 3 -----
     515         [ +  - ]:       35790 :  else if (shape_type==3) then
     516   [ +  +  +  +  :       35790 :    if (optgr0==1.and.optgr1==0.and.optgr2==0) then
                   +  - ]
     517         [ +  + ]:      125459 :      do ll=0,l_size-1
     518         [ +  + ]:    75304044 :        do ic=1,nfgd
     519                 :    75178585 :          arg=rnrm(ic)
     520         [ +  - ]:    75272743 :          if (arg<=rcut) then
     521                 :    75178585 :            call paw_jbessel(jbes1,jbesp1,jbespp1,ll,0,qq(1,1+ll)*arg)
     522                 :    75178585 :            call paw_jbessel(jbes2,jbesp2,jbespp2,ll,0,qq(2,1+ll)*arg)
     523                 :    75178585 :            gfact(ic,ll)=shapefunc3(jbes1,jbes2,ll)
     524                 :             :          end if
     525                 :             :        end do
     526                 :             :      end do
     527   [ +  -  +  + ]:        4489 :    else if (optgr1==1.and.optgr2==0) then
     528         [ +  + ]:       17747 :      do ll=0,l_size-1
     529         [ +  + ]:    13975928 :        do ic=1,nfgd
     530                 :    13958181 :          arg=rnrm(ic)
     531         [ +  - ]:    13971462 :          if (arg<=rcut) then
     532                 :    13958181 :            call paw_jbessel(jbes1,jbesp1,jbespp1,ll,1,qq(1,1+ll)*arg)
     533                 :    13958181 :            call paw_jbessel(jbes2,jbesp2,jbespp2,ll,1,qq(2,1+ll)*arg)
     534                 :    13958181 :            gfact(ic,ll)=shapefunc3(jbes1,jbes2,ll)
     535                 :    13958181 :            dgfact(ic,ll)=dshpfunc3(jbesp1,jbesp2,ll)*rnrm_inv(ic)
     536                 :             :          end if
     537                 :             :        end do
     538                 :             :      end do
     539   [ +  +  +  - ]:        4466 :      if (izero>0.and.l_size>=1)  dgfact(izero,0)=-(alpha(1,1)*qq(1,1)+alpha(2,1)*qq(2,1))/three
     540         [ +  - ]:        4038 :      if (izero>0.and.l_size>=3)  dgfact(izero,2)=two/15._dp*(alpha(1,1)*qq(1,1)+alpha(2,1)*qq(2,1))
     541                 :             : !    Note: for l=1, dgfact is diverging - d2gfact is diverging for l<4
     542         [ +  - ]:          23 :    else if (optgr2==1) then
     543         [ +  + ]:          94 :      do ll=0,l_size-1
     544         [ +  + ]:       79616 :        do ic=1,nfgd
     545                 :       79522 :          arg=rnrm(ic)
     546         [ +  - ]:       79593 :          if (arg<=rcut) then
     547                 :       79522 :            call paw_jbessel(jbes1,jbesp1,jbespp1,ll,2,qq(1,1+ll)*arg)
     548                 :       79522 :            call paw_jbessel(jbes2,jbesp2,jbespp2,ll,2,qq(2,1+ll)*arg)
     549                 :       79522 :            gfact(ic,ll)=shapefunc3(jbes1,jbes2,ll)
     550                 :       79522 :            dgfact(ic,ll)=dshpfunc3(jbesp1,jbesp2,ll)*rnrm_inv(ic)
     551                 :       79522 :            d2gfact(ic,ll)=(d2shpfunc3(jbespp1,jbespp2,ll)-dgfact(ic,ll))*rnrm_inv(ic)**2
     552                 :             :          end if
     553                 :             :        end do
     554                 :             :      end do
     555   [ +  +  +  - ]:          23 :      if (izero>0.and.l_size>=1)  dgfact(izero,0)=-(alpha(1,1)*qq(1,1)+alpha(2,1)*qq(2,1))/three
     556         [ +  - ]:           5 :      if (izero>0.and.l_size>=3)  dgfact(izero,2)=two/15._dp*(alpha(1,1)*qq(1,1)+alpha(2,1)*qq(2,1))
     557                 :             : !    Note: for l=1, dgfact is diverging - d2gfact is diverging for l<4
     558                 :             :    end if
     559                 :             :  end if
     560                 :             : 
     561                 :             : !g_l(r-R)*Y_lm(r-R) calculation
     562                 :             : !==========================================================
     563         [ +  + ]:       43661 :  if (optgr0==1) then
     564                 :             : 
     565         [ +  + ]:      166763 :    do ll=0,l_size-1
     566         [ +  + ]:      544335 :      do ilm=ll**2+1,min((ll+1)**2,lm_size)
     567         [ +  + ]:   399449632 :        do ic=1,nfgd
     568                 :   399325250 :          gylm(ic,ilm)=gfact(ic,ll)*ylmr(ilm,ic)
     569                 :             :        end do
     570                 :             :      end do
     571                 :             :    end do
     572                 :             : 
     573                 :             : !  Special value at r-R=0  (supposing shapefunc(r)->C.r**l when r->0)
     574         [ +  + ]:       42381 :    if (izero>0) then
     575         [ +  + ]:      372369 :      gylm(izero,1:lm_size)=zero
     576         [ +  - ]:       36281 :      if (lm_size>=1) gylm(izero,1)=ylmr(1,izero)*cc(1,1)
     577                 :             :    end if
     578                 :             : 
     579                 :             :  end if
     580                 :             : 
     581                 :             : !d/dr{g_l(r-R)*Y_lm(r-R)} calculation
     582                 :             : !==========================================================
     583         [ +  + ]:       43661 :  if(optgr1==1) then
     584                 :             : 
     585         [ +  + ]:       34335 :    do ll=0,l_size-1
     586         [ +  + ]:      115105 :      do ilm=ll**2+1,min((ll+1)**2,lm_size)
     587         [ +  + ]:   158380138 :        do ic=1,nfgd
     588                 :             :          gylmgr(1:3,ic,ilm)=gfact(ic,ll)*ylmrgr(1:3,ilm,ic)&
     589         [ +  + ]:   633176786 : &         +dgfact(ic,ll)*rfgd(1:3,ic)*ylmr(ilm,ic)
     590                 :             :        end do
     591                 :             :      end do
     592                 :             :    end do
     593                 :             : 
     594                 :             : !  Special values at r-R=0  (supposing shapefunc(r)->C.r**l when r->0)
     595         [ +  + ]:        8971 :    if (izero>0) then
     596   [ +  +  +  + ]:      218011 :      gylmgr(1:3,izero,1:lm_size)=zero
     597         [ +  - ]:        5011 :      if (lm_size>=1) then
     598                 :        5011 :        arg=cc(2,1)/sqrt(four_pi)
     599         [ +  + ]:       20044 :        gylmgr(1:3,izero,1)=arg
     600                 :             :      end if
     601         [ +  + ]:        5011 :      if (lm_size>=2) then
     602                 :        4973 :        arg=cc(1,2)*sqrt(three/four_pi)
     603                 :        4973 :        gylmgr(2,izero,2)=arg
     604         [ +  - ]:        4973 :        if (lm_size>=3) gylmgr(3,izero,3)=arg
     605         [ +  - ]:        4973 :        if (lm_size>=4) gylmgr(1,izero,4)=arg
     606                 :             :      end if
     607                 :             :    end if
     608                 :             : 
     609                 :             :  end if
     610                 :             : 
     611                 :             : !d2/dridrj{g_l(r-R)*Y_lm(r-R)} calculation
     612                 :             : !==========================================================
     613         [ +  + ]:       43661 :  if(optgr2==1) then
     614                 :             : 
     615         [ +  + ]:         428 :    do ll=0,l_size-1
     616         [ +  + ]:        1529 :      do ilm=ll**2+1,min((ll+1)**2,lm_size)
     617         [ +  + ]:     3317354 :        do ic=1,nfgd
     618                 :             :          gylmgr2(1,ic,ilm)=gfact(ic,ll)*ylmrgr(4,ilm,ic) &
     619                 :             : &         +dgfact(ic,ll)*(ylmr(ilm,ic)+two*rfgd(1,ic)*ylmrgr(1,ilm,ic)) &
     620                 :     3315926 : &         +d2gfact(ic,ll)*ylmr(ilm,ic)*rfgd(1,ic)*rfgd(1,ic)
     621                 :             :          gylmgr2(2,ic,ilm)=gfact(ic,ll)*ylmrgr(5,ilm,ic) &
     622                 :             : &         +dgfact(ic,ll)*(ylmr(ilm,ic)+two*rfgd(2,ic)*ylmrgr(2,ilm,ic)) &
     623                 :     3315926 : &         +d2gfact(ic,ll)*ylmr(ilm,ic)*rfgd(2,ic)*rfgd(2,ic)
     624                 :             :          gylmgr2(3,ic,ilm)=gfact(ic,ll)*ylmrgr(6,ilm,ic) &
     625                 :             : &         +dgfact(ic,ll)*(ylmr(ilm,ic)+two*rfgd(3,ic)*ylmrgr(3,ilm,ic)) &
     626                 :     3315926 : &         +d2gfact(ic,ll)*ylmr(ilm,ic)*rfgd(3,ic)*rfgd(3,ic)
     627                 :             :          gylmgr2(4,ic,ilm)=gfact(ic,ll)*ylmrgr(7,ilm,ic) &
     628                 :             : &         +dgfact(ic,ll)*(rfgd(3,ic)*ylmrgr(2,ilm,ic)+rfgd(2,ic)*ylmrgr(3,ilm,ic)) &
     629                 :     3315926 : &         +d2gfact(ic,ll)*ylmr(ilm,ic)*rfgd(3,ic)*rfgd(2,ic)
     630                 :             :          gylmgr2(5,ic,ilm)=gfact(ic,ll)*ylmrgr(8,ilm,ic) &
     631                 :             : &         +dgfact(ic,ll)*(rfgd(3,ic)*ylmrgr(1,ilm,ic)+rfgd(1,ic)*ylmrgr(3,ilm,ic)) &
     632                 :     3315926 : &         +d2gfact(ic,ll)*ylmr(ilm,ic)*rfgd(3,ic)*rfgd(1,ic)
     633                 :             :          gylmgr2(6,ic,ilm)=gfact(ic,ll)*ylmrgr(9,ilm,ic) &
     634                 :             : &         +dgfact(ic,ll)*(rfgd(1,ic)*ylmrgr(2,ilm,ic)+rfgd(2,ic)*ylmrgr(1,ilm,ic)) &
     635                 :     3317027 : &         +d2gfact(ic,ll)*ylmr(ilm,ic)*rfgd(1,ic)*rfgd(2,ic)
     636                 :             :        end do
     637                 :             :      end do
     638                 :             :    end do
     639                 :             : 
     640                 :             : !  Special values at r-R=0  (supposing shapefunc(r)->C.r**l when r->0)
     641         [ +  + ]:         101 :    if (izero>0) then
     642   [ +  +  +  + ]:        5504 :      gylmgr2(1:6,izero,1:lm_size)=zero
     643         [ +  - ]:          65 :      if (lm_size>=1) then
     644                 :          65 :        arg=cc(3,1)/sqrt(four_pi)
     645         [ +  + ]:         260 :        gylmgr2(1:3,izero,1)=arg
     646                 :             :      end if
     647         [ +  - ]:          65 :      if (lm_size>=2) then
     648                 :          65 :        arg=cc(2,2)*sqrt(three/four_pi)
     649                 :          65 :        gylmgr2(2,izero,2)=two*arg
     650                 :          65 :        gylmgr2(4,izero,2)=    arg
     651         [ +  - ]:          65 :        if (lm_size>=3) then
     652                 :          65 :          gylmgr2(1,izero,3)=two*arg
     653                 :          65 :          gylmgr2(3,izero,3)=two*arg
     654                 :             :        end if
     655         [ +  - ]:          65 :        if (lm_size>=4) then
     656                 :          65 :          gylmgr2(5,izero,4)=arg
     657                 :          65 :          gylmgr2(6,izero,4)=arg
     658                 :             :        end if
     659                 :             :      end if
     660         [ +  - ]:          65 :      if (lm_size>=5) then
     661                 :          65 :        arg=cc(1,3)*sqrt(15._dp/four_pi)
     662                 :          65 :        gylmgr2(6,izero,5)=arg
     663         [ +  - ]:          65 :        if (lm_size>=6) gylmgr2(4,izero,6)=arg
     664         [ +  - ]:          65 :        if (lm_size>=7) then
     665                 :          65 :          gylmgr2(1,izero,7)=   -arg/sqrt3
     666                 :          65 :          gylmgr2(2,izero,7)=   -arg/sqrt3
     667                 :          65 :          gylmgr2(3,izero,7)=two*arg/sqrt3
     668                 :             :        end if
     669         [ +  - ]:          65 :        if (lm_size>=8) gylmgr2(5,izero,8)=arg
     670         [ +  - ]:          65 :        if (lm_size>=9) then
     671                 :          65 :          gylmgr2(1,izero,9)= arg
     672                 :          65 :          gylmgr2(2,izero,9)=-arg
     673                 :             :        end if
     674                 :             :      end if
     675                 :             :    end if
     676                 :             : 
     677                 :             :  end if
     678                 :             : 
     679                 :             : !Memory deallocation
     680                 :             : !==========================================================
     681         [ -  + ]:       43661 :  LIBPAW_DEALLOCATE(rnrm)
     682         [ +  + ]:       43661 :  if (allocated(cc)) then
     683                 :       37010 :    LIBPAW_DEALLOCATE(cc)
     684                 :             :  end if
     685         [ +  - ]:       43661 :  if (compute_gr0)  then
     686         [ -  + ]:       43661 :    LIBPAW_DEALLOCATE(gfact)
     687                 :             :  end if
     688         [ +  + ]:       43661 :  if (compute_gr1)  then
     689         [ -  + ]:        8971 :    LIBPAW_DEALLOCATE(dgfact)
     690                 :             :  end if
     691         [ +  + ]:       43661 :  if (compute_gr2)  then
     692         [ -  + ]:         101 :    LIBPAW_DEALLOCATE(d2gfact)
     693                 :             :  end if
     694         [ +  + ]:       43661 :  if (compute_gr1)  then
     695         [ -  + ]:        8971 :    LIBPAW_DEALLOCATE(rnrm_inv)
     696                 :             :  end if
     697         [ +  + ]:       43661 :  if (shape_type==3)  then
     698         [ -  + ]:       35790 :    LIBPAW_DEALLOCATE(alpha)
     699         [ -  + ]:       35790 :    LIBPAW_DEALLOCATE(qq)
     700                 :             :  end if
     701         [ +  - ]:       43661 :  if (compute_gr0)  then
     702         [ -  + ]:       43661 :    LIBPAW_DEALLOCATE(ylmr)
     703                 :             :  end if
     704         [ +  + ]:       43661 :  if (compute_gr1)  then
     705         [ -  + ]:        8971 :    LIBPAW_DEALLOCATE(ylmrgr)
     706                 :             :  end if
     707   [ +  +  -  +  :       43680 :  if (shape_type==-1) then
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
             +  -  +  -  
                      + ]
     708         [ +  - ]:           3 :    if (compute_gr0)  then
     709         [ -  + ]:           3 :      LIBPAW_DEALLOCATE(shpfuncnum)
     710                 :             :    end if
     711         [ +  - ]:           3 :    if (compute_gr1)  then
     712         [ -  + ]:           3 :      LIBPAW_DEALLOCATE(dshpfuncnum)
     713                 :             :    end if
     714         [ -  + ]:           3 :    if (compute_gr2)  then
     715         [ #  # ]:           0 :      LIBPAW_DEALLOCATE(d2shpfuncnum)
     716                 :             :    end if
     717                 :             :  end if
     718                 :             : 
     719                 :             : ! -----------------------------------------------------------------
     720                 :             : !Small functions related to analytical expression of shape function
     721                 :             :  CONTAINS
     722                 :             : !!***
     723                 :             : ! ------------------------------------------------
     724                 :             : !!****f* m_paw_finegrid/shapefunc1
     725                 :             : !  shapefunc1 is g(x) (gaussian)
     726                 :       10632 :    function shapefunc1(arg)
     727                 :             : 
     728                 :             :      real(dp) :: shapefunc1
     729                 :             :      real(dp),intent(in) :: arg
     730                 :       10632 :      shapefunc1=exp(-(arg/sigma)**lambda)
     731                 :       10632 :    end function shapefunc1
     732                 :             : !!***
     733                 :             : ! ------------------------------------------------
     734                 :             : !!****f* m_paw_finegrid/shapefunc1_0
     735                 :             : !  shapefunc1_0 is g(x) (gaussian) for small x
     736                 :           4 :    function shapefunc1_0(arg)
     737                 :             : 
     738                 :             :      real(dp) :: shapefunc1_0
     739                 :             :      real(dp),intent(in) :: arg
     740                 :           4 :      shapefunc1_0=one-(arg/sigma)**lambda+half*(arg/sigma)**(2*lambda)-(arg/sigma)**(3*lambda)/6._dp
     741                 :           4 :    end function shapefunc1_0
     742                 :             : !!***
     743                 :             : ! ------------------------------------------------
     744                 :             : !!****f* m_paw_finegrid/shapefunc2
     745                 :             : !  shapefunc2 is g(x) (sinc2)
     746                 :    12179074 :    function shapefunc2(arg)
     747                 :             : 
     748                 :             :      real(dp) :: shapefunc2
     749                 :             :      real(dp),intent(in) :: arg
     750                 :    12179074 :      shapefunc2=(sin(pi_over_rshp*arg)/(pi_over_rshp*arg))**2
     751                 :    12179074 :    end function shapefunc2
     752                 :             : !!***
     753                 :             : ! ------------------------------------------------
     754                 :             : !!****f* m_paw_finegrid/shapefunc2_0
     755                 :             : !  shapefunc2_0 is g(x) (sinc2) for small x
     756                 :        1798 :    function shapefunc2_0(arg)
     757                 :             : 
     758                 :             :      real(dp) :: shapefunc2_0
     759                 :             :      real(dp),intent(in) :: arg
     760                 :        1798 :      shapefunc2_0=one-(pi_over_rshp*arg)**2/three+two*(pi_over_rshp*arg)**4/45._dp
     761                 :        1798 :    end function shapefunc2_0
     762                 :             : !!***
     763                 :             : ! ------------------------------------------------
     764                 :             : !!****f* m_paw_finegrid/shapefunc3
     765                 :             : !  shapefunc3 is g(x) (Bessel)
     766                 :    89216288 :    function shapefunc3(jbes1,jbes2,argl)
     767                 :             : 
     768                 :             :      integer,intent(in) :: argl
     769                 :             :      real(dp) :: shapefunc3
     770                 :             :      real(dp),intent(in) :: jbes1,jbes2
     771                 :    89216288 :      shapefunc3= alpha(1,1+argl)*jbes1+alpha(2,1+argl)*jbes2
     772                 :    89216288 :    end function shapefunc3
     773                 :             : !!***
     774                 :             : ! ------------------------------------------------
     775                 :             : !!****f* m_paw_finegrid/dshpfunc1
     776                 :             : !  dshpfunc1(x) is g_prime(x) (gaussian)
     777                 :        5316 :    function dshpfunc1(arg)
     778                 :             : 
     779                 :             :      real(dp) :: dshpfunc1
     780                 :             :      real(dp),intent(in) :: arg
     781                 :        5316 :      dshpfunc1=-lambda/sigma*(arg/sigma)**(lambda-1)*exp(-(arg/sigma)**lambda)
     782                 :        5316 :    end function dshpfunc1
     783                 :             : !!***
     784                 :             : ! ------------------------------------------------
     785                 :             : !!****f* m_paw_finegrid/dshpfunc1_ovr_0
     786                 :             : !  dshpfunc1_ovr_0(x) is g_prime(x)/x (gaussian) for small x and lambda>2
     787                 :           0 :    function dshpfunc1_ovr_0(arg)
     788                 :             : 
     789                 :             :      real(dp) :: dshpfunc1_ovr_0
     790                 :             :      real(dp),intent(in) :: arg
     791                 :           0 :      dshpfunc1_ovr_0=-lambda/sigma**2*((arg/sigma)**(lambda-2)-(arg/sigma)**(2*lambda-2))
     792                 :           0 :    end function dshpfunc1_ovr_0
     793                 :             : !!***
     794                 :             : ! ------------------------------------------------
     795                 :             : !!****f* m_paw_finegrid/dshpfunc1_ovr_0_2
     796                 :             : !  dshpfunc1_ovr_0_2(x) is g_prime(x)/x (gaussian) for small x and lambda=2
     797                 :           2 :    function dshpfunc1_ovr_0_2(arg)
     798                 :             : 
     799                 :             :      real(dp) :: dshpfunc1_ovr_0_2
     800                 :             :      real(dp),intent(in) :: arg
     801                 :           2 :      dshpfunc1_ovr_0_2=-two/sigma**2*(one-(arg/sigma)**2+half*(arg/sigma)**4)
     802                 :           2 :    end function dshpfunc1_ovr_0_2
     803                 :             : !!***
     804                 :             : ! ------------------------------------------------
     805                 :             : !!****f* m_paw_finegrid/dshpfunc2
     806                 :             : !  dshpfunc2(x) is g_prime(x) (sinc2)
     807                 :     6705174 :    function dshpfunc2(arg)
     808                 :             : 
     809                 :             :      real(dp) :: dshpfunc2
     810                 :             :      real(dp),intent(in) :: arg
     811                 :             :      dshpfunc2=two*pi_over_rshp*sin(pi_over_rshp*arg)/(pi_over_rshp*arg)**3&
     812                 :     6705174 : &              *(pi_over_rshp*arg*cos(pi_over_rshp*arg)-sin(pi_over_rshp*arg))
     813                 :     6705174 :    end function dshpfunc2
     814                 :             : !!***
     815                 :             : ! ------------------------------------------------
     816                 :             : !!****f* m_paw_finegrid/dshpfunc2_ovr_0
     817                 :             : !  dshpfunc2_ovr_0(x) is g_prime(x)/x (sinc2) for small x
     818                 :         978 :    function dshpfunc2_ovr_0(arg)
     819                 :             : 
     820                 :             :      real(dp) :: dshpfunc2_ovr_0
     821                 :             :      real(dp),intent(in) :: arg
     822                 :         978 :      dshpfunc2_ovr_0=-two*pi_over_rshp**2/3._dp+8._dp*pi_over_rshp**4*arg**2/45._dp
     823                 :         978 :    end function dshpfunc2_ovr_0
     824                 :             : !!***
     825                 :             : ! ------------------------------------------------
     826                 :             : !!****f* m_paw_finegrid/dshpfunc3
     827                 :             : !  dshpfunc3(x) is g_prime(x) (Bessel)
     828                 :    14037703 :    function dshpfunc3(jbesp1,jbesp2,argl)
     829                 :             : 
     830                 :             :      integer :: argl
     831                 :             :      real(dp) :: dshpfunc3
     832                 :             :      real(dp),intent(in) :: jbesp1,jbesp2
     833                 :             :      dshpfunc3= alpha(1,1+argl)*qq(1,1+argl)*jbesp1 &
     834                 :    14037703 : &                              +alpha(2,1+argl)*qq(2,1+argl)*jbesp2
     835                 :    14037703 :    end function dshpfunc3
     836                 :             : !!***
     837                 :             : ! ------------------------------------------------
     838                 :             : !!****f* m_paw_finegrid/d2shpfunc1
     839                 :             : !  d2shpfunc1(x) is g_prime_prime(x) (gaussian)
     840                 :           0 :    function d2shpfunc1(arg)
     841                 :             : 
     842                 :             :      real(dp) :: d2shpfunc1
     843                 :             :      real(dp),intent(in) :: arg
     844                 :             :      d2shpfunc1=lambda/(sigma**2)*(lambda*(arg/sigma)**(2*lambda-2) &
     845                 :           0 : &               -(lambda-1)*(arg/sigma)**(lambda-2))*exp(-(arg/sigma)**lambda)
     846                 :           0 :    end function d2shpfunc1
     847                 :             : !!***
     848                 :             : ! ------------------------------------------------
     849                 :             : !!****f* m_paw_finegrid/d2shpfunc1_ovr2_0
     850                 :             : !  d2shpfunc1_ovr2_0(x) is (g_prime_prime(x)-g_prime(x)/x)/x**2 (gaussian) for small x and lambda>4
     851                 :           0 :    function d2shpfunc1_ovr2_0(arg)
     852                 :             : 
     853                 :             :      real(dp) :: d2shpfunc1_ovr2_0
     854                 :             :      real(dp),intent(in) :: arg
     855                 :             :      d2shpfunc1_ovr2_0=-lambda/(sigma**4)*((lambda-2)*(arg/sigma)**(lambda-4) &
     856                 :           0 : &                                          -(lambda-1)*two*(arg/sigma)**(2*lambda-4))
     857                 :           0 :    end function d2shpfunc1_ovr2_0
     858                 :             : !!***
     859                 :             : ! ------------------------------------------------
     860                 :             : !!****f* m_paw_finegrid/d2shpfunc1_ovr2_0_2
     861                 :             : !  d2shpfunc1_ovr2_0_2(x) is (g_prime_prime(x)-g_prime(x)/x)/x**2 (gaussian) for small x and lambda==2
     862                 :           0 :    function d2shpfunc1_ovr2_0_2(arg)
     863                 :             : 
     864                 :             :      real(dp) :: d2shpfunc1_ovr2_0_2
     865                 :             :      real(dp),intent(in) :: arg
     866                 :           0 :      d2shpfunc1_ovr2_0_2=four/(sigma**4)*(one-(arg/sigma)**2)
     867                 :           0 :    end function d2shpfunc1_ovr2_0_2
     868                 :             : !!***
     869                 :             : ! ------------------------------------------------
     870                 :             : !!****f* m_paw_finegrid/d2shpfunc1_ovr2_0_3
     871                 :             : !  d2shpfunc1_ovr2_0_3(x) is (g_prime_prime(x)-g_prime(x)/x)/x**2 (gaussian) for small x and lambda==3
     872                 :           0 :    function d2shpfunc1_ovr2_0_3(arg)
     873                 :             : 
     874                 :             :      real(dp) :: d2shpfunc1_ovr2_0_3
     875                 :             :      real(dp),intent(in) :: arg
     876                 :           0 :      d2shpfunc1_ovr2_0_3=-three/arg/sigma**3+12._dp*arg**2/sigma**6-half*21._dp*arg**5/sigma**9
     877                 :           0 :    end function d2shpfunc1_ovr2_0_3
     878                 :             : !!***
     879                 :             : ! ------------------------------------------------
     880                 :             : !!****f* m_paw_finegrid/d2shpfunc1_ovr2_0_4
     881                 :             : !  d2shpfunc1_ovr2_0_4(x) is (g_prime_prime(x)-g_prime(x)/x)/x**2 (gaussian) for small x and lambda==4
     882                 :           0 :    function d2shpfunc1_ovr2_0_4(arg)
     883                 :             : 
     884                 :             :      real(dp) :: d2shpfunc1_ovr2_0_4
     885                 :             :      real(dp),intent(in) :: arg
     886                 :           0 :      d2shpfunc1_ovr2_0_4=-8._dp/(sigma**4)*(one-three*(arg/sigma)**4)
     887                 :           0 :    end function d2shpfunc1_ovr2_0_4
     888                 :             : !!***
     889                 :             : ! ------------------------------------------------
     890                 :             : !!****f* m_paw_finegrid/d2shpfunc2
     891                 :             : !  d2shpfunc2(x) is g_prime_prime(x) (sinc2)
     892                 :      172766 :    function d2shpfunc2(arg)
     893                 :             : 
     894                 :             :      real(dp) :: d2shpfunc2
     895                 :             :      real(dp),intent(in) :: arg
     896                 :             :      d2shpfunc2=two/(pi_over_rshp**2*arg**4)* &
     897                 :             : &               (pi_over_rshp**2*arg**2*(cos(pi_over_rshp*arg))**2 &
     898                 :             : &               +(three-pi_over_rshp**2*arg**2)*(sin(pi_over_rshp*arg))**2 &
     899                 :      172766 : &               -four*pi_over_rshp*arg*cos(pi_over_rshp*arg)*sin(pi_over_rshp*arg))
     900                 :      172766 :    end function d2shpfunc2
     901                 :             : !!***
     902                 :             : ! ------------------------------------------------
     903                 :             : !!****f* m_paw_finegrid/d2shpfunc2_ovr2_0
     904                 :             : !  d2shpfunc2_ovr2_0(x) is (g_prime_prime(x)-g_prime(x)/x)/x**2 (sinc2) for small x
     905                 :          60 :    function d2shpfunc2_ovr2_0(arg)
     906                 :             : 
     907                 :             :      real(dp) :: d2shpfunc2_ovr2_0
     908                 :             :      real(dp),intent(in) :: arg
     909                 :             :      d2shpfunc2_ovr2_0=16._dp/45._dp*pi_over_rshp**4-8._dp/105._dp*pi_over_rshp**6*arg**2 &
     910                 :          60 : &                      +41._dp/6300._dp*pi_over_rshp**8*arg**4
     911                 :          60 :    end function d2shpfunc2_ovr2_0
     912                 :             : !!***
     913                 :             : ! ------------------------------------------------
     914                 :             : !!****f* m_paw_finegrid/d2shpfunc3
     915                 :             : !  d2shpfunc3(x) is g_prime_prime(x) (Bessel)
     916                 :       79522 :    function d2shpfunc3(jbespp1,jbespp2,argl)
     917                 :             : 
     918                 :             :      integer,intent(in) :: argl
     919                 :             :      real(dp) :: d2shpfunc3
     920                 :             :      real(dp),intent(in) :: jbespp1,jbespp2
     921                 :             :      d2shpfunc3= alpha(1,1+argl)*(qq(1,1+argl)**2)*jbespp1 &
     922                 :       79522 : &                                 +alpha(2,1+argl)*(qq(2,1+argl)**2)*jbespp2
     923                 :       79522 :    end function d2shpfunc3
     924                 :             : ! ------------------------------------------------
     925                 :             : 
     926                 :             : end subroutine pawgylm
     927                 :             : !!***
     928                 :             : 
     929                 :             : !----------------------------------------------------------------------
     930                 :             : 
     931                 :             : !!****f* m_paw_finegrid/pawgylmg
     932                 :             : !! NAME
     933                 :             : !! pawgylmg
     934                 :             : !!
     935                 :             : !! FUNCTION
     936                 :             : !! PAW: Compute Fourier transform of each g_l(r).Y_lm(r) function
     937                 :             : !!
     938                 :             : !! INPUTS
     939                 :             : !!  gprimd(3,3)=dimensional reciprocal space primitive translations
     940                 :             : !!  kg(3,npw)=integer coordinates of planewaves in basis sphere for this k point.
     941                 :             : !!  kpg(npw,nkpg)= (k+G) components (only if useylm=1)
     942                 :             : !!  kpt(3)=reduced coordinates of k point
     943                 :             : !!  lmax=1+max. value of l angular momentum
     944                 :             : !!  nkpg=second dimension of kpg_k (0 if useylm=0)
     945                 :             : !!  npw=number of planewaves in basis sphere
     946                 :             : !!  ntypat=number of types of atoms
     947                 :             : !!  pawtab(ntypat) <type(pawtab_type)>=paw tabulated starting data
     948                 :             : !!  ylm(npw,lmax**2)=real spherical harmonics for each G and k point
     949                 :             : !!
     950                 :             : !! OUTPUT
     951                 :             : !!  gylmg(npw,lmax**2,ntypat)=Fourier transform of each g_l(r).Y_lm(r) function
     952                 :             : !!
     953                 :             : !! SOURCE
     954                 :             : 
     955                 :           0 : subroutine pawgylmg(gprimd,gylmg,kg,kpg,kpt,lmax,nkpg,npw,ntypat,pawtab,ylm)
     956                 :             : 
     957                 :             : !Arguments ------------------------------------
     958                 :             : !scalars
     959                 :             :  integer,intent(in) :: lmax,nkpg,npw,ntypat
     960                 :             : !arrays
     961                 :             :  integer,intent(in) :: kg(3,npw)
     962                 :             :  real(dp),intent(in) :: gprimd(3,3),kpg(npw,nkpg),kpt(3)
     963                 :             :  real(dp),intent(in) :: ylm(npw,lmax**2)
     964                 :             :  type(pawtab_type),intent(in) :: pawtab(ntypat)
     965                 :             : 
     966                 :             :  real(dp),intent(out) :: gylmg(npw,lmax**2,ntypat)
     967                 :             : 
     968                 :             : !Local variables-------------------------------
     969                 :             : !scalars
     970                 :             :  integer :: ig,ilm,itypat,ll,l0,mm,mqgrid
     971                 :             :  real(dp) :: kpg1,kpg2,kpg3,kpgc1,kpgc2,kpgc3
     972                 :             : !arrays
     973                 :           0 :  real(dp),allocatable :: glg(:),qgrid(:),kpgnorm(:),shpf(:,:),work(:)
     974                 :             : 
     975                 :             : ! *************************************************************************
     976                 :             : 
     977                 :             : !Get |k+G|:
     978   [ #  #  #  #  :           0 :  LIBPAW_ALLOCATE(kpgnorm,(npw))
          #  #  #  #  #  
                #  #  # ]
     979         [ #  # ]:           0 :  if (nkpg<3) then
     980         [ #  # ]:           0 :    do ig=1,npw
     981                 :           0 :      kpg1=kpt(1)+dble(kg(1,ig));kpg2=kpt(2)+dble(kg(2,ig));kpg3=kpt(3)+dble(kg(3,ig))
     982                 :           0 :      kpgc1=kpg1*gprimd(1,1)+kpg2*gprimd(1,2)+kpg3*gprimd(1,3)
     983                 :           0 :      kpgc2=kpg1*gprimd(2,1)+kpg2*gprimd(2,2)+kpg3*gprimd(2,3)
     984                 :           0 :      kpgc3=kpg1*gprimd(3,1)+kpg2*gprimd(3,2)+kpg3*gprimd(3,3)
     985                 :           0 :      kpgnorm(ig)=sqrt(kpgc1*kpgc1+kpgc2*kpgc2+kpgc3*kpgc3)
     986                 :             :    end do
     987                 :             :  else
     988         [ #  # ]:           0 :    do ig=1,npw
     989                 :           0 :      kpgc1=kpg(ig,1)*gprimd(1,1)+kpg(ig,2)*gprimd(1,2)+kpg(ig,3)*gprimd(1,3)
     990                 :           0 :      kpgc2=kpg(ig,1)*gprimd(2,1)+kpg(ig,2)*gprimd(2,2)+kpg(ig,3)*gprimd(2,3)
     991                 :           0 :      kpgc3=kpg(ig,1)*gprimd(3,1)+kpg(ig,2)*gprimd(3,2)+kpg(ig,3)*gprimd(3,3)
     992                 :           0 :      kpgnorm(ig)=sqrt(kpgc1*kpgc1+kpgc2*kpgc2+kpgc3*kpgc3)
     993                 :             :    end do
     994                 :             :  end if
     995                 :             : 
     996   [ #  #  #  #  :           0 :  LIBPAW_ALLOCATE(glg,(npw))
             #  #  #  # ]
     997   [ #  #  #  #  :           0 :  LIBPAW_ALLOCATE(work,(npw))
             #  #  #  # ]
     998                 :             : 
     999                 :             : !Loop over types of atoms
    1000         [ #  # ]:           0 :  do itypat=1,ntypat
    1001                 :             : 
    1002                 :           0 :    mqgrid=pawtab(itypat)%mqgrid_shp
    1003   [ #  #  #  #  :           0 :    LIBPAW_ALLOCATE(qgrid,(mqgrid))
          #  #  #  #  #  
                #  #  # ]
    1004   [ #  #  #  #  :           0 :    LIBPAW_ALLOCATE(shpf,(mqgrid,2))
          #  #  #  #  #  
                #  #  # ]
    1005         [ #  # ]:           0 :    qgrid(1:mqgrid)=pawtab(itypat)%qgrid_shp(1:mqgrid)
    1006                 :             : 
    1007                 :             : !  Loops over (l,m) values
    1008         [ #  # ]:           0 :    do ll=0,pawtab(itypat)%lcut_size-1
    1009                 :           0 :      l0=ll**2+ll+1
    1010                 :             : 
    1011   [ #  #  #  # ]:           0 :      shpf(1:mqgrid,1:2)=pawtab(itypat)%shapefncg(1:mqgrid,1:2,1+ll)
    1012                 :           0 :      call paw_uniform_splfit(qgrid,work,shpf,0,kpgnorm,glg,mqgrid,npw)
    1013                 :             : 
    1014         [ #  # ]:           0 :      do mm=-ll,ll
    1015                 :           0 :        ilm=l0+mm
    1016                 :             : 
    1017         [ #  # ]:           0 :        gylmg(1:npw,ilm,itypat)=ylm(1:npw,ilm)*glg(1:npw)
    1018                 :             : 
    1019                 :             : !      End loops over (l,m) values
    1020                 :             :      end do
    1021                 :             :    end do
    1022                 :             : 
    1023                 :             : !  End loop over atom types
    1024         [ #  # ]:           0 :    LIBPAW_DEALLOCATE(qgrid)
    1025         [ #  # ]:           0 :    LIBPAW_DEALLOCATE(shpf)
    1026                 :             :  end do
    1027                 :             : 
    1028         [ #  # ]:           0 :  LIBPAW_DEALLOCATE(kpgnorm)
    1029         [ #  # ]:           0 :  LIBPAW_DEALLOCATE(glg)
    1030         [ #  # ]:           0 :  LIBPAW_DEALLOCATE(work)
    1031                 :             : 
    1032                 :           0 : end subroutine pawgylmg
    1033                 :             : !!***
    1034                 :             : 
    1035                 :             : !----------------------------------------------------------------------
    1036                 :             : 
    1037                 :             : !!****f* m_paw_finegrid/pawrfgd_fft
    1038                 :             : !! NAME
    1039                 :             : !! pawrfgd_fft
    1040                 :             : !!
    1041                 :             : !! FUNCTION
    1042                 :             : !! Determine each point of the (fine) rectangular grid
    1043                 :             : !! around a given atom and compute r-R vectors.
    1044                 :             : !! R is the position of the atom.
    1045                 :             : !!
    1046                 :             : !! INPUTS
    1047                 :             : !!  [fft_distrib(n3)]= (optional) index of processes which own fft planes in 3rd dimension
    1048                 :             : !!  [fft_index(n3)]= (optional) local fft indexes for current process
    1049                 :             : !!  gmet(3,3)=reciprocal space metric tensor in bohr**-2
    1050                 :             : !!  [me_fft]= (optional) my rank in the FFT MPI communicator
    1051                 :             : !!  n1,n2,n3= sizes of the FFT grid (entire simulation cell)
    1052                 :             : !!  rcut= radius of the sphere around the atom
    1053                 :             : !!  rprimd(3,3)=dimensional primitive translations in real space (bohr)
    1054                 :             : !!  ucvol= unit cell volume
    1055                 :             : !!  xred(3)= reduced coordinates of the atom
    1056                 :             : !!
    1057                 :             : !! OUTPUT
    1058                 :             : !!  ifftsph(nfgd)= FFT index (fine grid) of the points in the sphere around current atom
    1059                 :             : !!  nfgd= number of points in the sphere around current atom
    1060                 :             : !!  rfgd(3,nfgd)= cartesian coordinates of r-R.
    1061                 :             : !!
    1062                 :             : !! SOURCE
    1063                 :             : 
    1064                 :        5025 : subroutine pawrfgd_fft(ifftsph,gmet,n1,n2,n3,nfgd,rcut,rfgd,rprimd,ucvol,xred, &
    1065                 :        5025 : &                      fft_distrib,fft_index,me_fft) ! optional arguments
    1066                 :             : 
    1067                 :             : !Arguments ---------------------------------------------
    1068                 :             : !scalars
    1069                 :             :  integer,intent(in) :: n1,n2,n3
    1070                 :             :  integer,intent(out) :: nfgd
    1071                 :             :  integer,optional,intent(in) :: me_fft
    1072                 :             :  real(dp),intent(in) :: rcut,ucvol
    1073                 :             : !arrays
    1074                 :             :  integer,target,optional,intent(in) :: fft_distrib(n3),fft_index(n3)
    1075                 :             :  integer,allocatable,intent(out) :: ifftsph(:)
    1076                 :             :  real(dp),intent(in) :: gmet(3,3),rprimd(3,3),xred(3)
    1077                 :             :  real(dp),allocatable,intent(out) :: rfgd(:,:)
    1078                 :             : 
    1079                 :             : !Local variables ------------------------------
    1080                 :             : !scalars
    1081                 :             :  integer :: i1,i2,i3,ifft_local,ix,iy,iz,izloc,me_fft_,n1a,n1b,n2a,n2b,n3a,n3b,ncmax
    1082                 :             :  real(dp) :: dif,difx,dify,difz,rr1,rr2,rr3,r2,r2cut,rx,ry,rz
    1083                 :             :  character(len=500) :: msg
    1084                 :             : !arrays
    1085                 :        5025 :  integer,allocatable :: ifftsph_tmp(:)
    1086                 :        5025 :  integer,pointer :: fft_distrib_(:),fft_index_(:)
    1087                 :        5025 :  real(dp),allocatable :: rfgd_tmp(:,:)
    1088                 :             : 
    1089                 :             : ! *************************************************************************
    1090                 :             : 
    1091                 :             : !Define a "box" around the atom
    1092                 :        5025 :  r2cut=1.0000001_dp*rcut**2
    1093                 :        5025 :  rr1=sqrt(r2cut*gmet(1,1))
    1094                 :        5025 :  rr2=sqrt(r2cut*gmet(2,2))
    1095                 :        5025 :  rr3=sqrt(r2cut*gmet(3,3))
    1096                 :             : 
    1097                 :             :  !Computing lower bounds of the box
    1098                 :             :  !If dif<0, int(dif*n) will give an integer above what we want, so we subtract one
    1099                 :        5025 :  dif=xred(1)-rr1
    1100                 :        5025 :  n1a=int(dif*n1)+1
    1101                 :        3364 :  if (dif<0) n1a = n1a-1
    1102                 :        5025 :  dif=xred(2)-rr2
    1103                 :        5025 :  n2a=int(dif*n2)+1
    1104         [ +  + ]:        5025 :  if (dif<0) n2a = n2a-1
    1105                 :        5025 :  dif=xred(3)-rr3
    1106                 :        5025 :  n3a=int(dif*n3)+1
    1107         [ +  + ]:        5025 :  if (dif<0) n3a = n3a-1
    1108                 :             : 
    1109                 :             :  !Computing upper bounds of the box
    1110                 :             :  !If dif>0, int(dif*n) will give an integer below what we want, so we add one
    1111                 :        5025 :  dif=xred(1)+rr1
    1112                 :        5025 :  n1b=int(dif*n1)+1
    1113         [ +  + ]:        5025 :  if (dif>0) n1b = n1b+1
    1114                 :        5025 :  dif=xred(2)+rr2
    1115                 :        5025 :  n2b=int(dif*n2)+1
    1116         [ +  + ]:        5025 :  if (dif>0) n2b = n2b+1
    1117                 :        5025 :  dif=xred(3)+rr3
    1118                 :        5025 :  n3b=int(dif*n3)+1
    1119         [ +  + ]:        5025 :  if (dif>0) n3b = n3b+1
    1120                 :             : 
    1121                 :             : !Get the distrib associated with this fft_grid
    1122   [ +  -  +  - ]:        5025 :  if (present(fft_distrib).and.present(fft_index).and.present(me_fft)) then
    1123                 :        5025 :    me_fft_=me_fft ; fft_distrib_ => fft_distrib ; fft_index_ => fft_index
    1124                 :             :  else
    1125                 :           0 :    me_fft_=0
    1126   [ #  #  #  #  :           0 :    LIBPAW_POINTER_ALLOCATE(fft_distrib_,(n3))
          #  #  #  #  #  
                #  #  # ]
    1127   [ #  #  #  #  :           0 :    LIBPAW_POINTER_ALLOCATE(fft_index_,(n3))
             #  #  #  # ]
    1128   [ #  #  #  #  :           0 :    fft_distrib_=0;fft_index_=(/(i3,i3=1,n3)/)
             #  #  #  # ]
    1129                 :             :  end if
    1130                 :             : 
    1131                 :             : !Temporary allocate "large" arrays
    1132                 :        5025 :  ncmax=1+int(1.5_dp*(n1*n2*n3)*four_pi/(three*ucvol)*rcut**3)
    1133   [ -  +  +  -  :       15075 :  LIBPAW_ALLOCATE(ifftsph_tmp,(ncmax))
          +  -  +  -  -  
                +  -  + ]
    1134   [ -  +  +  -  :       15075 :  LIBPAW_ALLOCATE(rfgd_tmp,(3,ncmax))
          +  -  +  -  -  
                +  -  + ]
    1135                 :             : 
    1136                 :             : !Set number of points to zero
    1137                 :        5025 :  nfgd=0
    1138                 :             : 
    1139                 :             : !Loop over FFT points
    1140         [ +  + ]:       87900 :  do i3=n3a,n3b
    1141                 :       82875 :    iz=modulo(i3,n3)
    1142   [ +  -  -  + ]:       82875 :    if (iz<0.or.iz>n3-1) then
    1143                 :           0 :      msg='iz<0 or iz>n3-1'
    1144                 :           0 :      LIBPAW_ERROR(msg)
    1145                 :             :    end if
    1146         [ +  + ]:       87900 :    if (fft_distrib_(iz+1)==me_fft_) then
    1147                 :       78097 :      izloc=fft_index_(iz+1) - 1
    1148   [ +  -  -  + ]:       78097 :      if (izloc<0.or.izloc>n3-1) then
    1149                 :           0 :        msg='izloc<0 or izloc>n3-1'
    1150                 :           0 :        LIBPAW_ERROR(msg)
    1151                 :             :      end if
    1152                 :       78097 :      difz=dble(i3)/dble(n3)-xred(3)
    1153         [ +  + ]:     1577567 :      do i2=n2a,n2b
    1154                 :     1499470 :        iy=modulo(i2,n2)
    1155   [ +  -  -  + ]:     1499470 :        if (iy<0.or.iy>n2-1) then
    1156                 :           0 :          msg='iy<0 or iy>n2-1'
    1157                 :           0 :          LIBPAW_ERROR(msg)
    1158                 :             :        end if
    1159                 :     1499470 :        dify=dble(i2)/dble(n2)-xred(2)
    1160         [ +  + ]:    35185480 :        do i1=n1a,n1b
    1161                 :    33607913 :          ix=modulo(i1,n1)
    1162   [ +  -  -  + ]:    33607913 :          if (ix<0.or.ix>n1-1) then
    1163                 :           0 :            msg='ix<0 or ix>n1-1'
    1164                 :           0 :            LIBPAW_ERROR(msg)
    1165                 :             :          end if
    1166                 :    33607913 :          difx=dble(i1)/dble(n1)-xred(1)
    1167                 :             : 
    1168                 :             : !        Compute r-R
    1169                 :    33607913 :          rx=difx*rprimd(1,1)+dify*rprimd(1,2)+difz*rprimd(1,3)
    1170                 :    33607913 :          ry=difx*rprimd(2,1)+dify*rprimd(2,2)+difz*rprimd(2,3)
    1171                 :    33607913 :          rz=difx*rprimd(3,1)+dify*rprimd(3,2)+difz*rprimd(3,3)
    1172                 :    33607913 :          r2=rx**2+ry**2+rz**2
    1173                 :             : 
    1174                 :             : !        Select matching points
    1175         [ +  + ]:    35107383 :          if (r2 <= r2cut) then
    1176                 :    10258219 :            ifft_local=1+ix+n1*(iy+n2*izloc)
    1177   [ +  -  -  + ]:    10258219 :            if (ifft_local<1.or.ifft_local>n1*n2*n3) then
    1178                 :           0 :              msg='ifft_local<1 or ifft_local>n1*n2*n3'
    1179                 :           0 :              LIBPAW_ERROR(msg)
    1180                 :             :            end if
    1181         [ +  - ]:    10258219 :            if (ifft_local>0) then
    1182                 :    10258219 :              nfgd=nfgd+1
    1183         [ -  + ]:    10258219 :              if (nfgd>ncmax) then
    1184                 :           0 :                msg='Number of fft points around atom exceeds max. allowed!'
    1185                 :           0 :                LIBPAW_BUG(msg)
    1186                 :             :              end if
    1187                 :    10258219 :              rfgd_tmp(1,nfgd)=rx
    1188                 :    10258219 :              rfgd_tmp(2,nfgd)=ry
    1189                 :    10258219 :              rfgd_tmp(3,nfgd)=rz
    1190                 :    10258219 :              ifftsph_tmp(nfgd)=ifft_local
    1191                 :             :            end if
    1192                 :             :          end if
    1193                 :             : 
    1194                 :             : !      End of loops
    1195                 :             :        end do
    1196                 :             :      end do
    1197                 :             :    end if
    1198                 :             :  end do
    1199                 :             : 
    1200                 :             : !Now fill output arrays
    1201         [ -  + ]:        5025 :  if (allocated(ifftsph)) then
    1202                 :           0 :    LIBPAW_DEALLOCATE(ifftsph)
    1203                 :             :  end if
    1204         [ -  + ]:        5025 :  if (allocated(rfgd)) then
    1205                 :           0 :    LIBPAW_DEALLOCATE(rfgd)
    1206                 :             :  end if
    1207   [ +  +  +  -  :       15075 :  LIBPAW_ALLOCATE(ifftsph,(nfgd))
          +  -  +  +  -  
             +  -  +  -  
                      + ]
    1208   [ +  +  +  -  :       15075 :  LIBPAW_ALLOCATE(rfgd,(3,nfgd))
          +  -  +  +  -  
             +  -  +  -  
                      + ]
    1209         [ +  + ]:    10263244 :  ifftsph(1:nfgd)=ifftsph_tmp(1:nfgd)
    1210   [ +  +  +  + ]:    41037901 :  rfgd(1:3,1:nfgd)=rfgd_tmp(1:3,1:nfgd)
    1211                 :             : 
    1212                 :             : !Release temporary memory
    1213         [ -  + ]:        5025 :  LIBPAW_DEALLOCATE(ifftsph_tmp)
    1214         [ -  + ]:        5025 :  LIBPAW_DEALLOCATE(rfgd_tmp)
    1215         [ -  + ]:        5025 :  if (.not.present(fft_distrib).or..not.present(fft_index)) then
    1216         [ #  # ]:           0 :    LIBPAW_POINTER_DEALLOCATE(fft_distrib_)
    1217         [ #  # ]:           0 :    LIBPAW_POINTER_DEALLOCATE(fft_index_)
    1218                 :             :  end if
    1219                 :             : 
    1220         [ +  + ]:        5025 : end subroutine pawrfgd_fft
    1221                 :             : !!***
    1222                 :             : 
    1223                 :             : !----------------------------------------------------------------------
    1224                 :             : 
    1225                 :             : !!****f* m_paw_finegrid/pawrfgd_wvl
    1226                 :             : !! NAME
    1227                 :             : !! pawrfgd_wvl
    1228                 :             : !!
    1229                 :             : !! FUNCTION
    1230                 :             : !! Determine each point of the (fine) rectangular grid
    1231                 :             : !! around a given atom and compute r-R vectors.
    1232                 :             : !! R is the position of the atom.
    1233                 :             : !!
    1234                 :             : !! INPUTS
    1235                 :             : !!  geocode= code for geometry (boundary conditions)
    1236                 :             : !!  hh(3)=fine grid spacing
    1237                 :             : !!  i3s= TO BE COMPLETED
    1238                 :             : !!  n1,n2,n3= TO BE COMPLETED
    1239                 :             : !!  n1i,n2i,n3pi= TO BE COMPLETED
    1240                 :             : !!  rcut= radius of the sphere around the atom
    1241                 :             : !!  rloc= cut-off radius for local psp?
    1242                 :             : !!  shift= TO BE COMPLETED
    1243                 :             : !!  xred(3)= cartesian coordinates of the atom
    1244                 :             : !!
    1245                 :             : !! OUTPUT
    1246                 :             : !!  ifftsph(nfgd)= FFT index (fine grid) of the points in the sphere around current atom
    1247                 :             : !!  nfgd= number of points in the sphere around current atom
    1248                 :             : !!  rfgd(3,nfgd)= cartesian coordinates of r-R.
    1249                 :             : !!
    1250                 :             : !! SOURCE
    1251                 :             : 
    1252                 :           0 : subroutine pawrfgd_wvl(geocode,hh,ifftsph,i3s,n1,n1i,n2,n2i,n3,n3pi,&
    1253                 :             : &                      nfgd,rcut,rloc,rfgd,shift,xcart)
    1254                 :             : 
    1255                 :             : !Arguments ---------------------------------------------
    1256                 :             : !scalars
    1257                 :             :  integer,intent(in) :: i3s,n1,n1i,n2,n2i,n3,n3pi,shift
    1258                 :             :  integer,intent(out) :: nfgd
    1259                 :             :  real(dp),intent(in) :: rcut,rloc
    1260                 :             :  character(1),intent(in) :: geocode
    1261                 :             : !arrays
    1262                 :             :  integer,allocatable,intent(out) :: ifftsph(:)
    1263                 :             :  real(dp),intent(in) :: hh(3),xcart(3)
    1264                 :             :  real(dp),allocatable,intent(out) :: rfgd(:,:)
    1265                 :             : 
    1266                 :             : !Local variables ------------------------------
    1267                 :             : !scalars
    1268                 :             :  integer :: i1,i2,i3,iex,iey,iez,ind,isx,isy,isz,j1,j2,j3
    1269                 :             :  integer :: nbl1,nbr1,nbl2,nbr2,nbl3,nbr3,ncmax
    1270                 :             :  logical :: gox,goy,goz,perx,pery,perz
    1271                 :             :  real(dp) :: cutoff,r2,r2cut,rx,ry,rz,xx,yy,zz
    1272                 :             : !arrays
    1273                 :           0 :  integer,allocatable :: ifftsph_tmp(:)
    1274                 :           0 :  real(dp),allocatable :: rfgd_tmp(:,:)
    1275                 :             : 
    1276                 :             : ! *************************************************************************
    1277                 :             : 
    1278                 :             : !Data for periodicity in the three directions
    1279                 :           0 :  perx=(geocode/='F')
    1280                 :           0 :  pery=(geocode=='P')
    1281                 :           0 :  perz=(geocode/='F')
    1282                 :           0 :  call my_ext_buffers(perx,nbl1,nbr1)
    1283                 :           0 :  call my_ext_buffers(pery,nbl2,nbr2)
    1284                 :           0 :  call my_ext_buffers(perz,nbl3,nbr3)
    1285                 :             : 
    1286                 :             : !Define a "box" around the atom
    1287                 :           0 :  cutoff=10.d0*rloc
    1288                 :           0 :  r2cut=1.0000001_dp*rcut**2
    1289                 :           0 :  rx=xcart(1)
    1290                 :           0 :  ry=xcart(2)
    1291                 :           0 :  rz=xcart(3)
    1292                 :           0 :  isx=floor((rx-cutoff)/hh(1))
    1293         [ #  # ]:           0 :  isy=floor((ry-cutoff)/hh(2))
    1294         [ #  # ]:           0 :  isz=floor((rz-cutoff)/hh(3))
    1295         [ #  # ]:           0 :  iex=ceiling((rx+cutoff)/hh(1))
    1296         [ #  # ]:           0 :  iey=ceiling((ry+cutoff)/hh(2))
    1297         [ #  # ]:           0 :  iez=ceiling((rz+cutoff)/hh(3))
    1298                 :             : 
    1299                 :             : !Temporary allocate "large" arrays
    1300                 :             : !  use factor 1+int(1.1*, for safety reasons
    1301                 :           0 :  ncmax=1
    1302         [ #  # ]:           0 :  if (n3pi>0) ncmax=1+int((rcut/hh(1)+1.0)*(rcut/hh(2)+1.0)*(rcut/hh(3)+1.0)*four_pi/three)
    1303   [ #  #  #  #  :           0 :  LIBPAW_ALLOCATE(ifftsph_tmp,(ncmax))
          #  #  #  #  #  
                #  #  # ]
    1304   [ #  #  #  #  :           0 :  LIBPAW_ALLOCATE(rfgd_tmp,(3,ncmax))
          #  #  #  #  #  
                #  #  # ]
    1305                 :             : 
    1306                 :             : !Set number of points to zero
    1307                 :           0 :  nfgd=0
    1308                 :             : 
    1309                 :             : !Loop over WVL points
    1310         [ #  # ]:           0 :  do i3=isz,iez
    1311                 :           0 :    zz=real(i3,kind=8)*hh(3)-rz
    1312                 :           0 :    call my_ind_positions(perz,i3,n3,j3,goz)
    1313                 :           0 :    j3=j3+nbl3+1
    1314         [ #  # ]:           0 :    do i2=isy,iey
    1315                 :           0 :      yy=real(i2,kind=8)*hh(2)-ry
    1316                 :           0 :      call my_ind_positions(pery,i2,n2,j2,goy)
    1317         [ #  # ]:           0 :      do i1=isx,iex
    1318                 :           0 :        xx=real(i1,kind=8)*hh(1)-rx
    1319                 :           0 :        call my_ind_positions(perx,i1,n1,j1,gox)
    1320                 :           0 :        r2=xx**2+yy**2+zz**2
    1321   [ #  #  #  #  :           0 :        if (j3>=i3s.and.j3<=i3s+n3pi-1.and.goy.and.gox) then
             #  #  #  # ]
    1322                 :             : 
    1323                 :             : !        Select matching points
    1324         [ #  # ]:           0 :          if (r2<=r2cut) then
    1325                 :           0 :            ind=j1+1+nbl1+(j2+nbl2)*n1i+(j3-i3s)*n1i*n2i
    1326                 :           0 :            nfgd=nfgd+1
    1327         [ #  # ]:           0 :            rfgd_tmp(:,nfgd)=[xx,yy,zz]
    1328                 :           0 :            ifftsph_tmp(nfgd)=shift+ind
    1329                 :             :          end if
    1330                 :             : 
    1331                 :             : !      End of loops
    1332                 :             :        end if
    1333                 :             :      end do
    1334                 :             :    end do
    1335                 :             :  end do
    1336                 :             : 
    1337                 :             : !Now fill output arrays
    1338         [ #  # ]:           0 :  if (allocated(ifftsph)) then
    1339                 :           0 :    LIBPAW_DEALLOCATE(ifftsph)
    1340                 :             :  end if
    1341         [ #  # ]:           0 :  if (allocated(rfgd)) then
    1342                 :           0 :    LIBPAW_DEALLOCATE(rfgd)
    1343                 :             :  end if
    1344   [ #  #  #  #  :           0 :  LIBPAW_ALLOCATE(ifftsph,(nfgd))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    1345   [ #  #  #  #  :           0 :  LIBPAW_ALLOCATE(rfgd,(3,nfgd))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    1346         [ #  # ]:           0 :  ifftsph(1:nfgd)=ifftsph_tmp(1:nfgd)
    1347   [ #  #  #  # ]:           0 :  rfgd(1:3,1:nfgd)=rfgd_tmp(1:3,1:nfgd)
    1348                 :             : 
    1349                 :             : !Release temporary memory
    1350         [ #  # ]:           0 :  LIBPAW_DEALLOCATE(ifftsph_tmp)
    1351         [ #  # ]:           0 :  LIBPAW_DEALLOCATE(rfgd_tmp)
    1352                 :             : 
    1353                 :             : !*********************************************************************
    1354                 :             : !Small functions related to boundary conditions
    1355                 :             :  contains
    1356                 :             : !!***
    1357                 :             : ! ------------------------------------------------
    1358                 :             : !!****f* m_paw_finegrid/my_ind_positions
    1359                 :           0 :    subroutine my_ind_positions(periodic,i,n,j,go)
    1360                 :             : 
    1361                 :             :      integer,intent(in) :: i,n
    1362                 :             :      logical,intent(in) :: periodic
    1363                 :             :      integer,intent(out) :: j
    1364                 :             :      logical,intent(out) :: go
    1365         [ #  # ]:           0 :      if (periodic) then
    1366                 :           0 :        j=modulo(i,2*n+2) ; go=.true.
    1367                 :             :      else
    1368   [ #  #  #  # ]:           0 :        j=i ; go=(i>=-14.and.i<=2*n+16)
    1369                 :             :      end if
    1370                 :           0 :    end subroutine my_ind_positions
    1371                 :             : !!***
    1372                 :             : ! ------------------------------------------------
    1373                 :             : !!****f* m_paw_finegrid/my_ext_buffers
    1374                 :           0 :    subroutine my_ext_buffers(periodic,nl,nr)
    1375                 :             : 
    1376                 :             :      logical, intent(in) :: periodic
    1377                 :             :      integer, intent(out) :: nl,nr
    1378         [ #  # ]:           0 :      if (periodic) then
    1379   [ #  #  #  # ]:           0 :        nl=0 ; nr=0
    1380                 :             :      else
    1381                 :           0 :        nl=14 ; nr=15
    1382                 :             :      end if
    1383                 :             :    end subroutine my_ext_buffers
    1384                 :             : ! ------------------------------------------------
    1385                 :             : 
    1386                 :             : end subroutine pawrfgd_wvl
    1387                 :             : !!***
    1388                 :             : 
    1389                 :             : !----------------------------------------------------------------------
    1390                 :             : 
    1391                 :             : !!****f* m_paw_finegrid/pawexpiqr
    1392                 :             : !! NAME
    1393                 :             : !! pawexpiqr
    1394                 :             : !!
    1395                 :             : !! FUNCTION
    1396                 :             : !! Compute exp(i.q.r) for each point of the (fine) rectangular grid
    1397                 :             : !! around a given atomic site. R is the position of the atom.
    1398                 :             : !! Used for the determination of phonons at non-zero q wavevector.
    1399                 :             : !!
    1400                 :             : !! INPUTS
    1401                 :             : !!  gprimd(3,3)= dimensional primitive translations for reciprocal space
    1402                 :             : !!  nfgd= number of (fine grid) FFT points in the paw sphere around current atom
    1403                 :             : !!  qphon(3)= wavevector of the phonon
    1404                 :             : !!  rfgd(3,nfgd)= coordinates of r-R on the fine grid around current atom
    1405                 :             : !!  xred(3)= reduced atomic coordinates
    1406                 :             : !!
    1407                 :             : !! OUTPUT
    1408                 :             : !!  expiqr(2,nfgd)= exp(i.q.r) around the current atom
    1409                 :             : !!                                 Not allocated if q=0 !
    1410                 :             : !!
    1411                 :             : !! SOURCE
    1412                 :             : 
    1413         [ -  + ]:       31310 : subroutine pawexpiqr(expiqr,gprimd,nfgd,qphon,rfgd,xred)
    1414                 :             : 
    1415                 :             : !Arguments ---------------------------------------------
    1416                 :             : !scalars
    1417                 :             :  integer,intent(in) :: nfgd
    1418                 :             : !arrays
    1419                 :             :  real(dp),intent(in) :: gprimd(3,3),qphon(3),xred(3)
    1420                 :             :  real(dp),intent(in) :: rfgd(:,:)
    1421                 :             :  real(dp),intent(out) :: expiqr(2,nfgd)
    1422                 :             : 
    1423                 :             : !Local variables ------------------------------
    1424                 :             : !scalars
    1425                 :             :  integer :: ic
    1426                 :             :  logical :: qne0
    1427                 :             :  real(dp) :: phase,phase_xred,qx,qy,qz
    1428                 :             :  character(len=500) :: msg
    1429                 :             : !arrays
    1430                 :             : 
    1431                 :             : ! *************************************************************************
    1432                 :             : 
    1433   [ +  +  -  + ]:       93930 :  if (size(rfgd)/=3*nfgd) then
    1434                 :           0 :    msg='rfgd array must be allocated!'
    1435                 :           0 :    LIBPAW_BUG(msg)
    1436                 :             :  end if
    1437                 :             : 
    1438                 :       31310 :  qne0=(qphon(1)**2+qphon(2)**2+qphon(3)**2>=1.d-15)
    1439                 :             : 
    1440                 :             : !Compute q in cartesian coordinates
    1441         [ +  - ]:       31310 :  if (qne0) then
    1442                 :       31310 :    qx=gprimd(1,1)*qphon(1)+gprimd(1,2)*qphon(2)+gprimd(1,3)*qphon(3)
    1443                 :       31310 :    qy=gprimd(2,1)*qphon(1)+gprimd(2,2)*qphon(2)+gprimd(2,3)*qphon(3)
    1444                 :       31310 :    qz=gprimd(3,1)*qphon(1)+gprimd(3,2)*qphon(2)+gprimd(3,3)*qphon(3)
    1445                 :       31310 :    phase_xred=two_pi*(qphon(1)*xred(1)+qphon(2)*xred(2)+qphon(3)*xred(3))
    1446                 :             :  end if
    1447                 :             : 
    1448                 :             : !Compute exp(i.q.r)
    1449                 :             :  if (qne0) then
    1450         [ +  + ]:    24069430 :    do ic=1,nfgd
    1451                 :    24038120 :      phase=two_pi*(qx*rfgd(1,ic)+qy*rfgd(2,ic)+qz*rfgd(3,ic)) + phase_xred
    1452                 :    24038120 :      expiqr(1,ic)=cos(phase)
    1453                 :    24069430 :      expiqr(2,ic)=sin(phase)
    1454                 :             :    end do
    1455                 :             :  end if
    1456                 :             : 
    1457                 :       31310 : end subroutine pawexpiqr
    1458                 :             : !!***
    1459                 :             : 
    1460                 :             : !----------------------------------------------------------------------
    1461                 :             : 
    1462                 :             : END MODULE m_paw_finegrid
    1463                 :             : !!***
        

Generated by: LCOV version 2.3-1