LCOV - code coverage report
Current view: top level - src/66_vdwxc - m_vdw_dftd3.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 89.0 % 872 776
Test Date: 2026-11-09 22:30:52 Functions: 100.0 % 2 2
Branches: 69.5 % 1831 1273

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_vdw_dftd3
       2                 :             : !! NAME
       3                 :             : !!  m_vdw_dftd3
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !!
       7                 :             : !! COPYRIGHT
       8                 :             : !!  Copyright (C) 2015-2026 ABINIT group (BVT)
       9                 :             : !!  This file is distributed under the terms of the
      10                 :             : !!  GNU General Public License, see ~abinit/COPYING
      11                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
      12                 :             : !!
      13                 :             : !! SOURCE
      14                 :             : 
      15                 :             : #if defined HAVE_CONFIG_H
      16                 :             : #include "config.h"
      17                 :             : #endif
      18                 :             : 
      19                 :             : #include "abi_common.h"
      20                 :             : 
      21                 :             : module m_vdw_dftd3
      22                 :             : 
      23                 :             :  use defs_basis
      24                 :             :  use m_abicore
      25                 :             :  use m_errors
      26                 :             :  use m_atomdata
      27                 :             : 
      28                 :             :  use m_special_funcs,  only : abi_derfc
      29                 :             :  use m_geometry,       only : metric
      30                 :             :  use m_vdw_dftd3_data, only : vdw_dftd3_data
      31                 :             : 
      32                 :             :  implicit none
      33                 :             : 
      34                 :             :  private
      35                 :             : !!***
      36                 :             : 
      37                 :             :  public :: vdw_dftd3
      38                 :             : !!***
      39                 :             : 
      40                 :             : contains
      41                 :             : !!***
      42                 :             : 
      43                 :             : !!****f* ABINIT/vdw_dftd3
      44                 :             : !!
      45                 :             : !! NAME
      46                 :             : !! vdw_dftd3
      47                 :             : !!
      48                 :             : !! FUNCTION
      49                 :             : !! Compute energy, forces, stress, interatomic force constant and elastic
      50                 :             : !! contribution due to dispersion interaction as formulated by Grimme in
      51                 :             : !! the DFT-D3 approach. The last cited adds a dispersion potential
      52                 :             : !! (pair-wise force field, rij^6 and rij^8) to Kohn-Sham DFT energy.
      53                 :             : !! It is also possible to include a three-body term and molecular
      54                 :             : !! dispersion (using vdw_tol_3bt>0).
      55                 :             : !! DFT-D3(Becke and Johnson), another formulation which avoids the use of a damping
      56                 :             : !! function to remove the undesired short-range behaviour
      57                 :             : !!  is also activable using vdw_xc=7
      58                 :             : !!
      59                 :             : !! INPUTS
      60                 :             : !!  ixc=choice of exchange-correlation functional
      61                 :             : !!  natom=number of atoms
      62                 :             : !!  ntypat=number of atom types
      63                 :             : !!  prtvol=printing volume (if >0, print computation parameters)
      64                 :             : !!  typat(natom)=type integer for each atom in cell
      65                 :             : !!  vdw_xc= select van-der-Waals correction
      66                 :             : !!             if =6: DFT-D3 as in Grimme, J. Chem. Phys. 132, 154104 (2010) [[cite:Grimme2010]]
      67                 :             : !!             if =7: DFT-D3(BJ) as in Grimme, Comput. Chem. 32, 1456 (2011) [[cite:Grimme2011]]
      68                 :             : !!                    Only the use of R0 = a1 C8/C6 + a2 is available here
      69                 :             : !!
      70                 :             : !!  vdw_tol=tolerance use to converge the pair-wise potential
      71                 :             : !!          (a pair of atoms is included in potential if its contribution
      72                 :             : !!          is larger than vdw_tol) vdw_tol<0 takes default value (10^-10)
      73                 :             : !!  vdw_tol_3bt= tolerance use to converge three body terms (only for vdw_xc=6)
      74                 :             : !!               a triplet of atom contributes to the correction if its
      75                 :             : !!               contribution is larger than vdw_tol_3bt
      76                 :             : !!  xred(3,natom)=reduced atomic coordinates
      77                 :             : !!  znucl(ntypat)=atomic number of atom type
      78                 :             : !!  === optional input ===
      79                 :             : !!  [qphon(3)]= reduced q-vector along which is computed the DFT-D3 contribution
      80                 :             : !!  to the IFCs in reciprocal space
      81                 :             : !!
      82                 :             : !! OUTPUT
      83                 :             : !!  e_vdw_dftd3=contribution to energy from DFT-D3 dispersion potential
      84                 :             : !!  === optional outputs ===
      85                 :             : !!  [elt_vdw_dftd3(6+3*natom,6)]= contribution to elastic constant and
      86                 :             : !!  internal strains from DFT-D3 dispersion potential
      87                 :             : !!  [gred_vdw_dftd3(3,natom)]=contribution to gradient w.r.to atomic displ.
      88                 :             : !!  from DFT-D3 dispersion potential
      89                 :             : !!  [str_vdw_dftd3(6)]=contribution to stress tensor from DFT-D3 dispersion potential
      90                 :             : !!  [dyn_vdw_dftd3(2,3,natom,3,natom)]= contribution to the interatomic force
      91                 :             : !!  constants (in reciprocal space) at given input q-vector
      92                 :             : !!  from DFT-D3 dispersion potential
      93                 :             : !!
      94                 :             : !! NOTES
      95                 :             : !!  Ref.:
      96                 :             : !!  DFT-D3: S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
      97                 :             : !!  A consistent and accurate ab initio parametrization of density functional
      98                 :             : !!  dispersion correction (DFT-D) for the 94 elements H-Pu
      99                 :             : !!  J. Chem. Phys. 132, 154104 (2010) [[cite:Grimme2010]]
     100                 :             : !!  DFT-D3(BJ) S. Grimme, S. Ehrlich and L. Goerigk
     101                 :             : !!  Effect of the damping function in dispersion corrected density functional theory
     102                 :             : !!  Comput. Chem. 32, 1456 (2011) [[cite:Grimme2011]]
     103                 :             : !!
     104                 :             : !! SOURCE
     105                 :             : 
     106                 :          38 : subroutine vdw_dftd3(e_vdw_dftd3,ixc,natom,ntypat,prtvol,typat,rprimd,vdw_xc,&
     107                 :           4 : &          vdw_tol,vdw_tol_3bt,xred,znucl,dyn_vdw_dftd3,elt_vdw_dftd3,&
     108                 :           8 : &          gred_vdw_dftd3,str_vdw_dftd3,qphon)
     109                 :             : 
     110                 :             : !Arguments ------------------------------------
     111                 :             : !scalars
     112                 :             :  integer,intent(in) :: ixc,natom,ntypat,prtvol,vdw_xc
     113                 :             :  real(dp),intent(in) :: vdw_tol,vdw_tol_3bt
     114                 :             :  real(dp),intent(out) :: e_vdw_dftd3
     115                 :             : !arrays
     116                 :             :  integer,intent(in) :: typat(natom)
     117                 :             :  real(dp),intent(in) ::  rprimd(3,3),xred(3,natom),znucl(ntypat)
     118                 :             :  real(dp),intent(in),optional :: qphon(3)
     119                 :             :  real(dp),intent(out),optional :: dyn_vdw_dftd3(2,3,natom,3,natom)
     120                 :             :  real(dp),intent(out),optional :: elt_vdw_dftd3(6+3*natom,6)
     121                 :             :  real(dp),intent(out),optional :: gred_vdw_dftd3(3,natom)
     122                 :             :  real(dp),intent(out),optional :: str_vdw_dftd3(6)
     123                 :             : 
     124                 :             : !Local variables-------------------------------
     125                 :             : !scalars
     126                 :             : ! The maximal number of reference systems for c6 is 5 (for C)
     127                 :             :  integer,parameter :: vdw_nspecies=94
     128                 :             :  integer:: alpha,beta,ia,ii,indi,indj,index_ia,index_ja,index_ka
     129                 :             :  integer :: is1,is2,is3,itypat,ja,jj,js1,js2,js3
     130                 :             :  integer :: jtypat,ka,kk,ktypat,la,ll,ierr
     131                 :             :  integer :: nline,npairs,nshell
     132                 :             :  integer :: refi,refj,refmax
     133                 :             :  logical :: bol_3bt,found
     134                 :             :  logical :: need_dynmat,need_elast,need_forces,need_grad,need_hess,need_stress,newshell
     135                 :             :  real(dp),parameter :: alpha6=14.0_dp, alpha8=16.0_dp
     136                 :             :  real(dp),parameter:: k1=16.0_dp, k2=15.0_dp, k3=4.0_dp
     137                 :             : 
     138                 :             : ! s6 parameters (BJ case)
     139                 :             :  real(dp),parameter :: vdwbj_s6_b2gpplyp=0.560_dp, vdwbj_s6_ptpss=0.750_dp
     140                 :             :  real(dp),parameter :: vdwbj_s6_b2plyp=0.640_dp,   vdwbj_s6_dsdblyp=0.500_dp
     141                 :             :  real(dp),parameter :: vdwbj_s6_pwpb95=0.820_dp
     142                 :             : ! s8 parameters (BJ case)
     143                 :             :  real(dp),parameter :: vdwbj_s8_b1b95=1.4507_dp,    vdwbj_s8_b2gpplyp=0.2597_dp
     144                 :             :  real(dp),parameter :: vdwbj_s8_b3pw91=2.8524_dp,   vdwbj_s8_bhlyp=1.0354_dp
     145                 :             :  real(dp),parameter :: vdwbj_s8_bmk=2.0860_dp,      vdwbj_s8_bop=3.295_dp
     146                 :             :  real(dp),parameter :: vdwbj_s8_bpbe=4.0728_dp,     vdwbj_s8_camb3lyp=2.0674_dp
     147                 :             :  real(dp),parameter :: vdwbj_s8_lcwpbe=1.8541_dp,   vdwbj_s8_mpw1b95=1.0508_dp
     148                 :             :  real(dp),parameter :: vdwbj_s8_mpwb1k=0.9499_dp,   vdwbj_s8_mpwlyp=2.0077_dp
     149                 :             :  real(dp),parameter :: vdwbj_s8_olyp=2.6205_dp,     vdwbj_s8_opbe=3.3816_dp
     150                 :             :  real(dp),parameter :: vdwbj_s8_otpss=2.7495_dp,    vdwbj_s8_pbe38=1.4623_dp
     151                 :             :  real(dp),parameter :: vdwbj_s8_pbesol=2.9491_dp,   vdwbj_s8_ptpss=0.2804_dp
     152                 :             :  real(dp),parameter :: vdwbj_s8_pwb6k=0.9383_dp,    vdwbj_s8_revssb=0.4389_dp
     153                 :             :  real(dp),parameter :: vdwbj_s8_ssb=-0.1744_dp,     vdwbj_s8_tpssh=2.2382_dp
     154                 :             :  real(dp),parameter :: vdwbj_s8_hcth120=1.0821_dp,  vdwbj_s8_b2plyp=0.9147_dp
     155                 :             :  real(dp),parameter :: vdwbj_s8_b3lyp=1.9889_dp,    vdwbj_s8_b97d=2.2609_dp
     156                 :             :  real(dp),parameter :: vdwbj_s8_blyp=2.6996_dp,     vdwbj_s8_bp86=3.2822_dp
     157                 :             :  real(dp),parameter :: vdwbj_s8_dsdblyp=0.2130_dp,  vdwbj_s8_pbe0=1.2177_dp
     158                 :             :  real(dp),parameter :: vdwbj_s8_pbe=0.7875_dp,      vdwbj_s8_pw6b95=0.7257_dp
     159                 :             :  real(dp),parameter :: vdwbj_s8_pwpb95=0.2904_dp,   vdwbj_s8_revpbe0=1.7588_dp
     160                 :             :  real(dp),parameter :: vdwbj_s8_revpbe38=1.4760_dp, vdwbj_s8_revpbe=2.3550_dp
     161                 :             :  real(dp),parameter :: vdwbj_s8_rpw86pbe=1.3845_dp, vdwbj_s8_tpss0=1.2576_dp
     162                 :             :  real(dp),parameter :: vdwbj_s8_tpss=1.9435_dp
     163                 :             : ! a1 parameters (BJ only)
     164                 :             :  real(dp),parameter :: vdwbj_a1_b1b95=0.2092_dp,    vdwbj_a1_b2gpplyp=0.0000_dp
     165                 :             :  real(dp),parameter :: vdwbj_a1_b3pw91=0.4312_dp,   vdwbj_a1_bhlyp=0.2793_dp
     166                 :             :  real(dp),parameter :: vdwbj_a1_bmk=0.1940_dp,      vdwbj_a1_bop=0.4870_dp
     167                 :             :  real(dp),parameter :: vdwbj_a1_bpbe=0.4567_dp,     vdwbj_a1_camb3lyp=0.3708_dp
     168                 :             :  real(dp),parameter :: vdwbj_a1_lcwpbe=0.3919_dp,   vdwbj_a1_mpw1b95=0.1955_dp
     169                 :             :  real(dp),parameter :: vdwbj_a1_mpwb1k=0.1474_dp,   vdwbj_a1_mpwlyp=0.4831_dp
     170                 :             :  real(dp),parameter :: vdwbj_a1_olyp=0.5299_dp,     vdwbj_a1_opbe=0.5512_dp
     171                 :             :  real(dp),parameter :: vdwbj_a1_otpss=0.4634_dp,    vdwbj_a1_pbe38=0.3995_dp
     172                 :             :  real(dp),parameter :: vdwbj_a1_pbesol=0.4466_dp,   vdwbj_a1_ptpss=0.000_dp
     173                 :             :  real(dp),parameter :: vdwbj_a1_pwb6k=0.1805_dp,    vdwbj_a1_revssb=0.4720_dp
     174                 :             :  real(dp),parameter :: vdwbj_a1_ssb=-0.0952_dp,     vdwbj_a1_tpssh=0.4529_dp
     175                 :             :  real(dp),parameter :: vdwbj_a1_hcth120=0.3563_dp,  vdwbj_a1_b2plyp=0.3065_dp
     176                 :             :  real(dp),parameter :: vdwbj_a1_b3lyp=0.3981_dp,    vdwbj_a1_b97d=0.5545_dp
     177                 :             :  real(dp),parameter :: vdwbj_a1_blyp=0.4298_dp,     vdwbj_a1_bp86=0.3946_dp
     178                 :             :  real(dp),parameter :: vdwbj_a1_dsdblyp=0.000_dp,   vdwbj_a1_pbe0=0.4145_dp
     179                 :             :  real(dp),parameter :: vdwbj_a1_pbe=0.4289_dp,      vdwbj_a1_pw6b95=0.2076_dp
     180                 :             :  real(dp),parameter :: vdwbj_a1_pwpb95=0.0000_dp,   vdwbj_a1_revpbe0=0.4679_dp
     181                 :             :  real(dp),parameter :: vdwbj_a1_revpbe38=0.4309_dp, vdwbj_a1_revpbe=0.5238_dp
     182                 :             :  real(dp),parameter :: vdwbj_a1_rpw86pbe=0.4613_dp, vdwbj_a1_tpss0=0.3768_dp
     183                 :             :  real(dp),parameter :: vdwbj_a1_tpss=0.4535_dp
     184                 :             : ! a2 parameters (BJ only)
     185                 :             :  real(dp),parameter :: vdwbj_a2_b1b95=5.5545_dp,    vdwbj_a2_b2gpplyp=6.3332_dp
     186                 :             :  real(dp),parameter :: vdwbj_a2_b3pw91=4.4693_dp,   vdwbj_a2_bhlyp=4.9615_dp
     187                 :             :  real(dp),parameter :: vdwbj_a2_bmk=5.9197_dp,      vdwbj_a2_bop=3.5043_dp
     188                 :             :  real(dp),parameter :: vdwbj_a2_bpbe=4.3908_dp,     vdwbj_a2_camb3lyp=5.4743_dp
     189                 :             :  real(dp),parameter :: vdwbj_a2_lcwpbe=5.0897_dp,   vdwbj_a2_mpw1b95=6.4177_dp
     190                 :             :  real(dp),parameter :: vdwbj_a2_mpwb1k=6.6223_dp,   vdwbj_a2_mpwlyp=4.5323_dp
     191                 :             :  real(dp),parameter :: vdwbj_a2_olyp=2.8065_dp,     vdwbj_a2_opbe=2.9444_dp
     192                 :             :  real(dp),parameter :: vdwbj_a2_otpss=4.3153_dp,    vdwbj_a2_pbe38=5.1405_dp
     193                 :             :  real(dp),parameter :: vdwbj_a2_pbesol=6.1742_dp,   vdwbj_a2_ptpss=6.5745_dp
     194                 :             :  real(dp),parameter :: vdwbj_a2_pwb6k=7.7627_dp,    vdwbj_a2_revssb=4.0986_dp
     195                 :             :  real(dp),parameter :: vdwbj_a2_ssb=5.2170_dp,      vdwbj_a2_tpssh=4.6550_dp
     196                 :             :  real(dp),parameter :: vdwbj_a2_hcth120=4.3359_dp,  vdwbj_a2_b2plyp=5.0570_dp
     197                 :             :  real(dp),parameter :: vdwbj_a2_b3lyp=4.4211_dp,    vdwbj_a2_b97d=3.2297_dp
     198                 :             :  real(dp),parameter :: vdwbj_a2_blyp=4.2359_dp,     vdwbj_a2_bp86=4.8516_dp
     199                 :             :  real(dp),parameter :: vdwbj_a2_dsdblyp=6.0519_dp,  vdwbj_a2_pbe0=4.8593_dp
     200                 :             :  real(dp),parameter :: vdwbj_a2_pbe=4.4407_dp,      vdwbj_a2_pw6b95=6.3750_dp
     201                 :             :  real(dp),parameter :: vdwbj_a2_pwpb95=7.3141_dp,   vdwbj_a2_revpbe0=3.7619_dp
     202                 :             :  real(dp),parameter :: vdwbj_a2_revpbe38=3.9446_dp, vdwbj_a2_revpbe=3.5016_dp
     203                 :             :  real(dp),parameter :: vdwbj_a2_rpw86pbe=4.5062_dp, vdwbj_a2_tpss0=4.5865_dp
     204                 :             :  real(dp),parameter :: vdwbj_a2_tpss=4.4752_dp
     205                 :             : ! s6 parameters (zero damping)
     206                 :             :  real(dp),parameter :: vdw_s6_b2gpplyp=0.56_dp, vdw_s6_b2plyp=0.64_dp
     207                 :             :  real(dp),parameter :: vdw_s6_dsdblyp=0.50_dp,  vdw_s6_ptpss=0.75_dp
     208                 :             :  real(dp),parameter :: vdw_s6_pwpb95=0.82_dp
     209                 :             : ! s8 parameters (zero damping)
     210                 :             :  real(dp),parameter :: vdw_s8_b1b95=1.868_dp,   vdw_s8_b2gpplyp=0.760_dp
     211                 :             :  real(dp),parameter :: vdw_s8_b3lyp=1.703_dp,   vdw_s8_b97d=0.909_dp
     212                 :             :  real(dp),parameter :: vdw_s8_bhlyp=1.442_dp,   vdw_s8_blyp=1.682_dp
     213                 :             :  real(dp),parameter :: vdw_s8_bp86=1.683_dp,    vdw_s8_bpbe=2.033_dp
     214                 :             :  real(dp),parameter :: vdw_s8_mpwlyp=1.098_dp,  vdw_s8_pbe=0.722_dp
     215                 :             :  real(dp),parameter :: vdw_s8_pbe0=0.928_dp,    vdw_s8_pw6b95=0.862_dp
     216                 :             :  real(dp),parameter :: vdw_s8_pwb6k=0.550_dp,   vdw_s8_revpbe=1.010_dp
     217                 :             :  real(dp),parameter :: vdw_s8_tpss=1.105_dp,    vdw_s8_tpss0=1.242_dp
     218                 :             :  real(dp),parameter :: vdw_s8_tpssh=1.219_dp,   vdw_s8_bop=1.975_dp
     219                 :             :  real(dp),parameter :: vdw_s8_mpw1b95=1.118_dp, vdw_s8_mpwb1k=1.061_dp
     220                 :             :  real(dp),parameter :: vdw_s8_olyp=1.764_dp,    vdw_s8_opbe=2.055_dp
     221                 :             :  real(dp),parameter :: vdw_s8_otpss=1.494_dp,   vdw_s8_pbe38=0.998_dp
     222                 :             :  real(dp),parameter :: vdw_s8_pbesol=0.612_dp,  vdw_s8_revssb=0.560_dp
     223                 :             :  real(dp),parameter :: vdw_s8_ssb=0.663_dp,     vdw_s8_b3pw91=1.775_dp
     224                 :             :  real(dp),parameter :: vdw_s8_bmk=2.168_dp,     vdw_s8_camb3lyp=1.217_dp
     225                 :             :  real(dp),parameter :: vdw_s8_lcwpbe=1.279_dp,  vdw_s8_m052x=0.00_dp
     226                 :             :  real(dp),parameter :: vdw_s8_m05=0.595_dp,     vdw_s8_m062x=0.00_dp
     227                 :             :  real(dp),parameter :: vdw_s8_m06hf=0.00_dp,    vdw_s8_m06l=0.00_dp
     228                 :             :  real(dp),parameter :: vdw_s8_m06=0.00_dp,      vdw_s8_hcth120=1.206_dp
     229                 :             :  real(dp),parameter :: vdw_s8_b2plyp=1.022_dp,  vdw_s8_dsdblyp=0.705_dp
     230                 :             :  real(dp),parameter :: vdw_s8_ptpss=0.879_dp,   vdw_s8_pwpb95=0.705_dp
     231                 :             :  real(dp),parameter :: vdw_s8_revpbe0=0.792_dp, vdw_s8_revpbe38=0.862_dp
     232                 :             :  real(dp),parameter :: vdw_s8_rpw86pbe=0.901_dp
     233                 :             : ! sr6 parameters (zero damping)
     234                 :             :  real(dp),parameter :: vdw_sr6_b1b95=1.613_dp,   vdw_sr6_b2gpplyp=1.586_dp
     235                 :             :  real(dp),parameter :: vdw_sr6_b3lyp=1.261_dp,   vdw_sr6_b97d=0.892_dp
     236                 :             :  real(dp),parameter :: vdw_sr6_bhlyp=1.370_dp,   vdw_sr6_blyp=1.094_dp
     237                 :             :  real(dp),parameter :: vdw_sr6_bp86=1.139_dp,    vdw_sr6_bpbe=1.087_dp
     238                 :             :  real(dp),parameter :: vdw_sr6_mpwlyp=1.239_dp,  vdw_sr6_pbe=1.217_dp
     239                 :             :  real(dp),parameter :: vdw_sr6_pbe0=1.287_dp,    vdw_sr6_pw6b95=1.532_dp
     240                 :             :  real(dp),parameter :: vdw_sr6_pwb6k=1.660_dp,   vdw_sr6_revpbe=0.923_dp
     241                 :             :  real(dp),parameter :: vdw_sr6_tpss=1.166_dp,    vdw_sr6_tpss0=1.252_dp
     242                 :             :  real(dp),parameter :: vdw_sr6_tpssh=1.223_dp,   vdw_sr6_bop=0.929_dp
     243                 :             :  real(dp),parameter :: vdw_sr6_mpw1b95=1.605_dp, vdw_sr6_mpwb1k=1.671_dp
     244                 :             :  real(dp),parameter :: vdw_sr6_olyp=0.806_dp,    vdw_sr6_opbe=0.837_dp
     245                 :             :  real(dp),parameter :: vdw_sr6_otpss=1.128_dp,   vdw_sr6_pbe38=1.333_dp
     246                 :             :  real(dp),parameter :: vdw_sr6_pbesol=1.345_dp,  vdw_sr6_revssb=1.221_dp
     247                 :             :  real(dp),parameter :: vdw_sr6_ssb=1.215_dp,     vdw_sr6_b3pw91=1.176_dp
     248                 :             :  real(dp),parameter :: vdw_sr6_bmk=1.931_dp,     vdw_sr6_camb3lyp=1.378_dp
     249                 :             :  real(dp),parameter :: vdw_sr6_lcwpbe=1.355_dp,  vdw_sr6_m052x=1.417_dp
     250                 :             :  real(dp),parameter :: vdw_sr6_m05=1.373_dp,     vdw_sr6_m062x=1.619_dp
     251                 :             :  real(dp),parameter :: vdw_sr6_m06hf=1.446_dp,   vdw_sr6_m06l=1.581_dp
     252                 :             :  real(dp),parameter :: vdw_sr6_m06=1.325_dp,     vdw_sr6_hcth120=1.221_dp
     253                 :             :  real(dp),parameter :: vdw_sr6_b2plyp=1.427_dp,  vdw_sr6_dsdblyp=1.569_dp
     254                 :             :  real(dp),parameter :: vdw_sr6_ptpss=1.541_dp,   vdw_sr6_pwpb95=1.557_dp
     255                 :             :  real(dp),parameter :: vdw_sr6_revpbe0=0.949_dp, vdw_sr6_revpbe38=1.021_dp
     256                 :             :  real(dp),parameter :: vdw_sr6_rpw86pbe=1.224_dp
     257                 :             : ! sr8 parameters (zero damping) = 1.000_dp
     258                 :             : 
     259                 :             :  real(dp),parameter :: vdw_sr9=3.0/4.0
     260                 :             :  real(dp),parameter :: vdw_tol_default=tol10
     261                 :             :  real(dp) :: ang,arg,cn_dmp,cosa,cosb,cosc,c6,c8
     262                 :             :  real(dp) :: dcosa_r3drij,dcosa_r3drjk,dcosa_r3drki
     263                 :             :  real(dp) :: dcosb_r3drij,dcosb_r3drjk,dcosb_r3drki
     264                 :             :  real(dp) :: dcosc_r3drij,dcosc_r3drjk,dcosc_r3drki
     265                 :             :  real(dp) :: dcn_dmp,dexp_cn,dfdmp,dfdmp_drij
     266                 :             :  real(dp) :: dfdmp_drjk,dfdmp_drki,dlri,dlrj,dmp,dmp6,dmp8,dmp9,dr,d2lri,d2lrj,d2lrirj
     267                 :             :  real(dp) :: dsysref,dsysref_a, dsysref_b
     268                 :             :  real(dp) :: d1_r3drij,d1_r3drjk,d1_r3drki,d2cn_dmp,d2cn_exp,d2frac_cn
     269                 :             :  real(dp) :: d_drij,d_drjk,d_drki
     270                 :             :  real(dp) :: exp_cn,e_no_c6,e_no_c8,e_3bt,fdmp6,fdmp8,fdmp9,frac_cn
     271                 :             :  real(dp) :: grad,grad_no_c,grad6,grad6_no_c6,grad8,grad8_no_c8,gr6,gr8
     272                 :             :  real(dp) :: hess,hessij, hess6, hess8,im_arg,l,ltot
     273                 :             :  real(dp) :: max_vdw_c6,min_dsys,re_arg,rcovij,rcut,rcutcn,rcut2,rcut9
     274                 :             :  real(dp) :: rsq,rsqij,rsqjk,rsqki,rmean,rr,rrij,rrjk,rrki,rijk,r0,r6,r8
     275                 :             :  real(dp) :: sfact6,sfact8,sfact9,sum_dlri,sum_dlrj,sum_dlc6ri,sum_dlc6rj
     276                 :             :  real(dp) :: sum_d2lri,sum_d2lrj,sum_d2lrirj,sum_d2lc6ri,sum_d2lc6rj,sum_d2lc6rirj
     277                 :             :  real(dp) :: temp,temp2
     278                 :             :  real(dp) :: ucvol,vdw_s6,vdw_s8,vdw_sr6,vdw_sr8,vdw_a1,vdw_a2,vdw_q
     279                 :             :  character(len=500) :: msg
     280                 :             :  type(atomdata_t) :: atom1,atom2
     281                 :             : 
     282                 :             : !arrays
     283                 :             : 
     284                 :             : ! Covalence radius of the different species for CN (coordination number)
     285                 :             : real(dp),parameter:: rcov(vdw_nspecies)=&
     286                 :             : &    (/0.80628308, 1.15903197, 3.02356173, 2.36845659, 1.94011865, &
     287                 :             : &      1.88972601, 1.78894056, 1.58736983, 1.61256616, 1.68815527, &
     288                 :             : &      3.52748848, 3.14954334, 2.84718717, 2.62041997, 2.77159820, &
     289                 :             : &      2.57002732, 2.49443835, 2.41884923, 4.43455700, 3.88023730, &
     290                 :             : &      3.35111422, 3.07395437, 3.04875805, 2.77159820, 2.69600923, &
     291                 :             : &      2.62041997, 2.51963467, 2.49443835, 2.54483100, 2.74640188, &
     292                 :             : &      2.82199085, 2.74640188, 2.89757982, 2.77159820, 2.87238349, &
     293                 :             : &      2.94797246, 4.76210950, 4.20778980, 3.70386304, 3.50229216, &
     294                 :             : &      3.32591790, 3.12434702, 2.89757982, 2.84718717, 2.84718717, &
     295                 :             : &      2.72120556, 2.89757982, 3.09915070, 3.22513231, 3.17473967, &
     296                 :             : &      3.17473967, 3.09915070, 3.32591790, 3.30072128, 5.26603625, &
     297                 :             : &      4.43455700, 4.08180818, 3.70386304, 3.98102289, 3.95582657, &
     298                 :             : &      3.93062995, 3.90543362, 3.80464833, 3.82984466, 3.80464833, &
     299                 :             : &      3.77945201, 3.75425569, 3.75425569, 3.72905937, 3.85504098, &
     300                 :             : &      3.67866672, 3.45189952, 3.30072128, 3.09915070, 2.97316878, &
     301                 :             : &      2.92277614, 2.79679452, 2.82199085, 2.84718717, 3.32591790, &
     302                 :             : &      3.27552496, 3.27552496, 3.42670319, 3.30072128, 3.47709584, &
     303                 :             : &      3.57788113, 5.06446567, 4.56053862, 4.20778980, 3.98102289, &
     304                 :             : &      3.82984466, 3.85504098, 3.88023730, 3.90543362 /)
     305                 :             : 
     306                 :             : ! q = arrays of vdw_species elements containing the link between C6ij and C8ij:
     307                 :             : ! C8ij = 3sqrt(qi)sqrt(qj)C6ij
     308                 :             :  real(dp),parameter :: vdw_q_dftd3(vdw_nspecies)= &
     309                 :             : &   (/2.00734898,  1.56637132,  5.01986934,  3.85379032,  3.64446594, &
     310                 :             : &     3.10492822,  2.71175247,  2.59361680,  2.38825250,  2.21522516, &
     311                 :             : &     6.58585536,  5.46295967,  5.65216669,  4.88284902,  4.29727576, &
     312                 :             : &     4.04108902,  3.72932356,  3.44677275,  7.97762753,  7.07623947, &
     313                 :             : &     6.60844053,  6.28791364,  6.07728703,  5.54643096,  5.80491167, &
     314                 :             : &     5.58415602,  5.41374528,  5.28497229,  5.22592821,  5.09817141, &
     315                 :             : &     6.12149689,  5.54083734,  5.06696878,  4.87005108,  4.59089647, &
     316                 :             : &     4.31176304,  9.55461698,  8.67396077,  7.97210197,  7.43439917, &
     317                 :             : &     6.58711862,  6.19536215,  6.01517290,  5.81623410,  5.65710424, &
     318                 :             : &     5.52640661,  5.44263305,  5.58285373,  7.02081898,  6.46815523, &
     319                 :             : &     5.98089120,  5.81686657,  5.53321815,  5.25477007, 11.02204549, &
     320                 :             : &    10.15679528,  9.35167836,  9.06926079,  8.97241155,  8.90092807, &
     321                 :             : &     8.85984840,  8.81736827,  8.79317710,  7.89969626,  8.80588454, &
     322                 :             : &     8.42439218,  8.54289262,  8.47583370,  8.45090888,  8.47339339, &
     323                 :             : &     7.83525634,  8.20702843,  7.70559063,  7.32755997,  7.03887381, &
     324                 :             : &     6.68978720,  6.05450052,  5.88752022,  5.70661499,  5.78450695, &
     325                 :             : &     7.79780729,  7.26443867,  6.78151984,  6.67883169,  6.39024318, &
     326                 :             : &     6.09527958, 11.79156076, 11.10997644,  9.51377795,  8.67197068, &
     327                 :             : &     8.77140725,  8.65402716,  8.53923501,  8.85024712 /)
     328                 :             : 
     329                 :             :  integer  :: is(3), nshell_3bt(3)
     330                 :          19 :  integer,allocatable :: ivdw(:)
     331                 :             :  integer  :: jmin(3), jmax(3), js(3)
     332                 :             :  integer,parameter :: voigt1(6)=(/1,2,3,2,1,1/),voigt2(6)=(/1,2,3,3,3,2/)
     333                 :          19 :  real(dp),allocatable :: cn(:),cfgrad_no_c(:,:,:,:)
     334                 :          19 :  real(dp),allocatable :: dcn(:,:,:),dcn_cart(:,:,:),dc6ri(:,:),dc6rj(:,:),dc9ijri(:,:),dc9ijrj(:,:)
     335                 :             :  !real(dp),allocatable:: d2cn(:,:,:,:,:,:)
     336                 :          19 :  real(dp),allocatable:: d2cn_iii(:,:,:,:)
     337                 :          19 :  real(dp),allocatable:: d2cn_jji(:,:,:,:,:)
     338                 :          19 :  real(dp),allocatable:: d2cn_iji(:,:,:,:,:)
     339                 :          19 :  real(dp),allocatable:: d2cn_jii(:,:,:,:,:)
     340                 :          19 :  real(dp),allocatable:: d2cn_tmp(:)
     341                 :          19 :  real(dp),allocatable :: d2c6ri(:,:),d2c6rj(:,:),d2c6rirj(:,:)
     342                 :          19 :  real(dp),allocatable:: elt_cn(:,:,:),e3bt_ij(:,:),e3bt_jk(:,:),e3bt_ki(:,:),e_no_c(:,:)
     343                 :          19 :  real(dp),allocatable:: e_alpha1(:),e_alpha2(:),e_alpha3(:),e_alpha4(:)
     344                 :             :  real(dp) :: gred(3),gredij(3),gredjk(3),gredki(3)
     345                 :          19 :  real(dp),allocatable:: fe_no_c(:,:,:),cfdcn(:,:,:,:),fdcn(:,:,:,:),fgrad_no_c(:,:,:,:),gred_vdw_3bt(:,:)
     346                 :             :  real(dp) :: gmet(3,3),gprimd(3,3)
     347                 :          19 :  real(dp),allocatable:: grad_no_cij(:,:,:)
     348                 :             :  real(dp) :: mcart(3,3)
     349                 :             :  real(dp) :: r(3),rcart(3),rcart2(3,3),rcartij(3),rcartjk(3),rcartki(3)
     350                 :             :  real(dp):: rij(3), rjk(3), rki(3),rmet(3,3),rred(3)
     351                 :          19 :  real(dp),allocatable:: r0ijk(:,:,:)
     352                 :          19 :  real(dp),allocatable :: str_alpha1(:,:),str_alpha2(:,:),str_dcn(:,:),str_no_c(:,:,:)
     353                 :             :  real(dp) :: str_3bt(6)
     354                 :             :  real(dp) :: temp_comp(2),temp_comp2(2)
     355                 :          19 :  real(dp),allocatable:: temp_prod(:,:)
     356                 :             :  real(dp) :: vec(6),vecij(6), vecjk(6),vecki(6)
     357                 :          19 :  real(dp),allocatable :: vdw_cnrefi(:,:,:,:),vdw_cnrefj(:,:,:,:)
     358                 :          19 :  real(dp),allocatable :: vdw_c6(:,:),vdw_c6ref(:,:,:,:),vdw_c8(:,:),vdw_c9(:,:,:),vdw_r0(:,:)
     359                 :             :  real(dp):: vdw_dftd3_r0(4465)
     360                 :             :  real(dp):: vdw_dftd3_c6(32385)
     361                 :             :  integer:: index_c6(254)
     362                 :             :  real(dp):: vdw_dftd3_cni(27884)
     363                 :             :  integer:: index_cni(27884)
     364                 :             :  real(dp):: vdw_dftd3_cnj(13171)
     365                 :             :  integer:: index_cnj(13171)
     366                 :          19 :  real(dp),allocatable :: xred01(:,:)
     367                 :             : 
     368                 :             : ! *************************************************************************
     369                 :             : 
     370                 :             :  DBG_ENTER("COLL")
     371                 :             : 
     372                 :             :  write(msg,'(1a)')&
     373                 :          19 : & '====> STARTING DFT-D3 computation'
     374                 :          19 :  call wrtout(std_out,msg,'COLL')
     375                 :             : 
     376                 :             :  call vdw_dftd3_data(vdw_dftd3_r0,vdw_dftd3_c6,index_c6,vdw_dftd3_cni,index_cni,&
     377                 :          19 : & vdw_dftd3_cnj,index_cnj)
     378                 :             : ! Determine the properties which have to be studied
     379                 :          19 :  bol_3bt = (vdw_tol_3bt>0)
     380                 :          19 :  need_forces = present(gred_vdw_dftd3)
     381                 :          19 :  need_stress= present(str_vdw_dftd3)
     382                 :          19 :  need_dynmat= present(dyn_vdw_dftd3)
     383                 :          19 :  need_elast= present(elt_vdw_dftd3)
     384   [ +  +  +  - ]:          19 :  need_grad=(need_forces.or.need_stress.or.need_dynmat.or.need_elast)
     385                 :          19 :  need_hess=(need_dynmat.or.need_elast)
     386         [ +  + ]:          19 :  if (need_dynmat) then
     387         [ -  + ]:           3 :    if (.not.present(qphon)) then
     388                 :           0 :      msg='Dynamical matrix required without a q-vector'
     389                 :           0 :      ABI_BUG(msg)
     390                 :             :    end if
     391   [ +  +  +  +  :         199 :    dyn_vdw_dftd3=zero
          +  +  +  +  +  
                      + ]
     392                 :             :  end if
     393                 :          19 :  e_vdw_dftd3 = zero
     394   [ +  +  +  +  :          55 :  if (need_forces) gred_vdw_dftd3=zero
                   +  + ]
     395         [ +  + ]:          19 :  if (need_stress) str_vdw_dftd3=zero
     396   [ +  +  +  +  :          97 :  if (need_elast) elt_vdw_dftd3=zero
                   +  + ]
     397                 :             : 
     398                 :             : !Identify type(s) of atoms
     399   [ -  +  +  -  :          57 :  ABI_MALLOC(ivdw,(ntypat))
          +  -  +  -  -  
                +  -  + ]
     400         [ +  + ]:          42 :  do itypat=1,ntypat
     401                 :          23 :    call atomdata_from_znucl(atom1,znucl(itypat))
     402         [ -  + ]:          42 :    if (znucl(itypat).gt.94.0_dp) then
     403                 :             :      write(msg,'(3a,es14.2)') &
     404                 :           0 : &     'Van der Waals DFT-D3 correction not available for atom type: ',znucl(itypat),' !'
     405                 :           0 :      ABI_ERROR(msg)
     406                 :             :    else
     407                 :          23 :      ivdw(itypat) = znucl(itypat)
     408                 :             :    end if
     409                 :             :  end do
     410                 :             : 
     411                 :             : ! Determination of coefficients that depend of the
     412                 :             : ! exchange-correlation functional
     413                 :          19 :  vdw_s6 =one; vdw_s8 =one
     414                 :          19 :  vdw_sr6=one; vdw_sr8=one
     415                 :          19 :  vdw_a1 =one; vdw_a2 =one
     416                 :             : ! Case one : DFT-D3
     417         [ +  + ]:          19 :  if (vdw_xc == 6) then
     418                 :          20 :    select case (ixc)
     419                 :             :    case(11, -130101, -101130)
     420                 :          10 :      vdw_sr6=vdw_sr6_pbe; vdw_s8=vdw_s8_pbe
     421                 :             :    case(14, -130102, -102130)
     422                 :           0 :      vdw_sr6=vdw_sr6_revpbe; vdw_s8=vdw_s8_revpbe
     423                 :             :    case(18, -131106, -106131)
     424                 :           0 :      vdw_sr6=vdw_sr6_blyp; vdw_s8=vdw_s8_blyp
     425                 :             :    case(19, -132106, -106132)
     426                 :           0 :      vdw_sr6=vdw_sr6_bp86; vdw_s8=vdw_s8_bp86
     427                 :             :    case(41, -406)
     428                 :           0 :      vdw_sr6=vdw_sr6_pbe0; vdw_s8=vdw_s8_pbe0
     429                 :             :    case(-440)
     430                 :           0 :      vdw_sr6=vdw_sr6_b1b95; vdw_s8=vdw_s8_b1b95
     431                 :             :    case(-402)
     432                 :           0 :      vdw_sr6=vdw_sr6_b3lyp; vdw_s8=vdw_s8_b3lyp
     433                 :             :    case(-170)
     434                 :           0 :      vdw_sr6=vdw_sr6_b97d; vdw_s8=vdw_s8_b97d
     435                 :             :    case(-435)
     436                 :           0 :      vdw_sr6=vdw_sr6_bhlyp; vdw_s8=vdw_s8_bhlyp
     437                 :             :    case(-130106, -106130)
     438                 :           0 :      vdw_sr6=vdw_sr6_bpbe; vdw_s8=vdw_s8_bpbe
     439                 :             :    case(-174)
     440                 :           0 :      vdw_sr6=vdw_sr6_mpwlyp; vdw_s8=vdw_s8_mpwlyp
     441                 :             :    case(-451)
     442                 :           0 :      vdw_sr6=vdw_sr6_pw6b95; vdw_s8=vdw_s8_pw6b95
     443                 :             :    case(-452)
     444                 :           0 :      vdw_sr6=vdw_sr6_pwb6k; vdw_s8=vdw_s8_pwb6k
     445                 :             :    case(-231202, -202231)
     446                 :           0 :      vdw_sr6=vdw_sr6_tpss; vdw_s8=vdw_s8_tpss
     447                 :             :    case(-396)
     448                 :           0 :      vdw_sr6=vdw_sr6_tpss0; vdw_s8=vdw_s8_tpss0
     449                 :             :    case(-457)
     450                 :           0 :      vdw_sr6=vdw_sr6_tpssh; vdw_s8=vdw_s8_tpssh
     451                 :             :    case(-636)
     452                 :           0 :      vdw_sr6=vdw_sr6_bop; vdw_s8=vdw_s8_bop
     453                 :             :    case(-445)
     454                 :           0 :      vdw_sr6=vdw_sr6_mpw1b95; vdw_s8=vdw_s8_mpw1b95
     455                 :             :    case(-446)
     456                 :           0 :      vdw_sr6=vdw_sr6_mpwb1k; vdw_s8=vdw_s8_mpwb1k
     457                 :             :    case(-67)
     458                 :           0 :      vdw_sr6=vdw_sr6_olyp; vdw_s8=vdw_s8_olyp
     459                 :             :    case(-65)
     460                 :           0 :      vdw_sr6=vdw_sr6_opbe; vdw_s8=vdw_s8_opbe
     461                 :             :    case(-64)
     462                 :           0 :      vdw_sr6=vdw_sr6_otpss; vdw_s8=vdw_s8_otpss
     463                 :             :    case(-393)
     464                 :           0 :      vdw_sr6=vdw_sr6_pbe38; vdw_s8=vdw_s8_pbe38
     465                 :             :    case(-133116, -116133)
     466                 :           0 :      vdw_sr6=vdw_sr6_pbesol; vdw_s8=vdw_s8_pbesol
     467                 :             :    case(-312089, -89312)
     468                 :           0 :      vdw_sr6=vdw_sr6_revssb; vdw_s8=vdw_s8_revssb
     469                 :             :    case(-91089, -89091)
     470                 :           0 :      vdw_sr6=vdw_sr6_ssb; vdw_s8=vdw_s8_ssb
     471                 :             :    case(-401)
     472                 :           0 :      vdw_sr6=vdw_sr6_b3pw91; vdw_s8=vdw_s8_b3pw91
     473                 :             :    case(-280279, -279280)
     474                 :           0 :      vdw_sr6=vdw_sr6_bmk; vdw_s8=vdw_s8_bmk
     475                 :             :    case(-433)
     476                 :           0 :      vdw_sr6=vdw_sr6_camb3lyp; vdw_s8=vdw_s8_camb3lyp
     477                 :             :    case(-478)
     478                 :           0 :      vdw_sr6=vdw_sr6_lcwpbe; vdw_s8=vdw_s8_lcwpbe
     479                 :             :    case(-439238, -238439)
     480                 :           0 :      vdw_sr6=vdw_sr6_m052x; vdw_s8=vdw_s8_m052x
     481                 :             :    case(-438237, -237438)
     482                 :           0 :      vdw_sr6=vdw_sr6_m05; vdw_s8=vdw_s8_m05
     483                 :             :    case(-450236, -236450)
     484                 :           0 :      vdw_sr6=vdw_sr6_m062x; vdw_s8=vdw_s8_m062x
     485                 :             :    case(-444234, -234444)
     486                 :           0 :      vdw_sr6=vdw_sr6_m06hf; vdw_s8=vdw_s8_m06hf
     487                 :             :    case(-203233, -233203)
     488                 :           0 :      vdw_sr6=vdw_sr6_m06l; vdw_s8=vdw_s8_m06l
     489                 :             :    case(-449235, -235449)
     490                 :           0 :      vdw_sr6=vdw_sr6_m06; vdw_s8=vdw_s8_m06
     491                 :             :    case(-162)
     492                 :           0 :      vdw_sr6=vdw_sr6_hcth120; vdw_s8=vdw_s8_hcth120
     493                 :             :    case(-456)
     494                 :           0 :      vdw_sr6=vdw_sr6_revpbe0; vdw_s8=vdw_s8_revpbe0
     495                 :             :    case(-30108, -108030)
     496                 :           0 :      vdw_sr6=vdw_sr6_rpw86pbe; vdw_s8=vdw_s8_rpw86pbe
     497                 :             :    case default
     498                 :           0 :      write(msg,'(a,i8,a)')'  Van der Waals DFT-D3 correction not compatible with ixc=',ixc,' !'
     499   [ +  -  -  -  :          10 :      ABI_ERROR(msg)
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
                      - ]
     500                 :             :    end select
     501                 :             : ! Case DFT-D3(BJ)
     502         [ +  - ]:           9 :  elseif (vdw_xc == 7) then
     503                 :          18 :    select case (ixc)
     504                 :             :    case(11, -130101, -101130)
     505                 :           9 :      vdw_s8=vdwbj_s8_pbe; vdw_a1=vdwbj_a1_pbe; vdw_a2=vdwbj_a2_pbe
     506                 :             :    case(14, -130102, -102130)
     507                 :           0 :      vdw_s8=vdwbj_s8_revpbe; vdw_a1=vdwbj_a1_revpbe; vdw_a2=vdwbj_a2_revpbe
     508                 :             :    case(18, -131106, -106131)
     509                 :           0 :      vdw_s8=vdwbj_s8_blyp; vdw_a1=vdwbj_a1_blyp; vdw_a2=vdwbj_a2_blyp
     510                 :             :    case(19, -132106, -106132)
     511                 :           0 :      vdw_s8=vdwbj_s8_bp86; vdw_a1=vdwbj_a1_bp86; vdw_a2=vdwbj_a2_bp86
     512                 :             :    case(41, -406)
     513                 :           0 :      vdw_s8=vdwbj_s8_pbe0; vdw_a1=vdwbj_a1_pbe0; vdw_a2=vdwbj_a2_pbe0
     514                 :             :    case(-440)
     515                 :           0 :      vdw_s8=vdwbj_s8_b1b95; vdw_a1=vdwbj_a1_b1b95; vdw_a2=vdwbj_a2_b1b95
     516                 :             :    case(-401)
     517                 :           0 :      vdw_s8=vdwbj_s8_b3pw91; vdw_a1=vdwbj_a1_b3pw91; vdw_a2=vdwbj_a2_b3pw91
     518                 :             :    case(-435)
     519                 :           0 :      vdw_s8=vdwbj_s8_bhlyp; vdw_a1=vdwbj_a1_bhlyp; vdw_a2=vdwbj_a2_bhlyp
     520                 :             :    case(-280279, -279280)
     521                 :           0 :      vdw_s8=vdwbj_s8_bmk; vdw_a1=vdwbj_a1_bmk; vdw_a2=vdwbj_a2_bmk
     522                 :             :    case(-636)
     523                 :           0 :      vdw_s8=vdwbj_s8_bop; vdw_a1=vdwbj_a1_bop; vdw_a2=vdwbj_a2_bop
     524                 :             :    case(-130106, -106130)
     525                 :           0 :      vdw_s8=vdwbj_s8_bpbe; vdw_a1=vdwbj_a1_bpbe; vdw_a2=vdwbj_a2_bpbe
     526                 :             :    case(-433)
     527                 :           0 :      vdw_s8=vdwbj_s8_camb3lyp; vdw_a1=vdwbj_a1_camb3lyp; vdw_a2=vdwbj_a2_camb3lyp
     528                 :             :    case(-478)
     529                 :           0 :      vdw_s8=vdwbj_s8_lcwpbe; vdw_a1=vdwbj_a1_lcwpbe; vdw_a2=vdwbj_a2_lcwpbe
     530                 :             :    case(-445)
     531                 :           0 :      vdw_s8=vdwbj_s8_mpw1b95; vdw_a1=vdwbj_a1_mpw1b95; vdw_a2=vdwbj_a2_mpw1b95
     532                 :             :    case(-446)
     533                 :           0 :      vdw_s8=vdwbj_s8_mpwb1k; vdw_a1=vdwbj_a1_mpwb1k; vdw_a2=vdwbj_a2_mpwb1k
     534                 :             :    case(-174)
     535                 :           0 :      vdw_s8=vdwbj_s8_mpwlyp; vdw_a1=vdwbj_a1_mpwlyp; vdw_a2=vdwbj_a2_mpwlyp
     536                 :             :    case(-67)
     537                 :           0 :      vdw_s8=vdwbj_s8_olyp; vdw_a1=vdwbj_a1_olyp; vdw_a2=vdwbj_a2_olyp
     538                 :             :    case(-65)
     539                 :           0 :      vdw_s8=vdwbj_s8_opbe; vdw_a1=vdwbj_a1_opbe; vdw_a2=vdwbj_a2_opbe
     540                 :             :    case(-64)
     541                 :           0 :      vdw_s8=vdwbj_s8_otpss; vdw_a1=vdwbj_a1_otpss; vdw_a2=vdwbj_a2_otpss
     542                 :             :    case(-393)
     543                 :           0 :      vdw_s8=vdwbj_s8_pbe38; vdw_a1=vdwbj_a1_pbe38; vdw_a2=vdwbj_a2_pbe38
     544                 :             :    case(-133116, -116133)
     545                 :           0 :      vdw_s8=vdwbj_s8_pbesol; vdw_a1=vdwbj_a1_pbesol; vdw_a2=vdwbj_a2_pbesol
     546                 :             :    case(-452)
     547                 :           0 :      vdw_s8=vdwbj_s8_pwb6k; vdw_a1=vdwbj_a1_pwb6k; vdw_a2=vdwbj_a2_pwb6k
     548                 :             :    case(-312089, -89312)
     549                 :           0 :      vdw_s8=vdwbj_s8_revssb; vdw_a1=vdwbj_a1_revssb; vdw_a2=vdwbj_a2_revssb
     550                 :             :    case(-91089, -89091)
     551                 :           0 :      vdw_s8=vdwbj_s8_ssb; vdw_a1=vdwbj_a1_ssb; vdw_a2=vdwbj_a2_ssb
     552                 :             :    case(-457)
     553                 :           0 :      vdw_s8=vdwbj_s8_tpssh; vdw_a1=vdwbj_a1_tpssh; vdw_a2=vdwbj_a2_tpssh
     554                 :             :    case(-162)
     555                 :           0 :      vdw_s8=vdwbj_s8_hcth120; vdw_a1=vdwbj_a1_hcth120; vdw_a2=vdwbj_a2_hcth120
     556                 :             :    case(-402)
     557                 :           0 :      vdw_s8=vdwbj_s8_b3lyp; vdw_a1=vdwbj_a1_b3lyp; vdw_a2=vdwbj_a2_b3lyp
     558                 :             :    case(-170)
     559                 :           0 :      vdw_s8=vdwbj_s8_b97d; vdw_a1=vdwbj_a1_b97d; vdw_a2=vdwbj_a2_b97d
     560                 :             :    case(-451)
     561                 :           0 :      vdw_s8=vdwbj_s8_pw6b95; vdw_a1=vdwbj_a1_pw6b95; vdw_a2=vdwbj_a2_pw6b95
     562                 :             :    case(-30108, -108030)
     563                 :           0 :      vdw_s8=vdwbj_s8_rpw86pbe; vdw_a1=vdwbj_a1_rpw86pbe; vdw_a2=vdwbj_a2_rpw86pbe
     564                 :             :    case(-396)
     565                 :           0 :      vdw_s8=vdwbj_s8_tpss0; vdw_a1=vdwbj_a1_tpss0; vdw_a2=vdwbj_a2_tpss0
     566                 :             :    case(-231202, -202231)
     567                 :           0 :      vdw_s8=vdwbj_s8_tpss; vdw_a1=vdwbj_a1_tpss; vdw_a2=vdwbj_a2_tpss
     568                 :             :    case default
     569                 :           0 :      write(msg,'(a,i8,a)')'  Van der Waals DFT-D3(BJ) correction not compatible with ixc=',ixc,' !'
     570   [ +  -  -  -  :           9 :      ABI_ERROR(msg)
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
             -  -  -  - ]
     571                 :             :    end select
     572                 :             :  end if
     573                 :             : 
     574                 :             : ! --------------------------------------------------------------
     575                 :             : ! Retrieve the data for the referenced c6, cn and r0 coefficients
     576                 :             : !---------------------------------------------------------------
     577                 :          19 :  refmax = 5
     578                 :             : 
     579   [ -  +  +  -  :         114 :  ABI_MALLOC(vdw_c6ref,(ntypat,ntypat,refmax,refmax))
          -  +  +  -  +  
          -  +  -  +  -  
          +  -  -  +  -  
                      + ]
     580   [ -  +  +  -  :          57 :  ABI_MALLOC(vdw_cnrefi,(ntypat,ntypat,refmax,refmax))
          -  +  +  -  -  
                +  -  + ]
     581   [ -  +  +  -  :          57 :  ABI_MALLOC(vdw_cnrefj,(ntypat,ntypat,refmax,refmax))
          -  +  +  -  -  
                +  -  + ]
     582   [ -  +  +  -  :          76 :  ABI_MALLOC(vdw_r0,(ntypat,ntypat))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     583         [ +  + ]:          19 :  if (bol_3bt) then
     584   [ -  +  +  -  :          50 :    ABI_MALLOC(r0ijk,(ntypat,ntypat,ntypat))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                      + ]
     585                 :             :  end if
     586                 :             : 
     587   [ +  +  +  +  :        1939 :  vdw_c6ref = zero
             +  +  +  + ]
     588   [ +  +  +  +  :        3859 :  vdw_cnrefi = 100 ; vdw_cnrefj = 100 ;
          +  +  +  +  +  
          +  +  +  +  +  
                   +  + ]
     589                 :             : 
     590         [ +  + ]:         114 :  do refi=1,refmax
     591         [ +  + ]:         399 :    do refj=1,refi
     592         [ +  + ]:         725 :      do itypat=1,ntypat
     593         [ +  + ]:        1095 :        do jtypat=1,ntypat
     594                 :         465 :          indi = ivdw(itypat)+100*(refi-1)
     595                 :         465 :          indj = ivdw(jtypat)+100*(refj-1)
     596                 :         465 :          found = .false.
     597         [ +  + ]:      101012 :          do ia=1,size(index_c6)
     598         [ +  + ]:    25659679 :            do ja=1,size(index_c6)
     599   [ +  +  +  + ]:    25559132 :              if (index_c6(ia)==indi.and.index_c6(ja)==indj) then
     600         [ +  + ]:         211 :                if (ia>=ja)then
     601                 :         195 :                  nline = ia*(ia-1)/2 + ja
     602                 :             :                else
     603                 :          16 :                  nline = ja*(ja-1)/2 + ia
     604                 :             :                endif
     605                 :         211 :                vdw_c6ref(itypat,jtypat,refi,refj) = vdw_dftd3_c6(nline)
     606                 :         211 :                vdw_c6ref(jtypat,itypat,refj,refi) = vdw_dftd3_c6(nline)
     607                 :         211 :                found = .false.
     608         [ +  + ]:     3882935 :                do la=1,size(index_cni)
     609         [ +  + ]:     3882904 :                  if (index_cni(la)==nline) then
     610                 :         180 :                    found=.true.
     611                 :         180 :                    vdw_cnrefi(itypat,jtypat,refi,refj)= vdw_dftd3_cni(la)
     612                 :         180 :                    vdw_cnrefj(jtypat,itypat,refj,refi)= vdw_dftd3_cni(la)
     613                 :             :                  else
     614                 :     3882724 :                    vdw_cnrefi(itypat,jtypat,refi,refj) = zero
     615                 :     3882724 :                    vdw_cnrefj(jtypat,itypat,refj,refi) = zero
     616                 :             :                  end if
     617                 :          31 :                  if (found) exit
     618                 :             :                end do
     619                 :             :                found = .false.
     620         [ +  + ]:     2108792 :                do la=1,size(index_cnj)
     621         [ +  + ]:     2108705 :                  if (index_cnj(la)==nline) then
     622                 :         124 :                    found=.true.
     623                 :         124 :                    vdw_cnrefj(itypat,jtypat,refi,refj)= vdw_dftd3_cnj(la)
     624                 :         124 :                    vdw_cnrefi(jtypat,itypat,refj,refi)= vdw_dftd3_cnj(la)
     625                 :             :                  else
     626                 :     2108581 :                    vdw_cnrefj(itypat,jtypat,refi,refj) = zero
     627                 :     2108581 :                    vdw_cnrefi(jtypat,itypat,refj,refi) = zero
     628                 :             :                  end if
     629                 :          87 :                  if (found) exit
     630                 :             :                end do
     631                 :             :                found = .true.
     632                 :             :              end if
     633                 :      100547 :              if (found) exit
     634                 :             :            end do
     635         [ +  + ]:      101012 :            if (found) exit
     636                 :             :          end do
     637         [ +  + ]:         810 :          if (refi.eq.1.and.refj.eq.1) then
     638                 :          31 :            nline = ia*(ia-1)/2 + ja
     639                 :          31 :            vdw_r0(itypat,jtypat)=vdw_dftd3_r0(nline)/Bohr_Ang
     640         [ +  + ]:          31 :            if (bol_3bt) then
     641         [ +  + ]:          20 :              do ktypat=1,ntypat
     642                 :          20 :                r0ijk(itypat,jtypat,ktypat)=one/(vdw_r0(itypat,jtypat)*vdw_r0(jtypat,ktypat)*vdw_r0(ktypat,itypat))**third
     643                 :             :              end do ! ka atom
     644                 :             :            end if    ! Only if 3bt required
     645                 :             :          end if       ! Only for the first set of references
     646                 :             :        end do          ! Loop on references j
     647                 :             :      end do             ! Loop on references i
     648                 :             :    end do                ! Loop on atom j
     649                 :             :  end do                   ! Loop on atom i
     650                 :             : 
     651                 :             :  !if (vdw_d3_cov==1) then
     652                 :             :  !   vdw_cnrefi(:,:,:,refmax) =vdw_cnrefi(:,:,:,refmax-1)
     653                 :             :  !   vdw_cnrefi(:,:,refmax,:) = 14.0_dp
     654                 :             :  !   vdw_cnrefj(:,:,refmax,:) =vdw_cnrefj(:,:,refmax-1,:)
     655                 :             :  !   vdw_cnrefj(:,:,:,refmax) = 14.0_dp
     656                 :             :  !end if
     657                 :             : !Retrieve cell geometry data
     658                 :          19 :  call metric(gmet,gprimd,-1,rmet,rprimd,ucvol)
     659                 :             : 
     660                 :             : !Map reduced coordinates into [0,1[
     661   [ -  +  +  -  :          57 :  ABI_MALLOC(xred01,(3,natom))
          +  -  +  -  -  
                +  -  + ]
     662         [ +  + ]:          42 :  do ia=1,natom
     663         [ +  + ]:          92 :    xred01(:,ia)=xred(:,ia)-aint(xred(:,ia)) ! Map into ]-1,1[
     664         [ +  + ]:         111 :    do alpha=1,3
     665         [ +  + ]:          92 :      if (abs(xred01(alpha,ia)).ge.tol8) xred01(alpha,ia) = xred01(alpha,ia)+half-sign(half,xred(alpha,ia))
     666                 :             :    end do
     667                 :             :  end do
     668                 :             : 
     669                 :             : ! -------------------------------------------------------------------
     670                 :             : ! Computation of the coordination number (CN) for the different atoms
     671                 :             : ! -------------------------------------------------------------------
     672                 :             : 
     673                 :             :  write(msg,'(3a)')&
     674                 :          19 : & '  Begin the computation of the Coordination Numbers (CN)',ch10,&
     675                 :          38 : & '  required for DFT-D3 energy corrections...'
     676                 :          19 :  call wrtout(std_out,msg,'COLL')
     677                 :             : 
     678                 :             : ! Allocation of the CN coefficients and derivatives
     679   [ -  +  +  -  :          57 :  ABI_MALLOC(cn,(natom))
          +  -  +  -  -  
                +  -  + ]
     680   [ -  +  +  -  :          76 :  ABI_MALLOC(dcn,(3,natom,natom))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     681   [ -  +  +  -  :          57 :  ABI_MALLOC(dcn_cart,(3,natom,natom))
          -  +  +  -  -  
                +  -  + ]
     682   [ -  +  +  -  :          57 :  ABI_MALLOC(str_dcn,(6,natom))
          +  -  +  -  -  
                +  -  + ]
     683                 :             : ! ABI_MALLOC_OR_DIE(d2cn, (2,3,natom,3,natom,natom), ierr)
     684   [ -  +  +  -  :          57 :  ABI_MALLOC_OR_DIE(d2cn_iii, (2,3,3,natom), ierr)
          +  -  +  -  +  
             -  -  +  -  
                      + ]
     685   [ -  +  +  -  :          76 :  ABI_MALLOC_OR_DIE(d2cn_jji, (2,3,3,natom,natom), ierr)
          -  +  +  -  +  
          -  +  -  +  -  
             -  +  -  + ]
     686   [ -  +  +  -  :          57 :  ABI_MALLOC_OR_DIE(d2cn_iji, (2,3,3,natom,natom), ierr)
          -  +  +  -  +  
             -  -  +  -  
                      + ]
     687   [ -  +  +  -  :          57 :  ABI_MALLOC_OR_DIE(d2cn_jii, (2,3,3,natom,natom), ierr)
          -  +  +  -  +  
             -  -  +  -  
                      + ]
     688         [ -  + ]:          19 :  ABI_MALLOC(d2cn_tmp, (2))
     689   [ -  +  +  -  :          76 :  ABI_MALLOC(fdcn,(2,3,natom,natom))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     690   [ -  +  +  -  :          57 :  ABI_MALLOC(cfdcn,(2,3,natom,natom))
          -  +  +  -  -  
                +  -  + ]
     691   [ +  -  -  +  :          95 :  ABI_MALLOC(elt_cn,(6+3*natom,6,natom))
          +  -  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                      + ]
     692                 :             : 
     693                 :             : ! Initializing the computed quantities to zero
     694                 :          19 :  nshell = 0
     695         [ +  + ]:          42 :  cn = zero
     696                 :             : ! Initializing the derivative of the computed quantities to zero (if required)
     697   [ +  +  +  +  :         327 :  dcn = zero ; str_dcn = zero
          +  +  +  +  +  
                      + ]
     698   [ +  +  +  +  :         732 :  d2cn_iii = zero
             +  +  +  + ]
     699   [ +  +  +  +  :        1003 :  d2cn_jji = zero
          +  +  +  +  +  
                      + ]
     700   [ +  +  +  +  :        1003 :  d2cn_iji = zero
          +  +  +  +  +  
                      + ]
     701   [ +  +  +  +  :        1003 :  d2cn_jii = zero
          +  +  +  +  +  
                      + ]
     702   [ +  +  +  +  :         685 :  fdcn = zero; cfdcn = zero
          +  +  +  +  +  
          +  +  +  +  +  
                   +  + ]
     703   [ +  +  +  +  :        1713 :  elt_cn = zero ; dcn_cart = zero
          +  +  +  +  +  
                +  +  + ]
     704                 :             : 
     705                 :          19 :  re_arg = zero ; im_arg = zero
     706         [ +  + ]:          19 :  if (need_hess) then
     707                 :           4 :    mcart = zero
     708         [ +  + ]:          16 :    do alpha=1,3
     709                 :          16 :      mcart(alpha,alpha) = one
     710                 :             :    end do
     711                 :             :  end if
     712                 :             :  rcutcn = 200**2 ! Bohr
     713                 :             : !Loop over shells of cell replicas
     714                 :             :  do
     715                 :         660 :    newshell=.false.;nshell=nshell+1
     716                 :             : !   Loop over cell replicas in the shell
     717         [ +  + ]:       26170 :    do is3=-nshell,nshell
     718         [ +  + ]:     1379230 :      do is2=-nshell,nshell
     719         [ +  + ]:    86680880 :        do is1=-nshell,nshell
     720                 :             :          if (nshell==1.or. &
     721   [ +  +  +  +  :    86655370 : &         abs(is3)==nshell.or.abs(is2)==nshell.or.abs(is1)==nshell) then
             +  +  +  + ]
     722                 :     7817539 :            is(3) = is3 ; is(2) = is2 ; is(1) = is1
     723                 :             : !               Computation of phase factor for discrete Fourier transform
     724                 :             : !               if phonon at qphon is required
     725         [ +  + ]:     7817539 :            if (need_dynmat) then
     726         [ +  + ]:     6749276 :              arg=two_pi*dot_product(qphon,is)
     727                 :     1687319 :              re_arg=cos(arg) ; im_arg=sin(arg)
     728                 :             :            end if
     729                 :             : !               Loop over atoms ia and ja
     730         [ +  + ]:    19756282 :            do ia=1,natom
     731                 :    11938743 :              itypat=typat(ia)
     732         [ +  + ]:   117422204 :              do ja=1,natom
     733                 :    20181151 :                jtypat=typat(ja)
     734         [ +  + ]:    80724604 :                r(:)=xred01(:,ia)-xred01(:,ja)-dble(is(:))
     735   [ +  +  +  +  :   322898416 :                rsq=dot_product(r,matmul(rmet,r))
                   +  + ]
     736                 :             : !                     atom i =/= j
     737   [ +  +  +  + ]:    32119894 :                if (rsq.ge.tol16.and.rsq<rcutcn) then
     738                 :     5666094 :                  newshell=.true.
     739                 :     5666094 :                  rr = sqrt(rsq)
     740                 :     5666094 :                  rcovij = rcov(ivdw(itypat))+rcov(ivdw(jtypat))
     741                 :             : 
     742                 :             : !                         Computation of partial contribution to cn coefficients
     743                 :     5666094 :                  exp_cn = exp(-k1*(rcovij/rr-one))
     744                 :     5666094 :                  frac_cn= one/(one+exp_cn)
     745                 :             : !                         Introduction of a damping function for the coordination
     746                 :             : !                         number because of the divergence with increasing
     747                 :             : !                         number of cells of this quantity in periodic systems
     748                 :             : !                         See Reckien et al., J. Comp. Chem. 33, 2023 (2012) [[cite:Reckien2012]]
     749                 :     5666094 :                  dr = rr-k2*rcovij
     750                 :     5666094 :                  cn_dmp = half*abi_derfc(dr)
     751                 :     5666094 :                  cn(ia) = cn(ia)+frac_cn*cn_dmp
     752                 :             : 
     753                 :             : !                         If force, stress, IFC or Elastic constants are required,
     754                 :             : !                         computation of the first derivative of CN
     755         [ +  - ]:     5666094 :                  if (need_grad) then
     756   [ +  +  +  + ]:    73659222 :                    rcart=matmul(rprimd,r)
     757                 :     5666094 :                    dexp_cn= k1*rcovij*exp_cn/rsq
     758                 :     5666094 :                    dcn_dmp = -one/sqrt(pi)*exp(-dr*dr)
     759                 :     5666094 :                    grad=(-frac_cn*frac_cn*cn_dmp*dexp_cn+dcn_dmp*frac_cn)/rr
     760         [ +  + ]:     5666094 :                    if (need_forces.and.ia/=ja) then
     761                 :             : !                               Variation of CN(ia) w.r. to displacement of atom
     762                 :             : !                               ja. If ia==ka then all the other atoms contribute
     763                 :             : !                               to the derivative. Required for the computation of
     764                 :             : !                               the forces applied on atom k
     765                 :      537252 :                      rred = matmul(transpose(rprimd),rcart)
     766         [ +  + ]:     2149008 :                      dcn(:,ia,ia) = dcn(:,ia,ia)+grad*rred(:)
     767         [ +  + ]:     2149008 :                      dcn(:,ia,ja) = dcn(:,ia,ja)-grad*rred(:)
     768         [ +  + ]:     5128842 :                    elseif (need_stress.or.need_elast) then
     769                 :             : !                               The following quantity (str_dcn) is used for the computation
     770                 :             : !                               of the DFT-D3 contribution to stress and elastic constants
     771         [ +  + ]:    10624296 :                      vec(1:3)=rcart(1:3)*rcart(1:3); vec(4)=rcart(2)*rcart(3)
     772                 :     2656074 :                      vec(5)=rcart(1)*rcart(3); vec(6)=rcart(1)*rcart(2)
     773         [ +  + ]:    18592518 :                      str_dcn(:,ia)=str_dcn(:,ia)+grad*vec(:)
     774                 :             :                    end if
     775                 :             : !                            If dynamical matrix or elastic constants are required, compute
     776                 :             : !                            the second derivative
     777         [ +  + ]:     5666094 :                    if (need_hess) then
     778                 :     2385004 :                      d2cn_dmp = two*(rr-k2*rcovij)/sqrt(pi)*exp(-(rr-k2*rcovij)**two)
     779                 :     2385004 :                      d2cn_exp = dexp_cn*(k1*rcovij/rsq-two/rr)
     780                 :     2385004 :                      d2frac_cn =frac_cn**two*(two*frac_cn*dexp_cn**two-d2cn_exp)
     781                 :             :                      hess = (d2frac_cn*cn_dmp+d2cn_dmp*frac_cn-&
     782                 :     2385004 : &                     two*dcn_dmp*frac_cn**two*dexp_cn-grad)/rsq
     783         [ +  + ]:     2385004 :                      if (need_dynmat) then
     784                 :             : !                                  Discrete Fourier Transform of dCN/drk in cartesian
     785                 :             : !                                  coordinates. Note that the phase factor is different
     786                 :             : !                                  if (ka=ia or ka/=ia).
     787                 :             : !                                  This Fourier transform is summed over cell replica
     788                 :             : !                                  See NOTE: add reference for more information
     789         [ +  + ]:     5241936 :                        fdcn(1,:,ia,ia) = fdcn(1,:,ia,ia)+grad*rcart(:)
     790         [ +  + ]:     5241936 :                        fdcn(1,:,ia,ja) = fdcn(1,:,ia,ja)-grad*rcart(:)*re_arg
     791         [ +  + ]:     5241936 :                        fdcn(2,:,ia,ja) = fdcn(2,:,ia,ja)-grad*rcart(:)*im_arg
     792                 :             : !                      Conjugate of fdcn
     793         [ +  + ]:     5241936 :                        cfdcn(1,:,ia,ia) = cfdcn(1,:,ia,ia)+grad*rcart(:)
     794         [ +  + ]:     5241936 :                        cfdcn(1,:,ia,ja) = cfdcn(1,:,ia,ja)-grad*rcart(:)*re_arg
     795         [ +  + ]:     5241936 :                        cfdcn(2,:,ia,ja) = cfdcn(2,:,ia,ja)+grad*rcart(:)*im_arg
     796                 :             : !                                  Computation of second derivative of CN required for the
     797                 :             : !                                  interatomic force constants in reciprocal space
     798         [ +  + ]:     5241936 :                        do alpha=1,3
     799         [ +  + ]:    17036292 :                          rcart2(alpha,:) = rcart(alpha)*rcart(:)
     800                 :             :                        end do
     801                 :             : !                                  Computation of second derivative of CN required for the
     802                 :             : !                                  interatomic force constants in reciprocal space
     803                 :             : !                                  This Fourier transform is summed over cell replica
     804                 :             : !                                  as it appears in the theory
     805         [ +  + ]:     5241936 :                        do alpha=1,3
     806         [ +  + ]:     5241936 :                          if (ia/=ja) then
     807                 :             :                                          ! ka = ia ; la = ia
     808                 :             :                            d2cn_iii(1,alpha,:,ia) = d2cn_iii(1,alpha,:,ia)+&
     809         [ +  + ]:     6447024 : &                           (hess*rcart2(alpha,:)+grad*mcart(alpha,:))
     810                 :             :                                          ! ka = ja ; la = ja
     811                 :             :                            d2cn_jji(1,alpha,:,ja,ia) = d2cn_jji(1,alpha,:,ja,ia)+&
     812         [ +  + ]:     6447024 : &                           (hess*rcart2(alpha,:)+grad*mcart(alpha,:))
     813         [ +  - ]:     1611756 :                            if (abs(re_arg)>tol12) then
     814                 :             :                                             ! ka = ia ; la = ja
     815                 :             :                              d2cn_iji(1,alpha,:,ja,ia) = d2cn_iji(1,alpha,:,ja,ia)-&
     816         [ +  + ]:     6447024 : &                             (hess*rcart2(alpha,:)+grad*mcart(alpha,:))*re_arg
     817                 :             :                                             ! ka = ja ; la = ia
     818                 :             :                              d2cn_jii(1,alpha,:,ja,ia) = d2cn_jii(1,alpha,:,ja,ia)-&
     819         [ +  + ]:     6447024 : &                             (hess*rcart2(alpha,:)+grad*mcart(alpha,:))*re_arg
     820                 :             :                            end if
     821         [ -  + ]:     1611756 :                            if (abs(im_arg)>tol12) then
     822                 :             :                                             ! ka = ia ; la = ja
     823                 :             :                              d2cn_iji(2,alpha,:,ja,ia) = d2cn_iji(2,alpha,:,ja,ia)-&
     824         [ #  # ]:           0 : &                             (hess*rcart2(alpha,:)+grad*mcart(alpha,:))*im_arg
     825                 :             :                                             ! ka = ja ; la = ia
     826                 :             :                              d2cn_jii(2,alpha,:,ja,ia) = d2cn_jii(2,alpha,:,ja,ia)+&
     827         [ #  # ]:           0 : &                             (hess*rcart2(alpha,:)+grad*mcart(alpha,:))*im_arg
     828                 :             :                            end if
     829                 :             :                          else
     830         [ +  + ]:     2319696 :                            if (abs(re_arg-one)>tol12) then
     831                 :             :                              d2cn_iji(1,alpha,:,ja,ia) = d2cn_iji(1,alpha,:,ja,ia)+&
     832         [ +  + ]:      707184 : &                             two*(hess*rcart2(alpha,:)+grad*mcart(alpha,:))*(one-re_arg)
     833                 :             :                            end if
     834                 :             :                          end if
     835                 :             :                        end do
     836                 :             :                      end if ! Boolean Need_dynmat
     837         [ +  + ]:     2385004 :                      if (need_elast) then
     838                 :             : !                                  Derivative of str_dcn w.r. to strain for elastic tensor
     839         [ +  + ]:     4298080 :                        vec(1:3)=rcart(1:3)*rcart(1:3); vec(4)=rcart(2)*rcart(3)
     840                 :     1074520 :                        vec(5)=rcart(1)*rcart(3); vec(6)=rcart(1)*rcart(2)
     841         [ +  + ]:     7521640 :                        do alpha=1,6
     842                 :     6447120 :                          ii = voigt1(alpha) ; jj=voigt2(alpha)
     843         [ +  + ]:    46204360 :                          do beta=1,6
     844                 :    38682720 :                            kk = voigt1(beta) ; ll=voigt2(beta)
     845                 :    38682720 :                            elt_cn(alpha,beta,ia) = elt_cn(alpha,beta,ia)+hess*rcart(ii)*rcart(jj)*rcart(kk)*rcart(ll)
     846         [ +  + ]:    38682720 :                            if (ii==kk) elt_cn(alpha,beta,ia) = elt_cn(alpha,beta,ia)+half*grad*rcart(jj)*rcart(ll)
     847         [ +  + ]:    38682720 :                            if (jj==kk) elt_cn(alpha,beta,ia) = elt_cn(alpha,beta,ia)+half*grad*rcart(ii)*rcart(ll)
     848         [ +  + ]:    38682720 :                            if (ii==ll) elt_cn(alpha,beta,ia) = elt_cn(alpha,beta,ia)+half*grad*rcart(jj)*rcart(kk)
     849         [ +  + ]:    45129840 :                            if (jj==ll) elt_cn(alpha,beta,ia) = elt_cn(alpha,beta,ia)+half*grad*rcart(ii)*rcart(kk)
     850                 :             :                          end do
     851                 :             :                        end do
     852                 :             :                                    ! Derivative of str_dcn w.r. to atomic displacement
     853                 :             :                                    ! for internal strains
     854         [ +  + ]:     4298080 :                        dcn_cart(:,ia,ia) = dcn_cart(:,ia,ia)+grad*rcart(:)
     855         [ +  + ]:     4298080 :                        dcn_cart(:,ia,ja) = dcn_cart(:,ia,ja)-grad*rcart(:)
     856         [ +  + ]:     1074520 :                        if (ia/=ja) then
     857                 :      537252 :                          index_ia = 6+3*(ia-1)
     858                 :      537252 :                          index_ja = 6+3*(ja-1)
     859         [ +  + ]:     3760764 :                          do alpha=1,6
     860         [ +  + ]:    13431300 :                            do beta=1,3
     861                 :     9670536 :                              ii = voigt1(alpha) ; jj=voigt2(alpha)
     862                 :             :                              elt_cn(index_ia+beta,alpha,ia)=elt_cn(index_ia+beta,alpha,ia)&
     863                 :     9670536 : &                             +hess*vec(alpha)*rcart(beta)
     864                 :             :                              elt_cn(index_ja+beta,alpha,ia)=elt_cn(index_ja+beta,alpha,ia)&
     865                 :     9670536 : &                             -hess*vec(alpha)*rcart(beta)
     866         [ +  + ]:     9670536 :                              if (ii==beta) then
     867                 :     3223512 :                                elt_cn(index_ia+beta,alpha,ia)=elt_cn(index_ia+beta,alpha,ia)+grad*rcart(jj)
     868                 :     3223512 :                                elt_cn(index_ja+beta,alpha,ia)=elt_cn(index_ja+beta,alpha,ia)-grad*rcart(jj)
     869                 :             :                              end if
     870         [ +  + ]:    12894048 :                              if (jj==beta) then
     871                 :     3223512 :                                elt_cn(index_ia+beta,alpha,ia)=elt_cn(index_ia+beta,alpha,ia)+grad*rcart(ii)
     872                 :     3223512 :                                elt_cn(index_ja+beta,alpha,ia)=elt_cn(index_ja+beta,alpha,ia)-grad*rcart(ii)
     873                 :             :                              end if
     874                 :             :                            end do
     875                 :             :                          end do
     876                 :             :                        end if ! ia/=ja
     877                 :             :                      end if ! Need strain derivative
     878                 :             :                    end if ! Boolean second derivative
     879                 :             :                  end if !  Boolean first derivative
     880                 :             :                end if ! Tolerence
     881                 :             :              end do ! Loop over ia atom
     882                 :             :            end do ! Loop over ja atom
     883                 :             :          end if ! Bondary Condition
     884                 :             :        end do ! Loop over is1
     885                 :             :      end do ! Loop over is2
     886                 :             :    end do ! Loop over is3
     887         [ +  + ]:         660 :    if(.not.newshell) exit ! Check if a new shell must be considered
     888                 :             :  end do ! Loop over shell
     889                 :             :  write(msg,'(3a,f8.5,1a,i3,1a,f8.5,1a,i3,1a)')&
     890                 :          19 : & '                                            ... Done.',ch10,&
     891   [ +  -  -  +  :         206 : & '  max(CN) =', maxval(cn), ' (atom ',maxloc(cn),') ;  min(CN) =', minval(cn), ' (atom ', minloc(cn),')'
          -  -  +  +  +  
          -  -  +  -  -  
          +  +  -  +  +  
          +  +  -  -  +  
          -  -  +  +  +  
          -  -  +  -  -  
          +  +  +  +  +  
                      + ]
     892                 :          19 :  call wrtout(std_out,msg,'COLL')
     893                 :             : 
     894                 :             : !----------------------------------------------------------------
     895                 :             : ! Computation of the C6 coefficient
     896                 :             : ! ---------------------------------------------------------------
     897                 :             : 
     898                 :             :  write(msg,'(3a)')&
     899                 :          19 : & '  Begin the computation of the C6(CN)',ch10,&
     900                 :          38 : & '  required for DFT-D3 energy corrections...'
     901                 :          19 :  call wrtout(std_out,msg,'COLL')
     902                 :             :  ! Allocation
     903   [ -  +  +  -  :          76 :  ABI_MALLOC(vdw_c6,(natom,natom))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     904   [ -  +  +  -  :          57 :  ABI_MALLOC(vdw_c8,(natom,natom))
          -  +  +  -  -  
                +  -  + ]
     905   [ -  +  +  -  :          57 :  ABI_MALLOC(dc6ri,(natom,natom))
          -  +  +  -  -  
                +  -  + ]
     906   [ -  +  +  -  :          57 :  ABI_MALLOC(dc6rj,(natom,natom))
          -  +  +  -  -  
                +  -  + ]
     907   [ -  +  +  -  :          57 :  ABI_MALLOC(d2c6ri,(natom,natom))
          -  +  +  -  -  
                +  -  + ]
     908   [ -  +  +  -  :          57 :  ABI_MALLOC(d2c6rj,(natom,natom))
          -  +  +  -  -  
                +  -  + ]
     909   [ -  +  +  -  :          57 :  ABI_MALLOC(d2c6rirj,(natom,natom))
          -  +  +  -  -  
                +  -  + ]
     910         [ +  + ]:          19 :  if (bol_3bt) then
     911   [ -  +  +  -  :          50 :    ABI_MALLOC(vdw_c9,(natom,natom,natom))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                      + ]
     912   [ -  +  +  -  :          30 :    ABI_MALLOC(dc9ijri,(natom,natom))
          -  +  +  -  -  
                +  -  + ]
     913   [ -  +  +  -  :          30 :    ABI_MALLOC(dc9ijrj,(natom,natom))
          -  +  +  -  -  
                +  -  + ]
     914                 :             :  end if
     915                 :             : ! Set accumulating quantities to zero
     916   [ +  +  +  +  :         127 :  vdw_c6 = zero ; vdw_c8 = zero
             +  +  +  + ]
     917   [ +  +  +  +  :         127 :  dc6ri = zero ; dc6rj = zero
             +  +  +  + ]
     918   [ +  +  +  +  :         127 :  d2c6ri = zero ; d2c6rj = zero
             +  +  +  + ]
     919   [ +  +  +  + ]:          73 :  d2c6rirj = zero
     920         [ +  + ]:          19 :  if (bol_3bt) then
     921   [ +  +  +  +  :          50 :    dc9ijri = zero; dc9ijrj = zero
             +  +  +  + ]
     922                 :             :  end if
     923                 :             : ! C6 coefficients are interpolated from tabulated
     924                 :             : ! ab initio C6 values (following loop).
     925                 :             : ! C8 coefficients are obtained by:
     926                 :             : ! C8 = vdw_dftd3_q(itypat)*vdw_dftd3_q(jtypat)*C6
     927                 :             : 
     928         [ +  + ]:          42 :  do ia=1,natom
     929                 :          23 :    itypat=typat(ia)
     930         [ +  + ]:          73 :    do ja=1,natom
     931                 :          31 :      jtypat=typat(ja)
     932                 :             : !      Set accumulating quantities to zero
     933                 :          31 :      ltot=zero
     934                 :          31 :      sum_dlri = zero ; sum_dlc6ri= zero
     935                 :          31 :      sum_dlrj = zero ; sum_dlc6rj= zero
     936                 :          31 :      sum_d2lri = zero ; sum_d2lc6ri = zero
     937                 :          31 :      sum_d2lrj = zero ; sum_d2lc6rj = zero
     938                 :          31 :      sum_d2lrirj = zero ; sum_d2lc6rirj = zero
     939                 :          31 :      min_dsys = 10000
     940                 :          31 :      max_vdw_c6 = zero
     941                 :             : !      Loop over references
     942         [ +  + ]:         186 :      do refi=1,refmax
     943         [ +  + ]:         961 :        do refj=1,refmax
     944                 :         775 :          dsysref_a = cn(ia)-vdw_cnrefi(itypat,jtypat,refi,refj)
     945                 :         775 :          dsysref_b = cn(ja)-vdw_cnrefj(itypat,jtypat,refi,refj)
     946                 :         775 :          dsysref=(dsysref_a)**two+(dsysref_b)**two
     947         [ +  + ]:         775 :          if (dsysref<min_dsys) then
     948                 :             : !               Keep in memory the smallest value of dsysref
     949                 :             : !               And the associated tabulated C6 value
     950                 :          71 :            min_dsys = dsysref
     951                 :          71 :            max_vdw_c6 = vdw_c6ref(itypat,jtypat,refi,refj)
     952                 :             :          end if
     953                 :         775 :          l = dexp(-k3*dsysref)
     954                 :         775 :          ltot = ltot+l
     955                 :         775 :          vdw_c6(ia,ja)=vdw_c6(ia,ja)+vdw_c6ref(itypat,jtypat,refi,refj)*l
     956                 :             : 
     957         [ +  - ]:         930 :          if (need_grad) then
     958                 :             : !               Derivative of l(ia,ja) with respect to the displacement
     959                 :             : !               of atom ka in reduced coordinates.
     960                 :             : !               This factor is identical in the case of stress.
     961                 :             : !               In purpose of speed up this routine, the prefactor of
     962                 :             : !               dCNi/drk and dCNj/drk are separated
     963                 :             : !               See NOTE: article to be added
     964                 :         775 :            dlri=-k3*l*two*dsysref_a ;dlrj=-k3*l*two*dsysref_b
     965                 :         775 :            sum_dlri=sum_dlri+dlri ; sum_dlrj=sum_dlrj+dlrj
     966                 :         775 :            sum_dlc6ri=sum_dlc6ri+dlri*vdw_c6ref(itypat,jtypat,refi,refj)
     967                 :         775 :            sum_dlc6rj=sum_dlc6rj+dlrj*vdw_c6ref(itypat,jtypat,refi,refj)
     968         [ +  + ]:         775 :            if (need_hess) then
     969                 :             : !                  Second derivative of l(ia,ja). Once again, it is separately in
     970                 :             : !                  different contributions:
     971                 :             : !                  d2lri: prefactor of dCNi/drk*dCNi/drl
     972                 :             : !                  d2lrj: prefactor of dCNj/drk*dCNj/drl
     973                 :             : !                  d2lrirj: prefacto of dCNi/drk*dCNj/drl
     974                 :             : !                  The prefactor for d2CNi/drkdrl is dlri; for d2CNj/drkdrl is dlrj
     975                 :         250 :              d2lri = -two*k3*l*(one-two*k3*dsysref_a**two)
     976                 :         250 :              d2lrj = -two*k3*l*(one-two*k3*dsysref_b**two)
     977                 :         250 :              d2lrirj = four*k3*k3*l*(dsysref_a*dsysref_b)
     978                 :         250 :              sum_d2lri=sum_d2lri+d2lri ; sum_d2lrj=sum_d2lrj+d2lrj
     979                 :         250 :              sum_d2lrirj = sum_d2lrirj+d2lrirj
     980                 :         250 :              sum_d2lc6ri=sum_d2lc6ri+d2lri*vdw_c6ref(itypat,jtypat,refi,refj)
     981                 :         250 :              sum_d2lc6rj=sum_d2lc6rj+d2lrj*vdw_c6ref(itypat,jtypat,refi,refj)
     982                 :         250 :              sum_d2lc6rirj = sum_d2lc6rirj + d2lrirj*vdw_c6ref(itypat,jtypat,refi,refj)
     983                 :             :            end if ! Boolean second derivative
     984                 :             :          end if ! Boolean gradient
     985                 :             :        end do ! Loop over references
     986                 :             :      end do ! Loop over references
     987                 :             : !      In some specific case (really covalently bound compounds) ltot -> 0
     988                 :             : !      which may cause numerical problems for all quantities related to dispersion coefficient.
     989                 :             : !      To be consistent with VASP implementation, the c6 value is taken as the last
     990                 :             : !      referenced value of the dispersion coefficient.
     991         [ +  - ]:          54 :      if (ltot>tol12) then
     992                 :          31 :        vdw_c6(ia,ja)=vdw_c6(ia,ja)/ltot
     993                 :          31 :        vdw_c8(ia,ja)=three*vdw_q_dftd3(ivdw(itypat))*vdw_q_dftd3(ivdw(jtypat))*vdw_c6(ia,ja)
     994                 :             : !         If Force of Stress is required
     995         [ +  - ]:          31 :        if (need_grad) then
     996                 :             : !            Computation of the derivative of C6 w.r.to the displacement
     997                 :             : !            of atom ka, in reduced coordinates (separated for dCNi/drk and dCNj/drk)
     998                 :             : !            This is the crucial step to reduce the scaling from O(N^3) to O(N^2) for
     999                 :             : !            the gradients
    1000                 :          31 :          dc6ri(ia,ja)=(sum_dlc6ri-vdw_c6(ia,ja)*sum_dlri)/ltot
    1001                 :          31 :          dc6rj(ia,ja)=(sum_dlc6rj-vdw_c6(ia,ja)*sum_dlrj)/ltot
    1002         [ +  + ]:          31 :          if (need_hess) then
    1003                 :             : !               Computation of the second derivative of C6 w.r.to the displacement of atom ka
    1004                 :             : !               and atom la
    1005                 :          10 :            d2c6ri(ia,ja)=(sum_d2lc6ri-vdw_c6(ia,ja)*sum_d2lri-two*dc6ri(ia,ja)*sum_dlri)/ltot
    1006                 :          10 :            d2c6rj(ia,ja)=(sum_d2lc6rj-vdw_c6(ia,ja)*sum_d2lrj-two*dc6rj(ia,ja)*sum_dlrj)/ltot
    1007                 :             :            d2c6rirj(ia,ja) = (sum_d2lc6rirj-vdw_c6(ia,ja)*sum_d2lrirj-dc6ri(ia,ja)*&
    1008                 :          10 : &           sum_dlrj-dc6rj(ia,ja)*sum_dlri)/ltot
    1009                 :             :          end if ! Boolean second derivative
    1010                 :             :        end if ! Boolean gradient
    1011                 :             :      else
    1012                 :           0 :        vdw_c6(ia,ja)= max_vdw_c6
    1013                 :           0 :        vdw_c8(ia,ja)=three*vdw_q_dftd3(ivdw(itypat))*vdw_q_dftd3(ivdw(jtypat))*vdw_c6(ia,ja)
    1014                 :             :      end if
    1015                 :             :    end do
    1016                 :             :  end do
    1017                 :             : ! Computation of the three-body term dispersion coefficient
    1018         [ +  + ]:          19 :  if (bol_3bt) then
    1019         [ +  + ]:          20 :    do ia=1,natom
    1020         [ +  + ]:          30 :      do ja=1,natom
    1021         [ +  + ]:          20 :        do ka=1,natom
    1022                 :          20 :          vdw_c9(ia,ja,ka) =-sqrt(vdw_c6(ia,ja)*vdw_c6(ja,ka)*vdw_c6(ka,ia))
    1023                 :             :        end do
    1024         [ +  - ]:          20 :        if (need_grad) then
    1025                 :          10 :          dc9ijri(ia,ja) = half/vdw_c6(ia,ja)*dc6ri(ia,ja)
    1026                 :          10 :          dc9ijrj(ia,ja) = half/vdw_c6(ia,ja)*dc6rj(ia,ja)
    1027                 :             :        end if
    1028                 :             :      end do
    1029                 :             :    end do
    1030                 :             :  end if
    1031                 :             : 
    1032                 :             :  write(msg,'(3a,f10.5,1a,f10.5)')&
    1033                 :          19 : & '                                            ... Done.',ch10,&
    1034   [ +  +  +  +  :         146 : & '  max(C6) =', maxval(vdw_c6),' ;  min(C6) =', minval(vdw_c6)
          +  +  +  -  -  
          +  -  -  +  +  
          +  +  +  +  +  
             -  -  +  -  
                      - ]
    1035                 :          19 :  call wrtout(std_out,msg,'COLL')
    1036                 :             : 
    1037                 :             : ! Deallocation of used variables not needed anymore
    1038         [ -  + ]:          19 :  ABI_FREE(vdw_c6ref)
    1039         [ -  + ]:          19 :  ABI_FREE(vdw_cnrefi)
    1040         [ -  + ]:          19 :  ABI_FREE(vdw_cnrefj)
    1041                 :             : 
    1042                 :             : !----------------------------------------------------
    1043                 :             : ! Computation of cut-off radii according to tolerance
    1044                 :             : !----------------------------------------------------
    1045                 :             : 
    1046                 :             :  ! Cut-off radius for pair-wise term
    1047         [ -  + ]:          19 :  if (vdw_tol<zero) then
    1048                 :             :    rcut=max((vdw_s6/vdw_tol_default*maxval(vdw_c6))**sixth, &
    1049   [ #  #  #  #  :           0 : &   (vdw_s8/vdw_tol_default*maxval(vdw_c8))**(one/eight))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    1050                 :             :  else
    1051                 :             :    rcut=max((vdw_s6/vdw_tol*maxval(vdw_c6))**sixth,&
    1052   [ +  +  +  +  :         127 : &   (vdw_s8/vdw_tol*maxval(vdw_c8))**(one/eight))
          +  +  +  -  -  
          +  -  -  +  +  
          +  +  +  +  +  
             -  -  +  -  
                      - ]
    1053                 :             :  end if
    1054                 :             :  ! Cut-off radius for three-body term
    1055                 :          19 :  rcut9 = zero
    1056         [ +  + ]:          19 :  if (bol_3bt) then
    1057   [ +  +  +  +  :          30 :    rcut9=(128.0_dp*vdw_s6/(vdw_tol_3bt)*maxval(vdw_c6)**(3.0/2.0))**(1.0/9.0)
          -  +  +  -  -  
                +  -  - ]
    1058                 :             :  end if
    1059                 :          19 :  rcut2=rcut*rcut
    1060                 :             : 
    1061                 :             : !--------------------------------------------------------------------
    1062                 :             : ! Computation of the two bodies contribution to the dispersion energy
    1063                 :             : !--------------------------------------------------------------------
    1064                 :             : 
    1065                 :             :  write(msg,'(3a)')&
    1066                 :          19 : & '  Begin the computation of pair-wise term',ch10,&
    1067                 :          38 : & '  of DFT-D3 energy contribution...'
    1068                 :          19 :  call wrtout(std_out,msg,'COLL')
    1069                 :          19 :  nshell=0
    1070                 :          19 :  npairs=0
    1071   [ -  +  +  -  :          38 :  ABI_MALLOC(e_alpha1,(natom))
             -  +  -  + ]
    1072   [ -  +  +  -  :          38 :  ABI_MALLOC(e_alpha2,(natom))
             -  +  -  + ]
    1073   [ -  +  +  -  :          38 :  ABI_MALLOC(e_alpha3,(natom))
             -  +  -  + ]
    1074   [ -  +  +  -  :          38 :  ABI_MALLOC(e_alpha4,(natom))
             -  +  -  + ]
    1075   [ -  +  +  -  :          76 :  ABI_MALLOC(e_no_c,(natom,natom))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    1076   [ -  +  +  -  :          76 :  ABI_MALLOC(fe_no_c,(2,natom,natom))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    1077   [ +  +  +  + ]:          65 :  e_alpha1 =zero ; e_alpha2 = zero
    1078   [ +  +  +  + ]:          65 :  e_alpha3 =zero ; e_alpha4 = zero
    1079   [ +  +  +  +  :         189 :  e_no_c=zero  ; fe_no_c = zero
          +  +  +  +  +  
                      + ]
    1080   [ -  +  +  -  :          76 :  ABI_MALLOC(grad_no_cij,(3,natom,natom))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    1081   [ -  +  +  -  :          76 :  ABI_MALLOC(fgrad_no_c,(2,3,natom,natom))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    1082   [ -  +  +  -  :          57 :  ABI_MALLOC(cfgrad_no_c,(2,3,natom,natom))
          -  +  +  -  -  
                +  -  + ]
    1083   [ -  +  +  -  :          57 :  ABI_MALLOC(str_no_c,(6,natom,natom))
          -  +  +  -  -  
                +  -  + ]
    1084   [ -  +  +  -  :          57 :  ABI_MALLOC(str_alpha1,(6,natom))
          +  -  +  -  -  
                +  -  + ]
    1085   [ -  +  +  -  :          38 :  ABI_MALLOC(str_alpha2,(6,natom))
             -  +  -  + ]
    1086   [ +  +  +  +  :         406 :  grad_no_cij=zero ; str_no_c=zero
          +  +  +  +  +  
                +  +  + ]
    1087   [ +  +  +  +  :         685 :  fgrad_no_c = zero ;  cfgrad_no_c = zero
          +  +  +  +  +  
          +  +  +  +  +  
                   +  + ]
    1088   [ +  +  +  +  :         341 :  str_alpha1 = zero ; str_alpha2 = zero
             +  +  +  + ]
    1089                 :             : 
    1090                 :             :  re_arg = zero ; im_arg = zero
    1091                 :             :  dmp6 = zero ; dmp8 = zero
    1092                 :             :  e_no_c6 = zero ; e_no_c8 = zero
    1093                 :             :  fdmp6 = zero ; fdmp8 = zero
    1094                 :             :  grad6 = zero ; grad8 = zero
    1095                 :             :  grad6_no_c6 = zero ; grad8_no_c8 = zero
    1096                 :             :  hess6 = zero ; hess8 = zero
    1097                 :             :  do
    1098                 :         268 :    newshell=.false.;nshell=nshell+1
    1099         [ +  + ]:        4620 :    do is3=-nshell,nshell
    1100         [ +  + ]:       93976 :      do is2=-nshell,nshell
    1101         [ +  + ]:     2165516 :        do is1=-nshell,nshell
    1102   [ +  +  +  +  :     2161164 :          if (nshell==1.or.abs(is3)==nshell.or.abs(is2)==nshell.or.abs(is1)==nshell) then
             +  +  +  + ]
    1103                 :      486075 :            is(1) = is1 ; is(2) = is2 ; is(3) = is3
    1104                 :             : !              Computation of phase factor for discrete Fourier transform
    1105                 :             : !              if phonon at qphon is required
    1106         [ +  + ]:      486075 :            if (need_dynmat) then
    1107         [ +  + ]:      349996 :              arg= two_pi*dot_product(qphon,is)
    1108                 :       87499 :              re_arg=cos(arg)
    1109                 :       87499 :              im_arg=sin(arg)
    1110                 :             :            end if
    1111         [ +  + ]:     1034650 :            do ia=1,natom
    1112                 :      548575 :              itypat=typat(ia)
    1113         [ +  + ]:     3293958 :              do ja=1,natom
    1114                 :      673575 :                jtypat=typat(ja)
    1115         [ +  + ]:     2694300 :                r(:)=xred01(:,ia)-xred01(:,ja)-dble(is(:))
    1116   [ +  +  +  +  :    10777200 :                rsq=dot_product(r,matmul(rmet,r))
                   +  + ]
    1117   [ +  +  +  + ]:     1222150 :                if (rsq>=tol16.and.rsq<rcut2) then
    1118                 :      183340 :                  npairs=npairs+1;newshell=.true.
    1119                 :      183340 :                  sfact6 = half*vdw_s6 ; sfact8 = half*vdw_s8
    1120                 :      183340 :                  rr=sqrt(rsq); r6 = rr**six ; r8 = rr**eight
    1121                 :      183340 :                  c6=vdw_c6(ia,ja) ; c8=vdw_c8(ia,ja)
    1122                 :      183340 :                  vdw_q = three*vdw_q_dftd3(ivdw(itypat))*vdw_q_dftd3(ivdw(jtypat))
    1123                 :      183340 :                  r0=vdw_r0(itypat,jtypat)
    1124                 :             : !                        Computation of e_vdw_dftd3 (case DFT+D3)
    1125         [ +  + ]:      183340 :                  if (vdw_xc == 6) then
    1126                 :       78020 :                    dmp6=six*(rr/(vdw_sr6*r0))**(-alpha6)
    1127                 :       78020 :                    fdmp6=one/(one+dmp6)
    1128                 :       78020 :                    dmp8=six*(rr/(vdw_sr8*r0))**(-alpha8)
    1129                 :       78020 :                    fdmp8=one/(one+dmp8)
    1130                 :             : !                           Contribution to energy
    1131                 :       78020 :                    e_no_c6 = -sfact6*fdmp6/r6 ; e_no_c8 = -sfact8*fdmp8/r8
    1132                 :       78020 :                    e_vdw_dftd3=e_vdw_dftd3+e_no_c6*c6 +e_no_c8*c8
    1133                 :             : !                        Computation of e_vdw_dftd3 (case DFT+D3-BJ)
    1134         [ +  - ]:      105320 :                  elseif (vdw_xc == 7) then
    1135                 :      105320 :                    dmp = (vdw_a1*sqrt(vdw_q)+vdw_a2)
    1136                 :      105320 :                    fdmp6 = one/(dmp**six+rr**six)
    1137                 :      105320 :                    fdmp8 = one/(dmp**eight+rr**eight)
    1138                 :      105320 :                    e_no_c6 = -sfact6*fdmp6 ; e_no_c8 = -sfact8*fdmp8
    1139                 :      105320 :                    e_vdw_dftd3=e_vdw_dftd3-sfact6*c6*fdmp6-sfact8*c8*fdmp8
    1140                 :             :                  end if
    1141                 :             : !                        Computation of the gradients (if required)
    1142         [ +  - ]:      183340 :                  if (need_grad) then
    1143         [ +  + ]:      183340 :                    if (vdw_xc == 6) then
    1144                 :       78020 :                      gr6 = alpha6*dmp6*fdmp6**two
    1145                 :       78020 :                      grad6_no_c6 = sfact6*(gr6-six*fdmp6)/r8
    1146                 :       78020 :                      grad6 = grad6_no_c6*c6
    1147                 :       78020 :                      gr8 = alpha8*dmp8*fdmp8**two
    1148                 :       78020 :                      grad8_no_c8 = sfact8*(gr8-eight*fdmp8)/r8/rsq
    1149                 :       78020 :                      grad8 = grad8_no_c8*c8
    1150         [ +  - ]:      105320 :                    elseif (vdw_xc == 7) then
    1151                 :      105320 :                      grad6_no_c6 = -sfact6*six*(fdmp6*rsq)**two
    1152                 :      105320 :                      grad6 = grad6_no_c6*c6
    1153                 :      105320 :                      grad8_no_c8 = -sfact8*eight*(fdmp8)**two*rsq**three
    1154                 :      105320 :                      grad8 = grad8_no_c8*c8
    1155                 :             :                    end if
    1156                 :      183340 :                    grad =grad6+grad8
    1157                 :      183340 :                    grad_no_c = grad6_no_c6+grad8_no_c8*vdw_q
    1158   [ +  +  +  + ]:     2383420 :                    rcart=matmul(rprimd,r)
    1159                 :      183340 :                    rred= matmul(transpose(rprimd),rcart)
    1160                 :             : !                           Additional contribution due to c6(cn(r))
    1161                 :             : !                           Not yet multiply by dCN/drk and summed to reduce
    1162                 :             : !                           computational time
    1163                 :      183340 :                    e_no_c(ia,ja) = e_no_c(ia,ja)+(e_no_c6+vdw_q*e_no_c8)
    1164                 :             : !                           Part related to alpha1ij/alpha2ij
    1165                 :      183340 :                    e_alpha1(ia) = e_alpha1(ia)+(e_no_c6+vdw_q*e_no_c8)*dc6ri(ia,ja)
    1166                 :      183340 :                    e_alpha2(ja) = e_alpha2(ja)+(e_no_c6+vdw_q*e_no_c8)*dc6rj(ia,ja)
    1167                 :             : !                           Contribution to gradients wr to atomic displacement
    1168                 :             : !                           (forces)
    1169         [ +  + ]:      183340 :                    if (need_forces.and.ia/=ja) then
    1170         [ +  + ]:       22848 :                      gred(:)=grad*rred(:)
    1171         [ +  + ]:       22848 :                      do alpha=1,3
    1172                 :       17136 :                        gred_vdw_dftd3(alpha,ia)=gred_vdw_dftd3(alpha,ia)-gred(alpha)
    1173                 :       22848 :                        gred_vdw_dftd3(alpha,ja)=gred_vdw_dftd3(alpha,ja)+gred(alpha)
    1174                 :             :                      end do
    1175         [ +  + ]:      177628 :                    elseif (need_stress) then
    1176                 :             : !                              Computation of the DFT-D3 contribution to stress
    1177         [ +  + ]:      249512 :                      vec(1:3)=rcart(1:3)*rcart(1:3); vec(4)=rcart(2)*rcart(3)
    1178                 :       62378 :                      vec(5)=rcart(1)*rcart(3); vec(6)=rcart(1)*rcart(2)
    1179         [ +  + ]:      436646 :                      do alpha=1,6
    1180                 :      436646 :                        str_vdw_dftd3(alpha)=str_vdw_dftd3(alpha)-grad*vec(alpha)
    1181                 :             :                      end do
    1182                 :             :                    end if
    1183                 :             : !                           Second derivative (if required)
    1184         [ +  + ]:      183340 :                    if (need_hess) then
    1185         [ -  + ]:       46736 :                      if (vdw_xc==6) then
    1186                 :             :                        hess6 = (grad6*(alpha6*fdmp6*dmp6-8.0_dp)+&
    1187                 :             : &                       sfact6*c6/r6*dmp6*((alpha6*fdmp6)**two)*&
    1188                 :           0 : &                       (fdmp6*dmp6-one)/rsq)/rsq
    1189                 :             :                        hess8 = (grad8*(alpha8*fdmp8*dmp8-10.0_dp)+&
    1190                 :             : &                       sfact8*c8/r8*dmp8*((alpha8*fdmp8)**two)*&
    1191                 :           0 : &                       (fdmp8*dmp8-one)/rsq)/rsq
    1192         [ +  - ]:       46736 :                      elseif (vdw_xc==7) then
    1193                 :       46736 :                        hess6 = -four*grad6*(three*rsq**two*fdmp6-one/rsq)
    1194                 :       46736 :                        hess8 = -two*grad8*(eight*rsq**three*fdmp8-three/rsq)
    1195                 :             :                      end if
    1196                 :             : !                              Contribution of d2C6 to the interatomic force constants
    1197                 :             : !                              Not yet multiply by CN derivative and summed to reduce the scaling from O(N^3) to O(N^2)
    1198                 :       46736 :                      hessij = hess6+hess8
    1199                 :             : !                              Contribution of cross-derivative dC6 and grad
    1200         [ +  + ]:      186944 :                      do alpha=1,3
    1201                 :      186944 :                        grad_no_cij(alpha,ia,ja) = grad_no_cij(alpha,ia,ja) - grad_no_c*rcart(alpha)
    1202                 :             :                      end do
    1203                 :       46736 :                      e_alpha3(ia) = e_alpha3(ia)+(e_no_c6+vdw_q*e_no_c8)*d2c6ri(ia,ja)
    1204                 :       46736 :                      e_alpha4(ja) = e_alpha4(ja)+(e_no_c6+vdw_q*e_no_c8)*d2c6rj(ia,ja)
    1205         [ +  + ]:       46736 :                      if (need_dynmat) then
    1206                 :             : !                                 Fourier transform of the partial contribution to the dispersion potential
    1207                 :       35216 :                        fe_no_c(1,ia,ja) = fe_no_c(1,ia,ja)+(e_no_c6+vdw_q*e_no_c8)*re_arg
    1208                 :       35216 :                        fe_no_c(2,ia,ja) = fe_no_c(2,ia,ja)+(e_no_c6+vdw_q*e_no_c8)*im_arg
    1209         [ +  + ]:      140864 :                        do alpha=1,3
    1210                 :             : !                                    Fourier transform of the gradient (required for the IFCs)
    1211                 :      105648 :                          fgrad_no_c(1,alpha,ia,ja) = fgrad_no_c(1,alpha,ia,ja)-grad_no_c*rcart(alpha)*re_arg
    1212                 :      105648 :                          fgrad_no_c(2,alpha,ia,ja) = fgrad_no_c(2,alpha,ia,ja)-grad_no_c*rcart(alpha)*im_arg
    1213                 :             : !                                    Complex conjugated of the Fourier transform of the gradient
    1214                 :      105648 :                          cfgrad_no_c(1,alpha,ia,ja) = cfgrad_no_c(1,alpha,ia,ja)-grad_no_c*rcart(alpha)*re_arg
    1215                 :      140864 :                          cfgrad_no_c(2,alpha,ia,ja) = cfgrad_no_c(2,alpha,ia,ja)+grad_no_c*rcart(alpha)*im_arg
    1216                 :             :                        end do
    1217                 :             : !                                 Contribution to the IFCs (reciprocal space) of the 2nd derivative of e_no_c part
    1218         [ +  + ]:      140864 :                        do alpha=1,3
    1219         [ +  + ]:      457808 :                          do beta=1,3
    1220                 :      422592 :                            rcart2(alpha,beta) = rcart(alpha)*rcart(beta)
    1221                 :             :                          end do
    1222                 :             :                        end do
    1223         [ +  + ]:       35216 :                        if (ia/=ja) then
    1224         [ +  + ]:       22848 :                          do alpha=1,3
    1225                 :             :                            dyn_vdw_dftd3(1,alpha,ja,:,ja) = dyn_vdw_dftd3(1,alpha,ja,:,ja) -&
    1226         [ +  + ]:       68544 : &                           (hessij*rcart2(alpha,:)+grad*mcart(alpha,:))
    1227                 :             :                            dyn_vdw_dftd3(1,alpha,ia,:,ia) = dyn_vdw_dftd3(1,alpha,ia,:,ia) -&
    1228         [ +  + ]:       68544 : &                           (hessij*rcart2(alpha,:)+grad*mcart(alpha,:))
    1229         [ +  - ]:       17136 :                            if (abs(re_arg)>tol12) then
    1230                 :             :                              dyn_vdw_dftd3(1,alpha,ia,:,ja) = dyn_vdw_dftd3(1,alpha,ia,:,ja) +&
    1231         [ +  + ]:       68544 : &                             (hessij*rcart2(alpha,:)+grad*mcart(alpha,:))*re_arg
    1232                 :             :                              dyn_vdw_dftd3(1,alpha,ja,:,ia) = dyn_vdw_dftd3(1,alpha,ja,:,ia) +&
    1233         [ +  + ]:       68544 : &                             (hessij*rcart2(alpha,:)+grad*mcart(alpha,:))*re_arg
    1234                 :             :                            end if
    1235         [ -  + ]:       22848 :                            if (abs(im_arg)>tol12) then
    1236                 :             :                              dyn_vdw_dftd3(2,alpha,ia,:,ja) = dyn_vdw_dftd3(2,alpha,ia,:,ja) +&
    1237         [ #  # ]:           0 : &                             (hessij*rcart2(alpha,:)+grad*mcart(alpha,:))*im_arg
    1238                 :             :                              dyn_vdw_dftd3(2,alpha,ja,:,ia) = dyn_vdw_dftd3(2,alpha,ja,:,ia) -&
    1239         [ #  # ]:           0 : &                             (hessij*rcart2(alpha,:)+grad*mcart(alpha,:))*im_arg
    1240                 :             :                            end if
    1241                 :             :                          end do
    1242                 :             :                        else ! ia==ja
    1243         [ +  + ]:      118016 :                          do alpha=1,3
    1244         [ +  + ]:      118016 :                            if (abs(re_arg-one)>tol12) then
    1245                 :             :                              dyn_vdw_dftd3(1,alpha,ia,:,ia) = dyn_vdw_dftd3(1,alpha,ia,:,ia) -&
    1246         [ +  + ]:       70992 : &                             two*(hessij*rcart2(alpha,:)+grad*mcart(alpha,:))*(one-re_arg)
    1247                 :             :                            end if
    1248                 :             :                          end do
    1249                 :             :                        end if
    1250                 :             :                      end if
    1251                 :             : !                              Now compute the contribution to the elastic constants !!! Still under development
    1252         [ +  + ]:       46736 :                      if (need_elast) then
    1253         [ +  + ]:       46080 :                        vec(1:3)=rcart(1:3)*rcart(1:3); vec(4)=rcart(2)*rcart(3)
    1254                 :       11520 :                        vec(5)=rcart(1)*rcart(3); vec(6)=rcart(1)*rcart(2)
    1255         [ +  + ]:       80640 :                        str_no_c(:,ia,ja)=str_no_c(:,ia,ja)-grad_no_c*vec(:)
    1256         [ +  + ]:       80640 :                        str_alpha1(:,ia)=str_alpha1(:,ia)-dc6ri(ia,ja)*grad_no_c*vec(:)
    1257         [ +  + ]:       80640 :                        str_alpha2(:,ja)=str_alpha2(:,ja)-dc6rj(ia,ja)*grad_no_c*vec(:)
    1258                 :             : !                                 Contribution to elastic constants of DFT-D3 dispersion potential (no C6 derivative)
    1259         [ +  + ]:       80640 :                        do alpha=1,6
    1260                 :       69120 :                          ii = voigt1(alpha) ; jj=voigt2(alpha)
    1261         [ +  + ]:      495360 :                          do beta=1,6
    1262                 :      414720 :                            kk = voigt1(beta) ; ll=voigt2(beta)
    1263                 :      414720 :                            elt_vdw_dftd3(alpha,beta) = elt_vdw_dftd3(alpha,beta)-hessij*vec(alpha)*vec(beta)
    1264         [ +  + ]:      414720 :                            if (ii==kk) elt_vdw_dftd3(alpha,beta) = elt_vdw_dftd3(alpha,beta)-half*grad*rcart(jj)*rcart(ll)
    1265         [ +  + ]:      414720 :                            if (jj==kk) elt_vdw_dftd3(alpha,beta) = elt_vdw_dftd3(alpha,beta)-half*grad*rcart(ii)*rcart(ll)
    1266         [ +  + ]:      414720 :                            if (ii==ll) elt_vdw_dftd3(alpha,beta) = elt_vdw_dftd3(alpha,beta)-half*grad*rcart(jj)*rcart(kk)
    1267         [ +  + ]:      483840 :                            if (jj==ll) elt_vdw_dftd3(alpha,beta) = elt_vdw_dftd3(alpha,beta)-half*grad*rcart(ii)*rcart(kk)
    1268                 :             :                          end do
    1269                 :             :                        end do
    1270                 :             : !                                 Contribution to internal strain of DFT-D3 dispersion potential (no C6 derivative)
    1271         [ +  + ]:       11520 :                        if (ia/=ja) then
    1272                 :        5712 :                          index_ia = 6+3*(ia-1)
    1273                 :        5712 :                          index_ja = 6+3*(ja-1)
    1274         [ +  + ]:       39984 :                          do alpha=1,6
    1275         [ +  + ]:      142800 :                            do beta=1,3
    1276                 :      102816 :                              ii = voigt1(alpha) ; jj=voigt2(alpha)
    1277                 :             :                              elt_vdw_dftd3(index_ia+beta,alpha)=elt_vdw_dftd3(index_ia+beta,alpha)-&
    1278                 :      102816 : &                             hessij*vec(alpha)*rcart(beta)
    1279                 :             :                              elt_vdw_dftd3(index_ja+beta,alpha)=elt_vdw_dftd3(index_ja+beta,alpha)+&
    1280                 :      102816 : &                             hessij*vec(alpha)*rcart(beta)
    1281         [ +  + ]:      102816 :                              if (ii==beta) then
    1282                 :       34272 :                                elt_vdw_dftd3(index_ia+beta,alpha)=elt_vdw_dftd3(index_ia+beta,alpha)-grad*rcart(jj)
    1283                 :       34272 :                                elt_vdw_dftd3(index_ja+beta,alpha)=elt_vdw_dftd3(index_ja+beta,alpha)+grad*rcart(jj)
    1284                 :             :                              end if
    1285         [ +  + ]:      137088 :                              if (jj==beta) then
    1286                 :       34272 :                                elt_vdw_dftd3(index_ia+beta,alpha)=elt_vdw_dftd3(index_ia+beta,alpha)-grad*rcart(ii)
    1287                 :       34272 :                                elt_vdw_dftd3(index_ja+beta,alpha)=elt_vdw_dftd3(index_ja+beta,alpha)+grad*rcart(ii)
    1288                 :             :                              end if
    1289                 :             :                            end do ! Direction beta
    1290                 :             :                          end do    ! Strain alpha
    1291                 :             :                        end if       ! ia/=ja
    1292                 :             :                      end if          ! Need elastic constant
    1293                 :             :                    end if             ! Need hessian
    1294                 :             :                  end if                ! Need gradient
    1295                 :             :                end if                   ! Tolerance
    1296                 :             :              end do                      ! Loop over atom j
    1297                 :             :            end do                         ! Loop over atom i
    1298                 :             :          end if                            ! Triple loop over cell replicas in shell
    1299                 :             :        end do                               ! Is1
    1300                 :             :      end do                                 ! Is2
    1301                 :             :    end do                                    ! Is3
    1302         [ +  + ]:         268 :    if(.not.newshell) exit ! Check if new shell must be calculated
    1303                 :             :  end do ! Loop over shell
    1304   [ -  +  +  -  :          57 :  ABI_MALLOC(temp_prod,(2,natom))
          +  -  +  -  -  
                +  -  + ]
    1305         [ +  - ]:          19 :  if (need_grad) then
    1306                 :             : !   Additional contribution to force due dc6_drk
    1307         [ +  + ]:          19 :    if (need_forces) then
    1308         [ +  + ]:          17 :      do ka=1,natom
    1309         [ +  + ]:          28 :        do ia=1,natom
    1310                 :             :              !do ja=1,natom
    1311                 :             :                 !gred_vdw_dftd3(:,ka) = gred_vdw_dftd3(:,ka)+e_no_c(ia,ja)*(&
    1312                 :             : !&               !dcn(:,ia,ka)*dc6ri(ia,ja)+dcn(:,ja,ka)*dc6rj(ia,ja))
    1313                 :             :              !end do
    1314                 :             :          gred_vdw_dftd3(:,ka) = gred_vdw_dftd3(:,ka)+e_alpha1(ia)*dcn(:,ia,ka)+&
    1315         [ +  + ]:          53 : &         e_alpha2(ia)*dcn(:,ia,ka)
    1316                 :             :        end do
    1317                 :             :      end do
    1318         [ +  + ]:          11 :    elseif (need_stress) then
    1319         [ +  + ]:          15 :      do ia=1,natom
    1320                 :             :           !do ja=1,natom
    1321                 :             :           !   str_vdw_dftd3(:) = str_vdw_dftd3(:)+e_no_c(ia,ja)*(str_dcn(:,ia)*&
    1322                 :             : !&         !   dc6ri(ia,ja)+str_dcn(:,ja)*dc6rj(ia,ja))
    1323                 :             :           !end do
    1324                 :             :        str_vdw_dftd3(:) = str_vdw_dftd3(:)+e_alpha1(ia)*str_dcn(:,ia)+&
    1325         [ +  + ]:          63 : &       e_alpha2(ia)*str_dcn(:,ia)
    1326                 :             :      end do
    1327                 :             :    end if ! Optimization
    1328                 :             : !   If dynmat is required, add all the terms related to dc6, d2c6, ...
    1329         [ +  + ]:          19 :    if (need_hess) then
    1330         [ +  + ]:           4 :      if (need_dynmat) then
    1331         [ +  + ]:           7 :        do ka=1,natom
    1332         [ +  + ]:          10 :          do la =1,natom
    1333         [ +  + ]:          28 :            do alpha=1,3
    1334         [ +  + ]:          78 :              do beta=1,3
    1335         [ +  + ]:         162 :                do ia=1,natom
    1336                 :             : !TODO: avoid stupid if clauses inside the loops
    1337         [ +  + ]:         270 :                  d2cn_tmp = zero
    1338         [ +  + ]:          90 :                  if (ia==la) then
    1339         [ +  + ]:          54 :                    if (ia==ka) then    ! iii
    1340         [ +  + ]:         108 :                      d2cn_tmp(:) = d2cn_iii(:,alpha,beta,ia)
    1341                 :             :                    else                ! jii
    1342         [ +  + ]:          54 :                      d2cn_tmp(:) = d2cn_jii(:,alpha,beta,ka,ia)
    1343                 :             :                    end if
    1344         [ +  + ]:          36 :                  else if (ia==ka) then !iji
    1345         [ +  + ]:          54 :                    d2cn_tmp(:) = d2cn_iji(:,alpha,beta,la,ia)
    1346         [ +  - ]:          18 :                  else if (ka==la) then    ! jji
    1347         [ +  + ]:          54 :                    d2cn_tmp(:) = d2cn_jji(:,alpha,beta,ka,ia)
    1348                 :             :                  end if
    1349                 :             : !                 Add the second derivative of C6 contribution to the dynamical matrix
    1350                 :             : !                 First, add the second derivative of CN-related term
    1351                 :             :                  dyn_vdw_dftd3(:,alpha,ka,beta,la)=dyn_vdw_dftd3(:,alpha,ka,beta,la)+&
    1352         [ +  + ]:         270 : &                 (e_alpha1(ia)+e_alpha2(ia))*d2cn_tmp(:)
    1353                 :             : !OLDVERSION                 dyn_vdw_dftd3(:,alpha,ka,beta,la)=dyn_vdw_dftd3(:,alpha,ka,beta,la)+&
    1354                 :             : !&                 (e_alpha1(ia)+e_alpha2(ia))*d2cn(:,alpha,ka,beta,la,ia)
    1355                 :             : 
    1356                 :             : 
    1357                 :             : 
    1358                 :             : !                 Then the term related to dCNi/dr*dCNi/dr and dCNj/dr*dCNj/dr
    1359                 :          90 :                  call comp_prod(cfdcn(:,alpha,ia,ka),fdcn(:,beta,ia,la),temp_comp)
    1360                 :             :                  dyn_vdw_dftd3(:,alpha,ka,beta,la)=dyn_vdw_dftd3(:,alpha,ka,beta,la)+&
    1361         [ +  + ]:         270 : &                 (e_alpha3(ia)+e_alpha4(ia))*temp_comp(:)
    1362                 :             : !                 Add the cross derivative of fdmp/rij**6 and C6 contribution to the dynamical matrix
    1363                 :             : !                 !!!! The products are kind of tricky...
    1364                 :             : !                 First, add the dCNk/drl gradik and dCNk/drl gradjk terms...
    1365                 :             :                  dyn_vdw_dftd3(:,alpha,ka,beta,la)=dyn_vdw_dftd3(:,alpha,ka,beta,la)+&
    1366         [ +  + ]:         270 : &                 cfdcn(:,alpha,la,ka)*grad_no_cij(beta,la,ia)*(dc6ri(la,ia)+dc6rj(ia,la))
    1367                 :             : !                Then the dCNk/drl gradjk and dCNk/drl gradik terms...
    1368                 :          90 :                  call comp_prod(cfdcn(:,alpha,ia,ka),cfgrad_no_c(:,beta,la,ia),temp_comp)
    1369                 :             :                  dyn_vdw_dftd3(:,alpha,ka,beta,la)=dyn_vdw_dftd3(:,alpha,ka,beta,la)+&
    1370         [ +  + ]:         270 : &                 temp_comp(:)*(dc6ri(ia,la)+dc6rj(la,ia))
    1371                 :             : !                Here the symmetrical term (for dCNl/drk) are added...
    1372                 :             :                  dyn_vdw_dftd3(:,alpha,ka,beta,la)=dyn_vdw_dftd3(:,alpha,ka,beta,la)+&
    1373         [ +  + ]:         270 : &                 fdcn(:,beta,ka,la)*grad_no_cij(alpha,ka,ia)*(dc6ri(ka,ia)+dc6rj(ia,ka))
    1374                 :          90 :                  call comp_prod(fdcn(:,beta,ia,la),fgrad_no_c(:,alpha,ka,ia),temp_comp)
    1375                 :             :                  dyn_vdw_dftd3(:,alpha,ka,beta,la)=dyn_vdw_dftd3(:,alpha,ka,beta,la)+&
    1376         [ +  + ]:         324 : &                 temp_comp(:)*(dc6ri(ia,ka)+dc6rj(ka,ia))
    1377                 :             :                end do ! ia
    1378                 :             :              end do ! alpha
    1379                 :             :            end do ! beta
    1380                 :             :          end do ! la
    1381         [ +  + ]:          19 :          do alpha=1,3
    1382   [ +  +  +  + ]:          66 :            temp_prod(:,:) = zero
    1383         [ +  + ]:          34 :            do ja=1,natom
    1384         [ +  + ]:          48 :              do ia=1,natom
    1385                 :             : !             Finally the cross derivative dCNi/dr dCNj/dr
    1386         [ +  + ]:          90 :                temp_comp2(:) = d2c6rirj(ia,ja)*fe_no_c(:,ia,ja)
    1387                 :          30 :                call comp_prod(cfdcn(:,alpha,ia,ka),temp_comp2,temp_comp)
    1388         [ +  + ]:         108 :                temp_prod(:,ja) = temp_prod(:,ja)+temp_comp(:)
    1389                 :             :              end do
    1390         [ +  + ]:          60 :              do la = 1,natom
    1391         [ +  + ]:         138 :                do beta=1,3
    1392                 :          90 :                  call comp_prod(fdcn(:,beta,ja,la),temp_prod(:,ja),temp_comp2)
    1393                 :             :                  dyn_vdw_dftd3(:,alpha,ka,beta,la)=dyn_vdw_dftd3(:,alpha,ka,beta,la)+&
    1394         [ +  + ]:         300 : &                 two*temp_comp2
    1395                 :             :                end do ! beta
    1396                 :             :              end do ! la
    1397                 :             :            end do ! ja
    1398                 :             :          end do ! alpha
    1399                 :             :        end do !ka
    1400                 :             : !               Transformation from cartesian coordinates to reduced coordinates
    1401         [ +  + ]:           7 :        do ka=1,natom
    1402         [ +  + ]:          13 :          do la=1,natom
    1403         [ +  + ]:          22 :            do kk=1,2
    1404         [ +  + ]:          48 :              do alpha=1,3
    1405         [ +  + ]:         144 :                vec(1:3)=dyn_vdw_dftd3(kk,1:3,ka,alpha,la)
    1406                 :          36 :                call d3_cart2red(vec)
    1407         [ +  + ]:         156 :                dyn_vdw_dftd3(kk,1:3,ka,alpha,la)=vec(1:3)
    1408                 :             :              end do
    1409         [ +  + ]:          54 :              do alpha=1,3
    1410         [ +  + ]:         144 :                vec(1:3)=dyn_vdw_dftd3(kk,alpha,ka,1:3,la)
    1411                 :          36 :                call d3_cart2red(vec)
    1412         [ +  + ]:         156 :                dyn_vdw_dftd3(kk,alpha,ka,1:3,la)=vec(1:3)
    1413                 :             :              end do ! alpha
    1414                 :             :            end do ! real/im
    1415                 :             :          end do       ! Atom la
    1416                 :             :        end do          ! Atom ka
    1417                 :             :      end if             ! Boolean dynamical matrix
    1418         [ +  + ]:           4 :      if (need_elast) then
    1419         [ +  + ]:           3 :        do ia=1,natom
    1420                 :          14 :          index_ia = 6+3*(ia-1)
    1421         [ +  + ]:          14 :          do alpha=1,6
    1422                 :             : !          Add the second derivative of C6 contribution to the elastic tensor
    1423                 :             : !          First, the second derivative of CN with strain
    1424                 :             :            elt_vdw_dftd3(alpha,:) = elt_vdw_dftd3(alpha,:)+(&
    1425         [ +  + ]:          84 : &           e_alpha1(ia)+e_alpha2(ia))*elt_cn(alpha,:,ia)
    1426                 :             : !          Then, the derivative product dCNi/deta dCNi/deta
    1427                 :             :            elt_vdw_dftd3(alpha,:) = elt_vdw_dftd3(alpha,:)+(&
    1428         [ +  + ]:          84 : &           e_alpha3(ia)+e_alpha4(ia))*str_dcn(alpha,ia)*str_dcn(:,ia)
    1429                 :             : !          Then, the dCNi/deta dCNj/deta
    1430         [ +  + ]:          36 :            do ja=1,natom
    1431                 :             :              elt_vdw_dftd3(alpha,:)=elt_vdw_dftd3(alpha,:)+two*e_no_c(ia,ja)*&
    1432         [ +  + ]:         180 : &             d2c6rirj(ia,ja)*str_dcn(alpha,ia)*str_dcn(:,ja)
    1433                 :             :            end do
    1434                 :             : !          Add the cross derivative of fij and C6 contribution to the elastic tensor
    1435                 :             :            elt_vdw_dftd3(alpha,:)=elt_vdw_dftd3(alpha,:)+str_alpha1(:,ia)*str_dcn(alpha,ia)+str_alpha1(alpha,ia)*str_dcn(:,ia)&
    1436         [ +  + ]:          86 : &           +str_dcn(alpha,ia)*str_alpha2(:,ia)+str_dcn(:,ia)*str_alpha2(alpha,ia)
    1437                 :             :          end do
    1438         [ +  + ]:          15 :          do alpha=1,6
    1439                 :          12 :            ii = voigt1(alpha) ; jj=voigt2(alpha)
    1440         [ +  + ]:          38 :            do ka=1,natom
    1441                 :          24 :              index_ka = 6+3*(ka-1)
    1442         [ +  + ]:         108 :              do beta=1,3
    1443                 :             :                ! Add the second derivative of C6 contribution to the internal strains
    1444                 :          72 :                ii = voigt1(alpha) ; jj=voigt2(alpha)
    1445                 :             :                ! Second derivative of CN
    1446                 :             :                elt_vdw_dftd3(index_ka+beta,alpha)=elt_vdw_dftd3(index_ka+beta,alpha)+(e_alpha1(ia)+e_alpha2(ia))*&
    1447                 :          72 : &               elt_cn(index_ka+beta,alpha,ia)
    1448                 :             :                ! Cross-derivatives of CN
    1449                 :             :                elt_vdw_dftd3(index_ka+beta,alpha)=elt_vdw_dftd3(index_ka+beta,alpha)+(e_alpha3(ia)+e_alpha4(ia))*&
    1450                 :          72 : &               dcn_cart(beta,ia,ka)*str_dcn(alpha,ia) !OK
    1451         [ +  + ]:         216 :                do ja=1,natom
    1452                 :         144 :                  index_ja = 6+3*(ja-1)
    1453                 :             :                  elt_vdw_dftd3(index_ka+beta,alpha)=elt_vdw_dftd3(index_ka+beta,alpha)+two*d2c6rirj(ia,ja)*e_no_c(ia,ja)*&
    1454                 :         216 : &                 dcn_cart(beta,ia,ka)*str_dcn(alpha,ja)
    1455                 :             :                end do
    1456                 :             :                elt_vdw_dftd3(index_ka+beta,alpha)=elt_vdw_dftd3(index_ka+beta,alpha)+(str_alpha1(alpha,ia)+str_alpha2(alpha,ia))*&
    1457                 :          72 : &               dcn_cart(beta,ia,ka)
    1458                 :             :                elt_vdw_dftd3(index_ka+beta,alpha)=elt_vdw_dftd3(index_ka+beta,alpha)+grad_no_cij(beta,ka,ia)*&
    1459                 :             : &               (dc6ri(ia,ka)*str_dcn(alpha,ia)+dc6rj(ia,ka)*str_dcn(alpha,ka))-grad_no_cij(beta,ia,ka)*&
    1460                 :          96 : &               (dc6ri(ka,ia)*str_dcn(alpha,ka)+dc6rj(ka,ia)*str_dcn(alpha,ia))
    1461                 :             :              end do ! beta
    1462                 :             :            end do ! ka
    1463                 :             :          end do ! alpha
    1464                 :             :        end do !  ia
    1465         [ +  + ]:           7 :        do alpha=1,6
    1466                 :           6 :          index_ia=6
    1467         [ +  + ]:          19 :          do ia=1,natom
    1468         [ +  + ]:          48 :            elt_vdw_dftd3(index_ia+1:index_ia+3,alpha)=matmul(transpose(rprimd),elt_vdw_dftd3(index_ia+1:index_ia+3,alpha))
    1469                 :          18 :            index_ia=index_ia+3
    1470                 :             :          end do       ! Atom ia
    1471                 :             :        end do          ! Strain alpha
    1472                 :             :      end if             ! Boolean elastic tensor
    1473                 :             :    end if                ! Boolean hessian
    1474                 :             :  end if                   ! Boolean need_gradient
    1475         [ -  + ]:          19 :  ABI_FREE(temp_prod)
    1476                 :             :  write(msg,'(3a)')&
    1477                 :          19 : & '                                  ...Done.'
    1478                 :          19 :  call wrtout(std_out,msg,'COLL')
    1479                 :             : 
    1480                 :             : !print *, 'Evdw', e_vdw_dftd3
    1481                 :             : !if (need_forces) print *, 'fvdw', gred_vdw_dftd3(3,:)
    1482                 :             : !if (need_stress) print *, 'strvdw', str_vdw_dftd3(6)
    1483                 :             : !if (need_elast) print *, 'Elast(3,3,3,3)', elt_vdw_dftd3(3,3)
    1484                 :             : !if (need_elast) print *, 'Elast(3,3,3,3)', elt_vdw_dftd3(6,6)
    1485                 :             : !if (need_elast) print *, 'Elast(3,3,3,3)', elt_vdw_dftd3(3,6)
    1486                 :             : !if (need_elast) print *, 'Internal(1,3,3)', elt_vdw_dftd3(9,3)
    1487                 :             : !if (need_elast) print *, 'Internal(1,3,6)', elt_vdw_dftd3(9,6)
    1488                 :             : !if (need_dynmat) print *, 'Dynmat(1,3,:,3,:)', dyn_vdw_dftd3(1,3,:,3,:)
    1489                 :             : !if (need_dynmat) print *, 'Dynmat(1,3,:,3,:)', dyn_vdw_dftd3(1,2,:,1,:)
    1490                 :             : 
    1491                 :             : !---------------------------------------------
    1492                 :             : ! Computation of the 3 body term (if required)
    1493                 :             : !---------------------------------------------
    1494                 :             : 
    1495                 :          19 :  e_3bt=zero
    1496         [ +  + ]:          19 :  if (bol_3bt) then
    1497         [ +  - ]:          10 :    if (need_grad) then
    1498   [ -  +  +  -  :          30 :      ABI_MALLOC(e3bt_ij,(natom,natom))
          -  +  +  -  -  
                +  -  + ]
    1499   [ -  +  +  -  :          30 :      ABI_MALLOC(e3bt_jk,(natom,natom))
          -  +  +  -  -  
                +  -  + ]
    1500   [ -  +  +  -  :          30 :      ABI_MALLOC(e3bt_ki,(natom,natom))
          -  +  +  -  -  
                +  -  + ]
    1501   [ -  +  +  -  :          30 :      ABI_MALLOC(gred_vdw_3bt,(3,natom))
          +  -  +  -  -  
                +  -  + ]
    1502   [ +  +  +  +  :          70 :      e3bt_ij=zero; e3bt_jk=zero; e3bt_ki=zero
          +  +  +  +  +  
                +  +  + ]
    1503         [ +  + ]:          10 :      if (need_forces) then
    1504   [ +  +  +  + ]:          25 :        gred_vdw_3bt = zero
    1505         [ -  + ]:           5 :      elseif (need_stress) then
    1506                 :           5 :        str_3bt=zero
    1507                 :             :      end if
    1508                 :             :    end if
    1509                 :          10 :    nshell_3bt(1) =  int(0.5+rcut9/sqrt(rmet(1,1)+rmet(2,1)+rmet(3,1)))
    1510                 :          10 :    nshell_3bt(2) =  int(0.5+rcut9/sqrt(rmet(1,2)+rmet(2,2)+rmet(3,2)))
    1511                 :          10 :    nshell_3bt(3) =  int(0.5+rcut9/sqrt(rmet(1,3)+rmet(2,3)+rmet(3,3)))
    1512                 :             : 
    1513         [ +  + ]:         100 :    do is3 = -nshell_3bt(3),nshell_3bt(3)
    1514         [ +  + ]:         910 :      do is2 = -nshell_3bt(2),nshell_3bt(2)
    1515         [ +  + ]:        8190 :        do is1 = -nshell_3bt(1),nshell_3bt(1)
    1516                 :        7290 :          is(1) = is1 ; is(2)=is2 ; is(3) = is3
    1517         [ +  + ]:       29160 :          do alpha=1,3
    1518                 :       21870 :            jmin(alpha) = max(-nshell_3bt(alpha), -nshell_3bt(alpha)+is(alpha))
    1519                 :       29160 :            jmax(alpha) = min(nshell_3bt(alpha), nshell_3bt(alpha)+is(alpha))
    1520                 :             :          end do
    1521         [ +  + ]:       57510 :          do js3=jmin(3),jmax(3)
    1522         [ +  + ]:      391590 :            do js2=jmin(2),jmax(2)
    1523         [ +  + ]:     2654110 :              do js1=jmin(1),jmax(1)
    1524                 :     2269810 :                js(1) = js1 ; js(2)=js2 ; js(3) = js3
    1525         [ +  + ]:     4874510 :                do ia=1,natom
    1526                 :     2269810 :                  itypat=typat(ia)
    1527         [ +  + ]:     6809430 :                  do ja=1,ia
    1528                 :     2269810 :                    jtypat=typat(ja)
    1529         [ +  + ]:     6809430 :                    do ka=1,ja
    1530                 :     2269810 :                      ktypat=typat(ka)
    1531         [ +  + ]:     9079240 :                      rij(:) = xred01(:,ia)-xred01(:,ja)-dble(is(:))
    1532   [ +  +  +  +  :    36316960 :                      rsqij = dot_product(rij(:),matmul(rmet,rij(:)))
                   +  + ]
    1533                 :     2269810 :                      rrij = dsqrt(rsqij)
    1534         [ +  + ]:     9079240 :                      rjk(:) = xred01(:,ja)-xred01(:,ka)+dble(is(:))-dble(js(:))
    1535   [ +  +  +  +  :    36316960 :                      rsqjk = dot_product(rjk(:),matmul(rmet,rjk(:)))
                   +  + ]
    1536                 :     2269810 :                      rrjk = dsqrt(rsqjk)
    1537         [ +  + ]:     9079240 :                      rki(:) = xred01(:,ka)-xred01(:,ia)+dble(js(:))
    1538   [ +  +  +  +  :    36316960 :                      rsqki = dot_product(rki(:),matmul(rmet,rki(:)))
                   +  + ]
    1539                 :     2269810 :                      rrki = dsqrt(rsqki)
    1540   [ +  +  +  +  :     4539620 :                      if (rsqij>=tol16.and.rsqjk>=tol16.and.rsqki>=tol16) then
                   +  + ]
    1541                 :     2247960 :                        rmean = (rrij*rrjk*rrki)**third
    1542   [ +  +  +  +  :     2247960 :                        if (rrij>rcut9.or.rrjk>rcut9.or.rrki>rcut9) cycle
                   +  + ]
    1543                 :     1464480 :                        sfact9=vdw_s6
    1544         [ +  - ]:     1464480 :                        if (ia==ja.and.ja==ka) sfact9 = sixth*sfact9
    1545         [ -  + ]:     1464480 :                        if (ia==ja.and.ja/=ka) sfact9 = half*sfact9
    1546         [ -  + ]:     1464480 :                        if (ia/=ja.and.ja==ka) sfact9 = half*sfact9
    1547                 :     1464480 :                        rijk = one/(rrij*rrjk*rrki)
    1548                 :     1464480 :                        dmp9 = six*(rmean*vdw_sr9*r0ijk(itypat,jtypat,ktypat))**(-alpha8)
    1549                 :     1464480 :                        fdmp9 = one/(one+dmp9)
    1550                 :     1464480 :                        cosa = half*rrjk*(rsqij+rsqki-rsqjk)*rijk
    1551                 :     1464480 :                        cosb = half*rrki*(rsqij+rsqjk-rsqki)*rijk
    1552                 :     1464480 :                        cosc = half*rrij*(rsqjk+rsqki-rsqij)*rijk
    1553                 :     1464480 :                        ang =  one+three*cosa*cosb*cosc
    1554                 :     1464480 :                        temp = sfact9*rijk*rijk*rijk
    1555                 :     1464480 :                        temp2 = temp*fdmp9*ang
    1556                 :             : !                                     Contribution to energy
    1557                 :     1464480 :                        e_3bt = e_3bt-temp2*vdw_c9(ia,ja,ka) !*temp2
    1558                 :     1464480 :                        e3bt_ij(ia,ja) = e3bt_ij(ia,ja)-temp2*vdw_c9(ia,ja,ka)
    1559                 :     1464480 :                        e3bt_jk(ja,ka) = e3bt_jk(ja,ka)-temp2*vdw_c9(ia,ja,ka)
    1560                 :     1464480 :                        e3bt_ki(ka,ia) = e3bt_ki(ka,ia)-temp2*vdw_c9(ia,ja,ka)
    1561         [ +  - ]:     1464480 :                        if (need_grad) then
    1562                 :     1464480 :                          dfdmp = third*alpha8*fdmp9*fdmp9*dmp9
    1563         [ +  + ]:     1464480 :                          if (ia/=ja.or.need_stress) then
    1564                 :      732240 :                            d1_r3drij = -three*rrki*rrjk
    1565                 :      732240 :                            dcosa_r3drij = (rrij-two*cosa*rrki)*rrjk
    1566                 :      732240 :                            dcosb_r3drij = (rrij-two*cosb*rrjk)*rrki
    1567                 :      732240 :                            dcosc_r3drij =-(rsqij+cosc*rrjk*rrki)
    1568                 :      732240 :                            dfdmp_drij = dfdmp*rrki*rrjk
    1569                 :             :                            d_drij = vdw_c9(ia,ja,ka)*temp*rijk*((d1_r3drij+three*&
    1570                 :             : &                           (cosb*cosc*dcosa_r3drij+cosa*cosc*dcosb_r3drij+cosa*cosb*dcosc_r3drij))*&
    1571                 :      732240 : &                           fdmp9+dfdmp_drij*ang)*rijk*rrjk*rrki
    1572   [ +  +  +  + ]:     9519120 :                            rcartij=matmul(rprimd,rij)
    1573                 :             :                          end if
    1574         [ +  + ]:     1464480 :                          if (ja/=ka.or.need_stress) then
    1575                 :      732240 :                            d1_r3drjk = -three*rrij*rrki
    1576                 :      732240 :                            dcosa_r3drjk =-(rsqjk+cosa*rrij*rrki)
    1577                 :      732240 :                            dcosb_r3drjk = (rrjk-two*cosb*rrij)*rrki
    1578                 :      732240 :                            dcosc_r3drjk = (rrjk-two*cosc*rrki)*rrij
    1579                 :      732240 :                            dfdmp_drjk = dfdmp*rrij*rrki
    1580                 :             :                            d_drjk = vdw_c9(ia,ja,ka)*temp*rijk*((d1_r3drjk+three*&
    1581                 :             : &                           (cosb*cosc*dcosa_r3drjk+cosa*cosc*dcosb_r3drjk+cosa*cosb*dcosc_r3drjk))*&
    1582                 :      732240 : &                           fdmp9+dfdmp_drjk*ang)*rijk*rrij*rrki
    1583   [ +  +  +  + ]:     9519120 :                            rcartjk=matmul(rprimd,rjk)
    1584                 :             :                          end if
    1585         [ +  + ]:     1464480 :                          if (ka/=ia.or.need_stress) then
    1586                 :      732240 :                            d1_r3drki = -three*rrjk*rrij
    1587                 :      732240 :                            dcosa_r3drki = (rrki-two*cosa*rrij)*rrjk
    1588                 :      732240 :                            dcosb_r3drki =-(rsqki+cosb*rrij*rrjk)
    1589                 :      732240 :                            dcosc_r3drki = (rrki-two*cosc*rrjk)*rrij
    1590                 :      732240 :                            dfdmp_drki = dfdmp*rrij*rrjk
    1591                 :             :                            d_drki = vdw_c9(ia,ja,ka)*temp*rijk*((d1_r3drki+three*&
    1592                 :             : &                           (cosb*cosc*dcosa_r3drki+cosa*cosc*dcosb_r3drki+cosa*cosb*dcosc_r3drki))*&
    1593                 :      732240 : &                           fdmp9+dfdmp_drki*ang)*rijk*rrij*rrjk
    1594   [ +  +  +  + ]:     9519120 :                            rcartki=matmul(rprimd,rki)
    1595                 :             :                          end if
    1596                 :             : !                                        Contribution to gradients wr to atomic displacement
    1597                 :             : !                                        (forces)
    1598         [ +  + ]:     1464480 :                          if (need_forces) then
    1599   [ -  +  -  - ]:      732240 :                            if (ia/=ja) gredij=d_drij*matmul(transpose(rprimd),rcartij)
    1600   [ -  +  -  - ]:      732240 :                            if (ja/=ka) gredjk=d_drjk*matmul(transpose(rprimd),rcartjk)
    1601   [ -  +  -  - ]:      732240 :                            if (ka/=ia) gredki=d_drki*matmul(transpose(rprimd),rcartki)
    1602         [ -  + ]:      732240 :                            if (ia/=ja.and.ka/=ia) then
    1603         [ #  # ]:           0 :                              gred_vdw_3bt(:,ia)=gred_vdw_3bt(:,ia)-gredij(:)+gredki(:)
    1604         [ #  # ]:           0 :                              gred_vdw_3bt(:,ja)=gred_vdw_3bt(:,ja)+gredij(:)-gredjk(:)
    1605         [ #  # ]:           0 :                              gred_vdw_3bt(:,ka)=gred_vdw_3bt(:,ka)-gredki(:)+gredjk(:)
    1606         [ -  + ]:      732240 :                            else if (ia==ja.and.ia/=ka) then
    1607         [ #  # ]:           0 :                              gred_vdw_3bt(:,ia)=gred_vdw_3bt(:,ia)+gredki(:)
    1608         [ #  # ]:           0 :                              gred_vdw_3bt(:,ja)=gred_vdw_3bt(:,ja)-gredjk(:)
    1609         [ #  # ]:           0 :                              gred_vdw_3bt(:,ka)=gred_vdw_3bt(:,ka)-gredki(:)+gredjk(:)
    1610         [ -  + ]:      732240 :                            elseif (ia==ka.and.ia/=ja) then
    1611         [ #  # ]:           0 :                              gred_vdw_3bt(:,ia)=gred_vdw_3bt(:,ia)-gredij(:)
    1612         [ #  # ]:           0 :                              gred_vdw_3bt(:,ja)=gred_vdw_3bt(:,ja)+gredij(:)-gredjk(:)
    1613         [ #  # ]:           0 :                              gred_vdw_3bt(:,ka)=gred_vdw_3bt(:,ka)+gredjk(:)
    1614         [ -  + ]:      732240 :                            elseif (ja==ka.and.ia/=ja) then
    1615         [ #  # ]:           0 :                              gred_vdw_3bt(:,ia)=gred_vdw_3bt(:,ia)-gredij(:)+gredki(:)
    1616         [ #  # ]:           0 :                              gred_vdw_3bt(:,ja)=gred_vdw_3bt(:,ja)+gredij(:)
    1617         [ #  # ]:           0 :                              gred_vdw_3bt(:,ka)=gred_vdw_3bt(:,ka)-gredki(:)
    1618                 :             :                            end if
    1619                 :             :                          end if
    1620                 :             : !                                        Contribution to stress tensor
    1621         [ +  + ]:     1464480 :                          if (need_stress) then
    1622         [ +  + ]:     2928960 :                            vecij(1:3)=rcartij(1:3)*rcartij(1:3); vecij(4)=rcartij(2)*rcartij(3)
    1623                 :      732240 :                            vecij(5)=rcartij(1)*rcartij(3); vecij(6)=rcartij(1)*rcartij(2)
    1624         [ +  + ]:     2928960 :                            vecjk(1:3)=rcartjk(1:3)*rcartjk(1:3); vecjk(4)=rcartjk(2)*rcartjk(3)
    1625                 :      732240 :                            vecjk(5)=rcartjk(1)*rcartjk(3); vecjk(6)=rcartjk(1)*rcartjk(2)
    1626         [ +  + ]:     2928960 :                            vecki(1:3)=rcartki(1:3)*rcartki(1:3); vecki(4)=rcartki(2)*rcartki(3)
    1627                 :      732240 :                            vecki(5)=rcartki(1)*rcartki(3); vecki(6)=rcartki(1)*rcartki(2)
    1628         [ +  + ]:     5125680 :                            str_3bt(:)=str_3bt(:)-d_drij*vecij(:)-d_drjk*vecjk(:)-d_drki*vecki(:) !-str_3bt_dcn9(:)
    1629                 :             :                          end if
    1630                 :             :                        end if ! Optimization
    1631                 :             :                      end if   ! Tolerance
    1632                 :             :                    end do  ! Loop over atom k
    1633                 :             :                  end do     ! Loop over atom j
    1634                 :             :                end do        ! Loop over atom i
    1635                 :             :              end do ! j3
    1636                 :             :            end do ! j2
    1637                 :             :          end do ! j1
    1638                 :             :        end do
    1639                 :             :      end do
    1640                 :             :    end do
    1641         [ +  + ]:          10 :    if (need_forces) then
    1642         [ +  + ]:          10 :      do ia=1,natom
    1643         [ +  + ]:          15 :        do ja=1,natom
    1644         [ +  + ]:          15 :          do la=1,natom
    1645         [ +  + ]:          20 :            gred_vdw_3bt(:,la) = gred_vdw_3bt(:,la)+e3bt_ij(ia,ja)*(dc9ijri(ia,ja)*dcn(:,ia,la)+dc9ijrj(ia,ja)*dcn(:,ja,la))
    1646         [ +  + ]:          20 :            gred_vdw_3bt(:,la) = gred_vdw_3bt(:,la)+e3bt_jk(ia,ja)*(dc9ijri(ia,ja)*dcn(:,ia,la)+dc9ijrj(ia,ja)*dcn(:,ja,la))
    1647         [ +  + ]:          25 :            gred_vdw_3bt(:,la) = gred_vdw_3bt(:,la)+e3bt_ki(ia,ja)*(dc9ijri(ia,ja)*dcn(:,ia,la)+dc9ijrj(ia,ja)*dcn(:,ja,la))
    1648                 :             :          end do
    1649                 :             :        end do
    1650                 :             :      end do
    1651         [ +  - ]:           5 :    elseif (need_stress) then
    1652         [ +  + ]:          10 :      do ia=1,natom
    1653         [ +  + ]:          15 :        do ja=1,natom
    1654         [ +  + ]:          35 :          str_3bt(:) = str_3bt(:)+e3bt_ij(ia,ja)*(dc9ijri(ia,ja)*str_dcn(:,ia)+dc9ijrj(ia,ja)*str_dcn(:,ja))
    1655         [ +  + ]:          35 :          str_3bt(:) = str_3bt(:)+e3bt_jk(ia,ja)*(dc9ijri(ia,ja)*str_dcn(:,ia)+dc9ijrj(ia,ja)*str_dcn(:,ja))
    1656         [ +  + ]:          40 :          str_3bt(:) = str_3bt(:)+e3bt_ki(ia,ja)*(dc9ijri(ia,ja)*str_dcn(:,ia)+dc9ijrj(ia,ja)*str_dcn(:,ja))
    1657                 :             :        end do
    1658                 :             :      end do
    1659                 :             :    end if
    1660                 :          10 :    e_vdw_dftd3 = e_vdw_dftd3+e_3bt
    1661   [ +  +  +  +  :          30 :    if (need_forces) gred_vdw_dftd3= gred_vdw_dftd3+gred_vdw_3bt
                   +  + ]
    1662   [ +  +  +  + ]:          40 :    if (need_stress) str_vdw_dftd3 = str_vdw_dftd3+str_3bt
    1663         [ -  + ]:          10 :    ABI_FREE(dc9ijri)
    1664         [ -  + ]:          10 :    ABI_FREE(dc9ijrj)
    1665         [ -  + ]:          10 :    ABI_FREE(e3bt_ij)
    1666         [ -  + ]:          10 :    ABI_FREE(e3bt_jk)
    1667         [ -  + ]:          10 :    ABI_FREE(e3bt_ki)
    1668         [ -  + ]:          10 :    ABI_FREE(vdw_c9)
    1669         [ -  + ]:          10 :    ABI_FREE(r0ijk)
    1670         [ -  + ]:          10 :    ABI_FREE(gred_vdw_3bt)
    1671                 :             :  end if
    1672   [ +  +  +  + ]:          61 :  if (need_stress) str_vdw_dftd3=str_vdw_dftd3/ucvol
    1673                 :             : 
    1674                 :             : !Printing
    1675         [ +  + ]:          19 :  if (prtvol>0) then
    1676                 :          11 :    write(msg,'(2a)') ch10,&
    1677                 :          22 : &   '  --------------------------------------------------------------'
    1678                 :          11 :    call wrtout(std_out,msg,'COLL')
    1679         [ +  + ]:          11 :    if (vdw_xc==6) then
    1680                 :             :      write(msg,'(3a)') &
    1681                 :           5 : &     '   Van der Waals DFT-D3 semi-empirical dispersion potential as',ch10,&
    1682                 :          10 : &     '   proposed by Grimme et al., J. Chem. Phys. 132, 154104 (2010)' ! [[cite:Grimme2010]]
    1683                 :           5 :      call wrtout(std_out,msg,'COLL')
    1684         [ +  - ]:           6 :    elseif (vdw_xc==7) then
    1685                 :             :      write(msg,'(5a)') &
    1686                 :           6 : &     '    Van der Waals DFT-D3 semi-empirical dispersion potential  ' ,ch10,&
    1687                 :           6 : &     '    with Becke-Jonhson (BJ) refined by Grimme et al. J.    ',ch10,&
    1688                 :          12 : &     '    Comput. Chem. 32, 1456 (2011) ' ! [[cite:Grimme2011]]
    1689                 :           6 :      call wrtout(std_out,msg,'COLL')
    1690                 :             :    end if
    1691         [ +  - ]:          11 :    if (natom<5) then
    1692                 :             :      write(msg,'(3a)')&
    1693                 :          11 : &     '         Pair       C6 (a.u.)       C8 (a.u.)       R0 (Ang)  ',ch10,&
    1694                 :          22 : &     '  ---------------------------------------------------------------'
    1695                 :          11 :      call wrtout(std_out,msg,'COLL')
    1696         [ +  + ]:          24 :      do ia=1,natom
    1697         [ +  + ]:          39 :        do ja=1,ia
    1698                 :          15 :          itypat = typat(ia) ; jtypat = typat(ja)
    1699                 :          15 :          call atomdata_from_znucl(atom1,znucl(itypat))
    1700                 :          15 :          call atomdata_from_znucl(atom2,znucl(jtypat))
    1701                 :             :          write(msg,'(4X,2a,i2,3a,i2,1a,1X,es12.4,4X,es12.4,4X,es12.4,1X)') &
    1702                 :          15 :          atom1%symbol,'(',ia,')-',atom2%symbol,'(',ja,')', &
    1703                 :          15 :          vdw_c6(ia,ja), vdw_c8(ia,ja),&
    1704                 :          30 :          vdw_r0(itypat,jtypat)
    1705                 :          43 :          call wrtout(std_out,msg,'COLL')
    1706                 :             :        end do
    1707                 :             :      end do
    1708                 :             :    end if
    1709                 :             :    write(msg, '(3a,f6.3,a,f6.3)') &
    1710                 :          11 : &   '  ---------------------------------------------------------------',ch10,&
    1711                 :          22 : &   '      Scaling factors:       s6 = ', vdw_s6,',    s8 = ',vdw_s8
    1712                 :          11 :    call wrtout(std_out,msg,'COLL')
    1713         [ +  + ]:          11 :    if (vdw_xc==6) then
    1714                 :             :      write(msg,'(a,f6.3,a,f6.3)') &
    1715                 :           5 : &     '      Damping parameters:   sr6 = ', vdw_sr6,',   sr8 = ',vdw_sr8
    1716                 :           5 :      call wrtout(std_out,msg,'COLL')
    1717         [ +  - ]:           6 :    elseif (vdw_xc==7) then
    1718                 :             :      write(msg,'(a,f6.3,a,f6.3)') &
    1719                 :           6 : &     '      Damping parameters:    a1 = ', vdw_a1, ',    a2 = ', vdw_a2
    1720                 :           6 :      call wrtout(std_out,msg,'COLL')
    1721                 :             :    end if
    1722                 :             :    write(msg,'(a,es12.5,3a,i14,2a,es12.5,1a)') &
    1723                 :          11 : &   '      Cut-off radius   = ',rcut,' Bohr',ch10,&
    1724                 :          11 : &   '      Number of pairs contributing = ',npairs,ch10,&
    1725                 :          22 : &   '      DFT-D3 (no 3-body) energy contribution = ',e_vdw_dftd3-e_3bt,' Ha'
    1726                 :          11 :    call wrtout(std_out,msg,'COLL')
    1727         [ +  + ]:          11 :    if (bol_3bt) then
    1728                 :           5 :      write(msg,'(6a,i5,2a,es20.11,3a,es20.11,1a)')ch10,&
    1729                 :           5 : &     '  ---------------------------------------------------------------',ch10,&
    1730                 :           5 : &     '      3-Body Term Contribution:', ch10,&
    1731                 :           5 : &     '      Number of shells considered    = ', nshell, ch10,&
    1732                 :           5 : &     '      Additional 3-body contribution = ', e_3bt, ' Ha',ch10,&
    1733                 :          10 : &     '      Total E (2-body and 3-body)    = ', e_vdw_dftd3, 'Ha'
    1734                 :           5 :      call wrtout(std_out,msg,'COLL')
    1735                 :             :    end if
    1736                 :             :    write(msg,'(2a)')&
    1737                 :          11 : &   '  ----------------------------------------------------------------',ch10
    1738                 :          11 :    call wrtout(std_out,msg,'COLL')
    1739                 :             :  end if
    1740         [ -  + ]:          19 :  ABI_FREE(ivdw)
    1741         [ -  + ]:          19 :  ABI_FREE(xred01)
    1742         [ -  + ]:          19 :  ABI_FREE(vdw_r0)
    1743         [ -  + ]:          19 :  ABI_FREE(fe_no_c)
    1744         [ -  + ]:          19 :  ABI_FREE(e_no_c)
    1745         [ -  + ]:          19 :  ABI_FREE(e_alpha1)
    1746         [ -  + ]:          19 :  ABI_FREE(e_alpha2)
    1747         [ -  + ]:          19 :  ABI_FREE(e_alpha3)
    1748         [ -  + ]:          19 :  ABI_FREE(e_alpha4)
    1749         [ -  + ]:          19 :  ABI_FREE(grad_no_cij)
    1750         [ -  + ]:          19 :  ABI_FREE(fgrad_no_c)
    1751         [ -  + ]:          19 :  ABI_FREE(cfgrad_no_c)
    1752         [ -  + ]:          19 :  ABI_FREE(vdw_c6)
    1753         [ -  + ]:          19 :  ABI_FREE(vdw_c8)
    1754         [ -  + ]:          19 :  ABI_FREE(dc6ri)
    1755         [ -  + ]:          19 :  ABI_FREE(dc6rj)
    1756         [ -  + ]:          19 :  ABI_FREE(d2c6ri)
    1757         [ -  + ]:          19 :  ABI_FREE(d2c6rj)
    1758         [ -  + ]:          19 :  ABI_FREE(d2c6rirj)
    1759         [ -  + ]:          19 :  ABI_FREE(cn)
    1760         [ -  + ]:          19 :  ABI_FREE(d2cn_iii)
    1761         [ -  + ]:          19 :  ABI_FREE(d2cn_jji)
    1762         [ -  + ]:          19 :  ABI_FREE(d2cn_iji)
    1763         [ -  + ]:          19 :  ABI_FREE(d2cn_jii)
    1764         [ -  + ]:          19 :  ABI_FREE(d2cn_tmp)
    1765         [ -  + ]:          19 :  ABI_FREE(dcn)
    1766         [ -  + ]:          19 :  ABI_FREE(fdcn)
    1767         [ -  + ]:          19 :  ABI_FREE(cfdcn)
    1768         [ -  + ]:          19 :  ABI_FREE(str_dcn)
    1769         [ -  + ]:          19 :  ABI_FREE(elt_cn)
    1770         [ -  + ]:          19 :  ABI_FREE(str_no_c)
    1771         [ -  + ]:          19 :  ABI_FREE(str_alpha1)
    1772         [ -  + ]:          19 :  ABI_FREE(str_alpha2)
    1773   [ +  +  +  +  :          49 :  ABI_FREE(dcn_cart)
          +  +  -  +  -  
          +  -  +  -  +  
                   -  + ]
    1774                 :             :  DBG_EXIT("COLL")
    1775                 :             : 
    1776                 :             :  contains
    1777                 :             : !! ***
    1778                 :             : 
    1779                 :             : !!****f*vdw_dftd3/comp_prod
    1780                 :             : !!
    1781                 :             : !! NAME
    1782                 :             : !! comp_prod
    1783                 :             : !!
    1784                 :             : !! FUNCTION
    1785                 :             : !! Return the product of two complex numbers stored in rank 1 array
    1786                 :             : !!
    1787                 :             : !! SOURCE
    1788                 :             : 
    1789                 :         390 :    subroutine comp_prod(a,b,c)
    1790                 :             : 
    1791                 :             :  !Arguments ----------------------
    1792                 :             :    real(dp),intent(in) :: a(2),b(2)
    1793                 :             :    real(dp),intent(out) :: c(2)
    1794                 :             : 
    1795                 :             : ! *********************************************************************
    1796                 :             : 
    1797                 :         390 :    c(1) = a(1)*b(1)-a(2)*b(2)
    1798                 :         390 :    c(2) = a(1)*b(2)+a(2)*b(1)
    1799                 :             : 
    1800                 :             :  end subroutine comp_prod
    1801                 :             : !!***
    1802                 :             : 
    1803                 :             : !!****f*vdw_dftd3/d3_cart2red
    1804                 :             : !!
    1805                 :             : !! NAME
    1806                 :             : !! d3_cart2red
    1807                 :             : !!
    1808                 :             : !! FUNCTION
    1809                 :             : !! Convert gradients from cartesian to reduced coordinates
    1810                 :             : !!
    1811                 :             : !! SOURCE
    1812                 :             : 
    1813                 :          72 : subroutine d3_cart2red(grad)
    1814                 :             : 
    1815                 :             : !Arguments ------------------------------------
    1816                 :             :  real(dp),intent(inout) :: grad(3)
    1817                 :             : !Local variables-------------------------------
    1818                 :             :  real(dp) :: tmp(3)
    1819                 :             : 
    1820                 :             : ! *********************************************************************
    1821                 :             : 
    1822                 :          72 :    tmp(1)=rprimd(1,1)*grad(1)+rprimd(2,1)*grad(2)+rprimd(3,1)*grad(3)
    1823                 :          72 :    tmp(2)=rprimd(1,2)*grad(1)+rprimd(2,2)*grad(2)+rprimd(3,2)*grad(3)
    1824                 :          72 :    tmp(3)=rprimd(1,3)*grad(1)+rprimd(2,3)*grad(2)+rprimd(3,3)*grad(3)
    1825                 :          72 :    grad(1:3)=tmp(1:3)
    1826                 :             : 
    1827                 :          72 :  end subroutine d3_cart2red
    1828                 :             : !!***
    1829                 :             : 
    1830                 :             : end subroutine vdw_dftd3
    1831                 :             : !!***
    1832                 :             : 
    1833                 :             : end module m_vdw_dftd3
    1834                 :             : !!***
        

Generated by: LCOV version 2.3-1