LCOV - code coverage report
Current view: top level - src/56_xc - m_dfpt_mkvxc.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 94.3 % 437 412
Test Date: 2026-11-12 14:41:44 Functions: 100.0 % 6 6
Branches: 68.1 % 998 680

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_dfpt_mkvxc
       2                 :             : !! NAME
       3                 :             : !!  m_dfpt_mkvxc
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !!
       7                 :             : !! COPYRIGHT
       8                 :             : !!  Copyright (C) 2001-2026 ABINIT group (XG, DRH, FR, EB, SPr)
       9                 :             : !!  This file is distributed under the terms of the
      10                 :             : !!  GNU General Public License, see ~abinit/COPYING
      11                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
      12                 :             : !!
      13                 :             : !! SOURCE
      14                 :             : 
      15                 :             : #if defined HAVE_CONFIG_H
      16                 :             : #include "config.h"
      17                 :             : #endif
      18                 :             : 
      19                 :             : #include "abi_common.h"
      20                 :             : 
      21                 :             : module m_dfpt_mkvxc
      22                 :             : 
      23                 :             :  use defs_basis
      24                 :             :  use m_errors
      25                 :             :  use m_abicore
      26                 :             :  use m_xc_noncoll
      27                 :             : 
      28                 :             :  use defs_abitypes,     only : MPI_type
      29                 :             :  use m_time,     only : timab
      30                 :             :  use m_matrix,   only : matr3inv
      31                 :             :  use m_xctk,     only : xcden, xcpot, xcpotdq
      32                 :             : 
      33                 :             :  implicit none
      34                 :             : 
      35                 :             :  private
      36                 :             : !!***
      37                 :             : 
      38                 :             :  public :: dfpt_mkvxc
      39                 :             :  public :: dfpt_mkvxc_noncoll
      40                 :             :  public :: dfpt_mkvxcggadq
      41                 :             :  public :: dfpt_mkvxcgga_n0met
      42                 :             :  public :: dfpt_mkvxcccdq
      43                 :             : !!***
      44                 :             : 
      45                 :             : contains
      46                 :             : !!***
      47                 :             : 
      48                 :             : !!****f* ABINIT/dfpt_mkvxc
      49                 :             : !! NAME
      50                 :             : !! dfpt_mkvxc
      51                 :             : !!
      52                 :             : !! FUNCTION
      53                 :             : !! Compute the first-order change of exchange-correlation potential
      54                 :             : !! due to atomic displacement: assemble the first-order
      55                 :             : !! density change with the frozen-core density change, then use
      56                 :             : !! the exchange-correlation kernel.
      57                 :             : !!
      58                 :             : !! INPUTS
      59                 :             : !!  cplex= if 1, real space 1-order functions on FFT grid are REAL,
      60                 :             : !!         if 2, COMPLEX
      61                 :             : !!  ixc= choice of exchange-correlation scheme
      62                 :             : !!  kxc(nfft,nkxc)=exchange and correlation kernel (see below)
      63                 :             : !!  mpi_enreg=information about MPI parallelization
      64                 :             : !!  nfft=(effective) number of FFT grid points (for this processor)
      65                 :             : !!  ngfft(18)=contain all needed information about 3D FFT,
      66                 :             : !!     see ~abinit/doc/variables/vargs.htm#ngfft
      67                 :             : !!  nhat1(cplex*nfft,2nspden*nhat1dim)= -PAW only- 1st-order compensation density
      68                 :             : !!  nhat1dim= -PAW only- 1 if nhat1 array is used ; 0 otherwise
      69                 :             : !!  nhat1gr(cplex*nfft,nspden,3*nhat1grdim)= -PAW only- gradients of 1st-order compensation density
      70                 :             : !!  nhat1grdim= -PAW only- 1 if nhat1gr array is used ; 0 otherwise
      71                 :             : !!  nkxc=second dimension of the kxc array
      72                 :             : !!  non_magnetic_xc= if true, handle density/potential as non-magnetic (even if it is)
      73                 :             : !!  nspden=number of spin-density components
      74                 :             : !!  n3xccc=dimension of xccc3d1 ; 0 if no XC core correction is used, otherwise, nfft
      75                 :             : !!  option=if 0, work only with the XC core-correction,
      76                 :             : !!         if 1, treat both density change and XC core correction
      77                 :             : !!         if 2, treat only density change
      78                 :             : !!  qphon(3)=reduced coordinates for the phonon wavelength (needed if cplex==2).
      79                 :             : !!  rhor1(cplex*nfft,nspden)=array for electron density in electrons/bohr**3.
      80                 :             : !!  rprimd(3,3)=dimensional primitive translations in real space (bohr)
      81                 :             : !!  usexcnhat= -PAW only- 1 if nhat density has to be taken into account in Vxc
      82                 :             : !!  xccc3d1(cplex*n3xccc)=3D change in core charge density, see n3xccc
      83                 :             : !!
      84                 :             : !! OUTPUT
      85                 :             : !!  vxc1(cplex*nfft,nspden)=change in exchange-correlation potential (including
      86                 :             : !!   core-correction, if applicable)
      87                 :             : !!
      88                 :             : !! NOTES
      89                 :             : !!  Content of Kxc array:
      90                 :             : !!   ===== if LDA
      91                 :             : !!    if nspden==1: kxc(:,1)= d2Exc/drho2
      92                 :             : !!                 (kxc(:,2)= d2Exc/drho_up drho_dn)
      93                 :             : !!    if nspden>=2: kxc(:,1)= d2Exc/drho_up drho_up
      94                 :             : !!                  kxc(:,2)= d2Exc/drho_up drho_dn
      95                 :             : !!                  kxc(:,3)= d2Exc/drho_dn drho_dn
      96                 :             : !!   ===== if GGA (or mGGA)
      97                 :             : !!    if nspden==1:
      98                 :             : !!       kxc(:,1)= d2Exc/drho2
      99                 :             : !!       kxc(:,2)= 1/|grad(rho)| dExc/d|grad(rho)|
     100                 :             : !!       kxc(:,3)= 1/|grad(rho)| d2Exc/d|grad(rho)| drho
     101                 :             : !!       kxc(:,4)= 1/|grad(rho)| * d/d|grad(rho)| ( 1/|grad(rho)| dExc/d|grad(rho)| )
     102                 :             : !!       kxc(:,5)= gradx(rho)
     103                 :             : !!       kxc(:,6)= grady(rho)
     104                 :             : !!       kxc(:,7)= gradz(rho)
     105                 :             : !!    if nspden>=2:
     106                 :             : !!       kxc(:,1)= d2Exc/drho_up drho_up
     107                 :             : !!       kxc(:,2)= d2Exc/drho_up drho_dn
     108                 :             : !!       kxc(:,3)= d2Exc/drho_dn drho_dn
     109                 :             : !!       kxc(:,4)= 1/|grad(rho_up)| dEx/d|grad(rho_up)|
     110                 :             : !!       kxc(:,5)= 1/|grad(rho_dn)| dEx/d|grad(rho_dn)|
     111                 :             : !!       kxc(:,6)= 1/|grad(rho_up)| d2Ex/d|grad(rho_up)| drho_up
     112                 :             : !!       kxc(:,7)= 1/|grad(rho_dn)| d2Ex/d|grad(rho_dn)| drho_dn
     113                 :             : !!       kxc(:,8)= 1/|grad(rho_up)| * d/d|grad(rho_up)| ( 1/|grad(rho_up)| dEx/d|grad(rho_up)| )
     114                 :             : !!       kxc(:,9)= 1/|grad(rho_dn)| * d/d|grad(rho_dn)| ( 1/|grad(rho_dn)| dEx/d|grad(rho_dn)| )
     115                 :             : !!       kxc(:,10)=1/|grad(rho)| dEc/d|grad(rho)|
     116                 :             : !!       kxc(:,11)=1/|grad(rho)| d2Ec/d|grad(rho)| drho_up
     117                 :             : !!       kxc(:,12)=1/|grad(rho)| d2Ec/d|grad(rho)| drho_dn
     118                 :             : !!       kxc(:,13)=1/|grad(rho)| * d/d|grad(rho)| ( 1/|grad(rho)| dEc/d|grad(rho)| )
     119                 :             : !!       kxc(:,14)=gradx(rho_up)
     120                 :             : !!       kxc(:,15)=gradx(rho_dn)
     121                 :             : !!       kxc(:,16)=grady(rho_up)
     122                 :             : !!       kxc(:,17)=grady(rho_dn)
     123                 :             : !!       kxc(:,18)=gradz(rho_up)
     124                 :             : !!       kxc(:,19)=gradz(rho_dn)
     125                 :             : !!    Note about mGGA: 2nd derivatives involving Tau or Laplacian are not taken into account (yet)
     126                 :             : !!
     127                 :             : !! SOURCE
     128                 :             : 
     129                 :       56279 : subroutine dfpt_mkvxc(cplex,ixc,kxc,mpi_enreg,nfft,ngfft,nhat1,nhat1dim,nhat1gr,nhat1grdim,&
     130                 :       56279 : &          nkxc,non_magnetic_xc,nspden,n3xccc,option,qphon,rhor1,rprimd,usexcnhat,vxc1,xccc3d1)
     131                 :             : 
     132                 :             : !Arguments ------------------------------------
     133                 :             : !scalars
     134                 :             :  integer,intent(in) :: cplex,ixc,n3xccc,nfft,nhat1dim,nhat1grdim
     135                 :             :  integer,intent(in) :: nkxc,nspden,option,usexcnhat
     136                 :             :  logical,intent(in) :: non_magnetic_xc
     137                 :             :  type(MPI_type),intent(in) :: mpi_enreg
     138                 :             : !arrays
     139                 :             :  integer,intent(in) :: ngfft(18)
     140                 :             :  real(dp),intent(in),target :: nhat1(cplex*nfft,nspden*nhat1dim)
     141                 :             :  real(dp),intent(in),target :: nhat1gr(cplex*nfft,nspden,3*nhat1grdim)
     142                 :             :  real(dp),intent(in) :: kxc(nfft,nkxc),qphon(3)
     143                 :             :  real(dp),intent(in),target :: rhor1(cplex*nfft,nspden)
     144                 :             :  real(dp),intent(in) :: rprimd(3,3),xccc3d1(cplex*n3xccc)
     145                 :             :  real(dp),intent(out) :: vxc1(cplex*nfft,nspden)
     146                 :             : 
     147                 :             : !Local variables-------------------------------
     148                 :             : !scalars
     149                 :             :  integer :: ii,ir,ispden,nhat1dim_,nhat1rgdim_
     150                 :             :  real(dp) :: rho1_dn,rho1_up,rho1im_dn,rho1im_up,rho1re_dn,rho1re_up
     151                 :             :  real(dp) :: spin_scale
     152                 :             : !arrays
     153                 :             :  real(dp) :: gprimd(3,3),tsec(2)
     154                 :       56279 :  real(dp), contiguous, pointer :: nhat1_(:,:),nhat1gr_(:,:,:),rhor1_(:,:)
     155                 :             : ! *************************************************************************
     156                 :             : 
     157                 :             :  DBG_ENTER("COLL")
     158                 :             : 
     159                 :       56279 :  call timab(181,1,tsec)
     160                 :             : 
     161         [ -  + ]:       56279 :  if(nspden/=1 .and. nspden/=2) then
     162                 :           0 :    ABI_BUG('For nspden==4 please use dfpt_mkvxc_noncoll!')
     163                 :             :  end if
     164                 :             : 
     165                 :             : !Special case: no XC applied
     166         [ +  + ]:       56279 :  if (ixc==0.or.nkxc==0) then
     167                 :         962 :    ABI_WARNING('Note that no xc is applied (ixc=0)')
     168   [ +  +  +  + ]:    11332295 :    vxc1=zero
     169                 :         962 :    return
     170                 :             :  end if
     171                 :             : 
     172                 :             : !Treat first LDA
     173                 :             :  if(nkxc==1.or.nkxc==3)then
     174                 :             : 
     175                 :             : !  PAW: eventually substract compensation density
     176         [ +  + ]:       49780 :    if (option/=0) then
     177   [ +  +  +  +  :       25478 :      if ((usexcnhat==0.and.nhat1dim==1).or.(non_magnetic_xc)) then
                   +  + ]
     178   [ -  +  +  -  :        4856 :        ABI_MALLOC(rhor1_,(cplex*nfft,nspden))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     179   [ +  +  +  + ]:        1214 :        if (usexcnhat==0.and.nhat1dim==1) then
     180   [ +  -  +  +  :    63056689 :          rhor1_(:,:)=rhor1(:,:)-nhat1(:,:)
          +  +  +  +  +  
                      + ]
     181                 :             :        else
     182   [ +  -  +  +  :     1576591 :          rhor1_(:,:)=rhor1(:,:)
          +  +  +  +  +  
                      + ]
     183                 :             :        end if
     184         [ +  + ]:        1214 :        if (non_magnetic_xc) then
     185   [ +  -  +  + ]:      394142 :          if(nspden==2) rhor1_(:,2)=rhor1_(:,1)*half
     186   [ -  +  -  -  :          23 :          if(nspden==4) rhor1_(:,2:4)=zero
                   -  - ]
     187                 :             :        end if
     188                 :             :      else
     189                 :       24264 :        rhor1_ => rhor1
     190                 :             :      end if
     191                 :             :    end if
     192                 :             : 
     193                 :             : !  Case without non-linear core correction
     194   [ +  +  +  + ]:       49780 :    if(n3xccc==0 .or. option==2)then
     195                 :             : 
     196         [ +  + ]:       28794 :      if(option==0)then  ! No straight XC to compute
     197                 :             : 
     198   [ +  +  +  + ]:    49015236 :        vxc1(:,:)=zero
     199                 :             : 
     200                 :             :      else               ! XC, without non-linear XC correction
     201                 :             : 
     202                 :             : !      Non-spin-polarized
     203         [ +  + ]:       23753 :        if(nspden==1)then
     204         [ +  + ]:       21539 :          if(cplex==1)then
     205         [ +  + ]:   417584970 :            do ir=1,nfft
     206                 :   417584970 :              vxc1(ir,1)=kxc(ir,1)*rhor1_(ir,1)
     207                 :             :            end do
     208                 :             :          else
     209         [ +  + ]:    32743204 :            do ir=1,nfft
     210                 :    32738092 :              vxc1(2*ir-1,1)=kxc(ir,1)*rhor1_(2*ir-1,1)
     211                 :    32743204 :              vxc1(2*ir  ,1)=kxc(ir,1)*rhor1_(2*ir  ,1)
     212                 :             :            end do
     213                 :             :          end if ! cplex==1
     214                 :             : 
     215                 :             : !        Spin-polarized
     216                 :             :        else
     217         [ +  + ]:        2214 :          if(cplex==1)then
     218         [ +  + ]:    37582331 :            do ir=1,nfft
     219                 :    37580282 :              rho1_dn=rhor1_(ir,1)-rhor1_(ir,2)
     220                 :    37580282 :              vxc1(ir,1)=kxc(ir,1)*rhor1_(ir,2)+kxc(ir,2)*rho1_dn
     221                 :    37582331 :              vxc1(ir,2)=kxc(ir,2)*rhor1_(ir,2)+kxc(ir,3)*rho1_dn
     222                 :             :            end do
     223                 :             :          else
     224         [ +  + ]:      923917 :            do ir=1,nfft
     225                 :      923752 :              rho1re_dn=rhor1_(2*ir-1,1)-rhor1_(2*ir-1,2)
     226                 :      923752 :              rho1im_dn=rhor1_(2*ir  ,1)-rhor1_(2*ir  ,2)
     227                 :      923752 :              vxc1(2*ir-1,1)=kxc(ir,1)*rhor1_(2*ir-1,2)+kxc(ir,2)*rho1re_dn
     228                 :      923752 :              vxc1(2*ir  ,1)=kxc(ir,1)*rhor1_(2*ir  ,2)+kxc(ir,2)*rho1im_dn
     229                 :      923752 :              vxc1(2*ir-1,2)=kxc(ir,2)*rhor1_(2*ir-1,2)+kxc(ir,3)*rho1re_dn
     230                 :      923917 :              vxc1(2*ir  ,2)=kxc(ir,2)*rhor1_(2*ir  ,2)+kxc(ir,3)*rho1im_dn
     231                 :             :            end do
     232                 :             :          end if ! cplex==1
     233                 :             :        end if ! nspden==1
     234                 :             : 
     235                 :             :      end if ! option==0
     236                 :             : 
     237                 :             : !    Treat case with non-linear core correction
     238                 :             :    else
     239                 :             : 
     240         [ +  + ]:       20986 :      if(option==0)then
     241                 :             : 
     242         [ +  + ]:       19261 :        if(nspden==1)then
     243         [ +  + ]:       17040 :          if(cplex==1)then
     244         [ +  + ]:   127401478 :            do ir=1,nfft
     245                 :   127401478 :              vxc1(ir,1)=kxc(ir,1)*xccc3d1(ir)
     246                 :             :            end do
     247                 :             :          else
     248         [ +  + ]:    63774383 :            do ir=1,nfft
     249                 :    63766943 :              vxc1(2*ir-1,1)=kxc(ir,1)*xccc3d1(2*ir-1)
     250                 :    63774383 :              vxc1(2*ir  ,1)=kxc(ir,1)*xccc3d1(2*ir  )
     251                 :             :            end do
     252                 :             :          end if ! cplex==1
     253                 :             :        else
     254         [ +  + ]:        2221 :          if(cplex==1)then
     255         [ +  + ]:    19912724 :            do ir=1,nfft
     256                 :    19911064 :              vxc1(ir,1)=(kxc(ir,1)+kxc(ir,2))*xccc3d1(ir)*half
     257                 :    19912724 :              vxc1(ir,2)=(kxc(ir,2)+kxc(ir,3))*xccc3d1(ir)*half
     258                 :             :            end do
     259                 :             :          else
     260         [ +  + ]:     2229223 :            do ir=1,nfft
     261                 :     2228662 :              vxc1(2*ir-1,1)=(kxc(ir,1)+kxc(ir,2))*xccc3d1(2*ir-1)*half
     262                 :     2228662 :              vxc1(2*ir  ,1)=(kxc(ir,1)+kxc(ir,2))*xccc3d1(2*ir  )*half
     263                 :     2228662 :              vxc1(2*ir-1,2)=(kxc(ir,2)+kxc(ir,3))*xccc3d1(2*ir-1)*half
     264                 :     2229223 :              vxc1(2*ir  ,2)=(kxc(ir,2)+kxc(ir,3))*xccc3d1(2*ir  )*half
     265                 :             :            end do
     266                 :             :          end if ! cplex==1
     267                 :             :        end if ! nspden==1
     268                 :             : 
     269                 :             :      else ! option/=0
     270                 :             : 
     271         [ +  + ]:        1725 :        if(nspden==1)then
     272         [ +  + ]:        1222 :          if(cplex==1)then
     273         [ +  + ]:     7442937 :            do ir=1,nfft
     274                 :     7442937 :              vxc1(ir,1)=kxc(ir,1)*(rhor1_(ir,1)+xccc3d1(ir))
     275                 :             :            end do
     276                 :             :          else
     277         [ +  + ]:     3280034 :            do ir=1,nfft
     278                 :     3279618 :              vxc1(2*ir-1,1)=kxc(ir,1)*(rhor1_(2*ir-1,1)+xccc3d1(2*ir-1))
     279                 :     3280034 :              vxc1(2*ir  ,1)=kxc(ir,1)*(rhor1_(2*ir  ,1)+xccc3d1(2*ir  ))
     280                 :             :            end do
     281                 :             :          end if ! cplex==1
     282                 :             :        else
     283         [ +  + ]:         503 :          if(cplex==1)then
     284         [ +  + ]:     3079255 :            do ir=1,nfft
     285                 :     3078771 :              rho1_dn=rhor1_(ir,1)-rhor1_(ir,2) + xccc3d1(ir)*half
     286                 :     3078771 :              rho1_up=rhor1_(ir,2)             + xccc3d1(ir)*half
     287                 :     3078771 :              vxc1(ir,1)=kxc(ir,1)*rho1_up+kxc(ir,2)*rho1_dn
     288                 :     3079255 :              vxc1(ir,2)=kxc(ir,2)*rho1_up+kxc(ir,3)*rho1_dn
     289                 :             :            end do
     290                 :             :          else
     291         [ +  + ]:       93809 :            do ir=1,nfft
     292                 :       93790 :              rho1re_dn=rhor1_(2*ir-1,1)-rhor1_(2*ir-1,2) + xccc3d1(2*ir-1)*half
     293                 :       93790 :              rho1im_dn=rhor1_(2*ir  ,1)-rhor1_(2*ir  ,2) + xccc3d1(2*ir  )*half
     294                 :       93790 :              rho1re_up=rhor1_(2*ir-1,2)                 + xccc3d1(2*ir-1)*half
     295                 :       93790 :              rho1im_up=rhor1_(2*ir  ,2)                 + xccc3d1(2*ir  )*half
     296                 :       93790 :              vxc1(2*ir-1,1)=kxc(ir,1)*rho1re_up+kxc(ir,2)*rho1re_dn
     297                 :       93790 :              vxc1(2*ir  ,1)=kxc(ir,1)*rho1im_up+kxc(ir,2)*rho1im_dn
     298                 :       93790 :              vxc1(2*ir-1,2)=kxc(ir,2)*rho1re_up+kxc(ir,3)*rho1re_dn
     299                 :       93809 :              vxc1(2*ir  ,2)=kxc(ir,2)*rho1im_up+kxc(ir,3)*rho1im_dn
     300                 :             :            end do
     301                 :             :          end if ! cplex==1
     302                 :             :        end if ! nspden==1
     303                 :             : 
     304                 :             :      end if ! option==0
     305                 :             : 
     306                 :             :    end if ! n3xccc==0
     307                 :             : 
     308   [ +  +  +  +  :       49780 :    if (option/=0.and.((usexcnhat==0.and.nhat1dim==1).or.(non_magnetic_xc))) then
             +  +  +  + ]
     309         [ -  + ]:        1214 :      ABI_FREE(rhor1_)
     310                 :             :    end if
     311                 :             : 
     312                 :             : !  Treat GGA
     313                 :             :  else if (nkxc==7.or.nkxc==19) then
     314                 :             : 
     315                 :             : !  Transfer the data to spin-polarized storage
     316                 :             : 
     317                 :             : !  Treat the density change
     318   [ -  +  +  -  :       22148 :    ABI_MALLOC(rhor1_,(cplex*nfft,nspden))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     319         [ +  + ]:        5537 :    if (option==1 .or. option==2) then
     320         [ +  + ]:        2662 :      if (nspden==1) then
     321         [ +  + ]:   158101320 :        do ir=1,cplex*nfft
     322                 :   158101320 :          rhor1_(ir,1)=rhor1(ir,1)
     323                 :             :        end do
     324                 :             :      else
     325         [ -  + ]:         139 :        if(non_magnetic_xc) then
     326         [ #  # ]:           0 :          do ir=1,cplex*nfft
     327                 :           0 :            rho1_dn=rhor1(ir,1)*half
     328                 :           0 :            rhor1_(ir,1)=rho1_dn
     329                 :           0 :            rhor1_(ir,2)=rho1_dn
     330                 :             :          end do
     331                 :             :        else
     332         [ +  + ]:     1223332 :          do ir=1,cplex*nfft
     333                 :     1223193 :            rho1_dn=rhor1(ir,1)-rhor1(ir,2)
     334                 :     1223193 :            rhor1_(ir,1)=rhor1(ir,2)
     335                 :     1223332 :            rhor1_(ir,2)=rho1_dn
     336                 :             :          end do
     337                 :             :        end if
     338                 :             :      end if
     339                 :             :    else
     340         [ +  + ]:        5834 :      do ispden=1,nspden
     341         [ +  + ]:   189382562 :        do ir=1,cplex*nfft
     342                 :   189379687 :          rhor1_(ir,ispden)=zero
     343                 :             :        end do
     344                 :             :      end do
     345                 :             :    end if
     346                 :             : 
     347   [ +  +  +  + ]:        5537 :    if( (option==0 .or. option==1) .and. n3xccc/=0)then
     348         [ +  + ]:        2573 :      spin_scale=one;if (nspden==2) spin_scale=half
     349         [ +  + ]:        5213 :      do ispden=1,nspden
     350         [ +  + ]:    96862533 :        do ir=1,cplex*nfft
     351                 :    96859960 :          rhor1_(ir,ispden)=rhor1_(ir,ispden)+xccc3d1(ir)*spin_scale
     352                 :             :        end do
     353                 :             :      end do
     354                 :             :    end if
     355                 :             : 
     356                 :             : !  PAW: treat also compensation density (and gradients)
     357                 :        5537 :    nhat1dim_=nhat1dim ; nhat1rgdim_=nhat1grdim
     358   [ +  +  +  +  :        5537 :    if (option/=0.and.nhat1dim==1.and.nspden==2) then
                   +  + ]
     359   [ -  +  +  -  :         165 :      ABI_MALLOC(nhat1_,(cplex*nfft,nspden))
          -  +  +  -  -  
                +  -  + ]
     360         [ -  + ]:          55 :      if (non_magnetic_xc) then
     361         [ #  # ]:           0 :        do ir=1,cplex*nfft
     362                 :           0 :          rho1_dn=nhat1(ir,1)*half
     363         [ #  # ]:           0 :          nhat1_(ir,1:2)=rho1_dn
     364                 :             :        end do
     365                 :             :      else
     366         [ +  + ]:      864439 :        do ir=1,cplex*nfft
     367                 :      864384 :          rho1_dn=nhat1(ir,1)-nhat1(ir,2)
     368                 :      864384 :          nhat1_(ir,1)=nhat1(ir,2)
     369                 :      864439 :          nhat1_(ir,2)=rho1_dn
     370                 :             :        end do
     371                 :             :      end if
     372         [ +  + ]:        5482 :    else if (option==0) then
     373         [ -  + ]:        2875 :      ABI_MALLOC(nhat1_,(0,0))
     374                 :        2875 :      nhat1dim_=0
     375                 :             :    else
     376                 :        2607 :      nhat1_ => nhat1
     377                 :             :    end if
     378   [ +  +  +  +  :        5537 :    if (option/=0.and.nhat1grdim==1.and.nspden==2) then
                   +  - ]
     379   [ -  +  +  -  :          40 :      ABI_MALLOC(nhat1gr_,(cplex*nfft,nspden,3))
          -  +  +  -  +  
          -  +  -  +  -  
             -  +  -  + ]
     380         [ -  + ]:           8 :      if (non_magnetic_xc) then
     381         [ #  # ]:           0 :        do ii=1,3
     382         [ #  # ]:           0 :          do ir=1,cplex*nfft
     383                 :           0 :            rho1_dn=nhat1(ir,1)*half
     384         [ #  # ]:           0 :            nhat1gr_(ir,1:2,ii)=rho1_dn
     385                 :             :          end do
     386                 :             :        end do
     387                 :             :      else
     388         [ +  + ]:          32 :        do ii=1,3
     389         [ +  + ]:      279968 :          do ir=1,cplex*nfft
     390                 :      279936 :            rho1_dn=nhat1gr(ir,1,ii)-nhat1gr(ir,2,ii)
     391                 :      279936 :            nhat1gr_(ir,1,ii)=nhat1gr(ir,2,ii)
     392                 :      279960 :            nhat1gr_(ir,2,ii)=rho1_dn
     393                 :             :          end do
     394                 :             :        end do
     395                 :             :      end if
     396         [ +  + ]:        5529 :    else if (option==0) then
     397         [ -  + ]:        2875 :      ABI_MALLOC(nhat1gr_,(0,0,0))
     398                 :        2875 :      nhat1rgdim_=0
     399                 :             :    else
     400                 :        2654 :      nhat1gr_ => nhat1gr
     401                 :             :    end if
     402                 :             : 
     403                 :        5537 :    call matr3inv(rprimd,gprimd)
     404                 :             : 
     405                 :             :    call dfpt_mkvxcgga(cplex,gprimd,kxc,mpi_enreg,nfft,ngfft,nhat1_,nhat1dim_,&
     406                 :        5537 : &   nhat1gr_,nhat1rgdim_,nkxc,nspden,qphon,rhor1_,usexcnhat,vxc1)
     407                 :             : 
     408         [ -  + ]:        5537 :    ABI_FREE(rhor1_)
     409   [ +  +  +  +  :        5537 :    if ((option==0).or.(nhat1dim==1.and.nspden==2)) then
                   +  + ]
     410         [ -  + ]:        2930 :      ABI_FREE(nhat1_)
     411                 :             :    end if
     412   [ +  +  +  +  :        5537 :    if ((option==0).or.(nhat1grdim==1.and.nspden==2)) then
                   +  - ]
     413         [ -  + ]:        2883 :      ABI_FREE(nhat1gr_)
     414                 :             :    end if
     415                 :             : 
     416                 :             :  else
     417                 :           0 :    ABI_BUG('Invalid nkxc!')
     418                 :             : 
     419                 :             :  end if ! LDA or GGA
     420                 :             : 
     421                 :       55317 :  call timab(181,2,tsec)
     422                 :             : 
     423                 :             :  DBG_EXIT("COLL")
     424                 :             : 
     425                 :       56279 : end subroutine dfpt_mkvxc
     426                 :             : !!***
     427                 :             : 
     428                 :             : !!****f* ABINIT/dfpt_mkvxcgga
     429                 :             : !! NAME
     430                 :             : !! dfpt_mkvxcgga
     431                 :             : !!
     432                 :             : !! FUNCTION
     433                 :             : !! Compute the first-order change of exchange-correlation potential
     434                 :             : !! in case of GGA functionals
     435                 :             : !! Use the exchange-correlation kernel.
     436                 :             : !!
     437                 :             : !! INPUTS
     438                 :             : !!  cplex= if 1, real space 1-order functions on FFT grid are REAL,
     439                 :             : !!    if 2, COMPLEX
     440                 :             : !!  gmet(3,3)=metrix tensor in G space in Bohr**-2.
     441                 :             : !!  gprimd(3,3)=dimensional primitive translations in reciprocal space (bohr^-1)
     442                 :             : !!  gsqcut=cutoff value on G**2 for sphere inside fft box.
     443                 :             : !!  kxc(nfft,nkxc)=exchange and correlation kernel (see below)
     444                 :             : !!  mpi_enreg=information about MPI parallelization
     445                 :             : !!  nfft=(effective) number of FFT grid points (for this processor)
     446                 :             : !!  ngfft(18)=contain all needed information about 3D FFT
     447                 :             : !!  nhat1(cplex*nfft,2*nhat1dim)= -PAW only- 1st-order compensation density
     448                 :             : !!  nhat1dim= -PAW only- 1 if nhat1 array is used ; 0 otherwise
     449                 :             : !!  nhat1gr(cplex*nfft,2,3*nhat1grdim)= -PAW only- gradients of 1st-order compensation density
     450                 :             : !!  nhat1grdim= -PAW only- 1 if nhat1gr array is used ; 0 otherwise
     451                 :             : !!  nkxc=second dimension of the kxc array
     452                 :             : !!  nspden=number of spin-density components
     453                 :             : !!  qphon(3)=reduced coordinates for the phonon wavelength (needed if cplex==2).
     454                 :             : !!  rhor1tmp(cplex*nfft,2)=array for first-order electron spin-density
     455                 :             : !!   in electrons/bohr**3 (second index corresponds to spin-up and spin-down)
     456                 :             : !!  usexcnhat= -PAW only- 1 if nhat density has to be taken into account in Vxc
     457                 :             : !!
     458                 :             : !! OUTPUT
     459                 :             : !!  vxc1(cplex*nfft,nspden)=change in exchange-correlation potential
     460                 :             : !!
     461                 :             : !! NOTES
     462                 :             : !!  For the time being, a rather crude coding, to be optimized ...
     463                 :             : !!  Content of Kxc array:
     464                 :             : !!   ===== if GGA
     465                 :             : !!    if nspden==1:
     466                 :             : !!       kxc(:,1)= d2Exc/drho2
     467                 :             : !!       kxc(:,2)= 1/|grad(rho)| dExc/d|grad(rho)|
     468                 :             : !!       kxc(:,3)= 1/|grad(rho)| d2Exc/d|grad(rho)| drho
     469                 :             : !!       kxc(:,4)= 1/|grad(rho)| * d/d|grad(rho)| ( 1/|grad(rho)| dExc/d|grad(rho)| )
     470                 :             : !!       kxc(:,5)= gradx(rho)
     471                 :             : !!       kxc(:,6)= grady(rho)
     472                 :             : !!       kxc(:,7)= gradz(rho)
     473                 :             : !!    if nspden>=2:
     474                 :             : !!       kxc(:,1)= d2Exc/drho_up drho_up
     475                 :             : !!       kxc(:,2)= d2Exc/drho_up drho_dn
     476                 :             : !!       kxc(:,3)= d2Exc/drho_dn drho_dn
     477                 :             : !!       kxc(:,4)= 1/|grad(rho_up)| dEx/d|grad(rho_up)|
     478                 :             : !!       kxc(:,5)= 1/|grad(rho_dn)| dEx/d|grad(rho_dn)|
     479                 :             : !!       kxc(:,6)= 1/|grad(rho_up)| d2Ex/d|grad(rho_up)| drho_up
     480                 :             : !!       kxc(:,7)= 1/|grad(rho_dn)| d2Ex/d|grad(rho_dn)| drho_dn
     481                 :             : !!       kxc(:,8)= 1/|grad(rho_up)| * d/d|grad(rho_up)| ( 1/|grad(rho_up)| dEx/d|grad(rho_up)| )
     482                 :             : !!       kxc(:,9)= 1/|grad(rho_dn)| * d/d|grad(rho_dn)| ( 1/|grad(rho_dn)| dEx/d|grad(rho_dn)| )
     483                 :             : !!       kxc(:,10)=1/|grad(rho)| dEc/d|grad(rho)|
     484                 :             : !!       kxc(:,11)=1/|grad(rho)| d2Ec/d|grad(rho)| drho_up
     485                 :             : !!       kxc(:,12)=1/|grad(rho)| d2Ec/d|grad(rho)| drho_dn
     486                 :             : !!       kxc(:,13)=1/|grad(rho)| * d/d|grad(rho)| ( 1/|grad(rho)| dEc/d|grad(rho)| )
     487                 :             : !!       kxc(:,14)=gradx(rho_up)
     488                 :             : !!       kxc(:,15)=gradx(rho_dn)
     489                 :             : !!       kxc(:,16)=grady(rho_up)
     490                 :             : !!       kxc(:,17)=grady(rho_dn)
     491                 :             : !!       kxc(:,18)=gradz(rho_up)
     492                 :             : !!       kxc(:,19)=gradz(rho_dn)
     493                 :             : !!
     494                 :             : !! SOURCE
     495                 :             : 
     496                 :        5537 : subroutine dfpt_mkvxcgga(cplex,gprimd,kxc,mpi_enreg,nfft,ngfft,&
     497                 :        5537 : &                    nhat1,nhat1dim,nhat1gr,nhat1grdim,nkxc,&
     498                 :        5537 : &                    nspden,qphon,rhor1,usexcnhat,vxc1)
     499                 :             : 
     500                 :             : !Arguments ------------------------------------
     501                 :             : !scalars
     502                 :             :  integer,intent(in) :: cplex,nfft,nhat1dim,nhat1grdim,nkxc,nspden,usexcnhat
     503                 :             :  type(MPI_type),intent(in) :: mpi_enreg
     504                 :             : !arrays
     505                 :             :  integer,intent(in) :: ngfft(18)
     506                 :             :  real(dp),intent(in) :: gprimd(3,3)
     507                 :             :  real(dp),intent(in) :: kxc(nfft,nkxc)
     508                 :             :  real(dp),intent(in) :: nhat1(cplex*nfft,nspden*nhat1dim)
     509                 :             :  real(dp),intent(in) :: nhat1gr(cplex*nfft,nspden,3*nhat1grdim)
     510                 :             :  real(dp),intent(in) :: qphon(3)
     511                 :             :  real(dp),intent(in),target :: rhor1(cplex*nfft,nspden)
     512                 :             :  real(dp),intent(out) :: vxc1(cplex*nfft,nspden)
     513                 :             : 
     514                 :             : !Local variables-------------------------------
     515                 :             : !scalars
     516                 :             :  integer :: ii,ir,ishift,ngrad,nspgrad,use_laplacian
     517                 :             :  logical :: test_nhat
     518                 :             :  real(dp) :: coeff_grho,coeff_grho_corr,coeff_grho_dn,coeff_grho_up
     519                 :             :  real(dp) :: coeffim_grho,coeffim_grho_corr,coeffim_grho_dn,coeffim_grho_up
     520                 :             :  real(dp) :: gradrho_gradrho1,gradrho_gradrho1_dn,gradrho_gradrho1_up
     521                 :             :  real(dp) :: gradrho_gradrho1im,gradrho_gradrho1im_dn,gradrho_gradrho1im_up
     522                 :             :  character(len=500) :: msg
     523                 :             : !arrays
     524                 :             :  real(dp) :: r0(3),r0_dn(3),r0_up(3),r1(3),r1_dn(3),r1_up(3)
     525                 :             :  real(dp) :: r1im(3),r1im_dn(3),r1im_up(3)
     526                 :        5537 :  real(dp),allocatable :: dnexcdn(:,:),rho1now(:,:,:)
     527                 :        5537 :  real(dp),contiguous, pointer :: rhor1_ptr(:,:)
     528                 :             : ! *************************************************************************
     529                 :             : 
     530                 :             :  DBG_ENTER("COLL")
     531                 :             : 
     532                 :        5537 :  if (nkxc/=12*min(nspden,2)-5) then
     533                 :           0 :    msg='Wrong nkxc value for GGA!'
     534                 :           0 :    ABI_BUG(msg)
     535                 :             :  end if
     536                 :             : 
     537                 :             : !metaGGA contributions are not taken into account here
     538                 :        5537 :  use_laplacian=0
     539                 :             : 
     540                 :             : !PAW: substract 1st-order compensation density from 1st-order density
     541   [ +  +  +  +  :        5537 :  test_nhat=((nhat1dim==1).and.(usexcnhat==0.or.nhat1grdim==1))
                   +  + ]
     542                 :             :  if (test_nhat) then
     543   [ -  +  +  -  :        2728 :    ABI_MALLOC(rhor1_ptr,(cplex*nfft,nspden))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     544   [ +  -  +  +  :   240081162 :    rhor1_ptr(:,:)=rhor1(:,:)-nhat1(:,:)
          +  +  +  +  +  
                      + ]
     545                 :             :  else
     546                 :        4855 :    rhor1_ptr => rhor1
     547                 :             :  end if
     548                 :             : 
     549                 :             : !call filterpot(paral_kgb,cplex,gmet,gsqcut,nfft,ngfft,2,qphon,rhor1_ptr)
     550                 :             : 
     551                 :             : !Compute the gradients of the first-order density
     552                 :             : !rho1now(:,:,1) contains the first-order density, and
     553                 :             : !rho1now(:,:,2:4) contains the gradients of the first-order density
     554                 :        5537 :  ishift=0 ; ngrad=2
     555   [ -  +  +  -  :       27685 :  ABI_MALLOC(rho1now,(cplex*nfft,nspden,ngrad*ngrad))
          -  +  +  -  +  
          -  +  -  +  -  
             -  +  -  + ]
     556                 :        5537 :  call xcden(cplex,gprimd,ishift,mpi_enreg,nfft,ngfft,ngrad,nspden,qphon,rhor1_ptr,rho1now)
     557                 :             : 
     558                 :             : !PAW: add "exact" gradients of compensation density
     559   [ +  +  +  + ]:        5537 :  if (test_nhat.and.usexcnhat==1) then
     560   [ +  +  +  + ]:      186648 :    rho1now(:,1:nspden,1)=rho1now(:,1:nspden,1)+nhat1(:,1:nspden)
     561                 :             :  end if
     562         [ +  + ]:        5537 :  if (nhat1grdim==1) then
     563         [ +  + ]:          32 :    do ii=1,3
     564   [ +  +  +  + ]:      559952 :      rho1now(:,1:nspden,ii+1)=rho1now(:,1:nspden,ii+1)+nhat1gr(:,1:nspden,ii)
     565                 :             :    end do
     566                 :             :  end if
     567         [ +  + ]:        5537 :  if (test_nhat) then
     568         [ -  + ]:         682 :    ABI_FREE(rhor1_ptr)
     569                 :             :  end if
     570                 :             : 
     571                 :             : !Apply the XC kernel
     572         [ +  + ]:        5537 :  nspgrad=2; if (nspden==2) nspgrad=5
     573   [ -  +  +  -  :       22148 :  ABI_MALLOC(dnexcdn,(cplex*nfft,nspgrad))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     574                 :             : 
     575         [ +  + ]:        5537 :  if (cplex==1) then  ! Treat real case first
     576         [ +  + ]:        4140 :    if (nspden==1) then
     577         [ +  + ]:   317986490 :      do ir=1,nfft
     578   [ +  +  +  + ]:  2225877731 :        r0(:)=kxc(ir,5:7) ; r1(:)=rho1now(ir,1,2:4)
     579         [ +  + ]:  1271930132 :        gradrho_gradrho1=dot_product(r0,r1)
     580                 :   317982533 :        dnexcdn(ir,1)=kxc(ir,1)*rho1now(ir,1,1) + kxc(ir,3)*gradrho_gradrho1
     581                 :   317982533 :        coeff_grho=kxc(ir,3)*rho1now(ir,1,1) + kxc(ir,4)*gradrho_gradrho1
     582                 :             :   !    Reuse the storage in rho1now
     583         [ +  + ]:  1271934089 :        rho1now(ir,1,2:4)=r1(:)*kxc(ir,2)+r0(:)*coeff_grho
     584                 :             :      end do
     585                 :             :    else
     586         [ +  + ]:     1703232 :      do ir=1,nfft
     587         [ +  + ]:     6812196 :        do ii=1,3  ! grad of spin-up ans spin_dn GS rho
     588                 :     6812196 :          r0_up(ii)=kxc(ir,13+2*ii);r0_dn(ii)=kxc(ir,12+2*ii)-kxc(ir,13+2*ii)
     589                 :             :        end do
     590         [ +  + ]:     6812196 :        r0(:)=r0_up(:)+r0_dn(:)      ! grad of GS rho
     591         [ +  + ]:     6812196 :        r1_up(:)=rho1now(ir,1,2:4)   ! grad of spin-up rho1
     592         [ +  + ]:     6812196 :        r1_dn(:)=rho1now(ir,2,2:4)   ! grad of spin-down rho1
     593         [ +  + ]:     6812196 :        r1(:)=r1_up(:)+r1_dn(:)      ! grad of GS rho1
     594         [ +  + ]:     6812196 :        gradrho_gradrho1_up=dot_product(r0_up,r1_up)
     595         [ +  + ]:     6812196 :        gradrho_gradrho1_dn=dot_product(r0_dn,r1_dn)
     596         [ +  + ]:     6812196 :        gradrho_gradrho1   =dot_product(r0,r1)
     597                 :             :        dnexcdn(ir,1)=kxc(ir, 1)*rho1now(ir,1,1)     &
     598                 :             : &       +kxc(ir, 2)*rho1now(ir,2,1)     &
     599                 :             : &       +kxc(ir, 6)*gradrho_gradrho1_up &
     600                 :     1703049 : &       +kxc(ir,11)*gradrho_gradrho1
     601                 :             :        dnexcdn(ir,2)=kxc(ir, 3)*rho1now(ir,2,1)     &
     602                 :             : &       +kxc(ir, 2)*rho1now(ir,1,1)     &
     603                 :             : &       +kxc(ir, 7)*gradrho_gradrho1_dn &
     604                 :     1703049 : &       +kxc(ir,12)*gradrho_gradrho1
     605                 :             :        coeff_grho_corr=kxc(ir,11)*rho1now(ir,1,1) &
     606                 :             : &       +kxc(ir,12)*rho1now(ir,2,1) &
     607                 :     1703049 : &       +kxc(ir,13)*gradrho_gradrho1
     608                 :     1703049 :        coeff_grho_up=kxc(ir,6)*rho1now(ir,1,1)+kxc(ir,8)*gradrho_gradrho1_up
     609                 :     1703049 :        coeff_grho_dn=kxc(ir,7)*rho1now(ir,2,1)+kxc(ir,9)*gradrho_gradrho1_dn
     610                 :             :   !    Reuse the storage in rho1now
     611                 :             :        rho1now(ir,1,2:4)=(kxc(ir,4)+kxc(ir,10))*r1_up(:) &
     612                 :             : &       +kxc(ir,10)            *r1_dn(:) &
     613                 :             : &       +coeff_grho_up         *r0_up(:) &
     614         [ +  + ]:     6812196 : &       +coeff_grho_corr       *r0(:)
     615                 :             :        rho1now(ir,2,2:4)=(kxc(ir,5)+kxc(ir,10))*r1_dn(:) &
     616                 :             : &       +kxc(ir,10)            *r1_up(:) &
     617                 :             : &       +coeff_grho_dn         *r0_dn(:) &
     618         [ +  + ]:     6812379 : &       +coeff_grho_corr       *r0(:)
     619                 :             :      end do
     620                 :             :    end if ! nspden
     621                 :             : 
     622                 :             :  else ! if cplex==2
     623         [ +  + ]:        1397 :    if (nspden==1) then
     624         [ +  + ]:    13801437 :      do ir=1,nfft
     625         [ +  + ]:    55200320 :        r0(:)=kxc(ir,5:7)
     626         [ +  + ]:    55200320 :        r1(:)  =rho1now(2*ir-1,1,2:4)
     627         [ +  + ]:    55200320 :        r1im(:)=rho1now(2*ir  ,1,2:4)
     628         [ +  + ]:    55200320 :        gradrho_gradrho1  =dot_product(r0,r1)
     629         [ +  + ]:    55200320 :        gradrho_gradrho1im=dot_product(r0,r1im)
     630                 :    13800080 :        dnexcdn(2*ir-1,1)=kxc(ir,1)*rho1now(2*ir-1,1,1) + kxc(ir,3)*gradrho_gradrho1
     631                 :    13800080 :        dnexcdn(2*ir  ,1)=kxc(ir,1)*rho1now(2*ir  ,1,1) + kxc(ir,3)*gradrho_gradrho1im
     632                 :    13800080 :        coeff_grho  =kxc(ir,3)*rho1now(2*ir-1,1,1) + kxc(ir,4)*gradrho_gradrho1
     633                 :    13800080 :        coeffim_grho=kxc(ir,3)*rho1now(2*ir  ,1,1) + kxc(ir,4)*gradrho_gradrho1im
     634                 :             :   !    Reuse the storage in rho1now
     635         [ +  + ]:    55200320 :        rho1now(2*ir-1,1,2:4)=r1(:)  *kxc(ir,2)+r0(:)*coeff_grho
     636         [ +  + ]:    55201677 :        rho1now(2*ir  ,1,2:4)=r1im(:)*kxc(ir,2)+r0(:)*coeffim_grho
     637                 :             :      end do
     638                 :             :    else
     639         [ +  + ]:      233320 :      do ir=1,nfft
     640         [ +  + ]:      933120 :        do ii=1,3  ! grad of spin-up ans spin_dn GS rho
     641                 :      933120 :          r0_up(ii)=kxc(ir,13+2*ii);r0_dn(ii)=kxc(ir,12+2*ii)-kxc(ir,13+2*ii)
     642                 :             :        end do
     643         [ +  + ]:      933120 :        r0(:)=r0_up(:)+r0_dn(:)          ! grad of GS rho
     644         [ +  + ]:      933120 :        r1_up(:)=rho1now(2*ir-1,1,2:4)   ! grad of spin-up rho1
     645         [ +  + ]:      933120 :        r1im_up(:)=rho1now(2*ir,1,2:4)   ! grad of spin-up rho1 , im part
     646         [ +  + ]:      933120 :        r1_dn(:)=rho1now(2*ir-1,2,2:4)   ! grad of spin-down rho1
     647         [ +  + ]:      933120 :        r1im_dn(:)=rho1now(2*ir,2,2:4)   ! grad of spin-down rho1 , im part
     648         [ +  + ]:      933120 :        r1(:)=r1_up(:)+r1_dn(:)      ! grad of GS rho1
     649         [ +  + ]:      933120 :        r1im(:)=r1im_up(:)+r1im_dn(:)      ! grad of GS rho1, im part
     650         [ +  + ]:      933120 :        gradrho_gradrho1_up  =dot_product(r0_up,r1_up)
     651         [ +  + ]:      933120 :        gradrho_gradrho1_dn  =dot_product(r0_dn,r1_dn)
     652         [ +  + ]:      933120 :        gradrho_gradrho1     =dot_product(r0,r1)
     653         [ +  + ]:      933120 :        gradrho_gradrho1im_up=dot_product(r0_up,r1im_up)
     654         [ +  + ]:      933120 :        gradrho_gradrho1im_dn=dot_product(r0_dn,r1im_dn)
     655         [ +  + ]:      933120 :        gradrho_gradrho1im   =dot_product(r0,r1im)
     656                 :             :        dnexcdn(2*ir-1,1)=kxc(ir, 1)*rho1now(2*ir-1,1,1) &
     657                 :             : &       +kxc(ir, 2)*rho1now(2*ir-1,2,1) &
     658                 :             : &       +kxc(ir, 6)*gradrho_gradrho1_up &
     659                 :      233280 : &       +kxc(ir,11)*gradrho_gradrho1
     660                 :             :        dnexcdn(2*ir-1,2)=kxc(ir, 3)*rho1now(2*ir-1,2,1) &
     661                 :             : &       +kxc(ir, 2)*rho1now(2*ir-1,1,1) &
     662                 :             : &       +kxc(ir, 7)*gradrho_gradrho1_dn &
     663                 :      233280 : &       +kxc(ir,12)*gradrho_gradrho1
     664                 :             :        dnexcdn(2*ir  ,1)=kxc(ir, 1)*rho1now(2*ir  ,1,1) &
     665                 :             : &       +kxc(ir, 2)*rho1now(2*ir  ,2,1) &
     666                 :             : &       +kxc(ir, 6)*gradrho_gradrho1im_up &
     667                 :      233280 : &       +kxc(ir,11)*gradrho_gradrho1im
     668                 :             :        dnexcdn(2*ir  ,2)=kxc(ir, 3)*rho1now(2*ir  ,2,1) &
     669                 :             : &       +kxc(ir, 2)*rho1now(2*ir  ,1,1) &
     670                 :             : &       +kxc(ir, 7)*gradrho_gradrho1im_dn &
     671                 :      233280 : &       +kxc(ir,12)*gradrho_gradrho1im
     672                 :             :        coeff_grho_corr  =kxc(ir,11)*rho1now(2*ir-1,1,1) &
     673                 :             : &       +kxc(ir,12)*rho1now(2*ir-1,2,1) &
     674                 :      233280 : &       +kxc(ir,13)*gradrho_gradrho1
     675                 :             :        coeffim_grho_corr=kxc(ir,11)*rho1now(2*ir  ,1,1) &
     676                 :             : &       +kxc(ir,12)*rho1now(2*ir  ,2,1) &
     677                 :      233280 : &       +kxc(ir,13)*gradrho_gradrho1im
     678                 :      233280 :        coeff_grho_up  =kxc(ir,6)*rho1now(2*ir-1,1,1)+kxc(ir,8)*gradrho_gradrho1_up
     679                 :      233280 :        coeff_grho_dn  =kxc(ir,7)*rho1now(2*ir-1,2,1)+kxc(ir,9)*gradrho_gradrho1_dn
     680                 :      233280 :        coeffim_grho_up=kxc(ir,6)*rho1now(2*ir  ,1,1)+kxc(ir,8)*gradrho_gradrho1im_up
     681                 :      233280 :        coeffim_grho_dn=kxc(ir,7)*rho1now(2*ir  ,2,1)+kxc(ir,9)*gradrho_gradrho1im_dn
     682                 :             : !      Reuse the storage in rho1now
     683                 :             :        rho1now(2*ir-1,1,2:4)=(kxc(ir,4)+kxc(ir,10))*r1_up(:) &
     684                 :             : &       +kxc(ir,10)            *r1_dn(:) &
     685                 :             : &       +coeff_grho_up         *r0_up(:) &
     686         [ +  + ]:      933120 : &       +coeff_grho_corr*r0(:)
     687                 :             :        rho1now(2*ir-1,2,2:4)=(kxc(ir,5)+kxc(ir,10))*r1_dn(:) &
     688                 :             : &       +kxc(ir,10)            *r1_up(:) &
     689                 :             : &       +coeff_grho_dn         *r0_dn(:) &
     690         [ +  + ]:      933120 : &       +coeff_grho_corr*r0(:)
     691                 :             :        rho1now(2*ir  ,1,2:4)=(kxc(ir,4)+kxc(ir,10))*r1im_up(:) &
     692                 :             : &       +kxc(ir,10)            *r1im_dn(:) &
     693                 :             : &       +coeffim_grho_up       *r0_up(:)   &
     694         [ +  + ]:      933120 : &       +coeffim_grho_corr     *r0(:)
     695                 :             :        rho1now(2*ir  ,2,2:4)=(kxc(ir,5)+kxc(ir,10))*r1im_dn(:) &
     696                 :             : &       +kxc(ir,10)            *r1im_up(:) &
     697                 :             : &       +coeffim_grho_dn       *r0_dn(:)   &
     698         [ +  + ]:      933160 : &       +coeffim_grho_corr     *r0(:)
     699                 :             :      end do
     700                 :             :    end if ! nspden
     701                 :             : 
     702                 :             :  end if
     703                 :             : 
     704   [ +  +  +  + ]:   349933208 :  vxc1(:,:)=zero
     705                 :             :  call xcpot(cplex,gprimd,ishift,use_laplacian,mpi_enreg,nfft,ngfft,ngrad,nspden,&
     706                 :        5537 : & nspgrad,qphon,depsxc=dnexcdn,rhonow=rho1now,vxc=vxc1)
     707                 :             : 
     708                 :             : !call filterpot(paral_kgb,cplex,gmet,gsqcut,nfft,ngfft,nspden,qphon,vxc1)
     709                 :             : 
     710         [ -  + ]:        5537 :  ABI_FREE(dnexcdn)
     711         [ -  + ]:        5537 :  ABI_FREE(rho1now)
     712                 :             : 
     713                 :             :  DBG_EXIT("COLL")
     714                 :             : 
     715         [ -  + ]:        5537 : end subroutine dfpt_mkvxcgga
     716                 :             : !!***
     717                 :             : 
     718                 :             : !!****f* ABINIT/dfpt_mkvxc_noncoll
     719                 :             : !! NAME
     720                 :             : !! dfpt_mkvxc_noncoll
     721                 :             : !!
     722                 :             : !! FUNCTION
     723                 :             : !! Compute the first-order change of exchange-correlation potential
     724                 :             : !! due to atomic displacement for non-collinear spins: assemble the first-order
     725                 :             : !! density change with the frozen-core density change, then use
     726                 :             : !! the exchange-correlation kernel.
     727                 :             : !!
     728                 :             : !! INPUTS
     729                 :             : !!  cplex= if 1, real space 1-order functions on FFT grid are REAL,
     730                 :             : !!         if 2, COMPLEX
     731                 :             : !!  ixc= choice of exchange-correlation scheme
     732                 :             : !!  ixcrot= option for rotation of collinear spin potential to non collinear full matrix
     733                 :             : !!  kxc(nfft,nkxc)=exchange and correlation kernel (see rhotoxc.F90)
     734                 :             : !!  mpi_enreg=information about MPI parallelization
     735                 :             : !!  nfft=(effective) number of FFT grid points (for this processor)
     736                 :             : !!  ngfft(18)=contain all needed information about 3D FFT,
     737                 :             : !!     see ~abinit/doc/variables/vargs.htm#ngfft
     738                 :             : !!  nhat(nfft,nspden*nhatdim)= -PAW only- GS compensation density
     739                 :             : !!  nhatdim= -PAW only- 1 if nhat array is used ; 0 otherwise
     740                 :             : !!  nhat1(cplex*nfft,nspden*nhat1dim)= -PAW only- 1st-order compensation density
     741                 :             : !!  nhat1dim= -PAW only- 1 if nhat1 array is used ; 0 otherwise
     742                 :             : !!  nhat1gr(cplex*nfft,nspden,3*nhat1grdim)= -PAW only- gradients of 1st-order compensation density
     743                 :             : !!  nhat1grdim= -PAW only- 1 if nhat1gr array is used ; 0 otherwise
     744                 :             : !!  nkxc=second dimension of the kxc array
     745                 :             : !!  non_magnetic_xc= if true, handle density/potential as non-magnetic (even if it is)
     746                 :             : !!  nspden=number of spin-density components
     747                 :             : !!  n3xccc=dimension of xccc3d1 ; 0 if no XC core correction is used, otherwise, nfft
     748                 :             : !!  optnc=option for non-collinear magnetism (nspden=4):
     749                 :             : !!       1: the whole 2x2 Vres matrix is computed
     750                 :             : !!       2: only Vres^{11} and Vres^{22} are computed
     751                 :             : !!  option=if 0, work only with the XC core-correction,
     752                 :             : !!         if 1, treat both density change and XC core correction
     753                 :             : !!         if 2, treat only density change
     754                 :             : !!  qphon(3)=reduced coordinates for the phonon wavelength (needed if cplex==2).
     755                 :             : !!  rhor(nfft,nspden)=GS electron density in real space
     756                 :             : !!  rhor1(cplex*nfft,nspden)=1st-order electron density in real space
     757                 :             : !!  rprimd(3,3)=dimensional primitive translations in real space (bohr)
     758                 :             : !!  usexcnhat= -PAW only- 1 if nhat density has to be taken into account in Vxc
     759                 :             : !!  vxc(nfft,nspden)=GS XC potential
     760                 :             : !!
     761                 :             : !!
     762                 :             : !! OUTPUT
     763                 :             : !!  vxc1(cplex*nfft,nspden)=change in exchange-correlation potential (including
     764                 :             : !!   core-correction, if applicable)
     765                 :             : !!
     766                 :             : !! SOURCE
     767                 :             : 
     768                 :        1086 : subroutine dfpt_mkvxc_noncoll(cplex,ixc,kxc,mpi_enreg,nfft,ngfft,nhat,nhatdim,nhat1,nhat1dim,&
     769                 :        1086 : &          nhat1gr,nhat1grdim,nkxc,non_magnetic_xc,nspden,n3xccc,optnc,option,qphon,&
     770                 :        1086 : &          rhor,rhor1,rprimd,usexcnhat,vxc,vxc1,xccc3d1,ixcrot)
     771                 :             : 
     772                 :             : !Arguments ------------------------------------
     773                 :             : !scalars
     774                 :             :  integer,intent(in) :: cplex,ixc,n3xccc,nfft,nhatdim,nhat1dim,nhat1grdim,optnc
     775                 :             :  integer,intent(in) :: nkxc,nspden,option,usexcnhat
     776                 :             :  logical,intent(in) :: non_magnetic_xc
     777                 :             :  type(MPI_type),intent(in) :: mpi_enreg
     778                 :             : !arrays
     779                 :             :  integer,intent(in) :: ngfft(18)
     780                 :             :  real(dp),intent(in) :: nhat1gr(cplex*nfft,nspden,3*nhat1grdim)
     781                 :             :  real(dp),intent(in) :: kxc(nfft,nkxc)
     782                 :             :  real(dp),intent(in) :: vxc(nfft,nspden)
     783                 :             :  real(dp),intent(in) :: nhat(nfft,nspden*nhatdim),nhat1(cplex*nfft,nspden*nhat1dim)
     784                 :             :  real(dp),intent(in),target :: rhor(nfft,nspden),rhor1(cplex*nfft,nspden)
     785                 :             :  real(dp),intent(in) :: qphon(3),rprimd(3,3),xccc3d1(cplex*n3xccc)
     786                 :             :  real(dp),intent(out) :: vxc1(cplex*nfft,nspden)
     787                 :             :  integer,optional,intent(in) :: ixcrot
     788                 :             : !Local variables-------------------------------
     789                 :             : !scalars
     790                 :             : !arrays
     791                 :             :  real(dp) :: nhat1_zero(0,0),nhat1gr_zero(0,0,0),tsec(2)
     792                 :        1086 :  real(dp),allocatable :: m_norm(:),rhor1_diag(:,:),vxc1_diag(:,:)
     793                 :        1086 :  real(dp), contiguous, pointer :: mag(:,:),rhor_(:,:),rhor1_(:,:)
     794                 :             : ! *************************************************************************
     795                 :             : 
     796                 :             : !  Non-collinear magnetism
     797                 :             : !  Has to locally "rotate" rho(r)^(1) (according to magnetization),
     798                 :             : !  Compute Vxc(r)^(1) in the spin frame aligned with \vec{m} and rotate it back
     799                 :             : 
     800                 :             :  DBG_ENTER("COLL")
     801                 :             :  ABI_UNUSED(nhat1gr)
     802                 :             : 
     803                 :        1086 :  call timab(181,1,tsec)
     804                 :             : 
     805         [ -  + ]:        1086 :  if(nspden/=4) then
     806                 :           0 :    ABI_BUG('only for nspden=4!')
     807                 :             :  end if
     808                 :             : 
     809         [ -  + ]:        1086 :  if(nkxc/=2*min(nspden,2)-1) then
     810                 :           0 :    ABI_BUG('nspden=4 works only with LSDA.')
     811                 :             :  end if
     812                 :             : 
     813                 :             : !Special case: no XC applied
     814   [ +  -  -  + ]:        1086 :  if (ixc==0.or.nkxc==0) then
     815                 :           0 :    ABI_WARNING('Note that no xc is applied (ixc=0)')
     816   [ #  #  #  # ]:           0 :    vxc1(:,:)=zero
     817                 :             :    return
     818                 :             :  end if
     819                 :             : 
     820                 :             : 
     821                 :             : 
     822                 :             : !Treat first LDA
     823         [ +  - ]:        1086 :  if(nkxc==1.or.nkxc==3)then
     824                 :             : 
     825   [ +  +  +  + ]:    32038638 :    vxc1(:,:)=zero
     826                 :             : 
     827                 :             : !  PAW: possibly substract compensation density
     828   [ +  +  +  -  :        1086 :    if ((usexcnhat==0.and.nhatdim==1).or.(non_magnetic_xc)) then
                   +  + ]
     829   [ -  +  +  -  :          40 :      ABI_MALLOC(rhor_,(nfft,nspden))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     830   [ -  +  -  - ]:          10 :      if (usexcnhat==0.and.nhatdim==1) then
     831   [ #  #  #  #  :           0 :        rhor_(:,:) =rhor(:,:)-nhat(:,:)
          #  #  #  #  #  
                      # ]
     832                 :             :      else
     833   [ +  -  +  +  :     1106010 :        rhor_(:,:) =rhor(:,:)
          +  +  +  +  +  
                      + ]
     834                 :             :      end if
     835         [ +  - ]:          10 :      if (non_magnetic_xc) then
     836   [ -  +  -  - ]:          10 :        if(nspden==2) rhor_(:,2)=rhor_(:,1)*half
     837   [ +  -  +  +  :      414760 :        if(nspden==4) rhor_(:,2:4)=zero
                   +  + ]
     838                 :             :      end if
     839                 :             :    else
     840                 :        1076 :      rhor_ => rhor
     841                 :             :    end if
     842   [ +  +  +  -  :        1086 :    if ((usexcnhat==0.and.nhat1dim==1).or.(non_magnetic_xc)) then
                   +  + ]
     843   [ -  +  +  -  :          40 :      ABI_MALLOC(rhor1_,(cplex*nfft,nspden))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     844   [ -  +  -  - ]:          10 :      if (usexcnhat==0.and.nhatdim==1) then
     845   [ #  #  #  #  :           0 :        rhor1_(:,:)=rhor1(:,:)-nhat1(:,:)
          #  #  #  #  #  
                      # ]
     846                 :             :      else
     847   [ +  -  +  +  :     1106010 :        rhor1_(:,:)=rhor1(:,:)
          +  +  +  +  +  
                      + ]
     848                 :             :      end if
     849         [ +  - ]:          10 :      if (non_magnetic_xc) then
     850   [ -  +  -  - ]:          10 :        if(nspden==2) rhor1_(:,2)=rhor1_(:,1)*half
     851   [ +  -  +  +  :      414760 :        if(nspden==4) rhor1_(:,2:4)=zero
                   +  + ]
     852                 :             :      end if
     853                 :             :    else
     854                 :        1076 :      rhor1_ => rhor1
     855                 :             :    end if
     856                 :             : 
     857                 :             : !  Magnetization
     858                 :        1086 :    mag => rhor_(:,2:4)
     859   [ -  +  +  -  :        3258 :    ABI_MALLOC(rhor1_diag,(cplex*nfft,2))
          +  -  +  -  -  
                +  -  + ]
     860   [ -  +  +  -  :        2172 :    ABI_MALLOC(vxc1_diag,(cplex*nfft,2))
             -  +  -  + ]
     861   [ -  +  +  -  :        3258 :    ABI_MALLOC(m_norm,(nfft))
          +  -  +  -  -  
                +  -  + ]
     862                 :             : 
     863                 :             : !  -- Rotate rho(r)^(1)
     864                 :             : !  SPr: for option=0 the rhor is not used, only core density xccc3d1
     865                 :             : !       rotate_mag is only to compute the m_norm
     866                 :             :    call rotate_mag(rhor1_,rhor1_diag,mag,nfft,cplex,mag_norm_out=m_norm,&
     867                 :        1086 : &   rho_out_format=2)
     868                 :             : 
     869                 :             : !  -- Compute Vxc(r)^(1)=Kxc(r).rho(r)^(1)_rotated
     870                 :             : !  Note for PAW: nhat has already been substracted; don't use it in dfpt_mkvxc
     871                 :             : !                 (put all nhat options to zero).
     872                 :             : !  The collinear routine dfpt_mkvxc wants a general density built as (tr[rho],rho_upup)
     873                 :             :    call dfpt_mkvxc(cplex,ixc,kxc,mpi_enreg,nfft,ngfft,nhat1_zero,0,nhat1gr_zero,0,&
     874                 :        1086 : &   nkxc,non_magnetic_xc,2,n3xccc,option,qphon,rhor1_diag,rprimd,0,vxc1_diag,xccc3d1)
     875                 :             : 
     876                 :             :    !call test_rotations(0,1)
     877                 :             : 
     878                 :             : !  -- Rotate back Vxc(r)^(1)
     879         [ +  + ]:        1086 :    if (optnc==1) then
     880         [ +  - ]:         997 :      if(present(ixcrot)) then
     881                 :             :        call rotate_back_mag_dfpt(option,vxc1_diag,vxc1,vxc,kxc,rhor1_,mag,nfft,cplex,&
     882                 :         997 : &       mag_norm_in=m_norm,rot_method=ixcrot)
     883                 :             :      else
     884                 :             :        call rotate_back_mag_dfpt(option,vxc1_diag,vxc1,vxc,kxc,rhor1_,mag,nfft,cplex,&
     885                 :           0 : &       mag_norm_in=m_norm)
     886                 :             :      end if
     887                 :             :    else
     888                 :          89 :      call rotate_back_mag(vxc1_diag,vxc1,mag,nfft,mag_norm_in=m_norm)
     889   [ +  +  +  + ]:     1817961 :      vxc1(:,3:4)=zero
     890                 :             :    end if
     891                 :             : 
     892         [ -  + ]:        1086 :    ABI_FREE(rhor1_diag)
     893         [ -  + ]:        1086 :    ABI_FREE(vxc1_diag)
     894         [ -  + ]:        1086 :    ABI_FREE(m_norm)
     895   [ +  +  +  -  :        1086 :    if ((usexcnhat==0.and.nhatdim==1).or.(non_magnetic_xc)) then
                   +  + ]
     896         [ -  + ]:          10 :      ABI_FREE(rhor_)
     897                 :             :    end if
     898   [ +  +  +  -  :        1086 :    if ((usexcnhat==0.and.nhat1dim==1).or.(non_magnetic_xc)) then
                   +  + ]
     899         [ -  + ]:          10 :      ABI_FREE(rhor1_)
     900                 :             :    end if
     901                 :             : 
     902                 :             :  end if ! nkxc=1 or nkxc=3
     903                 :             : 
     904                 :        1086 :  call timab(181,2,tsec)
     905                 :             : 
     906                 :             :  DBG_EXIT("COLL")
     907                 :             : 
     908                 :        1086 : end subroutine dfpt_mkvxc_noncoll
     909                 :             : !!***
     910                 :             : 
     911                 :             : !!****f* ABINIT/dfpt_mkvxcggadq
     912                 :             : !! NAME
     913                 :             : !! dfpt_mkvxcggadq
     914                 :             : !!
     915                 :             : !! FUNCTION
     916                 :             : !! Compute the first-order change of exchange-correlation potential
     917                 :             : !! in case of GGA functionals
     918                 :             : !! Use the q-gradient (Cartesian) of the exchange-correlation kernel.
     919                 :             : !!
     920                 :             : !! INPUTS
     921                 :             : !!  cplex= if 1, real space 1-order functions on FFT grid are REAL,
     922                 :             : !!    if 2, COMPLEX
     923                 :             : !!  gmet(3,3)=metrix tensor in G space in Bohr**-2.
     924                 :             : !!  gprimd(3,3)=dimensional primitive translations in reciprocal space (bohr^-1)
     925                 :             : !!  gsqcut=cutoff value on G**2 for sphere inside fft box.
     926                 :             : !!  kxc(nfft,nkxc)=exchange and correlation kernel (see below)
     927                 :             : !!  mpi_enreg=information about MPI parallelization
     928                 :             : !!  nfft=(effective) number of FFT grid points (for this processor)
     929                 :             : !!  ngfft(18)=contain all needed information about 3D FFT
     930                 :             : !!  nkxc=second dimension of the kxc array
     931                 :             : !!  nspden=number of spin-density components
     932                 :             : !!  qdirc= indicates the Cartesian direction of the q-gradient (1,2 or 3)
     933                 :             : !!  rhor1tmp(cplex*nfft,2)=array for first-order electron spin-density
     934                 :             : !!   in electrons/bohr**3 (second index corresponds to spin-up and spin-down)
     935                 :             : !!
     936                 :             : !! OUTPUT
     937                 :             : !!  vxc1(2*nfft,nspden)=change in exchange-correlation potential
     938                 :             : !!
     939                 :             : !! NOTES
     940                 :             : !!  For the time being, a rather crude coding, to be optimized ...
     941                 :             : !!  Content of Kxc array:
     942                 :             : !!  Only works with nspden=1
     943                 :             : !!   ===== if GGA
     944                 :             : !!    if nspden==1:
     945                 :             : !!       kxc(:,1)= d2Exc/drho2
     946                 :             : !!       kxc(:,2)= 1/|grad(rho)| dExc/d|grad(rho)|
     947                 :             : !!       kxc(:,3)= 1/|grad(rho)| d2Exc/d|grad(rho)| drho
     948                 :             : !!       kxc(:,4)= 1/|grad(rho)| * d/d|grad(rho)| ( 1/|grad(rho)| dExc/d|grad(rho)| )
     949                 :             : !!       kxc(:,5)= gradx(rho)
     950                 :             : !!       kxc(:,6)= grady(rho)
     951                 :             : !!       kxc(:,7)= gradz(rho)
     952                 :             : !!
     953                 :             : !! SOURCE
     954                 :             : 
     955                 :         669 : subroutine dfpt_mkvxcggadq(cplex,gprimd,kxc,mpi_enreg,nfft,ngfft,&
     956                 :         669 : &                    nkxc,nspden,qdirc,rhor1,vxc1)
     957                 :             : 
     958                 :             : !Arguments ------------------------------------
     959                 :             : !scalars
     960                 :             :  integer,intent(in) :: cplex,nfft,nkxc,nspden,qdirc
     961                 :             :  type(MPI_type),intent(in) :: mpi_enreg
     962                 :             : !arrays
     963                 :             :  integer,intent(in) :: ngfft(18)
     964                 :             :  real(dp),intent(in) :: gprimd(3,3)
     965                 :             :  real(dp),intent(in) :: kxc(nfft,nkxc)
     966                 :             :  real(dp),intent(in),target :: rhor1(cplex*nfft,nspden)
     967                 :             :  real(dp),intent(out) :: vxc1(2*nfft,nspden)
     968                 :             : 
     969                 :             : !Local variables-------------------------------
     970                 :             : !scalars
     971                 :             :  integer :: ii,ir,ishift,ngrad,nspgrad
     972                 :             :  real(dp) :: gradrho_gradrho1
     973                 :             :  !character(len=500) :: msg
     974                 :             : !arrays
     975                 :             :  real(dp) :: qphon(3)
     976                 :             :  real(dp) :: r0(3),r1(3)
     977                 :         669 :  real(dp),allocatable :: ar1(:,:)
     978                 :         669 :  real(dp),allocatable :: a_gradi_r1(:,:)
     979                 :         669 :  real(dp),allocatable :: dadgradn_t1(:,:,:),dadgradn_t2(:,:)
     980                 :         669 :  real(dp),allocatable :: rho1now(:,:,:)
     981                 :         669 :  real(dp),contiguous, pointer :: rhor1_ptr(:,:)
     982                 :             : ! *************************************************************************
     983                 :             : 
     984                 :             :  DBG_EXIT("COLL")
     985                 :             : 
     986                 :         669 :  if (nkxc/=7) then
     987                 :           0 :    ABI_BUG('Wrong nkxc value for GGA in the longwave driver (optdriver=10)!')
     988                 :             :  end if
     989                 :             : 
     990                 :             : !Compute the gradients of the first-order density
     991                 :             : !rho1now(:,:,1) contains the first-order density, and
     992                 :             : !rho1now(:,:,2:4) contains the gradients of the first-order density
     993                 :         669 :  ishift=0 ; ngrad=2
     994                 :         669 :  qphon(:)=zero
     995                 :         669 :  rhor1_ptr => rhor1
     996   [ -  +  +  -  :        3345 :  ABI_MALLOC(rho1now,(cplex*nfft,nspden,ngrad*ngrad))
          -  +  +  -  +  
          -  +  -  +  -  
             -  +  -  + ]
     997                 :         669 :  call xcden(cplex,gprimd,ishift,mpi_enreg,nfft,ngfft,ngrad,nspden,qphon,rhor1_ptr,rho1now)
     998                 :             : 
     999                 :             : !Apply the XC kernel
    1000                 :         669 :  nspgrad=1
    1001   [ -  +  +  -  :        2007 :  ABI_MALLOC(ar1,(cplex*nfft,nspgrad))
          +  -  +  -  -  
                +  -  + ]
    1002   [ -  +  +  -  :        1338 :  ABI_MALLOC(a_gradi_r1,(cplex*nfft,nspgrad))
             -  +  -  + ]
    1003   [ -  +  +  -  :        2676 :  ABI_MALLOC(dadgradn_t1,(cplex*nfft,nspgrad,3))
          +  -  +  -  +  
             -  -  +  -  
                      + ]
    1004   [ -  +  +  -  :        1338 :  ABI_MALLOC(dadgradn_t2,(cplex*nfft,nspgrad))
             -  +  +  - ]
    1005         [ +  + ]:     2362368 :  do ir=1,nfft
    1006   [ +  +  +  + ]:    16531893 :    r0(:)=kxc(ir,5:7); r1(:)=rho1now(ir,1,2:4)
    1007         [ +  + ]:     9446796 :    gradrho_gradrho1=dot_product(r0,r1)
    1008                 :     2361699 :    ar1(ir,1)=kxc(ir,2)*rho1now(ir,1,1)
    1009                 :     2361699 :    a_gradi_r1(ir,1)=kxc(ir,2)*r1(qdirc)
    1010                 :     2361699 :    dadgradn_t2(ir,1)=kxc(ir,4)*gradrho_gradrho1*r0(qdirc)
    1011         [ +  + ]:     9447465 :    dadgradn_t1(ir,1,:)=kxc(ir,4)*r0(:)*r0(qdirc)*rho1now(ir,1,1)
    1012                 :             :  end do
    1013         [ +  + ]:        2676 :  do ii=1,3
    1014   [ +  +  +  + ]:     2364375 :    if (ii==qdirc) dadgradn_t1(:,1,ii)=dadgradn_t1(:,1,ii)+ar1(:,1)
    1015                 :             :  end do
    1016                 :             : 
    1017                 :             : !Incorporate the terms that do not need further treatment
    1018                 :             : !(a -i factor is applied here)
    1019         [ +  + ]:     2362368 :  do ir=1,nfft
    1020                 :     2361699 :    ii=2*ir
    1021                 :     2361699 :    vxc1(ii-1,1)=zero
    1022                 :     2362368 :    vxc1(ii,1)= -a_gradi_r1(ir,1) -dadgradn_t2(ir,1)
    1023                 :             :  end do
    1024         [ -  + ]:         669 :  ABI_FREE(rho1now)
    1025         [ -  + ]:         669 :  ABI_FREE(a_gradi_r1)
    1026         [ -  + ]:         669 :  ABI_FREE(dadgradn_t2)
    1027         [ -  + ]:         669 :  ABI_FREE(ar1)
    1028                 :             : 
    1029                 :             : !Now the term whose sum over real-space derivatives has to be computed
    1030                 :             :  call xcpotdq(dadgradn_t1,cplex,gprimd,ishift,mpi_enreg,nfft, &
    1031                 :         669 : & ngfft,ngrad,nspden,nspgrad,vxc1)
    1032                 :             : 
    1033         [ -  + ]:         669 :  ABI_FREE(dadgradn_t1)
    1034                 :             : 
    1035         [ -  + ]:         669 : end subroutine dfpt_mkvxcggadq
    1036                 :             : !!***
    1037                 :             : 
    1038                 :             : !!****f* ABINIT/dfpt_mkvxcgga_n0met
    1039                 :             : !! NAME
    1040                 :             : !! dfpt_mkvxcgga_n0met
    1041                 :             : !!
    1042                 :             : !! FUNCTION
    1043                 :             : !! Compute the contribution to the second q-gradient of the metric
    1044                 :             : !! perturbation that comes from gga XC potentials and depends only
    1045                 :             : !! on ground state rho
    1046                 :             : !!
    1047                 :             : !! INPUTS
    1048                 :             : !!  beta= indicates the Cartesian direction of the metric perturbation
    1049                 :             : !!  cplex= if 1, real space 1-order functions on FFT grid are REAL,
    1050                 :             : !!    if 2, COMPLEX
    1051                 :             : !!  delta= indicates the Cartesian direction of the first q-gradient
    1052                 :             : !!  gamma= indicates the Cartesian direction of the second q-gradient
    1053                 :             : !!  gmet(3,3)=metrix tensor in G space in Bohr**-2.
    1054                 :             : !!  gprimd(3,3)=dimensional primitive translations in reciprocal space (bohr^-1)
    1055                 :             : !!  gsqcut=cutoff value on G**2 for sphere inside fft box.
    1056                 :             : !!  kxc(nfft,nkxc)=exchange and correlation kernel (see below)
    1057                 :             : !!  mpi_enreg=information about MPI parallelization
    1058                 :             : !!  nfft=(effective) number of FFT grid points (for this processor)
    1059                 :             : !!  ngfft(18)=contain all needed information about 3D FFT
    1060                 :             : !!  nkxc=second dimension of the kxc array
    1061                 :             : !!  nspden=number of spin-density components
    1062                 :             : !!  rho(cplex*nfft,2)=array for ground-state electron spin-density
    1063                 :             : !!   in electrons/bohr**3 (second index corresponds to spin-up and spin-down)
    1064                 :             : !!
    1065                 :             : !! OUTPUT
    1066                 :             : !!  vxc1(2*nfft,nspden)=change in exchange-correlation potential
    1067                 :             : !!
    1068                 :             : !! NOTES
    1069                 :             : !!  For the time being, a rather crude coding, to be optimized ...
    1070                 :             : !!  Content of Kxc array:
    1071                 :             : !!  Only works with nspden=1
    1072                 :             : !!   ===== if GGA
    1073                 :             : !!    if nspden==1:
    1074                 :             : !!       kxc(:,1)= d2Exc/drho2
    1075                 :             : !!       kxc(:,2)= 1/|grad(rho)| dExc/d|grad(rho)|
    1076                 :             : !!       kxc(:,3)= 1/|grad(rho)| d2Exc/d|grad(rho)| drho
    1077                 :             : !!       kxc(:,4)= 1/|grad(rho)| * d/d|grad(rho)| ( 1/|grad(rho)| dExc/d|grad(rho)| )
    1078                 :             : !!       kxc(:,5)= gradx(rho)
    1079                 :             : !!       kxc(:,6)= grady(rho)
    1080                 :             : !!       kxc(:,7)= gradz(rho)
    1081                 :             : !!
    1082                 :             : !! SOURCE
    1083                 :             : 
    1084                 :         243 : subroutine dfpt_mkvxcgga_n0met(beta,cplex,delta,gamma,gprimd,kxc,mpi_enreg,nfft,ngfft,&
    1085                 :         243 : &                    nkxc,nspden,rhor,vxc1)
    1086                 :             : 
    1087                 :             : !Arguments ------------------------------------
    1088                 :             : !scalars
    1089                 :             :  integer,intent(in) :: beta,cplex,delta,gamma,nfft,nkxc,nspden
    1090                 :             :  type(MPI_type),intent(in) :: mpi_enreg
    1091                 :             : !arrays
    1092                 :             :  integer,intent(in) :: ngfft(18)
    1093                 :             :  real(dp),intent(in) :: gprimd(3,3)
    1094                 :             :  real(dp),intent(in) :: kxc(nfft,nkxc)
    1095                 :             :  real(dp),intent(in),target :: rhor(cplex*nfft,nspden)
    1096                 :             :  real(dp),intent(out) :: vxc1(2*nfft,nspden)
    1097                 :             : 
    1098                 :             : !Local variables-------------------------------
    1099                 :             : !scalars
    1100                 :             :  integer :: alpha,ii,ir,ishift,ngrad,nspgrad
    1101                 :             :  real(dp) :: delag,delad,delbd,delbg,deldg
    1102                 :             :  real(dp) :: gmodsq
    1103                 :             :  character(len=500) :: msg
    1104                 :             : !arrays
    1105                 :             :  real(dp) :: r0(3)
    1106                 :         243 :  real(dp),allocatable :: dadgg(:,:),dadgtgn(:,:),gna(:,:),dadgngn_1(:,:),dadgngn_2(:,:)
    1107                 :         243 :  real(dp),allocatable :: dadgngn(:,:,:),kro_an(:,:,:),sumgrad(:,:,:)
    1108                 :             : ! *************************************************************************
    1109                 :             : 
    1110                 :             :  DBG_EXIT("COLL")
    1111                 :             : 
    1112         [ -  + ]:         243 :  if (nkxc/=7) then
    1113                 :           0 :    msg='Wrong nkxc value for GGA in the longwave driver (optdriver=10)!'
    1114                 :           0 :    ABI_BUG(msg)
    1115                 :             :  end if
    1116                 :             : 
    1117                 :             : !Kronecker deltas
    1118                 :         243 :  delbd=0.0_dp; delbg=0.0_dp; deldg=0.0_dp
    1119         [ +  + ]:         243 :  if (beta==delta) delbd=1.0_dp
    1120         [ +  + ]:         243 :  if (beta==gamma) delbg=1.0_dp
    1121         [ +  + ]:         243 :  if (delta==gamma) deldg=1.0_dp
    1122                 :             : 
    1123                 :             : !Apply the XC kernel
    1124                 :         243 :  nspgrad=1
    1125   [ -  +  +  -  :         729 :  ABI_MALLOC(dadgg,(cplex*nfft,nspgrad))
          +  -  +  -  -  
                +  -  + ]
    1126   [ -  +  +  -  :         486 :  ABI_MALLOC(dadgtgn,(cplex*nfft,nspgrad))
             -  +  -  + ]
    1127   [ -  +  +  -  :         486 :  ABI_MALLOC(gna,(cplex*nfft,nspgrad))
             -  +  -  + ]
    1128   [ -  +  +  -  :         486 :  ABI_MALLOC(dadgngn_1,(cplex*nfft,nspgrad))
             -  +  -  + ]
    1129   [ -  +  +  -  :         486 :  ABI_MALLOC(dadgngn_2,(cplex*nfft,nspgrad))
             -  +  +  - ]
    1130         [ +  + ]:      820368 :  do ir=1,nfft
    1131         [ +  + ]:     3280500 :    r0(:)=kxc(ir,5:7)
    1132                 :      820125 :    gmodsq=r0(1)**2+r0(2)**2+r0(3)**2
    1133                 :      820125 :    dadgg(ir,1)=kxc(ir,4)*gmodsq*(delbd*r0(gamma)+delbg*r0(delta))
    1134                 :      820125 :    dadgtgn(ir,1)=two*kxc(ir,4)*r0(beta)*r0(delta)*r0(gamma)
    1135                 :      820125 :    gna(ir,1)=(delbg*r0(delta)+delbd*r0(gamma)+two*deldg*r0(beta))*kxc(ir,2)
    1136                 :      820125 :    dadgngn_1(ir,1)=delbd*kxc(ir,4)*rhor(ir,1)*r0(gamma)
    1137                 :      820368 :    dadgngn_2(ir,1)=delbg*kxc(ir,4)*rhor(ir,1)*r0(delta)
    1138                 :             :  end do
    1139                 :             : 
    1140                 :             : !Incorporate the terms that do not need further treatment
    1141         [ +  + ]:      820368 :  do ir=1,nfft
    1142                 :      820125 :    ii=2*ir
    1143                 :      820125 :    vxc1(ii-1,1)= -dadgg(ir,1)-dadgtgn(ir,1)-gna(ir,1)
    1144                 :      820368 :    vxc1(ii,1)= zero
    1145                 :             :  end do
    1146         [ -  + ]:         243 :  ABI_FREE(dadgg)
    1147         [ -  + ]:         243 :  ABI_FREE(dadgtgn)
    1148         [ -  + ]:         243 :  ABI_FREE(gna)
    1149                 :             : 
    1150                 :             : !Build the last term whose gradient needs to be computed
    1151   [ -  +  +  -  :         972 :  ABI_MALLOC(dadgngn,(cplex*nfft,nspgrad,3))
          +  -  +  -  +  
             -  -  +  -  
                      + ]
    1152   [ -  +  +  -  :         486 :  ABI_MALLOC(kro_an,(cplex*nfft,nspgrad,3))
             -  +  -  + ]
    1153   [ -  +  +  -  :         486 :  ABI_MALLOC(sumgrad,(cplex*nfft,nspgrad,3))
             -  +  +  - ]
    1154         [ +  + ]:         972 :  do alpha=1,3
    1155                 :         729 :    delad=0.0_dp; delag=0.0_dp
    1156         [ +  + ]:         729 :    if (alpha==delta) delad=1.0_dp
    1157         [ +  + ]:         729 :    if (alpha==gamma) delag=1.0_dp
    1158         [ +  + ]:     2461347 :    do ir=1,nfft
    1159         [ +  + ]:     9841500 :      r0(:)=kxc(ir,5:7)
    1160                 :     2460375 :      dadgngn(ir,1,alpha)=(dadgngn_1(ir,1)+dadgngn_2(ir,1))*r0(alpha)
    1161                 :     2460375 :      kro_an(ir,1,alpha)=(delbd*delag+delbg*delad)*rhor(ir,1)*kxc(ir,2)
    1162                 :     2461104 :      sumgrad(ir,1,alpha)=dadgngn(ir,1,alpha)+kro_an(ir,1,alpha)
    1163                 :             :    end do
    1164                 :             :  end do
    1165                 :             : 
    1166         [ -  + ]:         243 :  ABI_FREE(dadgngn_1)
    1167         [ -  + ]:         243 :  ABI_FREE(dadgngn_2)
    1168         [ -  + ]:         243 :  ABI_FREE(dadgngn)
    1169         [ -  + ]:         243 :  ABI_FREE(kro_an)
    1170                 :             : 
    1171                 :             : !Now the term whose sum over real-space derivatives has to be computed.
    1172                 :             : !(Use the same routine as in the q-gradient of the XC kernel. It saves
    1173                 :             : ! the gradient sum in the imaginary part of vxc1 and includes an additional
    1174                 :             : ! two_pi factor. Need to fix this after the call.)
    1175                 :         243 :  ishift=0 ; ngrad=2
    1176                 :             :  call xcpotdq(sumgrad,cplex,gprimd,ishift,mpi_enreg,nfft, &
    1177                 :         243 : & ngfft,ngrad,nspden,nspgrad,vxc1)
    1178                 :             : 
    1179         [ +  + ]:      820368 :  do ir=1,nfft
    1180                 :      820125 :    ii=2*ir
    1181                 :      820125 :    vxc1(ii-1,1)=vxc1(ii-1,1)+vxc1(ii,1)/two_pi
    1182                 :      820368 :    vxc1(ii,1)=zero
    1183                 :             :  end do
    1184                 :             : 
    1185                 :             : 
    1186         [ -  + ]:         243 :  ABI_FREE(sumgrad)
    1187                 :             : 
    1188                 :         243 : end subroutine dfpt_mkvxcgga_n0met
    1189                 :             : !!***
    1190                 :             : 
    1191                 :             : !!****f* ABINIT/dfpt_mkvxcccdq
    1192                 :             : !! NAME
    1193                 :             : !!  dfpt_mkvxcccdq
    1194                 :             : !!
    1195                 :             : !! FUNCTION
    1196                 :             : !!  Computes the first q-gradient of the first-order exchange-correlation potential
    1197                 :             : !!  due to the  pseudocore density.
    1198                 :             : !!
    1199                 :             : !! INPUTS
    1200                 :             : !!  cplex= if 1, real space 1-order functions on FFT grid are REAL,
    1201                 :             : !!         if 2, COMPLEX
    1202                 :             : !!  i3dir= reduced direction of the q-gradient
    1203                 :             : !!  ixc= choice of exchange-correlation scheme
    1204                 :             : !!  gmet(3,3)=reciprocal space metric tensor in bohr**-2
    1205                 :             : !!  gprimd(3,3)=reciprocal space dimensional primitive translations
    1206                 :             : !!  kxc(nfft,nkxc)=exchange and correlation kernel
    1207                 :             : !!  mpi_enreg=information about MPI parallelization
    1208                 :             : !!  nfft=(effective) number of FFT grid points (for this processor)
    1209                 :             : !!  ngfft(1:18)=integer array with FFT box dimensions and other
    1210                 :             : !!  nspden=number of spin-density components
    1211                 :             : !!  nkxc=second dimension of the kxc array. If /=0, the XC kernel must be computed.
    1212                 :             : !!  qphon(3)=reduced coordinates for the phonon wavelength (needed if cplex==2).
    1213                 :             : !!  rprimd(3,3)=dimensional primitive translations in real space (bohr)
    1214                 :             : !!  xccc3d1(cplex*nfft)=3D change in core charge density
    1215                 :             : !!  xccc3d1dq(2*nfft)=q_i3dir-gradient of 3D change in core charge density
    1216                 :             : !!
    1217                 :             : !! OUTPUT
    1218                 :             : !!  vxccc1dq(2*nfft,nspden)= q-gradient of first-order XC potential due to pseudocore charge
    1219                 :             : !!
    1220                 :             : !! SOURCE
    1221                 :             : 
    1222                 :          27 : subroutine dfpt_mkvxcccdq(cplex,i3dir,ixc,gprimd,kxc,mpi_enreg,nfft, &
    1223                 :          27 : & ngfft,nkxc,nspden,qphon,rprimd,vxccc1dq,xccc3d1,xccc3d2dq)
    1224                 :             : 
    1225                 :             : !Arguments ------------------------------------
    1226                 :             :  !scalars
    1227                 :             :  integer , intent(in)  :: cplex,i3dir,ixc,nfft,nkxc,nspden
    1228                 :             :  type(MPI_type),intent(inout) :: mpi_enreg
    1229                 :             : 
    1230                 :             :  !arrays
    1231                 :             :  integer,intent(in) :: ngfft(18)
    1232                 :             :  real(dp), intent(in)  :: gprimd(3,3)
    1233                 :             :  real(dp), intent(in)  :: kxc(nfft,nkxc)
    1234                 :             :  real(dp), intent(in)  :: qphon(3),rprimd(3,3)
    1235                 :             :  real(dp), intent(in)  :: xccc3d1(cplex*nfft)
    1236                 :             :  real(dp), intent(in)  :: xccc3d2dq(2*nfft)
    1237                 :             :  real(dp), intent(out) :: vxccc1dq(2*nfft,nspden)
    1238                 :             : 
    1239                 :             : !Local variables-------------------------------
    1240                 :             :  !scalars
    1241                 :             :  integer :: ii,ispden,ir,jj,nhat1grdim,option,qcar,usexcnhat,usepaw
    1242                 :             :  real(dp) :: spin_scale
    1243                 :             :  logical :: non_magnetic_xc
    1244                 :             :  !arrays
    1245                 :          27 :  real(dp),allocatable :: nhat1(:,:),nhat1gr(:,:,:)
    1246                 :          27 :  real(dp),allocatable :: rhor1(:,:), rhor1_cplx(:,:)
    1247                 :          27 :  real(dp),allocatable :: vxc1dq_a(:,:),vxc1dq_b(:,:),vxc1dq_car(:,:,:)
    1248                 :             : ! *************************************************************************
    1249                 :             : 
    1250                 :             :  DBG_ENTER("COLL")
    1251                 :             : 
    1252   [ +  +  +  + ]:      244662 :  vxccc1dq= zero
    1253                 :             : 
    1254                 :             : !If GGA xc first calculate the contribution from the q gradient of the xc potential
    1255         [ +  + ]:          27 :  if (nkxc == 7) then
    1256                 :             : 
    1257                 :             :    !Adapt the format of xccc3d1
    1258   [ -  +  +  -  :          96 :    ABI_MALLOC(rhor1,(cplex*nfft,nspden))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    1259         [ -  + ]:          24 :    spin_scale=one;if (nspden==2) spin_scale=half
    1260         [ +  + ]:          48 :    do ispden=1,nspden
    1261         [ +  + ]:       98352 :      do ir=1,cplex*nfft
    1262                 :       98328 :        rhor1(ir,ispden)=xccc3d1(ir)*spin_scale
    1263                 :             :      end do
    1264                 :             :    end do
    1265                 :             : 
    1266                 :             :    !The gradient of the potential is calculated in Cartesian coordinates
    1267   [ +  -  -  +  :         120 :    ABI_MALLOC(vxc1dq_a,(2*nfft,nspden))
          +  -  -  +  +  
          -  +  -  +  -  
             -  +  -  + ]
    1268   [ -  +  +  -  :         120 :    ABI_MALLOC(vxc1dq_car,(2*nfft,nspden,3))
          -  +  +  -  +  
          -  +  -  +  -  
             -  +  -  + ]
    1269         [ +  + ]:          96 :    do qcar=1,3
    1270                 :          72 :      call dfpt_mkvxcggadq(cplex,gprimd,kxc,mpi_enreg,nfft,ngfft,nkxc,nspden,qcar,rhor1,vxc1dq_a)
    1271                 :             : 
    1272                 :             :      !Here we apply an i factor, to compensate the lake of the -i factor in
    1273                 :             :      !vxc1dq_b (see notes in dfpt_vlocaldq).
    1274         [ +  + ]:      295008 :      do ir=1,nfft
    1275                 :      294912 :        ii=2*ir-1
    1276                 :      294912 :        jj=2*ir
    1277         [ +  + ]:      589824 :        vxc1dq_car(ii,:,qcar)=-vxc1dq_a(jj,:)
    1278         [ +  + ]:      589896 :        vxc1dq_car(jj,:,qcar)= vxc1dq_a(ii,:)
    1279                 :             :      end do
    1280                 :             :    end do
    1281         [ -  + ]:          24 :    ABI_FREE(rhor1)
    1282                 :             : 
    1283                 :             :    !Convert to reduced coordinate i3dir
    1284   [ +  +  +  + ]:      196656 :    vxc1dq_a=zero
    1285         [ +  + ]:          96 :    do qcar=1,3
    1286   [ +  +  +  + ]:      589992 :      vxc1dq_a(:,:)=vxc1dq_a(:,:) + gprimd(qcar,i3dir) * vxc1dq_car(:,:,qcar)
    1287                 :             :    end do
    1288         [ -  + ]:          24 :    ABI_FREE(vxc1dq_car)
    1289                 :             : 
    1290                 :             :    !Accumulate this term
    1291   [ +  +  +  + ]:      196656 :    vxccc1dq= vxc1dq_a
    1292                 :             : 
    1293         [ -  + ]:          24 :    ABI_FREE(vxc1dq_a)
    1294                 :             :  end if
    1295                 :             : 
    1296                 :             : !Calculate the term with the gradient of the first-order pseudocore density
    1297                 :             : !Dummy arguments for mkvxc
    1298   [ +  -  -  +  :         135 :  ABI_MALLOC(rhor1_cplx,(2*nfft,nspden))
          +  -  -  +  +  
          -  +  -  +  -  
             -  +  -  + ]
    1299                 :          27 :  usexcnhat= 0
    1300                 :          27 :  nhat1grdim= 0
    1301         [ -  + ]:          27 :  ABI_MALLOC(nhat1gr,(0,0,0))
    1302                 :             :  nhat1gr(:,:,:)= zero
    1303                 :          27 :  usepaw= 0
    1304   [ -  +  +  -  :          54 :  ABI_MALLOC(nhat1,(2*nfft,nspden*usepaw))
             -  +  -  + ]
    1305                 :             :  nhat1= zero
    1306                 :          27 :  non_magnetic_xc= .true.
    1307                 :          27 :  option= 0
    1308   [ -  +  +  -  :          81 :  ABI_MALLOC(vxc1dq_b,(2*nfft,nspden))
          -  +  +  -  -  
                +  -  + ]
    1309                 :             :  call dfpt_mkvxc(2,ixc,kxc,mpi_enreg,nfft,ngfft,nhat1,usepaw,nhat1gr,nhat1grdim,nkxc,&
    1310                 :          27 : & non_magnetic_xc,nspden,nfft,option,qphon,rhor1_cplx,rprimd,usexcnhat,vxc1dq_b,xccc3d2dq)
    1311                 :             : 
    1312                 :             : !Accumulate this term
    1313   [ +  +  +  + ]:      244662 :  vxccc1dq= vxccc1dq + vxc1dq_b
    1314                 :             : 
    1315                 :             : !Deallocations
    1316         [ -  + ]:          27 :  ABI_FREE(vxc1dq_b)
    1317         [ -  + ]:          27 :  ABI_FREE(rhor1_cplx)
    1318         [ -  + ]:          27 :  ABI_FREE(nhat1)
    1319         [ -  + ]:          27 :  ABI_FREE(nhat1gr)
    1320                 :             : 
    1321                 :             :  DBG_EXIT("COLL")
    1322                 :             : 
    1323                 :          27 : end subroutine dfpt_mkvxcccdq
    1324                 :             : !!***
    1325                 :             : 
    1326                 :             : 
    1327                 :             : end module m_dfpt_mkvxc
    1328                 :             : !!***
        

Generated by: LCOV version 2.3-1