LCOV - code coverage report
Current view: top level - src/65_paw - m_paw_dfpt.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 89.1 % 915 815
Test Date: 2026-11-11 11:17:02 Functions: 100.0 % 4 4
Branches: 66.5 % 1822 1211

             Branch data     Line data    Source code
       1                 :             : !!****m* m_paw_dfpt/m_paw_dfpt
       2                 :             : !! NAME
       3                 :             : !!  m_paw_dfpt
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !!  This module contains several routines related to the 1st and 2nd order derivatives
       7                 :             : !!    (in the DFPT approach) of PAW on-site quantities.
       8                 :             : !!
       9                 :             : !! COPYRIGHT
      10                 :             : !! Copyright (C) 2018-2026 ABINIT group (MT,AM,FJ,JWZ)
      11                 :             : !! This file is distributed under the terms of the
      12                 :             : !! GNU General Public License, see ~abinit/COPYING
      13                 :             : !! or http://www.gnu.org/copyleft/gpl.txt .
      14                 :             : !!
      15                 :             : !! SOURCE
      16                 :             : 
      17                 :             : #if defined HAVE_CONFIG_H
      18                 :             : #include "config.h"
      19                 :             : #endif
      20                 :             : 
      21                 :             : #include "abi_common.h"
      22                 :             : 
      23                 :             : MODULE m_paw_dfpt
      24                 :             : 
      25                 :             :  use defs_basis
      26                 :             :  use m_abicore
      27                 :             :  use m_xmpi
      28                 :             :  use m_errors
      29                 :             :  use m_time, only : timab
      30                 :             : 
      31                 :             :  use defs_datatypes, only : pseudopotential_type
      32                 :             :  use m_pawang,       only : pawang_type
      33                 :             :  use m_pawrad,       only : pawrad_type
      34                 :             :  use m_pawtab,       only : pawtab_type
      35                 :             :  use m_paw_an,       only : paw_an_type
      36                 :             :  use m_paw_ij,       only : paw_ij_type
      37                 :             :  use m_pawcprj,      only : pawcprj_type
      38                 :             :  use m_pawdij,       only : pawdijhartree,pawdiju_euijkl
      39                 :             :  use m_pawrhoij,     only : pawrhoij_type,pawrhoij_free,pawrhoij_gather,pawrhoij_nullify
      40                 :             :  use m_pawfgrtab,    only : pawfgrtab_type, pawfgrtab_free, pawfgrtab_nullify, pawfgrtab_gather
      41                 :             :  use m_paw_finegrid, only : pawgylm, pawrfgd_fft, pawexpiqr
      42                 :             :  use m_pawxc,        only : pawxc_dfpt, pawxcm_dfpt
      43                 :             :  use m_paw_denpot,   only : pawdensities,pawaccenergy,pawaccenergy_nospin
      44                 :             :  use m_paral_atom,   only : get_my_atmtab,free_my_atmtab
      45                 :             :  use m_atm2fft,      only : dfpt_atm2fft
      46                 :             :  use m_distribfft,   only : distribfft_type
      47                 :             :  use m_geometry,     only : metric, stresssym
      48                 :             :  use m_efield,       only : efield_type
      49                 :             : 
      50                 :             :  implicit none
      51                 :             : 
      52                 :             :  private
      53                 :             : 
      54                 :             : !public procedures.
      55                 :             :  public :: pawdfptenergy ! Compute Hartree+XC PAW on-site contrib. to a 1st or 2nd-order energy
      56                 :             :  public :: pawgrnl       ! Compute derivatives of total energy due to NL terms (PAW Dij derivatives)
      57                 :             :  public :: dsdr_k_paw    ! Compute PAW on-site terms for forces/stresses for finite electric fields
      58                 :             : 
      59                 :             : CONTAINS  !========================================================================================
      60                 :             : !!***
      61                 :             : 
      62                 :             : !----------------------------------------------------------------------
      63                 :             : 
      64                 :             : !!****f* m_paw_dfpt/pawdfptenergy
      65                 :             : !! NAME
      66                 :             : !! pawdfptenergy
      67                 :             : !!
      68                 :             : !! FUNCTION
      69                 :             : !! This routine compute the Hartree+XC+U PAW on-site contributions to a 1st-order or 2nd-order energy.
      70                 :             : !!  These contributions are equal to:
      71                 :             : !!    E_onsite=
      72                 :             : !!       Int{ VHxc[n1_a^(j1);nc^(j1)].n1_b^(j2) }
      73                 :             : !!      -Int{ VHxc[tild_n1_a^(j1)+hat_n1_a^(j1);tild_n_c^(j1)].(tild_n1_b+n1_b)^(j2) }
      74                 :             : !! Some typical uses:
      75                 :             : !!  A-Contribution to non-stationary expression of the 2nd-order total energy:
      76                 :             : !!    In that case, n1_a^(1)[r]=n1^(j1)[r] and n1_b[r]=delta_n1^(j2)[r]
      77                 :             : !!    where j1 and j2 are two given perturbations,
      78                 :             : !!    and delta_n1^(j)[r] is the 1s-order density only due to change of WF overlap.
      79                 :             : !!    See PRB 78, 035105 (2008) [[cite:Audouze2008]], Eq.(80).
      80                 :             : !!    E_onsite=
      81                 :             : !!       Int{ VHxc[n1^(j1);nc^(j1)].delta_n1^(j2) }
      82                 :             : !!      -Int{ VHxc[tild_n1^(j1)+hat_n1^(j1);tild_n_c^(j1)].delta_(tild_n1+hat_n1)^(j2) }
      83                 :             : !!  B-Contribution to first-order Fermi energy:
      84                 :             : !!    In that case, n1_a^(1)[r]=n1^(j1)[r] and n1_b[r]=n1[r,EFermi]
      85                 :             : !!    where j1 is the current perturbation, and n1[r,EFermi] is the density at Fermi level.
      86                 :             : !!    E_onsite=
      87                 :             : !!       Int{ VHxc[n1^(j1);nc^(j1)].n1[r,EFermi] }
      88                 :             : !!      -Int{ VHxc[tild_n1^(j1)+hat_n1^(j1);tild_n_c^(j1)].(tild_n1+hat_n1)[r,EFermi] }
      89                 :             : !!
      90                 :             : !! INPUTS
      91                 :             : !!  ipert1,ipert2=indexes of perturbations (j1) and (j2)
      92                 :             : !!                if ipert2<=0, we compute a first-order energy
      93                 :             : !!                if ipert2> 0, we compute a second-order energy
      94                 :             : !!  ixc= choice of exchange-correlation scheme
      95                 :             : !!  mpi_atmtab(:)=--optional-- indexes of the atoms treated by current proc
      96                 :             : !!  comm_atom=--optional-- MPI communicator over atoms
      97                 :             : !!  my_natom=number of atoms treated by current processor
      98                 :             : !!  natom=total number of atoms in cell
      99                 :             : !!  ntypat=number of types of atoms in unit cell.
     100                 :             : !!  nzlmopt_a= For the n1_a density:
     101                 :             : !!            if -1, compute all LM-moments of the density and use non-zero LM-moments
     102                 :             : !!            if  0, compute all LM-moments of the density and use all LM-moments
     103                 :             : !!            if +1, compute only non-zero LM-moments of the density (stored before)
     104                 :             : !!  nzlmopt_b= For the n1_b density:
     105                 :             : !!            if -1, compute all LM-moments of the density and use non-zero LM-moments
     106                 :             : !!            if  0, compute all LM-moments of the density and use all LM-moments
     107                 :             : !!            if +1, compute only non-zero LM-moments of the density (stored before)
     108                 :             : !!  paw_an0(natom) <type(paw_an_type)>=paw arrays for 0th-order quantities given on angular mesh
     109                 :             : !!  paw_an1(natom) <type(paw_an_type)>=paw arrays for 1st-order quantities given on angular mesh
     110                 :             : !!                                     This corresponds to (j1) perturbation
     111                 :             : !!  paw_ij1(natom) <type(paw_ij_type)>=paw arrays given on (i,j) channels
     112                 :             : !!                                     This corresponds to (j1) perturbation
     113                 :             : !!  pawang <type(pawang_type)>=paw angular mesh and related data
     114                 :             : !!  pawprtvol=control print volume and debugging output for PAW
     115                 :             : !!  pawrad(ntypat) <type(pawrad_type)>=paw radial mesh and related data
     116                 :             : !!  pawrhoij_a(natom) <type(pawrhoij_type)>= paw rhoij 1st-order occupancies for the (j1) perturbation
     117                 :             : !!  pawrhoij_b(natom) <type(pawrhoij_type)>=
     118                 :             : !!    if ipert2> 0: paw rhoij 1st-order occupancies for the (j2) perturbation corrsponding to n1_b^(j2)[r]
     119                 :             : !!    if ipert2<=0: paw rhoij occupancies corresponding to n1_b[r]
     120                 :             : !!  pawtab(ntypat) <type(pawtab_type)>=paw tabulated starting data
     121                 :             : !!  pawxcdev=Choice of XC development (0=no dev. (use of angular mesh) ; 1 or 2=dev. on moments)
     122                 :             : !!  xclevel= XC functional level
     123                 :             : !!
     124                 :             : !! OUTPUT
     125                 :             : !!  delta_energy(2)= real and imaginary parts of contributions to non-stationary expression for the
     126                 :             : !!              second derivative of the total energy
     127                 :             : !!
     128                 :             : !! SIDE EFFECTS
     129                 :             : !!    ==== if paw_an1(:)%has_vxc<2, compute 1st-order XC potentials
     130                 :             : !!      paw_an1(natom)%vxc1(cplex_a*mesh_size,:,nspden) =AE 1st-order XC potential Vxc^(j1)
     131                 :             : !!      paw_an1(natom)%vxct1(cplex_a*mesh_size,:,nspden)=PS 1st-order XC potential tVxc^(j1)
     132                 :             : !!    ==== if paw_ij1(:)%has_dijhartree<2, compute 1st-order Dij_hartree
     133                 :             : !!      paw_ij1(natom)%dijhartree(cplex_a*lmn2_size)=Hartree contribution to Dij^(j1)
     134                 :             : !!    ==== if paw_ij1(:)%has_dijU<2, compute 1st-order Dij_U
     135                 :             : !!      paw_ij1(natom)%diju(cplex_a*lmn2_size)=DFT+U contribution to Dij^(j1)
     136                 :             : !!
     137                 :             : !! SOURCE
     138                 :             : 
     139                 :        4220 : subroutine pawdfptenergy(delta_energy,ipert1,ipert2,ixc,my_natom,natom,ntypat,nzlmopt_a,nzlmopt_b,&
     140                 :        8440 : &                        paw_an0,paw_an1,paw_ij1,pawang,pawprtvol,pawrad,pawrhoij_a,pawrhoij_b,&
     141                 :        4220 : &                        pawtab,pawxcdev,xclevel, &
     142   [ +  +  +  +  :        4220 : &                        mpi_atmtab,comm_atom) ! optional arguments (parallelism)
                   -  + ]
     143                 :             : 
     144                 :             : !Arguments ---------------------------------------------
     145                 :             : !scalars
     146                 :             :  integer,intent(in) :: ipert1,ipert2,ixc,my_natom,natom,ntypat,nzlmopt_a,nzlmopt_b
     147                 :             :  integer,intent(in) :: pawprtvol,pawxcdev,xclevel
     148                 :             :  integer,optional,intent(in) :: comm_atom
     149                 :             :  type(pawang_type),intent(in) :: pawang
     150                 :             : !arrays
     151                 :             :  integer,optional,target,intent(in) :: mpi_atmtab(:)
     152                 :             :  real(dp),intent(out) :: delta_energy(2)
     153                 :             :  type(paw_an_type),intent(in) :: paw_an0(my_natom)
     154                 :             :  type(paw_an_type),intent(inout) :: paw_an1(my_natom)
     155                 :             :  type(paw_ij_type),intent(inout) :: paw_ij1(my_natom)
     156                 :             :  type(pawrad_type),intent(in) :: pawrad(ntypat)
     157                 :             :  type(pawrhoij_type),intent(in) :: pawrhoij_a(my_natom),pawrhoij_b(my_natom)
     158                 :             :  type(pawtab_type),intent(in) :: pawtab(ntypat)
     159                 :             : 
     160                 :             : !Local variables ---------------------------------------
     161                 :             : !scalars
     162                 :             :  integer, parameter :: PAWU_ALGO_1=1,PAWU_ALGO_2=2
     163                 :             :  integer :: cplex_a,cplex_b,cplex_vxc1,iatom,iatom_tot,ierr,itypat,lm_size_a,lm_size_b,mesh_size
     164                 :             :  integer :: my_comm_atom,nspden,opt_compch,optexc,optvxc,pawu_algo,qphase_dijh1,qphase_diju1
     165                 :             :  integer :: usecore,usepawu,usetcore,usexcnhat
     166                 :             :  logical :: my_atmtab_allocated,non_magnetic_xc,paral_atom
     167                 :             :  real(dp) :: compch,eexc,eexc_im
     168                 :             :  character(len=500) :: msg
     169                 :             : !arrays
     170                 :        4220 :  integer,pointer :: my_atmtab(:)
     171                 :        4220 :  logical,allocatable :: lmselect_a(:),lmselect_b(:),lmselect_tmp(:)
     172                 :             :  real(dp) :: delta_energy_h(2),delta_energy_u(2),delta_energy_xc(2),tsec(2)
     173                 :        4220 :  real(dp),allocatable :: kxc_dum(:,:,:),nhat1(:,:,:),rho1(:,:,:),trho1(:,:,:)
     174                 :             : 
     175                 :             : ! *************************************************************************
     176                 :             : 
     177                 :             :  DBG_ENTER("COLL")
     178                 :             : 
     179                 :        4220 :  call timab(567,1,tsec)
     180                 :             : 
     181   [ +  -  +  -  :        4220 :  if (.not.(ipert1==natom+1.or.ipert1==natom+10.or.ipert1==natom+11 &
          +  -  +  -  +  
                -  +  - ]
     182                 :             : & .or.ipert2==natom+1.or.ipert2==natom+10.or.ipert2==natom+11)) then
     183   [ +  +  +  -  :        4220 :    if((abs(nzlmopt_a)/=1.and.nzlmopt_a/=0).or.(abs(nzlmopt_b)/=1.and.nzlmopt_b/=0)) then
             +  +  -  + ]
     184                 :           0 :      msg='invalid value for nzlmopt!'
     185                 :           0 :      ABI_BUG(msg)
     186                 :             :    end if
     187         [ +  + ]:        4220 :    if (my_natom>0) then
     188         [ -  + ]:        4196 :      if(paw_ij1(1)%has_dijhartree==0) then
     189                 :           0 :        ABI_BUG('dijhartree must be allocated!')
     190                 :             :      end if
     191   [ +  +  +  +  :       12275 :      if (any(pawtab(1:ntypat)%usepawu/=0)) then
                   +  + ]
     192         [ -  + ]:          24 :        if(paw_ij1(1)%has_dijU==0) then
     193                 :           0 :          ABI_BUG('dijU must be allocated!')
     194                 :             :        end if
     195                 :             :      end if
     196         [ -  + ]:        4196 :      if(paw_an1(1)%has_vxc==0) then
     197                 :           0 :        ABI_BUG('vxc1 and vxct1 must be allocated!')
     198                 :             :      end if
     199         [ -  + ]:        4196 :      if(paw_an0(1)%has_kxc==0) then
     200                 :           0 :        ABI_BUG('kxc1 must be allocated!')
     201                 :             :      end if
     202   [ +  +  -  + ]:        4196 :      if ((ipert1<=natom.or.ipert1==natom+1.or.ipert1==natom+10.or.ipert1==natom+11).and.paw_an0(1)%has_kxc/=2) then
     203                 :           0 :        ABI_BUG('XC kernels for ground state must be in memory!')
     204                 :             :      end if
     205         [ -  + ]:        4196 :      if (paw_ij1(1)%qphase/=paw_an1(1)%cplex) then
     206                 :           0 :        msg='paw_ij1()%qphase and paw_an1()%cplex must be equal!'
     207                 :           0 :        ABI_BUG(msg)
     208                 :             :      end if
     209   [ +  -  -  + ]:        4196 :      if (pawrhoij_a(1)%qphase<paw_an1(1)%cplex.or.pawrhoij_b(1)%qphase<paw_an1(1)%cplex) then
     210                 :           0 :        msg='pawrhoij()%qphase must be >=paw_an1()%cplex!'
     211                 :           0 :        ABI_BUG(msg)
     212                 :             :      end if
     213         [ -  + ]:        4196 :      if (paw_ij1(1)%nspden/=paw_an1(1)%nspden) then
     214                 :           0 :        msg='paw_ij1()%nspden and paw_an1()%nspden must be equal!'
     215                 :           0 :        ABI_BUG(msg)
     216                 :             :      end if
     217         [ -  + ]:        4196 :      if (pawrhoij_a(1)%nspden/=pawrhoij_b(1)%nspden) then
     218                 :           0 :        msg='pawrhoij_a()%nspden must =pawrhoij_b()%nspden !'
     219                 :           0 :        ABI_BUG(msg)
     220                 :             :      end if
     221                 :             :    end if
     222                 :             :  end if
     223                 :             : 
     224                 :             : !Set up parallelism over atoms
     225   [ +  +  +  + ]:        4220 :  paral_atom=(present(comm_atom).and.(my_natom/=natom))
     226         [ +  + ]:        4220 :  nullify(my_atmtab);if (present(mpi_atmtab)) my_atmtab => mpi_atmtab
     227         [ +  + ]:        4220 :  my_comm_atom=xmpi_comm_self;if (present(comm_atom)) my_comm_atom=comm_atom
     228                 :        4220 :  call get_my_atmtab(my_comm_atom,my_atmtab,my_atmtab_allocated,paral_atom,natom,my_natom_ref=my_natom)
     229                 :             : 
     230                 :             : !Init contribution to 1st-order (or 2nd-order) energy
     231                 :        4220 :  delta_energy(1:2)=zero
     232                 :             : 
     233                 :             : !For some perturbations, nothing else to do
     234                 :             :  if (ipert1==natom+1.or.ipert1==natom+10.or.ipert1==natom+11 .or. &
     235   [ +  -  +  -  :        4220 : &    ipert2==natom+1.or.ipert2==natom+10.or.ipert2==natom+11) return
          +  -  +  -  +  
                -  +  - ]
     236                 :             : 
     237                 :             : !Various inits
     238                 :        4220 :  opt_compch=0;optvxc=1;optexc=3
     239                 :        4220 :  usecore=0;usetcore=0  ! This is true for phonons and Efield pert.
     240         [ +  + ]:       12395 :  usexcnhat=maxval(pawtab(1:ntypat)%usexcnhat)
     241                 :        4220 :  delta_energy_xc(1:2)=zero
     242                 :        4220 :  delta_energy_h(1:2)=zero
     243                 :        4220 :  delta_energy_u(1:2)=zero
     244                 :             : 
     245                 :             : !================ Loop on atomic sites =======================
     246         [ +  + ]:       13424 :  do iatom=1,my_natom
     247         [ +  + ]:        9204 :    iatom_tot=iatom;if (paral_atom) iatom_tot=my_atmtab(iatom)
     248                 :             : 
     249                 :        9204 :    itypat=pawrhoij_a(iatom)%itypat
     250                 :        9204 :    mesh_size=pawtab(itypat)%mesh_size
     251                 :        9204 :    nspden=paw_an1(iatom)%nspden
     252                 :        9204 :    cplex_a=pawrhoij_a(iatom)%qphase
     253                 :        9204 :    cplex_b=pawrhoij_b(iatom)%qphase
     254                 :        9204 :    cplex_vxc1=paw_an1(iatom)%cplex
     255                 :        9204 :    qphase_dijh1=paw_ij1(iatom)%qphase
     256                 :        9204 :    qphase_diju1=paw_ij1(iatom)%qphase
     257                 :        9204 :    lm_size_a=paw_an1(iatom)%lm_size
     258         [ +  + ]:        9204 :    if (ipert2<=0) lm_size_b=paw_an0(iatom)%lm_size
     259         [ +  + ]:        9204 :    if (ipert2> 0) lm_size_b=paw_an1(iatom)%lm_size
     260                 :        9204 :    usepawu=pawtab(itypat)%usepawu
     261   [ -  +  -  -  :        9204 :    pawu_algo=merge(PAWU_ALGO_1,PAWU_ALGO_2,ipert1<=0.and.ipert2<=0.and.usepawu>=0)
                   -  - ]
     262                 :        9204 :    non_magnetic_xc=(mod(abs(usepawu),10)==4)
     263                 :             : 
     264                 :             : !  If Vxc potentials are not in memory, compute them
     265         [ +  + ]:        9204 :    if (paw_an1(iatom)%has_vxc/=2) then
     266   [ -  +  +  -  :        2215 :      ABI_MALLOC(rho1 ,(cplex_a*mesh_size,lm_size_a,nspden))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                      + ]
     267   [ -  +  +  -  :        1772 :      ABI_MALLOC(trho1,(cplex_a*mesh_size,lm_size_a,nspden))
          -  +  +  -  -  
          +  +  -  -  +  
                   -  + ]
     268   [ -  +  +  -  :        2215 :      ABI_MALLOC(nhat1,(cplex_a*mesh_size,lm_size_a,nspden*usexcnhat))
          -  +  +  -  +  
          +  +  -  +  -  
          +  +  -  +  -  
                      + ]
     269   [ -  +  +  -  :        1329 :      ABI_MALLOC(lmselect_a,(lm_size_a))
          +  -  +  -  -  
                +  -  + ]
     270         [ +  + ]:        4670 :      lmselect_a(:)=paw_an1(iatom)%lmselect(:)
     271   [ -  +  +  -  :         886 :      ABI_MALLOC(lmselect_tmp,(lm_size_a))
             -  +  -  + ]
     272         [ +  + ]:        4670 :      lmselect_tmp(:)=.true.
     273   [ +  -  +  + ]:        4670 :      if (nzlmopt_a==1) lmselect_tmp(:)=lmselect_a(:)
     274                 :             : !    Compute on-site 1st-order densities
     275                 :             :      call pawdensities(compch,cplex_a,iatom_tot,lmselect_tmp,lmselect_a,&
     276                 :             : &     lm_size_a,nhat1,nspden,nzlmopt_a,opt_compch,1-usexcnhat,-1,0,pawang,pawprtvol,&
     277                 :         443 : &     pawrad(itypat),pawrhoij_a(iatom),pawtab(itypat),rho1,trho1)
     278         [ -  + ]:         443 :      ABI_FREE(lmselect_tmp)
     279                 :             : !    Compute on-site 1st-order xc potentials
     280         [ +  + ]:         443 :      if (pawxcdev/=0) then
     281                 :             :        call pawxcm_dfpt(pawtab(itypat)%coredens,cplex_a,cplex_vxc1,eexc,ixc,paw_an0(iatom)%kxc1,&
     282                 :             : &       lm_size_a,lmselect_a,nhat1,paw_an0(iatom)%nkxc1,non_magnetic_xc,mesh_size,nspden,optvxc,&
     283                 :             : &       pawang,pawrad(itypat),rho1,usecore,0,&
     284                 :         379 : &       paw_an1(iatom)%vxc1,xclevel)
     285                 :             :        call pawxcm_dfpt(pawtab(itypat)%tcoredens(:,1),cplex_a,cplex_vxc1,eexc,ixc,paw_an0(iatom)%kxct1,&
     286                 :             : &       lm_size_a,lmselect_a,nhat1,paw_an0(iatom)%nkxc1,non_magnetic_xc,mesh_size,nspden,optvxc,&
     287                 :             : &       pawang,pawrad(itypat),trho1,usetcore,2*usexcnhat,&
     288                 :         379 : &       paw_an1(iatom)%vxct1,xclevel)
     289                 :             :      else
     290                 :             :        call pawxc_dfpt(pawtab(itypat)%coredens,cplex_a,cplex_vxc1,eexc,ixc,paw_an0(iatom)%kxc1,&
     291                 :             : &       lm_size_a,lmselect_a,nhat1,paw_an0(iatom)%nkxc1,non_magnetic_xc,mesh_size,nspden,optvxc,&
     292                 :             : &       pawang,pawrad(itypat),rho1,usecore,0,&
     293                 :          64 : &       paw_an0(iatom)%vxc1,paw_an1(iatom)%vxc1,xclevel)
     294                 :             :        call pawxc_dfpt(pawtab(itypat)%tcoredens(:,1),cplex_a,cplex_vxc1,eexc,ixc,paw_an0(iatom)%kxct1,&
     295                 :             : &       lm_size_a,lmselect_a,nhat1,paw_an0(iatom)%nkxc1,non_magnetic_xc,mesh_size,nspden,optvxc,&
     296                 :             : &       pawang,pawrad(itypat),trho1,usetcore,2*usexcnhat,&
     297                 :          64 : &       paw_an0(iatom)%vxct1,paw_an1(iatom)%vxct1,xclevel)
     298                 :             :      end if
     299                 :             : 
     300                 :         443 :      paw_an1(iatom)%has_vxc=2
     301         [ -  + ]:         443 :      ABI_FREE(lmselect_a)
     302         [ -  + ]:         443 :      ABI_FREE(rho1)
     303         [ -  + ]:         443 :      ABI_FREE(trho1)
     304         [ -  + ]:         443 :      ABI_FREE(nhat1)
     305                 :             :    end if ! has_vxc
     306                 :             : 
     307                 :             : !  Compute contribution to 1st-order (or 2nd-order) energy from 1st-order XC potential
     308   [ -  +  +  -  :       46020 :    ABI_MALLOC(rho1 ,(cplex_b*mesh_size,lm_size_b,nspden))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                      + ]
     309   [ -  +  +  -  :       36816 :    ABI_MALLOC(trho1,(cplex_b*mesh_size,lm_size_b,nspden))
          -  +  +  -  -  
          +  +  -  -  +  
                   -  + ]
     310   [ -  +  +  -  :       46020 :    ABI_MALLOC(nhat1,(cplex_b*mesh_size,lm_size_b,nspden*usexcnhat))
          -  +  +  -  +  
          +  +  -  +  -  
          +  +  -  +  -  
                      + ]
     311   [ -  +  +  -  :       27612 :    ABI_MALLOC(lmselect_b,(lm_size_b))
          +  -  +  -  -  
                +  -  + ]
     312   [ +  +  +  + ]:       34665 :    if (ipert2<=0) lmselect_b(:)=paw_an0(iatom)%lmselect(:)
     313   [ +  +  +  + ]:       68307 :    if (ipert2> 0) lmselect_b(:)=paw_an1(iatom)%lmselect(:)
     314   [ -  +  +  -  :       18408 :    ABI_MALLOC(lmselect_tmp,(lm_size_b))
             -  +  -  + ]
     315         [ +  + ]:       93768 :    lmselect_tmp(:)=.true.
     316   [ -  +  -  - ]:        9204 :    if (nzlmopt_b==1) lmselect_tmp(:)=lmselect_b(:)
     317                 :             : !  Compute on-site 1st-order densities
     318                 :             :    call pawdensities(compch,cplex_b,iatom_tot,lmselect_tmp,lmselect_b,&
     319                 :             : &   lm_size_b,nhat1,nspden,nzlmopt_b,opt_compch,1-usexcnhat,-1,0,pawang,pawprtvol,&
     320                 :        9204 : &   pawrad(itypat),pawrhoij_b(iatom),pawtab(itypat),rho1,trho1)
     321         [ -  + ]:        9204 :    ABI_FREE(lmselect_tmp)
     322                 :             : !  Compute contributions to 1st-order (or 2nd-order) energy
     323         [ +  + ]:        9204 :    if (pawxcdev/=0) then
     324   [ -  +  +  -  :       25416 :      ABI_MALLOC(kxc_dum,(mesh_size,pawang%angl_size,0))
          +  -  -  -  -  
                +  -  + ]
     325                 :             :      call pawxcm_dfpt(pawtab(itypat)%coredens,cplex_b,cplex_vxc1,eexc,ixc,kxc_dum,&
     326                 :             : &     lm_size_b,lmselect_b,nhat1,0,non_magnetic_xc,mesh_size,nspden,optexc,pawang,pawrad(itypat),&
     327                 :        8472 : &     rho1,usecore,0,paw_an1(iatom)%vxc1,xclevel,d2enxc_im=eexc_im)
     328                 :        8472 :      delta_energy_xc(1)=delta_energy_xc(1)+eexc
     329                 :        8472 :      delta_energy_xc(2)=delta_energy_xc(2)+eexc_im
     330                 :             :      call pawxcm_dfpt(pawtab(itypat)%tcoredens(:,1),&
     331                 :             : &     cplex_b,cplex_vxc1,eexc,ixc,kxc_dum,&
     332                 :             : &     lm_size_b,lmselect_b,nhat1,0,non_magnetic_xc,mesh_size,nspden,optexc,pawang,pawrad(itypat),&
     333                 :             : &     trho1,usetcore,2*usexcnhat,paw_an1(iatom)%vxct1,xclevel,&
     334                 :        8472 : &     d2enxc_im=eexc_im)
     335         [ -  + ]:        8472 :      ABI_FREE(kxc_dum)
     336                 :        8472 :      delta_energy_xc(1)=delta_energy_xc(1)-eexc
     337                 :        8472 :      delta_energy_xc(2)=delta_energy_xc(2)-eexc_im
     338                 :             :    else
     339   [ -  +  +  -  :        2196 :      ABI_MALLOC(kxc_dum,(mesh_size,lm_size_b,0))
          -  +  +  -  -  
                +  -  + ]
     340                 :             :      call pawxc_dfpt(pawtab(itypat)%coredens,cplex_b,cplex_vxc1,eexc,ixc,kxc_dum,&
     341                 :             : &     lm_size_b,lmselect_b,nhat1,0,non_magnetic_xc,mesh_size,nspden,optexc,pawang,pawrad(itypat),&
     342                 :         732 : &     rho1,usecore,0,paw_an0(iatom)%vxc1,paw_an1(iatom)%vxc1,xclevel,d2enxc_im=eexc_im)
     343                 :         732 :      delta_energy_xc(1)=delta_energy_xc(1)+eexc
     344                 :         732 :      delta_energy_xc(2)=delta_energy_xc(2)+eexc_im
     345                 :             :      call pawxc_dfpt(pawtab(itypat)%tcoredens(:,1),&
     346                 :             : &     cplex_b,cplex_vxc1,eexc,ixc,kxc_dum,&
     347                 :             : &     lm_size_b,lmselect_b,nhat1,0,non_magnetic_xc,mesh_size,nspden,optexc,pawang,pawrad(itypat),&
     348                 :             : &     trho1,usetcore,2*usexcnhat,paw_an0(iatom)%vxct1,paw_an1(iatom)%vxct1,xclevel,&
     349                 :         732 : &     d2enxc_im=eexc_im)
     350         [ -  + ]:         732 :      ABI_FREE(kxc_dum)
     351                 :         732 :      delta_energy_xc(1)=delta_energy_xc(1)-eexc
     352                 :         732 :      delta_energy_xc(2)=delta_energy_xc(2)-eexc_im
     353                 :             :    end if
     354         [ -  + ]:        9204 :    ABI_FREE(lmselect_b)
     355         [ -  + ]:        9204 :    ABI_FREE(rho1)
     356         [ -  + ]:        9204 :    ABI_FREE(trho1)
     357         [ -  + ]:        9204 :    ABI_FREE(nhat1)
     358                 :             : 
     359                 :             : !  If Dij_hartree are not in memory, compute them
     360         [ +  + ]:        9204 :    if (paw_ij1(iatom)%has_dijhartree/=2) then
     361                 :             :      call pawdijhartree(paw_ij1(iatom)%dijhartree,qphase_dijh1,paw_ij1(iatom)%nspden,&
     362                 :         443 : &     pawrhoij_a(iatom),pawtab(itypat))
     363                 :         443 :      paw_ij1(iatom)%has_dijhartree=2
     364                 :             :    end if
     365                 :             : 
     366                 :             : !  Compute contribution to 1st-order(or 2nd-order) energy from 1st-order Hartree potential
     367                 :             :    call pawaccenergy_nospin(delta_energy_h(1),pawrhoij_b(iatom),paw_ij1(iatom)%dijhartree, &
     368                 :        9204 : &                           1,qphase_dijh1,pawtab(itypat),epaw_im=delta_energy_h(2))
     369                 :             : 
     370                 :             : !  Compute contribution to 1st-order(or 2nd-order) energy from 1st-order PAW+U potential
     371         [ +  + ]:       13424 :    if (usepawu/=0.and.pawu_algo==PAWU_ALGO_2) then
     372                 :             : !    If DijU are not in memory, compute them
     373         [ -  + ]:          48 :      if (paw_ij1(iatom)%has_dijU/=2) then ! We force the recomputation of dijU in when cplex=2 to get diju_im
     374                 :             :        call pawdiju_euijkl(paw_ij1(iatom)%dijU,paw_ij1(iatom)%cplex_dij,qphase_diju1,&
     375                 :           0 : &                          paw_ij1(iatom)%ndij,pawrhoij_a(iatom),pawtab(itypat))
     376                 :           0 :        paw_ij1(iatom)%has_dijU=2
     377                 :             :      end if
     378                 :             : !    Compute contribution to 1st-order(or 2nd-order) energy
     379                 :             :      call pawaccenergy(delta_energy_u(1),pawrhoij_b(iatom),paw_ij1(iatom)%dijU,paw_ij1(iatom)%cplex_dij, &
     380                 :          48 : &                      qphase_diju1,paw_ij1(iatom)%ndij,pawtab(itypat),epaw_im=delta_energy_u(2))
     381                 :             : !    Add FLL double-counting contribution
     382         [ -  + ]:          48 :      if (ipert1==0) then ! If j1/=0, Dij^FLL^(j1)=0 because it is constant
     383                 :             :        call pawaccenergy_nospin(delta_energy_u(1),pawrhoij_b(iatom),pawtab(itypat)%euij_fll,1,1,&
     384                 :           0 : &                               pawtab(itypat),epaw_im=delta_energy_u(2))
     385                 :             :      end if
     386                 :             :    end if
     387                 :             : 
     388                 :             : !  ================ End loop on atomic sites =======================
     389                 :             :  end do
     390                 :             : 
     391                 :             : !Final building of 1st-order (or 2nd-order) energy
     392         [ +  + ]:       12660 :  delta_energy(1:2)=delta_energy_xc(1:2)+delta_energy_h(1:2)+delta_energy_u(1:2)
     393                 :             : 
     394                 :             : !Reduction in case of parallelism
     395         [ +  + ]:        4220 :  if (paral_atom) then
     396                 :        2340 :    call xmpi_sum(delta_energy,my_comm_atom,ierr)
     397                 :             :  end if
     398                 :             : 
     399                 :             : !Destroy atom table used for parallelism
     400                 :        4220 :  call free_my_atmtab(my_atmtab,my_atmtab_allocated)
     401                 :             : 
     402                 :        4220 :  call timab(567,2,tsec)
     403                 :             : 
     404                 :             :  DBG_EXIT("COLL")
     405                 :             : 
     406                 :        4220 : end subroutine pawdfptenergy
     407                 :             : !!***
     408                 :             : 
     409                 :             : !----------------------------------------------------------------------
     410                 :             : 
     411                 :             : !!****f* m_paw_dfpt/pawgrnl
     412                 :             : !!
     413                 :             : !! NAME
     414                 :             : !! pawgrnl
     415                 :             : !!
     416                 :             : !! FUNCTION
     417                 :             : !! PAW: Add to GRadients of total energy due to non-local term of Hamiltonian
     418                 :             : !!      the contribution due to Dij derivatives
     419                 :             : !! In particular, compute contribution to forces, stresses, dyn. matrix
     420                 :             : !! Remember: Vnl=Sum_ij[|p_i>Dij<p_j|]
     421                 :             : !!
     422                 :             : !! INPUTS
     423                 :             : !!  atindx1(natom)=index table for atoms, inverse of atindx
     424                 :             : !!  dimnhat=second dimension of array nhat (0 or # of spin components)
     425                 :             : !!  distribfft<type(distribfft_type)>=--optional-- contains all the information related
     426                 :             : !!                                    to the FFT parallelism and plane sharing
     427                 :             : !!  dyfr_cplex=1 if dyfrnl is real, 2 if it is complex
     428                 :             : !!  gsqcut=Fourier cutoff on G^2 for "large sphere" of radius double that of the basis sphere
     429                 :             : !!  mgfft=maximum size of 1D FFTs
     430                 :             : !!  me_g0=--optional-- 1 if the current process treat the g=0 plane-wave (only needed when comm_fft is present)
     431                 :             : !!  mpi_atmtab(:)=--optional-- indexes of the atoms treated by current proc
     432                 :             : !!  comm_atom=--optional-- MPI communicator over atoms
     433                 :             : !!  comm_fft=--optional-- MPI communicator over FFT components (=mpi_comm_grid is not present)
     434                 :             : !!  mpi_comm_grid=--optional-- MPI communicator over real space grid components (=comm_fft is not present)
     435                 :             : !!  my_natom=number of atoms treated by current processor
     436                 :             : !!  natom=total number of atoms in cell
     437                 :             : !!  nattyp(ntypat)=array describing how many atoms of each type in cell
     438                 :             : !!  nfft=(effective) number of FFT grid points (for this processor)
     439                 :             : !!  ngfft(18)=contain all needed information about 3D FFT, see ~abinit/doc/variables/vargs.htm#ngfft
     440                 :             : !!  nhat(nfft,dimnhat)=compensation charge density on rectangular grid in real space
     441                 :             : !!  nspden=number of spin-density components
     442                 :             : !!  nsym=number of symmetries in space group
     443                 :             : !!  ntypat=number of types of atoms
     444                 :             : !!  optgr= 1 if gradients with respect to atomic position(s) have to be computed
     445                 :             : !!  optgr2= 1 if 2nd gradients with respect to atomic position(s) have to be computed
     446                 :             : !!  optstr= 1 if gradients with respect to strain(s) have to be computed
     447                 :             : !!  optstr2= 1 if 2nd gradients with respect to strain(s) have to be computed
     448                 :             : !!  paral_kgb=--optional-- 1 if "band-FFT" parallelism is activated (only needed when comm_fft is present)
     449                 :             : !!  pawang <type(pawang_type)>=paw angular mesh and related data
     450                 :             : !!  pawfgrtab(my_natom) <type(pawfgrtab_type)>=atomic data given on fine rectangular grid
     451                 :             : !!  pawrhoij(my_natom) <type(pawrhoij_type)>= paw rhoij occupancies and related data
     452                 :             : !!  pawtab(ntypat) <type(pawtab_type)>=paw tabulated starting data
     453                 :             : !!  ph1d(2,3*(2*mgfft+1)*natom)=1-dim phase (structure factor) information
     454                 :             : !!  psps <type(pseudopotential_type)>=variables related to pseudopotentials
     455                 :             : !!  qphon(3)=wavevector of the phonon
     456                 :             : !!  rprimd(3,3)=dimensional primitive translations in real space (bohr)
     457                 :             : !!  symrec(3,3,nsym)=symmetries in reciprocal space, reduced coordinates
     458                 :             : !!  typat(natom)=types of atoms
     459                 :             : !!  ucvol=unit cell volume
     460                 :             : !!  vtrial(nfft,nspden)= total local potential
     461                 :             : !!  vxc(nfft,nspden)=XC potential
     462                 :             : !!  xred(3,natom)=reduced dimensionless atomic coordinates
     463                 :             : !!
     464                 :             : !! SIDE EFFECTS
     465                 :             : !!  At input, this terms contain contribution from non-local projectors derivatives
     466                 :             : !!  At output, they are updated with the contribution of Dij derivatives
     467                 :             : !!  ==== if optgr=1 ====
     468                 :             : !!   grnl(3*natom) =gradients of NL energy wrt atomic coordinates
     469                 :             : !!  ==== if optstr=1 ====
     470                 :             : !!   nlstr(6) =gradients of NL energy wrt strains
     471                 :             : !!  ==== if optgr2=1 ====
     472                 :             : !!   dyfrnl(dyfr_cplex,3,3,natom,natom) =2nd gradients of NL energy wrt atomic coordinates
     473                 :             : !!  ==== if optstr=2 ====
     474                 :             : !!    eltfrnl(6+3*natom,6)=non-symmetrized non-local contribution to the elastic tensor
     475                 :             : !! NOTES
     476                 :             : !!   In the case of parallelisation over atoms and calculation of dynamical matrix (optgr2=1)
     477                 :             : !!   several data are gathered and no more distributed inside this routine.
     478                 :             : !!
     479                 :             : !! SOURCE
     480                 :             : 
     481                 :       15388 : subroutine pawgrnl(atindx1,dimnhat,dyfrnl,dyfr_cplex,eltfrnl,grnl,gsqcut,mgfft,my_natom,natom,&
     482                 :        7694 : &          nattyp,nfft,ngfft,nhat,nlstr,nspden,nsym,ntypat,optgr,optgr2,optstr,optstr2,&
     483   [ -  +  -  + ]:        7694 : &          pawang,pawfgrtab,pawrhoij,pawtab,ph1d,psps,qphon,rprimd,symrec,typat,ucvol,vtrial,vxc,xred,&
     484   [ +  -  +  +  :        7694 : &          mpi_atmtab,comm_atom,comm_fft,mpi_comm_grid,me_g0,paral_kgb,distribfft) ! optional arguments (parallelism)
                   -  + ]
     485                 :             : 
     486                 :             : !Arguments ------------------------------------
     487                 :             : !scalars
     488                 :             :  integer,intent(in) :: dimnhat,dyfr_cplex,mgfft,my_natom,natom,nfft,nspden,nsym,ntypat
     489                 :             :  integer,intent(in) :: optgr,optgr2,optstr,optstr2
     490                 :             :  integer,optional,intent(in) :: me_g0,comm_atom,comm_fft,mpi_comm_grid,paral_kgb
     491                 :             :  real(dp),intent(in) :: gsqcut,ucvol
     492                 :             :  type(distribfft_type),optional,target,intent(in) :: distribfft
     493                 :             :  type(pawang_type),intent(in) :: pawang
     494                 :             :  type(pseudopotential_type),intent(in) :: psps
     495                 :             : !arrays
     496                 :             :  integer,intent(in) :: atindx1(natom),nattyp(ntypat),ngfft(18)
     497                 :             :  integer,intent(in) :: symrec(3,3,nsym),typat(natom)
     498                 :             :  integer,optional,target,intent(in) :: mpi_atmtab(:)
     499                 :             :  real(dp),intent(in) :: nhat(nfft,dimnhat),ph1d(2,3*(2*mgfft+1)*natom),qphon(3)
     500                 :             :  real(dp),intent(in) :: rprimd(3,3),vxc(nfft,nspden),xred(3,natom)
     501                 :             :  real(dp),intent(in),target :: vtrial(nfft,nspden)
     502                 :             :  real(dp),intent(inout) :: dyfrnl(dyfr_cplex,3,3,natom,natom*optgr2)
     503                 :             :  real(dp),intent(inout) :: eltfrnl(6+3*natom,6),grnl(3*natom*optgr)
     504                 :             :  real(dp),intent(inout) :: nlstr(6*optstr)
     505                 :             :  type(pawfgrtab_type),target,intent(inout) :: pawfgrtab(:)
     506                 :             :  type(pawrhoij_type),target,intent(inout) ::  pawrhoij(:)
     507                 :             :  type(pawtab_type),intent(in) :: pawtab(ntypat)
     508                 :             : 
     509                 :             : !Local variables-------------------------------
     510                 :             : !scalars
     511                 :             :  integer :: bufind,bufsiz,cplex,dimvtrial,eps_alpha,eps_beta,eps_gamma,eps_delta,iatm,iatom
     512                 :             :  integer :: iatom_pawfgrtab,iatom_pawrhoij,iatom_tot,iatshft,ic,idiag,idir,ier,ilm,indx,irhoij
     513                 :             :  integer :: isel,ishift_grhoij,ishift_gr,ishift2_gr,ishift_gr2,ishift_str,ishift_str2,ishift_str2is,ispden
     514                 :             :  integer :: ispvtr,itypat,jatom,jatom_tot,jatm,jc,jrhoij,jtypat,klm,klmn,klmn1,ll,lm_size
     515                 :             :  integer :: lm_sizej,lmax,lmin,lmn2_size,me_fft,mu,mua,mub,mushift,my_me_g0,my_comm_atom,my_comm_fft
     516                 :             :  integer :: my_comm_grid,my_paral_kgb,n1,n2,n3,nfftot,nfgd,nfgd_jatom
     517                 :             :  integer :: ngrad,ngrad_nondiag,ngradp,ngradp_nondiag,ngrhat,nsploop
     518                 :             :  integer :: opt1,opt2,opt3,qne0,usexcnhat
     519                 :             :  logical,parameter :: save_memory=.true.
     520                 :             :  logical :: has_phase,my_atmtab_allocated
     521                 :             :  logical :: paral_atom,paral_atom_pawfgrtab,paral_atom_pawrhoij,paral_grid
     522                 :             :  real(dp) :: dlt_tmp,fact_ucvol,grhat_x,hatstr_diag,rcut_jatom,ro,ro_d,ucvol_
     523                 :             :  character(len=500) :: msg
     524                 :             :  type(distribfft_type),pointer :: my_distribfft
     525                 :             :  type(pawfgrtab_type),pointer :: pawfgrtab_iatom,pawfgrtab_jatom
     526                 :             :  type(pawrhoij_type),pointer :: pawrhoij_iatom,pawrhoij_jatom
     527                 :             : !arrays
     528                 :             :  integer,parameter :: alpha(9)=(/1,2,3,3,3,2,2,1,1/),beta(9)=(/1,2,3,2,1,1,3,3,2/)
     529                 :             :  integer,parameter :: eps1(6)=(/1,2,3,2,3,1/),eps2(6)=(/1,2,3,3,1,2/)
     530                 :             :  integer,parameter :: mu9(9)=(/1,2,3,4,5,6,4,5,6/)
     531                 :        7694 :  integer,allocatable :: atindx(:),atm_indx(:),mu4(:)
     532                 :        7694 :  integer,allocatable,target :: ifftsph_tmp(:)
     533                 :        7694 :  integer,contiguous, pointer :: ffti3_local(:),fftn3_distrib(:),ifft_jatom(:)
     534                 :        7694 :  integer, pointer :: my_atmtab(:)
     535                 :             :  real(dp) :: gmet(3,3),gprimd(3,3),hatstr(6),rdum(1),rdum2(1),rmet(3,3),tmp(12)
     536                 :       15388 :  real(dp) :: work1(dyfr_cplex,3,3),work2(dyfr_cplex,3,3)
     537                 :        7694 :  real(dp),allocatable :: buf(:,:),buf1(:),dyfr(:,:,:,:,:),eltfr(:,:)
     538                 :        7694 :  real(dp),allocatable :: grhat_tmp(:,:),grhat_tmp2(:,:),hatgr(:)
     539                 :        7694 :  real(dp),allocatable :: prod(:,:),prodp(:,:),vloc(:),vpsp1_gr(:,:),vpsp1_str(:,:)
     540                 :        7694 :  real(dp),allocatable,target :: rfgd_tmp(:,:)
     541                 :        7694 :  real(dp),contiguous, pointer :: gylm_jatom(:,:),gylmgr_jatom(:,:,:),gylmgr2_jatom(:,:,:),expiqr_jatom(:,:)
     542                 :        7694 :  real(dp),contiguous, pointer :: rfgd_jatom(:,:),vtrial_(:,:)
     543                 :        7694 :  type(coeff2_type),allocatable :: prod_nondiag(:),prodp_nondiag(:)
     544                 :        7694 :  type(pawfgrtab_type),pointer :: pawfgrtab_(:),pawfgrtab_tot(:)
     545                 :        7694 :  type(pawrhoij_type),pointer :: pawrhoij_(:),pawrhoij_tot(:)
     546                 :             : 
     547                 :             : ! *************************************************************************
     548                 :             : 
     549                 :             :  DBG_ENTER("COLL")
     550                 :             : 
     551                 :             : !Compatibility tests
     552                 :          14 :  qne0=0;if (qphon(1)**2+qphon(2)**2+qphon(3)**2>=1.d-15) qne0=1
     553         [ +  + ]:        7694 :  if (my_natom>0) then
     554   [ +  +  -  +  :        6650 :    if ((optgr2==1.or.optstr2==1).and.pawrhoij(1)%ngrhoij==0) then
                   -  + ]
     555                 :           0 :      msg='pawgrnl: inconsistency between variables optgr2/optstr2 and ngrhoij!'
     556                 :           0 :      ABI_BUG(msg)
     557                 :             :    end if
     558         [ +  + ]:        6650 :    if (pawfgrtab(1)%rfgd_allocated==0) then
     559   [ +  +  +  -  :         322 :      if ((optgr2==1.and.qne0==1).or.optstr2==1) then
                   -  + ]
     560                 :           0 :        ABI_BUG('pawgrnl: pawfgrtab()%rfgd array must be allocated!')
     561                 :             :      end if
     562                 :             :    end if
     563         [ -  + ]:        6650 :    if (pawrhoij(1)%qphase/=1) then
     564                 :           0 :      ABI_BUG('pawgrnl: not supposed to be called with pawrhoij(:)%qphase=2!')
     565                 :             :    end if
     566                 :             :  end if
     567                 :             : 
     568                 :             : !----------------------------------------------------------------------
     569                 :             : !Parallelism setup
     570                 :             : 
     571                 :             : !Set up parallelism over atoms
     572   [ +  -  +  + ]:        7694 :  paral_atom=(present(comm_atom).and.(my_natom/=natom))
     573                 :        7694 :  paral_atom_pawfgrtab=(size(pawfgrtab)/=natom)
     574                 :        7694 :  paral_atom_pawrhoij=(size(pawrhoij)/=natom)
     575         [ +  + ]:        7694 :  nullify(my_atmtab);if (present(mpi_atmtab)) my_atmtab => mpi_atmtab
     576         [ +  - ]:        7694 :  my_comm_atom=xmpi_comm_self;if (present(comm_atom)) my_comm_atom=comm_atom
     577                 :        7694 :  call get_my_atmtab(my_comm_atom,my_atmtab,my_atmtab_allocated,paral_atom,natom,my_natom_ref=my_natom)
     578         [ +  + ]:        7694 :  if (paral_atom) then
     579   [ -  +  +  -  :        9216 :    ABI_MALLOC(atm_indx,(natom))
          +  -  +  -  -  
                +  -  + ]
     580         [ +  + ]:        9428 :    atm_indx=-1
     581         [ +  + ]:        5151 :    do iatom=1,my_natom
     582                 :        5151 :      atm_indx(my_atmtab(iatom))=iatom
     583                 :             :    end do
     584                 :             :  end if
     585                 :             : 
     586                 :             : !Set up parallelism over real space grid and/or FFT
     587                 :        7694 :  n1=ngfft(1);n2=ngfft(2);n3=ngfft(3);nfftot=n1*n2*n3
     588                 :        7694 :  my_comm_grid=xmpi_comm_self;my_comm_fft=xmpi_comm_self;me_fft=0
     589                 :        7694 :  my_me_g0=1;my_paral_kgb=0;paral_grid=.false.;nullify(my_distribfft)
     590         [ +  + ]:        7694 :  if (present(mpi_comm_grid).or.present(comm_fft)) then
     591         [ +  - ]:        7636 :    if (present(mpi_comm_grid)) my_comm_grid=mpi_comm_grid
     592         [ +  + ]:        7636 :    if (present(comm_fft)) my_comm_fft=comm_fft
     593         [ -  + ]:        7636 :    if (.not.present(mpi_comm_grid)) my_comm_grid=comm_fft
     594         [ +  + ]:        7636 :    if (.not.present(comm_fft)) my_comm_fft=mpi_comm_grid
     595                 :        7636 :    paral_grid=(xmpi_comm_size(my_comm_grid)>1)
     596                 :        7636 :    me_fft=xmpi_comm_rank(my_comm_fft)
     597                 :             :  end if
     598   [ +  +  -  + ]:        7694 :  if (optgr2==1.or.optstr2==1) then
     599         [ -  + ]:          45 :    if (present(comm_fft)) then
     600   [ #  #  #  # ]:           0 :      if ((.not.present(paral_kgb)).or.(.not.present(me_g0)).or.(.not.present(distribfft))) then
     601                 :           0 :        ABI_BUG(' Need paral_kgb, me_g0 and distribfft with comm_fft !')
     602                 :             :      end if
     603                 :           0 :      my_me_g0=me_g0;my_paral_kgb=paral_kgb
     604                 :           0 :      my_distribfft => distribfft
     605                 :             :    else
     606         [ -  + ]:          45 :      ABI_MALLOC(my_distribfft,)
     607                 :          45 :      call my_distribfft%init_seq('f',n2,n3,'fourdp')
     608                 :             :    end if
     609         [ -  + ]:          45 :    if (n2 == my_distribfft%n2_coarse) then
     610                 :           0 :      fftn3_distrib => my_distribfft%tab_fftdp3_distrib
     611                 :           0 :      ffti3_local => my_distribfft%tab_fftdp3_local
     612                 :             :    else
     613                 :          45 :      fftn3_distrib => my_distribfft%tab_fftdp3dg_distrib
     614                 :          45 :      ffti3_local => my_distribfft%tab_fftdp3dg_local
     615                 :             :    end if
     616                 :             :  else
     617                 :             :    nullify(my_distribfft,fftn3_distrib,ffti3_local)
     618                 :             :  end if
     619                 :             : 
     620                 :             : !----------------------------------------------------------------------
     621                 :             : !Initializations
     622                 :             : 
     623                 :             : !Compute different geometric tensors
     624                 :             : !ucvol is not computed here but provided as input arg
     625                 :        7694 :  call metric(gmet,gprimd,-1,rmet,rprimd,ucvol_)
     626                 :        7694 :  fact_ucvol=ucvol/dble(nfftot)
     627                 :             : 
     628                 :             : !Retrieve local potential according to the use of nhat in XC
     629         [ +  + ]:       19671 :  usexcnhat=maxval(pawtab(1:ntypat)%usexcnhat)
     630         [ +  + ]:        7694 :  if (usexcnhat==0) then
     631                 :             : !  dimvtrial=nspden
     632                 :        5350 :    dimvtrial=1
     633   [ -  +  +  -  :       16050 :    ABI_MALLOC(vtrial_,(nfft,dimvtrial))
          +  -  +  -  -  
                +  -  + ]
     634                 :             : !!!$OMP PARALLEL DO PRIVATE(ic) SHARED(nfft,vtrial,vtrial_,vxc)
     635         [ +  + ]:   135041305 :    do ic=1,nfft
     636   [ +  +  +  + ]:   540149170 :      vtrial_(ic,1:dimvtrial)=vtrial(ic,1:dimvtrial)-vxc(ic,1:dimvtrial)
     637                 :             :    end do
     638                 :             :  else
     639                 :        2344 :    dimvtrial=nspden
     640                 :        2344 :    vtrial_ => vtrial
     641                 :             :  end if
     642                 :             : 
     643                 :             : !Initializations and allocations
     644                 :        7694 :  ngrhat=0;ngrad=0;ngradp=0;ngrad_nondiag=0;ngradp_nondiag=0
     645                 :        7694 :  ishift_grhoij=0;ishift_gr=0;ishift_gr2=0;ishift_str=0;ishift_str2=0;ishift_str2is=0;ishift2_gr=0
     646         [ +  + ]:        7694 :  cplex=1;if (qne0==1) cplex=2
     647         [ +  + ]:        7694 :  if (optgr==1) then
     648   [ +  -  -  +  :       27772 :    ABI_MALLOC(hatgr,(3*natom))
          +  -  +  -  +  
             -  -  +  -  
                      + ]
     649         [ +  + ]:       72778 :    hatgr=zero
     650                 :             :    ngrad=ngrad+3
     651                 :             :    ngrhat=ngrhat+3
     652                 :             :    ishift_gr2=ishift_gr2+3
     653                 :             :  end if
     654         [ +  + ]:        7694 :  if (optgr2==1) then
     655                 :          45 :    mu=min(dyfr_cplex,cplex)
     656                 :          45 :    ngrad =ngrad +9
     657                 :          45 :    ngradp=ngradp+3
     658                 :          45 :    ngrad_nondiag = ngrad_nondiag +9*mu
     659                 :          45 :    ngradp_nondiag= ngradp_nondiag+3*mu
     660                 :          45 :    ngrhat= ngrhat+9*mu
     661                 :             :  end if
     662         [ +  + ]:        7694 :  if (optstr==1) then
     663                 :        1420 :    hatstr=zero
     664                 :        1420 :    ngrad=ngrad+6
     665                 :        1420 :    ngrhat=ngrhat+6
     666                 :        1420 :    ishift_gr=ishift_gr+6
     667                 :        1420 :    ishift_gr2=ishift_gr2+6
     668                 :        1420 :    ishift_str2=ishift_str2+6
     669                 :        1420 :    ishift_str2is = ishift_str2is+6
     670                 :             :  end if
     671         [ +  + ]:        7694 :  if (optstr2==1) then
     672                 :          12 :    ngrad =ngrad+6*(6+3)
     673                 :          12 :    ngradp=ngradp+(6+3)
     674                 :          12 :    ngrad_nondiag =ngrad_nondiag+6*(6+3)
     675                 :          12 :    ngradp_nondiag=ngradp_nondiag+3
     676                 :          12 :    ishift2_gr=ishift2_gr+3
     677                 :          12 :    ngrhat=ngrhat+6*(6+3)
     678                 :          12 :    ishift_gr=ishift_gr+(6+3)
     679                 :          12 :    ishift_gr2=ishift_gr2+6*(6+3)
     680                 :          12 :    ishift_str2is=ishift_str2is+36
     681                 :          12 :    ishift_grhoij = 6
     682                 :             :  end if
     683                 :             : 
     684                 :             : !DEBUG
     685                 :             : !   write(6,*)' preparatory computations : usexcnhat, nspden, dimvtrial=',usexcnhat, nspden, dimvtrial
     686                 :             : !ENDDEBUG
     687                 :             : !nsploop=nspden;if (dimvtrial<nspden) nsploop=2
     688   [ +  +  +  + ]:        7694 :  nsploop=nspden;if (dimvtrial<nspden .and. nspden==4) nsploop=1
     689   [ +  +  +  - ]:        7694 :  if (optgr2/=1.and.optstr2/=1) then
     690   [ +  +  +  -  :       22947 :    ABI_MALLOC(grhat_tmp,(ngrhat,1))
          +  -  +  +  -  
                +  -  + ]
     691                 :             :  else
     692   [ -  +  +  -  :         180 :    ABI_MALLOC(grhat_tmp,(ngrhat,natom))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     693   [ +  +  +  + ]:        3907 :    grhat_tmp=zero
     694   [ -  +  +  -  :         271 :    ABI_MALLOC(prod_nondiag,(natom))
          +  -  +  -  -  
             +  -  +  +  
                      + ]
     695   [ -  +  +  -  :         226 :    ABI_MALLOC(prodp_nondiag,(natom))
          -  +  -  +  +  
                      + ]
     696   [ -  +  +  -  :         135 :    ABI_MALLOC(atindx,(natom))
          +  -  +  -  -  
                +  -  + ]
     697   [ -  +  -  - ]:          45 :    if(optgr2==1.or.optstr2==1)then
     698   [ -  +  +  -  :         135 :      ABI_MALLOC(vpsp1_gr,(cplex*nfft,3))
          +  -  +  -  -  
                +  -  + ]
     699   [ +  +  +  + ]:     3781404 :      vpsp1_gr(:,:)= zero
     700                 :             :    end if
     701         [ +  - ]:          45 :    if (optgr2==1) then
     702   [ -  +  +  -  :         270 :      ABI_MALLOC(dyfr,(dyfr_cplex,3,3,natom,natom))
          +  -  -  +  +  
          -  -  +  +  -  
          +  -  +  -  -  
                +  -  + ]
     703   [ +  +  +  +  :       14007 :      dyfr=zero
          +  +  +  +  +  
                      + ]
     704                 :             :    end if
     705         [ +  + ]:          45 :    if (optstr2==1) then
     706   [ -  +  +  -  :          36 :      ABI_MALLOC(vpsp1_str,(cplex*nfft,6))
          +  -  +  -  -  
                +  -  + ]
     707   [ -  +  +  -  :          36 :      ABI_MALLOC(grhat_tmp2,(18,natom))
          +  -  +  -  -  
                +  -  + ]
     708   [ +  -  -  +  :          60 :      ABI_MALLOC(eltfr,(6+3*natom,6))
          +  -  +  -  +  
          -  +  -  -  +  
                   -  + ]
     709   [ +  +  +  + ]:        1272 :      eltfr=zero
     710                 :             :    end if
     711         [ -  + ]:          45 :    ABI_MALLOC(mu4,(4))
     712         [ +  + ]:         181 :    atindx(:)=0
     713         [ +  + ]:         181 :    do iatom=1,natom
     714                 :             :      iatm=0
     715   [ +  +  -  + ]:         553 :      do while (atindx(iatom)==0.and.iatm<natom)
     716         [ +  + ]:         508 :        iatm=iatm+1;if (atindx1(iatm)==iatom) atindx(iatom)=iatm
     717                 :             :      end do
     718                 :             :    end do
     719                 :             :  end if
     720                 :             : 
     721                 :             : !The computation of dynamical matrix and elastic tensor requires the knowledge of
     722                 :             : !g_l(r-R).Y_lm(r-R) and derivatives for all atoms
     723                 :             : !Compute them here, except memory saving is activated
     724                 :             :  if ((.not.save_memory).and.(optgr2==1.or.optstr2==1)) then
     725                 :             :    do jatom=1,size(pawfgrtab)
     726                 :             :      jatom_tot=jatom;if (paral_atom_pawfgrtab) jatom_tot=my_atmtab(jatom)
     727                 :             :      pawfgrtab_jatom => pawfgrtab(jatom)
     728                 :             :      lm_sizej=pawfgrtab_jatom%l_size**2
     729                 :             :      opt1=0;opt2=0;opt3=0
     730                 :             :      if (pawfgrtab_jatom%gylm_allocated==0) then
     731                 :             :        if (allocated(pawfgrtab_jatom%gylm))  then
     732                 :             :          ABI_FREE(pawfgrtab_jatom%gylm)
     733                 :             :        end if
     734                 :             :        ABI_MALLOC(pawfgrtab_jatom%gylm,(pawfgrtab_jatom%nfgd,lm_sizej))
     735                 :             :        pawfgrtab_jatom%gylm_allocated=2;opt1=1
     736                 :             :      end if
     737                 :             :      if (pawfgrtab_jatom%gylmgr_allocated==0) then
     738                 :             :        if (allocated(pawfgrtab_jatom%gylmgr))  then
     739                 :             :          ABI_FREE(pawfgrtab_jatom%gylmgr)
     740                 :             :        end if
     741                 :             :        ABI_MALLOC(pawfgrtab_jatom%gylmgr,(3,pawfgrtab_jatom%nfgd,lm_sizej))
     742                 :             :        pawfgrtab_jatom%gylmgr_allocated=2;opt2=1
     743                 :             :      end if
     744                 :             :      if (opt1+opt2+opt3>0) then
     745                 :             :        call pawgylm(pawfgrtab_jatom%gylm,pawfgrtab_jatom%gylmgr,&
     746                 :             : &       pawfgrtab_jatom%gylmgr2,lm_sizej,pawfgrtab_jatom%nfgd,&
     747                 :             : &       opt1,opt2,opt3,pawtab(typat(jatom_tot)),pawfgrtab_jatom%rfgd)
     748                 :             :      end if
     749                 :             :      if (optgr2==1.and.qne0==1) then
     750                 :             :        if (pawfgrtab_jatom%expiqr_allocated==0) then
     751                 :             :          if (allocated(pawfgrtab_jatom%expiqr))  then
     752                 :             :            ABI_FREE(pawfgrtab_jatom%expiqr)
     753                 :             :          end if
     754                 :             :          pawfgrtab_jatom%expiqr_allocated=2
     755                 :             :          ABI_MALLOC(pawfgrtab_jatom%expiqr,(2,nfgd))
     756                 :             :          call pawexpiqr(pawfgrtab_jatom%expiqr,gprimd,pawfgrtab_jatom%nfgd,&
     757                 :             : &         qphon,pawfgrtab_jatom%rfgd,xred(:,jatom_tot))
     758                 :             :        end if
     759                 :             :      end if
     760                 :             :    end do
     761                 :             :  end if
     762                 :             : 
     763                 :             : !The computation of dynamical matrix and elastic tensor might require some communications
     764                 :             :  if ((optgr2==1.or.optstr2==1).and.paral_atom.and.paral_atom_pawfgrtab.and.(.not.save_memory)) then
     765                 :             :    ABI_MALLOC(pawfgrtab_tot,(natom))
     766                 :             :    call pawfgrtab_nullify(pawfgrtab_tot)
     767                 :             :    call pawfgrtab_gather(pawfgrtab,pawfgrtab_tot,my_comm_atom,ier,mpi_atmtab=my_atmtab)
     768                 :             :  else
     769                 :        7694 :    pawfgrtab_tot => pawfgrtab
     770                 :             :  end if
     771   [ +  +  -  +  :        7694 :  if ((optgr2==1.or.optstr2==1).and.paral_atom.and.paral_atom_pawrhoij) then
             +  +  -  + ]
     772   [ #  #  #  #  :           0 :    ABI_MALLOC(pawrhoij_tot,(natom))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     773                 :           0 :    call pawrhoij_nullify(pawrhoij_tot)
     774                 :             :    call pawrhoij_gather(pawrhoij,pawrhoij_tot,-1,my_comm_atom, &
     775                 :           0 : &   with_rhoijres=.false.,with_rhoij_=.false.,with_lmnmix=.false.)
     776                 :             :  else
     777                 :        7694 :    pawrhoij_tot => pawrhoij
     778                 :             :  end if
     779                 :             : 
     780                 :             :  if (save_memory) then
     781                 :        7694 :    pawfgrtab_ => pawfgrtab
     782                 :        7694 :    pawrhoij_  => pawrhoij
     783                 :             :  else
     784                 :             :    pawfgrtab_ => pawfgrtab_tot
     785                 :             :    pawrhoij_  => pawrhoij_tot
     786                 :             :  end if
     787                 :             : 
     788                 :             : !----------------------------------------------------------------------
     789                 :             : !Loops over types and atoms
     790                 :             : 
     791                 :        7694 :  iatshft=0
     792         [ +  + ]:       19671 :  do itypat=1,ntypat
     793                 :             : 
     794                 :       11977 :    lmn2_size=pawtab(itypat)%lmn2_size
     795                 :       11977 :    lm_size=pawtab(itypat)%lcut_size**2
     796                 :             : 
     797         [ +  + ]:       35899 :    do iatm=iatshft+1,iatshft+nattyp(itypat)
     798                 :             : 
     799                 :       23922 :      iatom_tot=atindx1(iatm)
     800                 :       23922 :      iatom=iatom_tot
     801         [ +  + ]:       23922 :      if (paral_atom) then
     802                 :        6356 :        if (save_memory.or.(optgr2/=1.and.optstr2/=1)) iatom=atm_indx(iatom_tot)
     803                 :             :      end if
     804                 :             : 
     805         [ +  + ]:       23922 :      if (iatom==-1) cycle
     806         [ +  + ]:       19645 :      iatom_pawfgrtab=iatom_tot;if (paral_atom_pawfgrtab) iatom_pawfgrtab=iatom
     807         [ +  + ]:       19645 :      iatom_pawrhoij =iatom_tot;if (paral_atom_pawrhoij)  iatom_pawrhoij =iatom
     808                 :       19645 :      pawfgrtab_iatom => pawfgrtab_(iatom_pawfgrtab)
     809                 :       19645 :      pawrhoij_iatom  => pawrhoij_(iatom_pawrhoij)
     810                 :             : 
     811   [ +  +  -  + ]:       19645 :      idiag=1;if (optgr2==1.or.optstr2==1) idiag=iatm
     812                 :       19645 :      nfgd=pawfgrtab_iatom%nfgd
     813                 :             : 
     814   [ +  +  +  -  :       58935 :      ABI_MALLOC(vloc,(nfgd))
          +  -  +  +  -  
                +  -  + ]
     815         [ +  + ]:       19645 :      if (ngrad>0)  then
     816   [ -  +  +  -  :       78500 :        ABI_MALLOC(prod,(ngrad,lm_size))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     817                 :             :      end if
     818         [ +  + ]:       19645 :      if (ngradp>0)  then
     819   [ -  +  +  -  :         300 :        ABI_MALLOC(prodp,(ngradp,lm_size))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     820                 :             :      end if
     821         [ +  + ]:       19645 :      if (ngrad_nondiag>0.and.ngradp_nondiag>0) then
     822         [ +  + ]:         340 :        do jatm=1,natom
     823                 :         265 :          jtypat=typat(atindx1(jatm))
     824                 :         265 :          lm_sizej=pawtab(jtypat)%lcut_size**2
     825   [ -  +  +  -  :        1060 :          ABI_MALLOC(prod_nondiag(jatm)%value,(ngrad_nondiag,lm_sizej))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     826   [ -  +  +  -  :        1060 :          ABI_MALLOC(prodp_nondiag(jatm)%value,(ngradp_nondiag,lm_sizej))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     827   [ +  +  +  + ]:       77337 :          prod_nondiag(jatm)%value=zero
     828   [ +  +  +  + ]:       14604 :          prodp_nondiag(jatm)%value=zero
     829                 :             :        end do
     830                 :             :      end if
     831                 :             : 
     832   [ +  +  +  + ]:      117900 :      grhat_tmp=zero
     833   [ +  +  +  +  :       21533 :      if(optstr2==1) grhat_tmp2=zero
                   +  + ]
     834                 :             : 
     835                 :             : !    ------------------------------------------------------------------
     836                 :             : !    Compute some useful data
     837                 :             : 
     838                 :             : !    Eventually compute g_l(r).Y_lm(r) derivatives for the current atom (if not already done)
     839   [ +  +  +  +  :       19645 :      if ((optgr==1.or.optstr==1).and.(optgr2/=1).and.(optstr2/=1)) then
             +  -  +  - ]
     840         [ +  + ]:       19550 :        if (pawfgrtab_iatom%gylmgr_allocated==0) then
     841         [ +  - ]:           1 :          if (allocated(pawfgrtab_iatom%gylmgr))  then
     842                 :           1 :            ABI_FREE(pawfgrtab_iatom%gylmgr)
     843                 :             :          end if
     844   [ -  +  +  -  :           4 :          ABI_MALLOC(pawfgrtab_iatom%gylmgr,(3,pawfgrtab_iatom%nfgd,lm_size))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     845                 :           1 :          pawfgrtab_iatom%gylmgr_allocated=2
     846                 :             :          call pawgylm(rdum,pawfgrtab_iatom%gylmgr,rdum2,lm_size,pawfgrtab_iatom%nfgd,&
     847                 :           1 : &         0,1,0,pawtab(itypat),pawfgrtab_iatom%rfgd)
     848                 :             :        end if
     849                 :             : 
     850                 :             :      end if
     851   [ +  +  -  + ]:       19645 :      if (optgr2==1.or.optstr2==1) then
     852                 :          75 :        opt1=0;opt2=0;opt3=0
     853         [ -  + ]:          75 :        if (pawfgrtab_iatom%gylm_allocated==0) then
     854         [ #  # ]:           0 :          if (allocated(pawfgrtab_iatom%gylm))  then
     855                 :           0 :            ABI_FREE(pawfgrtab_iatom%gylm)
     856                 :             :          end if
     857   [ #  #  #  #  :           0 :          ABI_MALLOC(pawfgrtab_iatom%gylm,(pawfgrtab_iatom%nfgd,lm_size))
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
     858                 :           0 :          pawfgrtab_iatom%gylm_allocated=2;opt1=1
     859                 :             :        end if
     860         [ -  + ]:          75 :        if (pawfgrtab_iatom%gylmgr_allocated==0) then
     861         [ #  # ]:           0 :          if (allocated(pawfgrtab_iatom%gylmgr))  then
     862                 :           0 :            ABI_FREE(pawfgrtab_iatom%gylmgr)
     863                 :             :          end if
     864   [ #  #  #  #  :           0 :          ABI_MALLOC(pawfgrtab_iatom%gylmgr,(3,pawfgrtab_iatom%nfgd,lm_size))
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
     865                 :           0 :          pawfgrtab_iatom%gylmgr_allocated=2;opt2=1
     866                 :             :        end if
     867         [ -  + ]:          75 :        if (pawfgrtab_iatom%gylmgr2_allocated==0) then
     868         [ #  # ]:           0 :          if (allocated(pawfgrtab_iatom%gylmgr2))  then
     869                 :           0 :            ABI_FREE(pawfgrtab_iatom%gylmgr2)
     870                 :             :          end if
     871   [ #  #  #  #  :           0 :          ABI_MALLOC(pawfgrtab_iatom%gylmgr2,(6,pawfgrtab_iatom%nfgd,lm_size))
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
     872                 :           0 :          pawfgrtab_iatom%gylmgr2_allocated=2;opt3=1
     873                 :             :        end if
     874         [ -  + ]:          75 :        if (opt1+opt2+opt3>0) then
     875                 :             :          call pawgylm(pawfgrtab_iatom%gylm,pawfgrtab_iatom%gylmgr,&
     876                 :             : &         pawfgrtab_iatom%gylmgr2,lm_size,pawfgrtab_iatom%nfgd,&
     877                 :           0 : &         opt1,opt2,opt3,pawtab(itypat),pawfgrtab_iatom%rfgd)
     878                 :             :        end if
     879                 :             :      end if
     880                 :             : 
     881                 :             : !    Eventually compute exp(-i.q.r) factors for the current atom (if not already done)
     882   [ +  +  +  +  :       19645 :      if (optgr2==1.and.qne0==1.and.(pawfgrtab_iatom%expiqr_allocated==0)) then
                   -  + ]
     883         [ #  # ]:           0 :        if (allocated(pawfgrtab_iatom%expiqr))  then
     884                 :           0 :          ABI_FREE(pawfgrtab_iatom%expiqr)
     885                 :             :        end if
     886   [ #  #  #  #  :           0 :        ABI_MALLOC(pawfgrtab_iatom%expiqr,(2,nfgd))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     887                 :             :        call pawexpiqr(pawfgrtab_iatom%expiqr,gprimd,nfgd,qphon,&
     888                 :           0 : &       pawfgrtab_iatom%rfgd,xred(:,iatom))
     889                 :           0 :        pawfgrtab_iatom%expiqr_allocated=2
     890                 :             :      end if
     891   [ +  +  +  + ]:       19645 :      has_phase=(optgr2==1.and.pawfgrtab_iatom%expiqr_allocated/=0)
     892                 :             : 
     893                 :             : !    Eventually compute 1st-order potential
     894   [ +  +  -  + ]:       19645 :      if (optgr2==1.or.optstr2==1) then
     895                 :             :        call dfpt_atm2fft(atindx,cplex,gmet,gprimd,gsqcut,idir,iatom_tot,&
     896                 :             : &       mgfft,psps%mqgrid_vl,natom,3,nfft,ngfft,ntypat,ph1d,&
     897                 :             : &       psps%qgrid_vl,qphon,typat,ucvol,psps%usepaw,xred,psps,pawtab,atmvlocr1=vpsp1_gr,&
     898                 :             : &       vspl=psps%vlspl,comm_fft=my_comm_fft,me_g0=my_me_g0,&
     899                 :          75 : &       paral_kgb=my_paral_kgb,distribfft=my_distribfft)
     900         [ +  + ]:          75 :        if (cplex==1) then
     901         [ +  + ]:     2073325 :          do ic=1,nfft
     902         [ +  + ]:     8293056 :            tmp(1:3)=vpsp1_gr(ic,1:3)
     903         [ +  + ]:     8293117 :            do mu=1,3
     904                 :     8293056 :              vpsp1_gr(ic,mu)=-(gprimd(mu,1)*tmp(1)+gprimd(mu,2)*tmp(2)+gprimd(mu,3)*tmp(3))
     905                 :             :            end do
     906                 :             :          end do
     907                 :             :        else ! cplex=2
     908         [ +  + ]:      177566 :          do ic=1,nfft
     909   [ +  +  +  + ]:     1242864 :            jc=2*ic;tmp(1:3)=vpsp1_gr(jc-1,1:3);tmp(4:6)=vpsp1_gr(jc,1:3)
     910         [ +  + ]:      729792 :            do mu=1,3
     911                 :      532656 :              vpsp1_gr(jc-1,mu)=-(gprimd(mu,1)*tmp(1)+gprimd(mu,2)*tmp(2)+gprimd(mu,3)*tmp(3))
     912                 :      710208 :              vpsp1_gr(jc  ,mu)=-(gprimd(mu,1)*tmp(4)+gprimd(mu,2)*tmp(5)+gprimd(mu,3)*tmp(6))
     913                 :             :            end do
     914                 :             :          end do
     915                 :             :        end if
     916                 :             :      end if
     917         [ +  + ]:       19645 :      if (optstr2==1) then
     918   [ +  +  +  + ]:     1469846 :        vpsp1_str(:,:) = zero
     919                 :             :        call dfpt_atm2fft(atindx,cplex,gmet,gprimd,gsqcut,idir,natom+3,&
     920                 :             : &       mgfft,psps%mqgrid_vl,natom,6,nfft,ngfft,ntypat,&
     921                 :             : &       ph1d,psps%qgrid_vl,qphon,typat,ucvol,psps%usepaw,xred,psps,pawtab,atmvlocr1=vpsp1_str,&
     922                 :             : &       vspl=psps%vlspl,comm_fft=my_comm_fft,me_g0=my_me_g0,&
     923                 :          26 : &       paral_kgb=my_paral_kgb,distribfft=my_distribfft)
     924                 :             :      end if
     925                 :             : 
     926                 :             : !    ------------------------------------------------------------------
     927                 :             : !    Loop over spin components
     928                 :             : 
     929         [ +  + ]:       41174 :      do ispden=1,nsploop
     930                 :             : 
     931                 :             : !      ----- Retrieve potential (subtle if nspden=4 ;-)
     932         [ +  + ]:       21529 :        if (nspden/=4) then
     933                 :       20580 :          ispvtr=min(dimvtrial,ispden)
     934         [ +  + ]:    20100377 :          do ic=1,nfgd
     935                 :    20079797 :            jc = pawfgrtab_iatom%ifftsph(ic)
     936                 :    20100377 :            vloc(ic)=vtrial_(jc,ispvtr)
     937                 :             :          end do
     938                 :             :        else
     939         [ +  + ]:         949 :          if (ispden==1) then
     940                 :         253 :            ispvtr=min(dimvtrial,2)
     941         [ +  + ]:      532154 :            do ic=1,nfgd
     942                 :      531901 :              jc=pawfgrtab_iatom%ifftsph(ic)
     943                 :      532154 :              vloc(ic)=half*(vtrial_(jc,1)+vtrial_(jc,ispvtr))
     944                 :             :            end do
     945         [ +  + ]:         696 :          else if (ispden==4) then
     946                 :         232 :            ispvtr=min(dimvtrial,2)
     947         [ +  + ]:      470486 :            do ic=1,nfgd
     948                 :      470254 :              jc=pawfgrtab_iatom%ifftsph(ic)
     949                 :      470486 :              vloc(ic)=half*(vtrial_(jc,1)-vtrial_(jc,ispvtr))
     950                 :             :            end do
     951         [ +  + ]:         464 :          else if (ispden==2) then
     952                 :         232 :            ispvtr=min(dimvtrial,3)
     953         [ +  + ]:      470486 :            do ic=1,nfgd
     954                 :      470254 :              jc=pawfgrtab_iatom%ifftsph(ic)
     955                 :      470486 :              vloc(ic)=vtrial_(jc,ispvtr)
     956                 :             :            end do
     957                 :             :          else ! ispden=3
     958                 :         232 :            ispvtr=min(dimvtrial,4)
     959         [ +  + ]:      470486 :            do ic=1,nfgd
     960                 :      470254 :              jc=pawfgrtab_iatom%ifftsph(ic)
     961                 :      470486 :              vloc(ic)=-vtrial_(jc,ispvtr)
     962                 :             :            end do
     963                 :             :          end if
     964                 :             :        end if
     965                 :             : 
     966                 :             : !      -----------------------------------------------------------------------
     967                 :             : !      ----- Compute projected scalars (integrals of vloc and Q_ij^hat) ------
     968                 :             : !      ----- and/or their derivatives ----------------------------------------
     969                 :             : 
     970   [ +  +  +  +  :      910203 :        if (ngrad>0) prod=zero
                   +  + ]
     971   [ +  +  +  +  :       27527 :        if (ngradp>0) prodp=zero
                   +  + ]
     972                 :             : 
     973                 :             : !      ==== Contribution to forces ====
     974         [ +  + ]:       21529 :        if (optgr==1) then
     975         [ +  + ]:      167090 :          do ilm=1,lm_size
     976         [ +  + ]:   237811809 :            do ic=1,pawfgrtab_iatom%nfgd
     977         [ +  + ]:   950726272 :              do mu=1,3
     978                 :             :                prod(mu+ishift_gr,ilm)=prod(mu+ishift_gr,ilm)-&
     979                 :   950578876 : &               vloc(ic)*pawfgrtab_iatom%gylmgr(mu,ic,ilm)
     980                 :             :              end do
     981                 :             :            end do
     982                 :             :          end do
     983                 :             :        end if ! optgr
     984                 :             : 
     985                 :             : !      ==== Contribution to stresses ====
     986         [ +  + ]:       21529 :        if (optstr==1) then
     987         [ +  + ]:       46736 :          do ilm=1,lm_size
     988         [ +  + ]:   171681514 :            do ic=1,pawfgrtab_iatom%nfgd
     989                 :   171634778 :              jc=pawfgrtab_iatom%ifftsph(ic)
     990         [ +  + ]:  1201486825 :              do mu=1,6
     991                 :  1029808668 :                mua=alpha(mu);mub=beta(mu)
     992                 :             :                prod(mu+ishift_str,ilm)=prod(mu+ishift_str,ilm) &
     993                 :             : &               +half*vloc(ic)&
     994                 :             : &               *(pawfgrtab_iatom%gylmgr(mua,ic,ilm)*pawfgrtab_iatom%rfgd(mub,ic)&
     995                 :  1201443446 : &               +pawfgrtab_iatom%gylmgr(mub,ic,ilm)*pawfgrtab_iatom%rfgd(mua,ic))
     996                 :             :              end do
     997                 :             :            end do
     998                 :             :          end do
     999                 :             :        end if ! optstr
    1000                 :             : !DEBUG
    1001                 :             : !   write(6,*)' after loops on ilm, ic, mu : ispden,lm_size, pawfgrtab_iatom%nfgd=',ispden,lm_size, pawfgrtab_iatom%nfgd
    1002                 :             : !   write(6,*)' after loops on ilm, ic, mu, writes ilm, prod(1+ishift_str,ilm:lm_size) when bigger than tol10 (ilm between 1 and lm_size)'
    1003                 :             : !   do ilm=1, lm_size
    1004                 :             : !     if( abs(prod(1+ishift_str,ilm))>tol6 )then
    1005                 :             : !       write(6,*)ilm,prod(1+ishift_str,ilm)
    1006                 :             : !     endif
    1007                 :             : !   enddo
    1008                 :             : !ENDDEBUG
    1009                 :             : 
    1010                 :             : !      ==== Diagonal contribution to frozen wf part of dyn. matrix ====
    1011         [ +  + ]:       21529 :        if (optgr2==1) then
    1012                 :             : !        Diagonal contribution
    1013         [ +  + ]:        1058 :          do ilm=1,lm_size
    1014         [ +  + ]:     4010002 :            do ic=1,pawfgrtab_iatom%nfgd
    1015         [ +  + ]:    40089440 :              do mu=1,9
    1016                 :             :                prod(ishift_gr2+mu,ilm)=prod(ishift_gr2+mu,ilm) &
    1017                 :    40089440 : &               +half*vloc(ic)*pawfgrtab_iatom%gylmgr2(mu9(mu),ic,ilm)
    1018                 :             :              end do
    1019         [ +  + ]:    16036749 :              do mu=1,3
    1020                 :             :                prodp(ishift_gr+mu,ilm)=prodp(ishift_gr+mu,ilm) &
    1021                 :    16035776 : &               -vloc(ic)*pawfgrtab_iatom%gylmgr(mu,ic,ilm)
    1022                 :             :              end do
    1023                 :             :            end do
    1024                 :             :          end do
    1025                 :             :        end if ! optgr2
    1026                 :             : 
    1027                 :             : !      ==== Diagonal contribution to elastic tensor ====
    1028         [ +  + ]:       21529 :        if (optstr2==1) then
    1029         [ +  + ]:         260 :          do ilm=1,lm_size
    1030         [ +  + ]:      216278 :            do ic=1,pawfgrtab_iatom%nfgd
    1031                 :      216018 :              mu=1
    1032                 :      216018 :              jc=pawfgrtab_iatom%ifftsph(ic)
    1033         [ +  + ]:     1512126 :              do mua=1,6
    1034                 :     1296108 :                eps_alpha=eps1(mua);eps_beta=eps2(mua);
    1035         [ +  + ]:     9288774 :                do mub=1,6
    1036                 :     7776648 :                  eps_gamma=eps1(mub);eps_delta=eps2(mub);
    1037         [ +  + ]:    38883240 :                  mu4 = zero
    1038                 :     7776648 :                  call pawgrnl_convert(mu4,eps_alpha,eps_beta,eps_gamma,eps_delta)
    1039                 :             : !                v_loc*d2glylm
    1040                 :             :                  prod(ishift_str2+mu,ilm)=prod(ishift_str2+mu,ilm) + half*half*vloc(ic)*( &
    1041                 :             : &                 pawfgrtab_iatom%rfgd(eps_beta,ic)*pawfgrtab_iatom%rfgd(eps_gamma,ic)*&
    1042                 :             : &                 pawfgrtab_iatom%gylmgr2(mu4(2),ic,ilm)&
    1043                 :             : &                 +pawfgrtab_iatom%rfgd(eps_alpha,ic)*pawfgrtab_iatom%rfgd(eps_gamma,ic)*&
    1044                 :             :                  pawfgrtab_iatom%gylmgr2(mu4(4),ic,ilm)&
    1045                 :             : &                 +pawfgrtab_iatom%rfgd(eps_beta,ic) *pawfgrtab_iatom%rfgd(eps_delta,ic)*&
    1046                 :             :                  pawfgrtab_iatom%gylmgr2(mu4(1),ic,ilm)&
    1047                 :             : &                 +pawfgrtab_iatom%rfgd(eps_alpha,ic)*pawfgrtab_iatom%rfgd(eps_delta,ic)*&
    1048                 :     7776648 :                  pawfgrtab_iatom%gylmgr2(mu4(3),ic,ilm))
    1049         [ +  + ]:     7776648 :                  if(eps_gamma==eps_beta)then
    1050                 :             :                    prod(ishift_str2+mu,ilm)=prod(ishift_str2+mu,ilm) &
    1051                 :     2592216 : &                   +half*half*vloc(ic)*(pawfgrtab_iatom%gylmgr(eps_delta,ic,ilm)*pawfgrtab_iatom%rfgd(eps_alpha,ic))
    1052                 :             :                  end if
    1053         [ +  + ]:     7776648 :                  if(eps_gamma==eps_alpha)then
    1054                 :             :                    prod(ishift_str2+mu,ilm)=prod(ishift_str2+mu,ilm) &
    1055                 :     2592216 : &                   +half*half*vloc(ic)*(pawfgrtab_iatom%gylmgr(eps_delta,ic,ilm)*pawfgrtab_iatom%rfgd(eps_beta,ic))
    1056                 :             :                  end if
    1057         [ +  + ]:     7776648 :                  if(eps_delta==eps_beta)then
    1058                 :             :                    prod(ishift_str2+mu,ilm)=prod(ishift_str2+mu,ilm) &
    1059                 :     2592216 : &                   +half*half*vloc(ic)*(pawfgrtab_iatom%gylmgr(eps_gamma,ic,ilm)*pawfgrtab_iatom%rfgd(eps_alpha,ic))
    1060                 :             :                  end if
    1061         [ +  + ]:     7776648 :                  if(eps_delta==eps_alpha)then
    1062                 :             :                    prod(ishift_str2+mu,ilm)=prod(ishift_str2+mu,ilm) &
    1063                 :     2592216 : &                   +half*half*vloc(ic)*(pawfgrtab_iatom%gylmgr(eps_gamma,ic,ilm)*pawfgrtab_iatom%rfgd(eps_beta,ic))
    1064                 :             :                  end if
    1065                 :             : !                d(vloc)/d(eps_gammadelta) * d(gylm)/d(eps_alphabeta)
    1066                 :             :                  prod(ishift_str2+mu,ilm)=prod(ishift_str2+mu,ilm)&
    1067                 :             : &                 +vpsp1_str(jc,mub)*half*(&
    1068                 :             : &                 (pawfgrtab_iatom%gylmgr(eps_alpha,ic,ilm)*pawfgrtab_iatom%rfgd(eps_beta,ic)&
    1069                 :     7776648 : &                 +pawfgrtab_iatom%gylmgr(eps_beta,ic,ilm) *pawfgrtab_iatom%rfgd(eps_alpha,ic)))
    1070                 :             : !                d(vloc)/d(eps_alphabeta)  * d(gylm)/d(eps_gammadelta)
    1071                 :             :                  prod(ishift_str2+mu,ilm)=prod(ishift_str2+mu,ilm)&
    1072                 :             : &                 +vpsp1_str(jc,mua)*half*(&
    1073                 :             : &                 (pawfgrtab_iatom%gylmgr(eps_gamma,ic,ilm)*pawfgrtab_iatom%rfgd(eps_delta,ic)&
    1074                 :     7776648 : &                 +pawfgrtab_iatom%gylmgr(eps_delta,ic,ilm)*pawfgrtab_iatom%rfgd(eps_gamma,ic)))
    1075                 :             : !                delta_alphabeta * dv_loc/depsgammadelta * (gylm)
    1076         [ +  + ]:     7776648 :                  if (mua<=3) then
    1077                 :             :                    prod(ishift_str2+mu,ilm)=prod(ishift_str2+mu,ilm) &
    1078                 :     3888324 : &                   +vpsp1_str(jc,mub)*pawfgrtab_iatom%gylm(ic,ilm)
    1079                 :             :                  end if
    1080                 :             : !                delta_gammadelta * dv_loc/depsalphabeta * (gylm)
    1081         [ +  + ]:     7776648 :                  if (mub<=3) then
    1082                 :             :                    prod(ishift_str2+mu,ilm)=prod(ishift_str2+mu,ilm) &
    1083                 :     3888324 : &                   +vpsp1_str(jc,mua) * pawfgrtab_iatom%gylm(ic,ilm)
    1084                 :             :                  end if
    1085                 :             : !                delta_gammadelta * v_loc * d(gylm)/d(eps_alphabeta)
    1086                 :             :                  if (mub<=3) then
    1087                 :             :                    prod(ishift_str2+mu,ilm)=prod(ishift_str2+mu,ilm) &
    1088                 :             : &                   +half*vloc(ic)&
    1089                 :             : &                   *(pawfgrtab_iatom%gylmgr(eps_beta,ic,ilm)*pawfgrtab_iatom%rfgd(eps_alpha,ic)&
    1090                 :     3888324 : &                   + pawfgrtab_iatom%gylmgr(eps_alpha,ic,ilm)*pawfgrtab_iatom%rfgd(eps_beta,ic))
    1091                 :             :                  end if
    1092                 :             : !                delta_alphabeta * v_loc * d(gylm)/d(eps_gammadelta)
    1093         [ +  + ]:     7776648 :                  if (mua<=3) then
    1094                 :             :                    prod(ishift_str2+mu,ilm)=prod(ishift_str2+mu,ilm) &
    1095                 :             : &                   +half*vloc(ic)&
    1096                 :             : &                   *(pawfgrtab_iatom%gylmgr(eps_gamma,ic,ilm)*pawfgrtab_iatom%rfgd(eps_delta,ic)&
    1097                 :     3888324 : &                   + pawfgrtab_iatom%gylmgr(eps_delta,ic,ilm)*pawfgrtab_iatom%rfgd(eps_gamma,ic))
    1098                 :             :                  end if
    1099                 :             : !                delta_gammadelta delta_alphabeta * v_loc * (gylm)
    1100         [ +  + ]:     7776648 :                  if (mua<=3.and.mub<=3) then
    1101                 :             :                    prod(ishift_str2+mu,ilm)=prod(ishift_str2+mu,ilm) &
    1102                 :     1944162 : &                   +vloc(ic)*pawfgrtab_iatom%gylm(ic,ilm)
    1103                 :             :                  end if
    1104                 :     9072756 :                  mu=mu+1
    1105                 :             :                end do !end loop mub
    1106                 :             :              end do !end loop mua
    1107                 :             : !            vloc * d(gylm)/d(eps_alphabeta)
    1108         [ +  + ]:     1512126 :              do mu=1,6
    1109                 :     1296108 :                mua=alpha(mu);mub=beta(mu)
    1110                 :             :                prodp(ishift_str2+mu,ilm)=prodp(ishift_str2+mu,ilm)&
    1111                 :             : &               +half*vloc(ic)*&
    1112                 :             : &               (pawfgrtab_iatom%gylmgr(mua,ic,ilm)*pawfgrtab_iatom%rfgd(mub,ic)&
    1113                 :     1296108 : &               +pawfgrtab_iatom%gylmgr(mub,ic,ilm)*pawfgrtab_iatom%rfgd(mua,ic))
    1114                 :             : !              d(vloc)/d(eps_alphabeta or gammadelta) * gylm
    1115                 :             :                prodp(ishift_str2+mu,ilm)=prodp(ishift_str2+mu,ilm)&
    1116                 :     1296108 : &               +vpsp1_str(jc,mu)*pawfgrtab_iatom%gylm(ic,ilm)
    1117                 :             : !              delta_alphabeta * vloc * gylm
    1118         [ +  + ]:     1296108 :                if (mu<=3) then
    1119                 :             :                  prodp(ishift_str2+mu,ilm)=prodp(ishift_str2+mu,ilm)&
    1120                 :      648054 : &                 +vloc(ic)*pawfgrtab_iatom%gylm(ic,ilm)
    1121                 :             :                end if
    1122                 :             : 
    1123                 :             : !              INTERNAL STRAIN CONTRIBUTION:
    1124         [ +  + ]:     5400450 :                do idir=1,3
    1125                 :             : !                v_loc*d2glylm/dR contribution:
    1126                 :     3888324 :                  eps_alpha=alpha(mu);eps_beta=beta(mu);
    1127                 :     3888324 :                  call pawgrnl_convert(mu4,eps_alpha,eps_beta,idir,idir)
    1128                 :             :                  prod(ishift_str2is+(mu-1)*3+idir,ilm)=prod(ishift_str2is+(mu-1)*3+idir,ilm)&
    1129                 :             : &                 -half*vloc(ic)&
    1130                 :             : &                 *(pawfgrtab_iatom%gylmgr2(mu4(3),ic,ilm)*pawfgrtab_iatom%rfgd(eps_alpha,ic)&
    1131                 :     3888324 : &                 +pawfgrtab_iatom%gylmgr2(mu4(1),ic,ilm)*pawfgrtab_iatom%rfgd(eps_beta,ic))
    1132         [ +  + ]:     3888324 :                  if (idir==eps_beta)then
    1133                 :             :                    prod(ishift_str2is+(mu-1)*3+idir,ilm)=prod(ishift_str2is+(mu-1)*3+idir,ilm)&
    1134                 :     1296108 : &                   -half*vloc(ic)*(pawfgrtab_iatom%gylmgr(eps_alpha,ic,ilm))
    1135                 :             :                  end if
    1136         [ +  + ]:     3888324 :                  if (idir==eps_alpha)then
    1137                 :             :                    prod(ishift_str2is+(mu-1)*3+idir,ilm)=prod(ishift_str2is+(mu-1)*3+idir,ilm)&
    1138                 :     1296108 : &                   -half*vloc(ic)*(pawfgrtab_iatom%gylmgr(eps_beta,ic,ilm))
    1139                 :             :                  end if
    1140                 :             : !                delta_gammadelta * v_loc * d(gylm)/dR
    1141         [ +  + ]:     3888324 :                  if (mu<=3) then
    1142                 :             :                    prod(ishift_str2is+(mu-1)*3+idir,ilm)=prod(ishift_str2is+(mu-1)*3+idir,ilm)-&
    1143                 :     1944162 :                    vloc(ic)*pawfgrtab_iatom%gylmgr(idir,ic,ilm)
    1144                 :             :                  end if
    1145                 :             : !                dv_loc/deps_alph_beta * d(gylm)/dR
    1146                 :             :                  prod(ishift_str2is+(mu-1)*3+idir,ilm)=prod(ishift_str2is+(mu-1)*3+idir,ilm)-&
    1147                 :     5184432 :                  vpsp1_str(jc,mu)*pawfgrtab_iatom%gylmgr(idir,ic,ilm)
    1148                 :             :                end do
    1149                 :             :              end do
    1150         [ +  + ]:      864306 :              do idir=1,3
    1151                 :             : !              v_loc * d(gylm)/dR
    1152                 :      864072 :                prodp(6+idir,ilm) = prodp(6+idir,ilm)-vloc(ic)*pawfgrtab_iatom%gylmgr(idir,ic,ilm)
    1153                 :             :              end do !end loop idir
    1154                 :             : !            END INTERNAL STRAIN CONTRIBUTION
    1155                 :             : 
    1156                 :             :            end do
    1157                 :             :          end do
    1158                 :             :        end if !optstr2
    1159                 :             : 
    1160                 :             : !      Off-diagonal contributions
    1161   [ +  +  -  + ]:       21529 :        if (optgr2==1.or.optstr2==1) then
    1162         [ +  + ]:         376 :          do jatm=1,natom
    1163                 :         291 :            jatom_tot=atindx1(jatm);jtypat=typat(jatom_tot)
    1164         [ +  + ]:         291 :            jatom=jatom_tot;if (paral_atom.and.save_memory) jatom=atm_indx(jatom_tot)
    1165                 :         291 :            lm_sizej=pawtab(jtypat)%lcut_size**2
    1166                 :             : 
    1167                 :             : !          Retrieve data for the atom j
    1168         [ +  + ]:         291 :            if (save_memory.and.jatom/=iatom) then
    1169                 :         206 :              rcut_jatom=pawtab(jtypat)%rshp
    1170                 :             :              call pawrfgd_fft(ifftsph_tmp,gmet,n1,n2,n3,nfgd_jatom,rcut_jatom,rfgd_tmp,rprimd,&
    1171   [ -  +  -  + ]:         206 : &             ucvol,xred(:,jatom_tot),fft_distrib=fftn3_distrib,fft_index=ffti3_local,me_fft=me_fft)
    1172                 :         206 :              ifft_jatom => ifftsph_tmp ; rfgd_jatom => rfgd_tmp
    1173   [ -  +  +  -  :         824 :              ABI_MALLOC(gylm_jatom,(nfgd_jatom,lm_sizej))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    1174   [ -  +  +  -  :         824 :              ABI_MALLOC(gylmgr_jatom,(3,nfgd_jatom,lm_sizej))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    1175                 :         206 :              opt1=1;opt2=1;opt3=0;gylmgr2_jatom=>gylmgr_jatom
    1176                 :             :              call pawgylm(gylm_jatom,gylmgr_jatom,gylmgr2_jatom,lm_sizej,nfgd_jatom,&
    1177                 :         206 : &             opt1,opt2,opt3,pawtab(typat(jatom_tot)),rfgd_jatom)
    1178   [ +  -  +  + ]:         206 :              if (optgr2==1.and.qne0==1) then
    1179   [ -  +  +  -  :          36 :                ABI_MALLOC(expiqr_jatom,(2,nfgd_jatom))
          +  -  +  -  -  
                +  -  + ]
    1180                 :          12 :                call pawexpiqr(expiqr_jatom,gprimd,nfgd_jatom,qphon,rfgd_jatom,xred(:,jatom_tot))
    1181                 :             :              end if
    1182                 :             :            else
    1183                 :          85 :              pawfgrtab_jatom => pawfgrtab_tot(jatom)
    1184                 :          85 :              nfgd_jatom      =  pawfgrtab_jatom%nfgd
    1185                 :          85 :              ifft_jatom      => pawfgrtab_jatom%ifftsph
    1186                 :          85 :              rfgd_jatom      => pawfgrtab_jatom%rfgd
    1187                 :          85 :              gylm_jatom      => pawfgrtab_jatom%gylm
    1188                 :          85 :              gylmgr_jatom    => pawfgrtab_jatom%gylmgr
    1189                 :          85 :              gylmgr2_jatom   => pawfgrtab_jatom%gylmgr2
    1190                 :          85 :              expiqr_jatom    => pawfgrtab_jatom%expiqr
    1191                 :             :            end if
    1192                 :             : 
    1193                 :             : !          ==== Off-diagonal contribution to frozen wf part of dyn. matrix ====
    1194         [ +  - ]:         291 :            if (optgr2==1) then
    1195                 :         291 :              mu = min(dyfr_cplex,cplex)
    1196   [ +  +  +  + ]:       34125 :              prod_nondiag(jatm)%value(ishift_gr2+1:ishift_gr2+(9*mu),:) = zero
    1197   [ +  +  +  + ]:       13635 :              prodp_nondiag(jatm)%value(ishift2_gr+1:ishift2_gr +(3*mu),:) = zero
    1198   [ +  +  +  - ]:         291 :              if (has_phase.or.cplex==2) then
    1199   [ +  -  +  - ]:          28 :                if (dyfr_cplex==1.or.cplex==1) then
    1200         [ #  # ]:           0 :                  do ilm=1,lm_sizej
    1201         [ #  # ]:           0 :                    do ic=1,nfgd_jatom
    1202                 :           0 :                      jc=2*ifft_jatom(ic)
    1203                 :             :                      tmp(1:3)=vpsp1_gr(jc-1,1:3)*expiqr_jatom(1,ic) &
    1204         [ #  # ]:           0 : &                     -vpsp1_gr(jc  ,1:3)*expiqr_jatom(2,ic)
    1205         [ #  # ]:           0 :                      do mu=1,9
    1206                 :           0 :                        mua=alpha(mu);mub=beta(mu)
    1207                 :             :                        prod_nondiag(jatm)%value(ishift_gr2+mu,ilm)=prod_nondiag(jatm)%value(ishift_gr2+mu,ilm) &
    1208                 :           0 : &                       +tmp(mua)*gylmgr_jatom(mub,ic,ilm)
    1209                 :             :                      end do
    1210         [ #  # ]:           0 :                      do mu=1,3
    1211                 :             :                        prodp_nondiag(jatm)%value(ishift2_gr+mu,ilm)=prodp_nondiag(jatm)%value(ishift2_gr+mu,ilm) &
    1212                 :           0 : &                       -tmp(mu)*gylm_jatom(ic,ilm)
    1213                 :             :                      end do
    1214                 :             :                    end do
    1215                 :             :                  end do
    1216                 :             :                else
    1217         [ +  + ]:         344 :                  do ilm=1,lm_sizej
    1218         [ +  + ]:      649584 :                    do ic=1,nfgd_jatom
    1219                 :      649240 :                      jc=2*ifft_jatom(ic)
    1220                 :             :                      tmp(1:3)=vpsp1_gr(jc-1,1:3)*expiqr_jatom(1,ic) &
    1221         [ +  + ]:     2596960 : &                     -vpsp1_gr(jc  ,1:3)*expiqr_jatom(2,ic)
    1222                 :             :                      tmp(4:6)=vpsp1_gr(jc-1,1:3)*expiqr_jatom(2,ic) &
    1223         [ +  + ]:     2596960 : &                     +vpsp1_gr(jc  ,1:3)*expiqr_jatom(1,ic)
    1224         [ +  + ]:     6492400 :                      do mu=1,9
    1225                 :     5843160 :                        mua=alpha(mu);mub=beta(mu)
    1226                 :             :                        prod_nondiag(jatm)%value(ishift_gr2+mu,ilm)=prod_nondiag(jatm)%value(ishift_gr2+mu,ilm) &
    1227                 :     5843160 : &                       +tmp(mua  )*gylmgr_jatom(mub,ic,ilm)
    1228                 :             :                        prod_nondiag(jatm)%value(ishift_gr2+9+mu,ilm)=prod_nondiag(jatm)%value(ishift_gr2+9+mu,ilm) &
    1229                 :     6492400 : &                       +tmp(3+mua)*gylmgr_jatom(mub,ic,ilm)
    1230                 :             :                      end do
    1231         [ +  + ]:     2597276 :                      do mu=1,3
    1232                 :             :                        prodp_nondiag(jatm)%value(ishift2_gr+mu,ilm)=prodp_nondiag(jatm)%value(ishift2_gr+mu,ilm) &
    1233                 :     1947720 : &                       -tmp(  mu)*gylm_jatom(ic,ilm)
    1234                 :             :                        prodp_nondiag(jatm)%value(ishift2_gr+3+mu,ilm)=prodp_nondiag(jatm)%value(ishift2_gr+3+mu,ilm) &
    1235                 :     2596960 : &                       -tmp(3+mu)*gylm_jatom(ic,ilm)
    1236                 :             :                      end do
    1237                 :             :                    end do
    1238                 :             :                  end do
    1239                 :             :                end if
    1240                 :             :              else ! no phase
    1241         [ +  + ]:        3046 :                do ilm=1,lm_sizej
    1242         [ +  + ]:    13011039 :                  do ic=1,nfgd_jatom
    1243                 :    13007993 :                    jc=ifft_jatom(ic)
    1244         [ +  + ]:   130079930 :                    do mu=1,9
    1245                 :   117071937 :                      mua=alpha(mu);mub=beta(mu)
    1246                 :             :                      prod_nondiag(jatm)%value(ishift_gr2+mu,ilm)=prod_nondiag(jatm)%value(ishift_gr2+mu,ilm) &
    1247                 :   130079930 : &                     +vpsp1_gr(jc,mua)*gylmgr_jatom(mub,ic,ilm)
    1248                 :             :                    end do
    1249         [ +  + ]:    52034755 :                    do mu=1,3
    1250                 :             :                      prodp_nondiag(jatm)%value(ishift2_gr+mu,ilm)=prodp_nondiag(jatm)%value(ishift2_gr+mu,ilm) &
    1251                 :    52031972 : &                     -vpsp1_gr(jc,mu)*gylm_jatom(ic,ilm)
    1252                 :             :                    end do
    1253                 :             :                  end do
    1254                 :             :                end do
    1255                 :             :              end if
    1256                 :             :            end if ! optgr2
    1257                 :             : 
    1258                 :             : !          ==== Off-diagonal contribution to elastic tensor ====
    1259         [ +  + ]:         291 :            if (optstr2==1) then
    1260   [ +  +  +  + ]:       16856 :              prod_nondiag(jatm)%value(ishift_str2is+1:ishift_str2is+18,:)=zero
    1261   [ +  +  +  + ]:        3626 :              prodp_nondiag(jatm)%value(1:3,:)=zero
    1262         [ +  + ]:         980 :              do ilm=1,lm_sizej
    1263         [ +  + ]:      631718 :                do ic=1,nfgd_jatom
    1264                 :      630738 :                  mu=1;jc=ifft_jatom(ic)
    1265                 :             : !                INTERNAL STRAIN CONTRIBUTION:
    1266         [ +  + ]:     4415166 :                  do mua=1,6
    1267                 :     3784428 :                    eps_alpha=eps1(mua);eps_beta=eps2(mua);
    1268                 :             : !                  d(-vloc)/dR * d(gylm)/d(eps_gamma_delta)
    1269         [ +  + ]:    15768450 :                    do idir=1,3
    1270                 :             :                      prod_nondiag(jatm)%value(ishift_str2is+(mua-1)*3+idir,ilm)=&
    1271                 :             : &                     prod_nondiag(jatm)%value(ishift_str2is+(mua-1)*3+idir,ilm)&
    1272                 :             : &                     -vpsp1_gr(jc,idir)*half&
    1273                 :             : &                     *(gylmgr_jatom(eps_alpha,ic,ilm) * rfgd_jatom(eps_beta ,ic)&
    1274                 :    11353284 : &                     +gylmgr_jatom(eps_beta ,ic,ilm) * rfgd_jatom(eps_alpha,ic))
    1275                 :             : !                    delta_alphabeta * d(-v_loc/dr) * gylm
    1276         [ +  + ]:    15137712 :                      if (mua<=3) then
    1277                 :             :                        prod_nondiag(jatm)%value(ishift_str2is+(mua-1)*3+idir,ilm)=&
    1278                 :             : &                       prod_nondiag(jatm)%value(ishift_str2is+(mua-1)*3+idir,ilm)&
    1279                 :     5676642 : &                       -vpsp1_gr(jc,idir)*gylm_jatom(ic,ilm)
    1280                 :             :                      end if
    1281                 :             :                    end do ! dir
    1282                 :             :                  end do ! mua
    1283         [ +  + ]:     2523834 :                  do idir=1,3
    1284                 :             : !                  d(-v_loc/dr) * gylm
    1285                 :             :                    prodp_nondiag(jatm)%value(idir,ilm) = prodp_nondiag(jatm)%value(idir,ilm)&
    1286                 :     2522952 : &                   -vpsp1_gr(jc,idir)*gylm_jatom(ic,ilm)
    1287                 :             :                  end do !end loop idir
    1288                 :             : !                END INTERNAL STRAIN CONTRIBUTION
    1289                 :             :                end do
    1290                 :             :              end do
    1291                 :             :            end if ! optstr2
    1292                 :             : 
    1293                 :             : !          Release temp memory allocated for atom j
    1294         [ +  + ]:       21820 :            if (save_memory.and.jatom/=iatom) then
    1295         [ -  + ]:         206 :              ABI_FREE(ifftsph_tmp)
    1296         [ -  + ]:         206 :              ABI_FREE(rfgd_tmp)
    1297         [ -  + ]:         206 :              ABI_FREE(gylm_jatom)
    1298         [ -  + ]:         206 :              ABI_FREE(gylmgr_jatom)
    1299   [ -  +  +  + ]:         206 :              if (optgr2==1.and.qne0==1) then
    1300         [ -  + ]:          12 :                ABI_FREE(expiqr_jatom)
    1301                 :             :              end if
    1302                 :             :            end if
    1303                 :             : 
    1304                 :             :          end do ! loop on atoms j
    1305                 :             :        end if ! optgr2 or optstr2
    1306                 :             : 
    1307                 :             : !      --- Apply scaling factor on integrals ---
    1308   [ +  +  +  +  :      910203 :        if (ngrad >0) prod (:,:)=prod (:,:)*fact_ucvol
                   +  + ]
    1309   [ +  +  +  +  :       27527 :        if (ngradp>0) prodp(:,:)=prodp(:,:)*fact_ucvol
                   +  + ]
    1310         [ +  + ]:       21529 :        if (ngrad_nondiag>0) then
    1311         [ +  + ]:         376 :          do jatm=1,natom
    1312   [ +  +  +  + ]:       81838 :            prod_nondiag(jatm)%value(:,:)=prod_nondiag(jatm)%value(:,:)*fact_ucvol
    1313                 :             :          end do
    1314                 :             :        end if
    1315         [ +  + ]:       21529 :        if (ngradp_nondiag>0) then
    1316         [ +  + ]:         376 :          do jatm=1,natom
    1317   [ +  +  +  + ]:       16366 :            prodp_nondiag(jatm)%value(:,:)=prodp_nondiag(jatm)%value(:,:)*fact_ucvol
    1318                 :             :          end do
    1319                 :             :        end if
    1320                 :             : 
    1321                 :             : !      --- Reduction in case of parallelization ---
    1322         [ +  + ]:       21529 :        if (paral_grid) then
    1323         [ +  - ]:        1040 :          if (ngrad>0) then
    1324                 :        1040 :            call xmpi_sum(prod,my_comm_grid,ier)
    1325                 :             :          end if
    1326         [ -  + ]:        1040 :          if (ngradp>0) then
    1327                 :           0 :            call xmpi_sum(prodp,my_comm_grid,ier)
    1328                 :             :          end if
    1329         [ -  + ]:        1040 :          if (ngrad_nondiag>0.or.ngradp_nondiag>0) then
    1330                 :           0 :            bufsiz=0;bufind=0
    1331         [ #  # ]:           0 :            do jatm=1,natom
    1332                 :           0 :              jtypat=typat(atindx1(jatm))
    1333                 :           0 :              bufsiz=bufsiz+pawtab(jtypat)%lcut_size**2
    1334                 :             :            end do
    1335   [ #  #  #  #  :           0 :            ABI_MALLOC(buf,(ngrad_nondiag+ngradp_nondiag,bufsiz))
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
    1336         [ #  # ]:           0 :            do jatm=1,natom
    1337                 :           0 :              jtypat=typat(atindx1(jatm))
    1338                 :           0 :              lm_sizej=pawtab(jtypat)%lcut_size**2
    1339         [ #  # ]:           0 :              if (ngrad_nondiag> 0) buf(1:ngrad_nondiag,bufind+1:bufind+lm_sizej)= &
    1340   [ #  #  #  # ]:           0 : &             prod_nondiag(jatm)%value(:,:)
    1341         [ #  # ]:           0 :              if (ngradp_nondiag>0) buf(ngrad_nondiag+1:ngrad_nondiag+ngradp_nondiag, &
    1342   [ #  #  #  # ]:           0 : &             bufind+1:bufind+lm_sizej)=prodp_nondiag(jatm)%value(:,:)
    1343                 :           0 :              bufind=bufind+lm_sizej*(ngrad_nondiag+ngradp_nondiag)
    1344                 :             :            end do
    1345                 :           0 :            call xmpi_sum(buf,my_comm_grid,ier)
    1346                 :           0 :            bufind=0
    1347         [ #  # ]:           0 :            do jatm=1,natom
    1348                 :           0 :              jtypat=typat(atindx1(jatm))
    1349                 :           0 :              lm_sizej=pawtab(jtypat)%lcut_size**2
    1350         [ #  # ]:           0 :              if (ngrad> 0) prod_nondiag(jatm)%value(:,:)= &
    1351   [ #  #  #  # ]:           0 : &             buf(1:ngrad_nondiag,bufind+1:bufind+lm_sizej)
    1352         [ #  # ]:           0 :              if (ngradp>0) prodp_nondiag(jatm)%value(:,:)= &
    1353   [ #  #  #  # ]:           0 : &             buf(ngrad_nondiag+1:ngrad_nondiag+ngradp_nondiag,bufind+1:bufind+lm_sizej)
    1354                 :           0 :              bufind=bufind+lm_sizej*(ngrad_nondiag+ngradp_nondiag)
    1355                 :             :            end do
    1356         [ #  # ]:           0 :            ABI_FREE(buf)
    1357                 :             :          end if
    1358                 :             :        end if
    1359                 :             : 
    1360                 :             : !      ----------------------------------------------------------------
    1361                 :             : !      Compute final sums (i.e. derivatives of Sum_ij[rho_ij.Intg{Qij.Vloc}]
    1362                 :             : 
    1363                 :             : !      ---- Compute terms common to all gradients
    1364                 :       21529 :        jrhoij=1
    1365         [ +  + ]:      576784 :        do irhoij=1,pawrhoij_iatom%nrhoijsel
    1366                 :      555255 :          klmn=pawrhoij_iatom%rhoijselect(irhoij)
    1367                 :      555255 :          klm =pawtab(itypat)%indklmn(1,klmn)
    1368                 :      555255 :          lmin=pawtab(itypat)%indklmn(3,klmn)
    1369                 :      555255 :          lmax=pawtab(itypat)%indklmn(4,klmn)
    1370                 :      555255 :          ro =pawrhoij_iatom%rhoijp(jrhoij,ispden)
    1371                 :      555255 :          ro_d=ro*pawtab(itypat)%dltij(klmn)
    1372   [ +  -  +  + ]:     1570435 :          do ll=lmin,lmax,2
    1373         [ +  + ]:     5373239 :            do ilm=ll**2+1,(ll+1)**2
    1374                 :     3802804 :              isel=pawang%gntselect(ilm,klm)
    1375         [ +  + ]:     4817984 :              if (isel>0) then
    1376                 :      990666 :                grhat_x=ro_d*pawtab(itypat)%qijl(ilm,klmn)
    1377         [ +  + ]:     5542674 :                do mu=1,ngrad
    1378                 :     5542674 :                  grhat_tmp(mu,idiag)=grhat_tmp(mu,idiag)+grhat_x*prod(mu,ilm)
    1379                 :             : ! DEBUG
    1380                 :             : !               if(mu==ishift_str+1 .and. &
    1381                 :             : !&                  (abs(grhat_x*prod(mu,ilm))>tol6 .or. irhoij==1 )      )then
    1382                 :             : !                 write(6,'(a,5i4,3es16.6)')&
    1383                 :             : !&                  'mu,idiag,ilm,irhoij,ll, grhat_tmp(mu,idiag),grhat_x,prod(mu,ilm)=',&
    1384                 :             : !&                   mu,idiag,ilm,irhoij,ll, grhat_tmp(mu,idiag),grhat_x,prod(mu,ilm)
    1385                 :             : !               endif
    1386                 :             : ! ENDDEBUG
    1387                 :             :                end do
    1388                 :             :              end if
    1389                 :             :            end do
    1390                 :             :          end do
    1391                 :      576784 :          jrhoij=jrhoij+pawrhoij_iatom%cplex_rhoij
    1392                 :             :        end do
    1393                 :             : 
    1394                 :             : ! DEBUG
    1395                 :             : !      write(6,*)' Accumulation of grhat_tmp : idiag,grhat_tmp(ishift_str+1,idiag),',idiag,grhat_tmp(ishift_str+1,idiag)
    1396                 :             : ! ENDDEBUG
    1397                 :             : 
    1398                 :             : !      ---- Add additional (diagonal) terms for dynamical matrix
    1399                 :             : !      ---- Terms including rhoij derivatives
    1400         [ +  + ]:       21529 :        if (optgr2==1) then
    1401                 :             :          klmn1=1
    1402         [ +  + ]:        4431 :          do klmn=1,lmn2_size
    1403                 :        4346 :            klm =pawtab(itypat)%indklmn(1,klmn)
    1404                 :        4346 :            lmin=pawtab(itypat)%indklmn(3,klmn)
    1405                 :        4346 :            lmax=pawtab(itypat)%indklmn(4,klmn)
    1406                 :        4346 :            dlt_tmp=pawtab(itypat)%dltij(klmn)
    1407   [ +  -  +  + ]:       11991 :            do ll=lmin,lmax,2
    1408         [ +  + ]:       39854 :              do ilm=ll**2+1,(ll+1)**2
    1409                 :       27863 :                isel=pawang%gntselect(ilm,klm)
    1410         [ +  + ]:       35508 :                if (isel>0) then
    1411                 :        7127 :                  ro_d= dlt_tmp*pawtab(itypat)%qijl(ilm,klmn)
    1412         [ +  + ]:       71270 :                  do mu=1,9
    1413                 :       64143 :                    mua=alpha(mu);mub=beta(mu)
    1414                 :             :                    grhat_tmp(ishift_gr2+mu,idiag)=grhat_tmp(ishift_gr2+mu,idiag)&
    1415                 :       71270 : &                   +ro_d*pawrhoij_iatom%grhoij(ishift_grhoij+mua,klmn1,ispden)*prodp(mub+ishift_gr,ilm)
    1416                 :             :                  end do
    1417                 :             :                end if
    1418                 :             :              end do
    1419                 :             :            end do
    1420                 :        4431 :            klmn1=klmn1+pawrhoij_iatom%cplex_rhoij
    1421                 :             :          end do ! klmn
    1422                 :             :        end if ! optgr2
    1423                 :             : 
    1424                 :             : !      ---- Add additional (diagonal) terms for elastic tensor
    1425                 :             : !      ---- Terms including rhoij derivatives
    1426         [ +  + ]:       21529 :        if (optstr2==1)then
    1427                 :             :          klmn1=1
    1428         [ +  + ]:         962 :          do klmn=1,lmn2_size
    1429                 :         936 :            klm =pawtab(itypat)%indklmn(1,klmn)
    1430                 :         936 :            lmin=pawtab(itypat)%indklmn(3,klmn)
    1431                 :         936 :            lmax=pawtab(itypat)%indklmn(4,klmn)
    1432                 :         936 :            dlt_tmp=pawtab(itypat)%dltij(klmn)
    1433   [ +  -  +  + ]:        2418 :            do ll=lmin,lmax,2
    1434         [ +  + ]:        6708 :              do ilm=ll**2+1,(ll+1)**2
    1435                 :        4290 :                isel=pawang%gntselect(ilm,klm)
    1436         [ +  + ]:        5772 :                if (isel>0) then
    1437                 :        1326 :                  ro_d=dlt_tmp*pawtab(itypat)%qijl(ilm,klmn)
    1438                 :        1326 :                  mu=1
    1439         [ +  + ]:        9282 :                  do mua=1,6
    1440         [ +  + ]:       55692 :                    do mub=1,6
    1441                 :             :                      grhat_tmp(ishift_str2+mu,iatm)= grhat_tmp(ishift_str2+mu,iatm)&
    1442                 :       47736 : &                     +ro_d*pawrhoij_iatom%grhoij(mub,klmn1,ispden)*prodp(mua,ilm)
    1443                 :             :                      grhat_tmp(ishift_str2+mu,iatm)= grhat_tmp(ishift_str2+mu,iatm)&
    1444                 :       47736 : &                     +ro_d*pawrhoij_iatom%grhoij(mua,klmn1,ispden)*prodp(mub,ilm)
    1445                 :       55692 :                      mu=mu+1
    1446                 :             :                    end do
    1447                 :             : !                  INTERNAL STRAIN CONTRIBUTION
    1448         [ +  + ]:       33150 :                    do idir=1,3
    1449                 :             :                      grhat_tmp(ishift_str2is+(mua-1)*3+idir,iatm) = grhat_tmp(ishift_str2is+(mua-1)*3+idir,iatm)&
    1450                 :       23868 : &                     +ro_d*pawrhoij_iatom%grhoij(ishift_grhoij+idir,klmn1,ispden)*prodp(mua,ilm)
    1451                 :             :                      grhat_tmp(ishift_str2is+(mua-1)*3+idir,iatm) = grhat_tmp(ishift_str2is+(mua-1)*3+idir,iatm)&
    1452                 :       31824 : &                     +ro_d*pawrhoij_iatom%grhoij(mua,klmn1,ispden)*prodp(6+idir,ilm)
    1453                 :             :                    end do
    1454                 :             :                  end do
    1455                 :             :                end if
    1456                 :             :              end do
    1457                 :             :            end do
    1458                 :         962 :            klmn1=klmn1+pawrhoij_iatom%cplex_rhoij
    1459                 :             :          end do
    1460                 :             :        end if ! optstr2
    1461                 :             : 
    1462                 :             : !      ---- Add off-diagonal additional contributions for second gradients
    1463   [ +  +  -  + ]:       41174 :        if (optgr2==1.or.optstr2==1) then
    1464         [ +  + ]:         376 :          do jatm=1,natom
    1465                 :         291 :            jatom_tot=atindx1(jatm);jtypat=typat(jatom_tot)
    1466                 :         291 :            pawrhoij_jatom => pawrhoij_tot(jatom_tot)
    1467                 :             : 
    1468                 :             : !          ---- Dynamical matrix
    1469         [ +  - ]:         291 :            if (optgr2==1) then
    1470                 :             : 
    1471                 :             : !            Off-diagonal term including rhoij
    1472   [ +  +  -  + ]:         291 :              if (dyfr_cplex==1.or.cplex==1) then
    1473                 :         263 :                jrhoij=1
    1474         [ +  + ]:        6813 :                do irhoij=1,pawrhoij_jatom%nrhoijsel
    1475                 :        6550 :                  klmn=pawrhoij_jatom%rhoijselect(irhoij)
    1476                 :        6550 :                  klm =pawtab(jtypat)%indklmn(1,klmn)
    1477                 :        6550 :                  lmin=pawtab(jtypat)%indklmn(3,klmn)
    1478                 :        6550 :                  lmax=pawtab(jtypat)%indklmn(4,klmn)
    1479                 :        6550 :                  ro  =pawrhoij_jatom%rhoijp(jrhoij,ispden)
    1480                 :        6550 :                  ro_d=ro*pawtab(jtypat)%dltij(klmn)
    1481   [ +  -  +  + ]:       17529 :                  do ll=lmin,lmax,2
    1482         [ +  + ]:       51096 :                    do ilm=ll**2+1,(ll+1)**2
    1483                 :       33567 :                      isel=pawang%gntselect(ilm,klm)
    1484         [ +  + ]:       44546 :                      if (isel>0) then
    1485                 :       11293 :                        grhat_x=ro_d*pawtab(jtypat)%qijl(ilm,klmn)
    1486         [ +  + ]:      112930 :                        do mu=1,9
    1487                 :             :                          grhat_tmp(ishift_gr2+mu,jatm)=grhat_tmp(ishift_gr2+mu,jatm) &
    1488                 :      112930 : &                         +grhat_x*prod_nondiag(jatm)%value(ishift_gr2+mu,ilm)
    1489                 :             :                        end do
    1490                 :             :                      end if
    1491                 :             :                    end do
    1492                 :             :                  end do
    1493                 :        6813 :                  jrhoij=jrhoij+pawrhoij_jatom%cplex_rhoij
    1494                 :             :                end do
    1495                 :             :              else
    1496                 :          28 :                jrhoij=1;mushift=ishift_gr2+9
    1497         [ +  + ]:         424 :                do irhoij=1,pawrhoij_jatom%nrhoijsel
    1498                 :         396 :                  klmn=pawrhoij_jatom%rhoijselect(irhoij)
    1499                 :         396 :                  klm =pawtab(jtypat)%indklmn(1,klmn)
    1500                 :         396 :                  lmin=pawtab(jtypat)%indklmn(3,klmn)
    1501                 :         396 :                  lmax=pawtab(jtypat)%indklmn(4,klmn)
    1502                 :         396 :                  ro  =pawrhoij_jatom%rhoijp(jrhoij,ispden)
    1503                 :         396 :                  ro_d=ro*pawtab(jtypat)%dltij(klmn)
    1504   [ +  -  +  + ]:        1164 :                  do ll=lmin,lmax,2
    1505         [ +  + ]:        3660 :                    do ilm=ll**2+1,(ll+1)**2
    1506                 :        2496 :                      isel=pawang%gntselect(ilm,klm)
    1507         [ +  + ]:        3264 :                      if (isel>0) then
    1508                 :        1008 :                        grhat_x=ro_d*pawtab(jtypat)%qijl(ilm,klmn)
    1509         [ +  + ]:       10080 :                        do mu=1,9
    1510                 :             :                          grhat_tmp(ishift_gr2+mu,jatm)=grhat_tmp(ishift_gr2+mu,jatm)&
    1511                 :        9072 : &                         +grhat_x*prod_nondiag(jatm)%value(ishift_gr2+mu,ilm)
    1512                 :             :                          grhat_tmp(mushift+mu,jatm)=grhat_tmp(mushift+mu,jatm)&
    1513                 :       10080 : &                         +grhat_x*prod_nondiag(jatm)%value(ishift_gr2+9+mu,ilm)
    1514                 :             :                        end do
    1515                 :             :                      end if
    1516                 :             :                    end do
    1517                 :             :                  end do
    1518                 :         424 :                  jrhoij=jrhoij+pawrhoij_jatom%cplex_rhoij
    1519                 :             :                end do
    1520                 :             :              end if
    1521                 :             : 
    1522                 :             : !            Off-diagonal term including rhoij derivative
    1523   [ +  +  -  + ]:         291 :              if (dyfr_cplex==1.or.cplex==1) then
    1524                 :         263 :                klmn1=1
    1525         [ +  + ]:       11663 :                do klmn=1,pawrhoij_jatom%lmn2_size
    1526                 :       11400 :                  klm =pawtab(jtypat)%indklmn(1,klmn)
    1527                 :       11400 :                  lmin=pawtab(jtypat)%indklmn(3,klmn)
    1528                 :       11400 :                  lmax=pawtab(jtypat)%indklmn(4,klmn)
    1529                 :       11400 :                  dlt_tmp=pawtab(jtypat)%dltij(klmn)
    1530   [ +  -  +  + ]:       30471 :                  do ll=lmin,lmax,2
    1531         [ +  + ]:       93942 :                    do ilm=ll**2+1,(ll+1)**2
    1532                 :       63471 :                      isel=pawang%gntselect(ilm,klm)
    1533         [ +  + ]:       82542 :                      if (isel>0) then
    1534                 :       17517 :                        ro_d=dlt_tmp*pawtab(jtypat)%qijl(ilm,klmn)
    1535         [ +  + ]:      175170 :                        do mu=1,9
    1536                 :      157653 :                          mua=alpha(mu);mub=beta(mu)
    1537                 :             :                          grhat_tmp(ishift_gr2+mu,jatm)=grhat_tmp(ishift_gr2+mu,jatm) &
    1538                 :             : &                         +ro_d*pawrhoij_jatom%grhoij(ishift_grhoij+mua,klmn1,ispden) &
    1539                 :      175170 : &                         *prodp_nondiag(jatm)%value(ishift2_gr+mub,ilm)
    1540                 :             :                        end do
    1541                 :             :                      end if
    1542                 :             :                    end do
    1543                 :             :                  end do
    1544                 :       11663 :                  klmn1=klmn1+pawrhoij_jatom%cplex_rhoij
    1545                 :             :                end do ! klmn
    1546                 :             :              else ! ngradp_nondiag>=6
    1547                 :          28 :                klmn1=1;mushift=ishift_gr2+9
    1548         [ +  + ]:        1576 :                do klmn=1,pawrhoij_jatom%lmn2_size
    1549                 :        1548 :                  klm =pawtab(jtypat)%indklmn(1,klmn)
    1550                 :        1548 :                  lmin=pawtab(jtypat)%indklmn(3,klmn)
    1551                 :        1548 :                  lmax=pawtab(jtypat)%indklmn(4,klmn)
    1552                 :        1548 :                  dlt_tmp=pawtab(jtypat)%dltij(klmn)
    1553   [ +  -  +  + ]:        4364 :                  do ll=lmin,lmax,2
    1554         [ +  + ]:       15084 :                    do ilm=ll**2+1,(ll+1)**2
    1555                 :       10720 :                      isel=pawang%gntselect(ilm,klm)
    1556         [ +  + ]:       13536 :                      if (isel>0) then
    1557                 :        2640 :                        ro_d=dlt_tmp*pawtab(jtypat)%qijl(ilm,klmn)
    1558         [ +  + ]:       26400 :                        do mu=1,9
    1559                 :       23760 :                          mua=alpha(mu);mub=beta(mu)
    1560                 :             :                          grhat_tmp(ishift_gr2+mu,jatm)=grhat_tmp(ishift_gr2+mu,jatm) &
    1561                 :             : &                         +ro_d*pawrhoij_jatom%grhoij(ishift_grhoij+mua,klmn1,ispden) &
    1562                 :       23760 : &                         *prodp_nondiag(jatm)%value(ishift2_gr+mub,ilm)
    1563                 :             :                          grhat_tmp(mushift+mu,jatm)=grhat_tmp(mushift+mu,jatm) &
    1564                 :             : &                         +ro_d*pawrhoij_jatom%grhoij(ishift_grhoij+mua,klmn1,ispden) &
    1565                 :       26400 : &                         *prodp_nondiag(jatm)%value(ishift2_gr+3+mub,ilm)
    1566                 :             :                        end do
    1567                 :             :                      end if
    1568                 :             :                    end do
    1569                 :             :                  end do
    1570                 :        1576 :                  klmn1=klmn1+pawrhoij_jatom%cplex_rhoij
    1571                 :             :                end do
    1572                 :             :              end if
    1573                 :             :            end if ! optgr2
    1574                 :             : 
    1575                 :             : !          ---- Elastic tensor
    1576         [ +  + ]:       21820 :            if (optstr2==1)then
    1577                 :             : 
    1578                 :             : !            Off-diagonal term including rhoij
    1579                 :          98 :              jrhoij=1;
    1580         [ +  + ]:        1658 :              do irhoij=1,pawrhoij_jatom%nrhoijsel
    1581                 :        1560 :                klmn=pawrhoij_jatom%rhoijselect(irhoij)
    1582                 :        1560 :                klm =pawtab(jtypat)%indklmn(1,klmn)
    1583                 :        1560 :                lmin=pawtab(jtypat)%indklmn(3,klmn)
    1584                 :        1560 :                lmax=pawtab(jtypat)%indklmn(4,klmn)
    1585                 :        1560 :                ro  =pawrhoij_jatom%rhoijp(jrhoij,ispden)
    1586                 :        1560 :                ro_d=ro*pawtab(jtypat)%dltij(klmn)
    1587   [ +  -  +  + ]:        4002 :                do ll=lmin,lmax,2
    1588         [ +  + ]:       10740 :                  do ilm=ll**2+1,(ll+1)**2
    1589                 :        6738 :                    isel=pawang%gntselect(ilm,klm)
    1590         [ +  + ]:        9180 :                    if (isel>0) then
    1591                 :        3030 :                      grhat_x=ro_d*pawtab(jtypat)%qijl(ilm,klmn)
    1592         [ +  + ]:       57570 :                      do mu=1,18
    1593                 :             :                        grhat_tmp2(mu,jatm)=grhat_tmp2(mu,jatm) &
    1594                 :       57570 : &                       +grhat_x*prod_nondiag(jatm)%value(ishift_str2is+mu,ilm)
    1595                 :             :                      end do
    1596                 :             :                    end if
    1597                 :             :                  end do
    1598                 :             :                end do
    1599                 :        1658 :                jrhoij=jrhoij+pawrhoij_jatom%cplex_rhoij
    1600                 :             :              end do
    1601                 :             : !            Off-diagonal term including rhoij derivative
    1602                 :          98 :              klmn1=1
    1603         [ +  + ]:        3626 :              do klmn=1,pawrhoij_jatom%lmn2_size
    1604                 :        3528 :                klm =pawtab(jtypat)%indklmn(1,klmn)
    1605                 :        3528 :                lmin=pawtab(jtypat)%indklmn(3,klmn)
    1606                 :        3528 :                lmax=pawtab(jtypat)%indklmn(4,klmn)
    1607                 :        3528 :                dlt_tmp=pawtab(jtypat)%dltij(klmn)
    1608   [ +  -  +  + ]:        9114 :                do ll=lmin,lmax,2
    1609         [ +  + ]:       25284 :                  do ilm=ll**2+1,(ll+1)**2
    1610                 :       16170 :                    isel=pawang%gntselect(ilm,klm)
    1611         [ +  + ]:       21756 :                    if (isel>0) then
    1612                 :        4998 :                      ro_d=dlt_tmp*pawtab(jtypat)%qijl(ilm,klmn)
    1613                 :        4998 :                      mu=1
    1614         [ +  + ]:       34986 :                      do mua=1,6
    1615         [ +  + ]:      124950 :                        do idir=1,3
    1616                 :             :                          grhat_tmp2((mua-1)*3+idir,jatm) = grhat_tmp2((mua-1)*3+idir,jatm) &
    1617                 :             : &                         +ro_d*pawrhoij_jatom%grhoij(mua,klmn1,ispden) &
    1618                 :      119952 : &                         *prodp_nondiag(jatm)%value(idir,ilm)
    1619                 :             :                        end do
    1620                 :             :                      end do
    1621                 :             :                    end if
    1622                 :             :                  end do
    1623                 :             :                end do
    1624                 :        3626 :                klmn1=klmn1+pawrhoij_jatom%cplex_rhoij
    1625                 :             :              end do
    1626                 :             :            end if ! optstr2
    1627                 :             : 
    1628                 :             :          end do ! jatm
    1629                 :             :        end if ! optgr2 or optstr2
    1630                 :             : 
    1631                 :             : !    ----------------------------------------------------------------
    1632                 :             : !    End of loop over spin components
    1633                 :             : 
    1634                 :             :      end do ! ispden
    1635                 :             : 
    1636                 :             : !    Eventually free temporary space for g_l(r).Y_lm(r) factors
    1637         [ -  + ]:       19645 :      if (pawfgrtab_iatom%gylm_allocated==2) then
    1638         [ #  # ]:           0 :        ABI_FREE(pawfgrtab_iatom%gylm)
    1639         [ #  # ]:           0 :        ABI_MALLOC(pawfgrtab_iatom%gylm,(0,0))
    1640                 :           0 :        pawfgrtab_iatom%gylm_allocated=0
    1641                 :             :      end if
    1642         [ +  + ]:       19645 :      if (pawfgrtab_iatom%gylmgr_allocated==2) then
    1643         [ -  + ]:           1 :        ABI_FREE(pawfgrtab_iatom%gylmgr)
    1644         [ -  + ]:           1 :        ABI_MALLOC(pawfgrtab_iatom%gylmgr,(0,0,0))
    1645                 :           1 :        pawfgrtab_iatom%gylmgr_allocated=0
    1646                 :             :      end if
    1647         [ -  + ]:       19645 :      if (pawfgrtab_iatom%gylmgr2_allocated==2) then
    1648         [ #  # ]:           0 :        ABI_FREE(pawfgrtab_iatom%gylmgr2)
    1649         [ #  # ]:           0 :        ABI_MALLOC(pawfgrtab_iatom%gylmgr2,(0,0,0))
    1650                 :           0 :        pawfgrtab_iatom%gylmgr2_allocated=0
    1651                 :             :      end if
    1652         [ -  + ]:       19645 :      if (pawfgrtab_iatom%expiqr_allocated==2) then
    1653         [ #  # ]:           0 :        ABI_FREE(pawfgrtab_iatom%expiqr)
    1654         [ #  # ]:           0 :        ABI_MALLOC(pawfgrtab_iatom%expiqr,(0,0))
    1655                 :           0 :        pawfgrtab_iatom%expiqr_allocated=0
    1656                 :             :      end if
    1657                 :             : 
    1658                 :             : !    ----------------------------------------------------------------
    1659                 :             : !    Copy results in corresponding arrays
    1660                 :             : 
    1661                 :             : !    ==== Forces ====
    1662                 :             : !    Convert from cartesian to reduced coordinates
    1663         [ +  + ]:       19645 :      if (optgr==1) then
    1664                 :       18101 :        mushift=3*(iatm-1)
    1665         [ +  + ]:       72404 :        tmp(1:3)=grhat_tmp(ishift_gr+1:ishift_gr+3,idiag)
    1666         [ +  + ]:       72404 :        do mu=1,3
    1667                 :       72404 :          hatgr(mu+mushift)=rprimd(1,mu)*tmp(1)+rprimd(2,mu)*tmp(2)+rprimd(3,mu)*tmp(3)
    1668                 :             :        end do
    1669                 :             :      end if
    1670                 :             : 
    1671                 :             : !    ==== Stresses ====
    1672         [ +  + ]:       19645 :      if (optstr==1) then
    1673                 :             : !      This is contribution Eq.(41) of Torrent2008.
    1674                 :             : !DEBUG
    1675                 :             : !   write(6,*)' after loop on ispden,ishift_str,idiag,hatstr(1),grhat_tmp(ishift_str+1)',hatstr(1),grhat_tmp(ishift_str+1,idiag)
    1676                 :             : !ENDDEBUG
    1677         [ +  + ]:       18907 :        hatstr(1:6)=hatstr(1:6)+grhat_tmp(ishift_str+1:ishift_str+6,idiag)
    1678                 :             :      end if
    1679                 :             : 
    1680                 :             : !    ==== Frozen wf part of dyn. matrix ====
    1681         [ +  + ]:       19645 :      if (optgr2==1) then
    1682         [ +  + ]:         340 :        do jatm=1,natom
    1683         [ +  + ]:        2650 :          do mu=1,9
    1684                 :        2385 :            mua=alpha(mu);mub=beta(mu)
    1685                 :        2650 :            dyfr(1,mub,mua,jatm,iatm)=grhat_tmp(ishift_gr2+mu,jatm)
    1686                 :             :          end do
    1687   [ +  +  +  - ]:         340 :          if (dyfr_cplex==2.and.cplex==2) then
    1688                 :          26 :            mushift=ishift_gr2+9
    1689         [ +  + ]:         260 :            do mu=1,9
    1690                 :         234 :              mua=alpha(mu);mub=beta(mu)
    1691                 :         260 :              dyfr(2,mub,mua,jatm,iatm)=grhat_tmp(mushift+mu,jatm)
    1692                 :             :            end do
    1693                 :             :          end if
    1694                 :             :        end do
    1695                 :             :      end if
    1696                 :             : 
    1697                 :             : !    ==== Elastic tensor ====
    1698         [ +  + ]:       19645 :      if (optstr2==1) then
    1699                 :             :        eltfr(1:6,1:6)=eltfr(1:6,1:6)+ &
    1700   [ +  +  +  + ]:        1118 : &       reshape(grhat_tmp(ishift_str2+1:ishift_str2+36,iatm),(/6,6/))
    1701                 :             : !      Convert internal Strain in reduced coordinates
    1702         [ +  + ]:         182 :        do mua = 1,6
    1703         [ +  + ]:         624 :          tmp(1:3)=grhat_tmp(ishift_str2is+(mua-1)*3+1:ishift_str2is+(mua-1)*3+3,iatm)
    1704         [ +  + ]:         624 :          do idir=1,3
    1705                 :             :            eltfr(6+(iatm-1)*3+idir,mua)=eltfr(6+(iatm-1)*3+idir,mua)+ &
    1706                 :         624 : &           (rprimd(1,idir)*tmp(1)+rprimd(2,idir)*tmp(2)+rprimd(3,idir)*tmp(3))
    1707                 :             :          end do
    1708         [ +  + ]:         770 :          do jatm=1,natom
    1709         [ +  + ]:        2352 :            tmp(1:3)=grhat_tmp2((mua-1)*3+1:(mua-1)*3+3,jatm)
    1710         [ +  + ]:        2508 :            do idir=1,3
    1711                 :             :              eltfr(6+(iatm-1)*3+idir,mua)=eltfr(6+(iatm-1)*3+idir,mua)+ &
    1712                 :        2352 : &             (rprimd(1,idir)*tmp(1)+rprimd(2,idir)*tmp(2)+rprimd(3,idir)*tmp(3))
    1713                 :             :            end do
    1714                 :             :          end do
    1715                 :             :        end do
    1716                 :             :      end if
    1717                 :             : 
    1718                 :             : !    ----------------------------------------------------------------
    1719                 :             : !    End loops on types and atoms
    1720                 :             : 
    1721         [ -  + ]:       19645 :      ABI_FREE(vloc)
    1722         [ +  + ]:       19645 :      if (ngrad>0)  then
    1723         [ -  + ]:       19625 :        ABI_FREE(prod)
    1724                 :             :      end if
    1725         [ +  + ]:       19645 :      if (ngradp>0)  then
    1726         [ -  + ]:          75 :        ABI_FREE(prodp)
    1727                 :             :      end if
    1728   [ +  +  -  + ]:       31622 :      if (optgr2==1.or.optstr2==1) then
    1729         [ +  + ]:         340 :        do jatm=1,natom
    1730         [ -  + ]:         265 :          ABI_FREE(prod_nondiag(jatm)%value)
    1731         [ -  + ]:       24187 :          ABI_FREE(prodp_nondiag(jatm)%value)
    1732                 :             :        end do
    1733                 :             :      end if
    1734                 :             :    end do ! iatm
    1735                 :       19671 :    iatshft=iatshft+nattyp(itypat)
    1736                 :             :  end do ! itypat
    1737                 :             : 
    1738                 :             : !DEBUG
    1739                 :             : !  write(6,*)' before parallelization over atoms hatstr(1)',hatstr(1)
    1740                 :             : !ENDDEBUG
    1741                 :             : 
    1742                 :             : !Reduction in case of parallelisation over atoms
    1743         [ +  + ]:        7694 :  if (paral_atom) then
    1744                 :        3072 :    bufsiz=3*natom*optgr+6*optstr
    1745                 :        3072 :    if (save_memory) bufsiz=bufsiz+9*dyfr_cplex*natom**2*optgr2+6*(6+3*natom)*optstr2
    1746         [ +  + ]:        3072 :    if (bufsiz>0) then
    1747   [ -  +  +  -  :        9204 :      ABI_MALLOC(buf1,(bufsiz))
          +  -  -  +  -  
                +  -  + ]
    1748   [ +  +  +  + ]:       20108 :      if (optgr==1) buf1(1:3*natom)=hatgr(1:3*natom)
    1749                 :        3068 :      indx=optgr*3*natom
    1750   [ +  +  +  + ]:        6272 :      if (optstr==1) buf1(indx+1:indx+6)=hatstr(1:6)
    1751                 :        3068 :      indx=indx+optstr*6
    1752                 :             :      if (save_memory) then
    1753         [ +  + ]:        3068 :        if (optgr2==1) then
    1754                 :             :          buf1(indx+1:indx+9*dyfr_cplex*natom**2)= &
    1755         [ +  + ]:          44 : &         reshape(dyfr,(/9*dyfr_cplex*natom**2/))
    1756                 :          22 :          indx=indx+9*dyfr_cplex*natom**2
    1757                 :             :        end if
    1758         [ +  + ]:        3068 :        if (optstr2==1) then
    1759                 :             :          buf1(indx+1:indx+6*(6+3*natom))= &
    1760         [ +  + ]:          12 : &         reshape(eltfr,(/6*(6+3*natom)/))
    1761                 :           6 :          indx=indx+6*(6+3*natom)
    1762                 :             :        end if
    1763                 :             :      end if
    1764                 :        3068 :      call xmpi_sum(buf1,my_comm_atom,ier)
    1765   [ +  +  +  + ]:       20108 :      if (optgr==1) hatgr(1:3*natom)=buf1(1:3*natom)
    1766                 :        3068 :      indx=optgr*3*natom
    1767   [ +  +  +  + ]:        6272 :      if (optstr==1) hatstr(1:6)=buf1(indx+1:indx+6)
    1768                 :        3068 :      indx=indx+optstr*6
    1769                 :             :      if (save_memory) then
    1770         [ +  + ]:        3068 :        if (optgr2==1) then
    1771                 :             :          dyfr(1:dyfr_cplex,1:3,1:3,1:natom,1:natom)= &
    1772   [ +  +  +  +  :       10800 : &         reshape(buf1(indx+1:indx+9*dyfr_cplex*natom**2),(/dyfr_cplex,3,3,natom,natom/))
          +  +  +  +  +  
                +  +  + ]
    1773                 :          22 :          indx=indx+9*dyfr_cplex*natom**2
    1774                 :             :        end if
    1775         [ +  + ]:        3068 :        if (optstr2==1) then
    1776                 :             :          eltfr(1:6+3*natom,1:6)= &
    1777   [ +  +  +  +  :         702 : &         reshape(buf1(indx+1:indx+6*(6+3*natom)),(/6+3*natom,6/))
                   +  + ]
    1778                 :           6 :          indx=indx+6*(6+3*natom)
    1779                 :             :        end if
    1780                 :             :      end if
    1781         [ -  + ]:        6136 :      ABI_FREE(buf1)
    1782                 :             :    end if
    1783                 :             :  end if
    1784                 :             : 
    1785                 :             : !Deallocate additional memory
    1786         [ -  + ]:        7694 :  ABI_FREE(grhat_tmp)
    1787   [ +  +  -  + ]:        7694 :  if (optgr2==1.or.optstr2==1) then
    1788         [ -  + ]:          45 :    ABI_FREE(mu4)
    1789         [ -  + ]:          45 :    ABI_FREE(atindx)
    1790   [ -  +  -  - ]:          45 :    if (optgr2==1.or.optstr2==1) then
    1791         [ -  + ]:          45 :      ABI_FREE(vpsp1_gr)
    1792                 :             :    end if
    1793         [ +  + ]:          45 :    if (optstr2==1) then
    1794         [ -  + ]:          12 :      ABI_FREE(grhat_tmp2)
    1795         [ -  + ]:          12 :      ABI_FREE(vpsp1_str)
    1796                 :             :    end if
    1797   [ +  -  +  +  :         181 :    ABI_FREE(prod_nondiag)
             -  +  -  + ]
    1798   [ +  -  +  +  :         181 :    ABI_FREE(prodp_nondiag)
             -  +  -  + ]
    1799                 :             :    if (.not.save_memory) then
    1800                 :             :      do jatom=1,size(pawfgrtab)
    1801                 :             :        pawfgrtab_jatom => pawfgrtab(jatom)
    1802                 :             :        if (pawfgrtab(jatom)%gylm_allocated==2) then
    1803                 :             :          ABI_FREE(pawfgrtab(jatom)%gylm)
    1804                 :             :          ABI_MALLOC(pawfgrtab(jatom)%gylm,(0,0))
    1805                 :             :          pawfgrtab(jatom)%gylm_allocated=0
    1806                 :             :        end if
    1807                 :             :        if (pawfgrtab(jatom)%gylmgr_allocated==2) then
    1808                 :             :          ABI_FREE(pawfgrtab(jatom)%gylmgr)
    1809                 :             :          ABI_MALLOC(pawfgrtab(jatom)%gylmgr,(0,0,0))
    1810                 :             :          pawfgrtab(jatom)%gylmgr_allocated=0
    1811                 :             :        end if
    1812                 :             :        if (pawfgrtab(jatom)%gylmgr2_allocated==2) then
    1813                 :             :          ABI_FREE(pawfgrtab(jatom)%gylmgr2)
    1814                 :             :          ABI_MALLOC(pawfgrtab(jatom)%gylmgr2,(0,0,0))
    1815                 :             :          pawfgrtab(jatom)%gylmgr2_allocated=0
    1816                 :             :        end if
    1817                 :             :        if (pawfgrtab(jatom)%expiqr_allocated==2) then
    1818                 :             :          ABI_FREE(pawfgrtab(jatom)%expiqr)
    1819                 :             :          ABI_MALLOC(pawfgrtab(jatom)%expiqr,(0,0))
    1820                 :             :          pawfgrtab(jatom)%expiqr_allocated=0
    1821                 :             :        end if
    1822                 :             :      end do
    1823                 :             :    end if
    1824         [ +  + ]:          45 :    if (paral_atom) then
    1825                 :             :      if ((.not.save_memory).and.paral_atom_pawfgrtab) then
    1826                 :             :        call pawfgrtab_free(pawfgrtab_tot)
    1827                 :             :        ABI_FREE(pawfgrtab_tot)
    1828                 :             :      end if
    1829         [ +  - ]:          22 :      if (paral_atom_pawrhoij) then
    1830                 :           0 :        call pawrhoij_free(pawrhoij_tot)
    1831         [ #  # ]:           0 :        ABI_FREE(pawrhoij_tot)
    1832                 :             :      end if
    1833                 :             :    end if
    1834                 :             :  end if
    1835                 :             : 
    1836                 :             : !----------------------------------------------------------------------
    1837                 :             : !Update non-local gradients
    1838                 :             : 
    1839                 :             : !===== Update forces =====
    1840         [ +  + ]:        7694 :  if (optgr==1) then
    1841         [ +  + ]:       72778 :    grnl(1:3*natom)=grnl(1:3*natom)+hatgr(1:3*natom)
    1842         [ -  + ]:        6943 :    ABI_FREE(hatgr)
    1843                 :             :  end if
    1844                 :             : 
    1845                 :             : !===== Convert stresses (add diag and off-diag contributions) =====
    1846         [ +  + ]:        7694 :  if (optstr==1) then
    1847                 :             : 
    1848                 :             : !  Has to compute int[nhat*vtrial]. See Eq.(40) in Torrent2008 .
    1849                 :        1420 :    hatstr_diag=zero
    1850   [ +  +  +  + ]:        1420 :    if (nspden==1.or.dimvtrial==1) then
    1851         [ +  + ]:    45287533 :      do ic=1,nfft
    1852                 :    45287533 :        hatstr_diag=hatstr_diag+vtrial_(ic,1)*nhat(ic,1)
    1853                 :             :      end do
    1854         [ +  + ]:         163 :    else if (nspden==2) then
    1855         [ +  + ]:     4381861 :      do ic=1,nfft
    1856                 :     4381861 :        hatstr_diag=hatstr_diag+vtrial_(ic,1)*nhat(ic,2)+vtrial_(ic,2)*(nhat(ic,1)-nhat(ic,2))
    1857                 :             :      end do
    1858         [ +  - ]:          42 :    else if (nspden==4) then
    1859         [ +  + ]:      984385 :      do ic=1,nfft
    1860                 :             :        hatstr_diag=hatstr_diag+half*(vtrial_(ic,1)*(nhat(ic,1)+nhat(ic,4)) &
    1861                 :             : &       +vtrial_(ic,2)*(nhat(ic,1)-nhat(ic,4))) &
    1862                 :      984385 : &       +vtrial_(ic,3)*nhat(ic,2)-vtrial_(ic,4)*nhat(ic,3)
    1863                 :             :      end do
    1864                 :             :    end if
    1865                 :        1420 :    hatstr_diag=hatstr_diag*fact_ucvol
    1866         [ +  + ]:        1420 :    if (paral_grid) then
    1867                 :         236 :      call xmpi_sum(hatstr_diag,my_comm_grid,ier)
    1868                 :             :    end if
    1869                 :             : 
    1870                 :             : !  Convert hat contribution
    1871                 :             : 
    1872                 :             : !DEBUG
    1873                 :             : !  write(6,*)' hatstr(1),hatstr_diag,nlstr(1)=',hatstr(1),hatstr_diag,nlstr(1)
    1874                 :             : !ENDDEBUG
    1875                 :             : 
    1876         [ +  + ]:        5680 :    hatstr(1:3)=(hatstr(1:3)+hatstr_diag)/ucvol
    1877         [ +  + ]:        5680 :    hatstr(4:6)= hatstr(4:6)/ucvol
    1878                 :             : 
    1879                 :             : !  Add to already computed NL contrib
    1880         [ +  + ]:        9940 :    nlstr(1:6)=nlstr(1:6)+hatstr(1:6)
    1881                 :             : 
    1882                 :             : !  Apply symmetries
    1883                 :        1420 :    call stresssym(gprimd,nsym,nlstr,symrec)
    1884                 :             :  end if
    1885                 :             : 
    1886                 :             : !===== Convert dynamical matrix (from cartesian to reduced coordinates) =====
    1887         [ +  + ]:        7694 :  if (optgr2==1) then
    1888         [ +  + ]:         181 :    do iatm=1,natom
    1889         [ +  + ]:         789 :      do jatm=1,natom
    1890         [ +  + ]:        2432 :        do mua=1,3
    1891         [ +  + ]:        7904 :          do mub=1,3
    1892                 :        7296 :            work1(1,mua,mub)=dyfr(1,mub,mua,jatm,iatm)+dyfr(1,mua,mub,iatm,jatm)
    1893                 :             :          end do
    1894                 :             :        end do
    1895         [ +  + ]:         608 :        if (dyfr_cplex==2) then
    1896         [ +  + ]:         200 :          do mua=1,3
    1897         [ +  + ]:         650 :            do mub=1,3
    1898                 :         600 :              work1(2,mua,mub)=dyfr(2,mub,mua,jatm,iatm)-dyfr(2,mua,mub,iatm,jatm)
    1899                 :             :            end do
    1900                 :             :          end do
    1901                 :             :        end if
    1902         [ +  + ]:        2432 :        do mu=1,3
    1903   [ +  +  +  + ]:       13826 :          work2(:,:,mu)=rprimd(1,mu)*work1(:,:,1)+rprimd(2,mu)*work1(:,:,2)+rprimd(3,mu)*work1(:,:,3)
    1904                 :             :        end do
    1905         [ +  + ]:        2568 :        do mub=1,3
    1906         [ +  + ]:        7904 :          do mua=1,3
    1907                 :             :            dyfrnl(:,mua,mub,jatm,iatm)=dyfrnl(:,mua,mub,jatm,iatm) &   ! Already contains NL projectors contribution
    1908                 :             : &          +rprimd(1,mua)*work2(:,1,mub) &
    1909                 :             : &           +rprimd(2,mua)*work2(:,2,mub) &
    1910         [ +  + ]:       13218 : &           +rprimd(3,mua)*work2(:,3,mub)
    1911                 :             :          end do
    1912                 :             :        end do
    1913                 :             :      end do
    1914                 :             :    end do
    1915         [ -  + ]:          45 :    ABI_FREE(dyfr)
    1916                 :             :  end if
    1917                 :             : 
    1918                 :             : !===== Update elastic tensor =====
    1919         [ +  + ]:        7694 :  if (optstr2==1) then
    1920   [ +  +  +  + ]:        1272 :    eltfrnl(1:6+3*natom,1:6)=eltfrnl(1:6+3*natom,1:6)+eltfr(1:6+3*natom,1:6)
    1921         [ -  + ]:          12 :    ABI_FREE(eltfr)
    1922                 :             :  end if
    1923                 :             : 
    1924                 :             : !----------------------------------------------------------------------
    1925                 :             : !End
    1926                 :             : 
    1927                 :             : !Destroy temporary space
    1928         [ +  + ]:        7694 :  if (usexcnhat==0)  then
    1929         [ -  + ]:        5350 :    ABI_FREE(vtrial_)
    1930                 :             :  end if
    1931                 :             : 
    1932                 :             : !Destroy atom tables used for parallelism
    1933                 :        7694 :  call free_my_atmtab(my_atmtab,my_atmtab_allocated)
    1934         [ +  + ]:        7694 :  if (paral_atom) then
    1935         [ -  + ]:        3072 :    ABI_FREE(atm_indx)
    1936                 :             :  end if
    1937                 :             : 
    1938                 :             : !Destroy FFT tables used for parallelism
    1939   [ +  +  +  +  :       15433 :  if ((optgr2==1.or.optstr2==1).and.(.not.present(comm_fft))) then
          -  +  +  -  -  
          +  -  +  -  +  
          -  +  -  -  -  
          -  -  +  -  +  
          -  -  -  -  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
                      + ]
    1940                 :          45 :    call my_distribfft%free()
    1941   [ -  +  -  +  :          45 :    ABI_FREE(my_distribfft)
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
                   -  + ]
    1942                 :             :  end if
    1943                 :             : 
    1944                 :             :  DBG_ENTER("COLL")
    1945                 :             : 
    1946                 :             :  CONTAINS
    1947                 :             : !!***
    1948                 :             : 
    1949                 :             : ! ------------------------------------------------
    1950                 :             : !!****f* pawgrnl/pawgrnl_convert
    1951                 :             : !! NAME
    1952                 :             : !!  pawgrnl_convert
    1953                 :             : !!
    1954                 :             : !! FUNCTION
    1955                 :             : !!  notation: Convert index of the elastic tensor:
    1956                 :             : !!    - voigt notation       => 32
    1957                 :             : !!    - normal notation      => 3 3 2 2
    1958                 :             : !!    - notation for gylmgr2 => 32 32 32 32 => 4 4 4
    1959                 :             : !!
    1960                 :             : !! INPUTS
    1961                 :             : !!  eps_alpha, eps_beta, eps_delta, eps_gamma
    1962                 :             : !!
    1963                 :             : !! OUTPUT
    1964                 :             : !!  mu4(4) = array with index for the second derivative of gylm
    1965                 :             : !!
    1966                 :             : !! SIDE EFFECTS
    1967                 :             : !!  mu4(4) = input : array with index for the second derivative of gylm
    1968                 :             : !!           output: the 4 indexes for the calculation of the second derivative of gylm
    1969                 :             : !!
    1970                 :             : !! SOURCE
    1971                 :             : 
    1972                 :    11664972 : subroutine pawgrnl_convert(mu4,eps_alpha,eps_beta,eps_gamma,eps_delta)
    1973                 :             : 
    1974                 :             : !Arguments ------------------------------------
    1975                 :             :  !scalar
    1976                 :             :  integer,intent(in)  :: eps_alpha,eps_beta
    1977                 :             :  integer,optional,intent(in)  :: eps_gamma,eps_delta
    1978                 :             :  !array
    1979                 :             :  integer,intent(inout) :: mu4(4)
    1980                 :             : 
    1981                 :             : !Local variables-------------------------------
    1982                 :             :  integer :: eps1,eps2,i,j,k
    1983                 :    11664972 :  integer,allocatable :: mu_temp(:)
    1984                 :             : 
    1985                 :             : ! *************************************************************************
    1986                 :             : 
    1987         [ -  + ]:    11664972 :  ABI_MALLOC(mu_temp,(4))
    1988         [ +  - ]:    11664972 :  if (present(eps_gamma).and.present(eps_delta)) then
    1989                 :    11664972 :    mu_temp(1)=eps_alpha
    1990                 :    11664972 :    mu_temp(2)=eps_beta
    1991                 :    11664972 :    mu_temp(3)=eps_gamma
    1992                 :    11664972 :    mu_temp(4)=eps_delta
    1993                 :             :  else
    1994                 :           0 :    mu_temp(1)=eps_alpha
    1995                 :           0 :    mu_temp(2)=eps_beta
    1996                 :           0 :    mu_temp(3)= 0
    1997                 :           0 :    mu_temp(4)= 0
    1998                 :             :  end if
    1999                 :             :  k=1
    2000         [ +  + ]:    34994916 :  do i=1,2
    2001                 :    23329944 :    eps1=mu_temp(i)
    2002         [ +  + ]:    81654804 :    do j=1,2
    2003                 :    46659888 :      eps2=mu_temp(2+j)
    2004         [ +  + ]:    46659888 :      if(eps1==eps2) then
    2005         [ +  + ]:    15553296 :        if(eps1==1) mu4(k)=1;
    2006         [ +  + ]:    15553296 :        if(eps1==2) mu4(k)=2;
    2007         [ +  + ]:    15553296 :        if(eps1==3) mu4(k)=3;
    2008                 :             :      else
    2009   [ +  +  +  + ]:    31106592 :        if((eps1==3.and.eps2==2).or.(eps1==2.and.eps2==3)) mu4(k)=4;
    2010   [ +  +  +  + ]:    31106592 :        if((eps1==3.and.eps2==1).or.(eps1==1.and.eps2==3)) mu4(k)=5;
    2011   [ +  +  +  + ]:    31106592 :        if((eps1==1.and.eps2==2).or.(eps1==2.and.eps2==1)) mu4(k)=6;
    2012                 :             :      end if
    2013                 :    69989832 :      k=k+1
    2014                 :             :    end do
    2015                 :             :  end do
    2016         [ -  + ]:    11664972 :  ABI_FREE(mu_temp)
    2017                 :             : 
    2018                 :    11664972 : end subroutine pawgrnl_convert
    2019                 :             : ! ------------------------------------------------
    2020                 :             : 
    2021                 :             : end subroutine pawgrnl
    2022                 :             : !!***
    2023                 :             : 
    2024                 :             : !----------------------------------------------------------------------
    2025                 :             : 
    2026                 :             : !!****f* m_paw_dfpt/dsdr_k_paw
    2027                 :             : !! NAME
    2028                 :             : !! dsdr_k_paw
    2029                 :             : !!
    2030                 :             : !! FUNCTION
    2031                 :             : !! compute on-site terms for forces and stresses for finite electric fields with PAW
    2032                 :             : !!
    2033                 :             : !! INPUTS
    2034                 :             : !!  cprj_k (pawcprj_type) :: cprj for occupied bands at point k
    2035                 :             : !!  cprj_kb :: cprj for occupied bands at point k+b
    2036                 :             : !!  dtefield :: structure referring to all efield and berry's phase variables
    2037                 :             : !!  kdir :: integer giving direction along which overlap is computed for ket
    2038                 :             : !!  kfor :: integer indicating whether to compute forward (1) or backward (2)
    2039                 :             : !!    along kpt string
    2040                 :             : !!  natom :: number of atoms in cell
    2041                 :             : !!  typat :: typat(natom) type of each atom
    2042                 :             : !!
    2043                 :             : !! OUTPUT
    2044                 :             : !!
    2045                 :             : !! SIDE EFFECTS
    2046                 :             : !! dsdr :: array of the on-site PAW parts of the derivatives with respect to atm
    2047                 :             : !!               positions and/or strains of the overlaps between Bloch states at points
    2048                 :             : !!               k and k+b, for the various pairs of bands
    2049                 :             : !!
    2050                 :             : !! NOTES
    2051                 :             : !! This routine assumes that the cprj are not explicitly ordered by
    2052                 :             : !! atom type.
    2053                 :             : !!
    2054                 :             : !! SOURCE
    2055                 :             : 
    2056                 :      149568 :  subroutine dsdr_k_paw(cprj_k,cprj_kb,dsdr,dtefield,kdir,kfor,mband,natom,ncpgr,typat)
    2057                 :             : 
    2058                 :             : !Arguments---------------------------
    2059                 :             : !scalars
    2060                 :             :  integer,intent(in) :: kdir,kfor,mband,natom,ncpgr
    2061                 :             :  character(len=500) :: message
    2062                 :             :  type(efield_type),intent(in) :: dtefield
    2063                 :             :  type(pawcprj_type),intent(in) :: cprj_k(natom,dtefield%nspinor*mband)
    2064                 :             :  type(pawcprj_type),intent(in) :: cprj_kb(natom,dtefield%nspinor*mband)
    2065                 :             : 
    2066                 :             : !arrays
    2067                 :             :  integer,intent(in) :: typat(natom)
    2068                 :             :  real(dp),intent(inout) :: dsdr(2,natom,ncpgr,dtefield%mband_occ,dtefield%mband_occ)
    2069                 :             : 
    2070                 :             : !Local variables---------------------------
    2071                 :             : !scalars
    2072                 :             :  integer :: iatom,iband,ibs,icpgr,ilmn,ispinor,itypat
    2073                 :             :  integer :: jband,jbs,jlmn,klmn,nspinor
    2074                 :             :  complex(dp) :: cpk,cpkb,dcpk,dcpkb,cterm,paw_onsite
    2075                 :             : ! *************************************************************************
    2076                 :             : 
    2077                 :             : !initialize dsdr
    2078   [ +  +  +  +  :   153905472 :  dsdr(:,:,:,:,:) = zero
          +  +  +  +  +  
                      + ]
    2079                 :             : 
    2080                 :             : ! if 3 gradients we are in the ctocprj choice 2 case
    2081                 :             : ! and the 3 gradients are due to the atomic displacements
    2082                 :             : ! if 6 gradients we are in the ctocprj choice 3 case
    2083                 :             : ! and the 6 gradients are due to the strains
    2084                 :             : ! if 9 gradients we are in the ctocprj choice 23 case
    2085                 :             : ! and the first six are due to strain, last three due to displacements
    2086   [ +  -  -  + ]:      149568 :  if (ncpgr /= 3 .and. ncpgr /= 6 .and. ncpgr /= 9) then
    2087                 :           0 :    message = ' dsdr_k_paw called with ncpgr /= 3, 6, or 9 (no gradients) '
    2088                 :           0 :    ABI_BUG(message)
    2089                 :             :  end if
    2090                 :             : 
    2091                 :             :  nspinor = dtefield%nspinor
    2092                 :             : 
    2093         [ +  + ]:      448704 :  do iatom = 1, natom
    2094                 :      299136 :    itypat = typat(iatom)
    2095                 :             : 
    2096         [ +  + ]:     2841792 :    do ilmn=1,dtefield%lmn_size(itypat)
    2097         [ +  + ]:    21836928 :      do jlmn=1,dtefield%lmn_size(itypat)
    2098                 :    19144704 :        klmn=max(ilmn,jlmn)*(max(ilmn,jlmn)-1)/2 + min(ilmn,jlmn)
    2099                 :             :        paw_onsite = cmplx(dtefield%qijb_kk(1,klmn,iatom,kdir),&
    2100                 :    19144704 : &       dtefield%qijb_kk(2,klmn,iatom,kdir))
    2101         [ -  + ]:    19144704 :        if (kfor > 1) paw_onsite = conjg(paw_onsite)
    2102         [ +  + ]:    98116608 :        do iband = 1, dtefield%mband_occ
    2103         [ +  + ]:   402038784 :          do jband = 1, dtefield%mband_occ
    2104         [ +  + ]:   689209344 :            do ispinor = 1, nspinor
    2105         [ +  + ]:  3369467904 :              do icpgr = 1, ncpgr
    2106                 :  2756837376 :                ibs = nspinor*(iband-1) + ispinor
    2107                 :  2756837376 :                jbs = nspinor*(jband-1) + ispinor
    2108                 :  2756837376 :                cpk=cmplx(cprj_k(iatom,ibs)%cp(1,ilmn),cprj_k(iatom,ibs)%cp(2,ilmn))
    2109                 :  2756837376 :                dcpk=cmplx(cprj_k(iatom,ibs)%dcp(1,icpgr,ilmn),cprj_k(iatom,ibs)%dcp(2,icpgr,ilmn))
    2110                 :  2756837376 :                cpkb=cmplx(cprj_kb(iatom,jbs)%cp(1,jlmn),cprj_kb(iatom,jbs)%cp(2,jlmn))
    2111                 :  2756837376 :                dcpkb=cmplx(cprj_kb(iatom,jbs)%dcp(1,icpgr,jlmn),cprj_kb(iatom,jbs)%dcp(2,icpgr,jlmn))
    2112                 :  2756837376 :                cterm=paw_onsite*(conjg(dcpk)*cpkb+conjg(cpk)*dcpkb)
    2113                 :  2756837376 :                dsdr(1,iatom,icpgr,iband,jband) = dsdr(1,iatom,icpgr,iband,jband)+real(cterm)
    2114                 :  3063152640 :                dsdr(2,iatom,icpgr,iband,jband) = dsdr(2,iatom,icpgr,iband,jband)+aimag(cterm)
    2115                 :             :              end do ! end loop over icpgr
    2116                 :             :            end do ! end loop over ispinor
    2117                 :             :          end do ! end loop over jband
    2118                 :             :        end do ! end loop over iband
    2119                 :             :      end do ! end loop over ilmn
    2120                 :             :    end do ! end loop over jlmn
    2121                 :             : 
    2122                 :             :  end do ! end loop over atoms
    2123                 :             : 
    2124                 :      149568 :  end subroutine    dsdr_k_paw
    2125                 :             : !!***
    2126                 :             : 
    2127                 :             : !----------------------------------------------------------------------
    2128                 :             : 
    2129                 :             : END MODULE m_paw_dfpt
    2130                 :             : !!***
        

Generated by: LCOV version 2.3-1