LCOV - code coverage report
Current view: top level - src/66_nonlocal - m_nonlop_pl.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 90.0 % 568 511
Test Date: 2026-11-10 12:08:57 Functions: 100.0 % 5 5
Branches: 72.0 % 1366 983

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_nonlop_pl
       2                 :             : !! NAME
       3                 :             : !!  nonlop_pl
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !!
       7                 :             : !! COPYRIGHT
       8                 :             : !!  Copyright (C) 1998-2026 ABINIT group (DCA, XG, GMR, GZ, MT, FF, DRH)
       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                 :             : !! PARENTS
      14                 :             : !!      m_nonlop
      15                 :             : !!
      16                 :             : !! CHILDREN
      17                 :             : !!
      18                 :             : !! SOURCE
      19                 :             : 
      20                 :             : #if defined HAVE_CONFIG_H
      21                 :             : #include "config.h"
      22                 :             : #endif
      23                 :             : 
      24                 :             : #include "abi_common.h"
      25                 :             : 
      26                 :             : module m_nonlop_pl
      27                 :             : 
      28                 :             :  use defs_basis
      29                 :             :  use m_errors
      30                 :             :  use m_abicore
      31                 :             :  use m_xmpi
      32                 :             :  use m_contistr01
      33                 :             :  use m_contistr03
      34                 :             :  use m_contistr12
      35                 :             :  use m_contstr21
      36                 :             :  use m_contstr23
      37                 :             :  use m_contstr25
      38                 :             :  use m_contstr25a
      39                 :             :  use m_contstr26
      40                 :             :  use m_metstr
      41                 :             :  use m_opernl
      42                 :             : 
      43                 :             :  use defs_abitypes,   only : MPI_type
      44                 :             :  use m_geometry,      only : strconv
      45                 :             :  use m_kg,            only : ph1d3d
      46                 :             :  use m_contract,      only : cont22cso, cont22so, cont24, cont33cso, cont33so, cont35, cont22, cont3, cont13, &
      47                 :             :                              metcon, metcon_so, metric_so
      48                 :             :  use m_numeric_tools, only : geteuler
      49                 :             :  implicit none
      50                 :             : 
      51                 :             :  private
      52                 :             : !!***
      53                 :             : 
      54                 :             :  public :: nonlop_pl
      55                 :             : !!***
      56                 :             : 
      57                 :             : contains
      58                 :             : !!***
      59                 :             : 
      60                 :             : !!****f* ABINIT/nonlop_pl
      61                 :             : !! NAME
      62                 :             : !! nonlop_pl
      63                 :             : !!
      64                 :             : !! FUNCTION
      65                 :             : !! * Compute application of a nonlocal operator Vnl in order to get:
      66                 :             : !!    - contracted elements (energy, forces, stresses, ...), if signs=1
      67                 :             : !!    - a function in reciprocal space (|out> = Vnl|in>), if signs=2
      68                 :             : !!   Operator Vnl, as the following form:
      69                 :             : !!    $Vnl=sum_{R,lmn,l''m''n''} {|P_{Rlmn}> Enl^{R}_{lmn,l''m''n''} <P_{Rl''m''n''}|}$
      70                 :             : !!   Operator Vnl is -- in the typical case -- the nonlocal potential.
      71                 :             : !!   - With norm-conserving pseudopots, $Enl^{R}_{lmn,l''m''n''}$ is the
      72                 :             : !!     Kleinmann-Bylander energy $Ekb^{R}_{ln}$.
      73                 :             : !!   - The |P_{Rlmn}> are the projector functions.
      74                 :             : !! * This routine uses Legendre polynomials Pl to express Vnl.
      75                 :             : !!
      76                 :             : !! INPUTS
      77                 :             : !!  choice: chooses possible output:
      78                 :             : !!    choice=1 => a non-local energy contribution
      79                 :             : !!          =2 => a gradient with respect to atomic position(s)
      80                 :             : !!          =3 => a gradient with respect to strain(s)
      81                 :             : !!          =23=> a gradient with respect to atm. pos. and strain(s)
      82                 :             : !!          =4 => a gradient and 2nd derivative with respect to atomic pos.
      83                 :             : !!          =5 => a gradient with respect to k wavevector
      84                 :             : !!          =6 => 2nd derivatives with respect to strain
      85                 :             : !!  dimekb1,dimekb2=dimensions of ekb (see ekb)
      86                 :             : !!  dimffnlin=second dimension of ffnlin (1+number of derivatives)
      87                 :             : !!  dimffnlout=second dimension of ffnlout (1+number of derivatives)
      88                 :             : !!  ekb(dimekb1,dimekb2,nspinortot**2)= (Real) Kleinman-Bylander energies (hartree)
      89                 :             : !!                                   dimekb1=lmnmax  -  dimekp2=ntypat
      90                 :             : !!  ffnlin(npwin,dimffnlin,lmnmax,ntypat)=nonlocal form factors to be used
      91                 :             : !!          for the application of the nonlocal operator to the |in> vector
      92                 :             : !!  ffnlout(npwout,dimffnlout,lmnmax,ntypat)=nonlocal form factors to be used
      93                 :             : !!          for the application of the nonlocal operator to the |out> vector
      94                 :             : !!  gmet(3,3)=metric tensor for G vecs (in bohr**-2)
      95                 :             : !!  gprimd(3,3)=dimensional reciprocal space primitive translations
      96                 :             : !!   (bohr^-1)
      97                 :             : !!  idir=direction of the - atom to be moved in the case (choice=2,signs=2),
      98                 :             : !!                        - k point direction in the case (choice=5,signs=2)
      99                 :             : !!                        - strain component (1:6) in the case (choice=3,signs=2) or (choice=6,signs=1)
     100                 :             : !!  indlmn(6,i,ntypat)= array giving l,m,n,lm,ln,s for i=ln
     101                 :             : !!  istwf_k=option parameter that describes the storage of wfs
     102                 :             : !!  kgin(3,npwin)=integer coords of planewaves in basis sphere, for the |in> vector
     103                 :             : !!  kgout(3,npwout)=integer coords of planewaves in basis sphere, for the |out> vector
     104                 :             : !!  kpgin(npw,npkgin)= (k+G) components and related data, for the |in> vector
     105                 :             : !!  kpgout(npw,nkpgout)=(k+G) components and related data, for the |out> vector
     106                 :             : !!  kptin(3)=k point in terms of recip. translations, for the |in> vector
     107                 :             : !!  kptout(3)=k point in terms of recip. translations, for the |out> vector
     108                 :             : !!  lmnmax=max. number of (l,m,n) components over all types of atoms
     109                 :             : !!  matblk=dimension of the arrays ph3din and ph3dout
     110                 :             : !!  mgfft=maximum size of 1D FFTs
     111                 :             : !!  mpi_enreg=information about MPI parallelization
     112                 :             : !!  natom=number of atoms in cell
     113                 :             : !!  nattyp(ntypat)=number of atoms of each type
     114                 :             : !!  ngfft(18)=contain all needed information about 3D FFT, see ~abinit/doc/variables/vargs.htm#ngfft
     115                 :             : !!  nkpgin,nkpgout=second sizes of arrays kpgin/kpgout
     116                 :             : !!  nloalg(3)=governs the choice of the algorithm for nonlocal operator
     117                 :             : !!  nnlout=dimension of enlout: choice=1=>nnlout=1   choice=2=>nnlout=3*natom
     118                 :             : !!                              choice=3=>nnlout=6   choice=4=>nnlout=6*natom
     119                 :             : !!                              choice=5=>nnlout=1   choice=6=>nnlout=6*(3*natom+6)
     120                 :             : !!                              choice=23=>nnlout=6+3*natom
     121                 :             : !!  npwin=number of planewaves for given k point, for the |in> vector
     122                 :             : !!  npwout=number of planewaves for given k point, for the |out> vector
     123                 :             : !!  nspinor=number of spinorial components of the wavefunctions on current proc
     124                 :             : !!  nspinortot=total number of spinorial components of the wavefunctions
     125                 :             : !!  ntypat=number of types of atoms in cell
     126                 :             : !!  only_SO=flag to calculate only the SO part in nonlop
     127                 :             : !!  phkxredin(2,natom)=phase factors exp(2 pi kptin.xred)
     128                 :             : !!  phkxredout(2,natom)=phase factors exp(2 pi kptout.xred)
     129                 :             : !!  ph1d(2,3*(2*mgfft+1)*natom)=1D structure factors phase information
     130                 :             : !!  ph3din(2,npwin,matblk)=3D structure factors, for each atom and plane wave (in)
     131                 :             : !!  ph3dout(2,npwout,matblk)=3-dim structure factors, for each atom and plane wave (out)
     132                 :             : !!  --- pspso removed in beautification because it was unused ---
     133                 :             : !!  pspso(ntypat)=spin-orbit characteristic for each atom type
     134                 :             : !!  -------------------------------------------------------------
     135                 :             : !!  signs= if 1, get contracted elements (energy, forces, stress, ...)
     136                 :             : !!         if 2, applies the non-local operator to a function in reciprocal space
     137                 :             : !!  ucvol=unit cell volume (bohr^3)
     138                 :             : !!  vectin(2,nspinor*npwin)=input cmplx wavefunction coefficients <G|Cnk>
     139                 :             : !!  use_gbt= if 1, no spin-orbit coupling (scaler-Relativistic only);
     140                 :             : !!           if 2, include only the \sigma_z component of the spin-orbit coupling.
     141                 :             : !!
     142                 :             : !! OUTPUT
     143                 :             : !!  ==== if (signs==1) ====
     144                 :             : !!     enlout(nnlout)= contribution of this state to the nl part
     145                 :             : !!                     of the following properties:
     146                 :             : !!       if choice=1 : enlout(1)               -> the energy
     147                 :             : !!       if choice=2 : enlout(1:3*natom)       -> the forces
     148                 :             : !!       if choice=3 : enlout(1:6)             -> the stresses
     149                 :             : !!       if choice=23: enlout(1:6+3*natom)     -> the forces and the stresses
     150                 :             : !!       if choice=4 : enlout(1:6*natom)       -> the frozen wf part of dynam. matrix
     151                 :             : !!       if choice=6 : enlout(1:6*(3*natom+6)) -> the frozen wf part of elastic tensor
     152                 :             : !!  ==== if (signs==2) ====
     153                 :             : !!     vectout(2,nspinor*npwout)= result of the aplication of the nl operator
     154                 :             : !!                                or one of its derivative to the input vect.:
     155                 :             : !!       if choice=1 : Vnl |vectin>
     156                 :             : !!       if choice=2 : dVnl/d(xred(idir,iatom) |vectin> (xred=reduced atm. pos.)
     157                 :             : !!       if choice=3 : dVnl/d(strain(idir)) |vectin>    (symmetric strain =>idir=1...6)
     158                 :             : !!       if choice=5 : dVnl/dk(idir) |vectin>           (k wavevector)
     159                 :             : !!
     160                 :             : !! NOTES
     161                 :             : !! In the case signs=1, the array vectout is not used, nor modified
     162                 :             : !! so that the same array as vectin can be used as a dummy argument;
     163                 :             : !! the same is true for the pairs npwin-npwout, ffnlin-ffnlout,
     164                 :             : !! kgin-kgout, ph3din-ph3dout, phkredin-phkxredout).
     165                 :             : !!
     166                 :             : !! Calculation includes contributions to grads of Etot wrt coord and
     167                 :             : !! wrt strains for l=0,1,2,3.
     168                 :             : !!
     169                 :             : !! WARNINGS
     170                 :             : !!  - Warning 1: This routine is in a transient state, during the
     171                 :             : !!    time of the implementation of the spin-orbit coupling...
     172                 :             : !!    In particular, the OMP parallelisation is still missing,
     173                 :             : !!    but it matters here only when nspinor==2.
     174                 :             : !!  - Warning 2: the order of atoms is governed by atindx
     175                 :             : !!
     176                 :             : !! PARENTS
     177                 :             : !!      nonlop
     178                 :             : !!
     179                 :             : !! CHILDREN
     180                 :             : !!      cont13,cont22,cont22cso,cont22so,cont24,cont3,cont33cso,cont33so,cont35
     181                 :             : !!      contistr01,contistr03,contistr12,contstr21,contstr23,contstr25
     182                 :             : !!      contstr25a,contstr26,ddkten,metcon,metcon_so,metric_so,metstr,opernl2
     183                 :             : !!      opernl3,opernl4a,opernl4b,ph1d3d,scalewf_nonlop,strconv,strsocv,trace2
     184                 :             : !!      xmpi_sum
     185                 :             : !!
     186                 :             : !! SOURCE
     187                 :             : 
     188                 :    88372944 : subroutine nonlop_pl(choice,dimekb1,dimekb2,dimffnlin,dimffnlout,ekb,enlout,&
     189                 :    58915296 : &                     ffnlin,ffnlout,gmet,gprimd,idir,indlmn,ispin_gbt,istwf_k,kgin,kgout,kpgin,kpgout,&
     190                 :             : &                     kptin,kptout,lmnmax,matblk,mgfft,mpi_enreg,mpsang,mpssoang,&
     191         [ -  + ]:    29457648 : &                     natom,nattyp,ngfft,nkpgin,nkpgout,nloalg,npwin,npwout,nspinor,nspinortot,&
     192                 :    29457648 : &                     ntypat,only_SO,phkxredin,phkxredout,ph1d,ph3din,ph3dout,signs,&
     193   [ -  +  -  + ]:    29457648 : &                     spinaxis,ucvol,use_gbt,vectin,vectout)
     194                 :             : 
     195                 :             : !Arguments ------------------------------------
     196                 :             : !This type is defined in defs_mpi
     197                 :             : !The (inout) classification below is misleading; mpi_enreg is temporarily
     198                 :             : ! changed but reset to its initial condition before exiting.
     199                 :             : !scalars
     200                 :             :  integer,intent(in) :: choice,dimekb1,dimekb2,dimffnlin,dimffnlout,idir,istwf_k,ispin_gbt
     201                 :             :  integer,intent(in) :: lmnmax,matblk,mgfft,mpsang,mpssoang,natom,nkpgin,nkpgout
     202                 :             :  integer,intent(in) :: npwin,npwout,nspinor,nspinortot,ntypat,only_SO,signs,use_gbt
     203                 :             :  real(dp),intent(in) :: ucvol
     204                 :             :  type(MPI_type),intent(in) :: mpi_enreg
     205                 :             : !arrays
     206                 :             :  integer,intent(in) :: indlmn(6,lmnmax,ntypat),kgin(3,npwin),kgout(3,npwout)
     207                 :             :  integer,intent(in) :: nattyp(ntypat),ngfft(18),nloalg(3) !,pspso(ntypat) UNUSED
     208                 :             :  real(dp),intent(in) :: ekb(dimekb1,dimekb2,nspinortot**2)
     209                 :             :  real(dp),intent(in) :: ffnlin(npwin,dimffnlin,lmnmax,ntypat)
     210                 :             :  real(dp),intent(in) :: ffnlout(npwout,dimffnlout,lmnmax,ntypat),gmet(3,3)
     211                 :             :  real(dp),intent(in) :: gprimd(3,3),kpgin(npwin,nkpgin),kpgout(npwout,nkpgout)
     212                 :             : !real(dp),intent(in) :: kptin(3),kptout(3),ph1d(2,3*(2*mgfft+1)*natom) !vz_d
     213                 :             :  real(dp),intent(in) :: kptin(3),kptout(3) !vz_d
     214                 :             :  real(dp),intent(in) :: ph1d(2,*),spinaxis(3) !vz_d
     215                 :             :  real(dp),intent(in) :: phkxredin(2,natom),phkxredout(2,natom)
     216                 :             :  real(dp),intent(inout) :: ph3din(2,npwin,matblk),ph3dout(2,npwout,matblk)
     217                 :             :  real(dp),intent(inout) :: vectin(:,:)
     218                 :             :  real(dp),intent(out) :: enlout(:) !vz_i
     219                 :             :  real(dp),intent(inout) :: vectout(:,:) !vz_i
     220                 :             : 
     221                 :             : !Local variables-------------------------------
     222                 :             : !mlang is the maximum number of different angular momenta
     223                 :             : !(mlang=4 means s,p,d,f)
     224                 :             : ! Note : in a future version, one should adjust mlang to mpsang.
     225                 :             : !mlang2 is the maximum number of unique tensor components for a tensor
     226                 :             : !of rank (mlang-1) with index range 1-3
     227                 :             : !mlang3 is the maximum number of unique tensor components summed over
     228                 :             : !all tensors of rank 0 through mlang-1.
     229                 :             : !mlang4 is the total number of additional unique tensor components
     230                 :             : !related to strain gradients, ranks 2 through mlang+1.
     231                 :             : !mlang6 is the total number of additional unique tensor components
     232                 :             : !related to strain 2nd derivaives, ranks 4 through mlang+3.
     233                 :             : !mlang1 is the total number of certain additional unique tensor components
     234                 :             : !related to internal strain, ranks 1 through mlang
     235                 :             : !mlang5 is the total number of other additional unique tensor components
     236                 :             : !related to internal strain, ranks 1 through mlang
     237                 :             : !scalars
     238                 :             :  integer,parameter :: mlang=4
     239                 :             : ! MG: I tried to use parameters instead of saved variables but [tutorespfn][trf2_1] gets stuck on milou_g95_snofbfpe
     240                 :             :  integer,save :: mlang1=((mlang+1)*(mlang+2)*(mlang+3))/6-1
     241                 :             :  !integer,save :: mlang2=(mlang*(mlang+1))/2 ! Unused
     242                 :             :  integer,save :: mlang3=(mlang*(mlang+1)*(mlang+2))/6
     243                 :             :  integer,save :: mlang4=((mlang+2)*(mlang+3)*(mlang+4))/6-4
     244                 :             :  integer,save :: mlang5=((mlang+3)*(mlang+4)*(mlang+5))/6-10
     245                 :             :  integer,save :: mlang6=((mlang+4)*(mlang+5)*(mlang+6))/6-20
     246                 :             :  integer :: compact,ia,ia1,ia2,ia3,ia4,ia5,ierr,iest,ig,ii,ilang,ilang2,ilmn
     247                 :             :  integer :: iln,iln0,indx,iproj,ipsang,ishift,isp,ispin,ispinor,ispinor_index,ispinp,ispinor_ekb
     248                 :             :  integer :: istr,istr1,istr2,iterm,itypat,jj,jjk,jjs,jjs1,jjs2,jjs3,jjs4,jjstr,jspin
     249                 :             :  integer :: mincat,mproj,mu,mumax,n1,n2,n3,ndgxdt,ndgxdtfac,nincat,nlang
     250                 :             :  integer :: nproj,nspinso,rank
     251                 :             :  integer :: sign,spaceComm,  isft
     252                 :             :  real(dp) :: alpha,beta,e2nl,e2nldd,enlk
     253                 :             :  character(len=500) :: msg
     254                 :             : !arrays
     255                 :    29457648 :  integer,allocatable :: indlmn_s(:,:,:),jproj(:)
     256                 :             :  real(dp) :: amet(2,3,3,2,2),amet_lo(3,3),e2nl_tmp(6),eisnl(3),rank2(6)
     257                 :             :  real(dp) :: rank2c(2,6),soc_weight(3),strsnl(6),strsnl_out(6),strsso(6,3),strssoc(6),trace(2)!,tsec(2)
     258                 :    29457648 :  real(dp),allocatable :: d2gxdis(:,:,:,:,:),d2gxdis_s(:,:,:,:)
     259                 :    29457648 :  real(dp),allocatable :: d2gxds2(:,:,:,:,:),d2gxds2_s(:,:,:,:)
     260                 :    29457648 :  real(dp),allocatable :: dgxdis(:,:,:,:,:),dgxdis_s(:,:,:,:),dgxds(:,:,:,:,:)
     261                 :    29457648 :  real(dp),allocatable :: dgxds_s(:,:,:,:),dgxdsfac(:,:,:,:,:)
     262                 :    29457648 :  real(dp),allocatable :: dgxdt(:,:,:,:,:,:),dgxdt_s(:,:,:,:,:)
     263                 :    29457648 :  real(dp),allocatable :: dgxdtfac(:,:,:,:,:),ekb_s(:,:),gxa(:,:,:,:,:)
     264                 :    29457648 :  real(dp),allocatable :: gxa_s(:,:,:,:),gxafac(:,:,:,:),pauli(:,:,:,:)
     265                 :    29457648 :  real(dp),allocatable :: temp(:,:),tmpfac(:,:),vectin_s(:,:),vectout_s(:,:)
     266                 :    29457648 :  real(dp),allocatable :: wt(:,:)
     267                 :             : 
     268                 :             : ! **********************************************************************
     269                 :             : 
     270                 :             :  ABI_UNUSED(mgfft)
     271                 :             : 
     272                 :             : !Test: spin orbit not allowed for choice=5,6
     273   [ +  +  -  + ]:    29457648 :  if (nspinortot==2 .and. choice==6 ) then
     274                 :           0 :    ABI_BUG('For nspinortot=2, choice=6 is not yet allowed.')
     275                 :             :  end if
     276                 :             : 
     277         [ -  + ]:    29457648 :  if ((choice<1 .or. choice>6) .and. choice/=23 ) then
     278                 :           0 :    write(msg,'(a,i0)')'Does not presently support this choice=',choice
     279                 :           0 :    ABI_BUG(msg)
     280                 :             :  end if
     281                 :             : 
     282                 :             : !Test: choice 51 and 52 only allowed with nonlop_ylm
     283                 :             : !JWZ, 01-Sep-08
     284         [ -  + ]:    29457648 :  if (choice==51 .or. choice==52) then
     285                 :           0 :    ABI_BUG('choice 51 or 52 is not yet allowed.')
     286                 :             :  end if
     287                 :             : 
     288                 :             : !Define dimension of work arrays.
     289         [ +  + ]:    71836647 :  mincat=min(NLO_MINCAT,maxval(nattyp))
     290   [ +  +  +  + ]:   270290592 :  mproj=maxval(indlmn(3,:,:))
     291   [ -  +  +  -  :    88372944 :  ABI_MALLOC(temp,(2,mlang4))
          +  -  +  -  -  
                +  -  + ]
     292   [ -  +  +  -  :    58915296 :  ABI_MALLOC(tmpfac,(2,mlang4))
             -  +  -  + ]
     293   [ +  +  +  -  :    88372944 :  ABI_MALLOC(wt,(mlang,mproj))
          +  -  +  +  -  
                +  -  + ]
     294         [ -  + ]:    29457648 :  ABI_MALLOC(jproj,(mlang))
     295                 :    29457648 :  n1=ngfft(1) ; n2=ngfft(2) ; n3=ngfft(3)
     296   [ +  +  +  -  :    58915296 :  ABI_MALLOC(ekb_s,(mlang,mproj))
             -  +  -  + ]
     297   [ -  +  +  -  :   117830592 :  ABI_MALLOC(indlmn_s,(6,lmnmax,ntypat))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     298                 :             : 
     299                 :             : !Eventually compute the spin-orbit metric tensor:
     300         [ +  + ]:    29457648 :  if (mpssoang>mpsang) then
     301         [ +  - ]:     2339994 :    ABI_MALLOC(pauli,(2,2,2,3))
     302         [ +  + ]:     9359976 :    soc_weight = one
     303                 :             : ! GBT: keep only the z-component, optionally flip its sign
     304         [ +  + ]:     2339994 :    if (use_gbt == 2) then
     305         [ +  + ]:       47388 :      soc_weight(1:2) = 0
     306         [ +  + ]:       15796 :      if (ispin_gbt == 2) soc_weight(3) = -1
     307                 :             :    end if
     308                 :     2339994 :    call geteuler(spinaxis,alpha,beta)
     309                 :     2339994 :    call metric_so(amet,soc_weight,gprimd,pauli,alpha,beta)
     310                 :             :  end if
     311                 :             : 
     312                 :             : !Allocate array gxa (contains projected scalars).
     313   [ -  +  +  -  :   176745888 :  ABI_MALLOC(gxa,(2,mlang3,mincat,mproj,nspinortot))
          -  +  +  -  +  
          +  +  -  -  +  
          +  -  +  -  +  
             +  -  +  -  
                      + ]
     314         [ +  + ]:    29457648 :  if(nspinor==2)  then
     315   [ -  +  +  -  :     7760870 :    ABI_MALLOC(gxa_s,(2,mlang3,mincat,mproj))
          -  +  +  -  +  
          +  +  -  +  -  
          +  +  -  +  -  
                      + ]
     316                 :             :  else
     317         [ -  + ]:    27905474 :    ABI_MALLOC(gxa_s,(0,0,0,0))
     318                 :             :  end if
     319                 :             : 
     320   [ -  +  +  -  :   147288240 :  ABI_MALLOC(gxafac,(2,mlang3,mincat,mproj))
          -  +  +  -  +  
          +  +  -  +  -  
          +  +  -  +  +  
                      - ]
     321   [ +  +  +  +  :  5618103892 :  gxa(:,:,:,:,:)=zero
          +  +  +  +  +  
                      + ]
     322                 :             : 
     323                 :             : !If choice==2 : first-order atomic displacements
     324                 :             : !If signs==2, only one direction is considered
     325                 :             : !If signs==1, the three directions are considered
     326                 :             : !If choice==4 and signs==1 : second-order atomic displacements,
     327                 :             : !the nine components are considered
     328                 :             : !If choice==5 and signs==2 : ddk
     329                 :             : !component 1 -> from ffnl(:,2,...)
     330                 :             : !component 2 -> from ffnl(:,1,...) (too much space is booked for this
     331                 :             : !case, since the number of angular momenta is smaller than mlang3, but it is easier)
     332                 :    29457648 :  ndgxdt=0
     333   [ +  +  +  + ]:    29457648 :  if(signs==2 .and. choice==2) ndgxdt=1
     334   [ +  +  +  + ]:    29457648 :  if(signs==1 .and. (choice==2.or.choice==23)) ndgxdt=3
     335         [ +  + ]:    29457648 :  if(choice==4) ndgxdt=9
     336         [ +  + ]:    29457648 :  if(choice==5) ndgxdt=2
     337                 :             : !Allocate dgxdt (contains derivatives of gxa with respect to atomic displacements or ddk).
     338   [ +  +  +  -  :   206203536 :  ABI_MALLOC(dgxdt,(2,ndgxdt,mlang3,mincat,mproj,nspinortot))
          -  +  +  -  -  
          +  +  -  +  +  
          +  -  -  +  +  
          -  +  -  +  +  
             -  +  -  + ]
     339   [ +  +  +  +  :  3068408272 :  dgxdt(:,:,:,:,:,:)=zero
          +  +  +  +  +  
                +  +  + ]
     340         [ +  + ]:    29457648 :  if(nspinor==2)then
     341   [ +  +  +  -  :     9313044 :    ABI_MALLOC(dgxdt_s,(2,ndgxdt,mlang3,mincat,mproj))
          -  +  +  -  -  
          +  +  -  +  +  
          +  -  +  -  +  
             +  -  +  +  
                      - ]
     342   [ +  +  +  +  :   432512190 :    dgxdt_s(:,:,:,:,:)=zero
          +  +  +  +  +  
                      + ]
     343                 :             :  else
     344         [ -  + ]:    27905474 :    ABI_MALLOC(dgxdt_s,(0,0,0,0,0))
     345                 :             :  end if
     346                 :    29457648 :  ndgxdtfac=0
     347   [ +  +  +  + ]:    29457648 :  if(signs==2 .and. choice==2) ndgxdtfac=1
     348         [ +  + ]:    29457648 :  if(choice==4) ndgxdtfac=3
     349         [ +  + ]:    29457648 :  if(choice==5) ndgxdtfac=2
     350   [ +  +  +  -  :   176745888 :  ABI_MALLOC(dgxdtfac,(2,ndgxdtfac,mlang3,mincat,mproj))
          -  +  +  -  -  
          +  +  -  +  +  
          +  -  +  -  +  
             +  -  +  -  
                      + ]
     351                 :             : 
     352                 :             : !Allocate dgxds (contains derivatives of gxa with respect to strains).
     353   [ -  +  +  -  :   176745888 :  ABI_MALLOC(dgxds,(2,mlang4,mincat,mproj,nspinor))
          -  +  +  -  +  
          +  +  -  -  +  
          +  -  +  -  +  
             +  -  +  -  
                      + ]
     354   [ +  +  +  +  : 14275266580 :  dgxds(:,:,:,:,:)=zero
          +  +  +  +  +  
                      + ]
     355   [ -  +  +  -  :   147288240 :  ABI_MALLOC(dgxdsfac,(2,mlang4,mincat,mproj,nspinor))
          -  +  +  -  +  
          +  +  -  -  +  
          +  -  -  +  -  
                      + ]
     356         [ +  + ]:    29457648 :  if(choice==6) then
     357   [ -  +  +  -  :      126192 :    ABI_MALLOC(dgxdis,(2,mlang1,mincat,mproj,nspinor))
          -  +  +  -  -  
          +  +  -  -  +  
          +  -  +  -  +  
             -  -  +  -  
                      + ]
     358   [ -  +  +  -  :      126192 :    ABI_MALLOC(d2gxdis,(2,mlang5,mincat,mproj,nspinor))
          -  +  +  -  -  
          +  +  -  -  +  
          +  -  +  -  +  
             -  -  +  -  
                      + ]
     359   [ -  +  +  -  :      126192 :    ABI_MALLOC(d2gxds2,(2,mlang6,mincat,mproj,nspinor))
          -  +  +  -  -  
          +  +  -  -  +  
          +  -  +  -  +  
             -  -  +  -  
                      + ]
     360                 :             :  else
     361         [ -  + ]:    29436616 :    ABI_MALLOC(dgxdis ,(0,0,0,0,0))
     362         [ -  + ]:    29436616 :    ABI_MALLOC(d2gxdis,(0,0,0,0,0))
     363         [ -  + ]:    29436616 :    ABI_MALLOC(d2gxds2,(0,0,0,0,0))
     364                 :             :  end if
     365         [ -  + ]:    29457648 :  ABI_MALLOC(dgxds_s  ,(0,0,0,0))
     366         [ -  + ]:    29457648 :  ABI_MALLOC(dgxdis_s ,(0,0,0,0))
     367         [ -  + ]:    29457648 :  ABI_MALLOC(d2gxdis_s,(0,0,0,0))
     368         [ -  + ]:    29457648 :  ABI_MALLOC(d2gxds2_s,(0,0,0,0))
     369         [ +  + ]:    29457648 :  if(nspinor==2)then
     370         [ -  + ]:     1552174 :    ABI_FREE(dgxds_s)
     371   [ -  +  +  -  :     7760870 :    ABI_MALLOC(dgxds_s,(2,mlang4,mincat,mproj))
          -  +  +  -  +  
          +  +  -  +  -  
          +  +  -  +  +  
                      - ]
     372   [ +  +  +  +  :  2410320282 :    dgxds_s(:,:,:,:)=zero
             +  +  +  + ]
     373         [ -  + ]:     1552174 :    if(choice==6) then
     374         [ #  # ]:           0 :      ABI_FREE(dgxdis_s)
     375         [ #  # ]:           0 :      ABI_FREE(d2gxdis_s)
     376         [ #  # ]:           0 :      ABI_FREE(d2gxds2_s)
     377   [ #  #  #  #  :           0 :      ABI_MALLOC(dgxdis_s,(2,mlang1,mincat,mproj))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
     378   [ #  #  #  #  :           0 :      ABI_MALLOC(d2gxdis_s,(2,mlang5,mincat,mproj))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
     379   [ #  #  #  #  :           0 :      ABI_MALLOC(d2gxds2_s,(2,mlang6,mincat,mproj))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
     380                 :             :    else
     381                 :             :    end if
     382                 :             :  end if
     383                 :             : 
     384                 :             : !Zero out some arrays
     385   [ +  +  +  + ]:    47247716 :  if(choice==2 .or. choice==4 .or. choice==5 .or. choice==6 .or. choice==23) enlout(:)=0.0d0
     386                 :             : 
     387   [ +  +  +  +  : 28490720499 :  if(signs==2) vectout(:,:)=zero
                   +  + ]
     388                 :             : 
     389                 :             :  !if(choice==3.or.choice==23) then
     390                 :             :  !  strsnl(:)=zero
     391                 :             :  !  if(mpssoang>mpsang) strsso(:,:)=zero
     392                 :             :  !end if
     393                 :    29457648 :  enlk=zero
     394                 :    29457648 :  strsso = zero
     395                 :    29457648 :  strsnl = zero
     396                 :             : 
     397                 :             : !In the case vectin is a spinor, split its second part.
     398                 :             : !Also, eventually take into account the storage format of the wavefunction
     399                 :             : !(the original vector will be restored before leaving the routine,
     400                 :             : !except for the vectin(2,1) component with istwf_k==2,
     401                 :             : !that should vanish)
     402                 :             : !In sequential, treat the second spinor part first
     403         [ +  + ]:    29457648 :  if (nspinor==2)then
     404   [ -  +  +  -  :     4656522 :    ABI_MALLOC(vectin_s,(2,npwin))
          +  -  +  -  -  
                +  -  + ]
     405   [ -  +  +  -  :     4656522 :    ABI_MALLOC(vectout_s,(2,npwout))
          +  -  +  -  -  
                +  -  + ]
     406                 :             : 
     407         [ -  + ]:     1552174 :    isft = npwin;if (mpi_enreg%nproc_spinor>1) isft=0
     408                 :             : 
     409                 :             : !  Initialize it
     410                 :             : !$OMP PARALLEL DO
     411         [ +  + ]:   329881518 :    do ig=1,npwin
     412                 :   328329344 :      vectin_s(1,ig)=vectin(1,ig+isft)
     413                 :   329881518 :      vectin_s(2,ig)=vectin(2,ig+isft)
     414                 :             :    end do
     415                 :             : 
     416                 :             : !  Take into account the storage
     417         [ -  + ]:     1552174 :    if(istwf_k/=1)then
     418                 :           0 :      call scalewf_nonlop(istwf_k,mpi_enreg,npwin,1,vectin_s)
     419                 :             :    end if
     420                 :             :  end if ! nspinortot==2
     421                 :             : 
     422                 :             : !Treat the first spinor part now
     423         [ +  + ]:    29457648 :  if(istwf_k/=1) then
     424   [ -  +  -  -  :      904765 :    call scalewf_nonlop(istwf_k,mpi_enreg,npwin,1,vectin)
          -  -  -  -  -  
             +  -  -  -  
                      - ]
     425                 :             :  end if
     426                 :             : 
     427                 :             : 
     428                 :             : !Big loop on atom types.
     429                 :    29457648 :  ia1=1
     430         [ +  + ]:    71836647 :  do itypat=1,ntypat
     431                 :             : 
     432                 :             : !  Get atom loop indices for different types:
     433                 :    42378999 :    ia2=ia1+nattyp(itypat)-1
     434                 :             : 
     435                 :             : !  Cut the sum on different atoms in blocks, to allow memory saving.
     436                 :             : !  Inner summations on atoms will be done from ia3 to ia4.
     437                 :             : !  Note that the maximum range from ia3 to ia4 is mincat (maximum
     438                 :             : !  increment of atoms).
     439   [ -  +  -  -  :    85163057 :    do ia3=ia1,ia2,mincat
             +  +  +  + ]
     440                 :    42784058 :      ia4=min(ia2,ia3+mincat-1)
     441                 :             : !    Give the increment of number of atoms in this subset.
     442                 :    42784058 :      nincat=ia4-ia3+1
     443                 :             : 
     444                 :             : !    Prepare the phase factors for the atoms between ia3 and ia4 :
     445                 :             : !    For nloalg(2)<=0, they were not prepared previously,it is needed to
     446                 :             : !    compute them again.
     447         [ +  + ]:    42784058 :      if(nloalg(2)<=0)then
     448                 :             : !      For nloalg(2)==0, it is needed to compute the phase factors.
     449         [ -  + ]:     2243368 :        if(mincat>matblk)then
     450                 :             :          write(msg,'(a,a,a,i4,a,i4,a)')&
     451                 :           0 :           'With nloc_mem<=0, mincat must be less than matblk.',ch10,&
     452                 :           0 :           'Their value is ',mincat,' and ',matblk,'.'
     453                 :           0 :          ABI_BUG(msg)
     454                 :             :        end if
     455                 :     2243368 :        call ph1d3d(ia3,ia4,kgin,matblk,natom,npwin,n1,n2,n3,phkxredin,ph1d,ph3din)
     456                 :             :      end if
     457                 :             : 
     458                 :             : !    Here begins the different treatment for the scalar-relativistic
     459                 :             : !    part(s) and the spin-orbit part.
     460                 :             : !    Loop on ispinor : 1 for scalar-Relativistic, 2 for spin-orbit
     461         [ +  + ]:    42784058 :      nspinso=1;if (mpssoang>mpsang) nspinso=2
     462                 :             : 
     463                 :             :      ! Change nspinso if collinear run or if nspinor == 2 and SOC is not wanted.
     464                 :             :      ! TODO: The last check requires pspso
     465   [ +  +  +  + ]:    42784058 :      if (nspinortot == 1 .and. use_gbt /= 2) nspinso = 1
     466                 :             : 
     467         [ +  + ]:   130403329 :      do ispinor=1,nspinso
     468                 :    45240272 :        ispinor_index=ispinor
     469         [ +  + ]:    45240272 :        if (mpi_enreg%paral_spinor==1) ispinor_index=mpi_enreg%me_spinor+1
     470                 :             : 
     471                 :             : !
     472                 :             : !      mjv 25 6 2008: if only_SO == 1 or 2 skip the scalar relativistic terms
     473                 :             : !      only output the spin orbit ones
     474                 :             : !
     475   [ +  +  +  - ]:    45240272 :        if (ispinor==1 .and. only_SO>0) cycle
     476                 :             : 
     477                 :             : !      Select scalar-relativistic or spin-orbit KB-energies:
     478   [ +  +  +  +  :   901451054 :        ekb_s(:,:)=zero ; wt(:,:)=zero
             +  +  +  + ]
     479                 :             : !      Loop over (l,n) values (loop over l,m,n and test on l,n)
     480         [ +  + ]:   226201360 :        iln0=0 ; jproj(:)=0 ; nlang=0
     481   [ +  +  +  + ]:  1675401805 :        indlmn_s(:,:,itypat)=0
     482         [ +  + ]:   278120491 :        do ilmn=1,lmnmax
     483         [ +  + ]:   232880219 :          if(ispinor/=indlmn(6,ilmn,itypat))cycle
     484         [ +  + ]:  1218826266 :          indlmn_s(:,ilmn,itypat)=indlmn(:,ilmn,itypat)
     485                 :   174118038 :          iln =indlmn(5,ilmn,itypat)
     486         [ -  + ]:   219358310 :          if (iln>iln0) then
     487                 :   174118038 :            iln0=iln
     488                 :   174118038 :            ipsang=indlmn(1,ilmn,itypat)+1
     489                 :             : !          DEBUG
     490                 :             : !          write(std_out,*)' nonlop : ipsang,ilmn,itypat,ispinor=',ipsang,ilmn,itypat,ispinor
     491                 :             : !          ENDDEBUG
     492                 :   174118038 :            iproj=indlmn(3,ilmn,itypat)
     493                 :             : !          This shift is not needed anymore
     494                 :             : !          if (ispinor==2) ipsang=indlmn(1,ilmn,itypat)-mpsang+2
     495                 :             : !           ekb_s(ipsang,iproj)=ekb(iln,itypat,ispinor)
     496         [ +  - ]:   174118038 :            ispinor_ekb=min(ispinor,ubound(ekb,3))
     497                 :   174118038 :            ekb_s(ipsang,iproj)=ekb(iln,itypat,ispinor_ekb)
     498                 :   174118038 :            wt(ipsang,iproj)=4.d0*pi/ucvol*dble(2*ipsang-1)*ekb_s(ipsang,iproj)
     499                 :             : !
     500                 :             : !          mjv 27 6 2008: if only_SO == 2 remove the factor of l in the operator
     501                 :             : !
     502         [ -  + ]:   174118038 :            if (only_SO == 2) then
     503                 :           0 :              wt(ipsang,iproj)=4.d0*pi/ucvol*ekb_s(ipsang,iproj)
     504                 :             :            end if
     505                 :   174118038 :            jproj(ipsang)=max(jproj(ipsang),iproj)
     506         [ +  - ]:   174118038 :            if(iproj>0)nlang=max(nlang,ipsang)
     507                 :             :          end if
     508                 :             :        end do ! ilmn
     509                 :             : 
     510                 :             : 
     511                 :             : !      If nlang is not 0, then some non-local part is to be applied for that type of atom.
     512         [ +  + ]:    88024330 :        if (nlang/=0) then
     513                 :             : !        Operate with the non-local potential on the wavefunction, in order
     514                 :             : !        to get projected quantities. Call different routines opernl2,
     515                 :             : !        opernl3, opernl4x which corresponds to different writings of the
     516                 :             : !        same numerical operations. There is still optimisation left for
     517                 :             : !        the case istwf_k/=1 (up to a factor 2 in speed).
     518                 :             : !        call timab(74+choice,1,tsec)
     519                 :    43565098 :          sign=1
     520   [ +  +  +  +  : 12632044519 :          gxa(:,:,:,:,:)=zero
          +  +  +  +  +  
                      + ]
     521   [ +  +  +  +  :  6143043699 :          dgxdt(:,:,:,:,:,:)=zero
          +  +  +  +  +  
                +  +  + ]
     522   [ +  +  +  +  : 32197922983 :          dgxds(:,:,:,:,:)=zero
          +  +  +  +  +  
                      + ]
     523                 :             : 
     524                 :             : !        Only the first spinorial component of vectin is taken into account first
     525         [ +  + ]:    43565098 :          ispin=1;if (mpi_enreg%paral_spinor==1) ispin=ispinor_index
     526         [ +  + ]:    43565098 :          if(nloalg(1)==2) then
     527                 :             :            call opernl2(choice,dgxdis,dgxds,d2gxdis,d2gxds2,dgxdt,&
     528                 :             : &           ffnlin,gmet,gxa,ia3,idir,indlmn_s,ispinor,istwf_k,itypat,&
     529                 :             : &           jproj,kgin,kpgin,kptin,lmnmax,matblk,mincat,mlang1,mlang3,mlang4,&
     530                 :             : &           mlang5,mlang6,mproj,ndgxdt,dimffnlin,nincat,nkpgin,nlang,nloalg,npwin,&
     531                 :       10474 : &           ntypat,ph3din,sign,vectin)
     532         [ +  + ]:    43554624 :          else if(nloalg(1)==3) then
     533                 :             :            call opernl3(choice,dgxdis,dgxds,d2gxdis,d2gxds2,dgxdt,&
     534                 :             : &           ffnlin,gmet,gxa,ia3,idir,indlmn_s,ispinor,istwf_k,itypat,&
     535                 :             : &           jproj,kgin,kpgin,kptin,lmnmax,matblk,mincat,mlang1,mlang3,mlang4,&
     536                 :             : &           mlang5,mlang6,mproj,ndgxdt,dimffnlin,nincat,nkpgin,nlang,nloalg,npwin,&
     537                 :      126990 : &           ntypat,ph3din,sign,vectin)
     538         [ +  - ]:    43427634 :          else if(nloalg(1)==4) then
     539                 :             :            call opernl4a(choice,dgxdis,dgxds,d2gxdis,d2gxds2,dgxdt,&
     540                 :             : &           ffnlin,gmet,gxa,ia3,idir,indlmn_s,ispinor,istwf_k,itypat,&
     541                 :             : &           jproj,kgin,kpgin,kptin,lmnmax,matblk,mincat,mlang1,mlang3,mlang4,&
     542                 :             : &           mlang5,mlang6,mproj,ndgxdt,dimffnlin,nincat,nkpgin,nlang,nloalg,npwin,&
     543                 :    43427634 : &           ntypat,ph3din,vectin)
     544                 :             :          end if
     545                 :             : !        This duplication of the opernl calls is needed to avoid copying
     546                 :             : !        vectin, with a detrimental effect on speed.
     547         [ +  + ]:    43565098 :          if (nspinor==2)then
     548                 :     4901725 :            ispin=2
     549         [ -  + ]:     4901725 :            if(nloalg(1)==2) then
     550                 :             :              call opernl2(choice,dgxdis_s,dgxds_s,d2gxdis_s,d2gxds2_s,dgxdt_s,&
     551                 :             : &             ffnlin,gmet,gxa_s,ia3,idir,indlmn_s,ispinor,istwf_k,itypat,&
     552                 :             : &             jproj,kgin,kpgin,kptin,lmnmax,matblk,mincat,mlang1,mlang3,mlang4,&
     553                 :             : &             mlang5,mlang6,mproj,ndgxdt,dimffnlin,nincat,nkpgin,nlang,nloalg,npwin,&
     554                 :           0 : &             ntypat,ph3din,sign,vectin_s)
     555         [ -  + ]:     4901725 :            else if(nloalg(1)==3) then
     556                 :             :              call opernl3(choice,dgxdis_s,dgxds_s,d2gxdis_s,d2gxds2_s,dgxdt_s,&
     557                 :             : &             ffnlin,gmet,gxa_s,ia3,idir,indlmn_s,ispinor,istwf_k,itypat,&
     558                 :             : &             jproj,kgin,kpgin,kptin,lmnmax,matblk,mincat,mlang1,mlang3,mlang4,&
     559                 :             : &             mlang5,mlang6,mproj,ndgxdt,dimffnlin,nincat,nkpgin,nlang,nloalg,npwin,&
     560                 :           0 : &             ntypat,ph3din,sign,vectin_s)
     561         [ +  - ]:     4901725 :            else if(nloalg(1)==4) then
     562                 :             :              call opernl4a(choice,dgxdis_s,dgxds_s,d2gxdis_s,d2gxds2_s,dgxdt_s,&
     563                 :             : &             ffnlin,gmet,gxa_s,ia3,idir,indlmn_s,ispinor,istwf_k,itypat,&
     564                 :             : &             jproj,kgin,kpgin,kptin,lmnmax,matblk,mincat,mlang1,mlang3,mlang4,&
     565                 :             : &             mlang5,mlang6,mproj,ndgxdt,dimffnlin,nincat,nkpgin,nlang,nloalg,npwin,&
     566                 :     4901725 : &             ntypat,ph3din,vectin_s)
     567                 :             :            end if
     568   [ +  +  +  +  :  9104999873 :            dgxds(:,:,:,:,ispin)=dgxds_s(:,:,:,:)
             +  +  +  + ]
     569   [ +  +  +  +  :  1541116165 :            dgxdt(:,:,:,:,:,ispin)=dgxdt_s(:,:,:,:,:)
          +  +  +  +  +  
                      + ]
     570   [ +  +  +  +  :  3552064865 :            gxa(:,:,:,:,ispin)=gxa_s(:,:,:,:)
             +  +  +  + ]
     571                 :             :          end if
     572                 :             : 
     573                 :             : !        Parallelism stuff
     574                 :    43565098 :          spaceComm=mpi_enreg%comm_fft
     575                 :    43565098 :          call xmpi_sum(dgxds,spaceComm,ierr)
     576         [ +  + ]:    43565098 :          if (mpi_enreg%paral_spinor==1) then
     577                 :       19712 :            spaceComm=mpi_enreg%comm_spinorfft
     578                 :       19712 :            jspin=3-ispin
     579   [ +  +  +  +  :     4908288 :            gxa(:,:,:,:,ispin)=gxa(:,:,:,:,1)
             +  +  +  + ]
     580   [ +  +  +  +  :     4908288 :            gxa(:,:,:,:,jspin)=zero
             +  +  +  + ]
     581         [ +  + ]:       19712 :            if ( ndgxdt>0)then
     582   [ +  +  +  +  :      155328 :              dgxdt(:,:,:,:,:,ispin)=dgxdt(:,:,:,:,:,1)
          +  +  +  +  +  
                      + ]
     583   [ +  +  +  +  :      155328 :              dgxdt(:,:,:,:,:,jspin)=zero
          +  +  +  +  +  
                      + ]
     584                 :             :            end if
     585                 :             :          end if
     586                 :             : 
     587                 :    43565098 :          call xmpi_sum(gxa,spaceComm,ierr)
     588         [ +  + ]:    43565098 :          if(ndgxdt>0) then
     589                 :     6998360 :            call xmpi_sum(dgxdt,spaceComm,ierr)
     590                 :             :          end if
     591                 :             : 
     592                 :             : !        XG030513 : MPIWF, at this place, one should perform the reduction
     593                 :             : !        and spread of data of gxa, dgxdt and dgxds
     594                 :             : 
     595                 :             : 
     596                 :             : 
     597                 :             : ! BUG FIX START
     598                 :             : !        MS100725: First loop over spins, ilang, proj to take care of the ddk
     599                 :             : !        decompaction PRIOR to entering the main loop. This fixes a subtle bug
     600                 :             : !        in the calculation of the velocity operator with SOC
     601         [ +  + ]:    92031921 :          do isp=1,nspinor
     602         [ +  + ]:    48466823 :            ispin=isp;if (mpi_enreg%paral_spinor==1) ispin=ispinor_index
     603                 :             : 
     604         [ +  + ]:   167556628 :            do ia=1,nincat
     605         [ +  + ]:   315037219 :              do ilang=1,nlang
     606                 :   191045689 :                nproj=jproj(ilang)
     607         [ +  + ]:   266570396 :                if(nproj/=0) then
     608                 :   176785943 :                  ilang2=(ilang*(ilang+1))/2
     609         [ +  + ]:   506152007 :                  do iproj=1,nproj
     610                 :             : 
     611                 :             : !                  The rank of the tensor gxa equals l:
     612                 :   329366064 :                    rank=ilang-1
     613                 :             : !                  jjs gives the starting address of the relevant components
     614                 :   329366064 :                    jjs=1+((ilang-1)*ilang*(ilang+1))/6
     615         [ -  + ]:   329366064 :                    if (ilang>4) then
     616                 :           0 :                      write(msg,'(a,i0)')' ilang must fall in range [1..4] but value is ',ilang
     617                 :           0 :                      ABI_BUG(msg)
     618                 :             :                    end if
     619                 :             : 
     620                 :             : !                  Eventual tensorial decompaction for ddk perturbation:
     621   [ +  +  +  + ]:   506152007 :                    if(choice==5 .and. ilang>=2) then
     622                 :     4330797 :                      jjk=1+((ilang-2)*(ilang-1)*ilang)/6
     623                 :     4330797 :                      compact=-1
     624                 :             :                      temp(:,1:(rank*(rank+1))/2)= &
     625   [ +  +  +  + ]:    28351860 : &                     dgxdt(:,2,jjk:jjk-1+(rank*(rank+1))/2,ia,iproj,ispin)
     626                 :     4330797 :                      call ddkten(compact,idir,rank,temp,tmpfac)
     627                 :             :                      dgxdt(:,1,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin)=&
     628                 :             : &                     dgxdt(:,1,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin)&
     629   [ +  +  +  + ]:    59845908 : &                     +tmpfac(:,1:((rank+1)*(rank+2))/2)
     630                 :             :                     end if
     631                 :             : 
     632                 :             : !                  End loop over iproj:
     633                 :             :                  end do
     634                 :             : !                End condition of existence of a reference state:
     635                 :             :                end if
     636                 :             : 
     637                 :             : !              End loop over ilang:
     638                 :             :              end do
     639                 :             : 
     640                 :             : !            End loop over ia:
     641                 :             :            end do
     642                 :             : 
     643                 :             : !            End loop over isp
     644                 :             :          end do
     645                 :             : ! BUG FIX END
     646                 :             : 
     647                 :             : 
     648                 :             : !        Main loop over spins:
     649         [ +  + ]:    92031921 :          do isp=1,nspinor
     650         [ +  + ]:    48466823 :            ispin=isp;if (mpi_enreg%paral_spinor==1) ispin=ispinor_index
     651                 :             : 
     652                 :             : !          Perform contractions for the various tensors (d)gx?, producing the
     653                 :             : !          contracted tensors (d)gx?fac to be passed back to opernl:
     654         [ +  + ]:   123991530 :            do ia=1,nincat
     655         [ +  + ]:   315037219 :              do ilang=1,nlang
     656                 :   191045689 :                nproj=jproj(ilang)
     657         [ +  + ]:   266570396 :                if(nproj/=0) then
     658                 :   176785943 :                  ilang2=(ilang*(ilang+1))/2
     659         [ +  + ]:   506152007 :                  do iproj=1,nproj
     660                 :             : 
     661                 :             : !                  The rank of the tensor gxa equals l:
     662                 :   329366064 :                    rank=ilang-1
     663                 :             : !                  jjs gives the starting address of the relevant components
     664                 :   329366064 :                    jjs=1+((ilang-1)*ilang*(ilang+1))/6
     665         [ -  + ]:   329366064 :                    if (ilang>4) then
     666                 :           0 :                      write(msg,'(a,i0)')' ilang must fall in range [1..4] but value is ',ilang
     667                 :           0 :                      ABI_BUG(msg)
     668                 :             :                    end if
     669                 :             : 
     670                 :             : !                  Metric & spinorial contraction from gxa to gxafac. The treatment
     671                 :             : !                  is different for the scalar-relativistic and spin-orbit parts.
     672         [ +  + ]:   329366064 :                    if(ispinor==1) then
     673                 :             : !                    ------ Scalar-Relativistic ------
     674                 :             :                      temp(:,1:((rank+1)*(rank+2))/2)= &
     675   [ +  +  +  + ]:  2592208547 : &                     gxa(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin)
     676                 :   264173618 :                      call metcon(rank,gmet,temp,tmpfac)
     677                 :             :                      gxafac(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)= &
     678   [ +  +  +  + ]:  2592208547 : &                     wt(ilang,iproj)*tmpfac(:,1:((rank+1)*(rank+2))/2)
     679                 :             :                    else
     680                 :             : !                    ------ Spin-orbit ------
     681   [ +  +  +  + ]:   924560782 :                      gxafac(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)=zero
     682                 :             : !                    Contraction over spins:
     683         [ +  + ]:   195529950 :                      do ispinp=1,nspinortot
     684                 :             : !                        => Imaginary part (multiplying by i, then by the Im of amet):
     685                 :             :                          temp(1,1:((rank+1)*(rank+2))/2)= &
     686         [ +  + ]:   703060176 : &                         -gxa(2,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispinp)
     687                 :             :                          temp(2,1:((rank+1)*(rank+2))/2)= &
     688         [ +  + ]:   703060176 : &                          gxa(1,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispinp)
     689   [ +  +  +  + ]:  1694387552 :                          amet_lo(:,:)=amet(2,:,:,ispin,ispinp)
     690                 :   130337504 :                          call metcon_so(rank,gmet,amet_lo,temp,tmpfac)
     691                 :             :                          gxafac(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)= &
     692                 :             : &                         gxafac(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)+ &
     693   [ +  +  +  + ]:  1848505520 : &                         wt(ilang,iproj)*tmpfac(:,1:((rank+1)*(rank+2))/2)
     694                 :             : !                        => Real part:
     695                 :             :                          temp(:,1:((rank+1)*(rank+2))/2)= &
     696   [ +  +  +  + ]:  1848505520 : &                         gxa(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispinp)
     697   [ +  +  +  + ]:  1694387552 :                          amet_lo(:,:)=amet(1,:,:,ispin,ispinp)
     698                 :   130337504 :                          call metcon_so(rank,gmet,amet_lo,temp,tmpfac)
     699                 :             :                          gxafac(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)= &
     700                 :             : &                         gxafac(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)+ &
     701   [ +  +  +  + ]:  1913697966 : &                         wt(ilang,iproj)*tmpfac(:,1:((rank+1)*(rank+2))/2)
     702                 :             :                      end do
     703                 :             :                    end if
     704                 :             : 
     705                 :             : !                  Eventual tensorial compaction of gxafac for ddk
     706                 :             : !                  perturbation:
     707   [ +  +  +  + ]:   329366064 :                    if(choice==5 .and. ilang>=2) then
     708                 :     4330797 :                      jjk=1+((ilang-2)*(ilang-1)*ilang)/6
     709                 :             : ! BUG FIX START
     710                 :             : ! MS100725: Moved this chunk of code to a separate preliminary loop (see above),
     711                 :             : !           to fix the k-derivative of the SOC Hamiltonian
     712                 :             : !                     compact=-1
     713                 :             : !                     temp(:,1:(rank*(rank+1))/2)= &
     714                 :             : !&                     dgxdt(:,2,jjk:jjk-1+(rank*(rank+1))/2,ia,iproj,ispin)
     715                 :             : !                     call ddkten(compact,idir,rank,temp,tmpfac)
     716                 :             : !                     dgxdt(:,1,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin)= &
     717                 :             : !&                     dgxdt(:,1,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin)&
     718                 :             : !&                     +tmpfac(:,1:((rank+1)*(rank+2))/2)
     719                 :             : ! BUG FIX END
     720                 :     4330797 :                      compact=1
     721                 :             :                      tmpfac(:,1:((rank+1)*(rank+2))/2)= &
     722   [ +  +  +  + ]:    59845908 : &                     gxafac(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)
     723                 :     4330797 :                      call ddkten(compact,idir,rank,temp,tmpfac)
     724                 :             :                      dgxdtfac(:,2,jjk:jjk-1+(rank*(rank+1))/2,ia,iproj)= &
     725   [ +  +  +  + ]:    28351860 : &                     temp(:,1:(rank*(rank+1))/2)
     726                 :             :                    end if
     727                 :             : 
     728                 :             : !                  Section for strain perturbation
     729                 :             : !                  no spin-orbit yet
     730                 :             : 
     731   [ +  +  +  + ]:   329366064 :                    if(choice==3 .and. signs==2) then
     732                 :     4843316 :                      istr=idir
     733         [ +  - ]:     4843316 :                      if(ispinor==1) then
     734                 :             : !                      ------ Scalar-Relativistic ------
     735                 :             : !                      jjstr is the starting address for dgxds and dgxdsfac
     736                 :     4843316 :                        jjstr=-3+((ilang+1)*(ilang+2)*(ilang+3))/6
     737                 :             : !                      diagonal enlk contribution
     738                 :             : !                      note sign change (12/05/02)
     739         [ +  + ]:     4843316 :                        if(istr>3) then
     740   [ +  +  +  + ]:    27251968 :                          gxafac(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)=zero
     741                 :             :                        else
     742                 :             :                          gxafac(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)=&
     743   [ +  +  +  + ]:    25344412 : &                         -gxafac(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)
     744                 :             :                        end if
     745   [ +  +  +  + ]:   153764492 :                        dgxdsfac(:,jjstr:jjstr-1+((rank+3)*(rank+4))/2,ia,iproj,isp)=zero
     746                 :     4843316 :                        iterm=1
     747                 :             :                        temp(:,1:((rank+1)*(rank+2))/2)= &
     748   [ +  +  +  + ]:    52596380 : &                       gxa(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin)
     749                 :     4843316 :                        call metstr(istr,rank,iterm,gmet,gprimd,temp,tmpfac)
     750                 :             :                        dgxdsfac(:,jjstr:jjstr-1+((rank+3)*(rank+4))/2,ia,iproj,isp)= &
     751   [ +  +  +  + ]:   153764492 : &                       wt(ilang,iproj)*tmpfac(:,1:((rank+3)*(rank+4))/2)
     752                 :     4843316 :                        iterm=2
     753                 :             :                        temp(:,1:((rank+1)*(rank+2))/2)= &
     754   [ +  +  +  + ]:    52596380 : &                       gxa(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin)
     755                 :     4843316 :                        call metstr(istr,rank,iterm,gmet,gprimd,temp,tmpfac)
     756                 :             :                        gxafac(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)= &
     757                 :             : &                       +gxafac(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)+ &
     758   [ +  +  +  + ]:    52596380 : &                       wt(ilang,iproj)*tmpfac(:,1:((rank+1)*(rank+2))/2)
     759                 :     4843316 :                        iterm=3
     760                 :             :                        temp(:,1:((rank+3)*(rank+4))/2)= &
     761   [ +  +  +  + ]:   153764492 :                        dgxds(:,jjstr:jjstr-1+((rank+3)*(rank+4))/2,ia,iproj,isp)
     762                 :     4843316 :                        call metstr(istr,rank,iterm,gmet,gprimd,temp,tmpfac)
     763                 :             :                        gxafac(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)= &
     764                 :             : &                       gxafac(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)+ &
     765   [ +  +  +  + ]:    52596380 : &                       wt(ilang,iproj)*tmpfac(:,1:((rank+1)*(rank+2))/2)
     766                 :             :                      end if
     767                 :             : !                    end section for strain perturbation
     768                 :             :                    end if
     769                 :             : 
     770                 :             : !                  Eventual metric & spinorial contraction from dgxdt to dgxdtfac.
     771                 :             : !                  either for the dynamical matrix, or for the application of the
     772                 :             : !                  gradient of the operator. The treatment is different for the
     773                 :             : !                  scalar-relativistic and spin-orbit parts.
     774                 :             :                    if ((choice==2.and.signs==2).or. &
     775   [ +  +  +  +  :   329366064 : &                   (choice==5.and.signs==2).or. &
                   +  + ]
     776                 :             : &                   (choice==4)) then
     777         [ +  + ]:    30000616 :                      mumax=ndgxdtfac;if (choice==5) mumax=1
     778         [ +  + ]:    61955096 :                      do mu=1,mumax
     779         [ +  + ]:   361320544 :                        if(ispinor==1) then
     780                 :             : !                        ------ Scalar-Relativistic ------
     781                 :             :                          temp(:,1:((rank+1)*(rank+2))/2)= &
     782   [ +  +  +  + ]:   264791350 : &                         dgxdt(:,mu,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin)
     783                 :    27972016 :                          call metcon(rank,gmet,temp,tmpfac)
     784                 :             :                          dgxdtfac(:,mu,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)=&
     785   [ +  +  +  + ]:   264791350 : &                         wt(ilang,iproj)*tmpfac(:,1:((rank+1)*(rank+2))/2)
     786                 :             :                        else
     787                 :             : !                        ------ Spin-orbit ------
     788   [ +  +  +  + ]:    56174976 :                          dgxdtfac(:,mu,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)=zero
     789                 :             : !                        Contraction over spins:
     790         [ +  + ]:    11947392 :                          do ispinp=1,nspinortot
     791                 :             : !                          => Imaginary part (multiplying by i, then by the Im of amet):
     792                 :             :                            temp(1,1:((rank+1)*(rank+2))/2)= &
     793         [ +  + ]:    42759936 : &                           -dgxdt(2,mu,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispinp)
     794                 :             :                            temp(2,1:((rank+1)*(rank+2))/2)= &
     795         [ +  + ]:    42759936 : &                           dgxdt(1,mu,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispinp)
     796   [ +  +  +  + ]:   103544064 :                            amet_lo(:,:)=amet(2,:,:,ispin,ispinp)
     797                 :     7964928 :                            call metcon_so(rank,gmet,amet_lo,temp,tmpfac)
     798                 :             :                            dgxdtfac(:,mu,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)=&
     799                 :             : &                           dgxdtfac(:,mu,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)+&
     800   [ +  +  +  + ]:   112349952 : &                           wt(ilang,iproj)*tmpfac(:,1:((rank+1)*(rank+2))/2)
     801                 :             : !                          => Real part:
     802                 :             :                            temp(:,1:((rank+1)*(rank+2))/2)= &
     803   [ +  +  +  + ]:   112349952 : &                           dgxdt(:,mu,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispinp)
     804   [ +  +  +  + ]:   103544064 :                            amet_lo(:,:)=amet(1,:,:,ispin,ispinp)
     805                 :     7964928 :                            call metcon_so(rank,gmet,amet_lo,temp,tmpfac)
     806                 :             :                            dgxdtfac(:,mu,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)=&
     807                 :             : &                           dgxdtfac(:,mu,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj)+&
     808   [ +  +  +  + ]:   116332416 : &                           wt(ilang,iproj)*tmpfac(:,1:((rank+1)*(rank+2))/2)
     809                 :             :                          end do
     810                 :             :                        end if
     811                 :             :                      end do
     812                 :             :                    end if
     813                 :             : 
     814                 :             : 
     815                 :             : !                  ----  Accumulate the nonlocal energy.
     816         [ +  + ]:  1391833819 :                    do ii=1,ilang2
     817                 :  1062467755 :                      jj=ii-1+jjs
     818                 :             :                      enlk=enlk+(gxafac(1,jj,ia,iproj)*gxa(1,jj,ia,iproj,ispin)&
     819                 :  1391833819 : &                     +gxafac(2,jj,ia,iproj)*gxa(2,jj,ia,iproj,ispin) )
     820                 :             :                    end do
     821                 :             : 
     822                 :             : !                  ----  Accumulate force contributions if requested.
     823                 :             : !                  Note that the contraction of gxa with dgxdt can be done like
     824                 :             : !                  a cartesian dot product now because the symmetrically-related
     825                 :             : !                  terms are accounted for with weights in gxa.
     826   [ +  +  +  + ]:   329366064 :                    if ((choice==2.or.choice==23) .and. signs==1) then
     827         [ +  + ]:     3319319 :                      ishift=0;if (choice==23) ishift=6
     828                 :     3319319 :                      ia5=ia+ia3-1
     829         [ +  + ]:    14224555 :                      do ii=1,ilang2
     830                 :    10905236 :                        jj=ii-1+jjs
     831         [ +  + ]:    46940263 :                        do mu=1,3
     832                 :             : !                        (includes also factor of 2 from "2*Re[stuff]")
     833                 :    32715708 :                          indx=mu+3*(ia5-1)+ishift
     834                 :             :                          enlout(indx)=enlout(indx)+two*&
     835                 :             : &                         ( gxafac(1,jj,ia,iproj)*dgxdt(1,mu,jj,ia,iproj,ispin)&
     836                 :    43620944 : &                         +gxafac(2,jj,ia,iproj)*dgxdt(2,mu,jj,ia,iproj,ispin))
     837                 :             :                        end do
     838                 :             :                      end do
     839                 :             :                    end if
     840                 :             : 
     841                 :             : !                  ----  Accumulate stress tensor contributions if requested.
     842   [ +  +  +  + ]:   329366064 :                    if ((choice==3.or.choice==23).and.signs==1) then
     843                 :             : !                    1- Compute contractions involving gxa and dgxds:
     844                 :             : !                    --- Same formula for Scalar-relativistic and Spin-orbit ---
     845         [ +  + ]:     2269630 :                      if (ilang==1) then
     846         [ +  + ]:     4888702 :                        do ii=1,6
     847                 :             :                          rank2(ii)=2.d0*&
     848                 :             : &                         (gxafac(1,1,ia,iproj)*dgxds(1,ii,ia,iproj,isp)+ &
     849                 :     4888702 : &                         gxafac(2,1,ia,iproj)*dgxds(2,ii,ia,iproj,isp) )
     850                 :             :                        end do
     851         [ +  + ]:     1571244 :                      else if (ilang==2) then
     852                 :             :                        call cont13(gxafac(:,jjs:jjs+2,ia,iproj),&
     853                 :      867129 : &                       dgxds(:, 7:16,ia,iproj,isp),rank2)
     854         [ +  + ]:      704115 :                      else if (ilang==3) then
     855                 :             :                        call cont24(gxafac(:,jjs:jjs+5,ia,iproj),&
     856                 :      634069 : &                       dgxds(:,17:31,ia,iproj,isp),rank2)
     857         [ -  + ]:       70046 :                      else if (ilang==4) then
     858                 :             :                        call cont35(gxafac(:,jjs:jjs+9,ia,iproj),&
     859                 :       70046 : &                       dgxds(:,32:52,ia,iproj,isp),rank2)
     860                 :             :                      end if
     861                 :             : !                    In all cases add rank2 term into stress tensor
     862         [ +  + ]:    15887410 :                      strsnl(:)=strsnl(:)-rank2(:)
     863                 :             : !                    2- Compute contractions involving gxa and gxa:
     864         [ +  + ]:     2269630 :                      if(ispinor==1) then
     865                 :             : !                      2a ------ Scalar-Relativistic ------
     866         [ +  + ]:     1923722 :                        if (ilang==2) then
     867                 :             :                          strsnl(1)=strsnl(1)-wt(ilang,iproj)*2.d0*&
     868                 :             : &                         (gxa(1,jjs  ,ia,iproj,ispin)*gxa(1,jjs  ,ia,iproj,ispin)+&
     869                 :      696849 : &                         gxa(2,jjs  ,ia,iproj,ispin)*gxa(2,jjs  ,ia,iproj,ispin))
     870                 :             :                          strsnl(2)=strsnl(2)-wt(ilang,iproj)*2.d0*&
     871                 :             : &                         (gxa(1,jjs+1,ia,iproj,ispin)*gxa(1,jjs+1,ia,iproj,ispin)+&
     872                 :      696849 : &                         gxa(2,jjs+1,ia,iproj,ispin)*gxa(2,jjs+1,ia,iproj,ispin))
     873                 :             :                          strsnl(3)=strsnl(3)-wt(ilang,iproj)*2.d0*&
     874                 :             : &                         (gxa(1,jjs+2,ia,iproj,ispin)*gxa(1,jjs+2,ia,iproj,ispin)+&
     875                 :      696849 : &                         gxa(2,jjs+2,ia,iproj,ispin)*gxa(2,jjs+2,ia,iproj,ispin))
     876                 :             :                          strsnl(4)=strsnl(4)-wt(ilang,iproj)*2.d0*&
     877                 :             : &                         (gxa(1,jjs+2,ia,iproj,ispin)*gxa(1,jjs+1,ia,iproj,ispin)+&
     878                 :      696849 : &                         gxa(2,jjs+2,ia,iproj,ispin)*gxa(2,jjs+1,ia,iproj,ispin))
     879                 :             :                          strsnl(5)=strsnl(5)-wt(ilang,iproj)*2.d0*&
     880                 :             : &                         (gxa(1,jjs+2,ia,iproj,ispin)*gxa(1,jjs  ,ia,iproj,ispin)+&
     881                 :      696849 : &                         gxa(2,jjs+2,ia,iproj,ispin)*gxa(2,jjs  ,ia,iproj,ispin))
     882                 :             :                          strsnl(6)=strsnl(6)-wt(ilang,iproj)*2.d0*&
     883                 :             : &                         (gxa(1,jjs+1,ia,iproj,ispin)*gxa(1,jjs  ,ia,iproj,ispin)+&
     884                 :      696849 : &                         gxa(2,jjs+1,ia,iproj,ispin)*gxa(2,jjs  ,ia,iproj,ispin))
     885         [ +  + ]:     1226873 :                        else if (ilang==3) then
     886                 :      491121 :                          call trace2(gxa(:,jjs:jjs+5,ia,iproj,ispin),gmet,trace)
     887                 :      491121 :                          call cont22(gxa(:,jjs:jjs+5,ia,iproj,ispin),gmet,rank2)
     888         [ +  + ]:     3437847 :                          do ii=1,6
     889                 :             :                            strsnl(ii)=strsnl(ii)+wt(ilang,iproj)*&
     890                 :             : &                           (2.d0*(trace(1)*gxa(1,jjs+ii-1,ia,iproj,ispin)+&
     891                 :     3437847 : &                           trace(2)*gxa(2,jjs+ii-1,ia,iproj,ispin))-3.d0*rank2(ii))
     892                 :             :                          end do
     893         [ +  + ]:      735752 :                        else if (ilang==4) then
     894                 :       37366 :                          call cont3(gxa(:,jjs:jjs+9,ia,iproj,ispin),gmet,rank2)
     895         [ +  + ]:      261562 :                          strsnl(:)=strsnl(:)-wt(ilang,iproj)*rank2(:)
     896                 :             :                        end if
     897                 :             :                      else
     898                 :             : !                      2b ------ Spin-orbit ------
     899         [ +  + ]:     1037724 :                        do ispinp=1,nspinortot
     900         [ +  + ]:     1037724 :                          if (ilang==3) then
     901                 :             :                            call cont22so(gxa(:,jjs:jjs+5,ia,iproj,ispin),&
     902                 :             : &                           gxa(:,jjs:jjs+5,ia,iproj,ispinp),&
     903                 :      285896 : &                           amet(:,:,:,ispin,ispinp),rank2)
     904         [ +  + ]:     2001272 :                            strsnl(:)=strsnl(:)-wt(ilang,iproj)*3.d0*rank2(:)
     905         [ +  + ]:      405920 :                          else if (ilang==4) then
     906                 :             :                            call cont33so(gxa(:,jjs:jjs+9,ia,iproj,ispin),&
     907                 :             : &                           gxa(:,jjs:jjs+9,ia,iproj,ispinp),&
     908                 :       65360 : &                           gmet,amet(:,:,:,ispin,ispinp),rank2)
     909         [ +  + ]:      457520 :                            strsnl(:)=strsnl(:)-wt(ilang,iproj)*rank2(:)
     910                 :             :                          end if
     911                 :             :                        end do
     912                 :             :                      end if
     913                 :             : !                    3- Compute contractions involving gxa and gxa due to
     914                 :             : !                    gradients of antisymmetric tensor (amet):
     915                 :             : !                    --- Only in case of Spin-orbit ---
     916         [ +  + ]:     2269630 :                      if(ispinor==2) then
     917         [ +  + ]:     1037724 :                        do ispinp=1,nspinortot
     918                 :             : !                        Be carefull: no need to compute rank2c(:,1:3) !
     919         [ +  + ]:      691816 :                          if (ilang==2) then
     920                 :             :                            rank2c(1,4)=gxa(1,jjs+2,ia,iproj,ispin)*gxa(1,jjs+1,ia,iproj,ispinp)&
     921                 :      340560 : &                           +gxa(2,jjs+2,ia,iproj,ispin)*gxa(2,jjs+1,ia,iproj,ispinp)
     922                 :             :                            rank2c(2,4)=gxa(1,jjs+2,ia,iproj,ispin)*gxa(2,jjs+1,ia,iproj,ispinp)&
     923                 :      340560 : &                           -gxa(2,jjs+2,ia,iproj,ispin)*gxa(1,jjs+1,ia,iproj,ispinp)
     924                 :             :                            rank2c(1,5)=gxa(1,jjs+2,ia,iproj,ispin)*gxa(1,jjs  ,ia,iproj,ispinp)&
     925                 :      340560 : &                           +gxa(2,jjs+2,ia,iproj,ispin)*gxa(2,jjs  ,ia,iproj,ispinp)
     926                 :             :                            rank2c(2,5)=gxa(1,jjs+2,ia,iproj,ispin)*gxa(2,jjs  ,ia,iproj,ispinp)&
     927                 :      340560 : &                           -gxa(2,jjs+2,ia,iproj,ispin)*gxa(1,jjs  ,ia,iproj,ispinp)
     928                 :             :                            rank2c(1,6)=gxa(1,jjs+1,ia,iproj,ispin)*gxa(1,jjs  ,ia,iproj,ispinp)&
     929                 :      340560 : &                           +gxa(2,jjs+1,ia,iproj,ispin)*gxa(2,jjs  ,ia,iproj,ispinp)
     930                 :             :                            rank2c(2,6)=gxa(1,jjs+1,ia,iproj,ispin)*gxa(2,jjs  ,ia,iproj,ispinp)&
     931                 :      340560 : &                           -gxa(2,jjs+1,ia,iproj,ispin)*gxa(1,jjs  ,ia,iproj,ispinp)
     932         [ +  + ]:      351256 :                          else if (ilang==3) then
     933                 :             :                            call cont22cso(gxa(:,jjs:jjs+5,ia,iproj,ispin),&
     934                 :             : &                           gxa(:,jjs:jjs+5,ia,iproj,ispinp),&
     935                 :      285896 : &                           gmet,rank2c)
     936         [ +  - ]:       65360 :                          else if (ilang==4) then
     937                 :             :                            call cont33cso(gxa(:,jjs:jjs+9,ia,iproj,ispin),&
     938                 :             : &                           gxa(:,jjs:jjs+9,ia,iproj,ispinp),&
     939                 :       65360 : &                           gmet,rank2c)
     940                 :             :                          end if
     941         [ +  - ]:     1037724 :                          if (ilang>1) then
     942         [ +  + ]:     2767264 :                            do jj=1,3
     943         [ +  + ]:     8993608 :                              do ii=4,6
     944                 :             :                                strsso(ii,jj)=strsso(ii,jj)-2.d0*wt(ilang,iproj)*&
     945                 :             : &                               (pauli(1,ispin,ispinp,jj)*rank2c(2,ii)+&
     946                 :     8301792 : &                               pauli(2,ispin,ispinp,jj)*rank2c(1,ii))
     947                 :             :                              end do
     948                 :             :                            end do
     949                 :             :                          end if
     950                 :             :                        end do
     951                 :             :                      end if
     952                 :             : !                    Enf if (choice==3)
     953                 :             :                    end if
     954                 :             : 
     955                 :             : !                  ----  Accumulate dynamical matrix contributions if requested.
     956         [ +  + ]:   329366064 :                    if (choice==4) then
     957                 :      976932 :                      ia5=ia+ia3-1
     958         [ +  + ]:     4010446 :                      do ii=1,ilang2
     959                 :     3033514 :                        jj=ii-1+jjs
     960         [ +  + ]:    21234598 :                        do mu=1,6
     961                 :             : !                        (includes also factor of 2 from "2*Re[stuff]")
     962                 :             :                          enlout(mu+6*(ia5-1))=enlout(mu+6*(ia5-1))+two*&
     963                 :             : &                         (gxafac(1,jj,ia,iproj)*dgxdt(1,mu+3,jj,ia,iproj,ispin)&
     964                 :    21234598 : &                         +gxafac(2,jj,ia,iproj)*dgxdt(2,mu+3,jj,ia,iproj,ispin))
     965                 :             :                        end do
     966         [ +  + ]:    12134056 :                        do mu=1,3
     967                 :             :                          enlout(mu+6*(ia5-1))=enlout(mu+6*(ia5-1))+two*&
     968                 :             : &                         (dgxdtfac(1,mu,jj,ia,iproj)*dgxdt(1,mu,jj,ia,iproj,ispin)&
     969                 :    12134056 : &                         +dgxdtfac(2,mu,jj,ia,iproj)*dgxdt(2,mu,jj,ia,iproj,ispin))
     970                 :             :                        end do
     971                 :             :                        enlout(4+6*(ia5-1))=enlout(4+6*(ia5-1)) +two*&
     972                 :             : &                       (dgxdtfac(1,2,jj,ia,iproj)*dgxdt(1,3,jj,ia,iproj,ispin)&
     973                 :     3033514 : &                       +dgxdtfac(2,2,jj,ia,iproj)*dgxdt(2,3,jj,ia,iproj,ispin))
     974                 :             :                        enlout(5+6*(ia5-1))=enlout(5+6*(ia5-1)) +two*&
     975                 :             : &                       (dgxdtfac(1,1,jj,ia,iproj)*dgxdt(1,3,jj,ia,iproj,ispin)&
     976                 :     3033514 : &                       +dgxdtfac(2,1,jj,ia,iproj)*dgxdt(2,3,jj,ia,iproj,ispin))
     977                 :             :                        enlout(6+6*(ia5-1))=enlout(6+6*(ia5-1)) +two*&
     978                 :             : &                       (dgxdtfac(1,1,jj,ia,iproj)*dgxdt(1,2,jj,ia,iproj,ispin)&
     979                 :     4010446 : &                       +dgxdtfac(2,1,jj,ia,iproj)*dgxdt(2,2,jj,ia,iproj,ispin))
     980                 :             :                      end do
     981                 :             :                    end if
     982                 :             : 
     983                 :             : !                  ----  Accumulate elastic tensor contributions if requested.
     984                 :             : 
     985         [ +  + ]:   506152007 :                    if(choice==6) then
     986                 :             : !                    XG 081121 : msg to the person who has introduced this CPP option (sorry, I did not have to time to locate who did this ...)
     987                 :             : !                    This section of ABINIT should be allowed by default to the user. I have found that on the contrary, the build
     988                 :             : !                    system defaults are such that this section is forbidden by default. You might restore this flag if at the same time,
     989                 :             : !                    you modify the build system in such a way that by default this section is included, and if the user wants, it can disable it.
     990                 :             : !                    #if defined USE_NLSTRAIN_LEGENDRE
     991                 :      164504 :                      ia5=ia+ia3-1
     992                 :      164504 :                      jjs1=((ilang)*(ilang+1)*(ilang+2))/6
     993                 :      164504 :                      jjs2=-3+((ilang+1)*(ilang+2)*(ilang+3))/6
     994                 :      164504 :                      jjs3=-9+((ilang+2)*(ilang+3)*(ilang+4))/6
     995                 :      164504 :                      jjs4=-19+((ilang+3)*(ilang+4)*(ilang+5))/6
     996                 :             : 
     997                 :             : !                    Contribution for two diagonal strains (basically, the nonlocal
     998                 :             : !                    enlk)
     999                 :             :                      temp(:,1:((rank+1)*(rank+2))/2)= &
    1000   [ +  +  +  + ]:     1781360 : &                     gxa(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin)
    1001                 :      164504 :                      call metcon(rank,gmet,temp,tmpfac)
    1002                 :      164504 :                      e2nldd=zero
    1003         [ +  + ]:      703456 :                      do ii=1,((rank+1)*(rank+2))/2
    1004                 :             :                        e2nldd=e2nldd+&
    1005                 :             : &                       (gxa(1,jjs-1+ii,ia,iproj,ispin)*tmpfac(1,ii)+&
    1006                 :      703456 : &                       gxa(2,jjs-1+ii,ia,iproj,ispin)*tmpfac(2,ii))
    1007                 :             :                      end do
    1008                 :             : 
    1009                 :             : !                    Terms involving one ucvol derivative (diagonal strain only)
    1010                 :             : !                    and one derivative of nonlocal operator
    1011                 :             : !                    Loop over strain index
    1012         [ +  + ]:     1151528 :                      do istr2=1,6
    1013                 :             : 
    1014                 :             : !                      rank->rank+2
    1015                 :      987024 :                        iterm=1
    1016                 :             :                        temp(:,1:((rank+1)*(rank+2))/2)= &
    1017   [ +  +  +  + ]:    10688160 : &                       gxa(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin)
    1018                 :      987024 :                        call metstr(istr2,rank,iterm,gmet,gprimd,temp,tmpfac)
    1019                 :      987024 :                        e2nl_tmp(istr2)=0.d0
    1020         [ +  + ]:    11084976 :                        do ii=1,((rank+3)*(rank+4))/2
    1021                 :             :                          e2nl_tmp(istr2)=e2nl_tmp(istr2)-2.d0*&
    1022                 :             : &                         (dgxds(1,jjs2-1+ii,ia,iproj,isp)*tmpfac(1,ii)+&
    1023                 :    11084976 : &                         dgxds(2,jjs2-1+ii,ia,iproj,isp)*tmpfac(2,ii))
    1024                 :             :                        end do
    1025                 :             : !                      rank->rank
    1026                 :             : 
    1027                 :      987024 :                        iterm=2
    1028                 :             :                        temp(:,1:((rank+1)*(rank+2))/2)= &
    1029   [ +  +  +  + ]:    10688160 : &                       gxa(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin)
    1030                 :      987024 :                        call metstr(istr2,rank,iterm,gmet,gprimd,temp,tmpfac)
    1031         [ +  + ]:     4385240 :                        do ii=1,((rank+1)*(rank+2))/2
    1032                 :             :                          e2nl_tmp(istr2)=e2nl_tmp(istr2)-&
    1033                 :             : &                         (gxa(1,jjs-1+ii,ia,iproj,ispin)*tmpfac(1,ii)+&
    1034                 :     4220736 : &                         gxa(2,jjs-1+ii,ia,iproj,ispin)*tmpfac(2,ii))
    1035                 :             :                        end do
    1036                 :             : !                      DEBUG
    1037                 :             : !                      This and subsequent similar debug sections evaluate the
    1038                 :             : !                      hermitial conjugate of the contraction immeditely above
    1039                 :             : !                      and the comparison was useful for development purposes.
    1040                 :             : !                      rank+2->rank
    1041                 :             : !                      iterm=3
    1042                 :             : !                      temp(:,1:((rank+3)*(rank+4))/2)= &
    1043                 :             : !                      dgxds(:,jjs2:jjs2-1+((rank+3)*(rank+4))/2,ia,iproj,ispin)
    1044                 :             : !                      call metstr(istr2,rank,iterm,gmet,gprimd,temp,tmpfac)
    1045                 :             : !                      e2nl_tmp(istr2)=0.d0
    1046                 :             : !                      do ii=1,((rank+1)*(rank+2))/2
    1047                 :             : !                      e2nl_tmp(istr2)=e2nl_tmp(istr2)-&
    1048                 :             : !                      &             (gxa(1,jjs-1+ii,ia,iproj,ispin)*tmpfac(1,ii)+&
    1049                 :             : !                      &              gxa(2,jjs-1+ii,ia,iproj,ispin)*tmpfac(2,ii))
    1050                 :             : !                      end do
    1051                 :             : !                      ENDDEBUG
    1052                 :             :                      end do
    1053                 :             : 
    1054                 :             : !                    Terms involving two derivatives of the nonlocal operator
    1055                 :             : !                    Loop over 2nd strain index
    1056         [ +  + ]:     1151528 :                      do istr2=1,6
    1057                 :             : !                      Loop over 1st strain index, upper triangle only
    1058         [ +  + ]:     6909168 :                        do istr1=1,6
    1059                 :     5922144 :                          iest=istr1+(3*natom+6)*(istr2-1)
    1060                 :             : 
    1061                 :             : !                        Accumulate terms corresponding to two derivatives of ucvol
    1062                 :             : !                        (simply the nonlocal energy contributin) for both indices
    1063                 :             : !                        corresponding to diagonal strains
    1064                 :             : 
    1065   [ +  +  +  + ]:     5922144 :                          if(istr1<=3 .and. istr2<=3) then
    1066                 :     1480536 :                            enlout(iest)= enlout(iest)+wt(ilang,iproj)*e2nldd
    1067                 :             :                          end if
    1068                 :             : 
    1069                 :             : !                        Accumulate terms computed above from 1st derivatives
    1070                 :             : !                        when one or more indices corresponds to diagonal strain
    1071         [ +  + ]:     5922144 :                          if(istr2<=3) then
    1072                 :     2961072 :                            enlout(iest)= enlout(iest)+wt(ilang,iproj)*e2nl_tmp(istr1)
    1073                 :             :                          end if
    1074         [ +  + ]:     5922144 :                          if(istr1<=3) then
    1075                 :     2961072 :                            enlout(iest)= enlout(iest)+wt(ilang,iproj)*e2nl_tmp(istr2)
    1076                 :             :                          end if
    1077                 :             : 
    1078                 :             : !                        rank->rank+4
    1079                 :             :                          call contstr21(istr2,istr1,rank,gmet,gprimd,e2nl,&
    1080                 :             : &                         gxa(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin),&
    1081                 :     5922144 : &                         d2gxds2(:,jjs4:jjs4-1+((rank+5)*(rank+6))/2,ia,iproj,isp))
    1082                 :     5922144 :                          enlout(iest)= enlout(iest)+wt(ilang,iproj)*e2nl
    1083                 :             : 
    1084                 :             : !                        DEBUG
    1085                 :             : !                        rank+4->rank
    1086                 :             : !                        call contstr22(istr2,istr1,rank,gmet,gprimd,e2nl,&
    1087                 :             : !                        &             d2gxds2(:,jjs4:jjs4-1+((rank+5)*(rank+6))/2,ia,iproj,ispin),&
    1088                 :             : !                        &             gxa(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin))
    1089                 :             : !                        enlout(iest)= enlout(iest)+wt(ilang,iproj)*e2nl
    1090                 :             : !                        ENDDEBUG
    1091                 :             : 
    1092                 :             : !                        rank->rank+2
    1093                 :             :                          call contstr23(istr2,istr1,rank,gmet,gprimd,e2nl,&
    1094                 :             : &                         gxa(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin),&
    1095                 :     5922144 : &                         dgxds(:,jjs2:jjs2-1+((rank+3)*(rank+4))/2,ia,iproj,isp))
    1096                 :     5922144 :                          enlout(iest)= enlout(iest)+wt(ilang,iproj)*e2nl
    1097                 :             : !                        DEBUG
    1098                 :             : 
    1099                 :             : !                        rank+2->rank
    1100                 :             : !                        call contstr24(istr2,istr1,rank,gmet,gprimd,e2nl,&
    1101                 :             : !                        &             dgxds(:,jjs2:jjs2-1+((rank+3)*(rank+4))/2,ia,iproj,ispin),&
    1102                 :             : !                        &             gxa(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin))
    1103                 :             : !                        enlout(iest)= enlout(iest)+wt(ilang,iproj)*e2nl
    1104                 :             : !                        ENDDEBUG
    1105                 :             : 
    1106                 :             : !                        rank+2->rank+2
    1107         [ +  + ]:     5922144 :                          if(rank<=2) then
    1108                 :             :                            call contstr25(istr2,istr1,rank,gmet,gprimd,e2nl,&
    1109                 :             : &                           dgxds(:,jjs2:jjs2-1+((rank+3)*(rank+4))/2,ia,iproj,isp),&
    1110                 :     5921568 : &                           dgxds(:,jjs2:jjs2-1+((rank+3)*(rank+4))/2,ia,iproj,isp))
    1111                 :             :                          else
    1112                 :             :                            call contstr25a(istr2,istr1,rank,gmet,gprimd,e2nl,&
    1113                 :             : &                           dgxds(:,jjs2:jjs2-1+((rank+3)*(rank+4))/2,ia,iproj,isp),&
    1114                 :         576 : &                           dgxds(:,jjs2:jjs2-1+((rank+3)*(rank+4))/2,ia,iproj,isp))
    1115                 :             :                          end if
    1116                 :     5922144 :                          enlout(iest)= enlout(iest)+wt(ilang,iproj)*e2nl
    1117                 :             : 
    1118                 :             : !                        rank->rank
    1119                 :             :                          call contstr26(istr2,istr1,rank,gmet,gprimd,e2nl,&
    1120                 :             : &                         gxa(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin),&
    1121                 :     5922144 : &                         gxa(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin))
    1122                 :     6909168 :                          enlout(iest)= enlout(iest)+wt(ilang,iproj)*e2nl
    1123                 :             : 
    1124                 :             :                        end do !istr1
    1125                 :             : 
    1126                 :             : !                      Contributions to internal strain (one cartesian strain and one
    1127                 :             : !                      reduced-coordinate atomic displacement derivative).
    1128                 :      987024 :                        iest=7+3*(ia5-1)+(3*natom+6)*(istr2-1)
    1129                 :             : 
    1130                 :             : !                      rank->rank+3
    1131                 :             :                        call contistr03(istr2,rank,gmet,gprimd,eisnl,&
    1132                 :             : &                       gxa(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin),&
    1133                 :      987024 : &                       d2gxdis(:,jjs3:jjs3-1+((rank+4)*(rank+5))/2,ia,iproj,isp))
    1134                 :             :                        enlout(iest:iest+2)= enlout(iest:iest+2)&
    1135         [ +  + ]:     3948096 : &                       +wt(ilang,iproj)*eisnl(1:3)
    1136                 :             : 
    1137                 :             : !                      DEBUG
    1138                 :             : !                      rank+3->rank
    1139                 :             : !                      call contistr30(istr2,rank,gmet,gprimd,eisnl,&
    1140                 :             : !                      &            d2gxdis(:,jjs3:jjs3-1+((rank+4)*(rank+5))/2,ia,iproj,ispin),&
    1141                 :             : !                      &            gxa(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin))
    1142                 :             : !                      enlout(iest:iest+2)= enlout(iest:iest+2)&
    1143                 :             : !                      &            +wt(ilang,iproj)*eisnl(1:3)
    1144                 :             : !                      ENDDEBUG
    1145                 :             : 
    1146                 :             : !                      rank+1->rank+2
    1147                 :             :                        call contistr12(istr2,rank,gmet,gprimd,eisnl,&
    1148                 :             : &                       dgxdis(:,jjs1:jjs1-1+((rank+2)*(rank+3))/2,ia,iproj,isp),&
    1149                 :      987024 : &                       dgxds(:,jjs2:jjs2-1+((rank+3)*(rank+4))/2,ia,iproj,isp))
    1150                 :             :                        enlout(iest:iest+2)= enlout(iest:iest+2)&
    1151         [ +  + ]:     3948096 : &                       +wt(ilang,iproj)*eisnl(1:3)
    1152                 :             : 
    1153                 :             : !                      DEBUG
    1154                 :             : !                      rank+2->rank+1
    1155                 :             : !                      call contistr21(istr2,rank,gmet,gprimd,eisnl,&
    1156                 :             : !                      &            dgxds(:,jjs2:jjs2-1+((rank+3)*(rank+4))/2,ia,iproj,ispin),&
    1157                 :             : !                      &            dgxdis(:,jjs1:jjs1-1+((rank+2)*(rank+3))/2,ia,iproj,ispin))
    1158                 :             : !                      enlout(iest:iest+2)= enlout(iest:iest+2)&
    1159                 :             : !                      &            +wt(ilang,iproj)*eisnl(1:3)
    1160                 :             : !                      ENDDEBUG
    1161                 :             : 
    1162                 :             : !                      rank->rank+1
    1163                 :             :                        call contistr01(istr2,rank,gmet,gprimd,eisnl,&
    1164                 :             : &                       gxa(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin),&
    1165                 :      987024 : &                       dgxdis(:,jjs1:jjs1-1+((rank+2)*(rank+3))/2,ia,iproj,isp))
    1166                 :             :                        enlout(iest:iest+2)= enlout(iest:iest+2)&
    1167         [ +  + ]:     4112600 : &                       +wt(ilang,iproj)*eisnl(1:3)
    1168                 :             : !
    1169                 :             : !                      DEBUG
    1170                 :             : !                      rank+1->rank
    1171                 :             : !                      call contistr10(istr2,rank,gmet,gprimd,eisnl,&
    1172                 :             : !                      &            dgxdis(:,jjs1:jjs1-1+((rank+2)*(rank+3))/2,ia,iproj,ispin),&
    1173                 :             : !                      &            gxa(:,jjs:jjs-1+((rank+1)*(rank+2))/2,ia,iproj,ispin))
    1174                 :             : !                      enlout(iest:iest+2)= enlout(iest:iest+2)&
    1175                 :             : !                      &            +wt(ilang,iproj)*eisnl(1:3)
    1176                 :             : !                      ENDDEBUG
    1177                 :             : 
    1178                 :             :                      end do !istr2
    1179                 :             :                    end if !choice==6
    1180                 :             : 
    1181                 :             : !                  End loop over iproj:
    1182                 :             :                  end do
    1183                 :             : !                End condition of existence of a reference state:
    1184                 :             :                end if
    1185                 :             : 
    1186                 :             : !              End loop over ilang:
    1187                 :             :              end do
    1188                 :             : 
    1189                 :             : !            End loop over ia:
    1190                 :             :            end do
    1191                 :             : 
    1192                 :             : !          Operate with the non-local potential on the projected scalars,
    1193                 :             : !          in order to get matrix element [NOT needed if only force or stress
    1194                 :             : !          or dynamical matrix is being computed].
    1195                 :             : 
    1196         [ +  + ]:    92031921 :            if (signs==2) then
    1197   [ +  +  +  - ]:    47778907 :              if(nloalg(2)<=0 .and. choice==2)then
    1198                 :             : !              Prepare the phase k+q factors for the atoms between ia3 and ia4:
    1199                 :             : !              they were not prepared previously for nloalg(2)<=0 and choice==2.
    1200                 :             :                call ph1d3d(ia3,ia4,kgout,matblk,natom,npwout,&
    1201                 :     2835862 : &               n1,n2,n3,phkxredout,ph1d,ph3dout)
    1202                 :             :              end if
    1203                 :             : 
    1204                 :             : !            call timab(74+choice,1,tsec)
    1205                 :    47778907 :              sign=-1
    1206                 :             : !            The duplication of the opernl calls has the purpose to avoid
    1207                 :             : !            copying vectout/vectout_s
    1208   [ +  +  +  + ]:    47778907 :              if(ispin==1.or.nspinor==1)then
    1209         [ +  + ]:    42915664 :                if( nloalg(1)==2) then
    1210                 :             :                  call opernl2(choice,dgxdis,dgxdsfac,d2gxdis,d2gxds2,dgxdtfac,&
    1211                 :             : &                 ffnlout,gmet,gxafac,ia3,idir,indlmn_s,ispinor,istwf_k,itypat,&
    1212                 :             : &                 jproj,kgout,kpgout,kptout,lmnmax,matblk,mincat,mlang1,mlang3,mlang4,&
    1213                 :             : &                 mlang5,mlang6,mproj,ndgxdt,dimffnlout,nincat,nkpgout,nlang,nloalg,npwout,&
    1214                 :       10394 : &                 ntypat,ph3dout,sign,vectout)
    1215         [ +  + ]:    42905270 :                else if( nloalg(1)==3) then
    1216                 :             :                  call opernl3(choice,dgxdis,dgxdsfac,d2gxdis,d2gxds2,dgxdtfac,&
    1217                 :             : &                 ffnlout,gmet,gxafac,ia3,idir,indlmn_s,ispinor,istwf_k,itypat,&
    1218                 :             : &                 jproj,kgout,kpgout,kptout,lmnmax,matblk,mincat,mlang1,mlang3,mlang4,&
    1219                 :             : &                 mlang5,mlang6,mproj,ndgxdt,dimffnlout,nincat,nkpgout,nlang,nloalg,npwout,&
    1220                 :      125702 : &                 ntypat,ph3dout,sign,vectout)
    1221         [ +  - ]:    42779568 :                else if( nloalg(1)==4) then
    1222                 :             :                  call opernl4b(choice,dgxdsfac,dgxdtfac,ffnlout,gmet,gxafac,&
    1223                 :             : &                 ia3,idir,indlmn_s,ispinor,itypat,jproj,kgout,kpgout,kptout,&
    1224                 :             : &                 lmnmax,matblk,mincat,mlang3,mlang4,mproj,ndgxdt,&
    1225                 :    42779568 : &                 dimffnlout,nincat,nkpgout,nlang,nloalg,npwout,ntypat,ph3dout,vectout)
    1226                 :             :                end if
    1227                 :             :              else  ! if ispin == 2
    1228   [ +  +  +  + ]:  2752832490 :                vectout_s(:,:)=zero
    1229         [ -  + ]:     4863243 :                if( nloalg(1)==2) then
    1230                 :             :                  call opernl2(choice,dgxdis,dgxdsfac,d2gxdis,d2gxds2,dgxdtfac,&
    1231                 :             : &                 ffnlout,gmet,gxafac,ia3,idir,indlmn_s,ispinor,istwf_k,itypat,&
    1232                 :             : &                 jproj,kgout,kpgout,kptout,lmnmax,matblk,mincat,mlang1,mlang3,mlang4,&
    1233                 :             : &                 mlang5,mlang6,mproj,ndgxdt,dimffnlout,nincat,nkpgout,nlang,nloalg,npwout,&
    1234                 :           0 : &                 ntypat,ph3dout,sign,vectout_s)
    1235         [ -  + ]:     4863243 :                else if( nloalg(1)==3) then
    1236                 :             :                  call opernl3(choice,dgxdis,dgxdsfac,d2gxdis,d2gxds2,dgxdtfac,&
    1237                 :             : &                 ffnlout,gmet,gxafac,ia3,idir,indlmn_s,ispinor,istwf_k,itypat,&
    1238                 :             : &                 jproj,kgout,kpgout,kptout,lmnmax,matblk,mincat,mlang1,mlang3,mlang4,&
    1239                 :             : &                 mlang5,mlang6,mproj,ndgxdt,dimffnlout,nincat,nkpgout,nlang,nloalg,npwout,&
    1240                 :           0 : &                 ntypat,ph3dout,sign,vectout_s)
    1241         [ +  - ]:     4863243 :                else if( nloalg(1)==4) then
    1242                 :             :                  call opernl4b(choice,dgxds,dgxdtfac,ffnlout,gmet,gxafac,&
    1243                 :             : &                 ia3,idir,indlmn_s,ispinor,itypat,jproj,kgout,kpgout,kptout,&
    1244                 :             : &                 lmnmax,matblk,mincat,mlang3,mlang4,mproj,ndgxdt,&
    1245                 :     4863243 : &                 dimffnlout,nincat,nkpgout,nlang,nloalg,npwout,ntypat,ph3dout,vectout_s)
    1246                 :             :                end if
    1247                 :             :                vectout(1,1+npwout:2*npwout)=&
    1248         [ +  + ]:   920852992 : &               vectout(1,1+npwout:2*npwout)+vectout_s(1,1:npwout)
    1249                 :             :                vectout(2,1+npwout:2*npwout)=&
    1250         [ +  + ]:   920852992 : &               vectout(2,1+npwout:2*npwout)+vectout_s(2,1:npwout)
    1251                 :             : 
    1252                 :             :              end if ! end ispin if
    1253                 :             :            end if ! end signs==2 if
    1254                 :             : 
    1255                 :             : !          End loops over spins:
    1256                 :             :          end do
    1257                 :             : 
    1258                 :             : !        End condition of existence of a non-local part for that type of atom:
    1259                 :             :        end if
    1260                 :             : 
    1261                 :             : !      End loop over ispinor:
    1262                 :             :      end do
    1263                 :             : 
    1264                 :             : !    End sum on atom subset loop, over ia3:
    1265                 :             :    end do
    1266                 :             : 
    1267                 :             : !  End atom type loop, over itypat:
    1268                 :    71836647 :    ia1=ia2+1
    1269                 :             :  end do
    1270                 :             : 
    1271                 :             : !De-allocate temporary space.
    1272         [ -  + ]:    29457648 :  ABI_FREE(ekb_s)
    1273         [ -  + ]:    29457648 :  ABI_FREE(gxa)
    1274         [ -  + ]:    29457648 :  ABI_FREE(gxafac)
    1275         [ -  + ]:    29457648 :  ABI_FREE(dgxds)
    1276         [ -  + ]:    29457648 :  ABI_FREE(dgxdt)
    1277         [ -  + ]:    29457648 :  ABI_FREE(dgxdtfac)
    1278         [ -  + ]:    29457648 :  ABI_FREE(wt)
    1279         [ -  + ]:    29457648 :  ABI_FREE(jproj)
    1280         [ -  + ]:    29457648 :  ABI_FREE(temp)
    1281         [ -  + ]:    29457648 :  ABI_FREE(tmpfac)
    1282         [ -  + ]:    29457648 :  ABI_FREE(dgxdsfac)
    1283         [ -  + ]:    29457648 :  ABI_FREE(indlmn_s)
    1284                 :             :  !if(choice==6)  then
    1285         [ -  + ]:    29457648 :  ABI_FREE(dgxdis)
    1286         [ -  + ]:    29457648 :  ABI_FREE(d2gxdis)
    1287         [ -  + ]:    29457648 :  ABI_FREE(d2gxds2)
    1288                 :             :  !end if
    1289                 :             :  !if(nspinor==2) then
    1290         [ -  + ]:    29457648 :  ABI_FREE(dgxds_s)
    1291         [ -  + ]:    29457648 :  ABI_FREE(dgxdt_s)
    1292         [ -  + ]:    29457648 :  ABI_FREE(gxa_s)
    1293                 :             :  !end if
    1294                 :             :  !if(nspinor==2.and.choice==6) then
    1295         [ -  + ]:    29457648 :  ABI_FREE(dgxdis_s)
    1296         [ -  + ]:    29457648 :  ABI_FREE(d2gxdis_s)
    1297         [ -  + ]:    29457648 :  ABI_FREE(d2gxds2_s)
    1298                 :             :  !end if
    1299         [ +  + ]:    29457648 :  if (mpssoang>mpsang)  then
    1300         [ -  + ]:     2339994 :    ABI_FREE(pauli)
    1301                 :             :  end if
    1302                 :             : 
    1303                 :             : !Restore the original content of the vectin array.
    1304                 :             : !Note that only the first part was modified
    1305         [ +  + ]:    29457648 :  if(istwf_k/=1) then
    1306   [ -  +  -  -  :      904765 :    call scalewf_nonlop(istwf_k,mpi_enreg,npwin,2,vectin)
          -  -  -  -  -  
             +  -  -  -  
                      - ]
    1307                 :             :  end if
    1308                 :             : 
    1309         [ +  + ]:    29457648 :  if (nspinor==2)  then
    1310         [ -  + ]:     1552174 :    ABI_FREE(vectin_s)
    1311         [ -  + ]:     1552174 :    ABI_FREE(vectout_s)
    1312                 :             :  end if
    1313                 :             : 
    1314         [ +  + ]:    29457648 :  if (mpi_enreg%paral_spinor==1) then
    1315         [ +  - ]:        4928 :    if (size(enlout)>0) call xmpi_sum(enlout,mpi_enreg%comm_spinor,ierr)
    1316                 :        4928 :    call xmpi_sum(strsnl,mpi_enreg%comm_spinor,ierr)
    1317                 :        4928 :    call xmpi_sum(enlk,mpi_enreg%comm_spinor,ierr)
    1318                 :        4928 :    call xmpi_sum(strsso,mpi_enreg%comm_spinor,ierr)
    1319                 :             :  end if
    1320                 :             : 
    1321                 :             : !Save non-local energy
    1322   [ +  +  +  - ]:    29457648 :  if((choice==1).and.size(enlout)>0) enlout(1)=enlk ! on test v4/93 size(enlout) can be zero (PMA)
    1323                 :             : 
    1324                 :             : !Do final manipulations to produce strain gradients for
    1325                 :             : !stress tensor, in cartesian coordinates
    1326   [ +  +  +  +  :    29564436 :  if ((choice==3.or.choice==23) .and. signs==1) then
          -  +  -  +  -  
                      + ]
    1327                 :             : !  Convert strsnl from reduced to cartesian coordinates
    1328                 :      106788 :    strsnl_out(:)=0.d0
    1329                 :      106788 :    call strconv(strsnl,gprimd,strsnl_out)
    1330                 :      106788 :    strsnl(:) = strsnl_out(:)
    1331                 :             : !  Add diagonal part (fill up first 6 components of enlout with
    1332                 :             : !  these gradients; elements 7,8,9 of enlout are not used)
    1333                 :      106788 :    enlout(1)=strsnl(1)-enlk
    1334                 :      106788 :    enlout(2)=strsnl(2)-enlk
    1335                 :      106788 :    enlout(3)=strsnl(3)-enlk
    1336                 :      106788 :    enlout(4)=strsnl(4)
    1337                 :      106788 :    enlout(5)=strsnl(5)
    1338                 :      106788 :    enlout(6)=strsnl(6)
    1339                 :             : !  Eventually, add spin-orbit part due to gradients of
    1340                 :             : !  antisymmetric tensor
    1341         [ +  + ]:      106788 :    if (mpssoang>mpsang) then
    1342                 :       17537 :      call strsocv(strsso,gprimd,strssoc)
    1343         [ +  + ]:      122759 :      enlout(1:6)=enlout(1:6)+strssoc(:)
    1344                 :             :    end if
    1345                 :             :  end if
    1346                 :             : 
    1347                 :             : !DEBUG
    1348                 :             : !write(std_out,*)' nonlop_pl: exit '
    1349                 :             : !ENDDEBUG
    1350                 :             : 
    1351                 :             : contains
    1352                 :             : !!***
    1353                 :             : 
    1354                 :             : !!****f* ABINIT/trace2
    1355                 :             : !! NAME
    1356                 :             : !! trace2
    1357                 :             : !!
    1358                 :             : !! FUNCTION
    1359                 :             : !! Sum indices to compute trace of rank 2 tensor gxa related to l=2
    1360                 :             : !! $trace=sum_{i,j} {gxa(i,j) gmet(i,j)}$
    1361                 :             : !!
    1362                 :             : !! INPUTS
    1363                 :             : !!  gxa(2,6) = $sum_{G} {e^(2 \pi i G cdot t} {{f_2(|k+G|)} \over {|k+G|^2}} (k+G) cdot (k+G) C(G_{nk})}$
    1364                 :             : !!  gmet(3,3)=(symmetric) metric tensor in reciprocal space (bohr^-2)
    1365                 :             : !!
    1366                 :             : !! OUTPUT
    1367                 :             : !!  trace(2)=sum_{i,j} {gxa(i,j) gmet(i,j)}$ (Re and Im).
    1368                 :             : !!
    1369                 :             : !! NOTES
    1370                 :             : !! Here index 6 refers to vector components
    1371                 :             : !! of (k+G) but note tensor is symmetric=>only 6 components.
    1372                 :             : !! The components are given in the order 11 22 33 32 31 21.
    1373                 :             : !! The initial 2 handles the Re and Im parts.
    1374                 :             : !!
    1375                 :             : !! PARENTS
    1376                 :             : !!      m_nonlop_pl
    1377                 :             : !!
    1378                 :             : !! CHILDREN
    1379                 :             : !!
    1380                 :             : !! SOURCE
    1381                 :             : 
    1382                 :      491121 : subroutine trace2(gxa,gmet,trace)
    1383                 :             : 
    1384                 :             : !Arguments ------------------------------------
    1385                 :             : !arrays
    1386                 :             :  real(dp),intent(in) :: gmet(3,3),gxa(2,6)
    1387                 :             :  real(dp),intent(out) :: trace(2)
    1388                 :             : 
    1389                 :             : !Local variables-------------------------------
    1390                 :             : !scalars
    1391                 :             :  integer :: reim
    1392                 :             : 
    1393                 :             : ! *************************************************************************
    1394                 :             : 
    1395                 :             : !Write out index summation, Re and Im parts
    1396         [ +  + ]:     1473363 :  do reim=1,2
    1397                 :             :    trace(reim)=gxa(reim,1)*gmet(1,1)+gxa(reim,2)*gmet(2,2)+&
    1398                 :             : &   gxa(reim,3)*gmet(3,3)+&
    1399                 :             : &   2.0d0*(gxa(reim,4)*gmet(3,2)+gxa(reim,5)*gmet(3,1)+&
    1400                 :     1473363 : &   gxa(reim,6)*gmet(2,1))
    1401                 :             :  end do
    1402                 :             : 
    1403                 :      491121 : end subroutine trace2
    1404                 :             : !!***
    1405                 :             : 
    1406                 :             : !!****f* ABINIT/strsocv
    1407                 :             : !! NAME
    1408                 :             : !! strsocv
    1409                 :             : !!
    1410                 :             : !! FUNCTION
    1411                 :             : !! Convert from antisymmetric storage mode 3x3x3 rank3 tensor in reduced
    1412                 :             : !! coordinates "red" to symmetric storage mode 3x3 rank2 tensor in
    1413                 :             : !! cartesian coordinates "cart", using metric tensor "gprimd".
    1414                 :             : !!
    1415                 :             : !! INPUTS
    1416                 :             : !!  red(6,3)=3x3x3 tensor in antisymmetric storage mode,
    1417                 :             : !!           reduced coordinates
    1418                 :             : !!  gprimd(3,3)=reciprocal space dimensional primitive translations
    1419                 :             : !!
    1420                 :             : !! OUTPUT
    1421                 :             : !!  cart(6)=3x3 tensor in symmetric storage mode,
    1422                 :             : !!          cartesian coordinates
    1423                 :             : !!
    1424                 :             : !! NOTES
    1425                 :             : !! This routine is used to compute spin-orbit stress tensor.
    1426                 :             : !!
    1427                 :             : !! red is antisymmetric in first two indices and stored
    1428                 :             : !!     as 11 22 33 32 31 21.
    1429                 :             : !! cart is symmetric and stored as 11 22 33 32 31 21.
    1430                 :             : !!
    1431                 :             : !!{{\ \begin{eqnarray}
    1432                 :             : !! cart(1,1) & = &        & red(i,j,2) G(3,i) G(1,j) + red(i,j,3) G(1,i) G(2,j) \nonumber
    1433                 :             : !! cart(2,2) & = &        & red(i,j,1) G(2,i) G(3,j) + red(i,j,3) G(1,i) G(2,j) \nonumber
    1434                 :             : !! cart(3,3) & = &        & red(i,j,1) G(2,i) G(3,j) + red(i,j,2) G(3,i) G(1,j) \nonumber
    1435                 :             : !! cart(3,2) & = &  0.5 ( & red(i,j,3) G(1,i) G(3,j) + red(i,j,2) G(2,i) G(1,j)) \nonumber
    1436                 :             : !! cart(3,1) & = &  0.5 ( & red(i,j,3) G(3,i) G(2,j) + red(i,j,1) G(2,i) G(1,j)) \nonumber
    1437                 :             : !! cart(2,1) & = &  0.5 ( & red(i,j,2) G(3,i) G(2,j) + red(i,j,1) G(1,i) G(3,j))
    1438                 :             : !! \end{eqnarray} }}
    1439                 :             : !!
    1440                 :             : !! PARENTS
    1441                 :             : !!      m_nonlop_pl
    1442                 :             : !!
    1443                 :             : !! CHILDREN
    1444                 :             : !!
    1445                 :             : !! SOURCE
    1446                 :             : 
    1447                 :       17537 : subroutine strsocv(red,gprimd,cart)
    1448                 :             : 
    1449                 :             : !Arguments ------------------------------------
    1450                 :             : !arrays
    1451                 :             :  real(dp),intent(in) :: gprimd(3,3),red(6,3)
    1452                 :             :  real(dp),intent(out) :: cart(6)
    1453                 :             : 
    1454                 :             : !Local variables-------------------------------
    1455                 :             : !scalars
    1456                 :             :  integer :: ii,jj
    1457                 :             : !arrays
    1458                 :             :  real(dp) :: work(3,3,3)
    1459                 :             : 
    1460                 :             : ! *************************************************************************
    1461                 :             : 
    1462         [ +  + ]:       70148 :  do ii=1,3
    1463                 :       52611 :    work(1,1,ii)=0.d0
    1464                 :       52611 :    work(2,2,ii)=0.d0
    1465                 :       52611 :    work(3,3,ii)=0.d0
    1466                 :       52611 :    work(3,2,ii)=red(4,ii) ; work(2,3,ii)=-red(4,ii)
    1467                 :       52611 :    work(3,1,ii)=red(5,ii) ; work(1,3,ii)=-red(5,ii)
    1468                 :       70148 :    work(2,1,ii)=red(6,ii) ; work(1,2,ii)=-red(6,ii)
    1469                 :             :  end do
    1470                 :             : 
    1471                 :       17537 :  cart(:)=0.d0
    1472         [ +  + ]:       70148 :  do jj=1,3
    1473         [ +  + ]:      227981 :    do ii=1,3
    1474                 :             :      cart(1)=cart(1)+work(ii,jj,2)*gprimd(3,ii)*gprimd(1,jj)&
    1475                 :      157833 : &     +work(ii,jj,3)*gprimd(1,ii)*gprimd(2,jj)
    1476                 :             :      cart(2)=cart(2)+work(ii,jj,1)*gprimd(2,ii)*gprimd(3,jj)&
    1477                 :      157833 : &     +work(ii,jj,3)*gprimd(1,ii)*gprimd(2,jj)
    1478                 :             :      cart(3)=cart(3)+work(ii,jj,1)*gprimd(2,ii)*gprimd(3,jj)&
    1479                 :      157833 : &     +work(ii,jj,2)*gprimd(3,ii)*gprimd(1,jj)
    1480                 :             :      cart(4)=cart(4)+work(ii,jj,3)*gprimd(1,ii)*gprimd(3,jj)&
    1481                 :      157833 : &     +work(ii,jj,2)*gprimd(2,ii)*gprimd(1,jj)
    1482                 :             :      cart(5)=cart(5)+work(ii,jj,3)*gprimd(3,ii)*gprimd(2,jj)&
    1483                 :      157833 : &     +work(ii,jj,1)*gprimd(2,ii)*gprimd(1,jj)
    1484                 :             :      cart(6)=cart(6)+work(ii,jj,2)*gprimd(3,ii)*gprimd(2,jj)&
    1485                 :      210444 : &     +work(ii,jj,1)*gprimd(1,ii)*gprimd(3,jj)
    1486                 :             :    end do
    1487                 :             :  end do
    1488                 :       17537 :  cart(4)=0.5d0*cart(4)
    1489                 :       17537 :  cart(5)=0.5d0*cart(5)
    1490                 :       17537 :  cart(6)=0.5d0*cart(6)
    1491                 :             : 
    1492                 :       17537 : end subroutine strsocv
    1493                 :             : !!***
    1494                 :             : 
    1495                 :             : !!****f* ABINIT/scalewf_nonlop
    1496                 :             : !! NAME
    1497                 :             : !! scalewf_nonlop
    1498                 :             : !!
    1499                 :             : !! FUNCTION
    1500                 :             : !! At the start of nonlop (or similar routines), as well as its end,
    1501                 :             : !! the wavefunctions, when stored with istwfk/=2,
    1502                 :             : !! need to be scaled (by a factor of 2 or 1/2),
    1503                 :             : !! except for the G=0 component.
    1504                 :             : !! Only the first spinor component is to be modified.
    1505                 :             : !!
    1506                 :             : !! INPUTS
    1507                 :             : !!  istwf_k=storage mode of the vector
    1508                 :             : !!  mpi_enreg=information about MPI parallelization
    1509                 :             : !!  npw=number of planewaves
    1510                 :             : !!  option=1 multiply by 2
    1511                 :             : !!        =2 multiply by 1/2
    1512                 :             : !!
    1513                 :             : !! OUTPUT
    1514                 :             : !!  (see side effects)
    1515                 :             : !!
    1516                 :             : !! SIDE EFFECTS
    1517                 :             : !!  vect(2,npw)=vector that is rescaled
    1518                 :             : !!
    1519                 :             : !! NOTES
    1520                 :             : !!  XG030513 : MPIWF One should pay attention to the
    1521                 :             : !!  G=0 component, that will be only one one proc...
    1522                 :             : !!
    1523                 :             : !! PARENTS
    1524                 :             : !!      m_nonlop_pl
    1525                 :             : !!
    1526                 :             : !! CHILDREN
    1527                 :             : !!
    1528                 :             : !! SOURCE
    1529                 :             : 
    1530                 :     1809530 : subroutine scalewf_nonlop(istwf_k,mpi_enreg,npw,option,vect)
    1531                 :             : 
    1532                 :             : !Arguments ------------------------------------
    1533                 :             : !This type is defined in defs_mpi
    1534                 :             : !scalars
    1535                 :             :  integer,intent(in) :: istwf_k,npw,option
    1536                 :             :  type(MPI_type),intent(in) :: mpi_enreg
    1537                 :             : !arrays
    1538                 :             :  real(dp),intent(inout) :: vect(2,npw)
    1539                 :             : 
    1540                 :             : !Local variables-------------------------------
    1541                 :             : !scalars
    1542                 :             :  integer :: ipw
    1543                 :             :  real(dp) :: scale
    1544                 :             :  character(len=500) :: msg
    1545                 :             : 
    1546                 :             : ! *************************************************************************
    1547                 :             : 
    1548                 :             :  DBG_ENTER("COLL")
    1549                 :             : 
    1550         [ +  - ]:     1809530 :  if(istwf_k/=1)then
    1551                 :             : 
    1552         [ -  + ]:     1809530 :    if(option/=1 .and. option/=2)then
    1553                 :             :      write(msg,'(a,a,a,i0)')&
    1554                 :           0 :      'The argument option should be 1 or 2,',ch10,&
    1555                 :           0 :      'however, option=',option
    1556                 :           0 :      ABI_BUG(msg)
    1557                 :             :    end if
    1558                 :             : 
    1559                 :     1809530 :    scale=two
    1560         [ +  + ]:     1809530 :    if(option==2)scale=half
    1561                 :             : 
    1562                 :             : !  Storage for the Gamma point. The component of the G=0 vector
    1563                 :             : !  should not be scaled, and no G=0 imaginary part is allowed.
    1564         [ +  + ]:     1809530 :    if(istwf_k==2)then
    1565         [ +  + ]:      993540 :      if (mpi_enreg%me_g0_fft==1) then
    1566                 :      991160 :        vect(2,1)=zero
    1567                 :             : !$OMP PARALLEL DO
    1568         [ +  + ]:   632878994 :        do ipw=2,npw
    1569                 :   631887834 :          vect(1,ipw)=scale*vect(1,ipw)
    1570                 :   632878994 :          vect(2,ipw)=scale*vect(2,ipw)
    1571                 :             :        end do
    1572                 :             : !$OMP END PARALLEL DO
    1573                 :             :      else
    1574                 :             : !$OMP PARALLEL DO
    1575         [ +  + ]:      247520 :        do ipw=1,npw
    1576                 :      245140 :          vect(1,ipw)=scale*vect(1,ipw)
    1577                 :      247520 :          vect(2,ipw)=scale*vect(2,ipw)
    1578                 :             :        end do
    1579                 :             : !$OMP END PARALLEL DO
    1580                 :             :      end if
    1581                 :             :    end if
    1582                 :             : 
    1583                 :             : !  Other storage modes, for k points with time-reversal symmetry.
    1584                 :             : !  All components should be scaled.
    1585         [ +  + ]:     1809530 :    if(istwf_k>2)then
    1586                 :             : !$OMP PARALLEL DO
    1587         [ +  + ]:   262493056 :      do ipw=1,npw
    1588                 :   261677066 :        vect(1,ipw)=scale*vect(1,ipw)
    1589                 :   262493056 :        vect(2,ipw)=scale*vect(2,ipw)
    1590                 :             :      end do
    1591                 :             : !$OMP END PARALLEL DO
    1592                 :             :    end if
    1593                 :             : 
    1594                 :             :  end if ! istwf_k/=1
    1595                 :             : 
    1596                 :             :  DBG_EXIT("COLL")
    1597                 :             : 
    1598                 :     1809530 : end subroutine scalewf_nonlop
    1599                 :             : !!***
    1600                 :             : 
    1601                 :             : !!****f* ABINIT/ddkten
    1602                 :             : !! NAME
    1603                 :             : !! ddkten
    1604                 :             : !!
    1605                 :             : !! FUNCTION
    1606                 :             : !! Compact or decompact the tensors related to the ffnl(:,1,...)
    1607                 :             : !! part of the ddk operator, taking into account the direction
    1608                 :             : !! of the ddk perturbation.
    1609                 :             : !!
    1610                 :             : !! INPUTS
    1611                 :             : !!  compact= if 1, compact from tmpfac
    1612                 :             : !!  idir=direction of the ddk perturbation
    1613                 :             : !!  rank=0,1,2, or 3 = rank of tmpfac tensor, also angular momentum (=l)
    1614                 :             : !!
    1615                 :             : !! OUTPUT
    1616                 :             : !!  (see side effects)
    1617                 :             : !!
    1618                 :             : !! SIDE EFFECTS
    1619                 :             : !! Input/Output:
    1620                 :             : !!  temp(2,(rank*(rank+1))/2)=compacted tensor
    1621                 :             : !!    for l=1, just a scalar
    1622                 :             : !!    for l=2, a vector
    1623                 :             : !!  tmpfac(2,(rank+1)*(rank+2)/2)=decompacted tensor
    1624                 :             : !!    for l=1, a vector
    1625                 :             : !!    for l=2, a symmetric matrix, stored as
    1626                 :             : !!     (1 . .)
    1627                 :             : !!     (6 2 .)
    1628                 :             : !!     (5 4 3)
    1629                 :             : !!
    1630                 :             : !! NOTES
    1631                 :             : !! For l=0, there is no contribution.
    1632                 :             : !!
    1633                 :             : !! PARENTS
    1634                 :             : !!      m_nonlop_pl
    1635                 :             : !!
    1636                 :             : !! CHILDREN
    1637                 :             : !!
    1638                 :             : !! SOURCE
    1639                 :             : 
    1640                 :     8661594 : subroutine ddkten(compact,idir,rank,temp,tmpfac)
    1641                 :             : 
    1642                 :             : !Arguments ------------------------------------
    1643                 :             : !scalars
    1644                 :             :  integer,intent(in) :: compact,idir,rank
    1645                 :             : !arrays
    1646                 :             :  real(dp),intent(inout) :: temp(2,(rank*(rank+1))/2)
    1647                 :             :  real(dp),intent(inout) :: tmpfac(2,((rank+1)*(rank+2))/2)
    1648                 :             : 
    1649                 :             : !Local variables-------------------------------
    1650                 :             : !scalars
    1651                 :             :  character(len=500) :: msg
    1652                 :             : 
    1653                 :             : ! *************************************************************************
    1654                 :             : 
    1655         [ -  + ]:     8661594 :  if(rank/=1 .and. rank/=2 .and. rank/=3)then
    1656                 :             :    write(msg, '(a,i10,a,a,a)' )&
    1657                 :           0 :    'Input rank=',rank,' not allowed.',ch10,&
    1658                 :           0 :    'Possible values are 1,2,3 only.'
    1659                 :           0 :    ABI_BUG(msg)
    1660                 :             :  end if
    1661                 :             : 
    1662                 :             : !Take care of p angular momentum
    1663         [ +  + ]:     8661594 :  if(rank==1)then
    1664                 :             : 
    1665                 :             : !  Compaction tmpfac -> temp
    1666         [ +  + ]:     4995510 :    if(compact==1)then
    1667         [ +  + ]:     7493265 :      temp(:,1)=tmpfac(:,idir)
    1668                 :             : 
    1669                 :             : !    Decompaction temp -> tmpfac
    1670                 :             :    else
    1671   [ +  +  +  + ]:    24977550 :      tmpfac(:,1:3)=0.0d0
    1672         [ +  + ]:     7493265 :      tmpfac(:,idir)=temp(:,1)
    1673                 :             :    end if
    1674                 :             : 
    1675                 :             : !  Take care of d angular momentum
    1676                 :             : !  rank=2 11->1 22->2 33->3 32->4 31->5 21->6
    1677                 :             : 
    1678         [ +  + ]:     3666084 :  else if(rank==2)then
    1679                 :             : 
    1680                 :             : !  Compaction tmpfac -> temp
    1681         [ +  + ]:     3659324 :    if(compact==1)then
    1682         [ +  + ]:     1829662 :      if(idir==1)then
    1683                 :             : !      Count the number of non-zero derivatives with respect to k(idir)
    1684                 :             : !      The factor of 2 on the diagonal comes from the derivative with
    1685                 :             : !      respect to the first K then to the second K
    1686   [ +  +  +  +  :     7451982 :        temp(:,1)=2.0d0*tmpfac(:,1); temp(:,2)=tmpfac(:,6); temp(:,3)=tmpfac(:,5)
                   +  + ]
    1687         [ +  + ]:     1001664 :      else if(idir==2)then
    1688   [ +  +  +  +  :     4527936 :        temp(:,2)=2.0d0*tmpfac(:,2); temp(:,1)=tmpfac(:,6); temp(:,3)=tmpfac(:,4)
                   +  + ]
    1689         [ +  - ]:      498560 :      else if(idir==3)then
    1690   [ +  +  +  +  :     4487040 :        temp(:,3)=2.0d0*tmpfac(:,3); temp(:,1)=tmpfac(:,5); temp(:,2)=tmpfac(:,4)
                   +  + ]
    1691                 :             :      end if
    1692                 :             : !    Decompaction temp -> tmpfac
    1693                 :             :    else
    1694   [ +  +  +  + ]:    34763578 :      tmpfac(:,1:6)=0.0d0
    1695         [ +  + ]:     5488986 :      tmpfac(:,idir)=2.0d0*temp(:,idir)
    1696         [ +  + ]:     1829662 :      if(idir==1)then
    1697   [ +  +  +  + ]:     4967988 :        tmpfac(:,5)=temp(:,3); tmpfac(:,6)=temp(:,2)
    1698         [ +  + ]:     1001664 :      else if(idir==2)then
    1699   [ +  +  +  + ]:     3018624 :        tmpfac(:,4)=temp(:,3); tmpfac(:,6)=temp(:,1)
    1700         [ +  - ]:      498560 :      else if(idir==3)then
    1701   [ +  +  +  + ]:     2991360 :        tmpfac(:,4)=temp(:,2); tmpfac(:,5)=temp(:,1)
    1702                 :             :      end if
    1703                 :             :    end if
    1704                 :             : 
    1705                 :             : !  Take care of f angular momentum
    1706         [ +  - ]:        6760 :  else if(rank==3)then
    1707                 :             : !  rank=3 111->1 221->2 331->3 321->4 311->5 211->6 222->7 332->8 322->9 333->10
    1708                 :             : !  rank=2 11->1 22->2 33->3 32->4 31->5 21->6
    1709                 :             : 
    1710                 :             : !  Compaction tmpfac -> temp
    1711         [ +  + ]:        6760 :    if(compact==1)then
    1712         [ +  - ]:        3380 :      if(idir==1)then
    1713                 :             : !      Count the number of non-zero derivatives with respect to k(idir)
    1714         [ +  + ]:       10140 :        temp(:,1)=3.0d0*tmpfac(:,1)
    1715   [ +  +  +  + ]:       33800 :        temp(:,2:4)=tmpfac(:,2:4)
    1716   [ +  +  +  + ]:       23660 :        temp(:,5:6)=2.0d0*tmpfac(:,5:6)
    1717         [ #  # ]:           0 :      else if(idir==2)then
    1718         [ #  # ]:           0 :        temp(:,6)=2.0d0*tmpfac(:,2)
    1719         [ #  # ]:           0 :        temp(:,4)=2.0d0*tmpfac(:,9)
    1720         [ #  # ]:           0 :        temp(:,5)=tmpfac(:,4)
    1721         [ #  # ]:           0 :        temp(:,1)=tmpfac(:,6)
    1722         [ #  # ]:           0 :        temp(:,3)=tmpfac(:,8)
    1723         [ #  # ]:           0 :        temp(:,2)=3.0d0*tmpfac(:,7)
    1724         [ #  # ]:           0 :      else if(idir==3)then
    1725         [ #  # ]:           0 :        temp(:,3)=3.0d0*tmpfac(:,10)
    1726         [ #  # ]:           0 :        temp(:,5)=2.0d0*tmpfac(:,3)
    1727         [ #  # ]:           0 :        temp(:,4)=2.0d0*tmpfac(:,8)
    1728         [ #  # ]:           0 :        temp(:,6)=tmpfac(:,4)
    1729         [ #  # ]:           0 :        temp(:,1)=tmpfac(:,5)
    1730         [ #  # ]:           0 :        temp(:,2)=tmpfac(:,9)
    1731                 :             :      end if
    1732                 :             : !    Decompaction temp -> tmpfac
    1733                 :             :    else
    1734   [ +  +  +  + ]:      104780 :      tmpfac(:,1:10)=0.0d0
    1735         [ +  - ]:        3380 :      if(idir==1)then
    1736         [ +  + ]:       10140 :        tmpfac(:,1)=3.0d0*temp(:,1)
    1737   [ +  +  +  + ]:       33800 :        tmpfac(:,2:4)=temp(:,2:4)
    1738   [ +  +  +  + ]:       23660 :        tmpfac(:,5:6)=2.0d0*temp(:,5:6)
    1739         [ #  # ]:           0 :      else if(idir==2)then
    1740         [ #  # ]:           0 :        tmpfac(:,2)=2.0d0*temp(:,6)
    1741         [ #  # ]:           0 :        tmpfac(:,9)=2.0d0*temp(:,4)
    1742         [ #  # ]:           0 :        tmpfac(:,4)=temp(:,5)
    1743         [ #  # ]:           0 :        tmpfac(:,6)=temp(:,1)
    1744         [ #  # ]:           0 :        tmpfac(:,8)=temp(:,3)
    1745         [ #  # ]:           0 :        tmpfac(:,7)=3.0d0*temp(:,2)
    1746         [ #  # ]:           0 :      else if(idir==3)then
    1747         [ #  # ]:           0 :        tmpfac(:,10)=3.0d0*temp(:,3)
    1748         [ #  # ]:           0 :        tmpfac(:,3)=2.0d0*temp(:,5)
    1749         [ #  # ]:           0 :        tmpfac(:,8)=2.0d0*temp(:,4)
    1750         [ #  # ]:           0 :        tmpfac(:,4)=temp(:,6)
    1751         [ #  # ]:           0 :        tmpfac(:,5)=temp(:,1)
    1752         [ #  # ]:           0 :        tmpfac(:,9)=temp(:,2)
    1753                 :             :      end if
    1754                 :             :    end if
    1755                 :             : 
    1756                 :             :  end if
    1757                 :             : 
    1758                 :     8661594 : end subroutine ddkten
    1759                 :             : !!***
    1760                 :             : 
    1761                 :             : end subroutine nonlop_pl
    1762                 :             : !!***
    1763                 :             : 
    1764                 :             : end module m_nonlop_pl
    1765                 :             : !!***
        

Generated by: LCOV version 2.3-1