TABLE OF CONTENTS


ABINIT/opernlc_ylm [ Functions ]

[ Top ] [ Functions ]

NAME

 opernlc_ylm

FUNCTION

 * Operate with the non-local part of the hamiltonian,
   in order to reduce projected scalars
 * Operate with the non-local projectors and the overlap matrix,
   in order to reduce projected scalars

COPYRIGHT

 Copyright (C) 1998-2018 ABINIT group (MT)
 This file is distributed under the terms of the
 GNU General Public License, see ~abinit/COPYING
 or http://www.gnu.org/copyleft/gpl.txt .
 For the initials of contributors, see ~abinit/doc/developers/contributors.txt.

INPUTS

  atindx1(natom)=index table for atoms (gives the absolute index of
                 an atom from its rank in a block of atoms)
  cplex=1 if <p_lmn|c> scalars are real (equivalent to istwfk>1)
        2 if <p_lmn|c> scalars are complex
  cplex_dgxdt(ndgxdt) = used only when cplex = 1
             cplex_dgxdt(i) = 1 if dgxdt(1,i,:,:)   is real, 2 if it is pure imaginary
  cplex_enl=1 if enl factors are real, 2 if they are complex
  cplex_fac=1 if gxfac scalars are real, 2 if gxfac scalars are complex
  dgxdt(cplex,ndgxdt,nlmn,nincat)=grads of projected scalars (only if optder>0)
  dimenl1,dimenl2=dimensions of enl (see enl)
  enl(cplex_enl*dimenl1,dimenl2,nspinortot**2)=
  ->Norm conserving : ==== when paw_opt=0 ====
                      (Real) Kleinman-Bylander energies (hartree)
                      dimenl1=lmnmax  -  dimenl2=ntypat
  ->PAW :             ==== when paw_opt=1, 2 or 4 ====
                      (Real or complex, hermitian) Dij coefs to connect projectors
                      dimenl1=cplex_enl*lmnmax*(lmnmax+1)/2  -  dimenl2=natom
                      These are complex numbers if cplex_enl=2
                        enl(:,:,1) contains Dij^up-up
                        enl(:,:,2) contains Dij^dn-dn
                        enl(:,:,3) contains Dij^up-dn (only if nspinor=2)
                        enl(:,:,4) contains Dij^dn-up (only if nspinor=2)
  gx(cplex,nlmn,nincat*abs(enl_opt))= projected scalars
  iatm=absolute rank of first atom of the current block of atoms
  indlmn(6,nlmn)= array giving l,m,n,lm,ln,s for i=lmn
  itypat=type of atoms
  lambda=factor to be used when computing (Vln-lambda.S) - only for paw_opt=2
  mpi_enreg=informations about MPI parallelization
  natom=number of atoms in cell
  ndgxdt=second dimension of dgxdt
  ndgxdtfac=second dimension of dgxdtfac
  nincat=number of atoms in the subset here treated
  nlmn=number of (l,m,n) numbers for current type of atom
  nspinor= number of spinorial components of the wavefunctions (on current proc)
  nspinortot=total number of spinorial components of the wavefunctions
  optder=0=only gxfac is computed, 1=both gxfac and dgxdtfac are computed
         2=gxfac, dgxdtfac and d2gxdtfac are computed
  paw_opt= define the nonlocal operator concerned with:
           paw_opt=0 : Norm-conserving Vnl (use of Kleinman-Bylander ener.)
           paw_opt=1 : PAW nonlocal part of H (use of Dij coeffs)
           paw_opt=2 : PAW: (Vnl-lambda.Sij) (Sij=overlap matrix)
           paw_opt=3 : PAW overlap matrix (Sij)
           paw_opt=4 : both PAW nonlocal part of H (Dij) and overlap matrix (Sij)
  sij(nlm*(nlmn+1)/2)=overlap matrix components (only if paw_opt=2, 3 or 4)
  hermdij=optional logical argument governing whether Dij are to be applied explicitly Hermitian (true)
          or just symmetry Dij=Dji (false,default)

OUTPUT

  if (paw_opt=0, 1, 2 or 4)
    gxfac(cplex_fac,nlmn,nincat,nspinor)= reduced projected scalars related to Vnl (NL operator)
  if (paw_opt=3 or 4)
    gxfac_sij(cplex,nlmn,nincat,nspinor)= reduced projected scalars related to Sij (overlap)
  if (optder==1.and.paw_opt=0, 1, 2 or 4)
    dgxdtfac(cplex_fac,ndgxdtfac,nlmn,nincat,nspinor)= gradients of gxfac related to Vnl (NL operator)
  if (optder==1.and.paw_opt=3 or 4)
    dgxdtfac_sij(cplex,ndgxdtfac,nlmn,nincat,nspinor)= gradients of gxfac related to Sij (overlap)

NOTES

 This routine operates for one type of atom, and within this given type of atom,
 for a subset of at most nincat atoms.

PARENTS

      m_gemm_nonlop,nonlop_ylm

CHILDREN

      xmpi_sum

