LCOV - code coverage report
Current view: top level - src/65_paw - m_paw_dfptnl.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 65.7 % 268 176
Test Date: 2026-09-21 22:40:37 Functions: 100.0 % 3 3

            Line data    Source code
       1              : !!****m* ABINIT/m_paw_dfptnl
       2              : !! NAME
       3              : !!  m_paw_dfptnl
       4              : !!
       5              : !! FUNCTION
       6              : !!  This module contains several routines used to compute PAW contributions to a 3rd-order energy
       7              : !!   or 2nd-order PAW occupancies.
       8              : !!
       9              : !! COPYRIGHT
      10              : !! Copyright (C) 2018-2026 ABINIT group (LB)
      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              : !! SOURCE
      16              : 
      17              : #if defined HAVE_CONFIG_H
      18              : #include "config.h"
      19              : #endif
      20              : 
      21              : #include "abi_common.h"
      22              : 
      23              : MODULE m_paw_dfptnl
      24              : 
      25              :  use defs_basis
      26              :  use m_abicore
      27              :  use m_errors
      28              :  use m_xmpi
      29              : 
      30              :  use m_pawang,     only : pawang_type
      31              :  use m_pawrad,     only : pawrad_type,simp_gen
      32              :  use m_pawtab,     only : pawtab_type
      33              :  use m_paw_an,     only : paw_an_type
      34              :  use m_pawrhoij,   only : pawrhoij_type
      35              :  use m_pawcprj,    only : pawcprj_type
      36              :  use m_paw_denpot, only : pawdensities
      37              :  use m_paral_atom, only : get_my_atmtab, free_my_atmtab
      38              : 
      39              :  implicit none
      40              : 
      41              :  private
      42              : 
      43              : !public procedures.
      44              :  public :: paw_dfptnl_energy   ! Compute the XC PAW on-site contributions to a 3rd-order energy
      45              :  public :: paw_dfptnl_xc       ! Compute a contribution of the 3rd-derivative of XC energy of ONE PAW sphere
      46              :  public :: paw_dfptnl_accrhoij ! Accumulate the 2nd order PAW quantities rhoij^(2)
      47              : 
      48              : CONTAINS  !========================================================================================
      49              : !!***
      50              : 
      51              : !----------------------------------------------------------------------
      52              : 
      53              : !!****f* m_paw_dfptnl/paw_dfptnl_energy
      54              : !! NAME
      55              : !! paw_dfptnl_energy
      56              : !!
      57              : !! FUNCTION
      58              : !! Compute the XC PAW on-site contributions to a 3rd-order energy.
      59              : !! It is equal to:
      60              : !!    E_onsite= \sum_at [ E_at(kxc,rho1,rho2,rho3) - E_at(tkxc,trho1,trho2,trho3) ]
      61              : !! where E_at(...) is computed in paw_dfptnl_xc.F90.
      62              : !! The atomic densities are computed from pawrhoij1,pawrhoij2 and pawrhoij3.
      63              : !! This routine is similar to pawdfptenergy.F90 but is implemented independently
      64              : !! in order to not overload the original routine.
      65              : !! LDA ONLY - USE THE DENSITY OVER A WHOLE SPHERICAL GRID (r,theta,phi)
      66              : !!
      67              : !! INPUTS
      68              : !!  ixc= choice of exchange-correlation scheme
      69              : !!  mpi_atmtab(:)=--optional-- indexes of the atoms treated by current proc
      70              : !!  comm_atom=--optional-- MPI communicator over atoms
      71              : !!  my_natom=number of atoms treated by current processor
      72              : !!  natom=total number of atoms in cell
      73              : !!  ntypat=number of types of atoms in unit cell.
      74              : !!  paw_an0(natom) <type(paw_an_type)>=paw arrays for 0th-order quantities given on angular mesh
      75              : !!  paw_an1(natom) <type(paw_an_type)>=paw arrays for 1st-order quantities given on angular mesh
      76              : !!                                     This corresponds to (j1) perturbation
      77              : !!  pawang <type(pawang_type)>=paw angular mesh and related data
      78              : !!  pawprtvol=control print volume and debugging output for PAW
      79              : !!  pawrad(ntypat) <type(pawrad_type)>=paw radial mesh and related data
      80              : !!  pawrhoij_1-2-3(natom) <type(pawrhoij_type)>= paw rhoij 1st-order occupancies
      81              : !!  pawtab(ntypat) <type(pawtab_type)>=paw tabulated starting data
      82              : !!  pawxcdev=Choice of XC development (0=no dev. (use of angular mesh) ; 1 or 2=dev. on moments)
      83              : !!
      84              : !! OUTPUT
      85              : !!  d3exc= real and imaginary parts of the contribution to the third derivative of the total energy
      86              : !!
      87              : !! SIDE EFFECTS
      88              : !!
      89              : !! SOURCE
      90              : 
      91          246 : subroutine paw_dfptnl_energy(d3exc,ixc,my_natom,natom,ntypat,&
      92          246 : &                    paw_an0,pawang,pawprtvol,pawrad,&
      93          246 : &                    pawrhoij_1,pawrhoij_2,pawrhoij_3,&
      94          246 : &                    pawtab,pawxcdev,&
      95          246 : &                    mpi_atmtab,comm_atom) ! optional arguments (parallelism)
      96              : 
      97              : !Arguments ---------------------------------------------
      98              : !scalars
      99              :  integer,intent(in) :: ixc,my_natom,natom,ntypat
     100              :  integer,intent(in) :: pawprtvol,pawxcdev
     101              :  integer,optional,intent(in) :: comm_atom
     102              :  type(pawang_type),intent(in) :: pawang
     103              : !arrays
     104              :  integer,optional,target,intent(in) :: mpi_atmtab(:)
     105              :  real(dp),intent(out) :: d3exc(2)
     106              :  type(paw_an_type),intent(in) :: paw_an0(my_natom)
     107              :  type(pawrad_type),intent(in) :: pawrad(ntypat)
     108              :  type(pawrhoij_type),intent(in) :: pawrhoij_1(my_natom)
     109              :  type(pawrhoij_type),intent(in) :: pawrhoij_2(my_natom)
     110              :  type(pawrhoij_type),intent(in) :: pawrhoij_3(my_natom)
     111              :  type(pawtab_type),intent(in) :: pawtab(ntypat)
     112              : 
     113              : !Local variables ---------------------------------------
     114              : !scalars
     115              :  integer :: cplex_1,cplex_2,cplex_3,iatom,iatom_tot,itypat
     116              :  integer :: lm_size_all,mesh_size,my_comm_atom,npts,nspden,nzlmopt
     117              :  integer :: opt_compch,usecore,usetcore,usexcnhat
     118              :  logical :: my_atmtab_allocated,paral_atom
     119              :  real(dp) :: compch,d3exc1_iat(2)
     120              :  character(len=500) :: msg
     121              : !arrays
     122          246 :  integer,pointer :: my_atmtab(:)
     123          246 :  logical,allocatable :: lmselect_1(:),lmselect_2(:),lmselect_3(:),lmselect_tmp(:)
     124          246 :  real(dp),allocatable :: nhat1_1(:,:,:),rho1_1(:,:,:),trho1_1(:,:,:)
     125          246 :  real(dp),allocatable :: nhat1_2(:,:,:),rho1_2(:,:,:),trho1_2(:,:,:)
     126          246 :  real(dp),allocatable :: nhat1_3(:,:,:),rho1_3(:,:,:),trho1_3(:,:,:)
     127              : 
     128              : ! *************************************************************************
     129              : 
     130              :  DBG_ENTER("COLL")
     131              : 
     132          246 :  nzlmopt = 0 ! compute all LM-moments of the density and use all LM-moments
     133              : 
     134          246 :  if (pawxcdev/=0) then
     135            0 :    msg="paw_dfptnl_energy is not implemented for pawxcdev/=0"
     136            0 :    ABI_BUG(msg)
     137              :  end if
     138          246 :  if (my_natom>0) then
     139          246 :    if (pawrhoij_1(1)%qphase/=1.or.pawrhoij_2(1)%qphase/=1.or.pawrhoij_3(1)%qphase/=1) then
     140            0 :      msg="paw_dfptnl_energy not supposed to be called with q/=0!"
     141            0 :      ABI_BUG(msg)
     142              :    end if
     143              :  end if
     144              : 
     145              : !Set up parallelism over atoms
     146          246 :  paral_atom=(present(comm_atom).and.(my_natom/=natom))
     147          246 :  nullify(my_atmtab);if (present(mpi_atmtab)) my_atmtab => mpi_atmtab
     148          246 :  my_comm_atom=xmpi_comm_self;if (present(comm_atom)) my_comm_atom=comm_atom
     149          246 :  call get_my_atmtab(my_comm_atom,my_atmtab,my_atmtab_allocated,paral_atom,natom,my_natom_ref=my_natom)
     150              : 
     151              : !!Various inits
     152          246 :  opt_compch=0; !optvxc=1;optexc=3
     153          246 :  usecore=0;usetcore=0  ! This is true for phonons and Efield pert.
     154          738 :  usexcnhat=maxval(pawtab(1:ntypat)%usexcnhat)
     155              : 
     156          246 :  npts=pawang%angl_size
     157              : 
     158          246 :  d3exc = zero
     159              : 
     160              : !================ Loop on atomic sites =======================
     161          738 :  do iatom=1,my_natom
     162          492 :    iatom_tot=iatom;if (paral_atom) iatom_tot=my_atmtab(iatom)
     163              : 
     164          492 :    itypat=pawrhoij_1(iatom)%itypat
     165          492 :    mesh_size=pawtab(itypat)%mesh_size
     166          492 :    nspden=pawrhoij_1(iatom)%nspden
     167          492 :    cplex_1=pawrhoij_1(iatom)%cplex_rhoij
     168          492 :    cplex_2=pawrhoij_2(iatom)%cplex_rhoij
     169          492 :    cplex_3=pawrhoij_3(iatom)%cplex_rhoij
     170          492 :    lm_size_all=paw_an0(iatom)%lm_size
     171              : 
     172         1476 :    ABI_MALLOC(lmselect_tmp,(lm_size_all))
     173         4920 :    lmselect_tmp(:)=.true.
     174              : 
     175              : !  Compute on-site 1st-order densities (pert1)
     176          984 :    ABI_MALLOC(lmselect_1,(lm_size_all))
     177         4920 :    lmselect_1(:)=paw_an0(iatom)%lmselect(:)
     178         2460 :    ABI_MALLOC(rho1_1,(cplex_1*mesh_size,lm_size_all,nspden))
     179         1968 :    ABI_MALLOC(trho1_1,(cplex_1*mesh_size,lm_size_all,nspden))
     180         2460 :    ABI_MALLOC(nhat1_1,(cplex_1*mesh_size,lm_size_all,nspden*usexcnhat))
     181              :    call pawdensities(compch,cplex_1,iatom_tot,lmselect_tmp,lmselect_1,&
     182              : &   lm_size_all,nhat1_1,nspden,nzlmopt,opt_compch,1-usexcnhat,-1,0,pawang,pawprtvol,&
     183          492 : &   pawrad(itypat),pawrhoij_1(iatom),pawtab(itypat),rho1_1,trho1_1)
     184              : !  Compute on-site 1st-order densities (pert2)
     185          984 :    ABI_MALLOC(lmselect_2,(lm_size_all))
     186         4920 :    lmselect_2(:)=paw_an0(iatom)%lmselect(:)
     187         2460 :    ABI_MALLOC(rho1_2,(cplex_2*mesh_size,lm_size_all,nspden))
     188         1968 :    ABI_MALLOC(trho1_2,(cplex_2*mesh_size,lm_size_all,nspden))
     189         2460 :    ABI_MALLOC(nhat1_2,(cplex_2*mesh_size,lm_size_all,nspden*usexcnhat))
     190              :    call pawdensities(compch,cplex_2,iatom_tot,lmselect_tmp,lmselect_2,&
     191              : &   lm_size_all,nhat1_2,nspden,nzlmopt,opt_compch,1-usexcnhat,-1,0,pawang,pawprtvol,&
     192          492 : &   pawrad(itypat),pawrhoij_2(iatom),pawtab(itypat),rho1_2,trho1_2)
     193              : !  Compute on-site 1st-order densities (pert3)
     194          984 :    ABI_MALLOC(lmselect_3,(lm_size_all))
     195         4920 :    lmselect_3(:)=paw_an0(iatom)%lmselect(:)
     196         2460 :    ABI_MALLOC(rho1_3,(cplex_3*mesh_size,lm_size_all,nspden))
     197         1968 :    ABI_MALLOC(trho1_3,(cplex_3*mesh_size,lm_size_all,nspden))
     198         2460 :    ABI_MALLOC(nhat1_3,(cplex_3*mesh_size,lm_size_all,nspden*usexcnhat))
     199              :    call pawdensities(compch,cplex_3,iatom_tot,lmselect_tmp,lmselect_3,&
     200              : &   lm_size_all,nhat1_3,nspden,nzlmopt,opt_compch,1-usexcnhat,-1,0,pawang,pawprtvol,&
     201          492 : &   pawrad(itypat),pawrhoij_3(iatom),pawtab(itypat),rho1_3,trho1_3)
     202          492 :    ABI_FREE(lmselect_tmp)
     203              : 
     204              :    call paw_dfptnl_xc(cplex_1,cplex_2,cplex_3,d3exc1_iat,ixc,paw_an0(iatom)%k3xc1,lm_size_all,&
     205              : &   lmselect_1,lmselect_2,lmselect_3,nhat1_1,nhat1_2,nhat1_3,&
     206              : &   paw_an0(iatom)%nk3xc1,mesh_size,nspden,pawang,pawrad(itypat),&
     207          492 : &   rho1_1,rho1_2,rho1_3,0)
     208         1476 :    d3exc = d3exc + d3exc1_iat
     209              : 
     210              :    call paw_dfptnl_xc(cplex_1,cplex_2,cplex_3,d3exc1_iat,ixc,paw_an0(iatom)%k3xct1,lm_size_all,&
     211              : &   lmselect_1,lmselect_2,lmselect_3,nhat1_1,nhat1_2,nhat1_3,&
     212              : &   paw_an0(iatom)%nk3xc1,mesh_size,nspden,pawang,pawrad(itypat),&
     213          492 : &   trho1_1,trho1_2,trho1_3,usexcnhat)
     214         1476 :    d3exc = d3exc - d3exc1_iat
     215              : 
     216          492 :    ABI_FREE(lmselect_1)
     217          492 :    ABI_FREE(lmselect_2)
     218          492 :    ABI_FREE(lmselect_3)
     219          492 :    ABI_FREE(nhat1_1)
     220          492 :    ABI_FREE(nhat1_2)
     221          492 :    ABI_FREE(nhat1_3)
     222          492 :    ABI_FREE(rho1_1)
     223          492 :    ABI_FREE(rho1_2)
     224          492 :    ABI_FREE(rho1_3)
     225          492 :    ABI_FREE(trho1_1)
     226          492 :    ABI_FREE(trho1_2)
     227          738 :    ABI_FREE(trho1_3)
     228              : 
     229              : !  ================ End loop oon atomic sites =======================
     230              :  end do
     231              : 
     232              : !!Reduction in case of parallelism
     233              : ! if (paral_atom) then
     234              : !   call xmpi_sum(delta_energy,my_comm_atom,ierr)
     235              : ! end if
     236              : 
     237              : !!Destroy atom table used for parallelism
     238              : ! call free_my_atmtab(my_atmtab,my_atmtab_allocated)
     239              : 
     240              : ! call timab(567,2,tsec)
     241              : 
     242              :  DBG_EXIT("COLL")
     243              : 
     244          246 : end subroutine paw_dfptnl_energy
     245              : !!***
     246              : 
     247              : !----------------------------------------------------------------------
     248              : 
     249              : !!****f* m_paw_dfptnl/paw_dfptnl_xc
     250              : !! NAME
     251              : !! paw_dfptnl_xc
     252              : !!
     253              : !! FUNCTION
     254              : !! Compute a contribution of the third derivative of XC energy of ONE PAW sphere Om_a.
     255              : !! It is equal to:
     256              : !!   E_at(kxc,rho1,rho2,rho3) = Int_{Om_a} dr kxc(r) * rho1(r) * rho2(r) * rho3(r)
     257              : !! where kxc,rho1,rho2 and rho3 are inputs.
     258              : !! This routine is similar to m_pawxc.F90:pawxc_dfpt(...) but is implemented independently
     259              : !! in order to not overload the original routine.
     260              : !! LDA ONLY - USE THE DENSITY OVER A WHOLE SPHERICAL GRID (r,theta,phi)
     261              : !!
     262              : !! INPUTS
     263              : !!  cplex_1-2-3= if 1, 1st-order densities are REAL, if 2, COMPLEX
     264              : !!  d3exc1_iat=third-order derivative to compute
     265              : !!  ixc= choice of exchange-correlation scheme
     266              : !!  kxc(nrad,pawang%angl_size,nkxc)=GS xc kernel
     267              : !!  lm_size=size of density array rhor (see below)
     268              : !!  lmselect1-2-3(lm_size)=select the non-zero LM-moments of input density rhor1-2-3
     269              : !!  nhat1-2-3(cplex_den*nrad,lm_size,nspden)=first-order change of compensation density
     270              : !!                                        (total in 1st half and spin-up in 2nd half if nspden=2)
     271              : !!  nkxc=second dimension of the kxc array
     272              : !!  nrad=size of radial mesh for densities/potentials (might be different from pawrad%mesh_size)
     273              : !!  nspden=number of spin-density components
     274              : !!  option=0  compute both 2nd-order XC energy and 1st-order potential
     275              : !!         1  compute only 1st-order XC potential
     276              : !!         2  compute only 2nd-order XC energy, XC potential is temporary computed here
     277              : !!         3  compute only 2nd-order XC energy, XC potential is input in vxc1(:)
     278              : !!  pawang <type(pawang_type)>=paw angular mesh and related data
     279              : !!  pawrad <type(pawrad_type)>=paw radial mesh and related data
     280              : !!  rhor1-2-3(cplex_den*nrad,lm_size,nspden)=first-order change of density
     281              : !!  usexcnhat= 0 if compensation density does not have to be used
     282              : !!             1 if compensation density has to be used in d2Exc only
     283              : !!
     284              : !! OUTPUT
     285              : !!  d3exc1_iat = E_at(kxc,rho1,rho2,rho3) (see FUNCTION above)
     286              : !!
     287              : !! SIDE EFFECTS
     288              : !!
     289              : !! SOURCE
     290              : 
     291          984 : subroutine paw_dfptnl_xc(cplex_1,cplex_2,cplex_3,d3exc1_iat,ixc,kxc,lm_size,lmselect1,lmselect2,lmselect3,&
     292          984 : &                 nhat1,nhat2,nhat3,nkxc,nrad,nspden,pawang,pawrad,rhor1,rhor2,rhor3,usexcnhat)
     293              : 
     294              : !Arguments ------------------------------------
     295              : !scalars
     296              :  integer,intent(in) :: cplex_1,cplex_2,cplex_3,ixc,lm_size,nkxc,nrad,nspden,usexcnhat
     297              :  type(pawang_type),intent(in) :: pawang
     298              :  type(pawrad_type),intent(in) :: pawrad
     299              : !arrays
     300              :  logical,intent(in) :: lmselect1(lm_size),lmselect2(lm_size),lmselect3(lm_size)
     301              :  real(dp),intent(out) :: d3exc1_iat(2)
     302              :  real(dp),intent(in) :: kxc(nrad,pawang%angl_size,nkxc)
     303              :  real(dp),intent(in) :: nhat1(cplex_1*nrad,lm_size,nspden*((usexcnhat+1)/2))
     304              :  real(dp),intent(in) :: nhat2(cplex_2*nrad,lm_size,nspden*((usexcnhat+1)/2))
     305              :  real(dp),intent(in) :: nhat3(cplex_3*nrad,lm_size,nspden*((usexcnhat+1)/2))
     306              :  real(dp),intent(in) :: rhor1(cplex_1*nrad,lm_size,nspden)
     307              :  real(dp),intent(in) :: rhor2(cplex_2*nrad,lm_size,nspden)
     308              :  real(dp),intent(in) :: rhor3(cplex_3*nrad,lm_size,nspden)
     309              : 
     310              : !Local variables-------------------------------
     311              : !scalars
     312              :  integer :: ii,ilm,ipts,ispden,lm_size_eff,npts
     313              :  real(dp) :: d3exc1_int,rho1u,rho1d,rho2u,rho2d,rho3u,rho3d
     314              :  character(len=500) :: msg
     315              : !arrays
     316              : ! real(dp) :: tsec(2)
     317          984 :  real(dp),allocatable :: ff(:),rho1arr(:,:),rho2arr(:,:),rho3arr(:,:)
     318              : 
     319              : ! *************************************************************************
     320              : 
     321              : !----------------------------------------------------------------------
     322              : !----- Initializations
     323              : !----------------------------------------------------------------------
     324              : 
     325          984 :  npts=pawang%angl_size
     326          984 :  lm_size_eff=min(lm_size,pawang%ylm_size)
     327              : 
     328          984 :  d3exc1_iat(:) = zero
     329              : 
     330              : !Special case: no XC applied
     331          984 :  if (ixc==0) then
     332            0 :    msg='Note that no xc is applied (ixc=0). Returning'
     333            0 :    ABI_WARNING(msg)
     334              :    return
     335              :  end if
     336              : 
     337         3936 :  ABI_MALLOC(rho1arr,(cplex_1*nrad,nspden))
     338         3936 :  ABI_MALLOC(rho2arr,(cplex_2*nrad,nspden))
     339         3936 :  ABI_MALLOC(rho3arr,(cplex_3*nrad,nspden))
     340              : 
     341              : !Restriction : all cplex must be 1
     342          984 :  if (cplex_1/=1.or.cplex_2/=1.or.cplex_3/=1) then
     343            0 :    msg='All cplex must be one (for the moment...)'
     344            0 :    ABI_BUG(msg)
     345              :  end if
     346              : !Restriction : nspden must be 1
     347              : ! if (nkxc>1) then
     348              : !   msg='nkxc must be one (<=> nspden=1) (for the moment...)'
     349              : !   ABI_BUG(msg)
     350              : ! end if
     351              : 
     352         2952 :  ABI_MALLOC(ff,(nrad))
     353              : 
     354              : !!----------------------------------------------------------------------
     355              : !!----- Loop on the angular part and inits
     356              : !!----------------------------------------------------------------------
     357              : 
     358              : !Do loop on the angular part (theta,phi)
     359       154488 :  do ipts=1,npts
     360              : 
     361              : !  Copy the input 1st-order density for this (theta,phi) - PERT1
     362    366558192 :    rho1arr(:,:)=zero
     363       153504 :    if (usexcnhat==0) then
     364       451152 :      do ispden=1,nspden
     365      3129984 :        do ilm=1,lm_size_eff
     366      2678832 :          if (lmselect1(ilm)) rho1arr(:,ispden)=rho1arr(:,ispden) &
     367   3297939840 : &         +rhor1(:,ilm,ispden)*pawang%ylmr(ilm,ipts)
     368              :        end do
     369              :      end do
     370              :    else
     371            0 :      do ispden=1,nspden
     372            0 :        do ilm=1,lm_size_eff
     373            0 :          if (lmselect1(ilm)) rho1arr(:,ispden)=rho1arr(:,ispden) &
     374            0 : &         +(rhor1(:,ilm,ispden)+nhat1(:,ilm,ispden))*pawang%ylmr(ilm,ipts)
     375              :        end do
     376              :      end do
     377              :    end if
     378              : 
     379              : !  Copy the input 1st-order density for this (theta,phi) - PERT2
     380    366558192 :    rho2arr(:,:)=zero
     381       153504 :    if (usexcnhat==0) then
     382       451152 :      do ispden=1,nspden
     383      3129984 :        do ilm=1,lm_size_eff
     384      2678832 :          if (lmselect2(ilm)) rho2arr(:,ispden)=rho2arr(:,ispden) &
     385   3297939840 : &         +rhor2(:,ilm,ispden)*pawang%ylmr(ilm,ipts)
     386              :        end do
     387              :      end do
     388              :    else
     389            0 :      do ispden=1,nspden
     390            0 :        do ilm=1,lm_size_eff
     391            0 :          if (lmselect2(ilm)) rho2arr(:,ispden)=rho2arr(:,ispden) &
     392            0 : &         +(rhor2(:,ilm,ispden)+nhat2(:,ilm,ispden))*pawang%ylmr(ilm,ipts)
     393              :        end do
     394              :      end do
     395              :    end if
     396              : 
     397              : !  Copy the input 1st-order density for this (theta,phi) - PERT3
     398    366558192 :    rho3arr(:,:)=zero
     399       153504 :    if (usexcnhat==0) then
     400       451152 :      do ispden=1,nspden
     401      3129984 :        do ilm=1,lm_size_eff
     402      2678832 :          if (lmselect3(ilm)) rho3arr(:,ispden)=rho3arr(:,ispden) &
     403   3297939840 : &         +rhor3(:,ilm,ispden)*pawang%ylmr(ilm,ipts)
     404              :        end do
     405              :      end do
     406              :    else
     407            0 :      do ispden=1,nspden
     408            0 :        do ilm=1,lm_size_eff
     409            0 :          if (lmselect3(ilm)) rho3arr(:,ispden)=rho3arr(:,ispden) &
     410            0 : &         +(rhor3(:,ilm,ispden)+nhat3(:,ilm,ispden))*pawang%ylmr(ilm,ipts)
     411              :        end do
     412              :      end do
     413              :    end if
     414              : 
     415              : !  ----------------------------------------------------------------------
     416              : !  ----- Accumulate and store 3nd-order change of XC energy
     417              : !  ----------------------------------------------------------------------
     418              : 
     419       153504 :    if (cplex_1==1.and.cplex_2==1.and.cplex_3==1) then ! all cplex are 1 :
     420       153504 :      if (nspden==1) then
     421     11522160 :        ff(:)=kxc(:,ipts,1)*rho1arr(:,1)*rho2arr(:,1)*rho3arr(:,1)
     422       144144 :      else if (nspden==2) then
     423    177441264 :        do ii=1,nrad
     424    177297120 :          rho1u=rho1arr(ii,2)
     425    177297120 :          rho1d=rho1arr(ii,1)-rho1arr(ii,2)
     426    177297120 :          rho2u=rho2arr(ii,2)
     427    177297120 :          rho2d=rho2arr(ii,1)-rho2arr(ii,2)
     428    177297120 :          rho3u=rho3arr(ii,2)
     429    177297120 :          rho3d=rho3arr(ii,1)-rho3arr(ii,2)
     430              :          ff(ii)=&
     431              : !          uuu                                uud
     432              : &         kxc(ii,ipts,1)*rho1u*rho2u*rho3u + kxc(ii,ipts,2)*rho1u*rho2u*rho3d + &
     433              : !          udu                                udd
     434              : &         kxc(ii,ipts,2)*rho1u*rho2d*rho3u + kxc(ii,ipts,3)*rho1u*rho2d*rho3d + &
     435              : !          duu                                dud
     436              : &         kxc(ii,ipts,2)*rho1d*rho2u*rho3u + kxc(ii,ipts,3)*rho1d*rho2u*rho3d + &
     437              : !          ddu                                ddd
     438    177441264 : &         kxc(ii,ipts,3)*rho1d*rho2d*rho3u + kxc(ii,ipts,4)*rho1d*rho2d*rho3d
     439              :        end do
     440              :      end if
     441              :    end if
     442              : 
     443    188963424 :    ff(1:nrad)=ff(1:nrad)*pawrad%rad(1:nrad)**2
     444       153504 :    call simp_gen(d3exc1_int,ff,pawrad)
     445       154488 :    d3exc1_iat(1)=d3exc1_iat(1)+d3exc1_int*pawang%angwgth(ipts)
     446              : 
     447              : !  ----- End of the loop on npts (angular part)
     448              :  end do
     449              : 
     450         2952 :  d3exc1_iat = d3exc1_iat*four_pi
     451              : 
     452          984 :  ABI_FREE(ff)
     453          984 :  ABI_FREE(rho1arr)
     454          984 :  ABI_FREE(rho2arr)
     455          984 :  ABI_FREE(rho3arr)
     456              : 
     457              : end subroutine paw_dfptnl_xc
     458              : !!***
     459              : 
     460              : !----------------------------------------------------------------------
     461              : 
     462              : !!****f* ABINIT/paw_dfptnl_accrhoij
     463              : !!
     464              : !! NAME
     465              : !! paw_dfptnl_accrhoij
     466              : !!
     467              : !! FUNCTION
     468              : !! Accumulate the 2nd order PAW quantities rhoij^(2) (augmentation occupancies)
     469              : !! This routine is similar to pawaccrhoij.F90 but is implemented independently
     470              : !! in order to not overload the original routine.
     471              : !!
     472              : !! INPUTS
     473              : !!  atindx(natom)=index table for atoms (sorted-->random), inverse of atindx.
     474              : !!  cplex: if 1, WFs (or 1st-order WFs) are REAL, if 2, COMPLEX
     475              : !!  cwaveprj0_pert1(natom,nspinor) = wave function at given n,k projected with non-local projectors:
     476              : !!                                  cwaveprj0%cp    =<p_i|
     477              : !!                                  cwaveprj0%dcp(1)=<p_i^(pert1)|Cnk>
     478              : !!  cwaveprj0_pert2(natom,nspinor) = wave function at given n,k projected with non-local projectors:
     479              : !!                                  cwaveprj0%cp    =<p_i|Cnk>
     480              : !!                                  cwaveprj0%dcp(1)=<p_i^(pert1)|Cnk>
     481              : !!  cwaveprj1_pert12(natom,nspinor)= 1st order wave function at given n,k projected with non-local projectors:
     482              : !!                                  cwaveprj1%cp    =<p_i|Cnk^(pert1)>
     483              : !!                                  cwaveprj1%dcp(1)=<p_i^(pert2)|Cnk^(pert1)>
     484              : !!  cwaveprj1_pert21(natom,nspinor)= 1st order wave function at given n,k projected with non-local projectors:
     485              : !!                                  cwaveprj1%cp    =<p_i|Cnk^(pert2)>
     486              : !!                                  cwaveprj1%dcp(1)=<p_i^(pert1)|Cnk^(pert2)>
     487              : !!  ipert1=index of the first perturbation
     488              : !!  ipert2=index of the second perturbation
     489              : !!  isppol=index of current spin component
     490              : !!  mpi_atmtab(:)=--optional-- indexes of the atoms treated by current proc
     491              : !!  comm_atom=--optional-- MPI communicator over atoms
     492              : !!  my_natom=number of atoms treated by current processor
     493              : !!  natom=number of atoms in cell
     494              : !!  nspinor=number of spinorial components (on current proc)
     495              : !!  occ_k=occupation number for current band n,k
     496              : !!  wtk_k=weight assigned to current k-point
     497              : !!
     498              : !! SIDE EFFECTS
     499              : !!  pawrhoij(natom) <type(pawrhoij_type)>= 2-nd order paw rhoij occupancies and related data
     500              : !!  On output, has been updated with the contribution of current n,k
     501              : !!        pawrhoij(:)%rhoij_(lmn2_size,nspden) (non symetrized)
     502              : !!
     503              : !! SOURCE
     504              : 
     505        16128 :  subroutine paw_dfptnl_accrhoij(atindx,cplex,cwaveprj0_pert1,cwaveprj0_pert2,&
     506         8064 : &                       cwaveprj1_pert12,cwaveprj1_pert21,ipert1,ipert2,isppol,my_natom,natom,&
     507         8064 : &                       nspinor,occ_k,pawrhoij,wtk_k,&
     508         8064 : &                       comm_atom,mpi_atmtab ) ! optional (parallelism)
     509              : 
     510              : !Arguments ---------------------------------------------
     511              : !scalars
     512              :  integer,intent(in) :: cplex,ipert1,ipert2,isppol,my_natom,natom,nspinor
     513              :  integer,optional,intent(in) :: comm_atom
     514              :  real(dp),intent(in) :: occ_k,wtk_k
     515              : !arrays
     516              :  integer,intent(in) :: atindx(natom)
     517              :  integer,optional,target,intent(in) :: mpi_atmtab(:)
     518              :  type(pawcprj_type),intent(in) :: cwaveprj0_pert1(natom,nspinor),cwaveprj0_pert2(natom,nspinor)
     519              :  type(pawcprj_type),intent(in) :: cwaveprj1_pert12(natom,nspinor),cwaveprj1_pert21(natom,nspinor)
     520              :  type(pawrhoij_type),intent(inout) :: pawrhoij(my_natom)
     521              : 
     522              : !Local variables ---------------------------------------
     523              : !scalars
     524              :  integer :: cplex_rhoij,iatm,iatom,iatom1,ilmn,iplex,j0lmn,jlmn,klmn,klmn_im,klmn_re
     525              :  integer :: my_comm_atom,ncpgr
     526              :  logical :: compute_impart,compute_impart_cplex
     527              :  logical :: my_atmtab_allocated,paral_atom
     528              :  real(dp) :: ro11_im,ro11_re,weight
     529              :  character(len=500) :: message
     530              : !arrays
     531         8064 :  integer,pointer :: my_atmtab(:)
     532        16128 :  real(dp) :: cpi0(2,nspinor),d1cpi0(2,nspinor),d2cpi0(2,nspinor)
     533        16128 :  real(dp) :: cpj0(2,nspinor),d1cpj0(2,nspinor),d2cpj0(2,nspinor)
     534        16128 :  real(dp) :: cpi1(2,nspinor),d2cpi1(2,nspinor)
     535        16128 :  real(dp) :: cpj1(2,nspinor),d2cpj1(2,nspinor)
     536        16128 :  real(dp) :: cpi2(2,nspinor),d1cpi2(2,nspinor)
     537         8064 :  real(dp) :: cpj2(2,nspinor),d1cpj2(2,nspinor)
     538              : 
     539              : ! ***********************************************************************
     540              : 
     541              :  DBG_ENTER("COLL")
     542              : 
     543         8064 :  if (my_natom==0) return
     544              : 
     545         8064 :  ncpgr=1
     546         8064 :  if (ipert1<0.or.ipert1>natom+2.or.ipert2<0.or.ipert2>natom+2) then
     547            0 :    message = 'paw_dfptnl_accrhoij: Necessary conditions on ipert1 or ipert2: 0<=ipert<=natom+2'
     548            0 :    ABI_BUG(message)
     549              :  end if
     550         8064 :  if (pawrhoij(1)%qphase/=1) then
     551            0 :    message="paw_dfptnl_accrhoij not supposed to be called with q/=0!"
     552            0 :    ABI_BUG(message)
     553              :  end if
     554              : 
     555              : !Set up parallelism over atoms
     556         8064 :  paral_atom=(present(comm_atom).and.(my_natom/=natom))
     557         8064 :  nullify(my_atmtab);if (present(mpi_atmtab)) my_atmtab => mpi_atmtab
     558         8064 :  my_comm_atom=xmpi_comm_self;if (present(comm_atom)) my_comm_atom=comm_atom
     559              :  call get_my_atmtab(my_comm_atom,my_atmtab,my_atmtab_allocated,paral_atom,natom,&
     560         8064 : & my_natom_ref=my_natom)
     561              : 
     562         8064 :  weight=wtk_k*occ_k
     563         8064 :  if (pawrhoij(1)%nspden==2.and.pawrhoij(1)%nsppol==1.and.nspinor==1) weight=half*weight
     564              : 
     565              : !!  ==================================================================
     566              : !!  === Accumulate (n,k) contribution to partial 2nd-order rhoij   ===
     567              : !!  ==================================================================
     568              : 
     569         8064 :  compute_impart=(pawrhoij(1)%cplex_rhoij==2)
     570         8064 :  compute_impart_cplex=((pawrhoij(1)%cplex_rhoij==2).and.(cplex==2))
     571              : 
     572              : ! NOT USED FOR PAWRHO21! => only for PAWRHO2 (full second derivative)
     573              : !!Accumulate :   < Psi^(pert1) | p_i^(0) > < p_j^(0) | Psi^(pert2) >
     574              : !!             + < Psi^(pert2) | p_i^(0) > < p_j^(0) | Psi^(pert1) >
     575              : ! if (nspinor==1) then
     576              : !   do iatom=1,my_natom
     577              : !     iatom1=iatom;if (paral_atom) iatom1=my_atmtab(iatom)
     578              : !     iatm=atindx(iatom1)
     579              : !     cplex_rhoij=pawrhoij(iatom)%cplex_rhoij
     580              : !     do jlmn=1,pawrhoij(iatom)%lmn_size
     581              : !       j0lmn=jlmn*(jlmn-1)/2
     582              : !       cpj1(1:2,1)=cwaveprj1_pert12(iatm,1)%cp(1:2,jlmn)   ! < p_j^(0) | Psi^(pert1) >
     583              : !       cpj2(1:2,1)=cwaveprj1_pert21(iatm,1)%cp(1:2,jlmn)   ! < p_j^(0) | Psi^(pert2) >
     584              : !       do ilmn=1,jlmn
     585              : !         klmn=j0lmn+ilmn
     586              : !         klmn_re=cplex_rhoij*(klmn-1)+1
     587              : !         cpi1(1:2,1)=cwaveprj1_pert12(iatm,1)%cp(1:2,ilmn) ! < p_i^(0) | Psi^(pert1) >
     588              : !         cpi2(1:2,1)=cwaveprj1_pert21(iatm,1)%cp(1:2,ilmn) ! < p_i^(0) | Psi^(pert2) >
     589              : !         ro11_re=zero
     590              : !         do iplex=1,cplex
     591              : !           ro11_re=ro11_re+cpi1(iplex,1)*cpj2(iplex,1)+cpj1(iplex,1)*cpi2(iplex,1)
     592              : !         end do
     593              : !         pawrhoij(iatom)%rhoij_(klmn_re,isppol)=pawrhoij(iatom)%rhoij_(klmn_re,isppol)+weight*ro11_re
     594              : !         if (compute_impart_cplex) then
     595              : !           klmn_im=klmn_re+1
     596              : !           ro11_im=        cpi1(1,1)*cpj2(2,1)-cpi1(2,1)*cpj2(1,1)
     597              : !           ro11_im=ro11_im+cpj1(1,1)*cpi2(2,1)-cpj1(2,1)*cpi2(1,1)
     598              : !           pawrhoij(iatom)%rhoij_(klmn_im,isppol)=pawrhoij(iatom)%rhoij_(klmn_im,isppol)+weight*ro11_im
     599              : !         end if
     600              : !       end do
     601              : !     end do
     602              : !   end do
     603              : ! else ! nspinor=2
     604              : !   ABI_BUG("paw_dfptnl_accrhoij is not implemented for nspinor=2")
     605              : ! end if
     606              : 
     607              : !Accumulate :   < Psi^(pert1) | p_i^(pert2) > < p_j^(0)     | Psi^(0)     >
     608              : !             + < Psi^(pert1) | p_i^(0)     > < p_j^(pert2) | Psi^(0)     >
     609              : !             + < Psi^(0)     | p_i^(pert2) > < p_j^(0)     | Psi^(pert1) >
     610              : !             + < Psi^(0)     | p_i^(0)     > < p_j^(pert2) | Psi^(pert1) >
     611         8064 :  if (ipert2>0.and.ipert2<=natom) then
     612            0 :    if (nspinor==1) then
     613            0 :      do iatom=1,my_natom
     614            0 :        iatom1=iatom;if (paral_atom) iatom1=my_atmtab(iatom)
     615            0 :        iatm=atindx(iatom1)
     616            0 :        if (iatom/=ipert2) cycle ! To move atom "ipert2" does not change projectors of other atoms
     617            0 :        cplex_rhoij=pawrhoij(iatom)%cplex_rhoij
     618            0 :        do jlmn=1,pawrhoij(iatom)%lmn_size
     619            0 :          j0lmn=jlmn*(jlmn-1)/2
     620            0 :          cpj0(1:2,1)  =cwaveprj0_pert2 (iatm,1)% cp(1:2,  jlmn)   ! < p_j^(0)     | Psi^(0)     >
     621            0 :          d2cpj0(1:2,1)=cwaveprj0_pert2 (iatm,1)%dcp(1:2,1,jlmn)   ! < p_j^(pert2) | Psi^(0)     >
     622            0 :          cpj1(1:2,1)  =cwaveprj1_pert12(iatm,1)% cp(1:2,  jlmn)   ! < p_j^(0)     | Psi^(pert1) >
     623            0 :          d2cpj1(1:2,1)=cwaveprj1_pert12(iatm,1)%dcp(1:2,1,jlmn)   ! < p_j^(pert2) | Psi^(pert1) >
     624            0 :          do ilmn=1,jlmn
     625            0 :            klmn=j0lmn+ilmn
     626            0 :            klmn_re=cplex_rhoij*(klmn-1)+1
     627            0 :            cpi0(1:2,1)  =cwaveprj0_pert2 (iatm,1)% cp(1:2,  ilmn) ! < p_i^(0)     | Psi^(0)     >
     628            0 :            d2cpi0(1:2,1)=cwaveprj0_pert2 (iatm,1)%dcp(1:2,1,ilmn) ! < p_i^(pert2) | Psi^(0)     >
     629            0 :            cpi1(1:2,1)  =cwaveprj1_pert12(iatm,1)% cp(1:2,  ilmn) ! < p_i^(0)     | Psi^(pert1) >
     630            0 :            d2cpi1(1:2,1)=cwaveprj1_pert12(iatm,1)%dcp(1:2,1,ilmn) ! < p_i^(pert2) | Psi^(pert1) >
     631            0 :            ro11_re=zero
     632            0 :            do iplex=1,cplex
     633            0 :              ro11_re=ro11_re+d2cpi1(iplex,1)*  cpj0(iplex,1)
     634            0 :              ro11_re=ro11_re+  cpi1(iplex,1)*d2cpj0(iplex,1)
     635            0 :              ro11_re=ro11_re+d2cpi0(iplex,1)*  cpj1(iplex,1)
     636            0 :              ro11_re=ro11_re+  cpi0(iplex,1)*d2cpj1(iplex,1)
     637              :            end do
     638            0 :            pawrhoij(iatom)%rhoij_(klmn_re,isppol)=pawrhoij(iatom)%rhoij_(klmn_re,isppol)+weight*ro11_re
     639            0 :            if (compute_impart_cplex) then
     640            0 :              klmn_im=klmn_re+1
     641            0 :              ro11_im=        d2cpi1(1,1)*  cpj0(2,1)-d2cpi1(2,1)*  cpj0(1,1)
     642            0 :              ro11_im=ro11_im+  cpi1(1,1)*d2cpj0(2,1)-  cpi1(2,1)*d2cpj0(1,1)
     643            0 :              ro11_im=ro11_im+d2cpi0(1,1)*  cpj1(2,1)-d2cpi0(2,1)*  cpj1(1,1)
     644            0 :              ro11_im=ro11_im+  cpi0(1,1)*d2cpj1(2,1)-  cpi0(2,1)*d2cpj1(1,1)
     645            0 :              pawrhoij(iatom)%rhoij_(klmn_im,isppol)=pawrhoij(iatom)%rhoij_(klmn_im,isppol)+weight*ro11_im
     646              :            end if
     647              :          end do
     648              :        end do
     649              :      end do
     650              :    else ! nspinor=2
     651            0 :      ABI_BUG("paw_dfptnl_accrhoij is not implemented for nspinor=2")
     652              :    end if
     653              :  end if
     654              : 
     655              : !Accumulate : < Psi^(pert2) | p_i^(pert1) > < p_j^(0)     | Psi^(0)     >
     656              : !           + < Psi^(pert2) | p_i^(0)     > < p_j^(pert1) | Psi^(0)     >
     657              : !           + < Psi^(0)     | p_i^(pert1) > < p_j^(0)     | Psi^(pert2) >
     658              : !           + < Psi^(0)     | p_i^(0) >     < p_j^(pert1) | Psi^(pert2) >
     659         8064 :  if (ipert1>0.and.ipert1<=natom) then
     660         8064 :    if (nspinor==1) then
     661        24192 :      do iatom=1,my_natom
     662        16128 :        iatom1=iatom;if (paral_atom) iatom1=my_atmtab(iatom)
     663        16128 :        iatm=atindx(iatom1)
     664        16128 :        cplex_rhoij=pawrhoij(iatom)%cplex_rhoij
     665        16128 :        if (iatom/=ipert1) cycle ! To move atom "ipert1" does not change projectors of other atoms
     666        80640 :        do jlmn=1,pawrhoij(iatom)%lmn_size
     667        64512 :          j0lmn=jlmn*(jlmn-1)/2
     668       193536 :          cpj0(1:2,1)  =cwaveprj0_pert1 (iatm,1)% cp(1:2,  jlmn)   ! < p_j^(0)     | Psi^(0)     >
     669       193536 :          d1cpj0(1:2,1)=cwaveprj0_pert1 (iatm,1)%dcp(1:2,1,jlmn)   ! < p_j^(pert1) | Psi^(0)     >
     670       193536 :          cpj2(1:2,1)  =cwaveprj1_pert21(iatm,1)% cp(1:2,  jlmn)   ! < p_j^(0)     | Psi^(pert2) >
     671       193536 :          d1cpj2(1:2,1)=cwaveprj1_pert21(iatm,1)%dcp(1:2,1,jlmn)   ! < p_j^(pert1) | Psi^(pert2) >
     672       370944 :          do ilmn=1,jlmn
     673       290304 :            klmn=j0lmn+ilmn
     674       290304 :            klmn_re=cplex_rhoij*(klmn-1)+1
     675       870912 :            cpi0(1:2,1)  =cwaveprj0_pert1 (iatm,1)% cp(1:2,  ilmn) ! < p_i^(0)     | Psi^(0)     >
     676       870912 :            d1cpi0(1:2,1)=cwaveprj0_pert1 (iatm,1)%dcp(1:2,1,ilmn) ! < p_i^(pert1) | Psi^(0)     >
     677       870912 :            cpi2(1:2,1)  =cwaveprj1_pert21(iatm,1)% cp(1:2,  ilmn) ! < p_i^(0)     | Psi^(pert2) >
     678       870912 :            d1cpi2(1:2,1)=cwaveprj1_pert21(iatm,1)%dcp(1:2,1,ilmn) ! < p_i^(pert1) | Psi^(pert2) >
     679       290304 :            ro11_re=zero
     680       870912 :            do iplex=1,cplex
     681       580608 :              ro11_re=ro11_re+d1cpi2(iplex,1)*  cpj0(iplex,1)
     682       580608 :              ro11_re=ro11_re+  cpi2(iplex,1)*d1cpj0(iplex,1)
     683       580608 :              ro11_re=ro11_re+d1cpi0(iplex,1)*  cpj2(iplex,1)
     684       870912 :              ro11_re=ro11_re+  cpi0(iplex,1)*d1cpj2(iplex,1)
     685              :            end do
     686       290304 :            pawrhoij(iatom)%rhoij_(klmn_re,isppol)=pawrhoij(iatom)%rhoij_(klmn_re,isppol)+weight*ro11_re
     687       354816 :            if (compute_impart_cplex) then
     688            0 :              klmn_im=klmn_re+1
     689            0 :              ro11_im=        d1cpi2(1,1)*  cpj0(2,1)-d1cpi2(2,1)*  cpj0(1,1)
     690            0 :              ro11_im=ro11_im+  cpi2(1,1)*d1cpj0(2,1)-  cpi2(2,1)*d1cpj0(1,1)
     691            0 :              ro11_im=ro11_im+d1cpi0(1,1)*  cpj2(2,1)-d1cpi0(2,1)*  cpj2(1,1)
     692            0 :              ro11_im=ro11_im+  cpi0(1,1)*d1cpj2(2,1)-  cpi0(2,1)*d1cpj2(1,1)
     693            0 :              pawrhoij(iatom)%rhoij_(klmn_im,isppol)=pawrhoij(iatom)%rhoij_(klmn_im,isppol)+weight*ro11_im
     694              :            end if
     695              :          end do
     696              :        end do
     697              :      end do
     698              :    else ! nspinor=2
     699            0 :      message="paw_dfptnl_accrhoij is not implemented for nspinor=2!"
     700            0 :      ABI_BUG(message)
     701              :    end if
     702              :  end if
     703              : !  End
     704              : 
     705              : !Accumulate :   < Psi^(0) | p_i^(pert1) > < p_j^(pert2) | Psi^(0) >
     706              : !             + < Psi^(0) | p_i^(pert2) > < p_j^(pert1) | Psi^(0) >
     707         8064 :  if (ipert1>0.and.ipert1<=natom.and.ipert2>0.and.ipert2<=natom) then
     708            0 :    if (nspinor==1) then
     709            0 :      do iatom=1,my_natom
     710            0 :        iatom1=iatom;if (paral_atom) iatom1=my_atmtab(iatom)
     711            0 :        iatm=atindx(iatom1)
     712            0 :        if (iatom/=ipert1.or.iatom/=ipert2) cycle ! To move atom "ipert" does not change projectors of other atoms
     713            0 :        cplex_rhoij=pawrhoij(iatom)%cplex_rhoij
     714            0 :        do jlmn=1,pawrhoij(iatom)%lmn_size
     715            0 :          j0lmn=jlmn*(jlmn-1)/2
     716            0 :          d1cpj0(1:2,1)=cwaveprj0_pert1(iatm,1)%dcp(1:2,1,jlmn)   ! < p_j^(pert1) | Psi^(0) >
     717            0 :          d2cpj0(1:2,1)=cwaveprj0_pert2(iatm,1)%dcp(1:2,1,jlmn)   ! < p_j^(pert2) | Psi^(0) >
     718            0 :          do ilmn=1,jlmn
     719            0 :            klmn=j0lmn+ilmn
     720            0 :            klmn_re=cplex_rhoij*(klmn-1)+1
     721            0 :            d1cpi0(1:2,1)=cwaveprj0_pert1(iatm,1)%dcp(1:2,1,ilmn) ! < p_i^(pert1) | Psi^(0) >
     722            0 :            d2cpi0(1:2,1)=cwaveprj0_pert2(iatm,1)%dcp(1:2,1,ilmn) ! < p_i^(pert2) | Psi^(0) >
     723            0 :            ro11_re=zero
     724            0 :            do iplex=1,cplex
     725            0 :              ro11_re=ro11_re+d1cpi0(iplex,1)*d2cpj0(iplex,1)+d2cpi0(iplex,1)*d1cpj0(iplex,1)
     726              :            end do
     727            0 :            pawrhoij(iatom)%rhoij_(klmn_re,isppol)=pawrhoij(iatom)%rhoij_(klmn_re,isppol)+weight*ro11_re
     728            0 :            if (compute_impart_cplex) then
     729            0 :              klmn_im=klmn_re+1
     730            0 :              ro11_im=        d1cpi0(1,1)*d2cpj0(2,1)-d1cpi0(2,1)*d2cpj0(1,1)
     731            0 :              ro11_im=ro11_im+d2cpi0(1,1)*d1cpj0(2,1)-d2cpi0(2,1)*d1cpj0(1,1)
     732            0 :              pawrhoij(iatom)%rhoij_(klmn_im,isppol)=pawrhoij(iatom)%rhoij_(klmn_im,isppol)+weight*ro11_im
     733              :            end if
     734              :          end do
     735              :        end do
     736              :      end do
     737              :    else ! nspinor=2
     738            0 :      message="paw_dfptnl_accrhoij is not implemented for nspinor=2!"
     739            0 :      ABI_BUG(message)
     740              :    end if
     741              :  end if
     742              : 
     743              : !Destroy atom table used for parallelism
     744         8064 :  call free_my_atmtab(my_atmtab,my_atmtab_allocated)
     745              : 
     746              :  DBG_EXIT("COLL")
     747              : 
     748         8064 : end subroutine paw_dfptnl_accrhoij
     749              : !!***
     750              : 
     751              : !----------------------------------------------------------------------
     752              : 
     753              : END MODULE m_paw_dfptnl
     754              : !!***
        

Generated by: LCOV version 2.3-1