SOURCE

  89 #if defined HAVE_CONFIG_H
  90 #include "config.h"
  91 #endif
  92 
  93 #include "abi_common.h"
  94 
  95 subroutine opernlc_ylm(atindx1,cplex,cplex_dgxdt,cplex_d2gxdt,cplex_enl,cplex_fac,dgxdt,dgxdtfac,dgxdtfac_sij,&
  96 &                      d2gxdt,d2gxdtfac,d2gxdtfac_sij,dimenl1,dimenl2,enl,gx,gxfac,gxfac_sij,iatm,indlmn,itypat,&
  97 &                      lambda,mpi_enreg,natom,ndgxdt,ndgxdtfac,nd2gxdt,nd2gxdtfac,nincat,nlmn,&
  98 &                      nspinor,nspinortot,optder,paw_opt,sij,hermdij)
  99 
 100  use defs_basis
 101  use defs_abitypes
 102  use m_errors
 103  use m_profiling_abi
 104  use m_xmpi
 105 
 106 !This section has been created automatically by the script Abilint (TD).
 107 !Do not modify the following lines by hand.
 108 #undef ABI_FUNC
 109 #define ABI_FUNC 'opernlc_ylm'
 110 !End of the abilint section
 111 
 112  implicit none
 113 
 114 !Arguments ------------------------------------
 115 !scalars
 116  integer,intent(in) :: cplex,cplex_enl,cplex_fac,dimenl1,dimenl2,iatm,itypat
 117  integer,intent(in) :: natom,ndgxdt,ndgxdtfac,nd2gxdt,nd2gxdtfac,nincat,nspinor,nspinortot,optder,paw_opt
 118  integer,intent(inout) :: nlmn
 119  real(dp) :: lambda
 120  logical,optional,intent(in) :: hermdij
 121  type(MPI_type) , intent(in) :: mpi_enreg
 122 !arrays
 123  integer,intent(in) :: atindx1(natom),indlmn(6,nlmn),cplex_dgxdt(ndgxdt),cplex_d2gxdt(nd2gxdt)
 124  real(dp),intent(in) :: dgxdt(cplex,ndgxdt,nlmn,nincat,nspinor)
 125  real(dp),intent(in) :: d2gxdt(cplex,nd2gxdt,nlmn,nincat,nspinor)
 126  real(dp),intent(in) :: enl(dimenl1,dimenl2,nspinortot**2)
 127  real(dp),intent(inout) :: gx(cplex,nlmn,nincat,nspinor)
 128  real(dp),intent(in) :: sij(((paw_opt+1)/3)*nlmn*(nlmn+1)/2)
 129  real(dp),intent(out) :: dgxdtfac(cplex_fac,ndgxdtfac,nlmn,nincat,nspinor)
 130  real(dp),intent(out) :: dgxdtfac_sij(cplex,ndgxdtfac,nlmn,nincat,nspinor*(paw_opt/3))
 131  real(dp),intent(out) :: d2gxdtfac(cplex_fac,nd2gxdtfac,nlmn,nincat,nspinor)
 132  real(dp),intent(out) :: d2gxdtfac_sij(cplex,nd2gxdtfac,nlmn,nincat,nspinor*(paw_opt/3))
 133  real(dp),intent(out) :: gxfac(cplex_fac,nlmn,nincat,nspinor)
 134  real(dp),intent(out) :: gxfac_sij(cplex,nlmn,nincat,nspinor*(paw_opt/3))
 135 
 136 !Local variables-------------------------------
 137 !Arrays
 138 !scalars
 139  integer :: cplex_,ia,ierr,ijlmn,ijspin,ilm,ilmn,i0lmn,iln,index_enl,ispinor,ispinor_index
 140  integer :: j0lmn,jilmn,jispin,jjlmn,jlm,jlmn,jspinor,jspinor_index,mu,shift
 141  real(dp) :: sijr
 142  logical :: hermdij_
 143 !arrays
 144  real(dp) :: enl_(2),gxfi(2),gxi(cplex),gxj(cplex)
 145  real(dp),allocatable :: d2gxdtfac_(:,:,:,:,:),dgxdtfac_(:,:,:,:,:),gxfac_(:,:,:,:),gxfj(:,:) 
 146 
 147 ! *************************************************************************
 148 
 149  DBG_ENTER("COLL")
 150 
 151 !Parallelization over spinors treatment
 152  shift=0;if (mpi_enreg%paral_spinor==1) shift=mpi_enreg%me_spinor
 153 
 154 ! hermdij_ .false. invokes original coding, with Dij=Dji in complex case
 155 ! hermdij_ .true. invokes Dij = Dji*, needed for magnetic field cases
 156  hermdij_=.false.;if(present(hermdij)) hermdij_=hermdij
 157 
 158 !Accumulate gxfac related to non-local operator (Norm-conserving)
 159 !-------------------------------------------------------------------
 160  if (paw_opt==0) then                  ! Enl is E(Kleinman-Bylander)
 161    ABI_CHECK(cplex_enl/=2,"BUG: invalid cplex_enl=2!")
 162    ABI_CHECK(cplex_fac==cplex,"BUG: invalid cplex_fac/=cplex!")
 163 !$OMP PARALLEL &
 164 !$OMP PRIVATE(ispinor,ispinor_index,ia,ilmn,iln,enl_)
 165 !$OMP DO COLLAPSE(3)
 166    do ispinor=1,nspinor
 167      do ia=1,nincat
 168        do ilmn=1,nlmn
 169          ispinor_index=ispinor+shift
 170          iln=indlmn(5,ilmn)
 171          enl_(1)=enl(iln,itypat,ispinor_index)
 172          gxfac(1:cplex,ilmn,ia,ispinor)=enl_(1)*gx(1:cplex,ilmn,ia,ispinor)
 173        end do
 174      end do
 175    end do
 176 !$OMP END DO
 177 !$OMP END PARALLEL 
 178  end if
 179 
 180 !Accumulate gxfac related to nonlocal operator (PAW)
 181 !-------------------------------------------------------------------
 182  if (paw_opt==1.or.paw_opt==2.or.paw_opt==4) then        ! Enl is psp strength Dij
 183    gxfac(1:cplex_fac,1:nlmn,1:nincat,1:nspinor)=zero      ! or (Dij-lambda.Sij)
 184 !  === Diagonal term(s) (up-up, down-down)
 185 !  1-Enl is real
 186    if (cplex_enl==1) then
 187 
 188 !$OMP PARALLEL &
 189 !$OMP PRIVATE(ispinor,ispinor_index,ia,index_enl), &
 190 !$OMP PRIVATE(jlmn,j0lmn,jjlmn,enl_,gxj,ilmn,ijlmn,gxi)
 191 !$OMP DO COLLAPSE(3)
 192      do ispinor=1,nspinor
 193        do ia=1,nincat
 194          do jlmn=1,nlmn
 195            ispinor_index=ispinor+shift
 196            index_enl=atindx1(iatm+ia)
 197            j0lmn=jlmn*(jlmn-1)/2
 198            jjlmn=j0lmn+jlmn
 199            enl_(1)=enl(jjlmn,index_enl,ispinor_index)
 200            if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(jjlmn)
 201            gxj(1:cplex)=gx(1:cplex,jlmn,ia,ispinor)
 202            gxfac(1:cplex,jlmn,ia,ispinor)=gxfac(1:cplex,jlmn,ia,ispinor)+enl_(1)*gxj(1:cplex)
 203            do ilmn=1,jlmn-1
 204              ijlmn=j0lmn+ilmn
 205              enl_(1)=enl(ijlmn,index_enl,ispinor_index)
 206              if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
 207              gxi(1:cplex)=gx(1:cplex,ilmn,ia,ispinor)
 208              gxfac(1:cplex,jlmn,ia,ispinor)=gxfac(1:cplex,jlmn,ia,ispinor)+enl_(1)*gxi(1:cplex)
 209 #if !defined HAVE_OPENMP
 210              gxfac(1:cplex,ilmn,ia,ispinor)=gxfac(1:cplex,ilmn,ia,ispinor)+enl_(1)*gxj(1:cplex)
 211 #endif
 212            end do
 213 #if defined HAVE_OPENMP
 214            if(jlmn<nlmn) then
 215              do ilmn=jlmn+1,nlmn
 216                i0lmn=(ilmn*(ilmn-1)/2)
 217                ijlmn=i0lmn+jlmn
 218                enl_(1)=enl(ijlmn,index_enl,ispinor_index)
 219                if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
 220                gxi(1:cplex)=gx(1:cplex,ilmn,ia,ispinor)
 221                gxfac(1:cplex,jlmn,ia,ispinor)=gxfac(1:cplex,jlmn,ia,ispinor)+enl_(1)*gxi(1:cplex)
 222              end do
 223            end if
 224 #endif
 225          end do
 226        end do
 227      end do
 228 !$OMP END DO 
 229 !$OMP END PARALLEL
 230 
 231 !    2-Enl is complex
 232    else
 233      ABI_CHECK(cplex_fac==cplex_enl,"BUG: invalid cplex_fac/=cplex_enl!")
 234      if (nspinortot==1) then    !===== when nspinor=1, D_ij=D_ji except in hermdij case
 235 
 236 !$OMP PARALLEL &
 237 !$OMP PRIVATE(ia,index_enl,jlmn,j0lmn,jjlmn,enl_,gxj,ilmn,ijlmn,gxi)
 238        do ia=1,nincat
 239          index_enl=atindx1(iatm+ia)
 240 !$OMP DO
 241          do jlmn=1,nlmn
 242            j0lmn=jlmn*(jlmn-1)/2
 243            jjlmn=j0lmn+jlmn
 244            enl_(1:2)=enl(2*jjlmn-1:2*jjlmn,index_enl,1)
 245            if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(jjlmn)
 246            gxj(1:cplex)=gx(1:cplex,jlmn,ia,1)
 247            if(hermdij_) then
 248              gxfac(1:cplex,jlmn,ia,1)=gxfac(1:cplex,jlmn,ia,1)+enl_(1)*gxj(1:cplex)
 249            else
 250              gxfac(1,jlmn,ia,1)=gxfac(1,jlmn,ia,1)+enl_(1)*gxj(1)
 251              gxfac(2,jlmn,ia,1)=gxfac(2,jlmn,ia,1)+enl_(2)*gxj(1)
 252              if (cplex==2) then
 253                gxfac(1,jlmn,ia,1)=gxfac(1,jlmn,ia,1)-enl_(2)*gxj(2)
 254                gxfac(2,jlmn,ia,1)=gxfac(2,jlmn,ia,1)+enl_(1)*gxj(2)
 255              end if
 256            end if
 257            do ilmn=1,jlmn-1
 258              ijlmn=j0lmn+ilmn
 259              enl_(1:2)=enl(2*ijlmn-1:2*ijlmn,index_enl,1)
 260              if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
 261              gxi(1:cplex)=gx(1:cplex,ilmn,ia,1)
 262              gxfac(1,jlmn,ia,1)=gxfac(1,jlmn,ia,1)+enl_(1)*gxi(1)
 263              if(hermdij_) then
 264                gxfac(2,jlmn,ia,1)=gxfac(2,jlmn,ia,1)-enl_(2)*gxi(1)
 265              else
 266                gxfac(2,jlmn,ia,1)=gxfac(2,jlmn,ia,1)+enl_(2)*gxi(1)
 267              end if
 268 #if !defined HAVE_OPENMP
 269              gxfac(1,ilmn,ia,1)=gxfac(1,ilmn,ia,1)+enl_(1)*gxj(1)
 270              gxfac(2,ilmn,ia,1)=gxfac(2,ilmn,ia,1)+enl_(2)*gxj(1)
 271 #endif
 272              if (cplex==2) then
 273                if(hermdij_) then
 274                  gxfac(1,jlmn,ia,1)=gxfac(1,jlmn,ia,1)+enl_(2)*gxi(2)
 275                else
 276                  gxfac(1,jlmn,ia,1)=gxfac(1,jlmn,ia,1)-enl_(2)*gxi(2)
 277                end if
 278                gxfac(2,jlmn,ia,1)=gxfac(2,jlmn,ia,1)+enl_(1)*gxi(2)
 279 #if !defined HAVE_OPENMP
 280                gxfac(1,ilmn,ia,1)=gxfac(1,ilmn,ia,1)-enl_(2)*gxj(2)
 281                gxfac(2,ilmn,ia,1)=gxfac(2,ilmn,ia,1)+enl_(1)*gxj(2)
 282 #endif
 283              end if
 284            end do
 285 #if defined HAVE_OPENMP
 286            if(jlmn<nlmn) then
 287              do ilmn=jlmn+1,nlmn
 288                i0lmn=ilmn*(ilmn-1)/2
 289                ijlmn=i0lmn+jlmn
 290                enl_(1:2)=enl(2*ijlmn-1:2*ijlmn,index_enl,1)
 291                if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
 292                gxi(1:cplex)=gx(1:cplex,ilmn,ia,1)
 293                gxfac(1,jlmn,ia,1)=gxfac(1,jlmn,ia,1)+enl_(1)*gxi(1)
 294                gxfac(2,jlmn,ia,1)=gxfac(2,jlmn,ia,1)+enl_(2)*gxi(1)
 295                if (cplex==2) then
 296                  gxfac(1,jlmn,ia,1)=gxfac(1,jlmn,ia,1)-enl_(2)*gxi(2)
 297                  gxfac(2,jlmn,ia,1)=gxfac(2,jlmn,ia,1)+enl_(1)*gxi(2)
 298                end if
 299              end do
 300            end if
 301 #endif
 302          end do
 303 !$OMP END DO
 304        end do
 305 !$OMP END PARALLEL
 306      else                    !===== when nspinor=2, D_ij=D_ji^*
 307 !$OMP PARALLEL &
 308 !$OMP PRIVATE(ispinor,ispinor_index,ia,index_enl), &
 309 !$OMP PRIVATE(jlmn,j0lmn,jjlmn,enl_,gxj,ilmn,ijlmn,gxi)
 310        do ispinor=1,nspinor
 311          ispinor_index=ispinor+shift
 312          do ia=1,nincat
 313            index_enl=atindx1(iatm+ia)
 314 !$OMP DO
 315            do jlmn=1,nlmn
 316              j0lmn=jlmn*(jlmn-1)/2
 317              jjlmn=j0lmn+jlmn
 318              enl_(1)=enl(2*jjlmn-1,index_enl,ispinor_index)  ! enl_ii is real for up-up and dn-dn
 319              if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(jjlmn)
 320              gxj(1:cplex)=gx(1:cplex,jlmn,ia,ispinor)
 321              gxfac(1:cplex,jlmn,ia,ispinor)=gxfac(1:cplex,jlmn,ia,ispinor)+enl_(1)*gxj(1:cplex)
 322              do ilmn=1,jlmn-1
 323                ijlmn=j0lmn+ilmn
 324                enl_(1:2)=enl(2*ijlmn-1:2*ijlmn,index_enl,ispinor_index)
 325                if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
 326                gxi(1:cplex)=gx(1:cplex,ilmn,ia,ispinor)
 327                gxfac(1,jlmn,ia,ispinor)=gxfac(1,jlmn,ia,ispinor)+enl_(1)*gxi(1)
 328                gxfac(2,jlmn,ia,ispinor)=gxfac(2,jlmn,ia,ispinor)-enl_(2)*gxi(1)
 329 #if !defined HAVE_OPENMP
 330                gxfac(1,ilmn,ia,ispinor)=gxfac(1,ilmn,ia,ispinor)+enl_(1)*gxj(1)
 331                gxfac(2,ilmn,ia,ispinor)=gxfac(2,ilmn,ia,ispinor)+enl_(2)*gxj(1)
 332 #endif
 333                if (cplex==2) then
 334                  gxfac(1,jlmn,ia,ispinor)=gxfac(1,jlmn,ia,ispinor)+enl_(2)*gxi(2)
 335                  gxfac(2,jlmn,ia,ispinor)=gxfac(2,jlmn,ia,ispinor)+enl_(1)*gxi(2)
 336 #if !defined HAVE_OPENMP
 337                  gxfac(1,ilmn,ia,ispinor)=gxfac(1,ilmn,ia,ispinor)-enl_(2)*gxj(2)
 338                  gxfac(2,ilmn,ia,ispinor)=gxfac(2,ilmn,ia,ispinor)+enl_(1)*gxj(2)
 339 #endif
 340                end if
 341              end do
 342 #if defined HAVE_OPENMP
 343              if(jlmn<nlmn) then
 344                do ilmn=jlmn+1,nlmn
 345                  i0lmn=ilmn*(ilmn-1)/2
 346                  ijlmn=i0lmn+jlmn
 347                  enl_(1:2)=enl(2*ijlmn-1:2*ijlmn,index_enl,ispinor_index)
 348                  if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
 349                  gxi(1:cplex)=gx(1:cplex,ilmn,ia,ispinor)
 350                  gxfac(1,jlmn,ia,ispinor)=gxfac(1,jlmn,ia,ispinor)+enl_(1)*gxi(1)
 351                  gxfac(2,jlmn,ia,ispinor)=gxfac(2,jlmn,ia,ispinor)+enl_(2)*gxi(1)
 352                  if (cplex==2) then
 353                    gxfac(1,jlmn,ia,ispinor)=gxfac(1,jlmn,ia,ispinor)-enl_(2)*gxi(2)
 354                    gxfac(2,jlmn,ia,ispinor)=gxfac(2,jlmn,ia,ispinor)+enl_(1)*gxi(2)
 355                  end if
 356                end do
 357              end if
 358 #endif
 359            end do
 360 !$OMP END DO
 361          end do
 362        end do
 363 !$OMP END PARALLEL
 364      end if !nspinortot
 365    end if !complex_enl
 366    
 367 !  === Off-diagonal term(s) (up-down, down-up)
 368 !  --- No parallelization over spinors ---
 369    if (nspinortot==2.and.nspinor==nspinortot) then
 370      ABI_CHECK(cplex_enl==2,"BUG: invalid cplex_enl/=2!")
 371      ABI_CHECK(cplex_fac==cplex,"BUG: invalid cplex_fac/=cplex)!")
 372 !$OMP PARALLEL &
 373 !$OMP PRIVATE(ispinor,jspinor,ia,index_enl), &
 374 !$OMP PRIVATE(jlmn,j0lmn,jjlmn,enl_,gxi,gxj,ilmn,ijlmn)
 375      do ispinor=1,nspinortot
 376        jspinor=3-ispinor
 377        do ia=1,nincat
 378          index_enl=atindx1(iatm+ia)
 379 !$OMP DO
 380          do jlmn=1,nlmn
 381            j0lmn=jlmn*(jlmn-1)/2
 382            jjlmn=j0lmn+jlmn
 383            enl_(1:2)=enl(2*jjlmn-1:2*jjlmn,index_enl,2+ispinor )
 384            gxi(1:cplex)=gx(1:cplex,jlmn,ia,ispinor)
 385            gxfac(1,jlmn,ia,jspinor)=gxfac(1,jlmn,ia,jspinor)+enl_(1)*gxi(1)
 386            gxfac(2,jlmn,ia,jspinor)=gxfac(2,jlmn,ia,jspinor)-enl_(2)*gxi(1)
 387            if (cplex==2) then
 388              gxfac(1,jlmn,ia,jspinor)=gxfac(1,jlmn,ia,jspinor)+enl_(2)*gxi(2)
 389              gxfac(2,jlmn,ia,jspinor)=gxfac(2,jlmn,ia,jspinor)+enl_(1)*gxi(2)
 390            end if
 391 #if !defined HAVE_OPENMP
 392            gxj(1:cplex)=gx(1:cplex,jlmn,ia,jspinor)
 393 #endif
 394            do ilmn=1,jlmn-1
 395              ijlmn=j0lmn+ilmn
 396              enl_(1:2)=enl(2*ijlmn-1:2*ijlmn,index_enl,2+ispinor)
 397              gxi(1:cplex)=gx(1:cplex,ilmn,ia,ispinor)
 398              gxfac(1,jlmn,ia,jspinor)=gxfac(1,jlmn,ia,jspinor)+enl_(1)*gxi(1)
 399              gxfac(2,jlmn,ia,jspinor)=gxfac(2,jlmn,ia,jspinor)-enl_(2)*gxi(1)
 400 #if !defined HAVE_OPENMP
 401              gxfac(1,ilmn,ia,ispinor)=gxfac(1,ilmn,ia,ispinor)+enl_(1)*gxj(1)
 402              gxfac(2,ilmn,ia,ispinor)=gxfac(2,ilmn,ia,ispinor)+enl_(2)*gxj(1)
 403 #endif
 404              if (cplex==2) then
 405                gxfac(1,jlmn,ia,jspinor)=gxfac(1,jlmn,ia,jspinor)+enl_(2)*gxi(2)
 406                gxfac(2,jlmn,ia,jspinor)=gxfac(2,jlmn,ia,jspinor)+enl_(1)*gxi(2)
 407 #if !defined HAVE_OPENMP
 408                gxfac(1,ilmn,ia,ispinor)=gxfac(1,ilmn,ia,ispinor)-enl_(2)*gxj(2)
 409                gxfac(2,ilmn,ia,ispinor)=gxfac(2,ilmn,ia,ispinor)+enl_(1)*gxj(2)
 410 #endif
 411              end if
 412            end do
 413 #if defined HAVE_OPENMP
 414            if(jlmn<nlmn) then
 415              do ilmn=jlmn+1,nlmn
 416                i0lmn=ilmn*(ilmn-1)/2
 417                ijlmn=i0lmn+jlmn
 418                enl_(1:2)=enl(2*ijlmn-1:2*ijlmn,index_enl,2+ispinor)
 419                gxi(1:cplex)=gx(1:cplex,ilmn,ia,jspinor)
 420                gxfac(1,jlmn,ia,ispinor)=gxfac(1,jlmn,ia,ispinor)+enl_(1)*gxi(1)
 421                gxfac(2,jlmn,ia,ispinor)=gxfac(2,jlmn,ia,ispinor)+enl_(2)*gxi(1)
 422                if (cplex==2) then
 423                  gxfac(1,jlmn,ia,ispinor)=gxfac(1,jlmn,ia,ispinor)-enl_(2)*gxi(2)
 424                  gxfac(2,jlmn,ia,ispinor)=gxfac(2,jlmn,ia,ispinor)+enl_(1)*gxi(2)
 425                end if
 426              end do
 427            end if
 428 #endif
 429          end do
 430 !$OMP END DO
 431        end do
 432      end do
 433 !$OMP END PARALLEL
 434 !    --- Parallelization over spinors ---
 435    else if (nspinortot==2.and.nspinor/=nspinortot) then
 436      ABI_CHECK(cplex_enl==2,"BUG: invalid cplex_enl/=2!")
 437      ABI_CHECK(cplex_fac==2,"BUG: invalid cplex_fac/=2!")
 438      ABI_ALLOCATE(gxfac_,(cplex_fac,nlmn,nincat,nspinortot))
 439      gxfac_(:,:,:,:)=zero
 440      ispinor_index=mpi_enreg%me_spinor+1
 441      jspinor_index=3-ispinor_index
 442      if (ispinor_index==1) then
 443        ijspin=3;jispin=4
 444      else
 445        ijspin=4;jispin=3
 446      end if
 447 !$OMP PARALLEL &
 448 !$OMP PRIVATE(ia,index_enl,jlmn,j0lmn,ilmn,i0lmn,ijlmn,enl_,jilmn,gxi)
 449      do ia=1,nincat
 450        index_enl=atindx1(iatm+ia)
 451 !$OMP DO
 452        do jlmn=1,nlmn
 453          j0lmn=jlmn*(jlmn-1)/2
 454          do ilmn=1,nlmn
 455            i0lmn=ilmn*(ilmn-1)/2
 456            if (ilmn<=jlmn) then
 457              ijlmn=j0lmn+ilmn
 458              enl_(1)= enl(2*ijlmn-1,index_enl,ijspin)
 459              enl_(2)=-enl(2*ijlmn  ,index_enl,ijspin)
 460            else
 461              jilmn=i0lmn+jlmn
 462              enl_(1:2)=enl(2*jilmn-1:2*jilmn,index_enl,jispin)
 463            end if
 464            gxi(1:cplex)=gx(1:cplex,ilmn,ia,1)
 465            gxfac_(1,jlmn,ia,jspinor_index)=gxfac_(1,jlmn,ia,jspinor_index)+enl_(1)*gxi(1)
 466            gxfac_(2,jlmn,ia,jspinor_index)=gxfac_(2,jlmn,ia,jspinor_index)+enl_(2)*gxi(1)
 467            if (cplex==2) then
 468              gxfac_(1,jlmn,ia,jspinor_index)=gxfac_(1,jlmn,ia,jspinor_index)-enl_(2)*gxi(2)
 469              gxfac_(2,jlmn,ia,jspinor_index)=gxfac_(2,jlmn,ia,jspinor_index)+enl_(1)*gxi(2)
 470            end if
 471          end do !ilmn
 472        end do !jlmn
 473 !$OMP END DO
 474      end do !iat
 475 !$OMP END PARALLEL
 476      call xmpi_sum(gxfac_,mpi_enreg%comm_spinor,ierr)
 477      gxfac(:,:,:,1)=gxfac(:,:,:,1)+gxfac_(:,:,:,ispinor_index)
 478      ABI_DEALLOCATE(gxfac_)
 479    end if
 480 
 481  end if !paw_opt
 482 
 483 !Accumulate gxfac related to overlap (Sij) (PAW)
 484 !------------------------------------------- ------------------------
 485  if (paw_opt==3.or.paw_opt==4) then                    ! Use Sij, overlap contribution
 486 !$OMP PARALLEL &
 487 !$OMP PRIVATE(ispinor,ia,jlmn,j0lmn,jjlmn,jlm,sijr,ilmn,ilm,ijlmn,gxi,gxj)
 488 !$OMP WORKSHARE
 489    gxfac_sij(1:cplex,1:nlmn,1:nincat,1:nspinor)=zero
 490 !$OMP END WORKSHARE
 491 !$OMP DO COLLAPSE(3)
 492    do ispinor=1,nspinor
 493      do ia=1,nincat
 494        do jlmn=1,nlmn
 495          j0lmn=jlmn*(jlmn-1)/2
 496          jjlmn=j0lmn+jlmn
 497          jlm=indlmn(4,jlmn)
 498          sijr=sij(jjlmn)
 499          gxj(1:cplex)=gx(1:cplex,jlmn,ia,ispinor)
 500          gxfac_sij(1:cplex,jlmn,ia,ispinor)=gxfac_sij(1:cplex,jlmn,ia,ispinor)+sijr*gxj(1:cplex)
 501          do ilmn=1,jlmn-1
 502            ilm=indlmn(4,ilmn)
 503           !if (ilm==jlm) then
 504            ijlmn=j0lmn+ilmn
 505            sijr=sij(ijlmn)
 506            gxi(1:cplex)=gx(1:cplex,ilmn,ia,ispinor)
 507            gxfac_sij(1:cplex,jlmn,ia,ispinor)=gxfac_sij(1:cplex,jlmn,ia,ispinor)+sijr*gxi(1:cplex)
 508 #if !defined HAVE_OPENMP
 509            gxfac_sij(1:cplex,ilmn,ia,ispinor)=gxfac_sij(1:cplex,ilmn,ia,ispinor)+sijr*gxj(1:cplex)
 510 #endif
 511           !end if
 512          end do
 513 #if defined HAVE_OPENMP
 514          if(jlmn<nlmn) then
 515            do ilmn=jlmn+1,nlmn
 516              ilm=indlmn(4,ilmn)
 517              !if (ilm==jlm) then
 518              i0lmn=ilmn*(ilmn-1)/2
 519              ijlmn=i0lmn+jlmn
 520              sijr=sij(ijlmn)
 521              gxi(1:cplex)=gx(1:cplex,ilmn,ia,ispinor)
 522              gxfac_sij(1:cplex,jlmn,ia,ispinor)=gxfac_sij(1:cplex,jlmn,ia,ispinor)+sijr*gxi(1:cplex)
 523              !end if
 524            end do
 525          end if
 526 #endif
 527        end do
 528      end do
 529    end do
 530 !$OMP END DO
 531 !$OMP END PARALLEL
 532  end if
 533 
 534 !Accumulate dgxdtfac related to nonlocal operator (Norm-conserving)
 535 !-------------------------------------------------------------------
 536  if (optder>=1.and.paw_opt==0) then    ! Enl is E(Kleinman-Bylander)
 537    ABI_CHECK(cplex_enl==1,"BUG: invalid cplex_enl/=1!")
 538    ABI_CHECK(cplex_fac==cplex,"BUG: invalid cplex_fac/=cplex!")
 539 !$OMP PARALLEL &
 540 !$OMP PRIVATE(ispinor,ispinor_index,ia,ilmn,iln,enl_,mu)
 541    do ispinor=1,nspinor
 542      ispinor_index = ispinor + shift
 543      do ia=1,nincat
 544 !$OMP DO
 545        do ilmn=1,nlmn
 546          iln=indlmn(5,ilmn)
 547          enl_(1)=enl(iln,itypat,ispinor_index)
 548          do mu=1,ndgxdtfac
 549            dgxdtfac(1:cplex,mu,ilmn,ia,ispinor)=enl_(1)*dgxdt(1:cplex,mu,ilmn,ia,ispinor)
 550          end do
 551        end do
 552 !$OMP END DO
 553      end do
 554    end do
 555 !$OMP END PARALLEL
 556  end if
 557 
 558 !Accumulate dgxdtfac related to nonlocal operator (PAW)
 559 !-------------------------------------------------------------------
 560  if (optder>=1.and.(paw_opt==1.or.paw_opt==2.or.paw_opt==4)) then  ! Enl is psp strength Dij
 561    dgxdtfac(1:cplex,1:ndgxdtfac,1:nlmn,1:nincat,1:nspinor)=zero
 562 !  === Diagonal term(s) (up-up, down-down)
 563 !  1-Enl is real
 564    if (cplex_enl==1) then
 565 !$OMP PARALLEL &
 566 !$OMP PRIVATE(ispinor,ispinor_index,ia,index_enl,jlmn,j0lmn,jjlmn,enl_,mu,gxfj,ilmn,ijlmn,gxfi)
 567      ABI_ALLOCATE(gxfj,(cplex,ndgxdtfac))
 568      do ispinor=1,nspinor
 569        ispinor_index=ispinor+shift
 570        do ia=1,nincat
 571          index_enl=atindx1(iatm+ia)
 572 !$OMP DO
 573          do jlmn=1,nlmn
 574            j0lmn=jlmn*(jlmn-1)/2
 575            jjlmn=j0lmn+jlmn
 576            enl_(1)=enl(jjlmn,index_enl,ispinor_index)
 577            if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(jjlmn)
 578            do mu=1,ndgxdtfac
 579              gxfj(1:cplex,mu)=dgxdt(1:cplex,mu,jlmn,ia,ispinor)
 580              dgxdtfac(1:cplex,mu,jlmn,ia,ispinor)=dgxdtfac(1:cplex,mu,jlmn,ia,ispinor)+enl_(1)*gxfj(1:cplex,mu)
 581            end do
 582            do ilmn=1,jlmn-1
 583              ijlmn=j0lmn+ilmn
 584              enl_(1)=enl(ijlmn,index_enl,ispinor_index)
 585              if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
 586              do mu=1,ndgxdtfac
 587                gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,ispinor)
 588                dgxdtfac(1:cplex,mu,jlmn,ia,ispinor)=dgxdtfac(1:cplex,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1:cplex)
 589 #if !defined HAVE_OPENMP
 590                dgxdtfac(1:cplex,mu,ilmn,ia,ispinor)=dgxdtfac(1:cplex,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(1:cplex,mu)
 591 #endif
 592              end do
 593            end do
 594 #if defined HAVE_OPENMP
 595            if(jlmn<nlmn) then
 596              do ilmn=jlmn+1,nlmn
 597                i0lmn=ilmn*(ilmn-1)/2
 598                ijlmn=i0lmn+jlmn
 599                enl_(1)=enl(ijlmn,index_enl,ispinor_index)
 600                if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
 601                do mu=1,ndgxdtfac
 602                  gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,ispinor)
 603                  dgxdtfac(1:cplex,mu,jlmn,ia,ispinor)=dgxdtfac(1:cplex,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1:cplex)
 604                end do
 605              end do
 606            end if
 607 #endif
 608          end do
 609 !$OMP END DO
 610        end do
 611      end do
 612      ABI_DEALLOCATE(gxfj)
 613 !$OMP END PARALLEL
 614 !    2-Enl is complex
 615    else
 616      ABI_CHECK(cplex_fac==cplex_enl,"BUG: invalid cplex_fac/=cplex_enl!")
 617      if (nspinortot==1) then    !===== when nspinor=1, D_ij=D_ji
 618 !$OMP PARALLEL &
 619 !$OMP PRIVATE(ia,index_enl,jlmn,j0lmn,jjlmn,enl_,mu,gxfj,ilmn,ijlmn,gxfi)
 620        ABI_ALLOCATE(gxfj,(cplex,ndgxdtfac))
 621        do ia=1,nincat
 622          index_enl=atindx1(iatm+ia)
 623 !$OMP DO
 624          do jlmn=1,nlmn
 625            j0lmn=jlmn*(jlmn-1)/2
 626            jjlmn=j0lmn+jlmn
 627            enl_(1:2)=enl(2*jjlmn-1:2*jjlmn,index_enl,1)
 628            if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(jjlmn)
 629            do mu=1,ndgxdtfac
 630              if(cplex_dgxdt(mu)==2)then
 631                cplex_ = 2 ; gxfj(1,mu) = zero ; gxfj(2,mu) = dgxdt(1,mu,jlmn,ia,1)
 632              else
 633                cplex_ = cplex ; gxfj(1:cplex,mu)=dgxdt(1:cplex,mu,jlmn,ia,1)
 634              end if
 635              dgxdtfac(1,mu,jlmn,ia,1)=dgxdtfac(1,mu,jlmn,ia,1)+enl_(1)*gxfj(1,mu)
 636              dgxdtfac(2,mu,jlmn,ia,1)=dgxdtfac(2,mu,jlmn,ia,1)+enl_(2)*gxfj(1,mu)
 637              if (cplex_==2) then
 638                dgxdtfac(1,mu,jlmn,ia,1)=dgxdtfac(1,mu,jlmn,ia,1)-enl_(2)*gxfj(2,mu)
 639                dgxdtfac(2,mu,jlmn,ia,1)=dgxdtfac(2,mu,jlmn,ia,1)+enl_(1)*gxfj(2,mu)
 640              end if
 641            end do
 642            do ilmn=1,jlmn-1
 643              ijlmn=j0lmn+ilmn
 644              enl_(1:2)=enl(2*ijlmn-1:2*ijlmn,index_enl,1)
 645              if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
 646              do mu=1,ndgxdtfac
 647                if(cplex_dgxdt(mu)==2)then
 648                  cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = dgxdt(1,mu,ilmn,ia,1)
 649                else
 650                  cplex_ = cplex ; gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,1)
 651                end if
 652                dgxdtfac(1,mu,jlmn,ia,1)=dgxdtfac(1,mu,jlmn,ia,1)+enl_(1)*gxfi(1)
 653                dgxdtfac(2,mu,jlmn,ia,1)=dgxdtfac(2,mu,jlmn,ia,1)+enl_(2)*gxfi(1)
 654 #if !defined HAVE_OPENMP
 655                dgxdtfac(1,mu,ilmn,ia,1)=dgxdtfac(1,mu,ilmn,ia,1)+enl_(1)*gxfj(1,mu)
 656                dgxdtfac(2,mu,ilmn,ia,1)=dgxdtfac(2,mu,ilmn,ia,1)+enl_(2)*gxfj(1,mu)
 657 #endif
 658                if (cplex_==2) then
 659                  dgxdtfac(1,mu,jlmn,ia,1)=dgxdtfac(1,mu,jlmn,ia,1)-enl_(2)*gxfi(2)
 660                  dgxdtfac(2,mu,jlmn,ia,1)=dgxdtfac(2,mu,jlmn,ia,1)+enl_(1)*gxfi(2)
 661 #if !defined HAVE_OPENMP
 662                  dgxdtfac(1,mu,ilmn,ia,1)=dgxdtfac(1,mu,ilmn,ia,1)-enl_(2)*gxfj(2,mu)
 663                  dgxdtfac(2,mu,ilmn,ia,1)=dgxdtfac(2,mu,ilmn,ia,1)+enl_(1)*gxfj(2,mu)
 664 #endif
 665                end if
 666              end do
 667            end do
 668 #if defined HAVE_OPENMP
 669            if(jlmn<nlmn) then
 670              do ilmn=jlmn+1,nlmn
 671                i0lmn=ilmn*(ilmn-1)/2
 672                ijlmn=i0lmn+jlmn
 673                enl_(1:2)=enl(2*ijlmn-1:2*ijlmn,index_enl,1)
 674                if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
 675                do mu=1,ndgxdtfac
 676                  if(cplex_dgxdt(mu)==2)then
 677                    cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = dgxdt(1,mu,ilmn,ia,1)
 678                  else
 679                    cplex_ = cplex ; gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,1)
 680                  end if
 681                  dgxdtfac(1,mu,jlmn,ia,1)=dgxdtfac(1,mu,jlmn,ia,1)+enl_(1)*gxfi(1)
 682                  dgxdtfac(2,mu,jlmn,ia,1)=dgxdtfac(2,mu,jlmn,ia,1)+enl_(2)*gxfi(1)
 683                  if (cplex_==2) then
 684                    dgxdtfac(1,mu,jlmn,ia,1)=dgxdtfac(1,mu,jlmn,ia,1)-enl_(2)*gxfi(2)
 685                    dgxdtfac(2,mu,jlmn,ia,1)=dgxdtfac(2,mu,jlmn,ia,1)+enl_(1)*gxfi(2)
 686                  end if
 687                end do
 688              end do
 689            end if
 690 #endif
 691          end do
 692 !$OMP END DO
 693        end do
 694        ABI_DEALLOCATE(gxfj)
 695 !$OMP END PARALLEL
 696      else                    !===== when nspinor=2, D_ij=D_ji^*
 697 !$OMP PARALLEL &
 698 !$OMP PRIVATE(ispinor,ispinor_index,ia,index_enl), &
 699 !$OMP PRIVATE(jlmn,j0lmn,jjlmn,enl_,mu,gxfj,ilmn,ijlmn,gxfi)
 700        ABI_ALLOCATE(gxfj,(cplex,ndgxdtfac))
 701        do ispinor=1,nspinor
 702          ispinor_index = ispinor + shift
 703          do ia=1,nincat
 704            index_enl=atindx1(iatm+ia)
 705 !$OMP DO
 706            do jlmn=1,nlmn
 707              j0lmn=jlmn*(jlmn-1)/2
 708              jjlmn=j0lmn+jlmn
 709              enl_(1)=enl(2*jjlmn-1,index_enl,ispinor_index)  ! enl_ii is real for up-up and dn-dn
 710              if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(jjlmn)
 711              do mu=1,ndgxdtfac
 712                if(cplex_dgxdt(mu)==2)then
 713                  cplex_ = 2 ; gxfj(1,mu) = zero ; gxfj(2,mu) = dgxdt(1,mu,jlmn,ia,ispinor)
 714                else
 715                  cplex_ = cplex ; gxfj(1:cplex,mu)=dgxdt(1:cplex,mu,jlmn,ia,ispinor)
 716                end if
 717                dgxdtfac(1:cplex_,mu,jlmn,ia,ispinor)=dgxdtfac(1:cplex_,mu,jlmn,ia,ispinor)+enl_(1)*gxfj(1:cplex_,mu)
 718              end do
 719              do ilmn=1,jlmn-1
 720                ijlmn=j0lmn+ilmn
 721                enl_(1:2)=enl(2*ijlmn-1:2*ijlmn,index_enl,ispinor_index)
 722                if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
 723                do mu=1,ndgxdtfac
 724                  if(cplex_dgxdt(mu)==2)then
 725                    cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = dgxdt(1,mu,ilmn,ia,ispinor)
 726                  else
 727                    cplex_ = cplex ; gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,ispinor)
 728                  end if
 729                  dgxdtfac(1,mu,jlmn,ia,ispinor)=dgxdtfac(1,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1)
 730                  dgxdtfac(2,mu,jlmn,ia,ispinor)=dgxdtfac(2,mu,jlmn,ia,ispinor)-enl_(2)*gxfi(1)
 731 #if !defined HAVE_OPENMP
 732                  dgxdtfac(1,mu,ilmn,ia,ispinor)=dgxdtfac(1,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(1,mu)
 733                  dgxdtfac(2,mu,ilmn,ia,ispinor)=dgxdtfac(2,mu,ilmn,ia,ispinor)+enl_(2)*gxfj(1,mu)
 734 #endif
 735                  if (cplex_==2) then
 736                    dgxdtfac(1,mu,jlmn,ia,ispinor)=dgxdtfac(1,mu,jlmn,ia,ispinor)+enl_(2)*gxfi(2)
 737                    dgxdtfac(2,mu,jlmn,ia,ispinor)=dgxdtfac(2,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(2)
 738 #if !defined HAVE_OPENMP
 739                    dgxdtfac(1,mu,ilmn,ia,ispinor)=dgxdtfac(1,mu,ilmn,ia,ispinor)-enl_(2)*gxfj(2,mu)
 740                    dgxdtfac(2,mu,ilmn,ia,ispinor)=dgxdtfac(2,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(2,mu)
 741 #endif
 742                  end if
 743                end do
 744              end do
 745 #if defined HAVE_OPENMP
 746              if(jlmn<nlmn) then
 747                do ilmn=jlmn+1,nlmn
 748                  i0lmn=ilmn*(ilmn-1)/2
 749                  ijlmn=i0lmn+jlmn
 750                  enl_(1:2)=enl(2*ijlmn-1:2*ijlmn,index_enl,ispinor_index)
 751                  if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
 752                  do mu=1,ndgxdtfac
 753                    if(cplex_dgxdt(mu)==2)then
 754                      cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = dgxdt(1,mu,ilmn,ia,ispinor)
 755                    else
 756                      cplex_ = cplex ; gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,ispinor)
 757                    end if
 758                    dgxdtfac(1,mu,jlmn,ia,ispinor)=dgxdtfac(1,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1)
 759                    dgxdtfac(2,mu,jlmn,ia,ispinor)=dgxdtfac(2,mu,jlmn,ia,ispinor)+enl_(2)*gxfi(1)
 760                    if (cplex_==2) then
 761                      dgxdtfac(1,mu,jlmn,ia,ispinor)=dgxdtfac(1,mu,jlmn,ia,ispinor)-enl_(2)*gxfi(2)
 762                      dgxdtfac(2,mu,jlmn,ia,ispinor)=dgxdtfac(2,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(2)
 763                    end if
 764                  end do
 765                end do
 766              end if
 767 #endif
 768            end do
 769 !$OMP END DO
 770          end do
 771        end do
 772        ABI_DEALLOCATE(gxfj)
 773 !$OMP END PARALLEL
 774      end if !nspinortot
 775    end if !complex
 776 !  === Off-diagonal term(s) (up-down, down-up)
 777 !  --- No parallelization over spinors ---
 778    if (nspinortot==2.and.nspinor==nspinortot) then
 779      ABI_CHECK(cplex_enl==2,"BUG: invalid cplex_enl/=2!")
 780      ABI_CHECK(cplex_fac==2,"BUG: invalid cplex_fac/=2!")
 781 !$OMP PARALLEL &
 782 !$OMP PRIVATE(ispinor,jspinor,ia,index_enl), &
 783 !$OMP PRIVATE(jlmn,j0lmn,jjlmn,enl_,mu,gxfi,gxfj,ilmn,ijlmn)
 784      ABI_ALLOCATE(gxfj,(cplex,ndgxdtfac))
 785      do ispinor=1,nspinor
 786        jspinor=3-ispinor
 787        do ia=1,nincat
 788          index_enl=atindx1(iatm+ia)
 789 !$OMP DO
 790          do jlmn=1,nlmn
 791            j0lmn=jlmn*(jlmn-1)/2
 792            jjlmn=j0lmn+jlmn
 793            enl_(1:2)=enl(2*jjlmn-1:2*jjlmn,index_enl,2+ispinor)
 794            do mu=1,ndgxdtfac
 795              if(cplex_dgxdt(mu)==2)then
 796                cplex_ = 2 ; 
 797                gxfi(1)    = zero ; gxfi(2)    = dgxdt(1,mu,jlmn,ia,ispinor)
 798                gxfj(1,mu) = zero ; gxfj(2,mu) = dgxdt(1,mu,jlmn,ia,jspinor)
 799              else
 800                cplex_ = cplex ; 
 801                gxfi(1:cplex)   =dgxdt(1:cplex,mu,jlmn,ia,ispinor)
 802                gxfj(1:cplex,mu)=dgxdt(1:cplex,mu,jlmn,ia,jspinor)
 803              end if
 804              dgxdtfac(1,mu,jlmn,ia,jspinor)=dgxdtfac(1,mu,jlmn,ia,jspinor)+enl_(1)*gxfi(1)
 805              dgxdtfac(2,mu,jlmn,ia,jspinor)=dgxdtfac(2,mu,jlmn,ia,jspinor)-enl_(2)*gxfi(1)
 806              if (cplex_==2) then
 807                dgxdtfac(2,mu,jlmn,ia,jspinor)=dgxdtfac(2,mu,jlmn,ia,jspinor)+enl_(1)*gxfi(2)
 808                dgxdtfac(1,mu,jlmn,ia,jspinor)=dgxdtfac(1,mu,jlmn,ia,jspinor)+enl_(2)*gxfi(2)
 809              end if
 810            end do
 811            do ilmn=1,jlmn-1
 812              ijlmn=j0lmn+ilmn
 813              enl_(1:2)=enl(2*ijlmn-1:2*ijlmn,index_enl,2+ispinor)
 814              do mu=1,ndgxdtfac
 815                if(cplex_dgxdt(mu)==2)then
 816                  cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = dgxdt(1,mu,ilmn,ia,ispinor)
 817                else
 818                  cplex_ = cplex ; gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,ispinor)
 819                end if
 820                dgxdtfac(1,mu,jlmn,ia,jspinor)=dgxdtfac(1,mu,jlmn,ia,jspinor)+enl_(1)*gxfi(1)
 821                dgxdtfac(2,mu,jlmn,ia,jspinor)=dgxdtfac(2,mu,jlmn,ia,jspinor)-enl_(2)*gxfi(1)
 822 #if !defined HAVE_OPENMP
 823                dgxdtfac(1,mu,ilmn,ia,ispinor)=dgxdtfac(1,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(1,mu)
 824                dgxdtfac(2,mu,ilmn,ia,ispinor)=dgxdtfac(2,mu,ilmn,ia,ispinor)+enl_(2)*gxfj(1,mu)
 825 #endif
 826                if (cplex_==2) then
 827                  dgxdtfac(1,mu,jlmn,ia,jspinor)=dgxdtfac(1,mu,jlmn,ia,jspinor)+enl_(2)*gxfi(2)
 828                  dgxdtfac(2,mu,jlmn,ia,jspinor)=dgxdtfac(2,mu,jlmn,ia,jspinor)+enl_(1)*gxfi(2)
 829 #if !defined HAVE_OPENMP
 830                  dgxdtfac(1,mu,ilmn,ia,ispinor)=dgxdtfac(1,mu,ilmn,ia,ispinor)-enl_(2)*gxfj(2,mu)
 831                  dgxdtfac(2,mu,ilmn,ia,ispinor)=dgxdtfac(2,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(2,mu)
 832 #endif
 833                end if
 834              end do !mu
 835            end do !ilmn
 836 #if defined HAVE_OPENMP
 837            if(jlmn<nlmn) then
 838              do ilmn=jlmn+1,nlmn
 839                i0lmn=ilmn*(ilmn-1)/2
 840                ijlmn=i0lmn+jlmn
 841                enl_(1:2)=enl(2*ijlmn-1:2*ijlmn,index_enl,2+ispinor)
 842                do mu=1,ndgxdtfac
 843                  if(cplex_dgxdt(mu)==2)then
 844                    cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = dgxdt(1,mu,ilmn,ia,jspinor)
 845                  else
 846                    cplex_ = cplex ; gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,jspinor)
 847                  end if
 848                  dgxdtfac(1,mu,jlmn,ia,ispinor)=dgxdtfac(1,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1)
 849                  dgxdtfac(2,mu,jlmn,ia,ispinor)=dgxdtfac(2,mu,jlmn,ia,ispinor)+enl_(2)*gxfi(1)
 850                  if (cplex_==2) then
 851                    dgxdtfac(1,mu,jlmn,ia,ispinor)=dgxdtfac(1,mu,jlmn,ia,ispinor)-enl_(2)*gxfi(2)
 852                    dgxdtfac(2,mu,jlmn,ia,ispinor)=dgxdtfac(2,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(2)
 853                  end if
 854                end do !mu
 855              end do !ilmn
 856            end if
 857 #endif
 858          end do !jmln
 859 !$OMP END DO
 860        end do !ia
 861      end do !ispinor
 862      ABI_DEALLOCATE(gxfj)
 863 !$OMP END PARALLEL
 864 !    --- Parallelization over spinors ---
 865    else if (nspinortot==2.and.nspinor/=nspinortot) then
 866      ABI_CHECK(cplex_enl==2,"BUG: opernlc_ylm: invalid cplex_enl/=2!")
 867      ABI_CHECK(cplex_fac==2,"BUG: opernlc_ylm: invalid cplex_fac/=2!")
 868      ABI_ALLOCATE(dgxdtfac_,(cplex_fac,ndgxdtfac,nlmn,nincat,nspinortot))
 869 !$OMP PARALLEL &
 870 !$OMP PRIVATE(ia,index_enl), &
 871 !$OMP PRIVATE(jlmn,j0lmn,ilmn,i0lmn,ijlmn,enl_,jilmn,mu,gxfi)
 872 !$OMP WORKSHARE
 873      dgxdtfac_(:,:,:,:,:)=zero
 874 !$OMP END WORKSHARE
 875 !$OMP SINGLE
 876      ispinor_index=mpi_enreg%me_spinor+1
 877      jspinor_index=3-ispinor_index
 878      if (ispinor_index==1) then
 879        ijspin=3;jispin=4
 880      else
 881        ijspin=4;jispin=3
 882      end if
 883 !$OMP END SINGLE
 884      do ia=1,nincat
 885        index_enl=atindx1(iatm+ia)
 886 !$OMP DO
 887        do jlmn=1,nlmn
 888          j0lmn=jlmn*(jlmn-1)/2
 889          do ilmn=1,nlmn
 890            i0lmn=ilmn*(ilmn-1)/2
 891            if (ilmn<=jlmn) then
 892              ijlmn=j0lmn+ilmn
 893              enl_(1)= enl(2*ijlmn-1,index_enl,ijspin)
 894              enl_(2)=-enl(2*ijlmn  ,index_enl,ijspin)
 895            else
 896              jilmn=i0lmn+jlmn
 897              enl_(1:2)=enl(2*jilmn-1:2*jilmn,index_enl,jispin)
 898            end if
 899            do mu=1,ndgxdtfac
 900              if(cplex_dgxdt(mu)==2)then
 901                cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = dgxdt(1,mu,ilmn,ia,1)
 902              else
 903                cplex_ = cplex ; gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,1)
 904              end if
 905              dgxdtfac_(1,mu,jlmn,ia,jspinor_index)=dgxdtfac_(1,mu,jlmn,ia,jspinor_index)+enl_(1)*gxfi(1)
 906              dgxdtfac_(2,mu,jlmn,ia,jspinor_index)=dgxdtfac_(2,mu,jlmn,ia,jspinor_index)+enl_(2)*gxfi(1)
 907              if (cplex_==2) then
 908                dgxdtfac_(1,mu,jlmn,ia,jspinor_index)=dgxdtfac_(1,mu,jlmn,ia,jspinor_index)-enl_(2)*gxfi(2)
 909                dgxdtfac_(2,mu,jlmn,ia,jspinor_index)=dgxdtfac_(2,mu,jlmn,ia,jspinor_index)+enl_(1)*gxfi(2)
 910              end if
 911            end do
 912          end do !ilmn
 913        end do !jlmn
 914 !$OMP END DO
 915      end do !iat
 916 !$OMP SINGLE
 917      call xmpi_sum(dgxdtfac_,mpi_enreg%comm_spinor,ierr)
 918 !$OMP END SINGLE
 919 !$OMP WORKSHARE
 920      dgxdtfac(:,:,:,:,1)=dgxdtfac(:,:,:,:,1)+dgxdtfac_(:,:,:,:,ispinor_index)
 921 !$OMP END WORKSHARE
 922 !$OMP END PARALLEL
 923      ABI_DEALLOCATE(dgxdtfac_)
 924    end if !nspinortot
 925 
 926  end if ! pawopt & optder
 927 
 928 !Accumulate dgxdtfac related to overlap (Sij) (PAW)
 929 !-------------------------------------------------------------------
 930  if (optder>=1.and.(paw_opt==3.or.paw_opt==4)) then  ! Use Sij, overlap contribution
 931 !$OMP PARALLEL &
 932 !$OMP PRIVATE(ispinor,ia), &
 933 !$OMP PRIVATE(jlmn,j0lmn,jjlmn,sijr,mu,gxfj,ilmn,ijlmn,gxfi)
 934    ABI_ALLOCATE(gxfj,(cplex,ndgxdtfac))
 935 !$OMP WORKSHARE
 936    dgxdtfac_sij(1:cplex,1:ndgxdtfac,1:nlmn,1:nincat,1:nspinor)=zero
 937 !$OMP END WORKSHARE
 938    do ispinor=1,nspinor
 939      do ia=1,nincat
 940 !$OMP DO
 941        do jlmn=1,nlmn
 942          j0lmn=jlmn*(jlmn-1)/2
 943          jjlmn=j0lmn+jlmn
 944          sijr=sij(jjlmn)
 945          do mu=1,ndgxdtfac
 946            gxfj(1:cplex,mu)=dgxdt(1:cplex,mu,jlmn,ia,ispinor)
 947            dgxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)=dgxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)+sijr*gxfj(1:cplex,mu)
 948          end do
 949          do ilmn=1,jlmn-1
 950            ijlmn=j0lmn+ilmn
 951            sijr=sij(ijlmn)
 952            do mu=1,ndgxdtfac
 953              gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,ispinor)
 954              dgxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)=dgxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)+sijr*gxfi(1:cplex)
 955 #if !defined HAVE_OPENMP
 956              dgxdtfac_sij(1:cplex,mu,ilmn,ia,ispinor)=dgxdtfac_sij(1:cplex,mu,ilmn,ia,ispinor)+sijr*gxfj(1:cplex,mu)
 957 #endif
 958            end do
 959          end do
 960 #if defined HAVE_OPENMP
 961          if(jlmn<nlmn) then
 962            do ilmn=jlmn+1,nlmn
 963              i0lmn=ilmn*(ilmn-1)/2
 964              ijlmn=i0lmn+jlmn
 965              sijr=sij(ijlmn)
 966              do mu=1,ndgxdtfac
 967                gxfi(1:cplex)=dgxdt(1:cplex,mu,ilmn,ia,ispinor)
 968                dgxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)=dgxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)+sijr*gxfi(1:cplex)
 969              end do
 970            end do
 971          end if
 972 #endif
 973        end do
 974 !$OMP END DO
 975      end do
 976    end do
 977    ABI_DEALLOCATE(gxfj)
 978 !$OMP END PARALLEL
 979  end if
 980 
 981 !Accumulate d2gxdtfac related to nonlocal operator (Norm-conserving)
 982 !-------------------------------------------------------------------
 983  if (optder==2.and.paw_opt==0) then    ! Enl is E(Kleinman-Bylander)
 984 !$OMP PARALLEL &
 985 !$OMP PRIVATE(ispinor,ispinor_index,ia,ilmn,iln,enl_,mu)
 986    do ispinor=1,nspinor
 987      ispinor_index = ispinor + shift
 988      do ia=1,nincat
 989 !$OMP DO
 990        do ilmn=1,nlmn
 991          iln=indlmn(5,ilmn)
 992          enl_(1)=enl(iln,itypat,ispinor_index)
 993          do mu=1,nd2gxdtfac
 994            d2gxdtfac(1:cplex,mu,ilmn,ia,ispinor)=enl_(1)*d2gxdt(1:cplex,mu,ilmn,ia,ispinor)
 995          end do
 996        end do
 997 !$OMP END DO
 998      end do
 999    end do
1000 !$OMP END PARALLEL
1001  end if
1002 
1003  DBG_EXIT("COLL")
1004 
1005 !Accumulate d2gxdtfac related to nonlocal operator (PAW)
1006 !-------------------------------------------------------------------
1007  if (optder==2.and.(paw_opt==1.or.paw_opt==2.or.paw_opt==4)) then  ! Enl is psp strength Dij
1008    d2gxdtfac(1:cplex,1:nd2gxdtfac,1:nlmn,1:nincat,1:nspinor)=zero
1009 !  === Diagonal term(s) (up-up, down-down)
1010 !  1-Enl is real
1011    if (cplex_enl==1) then
1012 !$OMP PARALLEL &
1013 !$OMP PRIVATE(ispinor,ispinor_index,ia,index_enl,jlmn,j0lmn,jjlmn,enl_,mu,gxfj,ilmn,ijlmn,gxfi)
1014      ABI_ALLOCATE(gxfj,(cplex,nd2gxdtfac))
1015      do ispinor=1,nspinor
1016        ispinor_index=ispinor+shift
1017        do ia=1,nincat
1018          index_enl=atindx1(iatm+ia)
1019 !$OMP DO
1020          do jlmn=1,nlmn
1021            j0lmn=jlmn*(jlmn-1)/2
1022            jjlmn=j0lmn+jlmn
1023            enl_(1)=enl(jjlmn,index_enl,ispinor_index)
1024            if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(jjlmn)
1025            do mu=1,nd2gxdtfac
1026              gxfj(1:cplex,mu)=d2gxdt(1:cplex,mu,jlmn,ia,ispinor)
1027              d2gxdtfac(1:cplex,mu,jlmn,ia,ispinor)=d2gxdtfac(1:cplex,mu,jlmn,ia,ispinor)+enl_(1)*gxfj(1:cplex,mu)
1028            end do
1029            do ilmn=1,jlmn-1
1030              ijlmn=j0lmn+ilmn
1031              enl_(1)=enl(ijlmn,index_enl,ispinor_index)
1032              if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
1033              do mu=1,nd2gxdtfac
1034                gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,ispinor)
1035                d2gxdtfac(1:cplex,mu,jlmn,ia,ispinor)=d2gxdtfac(1:cplex,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1:cplex)
1036 #if !defined HAVE_OPENMP
1037                d2gxdtfac(1:cplex,mu,ilmn,ia,ispinor)=d2gxdtfac(1:cplex,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(1:cplex,mu)
1038 #endif
1039              end do
1040            end do
1041 #if defined HAVE_OPENMP
1042            if(jlmn<nlmn) then
1043              do ilmn=jlmn+1,nlmn
1044                i0lmn=ilmn*(ilmn-1)/2
1045                ijlmn=i0lmn+jlmn
1046                enl_(1)=enl(ijlmn,index_enl,ispinor_index)
1047                if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
1048                do mu=1,nd2gxdtfac
1049                  gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,ispinor)
1050                  d2gxdtfac(1:cplex,mu,jlmn,ia,ispinor)=d2gxdtfac(1:cplex,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1:cplex)
1051                end do
1052              end do
1053            end if
1054 #endif
1055          end do
1056 !$OMP END DO
1057        end do
1058      end do
1059      ABI_DEALLOCATE(gxfj)
1060 !$OMP END PARALLEL
1061 !    2-Enl is complex
1062    else
1063      ABI_CHECK(cplex_fac==cplex_enl,"BUG: invalid cplex_fac/=cplex_enl!")
1064      if (nspinortot==1) then    !===== when nspinor=1, D_ij=D_ji
1065 !$OMP PARALLEL &
1066 !$OMP PRIVATE(ia,index_enl,jlmn,j0lmn,jjlmn,enl_,mu,gxfj,ilmn,ijlmn,gxfi)
1067        ABI_ALLOCATE(gxfj,(cplex,nd2gxdtfac))
1068        do ia=1,nincat
1069          index_enl=atindx1(iatm+ia)
1070 !$OMP DO
1071          do jlmn=1,nlmn
1072            j0lmn=jlmn*(jlmn-1)/2
1073            jjlmn=j0lmn+jlmn
1074            enl_(1:2)=enl(2*jjlmn-1:2*jjlmn,index_enl,1)
1075            if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(jjlmn)
1076            do mu=1,nd2gxdtfac
1077              if(cplex_d2gxdt(mu)==2)then
1078                cplex_ = 2 ; gxfj(1,mu) = zero ; gxfj(2,mu) = d2gxdt(1,mu,jlmn,ia,1)
1079              else
1080                cplex_ = cplex ; gxfj(1:cplex,mu)=d2gxdt(1:cplex,mu,jlmn,ia,1)
1081              end if
1082              d2gxdtfac(1,mu,jlmn,ia,1)=d2gxdtfac(1,mu,jlmn,ia,1)+enl_(1)*gxfj(1,mu)
1083              d2gxdtfac(2,mu,jlmn,ia,1)=d2gxdtfac(2,mu,jlmn,ia,1)+enl_(2)*gxfj(1,mu)
1084              if (cplex_==2) then
1085                d2gxdtfac(1,mu,jlmn,ia,1)=d2gxdtfac(1,mu,jlmn,ia,1)-enl_(2)*gxfj(2,mu)
1086                d2gxdtfac(2,mu,jlmn,ia,1)=d2gxdtfac(2,mu,jlmn,ia,1)+enl_(1)*gxfj(2,mu)
1087              end if
1088            end do
1089            do ilmn=1,jlmn-1
1090              ijlmn=j0lmn+ilmn
1091              enl_(1:2)=enl(2*ijlmn-1:2*ijlmn,index_enl,1)
1092              if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
1093              do mu=1,nd2gxdtfac
1094                if(cplex_d2gxdt(mu)==2)then
1095                  cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = d2gxdt(1,mu,ilmn,ia,1)
1096                else
1097                  cplex_ = cplex ; gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,1)
1098                end if
1099                d2gxdtfac(1,mu,jlmn,ia,1)=d2gxdtfac(1,mu,jlmn,ia,1)+enl_(1)*gxfi(1)
1100                d2gxdtfac(2,mu,jlmn,ia,1)=d2gxdtfac(2,mu,jlmn,ia,1)+enl_(2)*gxfi(1)
1101 #if !defined HAVE_OPENMP
1102                d2gxdtfac(1,mu,ilmn,ia,1)=d2gxdtfac(1,mu,ilmn,ia,1)+enl_(1)*gxfj(1,mu)
1103                d2gxdtfac(2,mu,ilmn,ia,1)=d2gxdtfac(2,mu,ilmn,ia,1)+enl_(2)*gxfj(1,mu)
1104 #endif
1105                if (cplex_==2) then
1106                  d2gxdtfac(1,mu,jlmn,ia,1)=d2gxdtfac(1,mu,jlmn,ia,1)-enl_(2)*gxfi(2)
1107                  d2gxdtfac(2,mu,jlmn,ia,1)=d2gxdtfac(2,mu,jlmn,ia,1)+enl_(1)*gxfi(2)
1108 #if !defined HAVE_OPENMP
1109                  d2gxdtfac(1,mu,ilmn,ia,1)=d2gxdtfac(1,mu,ilmn,ia,1)-enl_(2)*gxfj(2,mu)
1110                  d2gxdtfac(2,mu,ilmn,ia,1)=d2gxdtfac(2,mu,ilmn,ia,1)+enl_(1)*gxfj(2,mu)
1111 #endif
1112                end if
1113              end do
1114            end do
1115 #if defined HAVE_OPENMP
1116            if(jlmn<nlmn) then
1117              do ilmn=jlmn+1,nlmn
1118                i0lmn=ilmn*(ilmn-1)/2
1119                ijlmn=i0lmn+jlmn
1120                enl_(1:2)=enl(2*ijlmn-1:2*ijlmn,index_enl,1)
1121                if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
1122                do mu=1,nd2gxdtfac
1123                  if(cplex_d2gxdt(mu)==2)then
1124                    cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = d2gxdt(1,mu,ilmn,ia,1)
1125                  else
1126                    cplex_ = cplex ; gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,1)
1127                  end if
1128                  d2gxdtfac(1,mu,jlmn,ia,1)=d2gxdtfac(1,mu,jlmn,ia,1)+enl_(1)*gxfi(1)
1129                  d2gxdtfac(2,mu,jlmn,ia,1)=d2gxdtfac(2,mu,jlmn,ia,1)+enl_(2)*gxfi(1)
1130                  if (cplex_==2) then
1131                    d2gxdtfac(1,mu,jlmn,ia,1)=d2gxdtfac(1,mu,jlmn,ia,1)-enl_(2)*gxfi(2)
1132                    d2gxdtfac(2,mu,jlmn,ia,1)=d2gxdtfac(2,mu,jlmn,ia,1)+enl_(1)*gxfi(2)
1133                  end if
1134                end do
1135              end do
1136            end if
1137 #endif
1138          end do
1139 !$OMP END DO
1140        end do
1141        ABI_DEALLOCATE(gxfj)
1142 !$OMP END PARALLEL
1143      else                    !===== when nspinor=2, D_ij=D_ji^*
1144 !$OMP PARALLEL &
1145 !$OMP PRIVATE(ispinor,ispinor_index,ia,index_enl), &
1146 !$OMP PRIVATE(jlmn,j0lmn,jjlmn,enl_,mu,gxfj,ilmn,ijlmn,gxfi)
1147        ABI_ALLOCATE(gxfj,(cplex,nd2gxdtfac))
1148        do ispinor=1,nspinor
1149          ispinor_index = ispinor + shift
1150          do ia=1,nincat
1151            index_enl=atindx1(iatm+ia)
1152 !$OMP DO
1153            do jlmn=1,nlmn
1154              j0lmn=jlmn*(jlmn-1)/2
1155              jjlmn=j0lmn+jlmn
1156              enl_(1)=enl(2*jjlmn-1,index_enl,ispinor_index)  ! enl_ii is real for up-up and dn-dn
1157              if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(jjlmn)
1158              do mu=1,nd2gxdtfac
1159                if(cplex_d2gxdt(mu)==2)then
1160                  cplex_ = 2 ; gxfj(1,mu) = zero ; gxfj(2,mu) = d2gxdt(1,mu,jlmn,ia,ispinor)
1161                else
1162                  cplex_ = cplex ; gxfj(1:cplex,mu)=d2gxdt(1:cplex,mu,jlmn,ia,ispinor)
1163                end if
1164                d2gxdtfac(1:cplex_,mu,jlmn,ia,ispinor)=d2gxdtfac(1:cplex_,mu,jlmn,ia,ispinor)+enl_(1)*gxfj(1:cplex_,mu)
1165              end do
1166              do ilmn=1,jlmn-1
1167                ijlmn=j0lmn+ilmn
1168                enl_(1:2)=enl(2*ijlmn-1:2*ijlmn,index_enl,ispinor_index)
1169                if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
1170                do mu=1,nd2gxdtfac
1171                  if(cplex_d2gxdt(mu)==2)then
1172                    cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = d2gxdt(1,mu,ilmn,ia,ispinor)
1173                  else
1174                    cplex_ = cplex ; gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,ispinor)
1175                  end if
1176                  d2gxdtfac(1,mu,jlmn,ia,ispinor)=d2gxdtfac(1,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1)
1177                  d2gxdtfac(2,mu,jlmn,ia,ispinor)=d2gxdtfac(2,mu,jlmn,ia,ispinor)-enl_(2)*gxfi(1)
1178 #if !defined HAVE_OPENMP
1179                  d2gxdtfac(1,mu,ilmn,ia,ispinor)=d2gxdtfac(1,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(1,mu)
1180                  d2gxdtfac(2,mu,ilmn,ia,ispinor)=d2gxdtfac(2,mu,ilmn,ia,ispinor)+enl_(2)*gxfj(1,mu)
1181 #endif
1182                  if (cplex_==2) then
1183                    d2gxdtfac(1,mu,jlmn,ia,ispinor)=d2gxdtfac(1,mu,jlmn,ia,ispinor)+enl_(2)*gxfi(2)
1184                    d2gxdtfac(2,mu,jlmn,ia,ispinor)=d2gxdtfac(2,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(2)
1185 #if !defined HAVE_OPENMP
1186                    d2gxdtfac(1,mu,ilmn,ia,ispinor)=d2gxdtfac(1,mu,ilmn,ia,ispinor)-enl_(2)*gxfj(2,mu)
1187                    d2gxdtfac(2,mu,ilmn,ia,ispinor)=d2gxdtfac(2,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(2,mu)
1188 #endif
1189                  end if
1190                end do
1191              end do
1192 #if defined HAVE_OPENMP
1193              if(jlmn<nlmn) then
1194                do ilmn=jlmn+1,nlmn
1195                  i0lmn=ilmn*(ilmn-1)/2
1196                  ijlmn=i0lmn+jlmn
1197                  enl_(1:2)=enl(2*ijlmn-1:2*ijlmn,index_enl,ispinor_index)
1198                  if (paw_opt==2) enl_(1)=enl_(1)-lambda*sij(ijlmn)
1199                  do mu=1,nd2gxdtfac
1200                    if(cplex_d2gxdt(mu)==2)then
1201                      cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = d2gxdt(1,mu,ilmn,ia,ispinor)
1202                    else
1203                      cplex_ = cplex ; gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,ispinor)
1204                    end if
1205                    d2gxdtfac(1,mu,jlmn,ia,ispinor)=d2gxdtfac(1,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1)
1206                    d2gxdtfac(2,mu,jlmn,ia,ispinor)=d2gxdtfac(2,mu,jlmn,ia,ispinor)+enl_(2)*gxfi(1)
1207                    if (cplex_==2) then
1208                      d2gxdtfac(1,mu,jlmn,ia,ispinor)=d2gxdtfac(1,mu,jlmn,ia,ispinor)-enl_(2)*gxfi(2)
1209                      d2gxdtfac(2,mu,jlmn,ia,ispinor)=d2gxdtfac(2,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(2)
1210                    end if
1211                  end do
1212                end do
1213              end if
1214 #endif
1215            end do
1216 !$OMP END DO
1217          end do
1218        end do
1219        ABI_DEALLOCATE(gxfj)
1220 !$OMP END PARALLEL
1221      end if !nspinortot
1222    end if !complex
1223 !  === Off-diagonal term(s) (up-down, down-up)
1224 !  --- No parallelization over spinors ---
1225    if (nspinortot==2.and.nspinor==nspinortot) then
1226      ABI_CHECK(cplex_enl==2,"BUG: invalid cplex_enl/=2!")
1227      ABI_CHECK(cplex_fac==2,"BUG: invalid cplex_fac/=2!")
1228 !$OMP PARALLEL &
1229 !$OMP PRIVATE(ispinor,jspinor,ia,index_enl), &
1230 !$OMP PRIVATE(jlmn,j0lmn,jjlmn,enl_,mu,gxfi,gxfj,ilmn,ijlmn)
1231      ABI_ALLOCATE(gxfj,(cplex,nd2gxdtfac))
1232      do ispinor=1,nspinor
1233        jspinor=3-ispinor
1234        do ia=1,nincat
1235          index_enl=atindx1(iatm+ia)
1236 !$OMP DO
1237          do jlmn=1,nlmn
1238            j0lmn=jlmn*(jlmn-1)/2
1239            jjlmn=j0lmn+jlmn
1240            enl_(1:2)=enl(2*jjlmn-1:2*jjlmn,index_enl,2+ispinor)
1241            do mu=1,nd2gxdtfac
1242              if(cplex_d2gxdt(mu)==2)then
1243                cplex_ = 2 ; 
1244                gxfi(1)    = zero ; gxfi(2)    = d2gxdt(1,mu,jlmn,ia,ispinor)
1245                gxfj(1,mu) = zero ; gxfj(2,mu) = d2gxdt(1,mu,jlmn,ia,jspinor)
1246              else
1247                cplex_ = cplex ; 
1248                gxfi(1:cplex)   =d2gxdt(1:cplex,mu,jlmn,ia,ispinor)
1249                gxfj(1:cplex,mu)=d2gxdt(1:cplex,mu,jlmn,ia,jspinor)
1250              end if
1251              d2gxdtfac(1,mu,jlmn,ia,jspinor)=d2gxdtfac(1,mu,jlmn,ia,jspinor)+enl_(1)*gxfi(1)
1252              d2gxdtfac(2,mu,jlmn,ia,jspinor)=d2gxdtfac(2,mu,jlmn,ia,jspinor)-enl_(2)*gxfi(1)
1253              if (cplex_==2) then
1254                d2gxdtfac(2,mu,jlmn,ia,jspinor)=d2gxdtfac(2,mu,jlmn,ia,jspinor)+enl_(1)*gxfi(2)
1255                d2gxdtfac(1,mu,jlmn,ia,jspinor)=d2gxdtfac(1,mu,jlmn,ia,jspinor)+enl_(2)*gxfi(2)
1256              end if
1257            end do
1258            do ilmn=1,jlmn-1
1259              ijlmn=j0lmn+ilmn
1260              enl_(1:2)=enl(2*ijlmn-1:2*ijlmn,index_enl,2+ispinor)
1261              do mu=1,nd2gxdtfac
1262                if(cplex_d2gxdt(mu)==2)then
1263                  cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = d2gxdt(1,mu,ilmn,ia,ispinor)
1264                else
1265                  cplex_ = cplex ; gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,ispinor)
1266                end if
1267                d2gxdtfac(1,mu,jlmn,ia,jspinor)=d2gxdtfac(1,mu,jlmn,ia,jspinor)+enl_(1)*gxfi(1)
1268                d2gxdtfac(2,mu,jlmn,ia,jspinor)=d2gxdtfac(2,mu,jlmn,ia,jspinor)-enl_(2)*gxfi(1)
1269 #if !defined HAVE_OPENMP
1270                d2gxdtfac(1,mu,ilmn,ia,ispinor)=d2gxdtfac(1,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(1,mu)
1271                d2gxdtfac(2,mu,ilmn,ia,ispinor)=d2gxdtfac(2,mu,ilmn,ia,ispinor)+enl_(2)*gxfj(1,mu)
1272 #endif
1273                if (cplex_==2) then
1274                  d2gxdtfac(1,mu,jlmn,ia,jspinor)=d2gxdtfac(1,mu,jlmn,ia,jspinor)+enl_(2)*gxfi(2)
1275                  d2gxdtfac(2,mu,jlmn,ia,jspinor)=d2gxdtfac(2,mu,jlmn,ia,jspinor)+enl_(1)*gxfi(2)
1276 #if !defined HAVE_OPENMP
1277                  d2gxdtfac(1,mu,ilmn,ia,ispinor)=d2gxdtfac(1,mu,ilmn,ia,ispinor)-enl_(2)*gxfj(2,mu)
1278                  d2gxdtfac(2,mu,ilmn,ia,ispinor)=d2gxdtfac(2,mu,ilmn,ia,ispinor)+enl_(1)*gxfj(2,mu)
1279 #endif
1280                end if
1281              end do !mu
1282            end do !ilmn
1283 #if defined HAVE_OPENMP
1284            if(jlmn<nlmn) then
1285              do ilmn=jlmn+1,nlmn
1286                i0lmn=ilmn*(ilmn-1)/2
1287                ijlmn=i0lmn+jlmn
1288                enl_(1:2)=enl(2*ijlmn-1:2*ijlmn,index_enl,2+ispinor)
1289                do mu=1,nd2gxdtfac
1290                  if(cplex_d2gxdt(mu)==2)then
1291                    cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = d2gxdt(1,mu,ilmn,ia,jspinor)
1292                  else
1293                    cplex_ = cplex ; gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,jspinor)
1294                  end if
1295                  d2gxdtfac(1,mu,jlmn,ia,ispinor)=d2gxdtfac(1,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(1)
1296                  d2gxdtfac(2,mu,jlmn,ia,ispinor)=d2gxdtfac(2,mu,jlmn,ia,ispinor)+enl_(2)*gxfi(1)
1297                  if (cplex_==2) then
1298                    d2gxdtfac(1,mu,jlmn,ia,ispinor)=d2gxdtfac(1,mu,jlmn,ia,ispinor)-enl_(2)*gxfi(2)
1299                    d2gxdtfac(2,mu,jlmn,ia,ispinor)=d2gxdtfac(2,mu,jlmn,ia,ispinor)+enl_(1)*gxfi(2)
1300                  end if
1301                end do !mu
1302              end do !ilmn
1303            end if
1304 #endif
1305          end do !jmln
1306 !$OMP END DO
1307        end do !ia
1308      end do !ispinor
1309      ABI_DEALLOCATE(gxfj)
1310 !$OMP END PARALLEL
1311 !    --- Parallelization over spinors ---
1312    else if (nspinortot==2.and.nspinor/=nspinortot) then
1313      ABI_CHECK(cplex_enl==2,"BUG: opernlc_ylm: invalid cplex_enl/=2!")
1314      ABI_CHECK(cplex_fac==2,"BUG: opernlc_ylm: invalid cplex_fac/=2!")
1315      ABI_ALLOCATE(d2gxdtfac_,(cplex_fac,nd2gxdtfac,nlmn,nincat,nspinortot))
1316 !$OMP PARALLEL &
1317 !$OMP PRIVATE(ia,index_enl), &
1318 !$OMP PRIVATE(jlmn,j0lmn,ilmn,i0lmn,ijlmn,enl_,jilmn,mu,gxfi)
1319 !$OMP WORKSHARE
1320      d2gxdtfac_(:,:,:,:,:)=zero
1321 !$OMP END WORKSHARE
1322 !$OMP SINGLE
1323      ispinor_index=mpi_enreg%me_spinor+1
1324      jspinor_index=3-ispinor_index
1325      if (ispinor_index==1) then
1326        ijspin=3;jispin=4
1327      else
1328        ijspin=4;jispin=3
1329      end if
1330 !$OMP END SINGLE
1331      do ia=1,nincat
1332        index_enl=atindx1(iatm+ia)
1333 !$OMP DO
1334        do jlmn=1,nlmn
1335          j0lmn=jlmn*(jlmn-1)/2
1336          do ilmn=1,nlmn
1337            i0lmn=ilmn*(ilmn-1)/2
1338            if (ilmn<=jlmn) then
1339              ijlmn=j0lmn+ilmn
1340              enl_(1)= enl(2*ijlmn-1,index_enl,ijspin)
1341              enl_(2)=-enl(2*ijlmn  ,index_enl,ijspin)
1342            else
1343              jilmn=i0lmn+jlmn
1344              enl_(1:2)=enl(2*jilmn-1:2*jilmn,index_enl,jispin)
1345            end if
1346            do mu=1,nd2gxdtfac
1347              if(cplex_d2gxdt(mu)==2)then
1348                cplex_ = 2 ; gxfi(1) = zero ; gxfi(2) = d2gxdt(1,mu,ilmn,ia,1)
1349              else
1350                cplex_ = cplex ; gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,1)
1351              end if
1352              d2gxdtfac_(1,mu,jlmn,ia,jspinor_index)=d2gxdtfac_(1,mu,jlmn,ia,jspinor_index)+enl_(1)*gxfi(1)
1353              d2gxdtfac_(2,mu,jlmn,ia,jspinor_index)=d2gxdtfac_(2,mu,jlmn,ia,jspinor_index)+enl_(2)*gxfi(1)
1354              if (cplex_==2) then
1355                d2gxdtfac_(1,mu,jlmn,ia,jspinor_index)=d2gxdtfac_(1,mu,jlmn,ia,jspinor_index)-enl_(2)*gxfi(2)
1356                d2gxdtfac_(2,mu,jlmn,ia,jspinor_index)=d2gxdtfac_(2,mu,jlmn,ia,jspinor_index)+enl_(1)*gxfi(2)
1357              end if
1358            end do
1359          end do !ilmn
1360        end do !jlmn
1361 !$OMP END DO
1362      end do !iat
1363 !$OMP SINGLE
1364      call xmpi_sum(d2gxdtfac_,mpi_enreg%comm_spinor,ierr)
1365 !$OMP END SINGLE
1366 !$OMP WORKSHARE
1367      d2gxdtfac(:,:,:,:,1)=d2gxdtfac(:,:,:,:,1)+d2gxdtfac_(:,:,:,:,ispinor_index)
1368 !$OMP END WORKSHARE
1369 !$OMP END PARALLEL
1370      ABI_DEALLOCATE(d2gxdtfac_)
1371    end if !nspinortot
1372 
1373  end if ! pawopt & optder
1374 
1375 !Accumulate d2gxdtfac related to overlap (Sij) (PAW)
1376 !-------------------------------------------------------------------
1377  if (optder==2.and.(paw_opt==3.or.paw_opt==4)) then  ! Use Sij, overlap contribution
1378 !$OMP PARALLEL &
1379 !$OMP PRIVATE(ispinor,ia), &
1380 !$OMP PRIVATE(jlmn,j0lmn,jjlmn,sijr,mu,gxfj,ilmn,ijlmn,gxfi)
1381    ABI_ALLOCATE(gxfj,(cplex,nd2gxdtfac))
1382 !$OMP WORKSHARE
1383    d2gxdtfac_sij(1:cplex,1:nd2gxdtfac,1:nlmn,1:nincat,1:nspinor)=zero
1384 !$OMP END WORKSHARE
1385    do ispinor=1,nspinor
1386      do ia=1,nincat
1387 !$OMP DO
1388        do jlmn=1,nlmn
1389          j0lmn=jlmn*(jlmn-1)/2
1390          jjlmn=j0lmn+jlmn
1391          sijr=sij(jjlmn)
1392          do mu=1,nd2gxdtfac
1393            gxfj(1:cplex,mu)=d2gxdt(1:cplex,mu,jlmn,ia,ispinor)
1394            d2gxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)=d2gxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)+sijr*gxfj(1:cplex,mu)
1395          end do
1396          do ilmn=1,jlmn-1
1397            ijlmn=j0lmn+ilmn
1398            sijr=sij(ijlmn)
1399            do mu=1,nd2gxdtfac
1400              gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,ispinor)
1401              d2gxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)=d2gxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)+sijr*gxfi(1:cplex)
1402 #if !defined HAVE_OPENMP
1403              d2gxdtfac_sij(1:cplex,mu,ilmn,ia,ispinor)=d2gxdtfac_sij(1:cplex,mu,ilmn,ia,ispinor)+sijr*gxfj(1:cplex,mu)
1404 #endif
1405            end do
1406          end do
1407 #if defined HAVE_OPENMP
1408          if(jlmn<nlmn) then
1409            do ilmn=jlmn+1,nlmn
1410              i0lmn=ilmn*(ilmn-1)/2
1411              ijlmn=i0lmn+jlmn
1412              sijr=sij(ijlmn)
1413              do mu=1,nd2gxdtfac
1414                gxfi(1:cplex)=d2gxdt(1:cplex,mu,ilmn,ia,ispinor)
1415                d2gxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)=d2gxdtfac_sij(1:cplex,mu,jlmn,ia,ispinor)+sijr*gxfi(1:cplex)
1416              end do
1417            end do
1418          end if
1419 #endif
1420        end do
1421 !$OMP END DO
1422      end do
1423    end do
1424    ABI_DEALLOCATE(gxfj)
1425 !$OMP END PARALLEL
1426  end if
1427 
1428 end subroutine opernlc_ylm